diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md
index 13ac324..423ca40 100644
--- a/CONTRIBUTION.md
+++ b/CONTRIBUTION.md
@@ -1,4 +1,4 @@
-### 安装pnpm
+### 安装 pnpm
```shell
npm i pnpm -g
@@ -6,7 +6,7 @@ npm i pnpm -g
### 构建依赖
-node版本v16+
+node 版本 v16+
```shell
pnpm bootstrap
@@ -25,40 +25,12 @@ pnpm dev
#### checklist
-- 组件example效果和vue3版本一致
-- 组件example暗黑模式正常
-- 组件example国际化正常
-- 组件单元测试所有case通过
-- 组件types类型声明完成
-- 组件文档适配Vue2写法
-
-#### 单元测试
-
-```shell
-npm i -g yarn
-```
-
-```shell
-yarn test -w -c skeleton
-```
-
-- props -> propsData
-- unmount -> destroy
-- slots -> scopedSlots(注意:参数default属性值直接为字符串)
-
-#### 提交项目
-
-```shell
-git add .
-```
-
-```shell
-git commit -m "feat: add component 这里写组件名称" or git commit -m "feat(ui/这里写组件名称): add component 这里写组件名称"
-```
-
-```shell
-git push -u
-```
+- 组件 example 效果和 vue3 版本一致
+- 组件 example 暗黑模式正常
+- 组件 example 国际化正常
+- 组件单元测试所有 case 通过
+- 组件 types 类型声明完成
+- 组件文档适配 Vue2 写法
#### Todolist
@@ -69,4 +41,4 @@ git push -u
- chip
- image
- badge
-- skeleton
\ No newline at end of file
+- skeleton
diff --git a/packages/varlet-vue2-ui/src/button/docs/en-US.md b/packages/varlet-vue2-ui/src/button/docs/en-US.md
index 7e4b244..050f525 100644
--- a/packages/varlet-vue2-ui/src/button/docs/en-US.md
+++ b/packages/varlet-vue2-ui/src/button/docs/en-US.md
@@ -4,7 +4,7 @@
```js
import Vue from 'vue'
-import { Button } from '@varlet/ui'
+import { Button } from '@varlet-vue2/ui'
Vue.use(Button)
```
diff --git a/packages/varlet-vue2-ui/src/button/example/index.vue b/packages/varlet-vue2-ui/src/button/example/index.vue
index 92a33db..210706c 100644
--- a/packages/varlet-vue2-ui/src/button/example/index.vue
+++ b/packages/varlet-vue2-ui/src/button/example/index.vue
@@ -73,6 +73,8 @@ import { pack, use } from './locale'
import { watchLang, watchPlatform, watchDarkMode } from '@varlet-vue2/cli/site/utils'
export default {
+ name: 'ButtonExample',
+
components: {
VarButton,
VarIcon,
diff --git a/packages/varlet-vue2-ui/src/cell/Cell.vue b/packages/varlet-vue2-ui/src/cell/Cell.vue
new file mode 100644
index 0000000..a525cac
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/Cell.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+ {{ desc }}
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/varlet-vue2-ui/src/cell/__test__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/cell/__test__/__snapshots__/index.spec.js.snap
new file mode 100644
index 0000000..c11eb21
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/__test__/__snapshots__/index.spec.js.snap
@@ -0,0 +1,91 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`test cell example 1`] = `
+"
+
+
+"
+`;
+
+exports[`test cell props 1`] = `
+"
+
+
+
This is Cell
+
This is desc
+
+
+
"
+`;
diff --git a/packages/varlet-vue2-ui/src/cell/__test__/index.spec.js b/packages/varlet-vue2-ui/src/cell/__test__/index.spec.js
new file mode 100644
index 0000000..da68104
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/__test__/index.spec.js
@@ -0,0 +1,42 @@
+import example from '../example'
+import Vue from 'vue'
+import Cell from '..'
+import VarCell from '../Cell'
+import { mount } from '@vue/test-utils'
+
+test('test cell example', () => {
+ const wrapper = mount(example)
+ expect(wrapper.html()).toMatchSnapshot()
+ wrapper.destroy()
+})
+
+test('test cell plugin', () => {
+ Vue.use(Cell)
+ expect(Vue.component(Cell.name)).toBeTruthy()
+})
+
+test('test cell props', async () => {
+ const wrapper = mount(VarCell, {
+ propsData: {
+ title: 'This is Cell',
+ desc: 'This is desc',
+ border: true,
+ iconClass: 'test-icon-class',
+ titleClass: 'test-title-class',
+ descClass: 'test-desc-class',
+ extraClass: 'test-extra-class',
+ icon: 'fire',
+ },
+ scopedSlots: {
+ extra: 'text',
+ },
+ })
+ expect(wrapper.find('.var-icon').exists()).toBe(true)
+ expect(wrapper.find('.var-icon').classes('var-icon-fire')).toBe(true)
+ expect(wrapper.classes('var-cell--border')).toBe(true)
+ expect(wrapper.find('.var-cell__title').text()).toBe('This is Cell')
+ expect(wrapper.find('.var-cell__desc').text()).toBe('This is desc')
+ expect(wrapper.find('.test-extra-class').text()).toBe('text')
+ expect(wrapper.html()).toMatchSnapshot()
+ wrapper.destroy()
+})
diff --git a/packages/varlet-vue2-ui/src/cell/cell.less b/packages/varlet-vue2-ui/src/cell/cell.less
new file mode 100644
index 0000000..1bb819c
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/cell.less
@@ -0,0 +1,74 @@
+@cell-font-size: var(--font-size-md);
+@cell-desc-font-size: var(--font-size-sm);
+@cell-desc-color: rgba(0, 0, 0, 0.6);
+@cell-padding: 10px 12px;
+@cell-min-height: 40px;
+@cell-border-color: #bcc2cb;
+@cell-border-left: 12px;
+@cell-border-right: 12px;
+@cell-icon-right: 8px;
+@cell-extra-left: 8px;
+
+:root {
+ --cell-font-size: @cell-font-size;
+ --cell-desc-font-size: @cell-desc-font-size;
+ --cell-desc-color: @cell-desc-color;
+ --cell-padding: @cell-padding;
+ --cell-min-height: @cell-min-height;
+ --cell-border-color: @cell-border-color;
+ --cell-border-left: @cell-border-left;
+ --cell-border-right: @cell-border-right;
+ --cell-icon-right: @cell-icon-right;
+ --cell-extra-left: @cell-extra-left;
+}
+
+.var-cell {
+ align-items: center;
+ display: flex;
+ min-height: var(--cell-min-height);
+ outline: none;
+ padding: var(--cell-padding);
+ position: relative;
+ box-sizing: border-box;
+ font-size: var(--cell-font-size);
+
+ &--border {
+ &::after {
+ position: absolute;
+ box-sizing: border-box;
+ content: ' ';
+ pointer-events: none;
+ right: var(--cell-border-right);
+ bottom: 0;
+ left: var(--cell-border-left);
+ border-bottom: 1px solid var(--cell-border-color);
+ transform: scaleY(0.5);
+ }
+ }
+
+ &__icon {
+ margin-right: var(--cell-icon-right);
+ flex: 0;
+ }
+
+ &__content {
+ flex: 1;
+ overflow: hidden;
+ }
+
+ &__title {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ &__desc {
+ font-size: var(--cell-desc-font-size);
+ color: var(--cell-desc-color);
+ }
+
+ &__extra {
+ flex: 0;
+ margin-left: var(--cell-extra-left);
+ }
+}
diff --git a/packages/varlet-vue2-ui/src/cell/docs/en-US.md b/packages/varlet-vue2-ui/src/cell/docs/en-US.md
new file mode 100644
index 0000000..c194195
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/docs/en-US.md
@@ -0,0 +1,80 @@
+# Cell
+
+### Intro
+
+The cell is a single display item in the list.
+
+### Install
+
+```js
+import Vue from 'vue'
+import { Cell } from '@varlet-vue2/ui'
+
+Vue.use(Cell)
+```
+
+### Basic Usage
+
+```html
+ This is Cell
+```
+
+### Show Icon
+```html
+
+
+
+
+
+```
+
+### Show Description
+```html
+
+```
+
+### Show Border
+```html
+ This is Cell
+```
+
+## API
+
+### Props
+
+| Prop | Description | Type | Default |
+| ----- | -------------- | -------- | ---------- |
+| `title` | Title | _string \| number_ | `-` |
+| `icon` | Icon name | _string_ | `-` |
+| `desc` | Description | _string_ | `-` |
+| `border` | Whether to show border | _boolean_ | `false` |
+| `icon-class` | Icon className | _string_ | `-` |
+| `title-class` | Title className | _string_ | `-` |
+| `desc-class` | Description className | _string_ | `-` |
+| `extra-class` | Extra className | _string_ | `-` |
+
+### Slots
+
+| Name | Description | SlotProps |
+| ----- | -------------- | -------- |
+| `default` | Content of cell | `-` |
+| `icon` | Icon of cell | `-` |
+| `desc` | Description of cell | `-` |
+| `extra` | Extra of cell | `-` |
+
+### Style Variables
+Here are the CSS variables used by the component, Styles can be customized using [StyleProvider](#/en-US/style-provider)
+
+| Variable | Default |
+| --- | --- |
+| `--cell-font-size` | `var(--font-size-md)` |
+| `--cell-desc-font-size` | `var(--font-size-sm)` |
+| `--cell-desc-color` | `rgba(0, 0, 0, 0.6)` |
+| `--cell-padding` | `10px 12px` |
+| `--cell-min-height` | `40px` |
+| `--cell-border-color` | `#bcc2cb` |
+| `--cell-border-left` | `12px` |
+| `--cell-border-right` | `12px` |
+| `--cell-icon-right` | `8px` |
+| `--cell-extra-left` | `8px` |
+
diff --git a/packages/varlet-vue2-ui/src/cell/docs/zh-CN.md b/packages/varlet-vue2-ui/src/cell/docs/zh-CN.md
new file mode 100644
index 0000000..3a04da1
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/docs/zh-CN.md
@@ -0,0 +1,79 @@
+# 单元格
+
+### 介绍
+
+单元格为列表中的单个展示项。
+
+### 引入
+
+```js
+import Vue from 'vue'
+import { Cell } from '@varlet-vue2/ui'
+
+Vue.use(Cell)
+```
+
+### 基本使用
+
+```html
+ 这是单元格
+```
+
+### 显示图标
+```html
+
+
+
+
+
+```
+
+### 显示描述
+```html
+
+```
+
+### 显示边框
+```html
+ 这是单元格
+```
+
+## API
+
+### 属性
+
+| 参数 | 说明 | 类型 | 默认值 |
+| ----- | -------------- | -------- | ---------- |
+| `title` | 单元格标题 | _string \| number_ | `-` |
+| `icon` | 左侧图标名称 | _string_ | `-` |
+| `desc` | 单元格描述 | _string_ | `-` |
+| `border` | 是否显示边框 | _boolean_ | `false` |
+| `icon-class` | 图标额外类名 | _string_ | `-` |
+| `title-class` | 标题额外类名 | _string_ | `-` |
+| `desc-class` | 描述额外类名 | _string_ | `-` |
+| `extra-class` | 右侧内容额外类名 | _string_ | `-` |
+
+### 插槽
+
+| 名称 | 说明 | 参数 |
+| ----- | -------------- | -------- |
+| `default` | cell 的内容 | `-` |
+| `icon` | 自定义左侧 icon 区域 | `-` |
+| `desc` | 描述的内容 | `-` |
+| `extra` | 自定义右侧区域内容 | `-` |
+
+### 样式变量
+以下为组件使用的 css 变量,可以使用 [StyleProvider 组件](#/zh-CN/style-provider)进行样式定制。
+
+| 变量名 | 默认值 |
+| --- | --- |
+| `--cell-font-size` | `var(--font-size-md)` |
+| `--cell-desc-font-size` | `var(--font-size-sm)` |
+| `--cell-desc-color` | `rgba(0, 0, 0, 0.6)` |
+| `--cell-padding` | `10px 12px` |
+| `--cell-min-height` | `40px` |
+| `--cell-border-color` | `#bcc2cb` |
+| `--cell-border-left` | `12px` |
+| `--cell-border-right` | `12px` |
+| `--cell-icon-right` | `8px` |
+| `--cell-extra-left` | `8px` |
diff --git a/packages/varlet-vue2-ui/src/cell/example/index.vue b/packages/varlet-vue2-ui/src/cell/example/index.vue
new file mode 100644
index 0000000..8a3153c
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/example/index.vue
@@ -0,0 +1,66 @@
+
+
+
+
{{ pack.basicUsage }}
+
{{ pack.content }}
+
{{ pack.content }}
+
+
+
{{ pack.showIcon }}
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ pack.showDesc }}
+
+
+
+
+
+
+
+
+
{{ pack.showBorder }}
+
{{ pack.content }}
+
{{ pack.content }}
+
+
+
+
+
diff --git a/packages/varlet-vue2-ui/src/cell/example/locale/en-US.ts b/packages/varlet-vue2-ui/src/cell/example/locale/en-US.ts
new file mode 100644
index 0000000..5748d6a
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/example/locale/en-US.ts
@@ -0,0 +1,8 @@
+export default {
+ basicUsage: 'Basic Usage',
+ showIcon: 'Show Icon',
+ showDesc: 'Show Description',
+ showBorder: 'Show Border',
+ content: 'This is Cell',
+ description: 'Description',
+}
diff --git a/packages/varlet-vue2-ui/src/cell/example/locale/index.ts b/packages/varlet-vue2-ui/src/cell/example/locale/index.ts
new file mode 100644
index 0000000..d2e375e
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/example/locale/index.ts
@@ -0,0 +1,23 @@
+// lib
+import _zhCN from '../../../locale/zh-CN'
+import _enCN from '../../../locale/en-US'
+// mobile example doc
+import zhCN from './zh-CN'
+import enUS from './en-US'
+import { useLocale, add as _add, use as _use } from '../../../locale'
+
+const { add, use: exampleUse, pack, packs, merge } = useLocale()
+
+const use = (lang: string) => {
+ _use(lang)
+ exampleUse(lang)
+}
+
+export { add, pack, packs, merge, use }
+
+// lib
+_add('zh-CN', _zhCN)
+_add('en-US', _enCN)
+// mobile example doc
+add('zh-CN', zhCN as any)
+add('en-US', enUS as any)
diff --git a/packages/varlet-vue2-ui/src/cell/example/locale/zh-CN.ts b/packages/varlet-vue2-ui/src/cell/example/locale/zh-CN.ts
new file mode 100644
index 0000000..5f710ee
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/example/locale/zh-CN.ts
@@ -0,0 +1,8 @@
+export default {
+ basicUsage: '基本使用',
+ showIcon: '显示图标',
+ showDesc: '显示描述',
+ showBorder: '显示边框',
+ content: '这是单元格',
+ description: '描述',
+}
diff --git a/packages/varlet-vue2-ui/src/cell/index.ts b/packages/varlet-vue2-ui/src/cell/index.ts
new file mode 100644
index 0000000..66b5b32
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/index.ts
@@ -0,0 +1,10 @@
+import type { VueConstructor } from 'vue'
+import Cell from './Cell.vue'
+
+Cell.install = function (app: VueConstructor) {
+ app.component(Cell.name, Cell)
+}
+
+export const _CellComponent = Cell
+
+export default Cell
diff --git a/packages/varlet-vue2-ui/src/cell/props.ts b/packages/varlet-vue2-ui/src/cell/props.ts
new file mode 100644
index 0000000..68e25ee
--- /dev/null
+++ b/packages/varlet-vue2-ui/src/cell/props.ts
@@ -0,0 +1,27 @@
+export const props = {
+ title: {
+ type: [Number, String],
+ },
+ icon: {
+ type: String,
+ },
+ desc: {
+ type: String,
+ },
+ border: {
+ type: Boolean,
+ default: false,
+ },
+ iconClass: {
+ type: String,
+ },
+ titleClass: {
+ type: String,
+ },
+ descClass: {
+ type: String,
+ },
+ extraClass: {
+ type: String,
+ },
+}
diff --git a/packages/varlet-vue2-ui/src/skeleton/docs/en-US.md b/packages/varlet-vue2-ui/src/skeleton/docs/en-US.md
index 307e43d..48a05e3 100644
--- a/packages/varlet-vue2-ui/src/skeleton/docs/en-US.md
+++ b/packages/varlet-vue2-ui/src/skeleton/docs/en-US.md
@@ -63,7 +63,6 @@ export default {
data: () => ({
loading: false
}),
-
methods: {
fullscreen() {
this.loading = true
diff --git a/packages/varlet-vue2-ui/src/skeleton/docs/zh-CN.md b/packages/varlet-vue2-ui/src/skeleton/docs/zh-CN.md
index cd37f0c..b2bc4ab 100644
--- a/packages/varlet-vue2-ui/src/skeleton/docs/zh-CN.md
+++ b/packages/varlet-vue2-ui/src/skeleton/docs/zh-CN.md
@@ -62,7 +62,6 @@ export default {
data: () => ({
loading: false,
}),
-
methods: {
fullscreen() {
this.loading = true
diff --git a/packages/varlet-vue2-ui/src/skeleton/example/index.vue b/packages/varlet-vue2-ui/src/skeleton/example/index.vue
index 84c776c..a049893 100644
--- a/packages/varlet-vue2-ui/src/skeleton/example/index.vue
+++ b/packages/varlet-vue2-ui/src/skeleton/example/index.vue
@@ -39,11 +39,13 @@ import { use, pack } from './locale'
export default {
name: 'SkeletonExample',
+
components: {
VarSkeleton,
VarButton,
AppType,
},
+
data() {
return {
loading: true,
diff --git a/packages/varlet-vue2-ui/types/cell.d.ts b/packages/varlet-vue2-ui/types/cell.d.ts
new file mode 100644
index 0000000..c551166
--- /dev/null
+++ b/packages/varlet-vue2-ui/types/cell.d.ts
@@ -0,0 +1,18 @@
+import { VarComponent } from './varComponent'
+
+export interface CellProps {
+ title?: string | number;
+ icon?: string;
+ desc?: string;
+ border?: boolean;
+ iconClass?: string;
+ titleClass?: string;
+ descClass?: string;
+ extraClass?: string;
+}
+
+export class Cell extends VarComponent {
+ $props: CellProps
+}
+
+export class _CellComponent extends Cell {}