diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 70dad9243..14e209a51 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -95,7 +95,7 @@ review_front: - if: $CI_PIPELINE_SOURCE == "merge_request_event" when: manual - image: $CI_REGISTRY/funkwhale/ci/node-python:18 + image: $CI_REGISTRY/funkwhale/ci/node-python:22 variables: BASE_URL: /-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/front-review/ VUE_APP_ROUTER_BASE_URL: /-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/front-review/ @@ -202,7 +202,7 @@ lint_front: - if: $CI_COMMIT_BRANCH =~ /(stable|develop)/ - changes: [front/**/*] - image: $CI_REGISTRY/funkwhale/ci/node-python:18 + image: $CI_REGISTRY/funkwhale/ci/node-python:22 cache: - *yarn_cache - *node_cache @@ -290,7 +290,7 @@ test_front: - if: $CI_COMMIT_BRANCH =~ /(stable|develop)/ - changes: [front/**/*] - image: $CI_REGISTRY/funkwhale/ci/node-python:18 + image: $CI_REGISTRY/funkwhale/ci/node-python:22 cache: - *yarn_cache - *node_cache @@ -417,7 +417,7 @@ build_front: - if: $CI_COMMIT_BRANCH =~ /(stable|develop)/ - changes: [front/**/*] - image: $CI_REGISTRY/funkwhale/ci/node-python:18 + image: $CI_REGISTRY/funkwhale/ci/node-python:22 variables: <<: *keep_git_files_permissions NODE_OPTIONS: --max-old-space-size=4096 diff --git a/front/Dockerfile b/front/Dockerfile index 659c25cf7..df4f722fe 100644 --- a/front/Dockerfile +++ b/front/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM node:18-alpine AS builder +FROM --platform=$BUILDPLATFORM node:22-alpine AS builder RUN apk add --no-cache jq bash coreutils python3 build-base @@ -13,7 +13,7 @@ COPY src /app/src COPY index.html pwa-manifest.json tsconfig.json vite.config.ts /app/ RUN yarn build:deployment -FROM nginx:1.23.4-alpine AS production +FROM nginx:1.28.0-alpine AS production COPY --from=builder /app/dist /usr/share/nginx/html COPY docker/funkwhale.conf.template /etc/nginx/templates/default.conf.template diff --git a/front/package.json b/front/package.json index 4b5ce2a36..e30dab2fc 100644 --- a/front/package.json +++ b/front/package.json @@ -29,45 +29,45 @@ "@sentry/vue": "7.47.0", "@tauri-apps/api": "2.0.0-beta.1", "@types/jsmediatags": "3.9.6", - "@vue/runtime-core": "3.3.11", - "@vueuse/components": "10.6.1", - "@vueuse/core": "10.6.1", - "@vueuse/integrations": "10.6.1", - "@vueuse/math": "10.6.1", - "@vueuse/router": "10.6.1", - "axios": "1.7.2", + "@vue/runtime-core": "3.5.14", + "@vueuse/components": "10.11.1", + "@vueuse/core": "10.11.1", + "@vueuse/integrations": "10.11.1", + "@vueuse/math": "10.11.1", + "@vueuse/router": "10.11.1", + "axios": "1.9.0", "axios-auth-refresh": "3.3.6", "butterchurn": "3.0.0-beta.4", "butterchurn-presets": "3.0.0-beta.4", - "diff": "5.1.0", - "dompurify": "3.2.4", - "focus-trap": "7.2.0", - "idb-keyval": "6.2.1", + "diff": "5.2.0", + "dompurify": "3.2.5", + "focus-trap": "7.6.4", + "idb-keyval": "6.2.2", "jquery": "3.7.1", "jsmediatags": "3.9.7", "lodash-es": "4.17.21", - "lru-cache": "10.2.0", - "magic-regexp": "0.8.0", - "moment": "2.29.4", - "music-metadata-browser": "2.5.10", - "nanoid": "5.0.4", - "pinia": "2.1.7", + "lru-cache": "10.4.3", + "magic-regexp": "0.10.0", + "moment": "2.30.1", + "music-metadata-browser": "2.5.11", + "nanoid": "5.1.5", + "pinia": "2.3.1", "showdown": "2.1.0", "stacktrace-js": "2.0.2", - "standardized-audio-context": "25.3.60", + "standardized-audio-context": "25.3.77", "text-clipper": "2.2.0", "transliteration": "2.3.5", - "type-fest": "4.30.1", + "type-fest": "4.41.0", "universal-cookie": "4.0.4", - "vite-plugin-pwa": "0.14.4", - "vue": "3.5.13", - "vue-dompurify-html": "5.2.0", + "vite-plugin-pwa": "0.21.2", + "vue": "3.5.14", + "vue-dompurify-html": "5.3.0", "vue-gettext": "2.1.12", - "vue-i18n": "9.9.1", - "vue-router": "4.2.5", - "vue-upload-component": "3.1.8", + "vue-i18n": "9.14.4", + "vue-router": "4.5.1", + "vue-upload-component": "3.1.17", "vue-virtual-scroller": "2.0.0-beta.8", - "vue3-gettext": "2.3.4", + "vue3-gettext": "2.4.0", "vue3-lazyload": "0.3.8", "vuedraggable": "4.1.0", "vuex": "4.1.0", @@ -76,59 +76,59 @@ }, "devDependencies": { "@faker-js/faker": "8.4.1", - "@iconify/vue": "4.1.1", + "@iconify/vue": "4.3.0", "@intlify/eslint-plugin-vue-i18n": "2.0.0", "@intlify/unplugin-vue-i18n": "2.0.0", "@tauri-apps/cli": "^2.0.2", - "@types/diff": "5.0.9", - "@types/dompurify": "3.0.5", - "@types/jquery": "3.5.29", + "@types/diff": "5.2.3", + "@types/dompurify": "3.2.0", + "@types/jquery": "3.5.32", "@types/lodash-es": "4.17.12", "@types/moxios": "0.4.17", - "@types/qs": "6.9.10", + "@types/qs": "6.9.18", "@types/semantic-ui": "2.2.9", "@types/showdown": "2.0.6", "@types/vue-virtual-scroller": "npm:@earltp/vue-virtual-scroller", "@typescript-eslint/eslint-plugin": "7.1.0", - "@vitejs/plugin-vue": "5.1.4", + "@vitejs/plugin-vue": "5.2.4", "@vitest/coverage-v8": "1.3.1", - "@vue-macros/common": "1.15.1", - "@vue-macros/volar": "0.17.2", - "@vue/compiler-sfc": "3.3.11", + "@vue-macros/common": "1.16.1", + "@vue-macros/volar": "0.30.15", + "@vue/compiler-sfc": "3.5.14", "@vue/eslint-config-standard": "8.0.1", "@vue/eslint-config-typescript": "12.0.0", - "@vue/test-utils": "2.4.1", - "@vue/tsconfig": "0.6.0", - "cypress": "13.6.4", + "@vue/test-utils": "2.4.6", + "@vue/tsconfig": "0.7.0", + "cypress": "13.17.0", "eslint": "8.57.0", "eslint-config-standard": "17.1.0", "eslint-plugin-html": "8.1.2", - "eslint-plugin-import": "2.29.1", + "eslint-plugin-import": "2.31.0", "eslint-plugin-n": "16.6.2", "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "6.1.1", - "eslint-plugin-vue": "9.22.0", - "jsdom": "24.0.0", + "eslint-plugin-promise": "6.6.0", + "eslint-plugin-vue": "9.33.0", + "jsdom": "24.1.3", "jsonc-eslint-parser": "2.4.0", - "msw": "2.2.1", - "msw-auto-mock": "0.18.0", - "openapi-typescript": "7.6.0", + "msw": "2.8.2", + "msw-auto-mock": "0.31.0", + "openapi-typescript": "7.8.0", "patch-package": "8.0.0", - "rollup-plugin-visualizer": "5.9.0", - "sass": "1.68.0", - "sinon": "15.0.2", - "standardized-audio-context-mock": "9.6.32", - "typescript": "5.3.3", + "rollup-plugin-visualizer": "5.14.0", + "sass": "1.88.0", + "sinon": "15.2.0", + "standardized-audio-context-mock": "9.7.21", + "typescript": "5.2.2", "unocss": "0.58.0", - "unplugin-vue-macros": "2.6.2", - "utility-types": "3.10.0", - "vite": "5.2.12", - "vite-plugin-node-polyfills": "0.17.0", - "vite-plugin-pwa": "0.14.4", + "unplugin-vue-macros": "2.14.5", + "utility-types": "3.11.0", + "vite": "5.4.19", + "vite-plugin-node-polyfills": "0.23.0", + "vite-plugin-pwa": "0.21.2", "vite-plugin-vue-devtools": "^7.5.2", - "vitepress": "1.5.0", + "vitepress": "1.6.3", "vitest": "1.3.1", - "vue-tsc": "1.8.27", + "vue-tsc": "2.2.10", "workbox-core": "6.5.4", "workbox-precaching": "6.5.4", "workbox-routing": "6.5.4", diff --git a/front/src/api/player.ts b/front/src/api/player.ts index 97b91a851..530526427 100644 --- a/front/src/api/player.ts +++ b/front/src/api/player.ts @@ -38,9 +38,9 @@ export interface Sound { onSoundEnd: EventHookOn } -export const soundImplementations = reactive(new Set>()) +export const soundImplementations: Set> = reactive(new Set>()) -export const registerSoundImplementation = >(implementation: T) => { +export const registerSoundImplementation = (implementation: Constructor): Constructor => { soundImplementations.add(implementation) return implementation } @@ -49,8 +49,8 @@ export const registerSoundImplementation = >(implem @registerSoundImplementation export class HTMLSound implements Sound { #audio = new Audio() - #soundLoopEventHook = createEventHook() - #soundEndEventHook = createEventHook() + #soundLoopEventHook = createEventHook() + #soundEndEventHook = createEventHook() #ignoreError = false #scope = effectScope() @@ -59,8 +59,8 @@ export class HTMLSound implements Sound { readonly isDisposed = ref(false) audioNode = createAudioSource(this.#audio) - onSoundLoop: EventHookOn - onSoundEnd: EventHookOn + onSoundLoop: EventHookOn + onSoundEnd: EventHookOn constructor (sources: SoundSource[]) { this.onSoundLoop = this.#soundLoopEventHook.on diff --git a/front/src/components/Queue.vue b/front/src/components/Queue.vue index 102189287..4f8016e69 100644 --- a/front/src/components/Queue.vue +++ b/front/src/components/Queue.vue @@ -90,6 +90,7 @@ watchEffect(async () => { const list = ref() const el = useCurrentElement() const scrollToCurrent = (behavior: ScrollBehavior = 'smooth') => { + if (!(el.value instanceof HTMLElement)) return const item = el.value?.querySelector('.queue-item.active') item?.scrollIntoView({ behavior, diff --git a/front/src/components/common/UserLink.vue b/front/src/components/common/UserLink.vue index 5a53d511a..32ad8d7f8 100644 --- a/front/src/components/common/UserLink.vue +++ b/front/src/components/common/UserLink.vue @@ -28,7 +28,7 @@ const defaultAvatarStyle = computed(() => ({ backgroundColor: `#${userColor.valu diff --git a/front/src/components/radio/Card.vue b/front/src/components/radio/Card.vue index f16f2957f..89930095d 100644 --- a/front/src/components/radio/Card.vue +++ b/front/src/components/radio/Card.vue @@ -41,5 +41,5 @@ const { radio, small, ...cardProps } = defineProps<{ diff --git a/front/src/components/ui/Activity.vue b/front/src/components/ui/Activity.vue index 3904f7a2b..ec6556294 100644 --- a/front/src/components/ui/Activity.vue +++ b/front/src/components/ui/Activity.vue @@ -69,5 +69,5 @@ const profileParams = computed(() => { diff --git a/front/src/components/ui/Alert.vue b/front/src/components/ui/Alert.vue index d17fc083a..997cba49e 100644 --- a/front/src/components/ui/Alert.vue +++ b/front/src/components/ui/Alert.vue @@ -32,5 +32,5 @@ const props = defineProps() diff --git a/front/src/components/ui/Header.vue b/front/src/components/ui/Header.vue index 34ca1e49b..9c0b3e499 100644 --- a/front/src/components/ui/Header.vue +++ b/front/src/components/ui/Header.vue @@ -1,5 +1,6 @@ diff --git a/front/src/components/ui/Modal.vue b/front/src/components/ui/Modal.vue index ff8a7b601..d54f427ad 100644 --- a/front/src/components/ui/Modal.vue +++ b/front/src/components/ui/Modal.vue @@ -148,5 +148,5 @@ onKeyboardShortcut('escape', () => { isOpen.value = false }) diff --git a/front/src/components/ui/Pagination.vue b/front/src/components/ui/Pagination.vue index a65f485f7..5b22305ab 100644 --- a/front/src/components/ui/Pagination.vue +++ b/front/src/components/ui/Pagination.vue @@ -179,5 +179,5 @@ watch(page, (_) => { diff --git a/front/src/components/ui/Popover.vue b/front/src/components/ui/Popover.vue index f345f6042..7834e601a 100644 --- a/front/src/components/ui/Popover.vue +++ b/front/src/components/ui/Popover.vue @@ -159,5 +159,5 @@ watch(isOpen, (isOpen) => { diff --git a/front/src/components/ui/Tabs.vue b/front/src/components/ui/Tabs.vue index 266a4a62a..0fc3236bd 100644 --- a/front/src/components/ui/Tabs.vue +++ b/front/src/components/ui/Tabs.vue @@ -63,5 +63,5 @@ watch(tabs, () => { diff --git a/front/src/components/ui/Textarea.vue b/front/src/components/ui/Textarea.vue index 2eade843c..c99ca4d59 100644 --- a/front/src/components/ui/Textarea.vue +++ b/front/src/components/ui/Textarea.vue @@ -362,5 +362,5 @@ onMounted(() => { diff --git a/front/src/components/ui/Toc.vue b/front/src/components/ui/Toc.vue index d86d06447..7d0e12127 100644 --- a/front/src/components/ui/Toc.vue +++ b/front/src/components/ui/Toc.vue @@ -55,5 +55,5 @@ watchEffect(() => { diff --git a/front/src/components/ui/button/Options.vue b/front/src/components/ui/button/Options.vue index afd967473..25bd05864 100644 --- a/front/src/components/ui/button/Options.vue +++ b/front/src/components/ui/button/Options.vue @@ -21,5 +21,5 @@ defineProps<{ diff --git a/front/src/components/ui/button/Play.vue b/front/src/components/ui/button/Play.vue index eb93bab93..09d4890ed 100644 --- a/front/src/components/ui/button/Play.vue +++ b/front/src/components/ui/button/Play.vue @@ -15,5 +15,5 @@ const play = defineEmits(['play']) diff --git a/front/src/components/vui/list/VirtualList.vue b/front/src/components/vui/list/VirtualList.vue index 5a3d20b3c..a459e6416 100644 --- a/front/src/components/vui/list/VirtualList.vue +++ b/front/src/components/vui/list/VirtualList.vue @@ -61,11 +61,11 @@ const onTouchmove = (event: TouchEvent) => { } } -document.addEventListener('touchcancel', (event: TouchEvent) => { +document.addEventListener('touchcancel', (_event: TouchEvent) => { cleanup() }) -const reorder = (event: MouseEvent | TouchEvent) => { +const reorder = (_event: MouseEvent | TouchEvent) => { if (draggedItem.value) { const from = draggedItem.value.index let to = hoveredIndex.value @@ -155,6 +155,7 @@ const { resume, pause } = useRafFn(() => { const now = +new Date() const direction = scrollDirection.value + if (!(el.value instanceof HTMLElement)) return if (direction && el.value?.children[0] && !isTouch.value) { el.value.children[0].scrollTop += 200 / (now - lastDate) * (direction === 'up' ? -1 : 1) } diff --git a/front/src/style/_main.scss b/front/src/style/_main.scss index 556adadc4..624a5af10 100644 --- a/front/src/style/_main.scss +++ b/front/src/style/_main.scss @@ -3,60 +3,60 @@ $desktop-sidebar-width: 275px; $widedesktop-sidebar-width: 275px; $bottom-player-height: 4rem; -@import "./vendor/_media.scss"; +@use "./vendor/_media.scss"; -@import "./globals/_app.scss"; -@import "./globals/_channels.scss"; -@import "./globals/_layout.scss"; -@import "./globals/_utils.scss"; +@use "./globals/_app.scss"; +@use "./globals/_channels.scss"; +@use "./globals/_layout.scss"; +@use "./globals/_utils.scss"; -@import "./components/_action_table.scss"; -@import "./components/_album_card.scss"; -@import "./components/_attachment_input.scss"; -@import "./components/_avatar.scss"; -@import "./components/_builder.scss"; -@import "./components/_button.scss"; -@import "./components/_card.scss"; -@import "./components/_content_form.scss"; -@import "./components/_copy_input.scss"; -@import "./components/_empty_state.scss"; -@import "./components/_favorite.scss"; -@import "./components/_form.scss"; -@import "./components/_file_upload.scss"; -@import "./components/_fs_browser.scss"; -@import "./components/_fs_logs.scss"; -@import "./components/_header.scss"; -@import "./components/_label.scss"; -@import "./components/_modal.scss"; -@import "./components/_pagination.scss"; -@import "./components/_placeholder.scss"; -@import "./components/_play_button.scss"; -@import "./components/_play_indicator.scss"; -@import "./components/_player.scss"; -@import "./components/_playlist_editor.scss"; -@import "./components/_queue.scss"; -@import "./components/_settings_group.scss"; -@import "./components/_search.scss"; -@import "./components/_sidebar.scss"; -@import "./components/_table.scss"; -@import "./components/_tags_list.scss"; -@import "./components/_tooltip.scss"; -@import "./components/_track_widget.scss"; -@import "./components/_track_table.scss"; -@import "./components/_user_link.scss"; -@import "./components/user_modal.scss"; -@import "./components/_volume_control.scss"; -@import "./components/_loaders.scss"; +@use "./components/_action_table.scss"; +@use "./components/_album_card.scss"; +@use "./components/_attachment_input.scss"; +@use "./components/_avatar.scss"; +@use "./components/_builder.scss"; +@use "./components/_button.scss"; +@use "./components/_card.scss"; +@use "./components/_content_form.scss"; +@use "./components/_copy_input.scss"; +@use "./components/_empty_state.scss"; +@use "./components/_favorite.scss"; +@use "./components/_form.scss"; +@use "./components/_file_upload.scss"; +@use "./components/_fs_browser.scss"; +@use "./components/_fs_logs.scss"; +@use "./components/_header.scss"; +@use "./components/_label.scss"; +@use "./components/_modal.scss"; +@use "./components/_pagination.scss"; +@use "./components/_placeholder.scss"; +@use "./components/_play_button.scss"; +@use "./components/_play_indicator.scss"; +@use "./components/_player.scss"; +@use "./components/_playlist_editor.scss"; +@use "./components/_queue.scss"; +@use "./components/_settings_group.scss"; +@use "./components/_search.scss"; +@use "./components/_sidebar.scss"; +@use "./components/_table.scss"; +@use "./components/_tags_list.scss"; +@use "./components/_tooltip.scss"; +@use "./components/_track_widget.scss"; +@use "./components/_track_table.scss"; +@use "./components/_user_link.scss"; +@use "./components/user_modal.scss"; +@use "./components/_volume_control.scss"; +@use "./components/_loaders.scss"; -@import "./pages/_about.scss"; -@import "./pages/_admin_account_detail.scss"; -@import "./pages/_admin_domain_detail.scss"; -@import "./pages/_admin_library.scss"; -@import "./pages/_artists.scss"; -@import "./pages/_home.scss"; -@import "./pages/_library.scss"; -@import "./pages/_notifications.scss"; -@import "./pages/_profile.scss"; +@use "./pages/_about.scss"; +@use "./pages/_admin_account_detail.scss"; +@use "./pages/_admin_domain_detail.scss"; +@use "./pages/_admin_library.scss"; +@use "./pages/_artists.scss"; +@use "./pages/_home.scss"; +@use "./pages/_library.scss"; +@use "./pages/_notifications.scss"; +@use "./pages/_profile.scss"; -@import "./themes/light/_main.scss"; -@import "./themes/dark/_main.scss"; +@use "./themes/light/_main.scss"; +@use "./themes/dark/_main.scss"; diff --git a/front/src/style/base/generic.scss b/front/src/style/base/generic.scss index 6475a72c8..a742afb11 100644 --- a/front/src/style/base/generic.scss +++ b/front/src/style/base/generic.scss @@ -1,7 +1,9 @@ +@use "../inc/theme"; + // Links %link, .funkwhale.link { - @include light-theme { + @include theme.light-theme { --fw-link-color: var(--fw-blue-400); --fw-link-hover-color: var(--fw-blue-500); @@ -11,7 +13,7 @@ } } - @include dark-theme { + @include theme.dark-theme { --fw-link-color: var(--fw-gray-300); --fw-link-hover-color: var(--fw-gray-400); @@ -53,11 +55,11 @@ border: none; border-bottom: 1px solid var(--fw-border-color); - @include light-theme { + @include theme.light-theme { --fw-border-color: var(--fw-gray-200); } - @include dark-theme { + @include theme.dark-theme { --fw-border-color: var(--fw-gray-800); } diff --git a/front/src/style/base/index.scss b/front/src/style/base/index.scss index e1448946d..21f2cb50d 100644 --- a/front/src/style/base/index.scss +++ b/front/src/style/base/index.scss @@ -1 +1 @@ -@import "generic" +@use "generic" diff --git a/front/src/style/font.scss b/front/src/style/font.scss index 31f534e5f..5cc00dfdd 100644 --- a/front/src/style/font.scss +++ b/front/src/style/font.scss @@ -1,4 +1,4 @@ -@import url("~/style/bootstrap-icons/font/bootstrap-icons.css"); +@use url("~/style/bootstrap-icons/font/bootstrap-icons.css"); @font-face { font-family: Lato; diff --git a/front/src/style/funkwhale.scss b/front/src/style/funkwhale.scss index 5f809d3ff..d4b20a038 100644 --- a/front/src/style/funkwhale.scss +++ b/front/src/style/funkwhale.scss @@ -1,11 +1,11 @@ @charset "utf-8"; -@import "base/index"; -@import "inc/theme.scss"; -@import "font"; -@import "colors"; +@use "base/index"; +@use "inc/theme.scss"; +@use "font"; +@use "colors"; html, body { - font-family: $font-main; + font-family: theme.$font-main; font-size: 16px; margin: 0; } diff --git a/front/src/style/inc/theme.scss b/front/src/style/inc/theme.scss index 871a8be2c..322199051 100644 --- a/front/src/style/inc/theme.scss +++ b/front/src/style/inc/theme.scss @@ -1,3 +1,5 @@ +@use "sass:list"; +@use "sass:selector"; $font-main: "Lato", sans-serif; @mixin theme($isDark) { @@ -12,16 +14,16 @@ $font-main: "Lato", sans-serif; // If we call `@include dark-theme {}` at the root of the file @if & == null { - $root-selectors: append($root-selectors, $root-element); + $root-selectors: list.append($root-selectors, $root-element); } @else { // For every selector in selector list @each $selector in & { // If it is `html`, we add a root rule @if #{$selector} == ":root" or #{$selector} == "html" { - $root-selectors: append($root-selectors, $root-element, comma); + $root-selectors: list.append($root-selectors, $root-element, comma); // If it's any other rule, we append it to the root rule } @else { - $root-selectors: append($root-selectors, "#{selector-nest($root-element, $selector)}", comma); + $root-selectors: list.append($root-selectors, "#{selector.nest($root-element, $selector)}", comma); } } diff --git a/front/src/style/themes/dark/_main.scss b/front/src/style/themes/dark/_main.scss index 6a9c54f75..e1c557618 100644 --- a/front/src/style/themes/dark/_main.scss +++ b/front/src/style/themes/dark/_main.scss @@ -3,5 +3,5 @@ .theme-dark { $fwVars: meta.module-variables("vars"); - @import "../../_css_vars.scss"; + @use "../../_css_vars.scss"; } diff --git a/front/src/style/themes/dark/_vars.scss b/front/src/style/themes/dark/_vars.scss index e0f3ef8a3..247d3ffbb 100644 --- a/front/src/style/themes/dark/_vars.scss +++ b/front/src/style/themes/dark/_vars.scss @@ -30,4 +30,4 @@ $secondary-menu-active-item-color: $text-color; $segment-background: $light-background-color; $table-background: $input-background; -@import "../../_vars"; +@use "../../_vars"; diff --git a/front/src/style/themes/light/_main.scss b/front/src/style/themes/light/_main.scss index cbd52cc28..fc7f45900 100644 --- a/front/src/style/themes/light/_main.scss +++ b/front/src/style/themes/light/_main.scss @@ -4,6 +4,6 @@ $fwVars: meta.module-variables("vars"); .theme-light { & { - @import "../../_css_vars.scss"; + @use "../../_css_vars.scss"; } } diff --git a/front/src/ui/modals/Language.vue b/front/src/ui/modals/Language.vue index fd57a9ffd..c6f23204e 100644 --- a/front/src/ui/modals/Language.vue +++ b/front/src/ui/modals/Language.vue @@ -29,7 +29,7 @@ const isOpen = useModal('language').isOpen ghost thin-font small - align-text="left" + align-text="start" :aria-pressed="key===locale || undefined" @click="setI18nLanguage(key)" > diff --git a/front/src/ui/modals/Search.vue b/front/src/ui/modals/Search.vue index ce47a09cb..6f8231d7c 100644 --- a/front/src/ui/modals/Search.vue +++ b/front/src/ui/modals/Search.vue @@ -208,7 +208,7 @@ const categories = computed(() => [ object_uri: trimmedQuery.value } } -] as const satisfies { +] as const satisfies readonly { type: Category label: string post?: true diff --git a/front/src/views/auth/ManageUploads.vue b/front/src/views/auth/ManageUploads.vue index 4cc9652c0..b6a2a7ec1 100644 --- a/front/src/views/auth/ManageUploads.vue +++ b/front/src/views/auth/ManageUploads.vue @@ -301,7 +301,6 @@ const showUploadDetailModal = ref(false) > diff --git a/front/src/views/auth/ProfileBase.vue b/front/src/views/auth/ProfileBase.vue index 062ce0612..b464cf4fe 100644 --- a/front/src/views/auth/ProfileBase.vue +++ b/front/src/views/auth/ProfileBase.vue @@ -25,16 +25,11 @@ import Nav from '~/components/ui/Nav.vue' import Alert from '~/components/ui/Alert.vue' import Modal from '~/components/ui/Modal.vue' -interface Events { - (e: 'updated', value: components['schemas']['FullActor']): void -} - interface Props { username: string domain?: string | null } -const emit = defineEmits() const props = withDefaults(defineProps(), { domain: null }) diff --git a/front/src/views/auth/ProfileOverview.vue b/front/src/views/auth/ProfileOverview.vue index 0b5e5e67b..c729c3770 100644 --- a/front/src/views/auth/ProfileOverview.vue +++ b/front/src/views/auth/ProfileOverview.vue @@ -13,10 +13,6 @@ import Modal from '~/components/ui/Modal.vue' import Button from '~/components/ui/Button.vue' import Link from '~/components/ui/Link.vue' -interface Events { - (e: 'updated', value: Actor): void -} - interface Props { object: Actor | null } @@ -25,7 +21,6 @@ const store = useStore() const { t } = useI18n() const router = useRouter() -const emit = defineEmits() defineProps() const step = ref(1) diff --git a/front/src/views/channels/DetailEpisodes.vue b/front/src/views/channels/DetailEpisodes.vue index 3cd33c7a3..a702cb44e 100644 --- a/front/src/views/channels/DetailEpisodes.vue +++ b/front/src/views/channels/DetailEpisodes.vue @@ -13,7 +13,7 @@ defineProps()