Regression / regression (push) Canceled after 0s
## 品牌标识(本次会话) 起因:品牌此前没有任何图形标识 —— 唯一 favicon 是内联 data-URI 里的字母「A」, 那是 v2.0.0「Aurora Admin → Kole UI」改名漏掉的一处(PC 顶栏也是「A」, 移动端站已是「K」;移动端文档站则完全没有 favicon)。 - 几何:24 网格三个互不接触的笔画(竖 + 两斜),圆头描边; 描边 2.25 → 16px 标签页尺寸下正好 1.5px = 规范原文「描边1.5px」 - 取色分两套(刻意):favicon 硬编码品牌蓝/白(渲染在浏览器标签栏,不继承 kole-dark); 顶栏标记走 currentColor(实测暗色下自动转 rgb(20,22,28)) - 新增 theme-color 双条(light #FFFFFF / dark #1C1F26,取 --kole-color-card-bg) - 修 site/app.js hero 标语 KOLE ADMIN → KOLE UI(改名变形残留) - 移动端 7 个模板补 favicon(此前计数 0) 验收:门禁 9 条全 OK(site-routing/site-routes/mobile-docs/mobile-site/isolation/ theme/nav/i18n/icons);PC 回归 1464/1464 · 移动端 807/807,各连跑 8 次一致; 两端 favicon 405 字节逐字节一致;PC 站控制台错误 1→0。 ## 并行会话成果(本次一并入库) - 图标系统:2576 图标(TDesign/Element Plus,MIT)+ 11 端注入 + 5 个构建门禁工具 + IconPreview 预览页 + ICON-SPEC.md 冻结规格 - 移动端平台:47 组件 × 6 端 + 文档站 53 页 + 隔离门禁 - PC 组件:103 个大后台组件 / 组件11 批次 - uni-app:PC 端试点 + 移动端端实现 + 真实编译验证 ## 工程 - .gitignore 补 .scratch/ 与 .zcode-preexisting-*.txt(会话中间产物,实测 9.1MB,不入库) - CHANGELOG 补品牌标识条目 - ROADMAP 登 S8-P4(品牌标识任务包 + og:image/apple-touch-icon 未做部分)
135 lines
13 KiB
CSS
135 lines
13 KiB
CSS
/* ═══════════════════════════════════════════════════════════════
|
|
components.css — Design System Component Definitions
|
|
Auto-extracted from preview/component-*.html
|
|
DO NOT EDIT MANUALLY — regenerate via extract-components-css.mjs
|
|
═══════════════════════════════════════════════════════════════ */
|
|
|
|
/* ── Button ────────────────────────────────────────────────── */
|
|
/* @anatomy
|
|
<span class="label">类型</span> <button class="btn btn-primary btn-md">新建订单</button> <button class="btn btn-default btn-md">导出报表</button> <button class="btn btn-text btn-md">取消</button> <button class="btn btn-link btn-md">查看详情</button> <button class="btn btn-danger btn-md">删除</button>
|
|
*/
|
|
.btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-4); border: 1px solid transparent; cursor: pointer; white-space: nowrap; font-size: var(--font-size-body); line-height: var(--line-height-body); border-radius: var(--radius-base); min-width: 64px; padding: 0 var(--space-12); flex-shrink: 0; transition: background .15s, border-color .15s; }
|
|
.btn:focus-visible { outline: 2px solid var(--color-focus-ring); outline-offset: 2px; }
|
|
.btn-primary { background: var(--color-brand); color: var(--color-text-inverse); }
|
|
.btn-primary:hover { background: var(--color-brand-hover); }
|
|
.btn-primary:active { background: var(--color-brand-active); }
|
|
.btn-default { background: var(--color-bg-card); border-color: var(--color-border); color: var(--color-text-body); }
|
|
.btn-default:hover { border-color: var(--color-brand); }
|
|
.btn-text { background: transparent; color: var(--color-brand); }
|
|
.btn-text:hover { background: var(--color-brand-bg); }
|
|
.btn-link { background: transparent; border: none; color: var(--color-brand); min-width: auto; padding: 0; }
|
|
.btn-link:hover { background: var(--color-brand-bg); }
|
|
.btn-danger { background: var(--color-error); color: var(--color-text-inverse); }
|
|
.btn-danger:hover { filter: brightness(.92); }
|
|
.btn-lg { height: var(--control-height-large); }
|
|
.btn-md { height: var(--control-height-default); }
|
|
.btn-sm { height: var(--control-height-small); }
|
|
.btn-disabled, .btn:disabled { background: var(--color-bg-disabled); border-color: transparent; color: var(--color-text-placeholder); cursor: not-allowed; }
|
|
.btn-disabled:hover, .btn:disabled:hover { background: var(--color-bg-disabled); filter: none; }
|
|
|
|
/* ── Card ──────────────────────────────────────────────────── */
|
|
/* @anatomy
|
|
<span class="label">边框卡片</span>
|
|
*/
|
|
.card { width: 100%; background: var(--color-bg-card); border-radius: var(--radius-large); box-sizing: border-box; }
|
|
.card-bordered { border: 1px solid var(--color-border); }
|
|
.card-shadowed { box-shadow: var(--shadow-low); }
|
|
.card-p16 { padding: var(--space-16); }
|
|
.card-p24 { padding: var(--space-24); }
|
|
.card-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--space-12); }
|
|
.card-title { font-size: var(--font-size-h2); font-weight: var(--font-weight-h2); color: var(--color-text-title); }
|
|
.card-link { color: var(--color-brand); text-decoration: none; white-space: nowrap; transition: color .15s; }
|
|
.card-link:hover { color: var(--color-brand-hover); }
|
|
.card-body { color: var(--color-text-body); }
|
|
.data-row { display: flex; justify-content: space-between; padding: var(--space-8) 0; border-bottom: 1px solid var(--color-border); }
|
|
.data-row:last-child { border-bottom: none; }
|
|
.card-actions { display: flex; justify-content: flex-end; gap: var(--space-8); margin-top: var(--space-16); }
|
|
.btn { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; height: var(--control-height-default); min-width: var(--control-height-default); padding: 0 var(--space-16); border-radius: var(--radius-base); font-size: var(--font-size-body); white-space: nowrap; cursor: pointer; transition: background .15s, border-color .15s; }
|
|
.btn-primary { background: var(--color-brand); color: var(--color-text-inverse); border: 1px solid var(--color-brand); }
|
|
.btn-primary:hover { background: var(--color-brand-hover); border-color: var(--color-brand-hover); }
|
|
.btn-default { background: var(--color-bg-card); color: var(--color-text-body); border: 1px solid var(--color-border); }
|
|
.btn-default:hover { background: var(--color-brand-bg); }
|
|
|
|
/* ── Input ─────────────────────────────────────────────────── */
|
|
/* @anatomy
|
|
<span class="label">状态</span> <div class="field" data-evidence-sample="默认输入框"><div class="kole-input"><input placeholder="请输入客户名称">
|
|
*/
|
|
.field { display: inline-flex; flex-direction: column; gap: var(--space-4); flex-shrink: 0; }
|
|
.kole-input { display: inline-flex; align-items: center; gap: var(--space-8); height: var(--control-height-default); padding: 0 var(--space-12); background: var(--color-bg-card); border: 1px solid var(--color-border); border-radius: var(--radius-base); transition: border-color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard); }
|
|
.kole-input input { border: none; outline: none; background: transparent; font-size: var(--font-size-body); color: var(--color-text-body); min-width: 120px; }
|
|
.kole-input input::placeholder { color: var(--color-text-placeholder); }
|
|
.kole-input:focus-within { border-color: var(--color-brand); box-shadow: 0 0 0 2px var(--color-focus-ring); }
|
|
.kole-input.is-error { border-color: var(--color-error); }
|
|
.kole-input.is-error:focus-within { border-color: var(--color-error); box-shadow: 0 0 0 2px var(--color-focus-ring); }
|
|
.kole-input .affix { display: inline-flex; flex-shrink: 0; }
|
|
.kole-input .action { display: inline-flex; flex-shrink: 0; padding: 0; border: none; background: none; cursor: pointer; color: var(--color-text-secondary); transition: background var(--duration-fast) var(--ease-standard); }
|
|
.kole-input .action:hover { background: var(--color-brand-bg); }
|
|
.kole-input-lg { height: var(--control-height-large); }
|
|
.kole-input-sm { height: var(--control-height-small); }
|
|
.kole-input-sm input { font-size: var(--font-size-caption); }
|
|
.error-text { font-size: var(--font-size-caption); color: var(--color-error); line-height: var(--line-height-caption); }
|
|
|
|
/* ── Modal ─────────────────────────────────────────────────── */
|
|
/* @anatomy
|
|
<div class="story"> <span class="story-label">默认对话框</span> <div class="modal-scene"> <div class="modal modal-default" data-evidence-sample="默认对话框"> <div class="modal-title">确认删除客户</div>
|
|
*/
|
|
/* Component definitions — extracted to components.css */
|
|
.modal-scene { flex: 1; min-width: 0; background: var(--color-mask); border-radius: var(--radius-large); padding: var(--space-24); display: flex; justify-content: center; }
|
|
.modal { background: var(--color-bg-card); border-radius: var(--radius-large); box-shadow: var(--shadow-high); display: flex; flex-direction: column; overflow: hidden; }
|
|
.modal-default { width: 480px; }
|
|
.modal-large { width: 680px; }
|
|
.modal-small { width: 320px; }
|
|
.modal-title { padding: var(--space-16) var(--space-24); font-size: var(--font-size-h1); line-height: var(--line-height-h1); font-weight: var(--font-weight-h1); color: var(--color-text-title); border-bottom: 1px solid var(--color-border); word-break: keep-all; overflow-wrap: break-word; }
|
|
.modal-content { padding: var(--space-24); color: var(--color-text-body); overflow-wrap: break-word; }
|
|
.modal-footer { display: flex; justify-content: flex-end; gap: var(--space-8); padding: var(--space-12) var(--space-24) var(--space-24); }
|
|
.btn { display: inline-flex; align-items: center; justify-content: center; height: var(--control-height-default); min-width: var(--control-height-default); padding: 0 var(--space-16); border-radius: var(--radius-base); font-size: var(--font-size-body); line-height: var(--line-height-body); cursor: pointer; white-space: nowrap; transition: background .15s, border-color .15s; }
|
|
.btn-secondary { background: var(--color-bg-card); color: var(--color-text-body); border: 1px solid var(--color-border); }
|
|
.btn-secondary:hover { background: var(--color-brand-bg); }
|
|
.btn-primary { background: var(--color-brand); color: var(--color-text-inverse); border: 1px solid var(--color-brand); }
|
|
.btn-primary:hover { background: var(--color-brand-hover); border-color: var(--color-brand-hover); }
|
|
|
|
/* ── Select ────────────────────────────────────────────────── */
|
|
/* @anatomy
|
|
<span class="label">单选</span> <div class="select"><span class="value">华东区</span><svg class="icon"><use href="#icon-chevron-down"/></svg>
|
|
*/
|
|
.select { position: relative; display: inline-flex; align-items: center; gap: var(--space-8); height: var(--control-height-default); min-width: 200px; padding: 0 var(--space-12); background: var(--color-bg-card); border: 1px solid var(--color-border); border-radius: var(--radius-base); font-size: var(--font-size-body); color: var(--color-text-body); cursor: pointer; transition: background .15s, border-color .15s; }
|
|
.select:hover { filter: brightness(1.08); }
|
|
.select .value { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
.select .placeholder { color: var(--color-text-placeholder); white-space: nowrap; }
|
|
.select .icon { width: var(--icon-size-16); height: var(--icon-size-16); flex-shrink: 0; color: var(--color-text-secondary); margin-left: auto; }
|
|
.select.open { border-color: var(--color-brand); box-shadow: 0 0 0 2px var(--color-focus-ring); }
|
|
.select.wide { width: 240px; }
|
|
.select-tags { display: inline-flex; align-items: center; gap: var(--space-4); min-width: 0; overflow: hidden; }
|
|
.select-tag { display: inline-flex; align-items: center; height: var(--line-height-caption); padding: 0 var(--space-8); background: var(--color-brand-bg); color: var(--color-brand); border-radius: var(--radius-small); font-size: var(--font-size-caption); white-space: nowrap; }
|
|
.select-panel { position: absolute; top: calc(100% + var(--space-4)); left: 0; width: 100%; max-height: 256px; overflow: auto; background: var(--color-bg-card); border-radius: var(--radius-base); box-shadow: var(--shadow-medium); padding: var(--space-4); z-index: 10; }
|
|
.select-option { display: flex; align-items: center; gap: var(--space-8); height: var(--control-height-default); padding: 0 var(--space-12); border-radius: var(--radius-base); color: var(--color-text-body); cursor: pointer; white-space: nowrap; transition: background .15s, border-color .15s; }
|
|
.select-option:hover { filter: brightness(1.08); }
|
|
.select-option.selected { background: var(--color-brand-bg); color: var(--color-brand); }
|
|
.select-option .icon { width: var(--icon-size-16); height: var(--icon-size-16); flex-shrink: 0; }
|
|
|
|
/* ── Table ─────────────────────────────────────────────────── */
|
|
/* @anatomy
|
|
<span class="label">基础表格</span>
|
|
*/
|
|
.tbl { width: 100%; border-collapse: collapse; background: var(--color-bg-card); }
|
|
.tbl th { background: var(--color-bg-table-header); color: var(--color-text-body); font-weight: var(--font-weight-body); text-align: left; white-space: nowrap; }
|
|
.tbl th, .tbl td { height: var(--space-48); padding: 0 var(--space-16); border-bottom: 1px solid var(--color-border); }
|
|
.tbl tbody tr:hover { background: var(--color-bg-page); }
|
|
.tbl tr.selected { background: var(--color-brand-bg); }
|
|
.tbl .num { text-align: right; }
|
|
.tbl .ops { text-align: right; white-space: nowrap; }
|
|
.tbl .ops a { color: var(--color-brand); text-decoration: none; }
|
|
.tbl .ops a + a { margin-left: var(--space-8); }
|
|
.tbl .ops a:hover, .tbl .sort:hover, .tbl .expand:hover, .batchbar .btn:hover { background: var(--color-brand-bg); }
|
|
.tbl .ops a, .tbl .sort, .tbl .expand, .batchbar .btn { transition: background .15s, border-color .15s; }
|
|
.tbl .sel { width: var(--icon-size-16); height: var(--icon-size-16); vertical-align: middle; }
|
|
.tbl .sort, .tbl .expand { display: inline-flex; align-items: center; }
|
|
.tbl .sort { gap: var(--space-4); }
|
|
.tbl .fixed { position: sticky; left: 0; background: var(--color-bg-card); }
|
|
.tbl th.fixed { background: var(--color-bg-table-header); }
|
|
.tbl .detail td { background: var(--color-bg-page); }
|
|
.tbl-wrap .tbl { min-width: 720px; }
|
|
.batchbar { display: flex; align-items: center; gap: var(--space-8); height: var(--space-48); padding: 0 var(--space-16); background: var(--color-bg-card); border-bottom: 1px solid var(--color-border); }
|
|
.batchbar .count { color: var(--color-text-secondary); }
|
|
.batchbar .btn { color: var(--color-brand); background: none; border: none; padding: 0; }
|