update
Some checks failed
deploy / deploy (push) Has been cancelled

This commit is contained in:
toom1996
2026-08-18 00:47:04 +08:00
parent e83fff9a9f
commit 55c199a5c1
39 changed files with 462 additions and 190 deletions

View File

@ -0,0 +1,51 @@
---
import { useTranslations, DEFAULT_LOCALE, type Locale } from "@/i18n/utils";
interface Crumb {
/** i18n key:英文原文,如 'Home' / 'Runway Archive';中文环境自动取字典翻译 */
label: string;
href: string;
}
interface Props {
/** 中间层级的面包屑项(不含末项)。末项由 <slot name="current"> 提供(如动态年份) */
items?: Crumb[];
/** 可选:显式指定语言;缺省时跟随当前页面语言(Astro.currentLocale) */
locale?: string;
}
const { items = [], locale } = Astro.props;
const currentLocale = (locale ?? Astro.currentLocale ?? DEFAULT_LOCALE) as Locale;
const { t } = useTranslations(currentLocale);
---
<nav class="crumb" aria-label="Breadcrumb">
{
items.map((it) => (
<Fragment>
<a href={it.href} class="crumb-link">{t(it.label)}</a>
<span class="crumb-sep" aria-hidden="true">/</span>
</Fragment>
))
}
<span class="crumb-cur" aria-current="page">
<slot name="current" />
</span>
</nav>
<style>
@reference "tailwindcss";
.crumb {
@apply inline-flex items-center gap-[10px] mb-[10px] text-[11px] tracking-[0.18em] uppercase text-[#999] no-underline;
}
.crumb-link {
@apply text-black no-underline transition-colors duration-150 hover:text-[#888];
}
.crumb-sep {
@apply text-[#cfcfcf] select-none;
}
.crumb-cur {
@apply text-[#999];
}
</style>

View File

@ -1,15 +1,14 @@
---
import ComingSoon from "./ComingSoon.astro"
import { getShows, seriesLabel } from "../lib/data"
import { useTranslations, DEFAULT_LOCALE, type Locale } from "../i18n/utils"
import ComingSoon from "@/components/ComingSoon.astro"
import { getShows, seriesLabel } from "@/lib/data"
import { getI18n } from "@/i18n/utils"
// SSR 预取走秀数据
const shows = await getShows(20)
// 国际化:取当前页面语言(Astro 路由解析)与翻译函数
const locale = (Astro.currentLocale as Locale) ?? DEFAULT_LOCALE
const { t } = useTranslations(locale)
// 国际化:一行取当前语言 + 翻译函数
const { locale, t } = getI18n(Astro)
type GalleryItem = {
src: string;

View File

View File

@ -1,6 +1,6 @@
---
import astroLogo from '../assets/astro.svg';
import background from '../assets/background.svg';
import astroLogo from '@/assets/astro.svg';
import background from '@/assets/background.svg';
---
<div id="container">

View File

@ -1,6 +1,6 @@
---
// 页面主体(与语言无关的内容),由根页面与 [locale] 页面共用
import ComingSoon from "../../components/ComingSoon.astro"
import ComingSoon from "@/components/ComingSoon.astro"
---
<ComingSoon module="About" moduleZh="关于" />

View File

@ -1,6 +1,6 @@
---
// 页面主体(与语言无关的内容),由根页面与 [locale] 页面共用
import ComingSoon from "../../components/ComingSoon.astro"
import ComingSoon from "@/components/ComingSoon.astro"
---
<ComingSoon module="Contact" moduleZh="联系" />

View File

@ -1,6 +1,6 @@
---
// 页面主体(与语言无关的内容),由根页面与 [locale] 页面共用
import ComingSoon from "../../components/ComingSoon.astro"
import ComingSoon from "@/components/ComingSoon.astro"
---
<ComingSoon module="Latest Projects" moduleZh="最新项目" />

View File

@ -1,6 +1,6 @@
---
// 页面主体(与语言无关的内容),由根页面与 [locale] 页面共用
import ComingSoon from "../../components/ComingSoon.astro"
import ComingSoon from "@/components/ComingSoon.astro"
---
<ComingSoon module="Sign In" moduleZh="登录" note="账户系统正在筹备中,暂未开放注册与登录。" />

View File

@ -1,6 +1,6 @@
---
// 页面主体(与语言无关的内容),由根页面与 [locale] 页面共用
import ComingSoon from "../../components/ComingSoon.astro"
import ComingSoon from "@/components/ComingSoon.astro"
---
<ComingSoon module="Portfolio" moduleZh="作品集" />

View File

@ -1,6 +1,6 @@
---
// 页面主体(与语言无关的内容),由根页面与 [locale] 页面共用
import ComingSoon from "../../components/ComingSoon.astro"
import ComingSoon from "@/components/ComingSoon.astro"
---
<ComingSoon module="Create Account" moduleZh="注册" note="账户系统正在筹备中,暂未开放注册与登录。" />

View File

@ -31,7 +31,7 @@
</div>
<!-- 标题 -->
<h1 class="font-serif font-black leading-[0.95] tracking-tight text-[10vw] md:text-[4.5rem] mt-8" x-text="article?.title"></h1>
<h1 class="font-black leading-[0.95] tracking-tight text-[10vw] md:text-[4.5rem] mt-8" x-text="article?.title"></h1>
<!-- 元信息 -->
<div class="mt-6 flex flex-wrap items-center gap-x-6 gap-y-2 text-[12px] font-mono uppercase tracking-widest text-[#666]">
@ -42,32 +42,8 @@
</template>
</div>
<!-- 正文 -->
<div class="mt-12 grid md:grid-cols-12 gap-8">
<div class="md:col-span-2 text-[11px] font-mono uppercase tracking-widest text-[#999] pt-1">
Report
</div>
<div class="md:col-span-10 max-w-[68ch] space-y-5 text-[16px] leading-[1.9] text-[#222]">
<template x-for="(paragraph, idx) in bodyParagraphs" :key="idx">
<p x-text="paragraph"></p>
</template>
</div>
</div>
<!-- 图片集 -->
<section class="mt-16" x-show="article?.images && article.images.length > 0">
<div class="flex items-end justify-between border-b border-[#eee] pb-3 mb-6">
<div class="text-[11px] font-mono uppercase tracking-[0.25em] text-[#999]">
Gallery <span class="ml-2 text-black" x-text="`· 共 ${article?.images?.length || 0} 张`"></span>
</div>
<button
type="button"
@click="openLb(0)"
class="text-[11px] font-mono uppercase tracking-widest border border-black px-3 py-1.5 hover:bg-black hover:text-white transition-colors cursor-pointer"
>
⤢ 全屏查看
</button>
</div>
<!-- 图片网格 -->
<div class="grid grid-cols-2 md:grid-cols-3 gap-4">

View File

@ -1,5 +1,5 @@
---
import { getReports, fmtDate } from "../../lib/data"
import { getReports, fmtDate } from "@/lib/data"
// 文章展示创意布局页:复用你现有的 Layout 外壳。
// 数据由数据层 getReports() 统一从后端公开接口拉取(见 src/lib/data.ts);

View File

@ -1,4 +1,4 @@
import { DEFAULT_LOCALE, type Locale } from './config';
import { DEFAULT_LOCALE, type Locale } from '@/i18n/config';
/**
* 单文件翻译字典。
@ -18,18 +18,25 @@ type OtherLocale = Exclude<Locale, typeof DEFAULT_LOCALE>;
type TranslationEntry = Partial<Record<OtherLocale, string>>;
export const dict: Record<string, TranslationEntry> = {
Portfolio: { cn: '作品集' },
'All Shows': { cn: '全部走秀' },
// ── 导航 / Navigation ──
'About': { cn: '关于' },
'All Shows': { cn: '全部走秀' },
'Contact': { cn: '联系' },
'Contact Us': { cn: '联系我们' },
'Home': { cn: '首页' },
'Latest Projects': { cn: '最新项目' },
About: { cn: '关于' },
'Contact Us': { cn: '联系我们' },
Login: { cn: '登录' },
Signup: { cn: '注册' },
Contact: { cn: '联系' },
'Back to top': { cn: '回到顶部' },
'Login': { cn: '登录' },
'Portfolio': { cn: '作品集' },
'Runway Archive': { cn: '走秀档案' },
'Signup': { cn: '注册' },
// ── 控件 / Controls ──
'Back to top': { cn: '回到顶部' },
'Next': { cn: '下一组' },
'Previous': { cn: '上一组' },
// ── 页脚 / Footer ──
'© 2026 PORTFOLIO STUDIO. ALL RIGHTS RESERVED.': { cn: '© 2026 PORTFOLIO STUDIO. 保留所有权利。' },
Previous: { cn: '上一组' },
Next: { cn: '下一组' },
};
/** 把 {name} 形式的占位符替换成参数值。 */

View File

@ -1,6 +1,6 @@
import { getLocaleByPath } from 'astro:i18n';
import { DEFAULT_LOCALE, LOCALES, type Locale } from './config';
import { translate } from './dictionary';
import { DEFAULT_LOCALE, LOCALES, type Locale } from '@/i18n/config';
import { translate } from '@/i18n/dictionary';
/**
* 从 URL 解析语言,委托 Astro 内置的 astro:i18n.getLocaleByPath。
@ -29,5 +29,17 @@ export function useTranslations(locale: Locale) {
return { t, locale };
}
/**
* 一行取「当前语言 + 翻译函数」,干掉每个页面重复的样板:
* const { locale, t } = getI18n(Astro)
* 内部用 Astro.currentLocale(与 Layout 判断语言的方式一致),
* 取不到时回退默认语言。参数只要求含 currentLocale 字段,避免耦合 Astro 全局类型。
*/
export function getI18n(Astro: { currentLocale?: string | undefined }) {
const locale = (Astro.currentLocale as Locale) ?? DEFAULT_LOCALE;
const { t } = useTranslations(locale);
return { locale, t };
}
export { LOCALES, DEFAULT_LOCALE };
export type { Locale };

View File

@ -1,9 +1,9 @@
---
import '../styles/global.css'
import '@/styles/global.css'
import { getRelativeLocaleUrl } from 'astro:i18n'
import { useTranslations, DEFAULT_LOCALE, type Locale } from '../i18n/utils'
import { LOCALES, LOCALE_NAMES, isLocaleSegment } from '../i18n/config'
import LanguageDetector from '../components/LanguageDetector.astro'
import { getI18n } from '@/i18n/utils'
import { LOCALES, LOCALE_NAMES, isLocaleSegment } from '@/i18n/config'
import LanguageDetector from '@/components/LanguageDetector.astro'
const {
title = 'Portfolio Studio',
@ -12,14 +12,21 @@ const {
activeThemePalette = null,
} = Astro.props;
const locale = (Astro.currentLocale as Locale) ?? DEFAULT_LOCALE
const { t } = useTranslations(locale)
const { locale, t } = getI18n(Astro)
// 当前路径(去掉语言前缀),供语言切换器「换前缀、留路径」用,例如 /cn/women → /women
const pathSegments = Astro.url.pathname.split('/');
const firstSegment = pathSegments[1] || '';
const currentPath = (LOCALES as readonly string[]).includes(firstSegment)
? '/' + pathSegments.slice(2).filter(Boolean).join('/') || '/'
: Astro.url.pathname;
const queryString = Astro.url.search;
---
<!doctype html>
<html lang={locale === 'cn' ? 'zh-CN' : 'en'}>
<head>
<!-- <LanguageDetector /> -->
<!-- TODO <LanguageDetector /> -->
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
@ -80,9 +87,9 @@ const { t } = useTranslations(locale)
>
{LOCALES.map((l) => (
<li>
<a
href={getRelativeLocaleUrl(l)}
@click="open = false"
<a
href={getRelativeLocaleUrl(l, currentPath) + queryString}
@click="open = false"
class:list={[
'block px-4 py-1.5 text-[12px] uppercase tracking-[0.5px] hover:bg-black/5 transition-colors',
l === locale ? 'font-bold' : 'opacity-60',
@ -105,7 +112,7 @@ const { t } = useTranslations(locale)
<footer class="relative z-[1] bg-white mt-20 pt-10 border-t-2 border-black text-black w-full font-sans">
<script>
import { getUser, fetchMe, clearSession } from "../lib/auth.ts"
import { getUser, fetchMe, clearSession } from "@/lib/auth.ts"
const slot = document.getElementById("auth-slot")
function render(user) {
if (!user) return // 未登录:保留 SSR 渲染的 Login/Signup(已带语言前缀,无需重写)
@ -193,27 +200,6 @@ const { t } = useTranslations(locale)
</div>
{/* Active Theme Strip */}
{activeThemePalette && (
<div class="mb-6 p-4 bg-zinc-50 border border-zinc-200 flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3">
<div class="flex items-center gap-2 text-xs font-mono">
<span class="w-2.5 h-2.5 rounded-full bg-emerald-500 animate-pulse"></span>
<span class="font-bold uppercase">Active Site Theme:</span>
<span class="text-zinc-600">{activeThemePalette.name}</span>
</div>
<div class="flex gap-1 h-6 w-48 border border-zinc-300 overflow-hidden">
{activeThemePalette.colors.map((c) => (
<div
style={`background-color: ${c.hex}`}
class="h-full flex-1"
title={`${c.name} (${c.hex})`}
></div>
))}
</div>
</div>
)}
{/* Bottom Legal & Back To Top */}
<div class="flex flex-col sm:flex-row justify-between items-center text-[12px] font-mono text-zinc-500 gap-4">
<div>

View File

@ -1,6 +1,6 @@
---
import Layout from "../layouts/Layout.astro"
import Article from "../components/pages/article.astro"
import Layout from "@/layouts/Layout.astro"
import Article from "@/components/pages/article.astro"
---
<Layout>

View File

@ -1,8 +0,0 @@
---
import Layout from "../layouts/Layout.astro"
import Articles from "../components/pages/articles.astro"
---
<Layout>
<Articles />
</Layout>

View File

@ -1,6 +1,6 @@
---
import Layout from "../layouts/Layout.astro"
import Brands from "../components/pages/brands.astro"
import Layout from "@/layouts/Layout.astro"
import Brands from "@/components/pages/brands.astro"
---
<Layout>

View File

@ -1,6 +1,6 @@
---
import Layout from "../../layouts/Layout.astro"
import About from "../../components/pages/About.astro"
import Layout from "@/layouts/Layout.astro"
import About from "@/components/pages/About.astro"
---
<Layout title="About — 暂未上线">

View File

@ -0,0 +1,8 @@
---
import Layout from "@/layouts/Layout.astro"
import Article from "@/components/pages/article.astro"
---
<Layout>
<Article />
</Layout>

View File

@ -1,6 +1,6 @@
---
import Layout from '../../layouts/Layout.astro'
import Index from '../../components/Index.astro'
import Layout from '@/layouts/Layout.astro'
import Index from '@/components/Index.astro'
---
<Layout>

View File

@ -1,6 +1,7 @@
---
import Layout from "../layouts/Layout.astro"
import { getBrands, getYears, type BrandEntry } from "../lib/api"
import Layout from "@/layouts/Layout.astro"
import Breadcrumb from "@/components/Breadcrumb.astro"
import { getBrands, getYears, type BrandEntry } from "@/lib/api"
let sidebarBrands: BrandEntry[] = []
let yearChips: number[] = []
@ -24,13 +25,14 @@ if (!yearChips.length) yearChips = yearSeed
<!-- 顶部:极简眉头 -->
<header class="showshead">
<div>
<nav class="showscrumb" aria-label="Breadcrumb">
<a href="/">Home</a>
<span class="sep" aria-hidden="true">/</span>
<a href="/shows">All Shows</a>
<span class="sep" aria-hidden="true">/</span>
<span class="cur" aria-current="page" x-text="crumbYear"></span>
</nav>
<Breadcrumb
items={[
{ label: 'Home', href: '/' },
{ label: 'Runway Archive', href: '/shows' },
]}
>
<span slot="current" x-text="crumbYear">2026 Edition</span>
</Breadcrumb>
<h1 class="showsh1">All Shows</h1>
</div>
</header>
@ -292,18 +294,6 @@ if (!yearChips.length) yearChips = yearSeed
.showshead {
@apply flex justify-between items-end gap-6 py-5 pb-[26px] ;
}
.showscrumb {
@apply inline-flex items-center gap-[10px] mb-[10px] text-[11px] tracking-[0.18em] uppercase text-[#999] no-underline;
}
.showscrumb a {
@apply text-black no-underline transition-colors duration-150 hover:text-[#888];
}
.showscrumb .sep {
@apply text-[#cfcfcf] select-none;
}
.showscrumb .cur {
@apply text-[#999];
}
.showsh1 {
@apply text-[clamp(40px,6vw,72px)] leading-[0.9] font-black tracking-[-0.02em] my-0 mb-[10px];
}
@ -554,7 +544,7 @@ if (!yearChips.length) yearChips = yearSeed
<script>
import Alpine from "alpinejs"
import { getArticles, getBrands, toAbs, type ArticleItem, type BrandEntry } from "../lib/api"
import { getArticles, getBrands, toAbs, type ArticleItem, type BrandEntry } from "@/lib/api"
const ICON_USER = `<svg viewBox="0 0 12 12" width="9" height="9" aria-hidden="true"><circle cx="6" cy="4" r="2" stroke="currentColor" fill="none" stroke-width="1"/><path d="M2 10c0-2 1.8-3 4-3s4 1 4 3" stroke="currentColor" fill="none" stroke-width="1" stroke-linecap="round"/></svg>`
const ICON_DATE = `<svg viewBox="0 0 12 12" width="9" height="9" aria-hidden="true"><rect x="2" y="3" width="8" height="7" stroke="currentColor" fill="none" stroke-width="1"/><path d="M2 6h8M4 2v2M8 2v2" stroke="currentColor" fill="none" stroke-width="1" stroke-linecap="round"/></svg>`

View File

@ -1,6 +1,6 @@
---
import Layout from "../layouts/Layout.astro"
import Contact from "../components/pages/Contact.astro"
import Layout from "@/layouts/Layout.astro"
import Contact from "@/components/pages/Contact.astro"
---
<Layout title="Contact — 暂未上线">

View File

@ -1,6 +1,6 @@
---
import Layout from "../../layouts/Layout.astro"
import About from "../../components/pages/About.astro"
import Layout from "@/layouts/Layout.astro"
import About from "@/components/pages/About.astro"
---
<Layout title="About — 暂未上线">

View File

@ -0,0 +1,8 @@
---
import Layout from "@/layouts/Layout.astro"
import Article from "@/components/pages/article.astro"
---
<Layout>
<Article />
</Layout>

View File

@ -1,6 +1,6 @@
---
import Layout from '../../layouts/Layout.astro'
import Index from '../../components/Index.astro'
import Layout from '@/layouts/Layout.astro'
import Index from '@/components/Index.astro'
---
<Layout>

View File

@ -0,0 +1,5 @@
---
export const prerender = false;
---
123123123

View File

@ -0,0 +1,7 @@
---
import Layout from '@/layouts/Layout.astro'
import RunwayLooks from '@/components/RunwayLooks.astro'
---
<Layout>
</Layout>

View File

@ -1,6 +1,10 @@
---
import Layout from "../../layouts/Layout.astro"
import { getBrands, getYears, type BrandEntry } from "../../lib/api"
import Layout from "@/layouts/Layout.astro"
import Breadcrumb from "@/components/Breadcrumb.astro"
import { getBrands, getYears, type BrandEntry } from "@/lib/api"
import { getI18n } from '@/i18n/utils'
const { locale, t } = getI18n(Astro)
let sidebarBrands: BrandEntry[] = []
let yearChips: number[] = []
@ -24,13 +28,14 @@ if (!yearChips.length) yearChips = yearSeed
<!-- 顶部:极简眉头 -->
<header class="showshead">
<div>
<nav class="showscrumb" aria-label="Breadcrumb">
<a href="/">Home</a>
<span class="sep" aria-hidden="true">/</span>
<a href="/shows">All Shows</a>
<span class="sep" aria-hidden="true">/</span>
<span class="cur" aria-current="page" x-text="crumbYear"></span>
</nav>
<Breadcrumb
items={[
{ label: t('Home'), href: '/' },
{ label: 'Runway Archive', href: '/shows' },
]}
>
<span slot="current" x-text="crumbYear">All shows</span>
</Breadcrumb>
<h1 class="showsh1">All Shows</h1>
</div>
</header>
@ -292,18 +297,6 @@ if (!yearChips.length) yearChips = yearSeed
.showshead {
@apply flex justify-between items-end gap-6 py-5 pb-[26px] ;
}
.showscrumb {
@apply inline-flex items-center gap-[10px] mb-[10px] text-[11px] tracking-[0.18em] uppercase text-[#999] no-underline;
}
.showscrumb a {
@apply text-black no-underline transition-colors duration-150 hover:text-[#888];
}
.showscrumb .sep {
@apply text-[#cfcfcf] select-none;
}
.showscrumb .cur {
@apply text-[#999];
}
.showsh1 {
@apply text-[clamp(40px,6vw,72px)] leading-[0.9] font-black tracking-[-0.02em] my-0 mb-[10px];
}
@ -554,7 +547,7 @@ if (!yearChips.length) yearChips = yearSeed
<script>
import Alpine from "alpinejs"
import { getArticles, getBrands, toAbs, type ArticleItem, type BrandEntry } from "../lib/api"
import { getArticles, getBrands, toAbs, type ArticleItem, type BrandEntry } from "@/lib/api"
const ICON_USER = `<svg viewBox="0 0 12 12" width="9" height="9" aria-hidden="true"><circle cx="6" cy="4" r="2" stroke="currentColor" fill="none" stroke-width="1"/><path d="M2 10c0-2 1.8-3 4-3s4 1 4 3" stroke="currentColor" fill="none" stroke-width="1" stroke-linecap="round"/></svg>`
const ICON_DATE = `<svg viewBox="0 0 12 12" width="9" height="9" aria-hidden="true"><rect x="2" y="3" width="8" height="7" stroke="currentColor" fill="none" stroke-width="1"/><path d="M2 6h8M4 2v2M8 2v2" stroke="currentColor" fill="none" stroke-width="1" stroke-linecap="round"/></svg>`

View File

@ -2,8 +2,8 @@
// 应该跳转到 /en
import Layout from '../layouts/Layout.astro'
import Index from '../components/Index.astro'
import Layout from '@/layouts/Layout.astro'
import Index from '@/components/Index.astro'
---
<Layout>

View File

@ -1,6 +1,6 @@
---
import Layout from "../layouts/Layout.astro"
import LatestProjects from "../components/pages/LatestProjects.astro"
import Layout from "@/layouts/Layout.astro"
import LatestProjects from "@/components/pages/LatestProjects.astro"
---
<Layout title="Latest Projects — 暂未上线">

View File

@ -1,6 +1,6 @@
---
import Layout from "../layouts/Layout.astro"
import Login from "../components/pages/Login.astro"
import Layout from "@/layouts/Layout.astro"
import Login from "@/components/pages/Login.astro"
---
<Layout title="Sign In — 暂未上线">

View File

@ -1,6 +1,6 @@
---
import Layout from "../layouts/Layout.astro"
import Portfolio from "../components/pages/Portfolio.astro"
import Layout from "@/layouts/Layout.astro"
import Portfolio from "@/components/pages/Portfolio.astro"
---
<Layout title="Portfolio — 暂未上线">

View File

@ -1,6 +1,6 @@
---
import Layout from "../layouts/Layout.astro"
import Register from "../components/pages/Register.astro"
import Layout from "@/layouts/Layout.astro"
import Register from "@/components/pages/Register.astro"
---
<Layout title="Create Account — 暂未上线">

View File

@ -1,6 +1,7 @@
---
import Layout from "../layouts/Layout.astro"
import { getBrands, getYears, type BrandEntry } from "../lib/api"
import Layout from "@/layouts/Layout.astro"
import Breadcrumb from "@/components/Breadcrumb.astro"
import { getBrands, getYears, type BrandEntry } from "@/lib/api"
let sidebarBrands: BrandEntry[] = []
let yearChips: number[] = []
@ -33,13 +34,14 @@ if (!yearChips.length) yearChips = yearSeed
<!-- 顶部:极简眉头 -->
<header class="showshead">
<div>
<nav class="showscrumb" aria-label="Breadcrumb">
<a href="/">Home</a>
<span class="sep" aria-hidden="true">/</span>
<a href="/shows">Runway Archive</a>
<span class="sep" aria-hidden="true">/</span>
<span class="cur" aria-current="page" x-text="crumbYear"></span>
</nav>
<Breadcrumb
items={[
{ label: 'Home', href: '/' },
{ label: 'Runway Archive', href: '/shows' },
]}
>
<span slot="current" x-text="crumbYear">2026 Edition</span>
</Breadcrumb>
<h1 class="showsh1">All Shows</h1>
</div>
</header>
@ -253,18 +255,6 @@ if (!yearChips.length) yearChips = yearSeed
.showshead {
@apply flex justify-between items-end gap-6 py-5 pb-[26px] ;
}
.showscrumb {
@apply inline-flex items-center gap-[10px] mb-[10px] text-[11px] tracking-[0.18em] uppercase text-[#999] no-underline;
}
.showscrumb a {
@apply text-black no-underline transition-colors duration-150 hover:text-[#888];
}
.showscrumb .sep {
@apply text-[#cfcfcf] select-none;
}
.showscrumb .cur {
@apply text-[#999];
}
.showsh1 {
@apply text-[clamp(40px,6vw,72px)] leading-[0.9] font-black tracking-[-0.02em] my-0 mb-[10px];
}
@ -483,7 +473,7 @@ if (!yearChips.length) yearChips = yearSeed
<script>
import Alpine from "alpinejs"
import { getArticles, toAbs, type ArticleItem, type BrandEntry } from "../lib/api"
import { getArticles, toAbs, type ArticleItem, type BrandEntry } from "@/lib/api"
const ICON_USER = `<svg viewBox="0 0 12 12" width="9" height="9" aria-hidden="true"><circle cx="6" cy="4" r="2" stroke="currentColor" fill="none" stroke-width="1"/><path d="M2 10c0-2 1.8-3 4-3s4 1 4 3" stroke="currentColor" fill="none" stroke-width="1" stroke-linecap="round"/></svg>`
const ICON_DATE = `<svg viewBox="0 0 12 12" width="9" height="9" aria-hidden="true"><rect x="2" y="3" width="8" height="7" stroke="currentColor" fill="none" stroke-width="1"/><path d="M2 6h8M4 2v2M8 2v2" stroke="currentColor" fill="none" stroke-width="1" stroke-linecap="round"/></svg>`