Files
sub2api-cn-relay-manager/deploy
Hermes Agent 23fd8db77d
Some checks failed
CI / Build & Test (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Release (push) Has been cancelled
refactor(portal): move .hint info-banner ABOVE its <input> + upgrade to teal-accented banner style
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
2026-06-03 20:01:44 +08:00
..

deploy 目录说明

日期2026-05-27

deploy/ 用来存放部署目标会直接消费的静态资产或配置模板。

当前内容:

  • tksea-portal/index.html
    • https://sub.tksea.top/portal/ 的静态页面源码
  • tksea-portal/admin/index.html
    • https://sub.tksea.top/portal/admin/ 的管理首页
    • 统一收纳“逻辑分组 / 路由”“新增模型 / 供应商目录”和“导入供应商帐号”入口
  • tksea-portal/admin/logical-groups.html
    • https://sub.tksea.top/portal/admin/logical-groups.html
    • 维护 logical_group / public_model / route / shadow_group 的最小运营页
  • tksea-portal/admin/providers.html
    • https://sub.tksea.top/portal/admin/providers.html
    • 用现有 CRM API 做 pack/provider 浏览、preview-import、import以及 provider manifest 草稿生成
    • 当前也可直接调用服务端 provider_drafts API把 manifest 草稿持久化到 CRM SQLite并支持更新 / 删除 / 发布到 pack 仓库
  • tksea-portal/admin/batch-import.html
    • https://sub.tksea.top/portal/admin/batch-import.html
    • 结构化入口地址,当前跳转到 legacy admin-batch-import.html
  • tksea-portal/admin-batch-import.html
    • https://sub.tksea.top/portal/admin-batch-import.html 的最小管理页
    • 直接消费 POST /api/batch-import/runsGET /api/batch-import/runs/*
  • tksea-portal/nginx.sub.tksea.top.conf.example
    • sub.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