diff --git a/.eslintrc.js b/.eslintrc.js index fef1ff46ab..696b1aebe4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -109,14 +109,12 @@ module.exports = { 'max-depth': 'off', '@typescript-eslint/member-ordering': 'off', 'array-callback-return': 'off', + 'import/no-unresolved': 'off', }, - "overrides": [ + overrides: [ { - "files": [ - "*.ts", - "*.tsx" - ], - "parser": "@typescript-eslint/parser" - } - ] + files: ['*.ts', '*.tsx'], + parser: '@typescript-eslint/parser', + }, + ], }; diff --git a/packages/devui-theme/scripts/release.js b/packages/devui-theme/scripts/release.js index 81598ffb0b..5657b6f61e 100644 --- a/packages/devui-theme/scripts/release.js +++ b/packages/devui-theme/scripts/release.js @@ -27,8 +27,10 @@ async function copyStylesVar() { const extendThemePath = path.resolve(__dirname, '../src/theme-collection/extend-theme.scss'); const extendThemeVuePath = path.resolve(__dirname, '../src/theme-collection/extend-theme-vue.scss'); async function copyExtendTheme() { - await shelljs.cp('-R', extendThemePath, outputDir); - await shelljs.cp('-R', extendThemeVuePath, outputDir); + const extendThemeDir = path.resolve(__dirname, '../build/theme-collection'); + await shelljs.mkdir(extendThemeDir); + await shelljs.cp('-R', extendThemePath, extendThemeDir); + await shelljs.cp('-R', extendThemeVuePath, extendThemeDir); } const typingsPath = path.resolve(__dirname, '../typings'); diff --git a/packages/devui-theme/src/styles-var/devui-var.scss b/packages/devui-theme/src/styles-var/devui-var.scss index 38e16ec7df..59dffb5549 100644 --- a/packages/devui-theme/src/styles-var/devui-var.scss +++ b/packages/devui-theme/src/styles-var/devui-var.scss @@ -1,9 +1,9 @@ -@import './private/basic'; +@import './private/animation'; @import './private/color'; -@import './private/shadow'; @import './private/corner'; -@import './private/font-size'; -@import './private/animation'; +@import './private/font'; +@import './private/shadow'; @import './private/z-index'; +@import './private/size'; $devui-prefix: devui; diff --git a/packages/devui-theme/src/styles-var/private/_animation.scss b/packages/devui-theme/src/styles-var/private/_animation.scss index d65b053765..29bf5a97c5 100644 --- a/packages/devui-theme/src/styles-var/private/_animation.scss +++ b/packages/devui-theme/src/styles-var/private/_animation.scss @@ -1,4 +1,6 @@ -$devui-animation-ease-in-smooth: var(--devui-animation-ease-in-smooth, cubic-bezier(0.645, 0.045, 0.355, 1)); +// Animation 动效 + +$devui-animation-ease-in-smooth: var(--devui-animation-ease-in-smooth, cubic-bezier(0.645, 0.045, 0.355, 1));// 命名与实际曲线不符,待废弃 $devui-animation-duration-slow: var(--devui-animation-duration-slow, 300ms); $devui-animation-duration-base: var(--devui-animation-duration-base, 200ms); diff --git a/packages/devui-theme/src/styles-var/private/_basic.scss b/packages/devui-theme/src/styles-var/private/_basic.scss index 2ad57aede0..0de4a3833e 100644 --- a/packages/devui-theme/src/styles-var/private/_basic.scss +++ b/packages/devui-theme/src/styles-var/private/_basic.scss @@ -1,7 +1,7 @@ -// Color +// 基础色值 + // 取色规则1: 所有使用颜色均需要在色板中选择 // 取色规则2: 除标签等用于功能分类及black,white的取色可以增加透明度(eg: rgba($devui-white-5,0.3),其余场景均不允许 -// need to run `node scripts/themeable/transfer-sass-var-to-theme-data.js ` when modified $devui-blue-5: #f2f5fc; $devui-blue-10: #e9edfa; @@ -114,9 +114,9 @@ $devui-purple-100: #2a0c85; $devui-gray-5: #f5f5f5; $devui-gray-10: #ebebeb; $devui-gray-20: #e0e0e0; -$devui-gray-30: #d1d1d1; +$devui-gray-30: #d1d1d1; $devui-gray-40: #bdbdbd; -$devui-gray-50: #a1a1a1; +$devui-gray-50: #8a8a8a; $devui-gray-60: #878787; $devui-gray-70: #707070; $devui-gray-80: #5c5c5c; @@ -132,10 +132,10 @@ $devui-slate-50: #babbc0; $devui-slate-60: #9b9fa8; $devui-slate-70: #71757f; $devui-slate-80: #575d6c; -$devui-slate-90: #383e4d; +$devui-slate-90: #323745; $devui-slate-100: #252b3a; -$devui-zinc-5: #f7f7f9; +$devui-zinc-5: #f8f8fa; $devui-zinc-10: #f2f2f3; $devui-zinc-20: #e2e2e6; $devui-zinc-30: #d5d5db; diff --git a/packages/devui-theme/src/styles-var/private/_color.scss b/packages/devui-theme/src/styles-var/private/_color.scss index 0555a76913..342dfbb124 100755 --- a/packages/devui-theme/src/styles-var/private/_color.scss +++ b/packages/devui-theme/src/styles-var/private/_color.scss @@ -106,6 +106,7 @@ $devui-primary-active: var(--devui-primary-active, $devui-blue-90); // 主要按 $devui-contrast-hover: var(--devui-contrast-hover, #d64a52); // 突出按钮悬停 $devui-contrast-active: var(--devui-contrast-active, #b12220); // 突出按钮激活 +$devui-contrast-disabled: var(--devui-contrast-disabled, #ffbcba); // 突出按钮禁用 // 状态 $devui-danger-line: var(--devui-danger-line, $devui-red-50); // 失败边框 diff --git a/packages/devui-theme/src/styles-var/private/_corner.scss b/packages/devui-theme/src/styles-var/private/_corner.scss index b6bfc60de8..2698a6abe2 100644 --- a/packages/devui-theme/src/styles-var/private/_corner.scss +++ b/packages/devui-theme/src/styles-var/private/_corner.scss @@ -1,6 +1,6 @@ -//圆角变量 +// Border Radius 圆角 $devui-border-radius: var(--devui-border-radius, 2px); //一般圆角 $devui-border-radius-feedback: var(--devui-border-radius-feedback, 4px); //反馈类圆角 -$devui-border-radius-card: var(--devui-border-radius-card, 6px); //卡片圆角 -$devui-border-radius-full: var(--devui-border-radius-full, 100px); +$devui-border-radius-card: var(--devui-border-radius-card, 8px); //卡片,弹窗圆角 +$devui-border-radius-full: var(--devui-border-radius-full, 100px); //暂不对外开放,用于开关,进度条等组件的圆角自适应宽高 diff --git a/packages/devui-theme/src/styles-var/private/_font.scss b/packages/devui-theme/src/styles-var/private/_font.scss new file mode 100644 index 0000000000..ee5bf0a34e --- /dev/null +++ b/packages/devui-theme/src/styles-var/private/_font.scss @@ -0,0 +1,24 @@ +// 字号大小变量 + +$devui-font-size: var(--devui-font-size, 12px); //正文、卡片副标题 +$devui-font-size-card-title: var(--devui-font-size-card-title, 14px); //卡片标题 +$devui-font-size-page-title: var(--devui-font-size-page-title, 16px); //页面标题 +$devui-font-size-message: var(--devui-font-size-page-title, 16px); //页面标题 +$devui-font-size-modal-title: var(--devui-font-size-modal-title, 18px); //弹窗标题、数字 +$devui-font-size-price: var(--devui-font-size-price, 20px); //购买价格 +$devui-font-size-data-overview: var(--devui-font-size-data-overview, 24px); //数据总览 + +$devui-font-size-h1-title: var(--devui-font-size-h1-title, 28px); +$devui-font-size-h2-title: var(--devui-font-size-h2-title, 24px); +$devui-font-size-h3-title: var(--devui-font-size-h3-title, 20px); +$devui-font-size-h4-title: var(--devui-font-size-h4-title, 18px); +$devui-font-size-h5-title: var(--devui-font-size-h5-title, 16px); + +$devui-font-size-icon: var(--devui-font-size-icon, 16px); //图标大小 +$devui-font-size-sm: var(--devui-font-size-sm, 12px); //当组件size为'sm'时使用此字号大小 +$devui-font-size-md: var(--devui-font-size-md, 12px); //当组件size为''时使用此字号大小 +$devui-font-size-lg: var(--devui-font-size-lg, 14px); //当组件size为'lg'时使用此字号大小 + +$devui-font-title-weight: var(--devui-font-title-weight, bold); //标题文字粗细 +$devui-font-content-weight: var(--devui-font-content-weight, normal); //内容文字粗细 +$devui-line-height-base: var(--devui-line-height-base, 1.5); //规范行高 diff --git a/packages/devui-theme/src/styles-var/private/_size.scss b/packages/devui-theme/src/styles-var/private/_size.scss new file mode 100644 index 0000000000..a58af37ec5 --- /dev/null +++ b/packages/devui-theme/src/styles-var/private/_size.scss @@ -0,0 +1,4 @@ +// 组件的size +$devui-size-sm: 24px; +$devui-size-md: 32px; +$devui-size-lg: 40px; diff --git a/packages/devui-theme/src/styles-var/private/_z-index.scss b/packages/devui-theme/src/styles-var/private/_z-index.scss index da358035f6..05328cb59e 100644 --- a/packages/devui-theme/src/styles-var/private/_z-index.scss +++ b/packages/devui-theme/src/styles-var/private/_z-index.scss @@ -1,12 +1,10 @@ -// 临时层 -// 若存在遮罩,则遮罩基于对应z-index值-1 +// zIndex 层级 + $devui-z-index-full-page-overlay: var(--devui-z-index-full-page-overlay, 1080); // 全屏覆盖类元素 $devui-z-index-pop-up: var(--devui-z-index-pop-up, 1060); // 提示类信息,popover,tooltip等 $devui-z-index-dropdown: var(--devui-z-index-dropdown, 1052); // 下拉菜单,dropdown等, 兼容, 取值待重新定义 -$devui-z-index-modal: var(--devui-z-index-modal, 1050); // 弹窗, -$devui-z-index-drawer: var(--devui-z-index-drawer, 1040); // 抽屉板 -$devui-z-index-framework: var(--devui-z-index-framework, 1000); // 框架类元素,header,sideMenu等 - -// 内容层,根据需要设置,zIndex需小于临时层 - -// 背景层,根据需要设置,zIndex需小于内容层 +$devui-z-index-modal: var(--devui-z-index-modal, 1050);// 弹窗, +$devui-z-index-message: var(--devui-z-index-modal, 1079);// 全局消息, +$devui-z-index-drawer: var(--devui-z-index-drawer, 1040);// 抽屉板 +$devui-z-index-framework: var(--devui-z-index-framework, 1000);// 框架类元素,header,sideMenu等 +$devui-z-index-function-widget: var(--devui-z-index-function-widget, 999); // 功能控件类(在一个组件中处于最上层) diff --git a/packages/devui-vue/devui-cli/commands/build.js b/packages/devui-vue/devui-cli/commands/build.js index cc7f7ba03a..f2dcdcd1ca 100644 --- a/packages/devui-vue/devui-cli/commands/build.js +++ b/packages/devui-vue/devui-cli/commands/build.js @@ -18,6 +18,13 @@ const baseConfig = defineConfig({ configFile: false, publicDir: false, plugins: [vue(), vueJsx()], + resolve: { + alias: [ + { find: '@devui/theme', replacement: path.resolve(__dirname, '../../../devui-theme/src') }, + { find: '@devui/shared/components', replacement: path.resolve(__dirname, '../../devui') }, + { find: '@devui', replacement: path.resolve(__dirname, '../../devui') }, + ] + } }); const rollupOptions = { diff --git a/packages/devui-vue/devui/accordion/src/accordion.scss b/packages/devui-vue/devui/accordion/src/accordion.scss index df2ba2af9b..0a545e9ef8 100644 --- a/packages/devui-vue/devui/accordion/src/accordion.scss +++ b/packages/devui-vue/devui/accordion/src/accordion.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-accordion__menu { ol, diff --git a/packages/devui-vue/devui/action-timeline/src/action-timeline.scss b/packages/devui-vue/devui/action-timeline/src/action-timeline.scss index 7fb3ac2734..42e7ea7075 100644 --- a/packages/devui-vue/devui/action-timeline/src/action-timeline.scss +++ b/packages/devui-vue/devui/action-timeline/src/action-timeline.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .dp-action-timeline { background-color: $devui-base-bg; diff --git a/packages/devui-vue/devui/alert/__tests__/alert.spec.ts b/packages/devui-vue/devui/alert/__tests__/alert.spec.ts index 50af8d5b4c..aea4841b22 100644 --- a/packages/devui-vue/devui/alert/__tests__/alert.spec.ts +++ b/packages/devui-vue/devui/alert/__tests__/alert.spec.ts @@ -1,12 +1,13 @@ import { mount } from '@vue/test-utils'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; import { h } from 'vue'; import Alert from '../src/alert'; const ns = useNamespace('alert', true); +const close = useNamespace('close', true); const baseClass = ns.b(); -const closeClass = ns.e('close-icon'); +const closeClass = close.b(); const iconClass = ns.e('icon'); const successIconClass = ns.em('icon', 'success'); const warningIconClass = ns.em('icon', 'warning'); diff --git a/packages/devui-vue/devui/alert/src/alert.scss b/packages/devui-vue/devui/alert/src/alert.scss index a0203b078b..07fa900edc 100644 --- a/packages/devui-vue/devui/alert/src/alert.scss +++ b/packages/devui-vue/devui/alert/src/alert.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-alert { color: $devui-text; @@ -18,7 +18,6 @@ } .#{$devui-prefix}-alert__content { - display: flex; padding: 0 16px 0 4px; word-break: normal; word-wrap: break-word; @@ -46,7 +45,6 @@ &.#{$devui-prefix}-alert--success { background-color: $devui-success-bg; - border-color: $devui-success-line; color: $devui-text; .#{$devui-prefix}-alert__close-icon { @@ -58,7 +56,6 @@ &.#{$devui-prefix}-alert--info { background-color: $devui-info-bg; - border-color: $devui-info-line; color: $devui-text; .#{$devui-prefix}-alert__close-icon { @@ -70,7 +67,6 @@ &.#{$devui-prefix}-alert--warning { background-color: $devui-warning-bg; - border-color: $devui-warning-line; color: $devui-text; .#{$devui-prefix}-alert__close-icon { @@ -82,7 +78,6 @@ &.#{$devui-prefix}-alert--danger { background-color: $devui-danger-bg; - border-color: $devui-danger-line; color: $devui-text; .#{$devui-prefix}-alert__close-icon { @@ -93,7 +88,6 @@ } &.#{$devui-prefix}-alert--simple { - border-color: $devui-line; color: $devui-text; .#{$devui-prefix}-alert__close-icon { @@ -167,7 +161,7 @@ margin-right: 4px; } -.#{$devui-prefix}-alter--close { +.#{$devui-prefix}-alert--close { margin: 0; padding-top: 0; padding-bottom: 0; diff --git a/packages/devui-vue/devui/alert/src/alert.tsx b/packages/devui-vue/devui/alert/src/alert.tsx index 82a81ee46c..6e4f0ffcf5 100644 --- a/packages/devui-vue/devui/alert/src/alert.tsx +++ b/packages/devui-vue/devui/alert/src/alert.tsx @@ -2,7 +2,7 @@ import { defineComponent, ref, Transition, onMounted } from 'vue'; import AlertCloseIcon from './components/alert-close-icon'; import AlertTypeIcon from './components/alert-type-icon'; import { alertProps } from './alert-types'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; import './alert.scss'; export default defineComponent({ @@ -47,14 +47,12 @@ export default defineComponent({ ) : null} -
- {ctx.slots.default?.()} - {props.closeable ? ( -
- -
- ) : null} -
+
{ctx.slots.default?.()}
+ {props.closeable ? ( +
+ +
+ ) : null} ) : null; diff --git a/packages/devui-vue/devui/alert/src/components/alert-type-icon.tsx b/packages/devui-vue/devui/alert/src/components/alert-type-icon.tsx index b716ba4b2d..d49e32eac5 100644 --- a/packages/devui-vue/devui/alert/src/components/alert-type-icon.tsx +++ b/packages/devui-vue/devui/alert/src/components/alert-type-icon.tsx @@ -1,5 +1,5 @@ import type { AlertType } from '../alert-types'; -import { useNamespace } from '../../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; const ns = useNamespace('alert'); const AlertTypeIcon = (props: { type: AlertType }): JSX.Element => ( diff --git a/packages/devui-vue/devui/anchor/src/anchor.scss b/packages/devui-vue/devui/anchor/src/anchor.scss index bd78bd2d62..1ae5cdaf70 100644 --- a/packages/devui-vue/devui/anchor/src/anchor.scss +++ b/packages/devui-vue/devui/anchor/src/anchor.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .mysidebar { width: 240px; diff --git a/packages/devui-vue/devui/auto-complete/src/auto-complete.scss b/packages/devui-vue/devui/auto-complete/src/auto-complete.scss index e263faff68..983164e1b0 100644 --- a/packages/devui-vue/devui/auto-complete/src/auto-complete.scss +++ b/packages/devui-vue/devui/auto-complete/src/auto-complete.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-auto-complete, .#{$devui-prefix}-auto-complete__menu { diff --git a/packages/devui-vue/devui/avatar/src/avatar.scss b/packages/devui-vue/devui/avatar/src/avatar.scss index 1677179872..bf323a180a 100644 --- a/packages/devui-vue/devui/avatar/src/avatar.scss +++ b/packages/devui-vue/devui/avatar/src/avatar.scss @@ -1,10 +1,10 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-avatar { display: inline-block; } -.#{$devui-prefix}-avatar__style { +.#{$devui-prefix}-avatar--style { display: inline-block; text-align: center; color: $devui-light-text; diff --git a/packages/devui-vue/devui/avatar/src/avatar.tsx b/packages/devui-vue/devui/avatar/src/avatar.tsx index e45e674e62..cca7df8517 100644 --- a/packages/devui-vue/devui/avatar/src/avatar.tsx +++ b/packages/devui-vue/devui/avatar/src/avatar.tsx @@ -2,13 +2,14 @@ import { defineComponent, watch, toRefs, ref, computed } from 'vue'; import AvatarBodyIcon from './components/avatar-body-icon'; import AvatarNoBodyIcon from './components/avatar-nobody-icon'; import { AvatarProps, avatarProps } from './avatar-types'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; import './avatar.scss'; export default defineComponent({ name: 'DAvatar', props: avatarProps, - setup(props: AvatarProps) { + emits: ['loadError'], + setup(props: AvatarProps, ctx) { const { name, width, height, customText, gender, imgSrc, isRound } = toRefs(props); const isNobody = ref(true); const isErrorImg = ref(false); @@ -17,7 +18,7 @@ export default defineComponent({ const nameDisplay = ref(); const ns = useNamespace('avatar'); - const styleNS = ns.e('style'); + const styleNS = ns.m('style'); const bgNS = computed(() => { return ns.m(`${'background-' + code.value}`); }); @@ -29,7 +30,7 @@ export default defineComponent({ } else if (gender.value.toLowerCase() === 'female') { code.value = 0; } else { - console.warn('gender must be "Male" or "Female"'); + throw new Error('gender must be "Male" or "Female"'); } return; } @@ -71,8 +72,9 @@ export default defineComponent({ getBackgroundColor(nameValue.substr(0, 1)); }; - const showErrorAvatar = (): void => { + const showErrorAvatar = (e: Event): void => { isErrorImg.value = true; + ctx.emit('loadError', e); }; const calcValues = (nameInput: string): void => { @@ -113,7 +115,7 @@ export default defineComponent({ const nameElement = ( ); - const noBody = (!imgSrc.value && isNobody.value) || isErrorImg.value ? noBodyElement : null; + const noBody = (!imgSrc.value && isNobody.value) || (imgSrc.value && isErrorImg.value) ? noBodyElement : null; return ( {hasImgSrc} diff --git a/packages/devui-vue/devui/back-top/src/back-top.scss b/packages/devui-vue/devui/back-top/src/back-top.scss index 948b1bbc01..75e68c5cbd 100644 --- a/packages/devui-vue/devui/back-top/src/back-top.scss +++ b/packages/devui-vue/devui/back-top/src/back-top.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-back-top { position: fixed; diff --git a/packages/devui-vue/devui/badge/src/badge.scss b/packages/devui-vue/devui/badge/src/badge.scss index 44d0c23823..8d7cea92a5 100644 --- a/packages/devui-vue/devui/badge/src/badge.scss +++ b/packages/devui-vue/devui/badge/src/badge.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-badge { position: relative; diff --git a/packages/devui-vue/devui/badge/src/badge.tsx b/packages/devui-vue/devui/badge/src/badge.tsx index 7ff3657671..8622054394 100644 --- a/packages/devui-vue/devui/badge/src/badge.tsx +++ b/packages/devui-vue/devui/badge/src/badge.tsx @@ -1,6 +1,6 @@ import { defineComponent, computed } from 'vue'; import { badgeProps, BadgeProps } from './badge-types'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; import './badge.scss'; type IStyleMap = Pick; diff --git a/packages/devui-vue/devui/breadcrumb/src/breadcrumb-item.scss b/packages/devui-vue/devui/breadcrumb/src/breadcrumb-item.scss index 52fe1623dd..6e7f5a7fbf 100644 --- a/packages/devui-vue/devui/breadcrumb/src/breadcrumb-item.scss +++ b/packages/devui-vue/devui/breadcrumb/src/breadcrumb-item.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-breadcrumb-font-style { font-size: $devui-font-size; diff --git a/packages/devui-vue/devui/breadcrumb/src/breadcrumb.scss b/packages/devui-vue/devui/breadcrumb/src/breadcrumb.scss index 731cbf162d..bca93bce8d 100644 --- a/packages/devui-vue/devui/breadcrumb/src/breadcrumb.scss +++ b/packages/devui-vue/devui/breadcrumb/src/breadcrumb.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-breadcrumb { display: flex; diff --git a/packages/devui-vue/devui/button/src/button-group.scss b/packages/devui-vue/devui/button/src/button-group.scss index efa0bea885..8a725fa674 100644 --- a/packages/devui-vue/devui/button/src/button-group.scss +++ b/packages/devui-vue/devui/button/src/button-group.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-button-group { display: flex; diff --git a/packages/devui-vue/devui/button/src/button.scss b/packages/devui-vue/devui/button/src/button.scss index 28ace67aa0..8742882c69 100644 --- a/packages/devui-vue/devui/button/src/button.scss +++ b/packages/devui-vue/devui/button/src/button.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; $devui-btn-padding: var(--devui-btn-padding, 0 20px); $devui-btn-common-bg: var(--devui-btn-common-bg, $devui-base-bg); diff --git a/packages/devui-vue/devui/card/src/card.scss b/packages/devui-vue/devui/card/src/card.scss index b0806f7ab1..15bb6875cb 100644 --- a/packages/devui-vue/devui/card/src/card.scss +++ b/packages/devui-vue/devui/card/src/card.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; $card-ele-space: var(--card-ele-space, 8px); $card-block-space: var(--card-block-space, 16px); diff --git a/packages/devui-vue/devui/carousel/src/carousel.scss b/packages/devui-vue/devui/carousel/src/carousel.scss index 1203fbbff5..98bf163b28 100644 --- a/packages/devui-vue/devui/carousel/src/carousel.scss +++ b/packages/devui-vue/devui/carousel/src/carousel.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; @mixin fixed-arrow-button() { position: absolute; @@ -13,6 +13,7 @@ display: inline-flex; align-items: center; justify-content: center; + border: 0; &:hover { background: $devui-area; diff --git a/packages/devui-vue/devui/carousel/src/carousel.tsx b/packages/devui-vue/devui/carousel/src/carousel.tsx index fa70369904..aeaed2d9f6 100644 --- a/packages/devui-vue/devui/carousel/src/carousel.tsx +++ b/packages/devui-vue/devui/carousel/src/carousel.tsx @@ -1,8 +1,8 @@ import { defineComponent, ref, watch, onMounted, onBeforeUnmount, Fragment, Comment, toRefs } from 'vue'; import type { VNode } from 'vue'; import { carouselProps, DotTrigger, CarouselProps } from './types'; -import Icon from '../../icon/src/icon'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { Icon } from '@devui/shared/components/icon'; +import { useNamespace } from '@devui/shared/utils'; import './carousel.scss'; export default defineComponent({ diff --git a/packages/devui-vue/devui/carousel/src/item.tsx b/packages/devui-vue/devui/carousel/src/item.tsx index 9627bcdb27..6f08729a53 100644 --- a/packages/devui-vue/devui/carousel/src/item.tsx +++ b/packages/devui-vue/devui/carousel/src/item.tsx @@ -1,5 +1,5 @@ import { defineComponent } from 'vue'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; export default defineComponent({ name: 'DCarouselItem', diff --git a/packages/devui-vue/devui/cascader/src/cascader.scss b/packages/devui-vue/devui/cascader/src/cascader.scss index 988a863897..3d91d87e7d 100644 --- a/packages/devui-vue/devui/cascader/src/cascader.scss +++ b/packages/devui-vue/devui/cascader/src/cascader.scss @@ -1,5 +1,5 @@ @import '../../style/mixins/flex'; -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-cascader { @include flex(flex-start); diff --git a/packages/devui-vue/devui/checkbox/__tests__/checkbox-button.spec.ts b/packages/devui-vue/devui/checkbox/__tests__/checkbox-button.spec.ts index 52ac38ee5c..d262fb40c8 100644 --- a/packages/devui-vue/devui/checkbox/__tests__/checkbox-button.spec.ts +++ b/packages/devui-vue/devui/checkbox/__tests__/checkbox-button.spec.ts @@ -1,7 +1,7 @@ import { mount } from '@vue/test-utils'; import { ref, nextTick } from 'vue'; import DCheckboxButton from '../src/checkbox-button'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; const ns = useNamespace('checkbox-button', true); const baseClass = ns.b(); diff --git a/packages/devui-vue/devui/checkbox/__tests__/checkbox-group.spec.ts b/packages/devui-vue/devui/checkbox/__tests__/checkbox-group.spec.ts index 29e24b498a..144deeb924 100644 --- a/packages/devui-vue/devui/checkbox/__tests__/checkbox-group.spec.ts +++ b/packages/devui-vue/devui/checkbox/__tests__/checkbox-group.spec.ts @@ -3,7 +3,7 @@ import { reactive, ref, nextTick } from 'vue'; import DCheckboxGroup from '../src/checkbox-group'; import DCheckbox from '../src/checkbox'; import DCheckboxButton from '../src/checkbox-button'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; const ns = useNamespace('checkbox', true); const baseClass = ns.b(); diff --git a/packages/devui-vue/devui/checkbox/__tests__/checkbox.spec.ts b/packages/devui-vue/devui/checkbox/__tests__/checkbox.spec.ts index 1d0997f7bd..a4020c0b3c 100644 --- a/packages/devui-vue/devui/checkbox/__tests__/checkbox.spec.ts +++ b/packages/devui-vue/devui/checkbox/__tests__/checkbox.spec.ts @@ -1,7 +1,7 @@ import { mount } from '@vue/test-utils'; import { ref, nextTick } from 'vue'; import DCheckbox from '../src/checkbox'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; const ns = useNamespace('checkbox', true); const baseClass = ns.b(); diff --git a/packages/devui-vue/devui/checkbox/src/checkbox-button.scss b/packages/devui-vue/devui/checkbox/src/checkbox-button.scss index be66e264af..9fdd1e8055 100644 --- a/packages/devui-vue/devui/checkbox/src/checkbox-button.scss +++ b/packages/devui-vue/devui/checkbox/src/checkbox-button.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; $devui-btn-sm-padding: var(--devui-btn-sm-padding, 0 16px); $devui-btn-padding: var(--devui-btn-padding, 0 20px); diff --git a/packages/devui-vue/devui/checkbox/src/checkbox-button.tsx b/packages/devui-vue/devui/checkbox/src/checkbox-button.tsx index 40bce055b9..941c9fedae 100644 --- a/packages/devui-vue/devui/checkbox/src/checkbox-button.tsx +++ b/packages/devui-vue/devui/checkbox/src/checkbox-button.tsx @@ -1,6 +1,6 @@ import { defineComponent, SetupContext } from 'vue'; import { checkboxProps, CheckboxProps } from './checkbox-types'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; import { useCheckbox, useCheckboxButton } from './use-checkbox'; import './checkbox-button.scss'; diff --git a/packages/devui-vue/devui/checkbox/src/checkbox-group.scss b/packages/devui-vue/devui/checkbox/src/checkbox-group.scss index 7cbe2622ee..b1d587a4b4 100644 --- a/packages/devui-vue/devui/checkbox/src/checkbox-group.scss +++ b/packages/devui-vue/devui/checkbox/src/checkbox-group.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-checkbox__group { display: inline-flex; diff --git a/packages/devui-vue/devui/checkbox/src/checkbox-group.tsx b/packages/devui-vue/devui/checkbox/src/checkbox-group.tsx index a7c29db57b..ba1e654460 100644 --- a/packages/devui-vue/devui/checkbox/src/checkbox-group.tsx +++ b/packages/devui-vue/devui/checkbox/src/checkbox-group.tsx @@ -2,7 +2,7 @@ import { defineComponent, SetupContext } from 'vue'; import { checkboxGroupProps, CheckboxGroupProps } from './checkbox-types'; import DCheckbox from './checkbox'; import './checkbox-group.scss'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; import { useCheckboxGroup } from './use-checkbox'; export default defineComponent({ diff --git a/packages/devui-vue/devui/checkbox/src/checkbox-types.ts b/packages/devui-vue/devui/checkbox/src/checkbox-types.ts index 1022e2242b..bf78effdec 100644 --- a/packages/devui-vue/devui/checkbox/src/checkbox-types.ts +++ b/packages/devui-vue/devui/checkbox/src/checkbox-types.ts @@ -36,7 +36,8 @@ const commonProps = { default: undefined, }, size: { - type: String as PropType + type: String as PropType, + default: 'md' }, } as const; @@ -142,8 +143,8 @@ export type UseCheckboxFn = { mergedIsShowTitle: ComputedRef; mergedShowAnimation: ComputedRef; mergedColor: ComputedRef; - itemWidth: number | undefined; - direction: string | undefined; + itemWidth: Ref | undefined; + direction: Ref | undefined; size: ComputedRef; border: ComputedRef; handleClick: (event: Event) => void; diff --git a/packages/devui-vue/devui/checkbox/src/checkbox.scss b/packages/devui-vue/devui/checkbox/src/checkbox.scss index 5ce3a58493..cc5f1f8c3d 100644 --- a/packages/devui-vue/devui/checkbox/src/checkbox.scss +++ b/packages/devui-vue/devui/checkbox/src/checkbox.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; $font-size-map: ( lg: $devui-font-size-lg, diff --git a/packages/devui-vue/devui/checkbox/src/checkbox.tsx b/packages/devui-vue/devui/checkbox/src/checkbox.tsx index 0c63529392..b94fef9115 100644 --- a/packages/devui-vue/devui/checkbox/src/checkbox.tsx +++ b/packages/devui-vue/devui/checkbox/src/checkbox.tsx @@ -1,6 +1,6 @@ -import { defineComponent, SetupContext } from 'vue'; +import { defineComponent, computed, SetupContext } from 'vue'; import { checkboxProps, CheckboxProps } from './checkbox-types'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; import { useCheckbox } from './use-checkbox'; import './checkbox.scss'; @@ -24,11 +24,11 @@ export default defineComponent({ } = useCheckbox(props, ctx); return () => { - const wrapperCls = { - [ns.e('column-margin')]: direction === 'column', - [ns.e('wrap')]: typeof itemWidth !== 'undefined', - }; - const wrapperStyle = itemWidth ? [`width: ${itemWidth}px`] : []; + const wrapperCls = computed(() => ({ + [ns.e('column-margin')]: direction?.value === 'column', + [ns.e('wrap')]: typeof itemWidth?.value !== 'undefined', + })); + const wrapperStyle = computed(() => (itemWidth?.value ? [`width: ${itemWidth.value}px`] : [])); const checkboxCls = { [ns.b()]: true, active: mergedChecked.value, @@ -66,9 +66,9 @@ export default defineComponent({ }; return ( -
+
-
); diff --git a/packages/devui-vue/devui/transfer/src/composables/use-transfer-body.ts b/packages/devui-vue/devui/transfer/src/composables/use-transfer-body.ts index d635e9533a..0bbbf48f42 100644 --- a/packages/devui-vue/devui/transfer/src/composables/use-transfer-body.ts +++ b/packages/devui-vue/devui/transfer/src/composables/use-transfer-body.ts @@ -191,7 +191,7 @@ export const transferBodyState = (props: TTransferBodyProps, ctx: SetupContext) if (props.drop && typeof props.drop === 'function') { props.drop(event, item); } - ctx.emit('updateDataPosition', dragHighlight.value, item.value); + ctx.emit('updateDataPosition', dragHighlight.value, item.value, dropPosition.value); }; /** * dragendHandle: 拖拽完成事件处理函数 diff --git a/packages/devui-vue/devui/transfer/src/composables/use-transfer-panel.ts b/packages/devui-vue/devui/transfer/src/composables/use-transfer-panel.ts index 28ed92901b..86796f157a 100644 --- a/packages/devui-vue/devui/transfer/src/composables/use-transfer-panel.ts +++ b/packages/devui-vue/devui/transfer/src/composables/use-transfer-panel.ts @@ -148,8 +148,8 @@ export const transferPanelState = (props: TTransferPanelProps, ctx: SetupContext * @param startValue 交换item的值 * @param endValue 目标交换item的值 */ - const updateDataHandle = (startValue: TKey, endValue: TKey) => { - ctx.emit(`updateData`, startValue, endValue); + const updateDataHandle = (startValue: TKey, endValue: TKey, position: number) => { + ctx.emit(`updateData`, startValue, endValue, position); }; watchEffect(() => { diff --git a/packages/devui-vue/devui/transfer/src/composables/use-transfer.ts b/packages/devui-vue/devui/transfer/src/composables/use-transfer.ts index 44f4888128..2b7d8fdd12 100644 --- a/packages/devui-vue/devui/transfer/src/composables/use-transfer.ts +++ b/packages/devui-vue/devui/transfer/src/composables/use-transfer.ts @@ -141,20 +141,40 @@ export const transferState = (props: TTransferProps, ctx: SetupContext) => { * @param startValue 当前拖拽item的值 * @param endValue 放开item的值 */ - const updateSourceDataHandle = (startValue: TKey, endValue: TKey) => { - const { startIndex, endIndex, dragItem, dropItem } = getDargItemAndDropItem(startValue, endValue, 'source'); - sourceData.value.splice(endIndex, 1, dragItem); - sourceData.value.splice(startIndex, 1, dropItem); + const updateSourceDataHandle = (startValue: TKey, endValue: TKey, position: number) => { + const { startIndex, endIndex, dragItem } = getDargItemAndDropItem(startValue, endValue, 'source'); + let end = endIndex; + if (position === 1) { + end = endIndex + 1; + } + if (startIndex < end) { + sourceData.value.splice(end, 0, dragItem); + sourceData.value.splice(startIndex, 1); + } else { + sourceData.value.splice(startIndex, 1); + sourceData.value.splice(end, 0, dragItem); + } + ctx.emit('sourceDragEnd', [...sourceData.value]); }; /** * updateTargetDataHandle: 更新target数据 * @param startValue 当前拖拽item的值 * @param endValue 放开item的值 */ - const updateTargetDataHandle = (startValue: TKey, endValue: TKey) => { - const { startIndex, endIndex, dragItem, dropItem } = getDargItemAndDropItem(startValue, endValue, 'target'); - targetData.value.splice(endIndex, 1, dragItem); - targetData.value.splice(startIndex, 1, dropItem); + const updateTargetDataHandle = (startValue: TKey, endValue: TKey, position: number) => { + const { startIndex, endIndex, dragItem } = getDargItemAndDropItem(startValue, endValue, 'target'); + let end = endIndex; + if (position === 1) { + end = endIndex + 1; + } + if (startIndex < end) { + targetData.value.splice(end, 0, dragItem); + targetData.value.splice(startIndex, 1); + } else { + targetData.value.splice(startIndex, 1); + targetData.value.splice(end, 0, dragItem); + } + ctx.emit('targetDragEnd', [...targetData.value]); }; onMounted(() => { diff --git a/packages/devui-vue/devui/transfer/src/transfer.scss b/packages/devui-vue/devui/transfer/src/transfer.scss index 837b1b80ec..e45c728a26 100644 --- a/packages/devui-vue/devui/transfer/src/transfer.scss +++ b/packages/devui-vue/devui/transfer/src/transfer.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; $devui-transfer-header-height: 40px; $devui-transfer-body-list-item-height: 32px; @@ -154,10 +154,6 @@ $devui-transfer-body-list-item-height: 32px; background-color: $devui-brand-foil; } - &-drag-over { - background-color: $devui-brand-hover; - } - .transfer-checkbox { height: 36px; line-height: 36px; diff --git a/packages/devui-vue/devui/transfer/src/transfer.tsx b/packages/devui-vue/devui/transfer/src/transfer.tsx index 1aece62fa8..e317fa7fdb 100644 --- a/packages/devui-vue/devui/transfer/src/transfer.tsx +++ b/packages/devui-vue/devui/transfer/src/transfer.tsx @@ -5,7 +5,7 @@ import transferOperate from './components/transfer-operate'; import { transferProps, TTransferProps, TKey, IItem } from './transfer-types'; import { transferState } from './composables/use-transfer'; import './transfer.scss'; -import { useNamespace } from '../../shared/hooks/use-namespace'; +import { useNamespace } from '@devui/shared/utils'; import { createI18nTranslate } from '../../locale/create'; export default defineComponent({ @@ -15,7 +15,7 @@ export default defineComponent({ transferOperate, }, props: transferProps, - emits: ['update:modelValue', 'change'], + emits: ['update:modelValue', 'change', 'sourceDragEnd', 'targetDragEnd'], setup(props: TTransferProps, ctx: SetupContext) { const app = getCurrentInstance(); const t = createI18nTranslate('DTransfer', app); @@ -72,8 +72,8 @@ export default defineComponent({ onChangeChecked={(value: IItem[]) => { updateSourceCheckedHandle(value); }} - onUpdateData={(startValue: TKey, endValue: TKey) => { - updateSourceDataHandle(startValue, endValue); + onUpdateData={(startValue: TKey, endValue: TKey, position: number) => { + updateSourceDataHandle(startValue, endValue, position); }}> { updateTargetCheckedHandle(value); }} - onUpdateData={(startValue: TKey, endValue: TKey) => { - updateTargetDataHandle(startValue, endValue); + onUpdateData={(startValue: TKey, endValue: TKey, position: number) => { + updateTargetDataHandle(startValue, endValue, position); }}>
); diff --git a/packages/devui-vue/devui/tree-select/src/tree-select.scss b/packages/devui-vue/devui/tree-select/src/tree-select.scss index c47b866d9f..c1ea171f80 100644 --- a/packages/devui-vue/devui/tree-select/src/tree-select.scss +++ b/packages/devui-vue/devui/tree-select/src/tree-select.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; $tree-select-input-height: 28px; $tree-select-dropdown-max-height: 300px; diff --git a/packages/devui-vue/devui/tree/src/tree.scss b/packages/devui-vue/devui/tree/src/tree.scss index 942c31d6e8..73a4f87e01 100644 --- a/packages/devui-vue/devui/tree/src/tree.scss +++ b/packages/devui-vue/devui/tree/src/tree.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; $keyframe-blue: #5e7ce0; diff --git a/packages/devui-vue/devui/upload/src/upload.scss b/packages/devui-vue/devui/upload/src/upload.scss index 6837f4604c..f2426ff4cf 100644 --- a/packages/devui-vue/devui/upload/src/upload.scss +++ b/packages/devui-vue/devui/upload/src/upload.scss @@ -1,4 +1,4 @@ -@import '../../styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .#{$devui-prefix}-input-group { position: relative; diff --git a/packages/devui-vue/docs/.vitepress/devui-theme/components/PageContributorConfig.ts b/packages/devui-vue/docs/.vitepress/devui-theme/components/PageContributorConfig.ts index 5740a132c2..aa13ab5cec 100644 --- a/packages/devui-vue/docs/.vitepress/devui-theme/components/PageContributorConfig.ts +++ b/packages/devui-vue/docs/.vitepress/devui-theme/components/PageContributorConfig.ts @@ -32,16 +32,6 @@ export const CONTRIBUTORS_MAP: IContributingMap = { homepage: 'https://github.com/qinwencheng' }, ], - dragdrop: [ - { - avatar: 'https://avatars.githubusercontent.com/u/61737780?v=4', - homepage: 'https://github.com/asdlml6' - }, - { - avatar: 'https://avatars.githubusercontent.com/u/9566362?v=4', - homepage: 'https://github.com/kagol' - }, - ], fullscreen: [ { avatar: 'https://avatars.githubusercontent.com/u/20532893?v=4', diff --git a/packages/devui-vue/docs/.vitepress/devui-theme/styles/demo-block.scss b/packages/devui-vue/docs/.vitepress/devui-theme/styles/demo-block.scss index fd7d31c925..03b4aa4bce 100644 --- a/packages/devui-vue/docs/.vitepress/devui-theme/styles/demo-block.scss +++ b/packages/devui-vue/docs/.vitepress/devui-theme/styles/demo-block.scss @@ -1,4 +1,4 @@ -@import '@devui/styles-var/devui-var.scss'; +@import '@devui/theme/styles-var/devui-var.scss'; .demo-block { border: solid 1px $devui-dividing-line !important; diff --git a/packages/devui-vue/docs/.vitepress/theme/index.ts b/packages/devui-vue/docs/.vitepress/theme/index.ts index 7de2d9a71d..d77decc5af 100644 --- a/packages/devui-vue/docs/.vitepress/theme/index.ts +++ b/packages/devui-vue/docs/.vitepress/theme/index.ts @@ -1,15 +1,40 @@ -import DevUI from '../../../devui/vue-devui' -import Locale from '../../../devui/locale' -import Theme from '../devui-theme' -import 'vitepress-theme-demoblock/theme/styles/index.css' -import { registerComponents } from './register-components.js' -import { insertBaiduScript } from './insert-baidu-script' +import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'; +import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'; +import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'; +import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'; +import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'; +import DevUI from '../../../devui/vue-devui'; +import Locale from '../../../devui/locale'; +import Theme from '../devui-theme'; +import 'vitepress-theme-demoblock/theme/styles/index.css'; +import { registerComponents } from './register-components.js'; +import { insertBaiduScript } from './insert-baidu-script'; + +if (typeof window !== 'undefined') { + self.MonacoEnvironment = { + getWorker(_, label) { + if (label === 'json') { + return new jsonWorker(); + } + if (label === 'css' || label === 'scss' || label === 'less') { + return new cssWorker(); + } + if (label === 'html' || label === 'handlebars' || label === 'razor') { + return new htmlWorker(); + } + if (label === 'typescript' || label === 'javascript') { + return new tsWorker(); + } + return editorWorker(); + }, + }; +} export default { ...Theme, enhanceApp({ app }) { - app.use(Locale).use(DevUI) - registerComponents(app) - insertBaiduScript() - } -} \ No newline at end of file + app.use(Locale).use(DevUI); + registerComponents(app); + insertBaiduScript(); + }, +}; diff --git a/packages/devui-vue/docs/components/alert/index.md b/packages/devui-vue/docs/components/alert/index.md index 6c87c2f62e..048381f8e5 100644 --- a/packages/devui-vue/docs/components/alert/index.md +++ b/packages/devui-vue/docs/components/alert/index.md @@ -14,14 +14,19 @@ ```vue + ``` ::: @@ -34,12 +39,12 @@ ```vue + ``` ::: @@ -66,14 +76,19 @@ export default { ```vue + ``` ::: @@ -84,14 +99,19 @@ export default { ```vue + ``` ::: diff --git a/packages/devui-vue/docs/components/avatar/index.md b/packages/devui-vue/docs/components/avatar/index.md index db97cafefd..457a53a622 100644 --- a/packages/devui-vue/docs/components/avatar/index.md +++ b/packages/devui-vue/docs/components/avatar/index.md @@ -21,7 +21,6 @@
- ``` ::: ### CodeReview 参数 -| 参数名 | 类型 | 默认值 | 说明 | -| :------------ | :---------------------------- | :------------- | :---------------------------------------- | -| diff | `string` | '' | 必选,diff 内容 | -| fold | `boolean` | false | 可选,是否折叠显示 | -| output-format | [OutputFormat](#outputformat) | 'line-by-line' | 可选,diff 展示格式,单栏展示或者分栏展示 | +| 参数名 | 类型 | 默认值 | 说明 | +| :--------------- | :------------------------------------------------------------------ | :------------- | :--------------------------------------------------------------------------------- | +| diff | `string` | '' | 必选,diff 内容 | +| fold | `boolean` | false | 可选,是否折叠显示 | +| allow-comment | `boolean` | true | 可选,是否支持评论 | +| show-blob | `boolean` | false | 可选,是否展示缩略内容,一般大文件或二进制文件等需要展示缩略内容时使用 | +| output-format | [OutputFormat](#outputformat) | 'line-by-line' | 可选,diff 展示格式,单栏展示或者分栏展示 | +| allow-expand | `boolean` | true | 可选,是否支持展开非 diff 折叠代码 | +| expand-threshold | `number` | 50 | 可选,展开所有代码行的阈值,低于此阈值全部展开,高于此阈值分向上和向下两个操作展开 | +| expand-loader | `(interval: Array, update: (code: string) => void) => void` | -- | 可选,展开代码回调函数,interval 为展开边界,获取展开代码后,执行 update 更新视图 | ### CodeReview 事件 -| 事件名 | 类型 | 说明 | -| :---------- | :------------------ | :------------------------------------------------- | -| fold-change | `Function(boolean)` | 折叠状态改变时触发的事件,回传参数为当前的折叠状态 | +| 事件名 | 类型 | 说明 | +| :-------------- | :------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ | +| fold-change | `Function(status: boolean)` | 折叠状态改变时触发的事件,回传参数为当前的折叠状态 | +| add-comment | `Function(position: CommentPosition)` | 点击添加评论图标时触发的事件,参数内容详见[CommentPosition](#commentposition) | +| after-view-init | `Function(methods: CodeReviewMethods)` | 初始化完成后触发的事件,返回相关操作方法,参数内容详见[CodeReviewMethods](#codereviewmethods) | +| content-refresh | `Function(diffFile: DiffFile)` | 内容刷新后触发的事件,返回解析后的相关文件信息,参数内容详见[DiffFile](https://github.com/rtfpessoa/diff2html/blob/master/src/types.ts#L49) | -### CodeReview 方法 +### CodeReview 插槽 -| 方法名 | 类型 | 说明 | -| :--------- | :--------------------------- | :------------------------------------------- | -| toggleFold | `(status?: boolean) => void` | 切换折叠状态。可通过 status 参数设置折叠状态 | +| 插槽名 | 说明 | +| :---------- | :------------------------------------------------------- | +| headOperate | 自定义 head 右侧操作区内容 | +| blob | 自定义需要展示的缩略内容,文件为大文件或二进制文件时使用 | ### 接口定义 @@ -58,3 +315,35 @@ export default defineComponent({ ```ts type OutputFormat = 'line-by-line' | 'side-by-side'; ``` + +#### LineSide + +```ts +type LineSide = 'left' | 'right'; +``` + +#### CommentPosition + +line-by-line 模式,left 表示左侧一栏的行号,right 表示右侧一栏的行号;当添加评论的位置没有发生内容变更时,left 和 right 均为具体行号;当添加评论的位置内容被删除时,left 为具体行号,right 为-1;当添加评论的位置为新增内容时,left 为-1,right 为具体行号。 + +```ts +interface CommentPosition { + left: number; + right: number; +} +``` + +#### CodeReviewMethods + +```ts +interface CodeReviewMethods { + // 切换折叠状态,可通过 status 参数设置折叠状态 + toggleFold: (status?: boolean) => void; + + // 插入评论的方法,传入行号、left/right、评论块DOM结构 + insertComment: (lineNumber: number, lineSide: LineSide, commentDom: HTMLElement) => void; + + // 删除评论的方法,传入行号、left/right + removeComment: (lineNumber: number, lineSide: LineSide) => void; +} +``` diff --git a/packages/devui-vue/docs/components/dragdrop/index.md b/packages/devui-vue/docs/components/dragdrop/index.md index 5c5891f1ee..3821e56e7f 100644 --- a/packages/devui-vue/docs/components/dragdrop/index.md +++ b/packages/devui-vue/docs/components/dragdrop/index.md @@ -4,47 +4,141 @@ #### 何时使用 -当需要使用数个操作步骤,且步骤的顺序需要灵活调整时。 +当需要进行元素拖拽、元素拖拽排序等场景。 -### 基本用法 +### Sortable 基本用法 -:::demo 从一个container拖动到另外一个container。 +:::demo 容器内拖拽排序。 ```vue - - -
-
Drop Area With Sortable
-
+ + + +``` + +::: + +### Sortable 指定可拖拽区域 + +:::demo 容器内拖拽排序指定拖拽元素。 + +```vue + ``` ::: -### Draggable 参数 +### Sortable 参数 | 参数 | 类型 | 默认 | 说明 | 跳转 Demo | | --------- | ------------------------- | --------- | ------------------------------------------------ | --------------------- | -| dragData | any | -- | 可选,转递给 DropEvent事件的数据 | [基本用法](#基本用法) | -| dragScope | string \| Array\ | 'default' | 可选,限制 drop 的位置,必须匹配对应的 dropScope | [基本用法](#基本用法) | +| list | any | -- | 可选,排序绑定的数据(拖拽排序后将自动变更) | [Sortable-基本用法](#sortable-基本用法) | +| handle | string | -- | 可选,限制可拖拽的元素,注意这里为为css选择器string | [Sortable-指定可拖拽区域](#sortable-指定可拖拽区域) | +| dragClass | string | 'devui-drag-item' | 可选,拖拽中元素附加的class | [Sortable-指定可拖拽区域](#sortable-指定可拖拽区域) | -### Draggable 事件 +### Sortable 事件 | 事件 | 类型 | 说明 | 跳转 Demo | | ---- | ---- | ---- | --------- | -| dragStartEvent | EventEmitter\ | 开始拖动的 DragStart 事件 | [基本用法](#基本用法) | -| dragEndEvent | EventEmitter\ | 拖动结束的 DragEnd 事件 | [基本用法](#基本用法) | -| dropEndEvent | EventEmitter\ | 放置结束的 Drop 事件 | [基本用法](#基本用法) | -| dragEnterEvent | EventEmitter\ | drag 元素进入的 dragenter 事件 | [基本用法](#基本用法) | -| dragOverEvent | EventEmitter\ | drag 元素在 drop 区域上的 dragover 事件 | [基本用法](#基本用法) | -| dragLeaveEvent | EventEmitter\ | drag 元素离开的 dragleave 事件 | [基本用法](#基本用法) | -| dropEvent | EventEmitter\ | 放置一个元素, 接收的事件,其中 nativeEvent 表示原生的 drop 事件,其他见定义注释 | [基本用法](#基本用法) | +| dragStart | EventEmitter\ | 开始拖动的 DragStart 事件 | [Sortable-基本用法](#sortable-基本用法) | +| dragEnd | EventEmitter\ | 拖动结束的 DragEnd 事件 | [Sortable-基本用法](#sortable-基本用法) | +| dragEnter | EventEmitter\ | drag 元素进入的 dragenter 事件 | [Sortable-基本用法](#sortable-基本用法) | +| dragOver | EventEmitter\ | drag 元素在 drop 区域上的 dragover 事件 | [Sortable-基本用法](#sortable-基本用法) | +| dragLeave | EventEmitter\ | drag 元素离开的 dragleave 事件 | [Sortable-基本用法](#sortable-基本用法) | +| drop | EventEmitter\ | 放置一个元素, 接收的事件,其中 nativeEvent 表示原生的 drop 事件,其他见定义注释 | [Sortable-基本用法](#sortable-基本用法) | + +### Sortable 类型定义 +#### DropEvent +```ts +type DropEvent = { + event: DragEvent, // 原生drag事件 + list: any, // 当前绑定的list(与传入list为同一对象) + fromIndex: number, // 拖拽开始的元素index + targetIndex: number // drop到的元素的index +} +``` + diff --git a/packages/devui-vue/docs/components/editor-md/index.md b/packages/devui-vue/docs/components/editor-md/index.md index 497b913cf3..9c00a8e3a0 100644 --- a/packages/devui-vue/docs/components/editor-md/index.md +++ b/packages/devui-vue/docs/components/editor-md/index.md @@ -15,7 +15,7 @@ import { defineComponent, reactive, ref } from 'vue'; export default defineComponent({ setup() { - const content = ref('`Not use ngModel` aaa'); + const content = ref('# This is the title'); const mdRules = reactive({ linkify: { fuzzyLink: false, @@ -127,7 +127,7 @@ import { defineComponent, reactive, ref } from 'vue'; export default defineComponent({ setup() { - const content = ref('`Not use ngModel` aaa'); + const content = ref('# This is the title'); const mdRules = reactive({ linkify: { fuzzyLink: false, @@ -156,28 +156,99 @@ export default defineComponent({ ::: +### 配置图片文件上传 + +:::demo 设置 imageUploadToServer 后,编辑器对粘贴操作也将进行监听,若有图片也将触发 imageUpload 事件。 + +```vue + + + +``` + +::: + ### EditorMd 参数 -| 参数名 | 类型 | 默认值 | 说明 | -| :-------------------- | :---------------------------------------- | :------- | :----------------------------------------------------------------------------------------------------------------- | -| v-model | `string` | '' | 编辑器内容双向绑定 | -| options | `object` | {} | 编辑器初始化时,自定义配置,可参考[CodeMirror Options](https://codemirror.net/doc/manual.html#config) | -| base-url | `string` | -- | 设置渲染到 html 时,为相对 url 添加的 baseUrl | -| custom-parse | `(html: string) => string` | -- | 自定义对渲染后的 html 处理,需要接收渲染后的 html,返回自定义处理后的 html | -| md-rules | `object` | {} | 设置 markdown 对字符串的处理方式, 可参考[markdown-it](https://www.npmjs.com/package/markdown-it?activeTab=readme) | -| mode | `'editonly' \| 'readonly' \| 'normal'` | 'normal' | 只写/只读/双栏显示模式选择,默认 'normal' 双栏模式显示 | -| custom-renderer-rules | [ICustomRenderRule[]](#icustomrenderrule) | [] | 自定义 markdown 对节点的渲染方式,每条规则需要指定对应节点 key,并自定义渲染函数 | -| custom-xss-rules | [ICustomXssRule[]](#icustomxssrule) | [] | 自定义 xss 对某种 tag 的过滤方式,每条规则需要指定 tag, 并给出需要加入白名单的属性数组 | -| placeholder | `string` | '' | 编辑器无内容是的提示信息 | -| fullscreen-z-index | `number` | 10 | 编辑器全屏状态的 z-index | +| 参数名 | 类型 | 默认值 | 说明 | +| :--------------------- | :---------------------------------------- | :------- | :----------------------------------------------------------------------------------------------------------------- | +| v-model | `string` | '' | 编辑器内容双向绑定 | +| options | `object` | {} | 编辑器初始化时,自定义配置,可参考[CodeMirror Options](https://codemirror.net/doc/manual.html#config) | +| base-url | `string` | -- | 设置渲染到 html 时,为相对 url 添加的 baseUrl | +| custom-parse | `(html: string) => string` | -- | 自定义对渲染后的 html 处理,需要接收渲染后的 html,返回自定义处理后的 html | +| md-rules | `object` | {} | 设置 markdown 对字符串的处理方式, 可参考[markdown-it](https://www.npmjs.com/package/markdown-it?activeTab=readme) | +| mode | `'editonly' \| 'readonly' \| 'normal'` | 'normal' | 只写/只读/双栏显示模式选择,默认 'normal' 双栏模式显示 | +| custom-renderer-rules | [ICustomRenderRule[]](#icustomrenderrule) | [] | 自定义 markdown 对节点的渲染方式,每条规则需要指定对应节点 key,并自定义渲染函数 | +| custom-xss-rules | [ICustomXssRule[]](#icustomxssrule) | [] | 自定义 xss 对某种 tag 的过滤方式,每条规则需要指定 tag, 并给出需要加入白名单的属性数组 | +| placeholder | `string` | '' | 编辑器无内容是的提示信息 | +| fullscreen-z-index | `number` | 10 | 编辑器全屏状态的 z-index | +| image-upload-to-server | `boolean` | false | 是否打开图片自定义上传开关(打开后将将监听图片的复制,toolbar 图片功能上传,传出事件回调) | ### EditorMd 事件 -| 事件名 | 回调参数 | 说明 | 跳转 Demo | -| :--------------------- | :--------------------------- | :------------------------------- | :-------- | -| after-editor-init | `Function(instance: object)` | 编辑器初始化事件,返回编辑器对象 | | -| content-change | `Function(content: string)` | 编辑器内容改变事件,返回当前内容 | | -| preview-content-change | `Function()` | 预览内容改变时触发 | | +| 事件名 | 回调参数 | 说明 | 跳转 Demo | +| :--------------------- | :--------------------------- | :----------------------------------------------------------------- | :-------- | +| after-editor-init | `Function(instance: object)` | 编辑器初始化事件,返回编辑器对象 | | +| content-change | `Function(content: string)` | 编辑器内容改变事件,返回当前内容 | | +| preview-content-change | `Function()` | 预览内容改变时触发 | | +| image-upload | `Function({file, callback})` | 打开图片上传开关后,图片上传事件回调,返回文件内容与 callback 函数 | | ### MdRender 参数 diff --git a/packages/devui-vue/docs/components/form/index.md b/packages/devui-vue/docs/components/form/index.md index 6f574d8b94..bf4134f14a 100644 --- a/packages/devui-vue/docs/components/form/index.md +++ b/packages/devui-vue/docs/components/form/index.md @@ -663,6 +663,7 @@ export default defineComponent({ | show-feedback | `boolean` | false | 可选,是否展示校验结果反馈图标 | | | disabled | `boolean` | false | 可选,是否禁用该表单内的所有组件。 | | | size | [FormSize](#formsize) | -- | 可选,用于控制该表单内组件的尺寸 | | +| hide-required-mark | `boolean` | false | 可选,是否隐藏所有表单项的必选标记 | | ### Form 事件 diff --git a/packages/devui-vue/docs/components/git-graph/index.md b/packages/devui-vue/docs/components/git-graph/index.md new file mode 100644 index 0000000000..8deefb8397 --- /dev/null +++ b/packages/devui-vue/docs/components/git-graph/index.md @@ -0,0 +1,187 @@ +# GitGraph 提交网络图 + +绘制git历史。 + +### 基本用法 + +:::demo + +```vue + + + + + +``` + +::: + + +### GitGraph 参数 + +| 参数 | 类型 | 默认 | 说明 | 跳转 Demo | +| ---- | ---- | ---- | ---- | --------- | +|options | `GitGraphData` | -- | 必选,网络图的信息对象 |[基本用法](#基本用法) | + +### GitGraph 类型定义 + +#### GitGraphData + +```ts +interface GitGraphData { + /** + * 绘图数据 + */ + data: { + /** + * 提交日期数据 + * @example [['7日', '7月'], ['6日', '7月']] + */ + days: string[][]; + commits: CommitInfo[]; + }; + /** + * 跳转更改页面的url模板,会自动替换其中的‘{commitId}’ + * @example https://xxxx/{commitId} + */ + commit_url: string; + params: { + /** + * 时间提示,默认为'xx天前','xx小时前','xx分钟前','1分钟前' + */ + daysBefore?: string; + hoursAgo?: string; + minutesAgo?: string; + aMinutesAgo?: string; + /** + * 用户名称最大长度 + */ + maxNameLength?: number; + } +} +``` + +#### CommitInfo + +```ts +interface CommitInfo { + // 提交者信息 + author: { + name: string; + email: string; + /** + * 提交者头像地址 + */ + avatar_url?: string; + } + /** + * 提交时间 + */ + date: string; + id: string; + /** + * commit信息 + */ + message: string; + /** + * 父级节点信息,包含父级的id和space + * @example [['deffajsdfasdasd056215421', 1], ['asdasdasddkfhjksdfhkjegfajszbg', 3]] + */ + parents: any[][]; + /** + * 分支名称或标签名称 + */ + refs?: string; + /** + * 横向空间位置,从主分支为1开始,没向外一层+2,第i层为2i - 1 + * 用于计算绘图尺寸和横向最大宽度 + */ + space: number; + /** + * 等于commits数组index,用于计算纵向尺寸 + */ + time: number; + /** + * 可选,自定义点击commit信息的跳转url + */ + customUrl?: string; + /** + * 分支名称,展示在hover面板中 + */ + branch?: string; + hasDrawn?: boolean; +} +``` \ No newline at end of file diff --git a/packages/devui-vue/docs/components/modal/index.md b/packages/devui-vue/docs/components/modal/index.md index 481a8a1f9a..71e07e03a2 100644 --- a/packages/devui-vue/docs/components/modal/index.md +++ b/packages/devui-vue/docs/components/modal/index.md @@ -176,12 +176,11 @@ export default defineComponent({ ### 关闭前回调 -:::demo `before-close`在用户点击关闭按钮或者遮罩层时会被调用,可在完成某些异步操作后,通过`done`参数关闭。 - +:::demo `before-close`在用户点击关闭按钮或者遮罩层时会被调用,可在完成某些异步操作后,通过`done`参数关闭。`close`在Modal关闭时触发。 ```vue