Reorganize prototype documentation

This commit is contained in:
openclaw 2026-07-23 22:42:30 +08:00
parent e7250c4cf7
commit 9e734babbb
8 changed files with 1 additions and 1316 deletions

1
.gitignore vendored
View File

@ -2,6 +2,7 @@ legacy-cent-app/
node_modules/
dist/
backups/
docs/prototype/
.env
.env.*
!.env.example

View File

@ -1,175 +0,0 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>分类轮盘步骤示意</title>
<link rel="stylesheet" href="./原型样式.css" />
</head>
<body>
<main class="flow-stage">
<section class="flow-intro">
<h1>分类轮盘步骤示意</h1>
<p>快速记账在账本流水页底部抽屉内完成。轮盘是临时选择态,不能把所有层级同时放在一个画面里。</p>
</section>
<div class="flow-grid">
<section class="phone flow-phone">
<header class="mini-appbar">
<span>1</span>
<strong>抽屉默认态</strong>
</header>
<div class="drawer-demo">
<div class="drawer-handle" aria-hidden="true"></div>
<div class="amount-line drawer-amount-line">
<strong>58.00</strong>
</div>
<div class="selection-row">
<div class="selected-path">
<span>支出</span>
<span>餐饮</span>
<strong>外卖</strong>
</div>
<button class="date-pill">今天 12:30</button>
</div>
<div class="note-line drawer-note-line">
<input value="午餐" aria-label="备注" />
</div>
<div class="mini-keypad">
<span>7</span><span>8</span><span>9</span><span class="category-cell">支出</span>
<span>4</span><span>5</span><span>6</span><span>+</span>
<span>1</span><span>2</span><span>3</span><span>-</span>
<span>.</span><span>0</span><span></span><strong></strong>
</div>
</div>
</section>
<section class="phone flow-phone">
<header class="mini-appbar">
<span>2</span>
<strong>点击支出按钮</strong>
</header>
<div class="drawer-demo">
<div class="amount-line drawer-amount-line">
<strong>58.00</strong>
</div>
<div class="selection-row">
<div class="selected-path">
<span>支出</span>
</div>
<button class="date-pill">今天 12:30</button>
</div>
<div class="floating-choice">
<div class="radial-step type-step" aria-label="类型选择">
<button class="radial-center"></button>
<button class="radial-node type-expense active">支出</button>
<button class="radial-node type-income">收入</button>
</div>
</div>
<div class="mini-keypad active-picker">
<span>7</span><span>8</span><span>9</span><strong class="confirm-cell"></strong>
<span>4</span><span>5</span><span>6</span><span>+</span>
<span>1</span><span>2</span><span>3</span><span>-</span>
<span>.</span><span>0</span><span></span><strong></strong>
</div>
</div>
</section>
<section class="phone flow-phone">
<header class="mini-appbar">
<span>3</span>
<strong>选择支出后</strong>
</header>
<div class="drawer-demo">
<div class="amount-line drawer-amount-line">
<strong>58.00</strong>
</div>
<div class="selection-row">
<div class="selected-path">
<span>支出</span>
</div>
<button class="date-pill">今天 12:30</button>
</div>
<div class="floating-choice">
<div class="radial-step category-step" aria-label="支出分类选择">
<button class="radial-center"></button>
<button class="radial-node category-food active">餐饮</button>
<button class="radial-node category-transit">交通</button>
<button class="radial-node category-daily">日用</button>
<button class="radial-node category-shop">购物</button>
</div>
</div>
<div class="mini-keypad active-picker">
<span>7</span><span>8</span><span>9</span><strong class="confirm-cell"></strong>
<span>4</span><span>5</span><span>6</span><span>+</span>
<span>1</span><span>2</span><span>3</span><span>-</span>
<span>.</span><span>0</span><span></span><strong></strong>
</div>
</div>
</section>
<section class="phone flow-phone">
<header class="mini-appbar">
<span>4</span>
<strong>进入子分类</strong>
</header>
<div class="drawer-demo">
<div class="amount-line drawer-amount-line">
<strong>58.00</strong>
</div>
<div class="selection-row">
<div class="selected-path">
<span>支出</span>
<span>餐饮</span>
</div>
<button class="date-pill">今天 12:30</button>
</div>
<div class="floating-choice">
<div class="radial-step subcategory-step" aria-label="餐饮子分类选择">
<button class="radial-center"></button>
<button class="radial-node sub-takeout active">外卖</button>
<button class="radial-node sub-restaurant">饭店</button>
<button class="radial-node sub-coffee">咖啡</button>
</div>
</div>
<div class="mini-keypad active-picker">
<span>7</span><span>8</span><span>9</span><strong class="confirm-cell"></strong>
<span>4</span><span>5</span><span>6</span><span>+</span>
<span>1</span><span>2</span><span>3</span><span>-</span>
<span>.</span><span>0</span><span></span><strong></strong>
</div>
</div>
</section>
<section class="phone flow-phone">
<header class="mini-appbar">
<span>5</span>
<strong>确认当前层级</strong>
</header>
<div class="drawer-demo">
<div class="amount-line drawer-amount-line">
<strong>58.00</strong>
</div>
<div class="selection-row">
<div class="selected-path">
<span>支出</span>
<span>餐饮</span>
<strong>外卖</strong>
</div>
<button class="date-pill">今天 12:30</button>
</div>
<div class="note-line drawer-note-line">
<input value="午餐" aria-label="备注" />
</div>
<div class="mini-keypad">
<span>7</span><span>8</span><span>9</span><span class="category-cell">外卖</span>
<span>4</span><span>5</span><span>6</span><span>+</span>
<span>1</span><span>2</span><span>3</span><span>-</span>
<span>.</span><span>0</span><span></span><strong></strong>
</div>
</div>
</section>
</div>
</main>
</body>
</html>

