From 8afd7121ba05e49a195d74b2376505eafae4b4dc Mon Sep 17 00:00:00 2001 From: August L-R Date: Thu, 25 Jun 2026 14:29:00 +0000 Subject: [PATCH 01/13] chore: ignore generated reference build output --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 8bd44695..41fe09e7 100644 --- a/.gitignore +++ b/.gitignore @@ -247,3 +247,5 @@ Anaconda3-2024.02-1-Linux-x86_64.sh chunks.json my_chunks *.swsearch +reference/_docs/ +reference/_site/ From 0b76c51b8fb64878a6b2b402a4c81a244b2b8deb Mon Sep 17 00:00:00 2001 From: August L-R Date: Thu, 25 Jun 2026 14:29:40 +0000 Subject: [PATCH 02/13] feat(reference): inject Fern navbar and theme --- reference/assets/css/navbar.css | 205 ++++++++ reference/assets/fern/fern.css | 522 +++++++++++++++++++ reference/assets/fern/tokens.css | 182 +++++++ reference/assets/fonts/instrument-sans.woff2 | Bin 0 -> 30092 bytes reference/assets/fonts/lexend-400.woff2 | Bin 0 -> 14476 bytes reference/assets/img/logo-no-text.svg | 20 + reference/assets/img/signalwire-favicon.png | Bin 0 -> 89743 bytes reference/assets/js/navbar.js | 132 +++++ reference/overrides/main.html | 157 ++++++ 9 files changed, 1218 insertions(+) create mode 100644 reference/assets/css/navbar.css create mode 100644 reference/assets/fern/fern.css create mode 100644 reference/assets/fern/tokens.css create mode 100644 reference/assets/fonts/instrument-sans.woff2 create mode 100644 reference/assets/fonts/lexend-400.woff2 create mode 100644 reference/assets/img/logo-no-text.svg create mode 100644 reference/assets/img/signalwire-favicon.png create mode 100644 reference/assets/js/navbar.js create mode 100644 reference/overrides/main.html diff --git a/reference/assets/css/navbar.css b/reference/assets/css/navbar.css new file mode 100644 index 00000000..0b5da117 --- /dev/null +++ b/reference/assets/css/navbar.css @@ -0,0 +1,205 @@ +/* ============================================================================= + Fern navbar, injected above MkDocs Material. + Adapted from the SDK-docs POC (assets/css/app.css). Differences: + - The navbar is a fixed bar that sits ABOVE Material's own header; Material + content is pushed down by --header-height. There is no iframe. + - The Fern design tokens (assets/fern/tokens.css) key off a `.light`/`.dark` + class. Material instead sets data-md-color-scheme on + (default | slate). The bridge below mirrors the scheme onto that class so + the Fern tokens light up, and the theme toggle just drives Material. + ============================================================================= */ + +/* --- Token bridge: Material color scheme -> Fern .light/.dark tokens --------- */ +[data-md-color-scheme="default"] { /* applies the Fern light token block */ } +[data-md-color-scheme="slate"] { /* applies the Fern dark token block */ } + +/* The Fern tokens.css scopes its dark palette under `.dark`. Material's slate + scheme lives on , so re-declare the dark + accent/background hooks there. (Light is the :root default, no work needed.) */ +[data-md-color-scheme="slate"] { + color-scheme: dark; + --accent: rgba(64, 224, 208, 1); + --background: rgba(14, 14, 24, 1); + --header-background: color-mix(in srgb, var(--background), transparent 30%); + + --accent-9: #40e0d0; --accent-11: #32d7c7; --accent-12: #b9f6ed; + --accent-a3: #00fe9820; --accent-a5: #00fcc53e; --accent-a9: #47feeadf; + --accent-a11: #3affead5; --accent-contrast: #042824; + + --grayscale-3: #212225; --grayscale-5: #2e3135; --grayscale-8: #5a6169; + --grayscale-9: #696e77; --grayscale-11: #b0b4ba; --grayscale-12: #edeef0; + --grayscale-a3: #ddeaf814; --grayscale-a5: #d9edfe25; --grayscale-a9: #dfebfd6d; + --grayscale-a11: #f1f7feb5; + --grayscale-contrast: #000; --grayscale-surface: rgba(0, 0, 0, 0.05); +} + +/* --- Make room for the fixed Fern header ------------------------------------ */ +:root { --fern-header-height: var(--header-height, 64px); } + +/* Push Material's sticky header and the whole layout down by our bar height. */ +.md-header { top: var(--fern-header-height) !important; } +[data-md-color-scheme] body { padding-top: var(--fern-header-height); } +/* Material's announce/header offset for the in-page TOC scroll spy. */ +:root { scroll-padding-top: calc(var(--fern-header-height) + 3rem); } + +/* ============================================================================= + Header bar (markup ported from POC index.html) + ============================================================================= */ +#fern-header { + position: fixed; + top: 0; left: 0; right: 0; + height: var(--fern-header-height); + z-index: 1000; /* above Material's header (z 5) and sidebars */ + background: var(--background); + border-bottom: 1px solid var(--grayscale-a5); + font-family: var(--font-body); +} +#fern-header .fern-header-content { + display: flex; + align-items: center; + gap: calc(var(--spacing) * 4); + height: 100%; + max-width: 1600px; + margin: 0 auto; + padding: 0 calc(var(--spacing) * 6); +} +#fern-header .fern-header-logo-container { + display: flex; + align-items: center; + gap: calc(var(--spacing) * 3); +} +#fern-header [data-fern-logo] { + display: inline-flex; + align-items: center; + gap: calc(var(--spacing) * 2); + text-decoration: none; + color: var(--grayscale-12); +} +#fern-header [data-fern-logo] img { height: 28px; width: auto; display: block; } +#fern-header .fern-logo-text { font-weight: 600; font-size: var(--text-sm); white-space: nowrap; } + +#fern-header .fern-header-center { flex: 1; display: flex; justify-content: center; min-width: 0; } +#fern-header .fern-header-center .lang-trigger { max-width: 360px; } + +/* --- Language switcher trigger (search-bar slot) --- */ +.lang-trigger { + appearance: none; background: transparent; border: 0; font: inherit; + flex: 1; display: inline-flex; align-items: center; + gap: calc(var(--spacing) * 2); + height: calc(var(--spacing) * 9); + padding: calc(var(--spacing) * 2); + border-radius: calc(var(--radius) * 2); + box-shadow: inset 0 0 0 1px var(--grayscale-a5); + color: var(--grayscale-a11); font-size: var(--text-sm); font-weight: 500; + cursor: pointer; overflow: hidden; + transition: background-color 0.15s, box-shadow 0.15s; +} +.lang-trigger:hover, .lang-trigger[data-state="open"] { background-color: var(--grayscale-a3); } +.lang-trigger:focus-visible { outline: none; box-shadow: inset 0 0 0 1px var(--accent); } +.lang-trigger svg { width: calc(var(--spacing) * 4); height: calc(var(--spacing) * 4); flex-shrink: 0; } +.lang-trigger .lang-trigger-label { color: var(--grayscale-12); white-space: nowrap; } +.lang-trigger .lang-trigger-meta { + margin-left: auto; color: var(--grayscale-a9); font-weight: 400; + white-space: nowrap; overflow: hidden; text-overflow: ellipsis; +} + +/* --- Right-side button group --- */ +.fern-button-group { display: inline-flex; align-items: center; gap: calc(var(--spacing) * 2); } +.fern-button { + appearance: none; border: 0; background: transparent; cursor: pointer; + font: inherit; font-size: var(--text-sm); font-weight: 500; + color: var(--grayscale-12); text-decoration: none; + display: inline-flex; align-items: center; + height: calc(var(--spacing) * 9); padding: 0 calc(var(--spacing) * 3); + border-radius: calc(var(--radius) * 2); + transition: background-color 0.15s, box-shadow 0.15s; +} +.fern-button .fern-button-content { display: inline-flex; align-items: center; gap: calc(var(--spacing) * 1.5); } +.fern-button.minimal:hover { background: var(--grayscale-a3); } +.fern-button.outlined { box-shadow: inset 0 0 0 1px var(--grayscale-a7); } +.fern-button.outlined:hover { background: var(--grayscale-a3); } +.fern-button svg { width: calc(var(--spacing) * 4); height: calc(var(--spacing) * 4); } + +.fern-icon-button { + appearance: none; border: 0; background: transparent; cursor: pointer; + color: var(--grayscale-12); + display: inline-flex; align-items: center; justify-content: center; + width: calc(var(--spacing) * 9); height: calc(var(--spacing) * 9); + border-radius: calc(var(--radius) * 2); + transition: background-color 0.15s; +} +.fern-icon-button:hover { background: var(--grayscale-a3); } +.fern-icon-button svg { width: calc(var(--spacing) * 5); height: calc(var(--spacing) * 5); } + +/* --- Product selector trigger --- */ +.fern-product-selector { + appearance: none; border: 0; background: transparent; cursor: pointer; font: inherit; + display: inline-flex; align-items: center; + padding: calc(var(--spacing) * 1.5) calc(var(--spacing) * 2); + border-radius: calc(var(--radius) * 2); + color: var(--grayscale-12); + transition: background-color 0.15s; +} +.fern-product-selector:hover { background: var(--grayscale-a3); } +.product-dropdown-trigger { display: inline-flex; align-items: center; gap: calc(var(--spacing) * 1.5); } +.product-item-title { margin: 0; font-size: var(--text-sm); font-weight: 600; } +.product-dropdown-trigger svg { width: calc(var(--spacing) * 4); height: calc(var(--spacing) * 4); } + +/* ============================================================================= + Dropdown panels + ============================================================================= */ +.fern-dropdown, .fern-dropdown-panel { + position: fixed; + background: var(--background); + border: 1px solid var(--grayscale-a5); + border-radius: calc(var(--radius) * 3); + box-shadow: 0 10px 38px -10px rgba(0,0,0,.35), 0 10px 20px -15px rgba(0,0,0,.2); + padding: calc(var(--spacing) * 1.5); + z-index: 1100; + display: none; +} +.fern-dropdown[data-state="open"], .fern-dropdown-panel[data-state="open"] { display: block; } + +.fern-dropdown-item { + appearance: none; border: 0; background: transparent; cursor: pointer; width: 100%; + font: inherit; font-size: var(--text-sm); text-align: left; text-decoration: none; + color: var(--grayscale-12); + display: flex; align-items: center; gap: calc(var(--spacing) * 2); + padding: calc(var(--spacing) * 2) calc(var(--spacing) * 3); + border-radius: calc(var(--radius) * 2); +} +.fern-dropdown-item:hover { background: var(--accent-a3); } +.fern-dropdown-item svg { width: calc(var(--spacing) * 4); height: calc(var(--spacing) * 4); flex-shrink: 0; } +.fern-dropdown-item-indicator { width: 16px; display: inline-flex; flex-shrink: 0; } +.fern-dropdown-item-indicator svg { width: 14px; height: 14px; } + +/* --- Product mega panel --- */ +#product-panel { width: min(680px, 92vw); padding: calc(var(--spacing) * 3); } +.fern-product-selector-radio-group { display: grid; grid-template-columns: 1fr 1fr; gap: calc(var(--spacing) * 2); } +.fern-product-selector-radio-group > a { text-decoration: none; color: inherit; border-radius: calc(var(--radius) * 2); } +.fern-product-selector-radio-group > a:hover { background: var(--accent-a3); } +.fern-product-selector-radio-group > a[data-state="active"] { background: var(--accent-a3); box-shadow: inset 0 0 0 1px var(--accent-a8); } +.fern-selection-item { padding: calc(var(--spacing) * 2.5); } +.fern-selection-item .item-main { display: flex; gap: calc(var(--spacing) * 3); align-items: flex-start; } +.fern-selection-item-icon { width: 22px; height: 22px; color: var(--accent); flex-shrink: 0; } +.fern-selection-item-icon svg { width: 100%; height: 100%; } +.fern-selection-item-title { margin: 0 0 2px; font-size: var(--text-sm); font-weight: 600; } +.fern-selection-item-subtitle { margin: 0; font-size: var(--text-xs); color: var(--grayscale-a11); line-height: 1.35; } + +/* --- Language dropdown items --- */ +#lang-panel { min-width: 320px; } +#lang-panel .fern-dropdown-item { gap: calc(var(--spacing) * 2); } +#lang-panel .item-meta { margin-left: auto; padding-left: calc(var(--spacing) * 4); font-size: var(--text-xs); color: var(--grayscale-a9); } +.lang-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--lang-color, var(--grayscale-8)); display: inline-block; flex-shrink: 0; } +#lang-panel .fern-dropdown-item[aria-current="true"] { background: var(--accent-a3); } + +/* --- Responsive: collapse like the Fern header --- */ +@media (max-width: 1023px) { + #fern-header .fern-header-navbar-links .fern-button-text { display: none; } + #fern-header .fern-logo-text { display: none; } + .lang-trigger .lang-trigger-meta { display: none; } +} +@media (max-width: 600px) { + #product-panel { width: 96vw; } + .fern-product-selector-radio-group { grid-template-columns: 1fr; } +} diff --git a/reference/assets/fern/fern.css b/reference/assets/fern/fern.css new file mode 100644 index 00000000..640c9c2a --- /dev/null +++ b/reference/assets/fern/fern.css @@ -0,0 +1,522 @@ +/* ============================================================================= + FERN HEADER CLONE — component styles + Selectors and values lifted from Fern's compiled CSS on signalwire.com/docs, + plus SignalWire's custom product-selector styling (fern/styles.css). + Trimmed to what the header actually uses. + ============================================================================= */ + +/* --- Header shell --- */ +#fern-header { + position: fixed; + inset-inline: 0; + top: 0; + z-index: 30; + background-color: var(--header-background); + border-bottom: 1px solid var(--grayscale-a3); + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); +} + +.fern-header-content { + height: var(--header-height); + padding-inline: var(--page-padding); + display: flex; + align-items: center; + gap: 1rem; + width: 100%; +} + +.fern-header-logo-container { + display: flex; + align-items: center; + gap: calc(var(--spacing) * 2); + min-width: fit-content; + height: 100%; + flex: 1 0 0; +} + +a[data-fern-logo] { + display: flex; + align-items: center; + width: fit-content; + flex-shrink: 0; + text-decoration: none; +} + +a[data-fern-logo] img { + height: 25px; + width: auto; + display: block; +} + +.fern-logo-text { + font-family: var(--font-heading), sans-serif; + font-weight: 500; + font-size: 1.25rem; + color: var(--grayscale-12); + letter-spacing: -0.01em; + position: relative; + top: -1px; + margin-left: calc(var(--spacing) * 1); +} + +.fern-header-selectors { + display: flex; + align-items: baseline; +} + +.fern-header-center { + width: 100%; + max-width: var(--content-width); + display: flex; + gap: calc(var(--spacing) * 2); +} + +.fern-header-navbar-links { + flex: 1; + display: flex; + justify-content: flex-end; + align-items: center; +} + +/* --- Buttons (fern-button: minimal / outlined) --- */ +.fern-button { + appearance: none; + background: transparent; + border: 0; + font: inherit; + border-radius: calc(var(--radius) * 2); + font-size: var(--text-sm); + height: calc(var(--spacing) * 8); + padding-block: calc(var(--spacing) * 1); + padding-inline: calc(var(--spacing) * 3); + display: inline-flex; + justify-content: center; + align-items: center; + cursor: pointer; + text-decoration: none; + transition-property: color, background-color, border-color, box-shadow; + transition-duration: 0.15s; + white-space: nowrap; +} + +.fern-button svg { + height: calc(var(--spacing) * 4); + width: calc(var(--spacing) * 4); + flex-shrink: 0; +} + +.fern-button:has(> .fern-button-content > svg:last-child) { + padding-right: calc(var(--spacing) * 2); +} + +.fern-button > .fern-button-content { + display: inline-flex; + align-items: center; + gap: calc(var(--spacing) * 1.5); + height: calc(var(--spacing) * 6); +} + +.fern-button.minimal { + color: var(--grayscale-a11); +} + +.fern-button.minimal:hover { + color: var(--grayscale-12); + background-color: var(--grayscale-a3); +} + +.fern-button.minimal[data-state="open"] { + background-color: var(--grayscale-a3); +} + +.fern-button.outlined { + color: var(--grayscale-12); + box-shadow: inset 0 0 0 1px var(--grayscale-a5); +} + +.fern-button.outlined:hover, +.fern-button.outlined[data-state="open"] { + background-color: var(--grayscale-a3); +} + +.fern-button-group { + display: inline-flex; + align-items: center; +} + +.fern-button-group > .fern-button.outlined:has(+ .fern-button.minimal), +.fern-button-group > .fern-button:has(+ .fern-button.outlined) { + margin-right: calc(var(--spacing) * 2); +} + +/* Icon-only button (theme toggle) */ +.fern-icon-button { + appearance: none; + background: transparent; + border: 0; + border-radius: calc(var(--radius) * 2); + width: calc(var(--spacing) * 9); + height: calc(var(--spacing) * 9); + margin-left: calc(var(--spacing) * 2); + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: var(--grayscale-a11); + transition: color 0.15s, background-color 0.15s; +} + +.fern-icon-button svg { + width: calc(var(--spacing) * 4); + height: calc(var(--spacing) * 4); +} + +.fern-icon-button:hover, +.fern-icon-button[data-state="open"] { + background-color: var(--accent-a3); + color: var(--accent-11); +} + +/* Chevron rotation on open dropdowns */ +.animate-dropdown-chevron { + transition: rotate 0.25s; +} + +[data-state="open"] .animate-dropdown-chevron { + rotate: 180deg; +} + +/* --- Dropdown menus (fern-dropdown) --- */ +.fern-dropdown { + position: fixed; + z-index: 50; + display: none; + flex-direction: column; + background-color: var(--background); + border: 1px solid var(--grayscale-a5); + border-radius: calc(var(--radius) * 2); + box-shadow: 0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a; + padding: calc(var(--spacing) * 1); + min-width: 11rem; + max-height: calc(100dvh - var(--header-height) - 2rem); + overflow-y: auto; + transform-origin: top; +} + +.fern-dropdown[data-state="open"] { + display: flex; + animation: dropdown-expand 0.15s ease-out; +} + +@keyframes dropdown-expand { + from { opacity: 0; transform: scale(0.96) translateY(-4px); } + to { opacity: 1; transform: scale(1) translateY(0); } +} + +.fern-dropdown .fern-dropdown-item { + appearance: none; + background: transparent; + border: 0; + font: inherit; + border-radius: var(--radius); + cursor: pointer; + font-size: var(--text-sm); + padding-block: calc(var(--spacing) * 1); + padding-inline: calc(var(--spacing) * 2); + text-align: left; + display: flex; + align-items: center; + width: 100%; + color: var(--grayscale-12); + text-decoration: none; + outline: none; +} + +.fern-dropdown .fern-dropdown-item:hover, +.fern-dropdown .fern-dropdown-item[data-highlighted] { + background-color: var(--accent); + color: var(--accent-contrast); +} + +.fern-dropdown .fern-dropdown-item .fern-dropdown-item-indicator { + width: calc(var(--spacing) * 4); + height: 100%; + margin-right: calc(var(--spacing) * 1); + flex: none; + display: flex; + align-items: center; + justify-content: center; +} + +.fern-dropdown .fern-dropdown-item svg { + width: calc(var(--spacing) * 4); + height: calc(var(--spacing) * 4); +} + +/* Status dropdown link — pulsing dot indicator (from fern/styles.css) */ +@keyframes status-pulse { + 0%, 100% { opacity: 1; transform: scale(1); } + 50% { opacity: 0.5; transform: scale(0.85); } +} + +a[href*="status.signalwire.com"]::after { + content: ""; + display: inline-block; + width: 0.5rem; + height: 0.5rem; + margin-left: 0.375rem; + border-radius: 50%; + background-color: var(--grayscale-10); + vertical-align: middle; + animation: status-pulse 2s ease-in-out infinite; +} + +/* --- Product switcher trigger --- */ +.fern-product-selector { + appearance: none; + background: transparent; + border: 0; + font: inherit; + padding: 0; + cursor: pointer; +} + +.product-dropdown-trigger { + display: flex; + align-items: center; + gap: calc(var(--spacing) * 1); + height: calc(var(--spacing) * 9); + padding-inline: calc(var(--spacing) * 2); + border-radius: calc(var(--radius) * 1.5); + color: var(--grayscale-a12); + transition: background-color 0.15s; +} + +.product-dropdown-trigger:hover, +.fern-product-selector[data-state="open"] .product-dropdown-trigger { + background-color: var(--grayscale-a4); +} + +.product-dropdown-trigger .product-item-title { + margin: 0; + font-size: var(--text-sm); + font-weight: 500; + width: fit-content; +} + +.product-dropdown-trigger svg { + width: calc(var(--spacing) * 4); + height: calc(var(--spacing) * 4); +} + +/* --- Product switcher panel --- */ +[data-testid="product-dropdown-content"] { + position: fixed; + z-index: 50; + display: none; + background-color: var(--background); + border: 1px solid var(--grayscale-a5); + border-radius: 1.5rem; + box-shadow: 0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a; + width: min(62rem, calc(100dvw - 3rem)); + max-height: 70vh; + overflow-y: auto; + transform-origin: top left; +} + +[data-testid="product-dropdown-content"][data-state="open"] { + display: block; + animation: dropdown-expand 0.15s ease-out; +} + +/* --- Product cards (fern-selection-item) --- */ +.fern-selection-item { + display: flex; + flex: 1; + align-items: center; + justify-content: space-between; + gap: calc(var(--spacing) * 2); + width: 100%; + padding-block: calc(var(--spacing) * 1); + padding-left: calc(var(--spacing) * 1); + padding-right: calc(var(--spacing) * 2.5); + border: 1px solid transparent; + border-radius: calc(var(--radius) * 1.5); + cursor: pointer; + text-align: left; + transition: all 0.2s ease-in-out; +} + +.fern-selection-item .item-main { + display: flex; + flex: 1; + align-items: center; + gap: calc(var(--spacing) * 2); +} + +.fern-selection-item .item-text { + display: flex; + flex-direction: column; +} + +.fern-selection-item .fern-selection-item-title { + margin: 0; + font-size: var(--text-sm); + line-height: 1.25; + font-weight: 700; + color: var(--grayscale-a12); +} + +.fern-selection-item .fern-selection-item-subtitle { + margin: 0; + font-size: var(--text-sm); + line-height: 1.25; + color: var(--grayscale-a9); +} + +.fern-selection-item .fern-selection-item-icon { + width: 56px; + height: 56px; + margin: calc(var(--spacing) * 1); + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + border-radius: calc(var(--radius) * 2); + color: var(--grayscale-a11); +} + +.fern-selection-item .fern-selection-item-icon.use-icon { + border: 1px solid var(--grayscale-a5); + padding: calc(var(--spacing) * 1); +} + +.fern-selection-item .fern-selection-item-icon svg { + display: block; + width: 50%; + height: 50%; + transition: all 0.3s ease-in-out; +} + +.fern-selection-item:hover { + background-color: var(--grayscale-a3); + color: var(--accent); +} + +.fern-selection-item:hover svg { + scale: 1.2; +} + +/* ============================================================================= + PRODUCT SELECTOR — SignalWire custom 3-column grouped layout + (clone of fern/styles.css, adapted: the demo adds an "SDK Reference" card + in the SDKs column, and the footer separator moves to row 4) + ============================================================================= */ + +.fern-product-selector-radio-group { + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1.5rem; + row-gap: 0.5rem; + padding: 3.5rem 1.25rem 0.4rem; +} + +.fern-product-selector-radio-group > a { + max-width: 320px; + position: relative; + text-decoration: none; +} + +.fern-product-selector-radio-group > a .fern-selection-item { + border-radius: 1rem; + height: 100%; +} + +/* Column 1: Products */ +.fern-product-selector-radio-group > a[href*="/docs/platform"] { grid-column: 1; grid-row: 1; } +.fern-product-selector-radio-group > a[href*="call-flow-builder"] { grid-column: 1; grid-row: 2; } + +/* Column 2: SDKs */ +.fern-product-selector-radio-group > a[href*="server-sdks"] { grid-column: 2; grid-row: 1; } +.fern-product-selector-radio-group > a[href*="browser-sdk"] { grid-column: 2; grid-row: 2; } +.fern-product-selector-radio-group > a[data-product="sdk-reference"] { grid-column: 2; grid-row: 3; } + +/* Column 3: APIs */ +.fern-product-selector-radio-group > a[href$="/docs/apis"] { grid-column: 3; grid-row: 1; } +.fern-product-selector-radio-group > a[href*="/docs/swml"] { grid-column: 3; grid-row: 2; } + +/* Current product (the demo itself) — accent ring like an active selection */ +.fern-product-selector-radio-group > a[data-state="active"] .fern-selection-item { + border-color: var(--accent-a5); + background-color: var(--accent-a2); +} + +.fern-product-selector-radio-group > a[data-state="active"] .fern-selection-item-icon { + color: var(--accent-11); +} + +/* Full-width separator above the footer row */ +.fern-product-selector-radio-group::after { + content: ""; + grid-column: 1 / -1; + grid-row: 4; + align-self: start; + border-top: 1px solid var(--grayscale-a5); + pointer-events: none; +} + +/* Compatibility API — text-only footer link, right-aligned */ +.fern-product-selector-radio-group > a[href*="compatibility-api"] { + grid-column: 1 / -1; + grid-row: 4; + max-width: none; + width: fit-content; + margin-left: auto; + display: flex; + align-items: center; + padding: 0.5rem 0.25rem 0; +} + +.fern-product-selector-radio-group > a[href*="compatibility-api"] .fern-selection-item { + display: none; +} + +.fern-product-selector-radio-group > a[href*="compatibility-api"]::after { + content: "Migrating from Twilio™? See Compatibility API \2192"; + font-size: 0.8rem; + color: var(--grayscale-a9); +} + +.fern-product-selector-radio-group > a[href*="compatibility-api"]:hover::after { + color: var(--accent-a11); +} + +/* Group header labels */ +.fern-product-selector-radio-group > a[href*="/docs/platform"]::before, +.fern-product-selector-radio-group > a[href*="server-sdks"]::before, +.fern-product-selector-radio-group > a[href$="/docs/apis"]::before { + position: absolute; + top: -2rem; + left: 0.5rem; + font-size: 0.7rem; + font-weight: 600; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--grayscale-a9); + pointer-events: none; +} + +.fern-product-selector-radio-group > a[href*="/docs/platform"]::before { + content: "Explore SignalWire"; + color: var(--grayscale-12); +} + +.fern-product-selector-radio-group > a[href*="server-sdks"]::before { + content: "SDKs"; +} + +.fern-product-selector-radio-group > a[href$="/docs/apis"]::before { + content: "APIs"; +} diff --git a/reference/assets/fern/tokens.css b/reference/assets/fern/tokens.css new file mode 100644 index 00000000..04375ccb --- /dev/null +++ b/reference/assets/fern/tokens.css @@ -0,0 +1,182 @@ +/* ============================================================================= + FERN DESIGN TOKENS — extracted from signalwire.com/docs (live render) + Radix-style accent + grayscale scales as generated by Fern from docs.yml: + accent-primary light #044ef4 (SW Blue) dark #40e0d0 (SW Turquoise) + background light #FAFBFC dark #0e0e18 + ============================================================================= */ + +@font-face { + font-family: "Lexend"; + src: url("../fonts/lexend-400.woff2") format("woff2"); + font-weight: 400; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Instrument Sans"; + src: url("../fonts/instrument-sans.woff2") format("woff2"); + font-weight: 500 700; + font-style: normal; + font-display: swap; +} + +:root { + --spacing: 0.25rem; + --radius: 0.25rem; + + --header-height: 64px; + --content-width: 640px; + --page-padding: 1.5rem; + + --font-body: "Lexend", ui-sans-serif, system-ui, sans-serif; + --font-heading: "Instrument Sans", "Lexend", ui-sans-serif, system-ui, sans-serif; + --font-code: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + + --text-xs: 0.75rem; + --text-sm: 0.875rem; +} + +/* --- Light: accent (SW Blue scale) --- */ +.light, :root { + --accent-1: #f8f9fa; + --accent-2: #f1f5fc; + --accent-3: #e5edfd; + --accent-4: #d5e5ff; + --accent-5: #c2daff; + --accent-6: #acccff; + --accent-7: #93b9ff; + --accent-8: #709ffd; + --accent-9: #044ef4; + --accent-10: #0544d3; + --accent-11: #104edd; + --accent-12: #102c68; + + --accent-a1: #50515203; + --accent-a2: #1563fc0a; + --accent-a3: #bbd1ff55; + --accent-a4: #d5e5ff; + --accent-a5: #c2daff; + --accent-a6: #acccff; + --accent-a7: #93b9ff; + --accent-a8: #0000ff55; + --accent-a9: #004bf4fb; + --accent-a10: #0040d2fa; + --accent-a11: #0042dbef; + --accent-a12: #001e5eef; + + --accent-contrast: #fff; + --accent-surface: #eff4fdcc; + --accent-indicator: #044ef4; +} + +/* --- Light: grayscale --- */ +.light, :root { + --grayscale-1: #fcfcfd; + --grayscale-2: #f9f9fb; + --grayscale-3: #f0f0f3; + --grayscale-4: #e8e8ec; + --grayscale-5: #e0e1e6; + --grayscale-6: #d9d9e0; + --grayscale-7: #cdced6; + --grayscale-8: #b9bbc6; + --grayscale-9: #8b8d98; + --grayscale-10: #80838d; + --grayscale-11: #60646c; + --grayscale-12: #1c2024; + + --grayscale-a1: #00005503; + --grayscale-a2: #00005506; + --grayscale-a3: #0000330f; + --grayscale-a4: #00002d17; + --grayscale-a5: #0009321f; + --grayscale-a6: #00002f26; + --grayscale-a7: #00062e32; + --grayscale-a8: #00083046; + --grayscale-a9: #00051d74; + --grayscale-a10: #00071b7f; + --grayscale-a11: #0007149f; + --grayscale-a12: #000509e3; + + --grayscale-contrast: #fff; + --grayscale-surface: #ffffffcc; +} + +/* --- Dark: accent (SW Turquoise scale) --- */ +.dark { + --accent-1: #091110; + --accent-2: #0e1b19; + --accent-3: #062c28; + --accent-4: #003b35; + --accent-5: #004842; + --accent-6: #005750; + --accent-7: #0e6961; + --accent-8: #0d8076; + --accent-9: #40e0d0; + --accent-10: #2fd5c6; + --accent-11: #32d7c7; + --accent-12: #b9f6ed; + + --accent-a1: #00ce0004; + --accent-a2: #0ffb2b0e; + --accent-a3: #00fe9820; + --accent-a4: #00feb330; + --accent-a5: #00fcc53e; + --accent-a6: #00fdcf4e; + --accent-a7: #0efdd861; + --accent-a8: #0cffde79; + --accent-a9: #47feeadf; + --accent-a10: #36ffebd3; + --accent-a11: #3affead5; + --accent-a12: #c0fff5f6; + + --accent-contrast: #042824; + --accent-surface: #0e281a80; + --accent-indicator: #40e0d0; +} + +/* --- Dark: grayscale --- */ +.dark { + --grayscale-1: #111113; + --grayscale-2: #18191b; + --grayscale-3: #212225; + --grayscale-4: #272a2d; + --grayscale-5: #2e3135; + --grayscale-6: #363a3f; + --grayscale-7: #43484e; + --grayscale-8: #5a6169; + --grayscale-9: #696e77; + --grayscale-10: #777b84; + --grayscale-11: #b0b4ba; + --grayscale-12: #edeef0; + + --grayscale-a1: #00000000; + --grayscale-a2: #d8f4f609; + --grayscale-a3: #ddeaf814; + --grayscale-a4: #d3edf81d; + --grayscale-a5: #d9edfe25; + --grayscale-a6: #d6ebfd30; + --grayscale-a7: #d9edff40; + --grayscale-a8: #d9edff5d; + --grayscale-a9: #dfebfd6d; + --grayscale-a10: #e5edfd7b; + --grayscale-a11: #f1f7feb5; + --grayscale-a12: #fcfdffef; + + --grayscale-contrast: #000; + --grayscale-surface: rgba(0, 0, 0, 0.05); +} + +/* --- Page surfaces --- */ +:root { + color-scheme: light; + --accent: rgba(4, 78, 244, 1); + --background: rgba(250, 251, 252, 1); + --header-background: color-mix(in srgb, var(--background), transparent 30%); +} + +.dark { + color-scheme: dark; + --accent: rgba(64, 224, 208, 1); + --background: rgba(14, 14, 24, 1); + --header-background: color-mix(in srgb, var(--background), transparent 30%); +} diff --git a/reference/assets/fonts/instrument-sans.woff2 b/reference/assets/fonts/instrument-sans.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8611e41b14c75cfc8360e50d0d22a22d20a1de50 GIT binary patch literal 30092 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

;7&cRT>@vBgT`qml^v#W*W zk*y;-tGgD88nGITaTr3OgeaCB+3tmTN$nKaK;z<%^TG+2A`MTEraop@Z))#+eDDi< zx<5ZP<8_ropdbQHYj7tA)mil-BVfgyYu1<|(+teh@mS454NWkP5? zoz*44G;9zdj|OTDQPe|-5}2X+*kqUnan{3GFt<)fHtuxTYoban2g)n$9X$_XtqsC@ zY-h{rk6O>KAgRP>Ght^cMrMVuE2svb@5xI2*h?1_XW~M@0uZ#|ttmIw@pj%qSN+)E zwIEkF!Zs1O7ph8}%x0GceQTOXwd!Q^86Ddpf=y*s#5Bj9EsjVqZ|iS%6|!zidxr6n z3Vb&1`dD|Jw7uAv>m<5A=(C-oG)e2wgdiqDu_I@Fd8RZp-tRttlQkrAhZ=8?XyPUr z#Y%Np0He31n=5-0QAv}yDkL5uE(6L3hsv20?gdB%OJ9NlbF^=V^@;xjhoYn*s;grK z#2EXS)v4K^0r=};N~sRKA2O3#OHvWoR2s{P$m6VoD&W}6%$3w)6DAHilwD1tu>!Lr z)6sSzn4PROQ6nIaNp*O*sZ3`8ai(EqkhIftZBD? zeVU@LTOGU4uSn>lx&U)3)Vnm%vOpb-S0<&YH&l**gDM~SLwADZQ$qsDi zm=PZZv*_6k`_E{Sx}PFadU4yVtwNinCo!D|+%6#ziw`YUS;EZ5D19WuV6}8KF?+3gD3Uh2Lq!luXS7xND1%IRNZGX(B^$wngzZ0y$!qxHF}QAA8nu^; zg5yMI+Gp7AYn^H~peSIOWv#;<6jBa?tQc9Emh>igyof}c7KUcuq+RJrX0KLV=Ns_a zI)IG4eYo~^4jaLxgTJe@ImrSHlJB5_z|i6EPBSn;#!-kmeMktq8xlei+!^;+^FBj_ zSH2gJ`&l45|A;^N_TvFz?SoI_sLTs6>Op^UQKQog4#%NBE~5r0?TwQw`34Kut5*&|T(0VU*!%Dqfp*VPHBx zvm8v#Nxl_QYr_rz|0VJc&tDViprZ>sYk^RFvxhgKy^C4T8WB6%9YJQ{Q_L>IhdDqy zm`8+YR~O-p>q@UvwK87FmFxl=mekxouSJk;i|d*Z5RgD7uJ@=4Ac$#!Tsu+wHPkX{ zNYV(|_;ZP^yd{~@c0j?ZV5^py@c0dNBm1^=0s%MG)Q5iBG+yU>DIW2`H6`@V;cnUx z&|*@Y!#oP;L(TYH=enHpt88viq2}FFvTSyoz2xwB+9 z$8||e@*li|q2ZxP- zwy5F<#($9QpwPTG%y-T(Ii|JCM|%8y{5L)t?`UHG9)A%Se_Ry)MiFH^b4i-ZGa?Wgmi# z&PIq$#X^!U6>wS`I@2?Y4UPBL z3)n7goF!M|2YLxa#=IyEuYI&4G+xy@R(r1&q|QZ;tPPwxslhM;qd2 zxeU~XL!hVm$Ne9E-E1^pVOD&)*UGG1i6`2a(1)LSo%kxhQH88W+}fY^p&wkQ*9EbT z4~%#xKHhBVkI$dMz!tKe;sBNWX$kVStoZ$S6zq905hk9@50{&Y^EiiGq93$ZQ`<^A z;Zm`Pcvr7qX94BrnD7m7r_sT(mY~!#`n(Iq>iAYZwm*$d*vkY`Q@E72$ot_!ice}-I@J-*8W6&? z;=t9Q4)!!+>>72bcRN6*vz9dO9)2@#<_jzyMi9E<&a1qSOU-b8C11724pmbS>{FaI z;Pw}>I*;GJmZO%k`)Hl_J=N(b#w<-iMvLW1v&4g*1{X9laycEi3bBPCm^retp!AqC zZ6nb!Id$Jp<+2(^00yje4&Aoa#&7iFfoRgQLv=tQbXhV?REb6O%*jQ}+gMpvE)5Uj zCYTg@Gf(d$Wv55as`?LK(?X%MHK$lw%{E(^cx`_(;zfZ0XrC?uusUc6%E6;RJcvmW zk|_tu2fBf1L?%E3bO2@t_fiS&aNM!c=2TRDouSHQ3u)Hih0J2O6_+*5y;SQlBEnWv z$Tko5AIv7#<1(x3zB)rAZ zowL~oTaY3FZxIs0E(i%gm*xP6u(cAl0oY)syy=jVQl&6=4}y^e`BZAsl;g(GSb;Om z`K_i@_6_HCQVHma%S-(qlQ%8Ufco_%cfD_$I_vTqc(M&S#PNE&(6f;Uieg+SM*`A|HO@{IG{AI=KcT$bd(QY)(2Uff%Co&N&wHBh;c(M`7Y8Ck% zS)@A-xnWu8h%6zj&=Ji!hnqM44d6~N0t%%Kq=QF|m+`9jU@%OOFu|H*{U1SYQnBu` zJN5HfXVX1=bWcDa7~%$W**3jdq?8y`R}F=wlUWDm1Gy0JNYaOB<3k*m3<{@Pr|Mux z!kmu)4=p@Oq@}yp*SrXcBO748=Q+%#kjgpPsA@pfxbA8$vmRv1_`vDOz_4ebG%((tS%69|sA#snjt7iDV z7btFVhuX!;n#X~*HDm2*$oJ{Ju%RwaKwmH?n;Z}Uo&p&p#G_>_SI)=B7VMhs%w4wh z$EJ}FXJ}g&8gW+1cZhH{ z@`=c@xtZn2@gW?n6>Nn4vkL8H3szLFG)aO!`sPU;Hgy0UU9x(pk_vM$ys=2U{q|QH z``pn}v-$lH<49r3LxdHl(FO*f*=!`%Cd0B2qBQf+RpXn}kXmiZQxx#di(y*K-*YS5 zQ(_~;8kT1nbfuQU_;iqwq-eGjt)WxEPujzsBkN+5Cn&uA;*eK^YAgX~yM(PDJ~^3vO4z2q{ghbuuisc5Ew}_% zAQTW%NR4nfqCDM;mf~lnr?Um<+ba<1LCc$J9xWj7F);H65ndZQnG^=cxCzvOCzUJB z6y6JzmcB6^8*P9k8*4np+p{yZx`Qhhp(KvV3Ukh2`$4e&h_#`4Gjyucp7uIRj!r4> zWSw(%RV+p_!eu1+K%H6PKz@UhFj6iOLqILdnTtF}w49=&VRMPKs<>vuv(f;OjRX(E zUzoNR)2b!xpViH)~#Adw6xya2EbsCr9#PE=%hMzr05Bwy4k!fD*J#&*gH(pccf8 zcbm-_pUSMrOtPRD<(&5`wR;gZ3fnLQ2WG{uLuZrf#&471CAG$B&-(69uwwky=J8E* zF4(hT1-zFNQx}3Ckqbg%X;mM_n^2iMoHII!s8NT8EK1OF2K#`r3|ft(7D=8^Dw5ji z{Ep+3>A+x784Kl(eu9Eg9+Z0E90loB^E;Q66 zy`&n`d9K7XQZ%eM4f{3?LcQ?D34j9Uz+|vE-r+)0Ma@7S&uU#xDCxH*oi9)**XbZR zE8CgKEXjzUl8RzFg-0abw?)K(Osd^!MkOhz#j)mxxJRllE#N{4KsE7<5eAnV zqbRprv~Zge2tI`q8{&!hLtF@T1lKhiI$)hv=B_Edhh7OaGKI-zO;T>zqu_#jnDL*~ zruvlcRM&E~(`+2LBjc=~(FKXiL0i&QvCJsk{g|AEr5vnfV~0m%Cvk#ElPE--j_W&7 z4d@cujrCseG;Qg~seny-;EoQBp6VIXx&$h20F0*acw5U9$sRTnKoGlQpm!<<9x_Pc zNBJ%Jj2E&^>BppXU7wee)rpS302ZVjr#J~D_%^~>I2Fs8+5du`&5<1 zKS&@d*o8u7G(#71*@C=6w5s;u4wgg%Z!74C@%?&&Pl>7hXvmPrS{nOH^|yt1(~zpj#eI zvwNu{fD~Lx^azY{JOCxPQI{e}h{5Jz#1fi?nY6VFEaf|{5k}|TTc(!X=Bh4{tl{kY zp~h0i=};H3Mc}os9RdzTHHt1iIj`bB4$4;m1$+Kb^6L)hQmjjMSulG_kos%R$%Y=O zMyJ^WWNW8AZ22eCs3R>S$rN3RU0Ix}fMCyeej6m6krtHI^!^UBm@LIkljRa2p;6$@ z;VPLxWV#CL>}nL~MdidIfk17i*o*S-APCadlVfrJv9iM!L8sMAZ2LS0XOmL&E^Ce$ z_zgLpC|aS+)X2D5vPjF-Li-`F*DP_N2fA7~GYv2$X&))d;p-BeyU`iaAsmj0n@wJ8 z#g|V6qyu~;{Hw+GEW6{g*HK`J@Q~JYUPunio?V>D>#y6Z&+3&<_$*k@G_z-&RS&)X zwR(ukQJCvErlT_qr=+tm9--lsQd*lmp7`VHsh<-Ymvc;b6q!zc`MWe77KL$FR8oG7 zE6?qf1P%h1-wH4Vup$uJl*)YYVL0pd!AJQ>bF~ zfwhz$=;kbzTNmO<|2ZM2vpzh&%2*R#0X$EZKGt0h>qoDpi~^?xwIUwKpK0a1`)s76 zu~{>pt9&Qs+*U%wK(OuDN@wGaT5ge47eFO4rbg`LD(XjzO^r_@UXklSCVSqXcIg_Q zK|9mB>8}SLKemZ!@AFb>yO2!rLSt(xDD%YPmSiyBd7vj^-rL|iM4%zs3#@IAS&Vmj z>bTe4>nzm4%j`u&iEB-*e$hlA%3vAK@)}UB%B`}t_8+yj`IGAm=(g_t+*89&0!B(Q zA(>AqH}oc08tPZzMm%0$zy%J}IkM%S!uxOtCr4@g1C^xiSZ%GRL;2%#@M97*xMg{o zh$bFrcv#>NO)wbKdJQ})Pe#**q#7o!A9%k~kpeh{=GHXz@Csw^-}Xiyk{nLOHePC< z`3Sppxxg4Z?v0UVkUhJ5joh`j+Em-fg?nOlK&_F)Q06@xZ@w!PPzn3744BQr zdC~Qjk48q-l+)j;eb^DJC;fC(j?z7eZRjoilrWXa=^fnxD2G%;n zLa!25=iSDlCMIcN5bB(nj81}!xW68%F~^oEB~>{| z^_G_hQeA-BG3ip6-MT|XEd%VV(==(S|sVU1UVlNGFh(T)NHz}P|c3tXZDnRr&vzY#_<2Ixa>qbuS4SWO*O0zz&8#BwC&2{x5eC40 zv338Ty?p|}tCuHWletEE7y8&tEktfRQIK`_69c42p`5kzxPq$PNNS6}Vt693UN>9% zvTK>)m3aK*;yXEdx_!X=ENa|zXx=+f9#mmtJ4_P8?1aB4F`7g}+3PbVq+G~wiC=aT z(e=G~t9{d~t5cjlg7~H0PGMFypiJ3-j}AzS0zAplrJz=7 zhq(|P;sqqsEs%zo$HYryQY;91Z zq}i4Z)4o<}NcwCskY>0O!L09qKB%a`1(g4yFEqH&DwyBFu-;_yF5M{^xY{`B8ffgy z;RBhXFw7&;b9}hr%hZj&l;1UuCfY~4t1?+4-iGze{j&3sE`fzwyOMGR6nZKJs7jyO z5t?9gXk;^h%K9%B%yM@gFL2^`vZz0?h9G`G)3obMdo0WH8Y1f#@JkhbvdKwebYM;S zV;6rradl1^khs!j{5q>OzG(9Wd1L-uxkxC9_%Bw*j{V%Tx|Lfm6ukQk+8IgHU!D1W zNOiuF*nhXS{k+m%%fZ=@GOe&2FR{cDi*;5Z1zm_>h0g?6 znSf!D!_!_r6>%}Lp%x}0(CplAR1KuKSg|KFtn$_ySb~6im~IGBN9weM^<96~vAQ>) zK|t8l&x1PX8A_V0M`pS0RQ@Fn`14Y=y9-gN?nQhiSkO9{+L3BW9xuMl>0xb`$2~KJcLvKC0be(tVu(_7ebf1h*o=r;&lh$io~g z!wslK3fCbEo?^m%-^U_?LX0L^&{={YEDPwSa25#2&V(y(9B3`$NzRQ#e8##Yd;rWW zLnk(NZ9aEE5H8v>%h50v4|1(-kg(GL?S?(-e>C@dyDMZG}44p zP8Ktk=oR=l%OIPg`SUfpIhcVaVwSYC2LV4!)H;qQ72&BwX`)?8;wgY#4ZQSXX|dr< zl@XI18G-FAnz7Hv@-)EX64^~byp7;aluB_|pvLndBOm>Po~9kX%P7oE3WSRX{c+!V&-h5*V;0LA*78;C4KT z=qd!#nwEZSoo}6N?P*PKjcCni>2FbJNw-w{{%)RYHflQ6glmdws`j~5LP|BIykbr< ztMF#QzrYb4%&*Bk&Y5$Wx#*mGF7~+julbc@wz##g?{WkB3lkTZ~X=68P{u+4(=hA#IWm7QG@W&N8ad-Q0Cp2aM_}+Nx7hHdpSnc&u zRhP8H`9Y56K)#WiGdP9D{pgN=MYP+Ur~czDT6u$?v5bM_$+u=Rt$FB-_UJ>pMl&=D zzd(ZnZ(Sxq+QSqp349;$jQJ z0Dtz3c5bE)nqRF>%S(ot{0e#yzjA$k3aZZX|KeF_w+Z0M*T5!Wu#8Z!BeFQ&pEs58 z*^nUhy=Gx(QXJwB4=8vI0wh@9TN2MgQ7{>iOdhxn7B`-!d&f^!0#NuG#F5~8rFen38YFI>QBlZ4qOf~4#0b7dv7#R=j{YoC zF-;mzp#OX&Lf)V%)LW*9zj2MQGtB^|9wYw1nh=-DMAbu_g?cQGUz_u`r?(-ow`Z8- z?c{qg*R1U74pA^2vPR-FU?9C{Mx866iE!^SaXkYTs$Pn)E8UNXUatEUTchdyjX{4O zWaM*QnxMy7v)09!u=g#C&`3q=aCjT_N}e_rzMGF?VjUM*823+HB&;41mw=sYQJC{q ztmf^I$hY@oa(#`mxc9Og?(;$k?a&Dk8Gudd>!lr>2#d2$Ly?G|YqI*6I*<54xQuuP=}2_->a8Q z@a}1RzQKJNiIsDA6b76`s~OKN>!AMpLgw967^_&eQ~3Dnw9@66dq$ttlLLm|J&9+q z%Z)T~RD0=gl%$Nb4VwhJ{KHzk%HMl0uUXy}PKzE#eg0u$y~S!&GypUzW}Z+xFuU09 zlaAIkKt&4$8!OX%q0633d%DU;s$}^DSOE6> z7wrN-fl^;)SyU%)-sO)nRNpj6>8&tT7RZMOl!$`O4#Tux%(%|cW55uK7eH`?HF_KX zvw-~HlgW)rI`L0Vjngfqi+2?}?QFkgw=K;kU2l^p7U$e(P-s8H(jdA;G>T1(kxTCC zV6>e2s3zzv^T1&mWM21KMRqD1coW$nyTg>gA_z(tknPPkh+dNMta906%|gEZDzPzm zE};`zwW@iBm>R~JtBZZd>J}Ij|8{G6I_+#wye>9IT~yn#tcbN?#FCjcYHyH?(T!<0 z0fXWe^{RE7sB!t+{0^9po_FOg4 zIC?ZX>>nA}`fEmiE??EeR#P=ILYs-1eYJ4(*IIjn_xMc^#XwQ>?mMezz!9we$g2(c zhfXtWg@XWsQ(}jIgzdWv_)3l6{BXDoHqOfjOhiFX=`^%m{q|I|N3m9&3$e$kISX)H#_!lSwv^j(s8~Rf)KHjZu4e zYr1$iCP83xTLY`Zfb|Yl(|UX6zMfly9y~7LbeIWt(r_Y)8^tWc%`&e}3NfA^epDWt zq-L^DJ!)0KQ8BHwHx9`w_b;xYfhgT-qk~no|K&pA*q2yO`U= z(3!YYRxGI8BfJEg`WBNoP&a%DDc$4mFu+57aJf`WN3fk@fUd?G6le7+zzzc<5Rd&>&8FLuerX7*51cNed(YS2x*^Jw8JJ2k) z!V-ju_rz%l_6sGEa!P$^CbG2jk zOlq-?XjH*LRbDoZnJ62ocWGVaCz(}?BRHXH$Tgj2Fcb!wbDQ}i6S$ySa+`cztJPm( zfCkzIMaADZil2Em-{~5q(gY_pnuICUqycUP8h!_tWa_oXfA!gtSQhDWh|1_#PzkKO zrEerFDeOy-IKd=C#h0$U$#De@Fw{(ge7uTD7bh952O~HGAVyfB5@u34f6PlFMXM^z zL1-q<66Ow5F{6l>gl7}#XBJuE!>0IIx9Es}>Y^6KgWlq93{fh_x&CHK{oi$9D)9QtNTI5`sE5 zjwLZ5CO(rV>bY)iMn?I0y@*qc`q_-)fi77qTAXK3!-DjFxzRx5a&o7{*>>d5q;Lv# zu&z-a$|(g{Loqa|g`Tj?9xgnIhzjJ_=T&0hU7@zfM(cyigdD@rTmk-5JA%uqok6g! zCI}YQ2KI(}VkO(}AP*9GXr^k1ayirq%5Ry~xJ}66mC{m#WGz=UGR<}T%^wC*GM>yl zrdLqsF_nRhaT3jR`A^p~@s&w~aus%mwG6WpD$yjox|QAcB={|C30h`DSq71SC#@bRk*Tus_Mzg6nlP4C@WqxxbHG2 zQXwZ^{31=FDYG`_8f9Tebo_H2n%PRHbS5$bh^iMvLHaa^%tB9m&eP^uL(&w4k{$S$ zlm=cFq3(Kwkiz|RV(7z40)RSF`s>8WE1;Z~Znb1qPjG^3-dMa16Cu3FbF%A|f;^2D z0$Ybnnwz58pOANiy0|f|8bW^Uh;X5Yfk3HlHWyZ$Val%y3;6^_O;YdnnxEe+UAG|p>86XWT`U>RxUU&7lEeAXgnM4%w5c~5LaHHZ<;tJU!vTk5ASWhm2gbBIE-iwr!WfV@jB7l~#$R+dE;tLPb3 z4s}1f%+uFu40EDd(^S1q=y9lY2ZVm>0}w<&eRCS554@-90{5Ewz&K)BzE7tz{bW|6 z6X=EJwxejCxz`TAiVS!|g-jA+n22a^;762Lv6@A)(Ito$8N`L?5le{#QAoa!@VKG% zMfzhDi}NvZkCC2}vVzo55kXe6nznuiIReDh`OH$tW>_|sL=@&TSw%-6DMpbvo*FtG zUdy?}9Mtsw^xLzUQ@=-@ZhBxgq!+rB!*>d#7i0+B)Jq?X=hA#%`l;5iVl@6GD{iEN zI%ecWIdPJ#A|tG^2q`-BVvkPep_o}DuEKImsPC++TAcI3e#elKx56rWeTK249vH6~ z{9_>{d|;Wr)>5$S|>UF3u|Jb#FmA z+q0tI>!=Oi*_K;agjqxbfI;Oz=0ZRM5ojum#q+U1jz%jG7V;S|!NU3+*vx2@4f9&? zzECUPSs1bAFr%Vz)NQfKoq$A?dMsFz!(r?)#T}yoX=x4RyR$rH+Z)jmEXT@vb~0N` zwR}8J+&XS&YmFd+2qLHl?E-H%xBuxlP|7n>5!i%@`p@)b1lNPNWEUo$km)HzI7>^g z94oi31_lL&sU;-C+vASc^DU= zFaUVUN|IU#FO~BKbnfdNm?0h#03i*<<#I9ua|IJAgKvuhG%24RCc?Tcj(`O+wt&R)W2s-@g!(|zvvK5J%k zhTiP{f$r|n>QoLt19OwU3++w$4wQh>*8mg|tily2!)=f_(5n;zdULKy-IXdD6*@DR z%Slu%5@JHgWo{9wmA0nPUMsi~!i&(>h$l@+;ziL+piv>KuH<}P-R=kt-D5C#4o~QH zDHkHdV+JZ= zwPkPb$w=$0Tw+3$*v(_`%dWFJAld?!8jSR~6+W#ciQAeuKl4`ngJ{df$QO2zPz&<<0qBdN-=b@Teky6f_)grAaZwdT4RI!a}XlyVa9W|{xoSnt?WA5QVl=!!!g!6FBv)Vl8c`ta; zOWGYb?PCvo;!~gb+!rXc2CaY(IPlzepS!Di8Z52adfjX-V*jL zaTO_r2>cC2bi|fzv26igktAXY^O~mXnl?Y%Hg#`yTj`U3tG3XJrpJTf43OT zxAL>EBs81Kbi1^-W>mBnF@btoMF7_7uTIY4Wog5EHo!IjRmA@~tOA}U-Q>}URtEaR zY&^j6Y2<&|v=r@4bI>saRy~oZ(G`6K;RAd3EA&JF@}D606R(&DVH$E0{EdsU3SeviY%93cj`fX+7X&TbELncJGSFFku!7t>ju03a*ul+n+<@}G6_yO z;|&%USzR^4GdhnzcgfFD9dlvRK8;~aE}r1Oav^PP_-BrsCiA(Pvw5xC3Bb(lOx?`U zH)}gTymo()^Z5`W4S?3$fO+2oe)Nmq03dz62Ou}H!<9MV6+=#&aNn3=XIb?4fLWhT zybqcG`iqov$)A>jJcB%U`P5{(v-n!`m}DvCn>-xecQ9F+v;oN?Zi0pCcp5{CGJ zz|6MlC7M&48Duzuem?E^*X_sB_Hmi#Wzzu~EVc_J&_KT3lZIB5f1X!60>91s( zdAc!^>hDcjXJUj%j;K%aI(hV6vln0}%S&m%u!DvKc@ z3XB8RHcn=vb%SWS3UoeVw((XhY%roW7jiQADXb~TjIZ~aXZR}Y>{trYg1{6XeV77F zm8l;LMV}L6ED>^?S)D`eyuK zQ#|PWqw07Wd& z%eqr#1w`JZO<4C5N*f|u)gBRJH9^bd9=)z=`8WnEkn%D%DDXn~%4;e=zyMv=gOb`y(i1UQB@={OC0D(_@^Gj!%w}@ixm*kfcl< zi-Pvx?Xbtab>~!mZ7wS+nUuJ%G8ut+MH!x-m@{qvA@esZuNkXjCo14UVRX%~p2;uF z70&wigZIW1?M{M@#}EfS8Ke$NV^Rg9)BD1o*PrF?I@a?=gg;{V^_h#eUFaf@+VGqe zR1fa3ifVDnR}@fCr$ienC@~se=vh)S%IaiH(f$qUU9+`Ce?N^v@vSOBr;(o#KJ(}H z=WL`h_w*h)&KUkh<<}vJ*%7;N?ia#q*jwL^?XIe#BDDwj^G_ZN%Lzt1NsRXNlBCMb zM3#Sp10HM$SW$PQBK7E-g|m<3m@nE7(!A#A9Lr;^CH?(O7Gpn?c^WPH6Hb5I@Ayms z<(q4-(*suPvs09ObK8W+Zlm|{TW1lY4`=3k0St>WJ;1TxK4*zMOWNi#Je__E#WUW9 z(EggXOn2c)=`YwE8L@w%?MSQ$lJb+<(!foS5J;5ln;|oU^4Y2%Q}bX97oM1gsW#J@ zoZ0df8;H3<^n&jA?J2l$OwP{a2bf|;Ybu*aS_fNH2;X&>@9ldmCrz$vT#S z#V6Nfes!{AtC71=h;{wK^qp!?T(PVUmvdiP7az3V{mF=%MY(o2nV76`rpLr}HgChS z6n&IiURiqKMQ$ z^X6FmL^4l&HvTx`R(G>q<`s|6q8fs%VdT^&mo#1>jPA%*F{XdMHO6R-ZnhbH_t#f%d2=1t0sZseKYyFh zShWXY0F0_H`sl(cT*-nI@MIRSutBwBYqfe|s0t zv?x9PT3?=hSJi2Mw0hr`j}Z-{@80Wd4Bz8x9%1rj`R)yVR?pQTVn+GqK&P&G+8+5H zUz4L4AxrU-8*WWmr6$Nknb2C+-#k@2qaRH@V?axaH9VeOj0*iwV~S6wv?_IGo2>tB zw`P4wr_Z@lsL4leCEtCS^-)*t%7b@4sOdn8sjb&(CwAfV38vfj4?5!Fik87xOuXUm zN4xNGGZ7PN?#JSg@SdrhKInpXZk(A4Q}5>lbhS3CO2r1>5W@g>2P{) zkv!~6KK?o`dH?o&JoYbb@J)@y!bk+%hMU{!`lFrB*-hY2bjyX)EGb!(7906$s_w6( zq6(ELe@lxpdjp7 zu|DN)k0)5szSNn+vkmc1L2hqDcsw6t#~iku;V?MPWfGHx`jB_8O|`Bu*h4)NZKUuW zp&-6>8yKV=qJMFJ<%}dIn(gtY~PQE8;*Qf6nG`^NU!Un1F#ozZt96;ReL-G zp_6weGP!`GRrVBrrjKPd_c&;FoI&=4g7A)U+T|LfZ8M=TynBoR6{tCLuGw+!bMQ_= zqo>tVjGR@3`dY%VkIQ%M7h)ZWElCIer zc0j35*zNk{fSUau^#zwlVVDQ^ys{U(bmW>w);PG_zp2@;kt&M7<0^Lb5d}ZbozTd! zRN(IN{r-wL?cPF+SyFCvkGbG|J#BBnPwe$?$qw(&0=jO?%^Meva`oPVFYa;~4a&$&RTx_viV{YHza%Hh+lQe7 zx6r}i4COXxr4uK%Nqp_TJ|?=M547$5j)JN0_JT5K=EcL;-S2(4oEb}`GNXeJdmp&= zhQlCX)#Wg`FA&`4yK+HoaoIn7`;v3!?D_LeebMax!{zMNoeR$!f&2rGv!(YR)>YSA zuXzV~a{0_-A5c#=?gLARrTelUN5VdiXlX(Kv-Q;IU(Qn>Xx}84DeO~-I~IIxBuqw3 zW@N9RM||;AEE4^uF-iXfx#J9q#^})EM*{38TdH>m_@oB)o0SWRFXK8ey8Cq_Pp?C! z$R!T?Vu>jKjgPN)MVvM`;EXJ}@BBCQaLZm3ual<~!)?gAPuFnch?U4<+9{VyKbc2R zEN#(LnEH8s`_S;saiWiq;BrCG6!Vp7>5sKcGv3buXC0Ns*B;yIoa0s>7iH}PmPK?E zZq6`OKs-1TD8{0JJi~;Fu}G)@S|Fl~S*t8-ohYNYAu2X<6OQXii$O`s`5}{uAEA^= z9c{kevD3^&#NfHT?ZPZd;CV#v)*$Y<>I)Ay_nCs{#~!-w%w|%}iX}d?QNgf0DG`aqOd>bQm(2aQ z?UDb2br4;_Y*Q|mb#er8kVT7Lh1f}SybagqVB*C{EM9ggX;B}Ie+zCP2#)ow%#7O7 zI~L0x5ZTY1#k3e`{Zp*ozYu5cVq|ug+wUE`0m@+nnuB#?tjjP_gbAt_UjlF2>ilr9 zadWxN87f3Vp{$b$=AxSi+}zgrYM1d2gNhN0Sk1!f?fnSG^+p{T!2K%Iz;%4Z*j>5& zw>msrz=|S(dzXui)`KrD_}&{3E`EAB9W zSRIMSTgzonV=QKa4w3jZ-Czn8NYW!A+FHru4RCR5#3< zHSPV&U-qWTod$7Bl_?Ws0oDJ=(N_yNfyzmhK)fbFkd(`1p&$&Je#YgcxPW4L%rND0 z872z|ZqHhDk&E4c_7>Paw2cIsd2CV2f0<bZJ zvDw4zuzphgu)M3+KC1&F`@gv}3pUj+tX~GlP;<);7FoK8aYez;P_h!Nb+f&s+N?d@ z-P$Peti+e$4vjs{_}S-yISe*XwCh@?L{mnSsj{l0CQcF<^=ZtuRSwvhZPBP z4l7~qIK=NZF(iTny@4;eZwEG4i&$2w_Z!p-)+1JD@tjH*GMdfNQ59&b3os1*zB^!n z__S)}^EX)FRbn@Ase9Tg58>5!9)8mg%7>7 z?!lM5_Fr)Mz%QPu$5&qWICA~tD<>ak5B!2$ckikj?gjmKfBeeQ#DTy4sROJz@~`NJ zD~IoYFE+CdY0~?!E|>`q8#)W0{o)<3x(&6Tsz10OCl*Lq0Us`=m&!tm zZ*nxQoNeiNwsrF(Tfv)Maze->WkfJUkbw|^2cm>VBv!};BB5TcFaZV%Y)KM#4-Vq9 zTjK%o#);X%A>yv`zo&lE5}>5JlL^U=0A{rYaLG&}Dcutw!G8~Donxp3wB-Ti*a0SfRTs;sf+YRO=| zBjlzqmb4;H4vrEbBWBl|D4W$1AZn3N$`bE{cU0!hYNWhuxu2IEX1p{yE3Gt(z$4#m4o#)o!s7 z%^QsUPN%WIUk?n>*1cyQnuhP04*TO%rG@eEH59CmL~pwtDPC*AV>~UEHR_85ZYd1v zaT4>e-v)$oVf-Jk`xo8ixHWm9RSyoq%>=V_pFLSb&KZEbAfT%MRa1w>^o?Y(3x}eBv#jP;utR*6K z>CM$*dSoD}?#}rt`*-L3lKm9WLU>VQ&DD|-h+;jcl_aeQ!I`~;TW7QDO?I1J=OV5| zA}Mn`t46Fzsn%~$i&$DL#|&PTBxE$}V>uPrdTGUhHLH*O=T&OKgntyU0VR~19$gfR zHrQQgkBM`KLhhhdg7EKkt=&36Sr)BaA6)Ge_t??~UBA<*@6YRj0h-=%_Q7fE-D43? zc(k-I9^H(=DzEQ-A8Nn@JQbWW_9U1JMLkAZ*}HQ(LZ~em<2$kLUlR21cT^u__EU4_ z!3Rey^`{UCQTJX?tC?K5E4w+L5Q*SL5l`ct4C%n0vUN-7NX0A06fo`QWWz@>un{p*R zzF}*E@l++~O2M8v4qp_pFh@lDO;_D0wjo)9zVl^aM0_JySMW;?nCpbE9#;G>Sf2C1 zavvzZ)!-g%Smt?amc?Ih_|3Z7b+2OH&u{&)oqb#P?&VHx`&yCC1XGW5SK6`kh?d6l zGDE;5|K~@6ul}u!+&q8&II>M>=Ekm>@6lf+jJ6&BkLI1HyEP#Lf@R?cxIrpBA_sr4 zcATOE&IfNizH(FEZJw4)OU)6d40WJMPbx5QD07*3Gmn$Gdwxz~spi|3IpF+~-;0P) z1g1|8IwQbVsAWlO%aWF+wJoh{f%^ldn6YC&!TK>Y#cv$U#e4rb_DuR;*-h;ECn5W% z>HUR2rL|zo7c(8tAN1HojbwGr?S}d2+<>o)_ zx_iT#^xLf;DO?>YM$-C$)!L%R%kyKH5v&9i_i#e6NAsW_#NEozd~pj*fu{XI)4Re&@@( zYo{YBM>O{FQLP}|RxC$Eo3s~sTwHMXV%Hu+K5y9Las?c53UV<#wi}<;#Nz5{95-y( zf^h67#!WH3x(|j8+aKjdsxJr;$}Dc~!F_3$+t-WfaZ5%Ck?DZHzhInx@CeFUd%~m5 zssHvZB^#P$s^*rZ7XHh^ErMyeu)CWlFYf^73o(1_j9jnOcgc&H;b?aynk(9U4J9v8 zbk}p>nNb14>qhweZW!qn2*2rq`TQ>A+Zmpg&(rV(8XjK@0^4sVZU?{o_X@K6&F#o` zX;=4iY}M)A_T97F?c2?(a&|q04)-Kiw%g+gH;K2e(qo5963TZbI2$#>Xx^dU84eqE z<{Wk;Zk!FCCA|$ccVH3v&ZG7AEvmiBkp+56Ms)UdcNP9P6k*at@=B+ppfp9I+!4Rk z?sO5R_2C!eVN%(o)mw8&{h0}MxfzyYuSHQdG zCx|CLKaCy0fQcjQ$o=v7Z(4}Ue~T&h4PU?ZeN_Mcmj3P3 zowvBapW@L?v6;^^e1YkVO|5O|yWwSB-G=}A;~Y&b?diQ=fMXxR=I@;QWBZTyLOr!y~MfZ+)H^T3|?XXnBm`DZc3dj5HBtGu;E*KV@4wAvb(E4TxX z+ZSK@>`nCDM@{W-nc7ZWeAGW(*1vU`wq15|JO9k{T5UY;&z)WGb#pc=&-)&)29ECN4zBPhL0^iwBs9YYqnA1m`V#xtk8mWGEaw5vf8XN`+i0v8%)+&8s)yjV&s##+6=8 zs5~1}e)jSQ2Ti=<@V_n5rOe}Y@5m{S{Jl z&o}@7;6Se23diFPnS!#q4_rI={rC8EE_+N^}{9}7Gvzb!OOHT5V;&QtD3UiJ7b5;%Ji?dR zSAR?DXvVTuQf+@Y6pN_VNCkhgXY zfx3H;q39tih_)zf1uV11BCY-~K6H>zU8?nFID~$x9)@~pp#Bih-2<)|sOMy&cqUWj zgj3kynvQb^JNcCQp$vJ?_?<(cZX0S@1K{S%bp#YHm3bB&dWh|HZ zBF5do!qfD(tn5kde&r}CV{0aVCa;{@U>35s=Ecd(*_@Y=?~<}_CAB7p%EtY(BcBs3 ziRCz|L^ht?}GwBAi!cv#YnaaE1>LlqwbmuhxiK- zVTD9%Qy)`aNJm~xZ{EsKCUQS>`85kCT9+&nm86MU>g13NNL(Jm14@))7fkpD53qw1 zSdhRM_#Tl~#WBs&94*umE!SN-qO9>{U`bYOFWa7-nbDk9B1f%aI9D)%8C=6W7PE}| z*uq=%u);5#p&cE##6x|(Z}3wd^KZi|BBMB73T-6fqxd-f8;|0btePuRnF*PZ8?q_2 zna%%~q;hL_y-)`gtv}wBz5i9bgYU}gv|G!2O&{tP+R@GaW8R*sd1mUTb?(f`7{)ol z`DkXA?QPq*%~ zLASm|eJj3k#Z7?T{%5ra%o`8_-0aEL1gEtvEG@Z)E=2mNBk>Xujxs#pOS1H#cs&4$ zI>oyP8kLREX`vMLj}F|Rvp7t7UQ~jebq!a0j(J(&Kw8;B!r-+=kx9bM?ws5ngZo@^61S@6mg{>^~{r)bJZlpLr zm!=Jr1Nw4un&w^p0NMNJda-sQS>)N7@0MnuO6M1+AXF`Z%WG+BxH-JtDcg+NJp#HGYi<>p^Klv8Gk_%C8@}!>ZqOBdUglorrh2wgxfy$*qXy-VIO0MU4~EZ@67#v6YgS7LyVvw1Pe@Q%R<|@y@T2K&ef_aFYZIh z=`>u4$pmyFK?p#3SYqX^Jr9a+&^bqVEeJEr8)Y%y1?YH{r(#X90}?D*)OBVcTArWr zfTeCB@jYY=KsBM-YYXX;0EI`Z%J_T}%bK{_EH8nh@$A`m*#VMVeBA^Yz86ttsSH_) z@%Qq5U^YmCC--90Jgbi6CaZFm#Zsvc%ttcv6KFhGy`~9yZq*jnW^x#9`x}PwwDGVx z%iWKcV`Z5cwcWyg*6P`t_qGE`-9nB%*EB#iq15XOOE~fyZWrX{Wd&rxTFny`OAsr3 zCHA=4q?&DQoy{389E<3h?)VZXgw~@681l|#bYRq`Bef$ApqDlv;oQ-YY^IianjJ-f z&+S&Rbw2uQx+-!Tyw3F?b%j`NfvyVdIaNUC`8=#R!ph8!DhFNJuT&wtSTD#yM(GL~ zGIGuSP2dypm;RAWWx#z=)$xgHE{Y;c!0VKyOUUTi)mLi|Wc~1VLAmOq0SJ zLCX5A1qi@yPR+voma}+0xZG;nnRI%7_j5tu=%X763=cZ_0QEH28|AaXe0nM?^6pf` z+0lJJl$Pnpz0lltaO-bi}%gRe?OwN8}iC=FL#0&jiP9uEe4aJ3k;q9jcdh~d4q;OfSpvj)f{ zD9xjgXJyI4B7?9I$x2V$7~7MO5qm`rE+2Qz92Eh6ZUsT!{Z0!lB^zn$OvWceZ7Gi= zu!uM%lE4QkMrg1tX*tY_J$8mv{lH(9qW(-O6=EZ;5a z^dufpCjj3|jgsT6oFg#+VZw+gVX(;XO_MwpVYE*{7WSF6i^@nbXc}@lYM-migvJrHxnlIpeIS{EM;+uX`5D2(O!tz9jx85lof)Rm=S_pWLbe z(Y&-b6JIY3xg4m#ZC6}x;A{$D&wfLxuEXYSyJ zi$NhHr-en@Ox70TB!=QbXqmk=Q$;)tOhMt=0?^*tARrAtFCdn;PgMA|sD2mz9=z?v zN%gi*=(!~qI;NB-{SzepAT6;mf#qKLgTr&01gMbuiYk#qvA8XI zgOPF|)A)$}AZFDfE_7!_@yvU3Fv_brai{_q#64|3;;c9IRxR66S%zsmcD+9TE#u8T z%`{U?S~46=Qom_jfI=ZwtW)w)FRMoo?%<{F(onzZ2!tFU<}*w@YLYm1-d=?zveFv6 zq7${@+0Y;=6c{Ud;*oH+I2ug-C~g!eA$FSsz!-T&w?r0G9iD1Z>}a~SZ5qb1vG(S^ zKXla-6#~iZLVKcBmE2Go1#Y)!NBl4albV#Wa#zt4!QeJSG%u2|-Ce(uCk~+s8;mRp zal%W6NtRQ-nRlg9r4M?K(@z683_bNie&Iul3WUri=jOd;kC~zwR*nh+#fSiQ_Ib05k7&$#G(KfWfYxqvElx`Ow%A-Qq z#k}KlUThBRh@lRv zaUTb1>$dR%e47VRB)GJ79A@6qQn$Q>HQJW)MpzX6!OiF@%6Zgv!i)U^+!NTYo!Y*O zML{%uAxXMp>rAZ6F653w^Y^BUT2q-OYme4UTYs*ma^K)#MtH{InNYaK3L~E=&>K^C zucA)dS3MtjXu5ubQ0(`aGvHYcFKY+P&cX^9+o}t>riJ5`Ud^u|3cY-Ym)WdYm`auF zim=b?JUhXMK;;)68|_7zjIQ3nN6hm559wvg52%^LPvL!wJakZ}4j(SiM^=}GBtdUp z8`Pu-A~B=lLh0D?6v z?29tx0JA1NVN!GrzAE-$j(M#>#|_HJI_PmdH-rtPR*?WKUGm?Z^iB9`>!mK*Qh~91 z5(RLsBlEC%uqPQ1%3`Zox8W?;F}I(tJ$m}MifNf$aFkh*tBGxFJXp|+!O|rK-juS} zIeL|5h^WsurAjBBcDg%_oouev z{@!#a3|Y}c;`b+AU+42xz=&F`cAQ2oyLCGK+U8bAJpnevql7*mfRZ#L->`xyatYyY-p1CO1CXh!I$44JTt5F7z;Hb;V3}hsrXrl&aW2xTG}@FS zl*kgte$bxIC*u$7`htmG3Ia!M%h3q{_$fQ$>ez9q?ZxBgJX8r8qT<$zaf`Ks7w<6* zft$U+cGAqZ+ z>EWzIZsM0`dgGRQ-K}yy6J(kXV>e^0nQpG4l-+|WF$}~T;o=ys<#}=HSSuMbk^k-7 zw^SeZPr9-)TpYr9maz>=Jmrrc-sNzwdo1%cxK6^775R;0hbdhV)21s4h!;655?=_1 zuJ%8Nigbz7Bs`Qg`lB<~Y+0rWvvE3MAPQwK5d_M++dHGhDYPF`r1cj9{_TgV9}Y0rr9%2;#n8XL&uW{$ z{L=fzy6S-#z#ar2x6Ke~qs-Hi#YG#osIYLT$SqXl>XY`8U$_J|32mGxQ6xUuHpqGJ zS$w7Yo_F9C{Q$?%+qZxrY6kfagZK6KItOUE3ogN@M1Kmb$97HJf4%L~BVHAKfDW#$ zapdu1xYFnUHyU(~cQ>7Hl(cSt=|!YaFRS7jZrmQWKWRT`gGkP&JxN1jD@*XXS?@bO zB~)s|4w`qX15USC%Q7F2J#*NsvV3^-3W~;|QhwLF?m2oGelxU7MAeeUB*IABUt4>% zf6^O8yb9%|Ki?k>*G38|X7`srN~yc_!!}ZV9>Au<;S`41+*-$_^TC6NZBCnP)CQNd zydy9Ny;)&LpJG2l`1+2_qdGU|o=NAlQ{fx^^?7|g+5oV0O5co@&MfOTRDPgB(7d;YNU_Wns?zAgc~@4&ZauQb=++|w$qp4sz`p0`c%(ah7o2C+?tDHt zvb{B&BziI#ZfzeK%;!)L`D4}a%~s#hg@m~EfgXoy-Q7Bx6Rym(?)FE#!7lLoS))5D zF11}o|Dx+_?c0~CMqLdVVS+tBPbz9X&V4U4F)GLU$^H1Oyt3B84Y{V;+wS(W6DI5w z|Mu28!QX5{Z{p~~*}OQ0>u>K&9&=aP-Yijy45>De-$CosNnE?pb>jt5g{x4rRixu+q>ozsgaMb9_HkeN& zX366ny2$TxN;s2vFXwCdxq0JfN-H>3B6fK-P(UfEkhdAhcDg3#1`> zid1uBs>&8$6@QFCyxt&jR|vm7VimdoF4uxA5g#}k(0elUp1xnU>EVpEGbdUB<^ z0wm-d*(b^gM;()5>Y<8{)QY{KxF-(XWbC}F4+fUERDADsA0fy6s2nwm$hi5Ce?f-t z`~4A+TY#|8&0@3Tuk06HSE%W&ZuGl1OgDH`eNasAOa@A*-*8&kPf{2Ou1mA2^2OKUt$5BxjKSn4F4v~lTh zR#7&j4o_3?B?t8fLg^0xhPjPz1GjLCaeh%KNpOaleaJdT42OZeW{jCStHKIG*B5%| zp5x1Fx*hZIo`HwPiZp*qvA))}QXgSwjC;1k1(AAI8)$mjnBb=EujH7qo$?Tq-k(I~u)qdU}yyR_1g2+i zNs_O17H@5S>z(Q9!My3ZD}SM}V(w(wtmFv}kmbdVdTb4cqF@)Spm9c+inV+&nZTzP z%}+f*-%#F$-paCMYrNDk{#cXIX@~P>bl(5}Bv%59DnM9qTKDUOO5+ zXr&rOG^AWkz|FbIgq)j5KqReD8+pUp8(!3lGTtm_$dNptH>#u43Tv>xdXWzHNY!y_ zSuf`3e?1V)qmJs-vpd4gX0Yov%-|~<_TRRKTHw7kp9kC`cu3_1bMed`tkKok)o@DD zppQw+K+W|`zR;DYSYDB6Ly!CoMX|;$%Qie_nwEq=qbPEJkE$wefUe-H4$#$+V&=IC zBVTeEN{B^6!U|BwdTmA(1=fZ!A&RHqgtV|08Z><7KqKnS*cxmLLzcUM|9fVC2G!D; zWgtZXm#9RyZ8oviH>X8<&I=ZjqdY>p8PrtrfNnGcr|n2{I)%CyepO2VKB`dV&wW2o z)$lHh<*v%A$p{4U8oJun>Pj5Lxe(+IlTr$K$*UitN}U1b8T=V>34swMA&} z(jXFaZkBEf2Zgnl7`?1^GuNxA+$fEO5?nImNFgq&<}9LNB4w6YcsJsFZVjrAb6 z7JO>Ke$#Xfk+CP2{sO&G042yF35xGN$#1greEenWGTFWrEqp6Z3+c&;ki!~ecpnmE zi?M;KKUvms;rS7zG*m!lBRQ&3voIxK^MwrowMSzsG}p5v3@hc5!25yM4v#`wgstZc z@PoP1Jore0CjdlqrMC>uK`z{aF0@q5@-OVM4Hn3DWzL&4Q*>v)%=Ng5Zr{oY5rNqw ziZB(TWh6`tQGOFsf?=^lY99#2(hdW%hh zFCEQe@8g*Pc`62_4WW%oD=W!xsTjqo%&vuHSw6YEyQBdNS)SN&$Xb^a6pha<$r=}w zWtE1FF;Y;dl`+~dhAktRT3sgd$Aym0Mf^hnHDqj+qx_u9^f;eLcZ^hCKDS^(*@A;6 zM_qBH<6mdFD9g?{vB~+dtO$0;#3*Wx4==2wvdL5Ty1_!$9qd}=aN84yGl@NzIvN2I z{f7xlrj4p<&$7~3xhbiF9CAk$25a_I(T|yTmeNf`hDc5WHUg+1|n;~oP-y%P%K$~-{lK`&Y?%oco)$Zhqq3GZ4WT!cvP zdEW;<{0AD-%av2@2n5^azT`g!tyo8+ch)F7OsY7><0X`nd?k6k{v`v-`VAR$)GCAu z(udTBjT$quqs4_Y{!DMuRA|&;!}y0Bhts3VYuZMeY;epWkI46_0s%q$Y!tS|HjR$# z+;QbTcGadZ35&1^hj8(#Zk{`Yq;}r;56zz>JmNz5L_mbZmAG-|!81A{Ub%A>AkbSF zP7BuKCKCY`52^9yL!6uQF38Y;uS74aG|#*3qPJOH(x>0B5lp=J7J{oqvu7RC#^7l? zvEx^h4np7g-epoj7Ab|Oi$93~ffkVp5-dch#lpzQEfFq4q@|*I-b&Y)_L+}8@cDfD zV)c#YCUa0pR<2~qey_83VyL80sdWqTseGzLa^?9qeSR#|Po*|P_RqA8+QdP^%^S~O zSsBVb+v8JT%(~5aDkr0M-Ja@8zBI`)FjlIn>k}of>PAD!#lTQ$NHy$JAc_^m>EYs< zO>K=-HJ52z*=IJhol~{6lPKbE`1dK0jg2XkZFzFE&#|TDTqdPjRcTzYKOIKxwm?Z~ zN`s}L*BuS}5u;D1478e2!l15(^cLCrQW3mFD*2vX*Xu2<^yoSJ-u^!GIz|-xL3+djK8I`y{c@_%YG1Oyj0GjdNeClx-;{BYtpZ{1^@s6gZpFA literal 0 HcmV?d00001 diff --git a/reference/assets/fonts/lexend-400.woff2 b/reference/assets/fonts/lexend-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a65647312da6b8cc7f3120dc9eb1f9dfba6f2a10 GIT binary patch literal 14476 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 + + + + + + + + diff --git a/reference/assets/img/signalwire-favicon.png b/reference/assets/img/signalwire-favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8ff9921f2b0d6f6a360f28b038d1fb4cdba6dd GIT binary patch literal 89743 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 Mv@btXeR}@Ne^~DM&;S4c literal 0 HcmV?d00001 diff --git a/reference/assets/js/navbar.js b/reference/assets/js/navbar.js new file mode 100644 index 00000000..4c345717 --- /dev/null +++ b/reference/assets/js/navbar.js @@ -0,0 +1,132 @@ +/* ============================================================================= + Fern navbar behaviour for the injected header (no iframe). + Ported and trimmed from the SDK-docs POC (assets/js/app.js): + - dropdown open/close + anchored positioning (product / language / support / theme) + - theme toggle drives Material's own color scheme (default <-> slate) + Out of scope for the pilot (different origin from signalwire.com): + - cross-origin localStorage["theme"] sync with the Fern docs site + - iframe theme bridging to other generators + ============================================================================= */ +(function () { + "use strict"; + + var CHECK_SVG = + ''; + + /* --- Theme: drive Material's palette toggle ------------------------------- */ + // Material persists its own scheme in localStorage under "__palette" and + // exposes a hidden radio (input[data-md-color-scheme]) per palette. We just + // click it, so Material owns persistence and the rest of its UI stays in sync. + function currentScheme() { + return document.body.getAttribute("data-md-color-scheme") || "default"; + } + function setScheme(scheme) { + var inputs = document.querySelectorAll('input[name="__palette"]'); + for (var i = 0; i < inputs.length; i++) { + if (inputs[i].getAttribute("data-md-color-scheme") === scheme) { + inputs[i].click(); + return true; + } + } + // Fallback if Material's palette toggle isn't configured: set attrs directly. + document.body.setAttribute("data-md-color-scheme", scheme); + return false; + } + function syncThemeUI() { + var dark = currentScheme() === "slate"; + var sun = document.getElementById("theme-icon-sun"); + var moon = document.getElementById("theme-icon-moon"); + if (sun) sun.hidden = dark; + if (moon) moon.hidden = !dark; + var pref = dark ? "dark" : "light"; + var items = document.querySelectorAll("#theme-panel [data-theme-pref]"); + for (var i = 0; i < items.length; i++) { + var chk = items[i].querySelector("[data-check]"); + if (chk) chk.innerHTML = items[i].getAttribute("data-theme-pref") === pref ? CHECK_SVG : ""; + } + } + + /* --- Dropdowns ------------------------------------------------------------ */ + var dropdowns = []; + function registerDropdown(triggerId, panelId, opts) { + opts = opts || {}; + var align = opts.align || "start"; + var offset = opts.offset != null ? opts.offset : 8; + var trigger = document.getElementById(triggerId); + var panel = document.getElementById(panelId); + if (!trigger || !panel) return null; + + function position() { + var r = trigger.getBoundingClientRect(); + panel.style.top = r.bottom + offset + "px"; + if (align === "end") { + panel.style.right = Math.max(8, window.innerWidth - r.right) + "px"; + panel.style.left = "auto"; + } else if (align === "center") { + var w = panel.offsetWidth; + var c = r.left + r.width / 2 - w / 2; + panel.style.left = Math.min(Math.max(8, c), window.innerWidth - w - 8) + "px"; + panel.style.right = "auto"; + } else { + var width = panel.offsetWidth; + panel.style.left = Math.min(r.left, Math.max(8, window.innerWidth - width - 8)) + "px"; + panel.style.right = "auto"; + } + } + var dd = { + isOpen: function () { return panel.getAttribute("data-state") === "open"; }, + set: function (open) { + panel.setAttribute("data-state", open ? "open" : "closed"); + trigger.setAttribute("data-state", open ? "open" : "closed"); + trigger.setAttribute("aria-expanded", String(open)); + if (open) position(); + }, + }; + trigger.addEventListener("click", function (e) { + e.stopPropagation(); + var willOpen = !dd.isOpen(); + closeAll(); + dd.set(willOpen); + }); + dropdowns.push(dd); + return dd; + } + function closeAll() { for (var i = 0; i < dropdowns.length; i++) dropdowns[i].set(false); } + + document.addEventListener("click", function (e) { + if (!e.target.closest(".fern-dropdown, [data-testid='product-dropdown-content']")) closeAll(); + }); + document.addEventListener("keydown", function (e) { if (e.key === "Escape") closeAll(); }); + window.addEventListener("resize", closeAll); + + /* --- Init ----------------------------------------------------------------- */ + function init() { + registerDropdown("product-trigger", "product-panel", { align: "start" }); + registerDropdown("lang-trigger", "lang-panel", { align: "center" }); + registerDropdown("support-trigger", "support-panel", { align: "end" }); + registerDropdown("theme-trigger", "theme-panel", { align: "end" }); + + var themeItems = document.querySelectorAll("#theme-panel [data-theme-pref]"); + for (var i = 0; i < themeItems.length; i++) { + themeItems[i].addEventListener("click", function () { + closeAll(); + var pref = this.getAttribute("data-theme-pref"); + // System resolves to the OS preference; pilot maps it to light/dark now. + if (pref === "system") { + pref = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; + } + setScheme(pref === "dark" ? "slate" : "default"); + setTimeout(syncThemeUI, 0); + }); + } + // Header sun/moon button = quick toggle. + var themeTrigger = document.getElementById("theme-trigger"); + syncThemeUI(); + // Material re-applies the scheme asynchronously; observe to keep icons in sync. + var obs = new MutationObserver(syncThemeUI); + obs.observe(document.body, { attributes: true, attributeFilter: ["data-md-color-scheme"] }); + } + + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", init); + else init(); +})(); diff --git a/reference/overrides/main.html b/reference/overrides/main.html new file mode 100644 index 00000000..1ad4a5f1 --- /dev/null +++ b/reference/overrides/main.html @@ -0,0 +1,157 @@ +{% extends "base.html" %} + + + +{% block header %} +

