Files
aurora-admin/frameworks-mobile/Overlay.html
T
aurora-admin f1fbfc2ddb
Regression / regression (push) Canceled after 0s
feat(品牌标识): 几何 K 图标(favicon/顶栏标记/theme-color) + 并行会话成果入库
## 品牌标识(本次会话)

起因:品牌此前没有任何图形标识 —— 唯一 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 未做部分)
2026-09-21 10:05:48 +08:00

192 lines
10 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<title>Kole UI Mobile · Overlay(H5)</title>
<link rel="stylesheet" href="../.design_library/kole-ui-mobile/colors_and_type.css">
<link rel="stylesheet" href="Overlay.css">
<style>
body { margin: 0; background: var(--kole-color-page-bg); font-family: var(--kole-font-family); color: var(--kole-color-text-body); }
.demo { max-width: 375px; margin: 0 auto; padding: var(--kole-m-gutter) 0; }
.demo-label { margin: 0; padding: var(--kole-space-12) var(--kole-m-gutter) var(--kole-space-8);
font-size: var(--kole-m-font-size-label); color: var(--kole-color-text-secondary); }
/* 展示框:transform 建立包含块,固定定位的遮罩限定在框内(生产环境落在视口上) */
.demo-frame { position: relative; max-width: 375px; margin: 0 auto; height: 220px;
overflow: hidden; transform: translateZ(0); background: var(--kole-color-page-bg);
border-block: 1px solid var(--kole-color-border); }
.demo-frame__body { padding: var(--kole-m-gutter); font-size: var(--kole-m-font-size-label);
color: var(--kole-color-text-secondary); line-height: 1.7; }
/* 遮罩上的内容:卡片底(不透明)——对比度按卡片底计算,不按遮罩半透明层 */
.demo-card { box-sizing: border-box; width: 240px; padding: var(--kole-space-16);
border-radius: var(--kole-radius-large); background: var(--kole-color-card-bg);
color: var(--kole-color-text-body); box-shadow: var(--kole-shadow-high); }
.demo-card__title { margin: 0 0 var(--kole-space-8); font-size: var(--kole-m-font-size-body);
font-weight: 500; color: var(--kole-color-text-title); }
.demo-card__text { margin: 0 0 var(--kole-space-12); font-size: var(--kole-m-font-size-label);
color: var(--kole-color-text-secondary); line-height: 1.6; }
.demo-trigger { min-height: var(--kole-m-touch-target); padding: 0 var(--kole-m-gutter);
border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-base);
background: var(--kole-color-card-bg); color: var(--kole-color-text-body);
font-family: inherit; font-size: var(--kole-m-font-size-label); cursor: pointer; touch-action: manipulation; }
.demo-trigger:focus-visible { outline: 2px solid var(--kole-color-focus-ring); outline-offset: 2px; }
.demo-close { min-height: var(--kole-m-touch-target); padding: 0 var(--kole-m-gutter);
border: 0; border-radius: var(--kole-radius-base); background: var(--kole-color-brand);
color: var(--kole-color-text-inverse); font-family: inherit;
font-size: var(--kole-m-font-size-label); cursor: pointer; touch-action: manipulation; }
.demo-close:focus-visible { outline: 2px solid var(--kole-color-focus-ring); outline-offset: 2px; }
.demo-block[hidden] { display: none; }
</style>
</head>
<body>
<div class="demo">
<section class="demo-block" data-demo="basic">
<p class="demo-label">基础遮罩(tone=default:点遮罩关闭;遮罩是纯装饰,内容语义由槽位承担)</p>
<div class="demo-frame" data-assert="overlay-basic">
<div class="demo-frame__body">
<button class="demo-trigger" type="button" id="overlay-basic-trigger"
data-behavior="click-toggles-class:#overlay-basic|is-open">打开遮罩</button>
</div>
<div class="kole-m-overlay kole-m-overlay--default" id="overlay-basic" role="presentation"
data-open="false">
<button class="kole-m-overlay__scrim" type="button" aria-hidden="true" tabindex="-1"></button>
<div class="kole-m-overlay__content">
<div class="demo-card">
<p class="demo-card__title">遮罩上的内容</p>
<p class="demo-card__text">遮罩本身不带语义,role 与标题由内容自己给。</p>
<button class="demo-close" type="button" id="overlay-basic-close">关闭</button>
</div>
</div>
</div>
</div>
</section>
<section class="demo-block" data-demo="strong">
<p class="demo-label">浓遮罩(tone=strong:遮挡强、适合需要专注的确认,默认展开对照)</p>
<div class="demo-frame" data-assert="overlay-strong">
<div class="kole-m-overlay kole-m-overlay--strong is-open" id="overlay-strong" role="presentation"
data-open="true">
<button class="kole-m-overlay__scrim" type="button" aria-hidden="true" tabindex="-1"></button>
<div class="kole-m-overlay__content">
<p class="demo-card">
<button class="demo-close" type="button" id="overlay-strong-close">点遮罩或此处关闭</button>
</p>
</div>
</div>
</div>
</section>
<section class="demo-block" data-demo="blur">
<p class="demo-label">模糊遮罩(tone=blur:背景内容做 backdrop 模糊,用于图片预览)</p>
<div class="demo-frame" data-assert="overlay-blur">
<div class="demo-frame__body">
<p style="margin: 0 0 8px;">这一行是遮罩**下方**的内容,blur 档会把它糊掉。</p>
<p style="margin: 0;">第二行同样是背景,用于对照模糊前后的可读性差别。</p>
</div>
<div class="kole-m-overlay kole-m-overlay--blur is-open" id="overlay-blur" role="presentation"
data-open="true">
<button class="kole-m-overlay__scrim" type="button" aria-hidden="true" tabindex="-1"></button>
<div class="kole-m-overlay__content">
<div class="demo-card">
<p class="demo-card__title">图片预览</p>
<p class="demo-card__text">模糊档只影响遮罩下方,内容卡片本身保持清晰。</p>
</div>
</div>
</div>
</div>
</section>
<section class="demo-block" data-demo="contained">
<p class="demo-label">局部遮罩(contained=true:绝对定位填充最近的定位祖先,不覆盖全屏)</p>
<div class="demo-frame" data-assert="overlay-contained">
<div class="demo-frame__body">
<p style="margin: 0 0 8px;">卡片加载态:只遮住这张卡,页面其它区域仍可操作。</p>
<div class="demo-card" style="width: auto; position: relative;">
<p class="demo-card__title">数据概览</p>
<p class="demo-card__text">本月成交 128 单 · 环比 +12%</p>
<div class="kole-m-overlay kole-m-overlay--default kole-m-overlay--contained is-open"
role="presentation" data-open="true">
<button class="kole-m-overlay__scrim" type="button" aria-hidden="true" tabindex="-1"></button>
<div class="kole-m-overlay__content">
<span class="demo-card__text">加载中…</span>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="demo-block" data-demo="keep-open">
<p class="demo-label">遮罩不关闭(closeOnMask=false:误触遮罩不收起,默认展开)</p>
<div class="demo-frame" data-assert="overlay-keep-open">
<div class="kole-m-overlay kole-m-overlay--default is-open" id="overlay-keep-open"
role="presentation" data-open="true" data-close-on-mask="false">
<button class="kole-m-overlay__scrim" type="button" aria-hidden="true" tabindex="-1"></button>
<div class="kole-m-overlay__content">
<div class="demo-card">
<p class="demo-card__title">填写中</p>
<p class="demo-card__text">填到一半的表单不该因为一次误触就丢弃,所以关掉遮罩点击。</p>
<button class="demo-close" type="button" id="overlay-keep-open-close">关闭</button>
</div>
</div>
</div>
</div>
</section>
</div>
<script>
/* 演示页交互:类名与 data-open 由**同一个函数**写入(避免视觉与状态分叉)。
遮罩点击只在 closeOnMask !== 'false' 时生效;关闭按钮始终生效。 */
(function () {
function setOpen(root, open) {
root.classList.toggle('is-open', open);
root.setAttribute('data-open', open ? 'true' : 'false');
}
var basic = document.getElementById('overlay-basic');
var trig = document.getElementById('overlay-basic-trigger');
if (basic && trig) {
trig.addEventListener('click', function () {
setOpen(basic, !basic.classList.contains('is-open'));
});
var close = document.getElementById('overlay-basic-close');
if (close) close.addEventListener('click', function () { setOpen(basic, false); });
}
var strong = document.getElementById('overlay-strong');
var strongClose = document.getElementById('overlay-strong-close');
if (strong && strongClose) strongClose.addEventListener('click', function () { setOpen(strong, false); });
var keep = document.getElementById('overlay-keep-open');
var keepClose = document.getElementById('overlay-keep-open-close');
if (keep && keepClose) keepClose.addEventListener('click', function () { setOpen(keep, false); });
document.querySelectorAll('.kole-m-overlay__scrim').forEach(function (scrim) {
scrim.addEventListener('click', function () {
var root = scrim.parentElement;
if (!root || root.getAttribute('data-close-on-mask') === 'false') return;
setOpen(root, false);
});
});
})();
</script>
<script>
/* ?demo=<id> → 只显示该演示块(文档站按块预览用;无参数时全部显示,测试与回归走无参数路径) */
(function () {
var id = new URLSearchParams(location.search).get('demo');
if (!id) return;
var blocks = Array.prototype.slice.call(document.querySelectorAll('.demo-block'));
var hit = false;
blocks.forEach(function (b) {
var on = b.getAttribute('data-demo') === id;
if (on) hit = true;
b.hidden = !on;
});
if (!hit) { blocks.forEach(function (b) { b.hidden = false; }); return; }
document.body.classList.add('demo-single');
var demoBox = document.querySelector('.demo');
if (demoBox) demoBox.style.minHeight = 'auto';
blocks.forEach(function (b) {
var label = b.querySelector('.demo-label');
if (label && !b.hidden) label.hidden = true;
});
})();
</script>
</body>
</html>