View File

@ -1,835 +0,0 @@
:root {
color: #101827;
background:
radial-gradient(circle at 12% 0%, rgba(255, 122, 89, 0.28), transparent 30%),
radial-gradient(circle at 92% 8%, rgba(45, 212, 191, 0.24), transparent 32%),
linear-gradient(135deg, #fff3e8 0%, #ecfeff 48%, #fff1f8 100%);
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
line-height: 1.5;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
min-width: 320px;
}
button,
input {
font: inherit;
}
.stage {
min-height: 100vh;
display: grid;
place-items: start center;
padding: 24px;
}
.phone {
width: min(100%, 390px);
height: 780px;
min-height: 780px;
overflow: hidden;
border: 1px solid rgba(20, 83, 45, 0.12);
border-radius: 28px;
background: #ffffff;
box-shadow: 0 24px 58px rgba(15, 23, 42, 0.14);
}
.appbar {
background: linear-gradient(135deg, #00a676 0%, #00b4d8 52%, #ff7a59 100%);
color: #fff;
padding: 18px 18px 14px;
}
.toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.title {
margin: 0;
font-size: 20px;
font-weight: 750;
letter-spacing: 0;
}
.icon-button {
width: 36px;
height: 36px;
display: grid;
place-items: center;
border: 0;
border-radius: 18px;
background: rgba(255, 255, 255, 0.22);
color: inherit;
font-size: 26px;
line-height: 1;
}
.toolbar-spacer {
width: 36px;
height: 36px;
}
.icon {
width: 18px;
height: 18px;
display: block;
}
.deprecated-note {
margin: 24px 14px;
border: 1px solid #bdeee0;
border-radius: 8px;
padding: 16px;
background: #ffffff;
}
.deprecated-note h2 {
margin: 0 0 8px;
font-size: 18px;
}
.deprecated-note p {
margin: 0 0 12px;
color: #526072;
}
.deprecated-note a {
color: #007a78;
font-weight: 800;
}
.stats {
display: grid;
grid-template-columns: 1fr 1.2fr 1fr;
gap: 12px;
margin-top: 20px;
text-align: center;
}
.stat strong {
display: block;
font-size: 20px;
}
.stat span {
color: rgba(255, 255, 255, 0.76);
font-size: 12px;
}
.content {
padding: 14px 14px 2px;
}
.phone-relative .content {
padding-bottom: 250px;
}
.section-title {
margin: 14px 2px 8px;
color: #0f5f68;
font-size: 13px;
font-weight: 650;
}
.ledger-card {
border: 1px solid #d8f1e7;
border-radius: 8px;
padding: 14px;
background: #ffffff;
}
.ledger-card + .ledger-card {
margin-top: 10px;
}
.ledger-head,
.row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.ledger-name {
margin: 0;
font-size: 19px;
line-height: 1.2;
}
.badge {
display: inline-flex;
align-items: center;
min-height: 24px;
padding: 0 9px;
border-radius: 12px;
background: #d7fbef;
color: #007a5a;
font-size: 12px;
font-weight: 700;
white-space: nowrap;
}
.muted {
color: #526072;
font-size: 13px;
}
.card-actions {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 8px;
margin-top: 14px;
border-top: 1px solid #dff5ee;
padding-top: 12px;
}
.action {
min-height: 36px;
border: 1px solid #ccefe5;
border-radius: 8px;
background: #fff;
color: #152033;
}
.day {
margin: 14px -14px 0;
padding: 7px 16px;
background: #e9fbf7;
color: #0f5f68;
font-size: 12px;
font-weight: 700;
}
.entry {
display: grid;
grid-template-columns: 40px 1fr auto;
gap: 10px;
align-items: center;
min-height: 62px;
border-bottom: 1px solid #e0f4ed;
}
.entry-icon {
width: 34px;
height: 34px;
display: grid;
place-items: center;
border-radius: 17px;
background: #00a676;
color: #fff;
font-size: 13px;
font-weight: 750;
}
.entry-main strong,
.entry-amount strong {
display: block;
}
.entry-main span,
.entry-amount span {
color: #526072;
font-size: 12px;
}
.entry-amount {
text-align: right;
}
.expense {
color: #d94836;
}
.income {
color: #008f5f;
}
.fab {
position: absolute;
right: 24px;
bottom: 24px;
width: 56px;
height: 56px;
border: 0;
border-radius: 28px;
background: #00a676;
color: #fff;
font-size: 28px;
box-shadow: 0 8px 24px rgba(0, 166, 118, 0.28);
}
.phone-relative {
position: relative;
}
.drawer-scrim {
position: absolute;
inset: 0;
z-index: 2;
background: linear-gradient(to bottom, rgba(15, 23, 42, 0.02), rgba(15, 23, 42, 0.2));
pointer-events: none;
}
.entry-drawer {
position: absolute;
right: 0;
bottom: 0;
left: 0;
z-index: 3;
min-height: 292px;
overflow: hidden;
border-top: 1px solid #bdeee0;
border-radius: 18px 18px 0 0;
background: #ffffff;
box-shadow: 0 -18px 36px rgba(15, 23, 42, 0.16);
}
.drawer-handle {
width: 42px;
height: 5px;
margin: 9px auto 0;
border-radius: 999px;
background: #8ee8d4;
}
.drawer-amount-line {
padding-top: 12px;
padding-bottom: 8px;
}
.radial-step {
position: relative;
width: 176px;
height: 118px;
margin-left: auto;
}
.radial-center,
.radial-node {
position: absolute;
z-index: 1;
border: 1px solid transparent;
border-radius: 999px;
display: grid;
place-items: center;
box-shadow: 0 8px 18px rgba(15, 23, 42, 0.08);
font-weight: 800;
white-space: nowrap;
}
.radial-center {
right: 0;
bottom: 0;
width: 54px;
height: 54px;
border: 0;
background: #00a676;
color: #fff;
font-size: 20px;
}
.radial-node {
min-width: 48px;
height: 34px;
padding: 0 10px;
background: #ffffff;
color: #101827;
font-size: 12px;
}
.radial-node.active {
border-color: #ffb703;
background: #fff0bf;
color: #9b4d00;
}
.type-expense {
right: 68px;
bottom: 8px;
}
.type-income {
right: 34px;
bottom: 70px;
}
.category-food {
right: 88px;
bottom: 4px;
border-color: #ffbf87;
}
.category-transit {
right: 104px;
bottom: 48px;
border-color: #93c5fd;
}
.category-daily {
right: 54px;
bottom: 82px;
border-color: #86efac;
}
.category-shop {
right: 0;
bottom: 96px;
border-color: #f9a8d4;
}
.sub-takeout {
right: 86px;
bottom: 8px;
}
.sub-restaurant {
right: 92px;
bottom: 54px;
}
.sub-coffee {
right: 40px;
bottom: 88px;
}
.selection-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: 0 14px 10px;
}
.selected-path {
display: flex;
align-items: center;
min-width: 0;
flex-wrap: wrap;
gap: 5px;
padding: 0;
color: #0f5f68;
font-size: 12px;
font-weight: 750;
}
.selected-path span + span::before,
.selected-path span + strong::before {
content: ">";
margin-right: 5px;
color: #00a676;
}
.selected-path span,
.selected-path strong {
min-height: 24px;
border-radius: 12px;
padding: 3px 8px;
background: #e6fbf8;
}
.selected-path strong {
background: #fff0bf;
color: #9b4d00;
}
.drawer-note-line {
padding-bottom: 10px;
}
.flow-stage {
width: min(100%, 1180px);
margin: 0 auto;
padding: 28px 20px 48px;
}
.flow-intro {
margin-bottom: 20px;
}
.flow-intro h1 {
margin: 0 0 6px;
font-size: 26px;
line-height: 1.15;
}
.flow-intro p {
margin: 0;
color: #526072;
}
.flow-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(252px, 1fr));
gap: 18px;
align-items: start;
}
.flow-phone {
width: 100%;
height: 470px;
min-height: 470px;
border-radius: 20px;
}
.mini-appbar {
min-height: 58px;
padding: 12px 14px;
display: flex;
align-items: center;
gap: 10px;
background: linear-gradient(135deg, #00a676 0%, #00b4d8 100%);
color: #fff;
}
.mini-appbar span {
width: 28px;
height: 28px;
border-radius: 14px;
display: grid;
place-items: center;
background: rgba(255, 255, 255, 0.22);
font-weight: 850;
}
.drawer-demo {
position: relative;
min-height: 412px;
background: #ffffff;
}
.floating-choice {
position: absolute;
right: 7px;
bottom: 150px;
z-index: 4;
padding: 10px;
border: 1px solid rgba(189, 238, 224, 0.86);
border-radius: 16px;
background: rgba(255, 255, 255, 0.94);
box-shadow: 0 14px 34px rgba(15, 23, 42, 0.16);
}
.mini-keypad {
display: grid;
grid-template-columns: repeat(4, 1fr);
margin-top: 8px;
border-top: 1px solid #bdeee0;
}
.mini-keypad span,
.mini-keypad strong {
min-height: 38px;
border-right: 1px solid #d7f5ec;
border-bottom: 1px solid #d7f5ec;
display: grid;
place-items: center;
font-size: 14px;
}
.mini-keypad span:nth-child(4n) {
border-right: 0;
background: #e6fbf8;
color: #007a78;
}
.mini-keypad strong {
border-right: 0;
background: #00a676;
color: #fff;
}
.mini-keypad .category-cell {
background: #fff0bf;
color: #9b4d00;
font-weight: 800;
}
.mini-keypad .confirm-cell {
background: #00a676;
color: #fff;
}
.active-picker {
margin-top: 170px;
}
.bottom-panel {
margin-top: 18px;
border-top: 1px solid #d7f5ec;
background: #ffffff;
}
.amount-line {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
padding: 16px;
}
.amount-line strong {
font-size: 34px;
line-height: 1;
}
.amount-meta {
display: grid;
justify-items: end;
gap: 7px;
min-width: max-content;
}
.toggle {
min-width: 58px;
min-height: 34px;
border: 0;
border-radius: 17px;
background: #ff5a47;
color: #fff;
font-weight: 750;
}
.date-pill {
min-height: 28px;
border: 1px solid #ffc56d;
border-radius: 14px;
padding: 0 10px;
background: #fff2cc;
color: #a45100;
font-size: 12px;
font-weight: 750;
}
.chips {
display: flex;
gap: 8px;
overflow-x: auto;
padding: 0 14px 12px;
scrollbar-width: none;
}
.chips::-webkit-scrollbar {
display: none;
}
.chip {
min-width: max-content;
min-height: 34px;
border: 1px solid #bdeee0;
border-radius: 17px;
padding: 0 12px;
display: inline-flex;
align-items: center;
gap: 6px;
background: #ffffff;
color: #115e59;
}
.chip.active {
border-color: #ffb703;
background: #fff0bf;
color: #9b4d00;
font-weight: 750;
}
.category-grid {
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: 8px;
padding-bottom: 12px;
}
.category {
min-width: 0;
min-height: 78px;
border: 1px solid transparent;
border-radius: 8px;
padding: 8px 4px 7px;
display: grid;
justify-items: center;
align-content: center;
gap: 6px;
background: #fff;
color: #101827;
box-shadow: 0 8px 18px rgba(15, 23, 42, 0.06);
}
.category span:last-child {
font-size: 12px;
font-weight: 700;
line-height: 1.1;
}
.category-mark {
width: 38px;
height: 38px;
border-radius: 19px;
display: grid;
place-items: center;
color: #fff;
font-size: 17px;
font-weight: 850;
}
.category.food {
border-color: #ffbf87;
background: #fff1e4;
}
.category.food .category-mark {
background: #ff6b35;
}
.category.daily {
border-color: #86efac;
background: #ecfdf3;
}
.category.daily .category-mark {
background: #16a34a;
}
.category.transit {
border-color: #93c5fd;
background: #eff6ff;
}
.category.transit .category-mark {
background: #2563eb;
}
.category.shopping {
border-color: #f9a8d4;
background: #fdf2f8;
}
.category.shopping .category-mark {
background: #e84393;
}
.category.income {
border-color: #bef264;
background: #f7fee7;
}
.category.income .category-mark {
background: #65a30d;
}
.category.active {
outline: 2px solid #00a676;
outline-offset: 0;
}
.note-line {
padding: 0 14px 12px;
}
.note-line input {
min-height: 42px;
width: 100%;
border: 1px solid #bdeee0;
border-radius: 8px;
padding: 0 12px;
background: #ffffff;
}
.chip-dot {
width: 7px;
height: 7px;
border-radius: 50%;
background: currentColor;
opacity: 0.75;
}
.keypad {
display: grid;
grid-template-columns: repeat(4, 1fr);
border-top: 1px solid #bdeee0;
}
.key {
min-height: 58px;
border: 0;
border-right: 1px solid #d7f5ec;
border-bottom: 1px solid #d7f5ec;
background: #ffffff;
color: #101827;
font-size: 20px;
font-weight: 650;
}
.key:nth-child(4n) {
border-right: 0;
background: #e6fbf8;
color: #007a78;
}
.key:active {
background: #c9f7ef;
}
.commit-key {
background: #00a676 !important;
color: #fff !important;
}
.utility-key {
font-size: 16px;
}
.category-key {
font-size: 16px;
background: #fff0bf !important;
color: #9b4d00 !important;
}
.invite-box {
border: 1px dashed #86dfca;
border-radius: 8px;
padding: 14px;
background: #ffffff;
}
.member {
display: grid;
grid-template-columns: 38px 1fr auto;
gap: 10px;
align-items: center;
min-height: 58px;
border-bottom: 1px solid #d7f5ec;
}
.avatar {
width: 36px;
height: 36px;
display: grid;
place-items: center;
border-radius: 18px;
background: #d7fbef;
color: #007a5a;
font-weight: 800;
}
@media (max-width: 430px) {
.stage {
padding: 0;
}
.phone {
height: 100vh;
min-height: 100vh;
border: 0;
border-radius: 0;
box-shadow: none;
}
}

View File

@ -1,56 +0,0 @@
# 原型说明
这些原型用于评审信息架构和移动端交互,不是最终视觉稿。
## 页面
- [账本列表](账本列表.html)
- [账本流水](账本流水.html)
- 条目明细:开发环境访问 `/prototype/entry-detail`,用于评审查看、编辑与常规分类选择流程。
- [分类轮盘步骤](分类轮盘步骤.html)
- [成员邀请](成员邀请.html)
## 快速记账
快速记账不再作为单独页面,而是账本流水页内的底部抽屉。
当前交互方向:
- 点击账本流水页右下角记账入口,打开底部抽屉。
- 抽屉内输入金额、备注、日期时间,并使用数字键盘确认。
- 金额与日期时间位于抽屉顶部;关闭按钮取消,点击抽屉外部关闭。
- 点击日期时间后直接打开系统日期时间选择器,不再展开额外输入行或二次确认按钮。
- 信息行仅保留备注和分类按钮,完整分类路径合并显示为 `支出>餐饮>外卖`,初始显示 `支出`
- 加减键用于连续计算;发生运算时金额下方显示完整算式,金额区实时显示结果,退格同时更新算式和结果。
- 点击键盘右上角的收支/分类按钮后,分类选择器覆盖原数字键盘区域,其他界面进入模糊的非交互状态。
- 分类键原位变为圆形“确定”坐标原点,已选路径使用圆形按钮向左延伸;横轴节点可点击返回对应层。
- 纵轴同时使用正负区域:原点上方最多放置两个候选,其余候选从原点下方排列并可纵向滚动。
- 坐标节点均使用带轻阴影的圆形“图标 + 小文字”按钮;横纵轴容器保持透明,不绘制面板底色。
- 坐标按钮为 `72px`,轴容器预留阴影安全区;纵轴上下端使用渐隐遮罩提示仍可继续滚动。
- “确定”上下是同一分类序列的同步滚动视口,拖动任意一端时另一端同步位移,分类可连续经过原点上下区域。
- Y 轴使用受边界约束的自定义拖动,不启用浏览器原生弹性滚动;触达首尾后继续拖动不会产生过度位移或回弹虚影。
- 松手后根据拖动速度提供短距离减速惯性,惯性同样受首尾边界约束,触边立即停止。
- 圆形按钮仅使用柔和投影表达悬浮层级,不使用拟物厚度或透视高光;靠近原点的阴影使用渐隐收尾,避免硬裁切。
- 横轴减少上下内边距;圆形节点使用更清晰的 `2px` 分类色边框区分按钮边界。
- 横轴已选路径使用分类色实底与白色前景,和未选择的浅色圆形候选形成明确区分。
- “确定”使用方形按钮并建立独立前景层Y 轴按钮与原点保留安全间距,滚动时不会被原点矩形覆盖。
- 选择器关闭时保留当前层级和选择状态,再次打开时从上一次状态继续,不重置到收支类型层。
- 横轴每一级均可点击并返回对应层重新选择;例如点击 `支出` 重新选择支出或收入,点击 `餐饮` 重新选择一级分类。
- 横轴固定占满抽屉可用宽度,纵轴固定覆盖完整键盘高度;候选数量只影响滚动,不改变坐标轴尺寸。
- 数字键盘不再放置分类键,右列为加、减和占据下面两格的整笔确认键。
- 点击选择器外部确认当前层级;选择到最后一级分类时自动确认并收起选择器。
- 备注为可选项,不自动获得焦点;用户手动点击备注后隐藏数字键盘,抽屉随内容收缩并交由系统键盘输入。
- [分类选择步骤](分类轮盘步骤.html) 用分步骤画面表达交互状态(文件名暂时保留旧称)。
- 收入后续可复用同一套二维选择器,二期再承载 `普通收入 / 报销 / 退款`
[快速记账](快速记账.html) 仅保留为旧版独立页参考,不再作为主原型入口。
## 参考来源
参考了 `legacy-cent-app` 中的旧版方向:
- 账本卡片列表。
- 账本内顶部收入、结余、支出三栏。
- 按日期分组的流水。
- 底部快捷记账面板。
- 数字键盘式金额输入。

View File

@ -1,28 +0,0 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>快速记账原型已合并</title>
<link rel="stylesheet" href="./原型样式.css" />
</head>
<body>
<main class="stage">
<section class="phone">
<header class="appbar">
<div class="toolbar">
<button class="icon-button" aria-label="关闭">×</button>
<h1 class="title">快速记账</h1>
<span class="toolbar-spacer" aria-hidden="true"></span>
</div>
</header>
<div class="deprecated-note">
<h2>已并入账本流水页</h2>
<p>快速记账不再作为独立页面。请在账本流水页查看底部抽屉和分类轮盘交互。</p>
<a href="./账本流水.html">打开账本流水原型</a>
</div>
</section>
</main>
</body>
</html>

View File

@ -1,62 +0,0 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>成员邀请原型</title>
<link rel="stylesheet" href="./原型样式.css" />
</head>
<body>
<main class="stage">
<section class="phone">
<header class="appbar">
<div class="toolbar">
<button class="icon-button" aria-label="返回">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m15 18-6-6 6-6"/></svg>
</button>
<h1 class="title">成员</h1>
<button class="icon-button" aria-label="邀请">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M19 8v6"/><path d="M22 11h-6"/></svg>
</button>
</div>
</header>
<div class="content">
<p class="section-title">家庭日常</p>
<section class="invite-box">
<div class="row">
<div>
<strong>邀请成员加入账本</strong>
<div class="muted">链接 24 小时后过期</div>
</div>
<button class="primary">生成</button>
</div>
</section>
<p class="section-title">当前成员</p>
<article class="member">
<div class="avatar"></div>
<div><strong>自己</strong><div class="muted">owner · 可邀请和移除成员</div></div>
<span class="badge">拥有者</span>
</article>
<article class="member">
<div class="avatar"></div>
<div><strong>小王</strong><div class="muted">member · 可查看和记账</div></div>
<span class="badge">成员</span>
</article>
<article class="member">
<div class="avatar"></div>
<div><strong>小李</strong><div class="muted">member · 最近同步 10:42</div></div>
<span class="badge">成员</span>
</article>
<p class="section-title">权限说明</p>
<div class="ledger-card">
<div class="muted">首版只做账本级权限。同一账本内成员共享全量流水,不做单条账目权限。</div>
</div>
</div>
</section>
</main>
</body>
</html>

View File

@ -1,76 +0,0 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>账本列表原型</title>
<link rel="stylesheet" href="./原型样式.css" />
</head>
<body>
<main class="stage">
<section class="phone">
<header class="appbar">
<div class="toolbar">
<button class="icon-button" aria-label="同步">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 6v5h-5"/><path d="M4 18v-5h5"/><path d="M18 11a6 6 0 0 0-10-4l-4 4"/><path d="M6 13a6 6 0 0 0 10 4l4-4"/></svg>
</button>
<h1 class="title">账本</h1>
<button class="icon-button" aria-label="新增账本">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 5v14"/><path d="M5 12h14"/></svg>
</button>
</div>
</header>
<div class="content">
<p class="section-title">我的账本</p>
<article class="ledger-card">
<div class="ledger-head">
<div>
<h2 class="ledger-name">家庭日常</h2>
<span class="muted">3 名成员 · 今天已同步</span>
</div>
<span class="badge">共享</span>
</div>
<div class="card-actions">
<button class="action">设置</button>
<button class="action">报表</button>
<button class="action">成员</button>
</div>
</article>
<article class="ledger-card">
<div class="ledger-head">
<div>
<h2 class="ledger-name">旅行备用</h2>
<span class="muted">仅自己 · 12 条流水</span>
</div>
<span class="badge">独享</span>
</div>
<div class="card-actions">
<button class="action">设置</button>
<button class="action">报表</button>
<button class="action">成员</button>
</div>
</article>
<article class="ledger-card">
<div class="ledger-head">
<div>
<h2 class="ledger-name">装修记录</h2>
<span class="muted">2 名成员 · 有 2 条待同步</span>
</div>
<span class="badge">共享</span>
</div>
<div class="card-actions">
<button class="action">设置</button>
<button class="action">报表</button>
<button class="action">成员</button>
</div>
</article>
</div>
</section>
</main>
</body>
</html>

View File

@ -1,84 +0,0 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>账本流水原型</title>
<link rel="stylesheet" href="./原型样式.css" />
</head>
<body>
<main class="stage">
<section class="phone phone-relative">
<header class="appbar">
<div class="toolbar">
<button class="icon-button" aria-label="报表">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 19V5"/><path d="M8 17V9"/><path d="M12 17V7"/><path d="M16 17v-4"/><path d="M20 17V6"/></svg>
</button>
<h1 class="title">家庭日常</h1>
<button class="icon-button" aria-label="更多">
<svg class="icon" viewBox="0 0 24 24" fill="currentColor"><circle cx="5" cy="12" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="19" cy="12" r="2"/></svg>
</button>
</div>
<div class="stats">
<div class="stat"><strong>8,240</strong><span>收入</span></div>
<div class="stat"><strong>5,986</strong><span>结余</span></div>
<div class="stat"><strong>2,254</strong><span>支出</span></div>
</div>
</header>
<div class="content">
<div class="day">今天 · 7 月 18 日</div>
<article class="entry">
<div class="entry-icon"></div>
<div class="entry-main"><strong>午餐</strong><span>餐饮 · 小王</span></div>
<div class="entry-amount"><strong class="expense">-58.00</strong><span>12:28</span></div>
</article>
<article class="entry">
<div class="entry-icon"></div>
<div class="entry-main"><strong>打车</strong><span>交通 · 自己</span></div>
<div class="entry-amount"><strong class="expense">-31.50</strong><span>09:16</span></div>
</article>
<div class="day">昨天 · 7 月 17 日</div>
<article class="entry">
<div class="entry-icon"></div>
<div class="entry-main"><strong>工资</strong><span>收入 · 自己</span></div>
<div class="entry-amount"><strong class="income">+8,240.00</strong><span>18:02</span></div>
</article>
<article class="entry">
<div class="entry-icon"></div>
<div class="entry-main"><strong>超市采购</strong><span>日用 · 小王</span></div>
<div class="entry-amount"><strong class="expense">-236.80</strong><span>16:45</span></div>
</article>
</div>
<div class="drawer-scrim" aria-hidden="true"></div>
<section class="entry-drawer" aria-label="快速记账抽屉">
<div class="drawer-handle" aria-hidden="true"></div>
<div class="amount-line drawer-amount-line">
<strong>58.00</strong>
</div>
<div class="selection-row">
<div class="selected-path" aria-label="当前分类">
<span>支出</span>
<span>餐饮</span>
<strong>外卖</strong>
</div>
<button class="date-pill" aria-label="选择日期时间">今天 12:30</button>
</div>
<div class="note-line drawer-note-line">
<input value="午餐" aria-label="备注" />
</div>
<div class="keypad">
<button class="key">7</button><button class="key">8</button><button class="key">9</button><button class="key category-key" aria-label="分类选择">支出</button>
<button class="key">4</button><button class="key">5</button><button class="key">6</button><button class="key">+</button>
<button class="key">1</button><button class="key">2</button><button class="key">3</button><button class="key">-</button>
<button class="key">.</button><button class="key">0</button><button class="key utility-key" aria-label="退格"></button><button class="key commit-key" aria-label="确认"></button>
</div>
</section>
</section>
</main>
</body>
</html>