diff --git a/docs/.vitepress/components/BlogHome.vue b/docs/.vitepress/components/BlogHome.vue index 35aadf90e..9ce43a54f 100644 --- a/docs/.vitepress/components/BlogHome.vue +++ b/docs/.vitepress/components/BlogHome.vue @@ -1,10 +1,9 @@ diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index b0de0d303..c4813e140 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -8,6 +8,7 @@ import { prepareTypedocSidebar, } from './utils/menus'; import { meta, script } from './utils/head'; +// @ts-expect-error; it isn't TypeScript lib import footnote from 'markdown-it-footnote'; import { version as wxtVersion } from '../../packages/wxt/package.json'; import { version as i18nVersion } from '../../packages/i18n/package.json'; @@ -26,15 +27,14 @@ import { Feed } from 'feed'; import { writeFile } from 'node:fs/promises'; import { join } from 'node:path'; -const origin = 'https://wxt.dev'; - -const title = 'Next-gen Web Extension Framework'; -const titleSuffix = ' – WXT'; -const description = +const ORIGIN = 'https://wxt.dev'; +const TITLE = 'Next-gen Web Extension Framework'; +const TITLE_SUFFIX = ' – WXT'; +const DESCRIPTION = "WXT provides the best developer experience, making it quick, easy, and fun to develop web extensions. With built-in utilities for building, zipping, and publishing your extension, it's easy to get started."; -const ogTitle = `${title}${titleSuffix}`; -const ogUrl = origin; -const ogImage = `${origin}/social-preview.png`; +const OG_TITLE = `${TITLE}${TITLE_SUFFIX}`; +const OG_URL = ORIGIN; +const OG_IMAGE = `${ORIGIN}/social-preview.png`; const otherPackages = { analytics: analyticsVersion, @@ -65,12 +65,13 @@ const knowledge = addKnowledge({ export default defineConfig({ extends: knowledge, - titleTemplate: `:title${titleSuffix}`, + titleTemplate: `:title${TITLE_SUFFIX}`, title: 'WXT', - description, + description: DESCRIPTION, vite: { clearScreen: false, plugins: [ + // @ts-expect-error: Vite version mismatch between this project and the plugin groupIconVitePlugin({ customIcon: { 'wxt.config.ts': localIconLoader( @@ -83,7 +84,7 @@ export default defineConfig({ }, lastUpdated: true, sitemap: { - hostname: origin, + hostname: ORIGIN, }, async buildEnd(site) { @@ -97,27 +98,25 @@ export default defineConfig({ copyright: 'MIT', id: 'wxt', title: 'WXT Blog', - link: `${origin}/blog`, + link: `${ORIGIN}/blog`, }); posts.forEach((post) => { feed.addItem({ - date: post.frontmatter.date, - link: new URL(post.url, origin).href, + date: new Date(post.frontmatter.date), + link: new URL(post.url, ORIGIN).href, title: post.frontmatter.title, description: post.frontmatter.description, }); }); - // console.log('rss.xml:'); - // console.log(feed.rss2()); await writeFile(join(site.outDir, 'rss.xml'), feed.rss2(), 'utf8'); }, head: [ meta('og:type', 'website'), - meta('og:title', ogTitle), - meta('og:image', ogImage), - meta('og:url', ogUrl), - meta('og:description', description), + meta('og:title', OG_TITLE), + meta('og:image', OG_IMAGE), + meta('og:url', OG_URL), + meta('og:description', DESCRIPTION), meta('twitter:card', 'summary_large_image', { useName: true }), script('https://umami.aklinker1.io/script.js', { 'data-website-id': 'c1840c18-a12c-4a45-a848-55ae85ef7915', diff --git a/docs/.vitepress/loaders/blog.data.ts b/docs/.vitepress/loaders/blog.data.ts index 980fd820f..411bb4f78 100644 --- a/docs/.vitepress/loaders/blog.data.ts +++ b/docs/.vitepress/loaders/blog.data.ts @@ -1,3 +1,20 @@ -import { createContentLoader } from 'vitepress'; +import { type ContentData, createContentLoader } from 'vitepress'; -export default createContentLoader('blog/*.md'); +export interface PostFrontmatter { + title: string; + description?: string; + date: string; + authors: { name: string; github: string }[]; +} + +export interface Post + extends Omit, Omit { + date: Date; +} + +declare const data: Array; +export { data }; + +export default createContentLoader< + Array +>('blog/*.md'); diff --git a/docs/.vitepress/loaders/cli.data.ts b/docs/.vitepress/loaders/cli.data.ts index 77327e703..f2bb8d2d3 100644 --- a/docs/.vitepress/loaders/cli.data.ts +++ b/docs/.vitepress/loaders/cli.data.ts @@ -54,8 +54,3 @@ async function getPublishExtensionHelp(command: string): Promise { ); return res.replace(/\$ publish-extension/g, '$ wxt submit'); } - -export interface Command { - name: string; - docs: string; -} diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 275cd0c36..8fde4b238 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -1,9 +1,21 @@ +/* https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css */ /* Colors */ :root { --wxt-c-green-1: #0b8a00; --wxt-c-green-2: #096600; --wxt-c-green-3: #096600; --wxt-c-green-soft: rgba(11, 138, 0, 0.14); + + --vp-c-brand-1: var(--wxt-c-green-1); + --vp-c-brand-2: var(--wxt-c-green-2); + --vp-c-brand-3: var(--wxt-c-green-3); + --vp-c-brand-soft: var(--wxt-c-green-soft); +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; } .dark { @@ -13,17 +25,7 @@ --wxt-c-green-soft: rgba(103, 212, 94, 0.14); } -/* https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css */ - -:root { - --vp-c-brand-1: var(--wxt-c-green-1); - --vp-c-brand-2: var(--wxt-c-green-2); - --vp-c-brand-3: var(--wxt-c-green-3); - --vp-c-brand-soft: var(--wxt-c-green-soft); -} - /* Customize Individual Components */ - .vp-doc .no-vertical-dividers th, .vp-doc .no-vertical-dividers td { border: none; @@ -37,20 +39,15 @@ body { overflow-y: scroll; } -.VPSidebar { - user-select: none; -} - .VPSidebarItem .badge { - display: inline-block; - min-width: 1.6em; - padding: 0.3em 0.4em 0.2em; - border-radius: 1rem; - font-size: 0.75em; - line-height: 1; - margin-left: 0.5rem; - text-align: center; - vertical-align: middle; + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 1.75em; + height: 1.75em; + border-radius: 10rem; + font-size: 0.8em; + margin-left: 0.25rem; background-color: var(--vp-c-default-2); } diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index e616c58a7..1c45031e5 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -6,10 +6,11 @@ import ExampleSearch from '../components/ExampleSearch.vue'; import BlogLayout from '../components/BlogLayout.vue'; import './custom.css'; import 'virtual:group-icons.css'; +import type { EnhanceAppContext } from 'vitepress/client'; export default { extends: DefaultTheme, - enhanceApp(ctx) { + enhanceApp(ctx: EnhanceAppContext) { ctx.app .component('Icon', Icon) .component('EntrypointPatterns', EntrypointPatterns) diff --git a/docs/.vitepress/utils/head.ts b/docs/.vitepress/utils/head.ts index 5c776c965..d6d8adf91 100644 --- a/docs/.vitepress/utils/head.ts +++ b/docs/.vitepress/utils/head.ts @@ -1,4 +1,4 @@ -import { HeadConfig } from 'vitepress/types/shared'; +import type { HeadConfig } from 'vitepress'; export function meta( property: string, diff --git a/docs/.vitepress/utils/menus.ts b/docs/.vitepress/utils/menus.ts index 5eadec1ed..c888206d5 100644 --- a/docs/.vitepress/utils/menus.ts +++ b/docs/.vitepress/utils/menus.ts @@ -1,8 +1,6 @@ import { DefaultTheme } from 'vitepress'; type SidebarItem = DefaultTheme.SidebarItem; -type NavItem = DefaultTheme.NavItem; -type NavItemWithLink = DefaultTheme.NavItemWithLink; type NavItemWithChildren = DefaultTheme.NavItemWithChildren; type NavItemChildren = DefaultTheme.NavItemChildren; @@ -19,7 +17,7 @@ export function navItem(text: string, arg2?: unknown): any { } export function menuRoot(items: SidebarItem[]) { - return items.map((item, index) => { + return items.map((item) => { // item.collapsed = false; // uncomment to expand all level-0 items return item; }); @@ -60,12 +58,6 @@ export function menuGroup( throw Error('Unknown overload'); } -export function menuItems(items: SidebarItem[]) { - return { - items, - }; -} - export function menuItem( text: string, link: string, @@ -102,6 +94,5 @@ export function prepareTypedocSidebar(items: SidebarItem[]) { // process prepareItems(filtered); - // return return filtered; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b1a2f73d3..0da277a2c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4328,8 +4328,8 @@ packages: '@testing-library/jest-dom': optional: true - vite@5.4.19: - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5908,9 +5908,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@20.19.13)(sass@1.97.0))(vue@3.5.25(typescript@5.9.3))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@20.19.13)(sass@1.97.0))(vue@3.5.25(typescript@5.9.3))': dependencies: - vite: 5.4.19(@types/node@20.19.13)(sass@1.97.0) + vite: 5.4.21(@types/node@20.19.13)(sass@1.97.0) vue: 3.5.25(typescript@5.9.3) '@vitejs/plugin-vue@6.0.1(vite@7.3.0(@types/node@20.19.13)(jiti@2.6.1)(sass@1.97.0)(tsx@4.21.0)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.3))': @@ -8510,7 +8510,7 @@ snapshots: transitivePeerDependencies: - supports-color - vite@5.4.19(@types/node@20.19.13)(sass@1.97.0): + vite@5.4.21(@types/node@20.19.13)(sass@1.97.0): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -8567,7 +8567,7 @@ snapshots: '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.19(@types/node@20.19.13)(sass@1.97.0))(vue@3.5.25(typescript@5.9.3)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@20.19.13)(sass@1.97.0))(vue@3.5.25(typescript@5.9.3)) '@vue/devtools-api': 7.7.7 '@vue/shared': 3.5.21 '@vueuse/core': 12.8.2(typescript@5.9.3) @@ -8576,7 +8576,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.1.2 shiki: 2.5.0 - vite: 5.4.19(@types/node@20.19.13)(sass@1.97.0) + vite: 5.4.21(@types/node@20.19.13)(sass@1.97.0) vue: 3.5.25(typescript@5.9.3) optionalDependencies: postcss: 8.5.6