/* SummerCMS documentation theme (11.1-UI-SPEC.md). Colour tokens are copied by value from the admin SPA (admin/src/styles/main.css). Fonts are vendored under fonts/ (OFL-1.1); icons are inline Lucide SVG (ISC). */ /* Fonts: DM Sans 400/600 (+ 400 italic) and DM Mono 400, latin and latin-ext. */ @font-face { font-family: "DM Sans"; font-style: normal; font-weight: 400; font-display: swap; src: url("fonts/dm-sans-latin-ext-400-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: "DM Sans"; font-style: normal; font-weight: 400; font-display: swap; src: url("fonts/dm-sans-latin-400-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; } @font-face { font-family: "DM Sans"; font-style: normal; font-weight: 600; font-display: swap; src: url("fonts/dm-sans-latin-ext-600-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: "DM Sans"; font-style: normal; font-weight: 600; font-display: swap; src: url("fonts/dm-sans-latin-600-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; } @font-face { font-family: "DM Sans"; font-style: italic; font-weight: 400; font-display: swap; src: url("fonts/dm-sans-latin-ext-400-italic.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: "DM Sans"; font-style: italic; font-weight: 400; font-display: swap; src: url("fonts/dm-sans-latin-400-italic.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: "DM Mono"; font-style: normal; font-weight: 400; font-display: swap; src: url("fonts/dm-mono-latin-ext-400-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: "DM Mono"; font-style: normal; font-weight: 400; font-display: swap; src: url("fonts/dm-mono-latin-400-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; } /* Tokens: light on :root, dark under :root.dark and under the media query when the reader has not picked light. */ :root { --c-bg: #f4f6f9; --c-surface: #ffffff; --c-subtle: #f3f5f8; --c-border: #e6e9ef; --c-border-strong: #d2d8e2; --c-text: #141b2d; --c-muted: #566175; --c-placeholder: #6b7588; --c-primary: #22304d; --c-danger: #c62828; --c-danger-soft: #fdf0f0; --c-ok-bg: #e3f4e8; --c-ok-text: #1c6b35; --c-ring: rgba(252, 196, 40, 0.55); --c-hover: #f1f3f7; --c-sel: #fdf3cf; --c-overlay: rgba(20, 27, 45, 0.5); --c-side: #1d2740; --c-side-border: transparent; --c-accent: #fcd34d; --c-accent-soft: rgba(252, 211, 77, 0.14); --c-side-text: #c3cbda; --c-side-label: #9aa6bd; --c-side-hover: rgba(255, 255, 255, 0.08); --d-page: var(--c-surface); --d-panel: #f4f6f9; --tok-plain: #141b2d; --tok-kw: #22304d; --tok-str: #1c6b35; --tok-com: #566175; --tok-num: #9a3412; --tok-prompt: #566175; --shadow-pop: 0 16px 40px rgba(20, 27, 45, 0.18); --font-sans: "DM Sans", ui-sans-serif, system-ui, sans-serif; --font-mono: "DM Mono", ui-monospace, monospace; --ease: 150ms ease-out; color-scheme: light; } :root.dark { --c-bg: #111726; --c-surface: #182033; --c-subtle: #1f283d; --c-border: #29334b; --c-border-strong: #3a4661; --c-text: #eef1f6; --c-muted: #a9b3c6; --c-placeholder: #8a95ab; --c-primary: #fcd34d; --c-danger: #f58a8a; --c-danger-soft: #3a1d24; --c-ok-bg: #173826; --c-ok-text: #8fdfa8; --c-ring: rgba(252, 211, 77, 0.45); --c-hover: #212b42; --c-sel: #3a3622; --c-overlay: rgba(5, 8, 16, 0.7); --c-side: #0d1320; --c-side-border: #222b40; --d-page: var(--c-bg); --d-panel: #182033; --tok-plain: #eef1f6; --tok-kw: #93c5fd; --tok-str: #8fdfa8; --tok-com: #8a95ab; --tok-num: #fdba74; --tok-prompt: #8a95ab; color-scheme: dark; } @media (prefers-color-scheme: dark) { :root:not(.light) { --c-bg: #111726; --c-surface: #182033; --c-subtle: #1f283d; --c-border: #29334b; --c-border-strong: #3a4661; --c-text: #eef1f6; --c-muted: #a9b3c6; --c-placeholder: #8a95ab; --c-primary: #fcd34d; --c-danger: #f58a8a; --c-danger-soft: #3a1d24; --c-ok-bg: #173826; --c-ok-text: #8fdfa8; --c-ring: rgba(252, 211, 77, 0.45); --c-hover: #212b42; --c-sel: #3a3622; --c-overlay: rgba(5, 8, 16, 0.7); --c-side: #0d1320; --c-side-border: #222b40; --d-page: var(--c-bg); --d-panel: #182033; --tok-plain: #eef1f6; --tok-kw: #93c5fd; --tok-str: #8fdfa8; --tok-com: #8a95ab; --tok-num: #fdba74; --tok-prompt: #8a95ab; color-scheme: dark; } } /* Base */ *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; font-size: 16px; } body { margin: 0; background: var(--d-page); color: var(--c-text); font-family: var(--font-sans); font-size: 16px; font-weight: 400; line-height: 1.6; font-synthesis: none; overflow-wrap: break-word; } body.drawer-open { overflow: hidden; } a { color: var(--c-primary); } :focus-visible { outline: 3px solid var(--c-ring); outline-offset: 2px; } .icon { width: 16px; height: 16px; flex: none; vertical-align: -3px; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } .skip-link { position: absolute; top: 12px; left: 16px; z-index: 100; padding: 8px 16px; border-radius: 10px; background: var(--c-surface); color: var(--c-text); font-size: 14px; transform: translateY(-200%); } .skip-link:focus { transform: none; } /* Header: the dark brand bar in both modes. */ .site-header { position: sticky; top: 0; z-index: 40; display: flex; align-items: center; gap: 16px; height: 64px; padding: 0 24px; background: var(--c-side); border-bottom: 1px solid var(--c-side-border); color: var(--c-side-text); } .header-spacer { flex: 1; } .wordmark { display: inline-flex; align-items: center; gap: 8px; color: #ffffff; font-size: 20px; font-weight: 600; line-height: 1.3; text-decoration: none; } .wordmark-sun { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 999px; background: var(--c-accent-soft); color: var(--c-accent); } .wordmark-sun .icon { width: 20px; height: 20px; vertical-align: 0; } .wordmark-cms { color: var(--c-accent); } .icon-button, .theme-toggle, .search-trigger { position: relative; display: none; align-items: center; justify-content: center; gap: 8px; height: 40px; border: 0; border-radius: 10px; background: transparent; color: var(--c-side-text); font: inherit; cursor: pointer; transition: color var(--ease), background-color var(--ease); } .icon-button, .theme-toggle { width: 40px; } .icon-button::before, .theme-toggle::before, .search-trigger::before { content: ""; position: absolute; inset: -2px; } .icon-button:hover, .theme-toggle:hover, .search-trigger:hover { color: #ffffff; background: var(--c-side-hover); } .icon-button .icon, .theme-toggle .icon, .search-trigger .icon { width: 20px; height: 20px; vertical-align: 0; } html.js .theme-toggle, html.js .search-trigger { display: inline-flex; } .search-trigger-label, .search-trigger kbd { display: none; } .theme-toggle .icon { display: none; } .theme-toggle[data-theme="system"] .icon-monitor, .theme-toggle[data-theme="light"] .icon-sun, .theme-toggle[data-theme="dark"] .icon-moon { display: block; } .menu-button .icon-x { display: none; } .menu-button[aria-expanded="true"] .icon-menu { display: none; } .menu-button[aria-expanded="true"] .icon-x { display: block; } kbd { padding: 0 4px; border: 1px solid var(--c-border-strong); border-radius: 4px; font-family: var(--font-sans); font-size: 14px; line-height: 1.5; } /* Layout */ .layout { display: block; } .sidebar-panel { background: var(--d-panel); border-right: 1px solid var(--c-border); } .sidebar { padding: 24px 16px; font-size: 14px; line-height: 1.5; } .sidebar-section + .sidebar-section { margin-top: 24px; } .sidebar-title { margin: 0 0 8px; padding: 0 8px; color: var(--c-text); font-weight: 600; } .sidebar ul { margin: 0; padding: 0; list-style: none; } .sidebar a { display: flex; align-items: center; min-height: 32px; padding: 4px 8px; border-radius: 8px; color: var(--c-muted); text-decoration: none; transition: color var(--ease), background-color var(--ease); } .sidebar-api a { font-family: var(--font-mono); } .sidebar a:hover { background: var(--c-hover); color: var(--c-text); } .sidebar a[aria-current="page"] { background: var(--c-sel); color: var(--c-text); font-weight: 600; } .scrim[hidden] { display: none; } main { min-width: 0; padding: 24px 16px 48px; } main:focus { outline: none; } .page { display: block; } .page-body { min-width: 0; max-width: 768px; } @media (min-width: 1024px) { .layout { display: grid; grid-template-columns: 272px minmax(0, 1fr); min-height: calc(100vh - 64px); } .sidebar-panel { position: sticky; top: 64px; height: calc(100vh - 64px); overflow-y: auto; } main { padding: 48px 32px 64px; } .search-trigger { justify-content: flex-start; width: 256px; padding: 0 16px; border: 1px solid rgba(255, 255, 255, 0.12); color: var(--c-side-label); font-size: 14px; } .search-trigger-label { display: inline; flex: 1; text-align: left; } .search-trigger kbd { display: inline; border-color: rgba(255, 255, 255, 0.2); } } @media (max-width: 1023.98px) { html.js .menu-button { display: inline-flex; } html.js .sidebar-panel { position: fixed; top: 64px; bottom: 0; left: 0; z-index: 30; width: 304px; max-width: 85vw; overflow-y: auto; transform: translateX(-100%); transition: transform 200ms ease-out; visibility: hidden; } html.js .sidebar-panel.open { transform: none; visibility: visible; } html.js .scrim { position: fixed; inset: 64px 0 0; z-index: 20; background: var(--c-overlay); } html:not(.js) .sidebar-panel { border-right: 0; border-bottom: 1px solid var(--c-border); } } @media (min-width: 1280px) { .page.has-toc { display: grid; grid-template-columns: minmax(0, 768px) 224px; gap: 48px; } .toc-inline { display: none; } } /* Page head */ .eyebrow { margin: 0 0 8px; color: var(--c-muted); font-size: 14px; font-weight: 600; line-height: 1.5; } h1, h2, h3, h4, h5, h6 { scroll-margin-top: 96px; color: var(--c-text); } h1 { margin: 0; font-size: 32px; font-weight: 600; line-height: 1.2; letter-spacing: -0.02em; } .lead { margin: 8px 0 16px; color: var(--c-muted); font-size: 20px; font-weight: 400; line-height: 1.3; } .page-actions { display: flex; flex-wrap: wrap; gap: 16px; padding-bottom: 24px; border-bottom: 1px solid var(--c-border); font-size: 14px; line-height: 1.5; } .page-actions a { display: inline-flex; align-items: center; gap: 4px; color: var(--c-muted); text-decoration: none; } .page-actions a:hover { text-decoration: underline; } /* TOC */ .toc-inline { margin-top: 16px; border: 1px solid var(--c-border); border-radius: 12px; font-size: 14px; line-height: 1.5; } .toc-inline summary { padding: 8px 16px; font-weight: 600; cursor: pointer; } .toc-inline ul, .toc ul { margin: 0; padding: 0 0 8px; list-style: none; } .toc-inline ul { padding: 0 16px 8px; } .toc-inline a, .toc a { display: block; min-height: 32px; padding: 4px 8px; border-left: 2px solid transparent; color: var(--c-muted); text-decoration: none; } .toc-h3 a { padding-left: 24px; } .toc a:hover, .toc-inline a:hover { color: var(--c-text); } .toc a[aria-current="location"] { border-left-color: var(--c-primary); color: var(--c-text); } .toc { display: none; } @media (min-width: 1280px) { .toc { display: block; position: sticky; top: 96px; align-self: start; max-height: calc(100vh - 128px); overflow-y: auto; font-size: 14px; line-height: 1.5; } } .toc-title { margin: 0 0 8px; font-weight: 600; } /* Prose */ .prose { padding-top: 8px; } .prose p, .prose ul, .prose ol { margin: 0 0 16px; } .prose ul ul, .prose ol ol, .prose ul ol, .prose ol ul { margin: 8px 0 0; } .prose ul, .prose ol { padding-left: 24px; } .prose h2 { margin: 48px 0 16px; font-size: 20px; font-weight: 600; line-height: 1.3; } .prose h3, .prose h4, .prose h5, .prose h6 { margin: 32px 0 8px; font-size: 16px; font-weight: 600; line-height: 1.5; } .prose a { color: var(--c-primary); text-decoration: underline; text-decoration-thickness: 1px; text-decoration-color: var(--c-border-strong); text-underline-offset: 3px; overflow-wrap: anywhere; transition: text-decoration-color var(--ease); } .prose a:hover { text-decoration-color: currentColor; } .heading-anchor { margin-left: 8px; color: var(--c-muted) !important; text-decoration: none !important; opacity: 0; } h2:hover .heading-anchor, h3:hover .heading-anchor, .heading-anchor:focus { opacity: 1; } @media (hover: none) { .heading-anchor { display: none; } } strong { font-weight: 600; } code { font-family: var(--font-mono); font-weight: 400; } :not(pre) > code { padding: 0 4px; border-radius: 6px; background: var(--c-subtle); font-size: 0.875em; overflow-wrap: anywhere; } .prose table { display: block; max-width: 100%; margin: 0 0 24px; overflow-x: auto; border-collapse: collapse; font-size: 14px; line-height: 1.5; font-variant-numeric: tabular-nums; } .prose th, .prose td { padding: 8px 16px; border-bottom: 1px solid var(--c-border); text-align: left; vertical-align: top; } .prose th { background: var(--c-subtle); font-weight: 600; } .prose img { max-width: 100%; border: 1px solid var(--c-border); border-radius: 12px; } .prose blockquote { margin: 0 0 16px; padding-left: 16px; border-left: 4px solid var(--c-border-strong); color: var(--c-muted); } .prose hr { margin: 48px 0; border: 0; border-top: 1px solid var(--c-border); } /* Code blocks */ figure.code { position: relative; margin: 0 0 24px; overflow: hidden; border: 1px solid var(--c-border); border-radius: 12px; background: var(--c-subtle); } figure.code figcaption { display: flex; align-items: center; height: 32px; padding: 0 48px 0 16px; border-bottom: 1px solid var(--c-border); color: var(--c-muted); font-family: var(--font-mono); font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } figure.code figcaption a { color: inherit; text-decoration: none; } figure.code figcaption a:hover { text-decoration: underline; } figure.code pre { margin: 0; padding: 16px; overflow-x: auto; color: var(--tok-plain); font-family: var(--font-mono); font-size: 14px; line-height: 1.6; tab-size: 4; white-space: pre; } .copy-button { position: absolute; top: 8px; right: 8px; display: none; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; border: 0; border-radius: 8px; background: transparent; color: var(--c-muted); cursor: pointer; transition: background-color var(--ease); } figure.code figcaption + .copy-button { top: 0; } html.js .copy-button:not([hidden]) { display: inline-flex; } .copy-button:hover { background: var(--c-hover); } .copy-button .icon-check, .copy-button.copied .icon-copy { display: none; } .copy-button.copied .icon-check { display: block; } .tok-kw, .tok-key { color: var(--tok-kw); } .tok-str { color: var(--tok-str); } .tok-com { color: var(--tok-com); } .tok-num { color: var(--tok-num); } .tok-prompt { color: var(--tok-prompt); user-select: none; } /* Callouts */ .callout { margin: 0 0 24px; padding: 16px; border-left: 4px solid; border-radius: 12px; color: var(--c-text); font-size: 14px; line-height: 1.5; } .callout-title { display: flex; align-items: center; gap: 16px; margin: 0 0 8px; font-weight: 600; } .callout-body > :last-child { margin-bottom: 0; } .callout-note { background: var(--c-subtle); border-left-color: var(--c-border-strong); } .callout-note .icon { color: var(--c-muted); } .callout-tip { background: var(--c-ok-bg); border-left-color: var(--c-ok-text); } .callout-tip .icon { color: var(--c-ok-text); } .callout-warning { background: var(--c-danger-soft); border-left-color: var(--c-danger); } .callout-warning .icon { color: var(--c-danger); } /* Pager */ .pager { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 32px; } .pager-card { display: flex; flex-direction: column; gap: 4px; padding: 16px; border: 1px solid var(--c-border); border-radius: 12px; text-decoration: none; transition: border-color var(--ease), background-color var(--ease); } .pager-card:hover { border-color: var(--c-border-strong); background: var(--c-hover); } .pager-next { grid-column: 2; align-items: flex-end; text-align: right; } .pager-label { display: inline-flex; align-items: center; gap: 4px; color: var(--c-muted); font-size: 14px; line-height: 1.5; } .pager-title { color: var(--c-primary); font-size: 16px; font-weight: 600; } .pager-section { color: var(--c-muted); font-size: 14px; line-height: 1.5; } @media (max-width: 639.98px) { .pager { grid-template-columns: 1fr; } .pager-next { grid-column: 1; } .pager-empty { display: none; } } /* Footer */ .site-footer { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 16px; max-width: 768px; margin-top: 48px; padding: 24px 0; border-top: 1px solid var(--c-border); color: var(--c-muted); font-size: 14px; line-height: 1.5; } .footer-links { display: inline-flex; gap: 16px; } .site-footer a { color: var(--c-muted); } /* Search dialog */ dialog.search { width: 640px; max-width: calc(100vw - 32px); margin: 96px auto auto; padding: 16px; border: 1px solid var(--c-border); border-radius: 16px; background: var(--d-page); color: var(--c-text); box-shadow: var(--shadow-pop); } dialog.search::backdrop { background: var(--c-overlay); animation: backdrop-in 200ms ease-out; } @keyframes backdrop-in { from { opacity: 0; } to { opacity: 1; } } .search-field { position: relative; display: flex; align-items: center; } .search-field .icon { position: absolute; left: 16px; color: var(--c-muted); pointer-events: none; } .search-input { width: 100%; height: 44px; padding: 0 16px 0 44px; border: 1px solid var(--c-border-strong); border-radius: 10px; background: var(--d-page); color: var(--c-text); font: inherit; font-size: 16px; } .search-input::placeholder { color: var(--c-placeholder); } .search-input:focus { outline: none; border-color: var(--c-primary); box-shadow: 0 0 0 3px var(--c-ring); } .search-status { padding: 16px 8px 0; color: var(--c-muted); font-size: 14px; line-height: 1.5; } .search-status:empty { display: none; } .search-status-title { margin: 0 0 4px; color: var(--c-text); font-size: 16px; font-weight: 600; } .search-status p { margin: 0; } .search-results { max-height: 60vh; margin: 8px 0 0; padding: 0; overflow-y: auto; list-style: none; } .search-results:empty { display: none; } .search-result { padding: 8px 16px; border-radius: 8px; cursor: pointer; } .search-result[aria-selected="true"] { background: var(--c-sel); } .search-result-path { color: var(--c-muted); font-size: 14px; line-height: 1.5; } .search-result-heading { font-size: 16px; font-weight: 600; } .search-result-excerpt { display: -webkit-box; overflow: hidden; color: var(--c-muted); font-size: 14px; line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; } mark { background: var(--c-sel); color: inherit; } /* 404 */ .docs-404 .page-body { padding-top: 24px; } /* Motion */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition: none !important; animation: none !important; } } /* Print */ @media print { .site-header, .sidebar-panel, .scrim, .toc, .toc-inline, .page-actions, .pager, .copy-button, .heading-anchor, .skip-link, dialog.search { display: none !important; } :root, :root.dark { --c-text: #000000; --c-muted: #000000; --d-page: #ffffff; color-scheme: light; } body { background: #ffffff; color: #000000; } .layout, .page.has-toc { display: block; } main { padding: 0; } .page-body { max-width: none; } }