From 03e6baf3df8057eb6ead3da268b7ed991a89b880 Mon Sep 17 00:00:00 2001 From: Nathan Schneider Date: Sun, 18 Oct 2026 22:36:57 -0600 Subject: [PATCH] Rebrand via Tailwind theme vars; hide signup prompt via :has() + observer; sync yaml with volume fix --- Dockerfile | 6 ++-- assets/custom.css | 78 ++++++++++++++++++++++++++------------------ assets/custom2.js | 42 +++++++++++++++--------- assets/custom_v2.css | 50 ---------------------------- 4 files changed, 76 insertions(+), 100 deletions(-) delete mode 100644 assets/custom_v2.css diff --git a/Dockerfile b/Dockerfile index 9331c2b..71a4c8b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,12 +30,12 @@ COPY assets/icon-192x192.png /app/code/librechat/client/dist/assets/icon-192x192 COPY assets/maskable-icon.png /app/code/librechat/client/dist/assets/maskable-icon.png # Custom stylesheet and optional helper JS -COPY assets/custom_v2.css /app/code/librechat/client/dist/assets/custom_v2.css +COPY assets/custom.css /app/code/librechat/client/dist/assets/custom.css # rebuild trigger COPY assets/custom2.js /app/code/librechat/client/dist/assets/custom2.js # Inject branding into built HTML (dist) before image is packaged # rebuild marker 20261019-$(date +%s) RUN sed -i 's|LibreChat|Inference Co‑op|' /app/code/librechat/client/dist/index.html && \ - sed -i '/Inference Co‑op<\/title>/a <link rel="stylesheet" href="assets/custom_v2.css">' /app/code/librechat/client/dist/index.html && \ - sed -i '/<link rel="stylesheet" href="assets\/custom_v2.css">/a <script src="assets/custom2.js"></script>' /app/code/librechat/client/dist/index.html + sed -i '/<title>Inference Co‑op<\/title>/a <link rel="stylesheet" href="assets/custom.css">' /app/code/librechat/client/dist/index.html && \ + sed -i '/<link rel="stylesheet" href="assets\/custom.css">/a <script src="assets/custom2.js"></script>' /app/code/librechat/client/dist/index.html diff --git a/assets/custom.css b/assets/custom.css index d78c861..c779ac8 100644 --- a/assets/custom.css +++ b/assets/custom.css @@ -1,51 +1,65 @@ -/* Co‑op branding colors */ -:root { - --brand-primary-rgb: 91,140,90; /* green */ - --brand-surface-rgb: 250,248,245;/* cream */ +/* ============================================================ + Inference Co-op branding — LibreChat overlay (v2, DOM-verified) + LibreChat's Tailwind theme resolves every color through CSS + variables set on html.light / html.dark (space-separated RGB). + Overriding those variables rebrands the WHOLE app — login page, + chat UI, dialogs — through the existing theme system. + ============================================================ */ + +html.light { + --surface-primary: 250 248 245; /* cream background */ + --surface-secondary: 241 237 230; + --surface-tertiary: 232 227 217; + --surface-hover: 236 234 217; + --surface-submit: 91 140 90; /* co-op green */ + --surface-submit-hover: 74 122 74; + --accent-primary: 91 140 90; + --accent-primary-hover: 74 122 74; + --ring-primary: 91 140 90; + --link: 74 122 74; + --text-primary: 36 48 32; + --text-secondary: 90 107 82; + --border-light: 213 221 208; } -/* Primary‑color UI */ -button, -.primary, -.MuiButton-contained, -.ant-btn-primary { - background-color: rgb(var(--brand-primary-rgb)) !important; - border-color: rgb(var(--brand-primary-rgb)) !important; +html.dark { + --surface-primary: 31 36 27; + --surface-secondary: 38 45 34; + --surface-tertiary: 46 54 40; + --surface-hover: 49 57 45; + --surface-submit: 122 184 122; + --surface-submit-hover: 142 200 142; + --accent-primary: 122 184 122; + --accent-primary-hover: 142 200 142; + --ring-primary: 142 200 142; + --link: 142 200 142; + --text-primary: 236 233 226; + --text-secondary: 168 173 158; + --border-light: 74 82 64; } -/* Surface background */ -body, -.appContainer, -.chatContainer, -.login-page { - background-color: rgb(var(--brand-surface-rgb)) !important; +/* ---- Remove the "Don't have an account? Sign up" line ---- + The <p> wraps the register link on auth pages. :has() hides the + whole paragraph (custom2.js is the MutationObserver fallback). */ +p:has(> a[href*="register"]) { + display: none !important; } - -/* Hide any registration / external‑account UI */ +/* Belt-and-braces: hide any residual register/signup links */ a[href*="register"], -a[href*="signup"], -.register-link, -.signup-link { +a[href*="signup"] { display: none !important; } -/* Ensure text on login page uses branding colors */ -.login-page, .login-page * { - color: rgb(36,48,32) !important; -} - +/* ---- Footer: simple centered link to the co-op homepage ---- */ footer { text-align: center; padding: 1rem; } footer::before { - content: "© Inference Co‑op – "; + content: "© Inference Co-op – "; } footer::after { content: "inference.coop"; - color: rgb(var(--brand-primary-rgb)); + color: rgb(var(--accent-primary)); cursor: pointer; } -footer::after:hover { - text-decoration: underline; -} \ No newline at end of file diff --git a/assets/custom2.js b/assets/custom2.js index bdb7d8d..cd05397 100644 --- a/assets/custom2.js +++ b/assets/custom2.js @@ -1,16 +1,28 @@ -// Auto-load saved image‑generation API key into the MCP input field. -// No prompt is shown; if a key is stored in localStorage it is auto‑filled. -window.addEventListener('load', () => { - const savedKey = localStorage.getItem('image_api_key'); - if (savedKey) { - const icInput = document.querySelector('input[name=\"IC_API_KEY\"]'); - if (icInput) icInput.value = savedKey; +// Co-op login-page polish. +// The auth form is client-rendered (React), so a plain `load` listener runs +// too early — a MutationObserver re-checks on every DOM change instead. +(function () { + function hideSignupPrompt() { + document.querySelectorAll('p').forEach(function (p) { + var link = p.querySelector('a[href*="register"]'); + var text = (p.textContent || ''); + if (link || text.indexOf("Don't have an account") !== -1) { + p.style.display = 'none'; + } + }); } - // Hide "Don't have an account?" text on the login page - const nodes = document.querySelectorAll('p, span, div'); - nodes.forEach(node => { - if (node.textContent && node.textContent.includes("Don't have an account")) { - node.style.display = 'none'; - } - }); -}); \ No newline at end of file + + function start() { + hideSignupPrompt(); + new MutationObserver(hideSignupPrompt).observe(document.body, { + childList: true, + subtree: true, + }); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', start); + } else { + start(); + } +})(); diff --git a/assets/custom_v2.css b/assets/custom_v2.css deleted file mode 100644 index 086ae7d..0000000 --- a/assets/custom_v2.css +++ /dev/null @@ -1,50 +0,0 @@ -/* Co‑op branding colors */ -:root { - --brand-primary-rgb: 91,140,90; /* green */ - --brand-surface-rgb: 250,248,245;/* cream */ -} - -/* Primary‑color UI */ -button, -.MuiButton-contained, -.ant-btn-primary { - background-color: rgb(var(--brand-primary-rgb)) !important; - border-color: rgb(var(--brand-primary-rgb)) !important; -} - -/* Surface background */ -body, -.appContainer, -.chatContainer, -.login-page { - background-color: rgb(var(--brand-surface-rgb)) !important; -} - -/* Hide any registration / external‑account UI */ -a[href*="register"], -a[href*="signup"], -.register-link, -.signup-link { - display: none !important; -} - -/* Ensure text on login page uses branding colors */ -.login-page, .login-page * { - color: rgb(36,48,32) !important; -} - -footer { - text-align: center; - padding: 1rem; -} -footer::before { - content: "© Inference Co‑op – "; -} -footer::after { - content: "inference.coop"; - color: rgb(var(--brand-primary-rgb)); - cursor: pointer; -} -footer::after:hover { - text-decoration: underline; -}