[hidden] { display: none !important; } @font-face { font-family: Inter; src: url("/static/fonts/InterVariable.woff2") format("woff2"); font-weight: 100 900; font-style: normal; font-display: swap; } :root { color-scheme: dark; --surface-0: #07070a; --surface-1: #0a0a0c; --surface-2: #121216; --surface-3: #1a1a20; --bg: var(--surface-1); --ink: #f4f4f6; --muted: #a1a1aa; --faint: #8b8b96; --line: rgba(255, 255, 255, 0.07); --line-strong: rgba(255, 255, 255, 0.13); --card: var(--surface-2); --card-2: #0e0e12; --accent: #f97316; --accent-ink: #1a0a00; --accent-soft: rgba(249, 115, 22, 0.16); --warn: #f87171; --pause: #fbbf24; --track: #25252c; --shadow: 0 8px 28px rgba(0, 0, 0, 0.4); --shadow-sm: 0 1px 0 rgba(255, 255, 255, 0.04) inset; --radius: 14px; --r-sm: 8px; --r-md: 12px; --r-lg: 16px; --radius-sm: var(--r-sm); --sidebar: 15rem; --topbar-h: 3.25rem; --live: #34d399; --live-soft: rgba(52, 211, 153, 0.14); --font: Inter, "Segoe UI", system-ui, -apple-system, sans-serif; --s1: 0.25rem; --s2: 0.5rem; --s3: 0.75rem; --s4: 1rem; --s5: 1.5rem; --s6: 2rem; --t-xs: 0.7rem; --t-sm: 0.8125rem; --t-md: 0.9rem; --t-lg: 1.125rem; --t-xl: 1.5rem; --control-h: 2.25rem; --st-printing: #34d399; --st-printing-soft: rgba(52, 211, 153, 0.14); --st-heating: #fbbf24; --st-heating-soft: rgba(251, 191, 36, 0.14); --st-done: #a5b4fc; --st-done-soft: rgba(165, 180, 252, 0.12); --st-error: #f87171; --st-error-soft: rgba(248, 113, 113, 0.14); --st-offline: #71717a; --st-offline-soft: rgba(255, 255, 255, 0.04); --st-waiting: #f97316; --st-waiting-soft: rgba(249, 115, 22, 0.14); --st-idle: #a1a1aa; --st-idle-soft: rgba(255, 255, 255, 0.05); --ease: cubic-bezier(0.2, 0.7, 0.2, 1); } html[data-theme="light"] { color-scheme: light; --surface-0: #ececf0; --surface-1: #f4f4f6; --surface-2: #ffffff; --surface-3: #f8f8fa; --bg: var(--surface-1); --ink: #18181b; --muted: #52525b; --faint: #71717a; --line: rgba(0, 0, 0, 0.07); --line-strong: rgba(0, 0, 0, 0.13); --card: var(--surface-2); --card-2: #f0f0f3; --accent: #ea580c; --accent-ink: #fff7ed; --accent-soft: rgba(234, 88, 12, 0.12); --warn: #dc2626; --pause: #d97706; --track: #e4e4ea; --shadow: 0 8px 24px rgba(20, 20, 30, 0.08); --shadow-sm: 0 1px 0 rgba(255, 255, 255, 0.8) inset; --live: #16a34a; --live-soft: rgba(22, 163, 74, 0.12); --st-printing: #16a34a; --st-printing-soft: rgba(22, 163, 74, 0.1); --st-heating: #d97706; --st-heating-soft: rgba(217, 119, 6, 0.1); --st-done: #4f46e5; --st-done-soft: rgba(79, 70, 229, 0.1); --st-error: #dc2626; --st-error-soft: rgba(220, 38, 38, 0.1); --st-offline: #73737c; --st-offline-soft: rgba(0, 0, 0, 0.04); --st-waiting: #ea580c; --st-waiting-soft: rgba(234, 88, 12, 0.1); --st-idle: #5c5c66; --st-idle-soft: rgba(0, 0, 0, 0.04); } * { box-sizing: border-box; } html { scrollbar-color: rgba(255, 255, 255, 0.14) transparent; scrollbar-width: thin; } html[data-theme="light"] { scrollbar-color: rgba(0, 0, 0, 0.18) transparent; } html::-webkit-scrollbar { width: 10px; height: 10px; } html::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.14); border-radius: 99px; border: 2px solid transparent; background-clip: padding-box; } html::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.22); background-clip: padding-box; } html[data-theme="light"]::-webkit-scrollbar-thumb { background: rgba(0, 0, 0, 0.18); } html[data-theme="light"]::-webkit-scrollbar-thumb:hover { background: rgba(0, 0, 0, 0.28); } body { margin: 0; font: 14.5px/1.45 var(--font); color: var(--ink); background: radial-gradient(900px 420px at 0% 0%, rgba(249, 115, 22, 0.07), transparent 55%), var(--bg); -webkit-font-smoothing: antialiased; font-feature-settings: "cv11", "ss01"; } html[data-theme="light"] body { background: radial-gradient(900px 420px at 0% 0%, rgba(234, 88, 12, 0.06), transparent 55%), var(--bg); } .tabular, .num, .hero-main, .hero-side, .stat b, .chip, .count, .run-line-text, time { font-variant-numeric: tabular-nums; } a { color: var(--accent); transition: color 0.15s var(--ease); } a:hover { color: #fdba74; } :focus-visible { outline: 2px solid rgba(249, 115, 22, 0.75); outline-offset: 2px; } button:focus:not(:focus-visible), a:focus:not(:focus-visible), summary:focus:not(:focus-visible) { outline: none; } .app-shell { display: grid; grid-template-columns: var(--sidebar) minmax(0, 1fr); min-height: 100vh; transition: grid-template-columns 0.2s var(--ease); } .sidebar { position: sticky; top: 0; height: 100vh; display: flex; flex-direction: column; min-height: 0; padding: 0.95rem 0.6rem 0.7rem; background: #08080a; border-right: 1px solid var(--line); } .brand-row { display: flex; align-items: center; gap: 0.25rem; padding-bottom: 0.55rem; } .brand { display: flex; align-items: center; gap: 0.5rem; color: var(--ink); font-weight: 720; letter-spacing: -0.03em; text-decoration: none; padding: 0.2rem 0.55rem; flex: 1; min-width: 0; } .brand-mark { flex: none; width: 1.55rem; height: 1.55rem; border-radius: 99px; object-fit: contain; display: block; } .brand-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; } .nav-toggle { flex: none; width: 2.5rem; height: 2.5rem; min-width: 2.5rem; } .nav-main { display: flex; flex-direction: column; gap: 0.1rem; } .nav-main a { display: flex; align-items: center; gap: 0.55rem; color: var(--muted); text-decoration: none; padding: 0.38rem 0.55rem; border-radius: 9px; font-size: 0.88rem; transition: color 0.15s var(--ease), background 0.15s var(--ease); } .nav-main a:hover { color: var(--ink); background: rgba(255, 255, 255, 0.04); } .nav-main a.on { color: var(--ink); background: rgba(255, 255, 255, 0.05); box-shadow: inset 2px 0 0 var(--accent); border-radius: 0 9px 9px 0; padding-left: calc(0.55rem - 2px); } .nav-main a .ico { opacity: 0.65; width: 1.05em; height: 1.05em; } .nav-main a.on .ico { opacity: 1; color: var(--accent); } .m-only { display: none !important; } html.nav-collapsed, body.nav-collapsed { --sidebar: 3.35rem; } html.nav-collapsed .brand, body.nav-collapsed .brand { padding: 0.2rem; justify-content: center; } html.nav-collapsed .brand-name, body.nav-collapsed .brand-name { display: none; } html.nav-collapsed .brand-mark, body.nav-collapsed .brand-mark { width: 1.75rem; height: 1.75rem; } html.nav-collapsed .brand-row, body.nav-collapsed .brand-row { flex-direction: column; padding-bottom: 0.35rem; } html.nav-collapsed .nav-toggle, body.nav-collapsed .nav-toggle { width: 2.5rem; height: 2.5rem; } html.nav-collapsed .nav-main a, body.nav-collapsed .nav-main a { justify-content: center; padding: 0.55rem 0.35rem; min-height: 2.5rem; } html.nav-collapsed .nav-main a span, body.nav-collapsed .nav-main a span { display: none; } html.nav-collapsed .nav-main a.on, body.nav-collapsed .nav-main a.on { box-shadow: none; border-radius: 9px; padding-left: 0.35rem; background: var(--accent-soft); } html.shelf, body.shelf { --control-h: 2.75rem; --topbar-h: 3.6rem; } /* Regal: Bottom-Nav kompakter — Sidebar-Punkte nicht ausblenden (sonst fehlen Dateien/Aufträge/… auf Desktop-Chrome ohne Mehr-Leiste). */ html.shelf .mobile-nav .nav-desk, body.shelf .mobile-nav .nav-desk { display: none; } html.shelf .mobile-nav .nav-shelf, body.shelf .mobile-nav .nav-shelf { display: flex; } html.shelf .fleet, body.shelf .fleet { grid-template-columns: repeat(auto-fill, minmax(15.5rem, 1fr)); gap: 0.65rem; } html.shelf main, body.shelf main { padding: 0.85rem 0.9rem 2.5rem; max-width: none; } html.shelf .icon-btn, body.shelf .icon-btn { width: 2.75rem; height: 2.75rem; min-width: 2.75rem; } html.shelf button:not(.icon-btn):not(.fchip):not(.tiny-btn), html.shelf .button, body.shelf button:not(.icon-btn):not(.fchip):not(.tiny-btn), body.shelf .button { min-height: 2.75rem; padding: 0.55rem 1rem; } html.shelf .card .name, html.shelf .printer-card .name, body.shelf .card .name, body.shelf .printer-card .name { font-size: 1.05rem; } html.shelf .hero-main, html.shelf [data-role="hero"], body.shelf .hero-main, body.shelf [data-role="hero"] { font-size: 1.35rem; } .mobile-nav .nav-shelf { display: none; } @media (max-height: 900px) { html.shelf main, body.shelf main { padding-top: 0.55rem; padding-bottom: 1.5rem; } html.shelf .page-head, body.shelf .page-head { margin-bottom: 0.45rem; } } .live-bar { position: relative; flex: 1 1 auto; min-width: 0; display: flex; align-items: center; justify-content: flex-end; } .live-chips { display: flex; align-items: center; gap: 0.35rem; flex-wrap: wrap; justify-content: flex-end; min-width: 0; } .live-eta { padding: 0.28rem 0.55rem; border-radius: 8px; background: rgba(61, 206, 124, 0.1); border: 1px solid rgba(61, 206, 124, 0.28); color: var(--ok, #3dce7c); font-size: var(--t-xs); font-weight: 650; white-space: nowrap; } .live-chip { position: relative; display: inline-flex; align-items: center; gap: 0.3rem; height: 2rem; padding: 0 0.55rem; border-radius: 8px; border: 1px solid var(--line-strong); background: var(--card-2); color: var(--ink); font-size: var(--t-xs); font-weight: 650; cursor: pointer; overflow: hidden; max-width: 14rem; } .live-chip .ico { width: 0.9rem; height: 0.9rem; opacity: 0.75; flex: none; } .live-chip:hover { border-color: rgba(249, 115, 22, 0.45); color: var(--accent); } .live-chip.todo { border-color: rgba(99, 102, 241, 0.4); } .live-chip.bad { border-color: rgba(248, 113, 113, 0.4); } .live-chip.warn { border-color: rgba(248, 113, 113, 0.55); color: var(--warn); } .live-chip.run { padding-left: 0.45rem; } .live-chip-fill { position: absolute; inset: 0 auto 0 0; width: calc(var(--pct, 0) * 1%); max-width: 100%; background: rgba(61, 206, 124, 0.22); pointer-events: none; } .live-chip-text { position: relative; z-index: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-variant-numeric: tabular-nums; } .live-pop { position: absolute; top: calc(100% + 0.45rem); right: 0; z-index: 40; width: min(22rem, calc(100vw - 2rem)); max-height: min(70vh, 28rem); overflow: auto; padding: 0.55rem; border-radius: 12px; border: 1px solid var(--line-strong); background: var(--surface-1, var(--card)); box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35); display: flex; flex-direction: column; gap: 0.55rem; } .live-panel { display: flex; flex-direction: column; gap: 0.55rem; min-width: 0; } .live-page { max-width: 36rem; } .jetzt-eta { margin: 0; padding: 0.4rem 0.65rem; border-radius: 8px; background: rgba(61, 206, 124, 0.1); border: 1px solid rgba(61, 206, 124, 0.28); color: var(--ok, #3dce7c); font-size: var(--t-sm); font-weight: 600; } .nav-badge { position: absolute; top: 0.2rem; right: calc(50% - 1.35rem); min-width: 1.05rem; height: 1.05rem; padding: 0 0.28rem; border-radius: 99px; background: var(--accent); color: var(--accent-ink); font-size: 0.62rem; font-weight: 700; line-height: 1.05rem; text-align: center; } .nav-badge.todo { background: var(--st-done); color: #14163a; } .mobile-nav a { position: relative; } button.btn-primary, .go-btn { background: var(--accent); color: #1a0f00; border-color: transparent; font-weight: 650; } button.btn-primary:hover, .go-btn:hover { filter: brightness(1.08); } button.btn-danger, button.warn { background: transparent; color: var(--warn); border-color: rgba(248, 113, 113, 0.45); } button.btn-danger:hover, button.warn:hover { background: var(--st-error-soft); filter: none; } .settings-layout { display: grid; grid-template-columns: 11rem minmax(0, 1fr); gap: 1.25rem; align-items: start; } .settings-nav { position: sticky; top: calc(var(--topbar-h) + 0.75rem); display: flex; flex-direction: column; gap: 0.25rem; } .settings-nav a { display: flex; align-items: center; gap: 0.45rem; padding: 0.45rem 0.65rem; border-radius: 8px; color: var(--muted); text-decoration: none; font-size: var(--t-sm); } .settings-nav a .ico { width: 1em; height: 1em; opacity: 0.7; flex: none; } .settings-nav a:hover, .settings-nav a.on { background: rgba(255, 255, 255, 0.05); color: var(--ink); } .settings-nav a.on .ico, .settings-nav a:hover .ico { opacity: 1; color: var(--accent); } .settings-save-hint { font-size: var(--t-xs); color: var(--ok, #3dce7c); min-height: 1.2em; } .printer-edit-cards { display: grid; gap: 0.75rem; } .printer-edit-card { display: flex; align-items: center; gap: 0.75rem; padding: 0.75rem 1rem; border: 1px solid var(--line); border-radius: 12px; background: rgba(255, 255, 255, 0.02); } .printer-edit-card .grow { flex: 1; min-width: 0; } .cmdk-dlg { width: min(32rem, 94vw); padding: 0; border: 1px solid var(--line); border-radius: 14px; background: var(--panel, #141418); color: var(--text); } .cmdk-dlg::backdrop { background: rgba(0, 0, 0, 0.55); } .cmdk-wrap { display: flex; flex-direction: column; } .cmdk-wrap input { width: 100%; border: 0; border-bottom: 1px solid var(--line); background: transparent; color: var(--text); padding: 0.9rem 1rem; font-size: 1rem; outline: none; } .cmdk-list { max-height: 18rem; overflow: auto; margin: 0; padding: 0.4rem; list-style: none; } .cmdk-list li { padding: 0.55rem 0.7rem; border-radius: 8px; cursor: pointer; display: flex; gap: 0.5rem; align-items: baseline; } .cmdk-list li:hover, .cmdk-list li.on { background: rgba(255, 140, 0, 0.12); } .cmdk-list .tiny { color: var(--muted); } .undo-toast { display: flex; align-items: center; gap: 0.75rem; } .undo-toast button { margin-left: auto; background: transparent; border: 0; color: var(--accent); font-weight: 650; cursor: pointer; } @media (max-width: 760px) { .settings-layout { grid-template-columns: 1fr; } .settings-nav { position: static; flex-direction: row; flex-wrap: wrap; } } .fleet-section .machine-title .badge { display: none; } .queue-box { flex: none; border: 1px solid transparent; border-radius: 10px; background: rgba(255, 255, 255, 0.025); overflow: hidden; } .queue-box.is-empty { display: none; } .queue-box[open] { border-color: var(--line); } .run-stack { flex: none; margin: 0; } .run-stack .queue-list { padding: 0 0.2rem; } .queue-box > summary { list-style: none; cursor: pointer; user-select: none; } .queue-box > summary::-webkit-details-marker { display: none; } .queue-title { margin: 0; padding: 0.5rem 0.6rem; color: var(--muted); font-size: var(--t-xs); font-weight: 650; text-transform: uppercase; letter-spacing: 0.06em; display: flex; align-items: center; gap: 0.4rem; } h2.queue-title { font-size: var(--t-xs); } .queue-title .grow { flex: 1; } .queue-title .caret { transition: transform 0.2s var(--ease); opacity: 0.6; } .queue-box:not([open]) .queue-title .caret { transform: rotate(-90deg); } .count { min-width: 1.25rem; height: 1.25rem; padding: 0 0.35rem; border-radius: 99px; display: inline-grid; place-items: center; background: rgba(255, 255, 255, 0.07); color: var(--ink); font-size: 0.68rem; font-weight: 700; letter-spacing: 0; font-variant-numeric: tabular-nums; } .count.hot { background: var(--accent); color: var(--accent-ink); } .count.bad { background: var(--st-error); color: #2a0606; } .count.todo { background: var(--st-done); color: #14163a; } .tiny-btn { font-size: 0.68rem !important; padding: 0.12rem 0.4rem !important; min-height: 0 !important; border-radius: 6px !important; } .icon-btn { display: inline-grid; place-items: center; width: 1.45rem; height: 1.45rem; padding: 0 !important; border-radius: 7px !important; background: transparent; color: var(--muted); border: 1px solid transparent; } .icon-btn:hover { color: var(--ink); background: rgba(255, 255, 255, 0.06); filter: none; } .icon-btn.danger:hover { color: var(--st-error); background: var(--st-error-soft); } .queue-list { list-style: none; margin: 0; padding: 0 0.4rem 0.45rem; display: grid; grid-template-columns: minmax(0, 1fr); gap: 0.35rem; } .queue-list > li { min-width: 0; } .queue-empty { margin: 0; padding: 0.35rem 0.6rem 0.55rem; color: var(--faint); font-size: var(--t-xs); display: flex; align-items: center; gap: 0.35rem; } .queue-empty .ico { opacity: 0.55; } .queue-item { display: grid; grid-template-columns: minmax(0, 1fr); min-width: 0; gap: 0.3rem; padding: 0.5rem 0.55rem; border-radius: 9px; background: rgba(255, 255, 255, 0.03); border: 1px solid transparent; position: relative; } .queue-item.running { border-color: rgba(61, 206, 124, 0.28); background: linear-gradient(180deg, rgba(61, 206, 124, 0.07), rgba(255, 255, 255, 0.02)); } .queue-item.error { border-color: rgba(248, 113, 113, 0.3); background: var(--st-error-soft); } .queue-item.run-line { display: flex; align-items: center; gap: 0.2rem; padding: 0.2rem 0.3rem 0.2rem 0.2rem; background: rgba(255, 255, 255, 0.03); } .queue-item.run-line.running { background: rgba(61, 206, 124, 0.04); } .run-line-link { position: relative; flex: 1; min-width: 0; display: flex; align-items: center; padding: 0.28rem 0.45rem; border-radius: 7px; overflow: hidden; } .run-line-fill { position: absolute; inset: 0 auto 0 0; width: calc(var(--pct, 0) * 1%); max-width: 100%; background: rgba(61, 206, 124, 0.22); pointer-events: none; transition: width 0.35s ease; } .run-line-text { position: relative; z-index: 1; color: var(--ink); font-size: var(--t-xs); font-weight: 650; font-variant-numeric: tabular-nums; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .queue-link.run-line-link:hover .run-line-text { color: var(--accent); } .queue-row { display: flex; align-items: center; gap: 0.4rem; min-width: 0; } .queue-row .grow { flex: 1; min-width: 0; } .queue-link { color: inherit; text-decoration: none; } .queue-link:hover .queue-name { color: var(--accent); } .queue-foot { display: flex; justify-content: flex-end; padding: 0 0.6rem 0.5rem; } .queue-foot a { font-size: var(--t-xs); text-decoration: none; } .steer { margin: 0.65rem 0; padding: 0.55rem 0.6rem; border: 1px solid var(--line); border-radius: 10px; display: grid; gap: 0.45rem; } .steer-group { display: grid; gap: 0.35rem; } .steer-group-label { font-size: 0.68rem; font-weight: 650; letter-spacing: 0.05em; text-transform: uppercase; color: var(--faint); } .steer-row { display: flex; flex-wrap: wrap; gap: 0.45rem 0.65rem; align-items: end; } .steer-row label { display: grid; gap: 0.15rem; font-size: 0.72rem; color: var(--muted); } .steer-row input[type="number"] { width: 4.5rem; padding: 0.25rem 0.35rem; font-size: 0.82rem; } .steer-ace, .steer-ace-slots { display: grid; gap: 0.35rem; padding-top: 0.45rem; margin-top: 0.15rem; border-top: 1px solid var(--line); } .steer-ace-head { display: flex; flex-wrap: wrap; gap: 0.35rem 0.65rem; align-items: baseline; font-size: 0.78rem; } .steer-ace-head b { font-weight: 650; } .steer-slot-row { display: grid; grid-template-columns: auto 1fr auto; gap: 0.45rem 0.55rem; align-items: center; font-size: 0.78rem; } .steer-slot-row .dot { width: 0.85rem; height: 0.85rem; border-radius: 99px; flex: none; border: 1px solid rgba(255, 255, 255, 0.15); } .steer-slot-row .grow { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .steer-slot-row button { flex: none; white-space: nowrap; } .queue-name { color: var(--ink); font-size: var(--t-sm); font-weight: 650; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; } .queue-msg { color: var(--muted); font-size: var(--t-xs); line-height: 1.3; overflow-wrap: anywhere; } .queue-sub { color: var(--faint); font-size: 0.66rem; font-variant-numeric: tabular-nums; flex: none; } .queue-item > .queue-sub { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .queue-row > button { flex: none; } .icon-btn.done-btn { color: var(--st-printing); border-color: rgba(61, 206, 124, 0.35); border-radius: 99px !important; } .icon-btn.done-btn:hover { color: var(--st-printing); background: rgba(61, 206, 124, 0.12); } .icon-btn.done-btn.confirm-armed { width: auto; padding: 0 0.5rem !important; font-size: 0.66rem; font-weight: 700; background: rgba(61, 206, 124, 0.18); } .icon-btn.confirm-armed { width: auto; padding: 0 0.5rem !important; font-size: 0.7rem; font-weight: 700; } .queue-tools { display: flex; gap: 0.1rem; flex-wrap: nowrap; flex: none; } .send-progress { margin-top: 0.75rem; display: grid; gap: 0.55rem; } .send-job { display: grid; gap: 0.3rem; } .send-job-head { display: flex; justify-content: space-between; gap: 0.75rem; font-size: 0.82rem; color: var(--muted); } .send-job-head strong { color: var(--ink); font-weight: 650; } .send-progress-track { height: 0.45rem; border-radius: 99px; background: rgba(255, 255, 255, 0.08); overflow: hidden; } .send-progress-track.slim { height: 0.28rem; } .send-progress-bar { display: block; height: 100%; width: 0; border-radius: inherit; background: var(--accent); transition: width 0.25s ease; } .send-progress-bar.good { background: #4ade80; } .send-progress-bar.bad { background: #f87171; } #send-printer[multiple] { min-height: 6.5rem; padding: 0.35rem; } .loaded-spools { display: grid; gap: 0.45rem; margin-bottom: 0.55rem; } .loaded-host { display: grid; gap: 0.2rem; font-size: var(--t-sm); } .loaded-spool { display: block; padding: 0.25rem 0.45rem; border-radius: 8px; background: rgba(255, 255, 255, 0.04); color: var(--ink); } .ace-box { margin: 0.85rem 0 0.35rem; padding: 0.7rem 0.75rem; border: 1px solid var(--line); border-radius: 12px; background: rgba(255, 255, 255, 0.03); } .ace-box h3 { margin: 0 0 0.35rem; font-size: 0.92rem; } .ace-box code { font-size: 0.78rem; color: var(--accent); } .ace-printer { margin-top: 0.65rem; display: grid; gap: 0.4rem; } .ace-printer-name { margin: 0; font-size: 0.82rem; font-weight: 650; color: var(--ink); } .ace-row { display: grid; grid-template-columns: 0.85rem minmax(0, 1fr) minmax(12rem, 1.4fr); gap: 0.45rem; align-items: center; margin: 0; font-size: 0.82rem; } .ace-row select { min-width: 0; width: 100%; } .ace-swatch { width: 0.85rem; height: 0.85rem; border-radius: 99px; background: #444; border: 1px solid rgba(255, 255, 255, 0.15); } .app-main { min-width: 0; } main { max-width: 1280px; margin: 0 auto; padding: 1.25rem 1.35rem 3rem; } h1 { font-size: 1.35rem; margin: 0; letter-spacing: -0.035em; font-weight: 680; line-height: 1.2; } h2 { font-size: 0.95rem; margin: 0 0 0.65rem; letter-spacing: -0.02em; font-weight: 650; } .page-head { display: flex; justify-content: space-between; gap: 1rem; align-items: flex-start; margin-bottom: 1.1rem; flex-wrap: wrap; } .page-head > div:first-child { min-width: 0; flex: 1 1 12rem; } .page-tools { display: flex; flex-wrap: wrap; gap: 0.5rem 0.75rem; align-items: center; margin-bottom: 0.85rem; padding: 0.55rem 0.7rem; border: 1px solid var(--line); border-radius: 12px; background: rgba(255, 255, 255, 0.02); } .page-tools select, .page-tools input[type="search"] { width: auto; min-width: 9rem; max-width: 16rem; padding: 0.4rem 0.6rem; border-radius: var(--radius-sm); min-height: var(--control-h); } .page-tools .date-field { width: auto; min-width: 9.5rem; max-width: 11rem; flex: 0 0 auto; } .page-tools .period-presets { width: auto; max-width: 100%; flex: 1 1 100%; grid-auto-columns: auto; overflow-x: auto; } .page-tools .period-presets button { padding: 0.4rem 0.55rem; white-space: nowrap; } .stat-tools { flex-direction: column; align-items: stretch; gap: 0.55rem; } .stat-tools .period-presets { flex: 0 1 auto; width: auto; } .stat-filters { display: flex; flex-wrap: wrap; gap: 0.45rem 0.55rem; align-items: center; } .stat-filters input[type="text"], .stat-filters select { width: auto; min-width: 7rem; max-width: 11rem; flex: 0 1 auto; } .mat-extra-filters { display: flex; flex-wrap: wrap; gap: 0.4rem; align-items: center; } .mat-extra-filters select { width: auto; min-width: 7.5rem; max-width: 11rem; padding: 0.35rem 0.55rem; min-height: var(--control-h); border-radius: var(--radius-sm); } .mat-group td { padding-top: 0.75rem !important; font-size: 0.72rem; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink); border-bottom: 1px solid var(--line); background: rgba(255, 255, 255, 0.02); } tr.is-archived { opacity: 0.65; } .kpi-row.kpi-primary { grid-template-columns: repeat(auto-fill, minmax(10.5rem, 1fr)); } .kpi-row.kpi-secondary { grid-template-columns: repeat(auto-fill, minmax(8.5rem, 1fr)); margin-top: -0.35rem; opacity: 0.95; } .kpi.kpi-sm .kpi-value { font-size: 1.05rem; } .kpi.kpi-empty { opacity: 0.55; } .lead, .tiny, .summary { color: var(--muted); } .summary { margin: 0.3rem 0 0; } .tiny { font-size: 0.8rem; margin: 0.2rem 0 0; line-height: 1.4; max-width: 52ch; } .tip { display: inline-flex; align-items: center; justify-content: center; width: 1.15rem; height: 1.15rem; margin-left: 0.25rem; border-radius: 99px; color: var(--faint); vertical-align: -0.15em; cursor: help; } .tip:hover { color: var(--accent); background: var(--accent-soft); } .tip .ico { width: 0.85em; height: 0.85em; } #when { color: var(--faint); font-variant-numeric: tabular-nums; font-size: 0.92rem; } .fleet { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 0.75rem; } .fleet-section { margin-bottom: 1.25rem; } .fleet-section h3 { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--faint); margin: 0 0 0.55rem; font-weight: 650; } article.machine { background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent 40%), var(--card); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); overflow: hidden; display: flex; flex-direction: column; position: relative; cursor: pointer; transition: border-color 0.3s var(--ease), box-shadow 0.3s var(--ease), transform 0.2s var(--ease); } article.machine::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 3px; background: transparent; } article.machine:hover { border-color: var(--line-strong); box-shadow: var(--shadow), 0 0 0 1px rgba(255, 255, 255, 0.04); transform: translateY(-1px); } article.machine.printing { border-color: rgba(61, 206, 124, 0.35); box-shadow: var(--shadow), 0 0 0 1px rgba(61, 206, 124, 0.06), 0 18px 40px -24px rgba(61, 206, 124, 0.45); } article.machine.printing::before { background: linear-gradient(90deg, transparent, var(--st-printing), transparent); opacity: 0.7; } article.machine.printing:hover { border-color: rgba(61, 206, 124, 0.55); box-shadow: var(--shadow), 0 0 0 1px rgba(61, 206, 124, 0.12), 0 18px 40px -20px rgba(61, 206, 124, 0.55); } article.machine.paused { border-color: rgba(251, 191, 36, 0.35); } article.machine.paused:hover { border-color: rgba(251, 191, 36, 0.55); } article.machine.heating { border-color: rgba(251, 191, 36, 0.28); } article.machine.heating:hover { border-color: rgba(251, 191, 36, 0.5); } article.machine.error { border-color: rgba(248, 113, 113, 0.4); } article.machine.error::before { background: var(--st-error); opacity: 0.7; } article.machine.error:hover { border-color: rgba(248, 113, 113, 0.6); } article.machine.offline { opacity: 0.62; } article.machine.offline:hover { opacity: 1; } .machine-head { padding: 0.85rem 0.95rem 0.3rem; display: grid; grid-template-columns: 1fr; gap: 0.55rem; align-items: start; } .machine-head.has-cam { grid-template-columns: 1fr auto; } .machine-head-main { min-width: 0; } .wall-cam-thumb { width: 4.75rem; height: 3.35rem; object-fit: cover; border-radius: 9px; border: 1px solid var(--line); background: var(--card-2); flex: none; pointer-events: none; } .wall-cam-thumb[hidden] { display: none; } .machine-title { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.35rem; } .machine-title h2 { margin: 0; font-size: 1.02rem; font-weight: 700; flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .hero { display: flex; align-items: baseline; gap: 0.5rem; flex-wrap: wrap; min-height: 2.1rem; } .hero-main { font-size: var(--t-xl); font-weight: 720; letter-spacing: -0.04em; font-variant-numeric: tabular-nums; line-height: 1.1; } .hero-main small { font-size: var(--t-sm); font-weight: 600; color: var(--muted); letter-spacing: 0; margin-right: 0.3rem; } .hero-side { color: var(--muted); font-size: var(--t-sm); font-variant-numeric: tabular-nums; } .hero.error .hero-main { font-size: var(--t-md); color: #fecaca; letter-spacing: 0; font-weight: 600; line-height: 1.35; } .hero.idle .hero-main { font-size: var(--t-lg); color: var(--muted); letter-spacing: -0.02em; } .machine-body { padding: 0.35rem 0.95rem 0.85rem; display: grid; gap: 0.65rem; } .machine-body > :empty { display: none; } .job-line { display: flex; align-items: center; gap: 0.55rem; min-width: 0; color: var(--muted); font-size: var(--t-sm); padding: 0.45rem 0.5rem; border-radius: 10px; background: rgba(255, 255, 255, 0.03); border: 1px solid var(--line); } .job-thumb { width: 4.5rem; height: 4.5rem; object-fit: contain; border-radius: 9px; border: 1px solid var(--line); background: var(--card-2); flex: none; } .job-thumb[hidden] { display: none; } .job-ico { display: inline-flex; flex: none; color: var(--faint); } .job-ico .ico { width: 1.1rem; height: 1.1rem; } .job-line.has-thumb .job-ico { display: none; } .job-meta { min-width: 0; flex: 1; display: flex; flex-direction: column; gap: 0.3rem; align-items: flex-start; } .job-line .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; color: var(--ink); font-weight: 650; } .job-line .swatches { padding: 0; min-height: 0; flex: none; } .badge { font-size: 0.65rem; font-weight: 650; letter-spacing: 0.04em; text-transform: uppercase; padding: 0.15rem 0.45rem; border-radius: 6px; background: rgba(255, 255, 255, 0.06); color: var(--muted); border: 1px solid var(--line); } .state { font-size: 0.68rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; padding: 0.18rem 0.5rem; border-radius: 999px; border: 1px solid var(--line-strong); background: rgba(255, 255, 255, 0.03); } .state.printing { color: #d9ffe8; background: var(--live-soft); border-color: transparent; } .state.paused { color: #fef3c7; background: rgba(251, 191, 36, 0.14); border-color: transparent; } .state.error, .state.offline { color: #fecaca; background: rgba(248, 113, 113, 0.14); border-color: transparent; } .state.standby, .state.heating, .state.complete, .state.cancelled { color: var(--faint); background: transparent; border-color: var(--line); } .host { font-size: 0.72rem; color: var(--faint); font-variant-numeric: tabular-nums; } .temps { padding: 0 0.85rem 0.45rem; font-size: 0.82rem; color: var(--muted); font-variant-numeric: tabular-nums; } .temps b { color: var(--ink); font-weight: 650; } .meter { height: 4px; background: var(--track); margin: 0 0.85rem; } .meter span { display: block; height: 100%; background: linear-gradient(90deg, #ea580c, #fdba74); transition: width 0.4s ease; } .machine-stats { padding: 0.5rem 0.85rem 0.35rem; font-size: 0.78rem; color: var(--muted); display: flex; flex-wrap: wrap; gap: 0.35rem 0.65rem; font-variant-numeric: tabular-nums; } .machine-stats b { color: var(--ink); font-weight: 600; } .job-name { padding: 0 0.85rem 0.45rem; font-size: 0.8rem; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .swatches { display: flex; flex-wrap: wrap; gap: 0.28rem; padding: 0 0.85rem 0.55rem; min-height: 1.1rem; } .swatches .dot { width: 0.85rem; height: 0.85rem; margin-left: 0; border-radius: 50%; border: 1px solid rgba(0, 0, 0, 0.4); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15); } .card-actions { display: flex; flex-wrap: wrap; gap: 0.4rem; } .card-actions:empty { display: none; } .card-actions button { display: inline-flex; align-items: center; gap: 0.35rem; padding: 0.38rem 0.75rem; font-size: var(--t-sm); border-radius: 9px; } .stack { display: flex; flex-direction: column; gap: 0.7rem; } article.printer { background: linear-gradient(180deg, rgba(255, 255, 255, 0.035), transparent 42%), var(--card); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); overflow: hidden; } .row { width: 100%; display: grid; grid-template-columns: 12rem minmax(0, 1fr) 4.4rem 7.2rem auto; gap: 0.8rem; align-items: center; padding: 0.95rem 1rem; border: 0; background: transparent; color: inherit; font: inherit; text-align: left; cursor: pointer; } .pill { font-size: 0.72rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; padding: 0.22rem 0.55rem; border-radius: 999px; border: 1px solid var(--line-strong); background: rgba(255, 255, 255, 0.03); } .pics { display: flex; gap: 0.6rem; flex-wrap: wrap; } .shot { width: 100%; max-height: 240px; object-fit: contain; background: var(--card-2); border-radius: 12px; border: 1px solid var(--line); flex: 1; min-width: 120px; } .facts { display: flex; flex-wrap: wrap; gap: 0.4rem 0.95rem; margin-top: 0.75rem; color: var(--muted); font-size: 0.85rem; } .facts b { color: var(--ink); font-weight: 650; } .msg, .ok { margin: 0.55rem 0 0; min-height: 1.2em; } .msg { color: var(--warn); } .ok { color: var(--accent); } .mesh { margin-top: 0.9rem; } .mesh p { margin: 0 0 0.4rem; color: var(--muted); font-size: 0.85rem; } .gridmesh { display: grid; gap: 3px; width: min(100%, 280px); } .desk-mesh .gridmesh { width: 100%; max-width: none; } .cell { aspect-ratio: 1; display: grid; place-items: center; font-size: 0.68rem; color: var(--accent-ink); border-radius: 4px; font-variant-numeric: tabular-nums; } .camera-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 0.85rem; } .camera-tile { margin: 0; background: var(--card); border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; } .camera-tile figcaption { padding: 0.55rem 0.75rem; font-size: 0.88rem; font-weight: 650; border-bottom: 1px solid var(--line); } .camera-tile .cam-stage { position: relative; min-height: 140px; background: var(--card-2); } .camera-tile img { display: block; width: 100%; max-height: 220px; object-fit: contain; background: var(--card-2); } .camera-tile .cam-empty { margin: 0; min-height: 140px; display: grid; place-content: center; justify-items: center; gap: 0.35rem; color: var(--muted); font-size: 0.85rem; } .camera-tile .cam-empty .ico { width: 1.6rem; height: 1.6rem; opacity: 0.55; } .camera-tile .cam-open { display: inline-block; margin: 0.45rem 0.75rem 0.65rem; font-size: 0.82rem; } .card { background: var(--card); border: 1px solid var(--line); border-radius: var(--radius); padding: 1rem 1.05rem 1.1rem; box-shadow: none; } main > .card { margin-bottom: 0.85rem; } .split { display: grid; grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); gap: 1rem; align-items: start; } .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0.55rem 0.75rem; } .field { display: grid; gap: 0.28rem; min-width: 0; } .field > label, .field-label { display: block; color: var(--faint); font-size: 0.72rem; margin: 0; font-weight: 650; letter-spacing: 0.02em; text-transform: uppercase; } .field-help { margin: 0; color: var(--faint); font-size: 0.72rem; line-height: 1.35; } label { display: block; color: var(--muted); font-size: 0.78rem; margin: 0.7rem 0 0.28rem; letter-spacing: 0.01em; } form .grid-2 > div > label, form > label:not(.check):not(.mix) { margin-top: 0.15rem; font-size: 0.72rem; color: var(--faint); font-weight: 650; text-transform: uppercase; letter-spacing: 0.02em; } .check { display: flex; gap: 0.55rem; align-items: center; color: var(--ink); font-size: 0.88rem; margin-top: 0.7rem; } .page-tools .check { margin: 0; } .check input { width: auto; accent-color: var(--accent); } input, select, button, textarea { font: inherit; } input, select, textarea { width: 100%; min-height: var(--control-h); padding: 0.45rem 0.65rem; border: 1px solid var(--line-strong); border-radius: var(--radius-sm); background: var(--card-2); color: var(--ink); transition: border-color 0.15s var(--ease), background 0.15s var(--ease); } input:hover, select:hover, textarea:hover { border-color: rgba(255, 255, 255, 0.22); } input:focus, select:focus, textarea:focus, button:focus-visible, .nav-main a:focus-visible, .topbar-tools .icon-btn:focus-visible, a:focus-visible { outline: 2px solid rgba(249, 115, 22, 0.55); outline-offset: 2px; } textarea { min-height: 6rem; resize: vertical; } button { display: inline-flex; align-items: center; justify-content: center; gap: 0.4rem; min-height: var(--control-h); border: 1px solid transparent; background: var(--accent); color: var(--accent-ink); padding: 0.4rem 0.85rem; border-radius: var(--radius-sm); cursor: pointer; font-weight: 650; font-size: 0.88rem; transition: background 0.15s var(--ease), border-color 0.15s var(--ease), color 0.15s var(--ease), filter 0.15s var(--ease); } button:hover { filter: brightness(1.06); } button.ghost { background: transparent; color: var(--muted); border-color: var(--line-strong); } button.ghost:hover { color: var(--ink); background: rgba(255, 255, 255, 0.04); filter: none; } button.warn { background: transparent; color: var(--warn); border-color: rgba(248, 113, 113, 0.45); } button.warn:hover { background: var(--st-error-soft); filter: none; } button:disabled { opacity: 0.45; cursor: not-allowed; filter: none; } .actions { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.85rem; align-items: center; } .table-wrap { overflow-x: auto; border-radius: 10px; } .table-wrap > table { margin: 0; } table { width: 100%; border-collapse: separate; border-spacing: 0; } th, td { text-align: left; padding: 0.5rem 0.55rem; border-bottom: 1px solid var(--line); vertical-align: middle; font-size: 0.86rem; } th { position: sticky; top: 0; z-index: 1; color: var(--faint); font-weight: 650; font-size: 0.68rem; letter-spacing: 0.06em; text-transform: uppercase; background: var(--card); white-space: nowrap; } td.num, th.num, td.right { text-align: right; font-variant-numeric: tabular-nums; } td.nowrap, th.nowrap { white-space: nowrap; } tbody tr { transition: background 0.12s var(--ease); } tbody tr:hover td { background: rgba(255, 255, 255, 0.025); } tr.pick { cursor: pointer; } tr.pick:hover td { background: rgba(255, 255, 255, 0.04); } tr.on td { background: var(--accent-soft); } td select { width: auto; min-width: 8.5rem; padding: 0.3rem 0.45rem; min-height: 1.9rem; border-radius: 7px; } .thumb { width: 64px; height: 64px; object-fit: contain; background: var(--card-2); border-radius: 12px; border: 1px solid var(--line); } .auth-body { min-height: 100vh; display: grid; place-items: center; padding: 1.5rem; background: radial-gradient(ellipse at 20% 0%, rgba(61, 206, 124, 0.12), transparent 45%), var(--bg); } .auth-card { width: min(22rem, 100%); background: var(--card); border: 1px solid var(--line); border-radius: var(--radius); padding: 1.4rem 1.35rem 1.5rem; } .auth-card h1 { margin: 0 0 0.35rem; font-size: 1.45rem; } .auth-brand { display: flex; align-items: center; gap: 0.55rem; } .auth-brand img { width: 2.25rem; height: 2.25rem; border-radius: 99px; object-fit: contain; } .auth-quote { margin: 0.55rem 0 0; padding: 0; border: 0; } .auth-quote blockquote { margin: 0; font-size: 0.82rem; line-height: 1.45; color: var(--muted); font-style: italic; } .auth-quote figcaption { margin-top: 0.35rem; font-size: 0.7rem; color: var(--faint); font-style: normal; } .auth-card .stack { display: grid; gap: 0.75rem; margin-top: 1rem; } .empty { color: var(--muted); padding: 1rem 0.3rem; } .empty-state { text-align: center; padding: 2rem 1.25rem; color: var(--muted); display: grid; justify-items: center; gap: 0.45rem; } .empty-state .ico { width: 1.75rem; height: 1.75rem; opacity: 0.45; color: var(--faint); margin-bottom: 0.15rem; } .empty-state p { margin: 0; max-width: 28ch; font-size: 0.88rem; line-height: 1.4; } .empty-state .tiny { max-width: 36ch; } .empty-state a { font-size: 0.84rem; } .desk-cam-empty, .desk-empty, .picked-empty { display: grid; justify-items: center; gap: 0.35rem; text-align: center; color: var(--faint); font-size: 0.84rem; padding: 1.25rem 0.75rem; } .desk-cam-empty .ico, .desk-empty .ico, .picked-empty .ico { width: 1.5rem; height: 1.5rem; opacity: 0.45; } .nums { display: grid; grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); gap: 0.55rem; margin-top: 0.9rem; } .num { border: 1px solid var(--line); border-radius: 12px; padding: 0.65rem 0.7rem; background: var(--card-2); } .num b { display: block; font-size: 1.15rem; letter-spacing: -0.03em; margin-top: 0.15rem; } .num span { color: var(--muted); font-size: 0.72rem; } .hint { color: var(--faint); font-size: 0.76rem; margin: 0.15rem 0 0.55rem; line-height: 1.35; max-width: 48ch; } .color-grid { display: flex; flex-wrap: wrap; gap: 0.4rem; margin: 0.35rem 0 0.8rem; } button.swatch { display: inline-flex; align-items: center; gap: 0.4rem; background: var(--card-2); color: var(--ink); border: 1px solid var(--line-strong); border-radius: 999px; padding: 0.28rem 0.7rem 0.28rem 0.35rem; font-weight: 550; font-size: 0.85rem; } button.swatch.on { border-color: var(--accent); background: var(--accent-soft); } .dots { display: inline-flex; align-items: center; } .dot { width: 0.9rem; height: 0.9rem; border-radius: 50%; border: 1px solid rgba(0, 0, 0, 0.35); margin-left: -0.28rem; box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.18); } .dot:first-child { margin-left: 0; } .picked { display: flex; align-items: center; gap: 0.55rem; min-height: 1.6rem; margin-bottom: 0.35rem; } .mix { display: flex; align-items: center; gap: 0.45rem; color: var(--muted); font-size: 0.85rem; margin: 0.15rem 0 0.7rem; } .mix input { width: auto; } .doc h2 { margin-top: 1.4rem; } .doc p, .doc li { color: var(--muted); } .doc ul { padding-left: 1.15rem; } .section-gap { margin-top: 1.3rem; padding-top: 0.2rem; } .scan-card { margin-bottom: 1rem; } .scan-card input { max-width: 28rem; } /* ---------- Material ---------- */ .scan-inline { display: flex; align-items: center; gap: 0.45rem; min-width: min(22rem, 100%); padding: 0.2rem 0.65rem; border: 1px solid var(--line-strong); border-radius: var(--radius-sm); background: var(--card-2); color: var(--faint); } .scan-inline:focus-within { border-color: rgba(249, 115, 22, 0.55); box-shadow: 0 0 0 2px rgba(249, 115, 22, 0.2); } .scan-inline .ico { opacity: 0.7; } .scan-inline input { border: 0; background: transparent; min-height: 2rem; padding: 0.25rem 0; border-radius: 0; } .scan-inline input:focus { outline: none; } .scan-note { margin: 0; font-size: var(--t-xs); max-width: 16rem; } .mat-tools { margin-bottom: 0.55rem; } .mat-tools .filter-bar { margin: 0; flex: 1 1 auto; } .mat-tools input[type="search"] { min-width: 10rem; max-width: 14rem; } .mat-tabs { margin-bottom: 0.85rem; } .mat-split { grid-template-columns: minmax(0, 1.15fr) minmax(18rem, 0.95fr); } .mat-split.is-idle { grid-template-columns: 1fr; } .mat-list .lib-head { margin-bottom: 0.55rem; } .mat-list h2 { margin: 0; } .mat-form-head { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.65rem; } .mat-form-head h2 { margin: 0; flex: 1; min-width: 0; } .mat-group td { padding-top: 0.85rem; padding-bottom: 0.25rem; border-bottom: 0; color: var(--faint); font-size: var(--t-xs); font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; background: transparent !important; } .mat-color-cap { color: var(--faint); font-size: var(--t-xs); } .mat-form { position: sticky; top: calc(var(--topbar-h) + 0.75rem); } .mat-color, .mat-more { margin: 0.75rem 0 0; border: 1px solid var(--line); border-radius: 10px; background: rgba(255, 255, 255, 0.02); overflow: hidden; } .mat-color > summary, .mat-more > summary { list-style: none; display: flex; align-items: center; gap: 0.4rem; padding: 0.55rem 0.7rem; cursor: pointer; user-select: none; color: var(--muted); font-size: var(--t-sm); font-weight: 650; } .mat-color > summary::-webkit-details-marker, .mat-more > summary::-webkit-details-marker { display: none; } .mat-color > summary .caret, .mat-more > summary .caret { transition: transform 0.2s var(--ease); opacity: 0.6; } .mat-color:not([open]) > summary .caret, .mat-more:not([open]) > summary .caret { transform: rotate(-90deg); } .mat-color > summary .grow, .mat-more > summary .grow { flex: 1; color: var(--ink); } .mat-color-body, .mat-more-body { padding: 0 0.7rem 0.75rem; } .mat-color-body .color-grid { margin-bottom: 0.35rem; } .mat-color-body .picked { min-height: 1.4rem; margin-bottom: 0.45rem; } .viewer-card { margin-top: 1rem; } .gcode-viewer-wrap { position: relative; border-radius: 12px; border: 1px solid var(--line); overflow: hidden; background: #121212; } .gcode-canvas { width: 100%; height: 360px; display: block; border: 0; border-radius: 0; background: #121212; touch-action: none; cursor: grab; user-select: none; } .gcode-canvas:active { cursor: grabbing; } .gcode-canvas.compact { height: 220px; } .gcode-legend { position: absolute; left: 0.55rem; bottom: 0.5rem; display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem 0.55rem; padding: 0.28rem 0.5rem; border-radius: 8px; background: rgba(12, 12, 12, 0.72); border: 1px solid rgba(255, 255, 255, 0.08); color: #c8c8c8; font-size: 0.72rem; line-height: 1.2; pointer-events: none; } .gcode-leg-swatch { width: 0.7rem; height: 0.22rem; border-radius: 1px; flex: none; } .gcode-leg-item { display: inline-flex; align-items: center; gap: 0.35rem; } .gcode-leg-swatch.done { background: #5dffb0; } .gcode-leg-swatch.done.thick { height: 0.38rem; box-shadow: 0 0 0 1px rgba(93, 255, 176, 0.35); } .gcode-leg-swatch.todo { background: #6b7280; opacity: 0.45; } .exclude-panel { margin-top: 0.55rem; padding-top: 0.45rem; border-top: 1px solid var(--line); } .exclude-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.35rem 0.75rem; margin-bottom: 0.35rem; } .exclude-list { display: flex; flex-direction: column; gap: 0.25rem; max-height: 9rem; overflow: auto; } .exclude-item { display: flex; align-items: center; gap: 0.5rem; padding: 0.35rem 0.45rem; border-radius: 8px; border: 1px solid transparent; cursor: pointer; } .exclude-item:hover { background: rgba(255, 255, 255, 0.03); } .exclude-item.is-selected { border-color: rgba(255, 255, 255, 0.22); background: rgba(255, 255, 255, 0.05); } .exclude-item.is-excluded { opacity: 0.55; } .exclude-item.is-current b { color: #fbbf24; } .exclude-item.is-excluded b { color: #ef4444; text-decoration: line-through; } .gcode-leg-item.preview-only { display: none; } .gcode-legend.preview .gcode-leg-item.live { display: none; } .gcode-legend.preview .gcode-leg-item.preview-only { display: inline-flex; } .gcode-legend.preview .gcode-leg-swatch.done { background: #f97316; } .gcode-leg-scale { margin-left: 0.15rem; padding-left: 0.55rem; border-left: 1px solid rgba(255, 255, 255, 0.12); color: #9a9a9a; } .viewer-slot { margin-top: 0.75rem; } .viewer-caption { margin: 0 0 0.35rem; color: var(--muted); } /* Drucker-Cockpit — nur die Seite scrollt, keine inneren Scrollbereiche */ body.desk-on main { max-width: none; margin: 0; padding: 1rem 1.25rem 2.5rem; } .desk { display: grid; gap: 1rem; animation: desk-in 0.18s var(--ease); } @keyframes desk-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } } .desk-bar { position: sticky; top: var(--topbar-h); z-index: 5; display: grid; gap: 0.55rem; padding: 0.55rem 0.7rem; margin: -0.35rem -0.35rem 0; border: 1px solid var(--line); border-radius: var(--radius); background: rgba(10, 10, 12, 0.92); backdrop-filter: blur(10px); } .desk-bar-top { display: flex; align-items: center; gap: 0.65rem; min-width: 0; } .desk-back { flex: none; } .desk-title { display: flex; align-items: center; gap: 0.45rem; min-width: 0; flex: 1 1 auto; } .desk-title h2 { margin: 0; font-size: 1.25rem; font-weight: 720; letter-spacing: -0.03em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .desk-pills { display: flex; flex-wrap: wrap; gap: 0.35rem; } .desk-pill { display: inline-flex; align-items: center; gap: 0.35rem; padding: 0.28rem 0.65rem; border-radius: 999px; border: 1px solid var(--line-strong); background: rgba(255, 255, 255, 0.03); color: var(--muted); font-size: var(--t-xs); font-weight: 600; cursor: pointer; } .desk-pill:hover { color: var(--ink); border-color: var(--line); filter: none; } .desk-pill.on { color: var(--accent); background: var(--accent-soft); border-color: transparent; } .state-dot { width: 0.45rem; height: 0.45rem; border-radius: 99px; background: var(--st-idle); flex: none; } .state-dot.printing { background: var(--st-printing); } .state-dot.paused, .state-dot.heating { background: var(--st-heating); } .state-dot.error { background: var(--st-error); } .state-dot.offline { background: var(--st-offline); } .state-dot.complete { background: var(--st-done); } .desk-mainsail { margin-left: auto; font-size: var(--t-sm); text-decoration: none; color: var(--muted); flex: none; } .desk-mainsail:hover { color: var(--accent); } .desk-stage { display: grid; grid-template-columns: minmax(0, 1.55fr) minmax(18rem, 22rem); gap: 1rem; align-items: start; } .desk.no-cam .desk-stage, .desk.cam-collapsed .desk-stage { grid-template-columns: 1fr; } .desk.no-cam .desk-cam-fold, .desk.cam-collapsed .desk-cam-fold { order: -1; } .desk-fold { margin: 0; border: 1px solid var(--line); border-radius: calc(var(--radius) + 2px); background: var(--card); box-shadow: var(--shadow); overflow: hidden; } .desk-fold-sum { list-style: none; cursor: pointer; display: flex; align-items: center; gap: 0.45rem; padding: 0.55rem 0.75rem; font-size: var(--t-sm); font-weight: 650; color: var(--muted); user-select: none; } .desk-fold-sum::-webkit-details-marker { display: none; } .desk-fold-sum .grow { flex: 1; min-width: 0; color: var(--ink); } .desk-fold-sum .tiny { margin: 0; max-width: 55%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 550; text-transform: none; letter-spacing: 0; } .desk-fold-sum .caret { transition: transform 0.2s var(--ease); opacity: 0.6; flex: none; } .desk-fold:not([open]) > .desk-fold-sum .caret { transform: rotate(-90deg); } .desk-fold-sum:hover { color: var(--ink); background: rgba(255, 255, 255, 0.03); } .desk-fold-body { padding: 0 0.75rem 0.75rem; } .desk-cam-fold { min-width: 0; } .desk-cam-fold > .desk-fold-sum { border-bottom: 1px solid transparent; } .desk-cam-fold[open] > .desk-fold-sum { border-bottom-color: var(--line); } .desk-cam { position: relative; aspect-ratio: 16 / 10; max-height: 28rem; background: radial-gradient(600px 280px at 50% 0%, rgba(249, 115, 22, 0.06), transparent 60%), #0c0c10; overflow: hidden; display: grid; place-items: center; } .desk.no-cam .desk-cam, .desk.cam-collapsed:not(.no-cam) .desk-cam-fold:not([open]) .desk-cam { aspect-ratio: auto; max-height: none; min-height: 0; } .desk.no-cam .desk-cam { padding: 0.65rem 0.85rem; background: rgba(255, 255, 255, 0.02); } .desk.cam-collapsed .desk-cam-fold:not([open]) .desk-cam { display: none; } .desk.no-cam .desk-cam-fold:not([open]), .desk.cam-collapsed .desk-cam-fold:not([open]) { box-shadow: none; } .desk-cam-img { width: 100%; height: 100%; object-fit: contain; display: block; } .desk-cam-empty { margin: 0; color: var(--faint); font-size: var(--t-sm); letter-spacing: 0.02em; } .desk-rail { display: flex; flex-direction: column; border: 1px solid var(--line); border-radius: calc(var(--radius) + 2px); background: linear-gradient(180deg, rgba(255, 255, 255, 0.035), transparent 28%), var(--card); box-shadow: var(--shadow); } .desk-steer-fold { border: 1px solid var(--line); border-radius: 10px; background: rgba(255, 255, 255, 0.02); box-shadow: none; } .desk-steer-fold > .desk-fold-sum { padding: 0.45rem 0.55rem; } .desk-steer-fold[open] > .desk-fold-sum { border-bottom: 1px solid var(--line); } .desk-steer-fold .steer { margin: 0; border: 0; padding: 0.55rem 0.55rem 0.65rem; background: transparent; border-radius: 0; } .desk-rail-body { padding: 0.95rem 1rem; display: grid; gap: 0.7rem; align-content: start; } .desk-rail-body > :empty { display: none; } .desk-job { display: flex; align-items: center; gap: 0.55rem; min-width: 0; padding: 0.45rem 0.5rem; border-radius: 10px; background: rgba(255, 255, 255, 0.03); border: 1px solid var(--line); } .desk-thumb { width: 3.1rem; height: 3.1rem; object-fit: contain; border-radius: 9px; border: 1px solid var(--line); background: var(--card-2); flex: none; } .desk-job-text { min-width: 0; display: grid; gap: 0.25rem; } .desk-job-text .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--t-sm); color: var(--ink); font-weight: 650; } .desk-facts { display: flex; flex-wrap: wrap; gap: 0.35rem 0.85rem; color: var(--muted); font-size: var(--t-sm); } .desk-facts b { color: var(--ink); font-weight: 650; } .desk-tech-facts { gap: 0.35rem; } .fact-chip { display: inline-flex; align-items: center; gap: 0.3rem; padding: 0.2rem 0.5rem; border-radius: 99px; border: 1px solid var(--line); background: rgba(255, 255, 255, 0.03); font-size: 0.72rem; color: var(--muted); max-width: 100%; } .fact-chip .ico { width: 0.85em; height: 0.85em; opacity: 0.75; flex: none; } .fact-chip-label { color: var(--faint); } .fact-chip b { color: var(--ink); font-weight: 650; font-variant-numeric: tabular-nums; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .desk-foot { display: flex; flex-wrap: wrap; gap: 0.45rem; align-items: center; padding: 0.7rem 1rem; border-top: 1px solid var(--line); background: rgba(0, 0, 0, 0.22); } .desk-foot .card-actions { margin: 0; flex: 1; } .desk-foot .card-actions:empty { display: none; } .desk-tools { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } .desk-tool { min-width: 0; } .desk-tool > .desk-fold-sum { font-size: var(--t-xs); letter-spacing: 0.06em; text-transform: uppercase; } .desk-tool > .desk-fold-sum .grow { font-size: var(--t-xs); letter-spacing: 0.06em; } .desk-tool[open] > .desk-fold-sum { border-bottom: 1px solid var(--line); } .desk-canvas { display: block; width: 100%; height: 280px !important; border-radius: 10px; } .desk-tool-mesh .mesh { margin-top: 0; } .desk-tool-mesh .gridmesh { width: 100%; max-width: 22rem; } .desk-verlauf .temp-chart { max-width: none; } .desk-verlauf-head { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.45rem; } .desk-empty { margin: 0.35rem 0 0; color: var(--faint); } .ablauf-card { margin-top: 1rem; } .ablauf-steps { display: grid; gap: 0.65rem; margin: 0.75rem 0; } .ablauf-step { border: 1px solid var(--line); border-radius: 12px; background: rgba(255, 255, 255, 0.03); padding: 0.65rem 0.75rem; } .ablauf-step-head { display: flex; justify-content: space-between; align-items: center; gap: 0.5rem; margin-bottom: 0.55rem; } .ablauf-step-tools { display: flex; gap: 0.25rem; } .ablauf-step-body { display: grid; grid-template-columns: repeat(auto-fill, minmax(8.5rem, 1fr)); gap: 0.45rem 0.65rem; align-items: end; } .ablauf-field { display: grid; gap: 0.2rem; margin: 0; font-size: 0.78rem; color: var(--muted); } .ablauf-field input, .ablauf-field select { width: 100%; font-size: 0.88rem; } .file-lib-tools { margin-bottom: 0.85rem; } .file-lib-tools input[type="search"], .file-lib-tools select { max-width: 16rem; margin: 0; } #spool-warn { margin: 0.45rem 0 0; } .camera-tile .cam-meta { margin: 0.15rem 0 0.45rem; padding: 0 0.15rem; min-height: 1.1rem; } .camera-tile.printing { border-color: rgba(61, 206, 124, 0.45); } .camera-tile.error { border-color: rgba(248, 113, 113, 0.45); } /* ---------- Designsystem ---------- */ .ico { width: 1em; height: 1em; flex: none; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; vertical-align: -0.125em; } .ico.lg { width: 1.15rem; height: 1.15rem; } .chip { --c: var(--st-idle); --cs: var(--st-idle-soft); display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.2rem 0.6rem 0.2rem 0.5rem; border-radius: 99px; background: var(--cs); color: var(--c); font-size: 0.7rem; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; white-space: nowrap; flex: none; } .chip::before { content: ""; width: 0.45rem; height: 0.45rem; border-radius: 99px; background: var(--c); flex: none; } .chip.printing { --c: var(--st-printing); --cs: var(--st-printing-soft); } .chip.printing::before { animation: pulse 1.8s var(--ease) infinite; } .chip.paused, .chip.heating { --c: var(--st-heating); --cs: var(--st-heating-soft); } .chip.heating::before { animation: pulse 1.2s var(--ease) infinite; } .chip.complete { --c: var(--st-done); --cs: var(--st-done-soft); } .chip.error { --c: var(--st-error); --cs: var(--st-error-soft); } .chip.offline { --c: var(--st-offline); --cs: var(--st-offline-soft); } .chip.waiting { --c: var(--st-waiting); --cs: transparent; box-shadow: inset 0 0 0 1px rgba(249, 115, 22, 0.45); } .chip.cancelled { --c: var(--muted); --cs: var(--st-idle-soft); } .chip.sm { font-size: 0.6rem; padding: 0.12rem 0.45rem 0.12rem 0.38rem; gap: 0.3rem; } .chip.sm::before { width: 0.36rem; height: 0.36rem; } @keyframes pulse { 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--c) 60%, transparent); } 70% { box-shadow: 0 0 0 6px transparent; } 100% { box-shadow: 0 0 0 0 transparent; } } .steps { display: flex; align-items: center; gap: 0.2rem; min-width: 0; flex-wrap: wrap; } .step { display: inline-flex; align-items: center; gap: 0.3rem; padding: 0.14rem 0.45rem; border-radius: 99px; font-size: 0.66rem; font-weight: 650; color: var(--faint); border: 1px solid var(--line-strong); white-space: nowrap; } .step::before { content: ""; width: 0.36rem; height: 0.36rem; border-radius: 99px; border: 1.5px solid currentColor; box-sizing: border-box; } .step.done { color: var(--muted); border-color: transparent; background: rgba(255, 255, 255, 0.04); } .step.done::before { background: currentColor; } .step.now { --c: var(--accent); color: #ffd7b5; border-color: rgba(249, 115, 22, 0.55); background: var(--accent-soft); } .step.now::before { background: var(--accent); border-color: var(--accent); animation: pulse 1.6s var(--ease) infinite; } .step-sep { width: 0.4rem; height: 1px; background: var(--line-strong); flex: none; } .steps.compact .step { padding: 0.1rem 0.38rem; font-size: 0.6rem; } .steps.compact .step-sep { width: 0.2rem; } .bar { position: relative; height: 1.15rem; border-radius: 7px; background: var(--track); overflow: hidden; } .bar > span { position: absolute; inset: 0 auto 0 0; width: 0; border-radius: inherit; background: linear-gradient(90deg, #c2410c, #f97316 55%, #fdba74); transition: width 0.6s var(--ease); } .bar.live > span { background: linear-gradient(90deg, #15803d, #3dce7c 60%, #86efac); } .bar.slim { display: block; height: 0.3rem; border-radius: 99px; margin: 0.35rem 0 0.15rem; } .bar.live > span::after { content: ""; position: absolute; inset: 0; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.22), transparent); background-size: 40% 100%; background-repeat: no-repeat; animation: shimmer 2.4s linear infinite; } .bar > b { position: relative; display: block; padding: 0 0.5rem; font-size: 0.7rem; line-height: 1.15rem; font-weight: 750; color: #fff; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.55); font-variant-numeric: tabular-nums; } @keyframes shimmer { from { background-position: -40% 0; } to { background-position: 140% 0; } } .stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.4rem; } .stats:empty { display: none; } .stat { padding: 0.45rem 0.55rem; border-radius: 10px; background: var(--card-2); border: 1px solid var(--line); min-width: 0; } .stat b { display: block; font-size: var(--t-md); font-weight: 700; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .stat span { display: block; font-size: 0.64rem; color: var(--faint); text-transform: uppercase; letter-spacing: 0.06em; font-weight: 650; margin-top: 0.05rem; } .tempbars { display: grid; grid-template-columns: repeat(auto-fit, minmax(7.5rem, 1fr)); gap: 0.55rem; } .tempbar { display: grid; gap: 0.25rem; min-width: 0; } .tempbar-head { display: flex; justify-content: flex-start; align-items: center; flex-wrap: wrap; gap: 0.3rem; font-size: var(--t-xs); color: var(--faint); } .tempbar-head .ico { width: 0.95rem; height: 0.95rem; opacity: 0.75; flex: none; } .tempbar-head b { color: var(--ink); font-size: var(--t-sm); font-weight: 650; font-variant-numeric: tabular-nums; margin-left: auto; } .tempbar-head b small { color: var(--faint); font-weight: 550; } .fact-ico { display: inline-flex; align-items: center; gap: 0.28rem; } .fact-ico .ico { width: 0.9rem; height: 0.9rem; opacity: 0.75; } .steer-row label .ico { width: 0.9rem; height: 0.9rem; opacity: 0.7; vertical-align: -0.15em; } .tempbar-track { position: relative; height: 4px; border-radius: 99px; background: var(--track); overflow: visible; } .tempbar-track > span { position: absolute; inset: 0 auto 0 0; border-radius: inherit; background: #64748b; transition: width 0.6s var(--ease), background 0.3s; } .tempbar-track > i { position: absolute; top: -3px; width: 2px; height: 10px; border-radius: 2px; background: rgba(255, 255, 255, 0.55); transform: translateX(-1px); } .tempbar.hot .tempbar-track > span { background: linear-gradient(90deg, #f59e0b, #f97316); } .tempbar.heating .tempbar-track > span { background: linear-gradient(90deg, #f59e0b, #fbbf24); animation: breathe 1.4s ease-in-out infinite; } @keyframes breathe { 50% { opacity: 0.55; } } .strip { display: flex; align-items: center; gap: 0.55rem; padding: 0.55rem 0.65rem; border-radius: 10px; font-size: var(--t-sm); border: 1px solid var(--line); background: rgba(255, 255, 255, 0.03); } .strip .grow { flex: 1; min-width: 0; } .strip.warn { border-color: rgba(251, 191, 36, 0.35); background: var(--st-heating-soft); color: #fde68a; } .strip.bad { border-color: rgba(248, 113, 113, 0.4); background: var(--st-error-soft); color: #fecaca; } .strip.flow { display: grid; gap: 0.4rem; border-color: rgba(249, 115, 22, 0.3); background: linear-gradient(180deg, rgba(249, 115, 22, 0.08), rgba(249, 115, 22, 0.02)); color: var(--ink); } .strip.flow .flow-head { display: flex; align-items: center; gap: 0.45rem; } .strip.flow .flow-head .grow { font-weight: 650; } .strip.flow .flow-msg { color: var(--muted); font-size: var(--t-xs); } .strip button { padding: 0.28rem 0.6rem; font-size: var(--t-xs); border-radius: 7px; flex: none; } .strip.warn button { background: var(--st-heating); color: #2a1a00; } .strip.stopped { display: grid; gap: 0.45rem; align-items: stretch; } .strip.stopped .strip-head { display: flex; align-items: center; gap: 0.45rem; } .strip.stopped .strip-msg { font-size: var(--t-xs); color: #fca5a5; opacity: 0.85; } .strip.stopped .strip-actions { display: flex; flex-wrap: wrap; gap: 0.4rem; } .strip.stopped .strip-actions button { display: inline-flex; align-items: center; gap: 0.35rem; padding: 0.45rem 0.85rem; font-size: var(--t-sm); } .strip.stopped .strip-actions button:not(.ghost) { background: var(--accent); color: var(--accent-ink); } .strip.stopped .strip-actions button.ghost { color: #fecaca; border-color: rgba(248, 113, 113, 0.4); } .waiting-note { font-size: var(--t-xs); color: var(--muted); display: flex; align-items: center; gap: 0.35rem; } .waiting-note b { color: var(--accent); } .segmented { display: inline-grid; grid-auto-flow: column; grid-auto-columns: 1fr; padding: 0.22rem; border-radius: 12px; background: var(--card-2); border: 1px solid var(--line-strong); gap: 0.2rem; width: 100%; } .segmented button { background: transparent; color: var(--muted); border-radius: 9px; padding: 0.5rem 0.6rem; font-weight: 650; font-size: var(--t-sm); display: grid; gap: 0.05rem; text-align: center; } .segmented button small { font-size: 0.66rem; font-weight: 500; color: var(--faint); } .segmented button:hover { color: var(--ink); background: rgba(255, 255, 255, 0.04); filter: none; } .segmented button.on { background: var(--accent-soft); color: #ffd7b5; box-shadow: inset 0 0 0 1px rgba(249, 115, 22, 0.5); } .segmented button.on small { color: #fdba74; } .tabs { display: flex; gap: 0.25rem; border-bottom: 1px solid var(--line); margin: -0.2rem 0 1rem; } .tabs button { background: transparent; color: var(--muted); border-radius: 0; padding: 0.55rem 0.8rem; border-bottom: 2px solid transparent; margin-bottom: -1px; font-weight: 650; display: inline-flex; align-items: center; gap: 0.4rem; } .tabs button:hover { color: var(--ink); filter: none; } .tabs button.on { color: var(--ink); border-bottom-color: var(--accent); } .conn-banner { position: fixed; top: 0; left: 0; right: 0; z-index: 120; padding: 0.45rem 1rem; text-align: center; font-size: var(--t-sm); font-weight: 500; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.35); pointer-events: none; } .conn-banner[hidden] { display: none !important; } .conn-banner.bad { background: rgba(127, 29, 29, 0.92); color: #fecaca; border-bottom: 1px solid rgba(248, 113, 113, 0.45); } .conn-banner.ok { background: rgba(20, 83, 45, 0.92); color: #bbf7d0; border-bottom: 1px solid rgba(61, 206, 124, 0.45); } .toast-host { position: fixed; right: 1rem; bottom: 1rem; z-index: 80; display: grid; gap: 0.5rem; max-width: min(24rem, calc(100vw - 2rem)); pointer-events: none; } .toast { display: flex; gap: 0.6rem; align-items: flex-start; padding: 0.7rem 0.85rem; border-radius: 12px; background: #1c1c22; border: 1px solid var(--line-strong); box-shadow: 0 18px 40px rgba(0, 0, 0, 0.55); font-size: var(--t-sm); pointer-events: auto; animation: toast-in 0.28s var(--ease); } .toast.good { border-color: rgba(61, 206, 124, 0.45); } .toast.good .ico { color: var(--st-printing); } .toast.bad { border-color: rgba(248, 113, 113, 0.5); } .toast.bad .ico { color: var(--st-error); } .toast.out { animation: toast-out 0.25s var(--ease) forwards; } @keyframes toast-in { from { opacity: 0; transform: translateY(8px) scale(0.98); } } @keyframes toast-out { to { opacity: 0; transform: translateY(6px); } } .skeleton { border-radius: var(--radius); background: linear-gradient(90deg, var(--card) 0%, #1b1b21 50%, var(--card) 100%); background-size: 200% 100%; animation: skel 1.4s linear infinite; border: 1px solid var(--line); min-height: 12rem; } @keyframes skel { from { background-position: 200% 0; } to { background-position: -200% 0; } } .confirm-armed { background: #dc2626 !important; color: #fff !important; animation: armed 0.9s ease-in-out infinite; } @keyframes armed { 50% { box-shadow: 0 0 0 4px rgba(220, 38, 38, 0.25); } } .summary-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem 0.4rem; margin-top: 0.5rem; } .summary-text { color: var(--muted); font-size: var(--t-sm); margin-left: 0.35rem; display: inline-flex; align-items: center; gap: 0.3rem; flex-wrap: wrap; } .summary-text b { color: var(--ink); } .page-head-side { display: flex; align-items: center; gap: 0.75rem 1rem; flex-wrap: wrap; } .page-head-side .check { margin: 0; font-size: var(--t-sm); color: var(--muted); } .cam-mode-field { margin: 0; display: inline-flex; align-items: center; gap: 0.4rem; } .cam-mode-field select { width: auto; min-height: 2rem; margin: 0; } .job-line[hidden] { display: none; } article.machine.flash { animation: flash 2s var(--ease); } @keyframes flash { 0%, 40% { box-shadow: 0 0 0 2px var(--accent), var(--shadow); } } .machine .facts { margin-top: 0.85rem; } /* ---------- Senden ---------- */ .send-layout { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr); gap: 1rem; align-items: start; } .send-panel { position: sticky; top: calc(var(--topbar-h) + 1rem); } .lib-head { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; margin-bottom: 0.75rem; } .lib-head h2 { margin: 0; flex: 1; } .lib-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem; margin-bottom: 0.55rem; position: sticky; top: var(--topbar-h); z-index: 5; background: linear-gradient(180deg, var(--card) 72%, transparent); padding-bottom: 0.3rem; } .lib-tools .search-wrap { flex: 1 1 8rem; min-width: 7rem; max-width: 16rem; } .lib-tools input[type="search"] { flex: 1 1 auto; width: 100%; margin: 0; min-width: 0; } .lib-tools select { flex: 0 1 auto; width: auto; min-width: 6.5rem; max-width: 9.5rem; margin: 0; padding: 0.35rem 0.5rem; } @media (min-width: 1100px) { .lib-tools { flex-wrap: nowrap; } .lib-tools .search-wrap { max-width: 12rem; } } .lib-group { font-size: var(--t-xs); font-weight: 650; color: var(--muted); text-transform: uppercase; letter-spacing: 0.04em; padding: 0.55rem 0.35rem 0.15rem; margin-top: 0.25rem; border-bottom: 1px solid var(--line); } .lib-group:first-child { margin-top: 0; padding-top: 0.15rem; } .lib-list { display: grid; gap: 0.35rem; max-height: 70vh; overflow-y: auto; margin: 0 -0.3rem; padding: 0 0.3rem; } .lib-item { display: grid; grid-template-columns: 3.25rem minmax(0, 1fr) auto; gap: 0.7rem; align-items: center; padding: 0.45rem 0.55rem; border-radius: 12px; border: 1px solid transparent; background: rgba(255, 255, 255, 0.02); cursor: pointer; text-align: left; color: inherit; font-weight: 500; width: 100%; } .lib-item:hover { background: rgba(255, 255, 255, 0.05); filter: none; } .lib-item.on { border-color: rgba(249, 115, 22, 0.55); background: var(--accent-soft); } .lib-item img, .lib-item .ph { width: 3.25rem; height: 3.25rem; border-radius: 9px; object-fit: contain; background: var(--card-2); border: 1px solid var(--line); } .lib-item .ph { display: grid; place-items: center; color: var(--faint); } .lib-item .t { display: block; font-size: var(--t-sm); font-weight: 650; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink); } .lib-item .m { display: flex; flex-wrap: wrap; gap: 0.15rem 0.6rem; font-size: var(--t-xs); color: var(--muted); margin-top: 0.12rem; font-variant-numeric: tabular-nums; } .lib-item .side { display: flex; gap: 0.25rem; align-items: center; } .lib-move { max-width: 7.5rem; margin: 0; padding: 0.2rem 0.35rem; font-size: var(--t-xs); border-radius: 6px; } .lib-info { position: relative; } .lib-info > summary { list-style: none; } .lib-info > summary::-webkit-details-marker { display: none; } .lib-info-pop { position: absolute; right: 0; top: calc(100% + 0.25rem); z-index: 20; min-width: 11rem; padding: 0.55rem 0.7rem; border-radius: 10px; border: 1px solid var(--line-strong); background: #121217; box-shadow: var(--shadow); font-size: var(--t-xs); color: var(--muted); display: grid; gap: 0.2rem; } .picked-details { opacity: 0.9; } .flow-step { padding: 0.9rem 0 0.95rem; border-top: 1px solid var(--line); } .flow-step:first-of-type { border-top: 0; padding-top: 0.2rem; } .flow-step > h3 { display: flex; align-items: center; gap: 0.55rem; margin: 0 0 0.65rem; font-size: var(--t-md); font-weight: 700; } .flow-step > h3 .num-dot { width: 1.45rem; height: 1.45rem; border-radius: 99px; display: grid; place-items: center; background: rgba(255, 255, 255, 0.07); font-size: 0.72rem; color: var(--muted); } .flow-step.ok > h3 .num-dot { background: var(--accent); color: var(--accent-ink); } .picked-file { display: grid; grid-template-columns: 4.5rem minmax(0, 1fr); gap: 0.8rem; align-items: center; } .picked-file img, .picked-file .ph { width: 4.5rem; height: 4.5rem; border-radius: 12px; object-fit: contain; background: var(--card-2); border: 1px solid var(--line); } .picked-file .ph { display: grid; place-items: center; color: var(--faint); font-size: 1.5rem; } .picked-file .t { font-weight: 700; overflow-wrap: anywhere; } .picked-file .m { display: flex; flex-wrap: wrap; gap: 0.2rem 0.75rem; color: var(--muted); font-size: var(--t-sm); margin-top: 0.2rem; font-variant-numeric: tabular-nums; } .picked-empty { color: var(--faint); font-size: var(--t-sm); padding: 0.9rem; border: 1px dashed var(--line-strong); border-radius: 12px; text-align: center; } .targets { display: grid; grid-template-columns: repeat(auto-fill, minmax(10.5rem, 1fr)); gap: 0.4rem; } .target { display: grid; gap: 0.25rem; text-align: left; padding: 0.55rem 0.65rem; border-radius: 12px; background: var(--card-2); border: 1px solid var(--line-strong); color: var(--ink); font-weight: 600; } .target:hover { border-color: rgba(255, 255, 255, 0.28); filter: none; } .target.on { border-color: var(--accent); background: var(--accent-soft); box-shadow: inset 0 0 0 1px rgba(249, 115, 22, 0.4); } .target.off { opacity: 0.45; } .target .row1 { display: flex; align-items: center; gap: 0.35rem; min-width: 0; } .target .row1 .n { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--t-sm); } .target .row2 { font-size: var(--t-xs); color: var(--muted); font-weight: 500; font-variant-numeric: tabular-nums; } .target .row2.bad { color: #fca5a5; } details.options { margin-top: 0.75rem; border: 1px solid var(--line); border-radius: 12px; background: rgba(255, 255, 255, 0.015); } details.options > summary { cursor: pointer; list-style: none; padding: 0.6rem 0.75rem; font-size: var(--t-sm); color: var(--muted); font-weight: 650; display: flex; align-items: center; gap: 0.45rem; } details.options > summary::-webkit-details-marker { display: none; } details.options > summary .grow { flex: 1; } details.options > summary .caret { transition: transform 0.2s var(--ease); } details.options:not([open]) > summary .caret { transform: rotate(-90deg); } details.options > .opt-body { padding: 0 0.75rem 0.75rem; } details.options .check { font-size: var(--t-sm); margin-top: 0.6rem; } .go-row { display: grid; gap: 0.5rem; margin-top: 0.9rem; } .go-btn { width: 100%; padding: 0.8rem 1rem; border-radius: 12px; font-size: var(--t-md); font-weight: 750; display: inline-flex; justify-content: center; align-items: center; gap: 0.5rem; box-shadow: 0 10px 28px -12px rgba(249, 115, 22, 0.7); } .go-btn:disabled { opacity: 0.4; cursor: not-allowed; box-shadow: none; } .go-hint { font-size: var(--t-xs); color: var(--faint); text-align: center; min-height: 1em; margin: 0; } .go-hint.bad { color: #fca5a5; } .go-btn.confirm-armed { background: var(--st-error); color: #fff; box-shadow: 0 10px 28px -12px rgba(239, 68, 68, 0.8); } .chip.pip { padding: 0; background: none; gap: 0; box-shadow: none; } .chip.pip::before { width: 0.55rem; height: 0.55rem; } .targets.dimmed .target { opacity: 0.55; } .target .count { font-size: 0.62rem; min-width: 1.1rem; } .tabs button { display: inline-flex; align-items: center; gap: 0.4rem; } .tabs button small { font-size: 0.62rem; color: var(--faint); font-weight: 600; } label.button { display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.48rem 0.9rem; border-radius: 8px; cursor: pointer; font-weight: 650; margin: 0; border: 1px solid var(--line-strong); color: var(--accent); font-size: inherit; } label.button:hover { background: rgba(255, 255, 255, 0.04); } .page-head-side button { display: inline-flex; align-items: center; gap: 0.4rem; } .proj-file-list { display: grid; gap: 0.35rem; } .proj-file, .proj-asset { display: flex; align-items: center; gap: 0.55rem; padding: 0.45rem 0.55rem; border: 1px solid var(--line); border-radius: var(--radius-sm); background: rgba(255, 255, 255, 0.02); min-width: 0; text-decoration: none; color: inherit; } .proj-file { flex-direction: column; align-items: flex-start; gap: 0.15rem; } .proj-file:hover, .proj-asset:hover { border-color: var(--line-strong); } .proj-asset a { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink); } .proj-asset .tiny { flex: none; color: var(--muted); } .lib-card { position: relative; transition: box-shadow 0.2s var(--ease); } .lib-card.drop { box-shadow: 0 0 0 2px var(--accent), var(--shadow); } .drop-hint { margin: 0.6rem 0 0; font-size: var(--t-xs); color: var(--faint); text-align: center; } .lib-card.drop .drop-hint { color: var(--accent); } .mini-swatches { display: inline-flex; gap: 2px; align-items: center; } .mini-swatches i { width: 0.6rem; height: 0.6rem; border-radius: 99px; box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.25); } .ablauf-preview { margin: 0.4rem 0 0.2rem; } .sweep-preview-wrap { margin: 0.35rem 0 0.7rem; padding: 0.55rem; border: 1px solid var(--line); border-radius: 12px; background: var(--card-2); } .sweep-canvas { display: block; width: 100%; max-width: 22rem; height: 12rem; margin: 0 auto; border-radius: 8px; background: #0c0c10; } .sweep-preview-wrap .tiny { text-align: center; margin: 0.35rem 0 0; } .send-panel .ablauf-steps { gap: 0.4rem; margin: 0.6rem 0; } .send-panel .ablauf-step { padding: 0; } .send-panel .ablauf-step > summary { list-style: none; cursor: pointer; padding: 0.5rem 0.6rem; margin: 0; justify-content: flex-start; } .send-panel .ablauf-step > summary::-webkit-details-marker { display: none; } .send-panel .ablauf-step .num-dot { width: 1.3rem; height: 1.3rem; border-radius: 99px; display: grid; place-items: center; background: rgba(255, 255, 255, 0.07); font-size: 0.68rem; color: var(--muted); flex: none; } .send-panel .ablauf-step strong { font-size: var(--t-sm); } .ablauf-step-sum { flex: 1; min-width: 0; font-size: var(--t-xs); color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .send-panel .ablauf-step-body { padding: 0 0.6rem 0.65rem; } .ablauf-field.wide { grid-column: 1 / -1; } .ablauf-add { margin-top: 0.2rem; } .repeat-row { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; margin-top: 0.8rem; } .repeat-row label { margin: 0; } .stepper { display: inline-flex; align-items: stretch; border: 1px solid var(--line-strong); border-radius: 10px; overflow: hidden; } .stepper button { border: 0; border-radius: 0; padding: 0.35rem 0.75rem; font-size: 1rem; } .stepper input { width: 3.5rem; margin: 0; border: 0; border-radius: 0; text-align: center; background: transparent; -moz-appearance: textfield; } .stepper input::-webkit-inner-spin-button { -webkit-appearance: none; } .test-row { display: flex; flex-wrap: wrap; gap: 0.4rem 0.9rem; align-items: center; justify-content: center; margin-top: 0.3rem; } .test-row .check { margin: 0; font-size: var(--t-sm); } .test-row button { display: inline-flex; align-items: center; gap: 0.35rem; } /* ---------- Aktivität ---------- */ .filter-bar { display: flex; flex-wrap: wrap; gap: 0.45rem; align-items: center; margin-bottom: 1rem; position: sticky; top: var(--topbar-h); z-index: 5; background: linear-gradient(180deg, var(--bg) 70%, transparent); padding-top: 0.15rem; padding-bottom: 0.45rem; } .filter-group { display: flex; flex-wrap: wrap; gap: 0.3rem; align-items: center; } .filter-group + .filter-group { padding-left: 0.6rem; border-left: 1px solid var(--line); } .fchip { background: transparent; color: var(--muted); border: 1px solid var(--line-strong); border-radius: 99px; padding: 0.28rem 0.7rem; font-size: var(--t-xs); font-weight: 650; display: inline-flex; align-items: center; gap: 0.35rem; } .fchip:hover { color: var(--ink); filter: none; } .fchip.on { background: var(--accent-soft); color: #ffd7b5; border-color: rgba(249, 115, 22, 0.55); } .fchip i { width: 0.45rem; height: 0.45rem; border-radius: 99px; background: currentColor; } .timeline { display: grid; gap: 1.25rem; } .tl-day h3 { position: sticky; top: var(--topbar-h); z-index: 2; margin: 0 0 0.5rem; padding: 0.4rem 0; font-size: var(--t-xs); text-transform: uppercase; letter-spacing: 0.08em; color: var(--faint); background: linear-gradient(var(--bg) 70%, transparent); } .tl-list { list-style: none; margin: 0; padding: 0; position: relative; } .tl-list::before { content: ""; position: absolute; left: 4.35rem; top: 0.4rem; bottom: 0.4rem; width: 1px; background: var(--line-strong); } .tl-item { display: grid; grid-template-columns: 3.6rem 1.5rem minmax(0, 1fr); gap: 0 0.25rem; align-items: start; padding: 0.4rem 0; } .tl-time { font-size: var(--t-xs); color: var(--faint); font-variant-numeric: tabular-nums; text-align: right; padding-top: 0.15rem; } .tl-dot { --c: var(--st-idle); width: 0.65rem; height: 0.65rem; border-radius: 99px; background: var(--c); margin: 0.3rem auto 0; box-shadow: 0 0 0 3px var(--bg); position: relative; z-index: 1; } .tl-dot.fertig { --c: var(--st-done); } .tl-dot.fehler { --c: var(--st-error); } .tl-dot.offline { --c: var(--st-offline); } .tl-dot.queue { --c: var(--st-waiting); } .tl-dot.ablauf { --c: var(--st-printing); } .tl-dot.spule { --c: var(--st-heating); } .tl-dot.start { --c: #38bdf8; } .tl-dot.abbruch { --c: #f43f5e; } .tl-head a { color: inherit; text-decoration: none; } .tl-head a:hover b { text-decoration: underline; } .tl-file .ico-sm { width: 0.85rem; height: 0.85rem; vertical-align: -0.12rem; } .fchip .tl-dot { width: 0.5rem; height: 0.5rem; margin: 0; box-shadow: none; } .tl-body { padding: 0.45rem 0.65rem; border-radius: 10px; background: var(--card); border: 1px solid var(--line); min-width: 0; } .tl-item.unread .tl-body { border-color: rgba(249, 115, 22, 0.35); } .tl-head { display: flex; flex-wrap: wrap; gap: 0.2rem 0.5rem; align-items: center; font-size: var(--t-sm); } .tl-head b { font-weight: 700; } .tl-kind { font-size: 0.62rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--faint); font-weight: 700; } .tl-msg { color: var(--muted); font-size: var(--t-sm); margin-top: 0.15rem; overflow-wrap: anywhere; } .tl-file { color: var(--faint); font-size: var(--t-xs); margin-top: 0.15rem; overflow-wrap: anywhere; } /* ---------- Doku ---------- */ .doc-layout { display: grid; grid-template-columns: 13rem minmax(0, 1fr); gap: 1.5rem; align-items: start; } .doc-toc { position: sticky; top: calc(var(--topbar-h) + 1rem); display: grid; gap: 0.1rem; font-size: var(--t-sm); } .doc-toc p { margin: 0.9rem 0 0.3rem; font-size: var(--t-xs); text-transform: uppercase; letter-spacing: 0.08em; color: var(--faint); font-weight: 650; } .doc-toc p:first-child { margin-top: 0; } .doc-toc a { color: var(--muted); text-decoration: none; padding: 0.28rem 0.55rem; border-radius: 8px; border-left: 2px solid transparent; } .doc-toc a:hover { color: var(--ink); background: rgba(255, 255, 255, 0.04); } .doc-toc a.on { color: var(--accent); border-left-color: var(--accent); background: var(--accent-soft); border-radius: 0 8px 8px 0; } .prose { max-width: 70ch; line-height: 1.65; } .prose h1 { margin-bottom: 0.4rem; } .prose h2 { margin: 2rem 0 0.6rem; font-size: var(--t-lg); scroll-margin-top: 1rem; } .prose h3 { margin: 1.4rem 0 0.4rem; font-size: var(--t-md); } .prose p, .prose li { color: #c9c9d1; } .prose ul, .prose ol { padding-left: 1.2rem; } .prose li + li { margin-top: 0.25rem; } .prose code { font-size: 0.85em; padding: 0.08rem 0.35rem; border-radius: 5px; background: rgba(255, 255, 255, 0.07); color: #fdba74; } .prose pre { background: var(--card-2); border: 1px solid var(--line); border-radius: 10px; padding: 0.8rem 0.95rem; overflow-x: auto; } .prose pre code { background: none; padding: 0; color: var(--ink); } .prose table { margin: 0.8rem 0; font-size: var(--t-sm); } .prose blockquote { margin: 0.8rem 0; padding: 0.4rem 0.9rem; border-left: 3px solid var(--accent); background: var(--accent-soft); border-radius: 0 10px 10px 0; } .prose .lede { font-size: 1.05rem; color: var(--ink); } .prose img { display: block; max-width: 100%; height: auto; margin: 1rem 0; border: 1px solid var(--line); border-radius: 10px; background: var(--card-2); } .prose .doc-chapters { columns: 2; column-gap: 1.5rem; } .prose .doc-chapters li { break-inside: avoid; } .flow-diagram { display: flex; flex-wrap: wrap; gap: 0.35rem; align-items: center; margin: 0.8rem 0 1rem; } .flow-diagram .step { font-size: var(--t-xs); padding: 0.3rem 0.65rem; } .terms { display: grid; grid-template-columns: max-content 1fr; gap: 0.45rem 1rem; margin: 0.6rem 0; } .terms dt { font-weight: 700; color: var(--ink); } .terms dd { margin: 0; color: #c9c9d1; } .mobile-nav { display: none; } @media (max-width: 1080px) { .send-layout { grid-template-columns: 1fr; } .send-panel { position: static; } .doc-layout { grid-template-columns: 1fr; } .doc-toc { position: static; display: flex; flex-wrap: wrap; gap: 0.3rem; padding-bottom: 0.9rem; border-bottom: 1px solid var(--line); } .doc-toc p { display: none; } .doc-toc a { border: 1px solid var(--line-strong); border-radius: 99px; padding: 0.22rem 0.65rem; font-size: var(--t-xs); } .doc-toc a.on { border-radius: 99px; border-color: rgba(249, 115, 22, 0.55); } } @media (max-width: 960px) { .desk-stage { grid-template-columns: 1fr; } .desk:not(.no-cam) .desk-cam { aspect-ratio: 16 / 10; max-height: 22rem; } .desk-tools { grid-template-columns: 1fr; } .desk-canvas { height: 240px !important; } } @media (max-width: 760px) { .app-shell { grid-template-columns: 1fr; padding-bottom: 4.25rem; } html.nav-collapsed, body.nav-collapsed { --sidebar: 13.5rem; } .nav-toggle { display: none; } .sidebar { position: relative; height: auto; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 0.5rem; padding: 0.75rem; } .brand-row { padding-bottom: 0; } .brand { padding: 0 0.35rem; } .nav-main { display: none; } .topbar { display: none; } .m-only { display: inline-grid !important; } html.shelf .mobile-nav, body.shelf .mobile-nav { grid-template-columns: repeat(5, 1fr); } .desk-bar, .lib-tools, .filter-bar, .tl-day h3 { top: 0; } .mat-form { top: 0.75rem; } .send-panel, .doc-toc { top: 1rem; } .sidebar { border-right: 0; border-bottom: 1px solid var(--line); } .live-bar { display: none; } .split, .grid-2 { grid-template-columns: 1fr; } .fleet { grid-template-columns: 1fr; } main { padding: 1rem 0.85rem 2rem; } .hero-main { font-size: 1.4rem; } .tl-list::before { left: 3.85rem; } .tl-item { grid-template-columns: 3.1rem 1.5rem minmax(0, 1fr); } .targets { grid-template-columns: 1fr 1fr; } body.desk-on main { padding: 0.85rem 0.85rem 5rem; } .desk-bar { margin: 0; } .desk-title h2 { font-size: 1.1rem; } .desk-mainsail { margin-left: 0; } .desk:not(.no-cam) .desk-cam { max-height: 18rem; } .mobile-nav { display: grid; grid-template-columns: repeat(5, 1fr); position: fixed; left: 0; right: 0; bottom: 0; z-index: 40; background: #08080aee; backdrop-filter: blur(10px); border-top: 1px solid var(--line); padding: 0.3rem 0.5rem calc(0.3rem + env(safe-area-inset-bottom, 0px)); } .mobile-nav a { display: flex; flex-direction: column; align-items: center; gap: 0.15rem; text-decoration: none; color: var(--muted); font-size: 0.68rem; font-weight: 650; padding: 0.4rem 0.25rem; border-radius: 10px; } .mobile-nav a .ico { width: 1.2rem; height: 1.2rem; opacity: 0.75; } .mobile-nav a.on { color: var(--accent); background: var(--accent-soft); } .mobile-nav a.on .ico { opacity: 1; } .nav-main a.on { box-shadow: none; border-radius: 9px; padding-left: 0.55rem; } } /* Druckbericht & Statistik */ .bericht { display: grid; gap: 0.85rem; } .bericht-head { display: grid; gap: 0.85rem; } @media (min-width: 720px) { .bericht-head { grid-template-columns: minmax(0, 1fr) auto; align-items: start; } } .bericht-meta p { margin: 0.2rem 0; } .energy-break { display: flex; gap: 0.85rem; align-items: center; padding: 0.65rem 0.75rem; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--card-2); min-width: min(100%, 18rem); } .energy-pie { width: 4.75rem; height: 4.75rem; flex: none; } .energy-break-table { flex: 1; min-width: 0; } .energy-break-table .lib-head { margin-bottom: 0.25rem; } .energy-break-table h3 { margin: 0; font-size: var(--t-md); } .energy-break-table table { font-size: var(--t-sm); } .energy-swatch { display: inline-block; width: 0.55rem; height: 0.55rem; border-radius: 99px; margin-right: 0.4rem; vertical-align: 0.05rem; } .energy-total td { font-weight: 650; border-top: 1px solid var(--line); } .temp-chart { width: 100%; max-width: 40rem; height: auto; background: #0c0c10; border-radius: 10px; border: 1px solid var(--line); } .chart-label { fill: var(--muted); font-size: 11px; } .chart-axis { fill: var(--faint); font-size: 10px; font-weight: 650; letter-spacing: 0.04em; } .chart-legend { display: flex; gap: 0.75rem; flex-wrap: wrap; margin-top: 0.35rem; } .chart-legend .leg::before { content: ""; display: inline-block; width: 0.65rem; height: 0.65rem; border-radius: 50%; margin-right: 0.3rem; vertical-align: -0.05rem; } .chart-legend .nozzle::before { background: #ea580c; } .chart-legend .bed::before { background: #2563eb; } .chart-legend .chamber::before { background: #16a34a; } .chart-legend .ed-n::before { background: #c084fc; } .chart-legend .ed-b::before { background: #22d3ee; } .tag { display: inline-block; font-size: 0.72rem; font-weight: 650; padding: 0.05rem 0.35rem; border-radius: 6px; background: var(--accent-soft); color: var(--accent); } .kpi-row { display: grid; grid-template-columns: repeat(auto-fill, minmax(8.5rem, 1fr)); gap: 0.65rem; margin-bottom: 0.85rem; } .kpi { background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 0.7rem 0.8rem; } .kpi-val { font-size: 1.25rem; font-weight: 750; letter-spacing: -0.02em; } .kpi-label { color: var(--muted); font-size: 0.78rem; font-weight: 650; } .spool-akte { margin-top: 1rem; padding-top: 0.85rem; border-top: 1px solid var(--line); } .spool-akte h3 { margin: 0 0 0.55rem; font-size: 0.95rem; } .akte-kpis { margin-bottom: 0.65rem; grid-template-columns: repeat(auto-fill, minmax(5.5rem, 1fr)); gap: 0.45rem; } .akte-kpis .kpi { padding: 0.45rem 0.55rem; border-radius: 10px; } .akte-kpis .kpi-val { font-size: 0.98rem; } .akte-runs { display: flex; flex-direction: column; gap: 0; } .akte-run { display: grid; grid-template-columns: 5.6rem minmax(5.5rem, auto) minmax(0, 1fr) auto auto; gap: 0.35rem 0.55rem; align-items: center; padding: 0.38rem 0; border-bottom: 1px solid var(--line); font-size: 0.86rem; } .akte-run:last-child { border-bottom: 0; } .akte-when { color: var(--muted); white-space: nowrap; } .akte-charge { font-size: 0.72rem; text-decoration: none; } .akte-file { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .akte-g { font-variant-numeric: tabular-nums; white-space: nowrap; font-weight: 650; } .akte-state { color: var(--muted); white-space: nowrap; text-align: right; } @media (max-width: 520px) { .akte-run { grid-template-columns: 1fr auto; grid-template-areas: "when g" "charge state" "file file"; } .akte-when { grid-area: when; } .akte-charge { grid-area: charge; } .akte-file { grid-area: file; } .akte-g { grid-area: g; } .akte-state { grid-area: state; } } ul.plain { list-style: none; margin: 0; padding: 0; } ul.plain li { padding: 0.2rem 0; border-bottom: 1px solid var(--line); } ul.plain li:last-child { border-bottom: 0; } .grid-2 { display: grid; gap: 0.85rem; } @media (min-width: 800px) { .grid-2 { grid-template-columns: 1fr 1fr; } } /* Abräumen-Dialog + Mobile „Mehr“ */ .abraeumen-dlg, .mobile-more-sheet { border: 1px solid var(--line-strong); border-radius: var(--radius); padding: 1rem 1.1rem; background: var(--card); color: var(--ink); max-width: min(22rem, calc(100vw - 2rem)); box-shadow: var(--shadow); } .abraeumen-dlg::backdrop, .mobile-more-sheet::backdrop { background: rgba(0, 0, 0, 0.55); } .abraeumen-form h2 { margin: 0 0 0.35rem; font-size: var(--t-lg); } .abraeumen-form .actions { margin-top: 0.85rem; display: flex; gap: 0.5rem; flex-wrap: wrap; } .mobile-more-sheet nav { display: grid; gap: 0.35rem; margin-bottom: 0.75rem; } .mobile-more-sheet a { display: block; padding: 0.65rem 0.75rem; border-radius: var(--radius-sm); color: var(--ink); text-decoration: none; background: var(--card-2); border: 1px solid var(--line); } .mobile-more-user { display: flex; align-items: center; gap: 0.55rem; margin: 0 0 0.75rem; padding: 0.65rem 0.75rem; border-radius: var(--radius-sm); background: var(--card-2); border: 1px solid var(--line); } .mobile-more-user .grow { display: grid; gap: 0.1rem; min-width: 0; } .mobile-more-user strong { font-size: 0.9rem; } .mobile-nav .mobile-more-btn { appearance: none; background: transparent; border: 0; color: inherit; font: inherit; display: flex; flex-direction: column; align-items: center; gap: 0.15rem; padding: 0.35rem 0.5rem; cursor: pointer; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } @media (pointer: coarse) { .icon-btn, .tiny-btn, .fchip, button, .mobile-nav a, .mobile-nav button { min-height: 2.75rem; min-width: 2.75rem; } } html[data-theme="light"] a:hover { color: #c2410c; } .narrow-fields { max-width: 36rem; } .printer-edit-list { display: grid; gap: 0.85rem; } .printer-edit { border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 0.85rem 1rem; background: var(--card-2); } .printer-edit .actions { margin-top: 0.65rem; gap: 0.5rem; } .bedarf-card { margin-bottom: 1rem; } .bedarf-card tr.warn td { color: var(--warn); } .wartung-card .lib-head { align-items: center; } .bar-chart { display: grid; gap: 0.45rem; margin-top: 0.35rem; } .bar-row { display: grid; grid-template-columns: minmax(5rem, 8rem) 1fr auto; gap: 0.55rem; align-items: center; } .bar-label { font-size: var(--t-sm); color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .bar-track { height: 0.55rem; border-radius: 99px; background: var(--track); overflow: hidden; } .bar-fill { display: block; height: 100%; border-radius: inherit; background: linear-gradient(90deg, var(--accent), color-mix(in srgb, var(--accent) 60%, #fbbf24)); } .bar-val { font-size: var(--t-xs); font-variant-numeric: tabular-nums; color: var(--faint); min-width: 3.5rem; text-align: right; } /* —— Design-Polish: Komponenten —— */ .sidebar { background: var(--surface-0); } .nav-label { display: block; margin: 0.65rem 0.55rem 0.25rem; font-size: 0.62rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--faint); opacity: 0.85; } html.nav-collapsed .nav-label, body.nav-collapsed .nav-label { display: none; } .nav-main a.on { background: var(--accent-soft); box-shadow: none; border-radius: 10px; padding-left: 0.55rem; color: var(--ink); } .nav-main a.on .ico { color: var(--accent); } .brand-tools { display: flex; align-items: center; gap: 0.15rem; flex: none; } .topbar { position: sticky; top: 0; z-index: 30; height: var(--topbar-h); display: flex; align-items: center; gap: 0.75rem; padding: 0 1.35rem; background: var(--surface-0); border-bottom: 1px solid var(--line); } .topbar .cmdk-btn { flex: 0 1 22rem; display: inline-flex; align-items: center; gap: 0.45rem; height: 2.25rem; padding: 0 0.75rem; border-radius: 9px; border: 1px solid var(--line-strong); background: var(--card-2); color: var(--muted); font-size: 0.8rem; font-weight: 600; cursor: pointer; min-width: 0; } .topbar .cmdk-btn:hover { color: var(--ink); border-color: rgba(249, 115, 22, 0.45); } .topbar .cmdk-btn .ico { opacity: 0.7; flex: none; } .topbar .cmdk-btn span { flex: 1; text-align: left; } .topbar .cmdk-btn kbd { font: inherit; font-size: 0.65rem; padding: 0.1rem 0.35rem; border-radius: 5px; background: rgba(255, 255, 255, 0.06); border: 1px solid var(--line); color: var(--faint); margin-left: auto; } .topbar-tools { display: flex; align-items: center; gap: 0.25rem; margin-left: auto; flex: none; } .topbar-tools .icon-btn { width: 2.25rem; height: 2.25rem; min-width: 2.25rem; border-radius: 9px !important; border: 1px solid transparent; color: var(--muted); text-decoration: none; } .topbar-tools .icon-btn:hover { color: var(--ink); background: rgba(255, 255, 255, 0.06); border-color: var(--line); } .topbar-tools .icon-btn.on { color: var(--accent); background: var(--accent-soft); border-color: rgba(249, 115, 22, 0.35); } .topbar-tools .icon-btn .ico { width: 1.1rem; height: 1.1rem; } .side-avatar { width: 1.85rem; height: 1.85rem; border-radius: 99px; display: grid; place-items: center; font-size: 0.72rem; font-weight: 700; background: var(--accent-soft); color: var(--accent); flex: none; list-style: none; cursor: pointer; border: 1px solid transparent; } .side-avatar::-webkit-details-marker { display: none; } .user-menu { position: relative; margin-left: 0.15rem; } .user-menu[open] > .side-avatar { border-color: rgba(249, 115, 22, 0.45); box-shadow: 0 0 0 2px var(--accent-soft); } .user-menu .menu-pop { position: absolute; right: 0; top: calc(100% + 0.4rem); min-width: 13.5rem; padding: 0.55rem; display: grid; gap: 0.35rem; background: var(--card); border: 1px solid var(--line-strong); border-radius: var(--r-md); box-shadow: var(--shadow); z-index: 40; } .user-menu .menu-user { display: grid; gap: 0.1rem; padding: 0.25rem 0.4rem 0.45rem; border-bottom: 1px solid var(--line); margin-bottom: 0.1rem; } .user-menu .menu-user strong { font-size: 0.88rem; } .user-menu .menu-pop > button, .user-menu .menu-pop > a { display: block; width: 100%; text-align: left; padding: 0.45rem 0.55rem; border-radius: 8px; text-decoration: none; color: var(--ink); font-size: 0.85rem; border: 0; background: transparent; cursor: pointer; } .user-menu .menu-pop > button:hover, .user-menu .menu-pop > a:hover { background: rgba(255, 255, 255, 0.06); } .user-menu .menu-copy { display: block; padding: 0.25rem 0.55rem 0.1rem; color: var(--faint); } .user-menu .menu-copy a { color: inherit; text-decoration: none; } .user-menu .menu-copy a:hover { color: var(--accent); } html.shelf .topbar .cmdk-btn, body.shelf .topbar .cmdk-btn { height: 2.6rem; } html.shelf .topbar-tools .icon-btn, body.shelf .topbar-tools .icon-btn { width: 2.6rem; height: 2.6rem; min-width: 2.6rem; } html.shelf .side-avatar, body.shelf .side-avatar { width: 2.2rem; height: 2.2rem; font-size: 0.8rem; } @media (max-width: 760px) { .topbar { display: none; } .m-only { display: inline-grid !important; } .desk-bar, .lib-tools, .filter-bar, .tl-day h3 { top: 0; } .mat-form { top: 0.75rem; } .send-panel, .doc-toc { top: 1rem; } } .queue-title .title-ico, .desk-fold-sum .title-ico { width: 0.95em; height: 0.95em; opacity: 0.7; margin-right: 0.15rem; color: var(--accent); } .toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 0.45rem 0.55rem; margin: 0 0 0.85rem; padding: 0.55rem 0.65rem; background: var(--card); border: 1px solid var(--line); border-radius: var(--r-md); } .toolbar .search-wrap { position: relative; flex: 1 1 12rem; min-width: 10rem; } .toolbar .search-wrap .ico { position: absolute; left: 0.65rem; top: 50%; transform: translateY(-50%); opacity: 0.55; pointer-events: none; } .toolbar .search-wrap input { padding-left: 2.1rem; } .toolbar .fchips { display: flex; flex-wrap: wrap; gap: 0.3rem; } .toolbar .tools-end { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-left: auto; align-items: center; } .toolbar select, .toolbar input[type="search"], .toolbar input:not([type]) { min-height: 2.05rem; } .card-head { display: flex; align-items: center; gap: 0.55rem; margin: 0 0 0.75rem; } .card-head .ico.head-ico { width: 1.15rem; height: 1.15rem; color: var(--accent); opacity: 0.9; } .card-head h2, .card-head h3 { margin: 0; font-size: 1rem; font-weight: 700; letter-spacing: -0.02em; flex: 1; min-width: 0; } .card-head .count-pill { font-size: 0.72rem; font-weight: 650; color: var(--muted); background: var(--st-idle-soft); border-radius: 99px; padding: 0.15rem 0.5rem; } .card-head .tools { display: flex; gap: 0.3rem; margin-left: auto; } .chip .chip-ico { width: 0.85em; height: 0.85em; margin-right: 0.1rem; } .chip.running { --c: var(--st-printing); --cs: var(--st-printing-soft); } .chip.done { --c: var(--st-done); --cs: var(--st-done-soft); } .chip.waiting { --c: var(--st-waiting); --cs: var(--st-waiting-soft); } .chip.dismissed { --c: var(--muted); --cs: var(--st-idle-soft); } .chip.gut { --c: var(--st-printing); --cs: var(--st-printing-soft); } .chip.ausschuss { --c: var(--st-error); --cs: var(--st-error-soft); } .chip.offen { --c: var(--st-heating); --cs: var(--st-heating-soft); } .chip.warn-due { --c: var(--st-heating); --cs: var(--st-heating-soft); } .mono-badge { display: inline-block; font-family: ui-monospace, "Cascadia Code", Consolas, monospace; font-size: 0.72rem; padding: 0.1rem 0.4rem; border-radius: 6px; background: rgba(255, 255, 255, 0.05); color: var(--muted); letter-spacing: 0.01em; } .table-wrap table tbody tr:hover td { background: rgba(255, 255, 255, 0.025); } html[data-theme="light"] .table-wrap table tbody tr:hover td { background: rgba(0, 0, 0, 0.025); } td .cell-file { display: block; max-width: 28rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .proto-table { table-layout: fixed; width: 100%; } .proto-table th:nth-child(1), .proto-table td.proto-printer { width: 7.5rem; } .proto-table th:nth-child(2), .proto-table td.proto-file { width: auto; } .proto-table th:nth-child(3) { width: 6.5rem; } .proto-table th:nth-child(4), .proto-table th:nth-child(5), .proto-table th:nth-child(6) { width: 4.5rem; } .proto-table th:nth-child(7) { width: 6.5rem; } .proto-table th:nth-child(8), .proto-table td.proto-spool { width: 10rem; } .proto-table th:nth-child(9) { width: 5.5rem; } .proto-table td.proto-file .cell-file { max-width: 100%; } .proto-table td.proto-file .mono-badge { margin-top: 0.15rem; opacity: 0.85; } .proto-table td.proto-spool { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .proto-table td.proto-spool select { max-width: 100%; } td.actions-cell { white-space: nowrap; text-align: right; } td.actions-cell .icon-btn { vertical-align: middle; } button.is-busy { position: relative; color: transparent !important; pointer-events: none; } button.is-busy::after { content: ""; position: absolute; width: 1rem; height: 1rem; border: 2px solid rgba(255, 255, 255, 0.25); border-top-color: currentColor; border-radius: 99px; animation: spin 0.7s linear infinite; color: var(--accent-ink); } button.ghost.is-busy::after, button.warn.is-busy::after { color: var(--ink); } @keyframes spin { to { transform: rotate(360deg); } } .skeleton { display: block; height: 0.85rem; border-radius: 6px; background: linear-gradient(90deg, var(--track), rgba(255, 255, 255, 0.06), var(--track)); background-size: 200% 100%; animation: shimmer 1.2s ease-in-out infinite; } @keyframes shimmer { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } @media (prefers-reduced-motion: reduce) { .skeleton, button.is-busy::after, .chip.printing::before, .chip.heating::before { animation: none; } } dialog.sheet, dialog.modal, .abraeumen-dialog, .cmd-palette, .mobile-more-sheet { border: 1px solid var(--line-strong); border-radius: var(--r-lg); background: var(--card); color: var(--ink); box-shadow: var(--shadow); padding: 0; max-width: min(32rem, calc(100vw - 2rem)); } dialog::backdrop { background: rgba(0, 0, 0, 0.55); backdrop-filter: blur(4px); } .dialog-head { display: flex; align-items: center; gap: 0.55rem; padding: 0.95rem 1.1rem 0.55rem; } .dialog-head h2 { margin: 0; font-size: 1.05rem; flex: 1; } .dialog-body { padding: 0.35rem 1.1rem 1rem; } .dialog-foot { display: flex; justify-content: flex-end; gap: 0.45rem; padding: 0.75rem 1.1rem 1rem; border-top: 1px solid var(--line); } .kpi-row { display: grid; grid-template-columns: repeat(auto-fill, minmax(9.5rem, 1fr)); gap: 0.65rem; margin-bottom: 1rem; } .kpi { background: var(--card); border: 1px solid var(--line); border-radius: var(--r-md); padding: 0.75rem 0.85rem; display: grid; gap: 0.2rem; } .kpi .kpi-label { display: flex; align-items: center; gap: 0.35rem; font-size: 0.68rem; font-weight: 650; letter-spacing: 0.04em; text-transform: uppercase; color: var(--faint); } .kpi .kpi-label .ico { width: 0.9em; height: 0.9em; color: var(--accent); } .kpi .kpi-value { font-size: 1.25rem; font-weight: 720; letter-spacing: -0.03em; font-variant-numeric: tabular-nums; } .kpi .kpi-sub { font-size: 0.75rem; color: var(--muted); } .rest-bar { height: 0.35rem; border-radius: 99px; background: var(--track); overflow: hidden; margin-top: 0.25rem; } .rest-bar > i { display: block; height: 100%; background: var(--accent); border-radius: inherit; } .rest-bar.low > i { background: var(--st-error); } .rest-bar.mid > i { background: var(--st-heating); } .send-layout, .split, main > .card { max-width: 72rem; } .app-main main { max-width: 76rem; } .settings-save-hint { min-height: 1.2rem; font-size: var(--t-sm); color: var(--st-printing); font-weight: 600; } .section-saved { font-size: 0.72rem; color: var(--st-printing); font-weight: 650; margin-left: 0.4rem; } .meta-icons { display: flex; flex-wrap: wrap; gap: 0.45rem 0.75rem; font-size: var(--t-xs); color: var(--muted); } .meta-icons span { display: inline-flex; align-items: center; gap: 0.25rem; } .meta-icons .ico { width: 0.85em; height: 0.85em; opacity: 0.7; } .step-num { display: inline-grid; place-items: center; width: 1.35rem; height: 1.35rem; border-radius: 99px; background: var(--accent-soft); color: var(--accent); font-size: 0.72rem; font-weight: 700; margin-right: 0.35rem; } @media print { .sidebar, .mobile-nav, .conn-banner, .toast-host, .nav-toggle { display: none !important; } .app-shell { display: block; } .app-main { margin: 0; } body { background: #fff; color: #111; } .card, article { box-shadow: none; border-color: #ccc; } }