From ef39af97e986ad3d50ff00b803031067ddaf35b2 Mon Sep 17 00:00:00 2001 From: zzq0826 <12936800+zzq0826@users.noreply.github.com> Date: Thu, 24 Sep 2026 14:49:54 +0800 Subject: [PATCH] feat: restyle the docs in scroll.io's landing page brand Bring the docs in line with the new scroll.io landing page (frontends design/landing.html) and the blog built on it: - tokens: src/styles/brand.css holds the landing page's warm ink ramp, hairlines and single violet accent, with dark-mode values for the docs' theme toggle; Tailwind and the old design-system/theme variables now point at it - type: Instrument Serif for display and h1/h2, Inter for text, JetBrains Mono for code and small labels (replaces TransSans/Roboto/circular) - logo and favicons: the new Scroll mark with a "Docs" pill; favicon from frontends, PNG icons rendered from the mark - components: header, sidebars, table of contents, callouts, tables, code blocks (light/dark Expressive Code themes), tabs, toggles, buttons, footer, newsletter band, home page, 404 and the Ask AI control - fix unreadable RPC table text and hard-coded icon colours in dark mode - drop the footer's Join Us and Brand Kit links (both 404 on scroll.io) --- astro.config.ts | 26 ++- .../assets/icons/apple-touch-icon-256x256.png | Bin 9708 -> 5590 bytes public/assets/icons/favicon-32x32.png | Bin 5561 -> 717 bytes public/assets/icons/favicon.ico | Bin 15406 -> 4830 bytes public/favicon.ico | Bin 15406 -> 4830 bytes public/locales/en/translation.json | 2 - public/locales/es/translation.json | 2 - public/locales/tr/translation.json | 2 - public/locales/zh/translation.json | 2 - src/assets/svgs/home/Note.svg | 10 +- src/assets/svgs/home/home-sdk.svg | 2 +- src/assets/svgs/main/next.svg | 2 +- src/assets/svgs/scroll-mark.svg | 7 + src/components/Aside.astro | 69 ++++--- .../Footer/PureFooter/PureFooter.module.css | 171 +++++++++------- .../Footer/PureFooter/PureFooter.tsx | 79 +++---- .../Footer/Subscribe/EmailInput.module.css | 51 +++-- .../Footer/Subscribe/EmailInput.tsx | 16 +- .../Footer/Subscribe/Subscribe.module.css | 66 +++--- src/components/Footer/Subscribe/Subscribe.tsx | 4 +- src/components/Footer/helper.tsx | 17 +- src/components/HeadCommon.astro | 25 ++- src/components/Header/Header.astro | 165 ++++++++------- .../LanguageSelector/LanguageSelector.astro | 80 +++++--- src/components/Header/ScrollBrand.astro | 77 +++++++ .../Header/Search/Search.module.css | 53 +++-- src/components/Header/Search/Search.tsx | 13 +- .../Header/Search/SearchInput.module.css | 16 +- src/components/Header/Search/SearchInput.tsx | 11 +- src/components/Header/Search/SearchModal.tsx | 16 +- .../Header/SidebarToggle.module.css | 4 - src/components/Header/SidebarToggle.tsx | 5 +- src/components/Header/ThemeModeToggle.tsx | 10 +- src/components/HomeSearch/index.module.css | 49 +++-- src/components/HomeSearch/index.tsx | 17 +- src/components/LeftSidebar/LeftSidebar.astro | 56 ++--- src/components/NavCard.astro | 104 ++++++---- src/components/PageContent/AskAI.astro | 39 ++-- src/components/PageContent/Feedback.tsx | 21 +- src/components/PageContent/PageContent.astro | 14 -- src/components/PageContent/WhatsNext.astro | 10 +- src/components/RPCTable/RPCTable.css | 31 +++ .../RightSidebar/RightSidebar.astro | 10 +- src/components/SectionHeader/index.astro | 27 +-- src/components/Tabs/Tabs.module.css | 16 +- src/components/Tabs/Tabs.tsx | 8 +- src/components/Tabs/TabsContent.tsx | 5 +- src/components/ToggleElement.astro | 12 +- src/layouts/HomeLayout.astro | 7 +- src/layouts/MainLayout.astro | 12 +- src/pages/404.astro | 9 +- src/pages/en/home/ConnectUs.astro | 95 +++++---- src/pages/en/home/Navigate.astro | 15 +- src/pages/en/home/index.astro | 48 +++-- src/pages/es/home/ConnectUs.astro | 95 +++++---- src/pages/es/home/Navigate.astro | 15 +- src/pages/es/home/index.astro | 48 +++-- src/pages/tr/home/ConnectUs.astro | 95 +++++---- src/pages/tr/home/Navigate.astro | 15 +- src/pages/tr/home/index.astro | 48 +++-- src/pages/zh/home/ConnectUs.astro | 95 +++++---- src/pages/zh/home/Navigate.astro | 15 +- src/pages/zh/home/index.astro | 48 +++-- src/styles/brand.css | 110 ++++++++++ src/styles/design-system/button.module.css | 59 ++++-- .../design-system/components/typography.css | 42 ++-- src/styles/design-system/fonts.css | 65 ------ src/styles/design-system/global-styles.css | 1 - .../design-system/tokens/background.css | 16 +- src/styles/design-system/tokens/border.css | 20 +- .../design-system/tokens/typography.css | 31 +-- src/styles/design-system/values/font.css | 8 +- src/styles/index.css | 192 +++++++++++------- src/styles/migrated.css | 62 +++--- src/styles/theme.css | 40 ++-- tailwind.config.cjs | 84 +++++--- 76 files changed, 1714 insertions(+), 1098 deletions(-) create mode 100644 src/assets/svgs/scroll-mark.svg create mode 100644 src/components/Header/ScrollBrand.astro create mode 100644 src/styles/brand.css delete mode 100644 src/styles/design-system/fonts.css diff --git a/astro.config.ts b/astro.config.ts index fcf2a3ae2..a93fee6e9 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -41,17 +41,35 @@ export default defineConfig({ astroCallouts(), solidityRemixCode(), expressiveCode({ - themes: ["dark-plus"], + // the blog's code panel (frontends blog.module.css) in light mode, a warm near-black in + // dark mode; the site switches themes with the `dark` class on , not the media query + themes: ["github-light", "github-dark"], + useDarkModeMediaQuery: false, + themeCssSelector: (theme) => (theme.type === "dark" ? ".dark" : false), defaultProps: { frame: "code", }, styleOverrides: { - borderRadius: "27px", - borderColor: "transparent", + borderRadius: "12px", + borderWidth: "1px", + borderColor: ({ theme }) => (theme.type === "dark" ? "#211F1D" : "#EFEBE6"), + codeBackground: ({ theme }) => (theme.type === "dark" ? "#141312" : "#FAF9F8"), + codeFontFamily: '"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace', + codeFontSize: "13.5px", + codeLineHeight: "1.65", + uiFontFamily: '"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif', frames: { shadowColor: "transparent", editorTabBorderRadius: "0.5rem", - editorBackground: "#2b2b2b", + editorBackground: ({ theme }) => (theme.type === "dark" ? "#141312" : "#FAF9F8"), + editorTabBarBackground: ({ theme }) => (theme.type === "dark" ? "#1B1A18" : "#F4F2F0"), + editorActiveTabBackground: ({ theme }) => (theme.type === "dark" ? "#141312" : "#FAF9F8"), + editorActiveTabIndicatorTopColor: "transparent", + editorActiveTabIndicatorBottomColor: "transparent", + editorTabBarBorderBottomColor: ({ theme }) => (theme.type === "dark" ? "#211F1D" : "#EFEBE6"), + terminalBackground: ({ theme }) => (theme.type === "dark" ? "#141312" : "#FAF9F8"), + terminalTitlebarBackground: ({ theme }) => (theme.type === "dark" ? "#1B1A18" : "#F4F2F0"), + terminalTitlebarBorderBottomColor: ({ theme }) => (theme.type === "dark" ? "#211F1D" : "#EFEBE6"), }, }, }), diff --git a/public/assets/icons/apple-touch-icon-256x256.png b/public/assets/icons/apple-touch-icon-256x256.png index 5d2d96b1af34abe4ca8228818a1c91641737f29f..d66a95153c62606fdf81999dfdc70d08d40aa371 100644 GIT binary patch literal 5590 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 literal 9708 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 diff --git a/public/assets/icons/favicon-32x32.png b/public/assets/icons/favicon-32x32.png index b6291d9949f206ad1dbef1e5c7de3ea6841c1185..d3aa36e67fe5b4e9a2d3ecc2019f9b0ffdfd8bf6 100644 GIT binary patch literal 717 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

UM<4H?)6Q$8Bb zOI~xVSHX$S*bNZ5K~DcQdU3Cf{d#?&QckI;<_^6<4zMR5Gzt>mF}GUVn1AER8KD?(8KYq%d+X^#M}T znb-F`8o3Fi#`_H#i@)v!Umn`|+0XD*?lqEZMsH4<|;jy1-|y`J%f zm;vW+Jz$Lyi72f%Tnb{UywaQ#Y*|K1N)`fbJ-nN*5bJT3Rg7FRAN z<{*{jSev((d+wDhSG2w(1zS+|_H<8Ti@9+-5l7;L-w&=}MBV_No} zO~cJQ$&4`+MM14n&9CXXV5ZW@3RgHgIkHZIrayd)*`dpXkObiAh;QD)6|8Y?uFmMu znthSglF2MkV%esBta1K+KAF4r9;|W4qF|<4u_Cgped|EhQ6KE{f!o=F-ExaVXPsL4Ql`4I6*THP_@9Vau^$YoyV% z+0-?k-a$`&b3G?Dm9q7@*wWqWuEv20AC-EyzNnY)-%NjYO3XH z)}ML3LtEw-_P=N}8q8hrgHc9=iOKiz&Y%gbqrGQL8}lA)r5b4>BGb+_p-k!lrGz5cK{S zB;8}3PLF+1uR@@smR7mC4jcS^k`Y$Fi6-7~W?>D=oUA}g!iLPa(QVD{(c0%8` z-o$I|Uqv&ords0)3X2eb{WgxBx`4g0$8^qSOi>ipg-t}y)(v!(Xm)5c8r;t+!?~Lo zh>5#~_#1b0DleDGG~Hfn-*e~Qm=j#$O=2nlm^g7_{mU26-%opxVbER@nN*6VO&Y?+ z=4o$ISy_qfoP1>G<{9)YCKij(q~ZTB$JM!V;vUK18XaOt1PSVljfcyf%49bj&)gWlUx&0GRpd*ubN47vmpfJdv491ffR6 zA`ybRclu`MpD_z{DQ8ks0YJ$3kpc17Ze2>gpT@j*l^`fqa+#)Er}k5H>7kxsa#I1o z;K98e^0SrauUxyyoX~(E2u&I_Pz3n1_?x_kd$8#Fwb!E8)Z26iwR#K&e6@)u=T(e~(F|Vy!))TBW8-%gS}` zC25+X#Uhc`lS+y*rC6m>>8z2aDVnBU&PJwzhAJslNVJu)wvv}gC6aQvT$X2LWpzhH z(-*Ja{3kLgDaoi=Ml8-$1oNl%ZV)1v3}Pw*?+{ZFc<28BfQ$Lu!`kav00000NkvXX Hu0mjfPR-!n diff --git a/public/assets/icons/favicon.ico b/public/assets/icons/favicon.ico index 756e7314f736484638d6bd5ed7ef1a57bb065fc3..b0b1bd84407bb44a001cf2813ef66895d6215265 100644 GIT binary patch literal 4830 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 literal 15406 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 diff --git a/public/favicon.ico b/public/favicon.ico index 756e7314f736484638d6bd5ed7ef1a57bb065fc3..b0b1bd84407bb44a001cf2813ef66895d6215265 100644 GIT binary patch literal 4830 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 literal 15406 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 diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 101d0d08a..90fa57f12 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -166,7 +166,6 @@ "aboutScroll": { "title": "About Scroll", "bugBounty": "Bug Bounty", - "joinUs": "Join Us", "healthStatus": "Health Status", "privacyPolicy": "Privacy Policy", "termsAndConditions": "Terms and Conditions" @@ -176,7 +175,6 @@ "scrollDocsURL": "https://docs.scroll.io/", "blog": "Blog", "documentation": "Documentation", - "brandKit": "Brand Kit", "audits": "Audits" }, "followUs": { diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 6c9eef1a6..9a692d4aa 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -169,7 +169,6 @@ "aboutScroll": { "title": "Acerca de Scroll", "bugBounty": "Cazarecompensas de bugs", - "joinUs": "Únete a nosotros", "healthStatus": "Estado de servicios", "privacyPolicy": "Políticas de privacidad", "termsAndConditions": "Terminos y condiciones" @@ -179,7 +178,6 @@ "scrollDocsURL": "https://docs.scroll.io/es", "blog": "Blog", "documentation": "Documentación", - "brandKit": "Kit de Marca", "audits": "Auditorías" }, "followUs": { diff --git a/public/locales/tr/translation.json b/public/locales/tr/translation.json index fe090af2a..1ac0c25b8 100644 --- a/public/locales/tr/translation.json +++ b/public/locales/tr/translation.json @@ -167,7 +167,6 @@ "aboutScroll": { "title": "Scroll Hakkında", "bugBounty": "Hata Ödül Programı", - "joinUs": "Bize Katılın", "healthStatus": "Sağlık Durumu", "privacyPolicy": "Gizlilik Politikası", "termsAndConditions": "Şartlar ve Koşullar" @@ -177,7 +176,6 @@ "scrollDocsURL": "https://docs.scroll.io/", "blog": "Blog", "documentation": "Dokümantasyon", - "brandKit": "Marka Kiti", "audits": "Denetimler" }, "followUs": { diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json index afe3970de..b2a55f146 100644 --- a/public/locales/zh/translation.json +++ b/public/locales/zh/translation.json @@ -166,7 +166,6 @@ "aboutScroll": { "title": "关于 Scroll", "bugBounty": "漏洞赏金", - "joinUs": "加入我们", "healthStatus": "健康状况", "privacyPolicy": "隐私政策", "termsAndConditions": "条款和条件" @@ -176,7 +175,6 @@ "scrollDocsURL": "https://docs.scroll.io/", "blog": "博客", "documentation": "文档", - "brandKit": "品牌工具包", "audits": "审计" }, "followUs": { diff --git a/src/assets/svgs/home/Note.svg b/src/assets/svgs/home/Note.svg index 9f6db1d02..16d9b45ef 100644 --- a/src/assets/svgs/home/Note.svg +++ b/src/assets/svgs/home/Note.svg @@ -1,10 +1,10 @@ - - - - - + + + + + diff --git a/src/assets/svgs/home/home-sdk.svg b/src/assets/svgs/home/home-sdk.svg index d63c492c7..56644c6ba 100644 --- a/src/assets/svgs/home/home-sdk.svg +++ b/src/assets/svgs/home/home-sdk.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/src/assets/svgs/main/next.svg b/src/assets/svgs/main/next.svg index 7e53e0d72..d78a9ff49 100644 --- a/src/assets/svgs/main/next.svg +++ b/src/assets/svgs/main/next.svg @@ -1,3 +1,3 @@ - + diff --git a/src/assets/svgs/scroll-mark.svg b/src/assets/svgs/scroll-mark.svg new file mode 100644 index 000000000..b6866e14a --- /dev/null +++ b/src/assets/svgs/scroll-mark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/components/Aside.astro b/src/components/Aside.astro index dbbb3891b..8549deda6 100644 --- a/src/components/Aside.astro +++ b/src/components/Aside.astro @@ -21,7 +21,7 @@ const icons = {

- +
@@ -38,45 +38,60 @@ const icons = { diff --git a/src/components/Header/LanguageSelector/LanguageSelector.astro b/src/components/Header/LanguageSelector/LanguageSelector.astro index b950f43d4..84122e94f 100644 --- a/src/components/Header/LanguageSelector/LanguageSelector.astro +++ b/src/components/Header/LanguageSelector/LanguageSelector.astro @@ -10,7 +10,6 @@ const supportedLanguages = i18next.languages const { pathname } = Astro.url const { showFlag = false, languageMapping } = Astro.props -const { dark } = Astro.props const getLabel = (language) => { const flag = showFlag ? localeEmoji(language) + " " : "" @@ -26,13 +25,7 @@ const getLabel = (language) => { ---
-
+
{ {getLabel(supportedLanguages[0])}
-
    +
      { supportedLanguages.map((supportedLanguage, idx) => { let value = localizePath(pathname, supportedLanguage) const label = getLabel(supportedLanguage) return (
    • @@ -93,30 +80,36 @@ const getLabel = (language) => { padding-top: 4px; } .current-language { - width: 100px; - border-radius: 5px; - border-width: 1px; - border-style: solid; + width: 108px; + border-radius: 999px; + border: 1px solid var(--sc-line); display: flex; height: 36px; - padding: 0 12px; + padding: 0 14px; justify-content: space-between; align-items: center; cursor: pointer; + color: var(--sc-ink-2); + transition: color 0.25s var(--sc-ease), border-color 0.25s var(--sc-ease), background-color 0.25s var(--sc-ease); + } + + .language-selector:hover .current-language { + color: var(--sc-ink); + border-color: var(--sc-ink-4); + background: var(--sc-surface-2); } .options-list { - width: 100px; + width: 140px; font-size: 14px; font-weight: 500; - letter-spacing: 0.14px; - padding: 4px 12px; - border-radius: 5px; - border-width: 1px; - border-style: solid; + padding: 6px; + border-radius: 12px; + border: 1px solid var(--sc-line); + background: var(--sc-surface); + box-shadow: 0 20px 50px -24px rgba(46, 27, 112, 0.3); overflow: hidden; cursor: pointer; - transition: height 0.3s ease; display: flex; justify-content: center; align-items: center; @@ -129,7 +122,19 @@ const getLabel = (language) => { justify-content: space-between; align-items: center; flex-direction: row; - padding: 8px 0px; + padding: 8px 10px; + border-radius: 8px; + color: var(--sc-ink-2); + transition: color 0.2s var(--sc-ease), background-color 0.2s var(--sc-ease); + } + + .options-list li:hover, + .options-list li.is-current { + color: var(--sc-ink); + } + + .options-list li:hover { + background: var(--sc-surface-2); } .options-list li svg, @@ -140,11 +145,28 @@ const getLabel = (language) => { color: inherit; } + /* phones: the globe alone, so the bar keeps room for search and the menu */ + @media (max-width: 50em) { + .current-language { + width: 36px; + padding: 0; + justify-content: center; + } + .current-language span { + display: none; + } + .options-modal { + right: 0; + } + } + .options-list li span, .current-language span { flex: 1; text-align: left; margin-left: 8px; + font-size: 13px; + line-height: 1; color: inherit; } diff --git a/src/components/Header/ScrollBrand.astro b/src/components/Header/ScrollBrand.astro new file mode 100644 index 000000000..289ad65ad --- /dev/null +++ b/src/components/Header/ScrollBrand.astro @@ -0,0 +1,77 @@ +--- +/** + * The Scroll brand as scroll.io's landing page draws it (frontends/design/landing.html): the + * scroll mark and the word, 12 apart, with "Docs" on the faint pill the landing family puts + * behind its brand word. The mark is drawn in currentColor so it follows the theme. + */ +export type Props = { + href: string + label?: string +} + +const { href, label = "Docs" } = Astro.props +--- + + + + Scroll + {label} + + + diff --git a/src/components/Header/Search/Search.module.css b/src/components/Header/Search/Search.module.css index 59cb45200..bd99b3dd4 100644 --- a/src/components/Header/Search/Search.module.css +++ b/src/components/Header/Search/Search.module.css @@ -1,5 +1,10 @@ /** Style Algolia */ +#searchModal { + background: var(--sc-surface); + color: var(--sc-ink); +} + #searchModal.mini { position: fixed; top: 65px; @@ -15,6 +20,8 @@ height: fit-content; position: absolute; border-radius: 24px; + border: 1px solid var(--sc-line); + box-shadow: var(--sc-shadow-lift); padding-top: 0; width: 100%; } @@ -38,11 +45,13 @@ cursor: pointer; align-items: center; width: 100%; - height: 35px; - border-radius: 40px; - font-style: italic; - - @apply border-divider text-black gap-2 bg-[#f6f6f6]; + height: 36px; + border-radius: 999px; + border: 1px solid var(--sc-line); + background: var(--sc-surface-2); + color: var(--sc-ink-3); + gap: 0.5rem; + transition: color 0.25s var(--sc-ease), border-color 0.25s var(--sc-ease); } .searchInputMobile { @@ -58,7 +67,8 @@ .searchInput:hover, .searchInput:focus { - @apply text-black border-light; + color: var(--sc-ink); + border-color: var(--sc-ink-4); } .searchInput::placeholder, @@ -81,7 +91,9 @@ border: 1px solid; border-radius: 0.25rem; line-height: 14px; - @apply font-mono border-lighter text-light; + @apply font-mono; + border-color: var(--sc-line); + color: var(--sc-ink-3); } .keyboardHints { @@ -99,7 +111,7 @@ height: 1px; border: 0; margin: var(--space-0x) calc(var(--space-6x) * -1); - @apply bg-blue-200; + background: var(--sc-line-2); } .noQueryFallback { @@ -116,15 +128,15 @@ .closeButtonMobile { display: block; - border: 3px solid #ffffff; + color: var(--sc-ink); + border: 3px solid var(--sc-page); padding: 0; font-size: 16px; line-height: 24px; position: relative; right: -43px; box-sizing: content-box; - - @apply bg-pure-white; + background: var(--sc-page); } .hitWrapper ol { @@ -134,7 +146,8 @@ .hit { line-height: 32px; display: block; - @apply mb-2 text-black; + @apply mb-2; + color: var(--sc-ink); } .queryResults { @@ -146,7 +159,12 @@ } .queryResults h6 { - font-size: 14px; + font-family: var(--sc-mono); + font-size: 11px; + font-weight: 500; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--sc-ink-3); @apply mt-4; } @@ -161,7 +179,7 @@ } .hitList li:hover * { - color: var(--orange-500); + color: var(--sc-violet); } .hitList li a { @@ -203,13 +221,14 @@ height: fit-content; max-height: 80vh; position: absolute; - border-radius: 17.5px; + border-radius: 18px; padding-top: 0; - @apply bg-[#f6f6f6]; + border: 1px solid var(--sc-line); + box-shadow: var(--sc-shadow-lift); } #searchModal.large { - border-radius: 27.5px; + border-radius: 28px; } .queryResults { diff --git a/src/components/Header/Search/Search.tsx b/src/components/Header/Search/Search.tsx index 76d736187..174de30e3 100644 --- a/src/components/Header/Search/Search.tsx +++ b/src/components/Header/Search/Search.tsx @@ -41,16 +41,7 @@ export default function Search() { return (
      -
      +
      void }) => { }, [debouncedValue]) return ( -
      +
      {article.title} @@ -148,14 +153,7 @@ export function SearchModal({ size = "mini", isOpen, onClose }: { size: Size; is } return ( -
      +
      diff --git a/src/components/Header/SidebarToggle.module.css b/src/components/Header/SidebarToggle.module.css index 139ca1ebd..0acec9ee2 100644 --- a/src/components/Header/SidebarToggle.module.css +++ b/src/components/Header/SidebarToggle.module.css @@ -11,7 +11,3 @@ /* width: 23px; */ padding: 12px 0 0 20px; } - -.dark { - color: #fff8f3; -} diff --git a/src/components/Header/SidebarToggle.tsx b/src/components/Header/SidebarToggle.tsx index caf2e2cb8..ba3c23000 100644 --- a/src/components/Header/SidebarToggle.tsx +++ b/src/components/Header/SidebarToggle.tsx @@ -4,7 +4,7 @@ import { useState, useEffect } from "preact/hooks" import styles from "./SidebarToggle.module.css" import { clsx } from "~/lib" -const MenuToggle: FunctionalComponent<{ dark: boolean }> = ({ dark }) => { +const MenuToggle: FunctionalComponent = () => { const [sidebarShown, setSidebarShown] = useState(false) useEffect(() => { @@ -21,7 +21,8 @@ const MenuToggle: FunctionalComponent<{ dark: boolean }> = ({ dark }) => { type="button" aria-pressed={sidebarShown ? "true" : "false"} id="menu-toggle" - className={clsx(styles.button, "text-black", dark && "text-white", "dark:text-white-800")} + aria-label={sidebarShown ? "Close menu" : "Open menu"} + className={clsx(styles.button, "text-ink")} onClick={() => setSidebarShown(!sidebarShown)} > {sidebarShown ? ( diff --git a/src/components/Header/ThemeModeToggle.tsx b/src/components/Header/ThemeModeToggle.tsx index 777d63a61..e05c95c7e 100644 --- a/src/components/Header/ThemeModeToggle.tsx +++ b/src/components/Header/ThemeModeToggle.tsx @@ -4,8 +4,7 @@ import MoonSvg from "~/assets/svgs/header/moon.svg?react" import SunSvg from "~/assets/svgs/header/sun.svg?react" import { clsx } from "~/lib" -const ThemeModeToggle = (props) => { - const { dark } = props +const ThemeModeToggle = () => { const [themeMode, setThemeMode] = useStorage(localStorage, "THEME_MODE", "light") const [isDarkMode, setIsDarkMode] = useState(false) @@ -44,13 +43,14 @@ const ThemeModeToggle = (props) => { return ( ) } diff --git a/src/components/HomeSearch/index.module.css b/src/components/HomeSearch/index.module.css index 2bc1c0bc7..f525fe3f2 100644 --- a/src/components/HomeSearch/index.module.css +++ b/src/components/HomeSearch/index.module.css @@ -1,35 +1,46 @@ .container { position: relative; - width: 684px; + width: min(100%, 640px); + text-align: left; } + +/* the landing page's field: a white pill with a hairline, the glow of its buttons on hover */ .searchInput { display: flex; + align-items: center; + justify-content: space-between; box-sizing: border-box; - padding: 8px 22px; - font-weight: 500; + padding: 0 14px 0 24px; cursor: pointer; width: 100%; - height: 55px; - border-radius: 27.5px; - font-style: italic; - background: var(--white); + height: 56px; + border-radius: 999px; + background: var(--sc-surface); + border: 1px solid var(--sc-line); + color: var(--sc-ink-3); + box-shadow: var(--sc-shadow); + transition: color 0.25s var(--sc-ease), border-color 0.25s var(--sc-ease), transform 0.45s var(--sc-ease); +} + +.searchInput:hover { + color: var(--sc-ink); + border-color: var(--sc-ink-4); + transform: translateY(-1px); } -.searchInput img { - width: 22px; +.hint { + font-family: var(--sc-mono); + font-size: 12px; + line-height: 1; + padding: 5px 8px; + border-radius: 6px; + border: 1px solid var(--sc-line); + color: var(--sc-ink-3); } @media screen and (max-width: 50em) { - .container { - width: 100%; - } .searchInput { - width: 100%; - height: 48px; - padding: 8px 20px; - border-spacing: 24px; - } - .searchInput img { - width: 20px; + height: 50px; + padding: 0 12px 0 20px; } } diff --git a/src/components/HomeSearch/index.tsx b/src/components/HomeSearch/index.tsx index 309bfd307..f186054f7 100644 --- a/src/components/HomeSearch/index.tsx +++ b/src/components/HomeSearch/index.tsx @@ -26,7 +26,22 @@ export default function Search() { return (
      - + + /
      {isOpen && }
      diff --git a/src/components/LeftSidebar/LeftSidebar.astro b/src/components/LeftSidebar/LeftSidebar.astro index a306a36c6..be05c0392 100644 --- a/src/components/LeftSidebar/LeftSidebar.astro +++ b/src/components/LeftSidebar/LeftSidebar.astro @@ -153,7 +153,8 @@ const processedSidebarSections = sidebarSections.map((section) => { .menu-separator { width: calc(100vw - 40px); - @apply border-0 border-t-[1px] border-solid border-black dark:border-white-800; + @apply border-0 border-t-[1px] border-solid; + border-color: var(--sc-line); } .sidebar-nav-groups.nav-groups > :first-child { @apply pt-[15px]; @@ -171,7 +172,7 @@ const processedSidebarSections = sidebarSections.map((section) => { } .nav-groups > li + li { - margin-top: 1.8rem; + margin-top: 2rem; } .nav-groups > :first-child { @@ -183,27 +184,35 @@ const processedSidebarSections = sidebarSections.map((section) => { @apply mb-navbar; } + /* the group labels in the mono, as the blog sets its small labels */ .nav-group-title { - font-size: 16px; - font-weight: 600; - /* padding: 0.1rem 1rem; */ - padding: 0.1rem 0; + font-family: var(--sc-mono); + font-size: 11px; + font-weight: 500; + line-height: 1.4; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--sc-ink-3); + -webkit-text-stroke: 0; + padding: 0.1rem 10px; margin-bottom: 0.6rem; } + /* the rows carry their own 10px inset (the current page's pill needs it), so the labels share it */ .nav-link a { - margin: 1px; - /* padding: 0.3rem 1rem; */ font: inherit; - color: inherit; + color: var(--sc-ink-2); text-decoration: none; display: flex; - font-size: 16px; - /* line-height:1; */ - margin-bottom: 10px; + font-size: 14.5px; + line-height: 1.45; + margin: 0 0 2px; + padding: 6px 10px; + border-radius: 8px; font-weight: 500; justify-content: space-between; align-items: center; + transition: color 0.2s var(--sc-ease), background-color 0.2s var(--sc-ease); } .nav-link a span { @@ -215,20 +224,15 @@ const processedSidebarSections = sidebarSections.map((section) => { .nav-link a:hover, .nav-link a:focus { - /* @apply bg-bg-hover; */ - /* background-color: var(--orange-100); */ - color: var(--orange-500); + color: var(--sc-ink); + background: var(--sc-surface-2); } + /* the current page: the violet's ink on its soft wash */ .nav-link a[aria-current="page"] { - font-weight: 600; - color: var(--orange-500); - /* background-color: var(--orange-100); */ - /* @apply text-accent bg-bg-accent; */ - } - - :global(:root.theme-dark) .nav-link a[aria-current="page"] { - color: hsla(var(--color-base-white), 100%, 1); + font-weight: 500; + color: var(--sc-violet-ink); + background: var(--sc-violet-soft); } .nav-link + ul { @@ -246,12 +250,12 @@ const processedSidebarSections = sidebarSections.map((section) => { .nav-link.open + ul { display: block; - border-left-width: 1px; - border-left-style: solid; + margin: 2px 0 8px 2px; + border-left: 1px solid var(--sc-line); } .nested { - @apply pl-5; + @apply pl-4; } @media (min-width: 50em) { diff --git a/src/components/NavCard.astro b/src/components/NavCard.astro index 0845b8a84..f02efb492 100644 --- a/src/components/NavCard.astro +++ b/src/components/NavCard.astro @@ -20,79 +20,109 @@ const { icon, name, content, link } = Astro.props as Props {name} {content} - + {t("ui.readMore")} - +
      diff --git a/src/components/PageContent/AskAI.astro b/src/components/PageContent/AskAI.astro index 561e2b8d2..f04274fa4 100644 --- a/src/components/PageContent/AskAI.astro +++ b/src/components/PageContent/AskAI.astro @@ -128,31 +128,34 @@ const aiServices = [ position: relative; } + /* the landing page's outline pill, as the header's tools are */ .ask-ai-btn, .copy-btn { display: flex; align-items: center; gap: 6px; - background: var(--theme-bg); - border: 1px solid var(--theme-divider); - border-radius: 6px; - padding: 6px 10px; + background: var(--sc-surface); + border: 1px solid var(--sc-line); + border-radius: 999px; + padding: 7px 14px; font-size: 0.8125rem; - color: var(--theme-text-light); + font-weight: 500; + color: var(--sc-ink-2); cursor: pointer; - transition: all 0.15s ease; + transition: color 0.25s var(--sc-ease), border-color 0.25s var(--sc-ease), background-color 0.25s var(--sc-ease); white-space: nowrap; } .ask-ai-btn:hover, .copy-btn:hover { - border-color: var(--theme-accent); - color: var(--theme-accent); + color: var(--sc-ink); + border-color: var(--sc-ink-4); + background: var(--sc-surface-2); } .copy-btn.copied { - border-color: #10b981; - color: #10b981; + border-color: var(--sc-tip-ink); + color: var(--sc-tip-ink); } .chevron { @@ -168,11 +171,11 @@ const aiServices = [ top: calc(100% + 4px); left: 0; min-width: 160px; - background: var(--theme-bg); - border: 1px solid var(--theme-divider); - border-radius: 8px; - padding: 4px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + background: var(--sc-surface); + border: 1px solid var(--sc-line); + border-radius: 12px; + padding: 6px; + box-shadow: 0 20px 50px -24px rgba(46, 27, 112, 0.3); opacity: 0; visibility: hidden; transform: translateY(-4px); @@ -192,9 +195,9 @@ const aiServices = [ gap: 8px; padding: 8px 10px; font-size: 0.8125rem; - color: var(--theme-text); + color: var(--sc-ink); text-decoration: none; - border-radius: 4px; + border-radius: 8px; transition: background 0.15s ease; } @@ -245,7 +248,7 @@ const aiServices = [ .ask-ai-btn, .copy-btn { - padding: 8px; + padding: 9px; } } diff --git a/src/components/PageContent/Feedback.tsx b/src/components/PageContent/Feedback.tsx index 7abbb47af..7491f0175 100644 --- a/src/components/PageContent/Feedback.tsx +++ b/src/components/PageContent/Feedback.tsx @@ -97,8 +97,9 @@ export const Feedback = () => { }} style={{ cursor: "pointer", - marginRight: "10px", + marginRight: "8px", fontSize: 0, + color: rating >= i + 1 ? "var(--sc-violet)" : "var(--sc-ink-3)", }} > {rating >= i + 1 ? star : starOutline} @@ -112,7 +113,7 @@ export const Feedback = () => { }} > {isSent ? ( -
      +
      We appreciate your feedback! 🤎
      ) : ( @@ -123,7 +124,7 @@ export const Feedback = () => { >