From 3e74856500fde16bf2a3db23915ea91659a85a9b Mon Sep 17 00:00:00 2001 From: devin Date: Tue, 14 Mar 2023 15:24:26 +0800 Subject: [PATCH 1/6] up version --- packages/portal/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/portal/package.json b/packages/portal/package.json index 8f044f614..164223504 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -9,7 +9,7 @@ "preview": "vite preview" }, "dependencies": { - "@opensig/opendesign": "workspace:^0.0.1", + "@opensig/opendesign": "workspace:^0.0.4", "normalize.css": "^8.0.1", "vue": "^3.2.41", "vue-router": "^4.1.6" @@ -21,4 +21,4 @@ "vite": "^3.2.3", "vue-tsc": "^1.0.13" } -} \ No newline at end of file +} -- Gitee From acec4e5d2ab3f0828c22fc085fc0b4a209b54f44 Mon Sep 17 00:00:00 2001 From: devin Date: Tue, 14 Mar 2023 17:01:35 +0800 Subject: [PATCH 2/6] add dialog --- .../src/components/dialog/ODialog.vue | 69 +++++++++++++++++++ .../dialog/__demo__/DialogBasic.vue | 42 +++++++++++ .../dialog/__demo__/IndexDialog.vue | 10 +++ .../opendesign/src/components/dialog/index.ts | 12 ++++ .../src/components/dialog/style/index.scss | 59 ++++++++++++++++ .../src/components/dialog/style/index.ts | 2 + .../src/components/dialog/style/var.scss | 9 +++ .../opendesign/src/components/dialog/types.ts | 46 +++++++++++++ packages/opendesign/src/components/index.scss | 1 + packages/opendesign/src/components/index.ts | 1 + .../src/components/popup/style/index.scss | 2 +- .../src/components/popup/style/var.scss | 3 + .../src/components/style/index.scss | 4 ++ packages/portal/src/router.ts | 6 ++ 14 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 packages/opendesign/src/components/dialog/ODialog.vue create mode 100644 packages/opendesign/src/components/dialog/__demo__/DialogBasic.vue create mode 100644 packages/opendesign/src/components/dialog/__demo__/IndexDialog.vue create mode 100644 packages/opendesign/src/components/dialog/index.ts create mode 100644 packages/opendesign/src/components/dialog/style/index.scss create mode 100644 packages/opendesign/src/components/dialog/style/index.ts create mode 100644 packages/opendesign/src/components/dialog/style/var.scss create mode 100644 packages/opendesign/src/components/dialog/types.ts diff --git a/packages/opendesign/src/components/dialog/ODialog.vue b/packages/opendesign/src/components/dialog/ODialog.vue new file mode 100644 index 000000000..4a59cdb82 --- /dev/null +++ b/packages/opendesign/src/components/dialog/ODialog.vue @@ -0,0 +1,69 @@ + + diff --git a/packages/opendesign/src/components/dialog/__demo__/DialogBasic.vue b/packages/opendesign/src/components/dialog/__demo__/DialogBasic.vue new file mode 100644 index 000000000..d7c175e93 --- /dev/null +++ b/packages/opendesign/src/components/dialog/__demo__/DialogBasic.vue @@ -0,0 +1,42 @@ + + + diff --git a/packages/opendesign/src/components/dialog/__demo__/IndexDialog.vue b/packages/opendesign/src/components/dialog/__demo__/IndexDialog.vue new file mode 100644 index 000000000..d90af5c2b --- /dev/null +++ b/packages/opendesign/src/components/dialog/__demo__/IndexDialog.vue @@ -0,0 +1,10 @@ + + + diff --git a/packages/opendesign/src/components/dialog/index.ts b/packages/opendesign/src/components/dialog/index.ts new file mode 100644 index 000000000..4050065fb --- /dev/null +++ b/packages/opendesign/src/components/dialog/index.ts @@ -0,0 +1,12 @@ +import _ODialog from './ODialog.vue'; +import type { App } from 'vue'; + +const ODialog = Object.assign(_ODialog, { + install(app: App) { + app.component(_ODialog.name, _ODialog); + }, +}); + +export { + ODialog, +}; diff --git a/packages/opendesign/src/components/dialog/style/index.scss b/packages/opendesign/src/components/dialog/style/index.scss new file mode 100644 index 000000000..2dd431028 --- /dev/null +++ b/packages/opendesign/src/components/dialog/style/index.scss @@ -0,0 +1,59 @@ +@use './var.scss'; + +.o-dialog { + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + align-items: center; + justify-content: center; + z-index: var(--dlg-z-index); + display: none; + &.is-show { + display: flex; + } +} +.o-dlg-mask { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + background-color: var(--o-color-mask1); +} +.o-dlg-main { + position: relative; + background-color: var(--o-color-control-light); + min-width: 200px; + box-shadow: var(--o-shadow-1); +} + +.o-dlg-btn-close { + position: absolute; + right: var(--o-gap-3); + top: var(--o-gap-3); + font-size: var(--o-icon_size-s); + color: var(--dlg-close-color); + border-radius: var(--dlg-close-radius); + display: flex; + &:hover { + text-decoration: none; + color: var(--dlg-close-color-hover); + background-color: var(--dlg-close-bg-color-hover); + } + &:active { + color: var(--dlg-close-color-active); + background-color: var(--dlg-close-bg-color-active); + } +} + +.o-dlg-head { + padding: 8px 16px; +} +.o-dlg-body { + padding: 8px 16px; +} +.o-dlg-foot { + padding: 8px 16px; +} diff --git a/packages/opendesign/src/components/dialog/style/index.ts b/packages/opendesign/src/components/dialog/style/index.ts new file mode 100644 index 000000000..591b2fbd7 --- /dev/null +++ b/packages/opendesign/src/components/dialog/style/index.ts @@ -0,0 +1,2 @@ +import '../../style'; +import './index.scss'; diff --git a/packages/opendesign/src/components/dialog/style/var.scss b/packages/opendesign/src/components/dialog/style/var.scss new file mode 100644 index 000000000..664c3d71e --- /dev/null +++ b/packages/opendesign/src/components/dialog/style/var.scss @@ -0,0 +1,9 @@ +.o-dialog { + --dlg-close-color: var(--o-color-info2); + --dlg-close-color-hover: var(--o-color-primary2); + --dlg-close-color-active: var(--o-color-primary3); + --dlg-close-bg-color-hover: var(--o-color-control1-light); + --dlg-close-bg-color-active: var(--o-color-control2-light); + --dlg-close-radius: 50%; + --dlg-z-index: calc(var(--o-z-index-base) + 10); +} diff --git a/packages/opendesign/src/components/dialog/types.ts b/packages/opendesign/src/components/dialog/types.ts new file mode 100644 index 000000000..487360b54 --- /dev/null +++ b/packages/opendesign/src/components/dialog/types.ts @@ -0,0 +1,46 @@ +import { ExtractPropTypes, PropType } from 'vue'; + +export const dialogProps = { + /** + * 控制对话框是否显示 + */ + modelValue: { + type: Boolean, + }, + /** + * 挂载容器,默认为body + */ + wrapper: { + type: [String, Object] as PropType, + default: 'body', + }, + /** + * 是否隐藏可以关闭 + */ + hideClose: { + type: Boolean, + }, + /** + * 是否在popup隐藏时unmout + */ + unmountOnHide: { + type: Boolean, + default: true, + }, + /** + * 挂载容器,默认为body + */ + wrapClass: { + type: String, + }, + /** + * 过渡名称 + */ + transition: { + type: String, + default: 'o-zoom-fade', + }, + +}; + +export type DialogPropsT = ExtractPropTypes; diff --git a/packages/opendesign/src/components/index.scss b/packages/opendesign/src/components/index.scss index c7ffbf783..98be40f87 100644 --- a/packages/opendesign/src/components/index.scss +++ b/packages/opendesign/src/components/index.scss @@ -24,3 +24,4 @@ @use './form/style//index.scss' as *; @use './menu/style//index.scss' as *; @use './breadcrumb/style//index.scss' as *; +@use './dialog/style//index.scss' as *; diff --git a/packages/opendesign/src/components/index.ts b/packages/opendesign/src/components/index.ts index c3df0fb14..d5aeec58b 100644 --- a/packages/opendesign/src/components/index.ts +++ b/packages/opendesign/src/components/index.ts @@ -28,6 +28,7 @@ export * from './menu'; export * from './breadcrumb'; // export * from './dropdown'; // export * from './scrollbar'; +export * from './dialog'; export * from './intersection-observer'; export * from './resize-observer'; diff --git a/packages/opendesign/src/components/popup/style/index.scss b/packages/opendesign/src/components/popup/style/index.scss index dcb74c0fe..6d58d2919 100644 --- a/packages/opendesign/src/components/popup/style/index.scss +++ b/packages/opendesign/src/components/popup/style/index.scss @@ -2,7 +2,7 @@ .o-popup { position: absolute; - z-index: 100; + z-index: var(--popup-z-index); opacity: 1; transition: opacity var(--o-duration-m1) var(--o-easing-standard); &.out-view { diff --git a/packages/opendesign/src/components/popup/style/var.scss b/packages/opendesign/src/components/popup/style/var.scss index e69de29bb..dc25e3cc3 100644 --- a/packages/opendesign/src/components/popup/style/var.scss +++ b/packages/opendesign/src/components/popup/style/var.scss @@ -0,0 +1,3 @@ +.o-popup { + --popup-z-index: var(--o-z-index-base); +} diff --git a/packages/opendesign/src/components/style/index.scss b/packages/opendesign/src/components/style/index.scss index 910d07e82..8fa3561de 100644 --- a/packages/opendesign/src/components/style/index.scss +++ b/packages/opendesign/src/components/style/index.scss @@ -5,6 +5,10 @@ box-sizing: border-box; } +:root { + --o-z-index-base: 100; +} + // icons .o-icon { --icon-g1: var(--o-color-text1); diff --git a/packages/portal/src/router.ts b/packages/portal/src/router.ts index af82290c4..946fe5815 100644 --- a/packages/portal/src/router.ts +++ b/packages/portal/src/router.ts @@ -146,6 +146,12 @@ export const routes = [ label: '进度条', component: () => import('@components/progress/__demo__/IndexProgress.vue'), }, + { + path: '/dialog', + name: 'Dialog', + label: '对话框', + component: () => import('@components/dialog/__demo__/IndexDialog.vue'), + }, { path: '/resize-observer', name: 'ResizeObserver', -- Gitee From b071c2f8569c23c0396f832441ffe09a9d04e1ce Mon Sep 17 00:00:00 2001 From: devin Date: Tue, 14 Mar 2023 18:56:44 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0figure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/_shared/utils.ts | 35 ++++++ .../src/components/dialog/ODialog.vue | 4 +- .../src/components/figure/OFigure.vue | 119 ++++++++++++++++++ .../figure/__demo__/FigureBasic.vue | 28 +++++ .../figure/__demo__/IndexFigure.vue | 10 ++ .../opendesign/src/components/figure/index.ts | 12 ++ .../src/components/figure/style/index.scss | 59 +++++++++ .../src/components/figure/style/index.ts | 2 + .../src/components/figure/style/var.scss | 9 ++ .../opendesign/src/components/figure/types.ts | 44 +++++++ packages/portal/src/router.ts | 6 + 11 files changed, 326 insertions(+), 2 deletions(-) create mode 100644 packages/opendesign/src/components/figure/OFigure.vue create mode 100644 packages/opendesign/src/components/figure/__demo__/FigureBasic.vue create mode 100644 packages/opendesign/src/components/figure/__demo__/IndexFigure.vue create mode 100644 packages/opendesign/src/components/figure/index.ts create mode 100644 packages/opendesign/src/components/figure/style/index.scss create mode 100644 packages/opendesign/src/components/figure/style/index.ts create mode 100644 packages/opendesign/src/components/figure/style/var.scss create mode 100644 packages/opendesign/src/components/figure/types.ts diff --git a/packages/opendesign/src/components/_shared/utils.ts b/packages/opendesign/src/components/_shared/utils.ts index c600242b4..aacccf1fe 100644 --- a/packages/opendesign/src/components/_shared/utils.ts +++ b/packages/opendesign/src/components/_shared/utils.ts @@ -45,3 +45,38 @@ export function throttleRAF) => unknown>(fn: }; return rlt; } + +/** + * 颜色池 + */ +class ColorPool { + pool: Array; + tmpPool: Array; + + constructor(pool: Array) { + this.pool = pool; + this.tmpPool = [...pool]; + } + /** + * 返回指定位置颜色,或者从颜色池随机返回一个颜色 + * @param index + * @returns + */ + pick(index?: number): string { + if (index !== undefined) { + return this.pool[index % this.pool.length]; + } + const { length } = this.tmpPool; + if (length === 0) { + this.tmpPool = [...this.pool]; + } + const idx = Math.floor(Math.random() * length); + const color = this.tmpPool[idx]; + this.tmpPool.splice(idx, 1); + + return color; + } +} + +const PrestColor = ['#d9e6c3', '#ebd5be', '#d1e6de', '#e0ceeb', '#ebd3c7', '#e6dada', '#e3deeb', '#dedae6', '#cad0e8', '#cedeeb']; +export const PrestColorPool = new ColorPool(PrestColor); \ No newline at end of file diff --git a/packages/opendesign/src/components/dialog/ODialog.vue b/packages/opendesign/src/components/dialog/ODialog.vue index 4a59cdb82..8f0bd25ef 100644 --- a/packages/opendesign/src/components/dialog/ODialog.vue +++ b/packages/opendesign/src/components/dialog/ODialog.vue @@ -53,13 +53,13 @@ const onMaskClick = (e: MouseEvent) => {
-
+
-
+
diff --git a/packages/opendesign/src/components/figure/OFigure.vue b/packages/opendesign/src/components/figure/OFigure.vue new file mode 100644 index 000000000..08efb04b5 --- /dev/null +++ b/packages/opendesign/src/components/figure/OFigure.vue @@ -0,0 +1,119 @@ + + + diff --git a/packages/opendesign/src/components/figure/__demo__/FigureBasic.vue b/packages/opendesign/src/components/figure/__demo__/FigureBasic.vue new file mode 100644 index 000000000..6bbc4724c --- /dev/null +++ b/packages/opendesign/src/components/figure/__demo__/FigureBasic.vue @@ -0,0 +1,28 @@ + + + diff --git a/packages/opendesign/src/components/figure/__demo__/IndexFigure.vue b/packages/opendesign/src/components/figure/__demo__/IndexFigure.vue new file mode 100644 index 000000000..0e8aec369 --- /dev/null +++ b/packages/opendesign/src/components/figure/__demo__/IndexFigure.vue @@ -0,0 +1,10 @@ + + + diff --git a/packages/opendesign/src/components/figure/index.ts b/packages/opendesign/src/components/figure/index.ts new file mode 100644 index 000000000..f94942b8c --- /dev/null +++ b/packages/opendesign/src/components/figure/index.ts @@ -0,0 +1,12 @@ +import _OFigure from './OFigure.vue'; +import type { App } from 'vue'; + +const OFigure = Object.assign(_OFigure, { + install(app: App) { + app.component(_OFigure.name, _OFigure); + }, +}); + +export { + OFigure, +}; diff --git a/packages/opendesign/src/components/figure/style/index.scss b/packages/opendesign/src/components/figure/style/index.scss new file mode 100644 index 000000000..2dd431028 --- /dev/null +++ b/packages/opendesign/src/components/figure/style/index.scss @@ -0,0 +1,59 @@ +@use './var.scss'; + +.o-dialog { + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + align-items: center; + justify-content: center; + z-index: var(--dlg-z-index); + display: none; + &.is-show { + display: flex; + } +} +.o-dlg-mask { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + background-color: var(--o-color-mask1); +} +.o-dlg-main { + position: relative; + background-color: var(--o-color-control-light); + min-width: 200px; + box-shadow: var(--o-shadow-1); +} + +.o-dlg-btn-close { + position: absolute; + right: var(--o-gap-3); + top: var(--o-gap-3); + font-size: var(--o-icon_size-s); + color: var(--dlg-close-color); + border-radius: var(--dlg-close-radius); + display: flex; + &:hover { + text-decoration: none; + color: var(--dlg-close-color-hover); + background-color: var(--dlg-close-bg-color-hover); + } + &:active { + color: var(--dlg-close-color-active); + background-color: var(--dlg-close-bg-color-active); + } +} + +.o-dlg-head { + padding: 8px 16px; +} +.o-dlg-body { + padding: 8px 16px; +} +.o-dlg-foot { + padding: 8px 16px; +} diff --git a/packages/opendesign/src/components/figure/style/index.ts b/packages/opendesign/src/components/figure/style/index.ts new file mode 100644 index 000000000..591b2fbd7 --- /dev/null +++ b/packages/opendesign/src/components/figure/style/index.ts @@ -0,0 +1,2 @@ +import '../../style'; +import './index.scss'; diff --git a/packages/opendesign/src/components/figure/style/var.scss b/packages/opendesign/src/components/figure/style/var.scss new file mode 100644 index 000000000..664c3d71e --- /dev/null +++ b/packages/opendesign/src/components/figure/style/var.scss @@ -0,0 +1,9 @@ +.o-dialog { + --dlg-close-color: var(--o-color-info2); + --dlg-close-color-hover: var(--o-color-primary2); + --dlg-close-color-active: var(--o-color-primary3); + --dlg-close-bg-color-hover: var(--o-color-control1-light); + --dlg-close-bg-color-active: var(--o-color-control2-light); + --dlg-close-radius: 50%; + --dlg-z-index: calc(var(--o-z-index-base) + 10); +} diff --git a/packages/opendesign/src/components/figure/types.ts b/packages/opendesign/src/components/figure/types.ts new file mode 100644 index 000000000..2f9a51701 --- /dev/null +++ b/packages/opendesign/src/components/figure/types.ts @@ -0,0 +1,44 @@ +import { ExtractPropTypes } from 'vue'; + +export const figureProps = { + /** + * 地址 + */ + src: { + type: String, + }, + /** + * 长宽比 + */ + ratio: { + type: Number, + }, + /** + * 适配方式 + */ + position: { + type: String, + default: 'center' + }, + /** + * 适配方式 + */ + fit: { + type: String, + default: 'cover' + }, + /** + * img alt + */ + alt: { + type: String, + }, + /** + * 使用背景 + */ + background: { + type: Boolean, + }, +}; + +export type FigurePropsT = ExtractPropTypes; diff --git a/packages/portal/src/router.ts b/packages/portal/src/router.ts index 946fe5815..3dac78d2d 100644 --- a/packages/portal/src/router.ts +++ b/packages/portal/src/router.ts @@ -152,6 +152,12 @@ export const routes = [ label: '对话框', component: () => import('@components/dialog/__demo__/IndexDialog.vue'), }, + { + path: '/figure', + name: 'Figure', + label: '图片', + component: () => import('@components/figure/__demo__/IndexFigure.vue'), + }, { path: '/resize-observer', name: 'ResizeObserver', -- Gitee From 3adbc39d2e375215ca066d108bcfd8f7016ece65 Mon Sep 17 00:00:00 2001 From: devin Date: Wed, 15 Mar 2023 14:31:50 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=9B=BE=E7=89=87=E6=94=AF=E6=8C=81hover?= =?UTF-8?q?=20=E6=88=96=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/_shared/DivOrA.vue | 15 +++ .../src/components/figure/OFigure.vue | 53 +++------- .../figure/__demo__/FigureBasic.vue | 19 ++-- .../src/components/figure/style/index.scss | 96 ++++++++++--------- .../src/components/figure/style/var.scss | 12 +-- .../opendesign/src/components/figure/types.ts | 12 +++ 6 files changed, 101 insertions(+), 106 deletions(-) create mode 100644 packages/opendesign/src/components/_shared/DivOrA.vue diff --git a/packages/opendesign/src/components/_shared/DivOrA.vue b/packages/opendesign/src/components/_shared/DivOrA.vue new file mode 100644 index 000000000..4d60cdb32 --- /dev/null +++ b/packages/opendesign/src/components/_shared/DivOrA.vue @@ -0,0 +1,15 @@ + + diff --git a/packages/opendesign/src/components/figure/OFigure.vue b/packages/opendesign/src/components/figure/OFigure.vue index 08efb04b5..c43425745 100644 --- a/packages/opendesign/src/components/figure/OFigure.vue +++ b/packages/opendesign/src/components/figure/OFigure.vue @@ -1,6 +1,7 @@ - diff --git a/packages/opendesign/src/components/figure/__demo__/FigureBasic.vue b/packages/opendesign/src/components/figure/__demo__/FigureBasic.vue index 6bbc4724c..3a127b6a8 100644 --- a/packages/opendesign/src/components/figure/__demo__/FigureBasic.vue +++ b/packages/opendesign/src/components/figure/__demo__/FigureBasic.vue @@ -1,19 +1,16 @@ diff --git a/packages/opendesign/src/components/figure/style/index.scss b/packages/opendesign/src/components/figure/style/index.scss index 2dd431028..8a220011d 100644 --- a/packages/opendesign/src/components/figure/style/index.scss +++ b/packages/opendesign/src/components/figure/style/index.scss @@ -1,59 +1,63 @@ @use './var.scss'; -.o-dialog { - position: fixed; - left: 0; - right: 0; - top: 0; - bottom: 0; - align-items: center; - justify-content: center; - z-index: var(--dlg-z-index); - display: none; - &.is-show { - display: flex; +.o-figure { + display: inline-block; + vertical-align: top; + overflow: hidden; + transition: background-color var(--o-duration-m2); + &.is-loading { + background-color: var(--figure-prest-color); + img { + opacity: 0; + } + } + img { + vertical-align: top; + opacity: 1; + transition: opacity var(--o-duration-m2), transform var(--o-duration-m2); + } + &.is-error { + background-color: var(--o-color-control4); } } -.o-dlg-mask { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - background-color: var(--o-color-mask1); -} -.o-dlg-main { - position: relative; - background-color: var(--o-color-control-light); - min-width: 200px; - box-shadow: var(--o-shadow-1); -} +.o-figure-hoverable { + cursor: pointer; -.o-dlg-btn-close { - position: absolute; - right: var(--o-gap-3); - top: var(--o-gap-3); - font-size: var(--o-icon_size-s); - color: var(--dlg-close-color); - border-radius: var(--dlg-close-radius); - display: flex; &:hover { - text-decoration: none; - color: var(--dlg-close-color-hover); - background-color: var(--dlg-close-bg-color-hover); + img { + transform: scale(1.05); + } } &:active { - color: var(--dlg-close-color-active); - background-color: var(--dlg-close-bg-color-active); + img { + transform: scale(1.02); + } } } - -.o-dlg-head { - padding: 8px 16px; +.o-figure-wrapper { + position: relative; + width: 100%; + height: 100%; + padding-top: var(--figure-padding-top); } -.o-dlg-body { - padding: 8px 16px; +.o-figure-bg { + background-size: var(--figure-fit); + background-position: var(--figure-position); + background-repeat: no-repeat; } -.o-dlg-foot { - padding: 8px 16px; +.o-figure-img-ratio { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + object-fit: var(--figure-fit); + object-position: var(--figure-position); +} + +.o-figure-img { + width: 100%; + height: 100%; + object-fit: var(--figure-fit); + object-position: var(--figure-position); } diff --git a/packages/opendesign/src/components/figure/style/var.scss b/packages/opendesign/src/components/figure/style/var.scss index 664c3d71e..1f49819f9 100644 --- a/packages/opendesign/src/components/figure/style/var.scss +++ b/packages/opendesign/src/components/figure/style/var.scss @@ -1,9 +1,5 @@ -.o-dialog { - --dlg-close-color: var(--o-color-info2); - --dlg-close-color-hover: var(--o-color-primary2); - --dlg-close-color-active: var(--o-color-primary3); - --dlg-close-bg-color-hover: var(--o-color-control1-light); - --dlg-close-bg-color-active: var(--o-color-control2-light); - --dlg-close-radius: 50%; - --dlg-z-index: calc(var(--o-z-index-base) + 10); +.o-figure { + --figure-padding-top: 50%; + --figure-fit: 'cover'; + --figure-position: 'center'; } diff --git a/packages/opendesign/src/components/figure/types.ts b/packages/opendesign/src/components/figure/types.ts index 2f9a51701..9a5642446 100644 --- a/packages/opendesign/src/components/figure/types.ts +++ b/packages/opendesign/src/components/figure/types.ts @@ -39,6 +39,18 @@ export const figureProps = { background: { type: Boolean, }, + /** + * 可hover + */ + hoverable: { + type: Boolean, + }, + /** + * 链接跳转 + */ + href: { + type: String, + } }; export type FigurePropsT = ExtractPropTypes; -- Gitee From 262c3ce4021cf2668257c1a0e2b5ae68228726e3 Mon Sep 17 00:00:00 2001 From: devin Date: Wed, 15 Mar 2023 15:18:37 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8D=A1=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opendesign/src/components/card/OCard.vue | 61 ++++++++++ .../components/card/__demo__/CardBasic.vue | 104 +++++++++++++++++ .../components/card/__demo__/IndexCard.vue | 10 ++ .../opendesign/src/components/card/index.ts | 12 ++ .../src/components/card/style/index.scss | 108 ++++++++++++++++++ .../src/components/card/style/index.ts | 3 + .../src/components/card/style/var.scss | 12 ++ .../opendesign/src/components/card/types.ts | 75 ++++++++++++ packages/portal/src/router.ts | 6 + 9 files changed, 391 insertions(+) create mode 100644 packages/opendesign/src/components/card/OCard.vue create mode 100644 packages/opendesign/src/components/card/__demo__/CardBasic.vue create mode 100644 packages/opendesign/src/components/card/__demo__/IndexCard.vue create mode 100644 packages/opendesign/src/components/card/index.ts create mode 100644 packages/opendesign/src/components/card/style/index.scss create mode 100644 packages/opendesign/src/components/card/style/index.ts create mode 100644 packages/opendesign/src/components/card/style/var.scss create mode 100644 packages/opendesign/src/components/card/types.ts diff --git a/packages/opendesign/src/components/card/OCard.vue b/packages/opendesign/src/components/card/OCard.vue new file mode 100644 index 000000000..432a2ab36 --- /dev/null +++ b/packages/opendesign/src/components/card/OCard.vue @@ -0,0 +1,61 @@ + + diff --git a/packages/opendesign/src/components/card/__demo__/CardBasic.vue b/packages/opendesign/src/components/card/__demo__/CardBasic.vue new file mode 100644 index 000000000..835fbac39 --- /dev/null +++ b/packages/opendesign/src/components/card/__demo__/CardBasic.vue @@ -0,0 +1,104 @@ + + + diff --git a/packages/opendesign/src/components/card/__demo__/IndexCard.vue b/packages/opendesign/src/components/card/__demo__/IndexCard.vue new file mode 100644 index 000000000..ab6c75049 --- /dev/null +++ b/packages/opendesign/src/components/card/__demo__/IndexCard.vue @@ -0,0 +1,10 @@ + + + diff --git a/packages/opendesign/src/components/card/index.ts b/packages/opendesign/src/components/card/index.ts new file mode 100644 index 000000000..99344ab48 --- /dev/null +++ b/packages/opendesign/src/components/card/index.ts @@ -0,0 +1,12 @@ +import _OCard from './OCard.vue'; +import type { App } from 'vue'; + +const OCard = Object.assign(_OCard, { + install(app: App) { + app.component(_OCard.name, _OCard); + }, +}); + +export { + OCard, +}; diff --git a/packages/opendesign/src/components/card/style/index.scss b/packages/opendesign/src/components/card/style/index.scss new file mode 100644 index 000000000..38bc00870 --- /dev/null +++ b/packages/opendesign/src/components/card/style/index.scss @@ -0,0 +1,108 @@ +@use './var.scss'; + +.o-card { + background-color: var(--o-color-control-light); + border-radius: var(--card-radius); + overflow: hidden; +} +.o-card-cover { + flex-shrink: 0; +} +.o-card-cover-v { + padding: 8px 8px 0; +} +.o-card-cover-h { + padding: 8px 0 8px 8px; +} +.o-card-cover-hr { + padding: 8px 8px 8px 0; +} + +.o-card-only-cover { + padding: 0; +} + +.o-card-cover-img { + width: 100%; + border-radius: calc(var(--card-radius) / 2); + &.is-full { + height: 100%; + } +} + +.o-card-title { + font-size: var(--o-font_size-h3); + line-height: var(--o-line_height-h3); + color: var(--o-color-info1); + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: var(--card-title-max-row); + -webkit-box-orient: vertical; +} + +.o-card-main { + padding: 24px; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.o-card-content { + font-size: var(--o-font_size-text1); + line-height: var(--o-line_height-text1); + color: var(--o-color-info2); + .o-card-title + & { + margin-top: 12px; + } +} +.o-card-detail { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: var(--card-detail-max-row); + -webkit-box-orient: vertical; +} + +.o-card-hoverable { + position: relative; + cursor: pointer; + transition: box-shadow var(--o-easing-standard) var(--o-duration-m2); + + &:hover { + box-shadow: var(--o-shadow-2); + .o-card-cover img { + transform: scale(1.05); + } + } + &:active { + box-shadow: var(--o-shadow-1); + .o-card-cover img { + transform: scale(1.02); + } + } +} +.o-card-actions { + margin-top: 24px; + font-size: var(--o-font_size-tip1); + line-height: var(--o-line_height-tip1); + color: var(--o-color-info3); +} + +.o-card-layout-h { + display: flex; +} +.o-card-layout-hr { + display: flex; + flex-direction: row-reverse; +} +.o-card-cover-h, +.o-card-cover-hr { + width: var(--card-h-cover-width); +} + +.o-card-large { + .o-card-main { + padding: 24px 32px; + } +} diff --git a/packages/opendesign/src/components/card/style/index.ts b/packages/opendesign/src/components/card/style/index.ts new file mode 100644 index 000000000..8da214d05 --- /dev/null +++ b/packages/opendesign/src/components/card/style/index.ts @@ -0,0 +1,3 @@ +import '../../style'; +import '../../figure/style'; +import './index.scss'; diff --git a/packages/opendesign/src/components/card/style/var.scss b/packages/opendesign/src/components/card/style/var.scss new file mode 100644 index 000000000..6b71a6757 --- /dev/null +++ b/packages/opendesign/src/components/card/style/var.scss @@ -0,0 +1,12 @@ +.o-card { + --card-radius: var(--o-radius-control-l); + --card-title-max-row: 0; + --card-detail-max-row: 0; +} + +.o-card-medium { + --card-h-cover-width: 274px; +} +.o-card-large { + --card-h-cover-width: 442px; +} diff --git a/packages/opendesign/src/components/card/types.ts b/packages/opendesign/src/components/card/types.ts new file mode 100644 index 000000000..0f4a32fdd --- /dev/null +++ b/packages/opendesign/src/components/card/types.ts @@ -0,0 +1,75 @@ +import { ExtractPropTypes, PropType } from 'vue'; + +export const dialogProps = { + /** + * 封面 + */ + layout: { + type: String as PropType<'h' | 'v' | 'hr'>, + default: 'v' + }, + /** + * 封面 + */ + cover: { + type: String, + }, + /** + * 封面长宽比 + */ + coverRatio: { + type: Number, + }, + /** + * 标题 + */ + title: { + type: String, + }, + /** + * 标题 + */ + content: { + type: String, + }, + /** + * 可hover + */ + hoverable: { + type: Boolean, + }, + /** + * cover classname + */ + coverClass: { + type: String, + }, + /** + * 尺寸 + */ + size: { + type: String as PropType<'medium' | 'large'>, + default: 'medium' + }, + /** + * 标题最大行数 + */ + titleMaxRow: { + type: Number, + }, + /** + * 详情最大行数 + */ + detailMaxRow: { + type: Number, + }, + /** + * 链接跳转 + */ + href: { + type: String, + } + +}; + +export type DialogPropsT = ExtractPropTypes; diff --git a/packages/portal/src/router.ts b/packages/portal/src/router.ts index 3dac78d2d..f57e6dfad 100644 --- a/packages/portal/src/router.ts +++ b/packages/portal/src/router.ts @@ -158,6 +158,12 @@ export const routes = [ label: '图片', component: () => import('@components/figure/__demo__/IndexFigure.vue'), }, + { + path: '/card', + name: 'Card', + label: '卡片', + component: () => import('@components/card/__demo__/IndexCard.vue'), + }, { path: '/resize-observer', name: 'ResizeObserver', -- Gitee From 61dd53c6495166a27c774430efcd03f97165c497 Mon Sep 17 00:00:00 2001 From: devin Date: Wed, 15 Mar 2023 15:22:43 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0html-tag=E7=BB=84?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/_shared/DivOrA.vue | 15 -------------- .../_shared/{ => components}/client-only.ts | 0 .../components/_shared/components/html-tag.ts | 20 +++++++++++++++++++ .../src/components/button/OButton.vue | 7 +++++-- .../components/button/__demo__/BtnLoading.vue | 8 ++++---- .../src/components/button/style/index.scss | 4 ++-- .../opendesign/src/components/button/types.ts | 6 ++++++ .../opendesign/src/components/card/OCard.vue | 4 ++-- .../dialog/__demo__/DialogBasic.vue | 2 +- .../src/components/figure/OFigure.vue | 8 ++++---- .../src/components/figure/style/index.scss | 3 ++- .../src/components/input/OInput.vue | 2 +- .../src/components/popup/OPopup.vue | 2 +- .../src/components/select/OSelect.vue | 2 +- .../src/components/tabs/OTabPane.vue | 2 +- .../src/components/textarea/OTextarea.vue | 2 +- 16 files changed, 51 insertions(+), 36 deletions(-) delete mode 100644 packages/opendesign/src/components/_shared/DivOrA.vue rename packages/opendesign/src/components/_shared/{ => components}/client-only.ts (100%) create mode 100644 packages/opendesign/src/components/_shared/components/html-tag.ts diff --git a/packages/opendesign/src/components/_shared/DivOrA.vue b/packages/opendesign/src/components/_shared/DivOrA.vue deleted file mode 100644 index 4d60cdb32..000000000 --- a/packages/opendesign/src/components/_shared/DivOrA.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/packages/opendesign/src/components/_shared/client-only.ts b/packages/opendesign/src/components/_shared/components/client-only.ts similarity index 100% rename from packages/opendesign/src/components/_shared/client-only.ts rename to packages/opendesign/src/components/_shared/components/client-only.ts diff --git a/packages/opendesign/src/components/_shared/components/html-tag.ts b/packages/opendesign/src/components/_shared/components/html-tag.ts new file mode 100644 index 000000000..c8fee7e7c --- /dev/null +++ b/packages/opendesign/src/components/_shared/components/html-tag.ts @@ -0,0 +1,20 @@ +import { defineComponent, h } from 'vue'; + +/** + * 只渲染一个子元素 + */ +export default defineComponent({ + name: 'HtmlTag', + props: { + tag: { + type: String, + default: 'div' + } + }, + setup(props, { slots, attrs }) { + + return () => { + return h(props.tag, attrs, slots.default?.()); + }; + }, +}); diff --git a/packages/opendesign/src/components/button/OButton.vue b/packages/opendesign/src/components/button/OButton.vue index fe91c6479..a5cd049c5 100644 --- a/packages/opendesign/src/components/button/OButton.vue +++ b/packages/opendesign/src/components/button/OButton.vue @@ -3,13 +3,16 @@ import { defaultSize } from '../_shared/global'; import { IconLoading } from '../_shared/icons'; import { getRoundClass } from '../_shared/style-class'; import { buttonProps } from './types'; +import HtmlTag from '../_shared/components/html-tag'; const props = defineProps(buttonProps); const round = getRoundClass(props, 'btn'); diff --git a/packages/opendesign/src/components/button/__demo__/BtnLoading.vue b/packages/opendesign/src/components/button/__demo__/BtnLoading.vue index d90811ebe..475ceec11 100644 --- a/packages/opendesign/src/components/button/__demo__/BtnLoading.vue +++ b/packages/opendesign/src/components/button/__demo__/BtnLoading.vue @@ -17,12 +17,12 @@ const showLoading = (key: 'loading1' | 'loading2' | 'loading3', val: boolean) => diff --git a/packages/opendesign/src/components/button/style/index.scss b/packages/opendesign/src/components/button/style/index.scss index 478de982f..ed75acbd7 100644 --- a/packages/opendesign/src/components/button/style/index.scss +++ b/packages/opendesign/src/components/button/style/index.scss @@ -6,12 +6,12 @@ border: 1px solid transparent; transition: all var(--o-duration-s) var(--o-easing-standard); white-space: nowrap; - + text-decoration: none; border-radius: var(--btn-radius); - display: inline-flex; align-items: center; justify-content: center; + &:hover { cursor: pointer; } diff --git a/packages/opendesign/src/components/button/types.ts b/packages/opendesign/src/components/button/types.ts index 9aec18fee..98dcbc539 100644 --- a/packages/opendesign/src/components/button/types.ts +++ b/packages/opendesign/src/components/button/types.ts @@ -42,6 +42,12 @@ export const buttonProps = { disabled: { type: Boolean }, + /** + * 链接跳转 + */ + href: { + type: String, + } }; export type ButtonPropsT = ExtractPropTypes; diff --git a/packages/opendesign/src/components/card/OCard.vue b/packages/opendesign/src/components/card/OCard.vue index 432a2ab36..d856473d2 100644 --- a/packages/opendesign/src/components/card/OCard.vue +++ b/packages/opendesign/src/components/card/OCard.vue @@ -1,8 +1,8 @@ - + diff --git a/packages/opendesign/src/components/figure/style/index.scss b/packages/opendesign/src/components/figure/style/index.scss index 8a220011d..9ad288474 100644 --- a/packages/opendesign/src/components/figure/style/index.scss +++ b/packages/opendesign/src/components/figure/style/index.scss @@ -14,7 +14,8 @@ img { vertical-align: top; opacity: 1; - transition: opacity var(--o-duration-m2), transform var(--o-duration-m2); + transition: opacity var(--o-duration-m2), transform var(--o-easing-standard) var(--o-duration-m2); + will-change: transform; } &.is-error { background-color: var(--o-color-control4); diff --git a/packages/opendesign/src/components/input/OInput.vue b/packages/opendesign/src/components/input/OInput.vue index 7bc488124..d021b666a 100644 --- a/packages/opendesign/src/components/input/OInput.vue +++ b/packages/opendesign/src/components/input/OInput.vue @@ -9,7 +9,7 @@ import { toInputString } from './input'; import { OResizeObserver } from '../resize-observer'; import { inputProps } from './types'; import { getRoundClass } from '../_shared/style-class'; -import ClientOnly from '../_shared/client-only'; +import ClientOnly from '../_shared/components/client-only'; const props = defineProps(inputProps); diff --git a/packages/opendesign/src/components/popup/OPopup.vue b/packages/opendesign/src/components/popup/OPopup.vue index 8a1a4640b..3adb62348 100644 --- a/packages/opendesign/src/components/popup/OPopup.vue +++ b/packages/opendesign/src/components/popup/OPopup.vue @@ -15,7 +15,7 @@ import { OResizeObserver } from '../resize-observer'; import { useIntersectionObserver } from '../hooks'; import type { IntersectionListenerT } from '../hooks'; import { OChildOnly } from '../child-only'; -import ClientOnly from '../_shared/client-only'; +import ClientOnly from '../_shared/components/client-only'; // TODO 处理嵌套 diff --git a/packages/opendesign/src/components/select/OSelect.vue b/packages/opendesign/src/components/select/OSelect.vue index 114a5de92..334e2f868 100644 --- a/packages/opendesign/src/components/select/OSelect.vue +++ b/packages/opendesign/src/components/select/OSelect.vue @@ -6,7 +6,7 @@ import { OPopup } from '../popup'; import { selectOptionInjectKey } from './provide'; import { SelectOptionT, selectProps } from './types'; import { getRoundClass } from '../_shared/style-class'; -import ClientOnly from '../_shared/client-only'; +import ClientOnly from '../_shared/components/client-only'; const props = defineProps(selectProps); const emits = defineEmits<{ diff --git a/packages/opendesign/src/components/tabs/OTabPane.vue b/packages/opendesign/src/components/tabs/OTabPane.vue index 60abf5db7..4a6afa76b 100644 --- a/packages/opendesign/src/components/tabs/OTabPane.vue +++ b/packages/opendesign/src/components/tabs/OTabPane.vue @@ -8,7 +8,7 @@ import { computed, getCurrentInstance, inject, onMounted, nextTick, ref, watch } import { tabsInjectKey } from './provide'; import { tabPaneProps } from './types'; import { IconClose } from '../_shared/icons'; -import ClientOnly from '../_shared/client-only'; +import ClientOnly from '../_shared/components/client-only'; const props = defineProps(tabPaneProps); diff --git a/packages/opendesign/src/components/textarea/OTextarea.vue b/packages/opendesign/src/components/textarea/OTextarea.vue index c16be7b7b..16409d646 100644 --- a/packages/opendesign/src/components/textarea/OTextarea.vue +++ b/packages/opendesign/src/components/textarea/OTextarea.vue @@ -8,7 +8,7 @@ import { toInputString } from './textarea'; import { OResizeObserver } from '../resize-observer'; import { textareaProps } from './types'; import { getRoundClass } from '../_shared/style-class'; -import ClientOnly from '../_shared/client-only'; +import ClientOnly from '../_shared/components/client-only'; const props = defineProps(textareaProps); -- Gitee