From aa2289e4882c9204c891b44e90c51e704aa728a8 Mon Sep 17 00:00:00 2001 From: Kia King Ishii Date: Sat, 28 May 2022 17:39:57 +0900 Subject: [PATCH] feat: add mini sponsor component (#648) close #648 --- docs/guide/theme-introduction.md | 9 ++- src/client/theme-default/Layout.vue | 7 +++ src/client/theme-default/components/VPBox.vue | 2 +- .../theme-default/components/VPCarbonAds.vue | 4 +- .../theme-default/components/VPContent.vue | 9 ++- src/client/theme-default/components/VPDoc.vue | 13 ++++- .../theme-default/components/VPDocAside.vue | 14 +++++ .../components/VPDocAsideSponsors.vue | 32 ++++++++++ .../theme-default/components/VPMenuLink.vue | 4 ++ .../theme-default/components/VPSponsors.vue | 49 ++++------------ .../components/VPSponsorsGrid.vue | 2 +- .../theme-default/composables/sponsor-grid.ts | 12 ++-- src/client/theme-default/index.ts | 1 + .../styles/components/vp-sponsor.css | 58 ++++++++++++++++--- theme.d.ts | 1 + 15 files changed, 159 insertions(+), 58 deletions(-) create mode 100644 src/client/theme-default/components/VPDocAsideSponsors.vue diff --git a/docs/guide/theme-introduction.md b/docs/guide/theme-introduction.md index 183f9e4b..14ade411 100644 --- a/docs/guide/theme-introduction.md +++ b/docs/guide/theme-introduction.md @@ -172,7 +172,14 @@ export default { Full list of slots available in the default theme layout: -- Only when `layout: 'home'` is enabled via frontmatter: +- When `layout: 'doc'` (default) is enabled via frontmatter: + - `aside-top` + - `aside-bottom` + - `aside-outline-before` + - `aside-outline-after` + - `aside-ads-before` + - `aside-ads-after` +- When `layout: 'home'` is enabled via frontmatter: - `home-hero-before` - `home-hero-after` - `home-features-before` diff --git a/src/client/theme-default/Layout.vue b/src/client/theme-default/Layout.vue index 321b3b88..77fe1c5d 100644 --- a/src/client/theme-default/Layout.vue +++ b/src/client/theme-default/Layout.vue @@ -33,6 +33,13 @@ provide('close-sidebar', closeSidebar) + + + + + + + diff --git a/src/client/theme-default/components/VPBox.vue b/src/client/theme-default/components/VPBox.vue index 71d76c2f..f0096371 100644 --- a/src/client/theme-default/components/VPBox.vue +++ b/src/client/theme-default/components/VPBox.vue @@ -36,7 +36,7 @@ defineProps<{ } .dark .icon { - background-color: var(--vp-c-bg-soft); + background-color: var(--vp-c-bg); } .title { diff --git a/src/client/theme-default/components/VPCarbonAds.vue b/src/client/theme-default/components/VPCarbonAds.vue index c43d5ef7..aa4d0c83 100644 --- a/src/client/theme-default/components/VPCarbonAds.vue +++ b/src/client/theme-default/components/VPCarbonAds.vue @@ -47,13 +47,13 @@ if (carbonOptions) { justify-content: center; align-items: center; padding: 24px; - border-radius: 8px; + border-radius: 12px; min-height: 240px; text-align: center; line-height: 18px; font-size: 12px; font-weight: 500; - background-color: var(--vp-c-bg-alt); + background-color: var(--vp-c-bg-soft); transition: color 0.5s, background-color 0.5s; } diff --git a/src/client/theme-default/components/VPContent.vue b/src/client/theme-default/components/VPContent.vue index 59ac91ea..b93a0df5 100644 --- a/src/client/theme-default/components/VPContent.vue +++ b/src/client/theme-default/components/VPContent.vue @@ -34,7 +34,14 @@ useCopyCode() - + + + + + + + + diff --git a/src/client/theme-default/components/VPDoc.vue b/src/client/theme-default/components/VPDoc.vue index 89c9cd7e..1f3287dc 100644 --- a/src/client/theme-default/components/VPDoc.vue +++ b/src/client/theme-default/components/VPDoc.vue @@ -20,7 +20,14 @@ const pageName = computed(() => {
- + + + + + + + +
@@ -126,8 +133,8 @@ const pageName = computed(() => { bottom: 0; z-index: 10; width: 224px; - height: 64px; - background: linear-gradient(transparent, var(--vp-c-bg) 80%); + height: 88px; + background: linear-gradient(transparent, var(--vp-c-bg) 70%); } .aside-content { diff --git a/src/client/theme-default/components/VPDocAside.vue b/src/client/theme-default/components/VPDocAside.vue index 7bb88da4..876fdef6 100644 --- a/src/client/theme-default/components/VPDocAside.vue +++ b/src/client/theme-default/components/VPDocAside.vue @@ -8,13 +8,27 @@ const { page, theme } = useData() diff --git a/src/client/theme-default/components/VPDocAsideSponsors.vue b/src/client/theme-default/components/VPDocAsideSponsors.vue new file mode 100644 index 00000000..a42f7da5 --- /dev/null +++ b/src/client/theme-default/components/VPDocAsideSponsors.vue @@ -0,0 +1,32 @@ + + + diff --git a/src/client/theme-default/components/VPMenuLink.vue b/src/client/theme-default/components/VPMenuLink.vue index 15fbdc9c..089cb6df 100644 --- a/src/client/theme-default/components/VPMenuLink.vue +++ b/src/client/theme-default/components/VPMenuLink.vue @@ -27,6 +27,10 @@ defineProps<{ .VPMenuLink:hover { color: var(--vp-c-brand); + background-color: var(--vp-c-bg-mute); +} + +.dark .VPMenuLink:hover { background-color: var(--vp-c-bg-soft); } diff --git a/src/client/theme-default/components/VPSponsors.vue b/src/client/theme-default/components/VPSponsors.vue index 8c52bf24..299723cf 100644 --- a/src/client/theme-default/components/VPSponsors.vue +++ b/src/client/theme-default/components/VPSponsors.vue @@ -15,13 +15,16 @@ export interface Sponsor { } const props = defineProps<{ + mode?: 'normal' | 'aside' tier?: string - size?: 'small' | 'medium' | 'big' + size?: 'xmini' | 'small' | 'medium' | 'big' data: Sponsors[] | Sponsor[] }>() const sponsors = computed(() => { - const isSponsors = props.data.some((s: any) => s.items) + const isSponsors = props.data.some((s) => { + return !!(s as Sponsors).items + }) if (isSponsors) { return props.data @@ -36,42 +39,14 @@ const sponsors = computed(() => { - - diff --git a/src/client/theme-default/components/VPSponsorsGrid.vue b/src/client/theme-default/components/VPSponsorsGrid.vue index c4ecd722..e67ab6e8 100644 --- a/src/client/theme-default/components/VPSponsorsGrid.vue +++ b/src/client/theme-default/components/VPSponsorsGrid.vue @@ -9,7 +9,7 @@ export interface Sponsor { } const props = defineProps<{ - size?: 'small' | 'medium' | 'big' + size?: 'xmini' | 'mini' | 'small' | 'medium' | 'big' data: Sponsor[] }>() diff --git a/src/client/theme-default/composables/sponsor-grid.ts b/src/client/theme-default/composables/sponsor-grid.ts index 619a02a2..5113a079 100644 --- a/src/client/theme-default/composables/sponsor-grid.ts +++ b/src/client/theme-default/composables/sponsor-grid.ts @@ -5,7 +5,7 @@ export interface GridSetting { [size: string]: [number, number][] } -export type GridSize = 'small' | 'medium' | 'big' +export type GridSize = 'xmini' | 'mini' | 'small' | 'medium' | 'big' export interface UseSponsorsGridOprions { el: Ref @@ -17,14 +17,16 @@ export interface UseSponsorsGridOprions { * * [Screen widh, Column size] * - * It sets grid size on matching screen size. For example, `[768, 5]` will set - * 5 columns when screen size is bigger or equal to 768px. + * It sets grid size on matching screen size. For example, `[768, 5]` will + * set 5 columns when screen size is bigger or equal to 768px. * * Column will set only when item size is bigger than the column size. For - * example, even we want 5 columns, if we only have 1 sponsor yet, we would - * like to show it in 1 column. + * example, even we define 5 columns, if we only have 1 sponsor yet, we would + * like to show it in 1 column to make it stand out. */ const GridSettings: GridSetting = { + xmini: [[0, 2]], + mini: [], small: [ [920, 6], [768, 5], diff --git a/src/client/theme-default/index.ts b/src/client/theme-default/index.ts index 712f89bb..66f2708c 100644 --- a/src/client/theme-default/index.ts +++ b/src/client/theme-default/index.ts @@ -15,6 +15,7 @@ export { DefaultTheme } from './config' export { default as VPHomeHero } from './components/VPHomeHero.vue' export { default as VPHomeFeatures } from './components/VPHomeFeatures.vue' export { default as VPHomeSponsors } from './components/VPHomeSponsors.vue' +export { default as VPDocAsideSponsors } from './components/VPDocAsideSponsors.vue' const theme: Theme = { Layout, diff --git a/src/client/theme-default/styles/components/vp-sponsor.css b/src/client/theme-default/styles/components/vp-sponsor.css index 877e0216..09fb6cb1 100644 --- a/src/client/theme-default/styles/components/vp-sponsor.css +++ b/src/client/theme-default/styles/components/vp-sponsor.css @@ -1,9 +1,57 @@ +/** + * VPSponsors styles are defined as global because a new class gets + * allied in onMounted` hook and we can't use socped style. + */ +.vp-sponsor { + border-radius: 16px; + overflow: hidden; +} + +.vp-sponsor.aside { + border-radius: 12px; +} + +.vp-sponsor-section + .vp-sponsor-section { + margin-top: 4px; +} + +.vp-sponsor-tier { + margin-bottom: 4px; + text-align: center; + letter-spacing: 1px; + line-height: 24px; + width: 100%; + font-weight: 600; + color: var(--vp-c-text-2); + background-color: var(--vp-c-bg-soft); +} + +.vp-sponsor.normal .vp-sponsor-tier { + padding: 13px 0 11px; + font-size: 14px; +} + +.vp-sponsor.aside .vp-sponsor-tier { + padding: 9px 0 7px; + font-size: 12px; +} + +.vp-sponsor-grid + .vp-sponsor-tier { + margin-top: 4px; +} + .vp-sponsor-grid { display: flex; flex-wrap: wrap; gap: 4px; } +.vp-sponsor-grid.xmini .vp-sponsor-grid-link { height: 64px; } +.vp-sponsor-grid.xmini .vp-sponsor-grid-image { max-width: 64px; max-height: 22px } + +.vp-sponsor-grid.mini .vp-sponsor-grid-link { height: 72px; } +.vp-sponsor-grid.mini .vp-sponsor-grid-image { max-width: 96px; max-height: 24px } + .vp-sponsor-grid.small .vp-sponsor-grid-link { height: 96px; } .vp-sponsor-grid.small .vp-sponsor-grid-image { max-width: 96px; max-height: 24px } @@ -36,12 +84,12 @@ .vp-sponsor-grid-item { flex-shrink: 0; width: 100%; - background-color: var(--vp-c-white-soft); + background-color: var(--vp-c-bg-soft); transition: background-color 0.25s; } .vp-sponsor-grid-item:hover { - background-color: var(--vp-c-white-mute); + background-color: var(--vp-c-bg-mute); } .vp-sponsor-grid-item:hover .vp-sponsor-grid-image { @@ -49,11 +97,7 @@ } .vp-sponsor-grid-item.empty:hover { - background-color: var(--vp-c-white-soft); -} - -.dark .vp-sponsor-grid-item { - background-color: var(--vp-c-black-mute); + background-color: var(--vp-c-bg-soft); } .dark .vp-sponsor-grid-item:hover { diff --git a/theme.d.ts b/theme.d.ts index 8c2f95a5..f53cbc93 100644 --- a/theme.d.ts +++ b/theme.d.ts @@ -4,6 +4,7 @@ import { ComponentOptions } from 'vue' export const VPHomeHero = ComponentOptions export const VPHomeFeatures = ComponentOptions export const VPHomeSponsors = ComponentOptions +export const VPDocAsideSponsors = ComponentOptions declare const theme: { Layout: ComponentOptions