/*! FileFortress kit 1.3 for web tools. Use: <link rel="stylesheet" href="ff-kit/kit.css">
   Everything is opt-in: ff- classes and --ff- variables only. See the kit page on FileFortress for every piece.
   Make it yours: every piece reads its own variables (--ff-btn-radius, --ff-card-pad...), set them on :root or on one
   element. The kit page lists them for each piece and has a panel that writes them for you.
   Font: Inter (SIL Open Font License, ff-kit/fonts/Inter-OFL.txt). Icons: Lucide-style shapes (ISC licence). */

@font-face { font-family: 'FF Inter'; font-style: normal; font-display: swap; font-weight: 100 900; src: url(fonts/inter-latin-ext-wght-normal.woff2) format('woff2');
  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF; }
@font-face { font-family: 'FF Inter'; font-style: normal; font-display: swap; font-weight: 100 900; src: url(fonts/inter-latin-wght-normal.woff2) format('woff2');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD; }

/* ---------- colors and sizes ---------- */
:root {
  --ff-brand: #e11d48; --ff-brand-soft: #fee2e2; --ff-brand-2: #f97316;
  --ff-bg: #150c16; --ff-chrome: #100912; --ff-surface: #1c1120; --ff-raised: #241729; --ff-high: #2d1e33;
  --ff-line: #2e2035; --ff-line-strong: #432f4c;
  --ff-text: #fff; --ff-text-2: rgba(255, 255, 255, .72); --ff-text-3: rgba(255, 255, 255, .45);
  --ff-success: #34d399; --ff-success-soft: #6ee7b7; --ff-warning: #fbbf24; --ff-warning-soft: #fcd34d;
  --ff-danger: #ef4444; --ff-danger-soft: #fca5a5;
  --ff-font: 'FF Inter', ui-sans-serif, system-ui, 'Segoe UI', Roboto, sans-serif;
  --ff-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ff-radius: 1rem; --ff-radius-sm: .75rem;
  --ff-page: var(--ff-bg);
  --ff-panel: var(--ff-surface); --ff-field: var(--ff-chrome); --ff-blur: none;
}
/* Fortress Glow: plum glass panels over pink and purple glows (kit.js sets data-ff-theme from the visitor's theme) */
:root[data-ff-theme='glow'] {
  --ff-line: rgba(255, 255, 255, .1); --ff-line-strong: rgba(236, 20, 128, .35);
  --ff-panel: rgba(30, 8, 40, .78); --ff-field: rgba(22, 5, 33, .72);
  --ff-page: radial-gradient(60rem 40rem at 10% -10%, rgba(225, 29, 72, .28), transparent 60%), radial-gradient(50rem 40rem at 100% 10%, rgba(147, 51, 234, .25), transparent 60%), #12081a;
}
/* Glass (and Glass 2): clear glass panels that blur what's behind them */
:root[data-ff-theme='glass'], :root[data-ff-theme='glass2'] {
  --ff-line: rgba(255, 255, 255, .14); --ff-line-strong: rgba(255, 255, 255, .24);
  --ff-panel: rgba(255, 255, 255, .06); --ff-field: rgba(255, 255, 255, .05); --ff-blur: blur(18px) saturate(1.4);
  --ff-radius: 1.25rem;
  --ff-page: radial-gradient(60rem 40rem at 10% -10%, rgba(225, 29, 72, .3), transparent 60%), radial-gradient(50rem 40rem at 100% 10%, rgba(147, 51, 234, .28), transparent 60%), #12081a;
}

/* Glass 2 (our "Glass Fortress 2"): Glass plus colored glass buttons: see-through pink -> purple glass with a glossy top
   half, a rim that catches the light and a sheen on hover; secondary buttons clear glass, primary white glass */
:root[data-ff-theme='glass2'] :is(.ff-btn-accent, .ff-btn-secondary, .ff-btn-primary, .ff-btn-gradient) {
  position: relative; isolation: isolate; overflow: hidden; border: 1px solid transparent;
  -webkit-backdrop-filter: blur(14px) saturate(180%); backdrop-filter: blur(14px) saturate(180%); transition: background .2s, box-shadow .2s, transform .1s; }
:root[data-ff-theme='glass2'] :is(.ff-btn-accent, .ff-btn-secondary, .ff-btn-primary, .ff-btn-gradient)::before { content: ''; position: absolute; inset: 0; z-index: -1; border-radius: inherit; pointer-events: none;
  background: linear-gradient(180deg, rgba(255, 255, 255, .3), rgba(255, 255, 255, .07) 48%, rgba(255, 255, 255, 0) 52%); }
:root[data-ff-theme='glass2'] :is(.ff-btn-accent, .ff-btn-secondary, .ff-btn-gradient)::after { content: ''; position: absolute; top: 0; bottom: 0; left: -70%; width: 45%; pointer-events: none;
  background: linear-gradient(100deg, transparent, rgba(255, 255, 255, .32), transparent); transform: skewX(-18deg); transition: left .6s ease; }
:root[data-ff-theme='glass2'] :is(.ff-btn-accent, .ff-btn-secondary, .ff-btn-gradient):hover::after { left: 125%; }
:root[data-ff-theme='glass2'] :is(.ff-btn-accent, .ff-btn-secondary, .ff-btn-primary, .ff-btn-gradient):active { transform: translateY(1px) scale(.985); }
:root[data-ff-theme='glass2'] :is(.ff-btn-accent, .ff-btn-gradient) { color: #fff; text-shadow: 0 1px 2px rgba(80, 0, 40, .45);
  background: linear-gradient(135deg, rgba(255, 60, 160, .58), rgba(236, 20, 128, .44) 45%, rgba(156, 80, 237, .52)) padding-box,
    linear-gradient(150deg, rgba(255, 236, 246, .95), rgba(255, 175, 220, .3) 28%, rgba(255, 255, 255, .02) 50%, rgba(255, 190, 230, .12) 72%, rgba(255, 205, 236, .55)) border-box;
  box-shadow: inset 0 -12px 18px -12px rgba(255, 130, 205, .6), 0 8px 26px -10px rgba(236, 20, 128, .75); }
:root[data-ff-theme='glass2'] :is(.ff-btn-accent, .ff-btn-gradient):hover {
  background: linear-gradient(135deg, rgba(255, 80, 172, .7), rgba(240, 35, 140, .56) 45%, rgba(170, 98, 248, .64)) padding-box,
    linear-gradient(150deg, #fff, rgba(255, 185, 225, .4) 28%, rgba(255, 255, 255, .04) 50%, rgba(255, 200, 235, .18) 72%, rgba(255, 215, 240, .7)) border-box;
  box-shadow: inset 0 -12px 18px -12px rgba(255, 150, 215, .7), 0 10px 32px -10px rgba(236, 20, 128, .9), 0 0 26px -8px rgba(156, 80, 237, .6); filter: none; }
:root[data-ff-theme='glass2'] .ff-btn-secondary { color: #fff;
  background: linear-gradient(135deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, .04) 45%, rgba(255, 255, 255, .09)) padding-box,
    linear-gradient(150deg, rgba(255, 255, 255, .75), rgba(255, 255, 255, .18) 28%, rgba(255, 255, 255, .02) 50%, rgba(255, 255, 255, .06) 72%, rgba(255, 255, 255, .35)) border-box;
  box-shadow: 0 8px 22px -14px rgba(0, 0, 0, .8); }
:root[data-ff-theme='glass2'] .ff-btn-secondary:hover {
  background: linear-gradient(135deg, rgba(255, 255, 255, .2), rgba(236, 20, 128, .1) 45%, rgba(156, 80, 237, .14)) padding-box,
    linear-gradient(150deg, rgba(255, 240, 248, .9), rgba(255, 170, 215, .3) 28%, rgba(255, 255, 255, .03) 50%, rgba(255, 190, 230, .12) 72%, rgba(255, 200, 235, .5)) border-box;
  box-shadow: 0 0 24px -8px rgba(236, 20, 128, .55); }
:root[data-ff-theme='glass2'] .ff-btn-primary { color: #150c16;
  background: linear-gradient(135deg, rgba(255, 255, 255, .92), rgba(255, 255, 255, .7)) padding-box, linear-gradient(150deg, #fff, rgba(255, 255, 255, .5) 40%, rgba(255, 210, 235, .8)) border-box;
  box-shadow: inset 0 -8px 14px -10px rgba(236, 20, 128, .35), 0 8px 24px -12px rgba(255, 255, 255, .45); }
@media (prefers-reduced-motion: reduce) { :root[data-ff-theme='glass2'] :is(.ff-btn-accent, .ff-btn-secondary, .ff-btn-gradient)::after { display: none; } }

/* fullscreen on FileFortress: our Exit button sits in the top-right corner, so that corner stays free. kit.js marks the page
   (html.ff-fullscreen) and --ff-safe-corner is the size to keep free (0 when not fullscreen). .ff-safe-corner moves an
   element out of it: put it on a bar or header that reaches the top-right edge. Only while fullscreen: otherwise the
   element keeps its own padding. */
:root { --ff-safe-corner: 0px; }
:root.ff-fullscreen { --ff-safe-corner: 64px; }
.ff-safe-corner { transition: padding-right .2s; }
.ff-fullscreen .ff-safe-corner { padding-right: max(var(--ff-safe-corner), 64px) !important; }

/* hidden always hides, also on kit pieces that set their own display (ff-stack, ff-row, ff-grid...) */
:where([class*='ff-'])[hidden] { display: none !important; }

/* ---------- page ---------- */
.ff-page { margin: 0; min-height: 100vh; background: var(--ff-page); background-attachment: fixed; color: var(--ff-text); font-family: var(--ff-font); font-size: 15px; line-height: 1.55; -webkit-font-smoothing: antialiased; }
.ff-page *, .ff-page *::before, .ff-page *::after { box-sizing: border-box; }
.ff-container { margin: 0 auto; width: min(1100px, calc(100% - 32px)); }
.ff-stack { display: flex; flex-direction: column; gap: 1rem; }
.ff-row { display: flex; flex-wrap: wrap; align-items: center; gap: .75rem; }
.ff-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr)); gap: 1rem; }
.ff-spacer { flex: 1; }

