From 689e01296e1e9a0c4fd01baf0c7f27357af662e8 Mon Sep 17 00:00:00 2001 From: jesse-ux Date: Sun, 25 Oct 2026 06:56:39 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=BA=93=E6=94=B6=E5=B0=BE?= =?UTF-8?q?=EF=BC=9A=E5=88=A0=E6=8E=89=E6=B2=A1=E4=BA=BA=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E6=97=A7=E6=A0=B7=E5=BC=8F=EF=BC=8C=E6=A3=80=E6=9F=A5=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E5=8F=AA=E7=95=99=E7=BB=98=E5=88=B6=E4=BE=8B=E5=A4=96?= =?UTF-8?q?=EF=BC=88#111=EF=BC=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit globals.css 从 7249 行减到 7011 行,删了 56 个已经没人用的类,16 个关键帧都还在用。手写控件名单从 9 个文件收到 2 个:天空绘制和校正顶栏探头。星盘和星图的图标豁免仍在规则里。设计说明改成以 shadcn base-nova 和 Motion 预设为准。页面用法没有再改。 自测:tsc --noEmit 退出码 0;frontend 下 npm run lint 0 error、122 warning;白名单、样式隔离、时间线和错误边界测试 18 条通过、失败 0、取消 0;npm run build 后 / 仍是 Static。首屏 JS gzip-9 相对 728ead88 从 644683 到 648993(+0.67%)。没有跑全量 npm test、Python 快速门和 test:db。 Co-Authored-By: Grok (agent loop) --- CHANGELOG.md | 7 + docs/BUG_HISTORY.md | 6 +- .../PROGRESS-ui-kit-7-cleanup-20261023.md | 62 ++++ docs/tasks/README.md | 2 +- docs/testing/ui-kit-migration-20261023.md | 10 + frontend/DESIGN.md | 348 +++++++++--------- frontend/docs/VOICE.md | 2 +- frontend/eslint/no-handwritten-control.mjs | 5 + frontend/eslint/ui-primitive-whitelist.json | 7 - frontend/src/app/error.tsx | 6 +- frontend/src/app/globals.css | 316 ++-------------- .../components/ayanamsa-preference-field.tsx | 9 +- .../src/components/birth-place-picker.tsx | 5 +- .../components/consultation-run-timeline.tsx | 8 +- .../src/components/home-bootstrap-error.tsx | 4 +- .../src/components/home-onboarding-shell.tsx | 5 +- .../personal-report-markdown-view.tsx | 5 +- .../tests/chat-stream-settle-contract.test.ts | 5 +- .../site-style-isolation-contract.test.ts | 9 +- frontend/tests/ui-kit-whitelist.test.ts | 69 +--- 20 files changed, 352 insertions(+), 538 deletions(-) create mode 100644 docs/tasks/PROGRESS-ui-kit-7-cleanup-20261023.md diff --git a/CHANGELOG.md b/CHANGELOG.md index af8f857e..aeeddf55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # 印度占星 Skill 更新日志 +## 2026-10-25 — 组件库收尾:去掉没人用的旧样式 + +- 删掉样式表里已经没有页面使用的旧类。还在用的类和动画都留着。 +- 手写控件的检查名单收到只剩两处:那一刻的天空绘制,以及校正盘面挂在顶栏的探头。星盘和星图的画法仍可例外。 +- 设计说明改成以组件库为准。页面上的按钮、文案和操作没有再改一轮。 +- 没有新的故障。Skill 版本不变。 + ## 2026-10-25 — 生时校正的选项卡片换成组件库 - 校正里的选项仍是圆角卡片。点中之后是浅底描边。确定程度仍是三个圆点,大概范围仍是一排标签。 diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 409be2db..3fe019d0 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -19370,14 +19370,14 @@ - 状态:enhancement - 首次发现:2026-10-24 -- 最近更新:2026-10-24 -- 影响面:前端依赖、对话消息入场、设计令牌别名、新增的 shadcn 组件、手写控件检查。侧栏、对话页、星盘页的控件这一张没有换。 +- 最近更新:2026-10-25。K7 把白名单从迁完后剩下的 9 个文件收到 2 个。没有新的故障现象,不另编号。 +- 影响面:前端依赖、对话消息入场、设计令牌别名、新增的 shadcn 组件、手写控件检查。侧栏、对话页、星盘页的控件这一张没有换。K7 只删没用的旧样式,并换掉还留在名单里的普通按钮。 - 用户现象:页面上的控件和文案与改前相同。对话新出现的一行仍是一次短入场;系统开了「减少动态效果」时不做这次入场。 - 触发条件:打开首页或已有对话。这一张不改变请求、扣点或落库。 - 根因:不是缺陷。产品在组件库迁移里定了换用 Motion、shadcn、按需加载和 lint 拦截(D1、D2、D3、D4、D7)。这一张只加底座。 - 修复:去掉 GSAP。消息入场改为按需加载的 Motion,时长仍是 160 毫秒。用固定版本的 shadcn CLI 补上任务书列出的组件,不重装已有的 8 个。设计令牌映射到 shadcn 变量,深色浅色都跟着现有色板。Motion 预设和四个 store 只是骨架,没有接到页面上。`src/components/ui` 以外的新手写控件会报错;迁移前已有的文件在白名单里,测试锁住这份名单不能变长。星盘与星图的 SVG 绘制路径豁免图标规则。 - 验证:见 `docs/tasks/PROGRESS-ui-kit-0-base-20261023.md`。没有浏览器登录态,不把界面截图写成通过。 -- 防复发:`frontend/tests/ui-kit-whitelist.test.ts` 锁住白名单只减不增,并检查新文件里的 ` + [data-sonner-toaster]), section[popover][aria-label^="页 background: transparent; color: inherit; } -.agent-activity-status__row { min-height: 24px; display: flex; align-items: center; gap: var(--space-2); min-width: 0; width: 100%; } + .agent-activity-status__live { min-height: 24px; display: flex; align-items: center; gap: var(--space-2); min-width: 0; } .agent-activity-status__elapsed, .agent-thinking-elapsed { @@ -648,11 +646,7 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 color: var(--color-ink-tertiary); font-variant-numeric: tabular-nums; } -.agent-activity-status__trail { - margin: 0; - padding-left: 28px; - color: var(--color-ink-tertiary); -} + .agent-activity-status__text { color: var(--color-ink-tertiary); background: linear-gradient( @@ -726,10 +720,8 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 .section-title { display: flex; align-items: center; justify-content: space-between; gap: var(--space-5); } .code-form { display: grid; grid-template-columns: 120px 120px 200px minmax(180px, 1fr) auto; align-items: end; gap: var(--space-3); margin-top: var(--space-5); } .code-form label { display: grid; gap: var(--space-2); } -.generated-list { display: grid; gap: 8px; margin-top: 16px; } -.generated-list code { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + .status-已过期, .status-已兑换 { color: var(--color-ink-secondary); } -.empty-cell { color: var(--color-ink-secondary); text-align: center !important; } .sidebar-nav-link[data-nav="new"]:not(:disabled):active, .session-main:not(:disabled):active, .session-menu-trigger:not(:disabled):active, .session-action-item:not([data-disabled]):active, .sidebar-account-trigger:not(:disabled):active, .credit-balance:not(:disabled):active, .account-menu-item:not([data-disabled]):active, .composer button:not(:disabled):active, .button-primary:not(:disabled):active, .button-secondary:not(:disabled):active, .dialog-close:not(:disabled):active, .generated-list button:not(:disabled):active, .inline-actions button:not(:disabled):active{ transform: scale(.96); } @@ -1054,7 +1046,7 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 .chat-profile-picker-chevron { width: 14px; height: 14px; flex: 0 0 auto; color: var(--color-ink-tertiary); } .chat-profile-picker-add { margin-top: var(--space-2); padding-top: var(--space-2); border-top: 1px solid var(--color-border); } .chat-profile-picker-add a { min-height: 44px; display: flex; align-items: center; padding: 0 var(--space-3); border-radius: var(--radius-md); color: var(--color-ink); font-size: var(--type-body-sm); text-decoration: none; } -.chat-profile-picker-positioner { z-index: 30; outline: 0; } + .chat-profile-picker-popup { width: max-content; min-width: 220px; max-width: min(320px, calc(100vw - var(--space-6))); border: 1px solid var(--color-border); padding: var(--space-3); border-radius: var(--radius-lg); background: var(--color-canvas); box-shadow: var(--shadow-elevated); transform-origin: var(--transform-origin); transition: opacity 120ms ease-out, transform 120ms var(--ease-out); } .chat-profile-picker-popup[data-starting-style], .chat-profile-picker-popup[data-ending-style] { opacity: 0; transform: translateY(calc(var(--space-1) * -1)); } .chat-profile-picker-title { margin: 0; color: var(--color-ink); font-family: var(--font-display); font-size: var(--type-title-sm); font-weight: 500; } @@ -1287,24 +1279,13 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 .birth-time-range-summary dt { color: var(--color-ink-tertiary); font-size: var(--type-overline); } .birth-time-range-summary dd { margin: 0; color: var(--color-ink); font-size: var(--type-body-sm); font-variant-numeric: tabular-nums; } .birth-time-assistant-intent, .birth-time-assessment-unavailable { margin: 0; padding: var(--space-3) 0; border-top: 1px solid var(--color-border); background: transparent; color: var(--color-ink); font-size: var(--type-body-sm); line-height: 1.6; word-break: keep-all; overflow-wrap: break-word; } -.birth-time-question-list { display: grid; gap: var(--space-4); } + .birth-time-question-progress { display: flex; justify-content: space-between; color: var(--color-ink-secondary); font-size: var(--type-caption); } -.birth-time-question { display: grid; gap: var(--space-3); margin: 0; padding: var(--space-4) 0 0; border: 0; border-top: 1px solid var(--color-border); } -.birth-time-question legend { display: flex; align-items: flex-start; gap: var(--space-2); color: var(--color-ink); font-size: var(--type-body-sm); font-weight: 600; line-height: 1.55; } -.birth-time-question legend span { width: 24px; height: 24px; display: inline-grid; flex: 0 0 24px; place-items: center; border: 1px solid var(--color-border-strong); border-radius: var(--radius-xs); color: var(--color-ink-secondary); font-size: var(--type-overline); } -.birth-time-answer-list { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2); } -.birth-time-answer-list button { min-height: 52px; display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-3); border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-canvas); cursor: pointer; text-align: left; font-size: var(--type-caption); line-height: 1.4; transition: border-color 120ms ease-out, background-color 120ms ease-out, transform 120ms ease-out; } -.birth-time-answer-list button > span { color: var(--color-action); font-family: var(--font-mono); font-weight: 600; } + .birth-time-answer-list button.is-selected { border-color: var(--color-action); background: var(--color-action-soft); } -.birth-time-question > small { color: var(--color-ink-secondary); font-size: var(--type-overline); } + .birth-time-evidence-note, .birth-time-evidence-boundary { margin: 0; color: var(--color-ink-secondary); font-size: var(--type-caption); line-height: 1.6; word-break: keep-all; overflow-wrap: break-word; } -.birth-time-event-list { display: grid; gap: var(--space-3); } -.birth-time-event-row { display: grid; grid-template-columns: 1.1fr .9fr 1fr; gap: var(--space-3); margin: 0; padding: var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-canvas); } -.birth-time-event-row legend { grid-column: 1 / -1; padding: 0 var(--space-1); color: var(--color-ink); font-size: var(--type-caption); font-weight: 600; } -.birth-time-event-row label { min-width: 0; display: grid; gap: var(--space-2); } -.birth-time-event-row label > span { color: var(--color-ink-secondary); font-size: var(--type-overline); font-weight: 600; } -.birth-time-event-remove { min-height: 44px; grid-column: 1 / -1; justify-self: start; border: 0; padding: 0; background: transparent; color: var(--color-action); cursor: pointer; font-size: var(--type-caption); } -.birth-time-evidence-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--space-2); } + .birth-time-candidate-result { display: grid; gap: var(--space-4); padding: var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-canvas); } .birth-time-candidate-heading { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); } .birth-time-candidate-heading > b { color: var(--color-ink); font-size: var(--type-body-sm); } @@ -1321,8 +1302,7 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 .birth-time-next-step > p { margin: 0; color: var(--color-ink-secondary); } .birth-time-next-step > .birth-time-guided-action { width: 100%; min-height: 48px; } .birth-time-next-step > .form-error { width: 100%; color: var(--color-danger); } -.birth-time-retry-card { display: grid; justify-items: start; gap: var(--space-3); } -.birth-time-retry-card p { margin: 0; color: var(--color-ink-secondary); font-size: var(--type-body-sm); line-height: 1.6; } + .birth-time-guide-turn, .birth-time-evidence-draft-card, .birth-time-scoring-status, .birth-time-candidate-terminal { min-width: 0; max-width: 100%; display: grid; gap: var(--space-4); } .birth-time-guide-question { margin: 0; color: var(--color-ink); font-family: var(--font-display); font-size: var(--type-title-md); line-height: 1.55; text-wrap: pretty; word-break: auto-phrase; } .birth-time-guide-composer, .birth-time-draft-fields label { min-width: 0; display: grid; gap: var(--space-2); } @@ -1343,7 +1323,7 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 .birth-time-success-note { padding: var(--space-3) 0; border-top: 1px solid var(--color-border); background: transparent; color: var(--color-success); } .birth-time-candidate-terminal { justify-items: start; } .birth-time-candidate-result, .birth-time-candidate-result > *, .birth-time-confirmation-panel > * { min-width: 0; max-width: 100%; } -.rectification-session-surface { width: min(720px, 100%); min-width: 0; margin: 0 auto; } + .conversational-rectification { width: 100%; min-width: 0; max-width: 720px; display: grid; gap: var(--space-5); margin: 0 auto; overflow-wrap: anywhere; color: var(--color-ink); } .conversational-rectification > *, .conversational-rectification form, .conversational-rectification fieldset { min-width: 0; max-width: 100%; } .conversational-rectification button { min-height: 44px; max-width: 100%; overflow-wrap: anywhere; } @@ -1351,48 +1331,16 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 .conversational-rectification .birth-time-choice-option:focus-visible { outline: 2px solid var(--color-focus); outline-offset: -2px; } .conversational-rectification .birth-time-choice-option[data-selected="true"]:focus-visible { outline: none; } .conversational-narrative { overflow: hidden; border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: var(--color-canvas); box-shadow: var(--shadow-soft); } -.conversational-narrative-body { padding: var(--space-4) var(--space-5); } + .conversational-narrative .message-markdown { overflow-wrap: anywhere; color: var(--color-ink-secondary); font-size: var(--type-body-sm); line-height: 1.8; } .conversational-narrative .message-markdown > :first-child { margin-top: 0; } .conversational-narrative .message-markdown > :last-child { margin-bottom: 0; } .conversational-narrative .message-markdown h2, .conversational-narrative .message-markdown h3 { margin: var(--space-4) 0 var(--space-2); font-family: var(--font-body); font-size: var(--type-body-md); font-weight: 600; letter-spacing: 0; } -.conversational-answer-pending { min-width: 0; display: grid; grid-template-columns: 40px minmax(0, 1fr); align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4); border: 1px solid color-mix(in srgb, var(--color-action) 24%, var(--color-border)); border-radius: var(--radius-lg); background: var(--color-action-soft); } + .conversational-answer-pending .app-loading-symbol { width: 40px; height: 40px; } .conversational-answer-pending .app-loading-mark { width: 22px; height: 22px; } -.conversational-answer-pending > div:last-child { min-width: 0; display: grid; gap: var(--space-1); } -.conversational-answer-pending strong { color: var(--color-ink); font-size: var(--type-body-sm); font-weight: 600; } -.conversational-answer-pending span { color: var(--color-ink-secondary); font-size: var(--type-caption); line-height: 1.5; } -.conversational-composer { display: grid; gap: var(--space-3); padding: var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: var(--color-canvas); } -.conversational-composer label { display: grid; gap: var(--space-1); font-size: var(--type-body-sm); font-weight: 600; } -.conversational-composer label span { color: var(--color-ink-secondary); font-size: var(--type-caption); font-weight: 400; line-height: 1.5; } -.conversational-composer textarea { width: 100%; min-width: 0; min-height: 112px; resize: vertical; padding: var(--space-3); border: 1px solid var(--color-border-strong); border-radius: var(--radius-md); background: var(--color-canvas); color: var(--color-ink); line-height: 1.55; } -.conversational-composer-footer { min-width: 0; display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); } -.conversational-composer-footer small { color: var(--color-ink-tertiary); font-size: var(--type-overline); } -.conversational-evidence-recap, .conversational-candidate, .conversational-confirmation, .conversational-original-question, .conversational-empty-state { min-width: 0; display: grid; gap: var(--space-3); padding: var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: var(--color-canvas); } -.conversational-evidence-recap > header, .conversational-candidate > header { min-width: 0; display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); } -.conversational-evidence-recap h3, .conversational-candidate h3, .conversational-confirmation h3 { margin: 0; font-family: var(--font-display); font-size: var(--type-title-md); font-weight: 500; } -.conversational-evidence-recap > header span, .conversational-candidate > header span { color: var(--color-ink-secondary); font-size: var(--type-caption); } -.conversational-candidate > header .is-unverified { color: var(--color-warning); font-weight: 600; } -.conversational-candidate > header .is-confirmed { color: var(--color-success); font-weight: 600; } -.conversational-evidence-recap ul { min-width: 0; display: grid; gap: var(--space-2); margin: 0; padding: 0; list-style: none; } -.conversational-evidence-recap li { min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: var(--space-3); padding: var(--space-3); border-radius: var(--radius-md); background: var(--color-canvas-soft); } -.conversational-evidence-recap li > div { min-width: 0; } -.conversational-evidence-recap time { color: var(--color-ink-tertiary); font-size: var(--type-overline); } -.conversational-evidence-recap p, .conversational-candidate p, .conversational-confirmation p, .conversational-original-question p, .conversational-empty-state p, .conversational-status p { margin: 0; color: var(--color-ink-secondary); font-size: var(--type-body-sm); line-height: 1.6; } -.conversational-evidence-recap li button { min-width: 56px; padding: 0 var(--space-3); border: 0; background: transparent; color: var(--color-action); cursor: pointer; } -.conversational-candidate dl { min-width: 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1px; margin: 0; overflow: hidden; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-border); } -.conversational-candidate dl > div { min-width: 0; display: grid; gap: var(--space-1); padding: var(--space-3); background: var(--color-canvas-soft); } -.conversational-candidate dt { color: var(--color-ink-tertiary); font-size: var(--type-overline); } -.conversational-candidate dd { min-width: 0; margin: 0; color: var(--color-ink); font-size: var(--type-body-sm); overflow-wrap: anywhere; } -.conversational-candidate time { font-family: var(--font-mono); font-variant-numeric: tabular-nums; } -.conversational-candidate-progress { min-width: 0; display: grid; gap: var(--space-1); padding-top: var(--space-3); border-top: 1px solid var(--color-border); } -.conversational-candidate-progress strong { color: var(--color-ink); font-size: var(--type-body-sm); font-weight: 600; } -.conversational-candidate-progress span { color: var(--color-ink-secondary); font-size: var(--type-caption); line-height: 1.55; text-wrap: pretty; } -.conversational-confirmation { border-color: color-mix(in srgb, var(--color-action) 44%, var(--color-border)); background: var(--color-action-soft); } -.conversational-status { min-width: 0; min-height: 1px; } -.conversational-original-question { background: var(--color-success-muted); } -.phrase-nowrap { white-space: nowrap; } +.phrase-nowrap { white-space: nowrap; } .message-list { /* The assistant reply starts at the column edge (no avatar since @@ -1625,8 +1573,7 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 font-size: var(--type-caption); } .reply-down-reason-head, .reply-down-reason-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); } -.reply-down-reason-close { display: grid; place-items: center; min-width: 32px; min-height: 32px; border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--color-ink-tertiary); cursor: pointer; } -.reply-down-reason-close svg { width: 16px; height: 16px; } + .reply-down-reason-chips { display: flex; flex-wrap: wrap; gap: var(--space-2); } .reply-down-reason-chips button { min-height: 32px; padding: 0 var(--space-3); border: 1px solid var(--color-border); border-radius: 999px; background: transparent; color: var(--color-ink-secondary); font: inherit; cursor: pointer; } .reply-down-reason-chips button[aria-pressed="true"] { border-color: var(--color-ink-secondary); background: var(--color-canvas-muted); color: var(--color-ink); } @@ -1717,56 +1664,7 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 .message-actions button:focus-visible { outline: 2px solid color-mix(in srgb, var(--color-focus) 52%, transparent); outline-offset: 1px; } .message-actions button:disabled { cursor: default; opacity: 0.32; } .message-actions svg { width: 13px; height: 13px; stroke-width: 1.65; } -.rectification-analysis { - width: min(620px, calc(100% - 42px)); - margin: -2px 0 var(--space-1) 42px; - color: var(--color-ink-secondary); - font-size: var(--type-caption); -} -.rectification-analysis > summary { - width: fit-content; - display: flex; - align-items: center; - gap: var(--space-2); - min-height: 30px; - padding: 0 var(--space-2); - border-radius: var(--radius-sm); - color: var(--color-ink-tertiary); - cursor: pointer; - list-style: none; - transition: background-color 120ms ease-out, color 120ms ease-out; -} -.rectification-analysis > summary::-webkit-details-marker { display: none; } -.rectification-analysis > summary::before { - width: 6px; - height: 6px; - border-right: 1.5px solid currentColor; - border-bottom: 1.5px solid currentColor; - content: ""; - transform: rotate(-45deg); - transition: transform 120ms ease-out; -} -.rectification-analysis[open] > summary::before { transform: rotate(45deg) translate(-1px, -1px); } -.rectification-analysis > summary:hover { background: var(--color-canvas-muted); color: var(--color-ink-secondary); } -.rectification-analysis > summary:focus-visible { outline: 2px solid color-mix(in srgb, var(--color-focus) 52%, transparent); outline-offset: 1px; } -.rectification-analysis > summary small { color: var(--color-ink-muted); font-size: inherit; } -.rectification-analysis-content { - display: grid; - gap: var(--space-3); - margin: var(--space-1) 0 var(--space-2); - padding: var(--space-3) var(--space-4); - border: 1px solid color-mix(in srgb, var(--color-border) 76%, transparent); - border-radius: var(--radius-md); - background: color-mix(in srgb, var(--color-canvas-muted) 54%, transparent); -} -.rectification-analysis-content section { display: grid; gap: var(--space-2); } -.rectification-analysis-content h4 { margin: 0; color: var(--color-ink-secondary); font-size: var(--type-caption); font-weight: 600; } -.rectification-analysis-content ol, -.rectification-analysis-content ul { display: grid; gap: var(--space-2); margin: 0; padding: 0; list-style: none; } -.rectification-analysis-content li { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-3); } -.rectification-analysis-content li span { min-width: 0; color: var(--color-ink-secondary); } -.rectification-analysis-content li small { flex: 0 0 auto; color: var(--color-ink-muted); } -.rectification-analysis-content p { margin: 0; color: var(--color-ink-secondary); font-size: var(--type-caption); line-height: 1.55; } + /* No `text-wrap: pretty` on answer prose (BUG-1252). WebKit (every iPhone browser) applies it to the whole paragraph: lines come out evenly short with a blank strip on the right, and every streamed character re-breaks the @@ -2035,24 +1933,23 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 .model-selector-trigger > b { min-width: 0; overflow: visible; overflow-wrap: anywhere; text-align: left; white-space: normal; font-size: var(--type-caption); font-weight: 500; line-height: 1.35; } .model-selector-trigger svg { width: 16px; height: 16px; flex: 0 0 auto; color: var(--color-ink-tertiary); transition: transform 120ms ease-out; } .model-selector-trigger[data-popup-open] svg { transform: rotate(180deg); } -.model-selector-positioner { z-index: 30; outline: 0; } + .model-selector-popup { width: max-content; min-width: 180px; max-width: min(420px, calc(100vw - var(--space-6))); border: 1px solid var(--color-border); padding: var(--space-3); border-radius: var(--radius-lg); background: var(--color-canvas); box-shadow: var(--shadow-elevated); transform-origin: var(--transform-origin); transition: opacity 120ms ease-out, transform 120ms var(--ease-out); } .model-selector-popup[data-starting-style], .model-selector-popup[data-ending-style] { opacity: 0; transform: translateY(var(--space-1)); } .model-selector-title { margin: 0; color: var(--color-ink); font-family: var(--font-display); font-size: var(--type-title-sm); font-weight: 500; } -.model-selector-options { display: grid; gap: var(--space-1); margin: var(--space-2) 0 0; padding: 0; border: 0; } + .model-selector-option { width: 100%; min-height: 48px; display: grid; grid-template-columns: auto 20px; align-items: center; gap: var(--space-3); padding: var(--space-2) var(--space-3); border: 1px solid transparent; border-radius: var(--radius-md); color: var(--color-ink-secondary); cursor: pointer; transition: border-color 120ms ease-out, background-color 120ms ease-out, color 120ms ease-out; } .model-selector-option[data-selected] { border-color: var(--color-border); background: var(--color-selected); color: var(--color-ink); } .model-selector-option:has(input:focus-visible) { outline: 3px solid color-mix(in srgb, var(--color-focus) 56%, transparent); outline-offset: 1px; } .model-selector-copy { width: max-content; min-width: 0; max-width: min(320px, calc(100vw - 96px)); display: grid; gap: var(--space-1); } .model-selector-copy b { overflow: visible; overflow-wrap: anywhere; color: inherit; white-space: normal; font-size: var(--type-body-sm); font-weight: 500; line-height: 1.35; } -.model-selector-check { width: 18px; height: 18px; opacity: 0; color: var(--color-action); } + .model-selector-option[data-selected] .model-selector-check { opacity: 1; } @media (max-width: 1023px) { .model-selector-trigger { max-width: 100%; grid-column: 1; grid-row: 1; } } - :has(> .account-menu-popup) { z-index: 30; max-width: calc(100vw - var(--space-6)); max-height: calc(100dvh - var(--space-6)); outline: 0; } .account-menu-popup { width: min(280px, calc(100vw - var(--space-6))); max-height: var(--available-height); overflow-y: auto; padding: var(--space-2); border: 1px solid var(--sidebar-border); border-radius: var(--radius-xl); background: var(--color-canvas); color: var(--sidebar-foreground); box-shadow: var(--shadow-elevated); transform-origin: var(--transform-origin); transition: opacity 120ms ease-out, transform 120ms var(--ease-out); } .account-menu-popup[data-starting-style], .account-menu-popup[data-ending-style] { opacity: 0; transform: translateY(var(--space-1)); } @@ -2146,7 +2043,7 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 children, never on the scroll container or dialog box, so pane switches keep the same frame (BUG-554 / BUG-698). List panes remain full-bleed within this inset. */ .settings-dialog-content--form > * { max-width: 560px; margin-right: auto; } -.settings-dialog-copy { max-width: 760px; margin: 0 0 var(--space-5); color: var(--color-ink-secondary); font-size: var(--type-body-sm); line-height: 1.6; } + .avatar-section { padding-top: 0; } .avatar-editor { display: grid; grid-template-columns: 56px minmax(0, 1fr); align-items: center; gap: var(--space-5); margin-top: var(--space-5); } .avatar-editor-controls { min-width: 0; display: grid; gap: var(--space-4); } @@ -2185,35 +2082,12 @@ section[popover]:has(> [data-sonner-toaster]), section[popover][aria-label^="页 .sheet-section { border-bottom: 1px solid var(--color-border); padding: var(--space-6) 0; border-color: var(--color-border); } .section-toggle b, .section-heading b { display: block; font-family: var(--font-display); font-size: var(--type-title-md); font-weight: 500; } .section-toggle small, .section-heading small { display: block; margin-top: 4px; color: var(--color-ink-secondary); font-weight: 400; font-size: var(--type-caption); } -.default-chart-card { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); margin-top: var(--space-5); padding: var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: var(--color-canvas-muted); } -.default-chart-card > div, .chart-library-item > div:first-child, .chart-library-actions { min-width: 0; } -.default-chart-card span, .default-chart-card small { display: block; color: var(--color-ink-secondary); font-size: var(--type-caption); } -.default-chart-card strong { display: block; margin: 4px 0; color: var(--color-ink); font-size: var(--type-body-md); font-weight: 500; } + .chart-library-panel { display: grid; gap: var(--space-5); margin-top: var(--space-5); } -.chart-library-group { display: grid; gap: var(--space-3); } -.chart-library-group-heading { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); } -.chart-library-group-heading > div:first-child { min-width: 0; } -.chart-library-group-heading-actions { display: flex; align-items: center; flex: 0 0 auto; gap: var(--space-2); } -.chart-library-group-heading b, .chart-library-group-heading small { display: block; } -.chart-library-group-heading b { color: var(--color-ink); font-size: var(--type-caption); font-weight: 600; } -.chart-library-group-heading small { margin-top: 3px; color: var(--color-ink-secondary); font-size: var(--type-caption); font-weight: 400; } -.chart-library-count { display: grid; min-width: 24px; height: 24px; place-items: center; border-radius: 999px; background: var(--color-canvas-muted); color: var(--color-ink-secondary); font-size: var(--type-overline); } -.chart-library-item { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); width: 100%; min-height: 44px; padding: var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: var(--color-canvas); } -button.chart-library-item { cursor: pointer; text-align: left; } -.chart-library-item-chevron { width: 16px; height: 16px; flex: 0 0 auto; color: var(--color-ink-tertiary); } -.chart-library-back { min-height: 44px; display: inline-flex; align-items: center; gap: var(--space-2); margin: 0 0 var(--space-4); padding: 0; border: 0; background: transparent; color: var(--color-ink-secondary); cursor: pointer; font-size: var(--type-body-sm); } -.chart-library-add { margin-top: var(--space-4); } -.chart-library-add--heading { margin-top: 0; white-space: nowrap; } -.chart-library-item-main { min-width: 0; } -.chart-library-item strong, .chart-library-item small { display: block; } -.chart-library-item strong { color: var(--color-ink); font-size: var(--type-body-md); font-weight: 500; } -.chart-library-item small, .chart-library-item > span, .empty-library-copy { color: var(--color-ink-secondary); font-size: var(--type-caption); } -.chart-library-item small + small { margin-top: 3px; } -.chart-library-item-title { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-2); margin-bottom: var(--space-1); } + .chart-role-badge, .chart-default-badge { display: inline-flex; align-items: center; min-height: 20px; padding: 0 var(--space-2); border-radius: 999px; background: var(--color-canvas-muted); color: var(--color-ink-secondary); font-size: var(--type-overline); font-weight: 600; } .chart-role-badge.is-self, .chart-default-badge { background: var(--color-action-soft); color: var(--color-action-hover); } -.chart-library-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--space-2); } -.chart-library-actions > * { max-width: 100%; } + .chart-library-form { padding-top: var(--space-4); border-top: 1px solid var(--color-border); } .synastry-report-card { display: grid; gap: var(--space-3); padding: var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: var(--color-canvas-muted); } .synastry-report-card span, .synastry-report-card small, .synastry-report-card li { color: var(--color-ink-secondary); font-size: var(--type-caption); } @@ -2311,16 +2185,12 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class content: ""; } -.admin-page { background: var(--color-canvas-soft); } .admin-app-shell { height: 100vh; min-height: 0; overflow-y: auto; } .admin-app-shell > *, .admin-app-shell .ant-layout { min-height: 100%; } .code-form > * { min-width: 0; } .section-title h2 { margin: 0; font-family: var(--font-display); font-size: var(--type-title-lg); font-weight: 500; letter-spacing: -.3px; } .section-title p { margin: 6px 0 0; color: var(--color-ink-secondary); font-size: var(--type-caption); } -.generated-list > div { min-height: 48px; display: grid; grid-template-columns: minmax(0, 1fr) auto auto; align-items: center; gap: 12px; padding: 0 12px; border: 0; border-radius: var(--radius-md); background: var(--color-canvas-muted); } -.generated-list code { font-family: var(--font-mono); } -.generated-list button { min-width: 44px; min-height: 44px; border: 0; background: transparent; cursor: pointer; color: var(--color-action); } -.code-status { display: inline-flex; min-height: 28px; align-items: center; padding: 0 var(--space-2); border-radius: var(--radius-md); background: var(--color-canvas-muted); color: var(--color-ink-secondary); } + .status-可用 { background: var(--color-success-muted); color: var(--color-success); } .status-已过期, .status-已兑换, .empty-cell { color: var(--color-ink-tertiary); } @@ -2370,7 +2240,6 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class .welcome { padding: var(--space-6) 0 var(--space-10); } .welcome > .onboarding-message:first-child .message-bubble p { font-size: var(--type-display-sm); } - .message-list { width: 100%; padding: var(--space-5) var(--space-4) var(--space-12); } .message-content { max-width: 88%; } .composer-wrap { padding: var(--space-2) var(--space-3) max(var(--space-3), env(safe-area-inset-bottom)); } @@ -2388,9 +2257,7 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class .avatar-editor { grid-template-columns: 56px minmax(0, 1fr); gap: var(--space-4); } .avatar-editor > .user-avatar { width: 56px !important; height: 56px !important; } .avatar-palette-list { grid-template-columns: repeat(2, minmax(64px, 1fr)); } - .chart-library-group-heading { align-items: flex-start; } - .chart-library-group-heading-actions { align-items: flex-end; flex-direction: column; gap: var(--space-1); } - .chart-library-add--heading { min-height: 40px; padding-inline: var(--space-3); } + .auth-page { height: 100vh; overflow-x: hidden; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 0; grid-template-rows: minmax(0, 1fr) auto; justify-items: stretch; } .auth-page > .auth-shell { grid-row: 1; } .auth-page > .auth-legal-footer { grid-row: 2; background: var(--color-canvas); } @@ -2400,12 +2267,11 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class .auth-story > div > p, .auth-footnote { display: none; } .auth-panel { justify-content: flex-start; padding: var(--space-8) var(--space-6) max(var(--space-8), env(safe-area-inset-bottom)); } .auth-panel h1 { font-size: var(--type-display-md); } - .birth-time-event-row { grid-template-columns: 1fr; } + } @media (max-width: 480px) { - .default-chart-card, .chart-library-item { flex-direction: column; align-items: stretch; } - .chart-library-actions { justify-content: flex-start; } + .birth-time-assessment-heading { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-2); } .birth-time-status-badge { justify-self: start; } .birth-time-detail-grid, .birth-time-range-summary, .birth-time-answer-list, .birth-time-candidate-grid { grid-template-columns: 1fr; } @@ -2434,10 +2300,7 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class @media (max-width: 480px) { .conversational-rectification { width: 100%; max-width: 100%; gap: var(--space-4); overflow-x: clip; } - .conversational-narrative-body, .conversational-composer, .conversational-evidence-recap, .conversational-candidate, .conversational-confirmation, .conversational-original-question, .conversational-empty-state { padding: var(--space-3); } - .conversational-candidate dl { grid-template-columns: minmax(0, 1fr); } - .conversational-composer-footer { align-items: stretch; flex-direction: column; } - .conversational-composer-footer button, .conversational-confirmation button, .conversational-original-question button { width: 100%; } + } /* ── Secondary pages inside the app shell ───────────────────────────────── @@ -2680,13 +2543,6 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class .starter-entry-boundary { color: var(--color-ink-tertiary); } - -@media (hover: hover) { - - -} - - /* One column width across both states: the empty-state composer used to be 1040px while the session composer was 760px, so the input visibly jumped width the moment the first message landed. */ @@ -2702,17 +2558,11 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class backdrop-filter: none; } -@media (min-width: 768px) and (max-width: 1023px) { - - -} - @media (max-width: 767px) { .welcome { padding: var(--space-4) 0 var(--space-8); } - } @media (max-width: 480px) { @@ -2743,7 +2593,6 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class margin-top: var(--space-8); } - .conversation:not(.is-empty):not(.is-rectification) .message-assistant .message-bubble { padding: 0 0 var(--space-2); } @@ -2826,16 +2675,10 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class margin-top: var(--space-6); } - .conversation:not(.is-empty):not(.is-rectification) .message-user .message-content { max-width: 88%; } - .rectification-analysis { - width: calc(100% - 38px); - margin-left: 38px; - } - .conversation:not(.is-empty):not(.is-rectification) + .composer-wrap { padding-top: var(--space-3); padding-bottom: var(--space-3); @@ -3417,17 +3260,7 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class .rectification-board .technique-audit > .rectification-board__group + .rectification-board__minutes { margin-top: var(--space-2); } -.rectification-board__section { - display: grid; - gap: var(--space-3); -} -.rectification-board__section h3 { - margin: 0; - font-family: var(--font-display); - font-size: var(--type-title-sm); - font-weight: 600; - letter-spacing: -.2px; -} + /* Names the list that follows it now that 换升时刻 is a group inside 候选分钟 rather than a fold of its own. Not a : this content is always open once its section is, so a second disclosure to click would be one more step @@ -3734,17 +3567,7 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class border-color: color-mix(in srgb, var(--color-action) 55%, var(--color-border)); background: color-mix(in srgb, var(--color-action-soft) 60%, var(--color-canvas)); } -.rectification-candidate-time { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } -.rectification-candidate-time strong { font-size: var(--type-title-md); font-family: var(--font-display); font-weight: 600; font-variant-numeric: tabular-nums; letter-spacing: -.2px; } -.rectification-candidate-badge { - padding: var(--space-1) var(--space-2); - border-radius: 999px; - color: var(--color-action) !important; - background: color-mix(in srgb, var(--color-action) 10%, transparent); - font-size: var(--type-overline) !important; - font-weight: 600; -} -.rectification-candidate-action { align-self: end; color: var(--color-action); font-size: 13px; font-weight: 600; } + .rectification-range-delivery { display: grid; gap: var(--space-4); @@ -3921,44 +3744,13 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class color: var(--color-ink); font-size: var(--type-body-sm); } -.rectification-saved-wrap { - display: grid; - gap: var(--space-3); - width: calc(100% - var(--assistant-content-inset)); - margin: 8px 0 16px; - margin-inline-start: var(--assistant-content-inset); -} + .rectification-saved-wrap .rectification-saved { width: auto; margin: 0; margin-inline-start: 0; } -.rectification-refinement { - display: grid; - gap: var(--space-3); - width: calc(100% - var(--assistant-content-inset)); - margin: 8px 0 16px; - margin-inline-start: var(--assistant-content-inset); - padding: var(--space-5); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - background: var(--color-canvas-soft); - color: var(--color-ink); - font-size: var(--type-body-sm); - line-height: 1.55; -} -.rectification-refinement strong { - font-size: var(--type-title-sm); - font-family: var(--font-display); - font-weight: 600; - letter-spacing: -.2px; -} -.rectification-refinement ul { - margin: 0; - padding-inline-start: 1.1em; -} -.rectification-refinement p, -.rectification-refinement__stage { margin: 0; color: var(--color-ink-secondary); } + .rectification-readonly-range { display: block; width: calc(100% - var(--assistant-content-inset)); @@ -4015,10 +3807,6 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class /* The QR stays on literal white in both themes: scanners need the light modules to actually be light, so this surface is not themed. */ -.payment-qr-wrap { position: relative; width: min(220px, 72vw); aspect-ratio: 1; margin: 14px auto; padding: 10px; border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: #fff; box-shadow: var(--shadow-elevated); } -.payment-qr-wrap img { display: block; width: 100%; height: 100%; object-fit: contain; } -.payment-qr-badge { position: absolute; top: 50%; left: 50%; display: grid; width: 44px; height: 44px; padding: 4px; transform: translate(-50%, -50%); border: 4px solid #fff; border-radius: 12px; background: #fff; box-shadow: 0 2px 10px rgb(0 0 0 / 18%); } -.payment-qr-badge svg { display: block; width: 100%; height: 100%; } /* Global report centre — quiet archive, independent from chat sessions. */.report-center-section{ width: min(900px, 100%); @@ -4235,8 +4023,7 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class .report-center-menu summary::-webkit-details-marker { display: none; } .report-center-menu > div { background: var(--color-canvas); border: 1px solid var(--color-border); border-radius: var(--radius-md); } .report-center-menu summary:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; } -.report-center-delete-confirm { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); } -.report-center-delete-confirm p { margin: 0; } + .report-center-delete-confirm button, .report-center-menu button { min-height: 44px; } /* Export sheet (K5): the component library slides it from the right, or from the @@ -4257,7 +4044,7 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class .report-export-header { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); padding: var(--space-3) var(--space-3) var(--space-1) var(--space-5); flex-shrink: 0; } .report-export-header h2 { margin: 0; font-size: var(--type-title-md); font-weight: 600; } .report-export-body { display: grid; gap: var(--space-4); min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: var(--space-2) var(--space-5) var(--space-4); } -.report-export-field { display: grid; gap: var(--space-2); } + .report-export-segment { display: grid; grid-template-columns: 1fr 1fr; padding: 3px; border-radius: var(--radius-md); background: var(--color-canvas-muted); } .report-export-segment button { border: 0; border-radius: calc(var(--radius-md) - 2px); background: transparent; color: var(--color-ink-secondary); font: inherit; font-size: var(--type-body-sm); cursor: pointer; } .report-export-segment button[aria-checked="true"] { background: var(--color-canvas); color: var(--color-action); font-weight: 600; box-shadow: 0 1px 2px color-mix(in srgb, var(--color-ink) 12%, transparent), inset 0 0 0 1px var(--color-action-strong); } @@ -4311,7 +4098,7 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class overflow: hidden; } .feedback-dialog::backdrop { background: var(--color-scrim); } -.feedback-dialog-panel { display: flex; flex-direction: column; max-height: 90dvh; } + .feedback-dialog-header { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); padding: var(--space-3) var(--space-3) var(--space-1) var(--space-5); flex-shrink: 0; } .feedback-dialog-header h2 { margin: 0; font-size: var(--type-title-md); font-weight: 600; } .feedback-dialog-body { display: grid; gap: var(--space-4); min-height: 0; overflow-y: auto; padding: var(--space-2) var(--space-5) max(var(--space-5), env(safe-area-inset-bottom)); } @@ -4330,12 +4117,11 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class .feedback-dialog input:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; } @media (min-width: 860px) { .feedback-dialog { inset: 0; width: min(520px, 92vw); max-height: 80vh; margin: auto; border-radius: var(--radius-lg); } - .feedback-dialog-panel { max-height: calc(80vh - 2px); } + } @media (max-width: 480px) { .feedback-dialog-types { grid-template-columns: repeat(2, 1fr); } } @media print { .feedback-dialog { display: none !important; } } - /* ============================================================ personal-report: unique block — editorial reader + A4 print Only /reports/[reportId] uses these semantic classes. The report owns its @@ -5877,7 +5663,7 @@ button.synastry-dd-add { border-radius: 0 0 var(--radius-md) var(--radius-md); } overflow: hidden; } .chart-page-type-sheet::backdrop { background: var(--color-scrim); } -.chart-page-type-sheet-panel { display: flex; flex-direction: column; max-height: 80vh; } + @supports (height: 1dvh) { .chart-page-type-sheet, .chart-page-type-sheet-panel { max-height: 80dvh; } } @@ -6052,22 +5838,7 @@ button.synastry-dd-add { border-radius: 0 0 var(--radius-md) var(--radius-md); } /* The ascendant status cell is "/" plus the same bubble. Padding moves onto the button so the tap target fills the cell without a second chrome. */ .chart-page-planet-table td.chart-page-asc-status { padding: 0; } -.chart-page-asc-status-mark { - display: flex; - align-items: center; - justify-content: flex-start; - width: 100%; - min-height: 44px; - margin: 0; - padding: var(--space-3); - border: 0; - background: transparent; - color: inherit; - font: inherit; - line-height: inherit; - text-align: inherit; - cursor: help; -} + .chart-page-planet-table td.chart-page-planet-mid .chart-page-asc-status-mark { justify-content: center; } /* Only the small type is lifted for the chart page's narrow stage. Raising every `text` would also resize the planet symbols, which are already sized @@ -7149,15 +6920,6 @@ button.synastry-dd-add { border-radius: 0 0 var(--radius-md) var(--radius-md); } text-align: center; } .people-archive-foot { display: grid; gap: var(--space-2); justify-items: center; text-align: center; } -.people-archive-confirm { - display: grid; - gap: var(--space-3); -} -.people-archive-confirm p { - margin: 0; - color: var(--color-ink-strong); - font-size: var(--type-body-sm); -} @media (max-width: 1023px) { .people-archive { width: min(640px, 100%); } diff --git a/frontend/src/components/ayanamsa-preference-field.tsx b/frontend/src/components/ayanamsa-preference-field.tsx index c423cd72..77231715 100644 --- a/frontend/src/components/ayanamsa-preference-field.tsx +++ b/frontend/src/components/ayanamsa-preference-field.tsx @@ -2,6 +2,8 @@ import { Check } from "lucide-react"; +import { Button } from "@/components/ui/button"; + import { AYANAMSA_OPTIONS, AYANAMSA_SWITCH_HINT, @@ -25,10 +27,11 @@ export function AyanamsaPreferenceField({ {AYANAMSA_OPTIONS.map((option) => { const selected = value === option.value; return ( - + ); })} diff --git a/frontend/src/components/birth-place-picker.tsx b/frontend/src/components/birth-place-picker.tsx index a579ee75..73c0e26d 100644 --- a/frontend/src/components/birth-place-picker.tsx +++ b/frontend/src/components/birth-place-picker.tsx @@ -3,6 +3,7 @@ import { Check, MapPin, RotateCcw } from "lucide-react"; import { InlineSpinner } from "@/components/inline-spinner"; import { useEffect, useId, useRef, useState } from "react"; +import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { birthPlaceDraftFromLevels, @@ -487,9 +488,9 @@ export function BirthPlacePicker({ {(settled.status === "idle" || settled.status === "error") &&