Skip to content

Commit b2941b6

Browse files
committed
✨ [collapse] add collapse component
1 parent a4dd0e7 commit b2941b6

File tree

26 files changed

+536
-2
lines changed

26 files changed

+536
-2
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* @description collapse api
3+
* @author 阿怪
4+
* @date 2025/02/17 20:52
5+
* @version v1.0.0
6+
*
7+
* 江湖的业务千篇一律,复杂的代码好几百行。
8+
*/
9+
10+
import { MCOPO } from '../../types/props';
11+
import { CollapseProps } from './props';
12+
13+
export const props: MCOPO<CollapseProps> = {
14+
modelValue: { type: Boolean, default: false },
15+
disabled: { type: Boolean, default: false },
16+
renderContext: { type: Boolean, default: false },
17+
line: { type: Boolean, default: true }
18+
};
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
.m-collapse {
2+
display: flex;
3+
flex-direction: column;
4+
width: 100%;
5+
}
6+
7+
.m-collapse-disabled {
8+
cursor: var(--m-cursor-disabled);
9+
--m-cursor-auto: var(--m-cursor-disabled);
10+
11+
.m-collapse-header{
12+
cursor: var(--m-cursor-disabled);
13+
--m-cursor-auto: var(--m-cursor-disabled);
14+
opacity: 0.3;
15+
}
16+
17+
}
18+
19+
.m-collapse-header {
20+
display: flex;
21+
align-items: center;
22+
justify-content: space-between;
23+
width: 100%;
24+
25+
cursor: var(--m-cursor-pointer);
26+
--m-cursor-auto: var(--m-cursor-pointer);
27+
28+
.m-divider {
29+
margin-left: 0.5rem;
30+
flex:1;
31+
}
32+
33+
.m-collapse-arrow{
34+
margin:0 0.5rem;
35+
transition: transform 0.3s ease-in-out;
36+
}
37+
38+
}
39+
40+
41+
.m-collapse-content-hidden {
42+
display: none;
43+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* @description collapse index
3+
* @author 阿怪
4+
* @date 2025/02/17 20:52
5+
* @version v1.0.0
6+
*
7+
* 江湖的业务千篇一律,复杂的代码好几百行。
8+
*/
9+
10+
import { props } from './api';
11+
import { useCollapse, collapseOptions } from './useCollapse.tsx';
12+
13+
export const CollapseCore = {
14+
props,
15+
useCollapse,
16+
collapseOptions
17+
};
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* @description collapse api type
3+
* @author 阿怪
4+
* @date 2025/02/17 20:52
5+
* @version v1.0.0
6+
*
7+
* @name m-collapse
8+
* @docDescription Collapse component with shuimo-ui style.
9+
* 水墨组件的折叠组件。
10+
* @docUrl https://shuimo.design/collapse
11+
*
12+
* 江湖的业务千篇一律,复杂的代码好几百行。
13+
*/
14+
15+
export declare type CollapseProps = {
16+
/**
17+
* @description collapse modelValue. 折叠展开状态
18+
* @type boolean
19+
* @default false
20+
*/
21+
modelValue?: boolean;
22+
/**
23+
* @description collapse disabled. 是否禁用
24+
* @type boolean
25+
* @default false
26+
*/
27+
disabled?: boolean;
28+
/**
29+
* @description collapse renderContext. 是否渲染上下文
30+
* @type boolean
31+
* @default false
32+
*/
33+
renderContext?: boolean;
34+
/**
35+
* @description collapse line. 是否显示分割线
36+
* @type boolean
37+
* @default true
38+
*/
39+
line?: boolean;
40+
};
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/**
2+
* @description collapse hook
3+
* @author 阿怪
4+
* @date 2025/02/17 20:52
5+
* @version v1.0.0
6+
*
7+
* 江湖的业务千篇一律,复杂的代码好几百行。
8+
*/
9+
10+
import { defineHook } from '../../../runtime/defineHook';
11+
import { props } from './api';
12+
import { CollapseProps } from './props';
13+
import { ref, watch } from 'vue';
14+
15+
export const collapseOptions = {
16+
name: 'MCollapse',
17+
props,
18+
emits: ['update:modelValue', 'change']
19+
};
20+
21+
export const useCollapse = defineHook((props: Required<CollapseProps>, ctx) => {
22+
const innerValue = ref(props.modelValue);
23+
24+
watch(() => props.modelValue, (val) => {
25+
innerValue.value = val;
26+
});
27+
28+
const toggle = () => {
29+
if (props.disabled) return;
30+
const newValue = !innerValue.value;
31+
innerValue.value = newValue;
32+
ctx.emit('update:modelValue', newValue);
33+
ctx.emit('change', newValue);
34+
};
35+
36+
const renderInit = () => {
37+
const collapseClass = [
38+
'm-collapse',
39+
{
40+
'm-collapse-disabled': props.disabled,
41+
'm-collapse-arrow-expanded': innerValue.value
42+
}
43+
]
44+
45+
const context = props.renderContext ? (
46+
<div class={['m-collapse-content', { 'm-collapse-content-hidden': !innerValue.value }]}>
47+
{ctx.slots.content?.()}
48+
</div>
49+
) : innerValue.value ? (
50+
<div class="m-collapse-content">
51+
{ctx.slots.content?.()}
52+
</div>
53+
) : null;
54+
55+
return {
56+
collapseClass,
57+
context,
58+
}
59+
}
60+
61+
return {
62+
toggle,
63+
renderInit
64+
};
65+
}, collapseOptions);

core/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export * from './components/base/button';
1515
export * from './components/base/checkbox';
1616
export * from './components/base/switch';
1717
export * from './components/base/li';
18+
export * from './components/base/collapse';
1819

1920
export * from './components/other/loading';
2021
export * from './components/other/divider';

doc/config/menu.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export const menu: MenuTypeArr = [
3131
{ label: '标签', route: 'tag', isActive: false },
3232
{ label: '滑动条', route: 'slider', isActive: false },
3333
{ label: '进度条', route: 'progress', isActive: false },
34+
{ label: '折叠', route: 'collapse', isActive: false },
3435
],
3536
},
3637
{
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<template>
2+
<m-collapse>
3+
欲卷珠帘春恨长
4+
<template #content>
5+
却下水晶帘,玲珑望秋月
6+
</template>
7+
</m-collapse>
8+
</template>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<template>
2+
<m-collapse disabled>
3+
众里寻他千百度
4+
<template #content>
5+
蓦然回首,那人却在灯火阑珊处
6+
</template>
7+
</m-collapse>
8+
</template>

doc/demos/base/collapse/event.vue

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<template>
2+
<m-collapse v-model="isOpen" @change="handleChange">
3+
庭院深深深几许
4+
<template #content>
5+
乱红飞过秋千去
6+
</template>
7+
</m-collapse>
8+
</template>
9+
10+
<script setup lang="ts">
11+
import { ref } from 'vue';
12+
13+
const isOpen = ref(false);
14+
15+
const handleChange = (value: boolean) => {
16+
console.log('折叠面板状态改变:', value);
17+
};
18+
</script>

0 commit comments

Comments
 (0)