change html

This commit is contained in:
2026-08-24 15:37:08 +08:00
parent 3325bc52ef
commit 0487879eee
139 changed files with 9789 additions and 1684 deletions
Vendored
BIN
View File
Binary file not shown.
+3
View File
@@ -1,3 +1,6 @@
node_modules/
dist/
.astro/
.claude/
.vscode/
smartinput/downloads/
+154
View File
@@ -0,0 +1,154 @@
<!DOCTYPE html>
<html lang="zh-CN" data-theme="light" class="site-lang-zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>关于我们|智花 · 五道题</title>
<meta name="description" content="了解五道题(北京)科技有限公司:智花学习与输入产品,以及 MassiveEdit 等效率工具。" />
<link rel="icon" type="image/svg+xml" href="images/logo.svg" />
<link rel="alternate" hreflang="zh-CN" href="about.html" />
<link rel="alternate" hreflang="en" href="en/about.html" />
<link rel="alternate" hreflang="ja" href="ja/about.html" />
<link rel="alternate" hreflang="fr" href="fr/about.html" />
<link rel="alternate" hreflang="x-default" href="about.html" />
<link rel="stylesheet" href="css/site.css" />
<script>
(function () {
try {
var t = localStorage.getItem("theme");
var dark =
t === "dark" ||
(!t && window.matchMedia("(prefers-color-scheme: dark)").matches);
document.documentElement.setAttribute("data-theme", dark ? "dark" : "light");
} catch (_) {}
})();
</script>
</head>
<body>
<div class="page-shell bg-wash">
<header class="site-header">
<div class="container site-nav">
<a class="brand" href="index.html" aria-label="智花首页">
<img class="brand-mark" src="images/logo.svg" alt="" />
<div class="brand-copy">
<strong>智花</strong><span>|</span><span>五道题</span>
</div>
</a>
<nav class="nav-links" aria-label="语言">
<a class="nav-link" href="index.html">首页</a>
<a class="nav-link" href="index.html#products">产品</a>
<a class="nav-link current" href="about.html">关于我们</a>
</nav>
<div class="header-tools">
<details class="lang-switch">
<summary class="locale-pill" aria-label="语言">
<span>中文</span>
<svg width="10" height="10" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>
</summary>
<div class="lang-switch-panel">
<a class="current" href="about.html" hreflang="zh-CN" lang="zh-CN">中文</a>
<a href="en/about.html" hreflang="en" lang="en">English</a>
<a href="ja/about.html" hreflang="ja" lang="ja">日本語</a>
<a href="fr/about.html" hreflang="fr" lang="fr">Français</a>
</div>
</details>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="切换浅色或深色主题" title="切换浅色或深色主题">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
<button class="menu-toggle" type="button" data-menu-toggle aria-expanded="false" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 5h16M4 12h16M4 19h16"/></svg>
</button>
</div>
<div class="container mobile-menu" data-mobile-menu>
<a href="index.html">首页</a>
<a href="index.html#products">产品</a>
<a class="current" href="about.html">关于我们</a>
<div class="mobile-lang">
<p>语言</p>
<a class="current" href="about.html">中文</a>
<a href="en/about.html">English</a>
<a href="ja/about.html">日本語</a>
<a href="fr/about.html">Français</a>
</div>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="切换浅色或深色主题">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
</header>
<main>
<section class="hero home-hero about-hero">
<div class="container">
<p class="home-kicker">智花 · 五道题</p>
<h1 class="hero-title">关于我们</h1>
<p class="home-lead">五道题(北京)科技有限公司开发学习、输入与效率类软件。智花覆盖中文学习与输入;MassiveEdit 面向需要处理超大文本的用户。</p>
</div>
</section>
<section class="section compact">
<div class="container about-stack">
<article class="feature-card">
<h2>企业愿景</h2>
<p>把学习、表达与日常工作里真正费力的环节做成可用的软件。我们希望工具足够清楚、稳定,也愿意长期打磨细节。</p>
</article>
<article class="feature-card">
<h2>我们的使命</h2>
<p>持续交付可落地的产品:学生能完成作业与开口练习,输入更自然,识字写字有路径可循,大文件也能流畅打开与编辑。</p>
</article>
<article class="feature-card">
<h2>品牌故事</h2>
<p>「智花」寓意智慧与文化的共同绽放。五道题是公司主体,「智花」是面向中文学习与输入的产品品牌。我们把语言学、工程与产品迭代放在同一条工作线上。</p>
</article>
<article class="feature-card">
<h2>团队</h2>
<p>团队服务产品研发与持续迭代:做功能、修问题、听反馈。我们不招生、不运营师资加盟,把精力放在软件本身。</p>
</article>
</div>
</section>
<section class="section compact">
<div class="container">
<div class="about-products">
<a href="/smartbuddy/">智花学伴</a>
<a href="/smartinput/">智花输入法</a>
<a href="/smarthanzi/">智花识字</a>
<a href="/massiveedit/">MassiveEdit</a>
</div>
</div>
</section>
</main>
<footer class="site-footer">
<div class="container footer-main">
<div>
<h3>五道题(北京)科技有限公司</h3>
<p>地址:北京市通州区文景街道田府北街6号北配楼1层A-012</p>
<p>邮箱:liutingchao@fivequestions.cn</p>
</div>
<div>
<h3>关于我们</h3>
<div class="footer-links">
<a href="about.html">公司介绍</a>
</div>
</div>
<div>
<h3>产品</h3>
<div class="footer-links">
<a href="/smartbuddy/">智花学伴</a>
<a href="/smartinput/">智花输入法</a>
<a href="/smarthanzi/">智花识字</a>
<a href="/massiveedit/">MassiveEdit</a>
</div>
</div>
</div>
<div class="container footer-bottom">
<p class="footer-legal-line">
© 2026 五道题(北京)科技有限公司 保留所有权利
<a class="footer-icp-link" href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a>
</p>
<p class="footer-trademark">「五道题®」「智花®」为五道题(北京)科技有限公司注册商标;未经许可,他人不得以可能造成相关公众混淆的方式使用。</p>
</div>
</footer>
</div>
<script src="js/site.js"></script>
</body>
</html>
-15
View File
@@ -1,15 +0,0 @@
import { defineConfig } from 'astro/config';
import icon from 'astro-icon';
export default defineConfig({
integrations: [icon()],
compressHTML: true,
build: {
inlineStylesheets: 'auto',
},
vite: {
build: {
cssMinify: 'esbuild',
},
},
});
+745
View File
@@ -0,0 +1,745 @@
@font-face {
font-family: "Manrope";
src: url("../fonts/manrope-latin-400-normal.woff2") format("woff2");
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Manrope";
src: url("../fonts/manrope-latin-700-normal.woff2") format("woff2");
font-weight: 700;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Manrope";
src: url("../fonts/manrope-latin-800-normal.woff2") format("woff2");
font-weight: 800;
font-style: normal;
font-display: swap;
}
:root {
--bg: #fffdfb;
--surface: #ffffff;
--surface-soft: #f8f9fd;
--line: #ece7e2;
--line-strong: #d8dde8;
--text: #2d2a28;
--text-heading: #1f2430;
--muted: #8e8a87;
--muted-strong: #686461;
--brand: #7aa0ff;
--brand-strong: #4b76eb;
--brand-soft: #eef3ff;
--footer: #f4f1ec;
--footer-heading: #1f2430;
--footer-muted: #6f6b68;
--footer-faint: #948f8b;
--footer-line: #e6e1db;
--header-bg: rgba(255, 253, 251, 0.9);
--nav-link: #44423f;
--shadow-card: 0 14px 48px rgba(43, 53, 84, 0.08);
--radius-lg: 24px;
--content: 1320px;
--nav-h: 104px;
color-scheme: light;
}
[data-theme="dark"] {
--bg: #0f1115;
--surface: #171a21;
--surface-soft: #1c2028;
--line: #2a2f3a;
--line-strong: #3d4454;
--text: #e8eaef;
--text-heading: #f1f3f7;
--muted: #8b95a5;
--muted-strong: #aeb6c3;
--brand: #9bb4ff;
--brand-strong: #b8c8ff;
--brand-soft: #252a38;
--footer: #0c0e12;
--footer-heading: #f1f3f7;
--footer-muted: #8a91a0;
--footer-faint: #6d7584;
--footer-line: #2a2f3a;
--header-bg: rgba(15, 17, 21, 0.88);
--nav-link: #c9d0db;
--shadow-card: 0 14px 48px rgba(0, 0, 0, 0.4);
color-scheme: dark;
}
.site-lang-en body,
.site-lang-fr body {
font-family: Manrope, "Segoe UI", system-ui, sans-serif;
}
.site-lang-ja body {
font-family:
Manrope,
"Hiragino Sans",
"Hiragino Kaku Gothic ProN",
"Noto Sans JP",
"PingFang SC",
"Microsoft YaHei",
sans-serif;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
margin: 0;
min-width: 320px;
background: var(--bg);
color: var(--text);
font-family: Manrope, "PingFang SC", "Microsoft YaHei", "Noto Sans SC", sans-serif;
text-rendering: optimizeLegibility;
}
img {
display: block;
max-width: 100%;
}
a {
color: inherit;
text-decoration: none;
}
button {
font: inherit;
}
.page-shell {
position: relative;
overflow-x: clip;
}
.container {
width: min(calc(100% - 48px), var(--content));
margin: 0 auto;
}
.site-header {
position: sticky;
top: 0;
z-index: 100;
background: var(--header-bg);
backdrop-filter: blur(16px);
}
.site-header::after {
content: "";
position: absolute;
inset: auto 0 0;
height: 1px;
background: var(--line);
}
.site-nav {
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
min-height: var(--nav-h);
}
.brand {
display: inline-flex;
align-items: center;
gap: 14px;
min-width: 0;
}
.brand-mark {
width: 34px;
height: 34px;
flex: none;
}
.brand-copy {
display: flex;
align-items: center;
gap: 8px;
white-space: nowrap;
font-size: 24px;
font-weight: 700;
letter-spacing: 0.01em;
color: var(--text-heading);
}
.nav-links {
display: inline-flex;
align-items: center;
gap: 34px;
flex-wrap: wrap;
}
.nav-link {
position: relative;
padding: 8px 0;
font-size: 18px;
font-weight: 700;
color: var(--nav-link);
letter-spacing: 0.04em;
}
.nav-link.current {
color: var(--brand);
}
.nav-link.current::after {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: -10px;
margin: auto;
width: 18px;
height: 2px;
border-radius: 999px;
background: currentColor;
}
.header-tools {
display: inline-flex;
align-items: center;
gap: 12px;
}
.lang-switch {
position: relative;
}
.lang-switch summary {
list-style: none;
cursor: pointer;
}
.lang-switch summary::-webkit-details-marker {
display: none;
}
.lang-switch-panel {
position: absolute;
right: 0;
top: calc(100% + 10px);
min-width: 168px;
padding: 8px;
border-radius: 16px;
border: 1px solid var(--line);
background: var(--surface);
box-shadow: var(--shadow-card);
z-index: 120;
}
.lang-switch-panel a {
display: block;
padding: 10px 12px;
border-radius: 12px;
font-size: 13px;
font-weight: 700;
color: var(--text);
}
.lang-switch-panel a:hover,
.lang-switch-panel a:focus-visible {
background: var(--brand-soft);
color: var(--brand-strong);
}
.lang-switch-panel a.current {
color: var(--brand-strong);
}
.theme-toggle-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 44px;
height: 44px;
border: 1px solid var(--line);
border-radius: 14px;
background: var(--surface);
color: var(--text-heading);
cursor: pointer;
}
.theme-toggle-btn:hover {
border-color: var(--line-strong);
}
.theme-toggle-btn .icon-dark {
display: none;
}
[data-theme="dark"] .theme-toggle-btn .icon-light {
display: none;
}
[data-theme="dark"] .theme-toggle-btn .icon-dark {
display: block;
}
.locale-pill {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 14px;
border: 1px solid var(--line);
border-radius: 999px;
background: var(--surface);
color: var(--muted-strong);
font-size: 12px;
font-weight: 700;
}
.locale-pill svg {
width: 10px;
height: 10px;
flex-shrink: 0;
}
.menu-toggle {
display: none;
align-items: center;
justify-content: center;
width: 46px;
height: 46px;
border: 0;
border-radius: 14px;
background: var(--surface);
box-shadow: 0 8px 24px rgba(49, 50, 56, 0.08);
color: var(--text);
cursor: pointer;
}
.mobile-menu {
display: none;
padding: 0 0 24px;
}
.mobile-menu.is-open {
display: block;
}
.mobile-menu a {
display: block;
padding: 14px 18px;
border-radius: 16px;
font-size: 15px;
font-weight: 700;
}
.mobile-menu a.current {
background: var(--brand-soft);
color: var(--brand-strong);
}
.hero {
padding: 92px 0 60px;
}
.home-hero {
text-align: center;
padding: 72px 0 36px;
}
.home-kicker {
margin: 0 0 16px;
color: var(--brand);
font-size: 13px;
font-weight: 800;
letter-spacing: 0.16em;
}
.home-lead {
max-width: 36em;
margin: 16px auto 0;
color: var(--muted-strong);
font-size: 18px;
line-height: 1.7;
}
.home-hero .hero-actions {
margin-top: 28px;
}
.about-hero {
padding-bottom: 12px;
}
.hero-title {
margin: 0;
color: var(--text-heading);
font-size: clamp(40px, 5vw, 72px);
line-height: 1.15;
font-weight: 800;
letter-spacing: -0.03em;
}
.hero-actions {
display: flex;
justify-content: center;
gap: 18px;
margin-top: 44px;
flex-wrap: wrap;
}
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 10px;
min-height: 48px;
padding: 0 24px;
border-radius: 999px;
border: 1px solid transparent;
font-size: 13px;
font-weight: 800;
letter-spacing: 0.06em;
cursor: pointer;
}
.btn-outline {
border-color: rgba(122, 160, 255, 0.4);
color: var(--brand);
background: rgba(255, 255, 255, 0.72);
}
[data-theme="dark"] .btn-outline {
background: rgba(23, 26, 33, 0.72);
}
.btn-primary {
background: linear-gradient(135deg, #7aa0ff, #5f84ef);
color: #fff;
box-shadow: 0 14px 34px rgba(95, 132, 239, 0.28);
}
.section {
padding: 122px 0;
}
.section.compact {
padding-top: 88px;
padding-bottom: 88px;
}
.section-head {
margin: 0 auto 58px;
text-align: center;
}
.section-title {
margin: 0;
color: var(--text-heading);
font-size: clamp(26px, 3.3vw, 48px);
line-height: 1.18;
letter-spacing: -0.02em;
}
.section-copy {
max-width: 780px;
margin: 22px auto 0;
color: var(--muted-strong);
font-size: 15px;
line-height: 1.95;
}
.grid-two {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 30px;
}
.feature-card {
position: relative;
min-height: 100%;
padding: 34px;
border-radius: var(--radius-lg);
background: var(--surface);
border: 1px solid var(--line);
box-shadow: var(--shadow-card);
}
.feature-card h3 {
margin: 0 0 16px;
color: var(--text-heading);
font-size: 28px;
line-height: 1.22;
letter-spacing: -0.02em;
}
.feature-card p {
margin: 0;
color: var(--muted-strong);
font-size: 15px;
line-height: 1.9;
}
.mini-link {
display: inline-flex;
margin-top: 26px;
color: var(--brand);
font-size: 13px;
font-weight: 800;
letter-spacing: 0.06em;
}
.product-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 30px;
}
.product-kicker {
margin: 0 0 8px;
color: var(--brand);
font-size: 12px;
font-weight: 800;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.product-card .mini-link {
margin-top: 18px;
}
.about-stack {
display: grid;
gap: 18px;
}
.about-stack h2 {
margin: 0 0 10px;
color: var(--text-heading);
font-size: 26px;
}
.about-stack p {
margin: 0;
color: var(--muted-strong);
line-height: 1.8;
}
.about-products {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 10px 18px;
}
.about-products a {
color: var(--brand-strong);
font-weight: 700;
}
.about-products a:hover {
text-decoration: underline;
}
.site-footer {
margin-top: 120px;
background: var(--footer);
color: var(--footer-heading);
border-top: 1px solid var(--footer-line);
}
.footer-main {
display: grid;
grid-template-columns: 1.35fr 0.8fr 0.8fr;
gap: 48px;
padding: 60px 0 40px;
}
.site-footer h3 {
margin: 0 0 18px;
color: var(--footer-heading);
font-size: 18px;
letter-spacing: -0.01em;
}
.site-footer p,
.site-footer a {
color: var(--footer-muted);
font-size: 14px;
line-height: 2;
}
.site-footer a:hover,
.site-footer a:focus-visible {
color: var(--footer-heading);
}
.footer-links {
display: grid;
gap: 6px;
}
.footer-bottom {
border-top: 1px solid var(--footer-line);
padding: 22px 0 30px;
color: var(--footer-faint);
font-size: 12px;
text-align: center;
}
.footer-legal-line {
margin: 0;
line-height: 1.65;
}
.site-footer .footer-icp-link {
color: var(--footer-muted);
text-decoration: underline;
text-underline-offset: 3px;
}
.site-footer .footer-icp-link:hover {
color: var(--footer-heading);
}
.footer-trademark {
margin: 14px auto 0;
max-width: 720px;
color: var(--footer-faint);
font-size: 11px;
line-height: 1.7;
}
.bg-wash {
position: relative;
}
.bg-wash::before {
content: "";
position: absolute;
inset: 0;
background:
radial-gradient(circle at 12% 12%, rgba(122, 160, 255, 0.08), transparent 24%),
radial-gradient(circle at 88% 18%, rgba(242, 136, 119, 0.08), transparent 22%),
radial-gradient(circle at 78% 86%, rgba(122, 160, 255, 0.05), transparent 24%);
pointer-events: none;
}
.bg-wash > * {
position: relative;
}
@media (max-width: 1180px) {
.site-nav {
min-height: 88px;
}
.nav-links,
.lang-switch {
display: none;
}
.mobile-lang {
padding: 8px 0 4px;
margin-top: 8px;
border-top: 1px solid var(--line);
}
.mobile-lang p {
margin: 0 0 8px;
padding: 0 18px;
font-size: 11px;
font-weight: 800;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--muted);
}
.mobile-lang a {
display: block;
padding: 10px 18px;
border-radius: 12px;
font-size: 14px;
font-weight: 700;
}
.mobile-lang a.current {
background: var(--brand-soft);
color: var(--brand-strong);
}
.mobile-menu .theme-toggle-btn {
margin: 12px 18px 0;
width: calc(100% - 36px);
}
.menu-toggle {
display: inline-flex;
}
.product-grid,
.footer-main,
.grid-two {
grid-template-columns: 1fr;
}
}
@media (max-width: 760px) {
:root {
--nav-h: 84px;
}
.container {
width: min(calc(100% - 32px), var(--content));
}
.hero {
padding: 64px 0 32px;
}
.section {
padding: 82px 0;
}
.feature-card {
padding: 26px;
}
.brand-copy {
gap: 6px;
font-size: 24px;
}
.hero-title {
font-size: clamp(28px, 8.4vw, 40px);
overflow-wrap: break-word;
}
.home-lead {
font-size: 17px;
line-height: 1.65;
}
.hero-actions {
flex-direction: column;
align-items: stretch;
}
.btn {
width: 100%;
}
.site-footer {
margin-top: 82px;
}
}
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 MiB

After

Width:  |  Height:  |  Size: 3.7 MiB

+30
View File
@@ -0,0 +1,30 @@
import { defineConfig } from 'astro/config';
import icon from 'astro-icon';
import { productSites } from './scripts/product-sites.mjs';
export default defineConfig({
integrations: [icon(), productSites()],
compressHTML: true,
build: {
inlineStylesheets: 'auto',
},
redirects: {
'/teaching-philosophy': '/',
'/curriculum': '/',
'/faculty': '/',
'/en/teaching-philosophy': '/en',
'/en/curriculum': '/en',
'/en/faculty': '/en',
'/ja/teaching-philosophy': '/ja',
'/ja/curriculum': '/ja',
'/ja/faculty': '/ja',
'/fr/teaching-philosophy': '/fr',
'/fr/curriculum': '/fr',
'/fr/faculty': '/fr',
},
vite: {
build: {
cssMinify: 'esbuild',
},
},
});

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

Before

Width:  |  Height:  |  Size: 2.6 MiB

After

Width:  |  Height:  |  Size: 2.6 MiB

Before

Width:  |  Height:  |  Size: 2.7 MiB

After

Width:  |  Height:  |  Size: 2.7 MiB

