@trapar-waves/react-tailwind 1.1.23 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/eslint.config.js +6 -0
- package/package.json +22 -18
- package/pnpm-workspace.yaml +4 -0
- package/rsbuild.config.ts +44 -0
- package/src/App.css +64 -1
- package/src/App.tsx +160 -4
- package/src/index.tsx +1 -1
package/README.md
CHANGED
|
@@ -23,6 +23,22 @@
|
|
|
23
23
|
- **Focus on Code Quality:** Includes ESLint with `@antfu/eslint-config` for linting and enforcing best practices in the codebase.
|
|
24
24
|
- **Git Hooks:** Integrated `husky` and `lint-staged` for pre-commit checks.
|
|
25
25
|
|
|
26
|
+
## GitHub Pages
|
|
27
|
+
|
|
28
|
+
Pushing a version tag matching `v*` runs [`.github/workflows/pages.yml`](./.github/workflows/pages.yml), which builds with `BASE_PATH=/<repository-name>/`, copies `dist/index.html` to `dist/404.html` for SPA routing, and deploys to GitHub Pages. In the repository **Settings → Pages**, set **Source** to **GitHub Actions** once.
|
|
29
|
+
|
|
30
|
+
Local subpath check (Unix-like shell):
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
BASE_PATH=/react-tailwind/ pnpm run build && pnpm preview
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
PowerShell:
|
|
37
|
+
|
|
38
|
+
```powershell
|
|
39
|
+
$env:BASE_PATH="/react-tailwind/"; pnpm run build; pnpm preview
|
|
40
|
+
```
|
|
41
|
+
|
|
26
42
|
## 💻 Tech Stack
|
|
27
43
|
|
|
28
44
|
- **Framework/Library:** React (v19)
|
package/eslint.config.js
CHANGED
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trapar-waves/react-tailwind",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.
|
|
5
|
-
"packageManager": "pnpm@10.
|
|
4
|
+
"version": "1.2.0",
|
|
5
|
+
"packageManager": "pnpm@10.33.2",
|
|
6
6
|
"description": "A modern UI development template integrating React and Tailwind CSS, with Rsbuild, TypeScript, ESLint (Antfu config), and Iconify support.",
|
|
7
7
|
"author": {
|
|
8
8
|
"email": "admin@rikka.cc",
|
|
@@ -32,31 +32,35 @@
|
|
|
32
32
|
"scripts": {
|
|
33
33
|
"dev": "rsbuild dev --open",
|
|
34
34
|
"build": "rsbuild build",
|
|
35
|
+
"build:rsdoctor": "cross-env RSDOCTOR=true rsbuild build",
|
|
35
36
|
"preview": "rsbuild preview",
|
|
36
37
|
"lint": "eslint . --cache --max-warnings=0 --no-warn-ignored",
|
|
37
38
|
"postinstall": "husky"
|
|
38
39
|
},
|
|
39
40
|
"dependencies": {
|
|
40
|
-
"react": "^19.2.
|
|
41
|
-
"react-dom": "^19.2.
|
|
41
|
+
"react": "^19.2.5",
|
|
42
|
+
"react-dom": "^19.2.5"
|
|
42
43
|
},
|
|
43
44
|
"devDependencies": {
|
|
44
|
-
"@antfu/eslint-config": "^
|
|
45
|
-
"@eslint-react/eslint-plugin": "^
|
|
46
|
-
"@iconify/json": "^2.2.
|
|
47
|
-
"@iconify/tailwind4": "^1.2.
|
|
48
|
-
"@rsbuild/core": "^
|
|
49
|
-
"@rsbuild/plugin-react": "^
|
|
50
|
-
"@
|
|
45
|
+
"@antfu/eslint-config": "^8.2.0",
|
|
46
|
+
"@eslint-react/eslint-plugin": "^3.0.0",
|
|
47
|
+
"@iconify/json": "^2.2.467",
|
|
48
|
+
"@iconify/tailwind4": "^1.2.3",
|
|
49
|
+
"@rsbuild/core": "^2.0.1",
|
|
50
|
+
"@rsbuild/plugin-react": "^2.0.0",
|
|
51
|
+
"@rsdoctor/rspack-plugin": "^1.5.9",
|
|
52
|
+
"@tailwindcss/postcss": "^4.2.4",
|
|
51
53
|
"@types/react": "^19.2.14",
|
|
52
54
|
"@types/react-dom": "^19.2.3",
|
|
53
|
-
"
|
|
54
|
-
"eslint
|
|
55
|
-
"eslint-plugin-
|
|
56
|
-
"eslint-plugin-react-
|
|
55
|
+
"cross-env": "^10.1.0",
|
|
56
|
+
"eslint": "^10.2.1",
|
|
57
|
+
"eslint-plugin-format": "^2.0.1",
|
|
58
|
+
"eslint-plugin-react-hooks": "^7.1.1",
|
|
59
|
+
"eslint-plugin-react-refresh": "^0.5.2",
|
|
57
60
|
"husky": "^9.1.7",
|
|
58
|
-
"lint-staged": "^16.
|
|
59
|
-
"tailwindcss": "^4.2.
|
|
60
|
-
"typescript": "^
|
|
61
|
+
"lint-staged": "^16.4.0",
|
|
62
|
+
"tailwindcss": "^4.2.4",
|
|
63
|
+
"typescript": "^6.0.3",
|
|
64
|
+
"unplugin-turbo-console": "^2.3.1"
|
|
61
65
|
}
|
|
62
66
|
}
|
package/pnpm-workspace.yaml
CHANGED
package/rsbuild.config.ts
CHANGED
|
@@ -1,8 +1,35 @@
|
|
|
1
|
+
import process from "node:process";
|
|
1
2
|
import { defineConfig } from "@rsbuild/core";
|
|
2
3
|
import { pluginReact } from "@rsbuild/plugin-react";
|
|
4
|
+
import { RsdoctorRspackPlugin } from "@rsdoctor/rspack-plugin";
|
|
3
5
|
import tailwind from "@tailwindcss/postcss";
|
|
6
|
+
import TurboConsole from "unplugin-turbo-console/rspack";
|
|
7
|
+
|
|
8
|
+
function normalizeBasePath(): string {
|
|
9
|
+
const raw = process.env.BASE_PATH?.trim();
|
|
10
|
+
if (!raw || raw === "/") {
|
|
11
|
+
return "/";
|
|
12
|
+
}
|
|
13
|
+
const prefixed = raw.startsWith("/") ? raw : `/${raw}`;
|
|
14
|
+
return prefixed.endsWith("/") ? prefixed : `${prefixed}/`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const basePath = normalizeBasePath();
|
|
18
|
+
const useSubpath = basePath !== "/";
|
|
19
|
+
|
|
20
|
+
const enableRsdoctor = Boolean(process.env.RSDOCTOR);
|
|
21
|
+
const enableTurboConsole = process.env.NODE_ENV === "development";
|
|
4
22
|
|
|
5
23
|
export default defineConfig({
|
|
24
|
+
...(useSubpath
|
|
25
|
+
? {
|
|
26
|
+
server: { base: basePath },
|
|
27
|
+
output: { assetPrefix: basePath },
|
|
28
|
+
}
|
|
29
|
+
: {}),
|
|
30
|
+
performance: {
|
|
31
|
+
...(enableRsdoctor ? { buildCache: false } : {}),
|
|
32
|
+
},
|
|
6
33
|
plugins: [pluginReact()],
|
|
7
34
|
tools: {
|
|
8
35
|
postcss: {
|
|
@@ -10,5 +37,22 @@ export default defineConfig({
|
|
|
10
37
|
plugins: [tailwind],
|
|
11
38
|
},
|
|
12
39
|
},
|
|
40
|
+
rspack: {
|
|
41
|
+
plugins: [
|
|
42
|
+
...(enableTurboConsole ? [TurboConsole()] : []),
|
|
43
|
+
...(enableRsdoctor
|
|
44
|
+
? [
|
|
45
|
+
new RsdoctorRspackPlugin({
|
|
46
|
+
output: {
|
|
47
|
+
mode: "brief",
|
|
48
|
+
options: {
|
|
49
|
+
type: ["json"],
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
}),
|
|
53
|
+
]
|
|
54
|
+
: []),
|
|
55
|
+
],
|
|
56
|
+
},
|
|
13
57
|
},
|
|
14
58
|
});
|
package/src/App.css
CHANGED
|
@@ -1,2 +1,65 @@
|
|
|
1
|
-
@import
|
|
1
|
+
@import url("https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Outfit:wght@400;500;600&display=swap");
|
|
2
|
+
|
|
3
|
+
@import "tailwindcss";
|
|
2
4
|
@plugin "@iconify/tailwind4";
|
|
5
|
+
|
|
6
|
+
@theme {
|
|
7
|
+
--font-display: "Instrument Serif", ui-serif, Georgia, serif;
|
|
8
|
+
--font-sans: "Outfit", system-ui, sans-serif;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
@media (prefers-reduced-motion: reduce) {
|
|
12
|
+
*,
|
|
13
|
+
*::before,
|
|
14
|
+
*::after {
|
|
15
|
+
animation-duration: 0.01ms !important;
|
|
16
|
+
animation-iteration-count: 1 !important;
|
|
17
|
+
transition-duration: 0.01ms !important;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.skip-link {
|
|
22
|
+
position: absolute;
|
|
23
|
+
left: 0.75rem;
|
|
24
|
+
top: 0.75rem;
|
|
25
|
+
z-index: 50;
|
|
26
|
+
padding: 0.5rem 1rem;
|
|
27
|
+
border-radius: 0.375rem;
|
|
28
|
+
background: #0f172a;
|
|
29
|
+
color: #f8fafc;
|
|
30
|
+
font-weight: 600;
|
|
31
|
+
font-size: 0.875rem;
|
|
32
|
+
text-decoration: none;
|
|
33
|
+
transform: translateY(-200%);
|
|
34
|
+
transition: transform 200ms ease-out;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.skip-link:focus {
|
|
38
|
+
transform: translateY(0);
|
|
39
|
+
outline: 3px solid #f97316;
|
|
40
|
+
outline-offset: 2px;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.hero-grid {
|
|
44
|
+
background-image:
|
|
45
|
+
linear-gradient(rgba(15, 23, 42, 0.04) 1px, transparent 1px),
|
|
46
|
+
linear-gradient(90deg, rgba(15, 23, 42, 0.04) 1px, transparent 1px);
|
|
47
|
+
background-size: 48px 48px;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.trapar-tech-icon {
|
|
51
|
+
display: inline-flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
justify-content: center;
|
|
54
|
+
width: 2.75rem;
|
|
55
|
+
height: 2.75rem;
|
|
56
|
+
border-radius: 0.75rem;
|
|
57
|
+
background: rgba(255, 255, 255, 0.95);
|
|
58
|
+
border: 1px solid rgba(234, 88, 12, 0.2);
|
|
59
|
+
flex-shrink: 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.trapar-tech-icon span[class^="icon-"] {
|
|
63
|
+
font-size: 1.5rem;
|
|
64
|
+
line-height: 1;
|
|
65
|
+
}
|
package/src/App.tsx
CHANGED
|
@@ -1,11 +1,167 @@
|
|
|
1
1
|
import "./App.css";
|
|
2
2
|
|
|
3
|
+
const HOMEPAGE = "https://github.com/Trapar-waves/react-tailwind";
|
|
4
|
+
const LOGOS_SET_URL = "https://icon-sets.iconify.design/logos/";
|
|
5
|
+
|
|
6
|
+
interface TechItem {
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
hint: string;
|
|
10
|
+
iconClass: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const techStack: TechItem[] = [
|
|
14
|
+
{ id: "react", label: "React 19", hint: "组件驱动、声明式 UI", iconClass: "icon-[logos--react]" },
|
|
15
|
+
{ id: "ts", label: "TypeScript", hint: "静态类型与编辑器体验", iconClass: "icon-[logos--typescript-icon]" },
|
|
16
|
+
{ id: "tailwind", label: "Tailwind CSS 4", hint: "tailwindcss · @tailwindcss/postcss", iconClass: "icon-[logos--tailwindcss-icon]" },
|
|
17
|
+
{ id: "rsbuild", label: "Rsbuild", hint: "@rsbuild/core · @rsbuild/plugin-react", iconClass: "icon-[material-icon-theme--rstack]" },
|
|
18
|
+
{ id: "eslint", label: "ESLint", hint: "@antfu/eslint-config", iconClass: "icon-[logos--eslint]" },
|
|
19
|
+
{ id: "iconify", label: "Iconify", hint: "@iconify/json · @iconify/tailwind4(含 logos)", iconClass: "icon-[logos--markdown]" },
|
|
20
|
+
{ id: "pnpm", label: "pnpm", hint: "包管理与 CI 缓存", iconClass: "icon-[logos--pnpm]" },
|
|
21
|
+
{ id: "node", label: "Node.js", hint: "本地开发与构建", iconClass: "icon-[logos--nodejs-icon]" },
|
|
22
|
+
{ id: "github", label: "GitHub Actions", hint: "Release 与 Pages 工作流", iconClass: "icon-[logos--github-icon]" },
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
const readmeFeatures: string[] = [
|
|
26
|
+
"基于 React 19 的组件化界面。",
|
|
27
|
+
"Tailwind CSS v4 与 @tailwindcss/postcss,工具类优先、易迭代。",
|
|
28
|
+
"Rsbuild 提供极速开发与优化构建。",
|
|
29
|
+
"@iconify/json 与 @iconify/tailwind4,支持 logos 等多集合矢量图标。",
|
|
30
|
+
"TypeScript 贯穿模板代码。",
|
|
31
|
+
"@antfu/eslint-config 统一代码风格与规则。",
|
|
32
|
+
"Husky 与 lint-staged 在提交前执行检查。",
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
const readmeTechNote = "本模板未内置路由或全局状态;可按业务接入 TanStack Router、Zustand 等,与 README「扩展」章节一致。";
|
|
36
|
+
|
|
3
37
|
function App() {
|
|
4
38
|
return (
|
|
5
|
-
<div className="bg-
|
|
6
|
-
<
|
|
7
|
-
|
|
8
|
-
|
|
39
|
+
<div className="min-h-dvh bg-[#faf8f5] text-slate-900 font-sans antialiased">
|
|
40
|
+
<a href="#main" className="skip-link">
|
|
41
|
+
跳到主要内容
|
|
42
|
+
</a>
|
|
43
|
+
<div className="hero-grid relative overflow-hidden border-b border-slate-200/80">
|
|
44
|
+
<div
|
|
45
|
+
className="pointer-events-none absolute -right-24 top-0 h-72 w-72 rounded-full bg-orange-500/15 blur-3xl motion-safe:animate-[pulse_14s_ease-in-out_infinite]"
|
|
46
|
+
aria-hidden
|
|
47
|
+
/>
|
|
48
|
+
<header className="relative mx-auto max-w-5xl px-6 pb-16 pt-14 sm:px-10 sm:pb-20 sm:pt-20">
|
|
49
|
+
<p className="font-mono text-xs font-medium uppercase tracking-[0.2em] text-orange-700">
|
|
50
|
+
Trapar-waves / react-tailwind
|
|
51
|
+
</p>
|
|
52
|
+
<h1 className="mt-4 max-w-3xl font-display text-4xl font-normal leading-tight text-slate-950 sm:text-5xl">
|
|
53
|
+
Rsbuild、React 19 与 Tailwind CSS 4 的轻量起点
|
|
54
|
+
</h1>
|
|
55
|
+
<p className="mt-6 max-w-2xl text-lg leading-relaxed text-slate-600">
|
|
56
|
+
本页结合 README 特性与
|
|
57
|
+
{" "}
|
|
58
|
+
<a
|
|
59
|
+
href={LOGOS_SET_URL}
|
|
60
|
+
target="_blank"
|
|
61
|
+
rel="noreferrer"
|
|
62
|
+
className="font-semibold text-orange-800 underline decoration-orange-300 underline-offset-2 hover:text-orange-950"
|
|
63
|
+
>
|
|
64
|
+
Iconify logos
|
|
65
|
+
</a>
|
|
66
|
+
{" "}
|
|
67
|
+
集合展示技术栈;保留 @theme 字体、跳过链接与减少动效等可访问实践。
|
|
68
|
+
</p>
|
|
69
|
+
<div className="mt-10 flex flex-wrap items-center gap-4">
|
|
70
|
+
<a
|
|
71
|
+
href={HOMEPAGE}
|
|
72
|
+
className="inline-flex min-h-11 min-w-11 items-center justify-center rounded-full bg-slate-900 px-8 py-3 text-sm font-semibold text-white shadow-lg shadow-slate-900/15 transition hover:bg-slate-800 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-orange-500"
|
|
73
|
+
>
|
|
74
|
+
查看模板仓库
|
|
75
|
+
</a>
|
|
76
|
+
<span className="icon-[logos--react] text-3xl text-sky-700" aria-hidden />
|
|
77
|
+
<span className="icon-[logos--tailwindcss-icon] text-3xl text-cyan-700" aria-hidden />
|
|
78
|
+
<span className="icon-[material-icon-theme--rstack] text-3xl text-amber-800" aria-hidden />
|
|
79
|
+
</div>
|
|
80
|
+
</header>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<main id="main" className="mx-auto max-w-5xl px-6 py-14 sm:px-10">
|
|
84
|
+
<h2 className="font-display text-2xl text-slate-900">技术栈一览</h2>
|
|
85
|
+
<p className="mt-2 max-w-3xl text-sm leading-relaxed text-slate-600">
|
|
86
|
+
Rsbuild 与 Rspack 生态相关示意使用
|
|
87
|
+
{" "}
|
|
88
|
+
<code className="rounded bg-slate-200/80 px-1.5 py-0.5 text-slate-800">material-icon-theme--rstack</code>
|
|
89
|
+
;图标集说明见上文链接。
|
|
90
|
+
</p>
|
|
91
|
+
<ul className="mt-8 grid list-none gap-4 p-0 sm:grid-cols-2 lg:grid-cols-3">
|
|
92
|
+
{techStack.map(item => (
|
|
93
|
+
<li
|
|
94
|
+
key={item.id}
|
|
95
|
+
className="flex gap-4 rounded-2xl border border-slate-200/90 bg-white p-5 shadow-sm"
|
|
96
|
+
>
|
|
97
|
+
<div className="trapar-tech-icon" aria-hidden>
|
|
98
|
+
<span className={item.iconClass} />
|
|
99
|
+
</div>
|
|
100
|
+
<div>
|
|
101
|
+
<h3 className="text-base font-semibold text-slate-900">{item.label}</h3>
|
|
102
|
+
<p className="mt-1 text-sm leading-snug text-slate-600">{item.hint}</p>
|
|
103
|
+
</div>
|
|
104
|
+
</li>
|
|
105
|
+
))}
|
|
106
|
+
</ul>
|
|
107
|
+
|
|
108
|
+
<h2 className="font-display mt-14 text-2xl text-slate-900">README 特性摘要</h2>
|
|
109
|
+
<ul className="mt-4 max-w-3xl list-disc space-y-2 pl-5 text-slate-700">
|
|
110
|
+
{readmeFeatures.map(line => (
|
|
111
|
+
<li key={line}>{line}</li>
|
|
112
|
+
))}
|
|
113
|
+
</ul>
|
|
114
|
+
<p className="mt-4 max-w-3xl text-sm italic text-slate-600">{readmeTechNote}</p>
|
|
115
|
+
|
|
116
|
+
<section className="mt-12 rounded-2xl border border-slate-200/90 bg-white p-6 shadow-sm" aria-labelledby="a11y-heading">
|
|
117
|
+
<h2 id="a11y-heading" className="font-display text-xl text-slate-900">
|
|
118
|
+
图标与可访问性
|
|
119
|
+
</h2>
|
|
120
|
+
<p className="mt-3 max-w-3xl text-sm leading-relaxed text-slate-600">
|
|
121
|
+
装饰性技术标识使用 Iconify
|
|
122
|
+
<code className="mx-1 rounded bg-slate-100 px-1">logos</code>
|
|
123
|
+
集合的矢量类名(与源码中实际 slug 一致),并配合
|
|
124
|
+
<span className="font-medium text-slate-800"> aria-hidden</span>
|
|
125
|
+
;主操作区保持约 44px 触控高度与可见焦点环;系统开启「减少动态效果」时装饰动画会缩短。
|
|
126
|
+
</p>
|
|
127
|
+
<div className="mt-4 flex flex-wrap gap-3">
|
|
128
|
+
<span className="icon-[logos--eslint] text-3xl text-purple-800" aria-hidden />
|
|
129
|
+
<span className="icon-[logos--typescript-icon] text-3xl text-blue-800" aria-hidden />
|
|
130
|
+
<span className="icon-[logos--github-icon] text-3xl text-slate-800" aria-hidden />
|
|
131
|
+
</div>
|
|
132
|
+
</section>
|
|
133
|
+
|
|
134
|
+
<h2 className="font-display mt-14 text-2xl text-slate-900">界面骨架示例</h2>
|
|
135
|
+
<ul className="mt-8 grid gap-6 sm:grid-cols-2">
|
|
136
|
+
<li className="rounded-2xl border border-slate-200/90 bg-white p-6 shadow-sm transition hover:border-orange-200 hover:shadow-md">
|
|
137
|
+
<h3 className="text-lg font-semibold text-slate-900">Tailwind 4 + PostCSS</h3>
|
|
138
|
+
<p className="mt-2 text-slate-600">
|
|
139
|
+
使用 @theme 扩展字体族,配合 @utility 与任意值快速迭代布局与间距体系。
|
|
140
|
+
</p>
|
|
141
|
+
</li>
|
|
142
|
+
<li className="rounded-2xl border border-slate-200/90 bg-white p-6 shadow-sm transition hover:border-orange-200 hover:shadow-md">
|
|
143
|
+
<h3 className="text-lg font-semibold text-slate-900">Iconify 图标</h3>
|
|
144
|
+
<p className="mt-2 text-slate-600">
|
|
145
|
+
通过 @iconify/tailwind4 以原子类方式引用多集合矢量图标,避免 emoji 替代图标。
|
|
146
|
+
</p>
|
|
147
|
+
</li>
|
|
148
|
+
<li className="rounded-2xl border border-slate-200/90 bg-white p-6 shadow-sm transition hover:border-orange-200 hover:shadow-md">
|
|
149
|
+
<h3 className="text-lg font-semibold text-slate-900">可访问与动效</h3>
|
|
150
|
+
<p className="mt-2 text-slate-600">
|
|
151
|
+
首跳链接、可见焦点环,以及在 prefers-reduced-motion 下弱化装饰性动画。
|
|
152
|
+
</p>
|
|
153
|
+
</li>
|
|
154
|
+
<li className="rounded-2xl border border-slate-200/90 bg-white p-6 shadow-sm transition hover:border-orange-200 hover:shadow-md">
|
|
155
|
+
<h3 className="text-lg font-semibold text-slate-900">GitHub Pages</h3>
|
|
156
|
+
<p className="mt-2 text-slate-600">
|
|
157
|
+
通过 BASE_PATH 子路径构建,在推送版本标签时由 Actions 发布静态站点。
|
|
158
|
+
</p>
|
|
159
|
+
</li>
|
|
160
|
+
</ul>
|
|
161
|
+
</main>
|
|
162
|
+
<footer className="border-t border-slate-200/80 bg-white/80 py-8 text-center text-sm text-slate-500">
|
|
163
|
+
MIT · Trapar-waves · 图标致谢 Iconify logos(CC0)
|
|
164
|
+
</footer>
|
|
9
165
|
</div>
|
|
10
166
|
);
|
|
11
167
|
}
|
package/src/index.tsx
CHANGED