diff --git a/packages/docusaurus-theme/css/layout.css b/packages/docusaurus-theme/css/layout.css index 3c821e9c..498ff6ad 100644 --- a/packages/docusaurus-theme/css/layout.css +++ b/packages/docusaurus-theme/css/layout.css @@ -11,6 +11,39 @@ html { scrollbar-gutter: stable; } +/* Resources picker: sit after the color mode toggle, before search */ +.navbar__items--right > div:has(.nf-picker-trigger) { order: 2; display: flex; align-items: center; } +.navbar__items--right > div:has(.DocSearch-Button) { order: 3; } + +/* Separator between color mode toggle and resources picker */ +.navbar__items--right > div:has(.nf-picker-trigger)::before { + content: ''; + display: block; + width: 1px; + height: 1.2em; + background: currentColor; + opacity: 0.2; + margin-right: 0.75rem; +} + +/* Discourse navbar icon — multicolor brand logo */ +.nf-icon-link--discourse:hover { + opacity: 0.8; + color: inherit; +} + +/* Separator between navbar logo and nav items */ +.navbar__brand::after { + content: ''; + display: inline-block; + width: 1px; + height: 1.2em; + background: currentColor; + opacity: 0.2; + margin-left: 1rem; + vertical-align: middle; +} + .main-wrapper > div { /* work around issue from docusaurus doc grow/shrinking based on content */ width: 100%; diff --git a/packages/docusaurus-theme/css/product-picker.css b/packages/docusaurus-theme/css/product-picker.css index 374229f3..12442e0b 100644 --- a/packages/docusaurus-theme/css/product-picker.css +++ b/packages/docusaurus-theme/css/product-picker.css @@ -25,12 +25,14 @@ position: relative; padding-right: 1.2rem; transition: color 0.3s ease; + font-weight: var(--ifm-font-weight-bold); } .nf-picker-trigger:hover, .nf-resources-dropdown:hover, .navbar__item.dropdown--show .nf-picker-trigger, -.navbar__item.dropdown--show .nf-resources-dropdown { +.navbar__item.dropdown--show .nf-resources-dropdown, +.navbar__item.nf-picker--open .nf-picker-trigger { color: var(--ifm-color-primary); text-decoration: none; } @@ -59,17 +61,17 @@ opacity: 1; } -/* Open: chevron rotates 180° */ +/* Open: chevron holds the hover drop position */ .nf-picker--open .nf-picker-trigger::after, .navbar__item.dropdown--show .nf-resources-dropdown::after { - transform: translateY(-50%) rotate(180deg); + transform: translateY(-20%); opacity: 1; } /* Dark mode: cyan accent on hover */ [data-theme='dark'] .nf-picker-trigger:hover, [data-theme='dark'] .nf-resources-dropdown:hover, -[data-theme='dark'] .nf-picker--open .nf-picker-trigger, +[data-theme='dark'] .navbar__item.nf-picker--open .nf-picker-trigger, [data-theme='dark'] .navbar__item.dropdown--show .nf-resources-dropdown { color: #22d3ee; } @@ -139,7 +141,9 @@ } /* Narrower panel for the 2-column Resources menu */ -.dropdown__menu:has(.picker-resources) { max-width: 700px; } +.dropdown__menu:has(.picker-resources) { max-width: 400px; } +.nf-picker-panel--narrow { max-width: 430px; padding: 0.85rem 1.25rem; } + /* Ensure visibility when open */ .dropdown--show > .dropdown__menu, @@ -181,9 +185,33 @@ transition: all 0.2s ease; border-radius: 8px; } -.picker-link:hover { background: rgba(0, 118, 255, 0.06); transform: translateX(3px); } -.picker-link strong { color: var(--ifm-font-color-base); font-size: 0.95rem; font-weight: 900; letter-spacing: -0.02em; display: block; } -.picker-link span { color: #64748b; font-size: 0.82rem; display: block; margin-top: 2px; line-height: 1.35; } +.picker-link:hover { background: rgba(0, 118, 255, 0.06); transform: translateX(3px); text-decoration: none; } +.picker-link strong { color: var(--ifm-font-color-base); font-size: 0.95rem; font-weight: 900; letter-spacing: -0.02em; display: block; text-decoration: none; } +.picker-link span { color: #64748b; font-size: 0.82rem; display: block; margin-top: 2px; line-height: 1.35; text-decoration: none; } +.nf-picker-panel--narrow .picker-link span { white-space: nowrap; } + +/* ── Navbar icon links (GitHub, Discourse) ──────────────────────────────── */ +.nf-icon-links { + display: flex; + align-items: center; + gap: 0.1rem; +} + +.nf-icon-link, +.nf-icon-link:visited { + display: flex; + align-items: center; + justify-content: center; + width: 2rem; + height: 2rem; + color: var(--ifm-navbar-link-color); + text-decoration: none; +} + +.nf-icon-link:hover { + color: var(--ifm-color-primary); + text-decoration: none; +} /* ── Mobile (<= 996 px) ─────────────────────────────────────────────────── */ @media (max-width: 996px) { diff --git a/packages/docusaurus-theme/css/theme.css b/packages/docusaurus-theme/css/theme.css index 0b06560f..276aa224 100644 --- a/packages/docusaurus-theme/css/theme.css +++ b/packages/docusaurus-theme/css/theme.css @@ -1,20 +1,51 @@ -/** - * NetFoundry Docusaurus Theme - Combined Styles - * - * This file is automatically loaded by the theme via getClientModules(). - * - * Consuming projects no longer need to manually add these imports - * to their custom.css files. - */ - -/* CSS variables for light mode */ -@import "./vars.css"; - -/* CSS variables for dark mode */ -@import "./vars-dark.css"; - -/* Layout styles */ -@import "./layout.css"; - -/* Legacy design system variables and comprehensive styling */ -@import "./legacy.css"; +/** + * NetFoundry Docusaurus Theme - Combined Styles + * + * This file is automatically loaded by the theme via getClientModules(). + * + * Consuming projects no longer need to manually add these imports + * to their custom.css files. + */ + +/* CSS variables for light mode */ +@import "./vars.css"; + +/* CSS variables for dark mode */ +@import "./vars-dark.css"; + +/* Layout styles */ +@import "./layout.css"; + +/* Legacy design system variables and comprehensive styling */ +@import "./legacy.css"; + +/* ── Footer social link hover ───────────────────────────────────────────── */ +footer a[class*="footerSocialLink"] { + transition: all 0.2s ease; +} + +[data-theme='dark'] footer a[class*="footerSocialLink"] { + background-color: #1a2640; + color: #64748b; + border: 1px solid rgba(148, 163, 184, 0.1); +} +[data-theme='dark'] footer a[class*="footerSocialLink"]:hover { + background-color: #22d3ee; + color: #020617; + border-color: transparent; + transform: translateY(-3px); + box-shadow: 0 6px 16px rgba(34, 211, 238, 0.35); +} + +[data-theme='light'] footer a[class*="footerSocialLink"] { + background-color: #e2e8f0; + color: #475569; + border: 1px solid rgba(0, 0, 0, 0.06); +} +[data-theme='light'] footer a[class*="footerSocialLink"]:hover { + background-color: #0891b2; + color: #ffffff; + border-color: transparent; + transform: translateY(-3px); + box-shadow: 0 6px 16px rgba(8, 145, 178, 0.3); +} diff --git a/packages/docusaurus-theme/package.json b/packages/docusaurus-theme/package.json index 2b111562..d47fea7f 100644 --- a/packages/docusaurus-theme/package.json +++ b/packages/docusaurus-theme/package.json @@ -51,6 +51,7 @@ "react-dom": "^18 || ^19" }, "dependencies": { + "@docsearch/css": "^3", "@docsearch/react": "^3", "algoliasearch": "^5", "clsx": "^2.0.0", diff --git a/packages/docusaurus-theme/src/components/HeroBackground.module.css b/packages/docusaurus-theme/src/components/HeroBackground.module.css new file mode 100644 index 00000000..f8d65b80 --- /dev/null +++ b/packages/docusaurus-theme/src/components/HeroBackground.module.css @@ -0,0 +1,39 @@ +.bg { + position: absolute; + inset: 0; + background-color: #020617; + background-image: + repeating-linear-gradient(0deg, transparent, transparent 59px, rgba(34, 211, 238, 0.04) 59px, rgba(34, 211, 238, 0.04) 60px), + repeating-linear-gradient(90deg, transparent, transparent 59px, rgba(34, 211, 238, 0.04) 59px, rgba(34, 211, 238, 0.04) 60px); + overflow: hidden; +} + +.orb { + position: absolute; + border-radius: 50%; + filter: blur(80px); +} + +.orb1 { + width: 55%; + height: 75%; + background: radial-gradient(circle, rgba(34, 211, 238, 0.35) 0%, transparent 70%); + top: -15%; + left: -10%; +} + +.orb2 { + width: 45%; + height: 65%; + background: radial-gradient(circle, rgba(0, 104, 249, 0.28) 0%, transparent 70%); + top: 20%; + right: -10%; +} + +.orb3 { + width: 40%; + height: 55%; + background: radial-gradient(circle, rgba(34, 197, 94, 0.18) 0%, transparent 70%); + bottom: -15%; + left: 25%; +} diff --git a/packages/docusaurus-theme/src/components/HeroBackground.tsx b/packages/docusaurus-theme/src/components/HeroBackground.tsx new file mode 100644 index 00000000..40b7361b --- /dev/null +++ b/packages/docusaurus-theme/src/components/HeroBackground.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import styles from './HeroBackground.module.css'; + +export default function HeroBackground(): React.ReactElement { + return ( +