diff --git a/packages/theme/src/client/clientAppEnhance.ts b/packages/theme/src/client/clientAppEnhance.ts index 91d5b79c..f0411a9a 100644 --- a/packages/theme/src/client/clientAppEnhance.ts +++ b/packages/theme/src/client/clientAppEnhance.ts @@ -1,10 +1,13 @@ import { defineClientAppEnhance } from '@vuepress/client' import { h } from 'vue' +import Badge from './components/global/Badge.vue' import { useScrollPromise } from './composables' import './styles/index.scss' export default defineClientAppEnhance(({ app, router }) => { + app.component('Badge', Badge) + app.component('NavbarSearch', () => { const SearchComponent = app.component('Docsearch') || app.component('SearchBox') diff --git a/packages/theme/src/client/components/global/Badge.vue b/packages/theme/src/client/components/global/Badge.vue new file mode 100644 index 00000000..8266c5d3 --- /dev/null +++ b/packages/theme/src/client/components/global/Badge.vue @@ -0,0 +1,57 @@ + + + diff --git a/packages/theme/src/client/styles/normalize.scss b/packages/theme/src/client/styles/normalize.scss index 5ef64d8a..f0209e67 100644 --- a/packages/theme/src/client/styles/normalize.scss +++ b/packages/theme/src/client/styles/normalize.scss @@ -12,6 +12,10 @@ body { box-sizing: border-box; } +:root { + scroll-behavior: smooth; +} + html.dark { color-scheme: dark; } diff --git a/packages/theme/src/client/styles/vars-dark.scss b/packages/theme/src/client/styles/vars-dark.scss index 5cf24630..e23fbcf4 100644 --- a/packages/theme/src/client/styles/vars-dark.scss +++ b/packages/theme/src/client/styles/vars-dark.scss @@ -28,3 +28,13 @@ html.dark { --c-hl-bg-color: #363b46; } + +html.dark .DocSearch { + --docsearch-logo-color: var(--c-text); + --docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309; + --docsearch-key-shadow: inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, + 0 2px 2px 0 rgba(3, 4, 9, 0.3); + --docsearch-key-gradient: linear-gradient(-225deg, #444950, #1c1e21); + --docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, 0.5), + 0 -4px 8px 0 rgba(0, 0, 0, 0.2); +} diff --git a/packages/theme/src/client/styles/vars.scss b/packages/theme/src/client/styles/vars.scss index e1bf052e..e42ac452 100644 --- a/packages/theme/src/client/styles/vars.scss +++ b/packages/theme/src/client/styles/vars.scss @@ -1,13 +1,12 @@ :root { - // brand color --c-brand: #0095d9; --c-brand-light: #2ca9e1; // background color - --c-bg: #F3F4F6; - --c-bg-light: #E5E7EB; - --c-bg-lighter: #D1D5DB; + --c-bg: #f3f4f6; + --c-bg-light: #e5e7eb; + --c-bg-lighter: #d1d5db; --c-bg-container: #fff; --c-bg-navbar: var(--c-bg-container); --c-bg-sidebar: var(--c-bg-container); @@ -26,7 +25,7 @@ --c-border-dark: #dfe2e5; // container color - --c-tip: #60A5FA; + --c-tip: #60a5fa; --c-tip-bg: var(--c-bg-light); --c-tip-title: var(--c-text); --c-tip-text: var(--c-text); @@ -43,17 +42,26 @@ --c-danger-text-accent: var(--c-text); --c-detail-bg: #eee; + // badge component colors + --c-badge-tip: var(--c-tip); + --c-badge-warning: var(--c-warning); + --c-badge-danger: var(--c-danger); + // transition --t-color: 0.3s ease; --t-transform: 0.3s ease; // box-shadow --shadow-sm: 0 0 #0000, 0 0 #0000, 0 1px 2px 0 rgba(0, 0, 0, 0.05); - --shadow: 0 0 #0000, 0 0 #0000, 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - --shadow-md: 0 0 #0000, 0 0 #0000, 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - --shadow-lg: 0 0 #0000, 0 0 #0000, 0 6px 8px -1px rgba(0, 0, 0, 0.1), 0 3px 6px -1px rgba(0, 0, 0, 0.06); + --shadow: 0 0 #0000, 0 0 #0000, 0 1px 3px 0 rgba(0, 0, 0, 0.1), + 0 1px 2px 0 rgba(0, 0, 0, 0.06); + --shadow-md: 0 0 #0000, 0 0 #0000, 0 4px 6px -1px rgba(0, 0, 0, 0.1), + 0 2px 4px -1px rgba(0, 0, 0, 0.06); + --shadow-lg: 0 0 #0000, 0 0 #0000, 0 6px 8px -1px rgba(0, 0, 0, 0.1), + 0 3px 6px -1px rgba(0, 0, 0, 0.06); - --shadow-footer: 0 -1px 3px 0px rgba(0, 0, 0, 0.1), 0 0 #0000, 0 0 #0000, 0 -1px 2px 0px rgba(0, 0, 0, 0.06); + --shadow-footer: 0 -1px 3px 0px rgba(0, 0, 0, 0.1), 0 0 #0000, 0 0 #0000, + 0 -1px 2px 0px rgba(0, 0, 0, 0.06); // border-radius --p-around: 4px; @@ -64,7 +72,6 @@ --code-ln-color: #9e9e9e; --code-ln-wrapper-width: 3.5rem; - // font vars --font-family: -apple-system, BlinkMackSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; @@ -88,9 +95,29 @@ --search-input-width: 8rem; --search-result-width: 20rem; +} +.DocSearch { + --docsearch-primary-color: var(--c-brand); + --docsearch-text-color: var(--c-text); + --docsearch-highlight-color: var(--c-brand); + --docsearch-muted-color: var(--c-text-quote); + --docsearch-container-background: rgba(9, 10, 17, 0.8); + --docsearch-modal-background: var(--c-bg-light); + --docsearch-searchbox-background: var(--c-bg-lighter); + --docsearch-searchbox-focus-background: var(--c-bg); + --docsearch-searchbox-shadow: var(--shadow); + --docsearch-hit-color: var(--c-text-light); + --docsearch-hit-active-color: var(--c-bg); + --docsearch-hit-background: var(--c-bg); + --docsearch-hit-shadow: 0 1px 3px 0 var(--c-border-dark); + --docsearch-footer-background: var(--c-bg); } .external-link-icon { --external-link-icon-color: var(--c-text-quote); } + +.medium-zoom-overlay { + --medium-zoom-bg-color: var(--c-bg); +} diff --git a/packages/theme/src/client/utils/dom.ts b/packages/theme/src/client/utils/dom.ts index df97a0d4..a1ec2d7c 100644 --- a/packages/theme/src/client/utils/dom.ts +++ b/packages/theme/src/client/utils/dom.ts @@ -46,15 +46,19 @@ export function scrollTo( top: number, time = 300 ): void { - const currentTop = getScrollTop(target) - const step = Math.ceil(time / 16) - let currentStep = 0 - const change = top - currentTop - const timer = setInterval(() => { - currentStep++ - if (currentStep >= step) { - timer && clearInterval(timer) - } - setScrollTop(target, tween(currentStep, currentTop, change, step)) - }, 1000 / 60) + if (target !== document) { + const currentTop = getScrollTop(target) + const step = Math.ceil(time / 16) + let currentStep = 0 + const change = top - currentTop + const timer = setInterval(() => { + currentStep++ + if (currentStep >= step) { + timer && clearInterval(timer) + } + setScrollTop(target, tween(currentStep, currentTop, change, step)) + }, 1000 / 60) + } else { + window.scrollTo({ top, behavior: 'smooth' }) + } }