@gx-design-vue/create-gx-cli 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- package/package.json +1 -1
- package/src/main.js +1 -0
- package/template-design-pro/.editorconfig +19 -0
- package/template-design-pro/.env +2 -0
- package/template-design-pro/.env.development +18 -0
- package/template-design-pro/.env.pro +32 -0
- package/template-design-pro/.env.production +32 -0
- package/template-design-pro/.env.test +20 -0
- package/template-design-pro/.eslintignore +16 -0
- package/template-design-pro/.eslintrc.js +64 -0
- package/template-design-pro/.gitpod.yml +6 -0
- package/template-design-pro/.husky/pre-commit +4 -0
- package/template-design-pro/.prettierignore +9 -0
- package/template-design-pro/.stylelintignore +3 -0
- package/template-design-pro/.yarnclean +48 -0
- package/template-design-pro/LICENSE +21 -0
- package/template-design-pro/README.md +111 -0
- package/template-design-pro/build/constant.ts +6 -0
- package/template-design-pro/build/generate/generateModifyVars.ts +18 -0
- package/template-design-pro/build/getConfigFileName.ts +13 -0
- package/template-design-pro/build/script/buildConf.ts +44 -0
- package/template-design-pro/build/script/postBuild.ts +25 -0
- package/template-design-pro/build/script/reSetRootHtml.ts +20 -0
- package/template-design-pro/build/utils.ts +85 -0
- package/template-design-pro/build/vite/cdn.ts +7 -0
- package/template-design-pro/build/vite/optimizer.ts +22 -0
- package/template-design-pro/build/vite/plugin/autoImport.ts +18 -0
- package/template-design-pro/build/vite/plugin/compress.ts +35 -0
- package/template-design-pro/build/vite/plugin/hmr.ts +25 -0
- package/template-design-pro/build/vite/plugin/html.ts +47 -0
- package/template-design-pro/build/vite/plugin/index.ts +89 -0
- package/template-design-pro/build/vite/plugin/mock.ts +20 -0
- package/template-design-pro/build/vite/plugin/pwa.ts +37 -0
- package/template-design-pro/build/vite/plugin/styleImport.ts +129 -0
- package/template-design-pro/build/vite/plugin/visualizer.ts +17 -0
- package/template-design-pro/build/vite/plugin/vite-plugin-antd-theme/index.ts +24 -0
- package/template-design-pro/build/vite/plugin/vite-plugin-mock/createMockServer.ts +303 -0
- package/template-design-pro/build/vite/plugin/vite-plugin-mock/createProdMockServer.ts +93 -0
- package/template-design-pro/build/vite/plugin/vite-plugin-mock/index.ts +68 -0
- package/template-design-pro/build/vite/plugin/vite-plugin-mock/types.ts +30 -0
- package/template-design-pro/build/vite/plugin/vite-plugin-mock/utils.ts +26 -0
- package/template-design-pro/commitlint.config.js +32 -0
- package/template-design-pro/config/config.ts +14 -0
- package/template-design-pro/config/default/animate.ts +30 -0
- package/template-design-pro/config/default/defaultSettings.ts +75 -0
- package/template-design-pro/config/default/network.ts +16 -0
- package/template-design-pro/config/default/proxy.ts +26 -0
- package/template-design-pro/config/default/theme.ts +43 -0
- package/template-design-pro/config/default/themeColor.ts +62 -0
- package/template-design-pro/index.html +45 -0
- package/template-design-pro/jest.config.mjs +36 -0
- package/template-design-pro/mock/_createProductionServer.ts +19 -0
- package/template-design-pro/mock/_util.ts +55 -0
- package/template-design-pro/mock/controller/menu.ts +85 -0
- package/template-design-pro/mock/controller/notices.ts +114 -0
- package/template-design-pro/mock/system/dict.ts +60 -0
- package/template-design-pro/mock/system/user.ts +218 -0
- package/template-design-pro/package.json +151 -0
- package/template-design-pro/pnpm-lock.yaml +9913 -0
- package/template-design-pro/postcss.config.js +5 -0
- package/template-design-pro/prettier.config.js +18 -0
- package/template-design-pro/public/resource/css/index.css +171 -0
- package/template-design-pro/public/resource/img/favicon.ico +0 -0
- package/template-design-pro/public/resource/img/logo.png +0 -0
- package/template-design-pro/public/resource/img/pro_icon.svg +5 -0
- package/template-design-pro/public/resource/img/pwa-192x192.png +0 -0
- package/template-design-pro/public/resource/img/pwa-512x512.png +0 -0
- package/template-design-pro/src/App.vue +47 -0
- package/template-design-pro/src/assets/error_images/403.png +0 -0
- package/template-design-pro/src/assets/error_images/404.png +0 -0
- package/template-design-pro/src/assets/error_images/cloud.png +0 -0
- package/template-design-pro/src/assets/login_images/login_background.svg +69 -0
- package/template-design-pro/src/assets/logo.png +0 -0
- package/template-design-pro/src/assets/menu_font/iconfont.css +94 -0
- package/template-design-pro/src/assets/menu_font/iconfont.eot +0 -0
- package/template-design-pro/src/assets/menu_font/iconfont.js +1 -0
- package/template-design-pro/src/assets/menu_font/iconfont.json +142 -0
- package/template-design-pro/src/assets/menu_font/iconfont.svg +57 -0
- package/template-design-pro/src/assets/menu_font/iconfont.ttf +0 -0
- package/template-design-pro/src/assets/menu_font/iconfont.woff +0 -0
- package/template-design-pro/src/assets/menu_font/iconfont.woff2 +0 -0
- package/template-design-pro/src/assets/menu_font/index.less +94 -0
- package/template-design-pro/src/common/global.ts +1 -0
- package/template-design-pro/src/components/GDesign/ProLayout/BasicLayout.less +80 -0
- package/template-design-pro/src/components/GDesign/ProLayout/BasicLayout.tsx +342 -0
- package/template-design-pro/src/components/GDesign/ProLayout/PageLoading.tsx +20 -0
- package/template-design-pro/src/components/GDesign/ProLayout/RenderTypings.ts +31 -0
- package/template-design-pro/src/components/GDesign/ProLayout/RouteContext.tsx +82 -0
- package/template-design-pro/src/components/GDesign/ProLayout/WrapContent.tsx +69 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalFooter/index.tsx +88 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalHeader/DefaultHeader.tsx +189 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalHeader/Header.less +8 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalHeader/index.tsx +105 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalHeader/props.ts +69 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalHeader/style.less +144 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/LogoContent/index.tsx +81 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/LogoContent/props.ts +29 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/MultiTab/index.tsx +384 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/MultiTab/props.ts +15 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/MultiTab/style.less +79 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/NoticeIcon/NoticeIcon.tsx +148 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/NoticeIcon/NoticeList.module.less +115 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/NoticeIcon/NoticeList.tsx +154 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/NoticeIcon/index.less +39 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/NoticeIcon/index.tsx +133 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/PageContainer/index.tsx +190 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/PageContainer/props.ts +48 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/PageContainer/style.less +128 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/PageContainer/typings.ts +0 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/RightContent/AvatarDropdown.tsx +63 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/RightContent/HeaderSearch.tsx +122 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/RightContent/headerSearch.less +30 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/RightContent/index.tsx +95 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/RightContent/style.less +90 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/SettingDrawer/BlockCheckbox.tsx +70 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/SettingDrawer/LayoutSetting.tsx +107 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/SettingDrawer/ThemeColor.tsx +68 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/SettingDrawer/index.tsx +346 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/BaseMenu.tsx +224 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/SiderMenu.tsx +224 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/index.tsx +43 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/props.ts +112 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/style.less +262 -0
- package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/typings.ts +44 -0
- package/template-design-pro/src/components/GDesign/ProLayout/default.less +2 -0
- package/template-design-pro/src/components/GDesign/ProLayout/defaultSettings.ts +121 -0
- package/template-design-pro/src/components/GDesign/ProLayout/hooks/context/index.ts +45 -0
- package/template-design-pro/src/components/GDesign/ProLayout/index.ts +43 -0
- package/template-design-pro/src/components/GDesign/ProLayout/props.ts +57 -0
- package/template-design-pro/src/components/GDesign/ProLayout/style.less +272 -0
- package/template-design-pro/src/components/GDesign/ProLayout/typings.ts +1 -0
- package/template-design-pro/src/components/GDesign/ProLayout/utils/getMenuData.ts +31 -0
- package/template-design-pro/src/components/GDesign/ProLayout/utils/index.ts +94 -0
- package/template-design-pro/src/components/GDesign/ProLayout/utils/isImg/index.ts +6 -0
- package/template-design-pro/src/components/GDesign/ProLayout/utils/isUrl/index.ts +5 -0
- package/template-design-pro/src/components/GDesign/Result/index.tsx +142 -0
- package/template-design-pro/src/components/GDesign/Result/style.less +140 -0
- package/template-design-pro/src/components/GDesign/Scrollbars/components/Bar/index.tsx +56 -0
- package/template-design-pro/src/components/GDesign/Scrollbars/components/Bar/props.ts +23 -0
- package/template-design-pro/src/components/GDesign/Scrollbars/components/Thumb/index.tsx +164 -0
- package/template-design-pro/src/components/GDesign/Scrollbars/components/Thumb/props.ts +11 -0
- package/template-design-pro/src/components/GDesign/Scrollbars/context.ts +10 -0
- package/template-design-pro/src/components/GDesign/Scrollbars/index.tsx +200 -0
- package/template-design-pro/src/components/GDesign/Scrollbars/props.ts +65 -0
- package/template-design-pro/src/components/GDesign/Scrollbars/style.less +85 -0
- package/template-design-pro/src/components/GDesign/Scrollbars/util.ts +40 -0
- package/template-design-pro/src/components/GDesign/utils/index.ts +7 -0
- package/template-design-pro/src/components/PageLoading/index.tsx +44 -0
- package/template-design-pro/src/components/PageTransition/index.vue +98 -0
- package/template-design-pro/src/components/index.ts +6 -0
- package/template-design-pro/src/core/ant-design/index.ts +14 -0
- package/template-design-pro/src/core/gx-admin-design/index.ts +7 -0
- package/template-design-pro/src/core/gx-admin-directives/index.ts +8 -0
- package/template-design-pro/src/core/gx-admin-directives/permission.ts +28 -0
- package/template-design-pro/src/core/gx-design/index.ts +7 -0
- package/template-design-pro/src/core/gx-pro-design/index.ts +10 -0
- package/template-design-pro/src/core/index.ts +27 -0
- package/template-design-pro/src/design/ant-design/index.less +4 -0
- package/template-design-pro/src/design/ant-design/layout.less +29 -0
- package/template-design-pro/src/design/ant-design/menu.less +55 -0
- package/template-design-pro/src/design/ant-design/table.less +67 -0
- package/template-design-pro/src/design/ant-design/tooltip.less +13 -0
- package/template-design-pro/src/design/color.less +1 -0
- package/template-design-pro/src/design/config.less +5 -0
- package/template-design-pro/src/design/index.less +41 -0
- package/template-design-pro/src/design/mixin.less +66 -0
- package/template-design-pro/src/design/normalize.less +390 -0
- package/template-design-pro/src/global.less +15 -0
- package/template-design-pro/src/hooks/core/index.ts +3 -0
- package/template-design-pro/src/hooks/core/useRequest/index.ts +70 -0
- package/template-design-pro/src/hooks/core/useRequest/typings.ts +0 -0
- package/template-design-pro/src/hooks/event/index.ts +3 -0
- package/template-design-pro/src/hooks/event/useClipboard.ts +14 -0
- package/template-design-pro/src/hooks/system/index.ts +5 -0
- package/template-design-pro/src/hooks/system/useDict.ts +62 -0
- package/template-design-pro/src/hooks/system/usePermissions.ts +39 -0
- package/template-design-pro/src/hooks/typings.ts +17 -0
- package/template-design-pro/src/layout/BasicLayout.vue +104 -0
- package/template-design-pro/src/layout/BlankLayout.vue +5 -0
- package/template-design-pro/src/layout/ContentView.vue +76 -0
- package/template-design-pro/src/layout/IframeView.vue +1 -0
- package/template-design-pro/src/layout/UserLayout.vue +7 -0
- package/template-design-pro/src/main.ts +34 -0
- package/template-design-pro/src/plugins/index.ts +3 -0
- package/template-design-pro/src/router/guard/index.ts +84 -0
- package/template-design-pro/src/router/guard/permissions.ts +73 -0
- package/template-design-pro/src/router/guard/stateGuard.ts +11 -0
- package/template-design-pro/src/router/helper/routeHelper.ts +244 -0
- package/template-design-pro/src/router/helper/utils.ts +19 -0
- package/template-design-pro/src/router/index.ts +30 -0
- package/template-design-pro/src/router/routes/index.ts +85 -0
- package/template-design-pro/src/router/routes/modules/workplace.ts +19 -0
- package/template-design-pro/src/services/common/index.ts +11 -0
- package/template-design-pro/src/services/controller/router.ts +10 -0
- package/template-design-pro/src/services/controller/user.ts +35 -0
- package/template-design-pro/src/services/system/dictData.ts +10 -0
- package/template-design-pro/src/services/system/notices.ts +9 -0
- package/template-design-pro/src/store/index.ts +32 -0
- package/template-design-pro/src/store/modules/dict.ts +27 -0
- package/template-design-pro/src/store/modules/permission.ts +19 -0
- package/template-design-pro/src/store/modules/routes.ts +110 -0
- package/template-design-pro/src/store/modules/settings.ts +102 -0
- package/template-design-pro/src/store/modules/tabsRouter.ts +73 -0
- package/template-design-pro/src/store/modules/user.ts +153 -0
- package/template-design-pro/src/utils/accessToken.ts +93 -0
- package/template-design-pro/src/utils/crypto.ts +39 -0
- package/template-design-pro/src/utils/env.ts +52 -0
- package/template-design-pro/src/utils/fetchFile.ts +79 -0
- package/template-design-pro/src/utils/index.ts +127 -0
- package/template-design-pro/src/utils/pageTitle.ts +17 -0
- package/template-design-pro/src/utils/request/XHR.ts +131 -0
- package/template-design-pro/src/utils/request/axiosCancel.ts +60 -0
- package/template-design-pro/src/utils/request/checkStatus.ts +26 -0
- package/template-design-pro/src/utils/request/index.ts +145 -0
- package/template-design-pro/src/utils/request/typings.ts +114 -0
- package/template-design-pro/src/utils/storage.ts +194 -0
- package/template-design-pro/src/utils/uploadFile.ts +26 -0
- package/template-design-pro/src/utils/util.ts +278 -0
- package/template-design-pro/src/utils/validate.ts +221 -0
- package/template-design-pro/src/views/Iframe/index.vue +76 -0
- package/template-design-pro/src/views/MenuOne/index.vue +15 -0
- package/template-design-pro/src/views/MenuTwo/index.vue +13 -0
- package/template-design-pro/src/views/exception/403/index.vue +9 -0
- package/template-design-pro/src/views/exception/404/index.vue +9 -0
- package/template-design-pro/src/views/user/login/index.vue +110 -0
- package/template-design-pro/src/views/user/login/style.less +38 -0
- package/template-design-pro/stylelint.config.js +106 -0
- package/template-design-pro/tests/__mocks__/fileMock.ts +1 -0
- package/template-design-pro/tests/__mocks__/styleMock.ts +1 -0
- package/template-design-pro/tests/__mocks__/workerMock.ts +5 -0
- package/template-design-pro/tests/server/README.md +15 -0
- package/template-design-pro/tests/server/controller/FileController.ts +18 -0
- package/template-design-pro/tests/server/controller/UserController.ts +15 -0
- package/template-design-pro/tests/server/ecosystem.config.js +18 -0
- package/template-design-pro/tests/server/index.ts +63 -0
- package/template-design-pro/tests/server/nodemon.json +8 -0
- package/template-design-pro/tests/server/package.json +36 -0
- package/template-design-pro/tests/server/routes.ts +23 -0
- package/template-design-pro/tests/server/service/FileService.ts +54 -0
- package/template-design-pro/tests/server/service/UserService.ts +25 -0
- package/template-design-pro/tests/server/tsconfig.json +15 -0
- package/template-design-pro/tests/server/utils.ts +9 -0
- package/template-design-pro/tests/server/yarn.lock +2955 -0
- package/template-design-pro/tests/test.spec.ts +16 -0
- package/template-design-pro/tsconfig.json +47 -0
- package/template-design-pro/types/auto-imports.d.ts +61 -0
- package/template-design-pro/types/config.d.ts +100 -0
- package/template-design-pro/types/global.d.ts +103 -0
- package/template-design-pro/types/gx-components.d.ts +24 -0
- package/template-design-pro/types/index.d.ts +13 -0
- package/template-design-pro/types/mock.d.ts +23 -0
- package/template-design-pro/types/module.d.ts +16 -0
- package/template-design-pro/types/response.d.ts +15 -0
- package/template-design-pro/types/route.d.ts +89 -0
- package/template-design-pro/vite.config.ts +136 -0
- package/template-design-pro/yarn.lock +9697 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
import type { ExtractPropTypes } from 'vue'
|
2
|
+
import { defineComponent, ref } from 'vue'
|
3
|
+
import { barProps } from './props'
|
4
|
+
import Thumb from '../Thumb'
|
5
|
+
|
6
|
+
export type BarProps = ExtractPropTypes<typeof barProps>
|
7
|
+
|
8
|
+
const Bar = defineComponent({
|
9
|
+
props: barProps,
|
10
|
+
setup(props) {
|
11
|
+
const moveX = ref(0)
|
12
|
+
const moveY = ref(0)
|
13
|
+
const GAP = 4
|
14
|
+
|
15
|
+
const handleScroll = (wrap: HTMLDivElement) => {
|
16
|
+
if (wrap) {
|
17
|
+
const offsetHeight = wrap.offsetHeight - GAP
|
18
|
+
const offsetWidth = wrap.offsetWidth - GAP
|
19
|
+
|
20
|
+
moveY.value = ((wrap.scrollTop * 100) / offsetHeight) * props.ratioY
|
21
|
+
moveX.value = ((wrap.scrollLeft * 100) / offsetWidth) * props.ratioX
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
return {
|
26
|
+
moveX,
|
27
|
+
moveY,
|
28
|
+
handleScroll
|
29
|
+
}
|
30
|
+
},
|
31
|
+
render() {
|
32
|
+
return (
|
33
|
+
<>
|
34
|
+
<Thumb
|
35
|
+
className={this.className}
|
36
|
+
move={this.moveX}
|
37
|
+
ratio={this.ratioX}
|
38
|
+
size={this.width}
|
39
|
+
always={this.always}
|
40
|
+
/>
|
41
|
+
<Thumb
|
42
|
+
className={this.className}
|
43
|
+
move={this.moveY}
|
44
|
+
ratio={this.ratioY}
|
45
|
+
size={this.height}
|
46
|
+
vertical
|
47
|
+
always={this.always}
|
48
|
+
/>
|
49
|
+
</>
|
50
|
+
)
|
51
|
+
}
|
52
|
+
})
|
53
|
+
|
54
|
+
Bar.inheritAttrs = false
|
55
|
+
|
56
|
+
export default Bar
|
@@ -0,0 +1,23 @@
|
|
1
|
+
export const barProps = {
|
2
|
+
className: String,
|
3
|
+
always: {
|
4
|
+
type: Boolean,
|
5
|
+
default: true,
|
6
|
+
},
|
7
|
+
width: {
|
8
|
+
type: String,
|
9
|
+
default: '',
|
10
|
+
},
|
11
|
+
height: {
|
12
|
+
type: String,
|
13
|
+
default: '',
|
14
|
+
},
|
15
|
+
ratioX: {
|
16
|
+
type: Number,
|
17
|
+
default: 1,
|
18
|
+
},
|
19
|
+
ratioY: {
|
20
|
+
type: Number,
|
21
|
+
default: 1,
|
22
|
+
},
|
23
|
+
}
|
@@ -0,0 +1,164 @@
|
|
1
|
+
import type { ExtractPropTypes } from 'vue'
|
2
|
+
import { computed, defineComponent, inject, onBeforeUnmount, ref, toRef, Transition } from 'vue'
|
3
|
+
import { isClient, useEventListener } from '@vueuse/core'
|
4
|
+
import { thumbProps } from './props'
|
5
|
+
import { scrollbarContextKey } from '../../context'
|
6
|
+
import { BAR_MAP, renderThumbStyle } from '../../util'
|
7
|
+
|
8
|
+
export type ThumbProps = ExtractPropTypes<typeof thumbProps>
|
9
|
+
|
10
|
+
const COMPONENT_NAME = 'Thumb'
|
11
|
+
const Thumb = defineComponent({
|
12
|
+
props: thumbProps,
|
13
|
+
setup(props) {
|
14
|
+
const scrollbar = inject(scrollbarContextKey)
|
15
|
+
|
16
|
+
if (!scrollbar) console.error(COMPONENT_NAME, 'can not inject scrollbar context')
|
17
|
+
|
18
|
+
const instance = ref()
|
19
|
+
const thumb = ref()
|
20
|
+
|
21
|
+
const thumbState = ref({})
|
22
|
+
const visible = ref(false)
|
23
|
+
|
24
|
+
let cursorDown = false
|
25
|
+
let cursorLeave = false
|
26
|
+
let originalOnSelectStart: ((this: GlobalEventHandlers, ev: Event) => any) | null = isClient
|
27
|
+
? document.onselectstart
|
28
|
+
: null
|
29
|
+
|
30
|
+
const bar = computed(() => BAR_MAP[props.vertical ? 'vertical' : 'horizontal'])
|
31
|
+
|
32
|
+
const thumbStyle = computed(() =>
|
33
|
+
renderThumbStyle({
|
34
|
+
size: props.size,
|
35
|
+
move: props.move,
|
36
|
+
bar: bar.value
|
37
|
+
})
|
38
|
+
)
|
39
|
+
|
40
|
+
const offsetRatio = computed(
|
41
|
+
() =>
|
42
|
+
// offsetRatioX = original width of thumb / current width of thumb / ratioX
|
43
|
+
// offsetRatioY = original height of thumb / current height of thumb / ratioY
|
44
|
+
// instance height = wrap height - GAP
|
45
|
+
instance.value![bar.value.offset] ** 2 /
|
46
|
+
scrollbar.wrapElement![bar.value.scrollSize] /
|
47
|
+
props.ratio /
|
48
|
+
thumb.value![bar.value.offset]
|
49
|
+
)
|
50
|
+
|
51
|
+
const clickThumbHandler = (e: MouseEvent) => {
|
52
|
+
// prevent click event of middle and right button
|
53
|
+
e.stopPropagation()
|
54
|
+
if (e.ctrlKey || [1, 2].includes(e.button)) return
|
55
|
+
|
56
|
+
window.getSelection()?.removeAllRanges()
|
57
|
+
startDrag(e)
|
58
|
+
|
59
|
+
const el = e.currentTarget as HTMLDivElement
|
60
|
+
if (!el) return
|
61
|
+
thumbState.value[bar.value.axis] =
|
62
|
+
el[bar.value.offset] -
|
63
|
+
(e[bar.value.client] - el.getBoundingClientRect()[bar.value.direction])
|
64
|
+
}
|
65
|
+
|
66
|
+
const clickTrackHandler = (e: MouseEvent) => {
|
67
|
+
if (!thumb.value || !instance.value || !scrollbar.wrapElement) return
|
68
|
+
|
69
|
+
const offset = Math.abs(
|
70
|
+
(e.target as HTMLElement).getBoundingClientRect()[bar.value.direction] - e[bar.value.client]
|
71
|
+
)
|
72
|
+
const thumbHalf = thumb.value[bar.value.offset] / 2
|
73
|
+
const thumbPositionPercentage =
|
74
|
+
((offset - thumbHalf) * 100 * offsetRatio.value) / instance.value[bar.value.offset]
|
75
|
+
|
76
|
+
scrollbar.wrapElement[bar.value.scroll] =
|
77
|
+
(thumbPositionPercentage * scrollbar.wrapElement[bar.value.scrollSize]) / 100
|
78
|
+
}
|
79
|
+
|
80
|
+
const startDrag = (e: MouseEvent) => {
|
81
|
+
e.stopImmediatePropagation()
|
82
|
+
cursorDown = true
|
83
|
+
document.addEventListener('mousemove', mouseMoveDocumentHandler)
|
84
|
+
document.addEventListener('mouseup', mouseUpDocumentHandler)
|
85
|
+
originalOnSelectStart = document.onselectstart
|
86
|
+
document.onselectstart = () => false
|
87
|
+
}
|
88
|
+
|
89
|
+
const mouseMoveDocumentHandler = (e: MouseEvent) => {
|
90
|
+
if (!instance.value || !thumb.value) return
|
91
|
+
if (cursorDown === false) return
|
92
|
+
|
93
|
+
const prevPage = thumbState.value[bar.value.axis]
|
94
|
+
if (!prevPage) return
|
95
|
+
|
96
|
+
const offset =
|
97
|
+
(instance.value.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]) * -1
|
98
|
+
const thumbClickPosition = thumb.value[bar.value.offset] - prevPage
|
99
|
+
const thumbPositionPercentage =
|
100
|
+
((offset - thumbClickPosition) * 100 * offsetRatio.value) / instance.value[bar.value.offset]
|
101
|
+
scrollbar.wrapElement[bar.value.scroll] =
|
102
|
+
(thumbPositionPercentage * scrollbar.wrapElement[bar.value.scrollSize]) / 100
|
103
|
+
}
|
104
|
+
|
105
|
+
const mouseUpDocumentHandler = () => {
|
106
|
+
cursorDown = false
|
107
|
+
thumbState.value[bar.value.axis] = 0
|
108
|
+
document.removeEventListener('mousemove', mouseMoveDocumentHandler)
|
109
|
+
document.removeEventListener('mouseup', mouseUpDocumentHandler)
|
110
|
+
restoreOnselectstart()
|
111
|
+
if (cursorLeave) visible.value = false
|
112
|
+
}
|
113
|
+
|
114
|
+
const mouseMoveScrollbarHandler = () => {
|
115
|
+
cursorLeave = false
|
116
|
+
visible.value = !!props.size
|
117
|
+
}
|
118
|
+
|
119
|
+
const mouseLeaveScrollbarHandler = () => {
|
120
|
+
cursorLeave = true
|
121
|
+
visible.value = cursorDown
|
122
|
+
}
|
123
|
+
|
124
|
+
onBeforeUnmount(() => {
|
125
|
+
restoreOnselectstart()
|
126
|
+
document.removeEventListener('mouseup', mouseUpDocumentHandler)
|
127
|
+
})
|
128
|
+
|
129
|
+
const restoreOnselectstart = () => {
|
130
|
+
if (document.onselectstart !== originalOnSelectStart)
|
131
|
+
document.onselectstart = originalOnSelectStart
|
132
|
+
}
|
133
|
+
|
134
|
+
useEventListener(toRef(scrollbar, 'scrollbarElement'), 'mousemove', mouseMoveScrollbarHandler)
|
135
|
+
useEventListener(toRef(scrollbar, 'scrollbarElement'), 'mouseleave', mouseLeaveScrollbarHandler)
|
136
|
+
|
137
|
+
return () => {
|
138
|
+
return (
|
139
|
+
<Transition name={`${props.className}-fade`}>
|
140
|
+
<div
|
141
|
+
ref={(e) => (instance.value = e)}
|
142
|
+
class={
|
143
|
+
props.always || visible.value
|
144
|
+
? [`${props.className}-bar`, 'is-' + bar.value.key]
|
145
|
+
: [`${props.className}-bar`, 'is-' + bar.value.key, 'hidden']
|
146
|
+
}
|
147
|
+
onMousedown={clickTrackHandler}
|
148
|
+
>
|
149
|
+
<div
|
150
|
+
ref={(e) => (thumb.value = e)}
|
151
|
+
class={`${props.className}-thumb`}
|
152
|
+
style={thumbStyle.value}
|
153
|
+
onMousedown={clickThumbHandler}
|
154
|
+
/>
|
155
|
+
</div>
|
156
|
+
</Transition>
|
157
|
+
)
|
158
|
+
}
|
159
|
+
}
|
160
|
+
})
|
161
|
+
|
162
|
+
Thumb.inheritAttrs = false
|
163
|
+
|
164
|
+
export default Thumb
|
@@ -0,0 +1,200 @@
|
|
1
|
+
import { ExtractPropTypes, StyleValue } from 'vue'
|
2
|
+
import { defineComponent, watch, provide, onMounted, ref, computed } from 'vue'
|
3
|
+
import { useEventListener, useResizeObserver } from '@vueuse/core'
|
4
|
+
import { isNumber, isObject, getPrefixCls } from '@gx-design-vue/pro-utils'
|
5
|
+
import { scrollbarEmits, scrollbarProps } from './props'
|
6
|
+
import { scrollbarContextKey } from './context'
|
7
|
+
import Bar from './components/Bar'
|
8
|
+
import { addUnit } from './util'
|
9
|
+
|
10
|
+
import './style.less'
|
11
|
+
|
12
|
+
export type ScrollbarProps = ExtractPropTypes<typeof scrollbarProps>
|
13
|
+
|
14
|
+
const GBars = defineComponent({
|
15
|
+
name: 'GBars',
|
16
|
+
props: scrollbarProps,
|
17
|
+
emits: scrollbarEmits,
|
18
|
+
setup(props, { emit }) {
|
19
|
+
const prefixCls = getPrefixCls({
|
20
|
+
suffixCls: 'scrollbar'
|
21
|
+
})
|
22
|
+
|
23
|
+
let stopResizeObserver: (() => void) | undefined = undefined
|
24
|
+
let stopResizeListener: (() => void) | undefined = undefined
|
25
|
+
|
26
|
+
const scrollbar$ = ref()
|
27
|
+
const wrap$ = ref()
|
28
|
+
const resize$ = ref()
|
29
|
+
|
30
|
+
const sizeWidth = ref('0')
|
31
|
+
const sizeHeight = ref('0')
|
32
|
+
const barRef = ref()
|
33
|
+
const moveX = ref(0)
|
34
|
+
const moveY = ref(0)
|
35
|
+
const ratioY = ref(1)
|
36
|
+
const ratioX = ref(1)
|
37
|
+
const SCOPE = 'GBars'
|
38
|
+
const GAP = 4 // top 2 + bottom 2 of bar instance
|
39
|
+
|
40
|
+
const style = computed<StyleValue>(() => {
|
41
|
+
const style: any = {}
|
42
|
+
if (props.height) style.height = addUnit(props.height)
|
43
|
+
if (props.maxHeight) style.maxHeight = addUnit(props.maxHeight)
|
44
|
+
return [props.wrapStyle, style]
|
45
|
+
})
|
46
|
+
|
47
|
+
const handleScroll = () => {
|
48
|
+
if (wrap$.value) {
|
49
|
+
barRef.value?.handleScroll(wrap$.value)
|
50
|
+
|
51
|
+
emit('scroll', {
|
52
|
+
scrollTop: wrap$.value.scrollTop,
|
53
|
+
scrollLeft: wrap$.value.scrollLeft
|
54
|
+
})
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
function scrollTo(xCord: number, yCord?: number): void
|
59
|
+
function scrollTo(options: ScrollToOptions): void
|
60
|
+
function scrollTo(arg1: unknown, arg2?: number) {
|
61
|
+
if (isObject(arg1)) {
|
62
|
+
wrap$.value!.scrollTo(arg1)
|
63
|
+
} else if (isNumber(arg1) && isNumber(arg2)) {
|
64
|
+
wrap$.value!.scrollTo(arg1, arg2)
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
const setScrollTop = (value: number) => {
|
69
|
+
if (!isNumber(value)) {
|
70
|
+
console.warn(SCOPE, 'value 必须为数字')
|
71
|
+
return
|
72
|
+
}
|
73
|
+
wrap$.value!.scrollTop = value
|
74
|
+
}
|
75
|
+
|
76
|
+
const setScrollLeft = (value: number) => {
|
77
|
+
if (!isNumber(value)) {
|
78
|
+
console.warn(SCOPE, 'value 必须为数字')
|
79
|
+
return
|
80
|
+
}
|
81
|
+
wrap$.value!.scrollLeft = value
|
82
|
+
}
|
83
|
+
|
84
|
+
const update = () => {
|
85
|
+
if (!wrap$.value) return
|
86
|
+
const offsetHeight = wrap$.value.offsetHeight - GAP
|
87
|
+
const offsetWidth = wrap$.value.offsetWidth - GAP
|
88
|
+
|
89
|
+
const originalHeight = offsetHeight ** 2 / wrap$.value.scrollHeight
|
90
|
+
const originalWidth = offsetWidth ** 2 / wrap$.value.scrollWidth
|
91
|
+
const height = Math.max(originalHeight, props.minSize)
|
92
|
+
const width = Math.max(originalWidth, props.minSize)
|
93
|
+
|
94
|
+
ratioY.value =
|
95
|
+
originalHeight / (offsetHeight - originalHeight) / (height / (offsetHeight - height))
|
96
|
+
ratioX.value = originalWidth / (offsetWidth - originalWidth) / (width / (offsetWidth - width))
|
97
|
+
|
98
|
+
sizeHeight.value = height + GAP < offsetHeight ? `${height}px` : ''
|
99
|
+
sizeWidth.value = width + GAP < offsetWidth ? `${width}px` : ''
|
100
|
+
}
|
101
|
+
|
102
|
+
watch(
|
103
|
+
() => props.noresize,
|
104
|
+
(noresize) => {
|
105
|
+
if (noresize) {
|
106
|
+
stopResizeObserver?.()
|
107
|
+
stopResizeListener?.()
|
108
|
+
} else {
|
109
|
+
;({ stop: stopResizeObserver } = useResizeObserver(resize$, update))
|
110
|
+
stopResizeListener = useEventListener('resize', update)
|
111
|
+
}
|
112
|
+
},
|
113
|
+
{ immediate: true }
|
114
|
+
)
|
115
|
+
|
116
|
+
watch(
|
117
|
+
() => [props.maxHeight, props.height],
|
118
|
+
() => {
|
119
|
+
if (!props.native)
|
120
|
+
nextTick(() => {
|
121
|
+
update()
|
122
|
+
if (wrap$.value) {
|
123
|
+
barRef.value?.handleScroll(wrap$.value)
|
124
|
+
}
|
125
|
+
})
|
126
|
+
}
|
127
|
+
)
|
128
|
+
|
129
|
+
provide(
|
130
|
+
scrollbarContextKey,
|
131
|
+
reactive({
|
132
|
+
scrollbarElement: scrollbar$,
|
133
|
+
wrapElement: wrap$
|
134
|
+
})
|
135
|
+
)
|
136
|
+
|
137
|
+
onMounted(() => {
|
138
|
+
if (!props.native) nextTick(() => update())
|
139
|
+
})
|
140
|
+
|
141
|
+
return {
|
142
|
+
barRef,
|
143
|
+
wrap$,
|
144
|
+
scrollbar$,
|
145
|
+
resize$,
|
146
|
+
style,
|
147
|
+
moveX,
|
148
|
+
moveY,
|
149
|
+
prefixCls,
|
150
|
+
sizeHeight,
|
151
|
+
sizeWidth,
|
152
|
+
ratioX,
|
153
|
+
ratioY,
|
154
|
+
handleScroll,
|
155
|
+
scrollTo,
|
156
|
+
setScrollTop,
|
157
|
+
setScrollLeft
|
158
|
+
}
|
159
|
+
},
|
160
|
+
render() {
|
161
|
+
const CustomTag: any = this.tag
|
162
|
+
return (
|
163
|
+
<div ref={(e) => (this.scrollbar$ = e)} class={this.prefixCls}>
|
164
|
+
<div
|
165
|
+
ref={(e) => (this.wrap$ = e)}
|
166
|
+
class={[
|
167
|
+
this.wrapClass,
|
168
|
+
`${this.prefixCls}-wrap`,
|
169
|
+
this.native ? '' : `${this.prefixCls}-wrap-hidden-default`
|
170
|
+
]}
|
171
|
+
style={this.style}
|
172
|
+
onScroll={this.handleScroll}
|
173
|
+
>
|
174
|
+
<CustomTag
|
175
|
+
ref={(e) => (this.resize$ = e)}
|
176
|
+
class={[`${this.prefixCls}-view`, this.viewClass]}
|
177
|
+
style={this.viewStyle}
|
178
|
+
>
|
179
|
+
{this.$slots.default?.()}
|
180
|
+
</CustomTag>
|
181
|
+
</div>
|
182
|
+
{!this.native && (
|
183
|
+
<Bar
|
184
|
+
ref={(e) => (this.barRef = e)}
|
185
|
+
className={this.prefixCls}
|
186
|
+
height={this.sizeHeight}
|
187
|
+
width={this.sizeWidth}
|
188
|
+
always={this.always}
|
189
|
+
ratioX={this.ratioX}
|
190
|
+
ratioY={this.ratioY}
|
191
|
+
/>
|
192
|
+
)}
|
193
|
+
</div>
|
194
|
+
)
|
195
|
+
}
|
196
|
+
})
|
197
|
+
|
198
|
+
GBars.inheritAttrs = false
|
199
|
+
|
200
|
+
export default GBars
|
@@ -0,0 +1,65 @@
|
|
1
|
+
import type { CSSProperties } from 'vue'
|
2
|
+
import { isNumber } from '@gx-design-vue/pro-utils'
|
3
|
+
|
4
|
+
const wrapperKey = Symbol()
|
5
|
+
|
6
|
+
export type PropWrapper<T> = { [wrapperKey]: T }
|
7
|
+
|
8
|
+
export const definePropType = <T>(val: any) =>
|
9
|
+
({ [wrapperKey]: val } as PropWrapper<T>)
|
10
|
+
|
11
|
+
export const scrollbarProps = {
|
12
|
+
height: {
|
13
|
+
type: [ String, Number ],
|
14
|
+
default: ''
|
15
|
+
},
|
16
|
+
maxHeight: {
|
17
|
+
type: [ String, Number ],
|
18
|
+
default: ''
|
19
|
+
},
|
20
|
+
native: {
|
21
|
+
type: Boolean,
|
22
|
+
default: false
|
23
|
+
},
|
24
|
+
wrapStyle: {
|
25
|
+
type: [String, Array] as PropType<string | CSSProperties[]>,
|
26
|
+
default: ''
|
27
|
+
},
|
28
|
+
wrapClass: {
|
29
|
+
type: [ String, Array ],
|
30
|
+
default: ''
|
31
|
+
},
|
32
|
+
viewClass: {
|
33
|
+
type: [ String, Array ],
|
34
|
+
default: ''
|
35
|
+
},
|
36
|
+
viewStyle: {
|
37
|
+
type: [ String, Array, Object ],
|
38
|
+
default: ''
|
39
|
+
},
|
40
|
+
noresize: Boolean, // 如果 container 尺寸不会发生变化,最好设置它可以优化性能
|
41
|
+
tag: {
|
42
|
+
type: String,
|
43
|
+
default: 'div'
|
44
|
+
},
|
45
|
+
always: {
|
46
|
+
type: Boolean,
|
47
|
+
default: false
|
48
|
+
},
|
49
|
+
minSize: {
|
50
|
+
type: Number,
|
51
|
+
default: 20
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
|
56
|
+
export const scrollbarEmits = {
|
57
|
+
scroll: ({
|
58
|
+
scrollTop,
|
59
|
+
scrollLeft
|
60
|
+
}: {
|
61
|
+
scrollTop: number
|
62
|
+
scrollLeft: number
|
63
|
+
}) => isNumber(scrollTop) && isNumber(scrollLeft)
|
64
|
+
}
|
65
|
+
export type ScrollbarEmits = typeof scrollbarEmits
|
@@ -0,0 +1,85 @@
|
|
1
|
+
:root {
|
2
|
+
--wd-scrollbar-opacity: 0.3;
|
3
|
+
--wd-text-color-secondary: #909399;
|
4
|
+
--wd-scrollbar-background-color: var(--wd-text-color-secondary);
|
5
|
+
--wd-scrollbar-hover-opacity: 0.5;
|
6
|
+
--wd-scrollbar-hover-background-color: var(--wd-text-color-secondary);
|
7
|
+
}
|
8
|
+
|
9
|
+
.@{gx-prefix}-scrollbar {
|
10
|
+
position: relative;
|
11
|
+
height: 100%;
|
12
|
+
overflow: hidden;
|
13
|
+
|
14
|
+
&-wrap {
|
15
|
+
height: 100%;
|
16
|
+
overflow: auto;
|
17
|
+
|
18
|
+
&-hidden-default {
|
19
|
+
scrollbar-width: none;
|
20
|
+
|
21
|
+
&::-webkit-scrollbar {
|
22
|
+
display: none;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
&-bar {
|
28
|
+
position: absolute;
|
29
|
+
right: 2px;
|
30
|
+
bottom: 2px;
|
31
|
+
z-index: 999;
|
32
|
+
border-radius: 4px;
|
33
|
+
|
34
|
+
&.is-vertical {
|
35
|
+
top: 2px;
|
36
|
+
width: 6px;
|
37
|
+
|
38
|
+
& > div {
|
39
|
+
width: 100%;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
&.is-horizontal {
|
44
|
+
left: 2px;
|
45
|
+
height: 6px;
|
46
|
+
|
47
|
+
& > div {
|
48
|
+
height: 100%;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
&-thumb {
|
54
|
+
position: relative;
|
55
|
+
display: block;
|
56
|
+
width: 0;
|
57
|
+
height: 0;
|
58
|
+
cursor: pointer;
|
59
|
+
background-color: var(--wd-scrollbar-background-color);
|
60
|
+
border-radius: inherit;
|
61
|
+
opacity: var(--wd-scrollbar-opacity);
|
62
|
+
-webkit-transition: var(--wd-transition-duration) background-color;
|
63
|
+
transition: var(--wd-transition-duration) background-color;
|
64
|
+
|
65
|
+
&:hover {
|
66
|
+
background-color: var(--wd-scrollbar-hover-background-color);
|
67
|
+
opacity: var(--wd-scrollbar-hover-opacity);
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
&-fade-enter-active {
|
72
|
+
-webkit-transition: opacity 340ms ease-out;
|
73
|
+
transition: opacity 340ms ease-out;
|
74
|
+
}
|
75
|
+
|
76
|
+
&-fade-leave-active {
|
77
|
+
-webkit-transition: opacity 120ms ease-out;
|
78
|
+
transition: opacity 120ms ease-out;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
.@{gx-prefix}-scrollbar-fade-enter-from,
|
83
|
+
.@{gx-prefix}-scrollbar-fade-leave-active {
|
84
|
+
opacity: 0;
|
85
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
import type { CSSProperties } from 'vue'
|
2
|
+
import { isNumber, isString } from '@gx-design-vue/pro-utils'
|
3
|
+
|
4
|
+
export const BAR_MAP = {
|
5
|
+
vertical: {
|
6
|
+
offset: 'offsetHeight',
|
7
|
+
scroll: 'scrollTop',
|
8
|
+
scrollSize: 'scrollHeight',
|
9
|
+
size: 'height',
|
10
|
+
key: 'vertical',
|
11
|
+
axis: 'Y',
|
12
|
+
client: 'clientY',
|
13
|
+
direction: 'top',
|
14
|
+
},
|
15
|
+
horizontal: {
|
16
|
+
offset: 'offsetWidth',
|
17
|
+
scroll: 'scrollLeft',
|
18
|
+
scrollSize: 'scrollWidth',
|
19
|
+
size: 'width',
|
20
|
+
key: 'horizontal',
|
21
|
+
axis: 'X',
|
22
|
+
client: 'clientX',
|
23
|
+
direction: 'left',
|
24
|
+
},
|
25
|
+
}
|
26
|
+
|
27
|
+
export const renderThumbStyle = ({ move, size, bar }): CSSProperties => ({
|
28
|
+
[bar.size]: size,
|
29
|
+
transform: `translate${bar.axis}(${move}%)`,
|
30
|
+
})
|
31
|
+
|
32
|
+
export function addUnit(value: string | number, defaultUnit = 'px') {
|
33
|
+
if (!value) return ''
|
34
|
+
if (isString(value)) {
|
35
|
+
return value
|
36
|
+
} else if (isNumber(value)) {
|
37
|
+
return `${value}${defaultUnit}`
|
38
|
+
}
|
39
|
+
return false
|
40
|
+
}
|