trnovel 0.17.0

Terminal reader for novel
---
// 演示画廊:横向 scroll-snap,真实界面录屏(VHS GIF)+ 一行功能性说明。
// 用原生 <img>(而非 astro:assets <Image>)以保留 GIF 动画,不被 sharp 处理成静帧。
import readGif from "../../assets/guides/read.gif";
import networkGif from "../../assets/guides/network-read.gif";
import themeGif from "../../assets/guides/theme.gif";
import loginGif from "../../assets/guides/login.gif";

const shots = [
	{ img: readGif, title: "沉浸式阅读", desc: "正文分页流畅,目录随时跳转,命名主题全局生效。" },
	{ img: networkGif, title: "网络小说在线读", desc: "分类浏览、详情、阅读一气呵成。" },
	{ img: themeGif, title: "主题随心配", desc: "命名主题驱动全局配色,终端背景或主题背景随时切换。" },
	{ img: loginGif, title: "需登录的书源", desc: "表单 / 浏览器登录,登录态加密保存自动复用。" },
];
---

<div class="tn-gallery">
	{
		shots.map((s) => (
			<figure>
				<div class="crop">
					<img src={s.img.src} width={s.img.width} height={s.img.height} alt={s.title} loading="lazy" />
				</div>
				<figcaption>
					<strong>{s.title}</strong>
					<span>{s.desc}</span>
				</figcaption>
			</figure>
		))
	}
</div>

<style>
	.tn-gallery {
		display: flex;
		gap: 1.25rem;
		margin-top: 2rem;
		overflow-x: auto;
		scroll-snap-type: x mandatory;
		padding-bottom: 0.75rem;
		scrollbar-width: thin;
	}

	figure {
		flex: 0 0 min(560px, 86%);
		margin: 0;
		scroll-snap-align: start;
	}

	.crop {
		overflow: hidden;
		border: 1px solid var(--tn-border);
		border-radius: 12px;
		background: #1e1e2e;
	}

	.crop img {
		display: block;
		width: 100%;
		height: auto;
	}

	figcaption {
		display: flex;
		flex-direction: column;
		gap: 0.15rem;
		margin-top: 0.75rem;
	}

	figcaption strong {
		font-size: 0.95rem;
		color: var(--sl-color-white);
	}

	figcaption span {
		font-size: 0.85rem;
		color: var(--sl-color-gray-3);
	}
</style>