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 未做部分)
1059 lines
65 KiB
HTML
1059 lines
65 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<script>
|
||
(function () {
|
||
var m = 'auto';
|
||
try { var v = localStorage.getItem('kole-mode'); if (v === 'light' || v === 'dark' || v === 'auto') m = v; } catch (e) {}
|
||
var dark = m === 'dark' || (m === 'auto' && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches);
|
||
document.documentElement.classList.toggle('kole-dark', !!dark);
|
||
document.documentElement.style.colorScheme = dark ? 'dark' : 'light';
|
||
})();
|
||
</script>
|
||
<link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3E%3Crect%20width='24'%20height='24'%20rx='6'%20fill='%232F54EB'/%3E%3Cg%20fill='none'%20stroke='%23FFFFFF'%20stroke-width='2.25'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpath%20d='M7%205.5V18.5'/%3E%3Cpath%20d='M17%205.5l-6.25%204.06'/%3E%3Cpath%20d='M10.75%2014.44L17%2018.5'/%3E%3C/g%3E%3C/svg%3E">
|
||
<meta name="theme-color" content="#FFFFFF" media="(prefers-color-scheme: light)">
|
||
<meta name="theme-color" content="#1C1F26" media="(prefers-color-scheme: dark)">
|
||
<title>Kole UI Mobile — 移动端组件库</title>
|
||
<meta name="description" content="Kole UI 移动端组件:与 PC 端完全隔离(目录、类名 kole-m-、令牌 --kole-m-、测试、回归报告),仅颜色/字体/圆角/阴影令牌同源。含 CSS / H5 原生 / React / Vue 2 / Vue 3 / uni-app 六端实现。">
|
||
<link rel="stylesheet" href="../../.design_library/kole-ui-mobile/colors_and_type.css">
|
||
<link rel="stylesheet" href="style.css">
|
||
</head>
|
||
<body>
|
||
<header class="m-top">
|
||
<div class="m-top-inner">
|
||
<a class="m-logo" href="index.html">
|
||
<span class="m-logo-mark" aria-hidden="true"><svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 5.5V18.5"/><path d="M17 5.5l-6.25 4.06"/><path d="M10.75 14.44L17 18.5"/></svg></span>
|
||
<span class="m-logo-text">Kole UI<em>移动端</em></span>
|
||
</a>
|
||
<div class="m-ver-picker" id="m-ver-picker">
|
||
<button id="m-ver-trigger" class="m-ver-trigger" type="button" data-single="1" aria-haspopup="listbox" aria-expanded="false" aria-label="选择版本" title="文档版本(清单来自部署根的 versions.json)">
|
||
<span id="m-ver">v1.0.0</span>
|
||
<svg class="m-ver-caret" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
|
||
</button>
|
||
<div id="m-ver-menu" class="m-ver-menu hidden" role="listbox" aria-label="文档版本">
|
||
<div class="m-ver-menu-head" id="m-ver-head">文档版本</div>
|
||
</div>
|
||
</div>
|
||
<nav class="m-nav"> <a href="index.html" class="active" aria-current="page">组件总览</a>
|
||
<a href="guide.html">快速开始</a>
|
||
<a href="design.html">设计规范</a>
|
||
<a href="faq.html">常见问题</a>
|
||
<a href="changelog.html">更新日志</a></nav>
|
||
<div class="m-mode">
|
||
<button id="m-mode-trigger" class="m-mode-trigger" type="button" aria-haspopup="listbox" aria-expanded="false" aria-label="主题模式" title="主题模式">
|
||
<svg class="m-mode-icon" id="m-icon-moon" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
|
||
<svg class="m-mode-icon" id="m-icon-sun" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="display:none"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"/></svg>
|
||
<svg class="m-mode-icon" id="m-icon-auto" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="display:none"><rect x="3" y="4" width="18" height="13" rx="2"/><path d="M8 21h8M12 17v4"/></svg>
|
||
<span id="m-mode-cur">自动模式</span>
|
||
<svg class="m-mode-caret" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
|
||
</button>
|
||
<div id="m-mode-menu" class="m-menu hidden" role="listbox" aria-label="主题模式">
|
||
<div class="m-menu-head">主题模式</div>
|
||
<button class="m-menu-opt" type="button" role="option" data-mode="light" aria-selected="false"><span data-mode-label="light">日间模式</span></button>
|
||
<button class="m-menu-opt" type="button" role="option" data-mode="dark" aria-selected="false"><span data-mode-label="dark">夜间模式</span></button>
|
||
<button class="m-menu-opt" type="button" role="option" data-mode="auto" aria-selected="true"><span data-mode-label="auto">自动模式</span></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<div class="m-body">
|
||
<details class="m-side" open>
|
||
<summary><span>移动端导航</span><span class="cur">组件总览</span></summary>
|
||
<nav>
|
||
<div class="m-side-section"><span>平台</span></div>
|
||
<a class="m-side-link m-side-platform" href="../index.html"><span class="sp-top"><span class="sp-name">PC 端组件</span></span><span class="sp-sub">103 个中后台组件 · 5 端</span></a>
|
||
<a class="m-side-link m-side-platform is-active" href="index.html"><span class="sp-top"><span class="sp-name">移动端组件</span><span class="sp-badge">当前</span></span><span class="sp-sub">47 个组件 · 6 端 · 含 uni-app</span></a>
|
||
<div class="m-side-section"><span>开发指南</span></div>
|
||
<a class="m-side-link is-active" href="index.html" aria-current="page">组件总览</a>
|
||
<a class="m-side-link" href="guide.html">快速开始</a>
|
||
<a class="m-side-link" href="design.html">设计规范</a>
|
||
<a class="m-side-link" href="faq.html">常见问题</a>
|
||
<a class="m-side-link" href="changelog.html">更新日志</a>
|
||
<a class="m-side-link" href="platform.html">平台与端<em>移动端</em></a>
|
||
<a class="m-side-link" href="../../tests/mobile/index.html" target="_blank">测试与回归<em>移动端</em></a>
|
||
<div class="m-side-section"><span>组件</span><span class="cnt">47</span></div>
|
||
<div class="m-side-group"><span>通用</span><span class="cnt">5</span></div>
|
||
<a class="m-side-link" href="component/mobile-button.html">按钮<em>Button</em></a>
|
||
<a class="m-side-link" href="component/mobile-divider.html">分割线<em>Divider</em></a>
|
||
<a class="m-side-link" href="component/mobile-icon.html">图标<em>Icon</em></a>
|
||
<a class="m-side-link" href="component/mobile-layout.html">布局<em>Layout</em></a>
|
||
<a class="m-side-link" href="component/mobile-link.html">链接<em>Link</em></a>
|
||
<div class="m-side-group"><span>导航</span><span class="cnt">6</span></div>
|
||
<a class="m-side-link" href="component/navbar.html">顶部导航栏<em>NavBar</em></a>
|
||
<a class="m-side-link" href="component/tabbar.html">底部标签栏<em>TabBar</em></a>
|
||
<a class="m-side-link" href="component/mobile-grid.html">宫格<em>Grid</em></a>
|
||
<a class="m-side-link" href="component/mobile-steps.html">步骤条<em>Steps</em></a>
|
||
<a class="m-side-link" href="component/mobile-segmented.html">分段器<em>Segmented</em></a>
|
||
<a class="m-side-link" href="component/mobile-sticky.html">吸顶容器<em>Sticky</em></a>
|
||
<div class="m-side-group"><span>数据录入</span><span class="cnt">16</span></div>
|
||
<a class="m-side-link" href="component/mobile-numberkeyboard.html">数字键盘<em>NumberKeyboard</em></a>
|
||
<a class="m-side-link" href="component/mobile-datepicker.html">日期选择器<em>DatePicker</em></a>
|
||
<a class="m-side-link" href="component/mobile-input.html">输入框<em>Input</em></a>
|
||
<a class="m-side-link" href="component/mobile-search.html">搜索框<em>Search</em></a>
|
||
<a class="m-side-link" href="component/mobile-stepper.html">步进器<em>Stepper</em></a>
|
||
<a class="m-side-link" href="component/mobile-switch.html">开关<em>Switch</em></a>
|
||
<a class="m-side-link" href="component/mobile-textarea.html">多行文本框<em>Textarea</em></a>
|
||
<a class="m-side-link" href="component/mobile-checkbox.html">多选框<em>Checkbox</em></a>
|
||
<a class="m-side-link" href="component/mobile-form.html">表单<em>Form</em></a>
|
||
<a class="m-side-link" href="component/mobile-radio.html">单选框<em>Radio</em></a>
|
||
<a class="m-side-link" href="component/mobile-rate.html">评分<em>Rate</em></a>
|
||
<a class="m-side-link" href="component/mobile-slider.html">滑动选择器<em>Slider</em></a>
|
||
<a class="m-side-link" href="component/mobile-cascader.html">级联选择器<em>Cascader</em></a>
|
||
<a class="m-side-link" href="component/mobile-colorpicker.html">颜色选择器<em>ColorPicker</em></a>
|
||
<a class="m-side-link" href="component/mobile-picker.html">选择器<em>Picker</em></a>
|
||
<a class="m-side-link" href="component/mobile-upload.html">上传<em>Upload</em></a>
|
||
<div class="m-side-group"><span>数据展示</span><span class="cnt">8</span></div>
|
||
<a class="m-side-link" href="component/cell.html">单元格<em>Cell</em></a>
|
||
<a class="m-side-link" href="component/mobile-badge.html">徽标<em>Badge</em></a>
|
||
<a class="m-side-link" href="component/mobile-tag.html">标签<em>Tag</em></a>
|
||
<a class="m-side-link" href="component/mobile-avatar.html">头像<em>Avatar</em></a>
|
||
<a class="m-side-link" href="component/mobile-list.html">列表<em>List</em></a>
|
||
<a class="m-side-link" href="component/mobile-collapse.html">折叠面板<em>Collapse</em></a>
|
||
<a class="m-side-link" href="component/mobile-table.html">表格<em>Table</em></a>
|
||
<a class="m-side-link" href="component/mobile-typography.html">排版<em>Typography</em></a>
|
||
<div class="m-side-group"><span>反馈</span><span class="cnt">12</span></div>
|
||
<a class="m-side-link" href="component/actionsheet.html">动作面板<em>ActionSheet</em></a>
|
||
<a class="m-side-link" href="component/pullrefresh.html">下拉刷新<em>PullRefresh</em></a>
|
||
<a class="m-side-link" href="component/swipecell.html">滑动单元格<em>SwipeCell</em></a>
|
||
<a class="m-side-link" href="component/mobile-popup.html">弹出层<em>Popup</em></a>
|
||
<a class="m-side-link" href="component/mobile-toast.html">轻提示<em>Toast</em></a>
|
||
<a class="m-side-link" href="component/mobile-dialog.html">对话框<em>Dialog</em></a>
|
||
<a class="m-side-link" href="component/mobile-noticebar.html">通知栏<em>NoticeBar</em></a>
|
||
<a class="m-side-link" href="component/mobile-loading.html">加载<em>Loading</em></a>
|
||
<a class="m-side-link" href="component/mobile-progress.html">进度条<em>Progress</em></a>
|
||
<a class="m-side-link" href="component/mobile-message.html">消息通知<em>Message</em></a>
|
||
<a class="m-side-link" href="component/mobile-overlay.html">遮罩层<em>Overlay</em></a>
|
||
<a class="m-side-link" href="component/mobile-popover.html">弹出气泡<em>Popover</em></a>
|
||
</nav>
|
||
</details>
|
||
<main class="m-main">
|
||
<section class="m-hero">
|
||
<h1>移动端组件(47 个)</h1>
|
||
<p>触摸优先的移动端组件,与 PC 端(103 个中后台组件)<strong>物理隔离</strong>:独立目录、独立类名前缀 <code>kole-m-</code>、独立令牌前缀 <code>--kole-m-</code>、独立测试页与回归报告。仅颜色 / 字体 / 圆角 / 阴影令牌与 PC 同源,改一处令牌两端同步生效。</p>
|
||
</section>
|
||
|
||
<section class="m-block">
|
||
<h2>三步接入</h2>
|
||
<ol class="m-steps">
|
||
<li>引一次令牌:<code>kole-ui/mobile/tokens.css</code>(PC 令牌 + 移动端令牌合成单文件)</li>
|
||
<li>引组件样式:<code>kole-ui/mobile/components/index.css</code>,或按需引单个组件</li>
|
||
<li>按端取实现:同一组件六端同源(<code>kole-ui/mobile/<端>/<组件></code>),取你技术栈那一份</li>
|
||
</ol>
|
||
<div class="m-ends" style="margin-top: var(--kole-space-12);">
|
||
<a href="./guide.html">快速开始(含 6 端示例)</a>
|
||
<a href="./design.html">设计规范</a>
|
||
<a href="./platform.html">平台与端(两轴模型 + 门禁)</a>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="m-block">
|
||
<h2>覆盖矩阵</h2>
|
||
<table class="m-table">
|
||
<thead><tr><th>平台 ↓ / 端 →</th><th>css</th><th>h5 原生</th><th>react</th><th>vue2</th><th>vue3</th><th>uniapp</th></tr></thead>
|
||
<tbody>
|
||
<tr><th>移动端(47)</th><td>✅ 47</td><td>✅ 47</td><td>✅ 47</td><td>✅ 47</td><td>✅ 47</td><td>✅ 47</td></tr>
|
||
<tr><th>PC(103)</th><td>✅ 103</td><td>✅ 103</td><td>✅ 103</td><td>✅ 103</td><td>✅ 103</td><td>3 / 103(试点)</td></tr>
|
||
</tbody>
|
||
</table>
|
||
<p class="m-note">移动端 <b>47 个组件 × 6 端 = 282 个实现文件</b>;PC 端 103 个中后台组件 × 5 端,另有 PC × uni-app 试点列(见 ROADMAP S7-P26)。</p>
|
||
</section>
|
||
|
||
<section class="m-block">
|
||
<h2>隔离边界</h2>
|
||
<table class="m-table">
|
||
<thead><tr><th>维度</th><th>PC 端</th><th>移动端</th><th>共享</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>实现目录</td><td><code>frameworks/</code>(515)</td><td><code>frameworks-mobile/</code>(282)</td><td>否</td></tr>
|
||
<tr><td>契约</td><td><code>.design_library/kole-ui/components/</code>(103)</td><td><code>.design_library/kole-ui-mobile/components/</code>(47)</td><td>否</td></tr>
|
||
<tr><td>索引(唯一真源)</td><td><code>components/index.json</code></td><td><code>kole-ui-mobile/components/index.json</code></td><td>否</td></tr>
|
||
<tr><td>类名前缀</td><td><code>kole-</code>(含既有短名 <code>btn</code>)</td><td><code>kole-m-</code>(状态类 <code>is-*</code>)</td><td>否</td></tr>
|
||
<tr><td>令牌前缀</td><td><code>--kole-*</code>(75)</td><td><code>--kole-m-*</code>(15)</td><td>颜色 / 字体 / 圆角 / 阴影同源(@import)</td></tr>
|
||
<tr><td>导出名</td><td><code>KoleButton</code></td><td><code>KoleMNavBar</code></td><td>否</td></tr>
|
||
<tr><td>测试页</td><td><code>tests/<slug>.html</code>(103)</td><td><code>tests/mobile/<slug>.html</code>(47)</td><td>共享断言引擎 <code>tests/_runtime.js</code></td></tr>
|
||
<tr><td>回归报告</td><td><code>tests/report.json</code></td><td><code>tests/mobile-report.json</code></td><td>否</td></tr>
|
||
<tr><td>文档站</td><td><code>site/</code>(SPA 路由)</td><td><code>site/m/</code>(静态页,不进 PC 路由表)</td><td>否</td></tr>
|
||
<tr><td>自包含数据</td><td><code>site/data.json</code></td><td><code>site/m/data.mobile.json</code></td><td>否</td></tr>
|
||
<tr><td>分发产物</td><td><code>dist/components|react|vue3|vue2</code></td><td><code>dist/mobile/*</code></td><td>否</td></tr>
|
||
<tr><td>构建脚本</td><td><code>build-site.ps1</code> + <code>build-dist.mjs</code></td><td><code>build-mobile.mjs</code> + <code>build-uniapp.mjs</code></td><td>否</td></tr>
|
||
</tbody>
|
||
</table>
|
||
<p class="m-note">规则全文与门禁命令见 <a href="./platform.html">平台与端</a>;权威文档为仓库根 <code>PLATFORMS.md</code>。</p>
|
||
</section>
|
||
|
||
<section class="m-block">
|
||
<h2>组件清单(47)</h2>
|
||
<div class="m-grid">
|
||
<article class="m-card" data-slug="navbar">
|
||
<header>
|
||
<div class="zh">顶部导航栏<span class="en" style="margin-left:6px;">NavBar</span></div>
|
||
<div class="en">导航 · titleAlign: center/left · elevated: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/NavBar.html" title="顶部导航栏 NavBar 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/navbar.html">详情</a>
|
||
<a href="../../tests/mobile/navbar.html">测试页</a>
|
||
<a href="../../frameworks-mobile/NavBar.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="tabbar">
|
||
<header>
|
||
<div class="zh">底部标签栏<span class="en" style="margin-left:6px;">TabBar</span></div>
|
||
<div class="en">导航 · count: 2/3/4/5 · badge: none/dot/number</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/TabBar.html" title="底部标签栏 TabBar 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/tabbar.html">详情</a>
|
||
<a href="../../tests/mobile/tabbar.html">测试页</a>
|
||
<a href="../../frameworks-mobile/TabBar.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="actionsheet">
|
||
<header>
|
||
<div class="zh">动作面板<span class="en" style="margin-left:6px;">ActionSheet</span></div>
|
||
<div class="en">反馈 · tone: default/danger · cancel: inline/separate</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/ActionSheet.html" title="动作面板 ActionSheet 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/actionsheet.html">详情</a>
|
||
<a href="../../tests/mobile/actionsheet.html">测试页</a>
|
||
<a href="../../frameworks-mobile/ActionSheet.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="pullrefresh">
|
||
<header>
|
||
<div class="zh">下拉刷新<span class="en" style="margin-left:6px;">PullRefresh</span></div>
|
||
<div class="en">反馈 · state: pull/ready/refreshing/done · threshold: 60</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/PullRefresh.html" title="下拉刷新 PullRefresh 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/pullrefresh.html">详情</a>
|
||
<a href="../../tests/mobile/pullrefresh.html">测试页</a>
|
||
<a href="../../frameworks-mobile/PullRefresh.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="swipecell">
|
||
<header>
|
||
<div class="zh">滑动单元格<span class="en" style="margin-left:6px;">SwipeCell</span></div>
|
||
<div class="en">反馈 · direction: left/right · actions: 1/2</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/SwipeCell.html" title="滑动单元格 SwipeCell 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/swipecell.html">详情</a>
|
||
<a href="../../tests/mobile/swipecell.html">测试页</a>
|
||
<a href="../../frameworks-mobile/SwipeCell.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-button">
|
||
<header>
|
||
<div class="zh">按钮<span class="en" style="margin-left:6px;">Button</span></div>
|
||
<div class="en">通用 · type: primary/default/text/danger · size: large/default/small · block: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Button.html" title="按钮 Button 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-button.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-button.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Button.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="cell">
|
||
<header>
|
||
<div class="zh">单元格<span class="en" style="margin-left:6px;">Cell</span></div>
|
||
<div class="en">数据展示 · arrow: false/true · link: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Cell.html" title="单元格 Cell 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/cell.html">详情</a>
|
||
<a href="../../tests/mobile/cell.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Cell.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-divider">
|
||
<header>
|
||
<div class="zh">分割线<span class="en" style="margin-left:6px;">Divider</span></div>
|
||
<div class="en">通用 · orientation: horizontal/vertical · align: left/center/right · dashed: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Divider.html" title="分割线 Divider 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-divider.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-divider.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Divider.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-badge">
|
||
<header>
|
||
<div class="zh">徽标<span class="en" style="margin-left:6px;">Badge</span></div>
|
||
<div class="en">数据展示 · shape: dot/number/text · standalone: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Badge.html" title="徽标 Badge 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-badge.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-badge.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Badge.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-tag">
|
||
<header>
|
||
<div class="zh">标签<span class="en" style="margin-left:6px;">Tag</span></div>
|
||
<div class="en">数据展示 · tone: default/primary/success/warning/danger · size: default/small · closable: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Tag.html" title="标签 Tag 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-tag.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-tag.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Tag.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-popup">
|
||
<header>
|
||
<div class="zh">弹出层<span class="en" style="margin-left:6px;">Popup</span></div>
|
||
<div class="en">反馈 · placement: center/bottom/top/left/right · round: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Popup.html" title="弹出层 Popup 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-popup.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-popup.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Popup.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-toast">
|
||
<header>
|
||
<div class="zh">轻提示<span class="en" style="margin-left:6px;">Toast</span></div>
|
||
<div class="en">反馈 · tone: info/success/warning/danger/loading · position: center/bottom/top · mask: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Toast.html" title="轻提示 Toast 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-toast.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-toast.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Toast.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-dialog">
|
||
<header>
|
||
<div class="zh">对话框<span class="en" style="margin-left:6px;">Dialog</span></div>
|
||
<div class="en">反馈 · variant: confirm/alert · tone: default/danger · round: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Dialog.html" title="对话框 Dialog 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-dialog.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-dialog.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Dialog.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-grid">
|
||
<header>
|
||
<div class="zh">宫格<span class="en" style="margin-left:6px;">Grid</span></div>
|
||
<div class="en">导航 · columns: 2/3/4 · border: false/true · square: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Grid.html" title="宫格 Grid 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-grid.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-grid.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Grid.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-steps">
|
||
<header>
|
||
<div class="zh">步骤条<span class="en" style="margin-left:6px;">Steps</span></div>
|
||
<div class="en">导航 · direction: horizontal/vertical · status: wait/process/finish/error</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Steps.html" title="步骤条 Steps 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-steps.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-steps.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Steps.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-noticebar">
|
||
<header>
|
||
<div class="zh">通知栏<span class="en" style="margin-left:6px;">NoticeBar</span></div>
|
||
<div class="en">反馈 · tone: default/success/warning/danger · scrollable: false/true · closable: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/NoticeBar.html" title="通知栏 NoticeBar 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-noticebar.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-noticebar.html">测试页</a>
|
||
<a href="../../frameworks-mobile/NoticeBar.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-numberkeyboard">
|
||
<header>
|
||
<div class="zh">数字键盘<span class="en" style="margin-left:6px;">NumberKeyboard</span></div>
|
||
<div class="en">数据录入 · type: number/digit · showDelete: false/true · showConfirm: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/NumberKeyboard.html" title="数字键盘 NumberKeyboard 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-numberkeyboard.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-numberkeyboard.html">测试页</a>
|
||
<a href="../../frameworks-mobile/NumberKeyboard.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-datepicker">
|
||
<header>
|
||
<div class="zh">日期选择器<span class="en" style="margin-left:6px;">DatePicker</span></div>
|
||
<div class="en">数据录入 · mode: date/month · round: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/DatePicker.html" title="日期选择器 DatePicker 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-datepicker.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-datepicker.html">测试页</a>
|
||
<a href="../../frameworks-mobile/DatePicker.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-icon">
|
||
<header>
|
||
<div class="zh">图标<span class="en" style="margin-left:6px;">Icon</span></div>
|
||
<div class="en">通用 · size: small/default/large/xlarge · tone: default/brand/secondary/danger/success/warning · spin: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Icon.html" title="图标 Icon 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-icon.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-icon.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Icon.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-layout">
|
||
<header>
|
||
<div class="zh">布局<span class="en" style="margin-left:6px;">Layout</span></div>
|
||
<div class="en">通用 · gutter: 0/8/16/24 · columns: 0/2/3/4 · align: start/center/end/stretch · wrap: true/false</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Layout.html" title="布局 Layout 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-layout.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-layout.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Layout.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-link">
|
||
<header>
|
||
<div class="zh">链接<span class="en" style="margin-left:6px;">Link</span></div>
|
||
<div class="en">通用 · tone: brand/default/danger/success · underline: false/true · block: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Link.html" title="链接 Link 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-link.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-link.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Link.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-loading">
|
||
<header>
|
||
<div class="zh">加载<span class="en" style="margin-left:6px;">Loading</span></div>
|
||
<div class="en">反馈 · size: small/default/large · vertical: false/true · fullscreen: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Loading.html" title="加载 Loading 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-loading.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-loading.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Loading.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-avatar">
|
||
<header>
|
||
<div class="zh">头像<span class="en" style="margin-left:6px;">Avatar</span></div>
|
||
<div class="en">数据展示 · size: small/default/large · shape: circle/square · type: text/image</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Avatar.html" title="头像 Avatar 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-avatar.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-avatar.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Avatar.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-list">
|
||
<header>
|
||
<div class="zh">列表<span class="en" style="margin-left:6px;">List</span></div>
|
||
<div class="en">数据展示 · border: true/false · size: default/compact · divider: inset/full</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/List.html" title="列表 List 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-list.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-list.html">测试页</a>
|
||
<a href="../../frameworks-mobile/List.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-collapse">
|
||
<header>
|
||
<div class="zh">折叠面板<span class="en" style="margin-left:6px;">Collapse</span></div>
|
||
<div class="en">数据展示 · accordion: false/true · bordered: true/false</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Collapse.html" title="折叠面板 Collapse 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-collapse.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-collapse.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Collapse.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-progress">
|
||
<header>
|
||
<div class="zh">进度条<span class="en" style="margin-left:6px;">Progress</span></div>
|
||
<div class="en">反馈 · type: line/circle · status: normal/success/error · labelPlacement: inside/right/center</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Progress.html" title="进度条 Progress 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-progress.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-progress.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Progress.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-input">
|
||
<header>
|
||
<div class="zh">输入框<span class="en" style="margin-left:6px;">Input</span></div>
|
||
<div class="en">数据录入 · size: default/large · clearable: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Input.html" title="输入框 Input 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-input.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-input.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Input.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-search">
|
||
<header>
|
||
<div class="zh">搜索框<span class="en" style="margin-left:6px;">Search</span></div>
|
||
<div class="en">数据录入 · round: true/false · showCancel: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Search.html" title="搜索框 Search 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-search.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-search.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Search.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-stepper">
|
||
<header>
|
||
<div class="zh">步进器<span class="en" style="margin-left:6px;">Stepper</span></div>
|
||
<div class="en">数据录入 · size: default/small · round: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Stepper.html" title="步进器 Stepper 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-stepper.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-stepper.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Stepper.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-switch">
|
||
<header>
|
||
<div class="zh">开关<span class="en" style="margin-left:6px;">Switch</span></div>
|
||
<div class="en">数据录入 · size: default/small · labelPlacement: right/left</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Switch.html" title="开关 Switch 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-switch.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-switch.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Switch.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-textarea">
|
||
<header>
|
||
<div class="zh">多行文本框<span class="en" style="margin-left:6px;">Textarea</span></div>
|
||
<div class="en">数据录入 · size: default/large · showCounter: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Textarea.html" title="多行文本框 Textarea 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-textarea.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-textarea.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Textarea.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-checkbox">
|
||
<header>
|
||
<div class="zh">多选框<span class="en" style="margin-left:6px;">Checkbox</span></div>
|
||
<div class="en">数据录入 · orientation: vertical/horizontal · button: false/true · selectAll: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Checkbox.html" title="多选框 Checkbox 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-checkbox.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-checkbox.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Checkbox.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-form">
|
||
<header>
|
||
<div class="zh">表单<span class="en" style="margin-left:6px;">Form</span></div>
|
||
<div class="en">数据录入 · labelPosition: top/left · borderless: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Form.html" title="表单 Form 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-form.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-form.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Form.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-radio">
|
||
<header>
|
||
<div class="zh">单选框<span class="en" style="margin-left:6px;">Radio</span></div>
|
||
<div class="en">数据录入 · orientation: vertical/horizontal · button: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Radio.html" title="单选框 Radio 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-radio.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-radio.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Radio.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-rate">
|
||
<header>
|
||
<div class="zh">评分<span class="en" style="margin-left:6px;">Rate</span></div>
|
||
<div class="en">数据录入 · size: default/small · allowHalf: false/true · readonly: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Rate.html" title="评分 Rate 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-rate.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-rate.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Rate.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-slider">
|
||
<header>
|
||
<div class="zh">滑动选择器<span class="en" style="margin-left:6px;">Slider</span></div>
|
||
<div class="en">数据录入 · mode: single/range · marks: with-marks/none · showValue: true/false</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Slider.html" title="滑动选择器 Slider 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-slider.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-slider.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Slider.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-cascader">
|
||
<header>
|
||
<div class="zh">级联选择器<span class="en" style="margin-left:6px;">Cascader</span></div>
|
||
<div class="en">数据录入 · mode: panel/popup · showPath: true/false · round: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Cascader.html" title="级联选择器 Cascader 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-cascader.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-cascader.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Cascader.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-colorpicker">
|
||
<header>
|
||
<div class="zh">颜色选择器<span class="en" style="margin-left:6px;">ColorPicker</span></div>
|
||
<div class="en">数据录入 · mode: swatch/custom · round: false/true · showValue: true/false</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/ColorPicker.html" title="颜色选择器 ColorPicker 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-colorpicker.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-colorpicker.html">测试页</a>
|
||
<a href="../../frameworks-mobile/ColorPicker.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-message">
|
||
<header>
|
||
<div class="zh">消息通知<span class="en" style="margin-left:6px;">Message</span></div>
|
||
<div class="en">反馈 · tone: info/success/warning/error · closable: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Message.html" title="消息通知 Message 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-message.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-message.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Message.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-overlay">
|
||
<header>
|
||
<div class="zh">遮罩层<span class="en" style="margin-left:6px;">Overlay</span></div>
|
||
<div class="en">反馈 · tone: default/strong/blur · contained: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Overlay.html" title="遮罩层 Overlay 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-overlay.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-overlay.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Overlay.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-picker">
|
||
<header>
|
||
<div class="zh">选择器<span class="en" style="margin-left:6px;">Picker</span></div>
|
||
<div class="en">数据录入 · mode: single/multiple · round: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Picker.html" title="选择器 Picker 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-picker.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-picker.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Picker.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-popover">
|
||
<header>
|
||
<div class="zh">弹出气泡<span class="en" style="margin-left:6px;">Popover</span></div>
|
||
<div class="en">反馈 · placement: top/bottom/left/right · arrow: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Popover.html" title="弹出气泡 Popover 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-popover.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-popover.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Popover.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-segmented">
|
||
<header>
|
||
<div class="zh">分段器<span class="en" style="margin-left:6px;">Segmented</span></div>
|
||
<div class="en">导航 · size: default/small · block: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Segmented.html" title="分段器 Segmented 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-segmented.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-segmented.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Segmented.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-sticky">
|
||
<header>
|
||
<div class="zh">吸顶容器<span class="en" style="margin-left:6px;">Sticky</span></div>
|
||
<div class="en">导航 · position: top/bottom · safeArea: false/true · shadow: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Sticky.html" title="吸顶容器 Sticky 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-sticky.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-sticky.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Sticky.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-table">
|
||
<header>
|
||
<div class="zh">表格<span class="en" style="margin-left:6px;">Table</span></div>
|
||
<div class="en">数据展示 · mode: scroll/card · size: default/compact · stripe: false/true · bordered: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Table.html" title="表格 Table 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-table.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-table.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Table.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-typography">
|
||
<header>
|
||
<div class="zh">排版<span class="en" style="margin-left:6px;">Typography</span></div>
|
||
<div class="en">数据展示 · level: title/body/assist/secondary · ellipsis: false/true · copyable: false/true</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Typography.html" title="排版 Typography 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-typography.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-typography.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Typography.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
<article class="m-card" data-slug="mobile-upload">
|
||
<header>
|
||
<div class="zh">上传<span class="en" style="margin-left:6px;">Upload</span></div>
|
||
<div class="en">数据录入 · variant: dashed/button · maxCount: reached/not-reached</div>
|
||
</header>
|
||
<div class="preview"><iframe src="../../frameworks-mobile/Upload.html" title="上传 Upload 预览" loading="lazy"></iframe></div>
|
||
<footer>
|
||
<a href="component/mobile-upload.html">详情</a>
|
||
<a href="../../tests/mobile/mobile-upload.html">测试页</a>
|
||
<a href="../../frameworks-mobile/Upload.html" target="_blank">演示页 ↗</a>
|
||
<span class="m-pill" style="margin-left:auto;">uni-app ✓</span>
|
||
</footer>
|
||
</article>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="m-block">
|
||
<h2>规格来源说明</h2>
|
||
<p class="m-sub">PC 端实现来自外部交付的 <code>组件1~10.txt</code>;移动端<strong>没有外部规格原文</strong>,规格由本仓库撰写(<code>.design_library/kole-ui-mobile/spec/移动端规格.md</code>),契约 JSON 的 <code>sourceKind</code> 为 <code>authored-spec</code>、<code>provenance</code> 为 <code>authored-in-repo</code> —— 不冒认外部来源。契约中的 <code>unknowns</code> 记录规格未定项的当前状态,<code>doNotInvent</code> 列出明确不许发明的部分。</p>
|
||
</section>
|
||
|
||
<footer class="m-foot">
|
||
<p>生成物:本页由 <code>node tools/build-mobile.mjs</code> 从 <code>.design_library/kole-ui-mobile/components/index.json</code> 生成,请勿手改。</p>
|
||
<p>回归:<a href="../../tests/mobile/index.html">移动端测试总览</a> · <a href="../../tests/mobile/_collect.html">批量收集器</a> · PC 侧回归 <a href="../../tests/index.html">测试总览</a></p>
|
||
</footer>
|
||
</main>
|
||
</div>
|
||
<script>
|
||
(function () {
|
||
/* 左栏:≤1000px 默认收起(手机上不让导航占满一屏),跨断点时同步一次;不监听 resize,
|
||
免得跟用户手动的展开/收起抢状态。桌面不设 open 之外的动作。 */
|
||
var side = document.querySelector('details.m-side');
|
||
if (side && window.matchMedia) {
|
||
var mq = window.matchMedia('(max-width: 1000px)');
|
||
var sync = function () { if (mq.matches) side.removeAttribute('open'); else side.setAttribute('open', ''); };
|
||
sync();
|
||
if (mq.addEventListener) mq.addEventListener('change', sync);
|
||
else if (mq.addListener) mq.addListener(sync);
|
||
}
|
||
/* 单演示预览帧按内容高度自适应(同源可读 contentDocument;上限 360px、下限 140px)。
|
||
固定高度会在内容少的演示上留一大片空白(实测 SwipeCell 单个演示只用 ~120px)。 */
|
||
function fitDemoFrames() {
|
||
var frames = document.querySelectorAll('.m-demo-stage iframe');
|
||
Array.prototype.forEach.call(frames, function (f) {
|
||
var fit = function () {
|
||
try {
|
||
var d = f.contentDocument;
|
||
if (!d || !d.body) return;
|
||
/* 只量 body.scrollHeight:documentElement.scrollHeight 等于**帧视口高度**(html 撑满视口),
|
||
拿它做 max 会形成「帧高→视口高→量到的高度」反馈环,永远收敛在初始值(实测锁在 308px)。 */
|
||
var h = d.body.scrollHeight;
|
||
if (!h) h = d.documentElement ? d.documentElement.scrollHeight : 0;
|
||
if (!h) return;
|
||
f.style.height = Math.min(360, Math.max(140, h + 8)) + 'px';
|
||
} catch (e) { /* 跨源或未就绪:保持 CSS 兜底高度 */ }
|
||
};
|
||
f.addEventListener('load', function () { fit(); setTimeout(fit, 300); });
|
||
fit();
|
||
});
|
||
}
|
||
fitDemoFrames();
|
||
window.addEventListener('load', fitDemoFrames);
|
||
/* 主题模式(三态):与 PC 完全同一约定 —— localStorage[kole-mode] ∈ light|dark|auto,
|
||
auto 跟随系统,反色靠 html.kole-dark(令牌文件里已写好该组,两端共用一份令牌)。
|
||
用户在 PC 站选夜间,进移动端站也是夜间。 */
|
||
var MODE_KEY = 'kole-mode';
|
||
var MODE_LABEL = { light: '日间模式', dark: '夜间模式', auto: '自动模式' };
|
||
function readMode() {
|
||
try { var v = localStorage.getItem(MODE_KEY); if (v === 'light' || v === 'dark' || v === 'auto') return v; } catch (e) {}
|
||
return 'auto';
|
||
}
|
||
function systemDark() {
|
||
return !!(window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches);
|
||
}
|
||
function applyMode(mode) {
|
||
var dark = mode === 'dark' || (mode === 'auto' && systemDark());
|
||
document.documentElement.classList.toggle('kole-dark', dark);
|
||
document.documentElement.style.colorScheme = dark ? 'dark' : 'light';
|
||
var cur = document.getElementById('m-mode-cur');
|
||
if (cur) cur.textContent = MODE_LABEL[mode] || MODE_LABEL.auto;
|
||
Array.prototype.forEach.call(document.querySelectorAll('.m-menu-opt'), function (o) {
|
||
o.setAttribute('aria-selected', o.getAttribute('data-mode') === mode ? 'true' : 'false');
|
||
});
|
||
/* 三态图标与 PC 同口径:显式选择时按时态给图标(日间=月亮 / 夜间=太阳),
|
||
自动模式下恒为「跟随系统」的显示器图标(此时两个显式图标都不显示)。 */
|
||
var moon = document.getElementById('m-icon-moon');
|
||
var sun = document.getElementById('m-icon-sun');
|
||
var auto = document.getElementById('m-icon-auto');
|
||
if (moon) moon.style.display = (mode === 'light') ? '' : 'none';
|
||
if (sun) sun.style.display = (mode === 'dark') ? '' : 'none';
|
||
if (auto) auto.style.display = (mode === 'auto') ? '' : 'none';
|
||
}
|
||
function bindModeMenu() {
|
||
var trigger = document.getElementById('m-mode-trigger');
|
||
var menu = document.getElementById('m-mode-menu');
|
||
if (!trigger || !menu) return;
|
||
var close = function (refocus) {
|
||
menu.classList.add('hidden'); trigger.setAttribute('aria-expanded', 'false');
|
||
if (refocus) trigger.focus();
|
||
};
|
||
trigger.addEventListener('click', function () {
|
||
var open = menu.classList.toggle('hidden');
|
||
trigger.setAttribute('aria-expanded', open ? 'false' : 'true');
|
||
});
|
||
trigger.addEventListener('keydown', function (e) {
|
||
if (e.key === 'Escape') close(true);
|
||
});
|
||
Array.prototype.forEach.call(menu.querySelectorAll('.m-menu-opt'), function (opt) {
|
||
opt.addEventListener('click', function () {
|
||
var mode = opt.getAttribute('data-mode');
|
||
try { localStorage.setItem(MODE_KEY, mode); } catch (e) {}
|
||
applyMode(mode);
|
||
close(true);
|
||
});
|
||
});
|
||
document.addEventListener('click', function (e) {
|
||
if (!menu.classList.contains('hidden') && !menu.contains(e.target) && !trigger.contains(e.target)) close(false);
|
||
});
|
||
document.addEventListener('keydown', function (e) {
|
||
if (e.key === 'Escape' && !menu.classList.contains('hidden')) close(true);
|
||
});
|
||
/* 自动模式下跟随系统切换 */
|
||
if (window.matchMedia) {
|
||
var mq = window.matchMedia('(prefers-color-scheme: dark)');
|
||
var onChange = function () { if (readMode() === 'auto') applyMode('auto'); };
|
||
if (mq.addEventListener) mq.addEventListener('change', onChange);
|
||
else if (mq.addListener) mq.addListener(onChange);
|
||
}
|
||
applyMode(readMode());
|
||
}
|
||
bindModeMenu();
|
||
/* 版本下拉:与 PC 顶栏同一实现口径 —— 清单从部署根取(<prefix>/versions.json 与
|
||
<prefix>/site/versions.json 两份按序尝试,取有可用条目的那份),拿不到就退回不可点的
|
||
纯角标(data-single="1"),不留一个点不开的下拉。
|
||
清单不许把用户带去外站:path 只允许 ".."(站点根自身)或 x.y.z 快照目录名。 */
|
||
var VERSION_KEY_PATH = '..';
|
||
function isValidVersionPath(p) {
|
||
if (typeof p !== 'string' || !p.length || p.indexOf('\\') >= 0 || p.indexOf('//') >= 0) return false;
|
||
if (p === VERSION_KEY_PATH) return true;
|
||
return /^\d+\.\d+\.\d+$/.test(p);
|
||
}
|
||
/* 清单里的 path 相对部署根,".." = /site/、x.y.z = /x.y.z/site/。
|
||
当前页可能不在部署根下(快照页),故先还原部署根绝对路径再算回相对当前页。 */
|
||
function versionHref(absSite) {
|
||
var i = location.pathname.indexOf('/site/');
|
||
var prefix = i >= 0 ? location.pathname.slice(0, i) : '';
|
||
if (!prefix || absSite.indexOf(prefix + '/') !== 0) return absSite;
|
||
var rest = absSite.slice(prefix.length + 1);
|
||
var up = '';
|
||
var segs = prefix.slice(1).split('/');
|
||
for (var k = 0; k < segs.length; k++) up += "../";
|
||
return up + rest;
|
||
}
|
||
function buildVersionList(doc) {
|
||
var raw = doc && doc.versions;
|
||
if (!raw || !raw.length) return [];
|
||
var i = location.pathname.indexOf('/site/');
|
||
var prefix = i >= 0 ? location.pathname.slice(0, i) : '';
|
||
var list = [];
|
||
for (var k = 0; k < raw.length; k++) {
|
||
var v = raw[k] || {};
|
||
var ver = v.version ? String(v.version) : '';
|
||
var path = v.path ? String(v.path) : '';
|
||
if (!ver || !isValidVersionPath(path)) continue;
|
||
var absSite = (path === VERSION_KEY_PATH ? '' : '/' + path) + '/site/';
|
||
list.push({ version: ver, date: v.date ? String(v.date) : '', latest: !!v.latest, href: versionHref(absSite), absSite: absSite, current: false });
|
||
}
|
||
if (list.length) {
|
||
/* 当前版本 = 绝对路径上命中的最长前缀(最具体的那个)——与 PC 的判定一致,
|
||
快照页与根站点都能算对。 */
|
||
var here = location.pathname;
|
||
var best = -1;
|
||
for (var j = 0; j < list.length; j++) {
|
||
if (here.indexOf(list[j].absSite) === 0 && list[j].absSite.length > best) best = list[j].absSite.length;
|
||
}
|
||
for (var m = 0; m < list.length; m++) list[m].current = best >= 0 && list[m].absSite.length === best;
|
||
if (best < 0 && list[0]) list[0].current = true;
|
||
}
|
||
return list;
|
||
}
|
||
function bindVersionMenu() {
|
||
var trigger = document.getElementById('m-ver-trigger');
|
||
var menu = document.getElementById('m-ver-menu');
|
||
var chip = document.getElementById('m-ver');
|
||
if (!trigger || !menu) return;
|
||
var close = function (refocus) {
|
||
menu.classList.add('hidden'); trigger.setAttribute('aria-expanded', 'false');
|
||
if (refocus) trigger.focus();
|
||
};
|
||
var interactive = false;
|
||
var render = function (list) {
|
||
interactive = !!(list && list.length);
|
||
/* 只有清单拿不到才退回纯角标;只要有一版就是下拉(里面至少能看清当前是哪个版本) */
|
||
trigger.setAttribute('data-single', interactive ? '0' : '1');
|
||
if (!interactive) { menu.classList.add("hidden"); return; }
|
||
var cur = null;
|
||
for (var k = 0; k < list.length; k++) if (list[k].current) cur = list[k];
|
||
if (chip) chip.textContent = 'v' + ((cur && cur.version) || VERSION);
|
||
/* 重建选项(幂等:重复调用不会叠加) */
|
||
Array.prototype.slice.call(menu.querySelectorAll('.m-ver-opt')).forEach(function (n) { n.remove(); });
|
||
list.forEach(function (it) {
|
||
var opt = document.createElement('button');
|
||
opt.type = 'button'; opt.className = 'm-ver-opt'; opt.setAttribute('role', 'option');
|
||
opt.setAttribute('data-version', it.version);
|
||
opt.setAttribute('aria-selected', it.current ? 'true' : 'false');
|
||
var tag = it.current ? '当前浏览' : (it.latest ? '最新版' : (it.date || ''));
|
||
opt.innerHTML = '<span class="m-ver-opt-num">v' + it.version + '</span><span class="m-ver-opt-tag">' + tag + '</span>';
|
||
if (it.href) opt.setAttribute('data-href', it.href);
|
||
opt.addEventListener("click", function () {
|
||
if (!it.current && it.href) location.href = it.href;
|
||
else close(true);
|
||
});
|
||
menu.appendChild(opt);
|
||
});
|
||
};
|
||
trigger.addEventListener('click', function () {
|
||
if (!interactive) return;
|
||
if (menu.classList.contains('hidden')) { menu.classList.remove('hidden'); trigger.setAttribute('aria-expanded', 'true'); }
|
||
else close(false);
|
||
});
|
||
trigger.addEventListener('keydown', function (e) {
|
||
if (!interactive) return;
|
||
if (e.key === 'ArrowDown' || e.key === 'ArrowUp') { e.preventDefault(); menu.classList.remove('hidden'); trigger.setAttribute('aria-expanded', 'true'); }
|
||
else if (e.key === 'Escape') close(true);
|
||
});
|
||
document.addEventListener('click', function (e) {
|
||
if (!menu.classList.contains('hidden') && !menu.contains(e.target) && !trigger.contains(e.target)) close(false);
|
||
});
|
||
document.addEventListener('keydown', function (e) {
|
||
if (e.key === 'Escape' && !menu.classList.contains('hidden')) close(true);
|
||
});
|
||
/* 两份清单按序尝试(不并行:快照页那份必然 404,并行会把 404 记进控制台,
|
||
而站点门禁的「零控制台错误」是硬断言)。 */
|
||
if (!window.fetch || location.protocol === 'file:') return;
|
||
var i = location.pathname.indexOf('/site/');
|
||
if (i < 0) return;
|
||
var prefix = location.pathname.slice(0, i);
|
||
var urls = [prefix + '/versions.json', prefix + '/site/versions.json'];
|
||
var attempt = function (idx) {
|
||
if (idx >= urls.length) return;
|
||
fetch(urls[idx], { cache: 'no-store' })
|
||
.then(function (r) { if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); })
|
||
.then(function (doc) { var list = buildVersionList(doc); if (list.length) render(list); else attempt(idx + 1); })
|
||
.catch(function () { attempt(idx + 1); });
|
||
};
|
||
attempt(0);
|
||
}
|
||
bindVersionMenu();
|
||
function done(btn) {
|
||
var old = btn.textContent; btn.textContent = '已复制'; btn.classList.add('is-done');
|
||
setTimeout(function () { btn.textContent = old; btn.classList.remove('is-done'); }, 1200);
|
||
}
|
||
document.addEventListener('click', function (e) {
|
||
var btn = e.target && e.target.closest ? e.target.closest('.m-copy') : null;
|
||
if (!btn) return;
|
||
var src = document.getElementById(btn.getAttribute('data-copy') || '');
|
||
var text = src ? (src.innerText || src.textContent || '') : '';
|
||
if (navigator.clipboard && navigator.clipboard.writeText) {
|
||
navigator.clipboard.writeText(text).then(function () { done(btn); }, function () { fallback(btn, text); });
|
||
} else { fallback(btn, text); }
|
||
});
|
||
function fallback(btn, text) {
|
||
try {
|
||
var ta = document.createElement('textarea'); ta.value = text; ta.setAttribute('readonly', '');
|
||
ta.style.position = 'fixed'; ta.style.opacity = '0'; document.body.appendChild(ta);
|
||
ta.select(); document.execCommand("copy"); document.body.removeChild(ta); done(btn);
|
||
} catch (err) { btn.textContent = '复制失败'; }
|
||
}
|
||
})();
|
||
</script>
|
||
</body>
|
||
</html>
|