引入 postcss-nested

This commit is contained in:
Hooray Hu
2024-08-26 23:16:47 +08:00
parent f68e32d99b
commit e8eb5d48e6
51 changed files with 187 additions and 163 deletions
+1
View File
@@ -98,6 +98,7 @@
"picocolors": "^1.0.1", "picocolors": "^1.0.1",
"plop": "^4.0.1", "plop": "^4.0.1",
"postcss": "^8.4.40", "postcss": "^8.4.40",
"postcss-nested": "^6.2.0",
"sass": "^1.77.8", "sass": "^1.77.8",
"simple-git-hooks": "^2.11.1", "simple-git-hooks": "^2.11.1",
"stylelint": "^16.8.1", "stylelint": "^16.8.1",
+2 -2
View File
@@ -12,6 +12,6 @@ defineOptions({
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
// 样式 /* 样式 */
</style> </style>
+2 -2
View File
@@ -17,6 +17,6 @@ defineOptions({
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
// 样式 /* 样式 */
</style> </style>
+14
View File
@@ -243,6 +243,9 @@ importers:
postcss: postcss:
specifier: ^8.4.40 specifier: ^8.4.40
version: 8.4.40 version: 8.4.40
postcss-nested:
specifier: ^6.2.0
version: 6.2.0(postcss@8.4.40)
sass: sass:
specifier: ^1.77.8 specifier: ^1.77.8
version: 1.77.8 version: 1.77.8
@@ -5855,6 +5858,12 @@ packages:
postcss-media-query-parser@0.2.3: postcss-media-query-parser@0.2.3:
resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
postcss-nested@6.2.0:
resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.2.14
postcss-prefix-selector@1.16.0: postcss-prefix-selector@1.16.0:
resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==} resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==}
peerDependencies: peerDependencies:
@@ -13984,6 +13993,11 @@ snapshots:
postcss-media-query-parser@0.2.3: {} postcss-media-query-parser@0.2.3: {}
postcss-nested@6.2.0(postcss@8.4.40):
dependencies:
postcss: 8.4.40
postcss-selector-parser: 6.1.1
postcss-prefix-selector@1.16.0(postcss@5.2.18): postcss-prefix-selector@1.16.0(postcss@5.2.18):
dependencies: dependencies:
postcss: 5.2.18 postcss: 5.2.18
+2 -1
View File
@@ -1,5 +1,6 @@
export default { export default {
plugins: { plugins: {
autoprefixer: {}, 'autoprefixer': {},
'postcss-nested': {},
}, },
} }
@@ -1,20 +1,24 @@
// 页面布局 CSS 变量 /* 页面布局 CSS 变量 */
:root { :root {
// 头部高度 /* 头部高度 */
--g-header-height: 60px; --g-header-height: 60px;
// 侧边栏宽度
/* 侧边栏宽度 */
--g-main-sidebar-width: 80px; --g-main-sidebar-width: 80px;
--g-sub-sidebar-width: 220px; --g-sub-sidebar-width: 220px;
--g-sub-sidebar-collapse-width: 64px; --g-sub-sidebar-collapse-width: 64px;
// 侧边栏 Logo 区域高度
/* 侧边栏 Logo 区域高度 */
--g-sidebar-logo-height: 50px; --g-sidebar-logo-height: 50px;
// 标签栏高度
/* 标签栏高度 */
--g-tabbar-height: 50px; --g-tabbar-height: 50px;
// 工具栏高度
/* 工具栏高度 */
--g-toolbar-height: 50px; --g-toolbar-height: 50px;
} }
// 明暗模式 CSS 变量 /* 明暗模式 CSS 变量 */
/* stylelint-disable-next-line no-duplicate-selectors */ /* stylelint-disable-next-line no-duplicate-selectors */
:root { :root {
--g-box-shadow-color: rgb(0 0 0 / 12%); --g-box-shadow-color: rgb(0 0 0 / 12%);
@@ -87,22 +91,21 @@ body {
box-sizing: inherit; box-sizing: inherit;
} }
// 右侧内容区针对fixed元素,有横向铺满的需求,可在fixed元素上设置 [data-fixed-calc-width] /* 右侧内容区针对fixed元素,有横向铺满的需求,可在fixed元素上设置 [data-fixed-calc-width] */
[data-fixed-calc-width] { [data-fixed-calc-width] {
position: fixed; position: fixed;
right: 0; right: 0;
left: 50%; left: 50%;
width: calc(100% - var(--g-main-sidebar-actual-width) - var(--g-sub-sidebar-actual-width)); width: calc(100% - var(--g-main-sidebar-actual-width) - var(--g-sub-sidebar-actual-width));
transform: translateX(-50%) translateX(calc(var(--g-main-sidebar-actual-width) / 2)) translateX(calc(var(--g-sub-sidebar-actual-width) / 2)); transform: translateX(-50%) translateX(calc(var(--g-main-sidebar-actual-width) / 2)) translateX(calc(var(--g-sub-sidebar-actual-width) / 2));
}
[data-mode="mobile"] { [data-mode="mobile"] & {
[data-fixed-calc-width] {
width: 100% !important; width: 100% !important;
transform: translateX(-50%) !important; transform: translateX(-50%) !important;
} }
} }
// textarea 字体跟随系统
/* textarea 字体跟随系统 */
textarea { textarea {
font-family: inherit; font-family: inherit;
} }
@@ -110,12 +113,12 @@ textarea {
/* Overrides Floating Vue */ /* Overrides Floating Vue */
.v-popper--theme-dropdown, .v-popper--theme-dropdown,
.v-popper--theme-tooltip { .v-popper--theme-tooltip {
--at-apply: inline-flex; --uno: inline-flex;
} }
.v-popper--theme-dropdown .v-popper__inner, .v-popper--theme-dropdown .v-popper__inner,
.v-popper--theme-tooltip .v-popper__inner { .v-popper--theme-tooltip .v-popper__inner {
--at-apply: bg-white dark-bg-stone-8 text-dark dark-text-white rounded shadow ring-1 ring-gray-200 dark-ring-gray-800 border border-solid border-stone/20 text-xs font-normal; --uno: bg-white dark-bg-stone-8 text-dark dark-text-white rounded shadow ring-1 ring-gray-200 dark-ring-gray-800 border border-solid border-stone/20 text-xs font-normal;
box-shadow: 0 6px 30px rgb(0 0 0 / 10%); box-shadow: 0 6px 30px rgb(0 0 0 / 10%);
} }
@@ -124,12 +127,12 @@ textarea {
.v-popper--theme-dropdown .v-popper__arrow-inner { .v-popper--theme-dropdown .v-popper__arrow-inner {
visibility: visible; visibility: visible;
--at-apply: border-white dark-border-stone-8; --uno: border-white dark-border-stone-8;
} }
.v-popper--theme-tooltip .v-popper__arrow-outer, .v-popper--theme-tooltip .v-popper__arrow-outer,
.v-popper--theme-dropdown .v-popper__arrow-outer { .v-popper--theme-dropdown .v-popper__arrow-outer {
--at-apply: border-stone/20; --uno: border-stone/20;
} }
.v-popper--theme-tooltip.v-popper--shown, .v-popper--theme-tooltip.v-popper--shown,
+1 -1
View File
@@ -114,7 +114,7 @@ const onPreview: UploadProps['onPreview'] = (e) => {
</ElUpload> </ElUpload>
</template> </template>
<style lang="scss" scoped> <style scoped>
:deep(.el-upload.is-drag) { :deep(.el-upload.is-drag) {
display: inline-block; display: inline-block;
+1 -1
View File
@@ -34,7 +34,7 @@ function onScroll() {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.fixed-action-bar { .fixed-action-bar {
box-shadow: 0 0 1px 0 var(--g-box-shadow-color); box-shadow: 0 0 1px 0 var(--g-box-shadow-color);
+1 -1
View File
@@ -34,7 +34,7 @@ const realHeight = computed(() => {
</ElImage> </ElImage>
</template> </template>
<style lang="scss" scoped> <style scoped>
.el-image { .el-image {
background-color: var(--el-fill-color); background-color: var(--el-fill-color);
border-radius: 5px; border-radius: 5px;
+9 -5
View File
@@ -136,7 +136,7 @@ const onSuccess: UploadProps['onSuccess'] = (res) => {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.upload-container { .upload-container {
line-height: initial; line-height: initial;
} }
@@ -160,14 +160,16 @@ const onSuccess: UploadProps['onSuccess'] = (res) => {
transition: opacity 0.3s; transition: opacity 0.3s;
.actions { .actions {
position: absolute;
top: 50%;
left: 50%;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
width: 100px; width: 100px;
height: 100px; height: 100px;
transform: translateX(-50%) translateY(-50%);
@include position-center(xy);
span { span {
width: 50%; width: 50%;
@@ -235,9 +237,11 @@ const onSuccess: UploadProps['onSuccess'] = (res) => {
} }
.el-progress { .el-progress {
position: absolute;
top: 50%;
left: 50%;
z-index: 1; z-index: 1;
transform: translateX(-50%) translateY(-50%);
@include position-center(xy);
.el-progress__text { .el-progress__text {
color: var(--el-text-color-placeholder); color: var(--el-text-color-placeholder);
+9 -5
View File
@@ -153,7 +153,7 @@ const onSuccess: UploadProps['onSuccess'] = (res) => {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.upload-container { .upload-container {
line-height: initial; line-height: initial;
} }
@@ -180,14 +180,16 @@ const onSuccess: UploadProps['onSuccess'] = (res) => {
transition: opacity 0.3s; transition: opacity 0.3s;
.actions { .actions {
position: absolute;
top: 50%;
left: 50%;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
width: 100px; width: 100px;
height: 100px; height: 100px;
transform: translateX(-50%) translateY(-50%);
@include position-center(xy);
span { span {
width: 50%; width: 50%;
@@ -260,9 +262,11 @@ const onSuccess: UploadProps['onSuccess'] = (res) => {
} }
.el-progress { .el-progress {
position: absolute;
top: 50%;
left: 50%;
z-index: 1; z-index: 1;
transform: translateX(-50%) translateY(-50%);
@include position-center(xy);
.el-progress__text { .el-progress__text {
color: var(--el-text-color-placeholder); color: var(--el-text-color-placeholder);
+1 -1
View File
@@ -132,7 +132,7 @@ function testAccount(account: string) {
</ElForm> </ElForm>
</template> </template>
<style lang="scss" scoped> <style scoped>
:deep(input[type="password"]::-ms-reveal) { :deep(input[type="password"]::-ms-reveal) {
display: none; display: none;
} }
+1 -1
View File
@@ -113,7 +113,7 @@ function handleRegister() {
</ElForm> </ElForm>
</template> </template>
<style lang="scss" scoped> <style scoped>
:deep(input[type="password"]::-ms-reveal) { :deep(input[type="password"]::-ms-reveal) {
display: none; display: none;
} }
+1 -1
View File
@@ -91,7 +91,7 @@ function handleReset() {
</ElForm> </ElForm>
</template> </template>
<style lang="scss" scoped> <style scoped>
:deep(input[type="password"]::-ms-reveal) { :deep(input[type="password"]::-ms-reveal) {
display: none; display: none;
} }
+22 -22
View File
@@ -360,96 +360,96 @@ function handleCopy() {
</HSlideover> </HSlideover>
</template> </template>
<style lang="scss" scoped> <style scoped>
.divider { .divider {
--at-apply: flex items-center justify-between gap-4 my-4 whitespace-nowrap text-sm font-500; --uno: flex items-center justify-between gap-4 my-4 whitespace-nowrap text-sm font-500;
&::before, &::before,
&::after { &::after {
--at-apply: content-empty w-full h-1px bg-stone-2 dark-bg-stone-6; --uno: content-empty w-full h-1px bg-stone-2 dark-bg-stone-6;
} }
} }
.menu-mode { .menu-mode {
--at-apply: flex items-center justify-center gap-4 pb-4; --uno: flex items-center justify-center gap-4 pb-4;
.mode { .mode {
--at-apply: relative w-16 h-12 rounded-2 ring-1 ring-stone-2 dark-ring-stone-7 cursor-pointer transition; --uno: relative w-16 h-12 rounded-2 ring-1 ring-stone-2 dark-ring-stone-7 cursor-pointer transition;
&.active { &.active {
--at-apply: ring-ui-primary ring-2; --uno: ring-ui-primary ring-2;
} }
&::before, &::before,
&::after, &::after,
.mode-container { .mode-container {
--at-apply: absolute pointer-events-none; --uno: absolute pointer-events-none;
} }
&::before { &::before {
--at-apply: content-empty bg-ui-primary; --uno: content-empty bg-ui-primary;
} }
&::after { &::after {
--at-apply: content-empty bg-ui-primary/60; --uno: content-empty bg-ui-primary/60;
} }
.mode-container { .mode-container {
--at-apply: bg-ui-primary/20 border-width-1.5 border-dashed border-ui-primary; --uno: bg-ui-primary/20 border-width-1.5 border-dashed border-ui-primary;
&::before { &::before {
--at-apply: content-empty absolute w-full h-full; --uno: content-empty absolute w-full h-full;
} }
} }
&-side { &-side {
&::before { &::before {
--at-apply: top-2 bottom-2 left-2 w-2 rounded-tl-1 rounded-bl-1; --uno: top-2 bottom-2 left-2 w-2 rounded-tl-1 rounded-bl-1;
} }
&::after { &::after {
--at-apply: top-2 bottom-2 left-4.5 w-3; --uno: top-2 bottom-2 left-4.5 w-3;
} }
.mode-container { .mode-container {
--at-apply: inset-t-2 inset-r-2 inset-b-2 inset-l-8 rounded-tr-1 rounded-br-1; --uno: inset-t-2 inset-r-2 inset-b-2 inset-l-8 rounded-tr-1 rounded-br-1;
} }
} }
&-head { &-head {
&::before { &::before {
--at-apply: top-2 left-2 right-2 h-2 rounded-tl-1 rounded-tr-1; --uno: top-2 left-2 right-2 h-2 rounded-tl-1 rounded-tr-1;
} }
&::after { &::after {
--at-apply: top-4.5 left-2 bottom-2 w-3 rounded-bl-1; --uno: top-4.5 left-2 bottom-2 w-3 rounded-bl-1;
} }
.mode-container { .mode-container {
--at-apply: inset-t-4.5 inset-r-2 inset-b-2 inset-l-5.5 rounded-br-1; --uno: inset-t-4.5 inset-r-2 inset-b-2 inset-l-5.5 rounded-br-1;
} }
} }
&-single { &-single {
&::after { &::after {
--at-apply: top-2 left-2 bottom-2 w-3 rounded-tl-1 rounded-bl-1; --uno: top-2 left-2 bottom-2 w-3 rounded-tl-1 rounded-bl-1;
} }
.mode-container { .mode-container {
--at-apply: inset-t-2 inset-r-2 inset-b-2 inset-l-5.5 rounded-tr-1 rounded-br-1; --uno: inset-t-2 inset-r-2 inset-b-2 inset-l-5.5 rounded-tr-1 rounded-br-1;
} }
} }
} }
} }
.setting-item { .setting-item {
--at-apply: flex items-center justify-between gap-4 px-4 py-2 rounded-2 transition hover-bg-stone-1 dark-hover-bg-stone-9; --uno: flex items-center justify-between gap-4 px-4 py-2 rounded-2 transition hover-bg-stone-1 dark-hover-bg-stone-9;
.label { .label {
--at-apply: flex items-center flex-shrink-0 gap-2 text-sm; --uno: flex items-center flex-shrink-0 gap-2 text-sm;
i { i {
--at-apply: text-xl text-orange cursor-help; --uno: text-xl text-orange cursor-help;
} }
} }
} }
+1 -1
View File
@@ -4,7 +4,7 @@
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
:deep(.breadcrumb-item) { :deep(.breadcrumb-item) {
&:first-child { &:first-child {
.separator { .separator {
+6 -6
View File
@@ -107,7 +107,7 @@ onUnmounted(() => {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.buy-it { .buy-it {
position: fixed; position: fixed;
top: 50%; top: 50%;
@@ -151,23 +151,23 @@ onUnmounted(() => {
} }
&:nth-child(1) { &:nth-child(1) {
--at-apply: bg-pink; --uno: bg-pink;
} }
&:nth-child(2) { &:nth-child(2) {
--at-apply: bg-orange; --uno: bg-orange;
} }
&:nth-child(3) { &:nth-child(3) {
--at-apply: bg-green; --uno: bg-green;
} }
&:nth-child(4) { &:nth-child(4) {
--at-apply: bg-red; --uno: bg-red;
} }
&:nth-child(5) { &:nth-child(5) {
--at-apply: bg-stone; --uno: bg-stone;
} }
i { i {
+4 -4
View File
@@ -21,17 +21,17 @@ const settingsStore = useSettingsStore()
</footer> </footer>
</template> </template>
<style lang="scss" scoped> <style scoped>
.copyright { .copyright {
--at-apply: flex items-center justify-center flex-wrap my-4 px-4 text-sm text-stone-5; --uno: flex items-center justify-center flex-wrap my-4 px-4 text-sm text-stone-5;
span, span,
a { a {
--at-apply: px-1; --uno: px-1;
} }
a { a {
--at-apply: text-center no-underline text-stone-5 hover-text-dark dark-hover-text-light transition; --uno: text-center no-underline text-stone-5 hover-text-dark dark-hover-text-light transition;
} }
} }
</style> </style>
+4 -4
View File
@@ -61,7 +61,7 @@ function handlerMouserScroll(event: WheelEvent) {
</Transition> </Transition>
</template> </template>
<style lang="scss" scoped> <style scoped>
header { header {
position: fixed; position: fixed;
top: 0; top: 0;
@@ -115,10 +115,10 @@ header {
overflow-x: auto; overflow-x: auto;
mask-image: linear-gradient(to right, transparent, #000 20px, #000 calc(100% - 20px), transparent); mask-image: linear-gradient(to right, transparent, #000 20px, #000 calc(100% - 20px), transparent);
// firefox隐藏滚动条 /* firefox隐藏滚动条 */
scrollbar-width: none; scrollbar-width: none;
// chrome隐藏滚动条 /* chrome隐藏滚动条 */
&::-webkit-scrollbar { &::-webkit-scrollbar {
display: none; display: none;
} }
@@ -151,7 +151,7 @@ header {
} }
} }
// 头部动画 /* 头部动画 */
.header-enter-active, .header-enter-active,
.header-leave-active { .header-leave-active {
transition: transform 0.3s; transition: transform 0.3s;
+4 -4
View File
@@ -46,7 +46,7 @@ const { switchTo } = useMenu()
</Transition> </Transition>
</template> </template>
<style lang="scss" scoped> <style scoped>
.main-sidebar-container { .main-sidebar-container {
position: relative; position: relative;
z-index: 1; z-index: 1;
@@ -69,10 +69,10 @@ const { switchTo } = useMenu()
overflow: hidden auto; overflow: hidden auto;
overscroll-behavior: contain; overscroll-behavior: contain;
// firefox隐藏滚动条 /* firefox隐藏滚动条 */
scrollbar-width: none; scrollbar-width: none;
// chrome隐藏滚动条 /* chrome隐藏滚动条 */
&::-webkit-scrollbar { &::-webkit-scrollbar {
display: none; display: none;
} }
@@ -100,7 +100,7 @@ const { switchTo } = useMenu()
} }
} }
// 主侧边栏动画 /* 主侧边栏动画 */
.main-sidebar-enter-active, .main-sidebar-enter-active,
.main-sidebar-leave-active { .main-sidebar-leave-active {
transition: 0.3s; transition: 0.3s;
+4 -4
View File
@@ -97,7 +97,7 @@ onMounted(() => {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.sub-sidebar-container { .sub-sidebar-container {
position: absolute; position: absolute;
top: 0; top: 0;
@@ -140,10 +140,10 @@ onMounted(() => {
overflow: hidden auto; overflow: hidden auto;
overscroll-behavior: contain; overscroll-behavior: contain;
// firefox隐藏滚动条 /* firefox隐藏滚动条 */
scrollbar-width: none; scrollbar-width: none;
// chrome隐藏滚动条 /* chrome隐藏滚动条 */
&::-webkit-scrollbar { &::-webkit-scrollbar {
display: none; display: none;
} }
@@ -166,7 +166,7 @@ onMounted(() => {
} }
} }
// 次侧边栏动画 /* 次侧边栏动画 */
.sub-sidebar-enter-active { .sub-sidebar-enter-active {
transition: 0.2s; transition: 0.2s;
} }
+31 -35
View File
@@ -198,48 +198,44 @@ onUnmounted(() => {
</div> </div>
</template> </template>
<style lang="scss"> <style>
.tabbar-contextmenu { .tabbar-contextmenu {
z-index: 1000; --uno: fixed ring-1 ring-stone-2 dark-ring-stone-7 shadow-2xl;
.mx-context-menu { background-color: var(--g-container-bg);
--at-apply: fixed ring-1 ring-stone-2 dark-ring-stone-7 shadow-2xl;
background-color: var(--g-container-bg); .mx-context-menu-items .mx-context-menu-item {
--uno: transition-background-color;
.mx-context-menu-items .mx-context-menu-item { &:not(.disabled):hover {
--at-apply: transition-background-color; --uno: cursor-pointer bg-stone-1 dark-bg-stone-9;
&:not(.disabled):hover {
--at-apply: cursor-pointer bg-stone-1 dark-bg-stone-9;
}
span {
color: initial;
}
.icon {
color: initial;
}
&.disabled span,
&.disabled .icon {
opacity: 0.25;
}
} }
.mx-context-menu-item-sperator { span {
background-color: var(--g-container-bg); color: initial;
}
&::after { .icon {
--at-apply: bg-stone-2 dark-bg-stone-7; color: initial;
} }
&.disabled span,
&.disabled .icon {
opacity: 0.25;
}
}
.mx-context-menu-item-sperator {
background-color: var(--g-container-bg);
&::after {
--uno: bg-stone-2 dark-bg-stone-7;
} }
} }
} }
</style> </style>
<style lang="scss" scoped> <style scoped>
.tabbar-container { .tabbar-container {
position: relative; position: relative;
height: var(--g-tabbar-height); height: var(--g-tabbar-height);
@@ -253,10 +249,10 @@ onUnmounted(() => {
overflow-y: hidden; overflow-y: hidden;
white-space: nowrap; white-space: nowrap;
// firefox隐藏滚动条 /* firefox隐藏滚动条 */
scrollbar-width: none; scrollbar-width: none;
// chrome隐藏滚动条 /* chrome隐藏滚动条 */
&::-webkit-scrollbar { &::-webkit-scrollbar {
display: none; display: none;
} }
@@ -410,14 +406,14 @@ onUnmounted(() => {
transform: translateY(-50%); transform: translateY(-50%);
&:hover { &:hover {
--at-apply: ring-1 ring-stone-3 dark-ring-stone-7; --uno: ring-1 ring-stone-3 dark-ring-stone-7;
background-color: var(--g-bg); background-color: var(--g-bg);
} }
} }
.hotkey-number { .hotkey-number {
--at-apply: ring-1 ring-stone-3 dark-ring-stone-7; --uno: ring-1 ring-stone-3 dark-ring-stone-7;
position: absolute; position: absolute;
top: 50%; top: 50%;
@@ -440,7 +436,7 @@ onUnmounted(() => {
} }
} }
// 标签栏动画 /* 标签栏动画 */
.tabs { .tabs {
.tabbar-move, .tabbar-move,
.tabbar-enter-active, .tabbar-enter-active,
@@ -45,8 +45,8 @@ function pathCompile(path: string) {
</Breadcrumb> </Breadcrumb>
</template> </template>
<style lang="scss" scoped> <style scoped>
// 面包屑动画 /* 面包屑动画 */
.breadcrumb-enter-active { .breadcrumb-enter-active {
transition: transform 0.3s, opacity 0.3s; transition: transform 0.3s, opacity 0.3s;
} }
@@ -21,7 +21,7 @@ const settingsStore = useSettingsStore()
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.toolbar-container { .toolbar-container {
height: var(--g-toolbar-height); height: var(--g-toolbar-height);
background-color: var(--g-container-bg); background-color: var(--g-container-bg);
+1 -1
View File
@@ -53,7 +53,7 @@ watch(scrollTop, (val, oldVal) => {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.topbar-container { .topbar-container {
position: absolute; position: absolute;
top: 0; top: 0;
+1 -1
View File
@@ -46,7 +46,7 @@ function open() {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.slide-right-enter-active { .slide-right-enter-active {
transition: 0.2s; transition: 0.2s;
} }
+3 -3
View File
@@ -111,7 +111,7 @@ const enableAppSetting = import.meta.env.VITE_APP_SETTING === 'true'
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
[data-mode="mobile"] { [data-mode="mobile"] {
.sidebar-container { .sidebar-container {
transform: translateX(calc((var(--g-main-sidebar-width) + var(--g-sub-sidebar-width)) * -1)); transform: translateX(calc((var(--g-main-sidebar-width) + var(--g-sub-sidebar-width)) * -1));
@@ -242,7 +242,7 @@ header:not(.header-leave-active) + .wrapper {
} }
.app-setting { .app-setting {
--at-apply: text-white dark-text-dark bg-ui-primary; --uno: text-white dark-text-dark bg-ui-primary;
position: fixed; position: fixed;
top: calc(50% + 250px); top: calc(50% + 250px);
@@ -273,7 +273,7 @@ header:not(.header-leave-active) + .wrapper {
} }
} }
// 主内容区动画 /* 主内容区动画 */
.slide-right-enter-active { .slide-right-enter-active {
transition: 0.2s; transition: 0.2s;
} }
+1 -1
View File
@@ -33,7 +33,7 @@ import icons from '@/iconify/index.json'
import 'virtual:uno.css' import 'virtual:uno.css'
// 全局样式 // 全局样式
import '@/assets/styles/globals.scss' import '@/assets/styles/globals.css'
const app = createApp(App) const app = createApp(App)
app.use(FloatingVue, { app.use(FloatingVue, {
+1 -1
View File
@@ -1,7 +1,7 @@
import { createRouter, createWebHashHistory } from 'vue-router' import { createRouter, createWebHashHistory } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router' import type { RouteRecordRaw } from 'vue-router'
import { useNProgress } from '@vueuse/integrations/useNProgress' import { useNProgress } from '@vueuse/integrations/useNProgress'
import '@/assets/styles/nprogress.scss' import '@/assets/styles/nprogress.css'
// 路由相关数据 // 路由相关数据
import { asyncRoutes, asyncRoutesByFilesystem, constantRoutes, constantRoutesByFilesystem } from './routes' import { asyncRoutes, asyncRoutesByFilesystem, constantRoutes, constantRoutesByFilesystem } from './routes'
@@ -249,7 +249,7 @@
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.el-row { .el-row {
margin-bottom: 20px; margin-bottom: 20px;
} }
@@ -28,7 +28,7 @@ const icon = icons.filter(item => item.prefix === 'ep')[0]
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.demo { .demo {
> i { > i {
margin: 0 20px; margin: 0 20px;
@@ -63,7 +63,7 @@
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.el-link { .el-link {
margin: 0 5px; margin: 0 5px;
} }
@@ -122,12 +122,12 @@ const toggle = ref(false)
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.page-main { .page-main {
--at-apply: flex-grow-1 flex-shrink-1 flex-basis-400px m-0 min-h-50; --uno: flex-grow-1 flex-shrink-1 flex-basis-400px m-0 min-h-50;
:deep(.main-container) { :deep(.main-container) {
--at-apply: flex items-center justify-center flex-1 gap-4; --uno: flex items-center justify-center flex-1 gap-4;
} }
} }
</style> </style>
@@ -420,7 +420,7 @@ function onToggle(fold: boolean) {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.search-form { .search-form {
display: grid; display: grid;
grid-template-columns: repeat(auto-fit, minmax(330px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(330px, 1fr));
+1 -1
View File
@@ -526,7 +526,7 @@ function open(url: string) {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.rule { .rule {
margin-bottom: 20px; margin-bottom: 20px;
} }
@@ -126,7 +126,7 @@ const dataList = ref([
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.absolute-container { .absolute-container {
position: absolute; position: absolute;
display: flex; display: flex;
@@ -138,7 +138,7 @@ const dataList = ref([
margin-bottom: 0; margin-bottom: 0;
} }
// 让 page-main 的高度自适应 /* 让 page-main 的高度自适应 */
.page-main { .page-main {
flex: 1; flex: 1;
overflow: auto; overflow: auto;
+1 -1
View File
@@ -82,7 +82,7 @@ function showInfo(iconName: string) {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.el-card { .el-card {
margin-bottom: 15px; margin-bottom: 15px;
+10 -10
View File
@@ -201,30 +201,30 @@ function open(url: string) {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.text-emphasis { .text-emphasis {
text-emphasis-style: "❤"; text-emphasis-style: "❤";
} }
.ecology { .ecology {
--at-apply: flex-1 m-0; --uno: flex-1 m-0;
:deep(.title-container) { :deep(.title-container) {
--at-apply: flex items-center justify-between flex-wrap gap-4; --uno: flex items-center justify-between flex-wrap gap-4;
.title-info { .title-info {
--at-apply: flex items-center gap-4; --uno: flex items-center gap-4;
img { img {
--at-apply: block w-12 h-12; --uno: block w-12 h-12;
} }
h1 { h1 {
--at-apply: m-0 text-2xl; --uno: m-0 text-2xl;
} }
h2 { h2 {
--at-apply: m-0 text-base text-stone-5 font-normal; --uno: m-0 text-base text-stone-5 font-normal;
} }
} }
} }
@@ -232,14 +232,14 @@ function open(url: string) {
.question { .question {
.answer { .answer {
--at-apply: m-0 pl-6 text-stone-5; --uno: m-0 pl-6 text-stone-5;
li { li {
--at-apply: mb-2 lh-6 last:mb-0; --uno: mb-2 lh-6 last:mb-0;
} }
span { span {
--at-apply: text-stone-7 dark-text-stone-3 font-bold; --uno: text-stone-7 dark-text-stone-3 font-bold;
} }
} }
} }
@@ -13,7 +13,7 @@ export default defineComponent({
}) })
</script> </script>
<style lang="scss" scoped> <style scoped>
.test { .test {
font-size: 24px; font-size: 24px;
+1 -1
View File
@@ -75,7 +75,7 @@ onBeforeRouteLeave((to, from) => {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.block { .block {
margin-bottom: 10px; margin-bottom: 10px;
} }
+4 -3
View File
@@ -61,7 +61,7 @@ const formRef = ref()
<Copyright /> <Copyright />
</template> </template>
<style lang="scss" scoped> <style scoped>
.bg-banner { .bg-banner {
position: fixed; position: fixed;
z-index: 0; z-index: 0;
@@ -124,9 +124,10 @@ const formRef = ref()
background-color: var(--g-bg); background-color: var(--g-bg);
.banner { .banner {
position: absolute;
top: 50%;
width: 100%; width: 100%;
transform: translateY(-50%);
@include position-center(y);
} }
} }
+1 -1
View File
@@ -125,7 +125,7 @@ function editPassword() {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
:deep(.el-tabs) { :deep(.el-tabs) {
.el-tabs__header .el-tabs__nav { .el-tabs__header .el-tabs__nav {
.el-tabs__active-bar { .el-tabs__active-bar {
+1 -1
View File
@@ -242,7 +242,7 @@ function open(url: string) {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.box { .box {
width: 100px; width: 100px;
height: 100px; height: 100px;
@@ -4,7 +4,7 @@
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.alert { .alert {
padding: 20px 20px 0; padding: 20px 20px 0;
background-color: var(--g-container-bg); background-color: var(--g-container-bg);
+1 -1
View File
@@ -83,7 +83,7 @@ function open(url: string) {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.count-to { .count-to {
display: inline-block; display: inline-block;
margin-bottom: 20px; margin-bottom: 20px;
+1 -1
View File
@@ -51,7 +51,7 @@ function open(url: string) {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
:deep(.bytemd-fullscreen) { :deep(.bytemd-fullscreen) {
z-index: 2000; z-index: 2000;
} }
+1 -1
View File
@@ -97,7 +97,7 @@ function open(url: string) {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.page-main { .page-main {
text-align: center; text-align: center;
} }
+1 -1
View File
@@ -49,7 +49,7 @@ function open(url: string) {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.splitpanes__pane { .splitpanes__pane {
display: flex; display: flex;
align-items: center; align-items: center;
+2 -2
View File
@@ -144,7 +144,7 @@ function open(url: string) {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.swiper { .swiper {
width: 100%; width: 100%;
height: 300px; height: 300px;
@@ -153,7 +153,7 @@ function open(url: string) {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
font-size: 36.4px; font-size: 36px;
font-weight: 700; font-weight: 700;
text-align: center; text-align: center;
background-color: #fff; background-color: #fff;
+1 -1
View File
@@ -94,7 +94,7 @@ function open(url: string) {
</div> </div>
</template> </template>
<style lang="scss" scoped> <style scoped>
.preview { .preview {
margin-top: 10px; margin-top: 10px;