diff --git a/packages/opendesign/package.json b/packages/opendesign/package.json
index c07a70645ef40c6a3f51387a546bf0903c303cfa..09f53d01beb93ef47f86aee7fb9b4aefcee7de4b 100644
--- a/packages/opendesign/package.json
+++ b/packages/opendesign/package.json
@@ -20,7 +20,7 @@
"gen:icon": "opensig-scripts gen:icon --config ./src/icons/icon.config.ts",
"build:component": "opensig-scripts build:component",
"build:style": "opensig-scripts build:style",
- "build": "opensig-scripts gen:icon && opensig-scripts build:component && opensig-scripts build:style"
+ "build": "pnpm gen:icon && pnpm build:component && pnpm build:style"
},
"peerDependencies": {
"vue": "^3.1.0"
diff --git a/packages/opendesign/src/components/_shared/global.ts b/packages/opendesign/src/components/_shared/global.ts
index bc88dd0fe7f45df410678d9bf46bd72d8c3865f9..8be32c05f6fac79a408f2f6e3b7282025f7ac3b5 100644
--- a/packages/opendesign/src/components/_shared/global.ts
+++ b/packages/opendesign/src/components/_shared/global.ts
@@ -14,8 +14,6 @@ export const defaultRound = ref<'pill' | 'normal'>('normal');
export function initRound(type: 'pill' | 'normal') {
defaultRound.value = type;
}
-// TODO 全局变量增加 o-radius-control-s o-radius-control-m o-radius-control-l
-
// 方向
export type DirectionT = 'h' | 'v';
diff --git a/packages/opendesign/src/components/card/OCard.vue b/packages/opendesign/src/components/card/OCard.vue
index 5013452c0dae992089d6713ee148ec82fff7b36a..6c8ae1552625724fde96b9fdaf9611b26df3c765 100644
--- a/packages/opendesign/src/components/card/OCard.vue
+++ b/packages/opendesign/src/components/card/OCard.vue
@@ -28,36 +28,38 @@ const hasContent = computed(() => {
'--card-detail-max-row': props.detailMaxRow,
}"
>
-
-
-
-
-
-
-
-
-
-
{{ props.title }}
+
+
+
+
+
+
+
+
+
+
+ {{ props.title }}
+
+
+
{{ props.content }}
+
+
-
-
{{ props.content }}
-
+
+
-
-
-
-
-
-
+
+
+
diff --git a/packages/opendesign/src/components/card/__demo__/CardBasic.vue b/packages/opendesign/src/components/card/__demo__/CardBasic.vue
index 26869dc25947a1da1a7d5f57653134cc86ca8320..2ef7ed1657f2b088afcb21a3602ae008f3042ac8 100644
--- a/packages/opendesign/src/components/card/__demo__/CardBasic.vue
+++ b/packages/opendesign/src/components/card/__demo__/CardBasic.vue
@@ -38,6 +38,26 @@ const card = {
+
+
+
+
+
-
-
-
-
-
{{ card.title }}
-
{{ card.content }}
+
+
+
+
+
+
{{ card.title }}
+
{{ card.content }}
+
-
+ 1123
+
diff --git a/packages/opendesign/src/components/card/style/index.scss b/packages/opendesign/src/components/card/style/index.scss
index e670142cf1af0ad560e559f085c280a64c235d55..624bb5471e748dedaef0f53873e28a69cf426184 100644
--- a/packages/opendesign/src/components/card/style/index.scss
+++ b/packages/opendesign/src/components/card/style/index.scss
@@ -4,6 +4,7 @@
background-color: var(--o-color-control-light);
border-radius: var(--card-radius);
overflow: hidden;
+ display: flex;
}
.o-card-cover {
flex-shrink: 0;
@@ -46,6 +47,7 @@
display: flex;
flex-direction: column;
justify-content: space-between;
+ flex: 1;
}
.o-card-content {
@@ -82,15 +84,19 @@
}
}
}
-.o-card-actions {
+.o-card-bottom {
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-v {
+ display: flex;
+ flex-direction: column;
+}
.o-card-layout-h {
display: flex;
+ flex-direction: row;
}
.o-card-layout-hr {
display: flex;
diff --git a/packages/opendesign/src/components/checkbox-group/style/index.scss b/packages/opendesign/src/components/checkbox-group/style/index.scss
index 80be7f6a536da02895a71f29a3bbc79430a4bb66..59ba2eae15056d9d2741e2ca20ff39a4478be6d6 100644
--- a/packages/opendesign/src/components/checkbox-group/style/index.scss
+++ b/packages/opendesign/src/components/checkbox-group/style/index.scss
@@ -6,6 +6,6 @@
gap: var(--checkbox-group-gap);
}
-.o-checkbox-group-direction-vertical {
+.o-checkbox-group-direction-v {
flex-direction: column;
}
diff --git a/packages/opendesign/src/components/divider/style/index.scss b/packages/opendesign/src/components/divider/style/index.scss
index 1a5e334e16fb91759550afddbb8532ceacd7bfdb..d4a0eaac29a6e77d6c37a3ec5866a57b3c186a88 100644
--- a/packages/opendesign/src/components/divider/style/index.scss
+++ b/packages/opendesign/src/components/divider/style/index.scss
@@ -42,7 +42,7 @@
}
}
-.o-divider-vertical {
+.o-divider-v {
display: inline-block;
width: 1px;
height: 1em;
@@ -53,21 +53,21 @@
}
.o-divider-solid {
- &.o-divider-vertical,
+ &.o-divider-v,
.o-divider-line {
border-style: solid;
}
}
.o-divider-dashed {
- &.o-divider-vertical,
+ &.o-divider-v,
.o-divider-line {
border-style: dashed;
}
}
.o-divider-dotted {
- &.o-divider-vertical,
+ &.o-divider-v,
.o-divider-line {
border-style: dotted;
}
diff --git a/packages/opendesign/src/components/divider/style/var.scss b/packages/opendesign/src/components/divider/style/var.scss
index c15c6f690fd25efe21eda507e78b3d4b49349d56..17ab3cf511b490d8d31f48c108818068f4691783 100644
--- a/packages/opendesign/src/components/divider/style/var.scss
+++ b/packages/opendesign/src/components/divider/style/var.scss
@@ -11,6 +11,6 @@
--o-divider-gap: var(--o-gap-3);
}
-.o-divider-vertical {
+.o-divider-v {
--o-divider-gap: var(--o-gap-3);
}
diff --git a/packages/opendesign/src/components/figure/OFigure.vue b/packages/opendesign/src/components/figure/OFigure.vue
index 4d563d67220d2ab52c3bdb47a03cb308d600eee7..d6b0e3abda012b6ff8a89e79ed9242c35be878fd 100644
--- a/packages/opendesign/src/components/figure/OFigure.vue
+++ b/packages/opendesign/src/components/figure/OFigure.vue
@@ -12,7 +12,7 @@ const imgRef = ref(null);
const isLoading = ref(true);
const isError = ref(false);
-const prestColor = PrestColorPool.pick();
+const prestColor = props.colorfull ? PrestColorPool.pick() : '';
const bgSrc = computed(() => {
if (props.background && props.ratio) {
@@ -68,6 +68,7 @@ onMounted(() => {
:class="{
'is-loading': isLoading,
'is-error': isError,
+ 'is-colorfull': props.colorfull,
'o-figure-hoverable': props.hoverable || !!props.href,
}"
:style="{
diff --git a/packages/opendesign/src/components/figure/style/index.scss b/packages/opendesign/src/components/figure/style/index.scss
index 9ad288474e7c0907628ae38bdfb3ea8cdf79cacf..956933f29b8b8291126952cba1bc8c0491a3ac7f 100644
--- a/packages/opendesign/src/components/figure/style/index.scss
+++ b/packages/opendesign/src/components/figure/style/index.scss
@@ -6,12 +6,15 @@
overflow: hidden;
transition: background-color var(--o-duration-m2);
&.is-loading {
- background-color: var(--figure-prest-color);
+ &.is-colorfull {
+ background-color: var(--figure-prest-color);
+ }
img {
opacity: 0;
}
}
img {
+ max-width: 100%;
vertical-align: top;
opacity: 1;
transition: opacity var(--o-duration-m2), transform var(--o-easing-standard) var(--o-duration-m2);
diff --git a/packages/opendesign/src/components/figure/types.ts b/packages/opendesign/src/components/figure/types.ts
index 9a5642446e17d7a1571523e88b5e8f57b9b586a3..dde3eee188fdbb518417a2865e08fee6c6a391d7 100644
--- a/packages/opendesign/src/components/figure/types.ts
+++ b/packages/opendesign/src/components/figure/types.ts
@@ -50,7 +50,13 @@ export const figureProps = {
*/
href: {
type: String,
- }
+ },
+ /**
+ * 预置随机多彩背景
+ */
+ colorfull: {
+ type: Boolean,
+ },
};
export type FigurePropsT = ExtractPropTypes;
diff --git a/packages/opendesign/src/components/index.scss b/packages/opendesign/src/components/index.scss
index 658e74d34c5f73da54d3bafdbba2d44be950c3d3..3d2a8ae15b835606b564fe9ceefa51541713f062 100644
--- a/packages/opendesign/src/components/index.scss
+++ b/packages/opendesign/src/components/index.scss
@@ -29,3 +29,4 @@
@use './dialog/style/index.scss' as *;
@use './figure/style/index.scss' as *;
@use './card/style/index.scss' as *;
+@use './slides/style/index.scss' as *;
diff --git a/packages/opendesign/src/components/index.ts b/packages/opendesign/src/components/index.ts
index ed6a810df01762aaf9fb4b9310cf49c157ba942c..52a3c2b518375de8756bc35164cd122f0df7615d 100644
--- a/packages/opendesign/src/components/index.ts
+++ b/packages/opendesign/src/components/index.ts
@@ -33,6 +33,7 @@ export * from './dialog';
export * from './figure';
export * from './card';
export * from './message';
+export * from './slides';
// export * from './scrollbar';
diff --git a/packages/opendesign/src/components/input/style/index.scss b/packages/opendesign/src/components/input/style/index.scss
index b0f610e407719b8451c6ae85f31452ef7abe768d..07e34562c35388a91b89fcc509a17932d659d9a8 100644
--- a/packages/opendesign/src/components/input/style/index.scss
+++ b/packages/opendesign/src/components/input/style/index.scss
@@ -46,7 +46,9 @@
border-bottom-right-radius: 0;
}
}
-
+.o-input-input-wrap {
+ width: 100%;
+}
.o-input-input {
outline: none;
border: none;
diff --git a/packages/opendesign/src/components/input/style/var.scss b/packages/opendesign/src/components/input/style/var.scss
index 2c36b6da8306133801757e6d13de0f23798a1e66..bb2302c37e94852acb9299db8f7e23023b15ab22 100644
--- a/packages/opendesign/src/components/input/style/var.scss
+++ b/packages/opendesign/src/components/input/style/var.scss
@@ -5,7 +5,7 @@
--input-bg-color: transparent;
--input-bg-color-hover: transparent;
- --input-bg-color-focus: var(--o-color-control-white);
+ --input-bg-color-focus: var(--o-color-control-light);
--input-prepend-append-bd-color: var(--o-color-control1);
}
diff --git a/packages/opendesign/src/components/radio-group/style/index.scss b/packages/opendesign/src/components/radio-group/style/index.scss
index 383b4dfc4e42e8b82dd747c103bddf458e026c76..e4ec1f55c0fedca8fb902e6221f771e181b458c2 100644
--- a/packages/opendesign/src/components/radio-group/style/index.scss
+++ b/packages/opendesign/src/components/radio-group/style/index.scss
@@ -6,6 +6,6 @@
gap: var(--radio-group-gap);
}
-.o-radio-group-direction-vertical {
+.o-radio-group-direction-v {
flex-direction: column;
}
diff --git a/packages/opendesign/src/components/slides/OSlideItem.vue b/packages/opendesign/src/components/slides/OSlideItem.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d4a662951e55f93b027c2a48d340a6f053729771
--- /dev/null
+++ b/packages/opendesign/src/components/slides/OSlideItem.vue
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/packages/opendesign/src/components/slides/OSlides.vue b/packages/opendesign/src/components/slides/OSlides.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0d403b7ea0b93be9d36d32644e3bc964b8c0558d
--- /dev/null
+++ b/packages/opendesign/src/components/slides/OSlides.vue
@@ -0,0 +1,229 @@
+
+
+
+
diff --git a/packages/opendesign/src/components/slides/__demo__/IndexSlides.vue b/packages/opendesign/src/components/slides/__demo__/IndexSlides.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3282793605a51c243f0b87791a22ab120ca245f3
--- /dev/null
+++ b/packages/opendesign/src/components/slides/__demo__/IndexSlides.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/packages/opendesign/src/components/slides/__demo__/SlidesBasic.vue b/packages/opendesign/src/components/slides/__demo__/SlidesBasic.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c8a28dd67f17f63684c2081af286873ca70eaa1e
--- /dev/null
+++ b/packages/opendesign/src/components/slides/__demo__/SlidesBasic.vue
@@ -0,0 +1,51 @@
+
+
+ 基本
+
+
+
+
diff --git a/packages/opendesign/src/components/slides/index.ts b/packages/opendesign/src/components/slides/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..437e94412e0d0a07acf77a4b8ead6b9e4a4546fe
--- /dev/null
+++ b/packages/opendesign/src/components/slides/index.ts
@@ -0,0 +1,15 @@
+import _OSlides from './OSlides.vue';
+import OSlideItem from './OSlideItem.vue';
+import type { App } from 'vue';
+
+const OSlides = Object.assign(_OSlides, {
+ OSlideItem,
+ install(app: App) {
+ app.component(_OSlides.name, _OSlides);
+ },
+});
+
+export {
+ OSlides,
+ OSlideItem
+};
diff --git a/packages/opendesign/src/components/slides/provide.ts b/packages/opendesign/src/components/slides/provide.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e70f164f98ac91627b607011c96b21206a0d10a6
--- /dev/null
+++ b/packages/opendesign/src/components/slides/provide.ts
@@ -0,0 +1,10 @@
+import { InjectionKey, Ref } from 'vue';
+
+
+export const slidesInjectKey: InjectionKey<{
+ currentIndex: Ref
+ // Ref: Ref,
+ // updateValue: (value: string | number, navEl: HTMLElement | null) => void,
+ // onDeletePane: (value: string | number, evt: MouseEvent) => void,
+}> = Symbol('provide-slides');
+
diff --git a/packages/opendesign/src/components/slides/style/index.scss b/packages/opendesign/src/components/slides/style/index.scss
new file mode 100644
index 0000000000000000000000000000000000000000..2a48014a97b259e1c17244b867f4a10607ab6750
--- /dev/null
+++ b/packages/opendesign/src/components/slides/style/index.scss
@@ -0,0 +1,157 @@
+@use './var.scss';
+
+.o-slides {
+ position: relative;
+ visibility: hidden;
+}
+.o-slides-visible {
+ visibility: visible;
+}
+
+.o-slides-wrap {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ z-index: 1;
+}
+
+// arrow
+.o-slides-arrow-prev,
+.o-slides-arrow-next {
+ position: absolute;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 2;
+ user-select: none;
+ cursor: pointer;
+}
+.o-slides-arrow-prev {
+ top: 50%;
+ left: 12px;
+ transform: translate3d(0, -50%, 0);
+}
+.o-slides-arrow-next {
+ top: 50%;
+ right: 12px;
+ transform: translate3d(0, -50%, 0);
+}
+.o-slides-arrow-icon {
+ font-size: 48px;
+ color: var(--o-color-control-light);
+ background-color: rgba(var(--o-gray-1), 0.3);
+ border-radius: 50%;
+ opacity: 0.6;
+ &:hover {
+ opacity: 1;
+ }
+}
+// indicator
+.o-slides-indicator-wrap {
+ position: absolute;
+ left: 0;
+ bottom: 12px;
+ display: flex;
+ justify-content: center;
+ z-index: 2;
+ left: 50%;
+ transform: translate3d(-50%, 0, 0);
+}
+.o-slides-indicator-dot {
+ width: 48px;
+ height: 3px;
+ background-color: var(--o-color-control-light);
+ margin: 4px;
+ border-radius: 3px;
+ opacity: 0.3;
+ cursor: pointer;
+}
+.o-slides-indicator-dot-active {
+ opacity: 1;
+}
+
+// slide
+.o-slides-type-switch {
+ overflow: hidden;
+ .o-slide-item {
+ position: absolute;
+ left: 0;
+ right: 0;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ z-index: 1;
+ opacity: 0;
+ }
+ .o-slide-item-animating {
+ opacity: 1;
+ }
+ .o-slide-item-active {
+ z-index: 5;
+ opacity: 1;
+ }
+}
+
+.o-slide-item-in {
+ z-index: 5;
+ opacity: 1;
+ animation: slides-slide-x-in var(--o-duration-l) var(--o-easing-standard-in);
+}
+.o-slide-item-out {
+ z-index: 3;
+ animation: slides-slide-x-out var(--o-duration-l) var(--o-easing-standard-in);
+}
+.o-slide-item-in-reverse {
+ z-index: 5;
+ animation: slides-slide-x-in-reverse var(--o-duration-l) var(--o-easing-standard-in);
+}
+.o-slide-item-out-reverse {
+ z-index: 3;
+ animation: slides-slide-x-out-reverse var(--o-duration-l) var(--o-easing-standard-in);
+}
+
+@keyframes slides-slide-x-in {
+ 0% {
+ transform: translate3d(100%, 0, 0);
+ }
+ 100% {
+ transform: translate3d(0, 0, 0);
+ }
+}
+@keyframes slides-slide-x-in-reverse {
+ 0% {
+ transform: translate3d(-100%, 0, 0);
+ }
+ 100% {
+ transform: translate3d(0, 0, 0);
+ }
+}
+@keyframes slides-slide-x-out {
+ 0% {
+ transform: translate3d(0, 0, 0);
+ }
+ 100% {
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+@keyframes slides-slide-x-out-reverse {
+ 0% {
+ transform: translate3d(0, 0, 0);
+ }
+ 100% {
+ transform: translate3d(100%, 0, 0);
+ }
+}
+
+.o-slides-type-carousel {
+ --slide-gap: 16px;
+ transition: transform var(--o-duration-l) var(--o-easing-emphasized);
+ .o-slide-item {
+ position: absolute;
+ left: 0;
+ right: 0;
+ height: 100%;
+ overflow: hidden;
+ z-index: 1;
+ }
+}
diff --git a/packages/opendesign/src/components/slides/style/index.ts b/packages/opendesign/src/components/slides/style/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..591b2fbd72dcd5e987362d645b561bd2fac42716
--- /dev/null
+++ b/packages/opendesign/src/components/slides/style/index.ts
@@ -0,0 +1,2 @@
+import '../../style';
+import './index.scss';
diff --git a/packages/opendesign/src/components/slides/style/var.scss b/packages/opendesign/src/components/slides/style/var.scss
new file mode 100644
index 0000000000000000000000000000000000000000..1f49819f9362fab25a272c17eeea43b39e3aea57
--- /dev/null
+++ b/packages/opendesign/src/components/slides/style/var.scss
@@ -0,0 +1,5 @@
+.o-figure {
+ --figure-padding-top: 50%;
+ --figure-fit: 'cover';
+ --figure-position: 'center';
+}
diff --git a/packages/opendesign/src/components/slides/types.ts b/packages/opendesign/src/components/slides/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1481c9e43e7717d77250785fc1d93318e865d558
--- /dev/null
+++ b/packages/opendesign/src/components/slides/types.ts
@@ -0,0 +1,32 @@
+import { ExtractPropTypes, PropType } from 'vue';
+
+export const slidesProps = {
+ /**
+ * 激活索引
+ */
+ activeIndex: {
+ type: Number,
+ },
+ /**
+ * 样式类型
+ */
+ type: {
+ type: String as PropType<'carousel'|'switch'>,
+ default: 'switch'
+ },
+ /**
+ * 自动播放
+ */
+ autoPlay: {
+ type: Boolean
+ },
+ /**
+ * 自动播放间隔
+ */
+ interval: {
+ type: Number,
+ default: 5000
+ },
+};
+
+export type SlidesPropsT = ExtractPropTypes;
diff --git a/packages/portal/src/router.ts b/packages/portal/src/router.ts
index dad4b4cdb95268b7575956bb87658d3fc5418e46..3974fa0d56e5911344150bf97029c1db6dad21cd 100644
--- a/packages/portal/src/router.ts
+++ b/packages/portal/src/router.ts
@@ -176,6 +176,12 @@ export const routes = [
label: '消息提示 Message',
component: () => import('@components/message/__demo__/IndexMessage.vue'),
},
+ {
+ path: '/slides',
+ name: 'Slides',
+ label: '幻灯片 Slides',
+ component: () => import('@components/slides/__demo__/IndexSlides.vue'),
+ },
{
path: '/resize-observer',
name: 'ResizeObserver',
diff --git a/packages/scripts/src/gen-icons/index.ts b/packages/scripts/src/gen-icons/index.ts
index f1794bc7a5eef5f13c02b0084b9ae05203f8e4ec..90e8caabe515e8bab0d0729ee0188d71423f8275 100644
--- a/packages/scripts/src/gen-icons/index.ts
+++ b/packages/scripts/src/gen-icons/index.ts
@@ -20,7 +20,7 @@ export interface TokenConfigT {
*/
async function readConfig(cfg: string) {
const base = process.cwd();
- const configFile = path.resolve(base, cfg || './icons.config.ts');
+ const configFile = path.resolve(base, cfg || './icon.config.ts');
const cfgDir = path.dirname(configFile);
const configData: IconsConfig = await require(configFile);