{ "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- 或状态类 is-", "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 导航。" } }