/* PRINT3D — Tokens und Seitenstile, gebaut 20260922 */
/* PRINT3D design system — self-hosted webfonts.
   Sourced from Google Fonts (SIL OFL 1.1), latin + latin-ext subsets only.
   Brand rule: fonts are ALWAYS self-hosted, never loaded from a CDN. */
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:300 700;font-display:swap;src:url('../assets/fonts/space-grotesk-var-latin-ext.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:'Space Grotesk';font-style:normal;font-weight:300 700;font-display:swap;src:url('../assets/fonts/space-grotesk-var-latin.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}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:300 800;font-display:swap;src:url('../assets/fonts/hanken-grotesk-var-latin-ext.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:'Hanken Grotesk';font-style:normal;font-weight:300 800;font-display:swap;src:url('../assets/fonts/hanken-grotesk-var-latin.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}
@font-face{font-family:'Space Mono';font-style:normal;font-weight:400;font-display:swap;src:url('../assets/fonts/space-mono-400-latin-ext.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:'Space Mono';font-style:normal;font-weight:400;font-display:swap;src:url('../assets/fonts/space-mono-400-latin.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}
@font-face{font-family:'Space Mono';font-style:normal;font-weight:700;font-display:swap;src:url('../assets/fonts/space-mono-700-latin-ext.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:'Space Mono';font-style:normal;font-weight:700;font-display:swap;src:url('../assets/fonts/space-mono-700-latin.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}

/* Raw brand palette values. Never reference these directly in product UI —
   use the role tokens in colors.css / themes.css so the theme layer stays swappable. */
:root{
  /* PRINT3D + FRAM3D shared brand orange */
  --p3-orange:#FF4E00; --p3-orange-hover:#E84600; --p3-orange-press:#CC3D00;
  --p3-orange-tint:#FFEDE6; --p3-orange-dim:#7A2500;

  /* PRINT3D neutral world — graphite + paper (light-first, industrial) */
  --p3-ink:#0E1013; --p3-graphite-900:#16191D; --p3-graphite-800:#22262B;
  --p3-graphite-700:#2E333A; --p3-graphite-600:#3A4048; --p3-graphite-500:#5A626D;
  --p3-grey-400:#8A9099; --p3-grey-300:#B4B9C0; --p3-grey-200:#D7DADE;
  --p3-grey-100:#E9EBEE; --p3-paper:#F5F6F7; --p3-white:#FFFFFF;

  /* LINK3D — navy world (values from LINK3D CI 1.0) */
  --l3-navy:#042F56; --l3-navy-deep:#04111E; --l3-navy-hover:#063D6E; --l3-navy-press:#022340;
  --l3-signal:#5BADFF; --l3-signal-hover:#7CBFFF; --l3-signal-press:#3D95EB;
  --l3-logo-lightblue:#67ABF0;
  --l3-bg:#050E18; --l3-surface-1:#071522; --l3-surface-2:#0A1E30; --l3-surface-3:#0D2540;
  --l3-text:#DDE6F0;

  /* FRAM3D — studio-black world */
  --f3-orange:#FF4E00; --f3-orange-hover:#FF6A26; --f3-orange-press:#D93F00;
  --f3-bg:#0A0A0B; --f3-surface-1:#121214; --f3-surface-2:#1A1B1D; --f3-surface-3:#242527;
  --f3-text:#F2F2F0; --f3-warm-grey:#6E6E6B;

  /* Status hues (LINK3D CI 1.0, page 14) */
  --status-green:#3ED89A; --status-amber:#D9892B; --status-red:#D6453D;
  --status-green-dark:#128A4E; --status-amber-dark:#A9660F; --status-red-dark:#B8352C;

  /* LINK3D product filament colours — PRODUCT ONLY, never layout (CI 1.0, page 15) */
  --filament-navy:#042F56; --filament-midnight:#1A1A2E; --filament-forest:#1E3A1E;
  --filament-plum:#2D1B33; --filament-crimson:#7A0A0A; --filament-graphite:#2C2C2C;
  --filament-teal:#0A2A2A; --filament-gold:#8B6914; --filament-olive:#1F2A0D;
  --filament-espresso:#1A0A04;
}

/* Role tokens. Identical names in every brand — only the values swap.
   This block IS the PRINT3D umbrella theme (the default). */
:root{
  --brand-primary:var(--p3-orange);
  --brand-primary-hover:var(--p3-orange-hover);
  --brand-primary-press:var(--p3-orange-press);
  --brand-accent:var(--p3-orange);
  --brand-accent-hover:var(--p3-orange-hover);
  --brand-accent-press:var(--p3-orange-press);
  --brand-ink:var(--p3-ink);
  --on-primary:var(--p3-white);
  --on-accent:var(--p3-white);

  --bg-base:var(--p3-white);
  --surface-1:var(--p3-paper);
  --surface-2:var(--p3-grey-100);
  --surface-3:var(--p3-grey-200);
  --surface-inverse:var(--p3-ink);
  --overlay-scrim:rgba(14,16,19,.72);

  --text-primary:var(--p3-ink);
  --text-secondary:rgba(14,16,19,.62);
  --text-tertiary:rgba(14,16,19,.38);
  --text-inverse:var(--p3-white);
  --text-link:var(--p3-orange);
  --text-link-hover:var(--p3-orange-press);

  --border-subtle:rgba(14,16,19,.10);
  --border-default:rgba(14,16,19,.18);
  --border-strong:rgba(14,16,19,.34);
  --focus-ring:var(--p3-orange);

  --status-success:var(--status-green-dark);
  --status-notice:var(--status-amber-dark);
  --status-error:var(--status-red-dark);
  --status-success-bg:rgba(18,138,78,.10);
  --status-notice-bg:rgba(169,102,15,.10);
  --status-error-bg:rgba(184,53,44,.10);

  /* Logo asset for the active theme — swapped per brand */
  --logo-horizontal:url("../assets/logos/print3d-horizontal-orange-black.svg"); /* @kind other */
  --logo-icon:url("../assets/logos/print3d-icon-orange.svg"); /* @kind other */
}

/* Swappable theme layer. data-brand switches every role token at once.
   Nothing else in the system references brand palettes directly. */
[data-brand="print3d"]{
  color-scheme:light;
  --brand-primary:var(--p3-orange); --brand-primary-hover:var(--p3-orange-hover); --brand-primary-press:var(--p3-orange-press);
  --brand-accent:var(--p3-orange); --brand-accent-hover:var(--p3-orange-hover); --brand-accent-press:var(--p3-orange-press);
  --brand-ink:var(--p3-ink); --on-primary:var(--p3-white); --on-accent:var(--p3-white);
  --bg-base:var(--p3-white); --surface-1:var(--p3-paper); --surface-2:var(--p3-grey-100); --surface-3:var(--p3-grey-200);
  --surface-inverse:var(--p3-ink); --overlay-scrim:rgba(14,16,19,.72);
  --text-primary:var(--p3-ink); --text-secondary:rgba(14,16,19,.62); --text-tertiary:rgba(14,16,19,.38);
  --text-inverse:var(--p3-white); --text-link:var(--p3-orange); --text-link-hover:var(--p3-orange-press);
  --border-subtle:rgba(14,16,19,.10); --border-default:rgba(14,16,19,.18); --border-strong:rgba(14,16,19,.34);
  --focus-ring:var(--p3-orange);
  --status-success:var(--status-green-dark); --status-notice:var(--status-amber-dark); --status-error:var(--status-red-dark);
  --status-success-bg:rgba(18,138,78,.10); --status-notice-bg:rgba(169,102,15,.10); --status-error-bg:rgba(184,53,44,.10);
  --logo-horizontal:url("../assets/logos/print3d-horizontal-orange-black.svg"); /* @kind other */
  --logo-icon:url("../assets/logos/print3d-icon-orange.svg"); /* @kind other */
}
[data-brand="print3d-dark"]{
  color-scheme:dark;
  --brand-primary:var(--p3-orange); --brand-primary-hover:var(--p3-orange-hover); --brand-primary-press:var(--p3-orange-press);
  --brand-accent:var(--p3-orange); --brand-accent-hover:var(--p3-orange-hover); --brand-accent-press:var(--p3-orange-press);
  --brand-ink:var(--p3-ink); --on-primary:var(--p3-white); --on-accent:var(--p3-white);
  --bg-base:var(--p3-ink); --surface-1:var(--p3-graphite-900); --surface-2:var(--p3-graphite-800); --surface-3:var(--p3-graphite-700);
  --surface-inverse:var(--p3-white); --overlay-scrim:rgba(0,0,0,.76);
  --text-primary:var(--p3-grey-100); --text-secondary:rgba(233,235,238,.60); --text-tertiary:rgba(233,235,238,.34);
  --text-inverse:var(--p3-ink); --text-link:var(--p3-orange); --text-link-hover:#FF7A45;
  --border-subtle:rgba(255,255,255,.08); --border-default:rgba(255,255,255,.14); --border-strong:rgba(255,255,255,.26);
  --focus-ring:var(--p3-orange);
  --status-success:var(--status-green); --status-notice:var(--status-amber); --status-error:var(--status-red);
  --status-success-bg:rgba(62,216,154,.12); --status-notice-bg:rgba(217,137,43,.14); --status-error-bg:rgba(214,69,61,.14);
  --logo-horizontal:url("../assets/logos/print3d-horizontal-orange-white.svg"); /* @kind other */
  --logo-icon:url("../assets/logos/print3d-icon-orange.svg"); /* @kind other */
}
[data-brand="link3d"]{
  color-scheme:dark;
  --brand-primary:var(--l3-navy); --brand-primary-hover:var(--l3-navy-hover); --brand-primary-press:var(--l3-navy-press);
  --brand-accent:var(--l3-signal); --brand-accent-hover:var(--l3-signal-hover); --brand-accent-press:var(--l3-signal-press);
  --brand-ink:var(--l3-navy-deep); --on-primary:var(--l3-text); --on-accent:var(--l3-navy-deep);
  --bg-base:var(--l3-bg); --surface-1:var(--l3-surface-1); --surface-2:var(--l3-surface-2); --surface-3:var(--l3-surface-3);
  --surface-inverse:var(--l3-text); --overlay-scrim:rgba(4,17,30,.78);
  --text-primary:var(--l3-text); --text-secondary:rgba(221,230,240,.56); --text-tertiary:rgba(221,230,240,.30);
  --text-inverse:var(--l3-navy-deep); --text-link:var(--l3-signal); --text-link-hover:var(--l3-signal-hover);
  --border-subtle:rgba(221,230,240,.08); --border-default:rgba(221,230,240,.14); --border-strong:rgba(91,173,255,.38);
  --focus-ring:var(--l3-signal);
  --status-success:var(--status-green); --status-notice:var(--status-amber); --status-error:var(--status-red);
  --status-success-bg:rgba(62,216,154,.12); --status-notice-bg:rgba(217,137,43,.14); --status-error-bg:rgba(214,69,61,.14);
  --logo-horizontal:url("../assets/logos/link3d-horizontal-lightblue-white.svg"); /* @kind other */
  --logo-icon:url("../assets/logos/link3d-icon-lightblue.svg"); /* @kind other */
}
[data-brand="link3d-light"]{
  color-scheme:light;
  --brand-primary:var(--l3-navy); --brand-primary-hover:var(--l3-navy-hover); --brand-primary-press:var(--l3-navy-press);
  --brand-accent:var(--l3-navy); --brand-accent-hover:var(--l3-navy-hover); --brand-accent-press:var(--l3-navy-press);
  --brand-ink:var(--l3-navy-deep); --on-primary:#FFFFFF; --on-accent:#FFFFFF;
  --bg-base:#FFFFFF; --surface-1:#F2F5F9; --surface-2:#E6ECF3; --surface-3:#D7E1EC;
  --surface-inverse:var(--l3-navy); --overlay-scrim:rgba(4,17,30,.72);
  --text-primary:var(--l3-navy-deep); --text-secondary:rgba(4,17,30,.62); --text-tertiary:rgba(4,17,30,.38);
  --text-inverse:#FFFFFF; --text-link:var(--l3-navy); --text-link-hover:var(--l3-navy-press);
  --border-subtle:rgba(4,47,86,.12); --border-default:rgba(4,47,86,.20); --border-strong:rgba(4,47,86,.38);
  --focus-ring:var(--l3-navy);
  --status-success:var(--status-green-dark); --status-notice:var(--status-amber-dark); --status-error:var(--status-red-dark);
  --status-success-bg:rgba(18,138,78,.10); --status-notice-bg:rgba(169,102,15,.10); --status-error-bg:rgba(184,53,44,.10);
  --logo-horizontal:url("../assets/logos/link3d-horizontal-blue.svg"); /* @kind other */
  --logo-icon:url("../assets/logos/link3d-icon-blue.svg"); /* @kind other */
}
[data-brand="fram3d"]{
  color-scheme:dark;
  --brand-primary:var(--f3-orange); --brand-primary-hover:var(--f3-orange-hover); --brand-primary-press:var(--f3-orange-press);
  --brand-accent:var(--f3-orange); --brand-accent-hover:var(--f3-orange-hover); --brand-accent-press:var(--f3-orange-press);
  --brand-ink:#000000; --on-primary:#FFFFFF; --on-accent:#FFFFFF;
  --bg-base:var(--f3-bg); --surface-1:var(--f3-surface-1); --surface-2:var(--f3-surface-2); --surface-3:var(--f3-surface-3);
  --surface-inverse:var(--f3-text); --overlay-scrim:rgba(0,0,0,.80);
  --text-primary:var(--f3-text); --text-secondary:rgba(242,242,240,.58); --text-tertiary:rgba(242,242,240,.32);
  --text-inverse:#0A0A0B; --text-link:var(--f3-orange); --text-link-hover:var(--f3-orange-hover);
  --border-subtle:rgba(242,242,240,.08); --border-default:rgba(242,242,240,.14); --border-strong:rgba(255,78,0,.42);
  --focus-ring:var(--f3-orange);
  --status-success:var(--status-green); --status-notice:var(--status-amber); --status-error:var(--status-red);
  --status-success-bg:rgba(62,216,154,.12); --status-notice-bg:rgba(217,137,43,.14); --status-error-bg:rgba(214,69,61,.14);
  --logo-horizontal:url("../assets/logos/fram3d-horizontal-orange-white.svg"); /* @kind other */
  --logo-icon:url("../assets/logos/fram3d-icon-orange.svg"); /* @kind other */
}

/* Three voices, one system: Space Grotesk (display) · Hanken Grotesk (body) · Space Mono (technical). */
:root{
  --font-display:'Space Grotesk','Space Grotesk Fallback',system-ui,sans-serif;
  --font-body:'Hanken Grotesk','Hanken Grotesk Fallback',system-ui,sans-serif;
  --font-mono:'Space Mono',ui-monospace,'SFMono-Regular',Menlo,monospace;

  --fw-regular:400; /* @kind font */
  --fw-medium:500; /* @kind font */
  --fw-semibold:600; /* @kind font */
  --fw-bold:700; /* @kind font */
  --fw-extrabold:800; /* @kind font */

  /* UI / web scale */
  --fs-hero:84px; --fs-display-1:64px; --fs-display-2:48px;
  --fs-h1:40px; --fs-h2:32px; --fs-h3:24px; --fs-h4:20px;
  --fs-body-lg:18px; --fs-body:16px; --fs-body-sm:14px; --fs-caption:13px;
  --fs-eyebrow:12px; --fs-mono:13px; --fs-mono-sm:11px;

  /* Slide / presentation scale (1920×1080 canvas) */
  --fs-slide-hero:84px; --fs-slide-h1:64px; --fs-slide-h2:48px;
  --fs-slide-body:26px; --fs-slide-eyebrow:18px; --fs-slide-caption:20px;

  --lh-tight:1.02; /* @kind font */
  --lh-display:1.06; /* @kind font */
  --lh-heading:1.18; /* @kind font */
  --lh-ui:1.35; /* @kind font */
  --lh-body:1.55; /* @kind font */
  --lh-loose:1.7; /* @kind font */

  --ls-hero:-.03em; /* @kind font */
  --ls-display:-.025em; /* @kind font */
  --ls-heading:-.015em; /* @kind font */
  --ls-body:0; /* @kind font */
  --ls-eyebrow:.22em; /* @kind font */
  --ls-mono:.02em; /* @kind font */
  --ls-caps:.08em; /* @kind font */

  --measure-narrow:44ch; /* @kind spacing */
  --measure:62ch; /* @kind spacing */
  --measure-wide:76ch; /* @kind spacing */
}

/* 4px base grid. */
:root{
  --space-0:0px; --space-1:4px; --space-2:8px; --space-3:12px; --space-4:16px;
  --space-5:20px; --space-6:24px; --space-7:28px; --space-8:32px; --space-10:40px;
  --space-12:48px; --space-14:56px; --space-16:64px; --space-20:80px; --space-24:96px;
  --space-32:128px; --space-40:160px;

  --gutter:24px; --gutter-lg:40px;
  --page-max:1280px; --page-max-wide:1440px; --page-pad:24px; --page-pad-lg:48px;
  --section-y:96px; --section-y-lg:128px;
  --card-pad:24px; --card-pad-sm:16px; --card-pad-lg:32px;
  --control-h-sm:32px; --control-h:40px; --control-h-lg:48px;
  --tap-min:44px;
  /* logo protection zone = 1× icon tile height */
  --clearspace:1; /* @kind other */
}

/* Technical, near-square geometry. The chamfer — a 45° cut lifted from the mirrored "3" —
   is the brand's signature corner and replaces large border-radii. */
:root{
  --radius-0:0px; --radius-xs:2px; --radius-sm:4px; --radius-md:6px;
  --radius-lg:10px; --radius-xl:14px; --radius-pill:999px;
  --radius-card:4px; --radius-control:4px; --radius-tile:2px;

  --chamfer-sm:8px; --chamfer:14px; --chamfer-lg:22px; --chamfer-xl:36px;
  --chamfer-clip:polygon(0 0,calc(100% - var(--chamfer)) 0,100% var(--chamfer),100% 100%,0 100%); /* @kind other */

  --border-w:1px; /* @kind spacing */
  --border-w-strong:1.5px; /* @kind spacing */
  --icon-stroke:1.8px; /* @kind spacing */
  --rule-w:1px; /* @kind spacing */

  /* Physical-print constraints (3D printing) — mirrored in UI as minimum stroke rhythm */
  --print-min-web:0.8mm; /* @kind spacing */
  --print-max-web:1.2mm; /* @kind spacing */
  --print-emboss-min:0.4mm; /* @kind spacing */
  --print-emboss-max:0.8mm; /* @kind spacing */
}

/* Dark-first system: borders and surface steps carry hierarchy, shadow is a whisper.
   On light PRINT3D surfaces shadows are slightly more present but never soft//fluffy. */
:root{
  --shadow-0:none;
  --shadow-1:0 1px 2px rgba(0,0,0,.28);
  --shadow-2:0 4px 16px -4px rgba(0,0,0,.42);
  --shadow-3:0 18px 48px -14px rgba(0,0,0,.58);
  --shadow-inset-hairline:inset 0 1px 0 rgba(255,255,255,.06);
  --glow-accent:0 0 0 1px color-mix(in oklab,var(--brand-accent) 40%,transparent),0 10px 40px -12px color-mix(in oklab,var(--brand-accent) 45%,transparent);
  --glow-hero:radial-gradient(60% 60% at 78% 8%,color-mix(in oklab,var(--brand-accent) 22%,transparent) 0%,transparent 70%); /* @kind other */
  --ring-focus:0 0 0 2px var(--bg-base),0 0 0 4px var(--focus-ring);
}

/* Mechanical, short, no bounce — movement reads as machined, not playful. */
:root{
  --dur-instant:80ms; /* @kind other */
  --dur-fast:120ms; /* @kind other */
  --dur-base:180ms; /* @kind other */
  --dur-slow:280ms; /* @kind other */
  --dur-slower:520ms; /* @kind other */
  --ease-standard:cubic-bezier(.2,0,.2,1); /* @kind other */
  --ease-out:cubic-bezier(.16,1,.3,1); /* @kind other */
  --ease-in:cubic-bezier(.4,0,1,1); /* @kind other */
  --ease-linear:linear; /* @kind other */
  --transition-control:background-color var(--dur-fast) var(--ease-standard),border-color var(--dur-fast) var(--ease-standard),color var(--dur-fast) var(--ease-standard),transform var(--dur-fast) var(--ease-standard); /* @kind other */
  --lift-hover:translateY(-1px); /* @kind other */
  --press-scale:.985; /* @kind other */
}
@media (prefers-reduced-motion:reduce){
  :root{
    --dur-instant:0ms; /* @kind other */
    --dur-fast:0ms; /* @kind other */
    --dur-base:0ms; /* @kind other */
    --dur-slow:0ms; /* @kind other */
    --dur-slower:0ms; /* @kind other */
    --lift-hover:none; /* @kind other */
  }
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--bg-base);color:var(--text-primary);font-family:var(--font-body);font-size:var(--fs-body);line-height:var(--lh-body);font-weight:var(--fw-regular);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
h1,h2,h3,h4{font-family:var(--font-display);font-weight:var(--fw-bold);letter-spacing:var(--ls-heading);line-height:var(--lh-heading);margin:0}
h1{font-size:var(--fs-h1);letter-spacing:var(--ls-display)}
h2{font-size:var(--fs-h2)}
h3{font-size:var(--fs-h3)}
h4{font-size:var(--fs-h4);font-weight:var(--fw-semibold)}
p{margin:0;text-wrap:pretty}
a{color:var(--text-link);text-decoration-color:color-mix(in oklab,var(--text-link) 40%,transparent);text-underline-offset:.18em;transition:color var(--dur-fast) var(--ease-standard)}
a:hover{color:var(--text-link-hover);text-decoration-color:currentColor}
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible{outline:none;box-shadow:var(--ring-focus)}
code,kbd,samp,pre{font-family:var(--font-mono);font-size:.92em;letter-spacing:var(--ls-mono)}
img,svg{display:block;max-width:100%}
button,input,select,textarea{font:inherit;color:inherit}
hr{border:0;border-top:var(--rule-w) solid var(--border-subtle);margin:0}
::selection{background:color-mix(in oklab,var(--brand-accent) 32%,transparent)}

/* Signature surface motifs. Class names are prefixed p3- so they never collide. */
.p3-chamfer{clip-path:var(--chamfer-clip)}
.p3-chamfer-sm{--chamfer:var(--chamfer-sm);clip-path:var(--chamfer-clip)}
.p3-chamfer-lg{--chamfer:var(--chamfer-lg);clip-path:var(--chamfer-clip)}

/* Eyebrow — mono, uppercase, wide tracking. The system's only all-caps voice. */
.p3-eyebrow{font-family:var(--font-mono);font-size:var(--fs-eyebrow);letter-spacing:var(--ls-eyebrow);text-transform:uppercase;color:var(--text-tertiary)}

/* Layer texture — 3D print lines. Dezent, only on product-adjacent surfaces. */
.p3-layers{background-image:repeating-linear-gradient(180deg,color-mix(in oklab,var(--text-primary) 5%,transparent) 0 1px,transparent 1px 5px)}
.p3-layers-diag{background-image:repeating-linear-gradient(135deg,color-mix(in oklab,var(--text-primary) 5%,transparent) 0 1px,transparent 1px 6px)}

/* Technical grid — blueprint backdrop for hero and section breaks. */
.p3-grid{background-image:linear-gradient(color-mix(in oklab,var(--text-primary) 6%,transparent) 1px,transparent 1px),linear-gradient(90deg,color-mix(in oklab,var(--text-primary) 6%,transparent) 1px,transparent 1px);background-size:32px 32px}

/* Accent glow — top-right, once per view, hero only. */
.p3-glow{background-image:var(--glow-hero)}

/* Logo clearspace: 1× icon tile height on all sides. */
.p3-clearspace{padding:calc(var(--logo-size,32px) * var(--clearspace))}

/* Loading spinner keyframe — linear, 1 rps. No shimmer, no pulse. */
@keyframes p3-spin{to{transform:rotate(360deg)}}
/* NFC wave signature (LINK3D): three arcs, 120 ms stagger. */
@keyframes p3-nfc{0%,70%,100%{opacity:.15}35%{opacity:1}}

html,body{margin:0;min-height:100%;background:var(--bg-base);overflow-x:hidden}html{-webkit-text-size-adjust:100%;scroll-padding-top:80px}body{-webkit-tap-highlight-color:transparent}
:focus-visible{outline:2px solid var(--brand-primary);outline-offset:2px}a{color:var(--text-link)}a:hover{color:var(--text-link-hover)}
.rv{opacity:0;transform:translateY(14px);transition:opacity .5s var(--ease-out),transform .5s var(--ease-out)}
.rv[data-in]{opacity:1;transform:none}
.photo{opacity:0;transition:opacity .7s var(--ease-out)}
.photo[data-in]{opacity:1}
.hov,.lnk,.lnk-bg,.chip,.mat-row>div,.hov-ic,.mat-name{transition:background-color var(--dur-base) var(--ease-standard),border-color var(--dur-base) var(--ease-standard),color var(--dur-base) var(--ease-standard)}
.chip{cursor:pointer;min-height:var(--tap-min);display:inline-flex;align-items:center}
@media (hover:hover){.tile:hover,.hov:hover{background:var(--surface-2)!important;border-color:var(--brand-primary)!important}.tile:hover .tile-kicker,.hov:hover .hov-ic{color:var(--brand-primary)!important}.lnk:hover{color:var(--brand-primary)!important}.lnk-bg:hover{background:var(--surface-2)!important;color:var(--text-primary)!important}.chip:not([aria-pressed="true"]):hover{border-color:var(--brand-primary)!important;color:var(--brand-primary)!important;background:var(--surface-2)!important}.mat-row:hover>div{background:var(--surface-2)!important}.mat-row:hover .mat-name{color:var(--brand-primary)!important}}
.chip:active,.hov:active{border-color:var(--brand-primary)!important}
footer a{transition:color var(--dur-base) var(--ease-standard)}
@media (hover:hover){footer a:hover{color:var(--brand-primary)!important}}
.site-nav{display:flex;align-items:center;gap:22px;white-space:nowrap}
.site-menu-btn,.cta-short{display:none}
.mat-cards{display:none;gap:12px}
.tp-track{display:grid;grid-template-columns:minmax(0,1fr) clamp(180px,20vw,300px) minmax(0,1fr);grid-auto-rows:1fr}
.tp-a{grid-column:1;justify-self:end;align-self:center;padding-right:10px}
.tp-rail{grid-column:2;position:relative}
.tp-b{grid-column:3;align-self:center;padding-left:10px}
@media (max-width:1180px){.site-nav{display:none}.site-menu-btn{display:inline-flex}}
@media (min-width:1181px){.site-menu{display:none!important}}
@media (max-width:960px){.mat-table{display:none}.mat-cards{display:grid}}
@media (max-width:860px){.req-grid,.legal-grid{grid-template-columns:minmax(0,1fr)!important}.legal-grid nav{position:static!important}.tp-track{grid-template-columns:70px 1fr}.tp-rail{grid-column:1}.tp-a,.tp-b{grid-column:2;justify-self:start;padding-left:14px;padding-right:0}.tp-empty{display:none}.legal-grid>div:last-child{order:-1}}
@media (max-width:520px){.cta-full{display:none}.cta-short{display:inline-flex}h1,h2{hyphens:auto;-webkit-hyphens:auto;overflow-wrap:break-word}}
@media (prefers-reduced-motion:reduce){.rv,.photo{opacity:1;transform:none;transition:none}.tp-fade,.tp-node{opacity:1!important;transform:none!important;transition:none!important}.tp-path{transform:none!important;transition:none!important}.tp-hotend{transition:none!important;opacity:1!important}.iso-anim{opacity:1!important;transform:none!important;transition:none!important}}
