blob: 1246dd09e19ca0a67d19fb2ae0e5149dfb784af2 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* ==========================================================================
OpenDAL Design System
--------------------------------------------------------------------------
"One Layer, All Storage." A precise, engineering-grade visual system built
on a near-monochrome ink scale, a single precise-blue accent, and the
signature solid "bar" lifted from the OpenDAL wordmark.
Token layers:
1. Primitives — raw, theme-agnostic values (--odl-ink-*, --odl-blue-*)
2. Semantic — meaning-bound, theme-aware roles (--odl-bg, --odl-fg ...)
3. Infima map — semantic tokens projected onto Docusaurus/Infima vars so
docs, blog and community pages inherit the same system.
Typography uses native system stacks on purpose: zero third-party requests
(ASF privacy-friendly), zero layout shift, instant global rendering. The
monospace stack is promoted to a brand motif (labels, indices, figures).
To adopt IBM Plex instead, self-host it and swap --odl-font-* below.
========================================================================== */
/* ---- 1. Primitive tokens ------------------------------------------------- */
:root {
/* Ink — a cool, neutral near-black→white ramp */
--odl-ink-0: #ffffff;
--odl-ink-50: #f6f8fa;
--odl-ink-100: #edf1f5;
--odl-ink-150: #e4e9ef;
--odl-ink-200: #d8dee6;
--odl-ink-300: #c2cad4;
--odl-ink-400: #98a2b0;
--odl-ink-500: #6e7886;
--odl-ink-600: #4f5864;
--odl-ink-700: #39414b;
--odl-ink-800: #262c34;
--odl-ink-850: #1b2027;
--odl-ink-900: #12161b;
--odl-ink-950: #0a0d11;
/* Precise blue — the single brand accent */
--odl-blue-50: #edf3ff;
--odl-blue-100: #d8e5ff;
--odl-blue-200: #b4ccff;
--odl-blue-300: #85a9ff;
--odl-blue-400: #5384ff;
--odl-blue-500: #2c63f5;
--odl-blue-600: #1e54e0;
--odl-blue-700: #1846be;
--odl-blue-800: #163a97;
--odl-blue-900: #163172;
/* Functional signals (kept restrained, mostly for inherited docs UI) */
--odl-green-500: #1a8f5e;
--odl-green-400: #36c08a;
--odl-amber-500: #b7791f;
--odl-amber-400: #e0a93b;
--odl-red-500: #d23b3b;
--odl-red-400: #f06363;
/* Type families — system stacks with a clear engineering character */
--odl-font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
"Apple Color Emoji", "Segoe UI Emoji";
--odl-font-mono: ui-monospace, "SF Mono", SFMono-Regular, "Cascadia Code",
"JetBrains Mono", "Roboto Mono", Menlo, Consolas, "Liberation Mono",
monospace;
/* Type scale */
--odl-text-2xs: 0.6875rem; /* 11px — mono micro-labels */
--odl-text-xs: 0.75rem; /* 12px */
--odl-text-sm: 0.875rem; /* 14px */
--odl-text-base: 1rem; /* 16px */
--odl-text-md: 1.125rem; /* 18px */
--odl-text-lg: 1.375rem; /* 22px */
--odl-text-xl: 1.75rem; /* 28px */
--odl-text-2xl: 2.25rem; /* 36px */
--odl-text-3xl: 3rem; /* 48px */
--odl-text-display: clamp(2.75rem, 1.6rem + 5.2vw, 5rem);
--odl-leading-tight: 1.08;
--odl-leading-snug: 1.28;
--odl-leading-normal: 1.6;
--odl-tracking-tight: -0.022em;
--odl-tracking-label: 0.12em;
/* Spacing — 4px rhythm */
--odl-space-1: 0.25rem;
--odl-space-2: 0.5rem;
--odl-space-3: 0.75rem;
--odl-space-4: 1rem;
--odl-space-5: 1.5rem;
--odl-space-6: 2rem;
--odl-space-7: 3rem;
--odl-space-8: 4rem;
--odl-space-9: 6rem;
--odl-space-10: 8rem;
/* Radius — restrained; the bar motif stays sharp (0) */
--odl-radius-xs: 3px;
--odl-radius-sm: 5px;
--odl-radius-md: 8px;
--odl-radius-lg: 12px;
--odl-radius-pill: 999px;
/* Layout */
--odl-container: 1200px;
--odl-container-narrow: 880px;
--odl-gutter: clamp(1.25rem, 1rem + 2vw, 2.5rem);
/* Motion */
--odl-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
--odl-ease: cubic-bezier(0.4, 0, 0.2, 1);
--odl-dur-fast: 120ms;
--odl-dur: 200ms;
--odl-dur-slow: 320ms;
}
/* ---- 2. Semantic tokens — light (default) -------------------------------- */
:root {
--odl-bg: var(--odl-ink-0);
--odl-bg-subtle: var(--odl-ink-50);
--odl-bg-inset: var(--odl-ink-100);
--odl-surface: var(--odl-ink-0);
--odl-surface-2: var(--odl-ink-50);
--odl-fg: var(--odl-ink-900);
--odl-fg-strong: var(--odl-ink-950);
--odl-fg-muted: var(--odl-ink-600);
--odl-fg-subtle: var(--odl-ink-500);
--odl-border: var(--odl-ink-200);
--odl-border-strong: var(--odl-ink-300);
--odl-bar: var(--odl-ink-950);
--odl-accent: var(--odl-blue-600);
--odl-accent-hover: var(--odl-blue-700);
--odl-accent-subtle: var(--odl-blue-50);
--odl-accent-border: var(--odl-blue-200);
--odl-link: var(--odl-blue-600);
/* Solid action surface — vivid blue with white text in both themes */
--odl-action-bg: var(--odl-blue-600);
--odl-action-bg-hover: var(--odl-blue-700);
--odl-action-fg: #ffffff;
--odl-code-bg: var(--odl-ink-50);
--odl-code-border: var(--odl-ink-150);
--odl-selection: var(--odl-blue-100);
--odl-grid-line: rgba(18, 22, 27, 0.05);
--odl-shadow-sm: 0 1px 2px rgba(10, 13, 17, 0.06),
0 1px 1px rgba(10, 13, 17, 0.04);
--odl-shadow-md: 0 4px 12px rgba(10, 13, 17, 0.07),
0 1px 3px rgba(10, 13, 17, 0.05);
--odl-shadow-lg: 0 18px 40px rgba(10, 13, 17, 0.1),
0 4px 12px rgba(10, 13, 17, 0.06);
}
/* ---- 2b. Semantic tokens — dark ------------------------------------------ */
[data-theme="dark"] {
--odl-bg: #0a0d11;
--odl-bg-subtle: #0e1218;
--odl-bg-inset: #12161d;
--odl-surface: #11161c;
--odl-surface-2: #161c24;
--odl-fg: #e7ebf0;
--odl-fg-strong: #f6f8fa;
--odl-fg-muted: #9aa6b3;
--odl-fg-subtle: #76828f;
--odl-border: #242c35;
--odl-border-strong: #313b46;
--odl-bar: #f6f8fa;
--odl-accent: var(--odl-blue-300);
--odl-accent-hover: var(--odl-blue-200);
--odl-accent-subtle: rgba(44, 99, 245, 0.14);
--odl-accent-border: rgba(133, 169, 255, 0.32);
--odl-link: var(--odl-blue-300);
--odl-action-bg: var(--odl-blue-500);
--odl-action-bg-hover: var(--odl-blue-400);
--odl-action-fg: #ffffff;
--odl-code-bg: #0e131a;
--odl-code-border: #232b35;
--odl-selection: rgba(44, 99, 245, 0.36);
--odl-grid-line: rgba(255, 255, 255, 0.045);
--odl-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
--odl-shadow-md: 0 6px 18px rgba(0, 0, 0, 0.5);
--odl-shadow-lg: 0 22px 48px rgba(0, 0, 0, 0.6);
}
/* ---- 3. Project onto Infima so docs/blog inherit the system -------------- */
:root {
--ifm-color-primary: #1e54e0;
--ifm-color-primary-dark: #1b4bca;
--ifm-color-primary-darker: #1846be;
--ifm-color-primary-darkest: #163a9c;
--ifm-color-primary-light: #3568ef;
--ifm-color-primary-lighter: #4c79f1;
--ifm-color-primary-lightest: #79a0f5;
--ifm-background-color: var(--odl-bg);
--ifm-background-surface-color: var(--odl-surface);
--ifm-font-color-base: var(--odl-fg);
--ifm-heading-color: var(--odl-fg-strong);
--ifm-font-family-base: var(--odl-font-sans);
--ifm-heading-font-family: var(--odl-font-sans);
--ifm-font-family-monospace: var(--odl-font-mono);
--ifm-font-size-base: 16px;
--ifm-line-height-base: 1.6;
--ifm-link-color: var(--odl-link);
--ifm-link-hover-color: var(--odl-accent-hover);
--ifm-heading-font-weight: 650;
--ifm-font-weight-semibold: 600;
--ifm-navbar-background-color: rgba(255, 255, 255, 0.82);
--ifm-navbar-shadow: inset 0 -1px 0 var(--odl-border);
--ifm-navbar-link-color: var(--odl-fg-muted);
--ifm-navbar-link-hover-color: var(--odl-fg-strong);
--ifm-toc-border-color: var(--odl-border);
--ifm-color-emphasis-200: var(--odl-border);
--ifm-color-emphasis-300: var(--odl-border-strong);
--ifm-code-font-size: 0.9em;
--ifm-code-background: var(--odl-code-bg);
--ifm-code-border-radius: var(--odl-radius-sm);
--ifm-pre-background: var(--odl-code-bg);
--ifm-button-border-radius: var(--odl-radius-md);
--ifm-global-radius: var(--odl-radius-md);
--docusaurus-highlighted-code-line-bg: rgba(30, 84, 224, 0.1);
--footer-font-color: var(--odl-fg-muted);
--footer-column-width: unset;
--footer-row-max-width: 1100px;
}
[data-theme="dark"] {
--ifm-color-primary: #5384ff;
--ifm-color-primary-dark: #3568ef;
--ifm-color-primary-darker: #2c63f5;
--ifm-color-primary-darkest: #1e54e0;
--ifm-color-primary-light: #79a0f5;
--ifm-color-primary-lighter: #95b5f8;
--ifm-color-primary-lightest: #b4ccff;
--ifm-navbar-background-color: rgba(10, 13, 17, 0.78);
--ifm-navbar-shadow: inset 0 -1px 0 var(--odl-border);
--docusaurus-highlighted-code-line-bg: rgba(83, 132, 255, 0.16);
}
/* ---- 4. Base element styling --------------------------------------------- */
html {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
}
body {
background-color: var(--odl-bg);
color: var(--odl-fg);
font-feature-settings: "cv05" 1, "ss01" 1;
}
h1,
h2,
h3,
h4 {
letter-spacing: var(--odl-tracking-tight);
}
::selection {
background: var(--odl-selection);
}
:focus-visible {
outline: 2px solid var(--odl-accent);
outline-offset: 2px;
border-radius: var(--odl-radius-xs);
}
/* Translucent, blurred navbar for a precise, layered feel */
.navbar {
backdrop-filter: saturate(180%) blur(12px);
-webkit-backdrop-filter: saturate(180%) blur(12px);
}
/* Avoid making the mobile drawer's fixed panel position against the navbar. */
.navbar.navbar-sidebar--show {
backdrop-filter: none;
-webkit-backdrop-filter: none;
}
.navbar__logo {
height: 1.85rem;
}
.navbar__logo img {
height: 100%;
}
.navbar__title {
font-weight: 650;
letter-spacing: var(--odl-tracking-tight);
}
/* Tabs/Prism code surfaces align to the system */
.theme-code-block,
pre[class*="language-"] {
border: 1px solid var(--odl-code-border);
border-radius: var(--odl-radius-md);
}
/* ---- 5. Brand motif: the solid "bar" ------------------------------------- */
/* The signature OpenDAL bar — a sharp solid rectangle used as a structural
marker, divider and emphasis throughout the system. */
.odl-bar {
display: inline-block;
width: 2.25rem;
height: 0.5rem;
background: var(--odl-bar);
border-radius: 0;
}
/* Eyebrow / kicker label: monospace, uppercase, led by a small accent bar */
.odl-eyebrow {
display: inline-flex;
align-items: center;
gap: var(--odl-space-3);
font-family: var(--odl-font-mono);
font-size: var(--odl-text-xs);
font-weight: 500;
letter-spacing: var(--odl-tracking-label);
text-transform: uppercase;
color: var(--odl-fg-muted);
}
.odl-eyebrow::before {
content: "";
width: 1.5rem;
height: 0.5rem;
background: var(--odl-accent);
flex: none;
}
/* Shared layout helpers used by landing sections */
.odl-container {
width: 100%;
max-width: var(--odl-container);
margin-inline: auto;
padding-inline: var(--odl-gutter);
}
/* Faint blueprint grid — engineering texture for select surfaces */
.odl-grid-bg {
background-image: linear-gradient(
var(--odl-grid-line) 1px,
transparent 1px
),
linear-gradient(90deg, var(--odl-grid-line) 1px, transparent 1px);
background-size: 44px 44px;
}
/* Tabular figures for any numeric/metric display */
.odl-tabular {
font-family: var(--odl-font-mono);
font-variant-numeric: tabular-nums;
}
/* ---- 6. Header icons (GitHub / Discord) ---------------------------------- */
.header-github-link:hover,
.header-discord-link:hover {
opacity: 0.6;
}
.header-github-link::before {
content: "";
width: 22px;
height: 22px;
display: flex;
background-color: var(--odl-fg-muted);
-webkit-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat center / contain;
mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat center / contain;
}
.header-discord-link::before {
content: "";
width: 22px;
height: 22px;
display: flex;
background-color: var(--odl-fg-muted);
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612Zm5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612Z'/%3E%3C/svg%3E")
no-repeat center / contain;
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612Zm5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612Z'/%3E%3C/svg%3E")
no-repeat center / contain;
}
/* ---- 7. Footer ----------------------------------------------------------- */
.footer {
background-color: var(--odl-bg-subtle);
border-top: 1px solid var(--odl-border);
}
.footer__copyright {
font-size: 0.75em;
color: var(--odl-fg-subtle);
margin-top: var(--odl-space-4);
}
.footer__logo {
margin-top: unset;
max-width: 280px;
}
[data-theme="dark"] .footer__logo {
filter: brightness(0) invert(1) opacity(0.7);
}
/* ---- 7b. Docs sidebar section label -------------------------------------- */
/* A divider + eyebrow label that separates the concept docs from the
per-language guides in the docs sidebar. */
.sidebar-section-label {
margin: var(--odl-space-4, 1rem) 0 var(--odl-space-1, 0.25rem);
padding: var(--odl-space-3, 0.75rem) 0.75rem 0;
border-top: 1px solid var(--ifm-toc-border-color);
font-family: var(--odl-font-mono);
font-size: var(--odl-text-xs);
font-weight: 600;
letter-spacing: var(--odl-tracking-label);
text-transform: uppercase;
color: var(--odl-fg-muted);
}
/* ---- 7c. Language logos in the docs sidebar ------------------------------ */
/* Each per-language guide category carries a sidebar-lang-<key> class (set in
docs/sidebars.js); show the matching brand logo before its label. The `>`
chain targets only the category's own title, never its child pages. */
.sidebar-lang > .menu__list-item-collapsible > .menu__link::before {
content: "";
display: inline-block;
flex: 0 0 auto;
width: 1.15em;
height: 1.15em;
margin-right: 0.55em;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
vertical-align: -0.18em;
}
.sidebar-lang-rust > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/rust.svg); }
.sidebar-lang-c > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/c.svg); }
.sidebar-lang-cpp > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/cpp.svg); }
.sidebar-lang-d > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/d.svg); }
.sidebar-lang-dart > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/dart.svg); }
.sidebar-lang-dotnet > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/dotnet.svg); }
.sidebar-lang-go > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/go.svg); }
.sidebar-lang-haskell > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/haskell.svg); }
.sidebar-lang-java > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/java.svg); }
.sidebar-lang-lua > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/lua.svg); }
.sidebar-lang-nodejs > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/nodejs.svg); }
.sidebar-lang-ocaml > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/ocaml.svg); }
.sidebar-lang-php > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/php.svg); }
.sidebar-lang-python > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/python.svg); }
.sidebar-lang-ruby > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/ruby.svg); }
.sidebar-lang-swift > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/swift.svg); }
.sidebar-lang-zig > .menu__list-item-collapsible > .menu__link::before { background-image: url(/img/bindings/zig.svg); }
/* ---- 8. Reduced motion --------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}