vibe-nothing-ui-design/css/nothing-ui.css

497 lines
38 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@import url('tokens.css');
/* nothing-ui · components */
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{background-color:var(--bg);color:var(--primary);font-family:var(--f-mono);font-size:11px;line-height:1.45;
font-variation-settings:'ROND' 100;-webkit-font-smoothing:antialiased;transition:background-color .35s var(--ease),color .35s var(--ease)}
/* Sparse dot grid as a LOCAL-INVERSE overlay: a fixed white-dot field with mix-blend-mode:difference,
so each dot takes the contrast of the surface BEHIND it — on light surfaces it reads as soft grey,
on dark surfaces it reads as light (and vice-versa) — automatically, in BOTH themes, no per-theme color.
z-index:-1 keeps it BEHIND all cards (cards are always the top layer and cover the dots). Thin (~1.3px), sparse (120px). */
body::before{content:"";position:fixed;inset:0;z-index:-1;pointer-events:none;
background-image:radial-gradient(rgba(255,255,255,.42) 1.3px, transparent 1.7px);
background-size:120px 120px;background-attachment:fixed;mix-blend-mode:difference}
::selection{background:var(--accent);color:var(--accent-ink)}
.label{font-family:var(--f-mono);font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:var(--secondary)}
.fdisplay{font-family:var(--f-display);color:var(--display)} .fui{font-family:var(--f-ui)} .mono{font-family:var(--f-mono)}
.editorial{font-family:var(--f-editorial);font-style:italic}
.muted{color:var(--secondary)} .faint{color:var(--muted)}
.ico{width:22px;height:22px;stroke:currentColor;fill:none;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;display:block}
.ico.sm{width:16px;height:16px}
/* dot-matrix icons: real 9×9 grid, every cell a COMPLETE round dot (no mask — mask clips dots into partial circles).
SCALABLE: size driven by --gs (default 30px); gap scales proportionally. Resize with e.g. style="--gs:48px" or set --gs on a parent. */
.gico{display:inline-grid;grid-template-columns:repeat(9,1fr);grid-auto-rows:1fr;gap:calc(var(--gs,30px)/20);width:var(--gs,30px);height:var(--gs,30px)}
.gico i{aspect-ratio:1}
.gico i.on{border-radius:50%;background:currentColor}
/* theme toggle */
.fab{position:fixed;top:18px;right:18px;z-index:80;display:flex;border:1px solid var(--line-2);border-radius:var(--r-pill);overflow:hidden;background:var(--surface)}
.fab button{font-family:var(--f-mono);font-size:9px;letter-spacing:.1em;padding:6px 11px;background:transparent;color:var(--secondary);border:0;cursor:pointer}
.fab button[aria-pressed="true"]{background:var(--display);color:var(--bg)}
/* poster grid — hairline-connected modules */
.poster{display:grid;grid-template-columns:repeat(12,1fr);grid-auto-flow:row dense;gap:12px}
.mod{background:var(--glass);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-radius:var(--r-md);padding:22px;min-width:0}
.s2{grid-column:span 2}.s3{grid-column:span 3}.s4{grid-column:span 4}.s5{grid-column:span 5}
.s6{grid-column:span 6}.s7{grid-column:span 7}.s8{grid-column:span 8}.s9{grid-column:span 9}.s12{grid-column:span 12}
@media(max-width:1100px){.s2,.s3,.s4,.s5{grid-column:span 6}.s7,.s8,.s9{grid-column:span 12}}
@media(max-width:680px){.mod{grid-column:span 12!important}}
.mhead{display:flex;align-items:baseline;gap:8px;margin-bottom:20px}
.mhead .no{font-family:var(--f-display);font-weight:500;font-size:11px;color:var(--secondary);letter-spacing:.05em}
.mhead .t{font-family:var(--f-mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--primary)}
.mhead .ex{margin-left:auto;font-size:9px;color:var(--muted)}
h4.sub{font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin:18px 0 12px}
h4.sub:first-of-type{margin-top:0}
.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.col{display:flex;flex-direction:column;gap:10px}
/* masthead module */
.brand .wm{font-family:var(--f-display);font-weight:500;font-size:clamp(34px,5vw,52px);color:var(--display);line-height:.9;letter-spacing:.04em}
.brand .ds{font-family:var(--f-head);font-weight:600;font-size:27px;margin-top:8px;letter-spacing:0;line-height:1}
.brand .v{color:var(--secondary);font-family:var(--f-display);font-weight:500;font-size:13px;margin-top:4px}
.brand p{color:var(--secondary);font-size:11px;line-height:1.7;margin-top:18px;max-width:34ch}
/* 01 color */
.swatches{display:flex;gap:14px;flex-wrap:wrap}
.sw{text-align:center}
.sw .c{width:54px;height:54px;border-radius:999px;border:1px solid var(--line-2);margin:0 auto 8px}
.sw .n{font-size:10px;color:var(--primary)}.sw .h{font-size:9px;color:var(--muted);font-family:var(--f-mono)}
.accent-sw{display:flex;align-items:center;gap:16px}
.accent-sw .c{width:64px;height:64px;border-radius:999px}
.bg-cols{display:flex;gap:28px;align-items:stretch}
@media(max-width:760px){.bg-cols{flex-direction:column}}
.bg-principles{flex:1;display:flex;flex-direction:column;justify-content:center}
.bg-lead{font-family:var(--f-ui);font-size:14px;line-height:1.6;color:var(--primary);max-width:46ch}
.bg-lead strong{color:var(--display)}
.bg-rules{list-style:none;margin-top:18px}
.bg-rules li{position:relative;padding:9px 0 9px 16px;border-bottom:1px solid var(--glass-brd);color:var(--secondary);font-size:12px;line-height:1.6}
.bg-rules li:last-child{border:0}
.bg-rules li::before{content:"·";position:absolute;left:2px;color:var(--primary)}
.bg-rules strong{color:var(--primary);font-weight:400;border-bottom:1px solid currentColor;padding-bottom:1px}
/* schematic that DEMONSTRATES local-inverse: ONE dot field crosses a dark + a light surface,
appearing light over the dark half and dark over the light half (mix-blend-mode:difference).
A card floats on top and covers the dots beneath it. */
.layer-demo{flex:1.05;position:relative;min-height:300px;border-radius:10px;overflow:hidden;isolation:isolate;display:flex}
.layer-demo .lyl{font-family:var(--f-mono);font-size:9px;letter-spacing:.08em;text-transform:uppercase}
.layer-demo .surf{flex:1;display:flex;align-items:flex-end;padding:12px;box-sizing:border-box}
.layer-demo .surf.dark{background:#0B0B0B;color:#7a7a7a}
.layer-demo .surf.light{background:#ECECEC;color:#8a8a8a}
.layer-demo .dotfield{position:absolute;inset:0;z-index:1;pointer-events:none;
background-image:radial-gradient(rgba(255,255,255,.55) 1.7px,transparent 2.1px);background-size:18px 18px;mix-blend-mode:difference}
.layer-demo .democard{position:absolute;z-index:2;right:22px;top:42px;width:46%;height:156px;border-radius:8px;
background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--glass-brd);
color:var(--primary);display:flex;align-items:flex-end;padding:12px;box-sizing:border-box}
/* 02 type */
.specimen{font-family:var(--f-display);color:var(--display);font-size:42px;line-height:1}
.glyphset{font-family:var(--f-display);color:var(--secondary);font-size:13px;line-height:1.9;letter-spacing:.12em;word-break:break-all;margin-top:10px}
.weights{display:flex;gap:18px;margin-top:14px;color:var(--secondary);font-family:var(--f-ui);font-size:13px}
.weights b{color:var(--primary)}
.editorial-specimen{font-family:var(--f-editorial);font-style:italic;font-weight:400;font-size:30px;line-height:1.05;
color:var(--display);letter-spacing:-.025em;max-width:13ch}
.editorial-note{font-family:var(--f-mono);font-size:8px;line-height:1.5;letter-spacing:.08em;text-transform:uppercase;
color:var(--muted);margin-top:8px;max-width:32ch}
/* 03 icons */
.icogrid{display:grid;grid-template-columns:repeat(8,1fr);gap:14px;color:var(--primary)}
.icogrid.lib{grid-template-columns:repeat(12,1fr);gap:16px}
.icogrid .i{display:grid;place-items:center;color:var(--primary);transition:color .2s var(--ease)}
.icogrid .i:hover{color:var(--accent-text)}
.dotglyphs{font-family:var(--f-display);color:var(--primary);font-size:30px;letter-spacing:.32em;margin-top:6px}
.punct-spec{display:flex;gap:30px;align-items:center;margin-top:10px}
.punct-spec .ps{display:flex;align-items:center;gap:10px}
.punct-spec .pl{font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
/* Glyph Matrix · authentic 25×25 circular-masked panel (white LEDs on black, like Phone (3)) */
.gmx-wrap{display:flex;gap:22px;flex-wrap:wrap;align-items:flex-start}
.gmx-cell{display:flex;flex-direction:column;align-items:center;gap:9px}
.gmx{display:grid;grid-template-columns:repeat(25,1fr);gap:1.4px;width:clamp(150px,17vw,182px);aspect-ratio:1;padding:6.5%;border-radius:50%;background:#070707;border:1px solid #232323;box-sizing:border-box}
.gmx i{aspect-ratio:1;border-radius:50%}
.gmx i.void{background:transparent}
.gmx i.off{background:rgba(255,255,255,.06)}
.gmx i.on{background:#fff}
.gmx i.sig{background:var(--accent)}
.gmx-cell .label{font-size:8px}
/* 04 spacing */
.spaceruler{display:flex;align-items:flex-end;gap:3px;height:48px}
.spaceruler i{background:var(--secondary);width:7px}
.ruler-cap{display:flex;gap:3px;margin-top:6px;color:var(--muted);font-size:8px}
.ruler-cap span{width:7px;text-align:center}
.nest{position:relative;width:180px;height:120px;border:1px dashed var(--line-2);margin:24px auto 0;display:grid;place-items:center}
.nest .inner{width:90px;height:60px;border:1px dashed var(--line-2);display:grid;place-items:center}
.nest .core{width:40px;height:40px;border-radius:8px;background:var(--raised);display:grid;place-items:center;color:var(--secondary)}
.nest .m{position:absolute;font-size:8px;color:var(--muted)}
/* buttons */
.btn{font-family:var(--f-mono);font-size:11px;letter-spacing:.04em;padding:9px 16px;border-radius:var(--r-sm);cursor:pointer;background:transparent;display:inline-flex;align-items:center;gap:8px;transition:opacity var(--dur,.2s) var(--ease);border:0}
.btn:hover{opacity:.8}.btn:disabled{opacity:.3}
.btn-primary{background:var(--display);color:var(--bg)}
.btn-outline{border:1px solid var(--line-2);color:var(--primary)}
.btn-text{color:var(--primary);padding:9px 4px}
.btn-icon{width:38px;height:38px;border-radius:999px;border:1px solid var(--line-2);color:var(--primary);display:grid;place-items:center;padding:0;cursor:pointer;background:transparent}
.btn-icon:hover{border-color:var(--primary);color:var(--primary)}
.btn-sq{width:34px;height:34px;padding:0;justify-content:center;border-radius:var(--r-sm)}
.bstates .btn-primary.hv{opacity:.8}.bstates .btn-primary.pr{opacity:.6}
/* inputs */
.inp{width:100%;background:transparent;border:1px solid var(--line-2);border-radius:var(--r-sm);padding:9px 12px;color:var(--primary);font-family:var(--f-mono);font-size:11px}
.inp::placeholder{color:var(--muted)}
.inp:focus{outline:0;border-color:var(--primary)}
.inp.focused{border-color:var(--primary)}
.inp.dis{opacity:.4}
.field{margin-bottom:12px}.field .label{display:block;margin-bottom:6px}
.withicon{position:relative}.withicon .ico{position:absolute;left:10px;top:9px;color:var(--muted)}.withicon .inp{padding-left:34px}
.cbx{display:flex;align-items:center;gap:9px;margin-bottom:8px;color:var(--secondary)}
.box{width:18px;height:18px;border:1px solid var(--line-2);border-radius:4px;display:grid;place-items:center;color:var(--bg)}
.box.on{background:var(--display);border-color:var(--display)}
.rdo{width:18px;height:18px;border:1px solid var(--line-2);border-radius:999px;display:grid;place-items:center}
.rdo.on::after{content:"";width:9px;height:9px;border-radius:999px;background:var(--display)}
/* chips & tags */
.chip{display:inline-flex;align-items:center;gap:6px;font-family:var(--f-mono);font-size:10px;border:1px solid var(--line-2);padding:5px 11px;border-radius:var(--r-pill);color:var(--secondary);cursor:pointer}
.chip.on{background:var(--display);border-color:var(--display);color:var(--bg)}
.tag{font-family:var(--f-mono);font-size:10px;border:1px solid var(--line-2);padding:4px 10px;border-radius:var(--r-sm);color:var(--secondary)}
.tag.on{border-color:var(--primary);color:var(--primary)}.tag.dis{opacity:.4}
/* sliders */
.slider{appearance:none;width:100%;height:3px;background:var(--line-2);border-radius:999px;outline:0}
.slider::-webkit-slider-thumb{appearance:none;width:16px;height:16px;border-radius:999px;background:var(--display);cursor:pointer}
.track-fill{height:3px;background:var(--line-2);border-radius:999px;position:relative}
.track-fill>i{position:absolute;left:0;top:0;height:100%;background:var(--display);border-radius:999px}
.track-fill>b{position:absolute;top:50%;width:14px;height:14px;border-radius:999px;background:var(--display);transform:translate(-50%,-50%)}
.circ{position:relative;width:72px;height:72px}
.circ .n{position:absolute;inset:0;display:grid;place-items:center;font-family:var(--f-display);font-weight:500;font-size:16px;color:var(--display)}
/* navigation */
.navbar{display:flex;justify-content:space-around;border:1px solid var(--line-2);border-radius:var(--r-pill);padding:8px 6px}
.navbar .i{color:var(--muted);position:relative;padding:4px 10px}.navbar .i.on{color:var(--display)}
.tabs{display:flex;gap:20px;border-bottom:1px solid var(--line);padding-bottom:0}
.tabs span{padding-bottom:9px;color:var(--muted);font-size:11px;border-bottom:2px solid transparent}
.tabs span.on{color:var(--primary);border-color:var(--display)}
.pager{display:flex;gap:6px;align-items:center}
.pager a{width:26px;height:26px;border-radius:6px;display:grid;place-items:center;color:var(--secondary);border:1px solid transparent;font-family:var(--f-display);font-weight:500}
.pager a.on{background:var(--display);color:var(--bg)}
.sheet{border:1px solid var(--line-2);border-radius:var(--r-md);overflow:hidden}
.sheet .r{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1px solid var(--line);color:var(--secondary)}
.sheet .r:last-child{border:0}.sheet .r .ico{color:var(--primary)}.sheet .r .h{margin-left:auto;color:var(--muted)}
/* alerts / toast */
.alert{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:var(--r-sm);border-left:3px solid;margin-bottom:10px;position:relative}
.alert .x{position:absolute;right:12px;top:12px;color:var(--muted);cursor:pointer}
.alert .ttl{font-family:var(--f-ui);font-weight:500;font-size:12px;color:var(--display)}
.alert .ds{font-size:10px;color:var(--secondary);margin-top:2px}
.alert.success{border-color:var(--success);background:color-mix(in srgb,var(--success) 9%,transparent)}.alert.success .ico{color:var(--success)}
.alert.warning{border-color:var(--warning);background:color-mix(in srgb,var(--warning) 9%,transparent)}.alert.warning .ico{color:var(--warning)}
.alert.error{border-color:var(--error);background:color-mix(in srgb,var(--error) 9%,transparent)}.alert.error .ico{color:var(--error)}
/* switches */
.switch{width:44px;height:24px;border-radius:999px;background:var(--line-2);position:relative;cursor:pointer;transition:background var(--dur,.2s) var(--ease);flex-shrink:0}
.switch::after{content:"";position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:999px;background:var(--muted);transition:transform var(--dur,.2s) var(--ease)}
.switch.on{background:var(--display)}.switch.on::after{transform:translateX(20px);background:var(--bg)}
/* avatar & badge */
.ava{width:46px;height:46px;border-radius:999px;background:var(--raised);display:grid;place-items:center;color:var(--muted);overflow:hidden;border:1px solid var(--line-2)}
.ava.ring{border:2px solid var(--display)}
.ava.add{border:1px dashed var(--line-2);color:var(--secondary)}
.bdot{position:relative}.bdot::after{content:"";position:absolute;top:0;right:0;width:11px;height:11px;border-radius:999px;background:var(--accent);border:2px solid var(--bg)}
/* cards */
.card{border-radius:var(--r-md);padding:14px;background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);transition:transform var(--dur,.2s) var(--ease)}
.card:hover{transform:translateY(-2px)}
.card .thumb{height:70px;border-radius:6px;background:var(--raised);margin-bottom:10px}
.card .ttl{font-family:var(--f-head);font-weight:600;font-size:18px;color:var(--display);line-height:1.1}
.card .ds{font-size:10px;color:var(--secondary);margin-top:3px}
.statbig{font-family:var(--f-display);font-weight:500;font-size:30px;color:var(--display)}
/* lists */
.list .li{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--line)}
.list .li:last-child{border:0}.list .li .tx{flex:1}.list .li .h{font-size:12px;color:var(--primary)}.list .li .s{font-size:10px;color:var(--muted)}
/* table */
table{width:100%;border-collapse:collapse}
th{font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);text-align:left;padding:8px;border-bottom:1px solid var(--line-2)}
td{font-family:var(--f-mono);font-size:11px;padding:9px 8px;border-bottom:1px solid var(--line);color:var(--primary)}
.pill{font-size:9px;padding:2px 9px;border-radius:999px;text-transform:uppercase;letter-spacing:.05em}
.pill.a{background:var(--display);color:var(--bg)}.pill.i{border:1px solid var(--line-2);color:var(--muted)}
/* calendar */
.cal .ch{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}
.cal .ch .m{font-family:var(--f-ui);font-size:13px;color:var(--display)}
.cal .grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;text-align:center}
.cal .grid .wd{font-size:8px;color:var(--muted);padding:4px 0}
.cal .grid .d{font-family:var(--f-display);font-weight:500;font-size:12px;padding:6px 0;border-radius:6px;color:var(--secondary)}
.cal .grid .d.today{background:var(--display);color:var(--bg)}
.cal .grid .d.sel{border:1px solid var(--display);color:var(--display)}
/* tooltip */
.tipwrap{display:flex;flex-direction:column;align-items:center;gap:30px;padding:14px 0}
.tip{background:var(--raised);border:1px solid var(--line-2);border-radius:6px;padding:7px 12px;font-size:11px;position:relative;color:var(--primary)}
.tip::after{content:"";position:absolute;bottom:-5px;left:50%;transform:translateX(-50%) rotate(45deg);width:8px;height:8px;background:var(--raised);border-right:1px solid var(--line-2);border-bottom:1px solid var(--line-2)}
.hovme{font-size:11px;color:var(--secondary)}
/* modal */
.modal{border:1px solid var(--line-2);border-radius:var(--r-md);overflow:hidden;background:var(--surface)}
.modal .mh{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;border-bottom:1px solid var(--line)}
.modal .mh .t{font-family:var(--f-head);font-weight:600;font-size:19px;color:var(--display)}
.modal .mb{padding:16px;color:var(--secondary);font-size:11px;line-height:1.6}
.modal .mf{display:flex;justify-content:flex-end;gap:10px;padding:12px 16px;border-top:1px solid var(--line)}
/* progress & stepper */
.lp{height:6px;background:var(--line-2);border-radius:999px;overflow:hidden}.lp>i{display:block;height:100%;background:var(--display);width:60%}
.stepper{display:flex;align-items:center;margin-top:18px}
.stepper .st{width:26px;height:26px;border-radius:999px;border:1px solid var(--line-2);display:grid;place-items:center;font-family:var(--f-display);font-weight:500;font-size:12px;color:var(--muted)}
.stepper .st.on{background:var(--display);color:var(--bg);border-color:var(--display)}
.stepper .ln{flex:1;height:1px;background:var(--line-2)}
/* ========== EXTENDED COMPONENTS (22+) ========== */
/* 22 dropdown / menu */
.menu{border:1px solid var(--line-2);border-radius:var(--r-sm);background:var(--surface);overflow:hidden;width:200px}
.menu .mi{display:flex;align-items:center;gap:10px;padding:9px 12px;color:var(--secondary);cursor:pointer;font-family:var(--f-mono);font-size:11px}
.menu .mi:hover{background:var(--raised);color:var(--primary)}
.menu .mi .k{margin-left:auto;color:var(--muted);font-size:9px}
.menu .mi.danger{color:var(--error)}
.menu .sep{height:1px;background:var(--line);margin:4px 0}
.menu .grp{padding:8px 12px 4px;font-size:8px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
/* 23 accordion */
.acc{border-top:1px solid var(--line)}
.acc .it{border-bottom:1px solid var(--line)}
.acc .hd{display:flex;align-items:center;justify-content:space-between;padding:13px 2px;cursor:pointer;color:var(--primary);font-family:var(--f-ui);font-size:13px}
.acc .hd .sign{font-family:var(--f-display);color:var(--secondary);transition:transform .25s var(--ease)}
.acc .it.open .hd .sign{transform:rotate(45deg);color:var(--display)}
.acc .bd{max-height:0;overflow:hidden;transition:max-height .3s var(--ease);color:var(--secondary);font-size:11px;line-height:1.6}
.acc .it.open .bd{max-height:120px}
.acc .bd p{padding:0 2px 14px}
/* 24 breadcrumb */
.crumb{display:flex;align-items:center;gap:8px;font-family:var(--f-mono);font-size:10px;flex-wrap:wrap}
.crumb a{color:var(--muted);text-decoration:none}.crumb a:hover{color:var(--primary)}
.crumb .sl{color:var(--line-2)}
.crumb .cur{color:var(--primary)}
/* 25 avatar group */
.avg{display:flex}
.avg .ava{width:36px;height:36px;margin-left:-10px;box-shadow:0 0 0 2px var(--bg)}
.avg .ava:first-child{margin-left:0}
.avg .ava.more{background:var(--display);color:var(--bg);font-family:var(--f-display);font-size:11px;border:0}
/* 26 skeleton */
.skel{background:linear-gradient(90deg,var(--line) 25%,var(--line-2) 50%,var(--line) 75%);background-size:200% 100%;animation:shimmer 1.4s linear infinite;border-radius:var(--r-sm)}
@keyframes shimmer{to{background-position:-200% 0}}
.skel.ln{height:10px;margin-bottom:8px}.skel.ln.w60{width:60%}.skel.ln.w40{width:40%}
.skel.circ{width:46px;height:46px;border-radius:999px}
/* 27 command palette */
.cmd{border:1px solid var(--line-2);border-radius:var(--r-md);background:var(--surface);overflow:hidden}
.cmd .top{display:flex;align-items:center;gap:10px;padding:13px 14px;border-bottom:1px solid var(--line)}
.cmd .top input{flex:1;background:transparent;border:0;outline:0;color:var(--primary);font-family:var(--f-mono);font-size:12px}
.cmd .top .esc{font-size:8px;color:var(--muted);border:1px solid var(--line-2);border-radius:4px;padding:2px 6px}
.cmd .grp{padding:9px 14px 4px;font-size:8px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.cmd .ci{display:flex;align-items:center;gap:10px;padding:8px 14px;color:var(--secondary);font-family:var(--f-mono);font-size:11px;cursor:pointer}
.cmd .ci.on,.cmd .ci:hover{background:var(--raised);color:var(--primary)}
.cmd .ci .k{margin-left:auto;color:var(--muted);font-size:9px}
/* 28 kbd + code */
.kbd{font-family:var(--f-mono);font-size:10px;color:var(--primary);background:var(--raised);border:1px solid var(--line-2);border-bottom-width:2px;border-radius:5px;padding:2px 7px;display:inline-block}
.code{font-family:var(--f-mono);font-size:11px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);padding:13px 14px;color:var(--secondary);line-height:1.7;overflow-x:auto}
.code .cm{color:var(--muted)}.code .kw{color:var(--accent-text)}.code .st{color:var(--primary)}
/* 29 toast stack */
.toasts{display:flex;flex-direction:column;gap:8px}
.toast{display:flex;align-items:center;gap:11px;background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r-sm);padding:11px 13px;min-width:240px}
.toast .ico{color:var(--display)}.toast.ok .ico{color:var(--success)}
.toast .tx{font-size:11px;color:var(--primary)}.toast .tx s{display:block;color:var(--muted);font-size:9px;text-decoration:none;margin-top:1px}
.toast .x{margin-left:auto;color:var(--muted);cursor:pointer}
/* 30 segmented control + button group */
.seg{display:inline-flex;border:1px solid var(--line-2);border-radius:var(--r-sm);padding:2px;background:var(--surface)}
.seg button{font-family:var(--f-mono);font-size:10px;padding:6px 14px;border:0;background:transparent;color:var(--secondary);cursor:pointer;border-radius:4px}
.seg button.on{background:var(--display);color:var(--bg)}
.bgroup{display:inline-flex}
.bgroup .btn{border:1px solid var(--line-2);border-radius:0;margin-left:-1px}
.bgroup .btn:first-child{border-radius:var(--r-sm) 0 0 var(--r-sm);margin-left:0}
.bgroup .btn:last-child{border-radius:0 var(--r-sm) var(--r-sm) 0}
.bgroup .btn.on{background:var(--display);color:var(--bg);border-color:var(--display);position:relative;z-index:1}
/* 31 empty state */
.empty{text-align:center;padding:30px 16px;border:1px dashed var(--line-2);border-radius:var(--r-md)}
.empty .gico{margin:0 auto 14px;color:var(--line-2)}
.empty .h{font-family:var(--f-head);font-size:17px;color:var(--primary)}
.empty .s{font-size:10px;color:var(--muted);margin:5px 0 14px}
/* 32 timeline */
.tline{list-style:none;position:relative;padding-left:22px}
.tline::before{content:"";position:absolute;left:4px;top:4px;bottom:4px;width:1px;background:var(--line-2)}
.tline li{position:relative;padding:0 0 18px}.tline li:last-child{padding-bottom:0}
.tline li::before{content:"";position:absolute;left:-22px;top:3px;width:9px;height:9px;border-radius:50%;background:var(--surface);border:1px solid var(--line-2)}
.tline li.on::before{background:var(--accent);border-color:var(--accent)}
.tline .h{font-size:12px;color:var(--primary)}.tline .t{font-family:var(--f-mono);font-size:9px;color:var(--muted)}
/* 33 popover */
.pop{position:relative;background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r-sm);padding:13px;width:220px}
.pop::before{content:"";position:absolute;top:-5px;left:24px;width:8px;height:8px;background:var(--surface);border-left:1px solid var(--line-2);border-top:1px solid var(--line-2);transform:rotate(45deg)}
.pop .h{font-family:var(--f-ui);font-size:12px;color:var(--display);margin-bottom:4px}
.pop .b{font-size:10px;color:var(--secondary);line-height:1.6}
/* 34 rating (round dots) */
.rate{display:inline-flex;gap:7px}
.rate i{width:13px;height:13px;border-radius:50%;border:1px solid var(--line-2);cursor:pointer}
.rate i.on{background:var(--display);border-color:var(--display)}
/* 35 dropzone */
.drop{border:1px dashed var(--line-2);border-radius:var(--r-md);padding:26px;text-align:center;color:var(--muted);transition:border-color .2s var(--ease)}
.drop:hover{border-color:var(--primary);color:var(--secondary)}
.drop .gico{margin:0 auto 10px;color:var(--secondary)}
.drop b{color:var(--primary);font-family:var(--f-ui);font-weight:400}
/* 36 banner */
.banner{display:flex;align-items:center;gap:12px;padding:11px 14px;border-radius:var(--r-sm);background:var(--display);color:var(--bg)}
.banner .tx{font-family:var(--f-mono);font-size:11px;flex:1}
.banner .b2{font-family:var(--f-mono);font-size:10px;border:1px solid var(--bg);border-radius:var(--r-pill);padding:4px 11px;cursor:pointer}
.banner.sig{background:var(--accent);color:var(--accent-ink)}.banner.sig .b2{border-color:var(--accent-ink)}
/* 37 stat / metric */
.metric{border:1px solid var(--line);border-radius:var(--r-md);padding:15px}
.metric .label{margin-bottom:9px}
.metric .v{font-family:var(--f-display);font-weight:500;font-size:30px;color:var(--display);line-height:1}
.metric .d{font-family:var(--f-mono);font-size:10px;margin-top:7px}
.metric .d.up{color:var(--success)}.metric .d.dn{color:var(--error)}
/* 38 tabs · pill variant */
.tabpills{display:inline-flex;gap:4px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-pill);padding:3px}
.tabpills span{padding:6px 15px;border-radius:var(--r-pill);font-family:var(--f-mono);font-size:10px;color:var(--secondary);cursor:pointer}
.tabpills span.on{background:var(--display);color:var(--bg)}
/* 39 tree view */
.tree{font-family:var(--f-mono);font-size:11px}
.tree .n{display:flex;align-items:center;gap:8px;padding:5px 0;color:var(--secondary)}
.tree .n .ico{color:var(--muted)}
.tree .ch{padding-left:20px;border-left:1px solid var(--line);margin-left:9px}
.tree .n.sel{color:var(--display)}
/* 40 divider w/ label + 41 number stepper */
.divl{display:flex;align-items:center;gap:12px;color:var(--muted);font-size:9px;letter-spacing:.12em;text-transform:uppercase}
.divl::before,.divl::after{content:"";flex:1;height:1px;background:var(--line)}
.nstep{display:inline-flex;align-items:center;border:1px solid var(--line-2);border-radius:var(--r-sm);overflow:hidden}
.nstep button{width:30px;height:30px;border:0;background:transparent;color:var(--secondary);font-family:var(--f-display);font-size:15px;cursor:pointer}
.nstep button:hover{background:var(--raised);color:var(--primary)}
.nstep .v{width:42px;text-align:center;font-family:var(--f-display);font-weight:500;font-size:14px;color:var(--display);border-left:1px solid var(--line);border-right:1px solid var(--line);line-height:30px}
/* applied dashboard */
.app{border-radius:14px;overflow:hidden;background:transparent;margin-top:1px}
.app .titlebar{height:42px;display:flex;align-items:center;gap:7px;padding:0 16px;border-bottom:1px solid var(--line)}
.tl{width:10px;height:10px;border-radius:999px;background:var(--line-2)}
.app .titlebar .nm{margin-left:8px;font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.bento{display:grid;grid-template-columns:1.5fr 1fr 1fr;gap:8px;padding:8px}
@media(max-width:720px){.bento{grid-template-columns:1fr 1fr}}
.tile{background:var(--glass);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-radius:var(--r-md);padding:22px;min-width:0}
.tile.hero-tile{grid-column:1;grid-row:1/span 2;display:flex;flex-direction:column}
.dotrow{display:flex;gap:6px;margin-top:20px}
.dotrow i{width:9px;height:9px;border-radius:50%;background:var(--line-2)}
.dotrow i.run{background:var(--display)} .dotrow i.need{background:var(--accent)}
.hr{height:1px;background:var(--line);margin:18px 0}
.clock{font-family:var(--f-display);font-weight:500;font-size:clamp(56px,9vw,92px);color:var(--display);line-height:.92;margin-top:10px;letter-spacing:.02em;display:flex;align-items:center}
/* dot-matrix PUNCTUATION — built from the same round pixel-dot unit (--pxd) as the glyph grid. Reuse for : . … etc. */
.colon,.pdot,.ellip{display:inline-flex;vertical-align:middle;color:var(--secondary)}
.colon{flex-direction:column;justify-content:center;gap:var(--pxd,6px);margin:0 .22em}
.pdot{margin:0 .04em}.ellip{gap:var(--pxd,6px);margin:0 .1em}
.colon i,.pdot i,.ellip i{width:var(--pxd,6px);height:var(--pxd,6px);border-radius:50%;background:currentColor;flex-shrink:0}
.livedot{width:12px;height:12px;border-radius:50%;background:var(--accent);margin-right:18px;flex-shrink:0;animation:liveblink 1.5s steps(1) infinite}
@keyframes liveblink{0%,100%{opacity:1}50%{opacity:.3}}
.tile .grow{flex:1;min-height:14px}
.tile .big{font-family:var(--f-display);font-weight:500;font-size:40px;color:var(--display);line-height:1}
.tile .big .u{font-family:var(--f-mono);font-size:11px;color:var(--secondary);margin-left:3px}
.foot2{display:flex;justify-content:space-between;align-items:flex-end}
.run .title{font-family:var(--f-display);font-weight:500;font-size:22px;color:var(--display);margin-top:8px}
.trk{height:2px;background:var(--line-2);position:relative;margin-top:14px}.trk::after{content:"";position:absolute;inset:0;width:52%;background:var(--display)}
.spark{display:flex;align-items:flex-end;gap:2px;height:36px}.spark i{width:3px;background:var(--muted)}
.segbar{display:flex;gap:2px;margin-top:10px}.segbar i{flex:1;height:11px;background:var(--line)}.segbar.short i{height:7px}
.seg-head{display:flex;justify-content:space-between;align-items:baseline}.seg-head .v{color:var(--display);font-family:var(--f-display);font-weight:500;font-size:15px}
.gauge{position:relative;width:130px;height:130px;margin:10px auto 0}.gauge .num{position:absolute;inset:0;display:grid;place-items:center;line-height:1;font-family:var(--f-display);font-weight:500;font-size:34px;color:var(--display)}
.gauge .num b{position:relative;font-weight:inherit}
.gauge .num .pct{position:absolute;left:100%;bottom:1px;margin-left:5px;font-size:13px;color:var(--secondary);font-family:var(--f-display)}
.qrow{display:flex;align-items:center;justify-content:space-between;padding:11px 0;border-bottom:1px solid var(--line)}.qrow:last-child{border:0}.qrow .l{font-family:var(--f-ui);font-size:14px;color:var(--primary)}.qrow .meta{margin-left:auto;margin-right:12px}
.srow+.srow{margin-top:13px}
.chips{display:flex;gap:8px;flex-wrap:wrap;margin:12px 0}
/* live motion in the applied console — smooth transitions for JS-driven values + a slow progress creep. ease-in-out only, no bounce. */
.gauge svg circle{transition:stroke-dashoffset .9s var(--ease)}
.spark i{transition:height .45s var(--ease)}
.app .trk::after{animation:trkcreep 7s var(--ease) infinite alternate}
@keyframes trkcreep{from{width:48%}to{width:66%}}
/* Applied console is a product UI → always dark (like Nothing's own dashboard), so all its greens stay the one electric lime & the colon matches */
.appwrap{position:relative;isolation:isolate;padding:48px 0 64px;
--bg:#000;--surface:#0C0C0C;--raised:#171717;--line:#262626;--line-2:#3A3A3A;
--muted:#5A5A5A;--secondary:#8C8C8C;--primary:#EDEDED;--display:#FFF;
--accent:#D71921;--accent-ink:#FFFFFF;--accent-text:#FF4438;
--success:#7BE38A;--warning:#F2C94C;--error:#FF5247;
--glass:rgba(24,24,24,.9);--glass-brd:rgba(255,255,255,.08);
background-color:var(--bg);color:var(--primary)}
/* same local-inverse dot field, scoped to the (dark) dashboard region → dots auto-read light here */
.appwrap::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
background-image:radial-gradient(rgba(255,255,255,.42) 1.3px,transparent 1.7px);
background-size:120px 120px;background-attachment:fixed;mix-blend-mode:difference}
.applead{display:flex;align-items:baseline;gap:12px;margin-bottom:20px}
.applead .no{font-family:var(--f-display);font-weight:700;color:var(--muted)}
.applead h2{font-family:var(--f-head);font-weight:600;font-size:28px;color:var(--display)}
.outer{max-width:1480px;margin:0 auto;padding:0 24px}
/* applied · workspace screen — a sidebar+content application view (not a tile dashboard) */
.appscreen{display:flex;min-height:470px}
.appscreen .rail{width:58px;flex-shrink:0;border-right:1px solid var(--line);display:flex;flex-direction:column;align-items:center;gap:6px;padding:14px 0}
.appscreen .rail .r-i{width:36px;height:36px;border-radius:var(--r-sm);display:grid;place-items:center;color:var(--muted);cursor:pointer;transition:color .2s var(--ease),background .2s var(--ease)}
.appscreen .rail .r-i:hover{color:var(--primary)}
.appscreen .rail .r-i.on{background:var(--display);color:var(--bg)}
.appscreen .rail .sp{flex:1}
.appscreen .main{flex:1;min-width:0;padding:20px 24px}
.appscreen .top{display:flex;align-items:center;gap:12px;margin:8px 0 16px}
.appscreen .top h3{font-family:var(--f-head);font-weight:600;font-size:22px;color:var(--display)}
.appscreen .top .grow{flex:1}
.appscreen .top .withicon{width:190px;flex-shrink:0}
.appscreen .mstrip{display:flex;gap:10px;margin-bottom:18px}
.appscreen .mstrip .metric{flex:1}
.appscreen .row-live{display:inline-flex;align-items:center;gap:7px;color:var(--accent-text);font-family:var(--f-mono);font-size:10px;letter-spacing:.06em}
.appscreen .row-live .d{width:7px;height:7px;border-radius:50%;background:var(--accent);animation:liveblink 1.2s steps(1) infinite}
.appscreen .dtrk{height:2px;width:96px;background:var(--line-2);position:relative;margin-top:5px;overflow:hidden}
.appscreen .dtrk::after{content:"";position:absolute;left:0;top:0;height:100%;background:var(--accent);animation:deployscan 2.6s var(--ease) infinite}
@keyframes deployscan{0%{width:10%}85%{width:90%}100%{width:90%}}
.pill.sig{background:var(--accent);color:var(--accent-ink)}
@media(max-width:720px){.appscreen{flex-direction:column}.appscreen .rail{flex-direction:row;width:auto;border-right:0;border-bottom:1px solid var(--line)}.appscreen .rail .sp{display:none}}
/* ===== additional dynamic components (4146) — net-new types, Nothing-flavored ===== */
@keyframes llin{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
/* 41 rotary knob (drag) — Teenage-Engineering / hardware feel */
.knobwrap{text-align:center}
.knob{width:78px;height:78px;border-radius:50%;border:1px solid var(--line-2);background:var(--surface);position:relative;margin:0 auto;cursor:grab;touch-action:none}
.knob:active{cursor:grabbing}
.knob::after{content:"";position:absolute;inset:11px;border-radius:50%;border:1px solid var(--line)}
.knob .ind{position:absolute;left:50%;top:50%;width:2px;height:30px;background:var(--display);transform-origin:50% 100%;transform:translate(-50%,-100%) rotate(var(--a,-135deg))}
.knobval{font-family:var(--f-display);font-weight:500;font-size:22px;color:var(--display);margin-top:14px}
/* 42 dot-matrix spinner */
.dspin{position:relative;width:50px;height:50px;margin:14px auto}
.dspin i{position:absolute;left:50%;top:50%;width:6px;height:6px;margin:-3px;border-radius:50%;background:var(--display);opacity:.15;animation:dfade 1s linear infinite}
@keyframes dfade{0%{opacity:1}70%,100%{opacity:.15}}
/* 43 verification (OTP) input */
.otp{display:flex;gap:8px}
.otp input{width:40px;height:50px;text-align:center;background:transparent;border:1px solid var(--line-2);border-radius:var(--r-sm);color:var(--display);font-family:var(--f-display);font-weight:500;font-size:22px;outline:0;transition:border-color .2s var(--ease)}
.otp input:focus{border-color:var(--primary)}
.otp.done input{border-color:var(--success);color:var(--success)}
/* 44 live counter (count-up) */
.ticker .tval{font-family:var(--f-display);font-weight:500;font-size:40px;color:var(--display);line-height:1}
.ticker .tdelta{font-family:var(--f-mono);font-size:11px;margin-top:8px;letter-spacing:.04em}
.ticker .tdelta.up{color:var(--success)} .ticker .tdelta.dn{color:var(--error)}
/* 45 activity stream */
.stream{display:flex;flex-direction:column;gap:7px;height:150px;overflow:hidden;font-family:var(--f-mono);font-size:10px}
.stream .s-l{display:flex;gap:8px;color:var(--secondary);animation:llin .3s var(--ease)}
.stream .s-l .t{color:var(--muted);flex-shrink:0}
.stream .s-l.sig{color:var(--accent-text)}
/* 46 copy field */
.copyfield{display:flex;align-items:center;gap:8px;border:1px solid var(--line-2);border-radius:var(--r-sm);padding:7px 7px 7px 12px}
.copyfield code{flex:1;min-width:0;font-family:var(--f-mono);font-size:11px;color:var(--primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.copyfield .cbtn{flex-shrink:0;font-family:var(--f-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;border:1px solid var(--line-2);border-radius:5px;padding:6px 10px;background:transparent;color:var(--secondary);cursor:pointer;transition:opacity .2s var(--ease)}
.copyfield .cbtn:hover{opacity:.7}
.copyfield .cbtn.ok{background:var(--display);color:var(--bg);border-color:var(--display)}
footer{padding:28px 24px;display:flex;justify-content:space-between;color:var(--muted);font-size:10px;text-transform:uppercase;letter-spacing:.08em;border-top:1px solid var(--line)}