/* ---------- text ---------- */
.ff-title { margin: 0; font-size: clamp(1.75rem, 4vw, 2.6rem); font-weight: 900; line-height: 1.1; letter-spacing: -.02em; color: var(--ff-text); }
.ff-h2 { margin: 0; font-size: 1.25rem; font-weight: 800; line-height: 1.25; color: var(--ff-text); }
.ff-h3 { margin: 0; font-size: 1rem; font-weight: 700; color: var(--ff-text); }
.ff-eyebrow { margin: 0; font-size: .72rem; font-weight: 800; letter-spacing: .14em; text-transform: uppercase; color: var(--ff-brand-soft); }
.ff-muted { color: var(--ff-text-2); }
.ff-faint { color: var(--ff-text-3); }
.ff-small { font-size: .82rem; }
.ff-link { color: var(--ff-brand-soft); text-decoration: underline; text-underline-offset: 3px; }
.ff-link:hover { color: #fff; }
.ff-code { border-radius: .35rem; background: rgba(255, 255, 255, .08); padding: .05rem .35rem; font-family: var(--ff-mono); font-size: .88em; color: #fff; }
.ff-pre { margin: 0; overflow-x: auto; border-radius: var(--ff-radius-sm); border: 1px solid var(--ff-line); background: rgba(0, 0, 0, .35); padding: .9rem 1rem; font-family: var(--ff-mono); font-size: .82rem; line-height: 1.5; color: #e5e7eb; }
.ff-kbd { display: inline-block; border-radius: .35rem; border: 1px solid var(--ff-line-strong); border-bottom-width: 2px; background: var(--ff-raised); padding: .02rem .4rem; font-family: var(--ff-mono); font-size: .78em; color: #fff; }
.ff-divider { height: 1px; border: 0; margin: 1rem 0; background: var(--ff-line); }

/* ---------- surfaces ---------- */
.ff-card { border-radius: var(--ff-card-radius, var(--ff-radius)); border: 1px solid var(--ff-card-border, var(--ff-line)); background: var(--ff-card-bg, var(--ff-panel)); box-shadow: var(--ff-card-shadow, none); -webkit-backdrop-filter: var(--ff-blur); backdrop-filter: var(--ff-blur); color: var(--ff-text); }
.ff-card-body { padding: var(--ff-card-pad, 1.25rem); }
.ff-glass { border-radius: var(--ff-card-radius, var(--ff-radius)); border: 1px solid rgba(255, 255, 255, .12); background: rgba(255, 255, 255, var(--ff-glass-tint, .05)); -webkit-backdrop-filter: blur(var(--ff-glass-blur, 16px)) saturate(1.3); backdrop-filter: blur(var(--ff-glass-blur, 16px)) saturate(1.3); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .08), 0 20px 50px -25px rgba(0, 0, 0, .8); }

/* ---------- buttons ---------- */
.ff-btn { display: inline-flex; height: var(--ff-btn-height, 2.5rem); align-items: center; justify-content: center; gap: .5rem; white-space: nowrap; border-radius: var(--ff-btn-radius, var(--ff-radius-sm)); border: 1px solid transparent; padding: 0 var(--ff-btn-pad, 1rem); font: var(--ff-btn-weight, 600) .875rem/1 var(--ff-font); text-decoration: none; cursor: pointer; transition: background-color .15s, border-color .15s, color .15s, opacity .15s; }
.ff-btn:focus-visible { outline: 2px solid var(--ff-focus, var(--ff-brand)); outline-offset: 2px; }
.ff-btn:disabled, .ff-btn[aria-disabled='true'] { pointer-events: none; opacity: .4; }
.ff-btn-primary { background: #fff; color: var(--ff-bg); }
.ff-btn-primary:hover { background: rgba(255, 255, 255, .85); }
.ff-btn-accent { background: var(--ff-accent, var(--ff-brand)); color: var(--ff-accent-text, #fff); }
.ff-btn-accent:hover { background: color-mix(in srgb, var(--ff-accent, var(--ff-brand)) 82%, #fff); }
/* Glow and Glass: the main button is our pink -> purple pill, like on the site (your own --ff-accent still wins) */
:root[data-ff-theme] .ff-btn-accent { background: var(--ff-accent, linear-gradient(100deg, rgba(236, 20, 128, .95), rgba(156, 80, 237, .95))); box-shadow: 0 10px 30px -12px rgba(236, 20, 128, .6); }
:root[data-ff-theme] .ff-btn-accent:hover { background: var(--ff-accent, linear-gradient(100deg, #ff2d95, #a960f5)); }
.ff-btn-gradient { background: linear-gradient(135deg, var(--ff-brand), var(--ff-brand-2)); color: var(--ff-accent-text, #fff); }
.ff-btn-gradient:hover { filter: brightness(1.1); }
.ff-btn-secondary { border-color: var(--ff-line-strong); background: rgba(255, 255, 255, .03); color: rgba(255, 255, 255, .85); }
.ff-btn-secondary:hover { border-color: rgba(255, 255, 255, .25); background: rgba(255, 255, 255, .07); color: #fff; }
.ff-btn-quiet { background: transparent; color: rgba(255, 255, 255, .6); }
.ff-btn-quiet:hover { background: rgba(255, 255, 255, .06); color: #fff; }
.ff-btn-danger { border-color: color-mix(in srgb, var(--ff-danger) 30%, transparent); background: color-mix(in srgb, var(--ff-danger) 10%, transparent); color: var(--ff-danger-soft); }
.ff-btn-danger:hover { background: color-mix(in srgb, var(--ff-danger) 20%, transparent); }
.ff-btn-sm { height: 2rem; padding: 0 .75rem; font-size: .78rem; border-radius: .6rem; }
.ff-btn-lg { height: 3rem; padding: 0 1.4rem; font-size: 1rem; }
.ff-btn-icon { width: var(--ff-btn-height, 2.5rem); padding: 0; }
.ff-btn-block { width: 100%; }
.ff-btn-sm.ff-btn-icon { width: 2rem; }

/* ---------- forms ---------- */
.ff-field { display: flex; flex-direction: column; gap: .35rem; }
.ff-label { font-size: .82rem; font-weight: 600; color: rgba(255, 255, 255, .85); }
.ff-hint { font-size: .78rem; color: var(--ff-text-3); }
.ff-input { width: 100%; min-height: var(--ff-input-height, 2.5rem); border-radius: var(--ff-input-radius, var(--ff-radius-sm)); border: 1px solid var(--ff-input-border, var(--ff-line)); background: var(--ff-input-bg, var(--ff-field)); padding: .5rem .75rem; font: 400 .875rem/1.4 var(--ff-font); color: #fff; outline: none; transition: border-color .15s, box-shadow .15s; }
.ff-input::placeholder { color: rgba(255, 255, 255, .3); }
.ff-input:focus { border-color: color-mix(in srgb, var(--ff-focus, var(--ff-brand)) 60%, transparent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ff-focus, var(--ff-brand)) 20%, transparent); }
select.ff-input { appearance: none; padding-right: 2rem; background-image: url(icons/chevronDown.svg); background-repeat: no-repeat; background-position: right .6rem center; background-size: 1rem; }
textarea.ff-input { min-height: 6rem; resize: vertical; }
.ff-check { width: 1rem; height: 1rem; accent-color: var(--ff-brand); }
.ff-toggle { appearance: none; position: relative; width: 2.4rem; height: 1.35rem; flex: none; border-radius: 999px; background: rgba(255, 255, 255, .15); cursor: pointer; transition: background-color .2s; }
.ff-toggle::after { content: ''; position: absolute; left: .18rem; top: .18rem; width: 1rem; height: 1rem; border-radius: 50%; background: #fff; transition: transform .2s; }
.ff-toggle:checked { background: var(--ff-brand); }
.ff-toggle:checked::after { transform: translateX(1.05rem); }
.ff-toggle:focus-visible { outline: 2px solid var(--ff-brand); outline-offset: 2px; }
/* sliders: drawn by the kit, so they look the same in every browser (Opera GX, Firefox, Safari drew their own).
   The groove fills up to the bead: kit.js keeps --ff-range-p (0-1) in step; set a value from code? ffKit.updateRanges() */
.ff-range { --ff-range-thumb: 1.1rem; --ff-range-fill: linear-gradient(var(--ff-brand), var(--ff-brand));
  -webkit-appearance: none; appearance: none; display: block; width: 100%; height: 1.4rem; margin: 0; padding: 0; background: transparent; cursor: pointer; }
.ff-range::-webkit-slider-runnable-track { height: .4rem; border-radius: 999px;
  background: var(--ff-range-fill) 0 0 / calc(var(--ff-range-thumb) / 2 + var(--ff-range-p, 0) * (100% - var(--ff-range-thumb))) 100% no-repeat, rgba(255, 255, 255, .14);
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, .4); }
.ff-range::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: var(--ff-range-thumb); height: var(--ff-range-thumb); margin-top: calc((.4rem - var(--ff-range-thumb)) / 2);
  border: 0; border-radius: 50%; background: #fff; box-shadow: 0 2px 6px rgba(0, 0, 0, .45); transition: transform .12s; }
.ff-range:active::-webkit-slider-thumb { transform: scale(1.12); }
.ff-range::-moz-range-track { height: .4rem; border: 0; border-radius: 999px; background: rgba(255, 255, 255, .14); box-shadow: inset 0 1px 2px rgba(0, 0, 0, .4); }
.ff-range::-moz-range-progress { height: .4rem; border-radius: 999px; background: var(--ff-range-fill); }
.ff-range::-moz-range-thumb { width: var(--ff-range-thumb); height: var(--ff-range-thumb); border: 0; border-radius: 50%; background: #fff; box-shadow: 0 2px 6px rgba(0, 0, 0, .45); }
.ff-range:focus { outline: none; }
.ff-range:focus-visible::-webkit-slider-thumb { box-shadow: 0 0 0 3px color-mix(in srgb, var(--ff-focus, var(--ff-brand)) 45%, transparent), 0 2px 6px rgba(0, 0, 0, .45); }
.ff-range:focus-visible::-moz-range-thumb { box-shadow: 0 0 0 3px color-mix(in srgb, var(--ff-focus, var(--ff-brand)) 45%, transparent), 0 2px 6px rgba(0, 0, 0, .45); }
.ff-range:disabled { opacity: .45; cursor: default; }
/* Glow and Glass: the pink -> purple fill and a glass bead, like the site's own sliders */
:root[data-ff-theme] .ff-range { --ff-range-fill: linear-gradient(180deg, rgba(255, 255, 255, .3), rgba(255, 255, 255, 0) 60%), linear-gradient(100deg, rgba(236, 20, 128, .9), rgba(156, 80, 237, .9)); }
:root[data-ff-theme] .ff-range::-webkit-slider-thumb { border: 1px solid rgba(255, 255, 255, .75); background: radial-gradient(circle at 35% 30%, #fff, rgba(255, 255, 255, .85) 40%, rgba(255, 215, 238, .6) 75%);
  box-shadow: 0 2px 6px rgba(0, 0, 0, .45), 0 0 12px -2px rgba(236, 20, 128, .65), inset 0 -2px 3px rgba(236, 20, 128, .3); }
:root[data-ff-theme] .ff-range::-moz-range-thumb { border: 1px solid rgba(255, 255, 255, .75); background: radial-gradient(circle at 35% 30%, #fff, rgba(255, 255, 255, .85) 40%, rgba(255, 215, 238, .6) 75%);
  box-shadow: 0 2px 6px rgba(0, 0, 0, .45), 0 0 12px -2px rgba(236, 20, 128, .65); }

/* ---------- small pieces ---------- */
.ff-badge { display: inline-flex; align-items: center; gap: .25rem; white-space: nowrap; border-radius: var(--ff-badge-radius, .4rem); padding: .1rem .5rem; font-size: .7rem; font-weight: 700; background: rgba(255, 255, 255, .06); color: rgba(255, 255, 255, .75); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .12); }
.ff-badge-info { background: color-mix(in srgb, var(--ff-brand) 12%, transparent); color: var(--ff-brand-soft); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ff-brand) 28%, transparent); }
.ff-badge-success { background: color-mix(in srgb, var(--ff-success) 12%, transparent); color: var(--ff-success-soft); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ff-success) 28%, transparent); }
.ff-badge-warning { background: color-mix(in srgb, var(--ff-warning) 12%, transparent); color: var(--ff-warning-soft); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ff-warning) 28%, transparent); }
.ff-badge-danger { background: color-mix(in srgb, var(--ff-danger) 12%, transparent); color: var(--ff-danger-soft); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ff-danger) 28%, transparent); }
.ff-tabs { display: inline-flex; max-width: 100%; gap: .25rem; overflow-x: auto; border-radius: var(--ff-radius-sm); border: 1px solid var(--ff-line); background: var(--ff-field); padding: .25rem; }
.ff-tab { display: inline-flex; height: 2rem; flex: none; align-items: center; gap: .4rem; border: 0; border-radius: .55rem; background: none; padding: 0 .75rem; font: 600 .78rem/1 var(--ff-font); color: rgba(255, 255, 255, .55); cursor: pointer; }
.ff-tab:hover { color: #fff; background: rgba(255, 255, 255, .05); }
.ff-tab.is-on, .ff-tab[aria-selected='true'] { background: rgba(255, 255, 255, .1); color: #fff; }
.ff-alert { display: flex; align-items: flex-start; gap: .75rem; border-radius: var(--ff-radius-sm); border: 1px solid var(--ff-line); background: rgba(255, 255, 255, .03); padding: .75rem 1rem; font-size: .875rem; color: var(--ff-text-2); }
.ff-alert-info { border-color: color-mix(in srgb, var(--ff-brand) 30%, transparent); background: color-mix(in srgb, var(--ff-brand) 8%, transparent); color: var(--ff-brand-soft); }
.ff-alert-success { border-color: color-mix(in srgb, var(--ff-success) 30%, transparent); background: color-mix(in srgb, var(--ff-success) 8%, transparent); color: var(--ff-success-soft); }
.ff-alert-warning { border-color: color-mix(in srgb, var(--ff-warning) 30%, transparent); background: color-mix(in srgb, var(--ff-warning) 8%, transparent); color: var(--ff-warning-soft); }
.ff-alert-danger { border-color: color-mix(in srgb, var(--ff-danger) 30%, transparent); background: color-mix(in srgb, var(--ff-danger) 8%, transparent); color: var(--ff-danger-soft); }
[data-ff-tip] { position: relative; }
[data-ff-tip]::after { content: attr(data-ff-tip); position: absolute; left: 50%; bottom: calc(100% + .5rem); z-index: 50; width: max-content; max-width: 16rem; transform: translate(-50%, 4px); border-radius: .6rem; border: 1px solid var(--ff-line-strong); background: var(--ff-raised); padding: .4rem .6rem; font: 500 .75rem/1.35 var(--ff-font); color: #fff; white-space: normal; opacity: 0; pointer-events: none; transition: opacity .15s, transform .15s; box-shadow: 0 12px 30px -12px rgba(0, 0, 0, .8); }
[data-ff-tip]:hover::after, [data-ff-tip]:focus-visible::after { opacity: 1; transform: translate(-50%, 0); }

/* ---------- search bar, exactly like ours on Explore: one field, the Search button is its rounded end, and the x slides
   out from under it as one more segment while there's text   ==)x)Search)
   <div class="ff-search"> icon, input.ff-search-input (with a placeholder), button.ff-search-clear, button.ff-search-go
   The button's left side is a cut-out the shape of the field's rounded end (11 x 42 px, for the default size). ---------- */
.ff-search { --ff-search-end: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 42' preserveAspectRatio='none'%3E%3Crect x='-31' y='0' width='42' height='42' rx='11'/%3E%3C/svg%3E");
  position: relative; display: flex; height: var(--ff-search-height, 2.75rem); align-items: center; overflow: hidden; cursor: text;
  border-radius: var(--ff-search-radius, .75rem); border: 1px solid var(--ff-input-border, var(--ff-line)); background: var(--ff-input-bg, var(--ff-field)); transition: border-color .15s, box-shadow .15s; }
.ff-search:focus-within { border-color: color-mix(in srgb, var(--ff-focus, var(--ff-brand)) 60%, transparent); box-shadow: 0 0 0 2px color-mix(in srgb, var(--ff-focus, var(--ff-brand)) 20%, transparent); }
:root[data-ff-theme] .ff-search:focus-within { border-color: rgba(236, 20, 128, .7); box-shadow: 0 0 0 3px rgba(236, 20, 128, .18), 0 0 24px -6px rgba(236, 20, 128, .45); }
.ff-search > .ff-icon { position: absolute; left: .9rem; pointer-events: none; color: rgba(255, 255, 255, .35); }
.ff-search > .ff-search-input { height: 100%; width: 100%; min-width: 0; margin: 0; border: 0 !important; border-radius: 0; background: transparent !important; box-shadow: none !important; outline: none !important;
  padding: 0 calc(var(--ff-search-go, 7.5rem) + 3.5rem) 0 2.5rem; font: 400 .875rem var(--ff-font); color: #fff; -webkit-appearance: none; appearance: none; }
.ff-search > .ff-search-input::placeholder { color: rgba(255, 255, 255, .3); }
.ff-search > .ff-search-input::-webkit-search-cancel-button, .ff-search > .ff-search-input::-webkit-search-decoration { -webkit-appearance: none; appearance: none; display: none; }
.ff-search > .ff-search-go, .ff-search > .ff-search-clear {
  -webkit-mask: var(--ff-search-end) left center / 11px 100% no-repeat, linear-gradient(#000 0 0); -webkit-mask-composite: xor;
          mask: var(--ff-search-end) left center / 11px 100% no-repeat exclude, linear-gradient(#000 0 0); }
.ff-search > .ff-search-go { position: absolute; top: 0; right: 0; bottom: 0; z-index: 2; width: var(--ff-search-go, 7.5rem); border: 0; padding: 0 0 0 .7rem; cursor: pointer;
  background: var(--ff-accent, var(--ff-brand)); font: 600 .875rem var(--ff-font); color: var(--ff-accent-text, #fff); transition: background-color .15s; }
.ff-search > .ff-search-go:hover { background: color-mix(in srgb, var(--ff-accent, var(--ff-brand)) 82%, #fff); }
:root[data-ff-theme] .ff-search > .ff-search-go { background: linear-gradient(100deg, rgba(236, 20, 128, .95), rgba(156, 80, 237, .95)); }
.ff-search > .ff-search-clear { position: absolute; top: 0; bottom: 0; right: calc(var(--ff-search-go, 7.5rem) - 11px); z-index: 1; display: grid; width: calc(var(--ff-search-height, 2.75rem) + 11px); place-items: center; cursor: pointer;
  padding: 0; border: 0; border-radius: 0 11px 11px 0; background: rgba(255, 255, 255, .1); color: rgba(255, 255, 255, .8);
  opacity: 0; visibility: hidden; transform: translateX(var(--ff-search-height, 2.75rem));
  transition: opacity .18s ease, transform .26s cubic-bezier(.34, 1.4, .64, 1), visibility 0s linear .26s, background-color .15s, color .15s; }
.ff-search > .ff-search-input:not(:placeholder-shown) ~ .ff-search-clear { opacity: 1; visibility: visible; transform: none; transition-delay: 0s; }
.ff-search > .ff-search-clear:hover { background: rgba(255, 255, 255, .18); color: #fff; }
.ff-search > .ff-search-clear:focus-visible { outline: none; background: rgba(255, 255, 255, .22); color: #fff; }
/* no Search button: the x sits at the end */
.ff-search:not(:has(> .ff-search-go)) > .ff-search-clear { right: 0; width: var(--ff-search-height, 2.75rem); border-radius: 0; -webkit-mask: none; mask: none; }
.ff-search:not(:has(> .ff-search-go)) > .ff-search-input { padding-right: 3.25rem; }

/* ---------- on FileFortress: see-through, so the site's own background shows behind the tool and lines up with the
   rest of the page (kit.js sets html.ff-see-through when the page around the tool says it's FileFortress and the body
   is .ff-page). Fullscreen: there's no site behind it, so the kit's own background is back. data-ff-see-through="off"
   on <html> keeps the tool's own background everywhere. */
/* form controls are dark in every theme (the kit is dark): without this the browser drew a dropdown's option list in
   its light default while the tool's text is white, so the options were white on white (seen in the Winter theme) */
:root { color-scheme: dark; }
option, optgroup { background-color: var(--ff-raised); color: #fff; }
:root.ff-see-through { color-scheme: dark; }
:root.ff-see-through:not(.ff-fullscreen), :root.ff-see-through:not(.ff-fullscreen) .ff-page { background: transparent !important; }
:root.ff-see-through:not(.ff-fullscreen) body > .ff-backdrop { display: none; }

/* ---------- the FileFortress background (Fortress Glow): drifting glows, a moving grid and light bars ----------
   With kit.js it's there by itself when the visitor's theme is Fortress Glow or Glass (data-ff-backdrop="always" on
   <html> shows it in every theme, "off" never). Or place <div class="ff-backdrop"></div> yourself (kit.js fills it);
   add ff-backdrop-box to keep it inside its parent instead of behind the whole page. */
.ff-backdrop { position: fixed; inset: 0; z-index: -1; overflow: hidden; pointer-events: none; background: linear-gradient(160deg, #49052e 0%, #2a0730 45%, #160521 100%); }
.ff-backdrop-box { position: absolute; z-index: 0; border-radius: inherit; }
.ff-has-backdrop { background: #160521; }
.ff-has-backdrop .ff-page, .ff-page.ff-has-backdrop { background: transparent; }
.ff-bd-blob { position: absolute; border-radius: 50%; will-change: transform, opacity; }
.ff-bd-pink { left: -18vmax; top: -16vmax; width: 78vmax; height: 58vmax; background: radial-gradient(closest-side, rgba(236, 20, 128, .34), rgba(236, 20, 128, .12) 55%, transparent); animation: ff-bd-drift-a 16s ease-in-out infinite alternate; }
.ff-bd-purple { right: -20vmax; bottom: -22vmax; width: 84vmax; height: 62vmax; background: radial-gradient(closest-side, rgba(156, 80, 237, .36), rgba(156, 80, 237, .12) 55%, transparent); animation: ff-bd-drift-b 19s ease-in-out infinite alternate; }
.ff-bd-grid { position: absolute; inset: 0; overflow: hidden; -webkit-mask-image: radial-gradient(70% 55% at 55% 45%, #000 25%, transparent 80%); mask-image: radial-gradient(70% 55% at 55% 45%, #000 25%, transparent 80%); }
.ff-bd-grid::before { content: ''; position: absolute; inset: -44px 0 0 -44px; will-change: transform; background-image: linear-gradient(rgba(255, 255, 255, .045) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, .045) 1px, transparent 1px); background-size: 44px 44px; animation: ff-bd-grid 30s linear infinite; }
.ff-bd-shards { position: absolute; display: flex; gap: var(--gap); will-change: transform; --w: clamp(56px, 8vw, 140px); --gap: calc(var(--w) * .2); }
.ff-bd-shards-pink { left: 4.5vw; top: -12vh; align-items: flex-start; transform: skewX(-12deg); transform-origin: 0 0; animation: ff-bd-float-a 12s ease-in-out infinite; }
.ff-bd-shards-purple { right: 6vw; bottom: -12vh; align-items: flex-end; flex-direction: row-reverse; transform: skewX(-12deg); transform-origin: 100% 100%; animation: ff-bd-float-b 14s ease-in-out infinite; }
.ff-bd-shard { flex: none; border-radius: 6px; will-change: opacity; }
.ff-bd-shards-pink .ff-bd-shard { background: linear-gradient(#ec1480, rgba(236, 20, 128, 0)); }
.ff-bd-shards-purple .ff-bd-shard { background: linear-gradient(0deg, #9c50ed, rgba(156, 80, 237, 0)); }
.ff-bd-shard-1 { width: var(--w); height: clamp(260px, 60vh, 640px); animation: ff-bd-shimmer 10s ease-in-out infinite; }
.ff-bd-shard-2 { width: calc(var(--w) * .38); height: clamp(220px, 52vh, 560px); animation: ff-bd-shimmer 12s ease-in-out -5s infinite; }
.ff-bd-shard-3 { width: calc(var(--w) * 1.1); height: clamp(270px, 64vh, 680px); animation: ff-bd-shimmer 11s ease-in-out -3s infinite; }
.ff-bd-shard-4 { width: calc(var(--w) * .4); height: clamp(220px, 52vh, 560px); animation: ff-bd-shimmer 13s ease-in-out -9s infinite; }
/* in a box: everything sized to the box instead of the screen */
.ff-backdrop-box .ff-bd-pink { left: -30%; top: -45%; width: 110%; height: 120%; }
.ff-backdrop-box .ff-bd-purple { right: -30%; bottom: -50%; width: 120%; height: 130%; }
.ff-backdrop-box .ff-bd-grid { -webkit-mask-image: radial-gradient(80% 70% at 55% 45%, #000 30%, transparent 85%); mask-image: radial-gradient(80% 70% at 55% 45%, #000 30%, transparent 85%); }
.ff-backdrop-box .ff-bd-shards { --w: 44px; height: 100%; }
.ff-backdrop-box .ff-bd-shards-pink { left: 5%; top: -12%; }
.ff-backdrop-box .ff-bd-shards-purple { right: 6%; bottom: -12%; top: auto; }
.ff-backdrop-box .ff-bd-shard-1, .ff-backdrop-box .ff-bd-shard-3 { height: 85%; }
.ff-backdrop-box .ff-bd-shard-2, .ff-backdrop-box .ff-bd-shard-4 { height: 70%; }
@keyframes ff-bd-drift-a { 0% { transform: translate(0, 0) scale(1); opacity: .85; } 50% { opacity: 1; } 100% { transform: translate(14vw, 10vh) scale(1.25); opacity: .9; } }
@keyframes ff-bd-drift-b { 0% { transform: translate(0, 0) scale(1.1); opacity: 1; } 50% { opacity: .8; } 100% { transform: translate(-15vw, -11vh) scale(.92); opacity: .95; } }
@keyframes ff-bd-grid { to { transform: translate(44px, 44px); } }
@keyframes ff-bd-float-a { 0%, 100% { transform: translateY(0) skewX(-12deg); } 50% { transform: translateY(4vh) skewX(-12deg); } }
@keyframes ff-bd-float-b { 0%, 100% { transform: translateY(0) skewX(-12deg); } 50% { transform: translateY(-4vh) skewX(-12deg); } }
@keyframes ff-bd-shimmer { 0%, 100% { opacity: .18; } 50% { opacity: .34; } }
@media (prefers-reduced-motion: reduce) { .ff-backdrop * { animation: none !important; } }

/* ---------- resource cards, versioned: a version never changes; a new look gets a new number ----------
   v1: the classic card (picture on top, a panel with category, title, creator and numbers). .ff-res = .ff-res-v1. */
.ff-res, .ff-res-v1 { position: relative; display: flex; flex-direction: column; overflow: hidden; border-radius: var(--ff-res-radius, var(--ff-radius-sm)); border: 1px solid var(--ff-card-border, var(--ff-line)); background: var(--ff-card-bg, var(--ff-panel)); color: var(--ff-text); text-decoration: none; transition: border-color .15s, transform .15s; }
a.ff-res:hover, a.ff-res-v1:hover, .ff-res-link:hover { border-color: rgba(255, 255, 255, .22); transform: translateY(-2px); }
.ff-res-thumb { position: relative; aspect-ratio: var(--ff-res-ratio, 16 / 9); overflow: hidden; border-bottom: 1px solid var(--ff-line); background: var(--ff-chrome); }
.ff-res-thumb > img { position: absolute; inset: 0; height: 100%; width: 100%; object-fit: cover; transition: transform .5s; }
a.ff-res:hover .ff-res-thumb > img, a.ff-res-v1:hover .ff-res-thumb > img { transform: scale(1.03); }
.ff-res-thumb::after { content: ''; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(0, 0, 0, .05), rgba(0, 0, 0, .35)); pointer-events: none; }
.ff-res-badges { position: absolute; left: .5rem; top: .5rem; z-index: 1; display: flex; flex-wrap: wrap; gap: .3rem; }
.ff-res-badges .ff-badge { background: rgba(10, 6, 14, .72); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); }
.ff-res-body { display: flex; flex: 1; flex-direction: column; padding: var(--ff-res-pad, .9rem); }
.ff-res-kicker { margin: 0 0 .45rem; font-size: .62rem; font-weight: 800; letter-spacing: .14em; text-transform: uppercase; color: var(--ff-text-3); }
.ff-res-title { margin: 0 0 .55rem; display: -webkit-box; overflow: hidden; -webkit-line-clamp: 2; -webkit-box-orient: vertical; font-size: .9rem; font-weight: 600; line-height: 1.25rem; color: #fff; }
.ff-res-by { display: flex; align-items: center; gap: .45rem; font-size: .75rem; color: var(--ff-text-2); }
.ff-res-foot { margin-top: auto; display: flex; align-items: center; justify-content: space-between; gap: .5rem; border-top: 1px solid var(--ff-line); padding-top: .6rem; margin-top: .75rem; font-size: .72rem; color: var(--ff-text-3); }
.ff-res-stats { display: flex; gap: .75rem; }
.ff-res-stats > span { display: inline-flex; align-items: center; gap: .25rem; }

/* v2: the current card, video-site style. A big picture with badges, numbers and the program on it, Like / Copy link /
   Share on its right edge (on hover), and under it the creator's avatar next to title, creator and "time · category".
   <article class="ff-res-v2"> .ff-res-v2-pic (img, .ff-res-badges, .ff-res-v2-stats, .ff-res-v2-actions), .ff-res-v2-info */
.ff-res-v2 { position: relative; display: flex; min-width: 0; flex-direction: column; color: var(--ff-text); }
.ff-res-v2-pic { position: relative; aspect-ratio: var(--ff-res-ratio, 16 / 9); overflow: hidden; border-radius: var(--ff-res-radius, .75rem); background: var(--ff-chrome); box-shadow: 0 0 0 1px var(--ff-line); transition: box-shadow .15s; }
.ff-res-v2:hover .ff-res-v2-pic { box-shadow: 0 0 0 1px var(--ff-line-strong); }
.ff-res-v2-pic > img { position: absolute; inset: 0; height: 100%; width: 100%; object-fit: cover; transition: transform .5s; }
.ff-res-v2:hover .ff-res-v2-pic > img { transform: scale(1.04); }
.ff-res-v2-pic::after { content: ''; position: absolute; inset: 50% 0 0; background: linear-gradient(0deg, rgba(0, 0, 0, .85), rgba(0, 0, 0, .45) 50%, transparent); pointer-events: none; }
.ff-res-v2-stats { position: absolute; left: .75rem; right: .75rem; bottom: .6rem; z-index: 2; display: flex; align-items: center; gap: .75rem; font-size: .75rem; font-weight: 600; color: rgba(255, 255, 255, .9); pointer-events: none; }
.ff-res-v2-stats > span { display: inline-flex; align-items: center; gap: .25rem; font-variant-numeric: tabular-nums; }
.ff-res-v2-prog { margin-left: auto; border-radius: .35rem; background: rgba(0, 0, 0, .6); padding: .1rem .4rem; font-size: .62rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; color: #fff; }
.ff-res-v2-actions { position: absolute; right: .6rem; top: .6rem; z-index: 3; display: flex; flex-direction: column; gap: .4rem; transition: opacity .15s; }
@media (hover: hover) { .ff-res-v2-actions { opacity: 0; } .ff-res-v2:hover .ff-res-v2-actions, .ff-res-v2:focus-within .ff-res-v2-actions { opacity: 1; } }
.ff-res-v2-act { display: grid; height: 2rem; width: 2rem; place-items: center; border: 0; border-radius: 999px; background: rgba(0, 0, 0, .65); color: #fff; cursor: pointer; -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); transition: background-color .15s, color .15s; }
.ff-res-v2-act:hover { background: rgba(0, 0, 0, .85); }
.ff-res-v2-act.is-on, .ff-res-v2-act[aria-pressed='true'] { color: #f472b6; }
.ff-res-v2-info { margin-top: .75rem; display: flex; min-width: 0; gap: .75rem; }
.ff-res-v2-info > .ff-avatar { --ff-avatar-size: 2.25rem; }
.ff-res-v2-title { margin: 0; display: -webkit-box; overflow: hidden; -webkit-line-clamp: 2; -webkit-box-orient: vertical; font-size: .94rem; font-weight: 600; line-height: 1.25rem; color: #fff; }
.ff-res-v2-title a { color: inherit; text-decoration: none; }
.ff-res-v2-title a::after { content: ''; position: absolute; inset: 0; z-index: 1; } /* the whole card is the link; the action buttons sit above it */
.ff-res-v2-by { margin: .25rem 0 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .8rem; color: var(--ff-text-2); }
.ff-res-v2-meta { margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .8rem; color: var(--ff-text-3); }

/* ---------- roadmap: done / now / next. <ol class="ff-road"> with li.ff-road-step (+ is-done / is-now; later ones plain):
   .ff-road-dot (an icon), .ff-road-when, a heading and a line. Wide: one row on one line, green -> yellow -> gray
   (kit.js sets --ff-road-steps and --ff-road-now; set them yourself without kit.js). ---------- */
.ff-road { position: relative; margin: 0; padding: 0; list-style: none; display: grid; gap: 1.6rem 1rem; grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); }
@media (min-width: 900px) {
  .ff-road { grid-template-columns: repeat(var(--ff-road-steps, 5), minmax(0, 1fr)); column-gap: 0; }
  .ff-road::before { content: ''; position: absolute; left: 0; right: 0; top: 0; height: 2px; border-radius: 2px;
    background: linear-gradient(90deg, var(--ff-success) 0%,
      var(--ff-success) calc((var(--ff-road-now, 2) - 1) / var(--ff-road-steps, 5) * 100% - 9%),
      var(--ff-warning) calc((var(--ff-road-now, 2) - 1) / var(--ff-road-steps, 5) * 100% + 1%),
      var(--ff-warning) calc(var(--ff-road-now, 2) / var(--ff-road-steps, 5) * 100% - 9%),
      rgba(255, 255, 255, .12) calc(var(--ff-road-now, 2) / var(--ff-road-steps, 5) * 100% + 3%), rgba(255, 255, 255, .12) 100%); }
  .ff-road .ff-road-step { border-top-color: transparent !important; padding-right: 1.25rem; }
}
.ff-road-step { position: relative; border-top: 2px solid rgba(255, 255, 255, .1); padding-top: 1.4rem; }
.ff-road-step h3, .ff-road-step h4 { margin: .2rem 0 0; font-size: 1rem; font-weight: 800; color: #fff; }
.ff-road-step p { margin: .3rem 0 0; font-size: .875rem; line-height: 1.45rem; color: rgba(255, 255, 255, .55); }
.ff-road-step p.ff-road-when { margin: 0; font-size: .7rem; font-weight: 900; line-height: 1rem; letter-spacing: .14em; text-transform: uppercase; color: rgba(255, 255, 255, .4); }
.ff-road-dot { position: absolute; top: -.85rem; left: 0; display: grid; height: 1.6rem; width: 1.6rem; place-items: center; border-radius: 50%; border: 2px solid rgba(255, 255, 255, .2); background: var(--ff-surface); color: rgba(255, 255, 255, .5); font-size: .8rem; }
.ff-road-step.is-done { border-top-color: color-mix(in srgb, var(--ff-success) 60%, transparent); }
.ff-road-step.is-done .ff-road-dot { border-color: var(--ff-success); color: var(--ff-success-soft); }
.ff-road-step.is-done .ff-road-when { color: var(--ff-success-soft); }
.ff-road-step.is-now { border-top-color: var(--ff-warning); }
.ff-road-step.is-now .ff-road-dot { border-color: var(--ff-warning); color: var(--ff-warning); box-shadow: 0 0 14px -2px var(--ff-warning); }
.ff-road-step.is-now .ff-road-when { color: var(--ff-warning-soft); }

/* ---------- our promise: <ul class="ff-promises"> li: .ff-promise-icon (an icon), b, p ---------- */
.ff-promises { margin: 0; padding: 0; list-style: none; display: grid; gap: 1rem 1.5rem; grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr)); }
.ff-promises > li { border-left: 2px solid color-mix(in srgb, var(--ff-promise, var(--ff-success)) 45%, transparent); padding-left: .9rem; }
.ff-promises b { display: block; margin-top: .45rem; color: #fff; }
.ff-promises p { margin: .2rem 0 0; font-size: .85rem; line-height: 1.4rem; color: rgba(255, 255, 255, .58); }
.ff-promise-icon { display: inline-grid; height: 1.9rem; width: 1.9rem; place-items: center; border-radius: .6rem; background: color-mix(in srgb, var(--ff-promise, var(--ff-success)) 14%, transparent); color: var(--ff-promise, var(--ff-success-soft)); }

/* ---------- code window: <div class="ff-win"> .ff-win-bar (<i></i><i></i><i></i><span>name</span>), then .ff-win-code.
   Color words yourself with .ff-c-tag / .ff-c-attr / .ff-c-str / .ff-c-com ---------- */
.ff-win { min-width: 0; overflow: hidden; border-radius: .9rem; border: 1px solid rgba(255, 255, 255, .09); background: rgba(10, 6, 14, .72); box-shadow: 0 20px 50px -30px rgba(0, 0, 0, .9); }
.ff-win-bar { display: flex; align-items: center; gap: .35rem; border-bottom: 1px solid rgba(255, 255, 255, .07); background: rgba(255, 255, 255, .03); padding: .5rem .8rem; }
.ff-win-bar > i { height: .6rem; width: .6rem; flex: none; border-radius: 50%; background: #ef4444; }
.ff-win-bar > i:nth-child(2) { background: #fbbf24; } .ff-win-bar > i:nth-child(3) { background: #34d399; }
.ff-win-bar > span { margin-left: .5rem; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--ff-mono); font-size: .72rem; color: rgba(255, 255, 255, .45); }
.ff-win-bar > .ff-btn { margin-left: auto; }
.ff-win-code { margin: 0; overflow: auto; padding: 1rem 1.1rem; font-family: var(--ff-mono); font-size: .78rem; line-height: 1.6; color: rgba(255, 255, 255, .85); white-space: pre; }
.ff-c-tag { color: #f9a8d4; } .ff-c-attr { color: #93c5fd; } .ff-c-str { color: #fcd34d; } .ff-c-com { color: rgba(255, 255, 255, .38); }

/* ---------- top bar, like ours on the site: <header class="ff-topbar"> with .ff-topbar-brand, .ff-topbar-sep (a
   divider), .ff-topbar-links holding .ff-topbar-link (+ is-on / aria-current="page", an icon), .ff-topbar-end for
   buttons on the right. ff-topbar-sm: the smaller one (it sits under our bar on the asset page). data-ff-show on the
   links switches panels with kit.js, like tabs. Narrow screens: the links scroll sideways. ---------- */
.ff-topbar { display: flex; align-items: center; gap: .25rem; min-height: var(--ff-topbar-height, 3.5rem); padding: 0 var(--ff-topbar-pad, .6rem);
  border-radius: var(--ff-topbar-radius, 1rem); border: 1px solid var(--ff-line); background: var(--ff-topbar-bg, var(--ff-chrome));
  box-shadow: 0 20px 60px -30px rgba(0, 0, 0, .9); -webkit-backdrop-filter: var(--ff-blur); backdrop-filter: var(--ff-blur); color: var(--ff-text); font-family: var(--ff-font); }
:root[data-ff-theme='glow'] .ff-topbar { --ff-topbar-bg: rgba(26, 7, 36, .72); box-shadow: 0 20px 60px -30px rgba(0, 0, 0, .9), inset 0 1px 0 rgba(255, 255, 255, .05); }
:root[data-ff-theme='glass'] .ff-topbar, :root[data-ff-theme='glass2'] .ff-topbar { --ff-topbar-bg: rgba(255, 255, 255, .06); }
.ff-topbar-sm { --ff-topbar-height: 2.85rem; --ff-topbar-radius: .9rem; --ff-topbar-pad: .4rem; }
.ff-topbar-brand { display: inline-flex; flex: none; align-items: center; gap: .5rem; padding: 0 .5rem; font-size: .95rem; font-weight: 800; letter-spacing: -.02em; white-space: nowrap; color: #fff; text-decoration: none; }
.ff-topbar-brand .ff-icon { width: 1.15rem; height: 1.15rem; color: var(--ff-brand); }
.ff-topbar-sm .ff-topbar-brand { font-size: .88rem; }
.ff-topbar-sep { flex: none; width: 1px; height: 1.4rem; margin: 0 .35rem; background: var(--ff-line-strong); }
.ff-topbar-sm .ff-topbar-sep { height: 1.15rem; }
.ff-topbar-links { display: flex; min-width: 0; align-items: center; gap: .15rem; overflow-x: auto; scrollbar-width: none; }
.ff-topbar-links::-webkit-scrollbar { display: none; }
.ff-topbar-link { display: inline-flex; flex: none; align-items: center; gap: .4rem; height: 2.25rem; border: 0; border-radius: .6rem; background: none; padding: 0 .75rem;
  font: 500 .85rem/1 var(--ff-font); color: rgba(255, 255, 255, .6); white-space: nowrap; text-decoration: none; cursor: pointer; transition: background .15s, color .15s; }
.ff-topbar-sm .ff-topbar-link { height: 1.95rem; padding: 0 .6rem; font-size: .8rem; }
.ff-topbar-link .ff-icon { width: .95rem; height: .95rem; }
.ff-topbar-link:hover { color: #fff; background: rgba(255, 255, 255, .05); }
.ff-topbar-link.is-on, .ff-topbar-link[aria-current='page'], .ff-topbar-link[aria-selected='true'] { color: #fff; background: rgba(255, 255, 255, .1); }
:root[data-ff-theme='glow'] .ff-topbar-link.is-on, :root[data-ff-theme='glow'] .ff-topbar-link[aria-current='page'], :root[data-ff-theme='glow'] .ff-topbar-link[aria-selected='true'] {
  background: linear-gradient(100deg, rgba(236, 20, 128, .22), rgba(156, 80, 237, .22)); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .1); }
.ff-topbar-end { display: flex; flex: none; align-items: center; gap: .4rem; margin-left: auto; padding-left: .35rem; }

/* ---------- sidebar, like our desktop app's: <div class="ff-shell"> with <aside class="ff-sidebar"> and <main>.
   Inside: .ff-side-brand, .ff-side-group (a small label), .ff-side-item (+ is-on / aria-current="page", an icon, a
   .ff-side-count), .ff-side-spacer, .ff-side-foot. On narrow screens the sidebar becomes a row along the top.
   data-ff-show="#panel" on the items switches panels with kit.js. ---------- */
.ff-shell { display: grid; min-height: var(--ff-shell-height, 100vh); grid-template-columns: var(--ff-sidebar-width, 15rem) minmax(0, 1fr); }
.ff-shell > main, .ff-shell > .ff-shell-main { min-width: 0; padding: var(--ff-shell-pad, 1.5rem); }
.ff-sidebar { display: flex; min-height: 0; flex-direction: column; gap: 2px; border-right: 1px solid var(--ff-line); background: var(--ff-sidebar-bg, var(--ff-chrome)); padding: 1rem .75rem .75rem; -webkit-backdrop-filter: var(--ff-blur); backdrop-filter: var(--ff-blur); }
:root[data-ff-theme] .ff-sidebar { background: var(--ff-sidebar-bg, rgba(16, 4, 24, .5)); -webkit-backdrop-filter: blur(16px) saturate(1.3); backdrop-filter: blur(16px) saturate(1.3); }
.ff-side-brand { display: flex; align-items: center; gap: .6rem; padding: .1rem .4rem .8rem; font-size: 1.05rem; font-weight: 900; letter-spacing: -.01em; color: #fff; }
.ff-side-brand > .ff-icon, .ff-side-brand > img { height: 1.6rem; width: 1.6rem; flex: none; color: var(--ff-brand); }
.ff-side-group { margin: .9rem .6rem .35rem; font-size: .68rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; color: var(--ff-text-3); }
.ff-side-item { position: relative; display: flex; height: var(--ff-side-item-height, 2.5rem); align-items: center; gap: .75rem; border: 0; border-radius: .65rem; background: transparent; padding: 0 .75rem; font: 600 .9rem var(--ff-font); color: var(--ff-text-2); text-align: left; text-decoration: none; cursor: pointer; transition: background-color .15s, color .15s; }
.ff-side-item:hover { background: rgba(255, 255, 255, .06); color: #fff; }
.ff-side-item.is-on, .ff-side-item[aria-current='page'] { background: color-mix(in srgb, var(--ff-brand) 16%, transparent); color: #fff; }
.ff-side-item.is-on::before, .ff-side-item[aria-current='page']::before { content: ''; position: absolute; left: -.5rem; top: .55rem; bottom: .55rem; width: 3px; border-radius: 0 3px 3px 0; background: var(--ff-brand); }
.ff-side-item.is-on > .ff-icon, .ff-side-item[aria-current='page'] > .ff-icon { color: var(--ff-brand); }
.ff-side-item:focus-visible { outline: 2px solid var(--ff-focus, var(--ff-brand)); outline-offset: -2px; }
.ff-side-count { margin-left: auto; display: inline-flex; min-width: 1.25rem; height: 1.25rem; align-items: center; justify-content: center; border-radius: 999px; background: var(--ff-brand); padding: 0 .4rem; font-size: .68rem; font-weight: 800; color: #fff; }
.ff-side-spacer { flex: 1; min-height: .5rem; }
.ff-side-foot { display: flex; flex-wrap: wrap; gap: .25rem .9rem; padding: .25rem .5rem; font-size: .75rem; color: var(--ff-text-3); }
.ff-side-foot a { color: inherit; } .ff-side-foot a:hover { color: #fff; }
@media (max-width: 720px) {
  .ff-shell { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto 1fr; }
  .ff-sidebar { flex-direction: row; align-items: center; overflow-x: auto; border-right: 0; border-bottom: 1px solid var(--ff-line); padding: .5rem .75rem; }
  .ff-side-brand { flex: none; padding: 0 .5rem 0 .25rem; white-space: nowrap; }
  .ff-side-group, .ff-side-spacer, .ff-side-foot { display: none; }
  .ff-side-item { flex: none; }
  .ff-side-item.is-on::before, .ff-side-item[aria-current='page']::before { display: none; }
}

/* ---------- stat, empty state, avatar, chips ---------- */
.ff-stat { display: flex; flex-direction: column; gap: .2rem; border-radius: var(--ff-card-radius, var(--ff-radius)); border: 1px solid var(--ff-card-border, var(--ff-line)); background: var(--ff-card-bg, var(--ff-panel)); padding: var(--ff-card-pad, 1.25rem); }
.ff-stat-top { display: flex; align-items: center; justify-content: space-between; gap: .5rem; font-size: .78rem; font-weight: 600; color: var(--ff-text-2); }
.ff-stat-top .ff-icon { color: var(--ff-brand-soft); }
.ff-stat-value { font-size: 1.75rem; font-weight: 900; letter-spacing: -.02em; color: #fff; }
.ff-stat-meta { font-size: .75rem; color: var(--ff-text-3); }
.ff-empty { display: flex; flex-direction: column; align-items: center; gap: .5rem; border-radius: var(--ff-card-radius, var(--ff-radius)); border: 1px dashed var(--ff-line-strong); padding: 2.5rem 1.5rem; text-align: center; }
.ff-empty-icon { display: grid; height: 3rem; width: 3rem; place-items: center; border-radius: 1rem; background: color-mix(in srgb, var(--ff-brand) 14%, transparent); color: var(--ff-brand-soft); font-size: 1.3rem; }
.ff-empty-title { margin: .25rem 0 0; font-weight: 700; color: #fff; }
.ff-empty-text { margin: 0; max-width: 24rem; font-size: .85rem; color: var(--ff-text-2); }
.ff-avatar { display: inline-grid; height: var(--ff-avatar-size, 2rem); width: var(--ff-avatar-size, 2rem); flex: none; place-items: center; overflow: hidden; border-radius: 999px; background: linear-gradient(135deg, var(--ff-brand), var(--ff-brand-2)); font-size: .75rem; font-weight: 800; color: #fff; }
.ff-avatar > img { height: 100%; width: 100%; object-fit: cover; }
.ff-avatar-sm { --ff-avatar-size: 1.4rem; font-size: .6rem; }
.ff-chip { display: inline-flex; align-items: center; gap: .35rem; border-radius: 999px; border: 1px solid var(--ff-line-strong); background: rgba(255, 255, 255, .04); padding: .25rem .7rem; font-size: .78rem; font-weight: 600; color: var(--ff-text-2); }
button.ff-chip { cursor: pointer; font-family: var(--ff-font); }
button.ff-chip:hover { color: #fff; border-color: rgba(255, 255, 255, .3); }
.ff-chip.is-on { border-color: color-mix(in srgb, var(--ff-brand) 60%, transparent); background: color-mix(in srgb, var(--ff-brand) 14%, transparent); color: #fff; }

/* ---------- lists, fold-outs, progress, loading ---------- */
.ff-list { margin: 0; padding: 0; list-style: none; overflow: hidden; border-radius: var(--ff-card-radius, var(--ff-radius)); border: 1px solid var(--ff-card-border, var(--ff-line)); background: var(--ff-card-bg, var(--ff-panel)); }
.ff-list-row { display: flex; align-items: center; gap: .75rem; padding: .75rem 1rem; color: var(--ff-text); }
.ff-list-row + .ff-list-row { border-top: 1px solid var(--ff-line); }
a.ff-list-row { text-decoration: none; }
a.ff-list-row:hover { background: rgba(255, 255, 255, .04); }
.ff-details { border-radius: var(--ff-radius-sm); border: 1px solid var(--ff-line); background: rgba(255, 255, 255, .02); }
.ff-details > summary { display: flex; cursor: pointer; list-style: none; align-items: center; gap: .6rem; padding: .8rem 1rem; font-weight: 600; color: #fff; }
.ff-details > summary::-webkit-details-marker { display: none; }
.ff-details > summary::after { content: '+'; margin-left: auto; font-size: 1.2rem; font-weight: 400; color: var(--ff-text-3); }
.ff-details[open] > summary::after { content: '\2013'; }
.ff-details > :not(summary) { margin: 0; padding: 0 1rem 1rem; color: var(--ff-text-2); font-size: .9rem; }
.ff-progress { height: var(--ff-progress-height, .5rem); overflow: hidden; border-radius: 999px; background: rgba(255, 255, 255, .08); }
.ff-progress > span { display: block; height: 100%; width: var(--ff-progress, 0%); border-radius: 999px; background: linear-gradient(90deg, var(--ff-brand), var(--ff-brand-2)); transition: width .3s; }
.ff-skeleton { border-radius: .5rem; background: linear-gradient(90deg, rgba(255, 255, 255, .05) 25%, rgba(255, 255, 255, .11) 50%, rgba(255, 255, 255, .05) 75%); background-size: 200% 100%; animation: ff-shimmer 1.4s linear infinite; }
@keyframes ff-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
@media (prefers-reduced-motion: reduce) { .ff-skeleton { animation: none; } }

/* ---------- drop zone and dialog ---------- */
.ff-dropzone { display: flex; cursor: pointer; flex-direction: column; align-items: center; justify-content: center; gap: .5rem; border-radius: var(--ff-card-radius, var(--ff-radius)); border: 2px dashed var(--ff-line-strong); background: rgba(255, 255, 255, .02); padding: 2rem 1.5rem; text-align: center; color: var(--ff-text-2); transition: border-color .15s, background-color .15s; }
.ff-dropzone:hover, .ff-dropzone.is-over { border-color: color-mix(in srgb, var(--ff-brand) 60%, transparent); background: color-mix(in srgb, var(--ff-brand) 6%, transparent); }
.ff-dropzone > .ff-icon { font-size: 1.5rem; color: var(--ff-brand-soft); }
.ff-dialog { width: min(28rem, calc(100% - 32px)); border-radius: var(--ff-card-radius, var(--ff-radius)); border: 1px solid var(--ff-line-strong); background: var(--ff-raised); padding: var(--ff-card-pad, 1.25rem); color: var(--ff-text); font-family: var(--ff-font); box-shadow: 0 30px 80px -30px rgba(0, 0, 0, .9); }
.ff-dialog::backdrop { background: rgba(4, 4, 8, .7); -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); }

/* ---------- icons: <span class="ff-icon ff-i-download"></span>, in the text color ---------- */
.ff-icon { display: inline-block; width: 1.15em; height: 1.15em; flex: none; vertical-align: -.2em; background-color: currentColor; -webkit-mask: no-repeat center / contain; mask: no-repeat center / contain; }
.ff-icon-lg { width: 1.6em; height: 1.6em; }
.ff-i-search { -webkit-mask-image: url(icons/search.svg); mask-image: url(icons/search.svg); }
.ff-i-download { -webkit-mask-image: url(icons/download.svg); mask-image: url(icons/download.svg); }
.ff-i-upload { -webkit-mask-image: url(icons/upload.svg); mask-image: url(icons/upload.svg); }
.ff-i-eye { -webkit-mask-image: url(icons/eye.svg); mask-image: url(icons/eye.svg); }
.ff-i-heart { -webkit-mask-image: url(icons/heart.svg); mask-image: url(icons/heart.svg); }
.ff-i-message { -webkit-mask-image: url(icons/message.svg); mask-image: url(icons/message.svg); }
.ff-i-messageCircle { -webkit-mask-image: url(icons/messageCircle.svg); mask-image: url(icons/messageCircle.svg); }
.ff-i-construction { -webkit-mask-image: url(icons/construction.svg); mask-image: url(icons/construction.svg); }
.ff-i-messageSquarePlus { -webkit-mask-image: url(icons/messageSquarePlus.svg); mask-image: url(icons/messageSquarePlus.svg); }
.ff-i-shield { -webkit-mask-image: url(icons/shield.svg); mask-image: url(icons/shield.svg); }
.ff-i-code { -webkit-mask-image: url(icons/code.svg); mask-image: url(icons/code.svg); }
.ff-i-film { -webkit-mask-image: url(icons/film.svg); mask-image: url(icons/film.svg); }
.ff-i-sun { -webkit-mask-image: url(icons/sun.svg); mask-image: url(icons/sun.svg); }
.ff-i-plug { -webkit-mask-image: url(icons/plug.svg); mask-image: url(icons/plug.svg); }
.ff-i-terminal { -webkit-mask-image: url(icons/terminal.svg); mask-image: url(icons/terminal.svg); }
.ff-i-music { -webkit-mask-image: url(icons/music.svg); mask-image: url(icons/music.svg); }
.ff-i-filter { -webkit-mask-image: url(icons/filter.svg); mask-image: url(icons/filter.svg); }
.ff-i-shieldCheck { -webkit-mask-image: url(icons/shieldCheck.svg); mask-image: url(icons/shieldCheck.svg); }
.ff-i-shieldX { -webkit-mask-image: url(icons/shieldX.svg); mask-image: url(icons/shieldX.svg); }
.ff-i-grid { -webkit-mask-image: url(icons/grid.svg); mask-image: url(icons/grid.svg); }
.ff-i-list { -webkit-mask-image: url(icons/list.svg); mask-image: url(icons/list.svg); }
.ff-i-home { -webkit-mask-image: url(icons/home.svg); mask-image: url(icons/home.svg); }
.ff-i-compass { -webkit-mask-image: url(icons/compass.svg); mask-image: url(icons/compass.svg); }
.ff-i-users { -webkit-mask-image: url(icons/users.svg); mask-image: url(icons/users.svg); }
.ff-i-user { -webkit-mask-image: url(icons/user.svg); mask-image: url(icons/user.svg); }
.ff-i-dashboard { -webkit-mask-image: url(icons/dashboard.svg); mask-image: url(icons/dashboard.svg); }
.ff-i-star { -webkit-mask-image: url(icons/star.svg); mask-image: url(icons/star.svg); }
.ff-i-badgeCheck { -webkit-mask-image: url(icons/badgeCheck.svg); mask-image: url(icons/badgeCheck.svg); }
.ff-i-crown { -webkit-mask-image: url(icons/crown.svg); mask-image: url(icons/crown.svg); }
.ff-i-clock { -webkit-mask-image: url(icons/clock.svg); mask-image: url(icons/clock.svg); }
.ff-i-trending { -webkit-mask-image: url(icons/trending.svg); mask-image: url(icons/trending.svg); }
.ff-i-sparkles { -webkit-mask-image: url(icons/sparkles.svg); mask-image: url(icons/sparkles.svg); }
.ff-i-flame { -webkit-mask-image: url(icons/flame.svg); mask-image: url(icons/flame.svg); }
.ff-i-logout { -webkit-mask-image: url(icons/logout.svg); mask-image: url(icons/logout.svg); }
.ff-i-sliders { -webkit-mask-image: url(icons/sliders.svg); mask-image: url(icons/sliders.svg); }
.ff-i-plus { -webkit-mask-image: url(icons/plus.svg); mask-image: url(icons/plus.svg); }
.ff-i-trash { -webkit-mask-image: url(icons/trash.svg); mask-image: url(icons/trash.svg); }
.ff-i-pencil { -webkit-mask-image: url(icons/pencil.svg); mask-image: url(icons/pencil.svg); }
.ff-i-chevronRight { -webkit-mask-image: url(icons/chevronRight.svg); mask-image: url(icons/chevronRight.svg); }
.ff-i-chevronLeft { -webkit-mask-image: url(icons/chevronLeft.svg); mask-image: url(icons/chevronLeft.svg); }
.ff-i-chevronDown { -webkit-mask-image: url(icons/chevronDown.svg); mask-image: url(icons/chevronDown.svg); }
.ff-i-arrowLeft { -webkit-mask-image: url(icons/arrowLeft.svg); mask-image: url(icons/arrowLeft.svg); }
.ff-i-arrowRight { -webkit-mask-image: url(icons/arrowRight.svg); mask-image: url(icons/arrowRight.svg); }
.ff-i-arrowUpRight { -webkit-mask-image: url(icons/arrowUpRight.svg); mask-image: url(icons/arrowUpRight.svg); }
.ff-i-file { -webkit-mask-image: url(icons/file.svg); mask-image: url(icons/file.svg); }
.ff-i-fileText { -webkit-mask-image: url(icons/fileText.svg); mask-image: url(icons/fileText.svg); }
.ff-i-tag { -webkit-mask-image: url(icons/tag.svg); mask-image: url(icons/tag.svg); }
.ff-i-x { -webkit-mask-image: url(icons/x.svg); mask-image: url(icons/x.svg); }
.ff-i-menu { -webkit-mask-image: url(icons/menu.svg); mask-image: url(icons/menu.svg); }
.ff-i-check { -webkit-mask-image: url(icons/check.svg); mask-image: url(icons/check.svg); }
.ff-i-info { -webkit-mask-image: url(icons/info.svg); mask-image: url(icons/info.svg); }
.ff-i-calendar { -webkit-mask-image: url(icons/calendar.svg); mask-image: url(icons/calendar.svg); }
.ff-i-layers { -webkit-mask-image: url(icons/layers.svg); mask-image: url(icons/layers.svg); }
.ff-i-box { -webkit-mask-image: url(icons/box.svg); mask-image: url(icons/box.svg); }
.ff-i-palette { -webkit-mask-image: url(icons/palette.svg); mask-image: url(icons/palette.svg); }
.ff-i-shapes { -webkit-mask-image: url(icons/shapes.svg); mask-image: url(icons/shapes.svg); }
.ff-i-mountain { -webkit-mask-image: url(icons/mountain.svg); mask-image: url(icons/mountain.svg); }
.ff-i-map { -webkit-mask-image: url(icons/map.svg); mask-image: url(icons/map.svg); }
.ff-i-zap { -webkit-mask-image: url(icons/zap.svg); mask-image: url(icons/zap.svg); }
.ff-i-maximize { -webkit-mask-image: url(icons/maximize.svg); mask-image: url(icons/maximize.svg); }
.ff-i-minimize { -webkit-mask-image: url(icons/minimize.svg); mask-image: url(icons/minimize.svg); }
.ff-i-appWindow { -webkit-mask-image: url(icons/appWindow.svg); mask-image: url(icons/appWindow.svg); }
.ff-i-volume { -webkit-mask-image: url(icons/volume.svg); mask-image: url(icons/volume.svg); }
.ff-i-globe { -webkit-mask-image: url(icons/globe.svg); mask-image: url(icons/globe.svg); }
.ff-i-braces { -webkit-mask-image: url(icons/braces.svg); mask-image: url(icons/braces.svg); }
.ff-i-shuffle { -webkit-mask-image: url(icons/shuffle.svg); mask-image: url(icons/shuffle.svg); }
.ff-i-userCheck { -webkit-mask-image: url(icons/userCheck.svg); mask-image: url(icons/userCheck.svg); }
.ff-i-userPlus { -webkit-mask-image: url(icons/userPlus.svg); mask-image: url(icons/userPlus.svg); }
.ff-i-folder { -webkit-mask-image: url(icons/folder.svg); mask-image: url(icons/folder.svg); }
.ff-i-chart { -webkit-mask-image: url(icons/chart.svg); mask-image: url(icons/chart.svg); }
.ff-i-history { -webkit-mask-image: url(icons/history.svg); mask-image: url(icons/history.svg); }
.ff-i-bell { -webkit-mask-image: url(icons/bell.svg); mask-image: url(icons/bell.svg); }
.ff-i-ban { -webkit-mask-image: url(icons/ban.svg); mask-image: url(icons/ban.svg); }
.ff-i-flag { -webkit-mask-image: url(icons/flag.svg); mask-image: url(icons/flag.svg); }
.ff-i-bookmark { -webkit-mask-image: url(icons/bookmark.svg); mask-image: url(icons/bookmark.svg); }
.ff-i-more { -webkit-mask-image: url(icons/more.svg); mask-image: url(icons/more.svg); }
.ff-i-eyeOff { -webkit-mask-image: url(icons/eyeOff.svg); mask-image: url(icons/eyeOff.svg); }
.ff-i-link { -webkit-mask-image: url(icons/link.svg); mask-image: url(icons/link.svg); }
.ff-i-share { -webkit-mask-image: url(icons/share.svg); mask-image: url(icons/share.svg); }
.ff-i-lock { -webkit-mask-image: url(icons/lock.svg); mask-image: url(icons/lock.svg); }
.ff-i-trophy { -webkit-mask-image: url(icons/trophy.svg); mask-image: url(icons/trophy.svg); }
.ff-i-send { -webkit-mask-image: url(icons/send.svg); mask-image: url(icons/send.svg); }
.ff-i-copy { -webkit-mask-image: url(icons/copy.svg); mask-image: url(icons/copy.svg); }
.ff-i-refresh { -webkit-mask-image: url(icons/refresh.svg); mask-image: url(icons/refresh.svg); }
.ff-i-image { -webkit-mask-image: url(icons/image.svg); mask-image: url(icons/image.svg); }