+ + + + + + + + + + + + + + {{ super() }} +{% endblock %} From 92a9e5538747825538f6d51a9f8a0535a7dc634b Mon Sep 17 00:00:00 2001 From: August L-R Date: Thu, 25 Jun 2026 14:30:00 +0000 Subject: [PATCH 03/13] ci(reference): build and publish docs with `mike` versioning --- .github/workflows/reference-docs.yml | 69 ++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 .github/workflows/reference-docs.yml diff --git a/.github/workflows/reference-docs.yml b/.github/workflows/reference-docs.yml new file mode 100644 index 00000000..5638c90e --- /dev/null +++ b/.github/workflows/reference-docs.yml @@ -0,0 +1,69 @@ +# API reference docs (pilot). +# +# Builds the SignalWire Python SDK API reference (MkDocs Material + mkdocstrings) +# and publishes it to this repo's OWN GitHub Pages via mike (versioned): +# https://signalwire.github.io/signalwire-python/ +# +# PILOT triggers: workflow_dispatch + push to the pilot branch. This is NOT +# gated on releases yet. +# PRODUCTION (later): switch the trigger to `v*` tags so each release version +# is deployed and `latest` is re-aliased. See the commented block below. +# +# MANUAL REPO SETTING REQUIRED to go live (one-time, in the GitHub UI): +# Settings -> Pages -> Build and deployment -> Source = "Deploy from a branch" +# -> Branch = `gh-pages` / `(root)`. mike pushes the built site there. +name: reference-docs + +on: + workflow_dispatch: + push: + branches: + - docs/api-reference-pilot + + # --- PRODUCTION trigger (enable when promoting out of the pilot) ------------ + # push: + # tags: + # - "v*" + +permissions: + contents: write # mike pushes the built site to the gh-pages branch + +jobs: + build-deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # mike needs full history + the gh-pages branch + + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install SDK (editable) + doc toolchain + run: | + python -m pip install --upgrade pip + pip install -e . + pip install mkdocs-material "mkdocstrings[python]" mike + + - name: Configure git for mike + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Generate API pages + run: bash reference/gen.sh --no-build + + - name: Resolve version + id: ver + run: | + # Pilot: use the package version. Production: derive from the v* tag, + # e.g. VERSION="${GITHUB_REF_NAME#v}". + VERSION=$(python -c "import tomllib;print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])") + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + + - name: Deploy with mike (versioned) to gh-pages + run: | + mike deploy --config-file reference/mkdocs.yml --push --update-aliases \ + "${{ steps.ver.outputs.version }}" latest + mike set-default --config-file reference/mkdocs.yml --push latest From d47f96b7c5a3bb46e35dd93b9c47c22fa96e26f5 Mon Sep 17 00:00:00 2001 From: August L-R Date: Thu, 25 Jun 2026 14:30:32 +0000 Subject: [PATCH 04/13] docs(reference): document build, versioning, and gh pages setup in README.md --- reference/README.md | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 reference/README.md diff --git a/reference/README.md b/reference/README.md new file mode 100644 index 00000000..e39a0b2f --- /dev/null +++ b/reference/README.md @@ -0,0 +1,96 @@ +# API reference (pilot) + +Language-native API reference for the SignalWire Python SDK, generated from +docstrings with **MkDocs Material + mkdocstrings**, wrapped in the SignalWire +**Fern navbar**, and versioned with **mike**. Published to this repo's own +GitHub Pages: + +> https://signalwire.github.io/signalwire-python/ + +This is self-contained under `reference/` and does **not** touch the repo's +existing top-level `docs/` directory (owned by `doc-audit.yml`). + +## Layout + +``` +reference/ + mkdocs.yml MkDocs Material + mkdocstrings config (docs_dir = _docs) + gen.sh installs the SDK editable, generates the API pages, builds + overrides/main.html extends Material's base.html; injects the Fern navbar + assets/ Fern tokens/CSS/JS + logo/favicon (committed; no shared host yet) + _docs/ GENERATED docs tree (one page per signalwire.) [gitignored] + _site/ local `mkdocs build` output [gitignored] + README.md this file +``` + +The `signalwire` package is nested (`signalwire/signalwire/`). mkdocstrings +resolves imports from the **editable install**, so `gen.sh` runs `pip install -e .` +first — keep that. + +## Build & serve locally + +From the repo root, in a virtualenv: + +```bash +pip install -e . +pip install mkdocs-material "mkdocstrings[python]" mike + +# Generate API pages + build the static site into reference/_site +bash reference/gen.sh + +# Live preview (regenerates pages first, then serves with autoreload) +bash reference/gen.sh --no-build +mkdocs serve --config-file reference/mkdocs.yml +``` + +`use_directory_urls: false`, so every page is a real `.html` file and the site +works under the `/signalwire-python/` base path. + +## Versioning (mike) + +`extra.version.provider: mike` in `mkdocs.yml` turns on Material's version +selector; it reads `versions.json` from the site root at runtime. mike commits +each deployed version to a local `gh-pages` branch. + +```bash +bash reference/gen.sh --no-build # generate pages first + +# Deploy a version and (re)point the `latest` alias at it; set it as default. +mike deploy --config-file reference/mkdocs.yml --update-aliases 3.0.2 latest +mike set-default --config-file reference/mkdocs.yml latest +mike list --config-file reference/mkdocs.yml # -> 3.0.2 [latest], 3.0.1 + +mike serve --config-file reference/mkdocs.yml # preview all versions + selector +``` + +Add `--push` to push the `gh-pages` branch to the remote (CI does this; do not +locally). + +## CI + +`.github/workflows/reference-docs.yml` (plain `actions/setup-python`, no Docker): + +- **Pilot triggers:** `workflow_dispatch` + push to `docs/api-reference-pilot`. +- Installs the SDK editable + `mkdocs-material`, `mkdocstrings[python]`, `mike`, + runs `gen.sh --no-build`, then `mike deploy --push --update-aliases latest`. +- **Production trigger (later):** `v*` tags (commented in the workflow), so each + release deploys its version and re-aliases `latest`. + +## Manual repo setting required to go live + +One-time, in the GitHub UI: + +> **Settings → Pages → Build and deployment → Source = "Deploy from a branch" → +> Branch = `gh-pages` / `(root)`.** + +mike pushes the built site to `gh-pages`; Pages then serves it at +`https://signalwire.github.io/signalwire-python/`. + +## Pilot simplifications + +- **Language switcher:** cross-site links with Python marked active; other + languages point at the POC demo (no per-language hosted site exists yet). +- **Theme toggle:** drives Material's own light/dark color scheme. No + cross-origin `localStorage` theme sync with signalwire.com/docs (different + origin — out of scope). +- Out of scope: llms.txt/markdown emission, Docker, other languages, custom domain. From 302c5d6c617a175e6b906e3f6f6cbc7c278b6b34 Mon Sep 17 00:00:00 2001 From: August L-R Date: Thu, 25 Jun 2026 14:30:51 +0000 Subject: [PATCH 05/13] feat(reference): generate SDK API reference via MkDocs + mkdocstrings --- reference/gen.sh | 62 ++++++++++++++++++++++++++++++++++++++++ reference/mkdocs.yml | 68 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100755 reference/gen.sh create mode 100644 reference/mkdocs.yml diff --git a/reference/gen.sh b/reference/gen.sh new file mode 100755 index 00000000..19c2cea5 --- /dev/null +++ b/reference/gen.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +# Generate the SignalWire Python SDK API reference. +# +# Ported from the SDK-docs POC (build/python/gen.sh): install the SDK editable +# so mkdocstrings can import it, discover each importable top-level subpackage of +# `signalwire`, and write one `::: signalwire.` page per subpackage. The +# landing page is the SDK README. +# +# The package is nested (signalwire/signalwire/) and mkdocstrings needs the +# editable install to resolve imports — that is preserved here. +# +# Usage: reference/gen.sh # generate pages + `mkdocs build` +# reference/gen.sh --no-build # generate pages only (mike runs the build) +set -euo pipefail + +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # .../reference +REPO="$(cd "$HERE/.." && pwd)" # repo root +DOCS="$HERE/_docs" +CFG="$HERE/mkdocs.yml" + +# Install the SDK + deps so mkdocstrings can import it (idempotent). +pip install -q -e "$REPO" + +# Build the docs tree: README landing page + one API page per subpackage. +rm -rf "$DOCS" +mkdir -p "$DOCS/api" +cp "$REPO/README.md" "$DOCS/index.md" + +# Navbar assets (Fern tokens/CSS/JS/img) live under reference/assets but must be +# copied into the docs tree so Material ships them with the site. +cp -r "$HERE/assets" "$DOCS/assets" + +PYTHONPATH="$REPO/signalwire" python - "$DOCS/api" <<'PY' +import sys, os, pkgutil, importlib +out = sys.argv[1] +pkg = importlib.import_module("signalwire") +names = sorted(m.name for m in pkgutil.iter_modules(pkg.__path__)) +written = [] +for name in names: + if name.startswith("_"): + continue + slug = name.replace("_", "-") + with open(os.path.join(out, f"{slug}.md"), "w") as fh: + fh.write(f"# signalwire.{name}\n\n::: signalwire.{name}\n") + written.append(name) +# A small nav index page so the API section has a landing entry. +with open(os.path.join(out, "index.md"), "w") as fh: + fh.write("# API reference\n\n") + fh.write("Auto-generated reference for each top-level package of the " + "SignalWire Python SDK.\n\n") + for n in written: + fh.write(f"- [signalwire.{n}]({n.replace('_','-')}.md)\n") +print("api pages:", ", ".join(written)) +PY + +if [ "${1:-}" = "--no-build" ]; then + echo "pages generated under $DOCS (skipping mkdocs build)" + exit 0 +fi + +mkdocs build --config-file "$CFG" +echo "python -> $HERE/_site ($(find "$HERE/_site" -name '*.html' | wc -l) pages)" diff --git a/reference/mkdocs.yml b/reference/mkdocs.yml new file mode 100644 index 00000000..e8d754a9 --- /dev/null +++ b/reference/mkdocs.yml @@ -0,0 +1,68 @@ +site_name: SignalWire Python SDK +site_description: API reference for the SignalWire Python SDK, generated from docstrings. +site_url: https://signalwire.github.io/signalwire-python/ + +# Generated per-run by gen.sh (one API page per importable subpackage of +# `signalwire`, plus the SDK README as the landing page). This is NOT the repo's +# existing top-level docs/ dir (owned by doc-audit.yml) — keep them separate. +docs_dir: _docs +site_dir: _site +use_directory_urls: false + +# Mike serves each version under //, so links must be relative. +theme: + name: material + custom_dir: overrides + features: + - navigation.sections + - navigation.indexes + - navigation.top + - content.code.copy + - search.suggest + - search.highlight + palette: + # Light / dark toggle. The injected Fern theme button drives these. + - media: "(prefers-color-scheme: light)" + scheme: default + toggle: + icon: material/weather-night + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/weather-sunny + name: Switch to light mode + +extra: + version: + provider: mike + default: latest + +extra_css: + - assets/fern/tokens.css + - assets/fern/fern.css + - assets/css/navbar.css + +extra_javascript: + - assets/js/navbar.js + +plugins: + - search + - mkdocstrings: + handlers: + python: + paths: [../signalwire] # the nested package: signalwire/signalwire + options: + show_source: false + show_submodules: true + docstring_style: google + members_order: source + show_root_heading: true + show_if_no_docstring: true + +markdown_extensions: + - admonition + - pymdownx.highlight + - pymdownx.superfences + - toc: + permalink: true From e16797f29a2f69d5c1d60a909d861b78c467f46b Mon Sep 17 00:00:00 2001 From: August L-R Date: Thu, 25 Jun 2026 15:51:36 +0000 Subject: [PATCH 06/13] fix(reference): generate landing page + pin doc toolchain --- .github/workflows/reference-docs.yml | 2 +- reference/gen.sh | 39 ++++++++++++++++++++++------ reference/requirements.txt | 8 ++++++ 3 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 reference/requirements.txt diff --git a/.github/workflows/reference-docs.yml b/.github/workflows/reference-docs.yml index 5638c90e..c8ce2c4b 100644 --- a/.github/workflows/reference-docs.yml +++ b/.github/workflows/reference-docs.yml @@ -43,8 +43,8 @@ jobs: - name: Install SDK (editable) + doc toolchain run: | python -m pip install --upgrade pip + pip install -r reference/requirements.txt pip install -e . - pip install mkdocs-material "mkdocstrings[python]" mike - name: Configure git for mike run: | diff --git a/reference/gen.sh b/reference/gen.sh index 19c2cea5..3993d6a4 100755 --- a/reference/gen.sh +++ b/reference/gen.sh @@ -4,7 +4,8 @@ # Ported from the SDK-docs POC (build/python/gen.sh): install the SDK editable # so mkdocstrings can import it, discover each importable top-level subpackage of # `signalwire`, and write one `::: signalwire.` page per subpackage. The -# landing page is the SDK README. +# landing page is generated (package index + links to the guides), not the SDK +# README, whose repo-relative links don't resolve in the reference site. # # The package is nested (signalwire/signalwire/) and mkdocstrings needs the # editable install to resolve imports — that is preserved here. @@ -18,13 +19,13 @@ REPO="$(cd "$HERE/.." && pwd)" # repo root DOCS="$HERE/_docs" CFG="$HERE/mkdocs.yml" -# Install the SDK + deps so mkdocstrings can import it (idempotent). +# Install the doc toolchain + the SDK (editable, so mkdocstrings can import it). +pip install -q -r "$HERE/requirements.txt" pip install -q -e "$REPO" -# Build the docs tree: README landing page + one API page per subpackage. +# Build the docs tree: generated landing page + one API page per subpackage. rm -rf "$DOCS" mkdir -p "$DOCS/api" -cp "$REPO/README.md" "$DOCS/index.md" # Navbar assets (Fern tokens/CSS/JS/img) live under reference/assets but must be # copied into the docs tree so Material ships them with the site. @@ -32,7 +33,8 @@ cp -r "$HERE/assets" "$DOCS/assets" PYTHONPATH="$REPO/signalwire" python - "$DOCS/api" <<'PY' import sys, os, pkgutil, importlib -out = sys.argv[1] +api_out = sys.argv[1] +docs_root = os.path.dirname(api_out.rstrip("/")) pkg = importlib.import_module("signalwire") names = sorted(m.name for m in pkgutil.iter_modules(pkg.__path__)) written = [] @@ -40,16 +42,37 @@ for name in names: if name.startswith("_"): continue slug = name.replace("_", "-") - with open(os.path.join(out, f"{slug}.md"), "w") as fh: + with open(os.path.join(api_out, f"{slug}.md"), "w") as fh: fh.write(f"# signalwire.{name}\n\n::: signalwire.{name}\n") written.append(name) -# A small nav index page so the API section has a landing entry. -with open(os.path.join(out, "index.md"), "w") as fh: + +# API-section landing entry. +with open(os.path.join(api_out, "index.md"), "w") as fh: fh.write("# API reference\n\n") fh.write("Auto-generated reference for each top-level package of the " "SignalWire Python SDK.\n\n") for n in written: fh.write(f"- [signalwire.{n}]({n.replace('_','-')}.md)\n") + +# Site landing page. Replaces the SDK README (whose repo-relative links don't +# resolve here): the package list links into the generated API pages, and the +# outbound links point to the guides, source, and package index. +with open(os.path.join(docs_root, "index.md"), "w") as fh: + fh.write("# SignalWire Python SDK — API Reference\n\n") + fh.write("Auto-generated technical reference for the SignalWire Python SDK " + "(`signalwire-sdk`), built from source docstrings.\n\n") + fh.write("## Packages\n\n") + for n in written: + fh.write(f"- [signalwire.{n}](api/{n.replace('_','-')}.md)\n") + fh.write("\n---\n\n") + fh.write("- **Guides & tutorials** — " + "[signalwire.com/docs/server-sdks](https://signalwire.com/docs/server-sdks)\n") + fh.write("- **Source** — " + "[github.com/signalwire/signalwire-python](https://github.com/signalwire/signalwire-python)\n") + fh.write("- **Install** — `pip install signalwire-sdk` " + "([PyPI](https://pypi.org/project/signalwire-sdk/))\n") + fh.write("- **License** — " + "[LICENSE](https://github.com/signalwire/signalwire-python/blob/main/LICENSE)\n") print("api pages:", ", ".join(written)) PY diff --git a/reference/requirements.txt b/reference/requirements.txt new file mode 100644 index 00000000..6b9325ba --- /dev/null +++ b/reference/requirements.txt @@ -0,0 +1,8 @@ +# Doc toolchain for the SDK API reference (reference/gen.sh + CI). +# Pinned for reproducible builds; Renovate keeps them current. +mkdocs==1.6.1 +mkdocs-material==9.7.6 +mkdocstrings==1.0.4 +mkdocstrings-python==2.0.4 +mike==2.2.0 +pymdown-extensions==10.21.3 From 4f543db5c8dbb686fbf0925aea6f7c80630f2e9a Mon Sep 17 00:00:00 2001 From: August L-R Date: Fri, 26 Jun 2026 16:16:17 +0000 Subject: [PATCH 07/13] build(reference): invoke Python via python3 -m for portability --- reference/gen.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/reference/gen.sh b/reference/gen.sh index 3993d6a4..1b393129 100755 --- a/reference/gen.sh +++ b/reference/gen.sh @@ -20,8 +20,9 @@ DOCS="$HERE/_docs" CFG="$HERE/mkdocs.yml" # Install the doc toolchain + the SDK (editable, so mkdocstrings can import it). -pip install -q -r "$HERE/requirements.txt" -pip install -q -e "$REPO" +# Use `python3 -m pip` so this works whether or not a bare `pip` is on PATH. +python3 -m pip install -q -r "$HERE/requirements.txt" +python3 -m pip install -q -e "$REPO" # Build the docs tree: generated landing page + one API page per subpackage. rm -rf "$DOCS" @@ -31,7 +32,7 @@ mkdir -p "$DOCS/api" # copied into the docs tree so Material ships them with the site. cp -r "$HERE/assets" "$DOCS/assets" -PYTHONPATH="$REPO/signalwire" python - "$DOCS/api" <<'PY' +PYTHONPATH="$REPO/signalwire" python3 - "$DOCS/api" <<'PY' import sys, os, pkgutil, importlib api_out = sys.argv[1] docs_root = os.path.dirname(api_out.rstrip("/")) @@ -81,5 +82,5 @@ if [ "${1:-}" = "--no-build" ]; then exit 0 fi -mkdocs build --config-file "$CFG" +python3 -m mkdocs build --config-file "$CFG" echo "python -> $HERE/_site ($(find "$HERE/_site" -name '*.html' | wc -l) pages)" From f2084cdb1d8c24953e58f5726e8ee4822777e937 Mon Sep 17 00:00:00 2001 From: August L-R Date: Fri, 26 Jun 2026 20:17:11 +0000 Subject: [PATCH 08/13] style fixes --- reference/assets/css/navbar.css | 55 ++++++++++++++++++++++++--------- reference/overrides/main.html | 9 ++++++ 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/reference/assets/css/navbar.css b/reference/assets/css/navbar.css index 0b5da117..802f98fe 100644 --- a/reference/assets/css/navbar.css +++ b/reference/assets/css/navbar.css @@ -34,13 +34,29 @@ } /* --- Make room for the fixed Fern header ------------------------------------ */ -:root { --fern-header-height: var(--header-height, 64px); } +:root { --fern-header-height: 65px; --md-header-height: 48px; } -/* Push Material's sticky header and the whole layout down by our bar height. */ +/* The Fern bar is position:fixed (out of flow) so it reserves no space on its + own. Reserve its height on so Material's sticky header and content + don't ride up underneath it. + NOTE: Material sets data-md-color-scheme on itself, so the old + `[data-md-color-scheme] body` selector matched nothing — plain `body` is what + actually applies. */ +body { padding-top: var(--fern-header-height) !important; } + +/* Material's own header sticks just below the Fern bar. */ .md-header { top: var(--fern-header-height) !important; } -[data-md-color-scheme] body { padding-top: var(--fern-header-height); } -/* Material's announce/header offset for the in-page TOC scroll spy. */ -:root { scroll-padding-top: calc(var(--fern-header-height) + 3rem); } + +/* Material's sidebars/TOC stick below BOTH bars (their default sticky top is + only the 48px Material header; add the Fern bar so they aren't covered on + scroll), and shrink their height to match so the bottom isn't clipped. */ +.md-sidebar { + top: calc(var(--fern-header-height) + var(--md-header-height)) !important; + height: calc(100vh - var(--fern-header-height) - var(--md-header-height)) !important; +} + +/* Anchor / TOC scroll-spy lands below the full header stack. */ +html { scroll-padding-top: calc(var(--fern-header-height) + var(--md-header-height) + 1rem) !important; } /* ============================================================================= Header bar (markup ported from POC index.html) @@ -50,8 +66,10 @@ top: 0; left: 0; right: 0; height: var(--fern-header-height); z-index: 1000; /* above Material's header (z 5) and sidebars */ - background: var(--background); - border-bottom: 1px solid var(--grayscale-a5); + background: color-mix(in srgb, var(--background), transparent 30%); + -webkit-backdrop-filter: blur(16px); + backdrop-filter: blur(16px); + border-bottom: 1px solid var(--grayscale-a3); font-family: var(--font-body); } #fern-header .fern-header-content { @@ -140,7 +158,8 @@ color: var(--grayscale-12); transition: background-color 0.15s; } -.fern-product-selector:hover { background: var(--grayscale-a3); } +.fern-product-selector:hover, +.fern-product-selector[data-state="open"] { background: var(--grayscale-a3); } .product-dropdown-trigger { display: inline-flex; align-items: center; gap: calc(var(--spacing) * 1.5); } .product-item-title { margin: 0; font-size: var(--text-sm); font-weight: 600; } .product-dropdown-trigger svg { width: calc(var(--spacing) * 4); height: calc(var(--spacing) * 4); } @@ -168,23 +187,29 @@ padding: calc(var(--spacing) * 2) calc(var(--spacing) * 3); border-radius: calc(var(--radius) * 2); } -.fern-dropdown-item:hover { background: var(--accent-a3); } +.fern-dropdown-item:hover { background: var(--grayscale-a3); } .fern-dropdown-item svg { width: calc(var(--spacing) * 4); height: calc(var(--spacing) * 4); flex-shrink: 0; } .fern-dropdown-item-indicator { width: 16px; display: inline-flex; flex-shrink: 0; } .fern-dropdown-item-indicator svg { width: 14px; height: 14px; } /* --- Product mega panel --- */ -#product-panel { width: min(680px, 92vw); padding: calc(var(--spacing) * 3); } -.fern-product-selector-radio-group { display: grid; grid-template-columns: 1fr 1fr; gap: calc(var(--spacing) * 2); } +#product-panel { width: min(1040px, 95vw); padding: calc(var(--spacing) * 4); } +.fern-product-selector-radio-group { display: grid; grid-template-columns: repeat(3, 1fr); gap: calc(var(--spacing) * 5); align-items: start; } +.fern-product-group { display: flex; flex-direction: column; } +.fern-product-group-title { + margin: 0 0 calc(var(--spacing) * 1.5); padding: 0 calc(var(--spacing) * 2.5); + font-size: var(--text-xs); font-weight: 600; text-transform: uppercase; + letter-spacing: .04em; color: var(--grayscale-a9); +} .fern-product-selector-radio-group > a { text-decoration: none; color: inherit; border-radius: calc(var(--radius) * 2); } -.fern-product-selector-radio-group > a:hover { background: var(--accent-a3); } +.fern-product-selector-radio-group > a:hover { background: var(--grayscale-a3); } .fern-product-selector-radio-group > a[data-state="active"] { background: var(--accent-a3); box-shadow: inset 0 0 0 1px var(--accent-a8); } .fern-selection-item { padding: calc(var(--spacing) * 2.5); } .fern-selection-item .item-main { display: flex; gap: calc(var(--spacing) * 3); align-items: flex-start; } -.fern-selection-item-icon { width: 22px; height: 22px; color: var(--accent); flex-shrink: 0; } +.fern-selection-item-icon { width: 36px; height: 36px; padding: 2px; border-radius: 8px; color: var(--grayscale-a11); flex-shrink: 0; display: flex; align-items: center; } .fern-selection-item-icon svg { width: 100%; height: 100%; } -.fern-selection-item-title { margin: 0 0 2px; font-size: var(--text-sm); font-weight: 600; } -.fern-selection-item-subtitle { margin: 0; font-size: var(--text-xs); color: var(--grayscale-a11); line-height: 1.35; } +.fern-selection-item-title { margin: 0 0 2px; font-size: var(--text-sm); font-weight: 700; } +.fern-selection-item-subtitle { margin: 0; font-size: var(--text-sm); color: var(--grayscale-a9); line-height: 1.25; } /* --- Language dropdown items --- */ #lang-panel { min-width: 320px; } diff --git a/reference/overrides/main.html b/reference/overrides/main.html index 1ad4a5f1..dca4d460 100644 --- a/reference/overrides/main.html +++ b/reference/overrides/main.html @@ -74,6 +74,8 @@ From d09dee49217565ea6277fc25df3f2f15f6e1e344 Mon Sep 17 00:00:00 2001 From: August L-R Date: Fri, 26 Jun 2026 22:21:12 +0000 Subject: [PATCH 09/13] style fixes --- reference/assets/css/navbar.css | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/reference/assets/css/navbar.css b/reference/assets/css/navbar.css index 802f98fe..0b2b447a 100644 --- a/reference/assets/css/navbar.css +++ b/reference/assets/css/navbar.css @@ -36,6 +36,21 @@ /* --- Make room for the fixed Fern header ------------------------------------ */ :root { --fern-header-height: 65px; --md-header-height: 48px; } +/* MkDocs Material sets the root font-size to 20px, which inflates every + rem-based Fern token (--text-sm -> 17.5px, --text-xs -> 15px, etc.). And the + dropdown panels sit OUTSIDE #fern-header, so they inherit Material's Roboto + instead of the Fern font. Pin BOTH on the whole Fern surface: redeclare the + sized tokens in their 16px-equivalent px values, and force the Fern font. */ +#fern-header, +.fern-dropdown, +.fern-dropdown-panel { + --spacing: 4px; + --radius: 4px; + --text-xs: 12px; + --text-sm: 14px; + font-family: var(--font-body); +} + /* The Fern bar is position:fixed (out of flow) so it reserves no space on its own. Reserve its height on so Material's sticky header and content don't ride up underneath it. From 068fea6ddb65ca705d37f053e907acdf12c705ae Mon Sep 17 00:00:00 2001 From: August L-R Date: Fri, 26 Jun 2026 22:42:39 +0000 Subject: [PATCH 10/13] fix (reference): use compiled fern.css for navbar, fix double hover effect on menu --- reference/assets/css/navbar.css | 32 ++++++++++++++------------------ reference/overrides/main.html | 11 +---------- 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/reference/assets/css/navbar.css b/reference/assets/css/navbar.css index 0b2b447a..d18cc13b 100644 --- a/reference/assets/css/navbar.css +++ b/reference/assets/css/navbar.css @@ -207,24 +207,20 @@ html { scroll-padding-top: calc(var(--fern-header-height) + var(--md-header-heig .fern-dropdown-item-indicator { width: 16px; display: inline-flex; flex-shrink: 0; } .fern-dropdown-item-indicator svg { width: 14px; height: 14px; } -/* --- Product mega panel --- */ -#product-panel { width: min(1040px, 95vw); padding: calc(var(--spacing) * 4); } -.fern-product-selector-radio-group { display: grid; grid-template-columns: repeat(3, 1fr); gap: calc(var(--spacing) * 5); align-items: start; } -.fern-product-group { display: flex; flex-direction: column; } -.fern-product-group-title { - margin: 0 0 calc(var(--spacing) * 1.5); padding: 0 calc(var(--spacing) * 2.5); - font-size: var(--text-xs); font-weight: 600; text-transform: uppercase; - letter-spacing: .04em; color: var(--grayscale-a9); -} -.fern-product-selector-radio-group > a { text-decoration: none; color: inherit; border-radius: calc(var(--radius) * 2); } -.fern-product-selector-radio-group > a:hover { background: var(--grayscale-a3); } -.fern-product-selector-radio-group > a[data-state="active"] { background: var(--accent-a3); box-shadow: inset 0 0 0 1px var(--accent-a8); } -.fern-selection-item { padding: calc(var(--spacing) * 2.5); } -.fern-selection-item .item-main { display: flex; gap: calc(var(--spacing) * 3); align-items: flex-start; } -.fern-selection-item-icon { width: 36px; height: 36px; padding: 2px; border-radius: 8px; color: var(--grayscale-a11); flex-shrink: 0; display: flex; align-items: center; } -.fern-selection-item-icon svg { width: 100%; height: 100%; } -.fern-selection-item-title { margin: 0 0 2px; font-size: var(--text-sm); font-weight: 700; } -.fern-selection-item-subtitle { margin: 0; font-size: var(--text-sm); color: var(--grayscale-a9); line-height: 1.25; } +/* --- Product mega panel --- + fern.css (the cloned production CSS) owns the 3-column grid, group headers, + item layout, hover, active ring, and footer — keyed off the flat + list. We only kill the generic panel padding so fern.css's own radio-group + padding is the single source, and let the grid size the panel. */ +#product-panel { padding: 0; width: max-content; max-width: 95vw; } +/* fern.css's mega-menu uses literal rem (grid gaps, group-header size/offset, + item radius); Material's 20px root inflates them 1.25x. Re-pin to 16px-root + equivalents so the panel matches production density. */ +#product-panel .fern-product-selector-radio-group { column-gap: 24px; row-gap: 8px; padding: 56px 20px 6px; } +#product-panel .fern-product-selector-radio-group > a .fern-selection-item { border-radius: 16px; } +#product-panel .fern-product-selector-radio-group > a[href*="/docs/platform"]::before, +#product-panel .fern-product-selector-radio-group > a[href*="server-sdks"]::before, +#product-panel .fern-product-selector-radio-group > a[href$="/docs/apis"]::before { top: -28px; font-size: 11px; } /* --- Language dropdown items --- */ #lang-panel { min-width: 320px; } diff --git a/reference/overrides/main.html b/reference/overrides/main.html index dca4d460..05832af9 100644 --- a/reference/overrides/main.html +++ b/reference/overrides/main.html @@ -74,8 +74,6 @@ From 0966fae389b0971262d713d829791e6d3fe30f0a Mon Sep 17 00:00:00 2001 From: August L-R Date: Sat, 27 Jun 2026 00:56:19 +0000 Subject: [PATCH 11/13] fix(reference): align navbar css with production Fern --- reference/assets/css/navbar.css | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/reference/assets/css/navbar.css b/reference/assets/css/navbar.css index d18cc13b..cf008327 100644 --- a/reference/assets/css/navbar.css +++ b/reference/assets/css/navbar.css @@ -24,12 +24,12 @@ --accent-9: #40e0d0; --accent-11: #32d7c7; --accent-12: #b9f6ed; --accent-a3: #00fe9820; --accent-a5: #00fcc53e; --accent-a9: #47feeadf; - --accent-a11: #3affead5; --accent-contrast: #042824; + --accent-a2: #00fe980f; --accent-a11: #3affead5; --accent-contrast: #042824; --grayscale-3: #212225; --grayscale-5: #2e3135; --grayscale-8: #5a6169; --grayscale-9: #696e77; --grayscale-11: #b0b4ba; --grayscale-12: #edeef0; --grayscale-a3: #ddeaf814; --grayscale-a5: #d9edfe25; --grayscale-a9: #dfebfd6d; - --grayscale-a11: #f1f7feb5; + --grayscale-a11: #f1f7feb5; --grayscale-a12: #f7fbffec; --grayscale-contrast: #000; --grayscale-surface: rgba(0, 0, 0, 0.05); } @@ -164,20 +164,11 @@ html { scroll-padding-top: calc(var(--fern-header-height) + var(--md-header-heig .fern-icon-button:hover { background: var(--grayscale-a3); } .fern-icon-button svg { width: calc(var(--spacing) * 5); height: calc(var(--spacing) * 5); } -/* --- Product selector trigger --- */ -.fern-product-selector { - appearance: none; border: 0; background: transparent; cursor: pointer; font: inherit; - display: inline-flex; align-items: center; - padding: calc(var(--spacing) * 1.5) calc(var(--spacing) * 2); - border-radius: calc(var(--radius) * 2); - color: var(--grayscale-12); - transition: background-color 0.15s; -} -.fern-product-selector:hover, -.fern-product-selector[data-state="open"] { background: var(--grayscale-a3); } -.product-dropdown-trigger { display: inline-flex; align-items: center; gap: calc(var(--spacing) * 1.5); } -.product-item-title { margin: 0; font-size: var(--text-sm); font-weight: 600; } -.product-dropdown-trigger svg { width: calc(var(--spacing) * 4); height: calc(var(--spacing) * 4); } +/* --- Product selector trigger --- + fern.css owns the trigger: the hover/open box lives on the inner + .product-dropdown-trigger, while .fern-product-selector is the transparent, + padding:0 button. Do NOT restyle it here — adding padding/border-radius/bg to + the button draws a SECOND box around fern.css's inner one (nested double-box). */ /* ============================================================================= Dropdown panels From a69e4e43067750cbc228851de16dced188492f51 Mon Sep 17 00:00:00 2001 From: August L-R Date: Sat, 27 Jun 2026 00:56:53 +0000 Subject: [PATCH 12/13] fix(reference): flat product-menu markup, remove language switcher --- reference/overrides/main.html | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/reference/overrides/main.html b/reference/overrides/main.html index 05832af9..6e92558c 100644 --- a/reference/overrides/main.html +++ b/reference/overrides/main.html @@ -35,16 +35,8 @@ - -
- -
+ +