Two-part UX upgrade:
1. CSS — upgrade .hint from a generic "card with slate background" to a
proper info-banner:
- background: var(--color-primary-soft) (translucent teal 12%) instead
of var(--bg-elev-2) (slate card) — visually distinct from any
<input> card, so it can never be confused with one
- border-left: 2px solid var(--color-primary) — clear "this is a hint"
teal accent
- padding: 8px 12px 8px 14px (smaller, lighter)
- font-size: 12.5px (slightly larger for readability)
- margin: 4px 0 8px 0 (sits between field label and input)
- .hint code { monospace, teal-300, teal-tinted background } for inline
<code> tokens
- .hint strong { text-default color } for emphasis
Also: label > input/select/textarea forced to display:block width:100%
margin-top:6px (after the hint, hint + input collapse to margin-top:0)
2. HTML — reorder 11 labels across providers.html (7) and
admin-batch-import.html (4) so the .hint span sits BEFORE the
<input>/<select>/<textarea> it describes. Datalist stays adjacent to its
owning input.
Pattern before: <label>Field
<input>
<span class="hint">desc</span>
</label>
Pattern after: <label>Field
<span class="hint">desc</span>
<input>
</label>
Why: Linear/Vercel canonical form pattern is label + info banner above +
clean input below. The previous "input then hint" layout was just an
artifact of how the inline-script-dedup pass emitted the fields, not a
deliberate UX choice.
Verification (chrome remote-debugging, 7 pages, all .hint elements):
Page n_hints covered
https://sub.tksea.top/portal/ 2 0
https://sub.tksea.top/portal/admin/ 0 0
https://sub.tksea.top/portal/admin/providers.html 8 0
https://sub.tksea.top/portal/admin/accounts.html 0 0
https://sub.tksea.top/portal/admin/logical-groups 1 0
https://sub.tksea.top/portal/admin/route-health 0 0
https://sub.tksea.top/portal/admin-batch-import 4 0
Total: 7/7 pages, 0 hint covered by any input
Local tests still PASS:
- test_tksea_portal_assets.sh
- verify_frontend_smoke.sh
deploy 目录说明
日期:2026-05-27
deploy/ 用来存放部署目标会直接消费的静态资产或配置模板。
当前内容:
tksea-portal/index.htmlhttps://sub.tksea.top/portal/的静态页面源码
tksea-portal/admin/index.htmlhttps://sub.tksea.top/portal/admin/的管理首页- 统一收纳“逻辑分组 / 路由”“新增模型 / 供应商目录”和“导入供应商帐号”入口
tksea-portal/admin/logical-groups.htmlhttps://sub.tksea.top/portal/admin/logical-groups.html- 维护
logical_group / public_model / route / shadow_group的最小运营页
tksea-portal/admin/providers.htmlhttps://sub.tksea.top/portal/admin/providers.html- 用现有 CRM API 做 pack/provider 浏览、preview-import、import,以及 provider manifest 草稿生成
- 当前也可直接调用服务端
provider_draftsAPI,把 manifest 草稿持久化到 CRM SQLite,并支持更新 / 删除 / 发布到 pack 仓库
tksea-portal/admin/batch-import.htmlhttps://sub.tksea.top/portal/admin/batch-import.html- 结构化入口地址,当前跳转到 legacy
admin-batch-import.html
tksea-portal/admin-batch-import.htmlhttps://sub.tksea.top/portal/admin-batch-import.html的最小管理页- 直接消费
POST /api/batch-import/runs与GET /api/batch-import/runs/*
tksea-portal/nginx.sub.tksea.top.conf.examplesub.tksea.top上 portal 路由与代理示例- 当前同时包含
/portal-proxy/宿主用户态代理与/portal-admin-api/CRM 管理态代理
它和 scripts/ 的边界如下:
deploy/- 放静态页、Nginx/Caddy/Env 模板、会被复制到目标机上的文件
scripts/- 放执行复制、部署、reload、验收的脚本
当前对应关系:
- 资产:
deploy/tksea-portal/* - 部署脚本:
scripts/deploy/deploy_tksea_portal.sh - 资产回归:
scripts/test/test_tksea_portal_assets.sh