haiwei-skins-classics 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +1 -0
- package/.eslintrc.js +20 -0
- package/.prettierrc +6 -0
- package/.vscode/settings.json +10 -0
- package/README.md +67 -0
- package/babel.config.js +3 -0
- package/package.json +43 -0
- package/postcss.config.js +5 -0
- package/script/npm_install.bat +4 -0
- package/script/npm_install.ps1 +10 -0
- package/script/npm_publish.bat +4 -0
- package/script/npm_publish.ps1 +10 -0
- package/script/npm_update.bat +4 -0
- package/script/npm_update.ps1 +10 -0
- package/src/components/header/index.vue +78 -0
- package/src/components/main/index.vue +43 -0
- package/src/components/menus/index.vue +42 -0
- package/src/index.js +23 -0
- package/src/index.vue +16 -0
- package/src/preview.png +0 -0
- package/src/store/index.js +15 -0
- package/src/styles/_index.scss +17 -0
- package/src/styles/components/header/_index.scss +112 -0
- package/src/styles/components/main/_index.scss +103 -0
- package/src/styles/themes/_index.scss +2 -0
- package/src/styles/themes/_theme.scss +30 -0
- package/src/styles/themes/blue-light/_index.scss +2 -0
- package/src/styles/themes/blue-light/_variables.scss +12 -0
- package/src/styles/themes/default/_index.scss +2 -0
- package/src/styles/themes/default/_variables.scss +12 -0
package/.eslintignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
node_modules/*
|
package/.eslintrc.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
root: true,
|
|
3
|
+
env: {
|
|
4
|
+
node: true
|
|
5
|
+
},
|
|
6
|
+
extends: ['plugin:vue/essential', '@vue/prettier'],
|
|
7
|
+
rules: {
|
|
8
|
+
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
|
|
9
|
+
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
|
|
10
|
+
},
|
|
11
|
+
parserOptions: {
|
|
12
|
+
parser: 'babel-eslint'
|
|
13
|
+
},
|
|
14
|
+
globals: {
|
|
15
|
+
$http: 'readonly',
|
|
16
|
+
particlesJS: 'readonly',
|
|
17
|
+
BMap: 'readonly',
|
|
18
|
+
BMAP_STATUS_SUCCESS: 'readonly'
|
|
19
|
+
}
|
|
20
|
+
}
|
package/.prettierrc
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# HaiWei.Skins.Classics
|
|
2
|
+
|
|
3
|
+
HaiWei 前端框架的经典皮肤组件
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- **经典设计** - 简洁优雅的经典界面设计
|
|
8
|
+
- **主题切换** - 支持多种主题颜色切换
|
|
9
|
+
- **响应式布局** - 适配不同屏幕尺寸
|
|
10
|
+
- **易于集成** - 与 HaiWei.UI 框架无缝集成
|
|
11
|
+
|
|
12
|
+
## 安装
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install haiwei-skins-classics
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 使用
|
|
19
|
+
|
|
20
|
+
```javascript
|
|
21
|
+
import ClassicsSkin from 'haiwei-skins-classics'
|
|
22
|
+
|
|
23
|
+
// 注册皮肤组件
|
|
24
|
+
WebHost.registerSkin(ClassicsSkin)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 主题
|
|
28
|
+
|
|
29
|
+
皮肤支持以下主题:
|
|
30
|
+
|
|
31
|
+
- **default** - 默认蓝色主题 (#03a9f4)
|
|
32
|
+
- **blue-light** - 浅蓝色主题 (#e4e7ed)
|
|
33
|
+
|
|
34
|
+
## 项目结构
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
haiwei-skins-classics/
|
|
38
|
+
├── src/
|
|
39
|
+
│ ├── index.js # 入口文件
|
|
40
|
+
│ ├── index.vue # 皮肤组件
|
|
41
|
+
│ ├── store.js # 状态管理
|
|
42
|
+
│ └── preview.png # 皮肤预览图
|
|
43
|
+
└── script/ # 构建脚本
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## 可用脚本
|
|
47
|
+
|
|
48
|
+
- `npm run serve` - 启动开发服务器
|
|
49
|
+
- `npm run build` - 构建生产版本
|
|
50
|
+
- `npm run lint` - 代码规范检查
|
|
51
|
+
- `npm run i` - 使用淘宝镜像安装依赖
|
|
52
|
+
- `npm run up` - 使用淘宝镜像更新依赖
|
|
53
|
+
- `npm run pub` - 发布到 npm
|
|
54
|
+
|
|
55
|
+
## 技术栈
|
|
56
|
+
|
|
57
|
+
- **前端框架**: Vue 2.x
|
|
58
|
+
- **构建工具**: Vue CLI
|
|
59
|
+
- **包管理**: npm
|
|
60
|
+
|
|
61
|
+
## 许可证
|
|
62
|
+
|
|
63
|
+
ISC License
|
|
64
|
+
|
|
65
|
+
## 贡献
|
|
66
|
+
|
|
67
|
+
欢迎提交 Issue 和 Pull Request!
|
package/babel.config.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "haiwei-skins-classics",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "HaiWei皮肤组件classics",
|
|
5
|
+
"author": "Eric",
|
|
6
|
+
"license": "ISC",
|
|
7
|
+
"main": "src/index.js",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"serve": "vue-cli-service serve",
|
|
10
|
+
"build": "vue-cli-service build",
|
|
11
|
+
"lint": "vue-cli-service lint",
|
|
12
|
+
"cm": "rimraf node_modules && rimraf dist",
|
|
13
|
+
"cc": "rimraf node_modules/.cache",
|
|
14
|
+
"i": "cd ./script && npm_install.bat",
|
|
15
|
+
"up": "cd ./script && npm_update.bat",
|
|
16
|
+
"pub": "cd ./script && npm_publish.bat"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"haiwei-ui": "^1.0.0"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@vue/cli-plugin-babel": "^4.0.0",
|
|
23
|
+
"@vue/cli-plugin-eslint": "^4.0.0",
|
|
24
|
+
"@vue/cli-plugin-router": "^4.0.0",
|
|
25
|
+
"@vue/cli-plugin-vuex": "^4.0.0",
|
|
26
|
+
"@vue/cli-service": "^4.0.0",
|
|
27
|
+
"@vue/eslint-config-prettier": "^5.0.0",
|
|
28
|
+
"babel-eslint": "^10.0.3",
|
|
29
|
+
"eslint": "^5.16.0",
|
|
30
|
+
"eslint-plugin-prettier": "^3.1.1",
|
|
31
|
+
"eslint-plugin-vue": "^5.0.0",
|
|
32
|
+
"prettier": "^1.18.2",
|
|
33
|
+
"raw-loader": "^3.1.0",
|
|
34
|
+
"rimraf": "^3.0.0",
|
|
35
|
+
"sass": "^1.22.10",
|
|
36
|
+
"sass-loader": "^8.0.0",
|
|
37
|
+
"vue-template-compiler": "^2.6.10"
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "https://github.com/iamoldli/NetModular.Skins.Classics.git"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# 切换到项目根目录
|
|
2
|
+
Set-Location ..
|
|
3
|
+
|
|
4
|
+
# 使用淘宝镜像安装依赖(加速下载)
|
|
5
|
+
Write-Host "Installing dependencies using Taobao mirror..." -ForegroundColor Green
|
|
6
|
+
npm --registry https://registry.npmmirror.com/ install
|
|
7
|
+
|
|
8
|
+
# 等待用户按键
|
|
9
|
+
Write-Host "Dependencies installation completed. Press any key to continue..." -ForegroundColor Green
|
|
10
|
+
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# 切换到项目根目录
|
|
2
|
+
Set-Location ..
|
|
3
|
+
|
|
4
|
+
# 发布到 npm 官方仓库
|
|
5
|
+
Write-Host "Publishing to npm official registry..." -ForegroundColor Green
|
|
6
|
+
npm --registry https://registry.npmjs.org/ publish
|
|
7
|
+
|
|
8
|
+
# 等待用户按键
|
|
9
|
+
Write-Host "Publishing completed. Press any key to continue..." -ForegroundColor Green
|
|
10
|
+
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# 切换到项目根目录
|
|
2
|
+
Set-Location ..
|
|
3
|
+
|
|
4
|
+
# 使用淘宝镜像更新依赖(加速下载)
|
|
5
|
+
Write-Host "Updating dependencies using Taobao mirror..." -ForegroundColor Green
|
|
6
|
+
npm --registry https://registry.npmmirror.com/ update
|
|
7
|
+
|
|
8
|
+
# 等待用户按键
|
|
9
|
+
Write-Host "Dependencies update completed. Press any key to continue..." -ForegroundColor Green
|
|
10
|
+
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<section class="nm-header">
|
|
3
|
+
<!--logo-->
|
|
4
|
+
<section class="nm-header-logo">
|
|
5
|
+
<img :src="sys.logo" class="nm-header-logo-img" :alt="sys.title" :title="sys.title" />
|
|
6
|
+
<div class="nm-header-logo-text">{{ sys.title }}</div>
|
|
7
|
+
</section>
|
|
8
|
+
<!--导航栏-->
|
|
9
|
+
<section class="nm-header-nav">
|
|
10
|
+
<ul>
|
|
11
|
+
<template v-for="menu in menus">
|
|
12
|
+
<li :class="['nm-header-nav-item', menu.id === curr ? 'active' : '']" :key="menu.id">
|
|
13
|
+
<a href="javascript:void(0)" @click.prevent="onNavClick(menu)">
|
|
14
|
+
<nm-icon class="nm-header-nav-item-icon" :name="menu.icon" :style="{ color: menu.iconColor }" />
|
|
15
|
+
<span class="nm-header-nav-item-text">{{ menu.name }}</span>
|
|
16
|
+
</a>
|
|
17
|
+
</li>
|
|
18
|
+
</template>
|
|
19
|
+
</ul>
|
|
20
|
+
</section>
|
|
21
|
+
<!--工具栏-->
|
|
22
|
+
<section class="nm-header-toolbar">
|
|
23
|
+
<nm-toolbar />
|
|
24
|
+
</section>
|
|
25
|
+
</section>
|
|
26
|
+
</template>
|
|
27
|
+
<script>
|
|
28
|
+
import { mapState, mapMutations } from 'vuex'
|
|
29
|
+
import { open } from 'netmodular-ui/packages/utils/menu'
|
|
30
|
+
|
|
31
|
+
export default {
|
|
32
|
+
data() {
|
|
33
|
+
return {
|
|
34
|
+
curr: ''
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
computed: {
|
|
38
|
+
...mapState('app/system', { sys: s => s.config.base }),
|
|
39
|
+
...mapState('app/account', ['menus', 'routeMenus']),
|
|
40
|
+
...mapState('app/page', ['current'])
|
|
41
|
+
},
|
|
42
|
+
methods: {
|
|
43
|
+
...mapMutations('app/skins/classics', ['setMenus']),
|
|
44
|
+
onNavClick(menu) {
|
|
45
|
+
this.curr = menu.id
|
|
46
|
+
// 节点类型
|
|
47
|
+
if (menu.type === 0) {
|
|
48
|
+
if (menu.children) {
|
|
49
|
+
this.setMenus(menu.children)
|
|
50
|
+
if (menu.children && menu.children[0]) {
|
|
51
|
+
open(this.$router, menu.children[0])
|
|
52
|
+
}
|
|
53
|
+
} else {
|
|
54
|
+
this.setMenus([])
|
|
55
|
+
}
|
|
56
|
+
} else {
|
|
57
|
+
open(this.$router, menu)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
watch: {
|
|
62
|
+
current() {
|
|
63
|
+
if (this.current.name && this.routeMenus) {
|
|
64
|
+
let routeMenu = this.routeMenus.get(this.current.name)
|
|
65
|
+
if (routeMenu) {
|
|
66
|
+
for (var i = 0; i < this.menus.length; i++) {
|
|
67
|
+
if (this.menus[i].id === routeMenu.menu.rootId) {
|
|
68
|
+
this.curr = this.menus[i].id
|
|
69
|
+
this.setMenus(this.menus[i].children)
|
|
70
|
+
break
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
</script>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<section :class="['nm-main',fontSize,sidebarCollapse?'collapse':'']">
|
|
3
|
+
<section class="nm-main-left">
|
|
4
|
+
<nm-menus />
|
|
5
|
+
</section>
|
|
6
|
+
<section class="nm-main-right">
|
|
7
|
+
<div class="nm-main-right-top">
|
|
8
|
+
<div>
|
|
9
|
+
<nm-tabnav>
|
|
10
|
+
<template v-slot:before>
|
|
11
|
+
<div class="nm-sidebar-toggle-btn">
|
|
12
|
+
<a @click.prevent="sidebarToggle">
|
|
13
|
+
<nm-icon :name="sidebarCollapse ? 'indent-left' : 'indent-right'"></nm-icon>
|
|
14
|
+
</a>
|
|
15
|
+
</div>
|
|
16
|
+
</template>
|
|
17
|
+
</nm-tabnav>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
<section class="nm-content">
|
|
21
|
+
<transition name="fade-transverse">
|
|
22
|
+
<keep-alive :include="keepAlive">
|
|
23
|
+
<router-view :key="$route.path" />
|
|
24
|
+
</keep-alive>
|
|
25
|
+
</transition>
|
|
26
|
+
</section>
|
|
27
|
+
</section>
|
|
28
|
+
</section>
|
|
29
|
+
</template>
|
|
30
|
+
<script>
|
|
31
|
+
import { mapState, mapActions } from 'vuex'
|
|
32
|
+
import NmMenus from '../menus'
|
|
33
|
+
export default {
|
|
34
|
+
components: { NmMenus },
|
|
35
|
+
computed: {
|
|
36
|
+
...mapState('app/skins/classics/sidebar', { sidebarCollapse: 'collapse' }),
|
|
37
|
+
...mapState('app/page', ['keepAlive'])
|
|
38
|
+
},
|
|
39
|
+
methods: {
|
|
40
|
+
...mapActions('app/skins/classics/sidebar', { sidebarToggle: 'toggle' })
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
</script>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<section class="nm-menus">
|
|
3
|
+
<div class="no-menus" v-if="!menus || menus.length < 1">
|
|
4
|
+
<nm-icon name="form" />
|
|
5
|
+
<p>没有菜单</p>
|
|
6
|
+
</div>
|
|
7
|
+
<el-scrollbar v-else>
|
|
8
|
+
<el-menu :default-active="active" :unique-opened="uniqueOpened" :collapse="collapse" :collapse-transition="false">
|
|
9
|
+
<template v-for="item in menus">
|
|
10
|
+
<menu-item v-if="item.show" :key="item.id" :menu="item" />
|
|
11
|
+
</template>
|
|
12
|
+
</el-menu>
|
|
13
|
+
</el-scrollbar>
|
|
14
|
+
</section>
|
|
15
|
+
</template>
|
|
16
|
+
<script>
|
|
17
|
+
import MenuItem from 'netmodular-ui/packages/skins/pretty/components/menus/item'
|
|
18
|
+
import { mapState } from 'vuex'
|
|
19
|
+
export default {
|
|
20
|
+
components: { MenuItem },
|
|
21
|
+
computed: {
|
|
22
|
+
...mapState('app/system', { uniqueOpened: s => s.config.component.menu.uniqueOpened }),
|
|
23
|
+
...mapState('app/skins/classics/sidebar', ['collapse']),
|
|
24
|
+
...mapState('app/skins/classics', ['menus']),
|
|
25
|
+
...mapState('app/account', ['routeMenus']),
|
|
26
|
+
...mapState('app/page', ['current']),
|
|
27
|
+
active: {
|
|
28
|
+
get() {
|
|
29
|
+
if (this.current.name && this.routeMenus) {
|
|
30
|
+
let routeMenu = this.routeMenus.get(this.current.name)
|
|
31
|
+
|
|
32
|
+
if (routeMenu) {
|
|
33
|
+
return routeMenu.menu.id
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return '-1'
|
|
37
|
+
},
|
|
38
|
+
set() {}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
</script>
|
package/src/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import store from './store'
|
|
2
|
+
import component from './index.vue'
|
|
3
|
+
import preview from './preview.png'
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
component,
|
|
7
|
+
store,
|
|
8
|
+
options: {
|
|
9
|
+
name: '经典',
|
|
10
|
+
code: 'classics',
|
|
11
|
+
preview,
|
|
12
|
+
themes: [
|
|
13
|
+
{
|
|
14
|
+
name: 'default',
|
|
15
|
+
color: '#03a9f4'
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'blue-light',
|
|
19
|
+
color: '#e4e7ed'
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
}
|
package/src/index.vue
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="nm-wrapper">
|
|
3
|
+
<nm-header />
|
|
4
|
+
<nm-main />
|
|
5
|
+
</div>
|
|
6
|
+
</template>
|
|
7
|
+
<script>
|
|
8
|
+
import NmHeader from './components/header'
|
|
9
|
+
import NmMain from './components/main'
|
|
10
|
+
export default {
|
|
11
|
+
components: { NmHeader, NmMain }
|
|
12
|
+
}
|
|
13
|
+
</script>
|
|
14
|
+
<style lang="scss">
|
|
15
|
+
@import "./styles/_index.scss";
|
|
16
|
+
</style>
|
package/src/preview.png
ADDED
|
Binary file
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import sidebar from 'netmodular-ui/packages/skins/pretty/store/modules/sidebar'
|
|
2
|
+
export default {
|
|
3
|
+
namespaced: true,
|
|
4
|
+
state: {
|
|
5
|
+
menus: []
|
|
6
|
+
},
|
|
7
|
+
mutations: {
|
|
8
|
+
setMenus(state, menus) {
|
|
9
|
+
state.menus = menus
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
modules: {
|
|
13
|
+
sidebar
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
@import '~netmodular-ui/packages/styles/mixins';
|
|
2
|
+
@import '~netmodular-ui/packages/styles/variables';
|
|
3
|
+
|
|
4
|
+
#{$prefix}skin-classics {
|
|
5
|
+
#{$prefix}wrapper {
|
|
6
|
+
margin: 0;
|
|
7
|
+
padding: 0;
|
|
8
|
+
height: 100%;
|
|
9
|
+
@include flex-column();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
@import './components/header/index';
|
|
13
|
+
@import './components/main/index';
|
|
14
|
+
|
|
15
|
+
@import './themes/index';
|
|
16
|
+
|
|
17
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#{$prefix}header {
|
|
2
|
+
position: relative;
|
|
3
|
+
@include flex-row();
|
|
4
|
+
flex-shrink: 0;
|
|
5
|
+
height: 80px;
|
|
6
|
+
background-color: #03a9f4;
|
|
7
|
+
|
|
8
|
+
/*logo*/
|
|
9
|
+
&-logo {
|
|
10
|
+
@include flex-row();
|
|
11
|
+
flex-shrink: 0;
|
|
12
|
+
height: 100%;
|
|
13
|
+
overflow: hidden;
|
|
14
|
+
transition: all 0.3s ease-in-out;
|
|
15
|
+
z-index: 1;
|
|
16
|
+
|
|
17
|
+
&-img {
|
|
18
|
+
flex-shrink: 0;
|
|
19
|
+
margin: 5px 11px;
|
|
20
|
+
width: 60px;
|
|
21
|
+
height: 60px;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
&-text {
|
|
25
|
+
flex-grow: 1;
|
|
26
|
+
text-align: center;
|
|
27
|
+
@include vertical-center(80px);
|
|
28
|
+
font-size: 30px;
|
|
29
|
+
color: #fff;
|
|
30
|
+
white-space: nowrap;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
&-nav {
|
|
35
|
+
display: inline-block;
|
|
36
|
+
flex-grow: 1;
|
|
37
|
+
margin-left: 15px;
|
|
38
|
+
overflow: hidden;
|
|
39
|
+
|
|
40
|
+
&-item {
|
|
41
|
+
padding: 0 3px;
|
|
42
|
+
float: left;
|
|
43
|
+
|
|
44
|
+
a {
|
|
45
|
+
position: relative;
|
|
46
|
+
padding: 10px 15px;
|
|
47
|
+
display: inline-block;
|
|
48
|
+
text-decoration: none;
|
|
49
|
+
color: #e4e7ed;
|
|
50
|
+
text-align: center;
|
|
51
|
+
height: 80px;
|
|
52
|
+
box-sizing: border-box;
|
|
53
|
+
cursor: pointer;
|
|
54
|
+
transition: background-color 0.25s ease-in-out;
|
|
55
|
+
|
|
56
|
+
&::after {
|
|
57
|
+
content: '';
|
|
58
|
+
position: absolute;
|
|
59
|
+
bottom: 0;
|
|
60
|
+
left: 50%;
|
|
61
|
+
width: 0;
|
|
62
|
+
height: 3px;
|
|
63
|
+
background: #e6a23c;
|
|
64
|
+
transition: all .25s ease-in-out;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
&-icon {
|
|
69
|
+
font-size: 35px;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
&-text {
|
|
73
|
+
display: block;
|
|
74
|
+
margin-top: 5px;
|
|
75
|
+
font-size: 14px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
&:hover,
|
|
79
|
+
&.active {
|
|
80
|
+
|
|
81
|
+
a {
|
|
82
|
+
color: #fff;
|
|
83
|
+
background-color: #29d;
|
|
84
|
+
|
|
85
|
+
&::after {
|
|
86
|
+
left: 0;
|
|
87
|
+
width: 100%;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
&-toolbar {
|
|
96
|
+
#{$prefix}toolbar {
|
|
97
|
+
position: absolute;
|
|
98
|
+
top: 0;
|
|
99
|
+
right: 0;
|
|
100
|
+
height: 80px;
|
|
101
|
+
background-color: #03a9f4;
|
|
102
|
+
|
|
103
|
+
&-button {
|
|
104
|
+
width: 50px;
|
|
105
|
+
|
|
106
|
+
#{$prefix}icon {
|
|
107
|
+
font-size: 35px;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#{$prefix}main {
|
|
2
|
+
@include flex-row();
|
|
3
|
+
flex-grow: 1;
|
|
4
|
+
overflow: hidden;
|
|
5
|
+
|
|
6
|
+
&-left {
|
|
7
|
+
position: relative;
|
|
8
|
+
flex-shrink: 0;
|
|
9
|
+
width: 240px;
|
|
10
|
+
background-color: #344058;
|
|
11
|
+
transition: all 0.25s ease-in;
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
&-right {
|
|
16
|
+
@include flex-column();
|
|
17
|
+
flex-grow: 1;
|
|
18
|
+
|
|
19
|
+
&-top {
|
|
20
|
+
position: relative;
|
|
21
|
+
flex-shrink: 0;
|
|
22
|
+
height: 50px;
|
|
23
|
+
overflow: hidden;
|
|
24
|
+
|
|
25
|
+
>div {
|
|
26
|
+
position: absolute;
|
|
27
|
+
height: 100%;
|
|
28
|
+
width: 100%;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#{$prefix}sidebar-toggle-btn {
|
|
33
|
+
padding: 0 5px;
|
|
34
|
+
flex-shrink: 0;
|
|
35
|
+
background-color: #ebf1f6;
|
|
36
|
+
|
|
37
|
+
a {
|
|
38
|
+
padding: 0 8px;
|
|
39
|
+
display: inline-block;
|
|
40
|
+
height: 50px;
|
|
41
|
+
line-height: 50px;
|
|
42
|
+
font-size: 25px;
|
|
43
|
+
text-align: center;
|
|
44
|
+
background-color: #fff;
|
|
45
|
+
color: #909090;
|
|
46
|
+
cursor: pointer;
|
|
47
|
+
text-decoration: none;
|
|
48
|
+
box-sizing: border-box;
|
|
49
|
+
border-bottom: 1px solid #dcdfe6;
|
|
50
|
+
border-left: 1px solid #dcdfe6;
|
|
51
|
+
|
|
52
|
+
&:hover {
|
|
53
|
+
color: #444;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
#{$prefix}content {
|
|
60
|
+
position: relative;
|
|
61
|
+
flex-grow: 1;
|
|
62
|
+
overflow: hidden;
|
|
63
|
+
background: #f0f0f0;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
&.collapse {
|
|
68
|
+
#{$prefix}main-left {
|
|
69
|
+
width: 70px;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@mixin main-right($height) {
|
|
74
|
+
#{$prefix}main-right {
|
|
75
|
+
&-top {
|
|
76
|
+
height: $height;
|
|
77
|
+
|
|
78
|
+
#{$prefix}sidebar-toggle-btn {
|
|
79
|
+
|
|
80
|
+
a {
|
|
81
|
+
height: $height;
|
|
82
|
+
line-height: $height;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
&.mini {
|
|
90
|
+
@include main-right(35px);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
&.small {
|
|
94
|
+
@include main-right(40px);
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
&.medium {
|
|
99
|
+
@include main-right(45px);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@import '~netmodular-ui/packages/skins/pretty/styles/components/menus/index';
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#{$prefix}main {
|
|
2
|
+
&-left {
|
|
3
|
+
|
|
4
|
+
#{$prefix}menus {
|
|
5
|
+
background-color: $classics-menus-background-color !important;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.el-menu,
|
|
9
|
+
.el-menu--vertical {
|
|
10
|
+
background-color: $classics-menus-background-color;
|
|
11
|
+
|
|
12
|
+
.el-menu-item,
|
|
13
|
+
.el-submenu__title {
|
|
14
|
+
color: $classics-menus-menu-color;
|
|
15
|
+
|
|
16
|
+
&:focus,
|
|
17
|
+
&:active,
|
|
18
|
+
&:hover {
|
|
19
|
+
background: $classics-menus-menu-hover-background-color !important;
|
|
20
|
+
color: $classics-menus-menu-hover-color !important;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&.is-active {
|
|
24
|
+
background: $classics-menus-menu-active-background-color !important;
|
|
25
|
+
color: $classics-menus-menu-active-color !important;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/*主题色*/
|
|
2
|
+
$classics-theme-color: #03a9f4;
|
|
3
|
+
|
|
4
|
+
/*menus*/
|
|
5
|
+
$classics-menus-background-color: #fff;
|
|
6
|
+
$classics-menus-menu-color:#444;
|
|
7
|
+
|
|
8
|
+
$classics-menus-menu-active-background-color:#29d;
|
|
9
|
+
$classics-menus-menu-active-color:#fff;
|
|
10
|
+
|
|
11
|
+
$classics-menus-menu-hover-background-color:rgba(64, 158, 255, 0.2);
|
|
12
|
+
$classics-menus-menu-hover-color:#444;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/*主题色*/
|
|
2
|
+
$classics-theme-color: #03a9f4;
|
|
3
|
+
|
|
4
|
+
/*menus*/
|
|
5
|
+
$classics-menus-background-color: #344058;
|
|
6
|
+
$classics-menus-menu-color:rgba(255, 255, 255, .7);
|
|
7
|
+
|
|
8
|
+
$classics-menus-menu-active-background-color:#29d;
|
|
9
|
+
$classics-menus-menu-active-color:#fff;
|
|
10
|
+
|
|
11
|
+
$classics-menus-menu-hover-background-color:rgba(64, 158, 255, 0.2);
|
|
12
|
+
$classics-menus-menu-hover-color:#fff;
|