/* Home-style.css — core design system: tokens, layout grid, header, cards, DECO shell.
 * Mobile-first. Desktop split layout starts at 1024px.
 * Clean Minimalist Edition with Optimized Text Contrast.
 */

/* ---------- tokens ---------- */
:root,
[data-theme="light"] {
  --c-green: #b43a0f; 
  --c-green-d: #8c2807; 
  --c-green-t: rgba(180, 58, 15, 0.1);
  --c-grad-primary: linear-gradient(135deg, #b43a0f 0%, #702107 100%);
  --c-bg: #f0f4f8; 
  --c-surface: #ffffff; 
  --c-text: #0f172a; 
  --c-muted: #64748b;
  --c-faint: #94a3b8; 
  --c-dim: #cbd5e1; 
  --c-border: #e2e8f0; 
  --c-line: #cbd5e1;
  --c-soft: #f8fafc; 
  --c-hair: #e2e8f0; 
  --c-tint: rgba(180, 58, 15, 0.03);
  --c-bar: #ffffff; 
  --c-util: #94a3b8;
  --c-ok-t: rgba(16, 185, 129, 0.1); 
  --c-ok: #059669; 
  --c-over-t: rgba(225, 29, 72, 0.1); 
  --c-over: #e11d48;
  --r-sm: 9px; 
  --r-md: 13px; 
  --r-lg: 20px;
  --ease: cubic-bezier(.16, 1, .3, 1);
  /* Tells the engine which palette its OWN surfaces belong to — the canvas it paints
     before any rule applies, form controls, scrollbars and the overscroll/rubber-band
     area past the end of the document. Without it those stay light while the page is
     dark, which is a white edge on every bounce scroll. See "theme boot guard" below
     for the half of this that has to run before the first paint. */
  color-scheme: light;
}

[data-theme="dark"] {
  --c-green: #d9531e; 
  --c-green-d: #b43a0f; 
  --c-green-t: rgba(255, 255, 255, 0.08);
  --c-grad-primary: linear-gradient(135deg, #b43a0f 0%, #5c1d09 100%);
  --c-bg: #090a0d; 
  --c-surface: #12141a; 
  --c-text: #f3f4f6; 
  --c-muted: #9ca3af;
  --c-faint: #6b7280; 
  --c-dim: #374151; 
  --c-border: #1f232d; 
  --c-line: #262c38;
  --c-soft: #161922; 
  --c-hair: #1f232d; 
  --c-tint: rgba(255, 255, 255, 0.02);
  --c-bar: #12141a; 
  --c-util: #6b7280;
  --c-ok-t: rgba(16, 185, 129, 0.14); 
  --c-ok: #10b981; 
  --c-over-t: rgba(225, 29, 72, 0.14); 
  --c-over: #fb7185;
  color-scheme: dark;
}

/* ---------- theme boot guard ----------
   Every document on this site ships `<html data-theme="light">` in its source, and the
   real preference lives in localStorage under 'vns-theme', read by bindTheme() in
   js/layout.js. layout.js is a <script> at the BOTTOM of <body>, so on a dark-mode device
   the order used to be: parse head -> paint the whole document light -> run layout.js ->
   repaint dark. That repaint is the "harsh white flash" reported on every drawer tap that
   leaves the current document — which is most of them, since the two hubs, the four tool
   pages, the legal pages and 404.html carry no router and navigate for real.

   A four-line inline script now sits in the <head> of all 43 documents and applies the
   stored theme before <body> is parsed, so the first frame is already dark. The same
   script sets `color-scheme` inline as well, because the attribute alone cannot colour the
   canvas the engine paints BEFORE this stylesheet is applied.

   Three rules cooperate here and all three are needed:
     - the inline head script      -> the attribute exists before the first paint
     - `color-scheme` in the token blocks above -> engine surfaces follow the theme
     - `html { background }` below -> the root box is painted, not just <body>, so the
       area past the end of a short document (rubber-band overscroll on iOS, the strip
       under a short page on desktop) is never the default white.
   ---------- base ---------- */
* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
/* Repeated on the inheritance root: -webkit-tap-highlight-color is an inherited property,
   and a handful of Android WebView builds read it from the root rather than from the
   matched element. Setting it in both places costs nothing and closes the grey/white
   rectangle that used to strobe under a drawer link on tap. */
html { -webkit-tap-highlight-color: transparent; }
html, body { margin: 0; padding: 0; }
html { background: var(--c-bg); }
html, body, [data-layout-header], [data-layout-footer] { overflow: visible; }
body {
  background: var(--c-bg); color: var(--c-text);
  font-family: 'Times New Roman', Times, serif;
  font-size: 15px; line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}

/* ---------- sticky footer / shell height ----------
   Every document on this site is the same three-box shell: [data-layout-header], one
   <main>, [data-layout-footer]. Until now that shell was plain block flow, which means the
   footer sat wherever <main> happened to end. That is fine once a page is painted and
   wrong during every cold load, because <main> is empty at that moment:

     - /ff-color-picker, /bio-color-picker, /ff-bio-style and any other
       flat slug are served BY index.html (.htaccess line 97), and the head guard below
       hides both [data-view] children until the route resolves — so <main class="page">
       renders as a 0px box;
     - the two hubs and standalone pages paint their own markup, but [data-layout-footer] is
       an empty div until layout.js fills it, so the first frame is short in the same way.

   With a 0px main, normal flow put the footer — logo, description, category links — flush
   under the header for the 1-2s the registries took to fetch, then snapped it to the bottom
   once the cards mounted. That is the reported "logo flash", and no amount of skeleton
   markup fixes it, because the cause is the height of the container, not its contents.

   body is therefore a full-height flex column and <main> is the only growing item. The
   footer is then pinned below the fold at every point in the lifecycle: before scripts run,
   while the route is pending, and after hydration. It cannot touch the header in any of
   those states. The min-height on main is a second, independent floor for the same
   guarantee, so a document that somehow escapes the flex context still reserves a screen.
   100dvh follows 100vh so mobile browsers use the live viewport (which changes as the URL
   bar hides) while anything without dvh support keeps the static value.

   About --shell-reserve, because the number is load-bearing and not obvious:
   flex-grow does NOT rescue this on its own. This footer is taller than a phone screen, so
   header + main + footer already exceeds 100vh even when main is 0px; there is no free
   space left for main to grow into, and the footer lands right under the header exactly as
   before. The min-height floor is what actually holds the stage open, which makes its value
   the whole fix. It has to be no larger than the rendered header (.hdr measures 57px on
   every breakpoint), or main falls short by the difference and the top edge of the footer
   creeps back above the fold. 56px, i.e. the header with 1px of slack. Erring small is the
   safe direction: too small only adds a few pixels of scroll to an otherwise empty page,
   while too large puts the logo back on screen. The empty-header reserve below is 198px,
   comfortably larger, so the boot state over-reserves and is safe by the same reasoning.

   WHY THAT FLOOR IS NO LONGER UNCONDITIONAL:
   applied to every state, the floor is also a CEILING on how close the footer may come to
   the content. A hydrated /all-tools or /about is ~500px of cards on a 2121px-tall window;
   pinned to `100vh - 56px`, <main> kept reserving the whole window and left a 1,290px band
   of empty page between the last card and the footer. The reserve is only ever needed while
   the route's own markup does not exist yet, so it is scoped to exactly that window below
   and the hydrated page is governed by the flex rules alone: main still grows into any free
   space, so the footer still reaches the bottom edge of a short page, but it stops being
   pushed past it. The two hooks are documented at "cold-load route guard". */
:root { --shell-reserve: 56px; }
body { display: flex; flex-direction: column; min-height: 100vh; min-height: 100dvh; }
/* The chrome never grows and never shrinks — only main absorbs the free space. Explicit
   because [data-layout-header]:empty carries a fixed 198px reserve (see "cold-load height
   reserve") that a default flex-shrink:1 would eat into the moment the page is short. */
body > [data-layout-header],
body > [data-generator-host],
body > [data-layout-footer] { flex: 0 0 auto; }
/* Matches every document's <main> shell, so no page type can be missed. */
body > main {
  flex: 1 0 auto;
  /* Not decorative. Centred page containers use `max-width` + `margin: 0 auto`,
     and auto margins in a flex container's CROSS axis
     suppress align-items:stretch — the item falls back to its shrink-to-fit width and the
     auto margins centre that instead. Measured before this line existed: main.tool-page
     rendered 764px wide on a 1440px desktop where the block-flow version renders the full
     1100px, which would have quietly re-narrowed both hub grids. An explicit width gives
     the item a definite cross size again, max-width clamps it exactly as before, and the
     auto margins still do the centring. */
  width: 100%;
}
/* Inert while <main> keeps flex-grow — main absorbs the free space before the footer can
   ever be reached by an auto margin. Kept as a second, independent guarantee that the
   footer stays at the bottom of a short page if the growth rule above is ever changed. */
body > [data-layout-footer] { margin-top: auto; }

/* ---------- legal / information pages ----------
   These rules preserve the former legal-page geometry without depending on the removed
   page-specific stylesheet. They are intentionally scoped to legal-* classes only. */
.legal-page { max-width: 1440px; margin: 0 auto; padding: 10px 14px 20px; }
.legal-body { max-width: 680px; }
.legal-title { font-size: 22px; font-weight: 800; line-height: 1.25; letter-spacing: -.5px; margin: 0; text-wrap: pretty; }
.legal-meta { font-size: 11.5px; font-weight: 700; color: var(--c-faint); margin: 0; }
.legal-body h2 { font-size: 17px; font-weight: 800; margin: 22px 0 8px; }
.legal-body h3 { font-size: 14px; font-weight: 800; margin: 16px 0 5px; color: var(--c-text); }
.legal-body p, .legal-body li { font-size: 14px; line-height: 1.7; color: var(--c-muted); text-wrap: pretty; }
.legal-body ul, .legal-body ol { padding-left: 20px; }
@media (min-width: 1024px) { .legal-page { padding: 18px 22px 24px; } }

button, input, select, textarea { font-family: inherit; color: inherit; }
button { cursor: pointer; }
a { color: var(--c-green); text-decoration: none; }
a:hover { color: var(--c-green-d); }
:focus-visible { outline: 2px solid var(--c-green); outline-offset: 2px; }
::selection { background: var(--c-green-t); }
.scroll { scrollbar-width: none; -ms-overflow-style: none; }
.scroll::-webkit-scrollbar { display: none; }
.kicker { font-size: 10px; font-weight: 800; letter-spacing: 1.1px; text-transform: uppercase; color: var(--c-green); margin-bottom: 9px; }
.muted { color: var(--c-muted); }
[hidden] { display: none !important; }
.drawer-locked, .deco-locked, .drawer-locked body, .deco-locked body { overflow: hidden; height: 100%; touch-action: none; }

/* ---------- header ---------- */
.hdr { background: var(--c-surface); border-bottom: 1px solid var(--c-border); }
.hdr-row { display: flex; align-items: center; gap: 10px; padding: 9px 14px; }
.brand { flex: 1; display: flex; align-items: center; justify-content: center; gap: 9px; color: var(--c-text); }
.brand:hover { color: var(--c-text); }
.brand-logo { width: 32px; height: 32px; flex: none; display: block; object-fit: contain; }
@media (min-width: 720px) { .brand-logo { width: 32px; height: 32px; } }
.brand-name { font-weight: 800; font-size: 16px; letter-spacing: -.3px; white-space: nowrap; }

/* Header Icon Buttons */
.icon-btn { 
  width: 38px; height: 38px; flex: none; display: grid; place-items: center; 
  border: 1px solid var(--c-green); border-radius: 11px; 
  background: var(--c-green-t); color: var(--c-green); 
  transition: border-color .16s ease, color .16s ease, background-color .16s ease, box-shadow .16s ease, transform .09s ease; 
}
.icon-btn:hover { 
  border-color: var(--c-green-d); 
  background: var(--c-green); 
  color: #ffffff; 
  box-shadow: 0 3px 10px var(--c-green-t);
}
.icon-btn:active { 
  transform: scale(.94); 
  background: var(--c-green-d); 
  border-color: var(--c-green-d); 
  color: #ffffff; 
}

/* Seamless Drawer Close & Clear Buttons */
.icon-btn.sm { 
  width: 32px; height: 32px; border: 0 !important; 
  background: transparent !important; color: var(--c-muted) !important; 
  border-radius: 8px;
}
.icon-btn.sm:hover { color: var(--c-text) !important; background: var(--c-soft) !important; }
.icon-btn.sm:active { transform: scale(.92); }

.icon-btn.xs { 
  width: 26px; height: 26px; border: 0 !important; 
  background: transparent !important; color: var(--c-faint) !important; 
  border-radius: 50%;
}
.icon-btn.xs:hover { color: var(--c-text) !important; background: var(--c-border) !important; }
.icon-btn.xs:active { transform: scale(.9); }

/* Dark Mode: Header Buttons */
[data-theme="dark"] .icon-btn {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  color: var(--c-text);
}
[data-theme="dark"] .icon-btn:hover {
  background: #ffffff;
  border-color: #ffffff;
  color: #090a0d;
  box-shadow: 0 2px 10px rgba(255, 255, 255, 0.15);
}
[data-theme="dark"] .icon-btn:active {
  background: #e2e8f0;
  border-color: #e2e8f0;
  color: #090a0d;
}
[data-theme="dark"] .icon-btn.sm,
[data-theme="dark"] .icon-btn.xs {
  background: transparent !important;
  border: 0 !important;
  color: var(--c-muted) !important;
}
[data-theme="dark"] .icon-btn.sm:hover,
[data-theme="dark"] .icon-btn.xs:hover {
  color: #ffffff !important;
  background: var(--c-soft) !important;
}

/* ---------- sticky generator bar ---------- */
.gen-sticky {
  position: relative;
  width: 100%;
  padding-top: 8px;
  background: color-mix(in srgb, var(--c-surface) 96%, transparent);
  backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--c-border);
  transition: box-shadow .25s ease-in-out;
}
.gen-sticky::after {
  content: ''; position: absolute; left: 0; right: 0; top: 100%; height: 18px;
  pointer-events: none;
  background: linear-gradient(to bottom, color-mix(in srgb, var(--c-bg) 78%, transparent), transparent);
}
.gen-sticky.is-pinned { box-shadow: 0 10px 25px -5px rgba(0, 0, 0, .05); }

/* ---------- view transitions + route loader ---------- */
@keyframes viewIn { from { opacity: 0; transform: translate3d(0, 8px, 0); } to { opacity: 1; transform: none; } }
.view { animation: viewIn .28s var(--ease) both; }
.view[data-view="styles"] { animation: none; }
/* ---------- persistent chrome, hide-on-scroll header ----------
   The header and the footer are mounted once by js/layout.js and are never unmounted or
   re-rendered: a navigation only swaps the middle container. The header itself is NOT
   pinned — it scrolls up and out of view with the page, and the action bar under it takes
   over the top edge. Only the pinned element changes, never the DOM, so there is nothing
   to animate, unmount or measure and no shift to correct.

   The action bar is the generator bar on the feed routes and a tool's own
   [data-sticky-bar] row on a tool route (see below). Both pin to top:0, so the top edge
   of the viewport always carries the same thing: the field the visitor is typing in. */
body > [data-layout-header] { position: relative; z-index: 120; }
body > [data-generator-host] { position: sticky; top: 0; z-index: 130; }

/* A tool's own primary input row, opted in with data-sticky-bar in the tool's HTML. It
   pins inside its own column, so it travels for as long as its section is on screen and
   then leaves with it. z-index sits under the drawer and every modal sheet by design. */
[data-sticky-bar] {
  position: sticky; top: 0; z-index: 60;
  background: var(--c-surface);
  box-shadow: 0 10px 20px -16px rgba(0, 0, 0, .28);
}

/* ---------- generator ---------- */
.gen-row { display: flex; gap: 8px; padding: 0 14px 10px; }
.input-wrap { flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px; height: 46px; padding: 0 8px 0 13px; border: 1px solid var(--c-border); border-radius: var(--r-md); background: var(--c-soft); transition: border-color .14s ease; }
.input-wrap:focus-within { border-color: var(--c-green); }
.name-input { flex: 1; min-width: 0; border: 0; background: none; outline: none; font-size: 16px; font-weight: 700; color: var(--c-text); }
.name-len { font-size: 10px; font-weight: 800; color: var(--c-dim); font-variant-numeric: tabular-nums; }
.btn-green { flex: none; display: flex; align-items: center; justify-content: center; gap: 7px; min-width: 104px; height: 46px; padding: 0 clamp(11px, 3.4vw, 17px); border: 0; border-radius: var(--r-md); background: var(--c-grad-primary); color: #fff; font-size: clamp(13px, 3.5vw, 14.5px); font-weight: 800; letter-spacing: -.1px; white-space: nowrap; box-shadow: 0 2px 8px var(--c-green-t); transition: transform .09s ease, filter .14s ease; will-change: transform; }
.btn-green:hover { filter: brightness(1.12); }
.btn-green:active { transform: scale(.95); }
.dice { display: inline-flex; align-items: center; line-height: 0; flex: none; }
@media (max-width: 340px) { .btn-green { min-width: 0; padding: 0 12px; } .btn-green-label { display: none; } }
@keyframes rotateIcon { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
.dice.is-spinning { animation: rotateIcon .4s var(--ease); }

/* Neutral Preview Output */
.preview-row { display: flex; align-items: baseline; gap: 10px; padding: 0 14px 9px; }
.preview-row .kicker { margin: 0; color: var(--c-faint); letter-spacing: 1.2px; flex: none; }
.preview { flex: 1; min-width: 0; min-height: 27px; font-size: 18px; font-weight: 700; color: var(--c-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* ---------- pill rail ---------- */
.rail { display: flex; gap: 7px; overflow-x: auto; padding: 0 14px 9px; scroll-behavior: smooth; -webkit-overflow-scrolling: touch; scroll-snap-type: x proximity; }
/* An <a>, not a <button>: the rail is the site's internal link graph (js/app.js). */
.pill { display: inline-flex; align-items: center; text-decoration: none; flex: none; height: 32px; padding: 0 14px; border: 1px solid var(--c-border); border-radius: 999px; background: var(--c-surface); color: var(--c-muted); font-size: 12px; font-weight: 800; white-space: nowrap; scroll-snap-align: center; transition: transform .12s ease, box-shadow .18s ease, background-color .16s ease, border-color .16s ease, color .16s ease; will-change: transform; }
.pill:hover { border-color: var(--c-green); background: var(--c-green-t); color: var(--c-green); }
.pill:active { transform: scale(.95); }
.pill.is-active { 
  background: var(--c-green-t); 
  border: 1.5px solid var(--c-green); 
  color: var(--c-green); 
  box-shadow: 0 2px 8px var(--c-green-t); 
}
.pill.is-active:hover { 
  background: var(--c-green); 
  border-color: var(--c-green-d); 
  color: #ffffff; 
}

/* Dark Mode: Sleek Category Pills */
[data-theme="dark"] .pill {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  color: var(--c-muted);
}
[data-theme="dark"] .pill:hover {
  border-color: var(--c-dim);
  background: var(--c-soft);
  color: var(--c-text);
}
[data-theme="dark"] .pill.is-active {
  background: #ffffff;
  border-color: #ffffff;
  color: #090a0d;
  font-weight: 800;
  box-shadow: 0 2px 10px rgba(255, 255, 255, 0.15);
}
[data-theme="dark"] .pill.is-active:hover {
  background: #e2e8f0;
  border-color: #e2e8f0;
  color: #090a0d;
}

/* ---------- page body ---------- */
.page { padding: 10px 14px 20px; }
.stack { display: grid; grid-template-columns: minmax(0, 1fr); gap: 14px; align-items: start; }
/* The cards and the article are one <section> in the shell's single <main> (js/app.js),
   so a crawler reads them as one page. min-width:0 keeps the grid track from blowing out
   on a long unbroken nickname. */
.feed-section { min-width: 0; }
.side { display: none; }
.panel { background: var(--c-surface); border: 1px solid var(--c-border); border-radius: 16px; padding: 14px; }

/* ---------- batches + cards ---------- */
.batch + .batch { margin-top: 14px; }
.batch-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 8px; }
.batch-title { flex: 1; min-width: 0; font-size: 12px; font-weight: 800; letter-spacing: .5px; text-transform: uppercase; color: var(--c-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.batch-meta { flex: none; font-size: 11px; font-weight: 700; color: var(--c-faint); font-variant-numeric: tabular-nums; }
.cgrid { display: grid; gap: 10px; grid-template-columns: minmax(0, 1fr); }

/* ---------- injected batch box ---------- */
.inject {
  min-width: 0; max-width: 100%; margin: 16px 0 10px;
  padding: 12px 14px; background: var(--c-surface);
  border: 1px solid var(--c-border); border-radius: 12px;
  overflow-wrap: anywhere;
}
.inject-title {
  font-size: 12px; font-weight: 800; letter-spacing: .6px; text-transform: uppercase;
  color: var(--c-muted); text-align: center; line-height: 1.5;
}
.inject-title + .inject-text { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--c-border); }
.inject-text {
  margin: 0; font-size: 12.5px; line-height: 1.7; color: var(--c-faint);
  text-align: center; text-wrap: pretty;
}
.inject-text.is-para { text-align: left; }
@media (min-width: 720px) {
  .inject { padding: 14px 18px; }
  .inject-text.is-para { text-align: justify; hyphens: auto; }
}

/* ---------- cold-load height reserve ----------
   The reserve stands in for TWO boxes, not one: js/layout.js fills the header hook with
   the 57px brand row and then inserts the generator bar as its SIBLING, immediately after
   it. Neither box exists before that script runs, so the empty hook has to hold the space
   for both of them or everything below it moves when they arrive.
   209px is that combined figure, measured on the mounted shell — 57px header + 152px
   generator — and it holds at 390px, 768px and 1280px wide. It was 198px, which under-shot
   by 11px and cost a downward nudge of <main> on every cold load of the homepage and of
   all 29 category pages.
   Pages booted by js/master-loader.js are marked html[data-shell="sub"] before the first
   paint. They have no generator bar at all, so they reserve the exact 57px their chrome
   occupies and the mount is pixel-neutral. */
/* Reserve the chrome's real height for the frames before layout.js mounts it. A feed
   document mounts header + generator bar (209px measured, and it holds at 390px, 768px
   and 1280px wide); every other route mounts the 57px header alone. */
[data-layout-header]:empty { display: block; height: 57px; }
body:not([data-boot-view="alt"]) [data-layout-header]:empty { height: 209px; }
/* A tool's workspace is rendered by its own tool.js, so its height is not knowable in
   advance — but the article and the footer below it must not be thrown down the page when
   the cards arrive. Flooring the feed while it is still :empty puts them below the fold
   before they are ever painted. Capped at 900px so the reserve can never over-shoot the
   content that replaces it and snap the page upward instead. */
[data-ff12-feed]:empty,
[data-vb-feed]:empty,
[data-vb-nick-feed]:empty {
  min-height: calc(100vh - var(--shell-reserve));
  min-height: min(900px, calc(100dvh - var(--shell-reserve)));
}
:root:not(.app-ready) [data-feed]:empty { min-height: calc(24 * 130px + 24 * 10px + 18px); }
@media (min-width: 1024px) { :root:not(.app-ready) [data-feed]:empty { min-height: calc(12 * 130px + 12 * 12px + 18px); } }
[data-rail]:empty { min-height: 41px; }
[data-seo]:empty { display: none; }

@keyframes skelPulse { 0%, 100% { opacity: 1; } 50% { opacity: .45; } }
.card-skel { pointer-events: none; }
.card-skel .skel-line, .card-skel .skel-chip, .card-skel .skel-btn { display: block; border-radius: 999px; background: var(--c-soft); animation: skelPulse 1.15s var(--ease) infinite; }
.card-skel .skel-line { width: 62%; height: 20px; }
.card-skel .skel-chip { width: 100%; height: 30px; border-radius: var(--r-md); }
.card-skel .skel-btn { flex: none; width: 34px; height: 30px; border-radius: var(--r-md); }
.card-skel .util { flex: 1; min-width: 0; }
@media (prefers-reduced-motion: reduce) { .card-skel .skel-line, .card-skel .skel-chip, .card-skel .skel-btn { animation: none; } }

@keyframes cardEntrance { from { opacity: 0; transform: translate3d(0, 16px, 0) scale(.97); } to { opacity: 1; transform: translate3d(0, 0, 0) scale(1); } }

/* Pure White Card */
.card {
  background: var(--c-surface) !important;
  border: 1px solid var(--c-border);
  border-radius: var(--r-lg);
  padding: 12px 14px 10px;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02);
  transition: border-color .14s ease, transform .14s ease;
}
.card:hover {
  border-color: var(--c-dim);
  transform: translateY(-1px);
}
.card.is-in { animation: cardEntrance .42s var(--ease) backwards; animation-delay: calc(var(--card-index, 0) * 35ms); will-change: transform, opacity; }

@keyframes outIn { from { opacity: .45; transform: translate3d(0, 5px, 0); } 60% { opacity: .95; } to { opacity: 1; transform: none; } }
.card.is-soft .card-out { animation: outIn .26s cubic-bezier(.21, .61, .35, 1) both; animation-delay: calc(var(--card-index, 0) * 26ms); will-change: opacity, transform; }
@media (prefers-reduced-motion: reduce) { .card.is-soft .card-out { animation: none; } }

/* Font Output area with soft feedback on tap/click */
.card-out {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: center; text-align: center;
  min-width: 0; min-height: 46px; box-sizing: border-box; padding: 3px 6px 7px;
  font-size: 21px; line-height: 1.3; color: var(--c-text);
  white-space: normal; overflow-wrap: anywhere; word-break: break-word; overflow: hidden;
  cursor: pointer; -webkit-tap-highlight-color: transparent;
  font-family: 'Times New Roman', Times, serif, system-ui, sans-serif;
  border-radius: var(--r-sm);
  transition: background-color .14s ease, opacity .14s ease;
}
.card-out:active { 
  opacity: .9;
  background: var(--c-green-t); 
}
.card-out:focus-visible { outline: 2px solid var(--c-green); outline-offset: 2px; border-radius: var(--r-sm); }
.card-out > * { max-width: 100%; min-width: 0; }
.card-bar { display: flex; align-items: center; gap: 8px; }

/* Fully Seamless Card-Blended Util Bar with Clean Visible Contrast */
.util {
  flex: 1; min-width: 0; display: flex; align-items: center; justify-content: space-between; gap: 8px;
  height: 34px; padding: 0 10px; border-radius: 999px;
  background: var(--c-surface) !important; border: 0 !important; overflow: hidden;
}
.util-n { flex: none; font-size: 11px; font-weight: 500; color: var(--c-faint); opacity: .65; font-variant-numeric: tabular-nums; white-space: nowrap; }
.util-copy {
  flex: 0 1 auto; min-width: 44px; height: 34px; border: 0; background: none;
  font-size: 11px; font-weight: 600; letter-spacing: 1.1px; color: var(--c-faint); opacity: .65;
  transition: transform .09s ease, color .14s ease, opacity .14s ease; text-align: center;
}
.util-copy:hover { color: var(--c-green); opacity: 1; }
.util-copy:active { transform: scale(.94); color: var(--c-green); opacity: 1; }
.util-tag { flex: 0 1 auto; min-width: 0; max-width: 110px; font-size: 10.5px; font-weight: 500; color: var(--c-faint); opacity: .65; text-align: right; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* Minimal Outline Fav Button */
.fav {
  flex: none; width: 34px; height: 34px; border-radius: 999px;
  font-size: 14px; line-height: 1; transition: transform .09s ease, color .14s ease, opacity .14s ease;
  will-change: transform; display: grid; place-items: center;
  background: var(--c-surface); border: 1px solid var(--c-border); color: var(--c-faint); opacity: .65;
}
.fav:hover { color: var(--c-green); border-color: var(--c-green); opacity: 1; }
.fav.is-on { color: #e11d48; border-color: #e11d48; opacity: 1; }
.fav:active { transform: scale(.92); }

/* Clean Seamless DECO Button with Deep Subdued Star */
.deco-btn {
  flex: none; width: 34px; height: 34px; border-radius: 999px;
  font-size: 15px; line-height: 1; transition: transform .09s ease, color .14s ease, border-color .14s ease, opacity .14s ease;
  will-change: transform; display: grid; place-items: center;
  background: var(--c-surface); border: 1px solid var(--c-border); color: var(--c-green); opacity: .75;
}
.deco-btn:hover { background: var(--c-soft); border-color: var(--c-green); color: var(--c-green-d); opacity: 1; }
.deco-btn:active { transform: scale(.92); }

.card-ad { display: grid; place-items: center; min-height: 128px; border-style: dashed; border-color: var(--c-line); background: var(--c-tint); }
.card-ad:not(:has(.ad-slot[data-ad-state])) { display: none; }

/* ---------- load more ---------- */
.more { 
  margin-top: 18px; width: 100%; height: 48px; 
  display: flex; align-items: center; justify-content: center; gap: 9px; 
  border: 1.5px solid var(--c-green); border-radius: 14px; 
  background: var(--c-green-t); color: var(--c-green); 
  font-size: 14px; font-weight: 800; 
  box-shadow: 0 2px 8px var(--c-green-t); 
  transition: transform .09s ease, background-color .16s ease, border-color .16s ease, color .16s ease, box-shadow .16s ease; 
  will-change: transform; 
}
.more:hover { 
  background: var(--c-green); 
  border-color: var(--c-green-d); 
  color: #ffffff; 
  box-shadow: 0 4px 14px var(--c-green-t); 
}
.more:active { transform: scale(.98); background: var(--c-green-d); color: #ffffff; }
.more-regen .dice { display: inline-flex; align-items: center; line-height: 0; color: inherit; }
.more-regen .dice.is-spinning { animation: rotateIcon .5s var(--ease); }
.more-regen { transition: transform .09s ease, background-color .16s ease; }
.more-regen:active { transform: scale(.97); }

/* Dark Mode: Load More */
[data-theme="dark"] .more {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  color: var(--c-text);
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}
[data-theme="dark"] .more:hover {
  background: #ffffff;
  border-color: #ffffff;
  color: #090a0d;
}

.empty { text-align: center; padding: 26px 20px 34px; color: var(--c-faint); font-size: 13px; font-weight: 700; }
.empty-ico { font-size: 34px; line-height: 1; }
.empty-title { margin-top: 12px; font-size: 18px; font-weight: 800; letter-spacing: -.3px; color: var(--c-text); }
.empty-sub { max-width: 320px; margin: 8px auto 0; font-size: 13px; font-weight: 500; line-height: 1.6; color: var(--c-muted); text-wrap: pretty; }
.empty-cta { margin-top: 18px; height: 42px; padding: 0 20px; border: 1.5px solid var(--c-green); border-radius: var(--r-md); background: var(--c-green-t); color: var(--c-green); font-size: 13px; font-weight: 800; transition: filter .16s ease, transform .09s ease; }
.empty-cta:hover { background: var(--c-green); color: #ffffff; }
.empty-cta:active { transform: scale(.97); }

.rail-prog { height: 2px; margin: 0 14px 8px; border-radius: 2px; background: var(--c-border); overflow: hidden; }
.rail-fill { display: block; height: 100%; width: 0; border-radius: 2px; background: var(--c-green); transition: width .38s var(--ease); }
[data-theme="dark"] .rail-fill { background: #ffffff; }
.gen-sticky.is-saved .rail, .gen-sticky.is-saved .rail-prog, .gen-sticky.is-saved .preview-row { display: none; }

/* ---------- sidebar widgets ---------- */
.side-widget { background: var(--c-surface); border: 1px solid var(--c-border); border-radius: 16px; padding: 14px; box-shadow: 0 1px 3px rgba(0,0,0,0.02); }
.side-widget:empty { display: none; }
.side-widget .kicker { margin: 0 0 8px; }
.side-note { margin: 0; font-size: 12.5px; line-height: 1.65; color: var(--c-muted); text-wrap: pretty; }
.side-note code { font-size: 11.5px; padding: 1px 4px; border-radius: 4px; background: var(--c-border); color: var(--c-text); }
.side-widget > .ad:only-child { margin: 0; }
.side-widget:has(> .ad:only-child) { padding: 0; border: 0; background: none; }
.side-mobile { display: grid; gap: 12px; margin-top: 14px; }
.side-mobile:empty { display: none; }

/* ---------- SEO content ---------- */
.seo { margin-top: 14px; background: var(--c-surface); border: 1px solid var(--c-border); border-radius: 16px; padding: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.02); }
.seo h1, .seo h2 { font-size: 17px; font-weight: 800; letter-spacing: -.3px; line-height: 1.3; margin: 0 0 9px; text-wrap: pretty; }
.seo h3 { font-size: 14px; font-weight: 800; margin: 18px 0 6px; }
.seo p, .seo li { font-size: 13px; line-height: 1.65; color: var(--c-muted); text-wrap: pretty; }
.seo ul { padding-left: 18px; margin: 8px 0; }
.seo .cat-kicker { font-size: 10px; font-weight: 800; letter-spacing: 1px; text-transform: uppercase; color: var(--c-green); margin-bottom: 7px; }
.seo hr { border: 0; border-top: 1px solid var(--c-border); margin: 14px 0 12px; }

/* ---------- ads ---------- */
.ad { width: 100%; max-width: 100%; overflow: hidden; margin-left: auto; margin-right: auto; border: 1px dashed var(--c-line); border-radius: 14px; background: var(--c-tint); display: grid; place-items: center; text-align: center; padding: 12px; }
.ad-lead { height: 62px; margin-bottom: 12px; }
.ad-bottom { height: 92px; margin-top: 16px; }
.ad-intext { margin: 18px auto; min-height: 92px; }
.ad-infeed { margin: 12px auto; min-height: 104px; }
.ad-below-gen { margin: 14px auto; min-height: 92px; }
[data-ad-frame]:not(:has(.ad-slot[data-ad-state])) { display: none; }
.ad-sky { height: 300px; }

/* ---------- footer ---------- */
.foot { background: var(--c-surface); margin: 0; border-top: 1px solid var(--c-border); padding: 22px 14px 28px; }
.foot-cols { display: grid; grid-template-columns: minmax(0, 1fr); gap: 22px; }
.foot-brand { display: flex; align-items: center; gap: 9px; font-size: 15px; font-weight: 800; }
.foot-about { font-size: 13px; line-height: 1.65; color: var(--c-muted); margin: 11px 0 0; text-wrap: pretty; }
.foot-links { display: grid; gap: 2px; }
.foot-links a { display: flex; align-items: center; gap: 10px; padding: 8px 0; color: var(--c-muted); font-size: 14px; font-weight: 600; }
.foot-links a:hover { color: var(--c-green); }
.foot-links svg { flex: none; width: 16px; height: 16px; color: currentColor; opacity: .7; }
.foot-links a:hover svg { opacity: 1; }
.foot-note { border-top: 1px solid var(--c-border); margin-top: 20px; padding-top: 12px; text-align: center; font-size: 10px; font-weight: 700; color: var(--c-dim); }

/* Scroll-To-Top Button */
.to-top { 
  position: fixed; right: 14px; bottom: 20px; z-index: 25; 
  width: 44px; height: 44px; display: grid; place-items: center; 
  border: 1.5px solid var(--c-green); border-radius: 50%; 
  background: var(--c-green-t); color: var(--c-green); 
  box-shadow: 0 4px 14px var(--c-green-t); 
  transition: border-color .16s ease, color .16s ease, background-color .16s ease, box-shadow .16s ease, transform .09s ease; 
}
.to-top:hover { 
  border-color: var(--c-green-d); 
  background: var(--c-green); 
  color: #ffffff; 
  box-shadow: 0 6px 18px var(--c-green-t); 
}
.to-top:active { 
  transform: scale(.94); 
  background: var(--c-green-d); 
  border-color: var(--c-green-d); 
  color: #ffffff; 
}

/* Dark Mode: Scroll-To-Top Button */
[data-theme="dark"] .to-top {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  color: var(--c-text);
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.4);
}
[data-theme="dark"] .to-top:hover {
  background: #ffffff;
  border-color: #ffffff;
  color: #090a0d;
}

/* ---------- drawer ---------- */
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes drawerIn { from { transform: translate3d(-100%, 0, 0); } to { transform: translate3d(0, 0, 0); } }
.drawer-wrap { position: fixed; inset: 0; z-index: 999; }
.drawer-backdrop { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: 999; background: rgba(0,0,0,.6); animation: fadeIn .18s ease-out; }
.drawer { position: fixed; left: 0; top: 0; bottom: 0; z-index: 1000; width: 296px; max-width: 86vw; display: flex; flex-direction: column; background: var(--c-surface); border-right: 1px solid var(--c-border); animation: drawerIn .26s var(--ease); will-change: transform; }
.drawer-head { display: flex; align-items: center; gap: 10px; padding: 20px 18px 16px; border-bottom: 1px solid var(--c-border); }
.drawer-brand { flex: 1; font-size: 15px; font-weight: 800; letter-spacing: -.2px; }
.drawer-body { flex: 1; overflow-y: auto; padding: 14px 18px 24px; }
.drawer-body a { display: flex; align-items: center; gap: 13px; min-height: 46px; padding: 6px 11px; border-radius: var(--r-sm); color: var(--c-text); font-size: 15px; font-weight: 600; line-height: 1.35; }
/* Press feedback for a drawer entry, in theme colours only.
   Two separate things used to flash white here on a phone in dark mode:
     - the engine's own tap highlight, a translucent white-to-grey rectangle on many
       Android builds. That is what the global `-webkit-tap-highlight-color: transparent`
       and its repeat on <html> (see "theme boot guard") remove.
     - :hover latching. Touch engines pin :hover to the last element tapped and hold it
       until something else is tapped, so a drawer link stayed lit after the drawer had
       closed and lit up again the moment it was reopened. Gating :hover behind
       `hover: hover` keeps it for real pointers and hands touch devices :active, which
       releases with the finger.
   Both states paint --c-soft, i.e. #161922 under the dark theme: dark stays dark for the
   whole press, which is the requirement. */
@media (hover: hover) {
  .drawer-body a:hover { background: var(--c-soft); color: var(--c-green); }
}
.drawer-body a:active { background: var(--c-soft); color: var(--c-green); }
.drawer-body a svg { flex: none; width: 20px; height: 20px; opacity: .8; }
.drawer-body a.is-home { min-height: 52px; font-size: 16.5px; font-weight: 800; letter-spacing: -.2px; }
.drawer-body a.is-home svg { width: 23px; height: 23px; opacity: 1; }
@media (hover: hover) { .drawer-body a:hover svg { opacity: 1; } }
.drawer-body a:active svg { opacity: 1; }
.drawer-body .kicker { margin: 20px 0 7px; color: var(--c-faint); font-size: 11.5px; }
.drawer-body .kicker:first-child { margin-top: 0; }
.chips { display: flex; flex-wrap: wrap; gap: 7px; }
.chip { height: 32px; padding: 0 13px; display: inline-flex; align-items: center; border: 1px solid var(--c-border); border-radius: 999px; color: var(--c-muted); font-size: 11px; font-weight: 800; background: var(--c-soft); }

/* ---------- toast ---------- */
@keyframes toastIn { from { opacity: 0; transform: translate(-50%, 10px); } to { opacity: 1; transform: translate(-50%, 0); } }
.toast { position: fixed; left: 50%; bottom: 24px; transform: translateX(-50%); z-index: 70; max-width: 330px; padding: 11px 18px; border-radius: 12px; background: var(--c-text); color: var(--c-surface); font-size: 12px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; opacity: 0; pointer-events: none; }
.toast.is-on { opacity: 1; animation: toastIn .2s var(--ease); }

/* ---------- DECO shell ---------- */
@keyframes sheetUp { from { transform: translate3d(0, 100%, 0); } to { transform: translate3d(0, 0, 0); } }
@keyframes dialogIn { from { opacity: 0; transform: translate(-50%, -46%) scale(.97); } to { opacity: 1; transform: translate(-50%, -50%) scale(1); } }
@keyframes decoCardEntrance { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }
@keyframes badgeIn { from { opacity: 0; transform: translate3d(0, -4px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
.deco-wrap { position: fixed; inset: 0; z-index: 1100; }
.deco-backdrop { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0,0,0,.6); animation: fadeIn .18s ease-out; }
.deco-panel { position: fixed; left: 0; right: 0; bottom: 0; z-index: 1101; max-height: 78vh; display: flex; flex-direction: column; overflow: hidden; background: var(--c-surface); border-radius: 22px 22px 0 0; animation: sheetUp .3s var(--ease); will-change: transform; }
.deco-grip { flex: none; display: grid; place-items: center; padding: 10px 0 0; }
.deco-grip::after { content: ''; width: 40px; height: 4px; border-radius: 4px; background: var(--c-line); }
.deco-head { flex: none; display: flex; align-items: center; gap: 9px; padding: 12px 18px; }
.deco-title { flex: none; font-size: 15px; font-weight: 800; letter-spacing: -.2px; color: var(--c-text); }

/* Neutral DECO Badges */
.deco-style { 
  flex: 0 1 auto; min-width: 0; padding: 4px 9px; border-radius: 7px; 
  background: var(--c-soft); color: var(--c-text); 
  font-size: 10.5px; font-weight: 800; letter-spacing: .4px; text-transform: uppercase; 
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 
  border: 1px solid var(--c-border); 
}
.deco-group { 
  flex: 1 1 auto; min-width: 0; text-align: right; padding: 4px 9px; border-radius: 7px; 
  background: var(--c-soft); color: var(--c-muted); 
  font-size: 10.5px; font-weight: 800; letter-spacing: .4px; text-transform: uppercase; 
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 
  border: 1px solid var(--c-border); 
  animation: badgeIn .3s ease both; 
}

/* Seamless Close Button */
.deco-x { 
  flex: none; width: 32px; height: 32px; border: 0; border-radius: 10px; 
  background: transparent; color: var(--c-muted); font-size: 14px; font-weight: 700; 
  transition: transform .09s ease, color .14s ease, background-color .14s ease; 
}
.deco-x:hover { background: var(--c-soft); color: var(--c-text); }
.deco-x:active { transform: scale(.93); }

.deco-list { flex: 1; overflow-y: auto; display: grid; gap: 8px; padding: 2px 18px 14px; scrollbar-width: none; }
.deco-list::-webkit-scrollbar { display: none; }
.deco-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; min-width: 0; box-sizing: border-box; padding: 10px 11px; border: 1px solid var(--c-border); border-radius: var(--r-md); background: var(--c-surface); will-change: transform, opacity; }
.deco-row.deco-anim { animation: decoCardEntrance .38s var(--ease) backwards; animation-delay: calc(var(--index, 0) * 35ms); }
.deco-out { flex: 1 1 auto; min-width: 0; font-size: 16px; text-align: center; line-height: 1.35; color: var(--c-text); white-space: normal; overflow-wrap: anywhere; word-break: break-word; overflow: hidden; padding: 0 5px; cursor: pointer; -webkit-tap-highlight-color: transparent; font-family: 'Times New Roman', Times, serif, system-ui, sans-serif; }
.deco-out:active { opacity: .72; }
.deco-n { flex-shrink: 0; padding: 3px 7px; border-radius: 7px; font-size: 10px; font-weight: 800; font-variant-numeric: tabular-nums; }
.deco-n.ok,
.deco-n.over {
  background: var(--c-soft);
  color: var(--c-muted);
}

/* Sky-Blue DECO Copy Button */
.deco-copy { 
  flex-shrink: 0; height: 32px; padding: 0 13px; 
  border: 1px solid #bae6fd; border-radius: 10px; 
  background: #e0f2fe; color: #0f172a; 
  font-size: 11px; font-weight: 800; 
  transition: transform .09s ease, background-color .14s ease, border-color .14s ease, color .14s ease; 
  -webkit-tap-highlight-color: transparent; 
}
.deco-copy:hover { background: #bae6fd; border-color: #7dd3fc; color: #0284c7; }
.deco-copy:active { transform: scale(.94); background: #7dd3fc; color: #0369a1; }

/* Dark Mode: Sky-Blue DECO Copy Button */
[data-theme="dark"] .deco-copy {
  background: rgba(56, 189, 248, 0.16);
  border: 1px solid rgba(56, 189, 248, 0.32);
  color: #e0f2fe;
}
[data-theme="dark"] .deco-copy:hover {
  background: rgba(56, 189, 248, 0.28);
  border-color: #38bdf8;
  color: #ffffff;
}
[data-theme="dark"] .deco-copy:active {
  background: #0284c7;
  color: #ffffff;
}

.deco-ad { border: 1px dashed var(--c-line); border-radius: var(--r-md); background: var(--c-tint); padding: 10px 11px; min-height: 54px; display: grid; place-items: center; animation: decoCardEntrance .38s var(--ease) backwards; }
.deco-ad .ad-slot { width: 100%; }
.deco-ad[data-ad-state="off"] { display: none !important; height: 0 !important; min-height: 0 !important; margin: 0 !important; padding: 0 !important; border: 0 !important; }
.deco-foot { flex: none; border-top: 1px solid var(--c-border); padding: 12px 18px 16px; }
.deco-count { text-align: center; margin-bottom: 9px; font-size: 11px; font-weight: 700; color: var(--c-faint); font-variant-numeric: tabular-nums; }

/* DECO Regenerate Button */
.deco-more { 
  width: 100%; height: 46px; display: flex; align-items: center; justify-content: center; gap: 8px; 
  border: 1.5px solid var(--c-green); border-radius: var(--r-md); 
  background: var(--c-green-t); color: var(--c-green); 
  font-size: 13.5px; font-weight: 800; 
  transition: transform .09s ease, background-color .16s ease, color .16s ease; 
  will-change: transform; 
}
.deco-more:hover { background: var(--c-green); color: #ffffff; }
.deco-more:active { transform: scale(.96); background: var(--c-green-d); color: #ffffff; }

[data-theme="dark"] .deco-more {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  color: var(--c-text);
}
[data-theme="dark"] .deco-more:hover {
  background: #ffffff;
  border-color: #ffffff;
  color: #090a0d;
}

.deco-more.is-done { background: var(--c-tint); border: 1px solid var(--c-hair); color: var(--c-dim); cursor: default; }
.deco-ico { display: inline-block; font-size: 13px; }
.deco-ico.is-spinning { animation: rotateIcon .4s var(--ease); }

/* ---------- desktop ---------- */
@media (min-width: 1024px) {
  .hdr-row, .gen-row, .preview-row, .rail, .rail-prog { max-width: 1440px; margin-left: auto; margin-right: auto; }
  .page { max-width: 1440px; margin: 0 auto; padding: 18px 22px 24px; }
  .stack { grid-template-columns: minmax(0, 1fr) 336px; gap: 22px; }
  .cgrid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
  .side { display: grid; gap: 14px; position: sticky; top: 130px; }
  .side-mobile { display: none; }
  .to-top { right: 24px; bottom: 24px; }
  .foot { max-width: 1440px; margin: 0 auto; padding: 20px 22px 28px; }
  .foot-cols { grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr) minmax(0, 1fr); gap: 34px; }
  .ad-lead { height: 90px; }
  .ad-sky { height: 600px; }
  .ad-bottom { height: 110px; }
  .deco-panel { left: 50%; right: auto; bottom: auto; top: 50%; width: 640px; max-width: calc(100vw - 64px); border-radius: var(--r-lg); transform: translate(-50%, -50%); animation: dialogIn .24s var(--ease); }
  .deco-backdrop { backdrop-filter: blur(7px); }
  .deco-grip { display: none; }
}

@media (min-width: 1024px) { .view[data-view="alt"] { max-width: 1440px; margin: 0 auto; } }
