mirror of
https://github.com/reonokiy/blog.nokiy.net.git
synced 2025-06-16 03:32:51 +02:00
refactor: rename functions
This commit is contained in:
parent
ca1abd28c1
commit
f5526f8622
17 changed files with 46 additions and 49 deletions
|
@ -17,9 +17,6 @@ const {
|
||||||
imageUploader = false,
|
imageUploader = false,
|
||||||
} = themeConfig.comment?.waline ?? {}
|
} = themeConfig.comment?.waline ?? {}
|
||||||
|
|
||||||
// Get current path
|
|
||||||
const currentPath = Astro.url.pathname
|
|
||||||
|
|
||||||
// Get the language code of Waline
|
// Get the language code of Waline
|
||||||
function getWalineLang(currentPath: string, defaultLocale: string): string {
|
function getWalineLang(currentPath: string, defaultLocale: string): string {
|
||||||
// Extract language code from path
|
// Extract language code from path
|
||||||
|
@ -32,7 +29,7 @@ function getWalineLang(currentPath: string, defaultLocale: string): string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get Waline language and generate configuration
|
// Get Waline language and generate configuration
|
||||||
const walineLang = getWalineLang(currentPath, defaultLocale)
|
const walineLang = getWalineLang(Astro.url.pathname, defaultLocale)
|
||||||
const walineConfigJson = JSON.stringify({
|
const walineConfigJson = JSON.stringify({
|
||||||
serverURL,
|
serverURL,
|
||||||
lang: walineLang,
|
lang: walineLang,
|
||||||
|
@ -49,8 +46,7 @@ const walineConfigJson = JSON.stringify({
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
<!-- Not use is:inline or define:vars >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||||||
<!-- Not use is:inline or define:vars -->
|
|
||||||
<script>
|
<script>
|
||||||
import { init } from '@waline/client'
|
import { init } from '@waline/client'
|
||||||
import '@waline/client/style'
|
import '@waline/client/style'
|
||||||
|
@ -76,7 +72,7 @@ initWaline()
|
||||||
document.addEventListener('astro:after-swap', initWaline)
|
document.addEventListener('astro:after-swap', initWaline)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- Custom css styles >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
<!-- Custom css styles >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||||||
<style is:global>
|
<style is:global>
|
||||||
#waline .wl-login-info {
|
#waline .wl-login-info {
|
||||||
--at-apply: 'mt-0 mr-3'
|
--at-apply: 'mt-0 mr-3'
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
---
|
---
|
||||||
import themeConfig from '@/config'
|
import themeConfig from '@/config'
|
||||||
import { getPagePath } from '@/i18n/path'
|
import { getPageInfo } from '@/i18n/path'
|
||||||
|
|
||||||
const { title, subtitle } = themeConfig.site
|
const { title, subtitle } = themeConfig.site
|
||||||
const { titleSpace } = themeConfig.global
|
const { titleSpace } = themeConfig.global
|
||||||
const currentPath = Astro.url.pathname
|
const { getLocalizedPath } = getPageInfo(Astro.url.pathname)
|
||||||
const { getLocalizedPath } = getPagePath(currentPath)
|
|
||||||
|
|
||||||
const marginBottom = {
|
const marginBottom = {
|
||||||
1: 'mb-0.625',
|
1: 'mb-0.625',
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
---
|
---
|
||||||
import themeConfig from '@/config'
|
import themeConfig from '@/config'
|
||||||
import { getPagePath } from '@/i18n/path'
|
import { getPageInfo } from '@/i18n/path'
|
||||||
|
|
||||||
const { title, subtitle } = themeConfig.site
|
const { title, subtitle } = themeConfig.site
|
||||||
const { titleSpace } = themeConfig.global
|
const { titleSpace } = themeConfig.global
|
||||||
const currentPath = Astro.url.pathname
|
const { getLocalizedPath } = getPageInfo(Astro.url.pathname)
|
||||||
const { getLocalizedPath } = getPagePath(currentPath)
|
|
||||||
|
|
||||||
const marginBottom = {
|
const marginBottom = {
|
||||||
1: 'mb-1.625',
|
1: 'mb-1.625',
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
---
|
---
|
||||||
import { getPagePath } from '@/i18n/path'
|
import { getPageInfo } from '@/i18n/path'
|
||||||
import { ui } from '@/i18n/ui'
|
import { ui } from '@/i18n/ui'
|
||||||
|
|
||||||
const currentPath = Astro.url.pathname
|
|
||||||
const { currentLang, isHome, isPost, isTag, isAbout, getLocalizedPath }
|
const { currentLang, isHome, isPost, isTag, isAbout, getLocalizedPath }
|
||||||
= getPagePath(currentPath)
|
= getPageInfo(Astro.url.pathname)
|
||||||
const currentUI = ui[currentLang as keyof typeof ui]
|
const currentUI = ui[currentLang as keyof typeof ui]
|
||||||
|
|
||||||
const isPostActive = isHome || isPost
|
const isPostActive = isHome || isPost
|
||||||
|
|
|
@ -10,8 +10,7 @@ interface Props {
|
||||||
|
|
||||||
const { date, updatedDate, minutes } = Astro.props
|
const { date, updatedDate, minutes } = Astro.props
|
||||||
const format = themeConfig.global.dateFormat
|
const format = themeConfig.global.dateFormat
|
||||||
const currentPath = Astro.url.pathname
|
const isPost = isPostPage(Astro.url.pathname)
|
||||||
const isPost = isPostPage(currentPath)
|
|
||||||
const timeSpacingClass = isPost ? 'ml-1.75' : 'ml-1.5'
|
const timeSpacingClass = isPost ? 'ml-1.75' : 'ml-1.5'
|
||||||
|
|
||||||
function formatDate(date: Date, format: 'YYYY-MM-DD' | 'MM-DD-YYYY' | 'DD-MM-YYYY' | 'MONTH DAY YYYY' | 'DAY MONTH YYYY') {
|
function formatDate(date: Date, format: 'YYYY-MM-DD' | 'MM-DD-YYYY' | 'DD-MM-YYYY' | 'MONTH DAY YYYY' | 'DAY MONTH YYYY') {
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
import { defaultLocale, moreLocales } from '@/i18n/config'
|
import { defaultLocale, moreLocales } from '@/i18n/config'
|
||||||
|
|
||||||
|
// Removes leading and trailing slashes from a path
|
||||||
export function cleanPath(path: string) {
|
export function cleanPath(path: string) {
|
||||||
return path.replace(/^\/|\/$/g, '')
|
return path.replace(/^\/|\/$/g, '')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Gets the language code from the current path
|
||||||
export function getLangFromPath(path: string) {
|
export function getLangFromPath(path: string) {
|
||||||
const secondaryLang = moreLocales.find(
|
const secondaryLang = moreLocales.find(
|
||||||
lang =>
|
lang =>
|
||||||
|
@ -12,6 +14,7 @@ export function getLangFromPath(path: string) {
|
||||||
return secondaryLang || defaultLocale
|
return secondaryLang || defaultLocale
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Generates a localized path based on current language
|
||||||
export function getLocalizedPath(path: string, currentLang?: string) {
|
export function getLocalizedPath(path: string, currentLang?: string) {
|
||||||
const clean = cleanPath(path)
|
const clean = cleanPath(path)
|
||||||
const lang = currentLang || getLangFromPath(path)
|
const lang = currentLang || getLangFromPath(path)
|
||||||
|
@ -23,6 +26,7 @@ export function getLocalizedPath(path: string, currentLang?: string) {
|
||||||
return lang === defaultLocale ? `/${clean}/` : `/${lang}/${clean}/`
|
return lang === defaultLocale ? `/${clean}/` : `/${lang}/${clean}/`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Checks if the current path is the home/post/tag/about page
|
||||||
export function isHomePage(path: string) {
|
export function isHomePage(path: string) {
|
||||||
const clean = cleanPath(path)
|
const clean = cleanPath(path)
|
||||||
return clean === '' || moreLocales.includes(clean)
|
return clean === '' || moreLocales.includes(clean)
|
||||||
|
@ -40,7 +44,8 @@ export function isAboutPage(path: string) {
|
||||||
return clean.startsWith('about') || moreLocales.some(lang => clean.startsWith(`${lang}/about`))
|
return clean.startsWith('about') || moreLocales.some(lang => clean.startsWith(`${lang}/about`))
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getPagePath(path: string) {
|
// Returns page context including language and page type information
|
||||||
|
export function getPageInfo(path: string) {
|
||||||
const currentLang = getLangFromPath(path)
|
const currentLang = getLangFromPath(path)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
import type { CollectionEntry } from 'astro:content'
|
import type { CollectionEntry } from 'astro:content'
|
||||||
import { allLocales, defaultLocale, moreLocales } from '@/i18n/config'
|
import { allLocales, defaultLocale, moreLocales } from '@/i18n/config'
|
||||||
|
|
||||||
// 生成默认语言标签页面的路径配置
|
// 生成默认语言标签页面的路由配置
|
||||||
export function generateTagPaths(tags: string[]) {
|
export function getTagRoutes(tags: string[]) {
|
||||||
return tags.map(tag => ({
|
return tags.map(tag => ({
|
||||||
params: { tag },
|
params: { tag },
|
||||||
props: { tag },
|
props: { tag },
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成默认语言文章页面的路径配置
|
// 生成默认语言文章页面的路由配置
|
||||||
export function generatePostPaths(posts: CollectionEntry<'posts'>[]) {
|
export function getPostRoutes(posts: CollectionEntry<'posts'>[]) {
|
||||||
// 创建slug到语言的映射
|
// 创建slug到语言的映射
|
||||||
const slugToLangs: Record<string, string[]> = {}
|
const slugToLangs: Record<string, string[]> = {}
|
||||||
|
|
||||||
|
@ -45,15 +45,15 @@ export function generatePostPaths(posts: CollectionEntry<'posts'>[]) {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成更多语言静态路径
|
// 生成更多语言静态路由
|
||||||
export function generateMultiLangPaths() {
|
export function getMultiLangRoutes() {
|
||||||
return moreLocales.map(lang => ({
|
return moreLocales.map(lang => ({
|
||||||
params: { lang },
|
params: { lang },
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成更多语言标签页面的路径配置
|
// 生成更多语言标签页面的路由配置
|
||||||
export function generateMultiLangTagPaths(tags: string[]) {
|
export function getMultiLangTagRoutes(tags: string[]) {
|
||||||
return moreLocales.flatMap(lang => (
|
return moreLocales.flatMap(lang => (
|
||||||
tags.map(tag => ({
|
tags.map(tag => ({
|
||||||
params: { lang, tag },
|
params: { lang, tag },
|
||||||
|
@ -62,8 +62,8 @@ export function generateMultiLangTagPaths(tags: string[]) {
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成更多语言文章页面的路径配置
|
// 生成更多语言文章页面的路由配置
|
||||||
export function generateMultiLangPostPaths(posts: CollectionEntry<'posts'>[]) {
|
export function getMultiLangPostRoutes(posts: CollectionEntry<'posts'>[]) {
|
||||||
// 创建slug到语言的映射
|
// 创建slug到语言的映射
|
||||||
const slugToLangs: Record<string, string[]> = {}
|
const slugToLangs: Record<string, string[]> = {}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ import LanguageSwitcher from '@/components/Widgets/LanguageSwitcher.astro'
|
||||||
// import Scrollbar from '@/components/Scrollbar.astro'
|
// import Scrollbar from '@/components/Scrollbar.astro'
|
||||||
import ThemeToggle from '@/components/Widgets/ThemeToggle.astro'
|
import ThemeToggle from '@/components/Widgets/ThemeToggle.astro'
|
||||||
import themeConfig from '@/config'
|
import themeConfig from '@/config'
|
||||||
import { getPagePath } from '@/i18n/path'
|
import { getPageInfo } from '@/i18n/path'
|
||||||
import Head from '@/layouts/Head.astro'
|
import Head from '@/layouts/Head.astro'
|
||||||
|
|
||||||
import '@/styles/font.css'
|
import '@/styles/font.css'
|
||||||
|
@ -24,7 +24,7 @@ interface Props {
|
||||||
}
|
}
|
||||||
|
|
||||||
const { postTitle, postDescription, postSlug, supportedLangs = [] } = Astro.props
|
const { postTitle, postDescription, postSlug, supportedLangs = [] } = Astro.props
|
||||||
const { isHome, isPost } = getPagePath(Astro.url.pathname)
|
const { isHome, isPost } = getPageInfo(Astro.url.pathname)
|
||||||
const { light: { background: lightMode }, dark: { background: darkMode } } = themeConfig.color
|
const { light: { background: lightMode }, dark: { background: darkMode } } = themeConfig.color
|
||||||
const fontStyle = themeConfig.global.fontStyle === 'serif' ? 'font-serif' : 'font-sans'
|
const fontStyle = themeConfig.global.fontStyle === 'serif' ? 'font-serif' : 'font-sans'
|
||||||
const footerMarginClass = isPost && themeConfig.comment?.waline?.serverURL
|
const footerMarginClass = isPost && themeConfig.comment?.waline?.serverURL
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
---
|
---
|
||||||
import { generateMultiLangPaths } from '@/i18n/route'
|
import { getMultiLangRoutes } from '@/i18n/route'
|
||||||
import Layout from '@/layouts/Layout.astro'
|
import Layout from '@/layouts/Layout.astro'
|
||||||
|
|
||||||
export function getStaticPaths() {
|
export function getStaticPaths() {
|
||||||
return generateMultiLangPaths()
|
return getMultiLangRoutes()
|
||||||
}
|
}
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import type { APIContext } from 'astro'
|
import type { APIContext } from 'astro'
|
||||||
import themeConfig from '@/config'
|
import themeConfig from '@/config'
|
||||||
import { generateMultiLangPaths } from '@/i18n/route'
|
import { getMultiLangRoutes } from '@/i18n/route'
|
||||||
import { generateRSS } from '@/utils/rss'
|
import { generateRSS } from '@/utils/rss'
|
||||||
|
|
||||||
const { moreLocales } = themeConfig.global
|
const { moreLocales } = themeConfig.global
|
||||||
|
@ -10,7 +10,7 @@ type SupportedLanguage = typeof moreLocales[number]
|
||||||
|
|
||||||
// Generate static paths for all supported languages
|
// Generate static paths for all supported languages
|
||||||
export function getStaticPaths() {
|
export function getStaticPaths() {
|
||||||
return generateMultiLangPaths()
|
return getMultiLangRoutes()
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function GET({ params }: APIContext) {
|
export async function GET({ params }: APIContext) {
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
---
|
---
|
||||||
import PostList from '@/components/PostList.astro'
|
import PostList from '@/components/PostList.astro'
|
||||||
import { generateMultiLangPaths } from '@/i18n/route'
|
import { getMultiLangRoutes } from '@/i18n/route'
|
||||||
import Layout from '@/layouts/Layout.astro'
|
import Layout from '@/layouts/Layout.astro'
|
||||||
import { getPinnedPosts, getPostsByYear } from '@/utils/content'
|
import { getPinnedPosts, getPostsByYear } from '@/utils/content'
|
||||||
|
|
||||||
export function getStaticPaths() {
|
export function getStaticPaths() {
|
||||||
return generateMultiLangPaths()
|
return getMultiLangRoutes()
|
||||||
}
|
}
|
||||||
|
|
||||||
const { lang } = Astro.params
|
const { lang } = Astro.params
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
import Comments from '@/components/Comments/index.astro'
|
import Comments from '@/components/Comments/index.astro'
|
||||||
import PostTime from '@/components/PostTime.astro'
|
import PostTime from '@/components/PostTime.astro'
|
||||||
import { generateMultiLangPostPaths } from '@/i18n/route'
|
import { getMultiLangPostRoutes } from '@/i18n/route'
|
||||||
import Layout from '@/layouts/Layout.astro'
|
import Layout from '@/layouts/Layout.astro'
|
||||||
import { checkSlugDuplication } from '@/utils/content'
|
import { checkSlugDuplication } from '@/utils/content'
|
||||||
import { generateDescription } from '@/utils/description'
|
import { generateDescription } from '@/utils/description'
|
||||||
|
@ -15,7 +15,7 @@ export async function getStaticPaths() {
|
||||||
throw new Error(`Slug conflicts found:\n${duplicates.join('\n')}`)
|
throw new Error(`Slug conflicts found:\n${duplicates.join('\n')}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
return generateMultiLangPostPaths(posts)
|
return getMultiLangPostRoutes(posts)
|
||||||
}
|
}
|
||||||
|
|
||||||
const { lang } = Astro.params
|
const { lang } = Astro.params
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import type { APIContext } from 'astro'
|
import type { APIContext } from 'astro'
|
||||||
import themeConfig from '@/config'
|
import themeConfig from '@/config'
|
||||||
import { generateMultiLangPaths } from '@/i18n/route'
|
import { getMultiLangRoutes } from '@/i18n/route'
|
||||||
import { generateRSS } from '@/utils/rss'
|
import { generateRSS } from '@/utils/rss'
|
||||||
|
|
||||||
const { moreLocales } = themeConfig.global
|
const { moreLocales } = themeConfig.global
|
||||||
|
@ -10,7 +10,7 @@ type SupportedLanguage = typeof moreLocales[number]
|
||||||
|
|
||||||
// Generate static paths for all supported languages
|
// Generate static paths for all supported languages
|
||||||
export function getStaticPaths() {
|
export function getStaticPaths() {
|
||||||
return generateMultiLangPaths()
|
return getMultiLangRoutes()
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function GET({ params }: APIContext) {
|
export async function GET({ params }: APIContext) {
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
import PostList from '@/components/PostList.astro'
|
import PostList from '@/components/PostList.astro'
|
||||||
import { generateMultiLangTagPaths } from '@/i18n/route'
|
import { getMultiLangTagRoutes } from '@/i18n/route'
|
||||||
import Layout from '@/layouts/Layout.astro'
|
import Layout from '@/layouts/Layout.astro'
|
||||||
import { getAllTags, getPostsByTag } from '@/utils/content'
|
import { getAllTags, getPostsByTag } from '@/utils/content'
|
||||||
|
|
||||||
export async function getStaticPaths() {
|
export async function getStaticPaths() {
|
||||||
const tags = await getAllTags()
|
const tags = await getAllTags()
|
||||||
return generateMultiLangTagPaths(tags)
|
return getMultiLangTagRoutes(tags)
|
||||||
}
|
}
|
||||||
|
|
||||||
const { lang } = Astro.params
|
const { lang } = Astro.params
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
---
|
---
|
||||||
import { generateMultiLangPaths } from '@/i18n/route'
|
import { getMultiLangRoutes } from '@/i18n/route'
|
||||||
import Layout from '@/layouts/Layout.astro'
|
import Layout from '@/layouts/Layout.astro'
|
||||||
import { getAllTags } from '@/utils/content'
|
import { getAllTags } from '@/utils/content'
|
||||||
|
|
||||||
export function getStaticPaths() {
|
export function getStaticPaths() {
|
||||||
return generateMultiLangPaths()
|
return getMultiLangRoutes()
|
||||||
}
|
}
|
||||||
|
|
||||||
const { lang } = Astro.params
|
const { lang } = Astro.params
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
import Comments from '@/components/Comments/index.astro'
|
import Comments from '@/components/Comments/index.astro'
|
||||||
import PostTime from '@/components/PostTime.astro'
|
import PostTime from '@/components/PostTime.astro'
|
||||||
import { generatePostPaths } from '@/i18n/route'
|
import { getPostRoutes } from '@/i18n/route'
|
||||||
import Layout from '@/layouts/Layout.astro'
|
import Layout from '@/layouts/Layout.astro'
|
||||||
import { checkSlugDuplication } from '@/utils/content'
|
import { checkSlugDuplication } from '@/utils/content'
|
||||||
import { generateDescription } from '@/utils/description'
|
import { generateDescription } from '@/utils/description'
|
||||||
|
@ -15,7 +15,7 @@ export async function getStaticPaths() {
|
||||||
throw new Error(`Slug conflicts found:\n${duplicates.join('\n')}`)
|
throw new Error(`Slug conflicts found:\n${duplicates.join('\n')}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
return generatePostPaths(posts)
|
return getPostRoutes(posts)
|
||||||
}
|
}
|
||||||
|
|
||||||
const { post, supportedLangs = [] } = Astro.props
|
const { post, supportedLangs = [] } = Astro.props
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
import PostList from '@/components/PostList.astro'
|
import PostList from '@/components/PostList.astro'
|
||||||
import { generateTagPaths } from '@/i18n/route'
|
import { getTagRoutes } from '@/i18n/route'
|
||||||
import Layout from '@/layouts/Layout.astro'
|
import Layout from '@/layouts/Layout.astro'
|
||||||
import { getAllTags, getPostsByTag } from '@/utils/content'
|
import { getAllTags, getPostsByTag } from '@/utils/content'
|
||||||
|
|
||||||
export async function getStaticPaths() {
|
export async function getStaticPaths() {
|
||||||
const tags = await getAllTags()
|
const tags = await getAllTags()
|
||||||
return generateTagPaths(tags)
|
return getTagRoutes(tags)
|
||||||
}
|
}
|
||||||
|
|
||||||
const { tag } = Astro.props
|
const { tag } = Astro.props
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue