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 未做部分)
1217 lines
32 KiB
JSON
1217 lines
32 KiB
JSON
{
|
||
"schemaVersion": 1,
|
||
"library": "kole-ui-mobile",
|
||
"kind": "mobile",
|
||
"updatedAt": "2026-09-20",
|
||
"sourceKind": "authored-spec",
|
||
"specFile": "spec/移动端规格.md",
|
||
"description": "移动端组件索引:登记 frameworks-mobile/ 下的移动端组件。与 PC 端(.design_library/kole-ui/components/index.json,103 个)完全隔离 —— 两端索引、目录、类名、令牌前缀、测试与回归报告均不交叉,仅颜色/字体/圆角/阴影令牌同源(@import PC 令牌文件)。分类口径与 PC 端一致(见 categories 块)。",
|
||
"isolation": {
|
||
"from": "kole-ui",
|
||
"spec": "PLATFORMS.md",
|
||
"gate": "tools/verify-mobile-isolation.mjs",
|
||
"classPrefix": "kole-m-",
|
||
"tokenPrefix": "--kole-m-",
|
||
"exportPrefix": "KoleM",
|
||
"implDir": "frameworks-mobile",
|
||
"testsDir": "tests/mobile",
|
||
"siteDir": "site/m",
|
||
"report": "tests/mobile-report.json",
|
||
"rules": [
|
||
"移动端实现不得出现在 frameworks/;PC 实现不得出现在 frameworks-mobile/",
|
||
"移动端样式只引用 --kole-* 或 --kole-m-* 令牌,不得出现硬编码十六进制颜色",
|
||
"移动端类名只能是 kole-m-<name> 或状态类 is-<state>",
|
||
"PC 侧任何文件不得引用 frameworks-mobile/ 或 site/m/",
|
||
"颜色/字体/圆角/阴影令牌与 PC 同源(@import),不得在本层复制定义"
|
||
]
|
||
},
|
||
"provenanceNote": "PC 端规格来自外部交付的 组件1~10.txt;移动端没有外部规格原文,规格由本仓库撰写(specFile),故 sourceKind 为 authored-spec,契约的 provenance 必须写 authored-in-repo。",
|
||
"ends": [
|
||
"css",
|
||
"html",
|
||
"jsx",
|
||
"vue2",
|
||
"vue3",
|
||
"uniapp"
|
||
],
|
||
"components": [
|
||
{
|
||
"slug": "navbar",
|
||
"name": "顶部导航栏 NavBar",
|
||
"tier": "mobile",
|
||
"category": "navigation",
|
||
"confidence": "high",
|
||
"specSection": "1 · 顶部导航栏 NavBar",
|
||
"contract": "components/navbar.json",
|
||
"frameworksPrefix": "NavBar",
|
||
"files": {
|
||
"css": "NavBar.css",
|
||
"html": "NavBar.html",
|
||
"jsx": "NavBar.jsx",
|
||
"vue2": "NavBar.vue2.vue",
|
||
"vue3": "NavBar.vue3.vue",
|
||
"uniapp": "NavBar.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"titleAlign",
|
||
"elevated"
|
||
],
|
||
"behaviors": [
|
||
"click-toggles-class"
|
||
],
|
||
"uniappTouchEvents": true
|
||
},
|
||
{
|
||
"slug": "tabbar",
|
||
"name": "底部标签栏 TabBar",
|
||
"tier": "mobile",
|
||
"category": "navigation",
|
||
"confidence": "high",
|
||
"specSection": "2 · 底部标签栏 TabBar",
|
||
"contract": "components/tabbar.json",
|
||
"frameworksPrefix": "TabBar",
|
||
"files": {
|
||
"css": "TabBar.css",
|
||
"html": "TabBar.html",
|
||
"jsx": "TabBar.jsx",
|
||
"vue2": "TabBar.vue2.vue",
|
||
"vue3": "TabBar.vue3.vue",
|
||
"uniapp": "TabBar.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"count",
|
||
"badge"
|
||
],
|
||
"behaviors": [
|
||
"tab-switches"
|
||
],
|
||
"uniappTouchEvents": true
|
||
},
|
||
{
|
||
"slug": "actionsheet",
|
||
"name": "动作面板 ActionSheet",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "3 · 动作面板 ActionSheet",
|
||
"contract": "components/actionsheet.json",
|
||
"frameworksPrefix": "ActionSheet",
|
||
"files": {
|
||
"css": "ActionSheet.css",
|
||
"html": "ActionSheet.html",
|
||
"jsx": "ActionSheet.jsx",
|
||
"vue2": "ActionSheet.vue2.vue",
|
||
"vue3": "ActionSheet.vue3.vue",
|
||
"uniapp": "ActionSheet.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"tone",
|
||
"cancel"
|
||
],
|
||
"behaviors": [
|
||
"click-toggles-class",
|
||
"click-sets-attr"
|
||
],
|
||
"uniappTouchEvents": true
|
||
},
|
||
{
|
||
"slug": "pullrefresh",
|
||
"name": "下拉刷新 PullRefresh",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "4 · 下拉刷新 PullRefresh",
|
||
"contract": "components/pullrefresh.json",
|
||
"frameworksPrefix": "PullRefresh",
|
||
"files": {
|
||
"css": "PullRefresh.css",
|
||
"html": "PullRefresh.html",
|
||
"jsx": "PullRefresh.jsx",
|
||
"vue2": "PullRefresh.vue2.vue",
|
||
"vue3": "PullRefresh.vue3.vue",
|
||
"uniapp": "PullRefresh.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"state",
|
||
"threshold"
|
||
],
|
||
"behaviors": [
|
||
"pull-triggers",
|
||
"click-sets-attr"
|
||
],
|
||
"uniappTouchEvents": true
|
||
},
|
||
{
|
||
"slug": "swipecell",
|
||
"name": "滑动单元格 SwipeCell",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "5 · 滑动单元格 SwipeCell",
|
||
"contract": "components/swipecell.json",
|
||
"frameworksPrefix": "SwipeCell",
|
||
"files": {
|
||
"css": "SwipeCell.css",
|
||
"html": "SwipeCell.html",
|
||
"jsx": "SwipeCell.jsx",
|
||
"vue2": "SwipeCell.vue2.vue",
|
||
"vue3": "SwipeCell.vue3.vue",
|
||
"uniapp": "SwipeCell.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"direction",
|
||
"actions"
|
||
],
|
||
"behaviors": [
|
||
"swipe-sets-class",
|
||
"click-sets-attr"
|
||
],
|
||
"uniappTouchEvents": true
|
||
},
|
||
{
|
||
"slug": "mobile-button",
|
||
"name": "按钮 Button",
|
||
"tier": "mobile",
|
||
"category": "general",
|
||
"confidence": "high",
|
||
"specSection": "6 · 按钮 Button",
|
||
"contract": "components/mobile-button.json",
|
||
"frameworksPrefix": "Button",
|
||
"files": {
|
||
"css": "Button.css",
|
||
"html": "Button.html",
|
||
"jsx": "Button.jsx",
|
||
"vue2": "Button.vue2.vue",
|
||
"vue3": "Button.vue3.vue",
|
||
"uniapp": "Button.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"type",
|
||
"size",
|
||
"block"
|
||
],
|
||
"behaviors": [
|
||
"click-toggles-class"
|
||
]
|
||
},
|
||
{
|
||
"slug": "cell",
|
||
"name": "单元格 Cell",
|
||
"tier": "mobile",
|
||
"category": "display",
|
||
"confidence": "high",
|
||
"specSection": "7 · 单元格 Cell",
|
||
"contract": "components/cell.json",
|
||
"frameworksPrefix": "Cell",
|
||
"files": {
|
||
"css": "Cell.css",
|
||
"html": "Cell.html",
|
||
"jsx": "Cell.jsx",
|
||
"vue2": "Cell.vue2.vue",
|
||
"vue3": "Cell.vue3.vue",
|
||
"uniapp": "Cell.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"arrow",
|
||
"link"
|
||
],
|
||
"behaviors": [
|
||
"click-sets-attr"
|
||
]
|
||
},
|
||
{
|
||
"slug": "mobile-divider",
|
||
"name": "分割线 Divider",
|
||
"tier": "mobile",
|
||
"category": "general",
|
||
"confidence": "high",
|
||
"specSection": "8 · 分割线 Divider",
|
||
"contract": "components/mobile-divider.json",
|
||
"frameworksPrefix": "Divider",
|
||
"files": {
|
||
"css": "Divider.css",
|
||
"html": "Divider.html",
|
||
"jsx": "Divider.jsx",
|
||
"vue2": "Divider.vue2.vue",
|
||
"vue3": "Divider.vue3.vue",
|
||
"uniapp": "Divider.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"orientation",
|
||
"align",
|
||
"dashed"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-badge",
|
||
"name": "徽标 Badge",
|
||
"tier": "mobile",
|
||
"category": "display",
|
||
"confidence": "high",
|
||
"specSection": "9 · 徽标 Badge",
|
||
"contract": "components/mobile-badge.json",
|
||
"frameworksPrefix": "Badge",
|
||
"files": {
|
||
"css": "Badge.css",
|
||
"html": "Badge.html",
|
||
"jsx": "Badge.jsx",
|
||
"vue2": "Badge.vue2.vue",
|
||
"vue3": "Badge.vue3.vue",
|
||
"uniapp": "Badge.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"shape",
|
||
"standalone"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-tag",
|
||
"name": "标签 Tag",
|
||
"tier": "mobile",
|
||
"category": "display",
|
||
"confidence": "high",
|
||
"specSection": "10 · 标签 Tag",
|
||
"contract": "components/mobile-tag.json",
|
||
"frameworksPrefix": "Tag",
|
||
"files": {
|
||
"css": "Tag.css",
|
||
"html": "Tag.html",
|
||
"jsx": "Tag.jsx",
|
||
"vue2": "Tag.vue2.vue",
|
||
"vue3": "Tag.vue3.vue",
|
||
"uniapp": "Tag.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"tone",
|
||
"size",
|
||
"closable"
|
||
],
|
||
"behaviors": [
|
||
"click-sets-attr"
|
||
]
|
||
},
|
||
{
|
||
"slug": "mobile-popup",
|
||
"name": "弹出层 Popup",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "11 · 弹出层 Popup",
|
||
"contract": "components/mobile-popup.json",
|
||
"frameworksPrefix": "Popup",
|
||
"files": {
|
||
"css": "Popup.css",
|
||
"html": "Popup.html",
|
||
"jsx": "Popup.jsx",
|
||
"vue2": "Popup.vue2.vue",
|
||
"vue3": "Popup.vue3.vue",
|
||
"uniapp": "Popup.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"placement",
|
||
"round"
|
||
],
|
||
"behaviors": [
|
||
"click-toggles-class"
|
||
]
|
||
},
|
||
{
|
||
"slug": "mobile-toast",
|
||
"name": "轻提示 Toast",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "12 · 轻提示 Toast",
|
||
"contract": "components/mobile-toast.json",
|
||
"frameworksPrefix": "Toast",
|
||
"files": {
|
||
"css": "Toast.css",
|
||
"html": "Toast.html",
|
||
"jsx": "Toast.jsx",
|
||
"vue2": "Toast.vue2.vue",
|
||
"vue3": "Toast.vue3.vue",
|
||
"uniapp": "Toast.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"tone",
|
||
"position",
|
||
"mask"
|
||
],
|
||
"behaviors": [
|
||
"click-toggles-class"
|
||
]
|
||
},
|
||
{
|
||
"slug": "mobile-dialog",
|
||
"name": "对话框 Dialog",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "13 · 对话框 Dialog",
|
||
"contract": "components/mobile-dialog.json",
|
||
"frameworksPrefix": "Dialog",
|
||
"files": {
|
||
"css": "Dialog.css",
|
||
"html": "Dialog.html",
|
||
"jsx": "Dialog.jsx",
|
||
"vue2": "Dialog.vue2.vue",
|
||
"vue3": "Dialog.vue3.vue",
|
||
"uniapp": "Dialog.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"variant",
|
||
"tone",
|
||
"round"
|
||
],
|
||
"behaviors": [
|
||
"click-toggles-class"
|
||
]
|
||
},
|
||
{
|
||
"slug": "mobile-grid",
|
||
"name": "宫格 Grid",
|
||
"tier": "mobile",
|
||
"category": "navigation",
|
||
"confidence": "high",
|
||
"specSection": "14 · 宫格 Grid",
|
||
"contract": "components/mobile-grid.json",
|
||
"frameworksPrefix": "Grid",
|
||
"files": {
|
||
"css": "Grid.css",
|
||
"html": "Grid.html",
|
||
"jsx": "Grid.jsx",
|
||
"vue2": "Grid.vue2.vue",
|
||
"vue3": "Grid.vue3.vue",
|
||
"uniapp": "Grid.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"columns",
|
||
"border",
|
||
"square"
|
||
],
|
||
"behaviors": [
|
||
"click-sets-attr"
|
||
]
|
||
},
|
||
{
|
||
"slug": "mobile-steps",
|
||
"name": "步骤条 Steps",
|
||
"tier": "mobile",
|
||
"category": "navigation",
|
||
"confidence": "high",
|
||
"specSection": "15 · 步骤条 Steps",
|
||
"contract": "components/mobile-steps.json",
|
||
"frameworksPrefix": "Steps",
|
||
"files": {
|
||
"css": "Steps.css",
|
||
"html": "Steps.html",
|
||
"jsx": "Steps.jsx",
|
||
"vue2": "Steps.vue2.vue",
|
||
"vue3": "Steps.vue3.vue",
|
||
"uniapp": "Steps.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"direction",
|
||
"status"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-noticebar",
|
||
"name": "通知栏 NoticeBar",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "16 · 通知栏 NoticeBar",
|
||
"contract": "components/mobile-noticebar.json",
|
||
"frameworksPrefix": "NoticeBar",
|
||
"files": {
|
||
"css": "NoticeBar.css",
|
||
"html": "NoticeBar.html",
|
||
"jsx": "NoticeBar.jsx",
|
||
"vue2": "NoticeBar.vue2.vue",
|
||
"vue3": "NoticeBar.vue3.vue",
|
||
"uniapp": "NoticeBar.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"tone",
|
||
"scrollable",
|
||
"closable"
|
||
],
|
||
"behaviors": [
|
||
"click-sets-attr"
|
||
]
|
||
},
|
||
{
|
||
"slug": "mobile-numberkeyboard",
|
||
"name": "数字键盘 NumberKeyboard",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "17 · 数字键盘 NumberKeyboard",
|
||
"contract": "components/mobile-numberkeyboard.json",
|
||
"frameworksPrefix": "NumberKeyboard",
|
||
"files": {
|
||
"css": "NumberKeyboard.css",
|
||
"html": "NumberKeyboard.html",
|
||
"jsx": "NumberKeyboard.jsx",
|
||
"vue2": "NumberKeyboard.vue2.vue",
|
||
"vue3": "NumberKeyboard.vue3.vue",
|
||
"uniapp": "NumberKeyboard.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"type",
|
||
"showDelete",
|
||
"showConfirm"
|
||
],
|
||
"behaviors": [
|
||
"click-sets-attr"
|
||
]
|
||
},
|
||
{
|
||
"slug": "mobile-datepicker",
|
||
"name": "日期选择器 DatePicker",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "18 · 日期选择器 DatePicker",
|
||
"contract": "components/mobile-datepicker.json",
|
||
"frameworksPrefix": "DatePicker",
|
||
"files": {
|
||
"css": "DatePicker.css",
|
||
"html": "DatePicker.html",
|
||
"jsx": "DatePicker.jsx",
|
||
"vue2": "DatePicker.vue2.vue",
|
||
"vue3": "DatePicker.vue3.vue",
|
||
"uniapp": "DatePicker.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"mode",
|
||
"round"
|
||
],
|
||
"behaviors": [
|
||
"click-sets-attr"
|
||
]
|
||
},
|
||
{
|
||
"slug": "mobile-icon",
|
||
"name": "图标 Icon",
|
||
"tier": "mobile",
|
||
"category": "general",
|
||
"confidence": "high",
|
||
"specSection": "19 · 图标 Icon",
|
||
"contract": "components/mobile-icon.json",
|
||
"frameworksPrefix": "Icon",
|
||
"files": {
|
||
"css": "Icon.css",
|
||
"html": "Icon.html",
|
||
"jsx": "Icon.jsx",
|
||
"vue2": "Icon.vue2.vue",
|
||
"vue3": "Icon.vue3.vue",
|
||
"uniapp": "Icon.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"size",
|
||
"tone",
|
||
"spin"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-layout",
|
||
"name": "布局 Layout",
|
||
"tier": "mobile",
|
||
"category": "general",
|
||
"confidence": "high",
|
||
"specSection": "20 · 布局 Layout",
|
||
"contract": "components/mobile-layout.json",
|
||
"frameworksPrefix": "Layout",
|
||
"files": {
|
||
"css": "Layout.css",
|
||
"html": "Layout.html",
|
||
"jsx": "Layout.jsx",
|
||
"vue2": "Layout.vue2.vue",
|
||
"vue3": "Layout.vue3.vue",
|
||
"uniapp": "Layout.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"gutter",
|
||
"columns",
|
||
"align",
|
||
"wrap"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-link",
|
||
"name": "链接 Link",
|
||
"tier": "mobile",
|
||
"category": "general",
|
||
"confidence": "high",
|
||
"specSection": "21 · 链接 Link",
|
||
"contract": "components/mobile-link.json",
|
||
"frameworksPrefix": "Link",
|
||
"files": {
|
||
"css": "Link.css",
|
||
"html": "Link.html",
|
||
"jsx": "Link.jsx",
|
||
"vue2": "Link.vue2.vue",
|
||
"vue3": "Link.vue3.vue",
|
||
"uniapp": "Link.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"tone",
|
||
"underline",
|
||
"block"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-loading",
|
||
"name": "加载 Loading",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "22 · 加载 Loading",
|
||
"contract": "components/mobile-loading.json",
|
||
"frameworksPrefix": "Loading",
|
||
"files": {
|
||
"css": "Loading.css",
|
||
"html": "Loading.html",
|
||
"jsx": "Loading.jsx",
|
||
"vue2": "Loading.vue2.vue",
|
||
"vue3": "Loading.vue3.vue",
|
||
"uniapp": "Loading.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"size",
|
||
"vertical",
|
||
"fullscreen"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-avatar",
|
||
"name": "头像 Avatar",
|
||
"tier": "mobile",
|
||
"category": "display",
|
||
"confidence": "high",
|
||
"specSection": "23 · 头像 Avatar",
|
||
"contract": "components/mobile-avatar.json",
|
||
"frameworksPrefix": "Avatar",
|
||
"files": {
|
||
"css": "Avatar.css",
|
||
"html": "Avatar.html",
|
||
"jsx": "Avatar.jsx",
|
||
"vue2": "Avatar.vue2.vue",
|
||
"vue3": "Avatar.vue3.vue",
|
||
"uniapp": "Avatar.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"size",
|
||
"shape",
|
||
"type"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-list",
|
||
"name": "列表 List",
|
||
"tier": "mobile",
|
||
"category": "display",
|
||
"confidence": "high",
|
||
"specSection": "24 · 列表 List",
|
||
"contract": "components/mobile-list.json",
|
||
"frameworksPrefix": "List",
|
||
"files": {
|
||
"css": "List.css",
|
||
"html": "List.html",
|
||
"jsx": "List.jsx",
|
||
"vue2": "List.vue2.vue",
|
||
"vue3": "List.vue3.vue",
|
||
"uniapp": "List.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"border",
|
||
"size",
|
||
"divider"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-collapse",
|
||
"name": "折叠面板 Collapse",
|
||
"tier": "mobile",
|
||
"category": "display",
|
||
"confidence": "high",
|
||
"specSection": "25 · 折叠面板 Collapse",
|
||
"contract": "components/mobile-collapse.json",
|
||
"frameworksPrefix": "Collapse",
|
||
"files": {
|
||
"css": "Collapse.css",
|
||
"html": "Collapse.html",
|
||
"jsx": "Collapse.jsx",
|
||
"vue2": "Collapse.vue2.vue",
|
||
"vue3": "Collapse.vue3.vue",
|
||
"uniapp": "Collapse.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"accordion",
|
||
"bordered"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-progress",
|
||
"name": "进度条 Progress",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "26 · 进度条 Progress",
|
||
"contract": "components/mobile-progress.json",
|
||
"frameworksPrefix": "Progress",
|
||
"files": {
|
||
"css": "Progress.css",
|
||
"html": "Progress.html",
|
||
"jsx": "Progress.jsx",
|
||
"vue2": "Progress.vue2.vue",
|
||
"vue3": "Progress.vue3.vue",
|
||
"uniapp": "Progress.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"type",
|
||
"status",
|
||
"labelPlacement"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-input",
|
||
"name": "输入框 Input",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "27 · 输入框 Input",
|
||
"contract": "components/mobile-input.json",
|
||
"frameworksPrefix": "Input",
|
||
"files": {
|
||
"css": "Input.css",
|
||
"html": "Input.html",
|
||
"jsx": "Input.jsx",
|
||
"vue2": "Input.vue2.vue",
|
||
"vue3": "Input.vue3.vue",
|
||
"uniapp": "Input.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"size",
|
||
"clearable"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-search",
|
||
"name": "搜索框 Search",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "28 · 搜索框 Search",
|
||
"contract": "components/mobile-search.json",
|
||
"frameworksPrefix": "Search",
|
||
"files": {
|
||
"css": "Search.css",
|
||
"html": "Search.html",
|
||
"jsx": "Search.jsx",
|
||
"vue2": "Search.vue2.vue",
|
||
"vue3": "Search.vue3.vue",
|
||
"uniapp": "Search.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"round",
|
||
"showCancel"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-stepper",
|
||
"name": "步进器 Stepper",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "30 · 步进器 Stepper",
|
||
"contract": "components/mobile-stepper.json",
|
||
"frameworksPrefix": "Stepper",
|
||
"files": {
|
||
"css": "Stepper.css",
|
||
"html": "Stepper.html",
|
||
"jsx": "Stepper.jsx",
|
||
"vue2": "Stepper.vue2.vue",
|
||
"vue3": "Stepper.vue3.vue",
|
||
"uniapp": "Stepper.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"size",
|
||
"round"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-switch",
|
||
"name": "开关 Switch",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "29 · 开关 Switch",
|
||
"contract": "components/mobile-switch.json",
|
||
"frameworksPrefix": "Switch",
|
||
"files": {
|
||
"css": "Switch.css",
|
||
"html": "Switch.html",
|
||
"jsx": "Switch.jsx",
|
||
"vue2": "Switch.vue2.vue",
|
||
"vue3": "Switch.vue3.vue",
|
||
"uniapp": "Switch.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"size",
|
||
"labelPlacement"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-textarea",
|
||
"name": "多行文本框 Textarea",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "31 · 多行文本框 Textarea",
|
||
"contract": "components/mobile-textarea.json",
|
||
"frameworksPrefix": "Textarea",
|
||
"files": {
|
||
"css": "Textarea.css",
|
||
"html": "Textarea.html",
|
||
"jsx": "Textarea.jsx",
|
||
"vue2": "Textarea.vue2.vue",
|
||
"vue3": "Textarea.vue3.vue",
|
||
"uniapp": "Textarea.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"size",
|
||
"showCounter"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-checkbox",
|
||
"name": "多选框 Checkbox",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "34 · 多选框 Checkbox",
|
||
"contract": "components/mobile-checkbox.json",
|
||
"frameworksPrefix": "Checkbox",
|
||
"files": {
|
||
"css": "Checkbox.css",
|
||
"html": "Checkbox.html",
|
||
"jsx": "Checkbox.jsx",
|
||
"vue2": "Checkbox.vue2.vue",
|
||
"vue3": "Checkbox.vue3.vue",
|
||
"uniapp": "Checkbox.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"orientation",
|
||
"button",
|
||
"selectAll"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-form",
|
||
"name": "表单 Form",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "32 · 表单 Form",
|
||
"contract": "components/mobile-form.json",
|
||
"frameworksPrefix": "Form",
|
||
"files": {
|
||
"css": "Form.css",
|
||
"html": "Form.html",
|
||
"jsx": "Form.jsx",
|
||
"vue2": "Form.vue2.vue",
|
||
"vue3": "Form.vue3.vue",
|
||
"uniapp": "Form.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"labelPosition",
|
||
"borderless"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-radio",
|
||
"name": "单选框 Radio",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "33 · 单选框 Radio",
|
||
"contract": "components/mobile-radio.json",
|
||
"frameworksPrefix": "Radio",
|
||
"files": {
|
||
"css": "Radio.css",
|
||
"html": "Radio.html",
|
||
"jsx": "Radio.jsx",
|
||
"vue2": "Radio.vue2.vue",
|
||
"vue3": "Radio.vue3.vue",
|
||
"uniapp": "Radio.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"orientation",
|
||
"button"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-rate",
|
||
"name": "评分 Rate",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "36 · 评分 Rate",
|
||
"contract": "components/mobile-rate.json",
|
||
"frameworksPrefix": "Rate",
|
||
"files": {
|
||
"css": "Rate.css",
|
||
"html": "Rate.html",
|
||
"jsx": "Rate.jsx",
|
||
"vue2": "Rate.vue2.vue",
|
||
"vue3": "Rate.vue3.vue",
|
||
"uniapp": "Rate.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"size",
|
||
"allowHalf",
|
||
"readonly"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-slider",
|
||
"name": "滑动选择器 Slider",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "35 · 滑动选择器 Slider",
|
||
"contract": "components/mobile-slider.json",
|
||
"frameworksPrefix": "Slider",
|
||
"files": {
|
||
"css": "Slider.css",
|
||
"html": "Slider.html",
|
||
"jsx": "Slider.jsx",
|
||
"vue2": "Slider.vue2.vue",
|
||
"vue3": "Slider.vue3.vue",
|
||
"uniapp": "Slider.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"mode",
|
||
"marks",
|
||
"showValue"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-cascader",
|
||
"name": "级联选择器 Cascader",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "44 · 级联选择器 Cascader",
|
||
"contract": "components/mobile-cascader.json",
|
||
"frameworksPrefix": "Cascader",
|
||
"files": {
|
||
"css": "Cascader.css",
|
||
"html": "Cascader.html",
|
||
"jsx": "Cascader.jsx",
|
||
"vue2": "Cascader.vue2.vue",
|
||
"vue3": "Cascader.vue3.vue",
|
||
"uniapp": "Cascader.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"mode",
|
||
"showPath",
|
||
"round"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-colorpicker",
|
||
"name": "颜色选择器 ColorPicker",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "45 · 颜色选择器 ColorPicker",
|
||
"contract": "components/mobile-colorpicker.json",
|
||
"frameworksPrefix": "ColorPicker",
|
||
"files": {
|
||
"css": "ColorPicker.css",
|
||
"html": "ColorPicker.html",
|
||
"jsx": "ColorPicker.jsx",
|
||
"vue2": "ColorPicker.vue2.vue",
|
||
"vue3": "ColorPicker.vue3.vue",
|
||
"uniapp": "ColorPicker.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"mode",
|
||
"round",
|
||
"showValue"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-message",
|
||
"name": "消息通知 Message",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "42 · 消息通知 Message",
|
||
"contract": "components/mobile-message.json",
|
||
"frameworksPrefix": "Message",
|
||
"files": {
|
||
"css": "Message.css",
|
||
"html": "Message.html",
|
||
"jsx": "Message.jsx",
|
||
"vue2": "Message.vue2.vue",
|
||
"vue3": "Message.vue3.vue",
|
||
"uniapp": "Message.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"tone",
|
||
"closable"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-overlay",
|
||
"name": "遮罩层 Overlay",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "40 · 遮罩层 Overlay",
|
||
"contract": "components/mobile-overlay.json",
|
||
"frameworksPrefix": "Overlay",
|
||
"files": {
|
||
"css": "Overlay.css",
|
||
"html": "Overlay.html",
|
||
"jsx": "Overlay.jsx",
|
||
"vue2": "Overlay.vue2.vue",
|
||
"vue3": "Overlay.vue3.vue",
|
||
"uniapp": "Overlay.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"tone",
|
||
"contained"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-picker",
|
||
"name": "选择器 Picker",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "43 · 选择器 Picker",
|
||
"contract": "components/mobile-picker.json",
|
||
"frameworksPrefix": "Picker",
|
||
"files": {
|
||
"css": "Picker.css",
|
||
"html": "Picker.html",
|
||
"jsx": "Picker.jsx",
|
||
"vue2": "Picker.vue2.vue",
|
||
"vue3": "Picker.vue3.vue",
|
||
"uniapp": "Picker.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"mode",
|
||
"round"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-popover",
|
||
"name": "弹出气泡 Popover",
|
||
"tier": "mobile",
|
||
"category": "feedback",
|
||
"confidence": "high",
|
||
"specSection": "41 · 弹出气泡 Popover",
|
||
"contract": "components/mobile-popover.json",
|
||
"frameworksPrefix": "Popover",
|
||
"files": {
|
||
"css": "Popover.css",
|
||
"html": "Popover.html",
|
||
"jsx": "Popover.jsx",
|
||
"vue2": "Popover.vue2.vue",
|
||
"vue3": "Popover.vue3.vue",
|
||
"uniapp": "Popover.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"placement",
|
||
"arrow"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-segmented",
|
||
"name": "分段器 Segmented",
|
||
"tier": "mobile",
|
||
"category": "navigation",
|
||
"confidence": "high",
|
||
"specSection": "38 · 分段器 Segmented",
|
||
"contract": "components/mobile-segmented.json",
|
||
"frameworksPrefix": "Segmented",
|
||
"files": {
|
||
"css": "Segmented.css",
|
||
"html": "Segmented.html",
|
||
"jsx": "Segmented.jsx",
|
||
"vue2": "Segmented.vue2.vue",
|
||
"vue3": "Segmented.vue3.vue",
|
||
"uniapp": "Segmented.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"size",
|
||
"block"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-sticky",
|
||
"name": "吸顶容器 Sticky",
|
||
"tier": "mobile",
|
||
"category": "navigation",
|
||
"confidence": "high",
|
||
"specSection": "39 · 吸顶容器 Sticky",
|
||
"contract": "components/mobile-sticky.json",
|
||
"frameworksPrefix": "Sticky",
|
||
"files": {
|
||
"css": "Sticky.css",
|
||
"html": "Sticky.html",
|
||
"jsx": "Sticky.jsx",
|
||
"vue2": "Sticky.vue2.vue",
|
||
"vue3": "Sticky.vue3.vue",
|
||
"uniapp": "Sticky.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"position",
|
||
"safeArea",
|
||
"shadow"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-table",
|
||
"name": "表格 Table",
|
||
"tier": "mobile",
|
||
"category": "display",
|
||
"confidence": "high",
|
||
"specSection": "47 · 表格 Table",
|
||
"contract": "components/mobile-table.json",
|
||
"frameworksPrefix": "Table",
|
||
"files": {
|
||
"css": "Table.css",
|
||
"html": "Table.html",
|
||
"jsx": "Table.jsx",
|
||
"vue2": "Table.vue2.vue",
|
||
"vue3": "Table.vue3.vue",
|
||
"uniapp": "Table.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"mode",
|
||
"size",
|
||
"stripe",
|
||
"bordered"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-typography",
|
||
"name": "排版 Typography",
|
||
"tier": "mobile",
|
||
"category": "display",
|
||
"confidence": "high",
|
||
"specSection": "37 · 排版 Typography",
|
||
"contract": "components/mobile-typography.json",
|
||
"frameworksPrefix": "Typography",
|
||
"files": {
|
||
"css": "Typography.css",
|
||
"html": "Typography.html",
|
||
"jsx": "Typography.jsx",
|
||
"vue2": "Typography.vue2.vue",
|
||
"vue3": "Typography.vue3.vue",
|
||
"uniapp": "Typography.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"level",
|
||
"ellipsis",
|
||
"copyable"
|
||
],
|
||
"behaviors": []
|
||
},
|
||
{
|
||
"slug": "mobile-upload",
|
||
"name": "上传 Upload",
|
||
"tier": "mobile",
|
||
"category": "input",
|
||
"confidence": "high",
|
||
"specSection": "46 · 上传 Upload",
|
||
"contract": "components/mobile-upload.json",
|
||
"frameworksPrefix": "Upload",
|
||
"files": {
|
||
"css": "Upload.css",
|
||
"html": "Upload.html",
|
||
"jsx": "Upload.jsx",
|
||
"vue2": "Upload.vue2.vue",
|
||
"vue3": "Upload.vue3.vue",
|
||
"uniapp": "Upload.uniapp.vue"
|
||
},
|
||
"variantDimensions": [
|
||
"variant",
|
||
"maxCount"
|
||
],
|
||
"behaviors": []
|
||
}
|
||
],
|
||
"endLabels": {
|
||
"css": "纯样式(CSS)",
|
||
"html": "H5 原生(无框架)",
|
||
"jsx": "React",
|
||
"vue2": "Vue 2",
|
||
"vue3": "Vue 3",
|
||
"uniapp": "uni-app(跨端:小程序 / App / H5)"
|
||
},
|
||
"uniappTargets": [
|
||
"app-plus",
|
||
"mp-weixin",
|
||
"h5"
|
||
],
|
||
"uniappNotes": "uni-app 端目标三选:app-plus(App)/ mp-weixin(微信小程序)/ h5(浏览器)。移动端组件的 uni-app 实现用 uni 基础组件(view/text)+ rpx + touch 事件;PC 平台另有独立的 uni-app 列,见 .design_library/kole-ui-uniapp/index.json。",
|
||
"categories": {
|
||
"order": [
|
||
"general",
|
||
"navigation",
|
||
"input",
|
||
"display",
|
||
"feedback",
|
||
"system"
|
||
],
|
||
"labels": {
|
||
"general": "通用",
|
||
"navigation": "导航",
|
||
"input": "数据录入",
|
||
"display": "数据展示",
|
||
"feedback": "反馈",
|
||
"system": "工具与系统"
|
||
},
|
||
"note": "分类口径与 PC 端一致(site/app.js 的 CAT_KEYS/CAT_EN 同源),便于两端用同一套 IA 导航。"
|
||
}
|
||
}
|