View File
View File
+12 -9
View File
@@ -17,15 +17,6 @@
/about/*
Cache-Control: no-cache
/curriculum/*
Cache-Control: no-cache
/faculty/*
Cache-Control: no-cache
/teaching-philosophy/*
Cache-Control: no-cache
/en/*
Cache-Control: no-cache
@@ -34,3 +25,15 @@
/fr/*
Cache-Control: no-cache
/smartbuddy/*
Cache-Control: no-cache
/smartinput/*
Cache-Control: no-cache
/smarthanzi/*
Cache-Control: no-cache
/massiveedit/*
Cache-Control: no-cache

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Before

Width:  |  Height:  |  Size: 355 B

After

Width:  |  Height:  |  Size: 355 B

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Before

Width:  |  Height:  |  Size: 498 B

After

Width:  |  Height:  |  Size: 498 B

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Before

Width:  |  Height:  |  Size: 954 B

After

Width:  |  Height:  |  Size: 954 B

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

View File
+359
View File
@@ -0,0 +1,359 @@
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { en } from "../src/i18n/en.ts";
import { fr } from "../src/i18n/fr.ts";
import { ja } from "../src/i18n/ja.ts";
import { zh } from "../src/i18n/zh.ts";
const root = path.join(path.dirname(fileURLToPath(import.meta.url)), "..");
const outDir = path.join(root, "html");
const copies = { zh, en, ja, fr };
const LANGS = ["zh", "en", "ja", "fr"];
const htmlLang = { zh: "zh-CN", en: "en", ja: "ja", fr: "fr" };
const langLabels = { zh: "中文", en: "English", ja: "日本語", fr: "Français" };
function esc(value) {
return String(value)
.replaceAll("&", "&amp;")
.replaceAll("<", "&lt;")
.replaceAll(">", "&gt;")
.replaceAll('"', "&quot;");
}
function assetPrefix(lang) {
return lang === "zh" ? "" : "../";
}
function pageHref(fromLang, toLang, page) {
const file = page === "home" ? "index.html" : "about.html";
if (fromLang === toLang) return file;
if (fromLang === "zh") return `${toLang}/${file}`;
if (toLang === "zh") return `../${file}`;
return `../${toLang}/${file}`;
}
function productHref(key, lang) {
if (key === "massiveedit" && (lang === "en" || lang === "fr")) {
return "/massiveedit/en/";
}
return `/${key}/`;
}
const ICONS = {
chevron: `<svg width="10" height="10" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>`,
moon: `<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>`,
sun: `<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>`,
menu: `<svg width="22" height="22" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 5h16M4 12h16M4 19h16"/></svg>`,
};
function header(lang, page) {
const L = copies[lang];
const prefix = assetPrefix(lang);
const home = pageHref(lang, lang, "home");
const about = pageHref(lang, lang, "about");
const products = `${home}#products`;
const nav = [
{ label: L.nav.home, href: home, current: page === "home" },
{ label: L.nav.products, href: products, current: false },
{ label: L.nav.about, href: about, current: page === "about" },
];
return `<header class="site-header">
<div class="container site-nav">
<a class="brand" href="${home}" aria-label="${esc(L.brand.ariaHome)}">
<img class="brand-mark" src="${prefix}images/logo.svg" alt="" />
<div class="brand-copy">
<strong>${esc(L.brand.strong)}</strong><span>|</span><span>${esc(L.brand.suffix)}</span>
</div>
</a>
<nav class="nav-links" aria-label="${esc(L.lang.menuLabel)}">
${nav
.map(
(item) =>
`<a class="nav-link${item.current ? " current" : ""}" href="${item.href}">${esc(item.label)}</a>`,
)
.join("\n ")}
</nav>
<div class="header-tools">
<details class="lang-switch">
<summary class="locale-pill" aria-label="${esc(L.lang.menuLabel)}">
<span>${langLabels[lang]}</span>
${ICONS.chevron}
</summary>
<div class="lang-switch-panel">
${LANGS.map((code) => {
const href = pageHref(lang, code, page);
const hreflang = htmlLang[code];
return `<a${code === lang ? ' class="current"' : ""} href="${href}" hreflang="${hreflang}" lang="${hreflang}">${langLabels[code]}</a>`;
}).join("\n ")}
</div>
</details>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="${esc(L.theme.toggle)}" title="${esc(L.theme.toggle)}">
${ICONS.moon}
${ICONS.sun}
</button>
</div>
<button class="menu-toggle" type="button" data-menu-toggle aria-expanded="false" aria-label="Menu">
${ICONS.menu}
</button>
</div>
<div class="container mobile-menu" data-mobile-menu>
${nav
.map(
(item) =>
`<a${item.current ? ' class="current"' : ""} href="${item.href}">${esc(item.label)}</a>`,
)
.join("\n ")}
<div class="mobile-lang">
<p>${esc(L.lang.menuLabel)}</p>
${LANGS.map((code) => {
const href = pageHref(lang, code, page);
return `<a${code === lang ? ' class="current"' : ""} href="${href}">${langLabels[code]}</a>`;
}).join("\n ")}
</div>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="${esc(L.theme.toggle)}">
${ICONS.moon}
${ICONS.sun}
</button>
</div>
</header>`;
}
function footer(lang) {
const L = copies[lang];
return `<footer class="site-footer">
<div class="container footer-main">
<div>
<h3>${esc(L.footer.company)}</h3>
<p>${esc(L.footer.addressLine)}</p>
<p>${esc(L.footer.emailLine)}</p>
</div>
<div>
<h3>${esc(L.footer.colAbout)}</h3>
<div class="footer-links">
<a href="${pageHref(lang, lang, "about")}">${esc(L.footer.linkAbout)}</a>
</div>
</div>
<div>
<h3>${esc(L.footer.colProducts)}</h3>
<div class="footer-links">
<a href="${productHref("smartbuddy", lang)}">${esc(L.footer.linkBuddy)}</a>
<a href="${productHref("smartinput", lang)}">${esc(L.footer.linkInput)}</a>
<a href="${productHref("smarthanzi", lang)}">${esc(L.footer.linkHanzi)}</a>
<a href="${productHref("massiveedit", lang)}">${esc(L.footer.linkEdit)}</a>
</div>
</div>
</div>
<div class="container footer-bottom">
<p class="footer-legal-line">
${esc(L.footer.copyrightMain)}
<a class="footer-icp-link" href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">${esc(L.footer.icpNumber)}</a>
</p>
<p class="footer-trademark">${esc(L.footer.trademarkNotice)}</p>
</div>
</footer>`;
}
function homeMain(lang) {
const L = copies[lang];
const products = [
{
key: "smartbuddy",
name: L.home.productBuddyName,
en: L.home.productBuddyEn,
body: L.home.productBuddyBody,
cta: L.home.productBuddyCta,
},
{
key: "smartinput",
name: L.home.productInputName,
en: L.home.productInputEn,
body: L.home.productInputBody,
cta: L.home.productInputCta,
},
{
key: "smarthanzi",
name: L.home.productHanziName,
en: L.home.productHanziEn,
body: L.home.productHanziBody,
cta: L.home.productHanziCta,
},
{
key: "massiveedit",
name: L.home.productEditName,
en: L.home.productEditEn,
body: L.home.productEditBody,
cta: L.home.productEditCta,
},
];
return `<section class="hero home-hero">
<div class="container">
<p class="home-kicker">${esc(L.brand.strong)} · ${esc(L.brand.suffix)}</p>
<h1 class="hero-title">${esc(L.home.heroTitle)}</h1>
<p class="home-lead">${esc(L.home.heroSubtitle)}</p>
<div class="hero-actions">
<a class="btn btn-primary" href="#products">${esc(L.home.ctaProducts)}</a>
<a class="btn btn-outline" href="${pageHref(lang, lang, "about")}">${esc(L.home.ctaAbout)}</a>
</div>
</div>
</section>
<section class="section compact" id="products">
<div class="container">
<div class="section-head">
<h2 class="section-title">${esc(L.home.productsTitle)}</h2>
<p class="section-copy">${esc(L.home.productsLead)}</p>
</div>
<div class="product-grid">
${products
.map(
(product) => `<article class="feature-card product-card">
<p class="product-kicker">${esc(product.en)}</p>
<h3>${esc(product.name)}</h3>
<p>${esc(product.body)}</p>
<a class="mini-link" href="${productHref(product.key, lang)}">${esc(product.cta)}</a>
</article>`,
)
.join("\n ")}
</div>
</div>
</section>
<section class="section compact" id="company">
<div class="container grid-two company-contact">
<article class="feature-card">
<h3>${esc(L.home.companyTitle)}</h3>
<p>${esc(L.home.companyBody)}</p>
<a class="mini-link" href="${pageHref(lang, lang, "about")}">${esc(L.home.ctaCompany)}</a>
</article>
<article class="feature-card">
<h3>${esc(L.home.contactTitle)}</h3>
<p>${esc(L.home.contactBody)}</p>
<a class="mini-link" href="mailto:liutingchao@fivequestions.cn">${esc(L.home.ctaContact)}</a>
</article>
</div>
</section>`;
}
function aboutMain(lang) {
const L = copies[lang];
return `<section class="hero home-hero about-hero">
<div class="container">
<p class="home-kicker">${esc(L.brand.strong)} · ${esc(L.brand.suffix)}</p>
<h1 class="hero-title">${esc(L.about.heroTitle)}</h1>
<p class="home-lead">${esc(L.about.heroLead)}</p>
</div>
</section>
<section class="section compact">
<div class="container about-stack">
<article class="feature-card">
<h2>${esc(L.about.visionTitle)}</h2>
<p>${esc(L.about.visionBody)}</p>
</article>
<article class="feature-card">
<h2>${esc(L.about.missionTitle)}</h2>
<p>${esc(L.about.missionBody)}</p>
</article>
<article class="feature-card">
<h2>${esc(L.about.storyTitle)}</h2>
<p>${esc(L.about.storyBody)}</p>
</article>
<article class="feature-card">
<h2>${esc(L.about.teamTitle)}</h2>
<p>${esc(L.about.teamBody)}</p>
</article>
</div>
</section>
<section class="section compact">
<div class="container">
<div class="about-products">
<a href="${productHref("smartbuddy", lang)}">${esc(L.footer.linkBuddy)}</a>
<a href="${productHref("smartinput", lang)}">${esc(L.footer.linkInput)}</a>
<a href="${productHref("smarthanzi", lang)}">${esc(L.footer.linkHanzi)}</a>
<a href="${productHref("massiveedit", lang)}">${esc(L.footer.linkEdit)}</a>
</div>
</div>
</section>`;
}
function documentFor(lang, page) {
const L = copies[lang];
const prefix = assetPrefix(lang);
const meta = page === "home" ? L.home : L.about;
const alternates = LANGS.map((code) => {
const href =
code === "zh"
? lang === "zh"
? page === "home"
? "index.html"
: "about.html"
: `../${page === "home" ? "index.html" : "about.html"}`
: lang === "zh"
? `${code}/${page === "home" ? "index.html" : "about.html"}`
: code === lang
? page === "home"
? "index.html"
: "about.html"
: `../${code}/${page === "home" ? "index.html" : "about.html"}`;
return `<link rel="alternate" hreflang="${htmlLang[code]}" href="${href}" />`;
}).join("\n ");
const defaultHref =
lang === "zh"
? page === "home"
? "index.html"
: "about.html"
: `../${page === "home" ? "index.html" : "about.html"}`;
return `<!DOCTYPE html>
<html lang="${htmlLang[lang]}" data-theme="light" class="site-lang-${lang}">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${esc(meta.metaTitle)}</title>
<meta name="description" content="${esc(meta.metaDescription)}" />
<link rel="icon" type="image/svg+xml" href="${prefix}images/logo.svg" />
${alternates}
<link rel="alternate" hreflang="x-default" href="${defaultHref}" />
<link rel="stylesheet" href="${prefix}css/site.css" />
<script>
(function () {
try {
var t = localStorage.getItem("theme");
var dark =
t === "dark" ||
(!t && window.matchMedia("(prefers-color-scheme: dark)").matches);
document.documentElement.setAttribute("data-theme", dark ? "dark" : "light");
} catch (_) {}
})();
</script>
</head>
<body>
<div class="page-shell bg-wash">
${header(lang, page)}
<main>
${page === "home" ? homeMain(lang) : aboutMain(lang)}
</main>
${footer(lang)}
</div>
<script src="${prefix}js/site.js"></script>
</body>
</html>
`;
}
function writePage(lang, page) {
const dir = lang === "zh" ? outDir : path.join(outDir, lang);
fs.mkdirSync(dir, { recursive: true });
const file = page === "home" ? "index.html" : "about.html";
fs.writeFileSync(path.join(dir, file), documentFor(lang, page));
}
for (const lang of LANGS) {
writePage(lang, "home");
writePage(lang, "about");
}
console.log("Wrote static portal pages to html/");
+115
View File
@@ -0,0 +1,115 @@
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
export const PRODUCT_DIRS = ['smartbuddy', 'smartinput', 'smarthanzi', 'massiveedit', 'html'];
const SKIP_NAMES = new Set([
'.DS_Store',
'.texpadtmp',
'smartbuddy_readme',
]);
const SKIP_EXT = new Set([
'.tex',
'.aux',
'.log',
'.toc',
'.out',
'.synctex.gz',
]);
const MIME = {
'.html': 'text/html; charset=utf-8',
'.css': 'text/css; charset=utf-8',
'.js': 'text/javascript; charset=utf-8',
'.mjs': 'text/javascript; charset=utf-8',
'.json': 'application/json; charset=utf-8',
'.svg': 'image/svg+xml',
'.png': 'image/png',
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.webp': 'image/webp',
'.gif': 'image/gif',
'.ico': 'image/x-icon',
'.woff2': 'font/woff2',
'.txt': 'text/plain; charset=utf-8',
'.md': 'text/plain; charset=utf-8',
'.apk': 'application/vnd.android.package-archive',
'.deb': 'application/vnd.debian.binary-package',
'.pkg': 'application/octet-stream',
'.exe': 'application/octet-stream',
'.zip': 'application/zip',
};
export function shouldCopy(src) {
const base = path.basename(src);
if (SKIP_NAMES.has(base)) return false;
if (base.startsWith('.')) return false;
if (SKIP_EXT.has(path.extname(base))) return false;
return true;
}
export function copyProductSites(destRoot, sourceRoot = process.cwd()) {
for (const dir of PRODUCT_DIRS) {
const from = path.join(sourceRoot, dir);
if (!fs.existsSync(from)) continue;
fs.cpSync(from, path.join(destRoot, dir), {
recursive: true,
filter: shouldCopy,
});
}
}
function resolveProductFile(root, urlPath) {
const clean = urlPath.split('?')[0];
const product = PRODUCT_DIRS.find(
(name) => clean === `/${name}` || clean === `/${name}/` || clean.startsWith(`/${name}/`),
);
if (!product) return null;
let rel = clean.slice(product.length + 2);
if (!rel || rel.endsWith('/')) rel = `${rel}index.html`;
const file = path.join(root, product, rel);
if (fs.existsSync(file) && fs.statSync(file).isFile()) return file;
const asIndex = path.join(root, product, rel, 'index.html');
if (fs.existsSync(asIndex) && fs.statSync(asIndex).isFile()) return asIndex;
return null;
}
function serveProduct(root, req, res, next) {
const file = resolveProductFile(root, req.url ?? '');
if (!file) return next();
res.statusCode = 200;
res.setHeader('Content-Type', MIME[path.extname(file).toLowerCase()] ?? 'application/octet-stream');
fs.createReadStream(file).pipe(res);
}
export function productSites() {
const root = process.cwd();
return {
name: 'product-sites',
hooks: {
'astro:config:setup'({ updateConfig }) {
updateConfig({
vite: {
plugins: [
{
name: 'serve-product-sites',
configureServer(server) {
server.middlewares.use((req, res, next) => serveProduct(root, req, res, next));
},
},
],
},
});
},
'astro:build:done'({ dir }) {
copyProductSites(fileURLToPath(dir));
},
},
};
}
+50
View File
@@ -0,0 +1,50 @@
---
import { hrefFor, hrefForProduct, type Lang, type SiteCopy } from '../i18n';
interface Props {
lang: Lang;
copy: SiteCopy;
}
const { lang, copy } = Astro.props;
---
<footer class="site-footer">
<div class="container footer-main">
<div>
<h3>{copy.footer.company}</h3>
<p>{copy.footer.addressLine}</p>
<p>{copy.footer.emailLine}</p>
</div>
<div>
<h3>{copy.footer.colAbout}</h3>
<div class="footer-links">
<a href={hrefFor(lang, 'about')}>{copy.footer.linkAbout}</a>
</div>
</div>
<div>
<h3>{copy.footer.colProducts}</h3>
<div class="footer-links">
<a href={hrefForProduct('smartbuddy', lang)}>{copy.footer.linkBuddy}</a>
<a href={hrefForProduct('smartinput', lang)}>{copy.footer.linkInput}</a>
<a href={hrefForProduct('smarthanzi', lang)}>{copy.footer.linkHanzi}</a>
<a href={hrefForProduct('massiveedit', lang)}>{copy.footer.linkEdit}</a>
</div>
</div>
</div>
<div class="container footer-bottom">
<p class="footer-legal-line">
{copy.footer.copyrightMain}
{' '}
<a
class="footer-icp-link"
href="https://beian.miit.gov.cn/"
target="_blank"
rel="noopener noreferrer"
>
{copy.footer.icpNumber}
</a>
</p>
<p class="footer-trademark">{copy.footer.trademarkNotice}</p>
</div>
</footer>
@@ -1,6 +1,14 @@
---
import { Icon } from 'astro-icon/components';
import { LANGS, hrefFor, langLabels, type Lang, type RouteKey, type SiteCopy } from '../i18n';
import {
LANGS,
hrefFor,
hrefForHomeHash,
langLabels,
type Lang,
type RouteKey,
type SiteCopy,
} from '../i18n';
interface Props {
lang: Lang;
@@ -10,12 +18,10 @@ interface Props {
const { lang, copy, currentSegment } = Astro.props;
const navItems: { label: string; segment: RouteKey }[] = [
{ label: copy.nav.home, segment: '' },
{ label: copy.nav.philosophy, segment: 'teaching-philosophy' },
{ label: copy.nav.curriculum, segment: 'curriculum' },
{ label: copy.nav.faculty, segment: 'faculty' },
{ label: copy.nav.about, segment: 'about' },
const navItems: { label: string; href: string; current: boolean }[] = [
{ label: copy.nav.home, href: hrefFor(lang, ''), current: currentSegment === '' },
{ label: copy.nav.products, href: hrefForHomeHash(lang, 'products'), current: false },
{ label: copy.nav.about, href: hrefFor(lang, 'about'), current: currentSegment === 'about' },
];
---
@@ -30,10 +36,7 @@ const navItems: { label: string; segment: RouteKey }[] = [
<nav class="nav-links" aria-label={copy.lang.menuLabel}>
{navItems.map((item) => (
<a
class:list={['nav-link', { current: currentSegment === item.segment }]}
href={hrefFor(lang, item.segment)}
>
<a class:list={['nav-link', { current: item.current }]} href={item.href}>
{item.label}
</a>
))}
@@ -84,20 +87,14 @@ const navItems: { label: string; segment: RouteKey }[] = [
<div class="container mobile-menu" data-mobile-menu>
{navItems.map((item) => (
<a
class:list={[{ current: currentSegment === item.segment }]}
href={hrefFor(lang, item.segment)}
>
<a class:list={[{ current: item.current }]} href={item.href}>
{item.label}
</a>
))}
<div class="mobile-lang">
<p>{copy.lang.menuLabel}</p>
{LANGS.map((code) => (
<a
class:list={[{ current: code === lang }]}
href={hrefFor(code, currentSegment)}
>
<a class:list={[{ current: code === lang }]} href={hrefFor(code, currentSegment)}>
{langLabels[code]}
</a>
))}
+103
View File
@@ -0,0 +1,103 @@
import type { SiteCopy } from './types';
export const en: SiteCopy = {
brand: {
strong: 'Zhihua',
suffix: 'Five Questions',
ariaHome: 'Zhihua home',
},
nav: {
home: 'Home',
products: 'Products',
about: 'About',
},
theme: {
light: 'Light',
dark: 'Dark',
toggle: 'Switch light or dark theme',
},
lang: {
menuLabel: 'Language',
switchTo: 'Switch to',
},
footer: {
company: 'Five Questions (Beijing) Technology Co., Ltd.',
addressLine: 'Address: Room A-012, 1F, North Auxiliary Building, No. 6 Tianfu North Street, Wenjing Subdistrict, Tongzhou District, Beijing 101100, China',
emailLine: 'Email: liutingchao@fivequestions.cn',
colAbout: 'About',
linkAbout: 'Company',
colProducts: 'Products',
linkBuddy: 'SmartBuddy',
linkInput: 'SmartInput',
linkHanzi: 'SmartHanzi',
linkEdit: 'MassiveEdit',
copyrightMain: '© 2026 Five Questions (Beijing) Technology Co., Ltd. All rights reserved.',
icpNumber: '京ICP备2025143052号',
trademarkNotice:
'五道题® and 智花® are registered trademarks of Five Questions (Beijing) Technology Co., Ltd. English wording on this site is for display only and does not replace the Chinese marks. Unauthorized use that may cause confusion is prohibited.',
},
home: {
metaTitle: 'Zhihua | Five Questions',
metaDescription:
'Software from Five Questions: SmartBuddy, SmartInput, SmartHanzi, and MassiveEdit—learning, input, and productivity tools.',
heroTitle: 'Learning, input, and productivity tools',
heroSubtitle:
'From Five Questions. Zhihua covers Chinese learning and input; MassiveEdit is built for very large text files.',
ctaProducts: 'See products',
ctaAbout: 'About us',
productsTitle: 'Products',
productsLead:
'Zhihua is for Chinese learning and typing. MassiveEdit is for people who need to work with huge text files.',
productBuddyName: '智花学伴',
productBuddyEn: 'SmartBuddy',
productBuddyBody:
'A student app for international Chinese: homework from teachers, speaking practice, coaching, and real-life scenes.',
productBuddyCta: 'Open SmartBuddy',
productInputName: '智花输入法',
productInputEn: 'SmartInput',
productInputBody:
'Full QWERTY pinyin, 9-key pinyin, stroke, and handwriting—on iOS, Android, and desktop.',
productInputCta: 'Open SmartInput',
productHanziName: '智花识字',
productHanziEn: 'SmartHanzi',
productHanziBody:
'Learn characters with the school textbook: reading, stroke tracing, and spaced review.',
productHanziCta: 'Open SmartHanzi',
productEditName: 'MassiveEdit',
productEditEn: 'Large File Editor',
productEditBody:
'A text editor for very large files, built for fast open, smooth scrolling, and steady editing.',
productEditCta: 'Open MassiveEdit',
companyTitle: 'Five Questions',
companyBody:
'Five Questions (Beijing) Technology Co., Ltd. builds practical learning and productivity software. Zhihua is the brand for Chinese learning and input; MassiveEdit is our large-file editor.',
ctaCompany: 'About the company',
contactTitle: 'Contact',
contactBody: 'For trials, partnerships, or product questions, write to us.',
ctaContact: 'Email us',
},
about: {
metaTitle: 'About | Zhihua · Five Questions',
metaDescription:
'Five Questions (Beijing) Technology Co., Ltd.: Zhihua learning and input products, and tools such as MassiveEdit.',
heroTitle: 'About us',
heroLead:
'We build learning, input, and productivity software. Zhihua covers Chinese learning and typing; MassiveEdit is for people who work with very large text files.',
visionFigureAlt: 'Product and workspace visuals',
visionTitle: 'Vision',
visionBody:
'Turn the hard parts of learning, writing, and everyday work into software people can actually use—clear, stable, and worth refining over time.',
missionTitle: 'Mission',
missionBody:
'Ship tools that hold up in real use: students finish homework and speak, typing feels natural, character study has a path, and huge files still open and edit smoothly.',
missionImgAlt: 'Engineering and collaboration',
storyTitle: 'Brand story',
storyBody:
'“Zhihua” suggests intelligence and culture coming into bloom. Five Questions is the company; Zhihua is the product brand for Chinese learning and input. Linguistics, engineering, and product work sit on one line.',
storyImgAlt: 'Brand story artwork',
teamTitle: 'Team',
teamBody:
'The team builds and iterates products: ship features, fix issues, listen to feedback. We do not recruit students or run a faculty franchise—effort goes into the software.',
teamImgAlt: 'Team collaboration',
},
};
+104
View File
@@ -0,0 +1,104 @@
import type { SiteCopy } from './types';
export const fr: SiteCopy = {
brand: {
strong: 'Zhihua',
suffix: 'Five Questions',
ariaHome: 'Accueil Zhihua',
},
nav: {
home: 'Accueil',
products: 'Produits',
about: 'À propos',
},
theme: {
light: 'Clair',
dark: 'Sombre',
toggle: 'Basculer entre thème clair et sombre',
},
lang: {
menuLabel: 'Langue',
switchTo: 'Afficher en',
},
footer: {
company: 'Five Questions (Beijing) Technology Co., Ltd.',
addressLine: 'Adresse : Room A-012, 1F, North Auxiliary Building, No. 6 Tianfu North Street, Wenjing Subdistrict, Tongzhou District, Beijing 101100, Chine',
emailLine: 'Courriel : liutingchao@fivequestions.cn',
colAbout: 'À propos',
linkAbout: 'Lentreprise',
colProducts: 'Produits',
linkBuddy: 'SmartBuddy',
linkInput: 'SmartInput',
linkHanzi: 'SmartHanzi',
linkEdit: 'MassiveEdit',
copyrightMain:
'© 2026 Five Questions (Beijing) Technology Co., Ltd. Tous droits réservés.',
icpNumber: '京ICP备2025143052号',
trademarkNotice:
'五道题® et 智花® sont des marques enregistrées de Five Questions (Beijing) Technology Co., Ltd. Les libellés en anglais sur ce site sont purement indicatifs et ne remplacent pas les marques en chinois. Toute utilisation non autorisée susceptible de créer une confusion est interdite.',
},
home: {
metaTitle: 'Zhihua | Five Questions',
metaDescription:
'Logiciels de Five Questions : SmartBuddy, SmartInput, SmartHanzi et MassiveEdit—apprentissage, saisie et outils defficacité.',
heroTitle: 'Apprentissage, saisie et outils defficacité',
heroSubtitle:
'Édités par Five Questions. Zhihua couvre lapprentissage et la saisie du chinois ; MassiveEdit sadresse aux très gros fichiers texte.',
ctaProducts: 'Voir les produits',
ctaAbout: 'À propos',
productsTitle: 'Produits',
productsLead:
'Zhihua sert lapprentissage et la saisie du chinois. MassiveEdit sadresse à ceux qui travaillent sur d’énormes fichiers texte.',
productBuddyName: '智花学伴',
productBuddyEn: 'SmartBuddy',
productBuddyBody:
'Application élève pour le chinois international : devoirs, oral, renforcement et scènes de la vie quotidienne.',
productBuddyCta: 'Ouvrir SmartBuddy',
productInputName: '智花输入法',
productInputEn: 'SmartInput',
productInputBody:
'Pinyin clavier complet, pinyin 9 touches, traits et écriture manuscrite—sur iOS, Android et bureau.',
productInputCta: 'Ouvrir SmartInput',
productHanziName: '智花识字',
productHanziEn: 'SmartHanzi',
productHanziBody:
'Apprendre les caractères avec le manuel scolaire : lecture, tracé des traits et révision espacée.',
productHanziCta: 'Ouvrir SmartHanzi',
productEditName: 'MassiveEdit',
productEditEn: 'Large File Editor',
productEditBody:
'Éditeur pour de très gros fichiers texte : ouverture rapide, défilement fluide, édition stable.',
productEditCta: 'Ouvrir MassiveEdit',
companyTitle: 'Five Questions',
companyBody:
'Five Questions (Beijing) Technology Co., Ltd. conçoit des logiciels dapprentissage et defficacité. Zhihua est la marque pour le chinois ; MassiveEdit est notre éditeur de très gros fichiers.',
ctaCompany: 'Lentreprise',
contactTitle: 'Contact',
contactBody: 'Pour un essai, un partenariat ou une question produit, écrivez-nous.',
ctaContact: 'Envoyer un courriel',
},
about: {
metaTitle: 'À propos | Zhihua · Five Questions',
metaDescription:
'Five Questions (Beijing) Technology Co., Ltd. : produits Zhihua dapprentissage et de saisie, et des outils comme MassiveEdit.',
heroTitle: 'À propos',
heroLead:
'Nous développons des logiciels dapprentissage, de saisie et defficacité. Zhihua couvre le chinois ; MassiveEdit sadresse aux très gros fichiers texte.',
visionFigureAlt: 'Visuels de produits et de travail',
visionTitle: 'Vision',
visionBody:
'Transformer ce qui est vraiment pénible dans lapprentissage, lexpression et le travail quotidien en logiciels utilisables—clairs, stables, et faits pour durer.',
missionTitle: 'Mission',
missionBody:
'Livrer des outils qui tiennent sur le terrain : finir les devoirs et parler, saisir plus naturellement, suivre un chemin pour les caractères, ouvrir et éditer d’énormes fichiers.',
missionImgAlt: 'Ingénierie et collaboration',
storyTitle: 'Histoire de marque',
storyBody:
'« Zhihua » évoque lintelligence et la culture qui s’épanouissent ensemble. Five Questions est lentreprise ; Zhihua, la marque pour lapprentissage et la saisie du chinois. Linguistique, ingénierie et produit avancent sur la même ligne.',
storyImgAlt: 'Illustration de marque',
teamTitle: 'Équipe',
teamBody:
'L’équipe développe et itère : livrer, corriger, écouter. Nous ne recrutons pas d’élèves et nexploitons pas de réseau enseignant—leffort va au logiciel.',
teamImgAlt: 'Collaboration d’équipe',
},
};
+12 -2
View File
@@ -21,5 +21,15 @@ export function langStaticPaths() {
export type { Lang } from './locales';
export type { SiteCopy } from './types';
export { LANGS, DEFAULT_LANG, htmlLang, langLabels, hrefFor, isLang, resolveLang } from './locales';
export type { RouteKey } from './locales';
export {
LANGS,
DEFAULT_LANG,
htmlLang,
langLabels,
hrefFor,
hrefForHomeHash,
hrefForProduct,
isLang,
resolveLang,
} from './locales';
export type { RouteKey, ProductKey } from './locales';
+100
View File
@@ -0,0 +1,100 @@
import type { SiteCopy } from './types';
export const ja: SiteCopy = {
brand: {
strong: '智花',
suffix: '五道题',
ariaHome: '智花ホーム',
},
nav: {
home: 'ホーム',
products: '製品',
about: '私たちについて',
},
theme: {
light: 'ライト',
dark: 'ダーク',
toggle: 'テーマを切り替え',
},
lang: {
menuLabel: '言語',
switchTo: '切り替え',
},
footer: {
company: '五道题(北京)科技有限公司',
addressLine: '住所:北京市通州区文景街道田府北街6号北配楼1階A-012',
emailLine: 'メール:liutingchao@fivequestions.cn',
colAbout: '会社情報',
linkAbout: '会社紹介',
colProducts: '製品',
linkBuddy: '智花学伴',
linkInput: '智花入力',
linkHanzi: '智花識字',
linkEdit: 'MassiveEdit',
copyrightMain: '© 2026 五道题(北京)科技有限公司。無断転載を禁じます。',
icpNumber: '京ICP备2025143052号',
trademarkNotice:
'「五道题®」「智花®」は五道题(北京)科技有限公司の登録商標です。関連公衆の誤認を招くおそれのある無断使用は禁止されます。',
},
home: {
metaTitle: '智花|五道题',
metaDescription:
'五道题(北京)科技有限公司のソフトウェア:智花学伴、智花入力、智花識字、MassiveEdit。学習・入力・効率ツール。',
heroTitle: '学習、入力、効率のためのツール',
heroSubtitle:
'五道题の製品です。智花は中国語の学習と入力を、MassiveEdit は巨大テキストの編集を担います。',
ctaProducts: '製品を見る',
ctaAbout: '私たちについて',
productsTitle: '製品',
productsLead: '智花は中国語の学習と入力向け。MassiveEdit は超大容量テキストを扱う人向けです。',
productBuddyName: '智花学伴',
productBuddyEn: 'SmartBuddy',
productBuddyBody:
'国際中国語学習向けの学習者アプリ。教員が出した課題、音声評価、強化練習、生活場面の会話に対応します。',
productBuddyCta: '智花学伴へ',
productInputName: '智花入力',
productInputEn: 'SmartInput',
productInputBody:
'フルキー拼音、九鍵拼音、筆画、手書きに対応。iOS、Android、デスクトップで利用できます。',
productInputCta: '智花入力へ',
productHanziName: '智花識字',
productHanziEn: 'SmartHanzi',
productHanziBody: '小学校の教材に沿って漢字を読む・書く。筆順のなぞりと復習を一本の道筋にします。',
productHanziCta: '智花識字へ',
productEditName: 'MassiveEdit',
productEditEn: 'Large File Editor',
productEditBody: '超大容量テキスト向けのエディタ。起動、スクロール、安定した編集を重視します。',
productEditCta: 'MassiveEdit へ',
companyTitle: '五道题',
companyBody:
'五道题(北京)科技有限公司は、使える学習・効率ソフトウェアを作ります。智花は中国語の学習と入力のブランド、MassiveEdit は同一主体の大容量テキストエディタです。',
ctaCompany: '会社を見る',
contactTitle: 'お問い合わせ',
contactBody: '試用、提携、製品に関するご質問はメールでご連絡ください。',
ctaContact: 'メールを送る',
},
about: {
metaTitle: '私たちについて|智花 · 五道题',
metaDescription:
'五道题(北京)科技有限公司:智花の学習・入力製品と、MassiveEdit などの効率ツール。',
heroTitle: '私たちについて',
heroLead:
'学習、入力、効率のためのソフトウェアを開発しています。智花は中国語の学習と入力、MassiveEdit は巨大テキストを扱う人のための製品です。',
visionFigureAlt: '製品と制作のビジュアル',
visionTitle: 'ビジョン',
visionBody:
'学び、伝え、日々の仕事で本当に手間のかかる部分を、使えるソフトウェアにします。分かりやすく、安定して、長く磨いていけるものを目指します。',
missionTitle: 'ミッション',
missionBody:
'現場で使える製品を出し続けること。課題を終え、口を開け、入力が自然になり、識字に道筋があり、巨大ファイルも開いて編集できること。',
missionImgAlt: '開発と協働',
storyTitle: 'ブランドストーリー',
storyBody:
'「智花」は知恵と文化がともに花開くイメージです。五道题は会社主体、智花は中国語の学習と入力の製品ブランド。言語学、エンジニアリング、製品改善を一本の線で進めています。',
storyImgAlt: 'ブランドアートワーク',
teamTitle: 'チーム',
teamBody:
'チームの仕事は製品開発と継続的な改善です。機能を出し、不具合を直し、フィードバックを聞く。生徒募集や教員フランチャイズは行いません。',
teamImgAlt: 'チームコラボレーション',
},
};
@@ -23,7 +23,9 @@ export function isLang(value: string | undefined): value is Lang {
}
/** 站内路径(不含语言前缀),首页为空字符串 */
export type RouteKey = '' | 'teaching-philosophy' | 'curriculum' | 'faculty' | 'about';
export type RouteKey = '' | 'about';
export type ProductKey = 'smartbuddy' | 'smartinput' | 'smarthanzi' | 'massiveedit';
export function hrefFor(lang: Lang, segment: RouteKey): string {
const prefix = lang === DEFAULT_LANG ? '' : `/${lang}`;
@@ -31,6 +33,19 @@ export function hrefFor(lang: Lang, segment: RouteKey): string {
return `${prefix}/${segment}`;
}
export function hrefForHomeHash(lang: Lang, hash: string): string {
const home = hrefFor(lang, '');
if (home === '/') return `/#${hash}`;
return `${home}#${hash}`;
}
export function hrefForProduct(key: ProductKey, lang: Lang): string {
if (key === 'massiveedit' && (lang === 'en' || lang === 'fr')) {
return '/massiveedit/en/';
}
return `/${key}/`;
}
/** 从 [...lang] rest 参数解析语言,undefined 时返回默认语言 */
export function resolveLang(param: string | undefined): Lang {
return isLang(param) ? param : DEFAULT_LANG;
+86
View File
@@ -0,0 +1,86 @@
export interface SiteCopy {
brand: {
strong: string;
suffix: string;
ariaHome: string;
};
nav: {
home: string;
products: string;
about: string;
};
theme: {
light: string;
dark: string;
toggle: string;
};
lang: {
menuLabel: string;
switchTo: string;
};
footer: {
company: string;
addressLine: string;
emailLine: string;
colAbout: string;
linkAbout: string;
colProducts: string;
linkBuddy: string;
linkInput: string;
linkHanzi: string;
linkEdit: string;
copyrightMain: string;
icpNumber: string;
trademarkNotice: string;
};
home: {
metaTitle: string;
metaDescription: string;
heroTitle: string;
heroSubtitle: string;
ctaProducts: string;
ctaAbout: string;
productsTitle: string;
productsLead: string;
productBuddyName: string;
productBuddyEn: string;
productBuddyBody: string;
productBuddyCta: string;
productInputName: string;
productInputEn: string;
productInputBody: string;
productInputCta: string;
productHanziName: string;
productHanziEn: string;
productHanziBody: string;
productHanziCta: string;
productEditName: string;
productEditEn: string;
productEditBody: string;
productEditCta: string;
companyTitle: string;
companyBody: string;
ctaCompany: string;
contactTitle: string;
contactBody: string;
ctaContact: string;
};
about: {
metaTitle: string;
metaDescription: string;
heroTitle: string;
heroLead: string;
visionFigureAlt: string;
visionTitle: string;
visionBody: string;
missionTitle: string;
missionBody: string;
missionImgAlt: string;
storyTitle: string;
storyBody: string;
storyImgAlt: string;
teamTitle: string;
teamBody: string;
teamImgAlt: string;
};
}
+97
View File
@@ -0,0 +1,97 @@
import type { SiteCopy } from './types';
export const zh: SiteCopy = {
brand: {
strong: '智花',
suffix: '五道题',
ariaHome: '智花首页',
},
nav: {
home: '首页',
products: '产品',
about: '关于我们',
},
theme: {
light: '浅色',
dark: '深色',
toggle: '切换浅色或深色主题',
},
lang: {
menuLabel: '语言',
switchTo: '切换到',
},
footer: {
company: '五道题(北京)科技有限公司',
addressLine: '地址:北京市通州区文景街道田府北街6号北配楼1层A-012',
emailLine: '邮箱:liutingchao@fivequestions.cn',
colAbout: '关于我们',
linkAbout: '公司介绍',
colProducts: '产品',
linkBuddy: '智花学伴',
linkInput: '智花输入法',
linkHanzi: '智花识字',
linkEdit: 'MassiveEdit',
copyrightMain: '© 2026 五道题(北京)科技有限公司 保留所有权利',
icpNumber: '京ICP备2025143052号',
trademarkNotice:
'「五道题®」「智花®」为五道题(北京)科技有限公司注册商标;未经许可,他人不得以可能造成相关公众混淆的方式使用。',
},
home: {
metaTitle: '智花|五道题',
metaDescription:
'五道题(北京)科技有限公司出品:智花学伴、智花输入法、智花识字与 MassiveEdit,覆盖学习、输入与效率工具。',
heroTitle: '学习、输入与效率工具',
heroSubtitle: '五道题出品。智花覆盖中文学习与输入,同时提供面向大文件的效率工具。',
ctaProducts: '查看产品',
ctaAbout: '关于我们',
productsTitle: '我们的产品',
productsLead: '智花面向中文学习与输入;MassiveEdit 服务需要稳定处理超大文本的人。',
productBuddyName: '智花学伴',
productBuddyEn: 'SmartBuddy',
productBuddyBody: '面向国际中文学习的学生端:完成教师布置的作业,用语音评测、强化练习和生活场景把中文说出来。',
productBuddyCta: '进入智花学伴',
productInputName: '智花输入法',
productInputEn: 'SmartInput',
productInputBody: '支持全键盘拼音、九键拼音、笔画与手写,覆盖 iOS、Android 与桌面平台。',
productInputCta: '进入智花输入法',
productHanziName: '智花识字',
productHanziEn: 'SmartHanzi',
productHanziBody: '跟着小学教材认字写字,认读、描红笔顺与智能复习连成一条路径。',
productHanziCta: '进入智花识字',
productEditName: 'MassiveEdit',
productEditEn: 'Large File Editor',
productEditBody: '面向超大文本文件的编辑器,强调打开速度、滚动流畅与稳定编辑。',
productEditCta: '进入 MassiveEdit',
companyTitle: '五道题',
companyBody:
'五道题(北京)科技有限公司做可落地的学习与效率软件。智花是面向中文学习与输入的产品品牌;MassiveEdit 是同一主体下的大文件文本编辑器。',
ctaCompany: '了解公司',
contactTitle: '联系我们',
contactBody: '试用、合作或产品问题,欢迎来信。',
ctaContact: '发送邮件',
},
about: {
metaTitle: '关于我们|智花 · 五道题',
metaDescription:
'了解五道题(北京)科技有限公司:智花学习与输入产品,以及 MassiveEdit 等效率工具。',
heroTitle: '关于我们',
heroLead:
'五道题(北京)科技有限公司开发学习、输入与效率类软件。智花覆盖中文学习与输入;MassiveEdit 面向需要处理超大文本的用户。',
visionFigureAlt: '产品与工作场景',
visionTitle: '企业愿景',
visionBody:
'把学习、表达与日常工作里真正费力的环节做成可用的软件。我们希望工具足够清楚、稳定,也愿意长期打磨细节。',
missionTitle: '我们的使命',
missionBody:
'持续交付可落地的产品:学生能完成作业与开口练习,输入更自然,识字写字有路径可循,大文件也能流畅打开与编辑。',
missionImgAlt: '研发与协作',
storyTitle: '品牌故事',
storyBody:
'「智花」寓意智慧与文化的共同绽放。五道题是公司主体,「智花」是面向中文学习与输入的产品品牌。我们把语言学、工程与产品迭代放在同一条工作线上。',
storyImgAlt: '品牌故事插画',
teamTitle: '团队',
teamBody:
'团队服务产品研发与持续迭代:做功能、修问题、听反馈。我们不招生、不运营师资加盟,把精力放在软件本身。',
teamImgAlt: '团队合作',
},
};
+58
View File
@@ -0,0 +1,58 @@
---
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getCopy, hrefForProduct, langStaticPaths, resolveLang } from '../../i18n';
export function getStaticPaths() {
return langStaticPaths();
}
const locale = resolveLang(Astro.params.lang);
const L = getCopy(locale);
---
<BaseLayout
title={L.about.metaTitle}
description={L.about.metaDescription}
currentSegment="about"
lang={locale}
>
<section class="hero home-hero about-hero">
<div class="container">
<p class="home-kicker">{L.brand.strong} · {L.brand.suffix}</p>
<h1 class="hero-title">{L.about.heroTitle}</h1>
<p class="home-lead">{L.about.heroLead}</p>
</div>
</section>
<section class="section compact">
<div class="container about-stack">
<article class="feature-card">
<h2>{L.about.visionTitle}</h2>
<p>{L.about.visionBody}</p>
</article>
<article class="feature-card">
<h2>{L.about.missionTitle}</h2>
<p>{L.about.missionBody}</p>
</article>
<article class="feature-card">
<h2>{L.about.storyTitle}</h2>
<p>{L.about.storyBody}</p>
</article>
<article class="feature-card">
<h2>{L.about.teamTitle}</h2>
<p>{L.about.teamBody}</p>
</article>
</div>
</section>
<section class="section compact">
<div class="container">
<div class="about-products">
<a href={hrefForProduct('smartbuddy', locale)}>{L.footer.linkBuddy}</a>
<a href={hrefForProduct('smartinput', locale)}>{L.footer.linkInput}</a>
<a href={hrefForProduct('smarthanzi', locale)}>{L.footer.linkHanzi}</a>
<a href={hrefForProduct('massiveedit', locale)}>{L.footer.linkEdit}</a>
</div>
</div>
</section>
</BaseLayout>
+95
View File
@@ -0,0 +1,95 @@
---
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getCopy, hrefFor, hrefForHomeHash, hrefForProduct, langStaticPaths, resolveLang } from '../../i18n';
export function getStaticPaths() {
return langStaticPaths();
}
const locale = resolveLang(Astro.params.lang);
const L = getCopy(locale);
const products = [
{
key: 'smartbuddy' as const,
name: L.home.productBuddyName,
en: L.home.productBuddyEn,
body: L.home.productBuddyBody,
cta: L.home.productBuddyCta,
},
{
key: 'smartinput' as const,
name: L.home.productInputName,
en: L.home.productInputEn,
body: L.home.productInputBody,
cta: L.home.productInputCta,
},
{
key: 'smarthanzi' as const,
name: L.home.productHanziName,
en: L.home.productHanziEn,
body: L.home.productHanziBody,
cta: L.home.productHanziCta,
},
{
key: 'massiveedit' as const,
name: L.home.productEditName,
en: L.home.productEditEn,
body: L.home.productEditBody,
cta: L.home.productEditCta,
},
];
---
<BaseLayout
title={L.home.metaTitle}
description={L.home.metaDescription}
currentSegment=""
lang={locale}
>
<section class="hero home-hero">
<div class="container">
<p class="home-kicker">{L.brand.strong} · {L.brand.suffix}</p>
<h1 class="hero-title">{L.home.heroTitle}</h1>
<p class="home-lead">{L.home.heroSubtitle}</p>
<div class="hero-actions">
<a class="btn btn-primary" href={hrefForHomeHash(locale, 'products')}>{L.home.ctaProducts}</a>
<a class="btn btn-outline" href={hrefFor(locale, 'about')}>{L.home.ctaAbout}</a>
</div>
</div>
</section>
<section class="section compact" id="products">
<div class="container">
<div class="section-head">
<h2 class="section-title">{L.home.productsTitle}</h2>
<p class="section-copy">{L.home.productsLead}</p>
</div>
<div class="product-grid">
{products.map((product) => (
<article class="feature-card product-card">
<p class="product-kicker">{product.en}</p>
<h3>{product.name}</h3>
<p>{product.body}</p>
<a class="mini-link" href={hrefForProduct(product.key, locale)}>{product.cta}</a>
</article>
))}
</div>
</div>
</section>
<section class="section compact" id="company">
<div class="container grid-two company-contact">
<article class="feature-card">
<h3>{L.home.companyTitle}</h3>
<p>{L.home.companyBody}</p>
<a class="mini-link" href={hrefFor(locale, 'about')}>{L.home.ctaCompany}</a>
</article>
<article class="feature-card">
<h3>{L.home.contactTitle}</h3>
<p>{L.home.contactBody}</p>
<a class="mini-link" href="mailto:liutingchao@fivequestions.cn">{L.home.ctaContact}</a>
</article>
</div>
</section>
</BaseLayout>
@@ -13,8 +13,11 @@
--brand: #7aa0ff;
--brand-strong: #4b76eb;
--brand-soft: #eef3ff;
--footer: #313238;
--footer-muted: #b8bcc6;
--footer: #f4f1ec;
--footer-heading: #1f2430;
--footer-muted: #6f6b68;
--footer-faint: #948f8b;
--footer-line: #e6e1db;
--header-bg: rgba(255, 253, 251, 0.9);
--hero-accent: #2875ff;
--showcase-title-color: #4986cb;
@@ -45,7 +48,10 @@
--brand-strong: #b8c8ff;
--brand-soft: #252a38;
--footer: #0c0e12;
--footer-heading: #f1f3f7;
--footer-muted: #8a91a0;
--footer-faint: #6d7584;
--footer-line: #2a2f3a;
--header-bg: rgba(15, 17, 21, 0.88);
--hero-accent: #7eb8ff;
--showcase-title-color: #7ec8f0;
@@ -345,11 +351,29 @@ button {
padding: 92px 0 60px;
}
.index-hero {
background-image: url('/images/index-hero-bg.webp');
background-size: cover;
background-position: center;
background-repeat: no-repeat;
.home-hero {
text-align: center;
padding: 72px 0 36px;
}
.home-kicker {
margin: 0 0 16px;
color: var(--brand);
font-size: 13px;
font-weight: 800;
letter-spacing: 0.16em;
}
.home-lead {
max-width: 36em;
margin: 16px auto 0;
color: var(--muted-strong);
font-size: 18px;
line-height: 1.7;
}
.home-hero .hero-actions {
margin-top: 28px;
}
.philosophy-hero {
@@ -360,8 +384,8 @@ button {
background: linear-gradient(145deg, rgba(122, 160, 255, 0.14) 0%, rgba(23, 26, 33, 0.96) 45%, rgba(122, 160, 255, 0.06) 100%);
}
[data-theme="dark"] .index-hero {
box-shadow: inset 0 0 160px rgba(0, 0, 0, 0.55);
.about-hero {
padding-bottom: 12px;
}
.hero.centered {
@@ -879,7 +903,8 @@ button {
.site-footer {
margin-top: 120px;
background: var(--footer);
color: #fff;
color: var(--footer-heading);
border-top: 1px solid var(--footer-line);
}
.footer-main {
@@ -891,6 +916,7 @@ button {
.site-footer h3 {
margin: 0 0 18px;
color: var(--footer-heading);
font-size: 18px;
letter-spacing: -0.01em;
}
@@ -902,6 +928,11 @@ button {
line-height: 2;
}
.site-footer a:hover,
.site-footer a:focus-visible {
color: var(--footer-heading);
}
.footer-links {
display: grid;
gap: 6px;
@@ -920,7 +951,7 @@ button {
width: 38px;
height: 38px;
border-radius: 50%;
border: 1px solid rgba(255, 255, 255, 0.22);
border: 1px solid var(--footer-line);
}
.social-row svg {
@@ -930,9 +961,9 @@ button {
}
.footer-bottom {
border-top: 1px solid rgba(255, 255, 255, 0.1);
border-top: 1px solid var(--footer-line);
padding: 22px 0 30px;
color: rgba(255, 255, 255, 0.46);
color: var(--footer-faint);
font-size: 12px;
text-align: center;
}
@@ -943,19 +974,19 @@ button {
}
.site-footer .footer-icp-link {
color: rgba(255, 255, 255, 0.62);
color: var(--footer-muted);
text-decoration: underline;
text-underline-offset: 3px;
}
.site-footer .footer-icp-link:hover {
color: rgba(255, 255, 255, 0.85);
color: var(--footer-heading);
}
.footer-trademark {
margin: 14px auto 0;
max-width: 720px;
color: rgba(255, 255, 255, 0.38);
color: var(--footer-faint);
font-size: 11px;
line-height: 1.7;
}
@@ -1142,7 +1173,68 @@ button {
}
.hero-split-text {
max-width: 560px;
max-width: 720px;
}
.hero-split-text .hero-subtitle {
margin-left: 0;
margin-right: 0;
}
.hero-actions-left {
justify-content: flex-start;
margin-top: 28px;
}
.product-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 30px;
}
.product-kicker {
margin: 0 0 8px;
color: var(--brand);
font-size: 12px;
font-weight: 800;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.product-card .mini-link {
margin-top: 18px;
}
.about-stack {
display: grid;
gap: 18px;
}
.about-stack h2 {
margin: 0 0 10px;
font-size: 26px;
}
.about-stack p {
margin: 0;
color: var(--muted-strong);
line-height: 1.8;
}
.about-products {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 10px 18px;
}
.about-products a {
color: var(--brand-strong);
font-weight: 700;
}
.about-products a:hover {
text-decoration: underline;
}
.hero-split-art {
@@ -1345,6 +1437,7 @@ button {
.split-section,
.grid-three,
.grid-four,
.product-grid,
.teacher-grid,
.download-grid,
.footer-main {
@@ -1419,11 +1512,23 @@ button {
padding: 26px;
}
.brand-copy {
gap: 6px;
font-size: 24px;
}
.hero-title {
font-size: clamp(28px, 8.4vw, 40px);
overflow-wrap: break-word;
}
.hero-subtitle,
.home-lead {
font-size: 17px;
line-height: 1.65;
}
.hero-actions {
flex-direction: column;
align-items: stretch;

Before

Width:  |  Height:  |  Size: 3.1 MiB

After

Width:  |  Height:  |  Size: 3.1 MiB

+154
View File
@@ -0,0 +1,154 @@
<!DOCTYPE html>
<html lang="en" data-theme="light" class="site-lang-en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>About | Zhihua · Five Questions</title>
<meta name="description" content="Five Questions (Beijing) Technology Co., Ltd.: Zhihua learning and input products, and tools such as MassiveEdit." />
<link rel="icon" type="image/svg+xml" href="../images/logo.svg" />
<link rel="alternate" hreflang="zh-CN" href="../about.html" />
<link rel="alternate" hreflang="en" href="about.html" />
<link rel="alternate" hreflang="ja" href="../ja/about.html" />
<link rel="alternate" hreflang="fr" href="../fr/about.html" />
<link rel="alternate" hreflang="x-default" href="../about.html" />
<link rel="stylesheet" href="../css/site.css" />
<script>
(function () {
try {
var t = localStorage.getItem("theme");
var dark =
t === "dark" ||
(!t && window.matchMedia("(prefers-color-scheme: dark)").matches);
document.documentElement.setAttribute("data-theme", dark ? "dark" : "light");
} catch (_) {}
})();
</script>
</head>
<body>
<div class="page-shell bg-wash">
<header class="site-header">
<div class="container site-nav">
<a class="brand" href="index.html" aria-label="Zhihua home">
<img class="brand-mark" src="../images/logo.svg" alt="" />
<div class="brand-copy">
<strong>Zhihua</strong><span>|</span><span>Five Questions</span>
</div>
</a>
<nav class="nav-links" aria-label="Language">
<a class="nav-link" href="index.html">Home</a>
<a class="nav-link" href="index.html#products">Products</a>
<a class="nav-link current" href="about.html">About</a>
</nav>
<div class="header-tools">
<details class="lang-switch">
<summary class="locale-pill" aria-label="Language">
<span>English</span>
<svg width="10" height="10" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>
</summary>
<div class="lang-switch-panel">
<a href="../about.html" hreflang="zh-CN" lang="zh-CN">中文</a>
<a class="current" href="about.html" hreflang="en" lang="en">English</a>
<a href="../ja/about.html" hreflang="ja" lang="ja">日本語</a>
<a href="../fr/about.html" hreflang="fr" lang="fr">Français</a>
</div>
</details>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="Switch light or dark theme" title="Switch light or dark theme">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
<button class="menu-toggle" type="button" data-menu-toggle aria-expanded="false" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 5h16M4 12h16M4 19h16"/></svg>
</button>
</div>
<div class="container mobile-menu" data-mobile-menu>
<a href="index.html">Home</a>
<a href="index.html#products">Products</a>
<a class="current" href="about.html">About</a>
<div class="mobile-lang">
<p>Language</p>
<a href="../about.html">中文</a>
<a class="current" href="about.html">English</a>
<a href="../ja/about.html">日本語</a>
<a href="../fr/about.html">Français</a>
</div>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="Switch light or dark theme">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
</header>
<main>
<section class="hero home-hero about-hero">
<div class="container">
<p class="home-kicker">Zhihua · Five Questions</p>
<h1 class="hero-title">About us</h1>
<p class="home-lead">We build learning, input, and productivity software. Zhihua covers Chinese learning and typing; MassiveEdit is for people who work with very large text files.</p>
</div>
</section>
<section class="section compact">
<div class="container about-stack">
<article class="feature-card">
<h2>Vision</h2>
<p>Turn the hard parts of learning, writing, and everyday work into software people can actually use—clear, stable, and worth refining over time.</p>
</article>
<article class="feature-card">
<h2>Mission</h2>
<p>Ship tools that hold up in real use: students finish homework and speak, typing feels natural, character study has a path, and huge files still open and edit smoothly.</p>
</article>
<article class="feature-card">
<h2>Brand story</h2>
<p>“Zhihua” suggests intelligence and culture coming into bloom. Five Questions is the company; Zhihua is the product brand for Chinese learning and input. Linguistics, engineering, and product work sit on one line.</p>
</article>
<article class="feature-card">
<h2>Team</h2>
<p>The team builds and iterates products: ship features, fix issues, listen to feedback. We do not recruit students or run a faculty franchise—effort goes into the software.</p>
</article>
</div>
</section>
<section class="section compact">
<div class="container">
<div class="about-products">
<a href="/smartbuddy/">SmartBuddy</a>
<a href="/smartinput/">SmartInput</a>
<a href="/smarthanzi/">SmartHanzi</a>
<a href="/massiveedit/en/">MassiveEdit</a>
</div>
</div>
</section>
</main>
<footer class="site-footer">
<div class="container footer-main">
<div>
<h3>Five Questions (Beijing) Technology Co., Ltd.</h3>
<p>Address: Room A-012, 1F, North Auxiliary Building, No. 6 Tianfu North Street, Wenjing Subdistrict, Tongzhou District, Beijing 101100, China</p>
<p>Email: liutingchao@fivequestions.cn</p>
</div>
<div>
<h3>About</h3>
<div class="footer-links">
<a href="about.html">Company</a>
</div>
</div>
<div>
<h3>Products</h3>
<div class="footer-links">
<a href="/smartbuddy/">SmartBuddy</a>
<a href="/smartinput/">SmartInput</a>
<a href="/smarthanzi/">SmartHanzi</a>
<a href="/massiveedit/en/">MassiveEdit</a>
</div>
</div>
</div>
<div class="container footer-bottom">
<p class="footer-legal-line">
© 2026 Five Questions (Beijing) Technology Co., Ltd. All rights reserved.
<a class="footer-icp-link" href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a>
</p>
<p class="footer-trademark">五道题® and 智花® are registered trademarks of Five Questions (Beijing) Technology Co., Ltd. English wording on this site is for display only and does not replace the Chinese marks. Unauthorized use that may cause confusion is prohibited.</p>
</div>
</footer>
</div>
<script src="../js/site.js"></script>
</body>
</html>
+176
View File
@@ -0,0 +1,176 @@
<!DOCTYPE html>
<html lang="en" data-theme="light" class="site-lang-en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Zhihua | Five Questions</title>
<meta name="description" content="Software from Five Questions: SmartBuddy, SmartInput, SmartHanzi, and MassiveEdit—learning, input, and productivity tools." />
<link rel="icon" type="image/svg+xml" href="../images/logo.svg" />
<link rel="alternate" hreflang="zh-CN" href="../index.html" />
<link rel="alternate" hreflang="en" href="index.html" />
<link rel="alternate" hreflang="ja" href="../ja/index.html" />
<link rel="alternate" hreflang="fr" href="../fr/index.html" />
<link rel="alternate" hreflang="x-default" href="../index.html" />
<link rel="stylesheet" href="../css/site.css" />
<script>
(function () {
try {
var t = localStorage.getItem("theme");
var dark =
t === "dark" ||
(!t && window.matchMedia("(prefers-color-scheme: dark)").matches);
document.documentElement.setAttribute("data-theme", dark ? "dark" : "light");
} catch (_) {}
})();
</script>
</head>
<body>
<div class="page-shell bg-wash">
<header class="site-header">
<div class="container site-nav">
<a class="brand" href="index.html" aria-label="Zhihua home">
<img class="brand-mark" src="../images/logo.svg" alt="" />
<div class="brand-copy">
<strong>Zhihua</strong><span>|</span><span>Five Questions</span>
</div>
</a>
<nav class="nav-links" aria-label="Language">
<a class="nav-link current" href="index.html">Home</a>
<a class="nav-link" href="index.html#products">Products</a>
<a class="nav-link" href="about.html">About</a>
</nav>
<div class="header-tools">
<details class="lang-switch">
<summary class="locale-pill" aria-label="Language">
<span>English</span>
<svg width="10" height="10" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>
</summary>
<div class="lang-switch-panel">
<a href="../index.html" hreflang="zh-CN" lang="zh-CN">中文</a>
<a class="current" href="index.html" hreflang="en" lang="en">English</a>
<a href="../ja/index.html" hreflang="ja" lang="ja">日本語</a>
<a href="../fr/index.html" hreflang="fr" lang="fr">Français</a>
</div>
</details>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="Switch light or dark theme" title="Switch light or dark theme">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
<button class="menu-toggle" type="button" data-menu-toggle aria-expanded="false" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 5h16M4 12h16M4 19h16"/></svg>
</button>
</div>
<div class="container mobile-menu" data-mobile-menu>
<a class="current" href="index.html">Home</a>
<a href="index.html#products">Products</a>
<a href="about.html">About</a>
<div class="mobile-lang">
<p>Language</p>
<a href="../index.html">中文</a>
<a class="current" href="index.html">English</a>
<a href="../ja/index.html">日本語</a>
<a href="../fr/index.html">Français</a>
</div>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="Switch light or dark theme">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
</header>
<main>
<section class="hero home-hero">
<div class="container">
<p class="home-kicker">Zhihua · Five Questions</p>
<h1 class="hero-title">Learning, input, and productivity tools</h1>
<p class="home-lead">From Five Questions. Zhihua covers Chinese learning and input; MassiveEdit is built for very large text files.</p>
<div class="hero-actions">
<a class="btn btn-primary" href="#products">See products</a>
<a class="btn btn-outline" href="about.html">About us</a>
</div>
</div>
</section>
<section class="section compact" id="products">
<div class="container">
<div class="section-head">
<h2 class="section-title">Products</h2>
<p class="section-copy">Zhihua is for Chinese learning and typing. MassiveEdit is for people who need to work with huge text files.</p>
</div>
<div class="product-grid">
<article class="feature-card product-card">
<p class="product-kicker">SmartBuddy</p>
<h3>智花学伴</h3>
<p>A student app for international Chinese: homework from teachers, speaking practice, coaching, and real-life scenes.</p>
<a class="mini-link" href="/smartbuddy/">Open SmartBuddy</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">SmartInput</p>
<h3>智花输入法</h3>
<p>Full QWERTY pinyin, 9-key pinyin, stroke, and handwriting—on iOS, Android, and desktop.</p>
<a class="mini-link" href="/smartinput/">Open SmartInput</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">SmartHanzi</p>
<h3>智花识字</h3>
<p>Learn characters with the school textbook: reading, stroke tracing, and spaced review.</p>
<a class="mini-link" href="/smarthanzi/">Open SmartHanzi</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">Large File Editor</p>
<h3>MassiveEdit</h3>
<p>A text editor for very large files, built for fast open, smooth scrolling, and steady editing.</p>
<a class="mini-link" href="/massiveedit/en/">Open MassiveEdit</a>
</article>
</div>
</div>
</section>
<section class="section compact" id="company">
<div class="container grid-two company-contact">
<article class="feature-card">
<h3>Five Questions</h3>
<p>Five Questions (Beijing) Technology Co., Ltd. builds practical learning and productivity software. Zhihua is the brand for Chinese learning and input; MassiveEdit is our large-file editor.</p>
<a class="mini-link" href="about.html">About the company</a>
</article>
<article class="feature-card">
<h3>Contact</h3>
<p>For trials, partnerships, or product questions, write to us.</p>
<a class="mini-link" href="mailto:liutingchao@fivequestions.cn">Email us</a>
</article>
</div>
</section>
</main>
<footer class="site-footer">
<div class="container footer-main">
<div>
<h3>Five Questions (Beijing) Technology Co., Ltd.</h3>
<p>Address: Room A-012, 1F, North Auxiliary Building, No. 6 Tianfu North Street, Wenjing Subdistrict, Tongzhou District, Beijing 101100, China</p>
<p>Email: liutingchao@fivequestions.cn</p>
</div>
<div>
<h3>About</h3>
<div class="footer-links">
<a href="about.html">Company</a>
</div>
</div>
<div>
<h3>Products</h3>
<div class="footer-links">
<a href="/smartbuddy/">SmartBuddy</a>
<a href="/smartinput/">SmartInput</a>
<a href="/smarthanzi/">SmartHanzi</a>
<a href="/massiveedit/en/">MassiveEdit</a>
</div>
</div>
</div>
<div class="container footer-bottom">
<p class="footer-legal-line">
© 2026 Five Questions (Beijing) Technology Co., Ltd. All rights reserved.
<a class="footer-icp-link" href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a>
</p>
<p class="footer-trademark">五道题® and 智花® are registered trademarks of Five Questions (Beijing) Technology Co., Ltd. English wording on this site is for display only and does not replace the Chinese marks. Unauthorized use that may cause confusion is prohibited.</p>
</div>
</footer>
</div>
<script src="../js/site.js"></script>
</body>
</html>
Binary file not shown.
Binary file not shown.
Binary file not shown.
+154
View File
@@ -0,0 +1,154 @@
<!DOCTYPE html>
<html lang="fr" data-theme="light" class="site-lang-fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>À propos | Zhihua · Five Questions</title>
<meta name="description" content="Five Questions (Beijing) Technology Co., Ltd. : produits Zhihua dapprentissage et de saisie, et des outils comme MassiveEdit." />
<link rel="icon" type="image/svg+xml" href="../images/logo.svg" />
<link rel="alternate" hreflang="zh-CN" href="../about.html" />
<link rel="alternate" hreflang="en" href="../en/about.html" />
<link rel="alternate" hreflang="ja" href="../ja/about.html" />
<link rel="alternate" hreflang="fr" href="about.html" />
<link rel="alternate" hreflang="x-default" href="../about.html" />
<link rel="stylesheet" href="../css/site.css" />
<script>
(function () {
try {
var t = localStorage.getItem("theme");
var dark =
t === "dark" ||
(!t && window.matchMedia("(prefers-color-scheme: dark)").matches);
document.documentElement.setAttribute("data-theme", dark ? "dark" : "light");
} catch (_) {}
})();
</script>
</head>
<body>
<div class="page-shell bg-wash">
<header class="site-header">
<div class="container site-nav">
<a class="brand" href="index.html" aria-label="Accueil Zhihua">
<img class="brand-mark" src="../images/logo.svg" alt="" />
<div class="brand-copy">
<strong>Zhihua</strong><span>|</span><span>Five Questions</span>
</div>
</a>
<nav class="nav-links" aria-label="Langue">
<a class="nav-link" href="index.html">Accueil</a>
<a class="nav-link" href="index.html#products">Produits</a>
<a class="nav-link current" href="about.html">À propos</a>
</nav>
<div class="header-tools">
<details class="lang-switch">
<summary class="locale-pill" aria-label="Langue">
<span>Français</span>
<svg width="10" height="10" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>
</summary>
<div class="lang-switch-panel">
<a href="../about.html" hreflang="zh-CN" lang="zh-CN">中文</a>
<a href="../en/about.html" hreflang="en" lang="en">English</a>
<a href="../ja/about.html" hreflang="ja" lang="ja">日本語</a>
<a class="current" href="about.html" hreflang="fr" lang="fr">Français</a>
</div>
</details>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="Basculer entre thème clair et sombre" title="Basculer entre thème clair et sombre">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
<button class="menu-toggle" type="button" data-menu-toggle aria-expanded="false" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 5h16M4 12h16M4 19h16"/></svg>
</button>
</div>
<div class="container mobile-menu" data-mobile-menu>
<a href="index.html">Accueil</a>
<a href="index.html#products">Produits</a>
<a class="current" href="about.html">À propos</a>
<div class="mobile-lang">
<p>Langue</p>
<a href="../about.html">中文</a>
<a href="../en/about.html">English</a>
<a href="../ja/about.html">日本語</a>
<a class="current" href="about.html">Français</a>
</div>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="Basculer entre thème clair et sombre">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
</header>
<main>
<section class="hero home-hero about-hero">
<div class="container">
<p class="home-kicker">Zhihua · Five Questions</p>
<h1 class="hero-title">À propos</h1>
<p class="home-lead">Nous développons des logiciels dapprentissage, de saisie et defficacité. Zhihua couvre le chinois ; MassiveEdit sadresse aux très gros fichiers texte.</p>
</div>
</section>
<section class="section compact">
<div class="container about-stack">
<article class="feature-card">
<h2>Vision</h2>
<p>Transformer ce qui est vraiment pénible dans lapprentissage, lexpression et le travail quotidien en logiciels utilisables—clairs, stables, et faits pour durer.</p>
</article>
<article class="feature-card">
<h2>Mission</h2>
<p>Livrer des outils qui tiennent sur le terrain : finir les devoirs et parler, saisir plus naturellement, suivre un chemin pour les caractères, ouvrir et éditer d’énormes fichiers.</p>
</article>
<article class="feature-card">
<h2>Histoire de marque</h2>
<p>« Zhihua » évoque lintelligence et la culture qui s’épanouissent ensemble. Five Questions est lentreprise ; Zhihua, la marque pour lapprentissage et la saisie du chinois. Linguistique, ingénierie et produit avancent sur la même ligne.</p>
</article>
<article class="feature-card">
<h2>Équipe</h2>
<p>L’équipe développe et itère : livrer, corriger, écouter. Nous ne recrutons pas d’élèves et nexploitons pas de réseau enseignant—leffort va au logiciel.</p>
</article>
</div>
</section>
<section class="section compact">
<div class="container">
<div class="about-products">
<a href="/smartbuddy/">SmartBuddy</a>
<a href="/smartinput/">SmartInput</a>
<a href="/smarthanzi/">SmartHanzi</a>
<a href="/massiveedit/en/">MassiveEdit</a>
</div>
</div>
</section>
</main>
<footer class="site-footer">
<div class="container footer-main">
<div>
<h3>Five Questions (Beijing) Technology Co., Ltd.</h3>
<p>Adresse : Room A-012, 1F, North Auxiliary Building, No. 6 Tianfu North Street, Wenjing Subdistrict, Tongzhou District, Beijing 101100, Chine</p>
<p>Courriel : liutingchao@fivequestions.cn</p>
</div>
<div>
<h3>À propos</h3>
<div class="footer-links">
<a href="about.html">Lentreprise</a>
</div>
</div>
<div>
<h3>Produits</h3>
<div class="footer-links">
<a href="/smartbuddy/">SmartBuddy</a>
<a href="/smartinput/">SmartInput</a>
<a href="/smarthanzi/">SmartHanzi</a>
<a href="/massiveedit/en/">MassiveEdit</a>
</div>
</div>
</div>
<div class="container footer-bottom">
<p class="footer-legal-line">
© 2026 Five Questions (Beijing) Technology Co., Ltd. Tous droits réservés.
<a class="footer-icp-link" href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a>
</p>
<p class="footer-trademark">五道题® et 智花® sont des marques enregistrées de Five Questions (Beijing) Technology Co., Ltd. Les libellés en anglais sur ce site sont purement indicatifs et ne remplacent pas les marques en chinois. Toute utilisation non autorisée susceptible de créer une confusion est interdite.</p>
</div>
</footer>
</div>
<script src="../js/site.js"></script>
</body>
</html>
+176
View File
@@ -0,0 +1,176 @@
<!DOCTYPE html>
<html lang="fr" data-theme="light" class="site-lang-fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Zhihua | Five Questions</title>
<meta name="description" content="Logiciels de Five Questions : SmartBuddy, SmartInput, SmartHanzi et MassiveEdit—apprentissage, saisie et outils defficacité." />
<link rel="icon" type="image/svg+xml" href="../images/logo.svg" />
<link rel="alternate" hreflang="zh-CN" href="../index.html" />
<link rel="alternate" hreflang="en" href="../en/index.html" />
<link rel="alternate" hreflang="ja" href="../ja/index.html" />
<link rel="alternate" hreflang="fr" href="index.html" />
<link rel="alternate" hreflang="x-default" href="../index.html" />
<link rel="stylesheet" href="../css/site.css" />
<script>
(function () {
try {
var t = localStorage.getItem("theme");
var dark =
t === "dark" ||
(!t && window.matchMedia("(prefers-color-scheme: dark)").matches);
document.documentElement.setAttribute("data-theme", dark ? "dark" : "light");
} catch (_) {}
})();
</script>
</head>
<body>
<div class="page-shell bg-wash">
<header class="site-header">
<div class="container site-nav">
<a class="brand" href="index.html" aria-label="Accueil Zhihua">
<img class="brand-mark" src="../images/logo.svg" alt="" />
<div class="brand-copy">
<strong>Zhihua</strong><span>|</span><span>Five Questions</span>
</div>
</a>
<nav class="nav-links" aria-label="Langue">
<a class="nav-link current" href="index.html">Accueil</a>
<a class="nav-link" href="index.html#products">Produits</a>
<a class="nav-link" href="about.html">À propos</a>
</nav>
<div class="header-tools">
<details class="lang-switch">
<summary class="locale-pill" aria-label="Langue">
<span>Français</span>
<svg width="10" height="10" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>
</summary>
<div class="lang-switch-panel">
<a href="../index.html" hreflang="zh-CN" lang="zh-CN">中文</a>
<a href="../en/index.html" hreflang="en" lang="en">English</a>
<a href="../ja/index.html" hreflang="ja" lang="ja">日本語</a>
<a class="current" href="index.html" hreflang="fr" lang="fr">Français</a>
</div>
</details>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="Basculer entre thème clair et sombre" title="Basculer entre thème clair et sombre">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
<button class="menu-toggle" type="button" data-menu-toggle aria-expanded="false" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 5h16M4 12h16M4 19h16"/></svg>
</button>
</div>
<div class="container mobile-menu" data-mobile-menu>
<a class="current" href="index.html">Accueil</a>
<a href="index.html#products">Produits</a>
<a href="about.html">À propos</a>
<div class="mobile-lang">
<p>Langue</p>
<a href="../index.html">中文</a>
<a href="../en/index.html">English</a>
<a href="../ja/index.html">日本語</a>
<a class="current" href="index.html">Français</a>
</div>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="Basculer entre thème clair et sombre">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
</header>
<main>
<section class="hero home-hero">
<div class="container">
<p class="home-kicker">Zhihua · Five Questions</p>
<h1 class="hero-title">Apprentissage, saisie et outils defficacité</h1>
<p class="home-lead">Édités par Five Questions. Zhihua couvre lapprentissage et la saisie du chinois ; MassiveEdit sadresse aux très gros fichiers texte.</p>
<div class="hero-actions">
<a class="btn btn-primary" href="#products">Voir les produits</a>
<a class="btn btn-outline" href="about.html">À propos</a>
</div>
</div>
</section>
<section class="section compact" id="products">
<div class="container">
<div class="section-head">
<h2 class="section-title">Produits</h2>
<p class="section-copy">Zhihua sert lapprentissage et la saisie du chinois. MassiveEdit sadresse à ceux qui travaillent sur d’énormes fichiers texte.</p>
</div>
<div class="product-grid">
<article class="feature-card product-card">
<p class="product-kicker">SmartBuddy</p>
<h3>智花学伴</h3>
<p>Application élève pour le chinois international : devoirs, oral, renforcement et scènes de la vie quotidienne.</p>
<a class="mini-link" href="/smartbuddy/">Ouvrir SmartBuddy</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">SmartInput</p>
<h3>智花输入法</h3>
<p>Pinyin clavier complet, pinyin 9 touches, traits et écriture manuscrite—sur iOS, Android et bureau.</p>
<a class="mini-link" href="/smartinput/">Ouvrir SmartInput</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">SmartHanzi</p>
<h3>智花识字</h3>
<p>Apprendre les caractères avec le manuel scolaire : lecture, tracé des traits et révision espacée.</p>
<a class="mini-link" href="/smarthanzi/">Ouvrir SmartHanzi</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">Large File Editor</p>
<h3>MassiveEdit</h3>
<p>Éditeur pour de très gros fichiers texte : ouverture rapide, défilement fluide, édition stable.</p>
<a class="mini-link" href="/massiveedit/en/">Ouvrir MassiveEdit</a>
</article>
</div>
</div>
</section>
<section class="section compact" id="company">
<div class="container grid-two company-contact">
<article class="feature-card">
<h3>Five Questions</h3>
<p>Five Questions (Beijing) Technology Co., Ltd. conçoit des logiciels dapprentissage et defficacité. Zhihua est la marque pour le chinois ; MassiveEdit est notre éditeur de très gros fichiers.</p>
<a class="mini-link" href="about.html">Lentreprise</a>
</article>
<article class="feature-card">
<h3>Contact</h3>
<p>Pour un essai, un partenariat ou une question produit, écrivez-nous.</p>
<a class="mini-link" href="mailto:liutingchao@fivequestions.cn">Envoyer un courriel</a>
</article>
</div>
</section>
</main>
<footer class="site-footer">
<div class="container footer-main">
<div>
<h3>Five Questions (Beijing) Technology Co., Ltd.</h3>
<p>Adresse : Room A-012, 1F, North Auxiliary Building, No. 6 Tianfu North Street, Wenjing Subdistrict, Tongzhou District, Beijing 101100, Chine</p>
<p>Courriel : liutingchao@fivequestions.cn</p>
</div>
<div>
<h3>À propos</h3>
<div class="footer-links">
<a href="about.html">Lentreprise</a>
</div>
</div>
<div>
<h3>Produits</h3>
<div class="footer-links">
<a href="/smartbuddy/">SmartBuddy</a>
<a href="/smartinput/">SmartInput</a>
<a href="/smarthanzi/">SmartHanzi</a>
<a href="/massiveedit/en/">MassiveEdit</a>
</div>
</div>
</div>
<div class="container footer-bottom">
<p class="footer-legal-line">
© 2026 Five Questions (Beijing) Technology Co., Ltd. Tous droits réservés.
<a class="footer-icp-link" href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a>
</p>
<p class="footer-trademark">五道题® et 智花® sont des marques enregistrées de Five Questions (Beijing) Technology Co., Ltd. Les libellés en anglais sur ce site sont purement indicatifs et ne remplacent pas les marques en chinois. Toute utilisation non autorisée susceptible de créer une confusion est interdite.</p>
</div>
</footer>
</div>
<script src="../js/site.js"></script>
</body>
</html>
+9
View File
@@ -0,0 +1,9 @@
<svg viewBox="0 0 43.4326 42.6396" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="43.432617" height="42.639648" fill="none" customFrame="#000000">
<g id="组合 1">
<path id="Fill 29" d="M26.142 22.754C28.928 20.721 30.699 16.653 30.699 12.185C30.699 8.453 29.569 5.07 27.599 2.903L27.597 2.901C25.962 1.058 23.614 0 21.154 0C16.555 0 12.823 3.542 12.561 8.105C12.629 8.112 12.697 8.12 12.765 8.13C16.793 8.688 20.408 10.479 22.942 13.173C25.49 15.881 26.643 19.178 26.189 22.455C26.175 22.553 26.16 22.651 26.142 22.754Z" fill="rgb(49,123,255)" fill-rule="evenodd" />
<path id="Fill 30" d="M0.429332 16.2493C-0.991668 20.6233 1.22233 25.2673 5.48133 26.9263C5.51033 26.8633 5.53833 26.8023 5.56833 26.7393C7.34433 23.0813 10.1643 20.1973 13.5093 18.6193C16.8723 17.0333 20.3643 16.9553 23.3413 18.3993C23.4293 18.4423 23.5183 18.4883 23.6103 18.5363C22.5373 15.2593 19.2173 12.3173 14.9663 10.9373C13.2343 10.3733 11.4963 10.0923 9.86133 10.0923C8.14833 10.0923 6.54833 10.4003 5.18133 11.0173L5.17933 11.0183C2.92033 12.0033 1.18933 13.9103 0.429332 16.2493Z" fill="rgb(49,123,255)" fill-rule="evenodd" />
<path id="Fill 31" d="M21.1932 39.4748C21.1432 39.4288 21.0922 39.3828 21.0432 39.3348C14.9782 33.5008 13.8832 24.7628 18.6032 19.8558C18.6722 19.7848 18.7422 19.7128 18.8172 19.6418C15.3682 19.6488 11.5442 21.8988 8.91825 25.5138C6.72525 28.5328 5.65125 31.9328 5.97025 34.8438L5.97125 34.8478C6.21025 37.2998 7.48825 39.5358 9.47825 40.9818C13.1992 43.6848 18.2992 43.0128 21.1932 39.4748Z" fill="rgb(49,123,255)" fill-rule="evenodd" />
<path id="Fill 32" d="M35.7959 40.0178C39.5169 37.3138 40.4539 32.2558 37.9839 28.4108C37.9239 28.4438 37.8649 28.4778 37.8039 28.5098C34.2169 30.4258 30.2409 31.1008 26.6079 30.4118C22.9539 29.7178 20.0839 27.7288 18.5239 24.8108C18.4779 24.7238 18.4319 24.6348 18.3869 24.5408C17.3279 27.8238 18.2859 32.1558 20.9129 35.7708C23.1059 38.7888 26.0079 40.8618 28.8759 41.4568L28.8789 41.4568C31.2849 41.9878 33.8059 41.4628 35.7959 40.0178Z" fill="rgb(49,123,255)" fill-rule="evenodd" />
<path id="Fill 33" d="M42.2426 21.7159L42.2436 21.7139C43.4926 19.5889 43.7726 17.0289 43.0126 14.6899C41.5906 10.3159 37.0696 7.86194 32.6496 9.02294C32.6626 9.08894 32.6756 9.15594 32.6876 9.22394C34.1656 17.5079 29.9146 25.2219 23.2126 26.4169C23.1156 26.4349 23.0166 26.4499 22.9136 26.4649C25.7076 28.4859 30.1236 28.9139 34.3736 27.5319C37.9226 26.3799 40.7896 24.2599 42.2426 21.7159Z" fill="rgb(49,123,255)" fill-rule="evenodd" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

+176
View File
@@ -0,0 +1,176 @@
<!DOCTYPE html>
<html lang="zh-CN" data-theme="light" class="site-lang-zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>智花|五道题</title>
<meta name="description" content="五道题(北京)科技有限公司出品:智花学伴、智花输入法、智花识字与 MassiveEdit,覆盖学习、输入与效率工具。" />
<link rel="icon" type="image/svg+xml" href="images/logo.svg" />
<link rel="alternate" hreflang="zh-CN" href="index.html" />
<link rel="alternate" hreflang="en" href="en/index.html" />
<link rel="alternate" hreflang="ja" href="ja/index.html" />
<link rel="alternate" hreflang="fr" href="fr/index.html" />
<link rel="alternate" hreflang="x-default" href="index.html" />
<link rel="stylesheet" href="css/site.css" />
<script>
(function () {
try {
var t = localStorage.getItem("theme");
var dark =
t === "dark" ||
(!t && window.matchMedia("(prefers-color-scheme: dark)").matches);
document.documentElement.setAttribute("data-theme", dark ? "dark" : "light");
} catch (_) {}
})();
</script>
</head>
<body>
<div class="page-shell bg-wash">
<header class="site-header">
<div class="container site-nav">
<a class="brand" href="index.html" aria-label="智花首页">
<img class="brand-mark" src="images/logo.svg" alt="" />
<div class="brand-copy">
<strong>智花</strong><span>|</span><span>五道题</span>
</div>
</a>
<nav class="nav-links" aria-label="语言">
<a class="nav-link current" href="index.html">首页</a>
<a class="nav-link" href="index.html#products">产品</a>
<a class="nav-link" href="about.html">关于我们</a>
</nav>
<div class="header-tools">
<details class="lang-switch">
<summary class="locale-pill" aria-label="语言">
<span>中文</span>
<svg width="10" height="10" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>
</summary>
<div class="lang-switch-panel">
<a class="current" href="index.html" hreflang="zh-CN" lang="zh-CN">中文</a>
<a href="en/index.html" hreflang="en" lang="en">English</a>
<a href="ja/index.html" hreflang="ja" lang="ja">日本語</a>
<a href="fr/index.html" hreflang="fr" lang="fr">Français</a>
</div>
</details>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="切换浅色或深色主题" title="切换浅色或深色主题">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
<button class="menu-toggle" type="button" data-menu-toggle aria-expanded="false" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 5h16M4 12h16M4 19h16"/></svg>
</button>
</div>
<div class="container mobile-menu" data-mobile-menu>
<a class="current" href="index.html">首页</a>
<a href="index.html#products">产品</a>
<a href="about.html">关于我们</a>
<div class="mobile-lang">
<p>语言</p>
<a class="current" href="index.html">中文</a>
<a href="en/index.html">English</a>
<a href="ja/index.html">日本語</a>
<a href="fr/index.html">Français</a>
</div>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="切换浅色或深色主题">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
</header>
<main>
<section class="hero home-hero">
<div class="container">
<p class="home-kicker">智花 · 五道题</p>
<h1 class="hero-title">学习、输入与效率工具</h1>
<p class="home-lead">五道题出品。智花覆盖中文学习与输入,同时提供面向大文件的效率工具。</p>
<div class="hero-actions">
<a class="btn btn-primary" href="#products">查看产品</a>
<a class="btn btn-outline" href="about.html">关于我们</a>
</div>
</div>
</section>
<section class="section compact" id="products">
<div class="container">
<div class="section-head">
<h2 class="section-title">我们的产品</h2>
<p class="section-copy">智花面向中文学习与输入;MassiveEdit 服务需要稳定处理超大文本的人。</p>
</div>
<div class="product-grid">
<article class="feature-card product-card">
<p class="product-kicker">SmartBuddy</p>
<h3>智花学伴</h3>
<p>面向国际中文学习的学生端:完成教师布置的作业,用语音评测、强化练习和生活场景把中文说出来。</p>
<a class="mini-link" href="/smartbuddy/">进入智花学伴</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">SmartInput</p>
<h3>智花输入法</h3>
<p>支持全键盘拼音、九键拼音、笔画与手写,覆盖 iOS、Android 与桌面平台。</p>
<a class="mini-link" href="/smartinput/">进入智花输入法</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">SmartHanzi</p>
<h3>智花识字</h3>
<p>跟着小学教材认字写字,认读、描红笔顺与智能复习连成一条路径。</p>
<a class="mini-link" href="/smarthanzi/">进入智花识字</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">Large File Editor</p>
<h3>MassiveEdit</h3>
<p>面向超大文本文件的编辑器,强调打开速度、滚动流畅与稳定编辑。</p>
<a class="mini-link" href="/massiveedit/">进入 MassiveEdit</a>
</article>
</div>
</div>
</section>
<section class="section compact" id="company">
<div class="container grid-two company-contact">
<article class="feature-card">
<h3>五道题</h3>
<p>五道题(北京)科技有限公司做可落地的学习与效率软件。智花是面向中文学习与输入的产品品牌;MassiveEdit 是同一主体下的大文件文本编辑器。</p>
<a class="mini-link" href="about.html">了解公司</a>
</article>
<article class="feature-card">
<h3>联系我们</h3>
<p>试用、合作或产品问题,欢迎来信。</p>
<a class="mini-link" href="mailto:liutingchao@fivequestions.cn">发送邮件</a>
</article>
</div>
</section>
</main>
<footer class="site-footer">
<div class="container footer-main">
<div>
<h3>五道题(北京)科技有限公司</h3>
<p>地址:北京市通州区文景街道田府北街6号北配楼1层A-012</p>
<p>邮箱:liutingchao@fivequestions.cn</p>
</div>
<div>
<h3>关于我们</h3>
<div class="footer-links">
<a href="about.html">公司介绍</a>
</div>
</div>
<div>
<h3>产品</h3>
<div class="footer-links">
<a href="/smartbuddy/">智花学伴</a>
<a href="/smartinput/">智花输入法</a>
<a href="/smarthanzi/">智花识字</a>
<a href="/massiveedit/">MassiveEdit</a>
</div>
</div>
</div>
<div class="container footer-bottom">
<p class="footer-legal-line">
© 2026 五道题(北京)科技有限公司 保留所有权利
<a class="footer-icp-link" href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a>
</p>
<p class="footer-trademark">「五道题®」「智花®」为五道题(北京)科技有限公司注册商标;未经许可,他人不得以可能造成相关公众混淆的方式使用。</p>
</div>
</footer>
</div>
<script src="js/site.js"></script>
</body>
</html>
+154
View File
@@ -0,0 +1,154 @@
<!DOCTYPE html>
<html lang="ja" data-theme="light" class="site-lang-ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>私たちについて|智花 · 五道题</title>
<meta name="description" content="五道题(北京)科技有限公司:智花の学習・入力製品と、MassiveEdit などの効率ツール。" />
<link rel="icon" type="image/svg+xml" href="../images/logo.svg" />
<link rel="alternate" hreflang="zh-CN" href="../about.html" />
<link rel="alternate" hreflang="en" href="../en/about.html" />
<link rel="alternate" hreflang="ja" href="about.html" />
<link rel="alternate" hreflang="fr" href="../fr/about.html" />
<link rel="alternate" hreflang="x-default" href="../about.html" />
<link rel="stylesheet" href="../css/site.css" />
<script>
(function () {
try {
var t = localStorage.getItem("theme");
var dark =
t === "dark" ||
(!t && window.matchMedia("(prefers-color-scheme: dark)").matches);
document.documentElement.setAttribute("data-theme", dark ? "dark" : "light");
} catch (_) {}
})();
</script>
</head>
<body>
<div class="page-shell bg-wash">
<header class="site-header">
<div class="container site-nav">
<a class="brand" href="index.html" aria-label="智花ホーム">
<img class="brand-mark" src="../images/logo.svg" alt="" />
<div class="brand-copy">
<strong>智花</strong><span>|</span><span>五道题</span>
</div>
</a>
<nav class="nav-links" aria-label="言語">
<a class="nav-link" href="index.html">ホーム</a>
<a class="nav-link" href="index.html#products">製品</a>
<a class="nav-link current" href="about.html">私たちについて</a>
</nav>
<div class="header-tools">
<details class="lang-switch">
<summary class="locale-pill" aria-label="言語">
<span>日本語</span>
<svg width="10" height="10" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>
</summary>
<div class="lang-switch-panel">
<a href="../about.html" hreflang="zh-CN" lang="zh-CN">中文</a>
<a href="../en/about.html" hreflang="en" lang="en">English</a>
<a class="current" href="about.html" hreflang="ja" lang="ja">日本語</a>
<a href="../fr/about.html" hreflang="fr" lang="fr">Français</a>
</div>
</details>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="テーマを切り替え" title="テーマを切り替え">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
<button class="menu-toggle" type="button" data-menu-toggle aria-expanded="false" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 5h16M4 12h16M4 19h16"/></svg>
</button>
</div>
<div class="container mobile-menu" data-mobile-menu>
<a href="index.html">ホーム</a>
<a href="index.html#products">製品</a>
<a class="current" href="about.html">私たちについて</a>
<div class="mobile-lang">
<p>言語</p>
<a href="../about.html">中文</a>
<a href="../en/about.html">English</a>
<a class="current" href="about.html">日本語</a>
<a href="../fr/about.html">Français</a>
</div>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="テーマを切り替え">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
</header>
<main>
<section class="hero home-hero about-hero">
<div class="container">
<p class="home-kicker">智花 · 五道题</p>
<h1 class="hero-title">私たちについて</h1>
<p class="home-lead">学習、入力、効率のためのソフトウェアを開発しています。智花は中国語の学習と入力、MassiveEdit は巨大テキストを扱う人のための製品です。</p>
</div>
</section>
<section class="section compact">
<div class="container about-stack">
<article class="feature-card">
<h2>ビジョン</h2>
<p>学び、伝え、日々の仕事で本当に手間のかかる部分を、使えるソフトウェアにします。分かりやすく、安定して、長く磨いていけるものを目指します。</p>
</article>
<article class="feature-card">
<h2>ミッション</h2>
<p>現場で使える製品を出し続けること。課題を終え、口を開け、入力が自然になり、識字に道筋があり、巨大ファイルも開いて編集できること。</p>
</article>
<article class="feature-card">
<h2>ブランドストーリー</h2>
<p>「智花」は知恵と文化がともに花開くイメージです。五道题は会社主体、智花は中国語の学習と入力の製品ブランド。言語学、エンジニアリング、製品改善を一本の線で進めています。</p>
</article>
<article class="feature-card">
<h2>チーム</h2>
<p>チームの仕事は製品開発と継続的な改善です。機能を出し、不具合を直し、フィードバックを聞く。生徒募集や教員フランチャイズは行いません。</p>
</article>
</div>
</section>
<section class="section compact">
<div class="container">
<div class="about-products">
<a href="/smartbuddy/">智花学伴</a>
<a href="/smartinput/">智花入力</a>
<a href="/smarthanzi/">智花識字</a>
<a href="/massiveedit/">MassiveEdit</a>
</div>
</div>
</section>
</main>
<footer class="site-footer">
<div class="container footer-main">
<div>
<h3>五道题(北京)科技有限公司</h3>
<p>住所:北京市通州区文景街道田府北街6号北配楼1階A-012</p>
<p>メール:liutingchao@fivequestions.cn</p>
</div>
<div>
<h3>会社情報</h3>
<div class="footer-links">
<a href="about.html">会社紹介</a>
</div>
</div>
<div>
<h3>製品</h3>
<div class="footer-links">
<a href="/smartbuddy/">智花学伴</a>
<a href="/smartinput/">智花入力</a>
<a href="/smarthanzi/">智花識字</a>
<a href="/massiveedit/">MassiveEdit</a>
</div>
</div>
</div>
<div class="container footer-bottom">
<p class="footer-legal-line">
© 2026 五道题(北京)科技有限公司。無断転載を禁じます。
<a class="footer-icp-link" href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a>
</p>
<p class="footer-trademark">「五道题®」「智花®」は五道题(北京)科技有限公司の登録商標です。関連公衆の誤認を招くおそれのある無断使用は禁止されます。</p>
</div>
</footer>
</div>
<script src="../js/site.js"></script>
</body>
</html>
+176
View File
@@ -0,0 +1,176 @@
<!DOCTYPE html>
<html lang="ja" data-theme="light" class="site-lang-ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>智花|五道题</title>
<meta name="description" content="五道题(北京)科技有限公司のソフトウェア:智花学伴、智花入力、智花識字、MassiveEdit。学習・入力・効率ツール。" />
<link rel="icon" type="image/svg+xml" href="../images/logo.svg" />
<link rel="alternate" hreflang="zh-CN" href="../index.html" />
<link rel="alternate" hreflang="en" href="../en/index.html" />
<link rel="alternate" hreflang="ja" href="index.html" />
<link rel="alternate" hreflang="fr" href="../fr/index.html" />
<link rel="alternate" hreflang="x-default" href="../index.html" />
<link rel="stylesheet" href="../css/site.css" />
<script>
(function () {
try {
var t = localStorage.getItem("theme");
var dark =
t === "dark" ||
(!t && window.matchMedia("(prefers-color-scheme: dark)").matches);
document.documentElement.setAttribute("data-theme", dark ? "dark" : "light");
} catch (_) {}
})();
</script>
</head>
<body>
<div class="page-shell bg-wash">
<header class="site-header">
<div class="container site-nav">
<a class="brand" href="index.html" aria-label="智花ホーム">
<img class="brand-mark" src="../images/logo.svg" alt="" />
<div class="brand-copy">
<strong>智花</strong><span>|</span><span>五道题</span>
</div>
</a>
<nav class="nav-links" aria-label="言語">
<a class="nav-link current" href="index.html">ホーム</a>
<a class="nav-link" href="index.html#products">製品</a>
<a class="nav-link" href="about.html">私たちについて</a>
</nav>
<div class="header-tools">
<details class="lang-switch">
<summary class="locale-pill" aria-label="言語">
<span>日本語</span>
<svg width="10" height="10" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>
</summary>
<div class="lang-switch-panel">
<a href="../index.html" hreflang="zh-CN" lang="zh-CN">中文</a>
<a href="../en/index.html" hreflang="en" lang="en">English</a>
<a class="current" href="index.html" hreflang="ja" lang="ja">日本語</a>
<a href="../fr/index.html" hreflang="fr" lang="fr">Français</a>
</div>
</details>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="テーマを切り替え" title="テーマを切り替え">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
<button class="menu-toggle" type="button" data-menu-toggle aria-expanded="false" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 5h16M4 12h16M4 19h16"/></svg>
</button>
</div>
<div class="container mobile-menu" data-mobile-menu>
<a class="current" href="index.html">ホーム</a>
<a href="index.html#products">製品</a>
<a href="about.html">私たちについて</a>
<div class="mobile-lang">
<p>言語</p>
<a href="../index.html">中文</a>
<a href="../en/index.html">English</a>
<a class="current" href="index.html">日本語</a>
<a href="../fr/index.html">Français</a>
</div>
<button class="theme-toggle-btn" type="button" data-theme-toggle aria-label="テーマを切り替え">
<svg class="icon-light" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
<svg class="icon-dark" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></svg>
</button>
</div>
</header>
<main>
<section class="hero home-hero">
<div class="container">
<p class="home-kicker">智花 · 五道题</p>
<h1 class="hero-title">学習、入力、効率のためのツール</h1>
<p class="home-lead">五道题の製品です。智花は中国語の学習と入力を、MassiveEdit は巨大テキストの編集を担います。</p>
<div class="hero-actions">
<a class="btn btn-primary" href="#products">製品を見る</a>
<a class="btn btn-outline" href="about.html">私たちについて</a>
</div>
</div>
</section>
<section class="section compact" id="products">
<div class="container">
<div class="section-head">
<h2 class="section-title">製品</h2>
<p class="section-copy">智花は中国語の学習と入力向け。MassiveEdit は超大容量テキストを扱う人向けです。</p>
</div>
<div class="product-grid">
<article class="feature-card product-card">
<p class="product-kicker">SmartBuddy</p>
<h3>智花学伴</h3>
<p>国際中国語学習向けの学習者アプリ。教員が出した課題、音声評価、強化練習、生活場面の会話に対応します。</p>
<a class="mini-link" href="/smartbuddy/">智花学伴へ</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">SmartInput</p>
<h3>智花入力</h3>
<p>フルキー拼音、九鍵拼音、筆画、手書きに対応。iOS、Android、デスクトップで利用できます。</p>
<a class="mini-link" href="/smartinput/">智花入力へ</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">SmartHanzi</p>
<h3>智花識字</h3>
<p>小学校の教材に沿って漢字を読む・書く。筆順のなぞりと復習を一本の道筋にします。</p>
<a class="mini-link" href="/smarthanzi/">智花識字へ</a>
</article>
<article class="feature-card product-card">
<p class="product-kicker">Large File Editor</p>
<h3>MassiveEdit</h3>
<p>超大容量テキスト向けのエディタ。起動、スクロール、安定した編集を重視します。</p>
<a class="mini-link" href="/massiveedit/">MassiveEdit へ</a>
</article>
</div>
</div>
</section>
<section class="section compact" id="company">
<div class="container grid-two company-contact">
<article class="feature-card">
<h3>五道题</h3>
<p>五道题(北京)科技有限公司は、使える学習・効率ソフトウェアを作ります。智花は中国語の学習と入力のブランド、MassiveEdit は同一主体の大容量テキストエディタです。</p>
<a class="mini-link" href="about.html">会社を見る</a>
</article>
<article class="feature-card">
<h3>お問い合わせ</h3>
<p>試用、提携、製品に関するご質問はメールでご連絡ください。</p>
<a class="mini-link" href="mailto:liutingchao@fivequestions.cn">メールを送る</a>
</article>
</div>
</section>
</main>
<footer class="site-footer">
<div class="container footer-main">
<div>
<h3>五道题(北京)科技有限公司</h3>
<p>住所:北京市通州区文景街道田府北街6号北配楼1階A-012</p>
<p>メール:liutingchao@fivequestions.cn</p>
</div>
<div>
<h3>会社情報</h3>
<div class="footer-links">
<a href="about.html">会社紹介</a>
</div>
</div>
<div>
<h3>製品</h3>
<div class="footer-links">
<a href="/smartbuddy/">智花学伴</a>
<a href="/smartinput/">智花入力</a>
<a href="/smarthanzi/">智花識字</a>
<a href="/massiveedit/">MassiveEdit</a>
</div>
</div>
</div>
<div class="container footer-bottom">
<p class="footer-legal-line">
© 2026 五道题(北京)科技有限公司。無断転載を禁じます。
<a class="footer-icp-link" href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a>
</p>
<p class="footer-trademark">「五道题®」「智花®」は五道题(北京)科技有限公司の登録商標です。関連公衆の誤認を招くおそれのある無断使用は禁止されます。</p>
</div>
</footer>
</div>
<script src="../js/site.js"></script>
</body>
</html>
+21
View File
@@ -0,0 +1,21 @@
(function () {
var toggle = document.querySelector("[data-menu-toggle]");
var menu = document.querySelector("[data-mobile-menu]");
if (toggle && menu) {
toggle.addEventListener("click", function () {
var isOpen = menu.classList.toggle("is-open");
toggle.setAttribute("aria-expanded", String(isOpen));
});
}
document.querySelectorAll("[data-theme-toggle]").forEach(function (btn) {
btn.addEventListener("click", function () {
var cur = document.documentElement.getAttribute("data-theme") === "dark" ? "dark" : "light";
var next = cur === "dark" ? "light" : "dark";
document.documentElement.setAttribute("data-theme", next);
try {
localStorage.setItem("theme", next);
} catch (_) {}
});
});
})();
BIN
View File
Binary file not shown.
+45
View File
@@ -0,0 +1,45 @@
# Architecture Blueprint
## Layers
1. File Access Layer
- `LargeFileBackend` wraps buffered random reads.
- `ChunkCache` adds LRU chunk caching for streaming document access.
2. Text Model Layer
- `PieceTable` references original file ranges plus append-only add buffer.
- Original bytes are fetched on-demand via callback; no full-file load.
3. Index Layer
- `LineIndexer` incrementally scans bytes and lazily materializes line starts.
4. Search Layer
- `SearchEngine` provides basic plain/regex matches.
- `SearchThreadPool` executes chunked background searches.
5. Session Layer
- `DocumentSession` coordinates backend/model/index lifecycle.
- Exposes UI-friendly APIs (`lines`, `lineAt`, `saveAs`, `undo/redo`, `startSearch`).
6. UI Layer
- `MainWindow` wires menus and status.
- `LargeFileView` implements viewport-based rendering for visible lines only.
## Milestones
## M1 - Real Large File Open
- Done: replaced preview mode with chunked streaming reads + file-backed piece table.
- Done: added LRU cache for original file chunks.
## M2 - Editing Correctness
- Done: transactional edit commands and undo/redo stacks.
- Next: persistent durable operation log across restarts.
## M3 - Search/Replace at Scale
- Done: worker thread pool and chunked background search.
- Next: match navigation/highlighting and replace workflows.
## M4 - Platform Hardening
- CRLF/LF normalization policy.
- File lock conflict handling.
- Recovery and crash-safe temp files.
+138
View File
@@ -0,0 +1,138 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit 更新日志</title>
<meta name="description" content="MassiveEdit 版本更新日志。" />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="./site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">首页</a>
<a href="./download.html">下载</a>
<a class="active" href="./changelog.html">更新日志</a>
<a href="./privacy.html">隐私政策</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="./en/changelog.html" data-lang-switch="en">EN</a>
<div class="theme-switch" role="group" aria-label="主题">
<button type="button" data-theme-mode="auto" aria-pressed="false">跟随系统</button>
<button type="button" data-theme-mode="light" aria-pressed="false">浅色</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">深色</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>更新日志</h1>
<p class="lead">版本演进记录以 GitHub Releases 为准,此处用于官网快速查看主要变化。</p>
<article class="entry">
<div class="entry-head">
<h2>v1.0.2</h2>
<span class="date">2026-06-14</span>
</div>
<ul>
<li>优化超大文件(数十 GB)打开速度,打开后立即可见首屏内容。</li>
<li>修复大文件中拖动滚动条卡顿、无响应的问题。</li>
<li>超长行新增底部横向滚动条,可左右查看完整内容。</li>
<li>修复外部程序持续修改已打开文件时反复弹出提示窗的问题。</li>
<li>修复横向滚动后行号不显示的问题。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v1.0.1</h2>
<span class="date">2026-04-26</span>
</div>
<ul>
<li>完善 macOS App Store 打包与沙盒权限配置。</li>
<li>改进 Qt 依赖部署流程,提升 macOS 安装包稳定性。</li>
<li>补充 App Store 上架前自检说明(依赖路径、签名与 entitlements)。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v1.0.0</h2>
<span class="date">2026-04-20</span>
</div>
<ul>
<li>MassiveEdit 正式上架 macOS App Store。</li>
<li>支持大文件流式打开、虚拟化渲染与基础编辑。</li>
<li>提供查找替换、撤销重做、编码与换行格式管理。</li>
<li>更新应用图标与 macOS 应用元数据(Info.plist)。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v0.1.3</h2>
<span class="date">2026-03-30</span>
</div>
<ul>
<li>修复 Windows 安装器“应用运行中提示”中文乱码问题(NSIS 按 UTF-8 读取脚本)。</li>
<li>版本号升级为 0.1.3,并同步安装包命名与官网版本展示。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v0.1.2</h2>
<span class="date">2026-03-30</span>
</div>
<ul>
<li>Windows 安装包命名升级为 `MassiveEdit-版本号-Setup.exe`。</li>
<li>NSIS 安装/卸载新增“程序运行中检测”,提示关闭后重试。</li>
<li>官网静态页面上线(首页、下载、更新日志、隐私政策)。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v0.1.1</h2>
<span class="date">2026-03-30</span>
</div>
<ul>
<li>修复 Windows 中文文件名路径无法打开的问题(UTF-16 路径链路)。</li>
<li>新增拖拽文件到主窗口直接打开。</li>
<li>Windows 可执行文件与安装器图标完善。</li>
<li>自定义 NSIS 脚本接管打包流程,开始菜单改为单项直达启动。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v0.1.0</h2>
<span class="date">2026-03-29</span>
</div>
<ul>
<li>首个跨平台可用版本,支持大文件浏览与基础编辑。</li>
<li>提供查找替换、撤销重做、编码与换行格式管理。</li>
<li>提供 Windows/macOS/Linux 构建与打包脚本。</li>
</ul>
</article>
</main>
<footer class="wrap">
<div>五道题(北京)科技有限公司</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="./theme.js"></script>
<script src="./lang.js" defer></script>
</body>
</html>
+98
View File
@@ -0,0 +1,98 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit 下载</title>
<meta name="description" content="MassiveEdit 下载页面,提供 Windows/macOS/Linux 安装包与安装说明。" />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="./site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">首页</a>
<a class="active" href="./download.html">下载</a>
<a href="./changelog.html">更新日志</a>
<a href="./privacy.html">隐私政策</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="./en/download.html" data-lang-switch="en">EN</a>
<div class="theme-switch" role="group" aria-label="主题">
<button type="button" data-theme-mode="auto" aria-pressed="false">跟随系统</button>
<button type="button" data-theme-mode="light" aria-pressed="false">浅色</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">深色</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>下载 MassiveEdit</h1>
<p class="lead">
当前官网版本:<strong>1.0.2</strong>macOS App Store)。Windows / Linux 包请见 GitHub Releases。
</p>
<p class="tip">
推荐直接前往
<a href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer"
>Releases 页面</a
>
获取最新构建。Windows 安装包文件名格式为:<code>MassiveEdit-版本号-Setup.exe</code>
</p>
<section class="grid">
<article class="card">
<h2>Windows</h2>
<p class="meta">
支持图形安装程序(NSIS)与 ZIP 包。<br />
示例:<code>MassiveEdit-0.1.3-Setup.exe</code>
</p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer"
>下载 Windows 版本</a
>
</article>
<article class="card">
<h2>macOS</h2>
<p class="meta">
推荐通过 Mac App Store 安装(当前 1.0.2)。<br />
也可在 Releases 获取 DMG / tar.gz。
</p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer"
>下载 macOS 版本</a
>
</article>
<article class="card">
<h2>Linux</h2>
<p class="meta">
提供 DEB / RPM / tar.gz。<br />
具体包格式取决于发布流水线与目标发行版。
</p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer"
>下载 Linux 版本</a
>
</article>
</section>
<section class="help">
需要帮助?可通过 <a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a>
<a href="tel:+8613661144700">+86 13661144700</a> 联系支持团队。
</section>
</main>
<footer class="wrap">
<div>五道题(北京)科技有限公司</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="./theme.js"></script>
<script src="./lang.js" defer></script>
</body>
</html>
+116
View File
@@ -0,0 +1,116 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit Changelog</title>
<meta name="description" content="Version history for MassiveEdit." />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="../site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">Home</a>
<a href="./download.html">Download</a>
<a class="active" href="./changelog.html">Changelog</a>
<a href="./privacy.html">Privacy</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="../changelog.html" data-lang-switch="zh"></a>
<div class="theme-switch" role="group" aria-label="Theme">
<button type="button" data-theme-mode="auto" aria-pressed="false">Auto</button>
<button type="button" data-theme-mode="light" aria-pressed="false">Light</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">Dark</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>Changelog</h1>
<p class="lead">GitHub Releases is the source of truth. This page summarizes major changes.</p>
<article class="entry">
<div class="entry-head"><h2>v1.0.2</h2><span class="date">2026-06-14</span></div>
<ul>
<li>Faster opening of very large files (tens of GB); first screen content appears immediately.</li>
<li>Fixed scrollbar drag freezing on large files.</li>
<li>Added a horizontal scrollbar for extra-long lines.</li>
<li>Fixed repeated prompts when an open file is continuously modified externally.</li>
<li>Fixed line numbers disappearing after horizontal scrolling.</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v1.0.1</h2><span class="date">2026-04-26</span></div>
<ul>
<li>Improved macOS App Store packaging and sandbox entitlements.</li>
<li>Refined Qt deployment for more reliable macOS builds.</li>
<li>Added App Store preflight checks (dependencies, signing, entitlements).</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v1.0.0</h2><span class="date">2026-04-20</span></div>
<ul>
<li>Initial macOS App Store release.</li>
<li>Streaming open, virtualized rendering, and basic editing for large files.</li>
<li>Find/replace, undo/redo, encoding, and line-ending controls.</li>
<li>Updated app icon and macOS bundle metadata.</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v0.1.3</h2><span class="date">2026-03-30</span></div>
<ul>
<li>Fixed mojibake in the "app is running" installer prompt on Windows (NSIS script now parsed as UTF-8).</li>
<li>Bumped version to 0.1.3 and synchronized installer naming and website labels.</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v0.1.2</h2><span class="date">2026-03-30</span></div>
<ul>
<li>Windows installer naming updated to <code>MassiveEdit-version-Setup.exe</code>.</li>
<li>NSIS install/uninstall now checks whether the app is running and asks the user to retry after closing it.</li>
<li>Website static pages launched (Home, Download, Changelog, Privacy).</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v0.1.1</h2><span class="date">2026-03-30</span></div>
<ul>
<li>Fixed Windows Unicode file path opening by using UTF-16 path conversion.</li>
<li>Added drag-and-drop file opening in the main window.</li>
<li>Improved Windows executable and installer icon setup.</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v0.1.0</h2><span class="date">2026-03-29</span></div>
<ul>
<li>First cross-platform usable release with large-file browsing and basic editing.</li>
<li>Included find/replace, undo/redo, encoding, and line-ending controls.</li>
<li>Provided build/packaging scripts for Windows, macOS, and Linux.</li>
</ul>
</article>
</main>
<footer class="wrap">
<div>Five Questions (Beijing) Technology Co., Ltd.</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="../theme.js"></script>
<script src="../lang.js" defer></script>
</body>
</html>
+77
View File
@@ -0,0 +1,77 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit Downloads</title>
<meta name="description" content="Download MassiveEdit for Windows, macOS, and Linux." />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="../site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">Home</a>
<a class="active" href="./download.html">Download</a>
<a href="./changelog.html">Changelog</a>
<a href="./privacy.html">Privacy</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="../download.html" data-lang-switch="zh"></a>
<div class="theme-switch" role="group" aria-label="Theme">
<button type="button" data-theme-mode="auto" aria-pressed="false">Auto</button>
<button type="button" data-theme-mode="light" aria-pressed="false">Light</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">Dark</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>Download MassiveEdit</h1>
<p class="lead">Current website version: <strong>1.0.2</strong> (macOS App Store). Windows / Linux packages are on GitHub Releases.</p>
<p class="tip">
Please use the <a href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer">Releases page</a>
for the latest packages. Windows installer naming pattern: <code>MassiveEdit-version-Setup.exe</code>.
</p>
<section class="grid">
<article class="card">
<h2>Windows</h2>
<p class="meta">NSIS installer and ZIP package are both available.<br />Example: <code>MassiveEdit-0.1.3-Setup.exe</code></p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer">Download for Windows</a>
</article>
<article class="card">
<h2>macOS</h2>
<p class="meta">Mac App Store is recommended (currently 1.0.2).<br />DMG and tar.gz are also available on Releases.</p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer">Download for macOS</a>
</article>
<article class="card">
<h2>Linux</h2>
<p class="meta">DEB / RPM / tar.gz package options are provided depending on the pipeline.</p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer">Download for Linux</a>
</article>
</section>
<section class="help">
Need help? Contact <a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a> or <a href="tel:+8613661144700">+86 13661144700</a>.
</section>
</main>
<footer class="wrap">
<div>Five Questions (Beijing) Technology Co., Ltd.</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="../theme.js"></script>
<script src="../lang.js" defer></script>
</body>
</html>
+123
View File
@@ -0,0 +1,123 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit - Large File Text Editor</title>
<meta
name="description"
content="MassiveEdit is a high-performance large-file text editor developed by Five Questions (Beijing) Technology Co., Ltd."
/>
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="../site.css" />
</head>
<body>
<header class="hero">
<div class="wrap">
<div class="topbar">
<div class="brand"><span class="dot"></span>MassiveEdit</div>
<nav class="topnav">
<a class="active" href="./index.html">Home</a>
<a href="./download.html">Download</a>
<a href="./changelog.html">Changelog</a>
<a href="./privacy.html">Privacy</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="../index.html" data-lang-switch="zh"></a>
<div class="theme-switch" role="group" aria-label="Theme">
<button type="button" data-theme-mode="auto" aria-pressed="false">Auto</button>
<button type="button" data-theme-mode="light" aria-pressed="false">Light</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">Dark</button>
</div>
</nav>
</div>
<div class="hero-grid">
<div>
<p class="eyebrow">Large File Editor · v1.0.2</p>
<h1>Built for Massive Text Files</h1>
<p class="lead">
MassiveEdit is a Qt-based large-file text editor focused on startup speed, smooth scrolling, and reliable editing behavior.<br />
Maintained by Five Questions (Beijing) Technology Co., Ltd.
</p>
<div class="cta">
<a class="btn btn-primary" href="./download.html">Get Downloads</a>
<a class="btn btn-ghost" href="./changelog.html">See Changelog</a>
</div>
</div>
<aside class="hero-panel">
<div class="kpi">
<div class="kpi-item"><strong>C++20</strong><span>Core Language</span></div>
<div class="kpi-item"><strong>Qt 6</strong><span>Cross-platform UI</span></div>
<div class="kpi-item"><strong>MIT</strong><span>Open-source License</span></div>
<div class="kpi-item"><strong>Win / macOS / Linux</strong><span>Platform Coverage</span></div>
</div>
</aside>
</div>
</div>
</header>
<main class="wrap">
<section>
<h2 class="title">Core Capabilities</h2>
<p class="sub">Designed for readability, search, and editing on very large text files with responsive interaction.</p>
<div class="grid-3">
<article class="card">
<h3>Fast Large-file Loading</h3>
<p>Chunked reading and caching reduce full-load wait time and keep scrolling smooth.</p>
</article>
<article class="card">
<h3>Incremental Index & Search</h3>
<p>Async search and result navigation keep large datasets practical to work with.</p>
</article>
<article class="card">
<h3>Reliable Editing Base</h3>
<p>Undo/redo, encoding controls, and line-ending management provide a stable foundation.</p>
</article>
</div>
</section>
<section>
<h2 class="title">More Pages</h2>
<p class="sub">Downloads, release history, and privacy details are separated for easy navigation.</p>
<div class="grid-3">
<article class="card"><h3>Downloads</h3><p><a href="./download.html">Platform packages</a> and installation notes.</p></article>
<article class="card"><h3>Changelog</h3><p><a href="./changelog.html">Version changes</a> and fixes.</p></article>
<article class="card"><h3>Privacy</h3><p><a href="./privacy.html">Data handling statement</a> and contact info.</p></article>
</div>
</section>
<section>
<h2 class="title">Contact</h2>
<p class="sub">For support, business inquiries, or feature suggestions:</p>
<div class="contact">
<article class="card">
<h3>Email</h3>
<a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a>
<span class="line">Include OS version, repro steps, and screenshots when possible.</span>
</article>
<article class="card">
<h3>Phone</h3>
<a href="tel:+8613661144700">+86 13661144700</a>
<span class="line">Business hours: Mon-Fri 9:00-18:00 (UTC+8).</span>
</article>
</div>
</section>
</main>
<footer>
<div class="wrap">
<div>Five Questions (Beijing) Technology Co., Ltd.</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</div>
</footer>
<script src="../theme.js"></script>
<script src="../lang.js" defer></script>
</body>
</html>
+78
View File
@@ -0,0 +1,78 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit Privacy Policy</title>
<meta name="description" content="Privacy policy for MassiveEdit." />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="../site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">Home</a>
<a href="./download.html">Download</a>
<a href="./changelog.html">Changelog</a>
<a class="active" href="./privacy.html">Privacy</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="../privacy.html" data-lang-switch="zh"></a>
<div class="theme-switch" role="group" aria-label="Theme">
<button type="button" data-theme-mode="auto" aria-pressed="false">Auto</button>
<button type="button" data-theme-mode="light" aria-pressed="false">Light</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">Dark</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>Privacy Policy</h1>
<p class="lead">Effective Date: 2026-03-30</p>
<article class="policy">
<section class="section">
<h2>1. Overview</h2>
<p>MassiveEdit is provided by Five Questions (Beijing) Technology Co., Ltd. This policy explains our basic data-handling principles for the website and desktop app.</p>
</section>
<section class="section">
<h2>2. Local File Processing</h2>
<p>MassiveEdit edits files locally on your device. By default, files you open, edit, and save are not uploaded to our servers.</p>
</section>
<section class="section">
<h2>3. Website Access Data</h2>
<p>The hosting platform may collect necessary access logs (time, IP, browser type) for security and operations. We do not use this data for unrelated purposes.</p>
</section>
<section class="section">
<h2>4. Contact Information</h2>
<p>If you contact support by email or phone, we only use the information you provide to handle your request and reply.</p>
</section>
<section class="section">
<h2>5. Policy Updates</h2>
<p>When this policy changes, we will update the content and effective date on this page.</p>
</section>
<section class="section">
<h2>6. Contact</h2>
<p>Email: <a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a><br />Phone: <a href="tel:+8613661144700">+86 13661144700</a></p>
</section>
</article>
</main>
<footer class="wrap">
<div>Five Questions (Beijing) Technology Co., Ltd.</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="../theme.js"></script>
<script src="../lang.js" defer></script>
</body>
</html>
+146
View File
@@ -0,0 +1,146 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit - 大文件文本编辑器</title>
<meta
name="description"
content="MassiveEdit 是一款专注性能的大文件文本编辑器,由五道题(北京)科技有限公司开发。"
/>
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="./site.css" />
</head>
<body>
<header class="hero">
<div class="wrap">
<div class="topbar">
<div class="brand"><span class="dot"></span>MassiveEdit</div>
<nav class="topnav">
<a class="active" href="./index.html">首页</a>
<a href="./download.html">下载</a>
<a href="./changelog.html">更新日志</a>
<a href="./privacy.html">隐私政策</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="./en/index.html" data-lang-switch="en">EN</a>
<div class="theme-switch" role="group" aria-label="主题">
<button type="button" data-theme-mode="auto" aria-pressed="false">跟随系统</button>
<button type="button" data-theme-mode="light" aria-pressed="false">浅色</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">深色</button>
</div>
</nav>
</div>
<div class="hero-grid">
<div>
<p class="eyebrow fade-up">Large File Editor · v1.0.2</p>
<h1 class="fade-up d2">面向超大文本文件的编辑体验</h1>
<p class="lead fade-up d3">
MassiveEdit 是一款基于 Qt 开发的大文件文本编辑器,强调启动速度、滚动流畅性与稳定编辑能力。<br />
由五道题(北京)科技有限公司持续维护与迭代。
</p>
<div class="cta fade-up d3">
<a class="btn btn-primary" href="./download.html">下载发布版本</a>
<a class="btn btn-ghost" href="./changelog.html">查看更新日志</a>
</div>
</div>
<aside class="hero-panel fade-up d2">
<div class="kpi">
<div class="kpi-item">
<strong>C++20</strong>
<span>核心语言</span>
</div>
<div class="kpi-item">
<strong>Qt 6</strong>
<span>跨平台 UI</span>
</div>
<div class="kpi-item">
<strong>MIT</strong>
<span>开源协议</span>
</div>
<div class="kpi-item">
<strong>Win / macOS / Linux</strong>
<span>平台支持</span>
</div>
</div>
</aside>
</div>
</div>
</header>
<main class="wrap">
<section>
<h2 class="title">核心能力</h2>
<p class="sub">围绕“大文件可读、可搜、可改”设计,优先保障稳定性与响应速度。</p>
<div class="grid-3">
<article class="card">
<h3>大文件高效加载</h3>
<p>分块读取与缓存策略,减少整体加载等待,提升打开与滚动体验。</p>
</article>
<article class="card">
<h3>渐进索引与搜索</h3>
<p>支持异步检索与结果定位,面向大体量文本保持可操作性。</p>
</article>
<article class="card">
<h3>可靠编辑基础</h3>
<p>提供撤销/重做、编码与换行格式管理,为后续能力扩展留足空间。</p>
</article>
</div>
</section>
<section>
<h2 class="title">更多信息</h2>
<p class="sub">下载、版本演进和政策说明均已独立成页,便于查阅与维护。</p>
<div class="grid-3">
<article class="card">
<h3>下载页面</h3>
<p><a href="./download.html">查看各平台安装包</a>、系统要求与安装说明。</p>
</article>
<article class="card">
<h3>更新日志</h3>
<p><a href="./changelog.html">查看版本变更记录</a>,快速定位新功能与修复项。</p>
</article>
<article class="card">
<h3>隐私政策</h3>
<p><a href="./privacy.html">了解数据处理说明</a>与联系方式。</p>
</article>
</div>
</section>
<section>
<h2 class="title">联系与支持</h2>
<p class="sub">如需技术支持、商务合作或功能建议,可通过以下方式联系。</p>
<div class="contact">
<article class="card">
<h3>邮箱</h3>
<a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a>
<span class="line">建议附上系统版本、复现步骤与日志截图。</span>
</article>
<article class="card">
<h3>电话</h3>
<a href="tel:+8613661144700">+86 13661144700</a>
<span class="line">工作日 9:00-18:00。</span>
</article>
</div>
</section>
</main>
<footer>
<div class="wrap">
<div>五道题(北京)科技有限公司</div>
<div>
<a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a>
</div>
</div>
</footer>
<script src="./theme.js"></script>
<script src="./lang.js" defer></script>
</body>
</html>
+83
View File
@@ -0,0 +1,83 @@
(function () {
var key = "massiveedit_lang";
var supported = {
"index.html": true,
"download.html": true,
"changelog.html": true,
"privacy.html": true,
};
var path = window.location.pathname;
var fileMatch = path.match(/\/([^\/?#]+)$/);
if (!fileMatch) return;
var file = fileMatch[1];
if (!supported[file]) return;
var isEn = /\/en\/[^\/?#]+$/.test(path);
var currentLang = isEn ? "en" : "zh";
function toEn(p) {
if (/\/en\/[^\/?#]+$/.test(p)) return p;
return p.replace(/\/([^\/?#]+)$/, "/en/$1");
}
function toZh(p) {
if (!/\/en\/[^\/?#]+$/.test(p)) return p;
return p.replace(/\/en\/([^\/?#]+)$/, "/$1");
}
function targetPath(lang) {
return lang === "en" ? toEn(path) : toZh(path);
}
var params = new URLSearchParams(window.location.search);
var queryLang = params.get("lang");
if (queryLang === "zh" || queryLang === "en") {
try {
localStorage.setItem(key, queryLang);
} catch (e) {}
}
var savedLang = null;
try {
savedLang = localStorage.getItem(key);
} catch (e) {}
var browserLang = (navigator.language || "").toLowerCase().indexOf("zh") === 0 ? "zh" : "en";
var hasExplicit = queryLang === "zh" || queryLang === "en" || savedLang === "zh" || savedLang === "en";
if (hasExplicit) {
var desiredLang = queryLang === "zh" || queryLang === "en" ? queryLang : savedLang;
if (desiredLang !== currentLang) {
var explicitDest = targetPath(desiredLang);
if (explicitDest && explicitDest !== path) {
window.location.replace(explicitDest + window.location.hash);
return;
}
}
} else {
// First visit: default to English only when browser language is non-Chinese.
if (browserLang === "en" && currentLang === "zh") {
var autoDest = targetPath("en");
if (autoDest && autoDest !== path) {
window.location.replace(autoDest + window.location.hash);
return;
}
}
}
document.addEventListener("DOMContentLoaded", function () {
var links = document.querySelectorAll("[data-lang-switch]");
links.forEach(function (link) {
link.addEventListener("click", function () {
var lang = link.getAttribute("data-lang-switch");
if (lang === "zh" || lang === "en") {
try {
localStorage.setItem(key, lang);
} catch (e) {}
}
});
});
});
})();
+94
View File
@@ -0,0 +1,94 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit 隐私政策</title>
<meta name="description" content="MassiveEdit 隐私政策说明。" />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="./site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">首页</a>
<a href="./download.html">下载</a>
<a href="./changelog.html">更新日志</a>
<a class="active" href="./privacy.html">隐私政策</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="./en/privacy.html" data-lang-switch="en">EN</a>
<div class="theme-switch" role="group" aria-label="主题">
<button type="button" data-theme-mode="auto" aria-pressed="false">跟随系统</button>
<button type="button" data-theme-mode="light" aria-pressed="false">浅色</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">深色</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>隐私政策</h1>
<p class="lead">生效日期:2026-03-30</p>
<article class="policy">
<section class="section">
<h2>1. 基本说明</h2>
<p>
MassiveEdit 由五道题(北京)科技有限公司提供。本页面用于说明官网与桌面应用在数据处理方面的基本原则。
</p>
</section>
<section class="section">
<h2>2. 本地文件处理</h2>
<p>
MassiveEdit 的核心编辑行为发生在你的本地设备。你打开、编辑和保存的文件默认不会被上传到我们的服务器。
</p>
</section>
<section class="section">
<h2>3. 官网访问信息</h2>
<p>
官网托管平台可能记录必要的访问日志(如时间、IP、浏览器类型)用于安全与运维。我们不会将这些数据用于与本服务无关的用途。
</p>
</section>
<section class="section">
<h2>4. 联系方式信息</h2>
<p>
当你通过邮箱或电话联系支持时,我们仅在处理问题与回复沟通所需范围内使用你提供的信息。
</p>
</section>
<section class="section">
<h2>5. 政策更新</h2>
<p>如本政策发生变化,我们会在本页面更新版本与生效日期。</p>
</section>
<section class="section">
<h2>6. 联系我们</h2>
<p>
邮箱:<a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a><br />
电话:<a href="tel:+8613661144700">+86 13661144700</a>
</p>
</section>
</article>
</main>
<footer class="wrap">
<div>五道题(北京)科技有限公司</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="./theme.js"></script>
<script src="./lang.js" defer></script>
</body>
</html>
+497
View File
@@ -0,0 +1,497 @@
:root,
[data-theme="light"] {
color-scheme: light;
--bg-0: #f3f6fb;
--bg-1: #e7eef7;
--panel: rgba(255, 255, 255, 0.88);
--line: rgba(36, 68, 110, 0.16);
--text: #122033;
--muted: #4d6078;
--accent: #0d8a76;
--accent-2: #c46a16;
--shadow: 0 20px 48px rgba(30, 50, 80, 0.1);
--glow-a: #c7d8ef;
--glow-b: #d5e3f3;
--surface-deep: rgba(255, 255, 255, 0.76);
--ghost-bg: rgba(255, 255, 255, 0.7);
--code-bg: #eef3f8;
--code-text: #16324a;
--btn-ink: #02201a;
--dash: rgba(36, 68, 110, 0.18);
--hero-orb: rgba(196, 106, 22, 0.28);
--dot-glow: rgba(13, 138, 118, 0.35);
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
color-scheme: dark;
--bg-0: #06101f;
--bg-1: #0f1d35;
--panel: rgba(10, 22, 43, 0.72);
--line: rgba(104, 149, 214, 0.32);
--text: #e6efff;
--muted: #b4c5e2;
--accent: #44d1b6;
--accent-2: #ffb65d;
--shadow: 0 24px 60px rgba(0, 0, 0, 0.34);
--glow-a: #1f3e70;
--glow-b: #32456b;
--surface-deep: rgba(8, 19, 35, 0.66);
--ghost-bg: rgba(12, 26, 49, 0.42);
--code-bg: rgba(7, 17, 33, 0.9);
--code-text: #dff7ff;
--btn-ink: #02201a;
--dash: rgba(120, 159, 212, 0.25);
--hero-orb: rgba(255, 182, 93, 0.3);
--dot-glow: rgba(68, 209, 182, 0.9);
}
}
[data-theme="dark"] {
color-scheme: dark;
--bg-0: #06101f;
--bg-1: #0f1d35;
--panel: rgba(10, 22, 43, 0.72);
--line: rgba(104, 149, 214, 0.32);
--text: #e6efff;
--muted: #b4c5e2;
--accent: #44d1b6;
--accent-2: #ffb65d;
--shadow: 0 24px 60px rgba(0, 0, 0, 0.34);
--glow-a: #1f3e70;
--glow-b: #32456b;
--surface-deep: rgba(8, 19, 35, 0.66);
--ghost-bg: rgba(12, 26, 49, 0.42);
--code-bg: rgba(7, 17, 33, 0.9);
--code-text: #dff7ff;
--btn-ink: #02201a;
--dash: rgba(120, 159, 212, 0.25);
--hero-orb: rgba(255, 182, 93, 0.3);
--dot-glow: rgba(68, 209, 182, 0.9);
}
* {
box-sizing: border-box;
}
html,
body {
margin: 0;
min-height: 100%;
color: var(--text);
background:
radial-gradient(1200px 700px at 8% -10%, var(--glow-a) 0%, transparent 56%),
radial-gradient(1100px 700px at 98% 0%, var(--glow-b) 0%, transparent 62%),
linear-gradient(165deg, var(--bg-1) 0%, var(--bg-0) 65%);
font-family: "Avenir Next", "PingFang SC", "Source Han Sans SC", "Noto Sans CJK SC",
"Microsoft YaHei", "Segoe UI", sans-serif;
}
a {
color: var(--accent);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.wrap {
width: min(1120px, calc(100% - 40px));
margin: 0 auto;
}
.hero {
position: relative;
overflow: hidden;
padding: 26px 0 58px;
}
.hero::after {
content: "";
position: absolute;
width: 320px;
height: 320px;
right: -120px;
top: 36px;
border: 1px solid var(--hero-orb);
border-radius: 42% 58% 56% 44%;
filter: blur(0.3px);
animation: float 7s ease-in-out infinite;
}
@keyframes float {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-12px);
}
}
.topbar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 50px;
padding: 22px 0 0;
gap: 12px;
}
.hero .topbar {
padding-top: 0;
}
.brand {
display: inline-flex;
align-items: center;
gap: 10px;
font-size: 19px;
letter-spacing: 0.4px;
font-weight: 650;
}
.dot {
width: 10px;
height: 10px;
border-radius: 999px;
background: linear-gradient(135deg, var(--accent), #66ffdf);
box-shadow: 0 0 18px var(--dot-glow);
}
.topnav {
display: inline-flex;
align-items: center;
gap: 14px;
flex-wrap: wrap;
justify-content: flex-end;
}
.topnav a {
color: var(--muted);
font-size: 14px;
}
.topnav a.active {
color: var(--text);
}
.theme-switch {
display: inline-flex;
border: 1px solid var(--line);
border-radius: 999px;
overflow: hidden;
background: var(--panel);
}
.theme-switch button {
border: 0;
background: transparent;
color: var(--muted);
padding: 6px 10px;
font: inherit;
font-size: 12px;
font-weight: 650;
cursor: pointer;
}
.theme-switch button.active {
background: var(--accent);
color: var(--btn-ink);
}
.hero-grid {
display: grid;
grid-template-columns: 1.1fr 0.9fr;
gap: 28px;
align-items: center;
}
.eyebrow {
color: var(--accent-2);
font-size: 13px;
letter-spacing: 1.4px;
text-transform: uppercase;
margin-bottom: 10px;
}
h1 {
margin: 10px 0 14px;
font-family: "STZhongsong", "Songti SC", "Noto Serif SC", "Georgia", serif;
font-size: clamp(30px, 5.2vw, 58px);
line-height: 1.08;
}
.lead {
margin: 0 0 26px;
color: var(--muted);
line-height: 1.75;
font-size: 16px;
}
.cta {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 44px;
padding: 0 16px;
border-radius: 11px;
border: 1px solid transparent;
font-weight: 650;
}
.btn-primary {
background: linear-gradient(135deg, var(--accent), #2dc1f3);
color: var(--btn-ink);
}
.btn-ghost {
color: var(--text);
border-color: var(--line);
background: var(--ghost-bg);
}
.hero-panel {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 16px;
padding: 22px 20px;
box-shadow: var(--shadow);
backdrop-filter: blur(8px);
}
.kpi {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
}
.kpi-item {
background: var(--surface-deep);
border: 1px solid var(--line);
border-radius: 12px;
padding: 14px;
}
.kpi-item strong {
display: block;
font-size: 24px;
margin-bottom: 4px;
}
section {
padding: 38px 0;
}
.title {
margin: 0 0 14px;
font-size: clamp(26px, 3.6vw, 36px);
font-family: "STZhongsong", "Songti SC", "Noto Serif SC", "Georgia", serif;
}
.sub {
margin: 0 0 18px;
color: var(--muted);
line-height: 1.72;
}
.grid-3,
.grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 14px;
}
.card {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 14px;
padding: 18px 16px;
box-shadow: var(--shadow);
}
.card h2,
.card h3 {
margin: 0 0 8px;
}
.card h2 {
font-size: 22px;
}
.card h3 {
font-size: 18px;
}
.card p,
.meta {
margin: 0;
color: var(--muted);
line-height: 1.68;
}
.meta {
min-height: 86px;
margin-bottom: 12px;
}
.contact {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
}
.line {
display: block;
margin-top: 6px;
color: var(--muted);
}
.tip,
.help {
margin: 0 0 26px;
padding: 12px 14px;
border: 1px solid var(--line);
border-radius: 12px;
background: var(--surface-deep);
color: var(--muted);
}
.help {
margin-top: 28px;
padding: 16px;
}
code {
background: var(--code-bg);
border: 1px solid var(--line);
border-radius: 7px;
padding: 1px 6px;
color: var(--code-text);
font-family: "SFMono-Regular", "JetBrains Mono", "Consolas", monospace;
font-size: 13px;
}
.entry,
.policy {
border: 1px solid var(--line);
border-radius: 14px;
background: var(--panel);
padding: 18px 16px;
}
.entry {
margin-bottom: 14px;
}
.entry-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
flex-wrap: wrap;
margin-bottom: 8px;
}
.entry h2 {
margin: 0;
font-size: 24px;
}
.date {
color: var(--accent-2);
font-size: 13px;
}
.entry ul {
margin: 0;
padding-left: 18px;
color: var(--muted);
line-height: 1.75;
}
.policy h2 {
margin: 0 0 8px;
font-size: 21px;
}
.policy p {
margin: 0 0 12px;
color: var(--muted);
line-height: 1.76;
}
.section {
padding: 12px 0;
border-bottom: 1px dashed var(--dash);
}
.section:last-child {
border-bottom: none;
}
footer {
padding: 24px 0 36px;
margin-top: 30px;
color: var(--muted);
font-size: 14px;
border-top: 1px solid var(--line);
}
.fade-up {
opacity: 0;
transform: translateY(12px);
animation: fadeUp 0.7s ease forwards;
}
.fade-up.d2 {
animation-delay: 0.12s;
}
.fade-up.d3 {
animation-delay: 0.2s;
}
@keyframes fadeUp {
to {
opacity: 1;
transform: translateY(0);
}
}
@media (max-width: 920px) {
.hero-grid,
.contact,
.grid-3,
.grid {
grid-template-columns: 1fr;
}
.hero {
padding-bottom: 40px;
}
.topbar {
margin-bottom: 28px;
}
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation: none !important;
}
.fade-up {
opacity: 1;
transform: none;
}
}
+46
View File
@@ -0,0 +1,46 @@
(function () {
var STORAGE_KEY = "massiveedit-theme-mode";
var MODES = ["auto", "light", "dark"];
function normalize(mode) {
return MODES.indexOf(mode) >= 0 ? mode : "auto";
}
function readMode() {
try {
return normalize(localStorage.getItem(STORAGE_KEY));
} catch (error) {
return "auto";
}
}
function applyMode(mode) {
var normalized = normalize(mode);
document.documentElement.setAttribute("data-theme", normalized);
try {
localStorage.setItem(STORAGE_KEY, normalized);
} catch (error) {
/* ignore */
}
updateButtons(normalized);
}
function updateButtons(mode) {
document.querySelectorAll("[data-theme-mode]").forEach(function (button) {
var active = button.getAttribute("data-theme-mode") === mode;
button.classList.toggle("active", active);
button.setAttribute("aria-pressed", active ? "true" : "false");
});
}
function bindControls() {
document.querySelectorAll("[data-theme-mode]").forEach(function (button) {
button.addEventListener("click", function () {
applyMode(button.getAttribute("data-theme-mode"));
});
});
}
applyMode(readMode());
document.addEventListener("DOMContentLoaded", bindControls);
})();
BIN
View File
Binary file not shown.
+409
View File
@@ -0,0 +1,409 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Account Deletion Request / 账号删除申请 — 智花学伴 SmartBuddy</title>
<meta name="description" content="Request deletion of your SmartBuddy (智花学伴) account and associated data. Provided by Five Questions (Beijing) Technology Co., Ltd." />
<style>
:root {
color-scheme: light dark;
--text: #111827;
--muted: #6b7280;
--bg: #f8fafc;
--card: #fff;
--line: #e5e7eb;
--brand: #0f766e;
--soft: #ecfdf5;
--warn: #9a3412;
--warn-bg: #fff7ed;
}
@media (prefers-color-scheme: dark) {
:root {
--text: #e5e7eb;
--muted: #9ca3af;
--bg: #0b1220;
--card: #111827;
--line: #374151;
--brand: #2dd4bf;
--soft: #0f2f2c;
--warn: #fdba74;
--warn-bg: #2a1a0f;
}
}
* { box-sizing: border-box; }
body {
margin: 0;
background: var(--bg);
color: var(--text);
font: 16px/1.75 -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
}
.wrap { max-width: 980px; margin: 32px auto; padding: 0 16px 48px; }
.card {
background: var(--card);
border: 1px solid var(--line);
border-radius: 14px;
padding: 24px;
margin-bottom: 20px;
}
.topbar {
display: flex;
flex-wrap: wrap;
gap: 10px;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
}
.lang {
display: inline-flex;
border: 1px solid var(--line);
border-radius: 999px;
overflow: hidden;
background: var(--card);
}
.lang button {
border: 0;
background: transparent;
color: var(--muted);
padding: 8px 14px;
cursor: pointer;
font: inherit;
}
.lang button.active {
background: var(--brand);
color: #fff;
}
h1, h2 { margin: 0 0 14px; line-height: 1.35; }
h1 { font-size: 28px; color: var(--brand); }
h2 { font-size: 19px; margin-top: 28px; }
p, li { margin: 8px 0; }
ul { margin: 8px 0; padding-left: 20px; }
.meta { color: var(--muted); font-size: 14px; margin-bottom: 12px; }
.badge {
display: inline-block;
background: var(--soft);
color: var(--brand);
border: 1px solid var(--line);
border-radius: 999px;
padding: 4px 10px;
font-size: 13px;
margin-right: 6px;
margin-bottom: 6px;
}
.note {
background: var(--warn-bg);
border: 1px solid var(--line);
border-radius: 12px;
padding: 14px 16px;
color: var(--warn);
margin: 16px 0;
}
label { display: block; margin: 14px 0 6px; font-weight: 600; }
input, textarea, select {
width: 100%;
border: 1px solid var(--line);
border-radius: 10px;
padding: 12px 14px;
background: var(--bg);
color: var(--text);
font: inherit;
}
textarea { min-height: 120px; resize: vertical; }
.actions { margin-top: 18px; display: flex; flex-wrap: wrap; gap: 10px; }
button.submit, a.button {
appearance: none;
border: 0;
border-radius: 10px;
padding: 12px 18px;
background: var(--brand);
color: #fff;
font: inherit;
font-weight: 600;
cursor: pointer;
text-decoration: none;
display: inline-block;
}
button.submit.secondary, a.button.secondary {
background: transparent;
color: var(--brand);
border: 1px solid var(--brand);
}
.hidden { display: none !important; }
code, .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.95em; }
.foot { color: var(--muted); font-size: 13px; margin-top: 24px; }
</style>
</head>
<body>
<main class="wrap">
<div class="topbar">
<div>
<span class="badge">SmartBuddy / 智花学伴</span>
</div>
<div class="lang" role="group" aria-label="Language">
<button type="button" id="btn-zh" class="active" onclick="setLang('zh')">中文</button>
<button type="button" id="btn-en" onclick="setLang('en')">English</button>
</div>
</div>
<!-- ========== 中文 ========== -->
<article class="card" id="panel-zh">
<h1>智花学伴 · 账号删除申请</h1>
<div class="meta">
应用:智花学伴(SmartBuddy)| 开发者:五道题(北京)科技有限公司<br />
App ID / Packagecn.fivequestions.smartbuddy 版本说明页更新日期:2026-08-14
</div>
<p>本页面用于帮助用户在<strong>未安装应用</strong>的情况下,也能申请删除「智花学伴」账号及相关数据,以满足 Google Play 等应用商店关于账号删除的公开说明要求。</p>
<p>本页面提供<strong>删除申请渠道与说明</strong>。提交申请后,我们将在核验身份后处理;页面本身不会在点击后立即自动删除账号。</p>
<div class="note">
重要提示:账号删除不可恢复。删除完成后,您将无法再使用该账号登录,相关学习与作答数据通常也无法找回。请确认后再提交申请。
</div>
<h2>一、这是哪个应用?</h2>
<ul>
<li><strong>应用名称</strong>:智花学伴(SmartBuddy</li>
<li><strong>开发者</strong>:五道题(北京)科技有限公司(Five Questions (Beijing) Technology Co., Ltd.</li>
<li><strong>适用平台</strong>Android / iOS / Web(以实际提供的版本为准)</li>
<li><strong>商标说明</strong>:「五道题」「智花」为五道题(北京)科技有限公司注册商标(®)</li>
</ul>
<h2>二、如何申请删除账号</h2>
<p>您可通过以下任一方式申请:</p>
<ul>
<li>
<strong>方式 A(推荐,应用内)</strong>:打开「智花学伴」→ 登录账号 →
<strong>设置 → 账号与安全 / 账号设置 → 注销账号</strong> → 阅读风险提示并确认。
</li>
<li>
<strong>方式 B(网页申请)</strong>:填写本页下方表单,通过邮件向我们提交删除申请。
请使用您注册/绑定账号时的手机号、邮箱或学号等信息,以便我们核验身份。
</li>
</ul>
<h2>三、删除后将清除的数据(通常包括)</h2>
<ul>
<li>账号标识与资料:昵称、头像、个人资料等账号展示信息</li>
<li>登录与绑定关系:应用内登录态、相关第三方绑定关系(在技术可行范围内解除)</li>
<li>学习与作答数据:练习记录、答题记录、学习进度、错题相关记录</li>
<li>互动练习数据:对话练习记录、语音/图片作答内容(若仍保存在我们的服务端)</li>
<li>其他与该账号直接关联、且删除后不影响法定义务履行的业务数据</li>
</ul>
<h2>四、可能保留的数据及期限</h2>
<p>在法律法规、监管要求、安全与争议处理所需范围内,我们可能在必要期限内保留部分信息,例如:</p>
<ul>
<li><strong>交易/财务相关记录</strong>(如有):为满足财务、审计或纠纷处理要求,通常保留至法定期限届满;</li>
<li><strong>安全与反作弊日志</strong>:用于排查滥用、欺诈或攻击,通常保留不超过 <strong>180 天</strong>(法律法规另有规定的除外);</li>
<li><strong>已依法披露或匿名化处理后的数据</strong>:经匿名化且无法识别到特定个人的数据,可能继续用于统计分析;</li>
<li><strong>法律要求必须保留的记录</strong>:按有权机关要求或法定最低保存期限执行。</li>
</ul>
<p>保留期满后,我们将删除或匿名化处理相关信息。</p>
<h2>五、人工处理流程与时效</h2>
<ol>
<li>您通过应用内注销或本页提交删除申请;</li>
<li>我们核验账号归属(可能联系您补充证明信息);</li>
<li>核验通过后执行账号删除与关联数据处理;</li>
<li>原则上自收到有效申请并完成核验后 <strong>15 个工作日</strong>内处理完毕并答复;复杂情形可能延长,我们会说明原因。</li>
</ol>
<h2>六、网页删除申请表单</h2>
<p>请填写以下信息。点击提交后将打开您的邮件客户端,把申请内容发送给我们(无需安装 App)。</p>
<form id="form-zh" onsubmit="return submitDeletion('zh');">
<label for="zh-name">姓名 / 称呼(可选)</label>
<input id="zh-name" name="name" type="text" placeholder="例如:张三" />
<label for="zh-account">账号标识(必填)</label>
<input id="zh-account" name="account" type="text" required placeholder="手机号 / 邮箱 / 学号 / 用户 ID" />
<label for="zh-platform">主要使用的平台</label>
<select id="zh-platform" name="platform">
<option value="Android">AndroidGoogle Play</option>
<option value="iOS">iOS</option>
<option value="Web">Web</option>
<option value="Unknown">不确定</option>
</select>
<label for="zh-contact">联系方式(必填,便于我们回复)</label>
<input id="zh-contact" name="contact" type="text" required placeholder="可用邮箱或手机号" />
<label for="zh-reason">补充说明(可选)</label>
<textarea id="zh-reason" name="reason" placeholder="例如:希望删除账号及全部学习记录"></textarea>
<div class="actions">
<button class="submit" type="submit">通过邮件提交删除申请</button>
<a class="button secondary" href="mailto:liutingchao@fivequestions.cn?subject=SmartBuddy%20Account%20Deletion%20Request">直接发邮件</a>
</div>
</form>
<p class="foot">
受理邮箱:<span class="mono">liutingchao@fivequestions.cn</span><br />
公司主体:五道题(北京)科技有限公司<br />
相关协议:
<a href="./privacy-policy.html">隐私协议</a> ·
<a href="./service-agreement.html">服务协议</a>
</p>
</article>
<!-- ========== English ========== -->
<article class="card hidden" id="panel-en">
<h1>SmartBuddy · Account Deletion Request</h1>
<div class="meta">
App: SmartBuddy (智花学伴) Developer: Five Questions (Beijing) Technology Co., Ltd.<br />
Package name: cn.fivequestions.smartbuddy Page updated: 2026-08-14
</div>
<p>This page lets users request deletion of their SmartBuddy account and associated data <strong>without installing the app</strong>, as required by Google Play and similar store policies.</p>
<p>This page provides a <strong>request channel and disclosure</strong>. After you submit a request, we will verify your identity and process deletion. The page itself does not instantly delete your account on click.</p>
<div class="note">
Important: Account deletion is irreversible. After deletion, you will no longer be able to sign in with that account, and learning/answer data associated with it generally cannot be recovered.
</div>
<h2>1. Which app is this for?</h2>
<ul>
<li><strong>App name</strong>: SmartBuddy (智花学伴)</li>
<li><strong>Developer</strong>: Five Questions (Beijing) Technology Co., Ltd.</li>
<li><strong>Platforms</strong>: Android / iOS / Web (as offered)</li>
<li><strong>Trademarks</strong>: “五道题” and “智花” are registered trademarks of the developer</li>
</ul>
<h2>2. How to request account deletion</h2>
<ul>
<li>
<strong>Option A (in-app, recommended)</strong>: Open SmartBuddy → sign in →
<strong>Settings → Account &amp; Security / Account settings → Delete account</strong>
→ read the risk notice and confirm.
</li>
<li>
<strong>Option B (web request)</strong>: Fill in the form below and email us your deletion request.
Please provide the phone number, email, student ID, or other identifiers used for the account so we can verify ownership.
</li>
</ul>
<h2>3. Data typically deleted</h2>
<ul>
<li>Account profile data such as nickname, avatar, and profile fields</li>
<li>Sign-in sessions and third-party binding relationships (where technically feasible)</li>
<li>Learning and exercise data such as practice records, answers, progress, and mistake-related records</li>
<li>Interactive practice data such as dialogue practice records and voice/image answer content stored on our servers</li>
<li>Other business data directly linked to the account that is not required for legal compliance</li>
</ul>
<h2>4. Data that may be retained, and for how long</h2>
<ul>
<li><strong>Financial / transaction records</strong> (if any): retained as required by applicable law for accounting, audit, or dispute handling;</li>
<li><strong>Security and anti-abuse logs</strong>: usually retained for up to <strong>180 days</strong>, unless a longer period is required by law;</li>
<li><strong>Anonymized data</strong>: data that can no longer identify an individual may be kept for analytics;</li>
<li><strong>Records required by law or authorities</strong>: retained for the legally required minimum period.</li>
</ul>
<p>After the retention period ends, we delete or anonymize the remaining information.</p>
<h2>5. Manual review process and timing</h2>
<ol>
<li>You submit a deletion request in-app or via this page;</li>
<li>We verify account ownership (we may ask for additional proof);</li>
<li>After verification, we delete the account and process associated data;</li>
<li>We generally complete processing and respond within <strong>15 business days</strong> after a valid, verified request. Complex cases may take longer; we will explain if so.</li>
</ol>
<h2>6. Web deletion request form</h2>
<p>Complete the form below. Submitting opens your email client with a pre-filled deletion request (no app install required).</p>
<form id="form-en" onsubmit="return submitDeletion('en');">
<label for="en-name">Name (optional)</label>
<input id="en-name" name="name" type="text" placeholder="Your name" />
<label for="en-account">Account identifier (required)</label>
<input id="en-account" name="account" type="text" required placeholder="Phone / email / student ID / user ID" />
<label for="en-platform">Primary platform</label>
<select id="en-platform" name="platform">
<option value="Android">Android (Google Play)</option>
<option value="iOS">iOS</option>
<option value="Web">Web</option>
<option value="Unknown">Not sure</option>
</select>
<label for="en-contact">Contact for reply (required)</label>
<input id="en-contact" name="contact" type="text" required placeholder="Email or phone number" />
<label for="en-reason">Additional notes (optional)</label>
<textarea id="en-reason" name="reason" placeholder="e.g. Please delete my account and learning records"></textarea>
<div class="actions">
<button class="submit" type="submit">Submit request by email</button>
<a class="button secondary" href="mailto:liutingchao@fivequestions.cn?subject=SmartBuddy%20Account%20Deletion%20Request">Email us directly</a>
</div>
</form>
<p class="foot">
Contact email: <span class="mono">liutingchao@fivequestions.cn</span><br />
Developer: Five Questions (Beijing) Technology Co., Ltd.<br />
Related documents:
<a href="./privacy-policy.html">Privacy Policy</a> ·
<a href="./service-agreement.html">Terms of Service</a>
</p>
</article>
</main>
<script>
var SUPPORT_EMAIL = 'liutingchao@fivequestions.cn';
function setLang(lang) {
var zh = document.getElementById('panel-zh');
var en = document.getElementById('panel-en');
var btnZh = document.getElementById('btn-zh');
var btnEn = document.getElementById('btn-en');
var isZh = lang === 'zh';
zh.classList.toggle('hidden', !isZh);
en.classList.toggle('hidden', isZh);
btnZh.classList.toggle('active', isZh);
btnEn.classList.toggle('active', !isZh);
document.documentElement.lang = isZh ? 'zh-CN' : 'en';
try { localStorage.setItem('sb-account-deletion-lang', lang); } catch (e) {}
}
function submitDeletion(lang) {
var prefix = lang === 'zh' ? 'zh' : 'en';
var name = document.getElementById(prefix + '-name').value.trim();
var account = document.getElementById(prefix + '-account').value.trim();
var platform = document.getElementById(prefix + '-platform').value;
var contact = document.getElementById(prefix + '-contact').value.trim();
var reason = document.getElementById(prefix + '-reason').value.trim();
if (!account || !contact) return false;
var subject = 'SmartBuddy Account Deletion Request / 智花学伴账号删除申请';
var body =
'App: SmartBuddy (智花学伴)\n' +
'Developer: Five Questions (Beijing) Technology Co., Ltd.\n' +
'Package: cn.fivequestions.smartbuddy\n\n' +
'Request type: Account & associated data deletion\n' +
'Name: ' + (name || '(not provided)') + '\n' +
'Account identifier: ' + account + '\n' +
'Platform: ' + platform + '\n' +
'Contact: ' + contact + '\n' +
'Notes: ' + (reason || '(none)') + '\n\n' +
'I request that my SmartBuddy account and associated data be deleted.\n' +
'本人申请删除智花学伴账号及关联数据。\n';
window.location.href =
'mailto:' + SUPPORT_EMAIL +
'?subject=' + encodeURIComponent(subject) +
'&body=' + encodeURIComponent(body);
return false;
}
(function init() {
var lang = 'zh';
try {
var saved = localStorage.getItem('sb-account-deletion-lang');
if (saved === 'en' || saved === 'zh') lang = saved;
else if ((navigator.language || '').toLowerCase().indexOf('zh') !== 0) lang = 'en';
} catch (e) {}
setLang(lang);
})();
</script>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Some files were not shown because too many files have changed in this diff Show More