diff --git a/_site/customizations/ask-ai-button.js b/_site/customizations/ask-ai-button.js
index d45caccd..5ddc7048 100644
--- a/_site/customizations/ask-ai-button.js
+++ b/_site/customizations/ask-ai-button.js
@@ -11,14 +11,6 @@
+ ''
+ '';
- function injectStyles() {
- if (document.getElementById('ch-ask-ai-styles')) return;
- var style = document.createElement('style');
- style.id = 'ch-ask-ai-styles';
- style.textContent = '.dark .ch-ai-icon { color: #fdff75; }';
- document.head.appendChild(style);
- }
-
// Wait briefly for Kapa to mount (it's loaded async), then open. Kapa's
// open() accepts an optional query that's submitted immediately when
// submit:true is set.
@@ -47,8 +39,6 @@
if (!searchBar) return false;
- injectStyles();
-
var btn = document.createElement('button');
btn.id = BTN_ID;
btn.type = 'button';
@@ -71,8 +61,6 @@
if (!mobileSearchBtn) return false;
- injectStyles();
-
var btn = document.createElement('button');
btn.id = MOBILE_BTN_ID;
btn.type = 'button';
@@ -89,12 +77,19 @@
}
function init() {
- injectButton();
- injectMobileButton();
+ var desktopDone = injectButton();
+ var mobileDone = injectMobileButton();
+ if (desktopDone && mobileDone) return;
+ var rafId = null;
var observer = new MutationObserver(function () {
- injectButton();
- injectMobileButton();
+ if (rafId) return;
+ rafId = requestAnimationFrame(function () {
+ rafId = null;
+ if (!desktopDone) desktopDone = injectButton();
+ if (!mobileDone) mobileDone = injectMobileButton();
+ if (desktopDone && mobileDone) observer.disconnect();
+ });
});
observer.observe(document.documentElement, { childList: true, subtree: true });
}
diff --git a/_site/customizations/clickhouse-sql-highlight.js b/_site/customizations/clickhouse-sql-highlight.js
index 7dcb2bc1..69f76fc6 100644
--- a/_site/customizations/clickhouse-sql-highlight.js
+++ b/_site/customizations/clickhouse-sql-highlight.js
@@ -232,36 +232,6 @@
// ---- DOM integration ------------------------------------------------------
- var STYLE_ID = 'ch-sql-highlight-styles';
-
- // The exact light + dark palette from play.html / clickhouse-client, adapted
- // to Mintlify's dark-mode carrier (``). Scoped to
- // `.ch-sql-hl` so only blocks we rebuilt are affected. `!important` is
- // required because Mintlify forces `html.dark .shiki span { color:
- // var(--shiki-dark) !important }` on every token; our higher-specificity
- // `.dark .ch-sql-hl .q-*` rules only win when they are also `!important`.
- function injectStyles() {
- if (document.getElementById(STYLE_ID)) return;
- var css =
- '.ch-sql-hl .q-kw{font-weight:bold !important}' +
- '.ch-sql-hl .q-com{font-style:italic !important;color:#757575 !important}' +
- '.ch-sql-hl .q-id{color:#00838f !important}' +
- '.ch-sql-hl .q-fn{color:#875f00 !important}' +
- '.ch-sql-hl .q-num{color:#008700 !important}' +
- '.ch-sql-hl .q-str{color:#006400 !important}' +
- '.ch-sql-hl .q-qid{color:#008b8b !important}' +
- '.dark .ch-sql-hl .q-id{color:#00cdcd !important}' +
- '.dark .ch-sql-hl .q-fn{color:#cdcd00 !important}' +
- '.dark .ch-sql-hl .q-num{color:#00d700 !important}' +
- '.dark .ch-sql-hl .q-str{color:#00cd00 !important}' +
- '.dark .ch-sql-hl .q-qid{color:#00d7d7 !important}' +
- '.dark .ch-sql-hl .q-com{color:#9e9e9e !important}';
- var style = document.createElement('style');
- style.id = STYLE_ID;
- style.textContent = css;
- document.head.appendChild(style);
- }
-
// Replace a line element's Shiki token spans with our class-based segments.
// Uses textContent (not innerHTML) so SQL characters like `<` and `&` are
// never interpreted as markup.
@@ -302,7 +272,6 @@
code.dataset.chSqlState = 'skipped';
return;
}
- injectStyles();
for (var i = 0; i < lineEls.length; i++) renderLine(lineEls[i], lines[i]);
code.classList.add('ch-sql-hl');
code.dataset.chSqlState = 'done';
diff --git a/_site/customizations/custom-footer.js b/_site/customizations/custom-footer.js
index 2d119954..31bfffce 100644
--- a/_site/customizations/custom-footer.js
+++ b/_site/customizations/custom-footer.js
@@ -126,82 +126,6 @@
return html;
}
- function injectStyles() {
- if (document.getElementById('ch-footer-styles')) return;
- var style = document.createElement('style');
- style.id = 'ch-footer-styles';
- style.textContent = ''
- + '#' + FOOTER_ID + ' { box-sizing: border-box; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; }'
- // On desktop the sidebar is fixed at 19rem wide; match #content-container's
- // horizontal padding (pl-[32px] / pr-[32px]) so the footer's inner edges
- // align with the content area used by both doc pages and the home page.
- + '@media (min-width: 1024px) { #' + FOOTER_ID + ' { padding-left: calc(19rem + 32px) !important; padding-right: 32px !important; } }'
- + '#' + FOOTER_ID + ' [data-inner] { max-width: 1280px; margin: 0 auto; }'
- + '#' + FOOTER_ID + ' * { box-sizing: border-box; }'
- + '#' + FOOTER_ID + ' a { text-decoration: none; transition: color 0.15s, border-color 0.15s; }'
- // Top section: sitemap + CTA side by side only at wide viewports
- + '#' + FOOTER_ID + ' [data-top] { display: flex; flex-direction: column; gap: 32px; padding-bottom: 48px; }'
- + '@media (min-width: 1400px) { #' + FOOTER_ID + ' [data-top] { flex-direction: row; gap: 40px; } }'
- // Sitemap grid: 2 cols default, 3 at md, 5 only when side-by-side
- + '#' + FOOTER_ID + ' [data-sitemap] { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; flex: 1; min-width: 0; }'
- + '@media (min-width: 768px) { #' + FOOTER_ID + ' [data-sitemap] { grid-template-columns: repeat(3, 1fr); } }'
- + '@media (min-width: 1400px) { #' + FOOTER_ID + ' [data-sitemap] { grid-template-columns: repeat(5, 1fr); } }'
- // Column headings
- + '#' + FOOTER_ID + ' [data-sitemap] h3 { font-size: 13px; font-weight: 600; margin: 0 0 12px; }'
- + '#' + FOOTER_ID + ' [data-sitemap] .ch-sub-heading { margin-top: 24px; }'
- + '#' + FOOTER_ID + ' [data-sitemap] ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }'
- + '#' + FOOTER_ID + ' [data-sitemap] a { font-size: 13px; }'
- // CTA column
- + '#' + FOOTER_ID + ' [data-cta] { display: flex; flex-direction: column; }'
- + '@media (min-width: 1400px) { #' + FOOTER_ID + ' [data-cta] { width: 300px; flex-shrink: 0; } }'
- + '#' + FOOTER_ID + ' [data-cta] p { font-size: 13px; line-height: 1.5; margin: 0 0 20px; }'
- + '#' + FOOTER_ID + ' [data-cta] form { display: flex; border-radius: 8px; overflow: hidden; margin-bottom: 16px; }'
- + '#' + FOOTER_ID + ' [data-cta] form input { flex: 1; background: transparent; border: none; padding: 10px 14px; font-size: 13px; outline: none; min-width: 0; }'
- + '#' + FOOTER_ID + ' [data-cta] form button { background: #fdff75; color: #1c1c1c; border: none; padding: 10px 20px; font-size: 13px; font-weight: 600; cursor: pointer; white-space: nowrap; }'
- + '#' + FOOTER_ID + ' [data-cta] form button:hover { background: #eaec6a; }'
- + '#' + FOOTER_ID + ' [data-gh] { display: inline-flex; align-items: center; justify-content: center; gap: 8px; background: transparent; padding: 10px 20px; border-radius: 8px; font-size: 13px; font-weight: 600; width: 100%; }'
- + '#' + FOOTER_ID + ' [data-gh]:hover { border-color: #888 !important; }'
- // Bottom bar
- + '#' + FOOTER_ID + ' [data-divider] { margin-bottom: 24px; }'
- + '#' + FOOTER_ID + ' [data-bottom] { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 12px; }'
- + '#' + FOOTER_ID + ' [data-bottom] a { font-size: 13px; white-space: nowrap; }'
- + '#' + FOOTER_ID + ' [data-legal] { display: flex; flex-wrap: wrap; gap: 16px; }'
- + '@media (max-width: 639px) {'
- + ' #' + FOOTER_ID + ' [data-bottom] { flex-direction: column; text-align: center; }'
- + ' #' + FOOTER_ID + ' [data-legal] { justify-content: center; }'
- + '}'
- // Light mode colors
- + '#' + FOOTER_ID + ' [data-sitemap] h3 { color: #111; }'
- + '#' + FOOTER_ID + ' [data-sitemap] a { color: #6b7280; }'
- + '#' + FOOTER_ID + ' [data-sitemap] a:hover { color: #111; }'
- + '#' + FOOTER_ID + ' [data-cta] p { color: #6b7280; }'
- + '#' + FOOTER_ID + ' [data-cta] form { border: 1px solid #d1d5db; }'
- + '#' + FOOTER_ID + ' [data-cta] form input { color: #111; }'
- + '#' + FOOTER_ID + ' [data-cta] form input::placeholder { color: #9ca3af; }'
- + '#' + FOOTER_ID + ' [data-gh] { color: #111; border: 1px solid #d1d5db; }'
- + '#' + FOOTER_ID + ' [data-divider] { border-top: 1px solid #e5e7eb; }'
- + '#' + FOOTER_ID + ' [data-copyright] { font-size: 13px; color: #6b7280; }'
- + '#' + FOOTER_ID + ' [data-bottom] a { color: #6b7280; }'
- + '#' + FOOTER_ID + ' [data-bottom] a:hover { color: #111; }'
- + '#' + FOOTER_ID + ' [data-logo] { margin-bottom: 16px; }'
- + '#' + FOOTER_ID + ' [data-logo] svg * { fill: #111; }'
- // Dark mode colors
- + '.dark #' + FOOTER_ID + ' [data-sitemap] h3 { color: #f5f5f5; }'
- + '.dark #' + FOOTER_ID + ' [data-sitemap] a { color: #a3a3a3; }'
- + '.dark #' + FOOTER_ID + ' [data-sitemap] a:hover { color: #f5f5f5; }'
- + '.dark #' + FOOTER_ID + ' [data-cta] p { color: #a3a3a3; }'
- + '.dark #' + FOOTER_ID + ' [data-cta] form { border-color: #555; }'
- + '.dark #' + FOOTER_ID + ' [data-cta] form input { color: #fff; }'
- + '.dark #' + FOOTER_ID + ' [data-cta] form input::placeholder { color: #6b7280; }'
- + '.dark #' + FOOTER_ID + ' [data-gh] { color: #fff; border-color: #555; }'
- + '.dark #' + FOOTER_ID + ' [data-divider] { border-color: #333; }'
- + '.dark #' + FOOTER_ID + ' [data-copyright] { color: #a3a3a3; }'
- + '.dark #' + FOOTER_ID + ' [data-bottom] a { color: #a3a3a3; }'
- + '.dark #' + FOOTER_ID + ' [data-bottom] a:hover { color: #f5f5f5; }'
- + '.dark #' + FOOTER_ID + ' [data-logo] svg * { fill: #fff; }';
- document.head.appendChild(style);
- }
-
function buildFooterHtml() {
var year = new Date().getFullYear();
@@ -290,8 +214,6 @@
}
// Inject styles and create footer
- injectStyles();
-
var wrapper = document.createElement('footer');
wrapper.id = FOOTER_ID;
wrapper.style.cssText = 'width:100%;padding:64px 24px 32px;';
diff --git a/_site/customizations/navbar-cta.js b/_site/customizations/navbar-cta.js
index e34ae273..edc80692 100644
--- a/_site/customizations/navbar-cta.js
+++ b/_site/customizations/navbar-cta.js
@@ -12,43 +12,12 @@
return String(count);
}
- function injectStyles() {
- if (document.getElementById('ch-navbar-cta-styles')) return;
- var style = document.createElement('style');
- style.id = 'ch-navbar-cta-styles';
- style.textContent = ''
- // Hide mobile AI assistant button
- + '#assistant-entry-mobile { display: none !important; }'
- // Invert dark SVG logos so they're visible on dark backgrounds
- + '.dark img[src*="windsurf"], :is(.dark) img[src*="windsurf"] { filter: invert(1) !important; }'
- // CTA container
- + '#' + CTA_ID + ' { display: flex; align-items: center; gap: 16px; flex-shrink: 0; margin-left: 32px; }'
- // GitHub stars link
- + '#' + CTA_ID + ' .ch-gh-stars { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 500; text-decoration: none; white-space: nowrap; transition: color 0.15s; }'
- + '#' + CTA_ID + ' .ch-gh-stars svg { flex-shrink: 0; }'
- // Get started button
- + '#' + CTA_ID + ' .ch-cta-btn { display: inline-flex; align-items: center; padding: 6px 16px; border-radius: 4px; font-size: 13px; font-weight: 600; text-decoration: none; white-space: nowrap; transition: background-color 0.15s, color 0.15s; }'
- // Light mode
- + '#' + CTA_ID + ' .ch-gh-stars { color: #374151; }'
- + '#' + CTA_ID + ' .ch-gh-stars:hover { color: #111; }'
- + '#' + CTA_ID + ' .ch-cta-btn { background: #1c1c1c; color: #fff; }'
- + '#' + CTA_ID + ' .ch-cta-btn:hover { background: #333; }'
- // Dark mode
- + '.dark #' + CTA_ID + ' .ch-gh-stars { color: #d1d5db; }'
- + '.dark #' + CTA_ID + ' .ch-gh-stars:hover { color: #fff; }'
- + '.dark #' + CTA_ID + ' .ch-cta-btn { background: #fdff75; color: #1c1c1c; }'
- + '.dark #' + CTA_ID + ' .ch-cta-btn:hover { background: #eaec6a; }';
- document.head.appendChild(style);
- }
-
function injectCta() {
if (document.getElementById(CTA_ID)) return true;
var mapleNav = document.getElementById('navbar-transition-maple');
if (!mapleNav) return false;
- injectStyles();
-
// --- Right section: GitHub stars + Get started ---
var container = document.createElement('div');
container.id = CTA_ID;
@@ -101,8 +70,13 @@
function init() {
injectCta();
+ var rafId = null;
var observer = new MutationObserver(function () {
- injectCta();
+ if (rafId) return;
+ rafId = requestAnimationFrame(function () {
+ rafId = null;
+ injectCta();
+ });
});
observer.observe(document.documentElement, { childList: true, subtree: true });
}
diff --git a/_site/customizations/quickstart-back-link.js b/_site/customizations/quickstart-back-link.js
index 031ed19f..598bfd48 100644
--- a/_site/customizations/quickstart-back-link.js
+++ b/_site/customizations/quickstart-back-link.js
@@ -66,12 +66,14 @@
function init() {
apply();
- // Re-apply across SPA navigations / React re-renders. apply() is
- // idempotent, so observer feedback loops settle immediately.
- new MutationObserver(apply).observe(document.documentElement, {
- childList: true,
- subtree: true,
- });
+ var rafId = null;
+ new MutationObserver(function () {
+ if (rafId) return;
+ rafId = requestAnimationFrame(function () {
+ rafId = null;
+ apply();
+ });
+ }).observe(document.documentElement, { childList: true, subtree: true });
}
if (document.readyState === 'loading') {
diff --git a/_site/customizations/scroll-reset.js b/_site/customizations/scroll-reset.js
deleted file mode 100644
index 8fdc474d..00000000
--- a/_site/customizations/scroll-reset.js
+++ /dev/null
@@ -1,62 +0,0 @@
-(function () {
- 'use strict';
-
- // With an announcement banner configured, Next.js skips its scroll-to-top
- // on client-side navigation: the banner is position:fixed at the top of the
- // re-rendered segment, so the router considers the new page "already in
- // viewport" and leaves the scroll position where it was. (Banner-less
- // Mintlify sites scroll to top as expected; dismissing the banner makes the
- // bug disappear.) Restore the expected behavior by scrolling to the top
- // whenever a forward navigation changes the path.
- //
- // The path is watched from a rAF loop rather than by wrapping
- // history.pushState — the router can hold a reference to the original
- // pushState from before this script runs, which would bypass a wrapper.
- //
- // Back/forward (popstate) is deliberately left alone so the browser and
- // router can restore the previous scroll position. Cross-page hash links
- // (/page#anchor) scroll to the anchor once the new page has rendered it,
- // since the banner bug breaks that scroll too.
- var lastPath = window.location.pathname;
- var traversed = false;
-
- window.addEventListener('popstate', function () {
- if (window.location.pathname !== lastPath) {
- traversed = true;
- }
- });
-
- // The new page renders some frames after the path changes, so poll for the
- // anchor target before scrolling to it; if it never appears (bad anchor),
- // fall back to the top rather than keeping the old page's position.
- function scrollToAnchor(hash, framesLeft) {
- var id;
- try { id = decodeURIComponent(hash.slice(1)); } catch (e) { id = hash.slice(1); }
- var el = document.getElementById(id);
- if (el) {
- el.scrollIntoView();
- return;
- }
- if (framesLeft > 0 && window.location.hash === hash) {
- window.requestAnimationFrame(function () { scrollToAnchor(hash, framesLeft - 1); });
- } else {
- window.scrollTo(0, 0);
- }
- }
-
- function watch() {
- var path = window.location.pathname;
- if (path !== lastPath) {
- lastPath = path;
- if (traversed) {
- traversed = false;
- } else if (window.location.hash) {
- scrollToAnchor(window.location.hash, 180);
- } else {
- window.scrollTo(0, 0);
- }
- }
- window.requestAnimationFrame(watch);
- }
- window.requestAnimationFrame(watch);
-})();
\ No newline at end of file
diff --git a/_site/customizations/tab-nav.js b/_site/customizations/tab-nav.js
index e267c1e6..bfbc4434 100644
--- a/_site/customizations/tab-nav.js
+++ b/_site/customizations/tab-nav.js
@@ -68,16 +68,7 @@
if (SECTION_HEADERS.indexOf(text) === -1) return;
a.dataset.headerStyled = '1';
- a.style.fontWeight = '700';
- a.style.fontSize = '0.75rem';
- a.style.letterSpacing = '0.05em';
- a.style.textTransform = 'uppercase';
- a.style.opacity = '0.5';
- a.style.pointerEvents = 'none';
- a.style.cursor = 'default';
- a.style.borderBottom = '1px solid rgba(255,255,255,0.08)';
- a.style.paddingBottom = '8px';
- a.style.marginBottom = '2px';
+ a.classList.add('ch-mobile-nav-header');
a.addEventListener('click', function (e) {
e.preventDefault();
@@ -86,16 +77,6 @@
});
}
- // ── Logo theme sync ──────────────────────────────────────────────────────
- function updateLogoTheme() {
- var light = document.getElementById('ch-hp-logo-light');
- var dark = document.getElementById('ch-hp-logo-dark');
- if (!light || !dark) return;
- var isDark = document.documentElement.classList.contains('dark');
- light.style.display = isDark ? 'none' : 'block';
- dark.style.display = isDark ? 'block' : 'none';
- }
-
// ── Homepage sidebar hiding ───────────────────────────────────────────────
// Each locale has its own homepage at / (e.g. /es, /ja); treat those
// the same as the English homepage at /.
@@ -162,7 +143,6 @@
logoLink.innerHTML = '
'
+ '
';
navbar.insertBefore(logoLink, navbar.firstChild);
- updateLogoTheme();
}
// Move theme toggle from sidebar to navbar — insert after logo, before tabs.
@@ -219,7 +199,6 @@
rafId = null;
applyHomepageClass();
setupHomepageNavbar();
- updateLogoTheme();
patchTabButtons();
styleDropdownHeaders();
markNavbarReady();
diff --git a/_site/styles.css b/_site/styles.css
index e22ad366..2b52bf0c 100644
--- a/_site/styles.css
+++ b/_site/styles.css
@@ -2756,3 +2756,133 @@ a.mobile-nav-tabs-item[href$="/products/clickhouse-private"],
a.mobile-nav-tabs-item[href$="/products/clickhouse-private/index"] {
display: none !important;
}
+
+/* ============================================
+ Homepage logo theme sync
+ (replaces updateLogoTheme() in tab-nav.js — pure CSS now)
+ ============================================ */
+
+#ch-hp-logo-dark { display: none; }
+html.dark #ch-hp-logo-dark { display: block; }
+html.dark #ch-hp-logo-light { display: none; }
+
+/* ============================================
+ Mobile nav section headers
+ (replaces inline styles in tab-nav.js styleDropdownHeaders)
+ ============================================ */
+
+.ch-mobile-nav-header {
+ font-weight: 700;
+ font-size: 0.75rem;
+ letter-spacing: 0.05em;
+ text-transform: uppercase;
+ opacity: 0.5;
+ pointer-events: none;
+ cursor: default;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
+ padding-bottom: 8px;
+ margin-bottom: 2px;
+}
+
+/* ============================================
+ ClickHouse SQL syntax highlighting
+ (moved from injectStyles() in clickhouse-sql-highlight.js)
+ ============================================ */
+
+.ch-sql-hl .q-kw { font-weight: bold !important; }
+.ch-sql-hl .q-com { font-style: italic !important; color: #757575 !important; }
+.ch-sql-hl .q-id { color: #00838f !important; }
+.ch-sql-hl .q-fn { color: #875f00 !important; }
+.ch-sql-hl .q-num { color: #008700 !important; }
+.ch-sql-hl .q-str { color: #006400 !important; }
+.ch-sql-hl .q-qid { color: #008b8b !important; }
+.dark .ch-sql-hl .q-id { color: #00cdcd !important; }
+.dark .ch-sql-hl .q-fn { color: #cdcd00 !important; }
+.dark .ch-sql-hl .q-num { color: #00d700 !important; }
+.dark .ch-sql-hl .q-str { color: #00cd00 !important; }
+.dark .ch-sql-hl .q-qid { color: #00d7d7 !important; }
+.dark .ch-sql-hl .q-com { color: #9e9e9e !important; }
+
+/* ============================================
+ Navbar CTA — GitHub stars + Get Started button
+ (moved from injectStyles() in navbar-cta.js)
+ ============================================ */
+
+#assistant-entry-mobile { display: none !important; }
+.dark img[src*="windsurf"],
+:is(.dark) img[src*="windsurf"] { filter: invert(1) !important; }
+#ch-navbar-cta { display: flex; align-items: center; gap: 16px; flex-shrink: 0; margin-left: 32px; }
+#ch-navbar-cta .ch-gh-stars { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 500; text-decoration: none; white-space: nowrap; transition: color 0.15s; }
+#ch-navbar-cta .ch-gh-stars svg { flex-shrink: 0; }
+#ch-navbar-cta .ch-cta-btn { display: inline-flex; align-items: center; padding: 6px 16px; border-radius: 4px; font-size: 13px; font-weight: 600; text-decoration: none; white-space: nowrap; transition: background-color 0.15s, color 0.15s; }
+#ch-navbar-cta .ch-gh-stars { color: #374151; }
+#ch-navbar-cta .ch-gh-stars:hover { color: #111; }
+#ch-navbar-cta .ch-cta-btn { background: #1c1c1c; color: #fff; }
+#ch-navbar-cta .ch-cta-btn:hover { background: #333; }
+.dark #ch-navbar-cta .ch-gh-stars { color: #d1d5db; }
+.dark #ch-navbar-cta .ch-gh-stars:hover { color: #fff; }
+.dark #ch-navbar-cta .ch-cta-btn { background: #fdff75; color: #1c1c1c; }
+.dark #ch-navbar-cta .ch-cta-btn:hover { background: #eaec6a; }
+
+/* ============================================
+ Custom footer layout, typography and colors
+ (moved from injectStyles() in custom-footer.js)
+ ============================================ */
+
+#ch-custom-footer { box-sizing: border-box; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; }
+#ch-custom-footer [data-inner] { max-width: 1280px; margin: 0 auto; }
+#ch-custom-footer * { box-sizing: border-box; }
+#ch-custom-footer a { text-decoration: none; transition: color 0.15s, border-color 0.15s; }
+#ch-custom-footer [data-top] { display: flex; flex-direction: column; gap: 32px; padding-bottom: 48px; }
+@media (min-width: 1400px) { #ch-custom-footer [data-top] { flex-direction: row; gap: 40px; } }
+#ch-custom-footer [data-sitemap] { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; flex: 1; min-width: 0; }
+@media (min-width: 768px) { #ch-custom-footer [data-sitemap] { grid-template-columns: repeat(3, 1fr); } }
+@media (min-width: 1400px) { #ch-custom-footer [data-sitemap] { grid-template-columns: repeat(5, 1fr); } }
+#ch-custom-footer [data-sitemap] h3 { font-size: 13px; font-weight: 600; margin: 0 0 12px; }
+#ch-custom-footer [data-sitemap] .ch-sub-heading { margin-top: 24px; }
+#ch-custom-footer [data-sitemap] ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
+#ch-custom-footer [data-sitemap] a { font-size: 13px; }
+#ch-custom-footer [data-cta] { display: flex; flex-direction: column; }
+@media (min-width: 1400px) { #ch-custom-footer [data-cta] { width: 300px; flex-shrink: 0; } }
+#ch-custom-footer [data-cta] p { font-size: 13px; line-height: 1.5; margin: 0 0 20px; }
+#ch-custom-footer [data-cta] form { display: flex; border-radius: 8px; overflow: hidden; margin-bottom: 16px; }
+#ch-custom-footer [data-cta] form input { flex: 1; background: transparent; border: none; padding: 10px 14px; font-size: 13px; outline: none; min-width: 0; }
+#ch-custom-footer [data-cta] form button { background: #fdff75; color: #1c1c1c; border: none; padding: 10px 20px; font-size: 13px; font-weight: 600; cursor: pointer; white-space: nowrap; }
+#ch-custom-footer [data-cta] form button:hover { background: #eaec6a; }
+#ch-custom-footer [data-gh] { display: inline-flex; align-items: center; justify-content: center; gap: 8px; background: transparent; padding: 10px 20px; border-radius: 8px; font-size: 13px; font-weight: 600; width: 100%; }
+#ch-custom-footer [data-gh]:hover { border-color: #888 !important; }
+#ch-custom-footer [data-divider] { margin-bottom: 24px; }
+#ch-custom-footer [data-bottom] { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 12px; }
+#ch-custom-footer [data-bottom] a { font-size: 13px; white-space: nowrap; }
+#ch-custom-footer [data-legal] { display: flex; flex-wrap: wrap; gap: 16px; }
+@media (max-width: 639px) {
+ #ch-custom-footer [data-bottom] { flex-direction: column; text-align: center; }
+ #ch-custom-footer [data-legal] { justify-content: center; }
+}
+#ch-custom-footer [data-sitemap] h3 { color: #111; }
+#ch-custom-footer [data-sitemap] a { color: #6b7280; }
+#ch-custom-footer [data-sitemap] a:hover { color: #111; }
+#ch-custom-footer [data-cta] p { color: #6b7280; }
+#ch-custom-footer [data-cta] form { border: 1px solid #d1d5db; }
+#ch-custom-footer [data-cta] form input { color: #111; }
+#ch-custom-footer [data-cta] form input::placeholder { color: #9ca3af; }
+#ch-custom-footer [data-gh] { color: #111; border: 1px solid #d1d5db; }
+#ch-custom-footer [data-divider] { border-top: 1px solid #e5e7eb; }
+#ch-custom-footer [data-copyright] { font-size: 13px; color: #6b7280; }
+#ch-custom-footer [data-bottom] a { color: #6b7280; }
+#ch-custom-footer [data-bottom] a:hover { color: #111; }
+#ch-custom-footer [data-logo] { margin-bottom: 16px; }
+#ch-custom-footer [data-logo] svg * { fill: #111; }
+.dark #ch-custom-footer [data-sitemap] h3 { color: #f5f5f5; }
+.dark #ch-custom-footer [data-sitemap] a { color: #a3a3a3; }
+.dark #ch-custom-footer [data-sitemap] a:hover { color: #f5f5f5; }
+.dark #ch-custom-footer [data-cta] p { color: #a3a3a3; }
+.dark #ch-custom-footer [data-cta] form { border-color: #555; }
+.dark #ch-custom-footer [data-cta] form input { color: #fff; }
+.dark #ch-custom-footer [data-cta] form input::placeholder { color: #6b7280; }
+.dark #ch-custom-footer [data-gh] { color: #fff; border-color: #555; }
+.dark #ch-custom-footer [data-divider] { border-color: #333; }
+.dark #ch-custom-footer [data-copyright] { color: #a3a3a3; }
+.dark #ch-custom-footer [data-bottom] a { color: #a3a3a3; }
+.dark #ch-custom-footer [data-bottom] a:hover { color: #f5f5f5; }
+.dark #ch-custom-footer [data-logo] svg * { fill: #fff; }
diff --git a/docs.json b/docs.json
index 6d3790f5..ca848d85 100644
--- a/docs.json
+++ b/docs.json
@@ -185,9 +185,6 @@
"$ref": "_site/redirects.json"
},
"scripts": [
- {
- "src": "/_site/customizations/scroll-reset.js"
- },
{
"src": "/_site/customizations/custom-footer.js"
},