feat: add landing page and docs website (#537)

* feat: add landing page and docs website package

Add packages/website — a Vue 3 + Naive UI static site with landing page
and documentation, sharing the Pure Ink monochrome design with the main
app. Features: particle network hero animation, screenshot carousel,
feature grid, install guide tabs, GitHub star history, scroll reveal
animations, and Chinese/English bilingual support.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* chore: add favicon to website package

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix: use dynamic theme param for star history chart

Switch from CSS media query to JS-based dark mode detection so the
star-history SVG matches the current theme toggle state.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix: resolve TypeScript strict mode errors in website components

- Remove unused isDark import in HeroSection
- Add null check for canvas parent element
- Rename unused img loop variable in ScreenshotsSection
- Remove unused NIcon import in SiteHeader

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix: resolve TS narrowing errors in canvas resize closure

Use canvasRef.value directly inside resize() with local null check
instead of relying on outer closure narrowing.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
ekko
2026-05-08 13:36:11 +08:00
committed by GitHub
parent b0e03ae838
commit 9edb76ac64
34 changed files with 2672 additions and 1 deletions
+41
View File
@@ -0,0 +1,41 @@
<script setup lang="ts">
import { useRoute } from 'vue-router'
import DocSidebar from '@/components/docs/DocSidebar.vue'
import DocContent from '@/components/docs/DocContent.vue'
const route = useRoute()
</script>
<template>
<div class="docs-layout">
<DocSidebar v-if="route.meta.page" />
<div class="docs-main">
<router-view />
<DocContent v-if="route.meta.page" />
<div v-else class="docs-placeholder">
<p>Select a section from the sidebar to get started.</p>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
.docs-layout {
display: flex;
max-width: 1120px;
margin: 0 auto;
min-height: calc(100vh - 60px - 200px);
}
.docs-main {
flex: 1;
min-width: 0;
}
.docs-placeholder {
padding: 60px 32px;
color: var(--text-muted);
font-size: 16px;
text-align: center;
}
</style>
@@ -0,0 +1,40 @@
<script setup lang="ts">
import HeroSection from '@/components/landing/HeroSection.vue'
import ScreenshotsSection from '@/components/landing/ScreenshotsSection.vue'
import FeaturesGrid from '@/components/landing/FeaturesGrid.vue'
import InstallSection from '@/components/landing/InstallSection.vue'
import StarHistorySection from '@/components/landing/StarHistorySection.vue'
</script>
<template>
<div class="landing">
<HeroSection />
<ScreenshotsSection />
<FeaturesGrid />
<div class="cta-row">
<InstallSection class="cta-col" />
<StarHistorySection class="cta-col" />
</div>
</div>
</template>
<style scoped lang="scss">
.cta-row {
max-width: 1120px;
margin: 0 auto;
padding: 80px 24px;
display: flex;
gap: 40px;
@media (max-width: $breakpoint-mobile) {
flex-direction: column;
padding: 48px 16px;
gap: 0;
}
}
.cta-col {
flex: 1;
min-width: 0;
}
</style>