From 40cd06291b8101ec0470f9b591ab1d0c730ea3b9 Mon Sep 17 00:00:00 2001 From: Bang <15622356989@163.com> Date: Mon, 28 Aug 2023 20:41:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=8A=98=E5=8F=A0?= =?UTF-8?q?=E9=9D=A2=E6=9D=BFcollapse=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opendesign/src/collapse/OCollapse.vue | 46 ++++++++++ .../opendesign/src/collapse/OCollapseItem.vue | 90 +++++++++++++++++++ .../src/collapse/__demo__/CollapseBasic.vue | 30 +++++++ .../src/collapse/__demo__/TheIndex.vue | 10 +++ packages/opendesign/src/collapse/index.ts | 20 +++++ packages/opendesign/src/collapse/provide.ts | 8 ++ .../opendesign/src/collapse/style/index.scss | 2 + .../opendesign/src/collapse/style/index.ts | 2 + .../opendesign/src/collapse/style/media.scss | 3 + .../opendesign/src/collapse/style/style.scss | 53 +++++++++++ .../opendesign/src/collapse/style/var.scss | 13 +++ packages/opendesign/src/collapse/types.ts | 44 +++++++++ packages/opendesign/src/index.scss | 1 + packages/opendesign/src/index.ts | 1 + packages/portal/src/router.ts | 6 ++ 15 files changed, 329 insertions(+) create mode 100644 packages/opendesign/src/collapse/OCollapse.vue create mode 100644 packages/opendesign/src/collapse/OCollapseItem.vue create mode 100644 packages/opendesign/src/collapse/__demo__/CollapseBasic.vue create mode 100644 packages/opendesign/src/collapse/__demo__/TheIndex.vue create mode 100644 packages/opendesign/src/collapse/index.ts create mode 100644 packages/opendesign/src/collapse/provide.ts create mode 100644 packages/opendesign/src/collapse/style/index.scss create mode 100644 packages/opendesign/src/collapse/style/index.ts create mode 100644 packages/opendesign/src/collapse/style/media.scss create mode 100644 packages/opendesign/src/collapse/style/style.scss create mode 100644 packages/opendesign/src/collapse/style/var.scss create mode 100644 packages/opendesign/src/collapse/types.ts diff --git a/packages/opendesign/src/collapse/OCollapse.vue b/packages/opendesign/src/collapse/OCollapse.vue new file mode 100644 index 00000000..39556012 --- /dev/null +++ b/packages/opendesign/src/collapse/OCollapse.vue @@ -0,0 +1,46 @@ + + + diff --git a/packages/opendesign/src/collapse/OCollapseItem.vue b/packages/opendesign/src/collapse/OCollapseItem.vue new file mode 100644 index 00000000..843f4b7c --- /dev/null +++ b/packages/opendesign/src/collapse/OCollapseItem.vue @@ -0,0 +1,90 @@ + + + diff --git a/packages/opendesign/src/collapse/__demo__/CollapseBasic.vue b/packages/opendesign/src/collapse/__demo__/CollapseBasic.vue new file mode 100644 index 00000000..e5b189ad --- /dev/null +++ b/packages/opendesign/src/collapse/__demo__/CollapseBasic.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/packages/opendesign/src/collapse/__demo__/TheIndex.vue b/packages/opendesign/src/collapse/__demo__/TheIndex.vue new file mode 100644 index 00000000..e2f39908 --- /dev/null +++ b/packages/opendesign/src/collapse/__demo__/TheIndex.vue @@ -0,0 +1,10 @@ + + + diff --git a/packages/opendesign/src/collapse/index.ts b/packages/opendesign/src/collapse/index.ts new file mode 100644 index 00000000..545196c4 --- /dev/null +++ b/packages/opendesign/src/collapse/index.ts @@ -0,0 +1,20 @@ +import type { App } from 'vue'; + +import _OCollapse from './OCollapse.vue'; +import _OCollapseItem from './OCollapseItem.vue'; + +export * from './types'; + +const OCollapse = Object.assign(_OCollapse, { + install(app: App) { + app.component(_OCollapse.name, _OCollapse); + }, +}); + +const OCollapseItem = Object.assign(_OCollapseItem, { + install(app: App) { + app.component(_OCollapseItem.name, _OCollapseItem); + }, +}); + +export { OCollapse, OCollapseItem }; diff --git a/packages/opendesign/src/collapse/provide.ts b/packages/opendesign/src/collapse/provide.ts new file mode 100644 index 00000000..396d82cc --- /dev/null +++ b/packages/opendesign/src/collapse/provide.ts @@ -0,0 +1,8 @@ +import { InjectionKey, Ref } from 'vue'; + +export const collapseInjectKey: InjectionKey<{ + realValue: Ref>; + accordion: Ref; + updateModelValue: (val: Array) => void; + onChange: (val: string | number, ev: Event) => void; +}> = Symbol('provide-collapse'); diff --git a/packages/opendesign/src/collapse/style/index.scss b/packages/opendesign/src/collapse/style/index.scss new file mode 100644 index 00000000..504d59c4 --- /dev/null +++ b/packages/opendesign/src/collapse/style/index.scss @@ -0,0 +1,2 @@ +@use './style.scss' as *; +@use './media.scss' as *; diff --git a/packages/opendesign/src/collapse/style/index.ts b/packages/opendesign/src/collapse/style/index.ts new file mode 100644 index 00000000..786fce9c --- /dev/null +++ b/packages/opendesign/src/collapse/style/index.ts @@ -0,0 +1,2 @@ +import '../../_styles'; +import './index.scss'; diff --git a/packages/opendesign/src/collapse/style/media.scss b/packages/opendesign/src/collapse/style/media.scss new file mode 100644 index 00000000..b27842ad --- /dev/null +++ b/packages/opendesign/src/collapse/style/media.scss @@ -0,0 +1,3 @@ +@use '../../_styles/mixin.scss' as *; +@include respond-to('phone-pad') { +} diff --git a/packages/opendesign/src/collapse/style/style.scss b/packages/opendesign/src/collapse/style/style.scss new file mode 100644 index 00000000..38a5c299 --- /dev/null +++ b/packages/opendesign/src/collapse/style/style.scss @@ -0,0 +1,53 @@ +@use '../../_styles/mixin.scss' as *; +@use './var.scss'; + +.o-collapse { + background-color: var(--collapse-bg-color); + padding: var(--collapse-padding); + border-radius: var(--collapse-radius); +} + +.o-collapse-item + .o-collapse-item { + border-top: 1px solid var(--collapse-division-color); +} + +.o-collapse-item-header { + padding: var(--collapse-item-header-padding); + display: flex; + flex-direction: row-reverse; + justify-content: space-between; + cursor: pointer; +} + +.o-collapse-item-title { + margin: 0; + color: var(--o-color-info1); + font-size: var(--o-font_size-h3); + line-height: var(--o-line_height-h3); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.o-collapse-item-icon { + flex-shrink: 0; + color: var(--collapse-item-icon-color); + font-size: var(--collapse-item-icon-size); + transform: rotate(90deg); + transition: transform var(--o-duration-m2) var(--o-easing-standard); +} + +.o-collapse-item-body { + margin-bottom: 24px; + overflow: hidden; + transition: height var(--o-duration-m2) var(--o-easing-standard); +} + +.o-collapse-item-expanded { + .o-collapse-item-title { + font-weight: 500; + } + .o-collapse-item-icon { + transform: rotate(-90deg); + } +} diff --git a/packages/opendesign/src/collapse/style/var.scss b/packages/opendesign/src/collapse/style/var.scss new file mode 100644 index 00000000..801a6a64 --- /dev/null +++ b/packages/opendesign/src/collapse/style/var.scss @@ -0,0 +1,13 @@ +.o-collapse { + --collapse-radius: var(--o-radius_control-l); + --collapse-bg-color: var(--o-color-fill2); + --collapse-padding: 4px 32px; + --collapse-division-color: var(--o-color-control1); +} + +.o-collapse-item { + --collapse-item-header-padding: 24px 0px; + --collapse-item-title-color: var(--o-color-info1); + --collapse-item-icon-color: var(--o-color-info1); + --collapse-item-icon-size: var(--o-icon_size-xs); +} diff --git a/packages/opendesign/src/collapse/types.ts b/packages/opendesign/src/collapse/types.ts new file mode 100644 index 00000000..1c0c8631 --- /dev/null +++ b/packages/opendesign/src/collapse/types.ts @@ -0,0 +1,44 @@ +import { ExtractPropTypes, PropType } from 'vue'; + +export const collapseProps = { + /** + * 是否开启手风琴模式 + */ + accordion: { + type: Boolean, + default: false, + }, + + /** + * 折叠面板双向绑定值 + */ + modelValue: { + type: Array as PropType>, + }, + /** + * 非受控模式时,默认展开的面板值 + */ + defaultValue: { + type: Array as PropType>, + default: () => [], + }, +}; + +export const collapseItemProps = { + /** + * 折叠面板value + */ + value: { + type: [String, Number], + required: true, + }, + /** + * 折叠面板标题 + */ + title: { + type: String, + }, +}; + +export type CollapsePropsT = ExtractPropTypes; +export type CollapseItemPropsT = ExtractPropTypes; diff --git a/packages/opendesign/src/index.scss b/packages/opendesign/src/index.scss index c741aded..f8f90402 100644 --- a/packages/opendesign/src/index.scss +++ b/packages/opendesign/src/index.scss @@ -41,3 +41,4 @@ @use './upload/style/index.scss' as *; @use './toggle/style/index.scss' as *; @use './anchor/style/index.scss' as *; +@use './collapse/style/index.scss' as *; diff --git a/packages/opendesign/src/index.ts b/packages/opendesign/src/index.ts index b4b5f5b6..6e9b3d2e 100644 --- a/packages/opendesign/src/index.ts +++ b/packages/opendesign/src/index.ts @@ -44,6 +44,7 @@ export * from './scroller'; export * from './upload'; export * from './toggle'; export * from './anchor'; +export * from './collapse'; export * from './intersection-observer'; export * from './resize-observer'; diff --git a/packages/portal/src/router.ts b/packages/portal/src/router.ts index a772d41d..e6ec2134 100644 --- a/packages/portal/src/router.ts +++ b/packages/portal/src/router.ts @@ -255,6 +255,12 @@ export const routes = [ label: '锚点 Anchor', component: () => import('@components/anchor/__demo__/TheIndex.vue'), }, + { + path: '/collapse', + name: 'Collapse', + label: '折叠面板 Collapse', + component: () => import('@components/collapse/__demo__/TheIndex.vue'), + }, { path: '/resize-observer', name: 'ResizeObserver', -- Gitee