mirror of
https://github.com/afoim/fuwari.git
synced 2026-01-31 09:03:18 +08:00
- 新增 NoticeConfig 类型和公告组件 Announcement.astro,支持可配置的公告显示 - 移除未使用的 assets 集合和 React 相关依赖,简化项目结构 - 更新依赖项从 dependencies 移动到 devDependencies,优化包管理 - 移除赞助页面的加密货币相关代码,清理界面 - 调整搜索组件样式,改善视觉一致性
125 lines
5.4 KiB
Plaintext
125 lines
5.4 KiB
Plaintext
---
|
|
import Footer from "@components/Footer.astro";
|
|
import Navbar from "@components/Navbar.astro";
|
|
import BackToTop from "@components/control/BackToTop.astro";
|
|
import SideBar from "@components/widget/SideBar.astro";
|
|
import type { MarkdownHeading } from "astro";
|
|
import { Icon } from "astro-icon/components";
|
|
import ImageWrapper from "../components/misc/ImageWrapper.astro";
|
|
import TOC from "../components/widget/TOC.astro";
|
|
import Announcement from "../components/widget/Announcement.astro";
|
|
import { siteConfig } from "../config";
|
|
import {
|
|
BANNER_HEIGHT,
|
|
BANNER_HEIGHT_EXTEND,
|
|
MAIN_PANEL_OVERLAPS_BANNER_HEIGHT,
|
|
} from "../constants/constants";
|
|
import Layout from "./Layout.astro";
|
|
|
|
interface Props {
|
|
title?: string;
|
|
banner?: string;
|
|
description?: string;
|
|
lang?: string;
|
|
setOGTypeArticle?: boolean;
|
|
headings?: MarkdownHeading[];
|
|
}
|
|
|
|
const {
|
|
title,
|
|
banner,
|
|
description,
|
|
lang,
|
|
setOGTypeArticle,
|
|
headings = [],
|
|
} = Astro.props;
|
|
const hasBannerCredit =
|
|
siteConfig.banner.enable && siteConfig.banner.credit.enable;
|
|
const hasBannerLink = !!siteConfig.banner.credit.url;
|
|
|
|
const mainPanelTop = siteConfig.banner.enable
|
|
? `calc(${BANNER_HEIGHT}vh - ${MAIN_PANEL_OVERLAPS_BANNER_HEIGHT}rem)`
|
|
: "5.5rem";
|
|
---
|
|
|
|
<Layout title={title} banner={banner} description={description} lang={lang} setOGTypeArticle={setOGTypeArticle}>
|
|
|
|
<!-- Navbar -->
|
|
<slot slot="head" name="head"></slot>
|
|
<div id="top-row" class="z-50 pointer-events-none relative transition-all duration-700 max-w-[var(--page-width)] px-4 md:px-4 mx-auto" class:list={[""]}>
|
|
<div id="navbar-wrapper" class="pointer-events-auto sticky top-0 transition-all">
|
|
<Navbar></Navbar>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Banner -->
|
|
{siteConfig.banner.enable && <div id="banner-wrapper" class=`absolute z-10 w-full transition duration-700 overflow-hidden` style=`top: -${BANNER_HEIGHT_EXTEND}vh`>
|
|
<ImageWrapper id="banner" alt="Banner image of the blog" class:list={["object-cover h-full transition duration-700 opacity-0 scale-105"]}
|
|
src={siteConfig.banner.src} position={siteConfig.banner.position}
|
|
>
|
|
</ImageWrapper>
|
|
</div>}
|
|
|
|
<!-- Main content -->
|
|
<div class="absolute w-full z-30 pointer-events-none" style=`top: ${mainPanelTop}`>
|
|
<!-- The pointer-events-none here prevent blocking the click event of the TOC -->
|
|
<div class="relative max-w-[var(--page-width)] mx-auto pointer-events-auto">
|
|
<div id="main-grid" class="transition duration-700 w-full left-0 right-0 grid grid-cols-[17.5rem_auto] grid-rows-[auto_auto_auto] lg:grid-rows-[auto_1fr]
|
|
mx-auto gap-4 px-4 md:px-4"
|
|
>
|
|
<!-- Banner image credit -->
|
|
{hasBannerCredit && <a href={siteConfig.banner.credit.url} id="banner-credit" target="_blank" rel="noopener" aria-label="Visit image source"
|
|
class:list={["group onload-animation transition-all absolute flex justify-center items-center rounded-full " +
|
|
"px-3 right-4 -top-[3.25rem] bg-black/60 hover:bg-black/70 h-9", {"hover:pr-9 active:bg-black/80": hasBannerLink}]}
|
|
>
|
|
<Icon class="text-white/75 text-[1.25rem] mr-1" name="material-symbols:copyright-outline-rounded" ></Icon>
|
|
<div class="text-white/75 text-xs">{siteConfig.banner.credit.text}</div>
|
|
<Icon class:list={["transition absolute text-[oklch(0.75_0.14_var(--hue))] right-4 text-[0.75rem] opacity-0",
|
|
{"group-hover:opacity-100": hasBannerLink}]}
|
|
name="fa6-solid:arrow-up-right-from-square">
|
|
</Icon>
|
|
</a>}
|
|
|
|
|
|
<SideBar class="mb-4 row-start-2 col-span-2 lg:row-start-1 lg:col-span-1 lg:max-w-[17.5rem] onload-animation" headings={headings}></SideBar>
|
|
|
|
<main id="swup-container" class="transition-swup-fade row-start-1 col-span-2 lg:row-start-1 lg:col-span-1 overflow-visible min-w-0">
|
|
<div id="content-wrapper" class="onload-animation">
|
|
<!-- the overflow-hidden here prevent long text break the layout-->
|
|
<!-- make id different from windows.swup global property -->
|
|
<Announcement></Announcement>
|
|
<slot></slot>
|
|
</div>
|
|
</main>
|
|
|
|
<div class="footer col-span-2 row-start-3 lg:col-span-1 lg:col-start-2 lg:row-start-2 onload-animation">
|
|
<Footer></Footer>
|
|
</div>
|
|
</div>
|
|
|
|
<BackToTop></BackToTop>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- The things that should be under the banner, only the TOC for now -->
|
|
<div class="absolute w-full z-0 hidden 2xl:block">
|
|
<div class="relative max-w-[var(--page-width)] mx-auto">
|
|
<!-- TOC component -->
|
|
{siteConfig.toc.enable && <div id="toc-wrapper" class:list={["hidden lg:block transition absolute top-0 -right-[var(--toc-width)] w-[var(--toc-width)] flex items-center",
|
|
{"toc-hide": siteConfig.banner.enable}]}
|
|
>
|
|
<div id="toc-inner-wrapper" class="fixed top-14 w-[var(--toc-width)] h-[calc(100vh_-_20rem)] overflow-y-scroll overflow-x-hidden hide-scrollbar">
|
|
<div id="toc" class="w-full h-full transition-swup-fade ">
|
|
<div class="h-8 w-full"></div>
|
|
<TOC headings={headings}></TOC>
|
|
<div class="h-8 w-full"></div>
|
|
</div>
|
|
</div>
|
|
</div>}
|
|
|
|
<!-- #toc needs to exist for Swup to work normally -->
|
|
{!siteConfig.toc.enable && <div id="toc"></div>}
|
|
</div>
|
|
</div>
|
|
</Layout>
|