feat: 初始化项目配置和文档- 添加 .editorconfig 文件,配置代码编辑规范
- 添加 .env 及相关文件,配置环境变量 - 添加 .eslintignore 和 .eslintrc.js 文件,配置 ESLint 规则 - 添加 .gitignore 文件,配置 Git忽略项 - 添加 .prettierignore 文件,配置 Prettier 忽略项 - 添加隐私政策文档,详细说明用户数据的收集和使用
This commit is contained in:
242
src/styles/animations.less
Normal file
242
src/styles/animations.less
Normal file
@@ -0,0 +1,242 @@
|
||||
// 动画样式定义
|
||||
|
||||
// 关键帧动画
|
||||
@keyframes fadeInUp {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideInLeft {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(-30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideInRight {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes shake {
|
||||
0%, 100% {
|
||||
transform: translateX(0);
|
||||
}
|
||||
10%, 30%, 50%, 70%, 90% {
|
||||
transform: translateX(-5px);
|
||||
}
|
||||
20%, 40%, 60%, 80% {
|
||||
transform: translateX(5px);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pulseSuccess {
|
||||
0% {
|
||||
transform: scale(1);
|
||||
box-shadow: 0 0 0 0 rgba(0, 125, 255, 0.7);
|
||||
}
|
||||
70% {
|
||||
transform: scale(1.05);
|
||||
box-shadow: 0 0 0 10px rgba(0, 125, 255, 0);
|
||||
}
|
||||
100% {
|
||||
transform: scale(1);
|
||||
box-shadow: 0 0 0 0 rgba(0, 125, 255, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes ripple {
|
||||
to {
|
||||
transform: scale(4);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes float {
|
||||
0%, 100% {
|
||||
transform: translateY(0px);
|
||||
}
|
||||
50% {
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes glow {
|
||||
0%, 100% {
|
||||
box-shadow: 0 0 5px rgba(0, 125, 255, 0.5);
|
||||
}
|
||||
50% {
|
||||
box-shadow: 0 0 20px rgba(0, 125, 255, 0.8);
|
||||
}
|
||||
}
|
||||
|
||||
// 动画类
|
||||
.animate-fade-in-up {
|
||||
animation: fadeInUp 0.6s ease-out forwards;
|
||||
}
|
||||
|
||||
.animate-slide-in-left {
|
||||
animation: slideInLeft 0.5s ease-out forwards;
|
||||
}
|
||||
|
||||
.animate-slide-in-right {
|
||||
animation: slideInRight 0.5s ease-out forwards;
|
||||
}
|
||||
|
||||
.animate-fade-in {
|
||||
animation: fadeIn 0.3s ease-out forwards;
|
||||
}
|
||||
|
||||
.animate-fade-out {
|
||||
animation: fadeOut 0.3s ease-out forwards;
|
||||
}
|
||||
|
||||
.animate-shake {
|
||||
animation: shake 0.5s ease-in-out;
|
||||
}
|
||||
|
||||
.animate-pulse-success {
|
||||
animation: pulseSuccess 1s ease-out;
|
||||
}
|
||||
|
||||
.animate-float {
|
||||
animation: float 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.animate-glow {
|
||||
animation: glow 2s ease-in-out infinite;
|
||||
}
|
||||
|
||||
// 波纹效果
|
||||
.ripple {
|
||||
position: absolute;
|
||||
border-radius: 50%;
|
||||
background: rgba(255, 255, 255, 0.6);
|
||||
transform: scale(0);
|
||||
animation: ripple 0.6s linear;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
// 输入框聚焦效果
|
||||
.input-focused {
|
||||
.ant-input,
|
||||
.ant-input-password {
|
||||
border-color: #007dff !important;
|
||||
box-shadow: 0 0 0 2px rgba(0, 125, 255, 0.2) !important;
|
||||
transform: translateY(-2px);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
}
|
||||
|
||||
// 按钮悬停效果
|
||||
.dynamic-button {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
transition: all 0.3s ease;
|
||||
|
||||
&:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 8px 25px rgba(0, 125, 255, 0.3);
|
||||
}
|
||||
|
||||
&:active {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
// 卡片悬停效果
|
||||
.dynamic-card {
|
||||
transition: all 0.3s ease;
|
||||
|
||||
&:hover {
|
||||
transform: translateY(-5px);
|
||||
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
// 渐变背景动画
|
||||
.gradient-bg {
|
||||
background: linear-gradient(-45deg, #007dff, #00d4ff, #ff6b6b, #4ecdc4);
|
||||
background-size: 400% 400%;
|
||||
animation: gradientShift 15s ease infinite;
|
||||
}
|
||||
|
||||
@keyframes gradientShift {
|
||||
0% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
50% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
100% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
}
|
||||
|
||||
// 加载动画
|
||||
.loading-dots {
|
||||
display: inline-block;
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
animation: loadingDots 1.5s infinite;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes loadingDots {
|
||||
0%, 20% {
|
||||
content: '';
|
||||
}
|
||||
40% {
|
||||
content: '.';
|
||||
}
|
||||
60% {
|
||||
content: '..';
|
||||
}
|
||||
80%, 100% {
|
||||
content: '...';
|
||||
}
|
||||
}
|
||||
|
||||
// 响应式动画
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
* {
|
||||
animation-duration: 0.01ms !important;
|
||||
animation-iteration-count: 1 !important;
|
||||
transition-duration: 0.01ms !important;
|
||||
}
|
||||
}
|
||||
6
src/styles/as-needed.less
Normal file
6
src/styles/as-needed.less
Normal file
@@ -0,0 +1,6 @@
|
||||
/** 按需引入 */
|
||||
@import 'ant-design-vue/es/message/style/index.less';
|
||||
@import 'ant-design-vue/es/notification/style/index.less';
|
||||
@import 'ele-admin-pro/es/style/nprogress.less';
|
||||
@import 'ele-admin-pro/es/style/display.less';
|
||||
@import 'ele-admin-pro/es/style/common.less';
|
||||
2
src/styles/component.less
Normal file
2
src/styles/component.less
Normal file
@@ -0,0 +1,2 @@
|
||||
/** 组件样式 */
|
||||
//@input-item: 300px;
|
||||
4
src/styles/global-import.less
vendored
Normal file
4
src/styles/global-import.less
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
/** 全局引入 */
|
||||
@import 'cropperjs/dist/cropper.css';
|
||||
@import 'ant-design-vue/dist/antd.less';
|
||||
@import 'ele-admin-pro/es/style/index.less';
|
||||
39
src/styles/index.less
Normal file
39
src/styles/index.less
Normal file
@@ -0,0 +1,39 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
/** 全局样式 */
|
||||
@style-entry-file: as-needed;
|
||||
@import './@{style-entry-file}.less';
|
||||
@import './transition/index.less';
|
||||
@import "./component.less";
|
||||
|
||||
// 主题
|
||||
@import 'ele-admin-pro/es/style/themes/dynamic.less';
|
||||
|
||||
:root {
|
||||
// 灰色主题
|
||||
--grey-1: #1b1b1b;
|
||||
--grey-2: #363636;
|
||||
--grey-3: #4d4d4d;
|
||||
--grey-4: #737373;
|
||||
--grey-5: #a6a6a6;
|
||||
--grey-6: #d9d9d9;
|
||||
--grey-7: #e6e6e6;
|
||||
--grey-8: #f2f2f2;
|
||||
--grey-9: #f7f7f7;
|
||||
--grey-10: #fafafa;
|
||||
}
|
||||
|
||||
.ele-admin-theme-dark {
|
||||
// 灰色主题
|
||||
--grey-1: #fafafa;
|
||||
--grey-2: #f7f7f7;
|
||||
--grey-3: #f2f2f2;
|
||||
--grey-4: #e6e6e6;
|
||||
--grey-5: #d9d9d9;
|
||||
--grey-6: #a6a6a6;
|
||||
--grey-7: #737373;
|
||||
--grey-8: #4d4d4d;
|
||||
--grey-9: #363636;
|
||||
--grey-10: #1b1b1b;
|
||||
}
|
||||
10
src/styles/transition/fade.less
Normal file
10
src/styles/transition/fade.less
Normal file
@@ -0,0 +1,10 @@
|
||||
/* 渐变 */
|
||||
.fade-enter-active,
|
||||
.fade-leave-active {
|
||||
transition: opacity 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
.fade-enter-from,
|
||||
.fade-leave-to {
|
||||
opacity: 0;
|
||||
}
|
||||
4
src/styles/transition/index.less
Normal file
4
src/styles/transition/index.less
Normal file
@@ -0,0 +1,4 @@
|
||||
/** 路由切换动画 */
|
||||
@import './fade.less';
|
||||
@import './slide.less';
|
||||
@import './zoom.less';
|
||||
31
src/styles/transition/slide.less
Normal file
31
src/styles/transition/slide.less
Normal file
@@ -0,0 +1,31 @@
|
||||
/* 底部消退 */
|
||||
.slide-bottom-enter-active,
|
||||
.slide-bottom-leave-active {
|
||||
transition: opacity 0.2s ease-out, transform 0.25s ease-out;
|
||||
}
|
||||
|
||||
.slide-bottom-enter-from {
|
||||
opacity: 0;
|
||||
transform: translateY(-10%);
|
||||
}
|
||||
|
||||
.slide-bottom-leave-to {
|
||||
opacity: 0;
|
||||
transform: translateY(10%);
|
||||
}
|
||||
|
||||
/* 右侧消退 */
|
||||
.slide-right-leave-active,
|
||||
.slide-right-enter-active {
|
||||
transition: opacity 0.2s ease-out, transform 0.25s ease-out;
|
||||
}
|
||||
|
||||
.slide-right-enter-from {
|
||||
opacity: 0;
|
||||
transform: translateX(-60px);
|
||||
}
|
||||
|
||||
.slide-right-leave-to {
|
||||
opacity: 0;
|
||||
transform: translateX(60px);
|
||||
}
|
||||
31
src/styles/transition/zoom.less
Normal file
31
src/styles/transition/zoom.less
Normal file
@@ -0,0 +1,31 @@
|
||||
/* 放大渐变 */
|
||||
.zoom-in-enter-active,
|
||||
.zoom-in-leave-active {
|
||||
transition: opacity 0.2s ease-out, transform 0.25s ease-out;
|
||||
}
|
||||
|
||||
.zoom-in-enter-from {
|
||||
opacity: 0;
|
||||
transform: scale(0.9);
|
||||
}
|
||||
|
||||
.zoom-in-leave-to {
|
||||
opacity: 0;
|
||||
transform: scale(1.1);
|
||||
}
|
||||
|
||||
/* 缩小渐变 */
|
||||
.zoom-out-leave-active,
|
||||
.zoom-out-enter-active {
|
||||
transition: opacity 0.2s ease-out, transform 0.25s ease-out;
|
||||
}
|
||||
|
||||
.zoom-out-enter-from {
|
||||
opacity: 0;
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
.zoom-out-leave-to {
|
||||
opacity: 0;
|
||||
transform: scale(0.8);
|
||||
}
|
||||
Reference in New Issue
Block a user