refactor: настроил линтер против сиротского css
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 31s
🚀 Create and publish a Docker image / Build & publish backend image (push) Has been skipped
🚀 Create and publish a Docker image / Build & publish frontend image (push) Has been skipped
🚀 Create and publish a Docker image / Update stack on Portainer (push) Has been skipped
Frontend CI / build-and-check (push) Failing after 6m21s

This commit is contained in:
2026-05-25 02:15:34 +03:00
parent 34c2547de5
commit 509740e2a0
11 changed files with 46 additions and 155 deletions
+2
View File
@@ -3,6 +3,7 @@ import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescri
import pluginVue from 'eslint-plugin-vue' import pluginVue from 'eslint-plugin-vue'
import pluginOxlint from 'eslint-plugin-oxlint' import pluginOxlint from 'eslint-plugin-oxlint'
import skipFormatting from 'eslint-config-prettier/flat' import skipFormatting from 'eslint-config-prettier/flat'
import vueScopedCss from 'eslint-plugin-vue-scoped-css'
// To allow more languages other than `ts` in `.vue` files, uncomment the following lines: // To allow more languages other than `ts` in `.vue` files, uncomment the following lines:
// import { configureVueProject } from '@vue/eslint-config-typescript' // import { configureVueProject } from '@vue/eslint-config-typescript'
@@ -19,6 +20,7 @@ export default defineConfigWithVueTs(
...pluginVue.configs['flat/essential'], ...pluginVue.configs['flat/essential'],
vueTsConfigs.recommended, vueTsConfigs.recommended,
...vueScopedCss.configs.recommended,
...pluginOxlint.buildFromOxlintConfigFile('.oxlintrc.json'), ...pluginOxlint.buildFromOxlintConfigFile('.oxlintrc.json'),
+1
View File
@@ -30,6 +30,7 @@
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-oxlint": "~1.60.0", "eslint-plugin-oxlint": "~1.60.0",
"eslint-plugin-vue": "~10.8.0", "eslint-plugin-vue": "~10.8.0",
"eslint-plugin-vue-scoped-css": "^3.1.0",
"jiti": "^2.6.1", "jiti": "^2.6.1",
"npm-run-all2": "^8.0.4", "npm-run-all2": "^8.0.4",
"oxlint": "~1.60.0", "oxlint": "~1.60.0",
+42
View File
@@ -45,6 +45,9 @@ importers:
eslint-plugin-vue: eslint-plugin-vue:
specifier: ~10.8.0 specifier: ~10.8.0
version: 10.8.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0))(vue-eslint-parser@10.4.0(eslint@10.3.0(jiti@2.7.0))) version: 10.8.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0))(vue-eslint-parser@10.4.0(eslint@10.3.0(jiti@2.7.0)))
eslint-plugin-vue-scoped-css:
specifier: ^3.1.0
version: 3.1.0(eslint@10.3.0(jiti@2.7.0))(vue-eslint-parser@10.4.0(eslint@10.3.0(jiti@2.7.0)))
jiti: jiti:
specifier: ^2.6.1 specifier: ^2.6.1
version: 2.7.0 version: 2.7.0
@@ -863,6 +866,9 @@ packages:
error-stack-parser-es@1.0.5: error-stack-parser-es@1.0.5:
resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==}
es-toolkit@1.46.1:
resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==}
escalade@3.2.0: escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'} engines: {node: '>=6'}
@@ -882,6 +888,20 @@ packages:
peerDependencies: peerDependencies:
oxlint: ~1.60.0 oxlint: ~1.60.0
eslint-plugin-vue-scoped-css@3.1.0:
resolution: {integrity: sha512-R9XLrIZaP6QGz9b4kO2K4+lP4NcO2TKcw71zBtIYCoqqTk5ja1ySruYAllBT2LPIJVQ4NZaB2IFSvLjLEpYqQA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
peerDependencies:
eslint: '>=9.38.0'
postcss-scss: ^4.0.3
postcss-styl: ^0.12.0
vue-eslint-parser: '>=7.1.0'
peerDependenciesMeta:
postcss-scss:
optional: true
postcss-styl:
optional: true
eslint-plugin-vue@10.8.0: eslint-plugin-vue@10.8.0:
resolution: {integrity: sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==} resolution: {integrity: sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1327,6 +1347,12 @@ packages:
pkg-types@2.3.1: pkg-types@2.3.1:
resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==}
postcss-safe-parser@7.0.1:
resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==}
engines: {node: '>=18.0'}
peerDependencies:
postcss: ^8.4.31
postcss-selector-parser@7.1.1: postcss-selector-parser@7.1.1:
resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==}
engines: {node: '>=4'} engines: {node: '>=4'}
@@ -2430,6 +2456,8 @@ snapshots:
error-stack-parser-es@1.0.5: {} error-stack-parser-es@1.0.5: {}
es-toolkit@1.46.1: {}
escalade@3.2.0: {} escalade@3.2.0: {}
escape-string-regexp@4.0.0: {} escape-string-regexp@4.0.0: {}
@@ -2443,6 +2471,16 @@ snapshots:
jsonc-parser: 3.3.1 jsonc-parser: 3.3.1
oxlint: 1.60.0 oxlint: 1.60.0
eslint-plugin-vue-scoped-css@3.1.0(eslint@10.3.0(jiti@2.7.0))(vue-eslint-parser@10.4.0(eslint@10.3.0(jiti@2.7.0))):
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0))
es-toolkit: 1.46.1
eslint: 10.3.0(jiti@2.7.0)
postcss: 8.5.14
postcss-safe-parser: 7.0.1(postcss@8.5.14)
postcss-selector-parser: 7.1.1
vue-eslint-parser: 10.4.0(eslint@10.3.0(jiti@2.7.0))
eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0))(vue-eslint-parser@10.4.0(eslint@10.3.0(jiti@2.7.0))): eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0))(vue-eslint-parser@10.4.0(eslint@10.3.0(jiti@2.7.0))):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0))
@@ -2851,6 +2889,10 @@ snapshots:
exsolve: 1.0.8 exsolve: 1.0.8
pathe: 2.0.3 pathe: 2.0.3
postcss-safe-parser@7.0.1(postcss@8.5.14):
dependencies:
postcss: 8.5.14
postcss-selector-parser@7.1.1: postcss-selector-parser@7.1.1:
dependencies: dependencies:
cssesc: 3.0.0 cssesc: 3.0.0
@@ -297,9 +297,6 @@ onBeforeUnmount(() => {
flex-shrink: 0; flex-shrink: 0;
cursor: pointer; cursor: pointer;
} }
.brand-icon {
color: var(--color-text);
}
.brand-name { .brand-name {
font-size: 20px; font-size: 20px;
font-weight: 800; font-weight: 800;
-4
View File
@@ -46,8 +46,4 @@ defineEmits<{ click: [] }>()
font-size: 14px; font-size: 14px;
color: var(--color-coin-chip-text); color: var(--color-coin-chip-text);
} }
.coin-label {
font-size: 12px;
color: var(--color-coin-chip-label);
}
</style> </style>
+1 -1
View File
@@ -4,7 +4,7 @@
</div> </div>
</template> </template>
<style> <style scoped>
@media (min-width: 1024px) { @media (min-width: 1024px) {
.about { .about {
min-height: 100vh; min-height: 100vh;
@@ -80,56 +80,6 @@ onMounted(async () => {
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 16px; gap: 16px;
} }
.bars {
display: flex;
flex-direction: column;
gap: 10px;
margin-top: 10px;
}
.bar-row {
display: grid;
grid-template-columns: 1fr 2fr auto;
align-items: center;
gap: 8px;
font-size: 13px;
}
.bar {
background: var(--color-black-a08);
border-radius: 6px;
height: 8px;
overflow: hidden;
}
.bar-fill {
background: var(--gradient-progress-success);
height: 100%;
}
.percent {
color: var(--color-text-secondary);
font-size: 12px;
}
.metric {
margin-bottom: 10px;
color: var(--color-text-secondary);
}
.activity {
display: flex;
gap: 10px;
margin-top: 12px;
align-items: flex-end;
}
.day {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
font-size: 11px;
color: var(--color-text-secondary);
}
.day-bar {
width: 16px;
background: var(--gradient-bar-neutral-vertical);
border-radius: 6px 6px 0 0;
}
.sync-meta { .sync-meta {
font-size: 12px; font-size: 12px;
color: var(--color-text-secondary); color: var(--color-text-secondary);
-74
View File
@@ -199,20 +199,6 @@ async function loginViaYufu() {
gap: 16px; gap: 16px;
} }
.brand-logo {
width: 56px;
height: 56px;
border-radius: var(--radius-md);
background: var(--color-white);
box-shadow: var(--shadow-card);
border: 1px solid var(--color-border-glass);
display: inline-flex;
align-items: center;
justify-content: center;
color: var(--color-primary-dark);
flex-shrink: 0;
}
.brand-eyebrow { .brand-eyebrow {
margin: 0 0 6px; margin: 0 0 6px;
font-size: 11px; font-size: 11px;
@@ -342,48 +328,6 @@ async function loginViaYufu() {
overflow: hidden; overflow: hidden;
} }
.login-card-accent {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: var(--gradient-brand);
}
.login-card-header {
text-align: center;
}
.login-badge {
width: 52px;
height: 52px;
margin: 0 auto 16px;
border-radius: 16px;
background: var(--gradient-nav-active);
border: 1px solid var(--color-primary-a25);
display: inline-flex;
align-items: center;
justify-content: center;
color: var(--color-primary-border);
box-shadow: 0 8px 20px var(--color-primary-a12);
}
.login-title {
margin: 0 0 8px;
font-size: 28px;
font-weight: 800;
color: var(--color-text);
letter-spacing: -0.02em;
}
.login-subtitle {
margin: 0;
font-size: 14px;
line-height: 1.55;
color: var(--login-text-muted);
}
.login-actions { .login-actions {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -483,24 +427,6 @@ async function loginViaYufu() {
justify-content: flex-start; justify-content: flex-start;
} }
.footer-uni {
width: 28px;
height: 28px;
border-radius: 50%;
background: var(--gradient-brand);
color: var(--color-white);
display: inline-flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px var(--color-primary-a25);
}
.footer-uni-label {
font-weight: 700;
color: var(--color-text);
letter-spacing: 0.04em;
}
.footer-center { .footer-center {
justify-content: center; justify-content: center;
gap: 20px; gap: 20px;
@@ -262,11 +262,6 @@ async function registerLecture(id: string) {
gap: 10px; gap: 10px;
align-items: flex-start; align-items: flex-start;
} }
.stats-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 16px;
}
.xp-section { .xp-section {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -294,10 +289,6 @@ async function registerLecture(id: string) {
.title-icon { .title-icon {
color: var(--color-text); color: var(--color-text);
} }
.inline-icon {
color: var(--color-text);
vertical-align: middle;
}
.cards-grid { .cards-grid {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
@@ -177,9 +177,4 @@ watch(() => auth.user?.id, fetchTeacherAnalytics)
border-radius: var(--radius-sm); border-radius: var(--radius-sm);
font-size: 13px; font-size: 13px;
} }
.top-list {
padding-left: 18px;
color: var(--color-text-secondary);
font-size: 13px;
}
</style> </style>
@@ -104,15 +104,6 @@ watch(() => auth.user?.id, fetchTeacherLectures)
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 16px; gap: 16px;
} }
.visibility {
display: flex;
flex-direction: column;
gap: 8px;
}
.visibility-meta {
font-size: 13px;
color: var(--color-text-secondary);
}
.upcoming { .upcoming {
display: flex; display: flex;
flex-direction: column; flex-direction: column;