diff options
| author | Hazelnoot <acomputerdog@gmail.com> | 2025-04-01 09:58:59 -0400 |
|---|---|---|
| committer | Hazelnoot <acomputerdog@gmail.com> | 2025-04-01 09:59:46 -0400 |
| commit | 7ff15816d1cc23ca89c89de0f9be84cbb3cf6abb (patch) | |
| tree | 4c03b36b9bfe78469bf94017edeebe2357378eaf /packages | |
| parent | Merge branch 'misskey-develop' into merge/2025-03-24 (diff) | |
| parent | Bump version to 2025.4.0-beta.0 (diff) | |
| download | sharkey-7ff15816d1cc23ca89c89de0f9be84cbb3cf6abb.tar.gz sharkey-7ff15816d1cc23ca89c89de0f9be84cbb3cf6abb.tar.bz2 sharkey-7ff15816d1cc23ca89c89de0f9be84cbb3cf6abb.zip | |
Merge branch 'misskey-develop' into merge/2025-03-24
# Conflicts:
# .github/workflows/api-misskey-js.yml
# .github/workflows/changelog-check.yml
# .github/workflows/check-misskey-js-autogen.yml
# .github/workflows/get-api-diff.yml
# .github/workflows/lint.yml
# .github/workflows/locale.yml
# .github/workflows/on-release-created.yml
# .github/workflows/storybook.yml
# .github/workflows/test-backend.yml
# .github/workflows/test-federation.yml
# .github/workflows/test-frontend.yml
# .github/workflows/test-misskey-js.yml
# .github/workflows/test-production.yml
# .github/workflows/validate-api-json.yml
# locales/index.d.ts
# package.json
# packages/misskey-js/generator/package.json
# packages/misskey-js/package.json
# pnpm-lock.yaml
# scripts/changelog-checker/package-lock.json
# scripts/changelog-checker/package.json
Diffstat (limited to 'packages')
24 files changed, 103 insertions, 93 deletions
diff --git a/packages/backend/src/server/web/boot.js b/packages/backend/src/server/web/boot.js index 40afbc0f7b..4b4fca2081 100644 --- a/packages/backend/src/server/web/boot.js +++ b/packages/backend/src/server/web/boot.js @@ -142,11 +142,6 @@ document.documentElement.classList.add('useSystemFont'); } - const wallpaper = localStorage.getItem('wallpaper'); - if (wallpaper) { - document.documentElement.style.backgroundImage = `url(${wallpaper})`; - } - const customCss = localStorage.getItem('customCss'); if (customCss && customCss.length > 0) { const style = document.createElement('style'); diff --git a/packages/frontend-embed/package.json b/packages/frontend-embed/package.json index 12e2dcc745..297a06fd8a 100644 --- a/packages/frontend-embed/package.json +++ b/packages/frontend-embed/package.json @@ -34,7 +34,7 @@ "typescript": "5.8.2", "uuid": "11.1.0", "json5": "2.2.3", - "vite": "6.2.3", + "vite": "6.2.4", "vue": "3.5.13" }, "devDependencies": { diff --git a/packages/frontend-shared/themes/_dark.json5 b/packages/frontend-shared/themes/_dark.json5 index a31f1ed825..4625b9dec4 100644 --- a/packages/frontend-shared/themes/_dark.json5 +++ b/packages/frontend-shared/themes/_dark.json5 @@ -35,7 +35,6 @@ header: ':alpha<0.7<@panel', navBg: '@panel', navFg: '@fg', - navHoverFg: ':lighten<17<@fg', navActive: '@accent', navIndicator: '@indicator', link: '#44a4c1', @@ -65,7 +64,6 @@ inputBorder: 'rgba(255, 255, 255, 0.1)', inputBorderHover: 'rgba(255, 255, 255, 0.2)', driveFolderBg: ':alpha<0.3<@accent', - wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', badge: '#31b1ce', messageBg: '@bg', success: '#86b300', diff --git a/packages/frontend-shared/themes/_light.json5 b/packages/frontend-shared/themes/_light.json5 index 54aee7c21e..1588470bd3 100644 --- a/packages/frontend-shared/themes/_light.json5 +++ b/packages/frontend-shared/themes/_light.json5 @@ -35,7 +35,6 @@ header: ':alpha<0.7<@panel', navBg: '@panel', navFg: '@fg', - navHoverFg: ':darken<17<@fg', navActive: '@accent', navIndicator: '@indicator', link: '#44a4c1', @@ -65,7 +64,6 @@ inputBorder: 'rgba(0, 0, 0, 0.1)', inputBorderHover: 'rgba(0, 0, 0, 0.2)', driveFolderBg: ':alpha<0.3<@accent', - wallpaperOverlay: 'rgba(255, 255, 255, 0.5)', badge: '#31b1ce', messageBg: '@bg', success: '#86b300', diff --git a/packages/frontend-shared/themes/d-astro.json5 b/packages/frontend-shared/themes/d-astro.json5 index 371a98ba27..48839241bd 100644 --- a/packages/frontend-shared/themes/d-astro.json5 +++ b/packages/frontend-shared/themes/d-astro.json5 @@ -31,7 +31,6 @@ navActive: '@accent', infoWarnBg: '#42321c', infoWarnFg: '#ffbd3e', - navHoverFg: ':lighten<17<@fg', dateLabelFg: '@fg', inputBorder: 'rgba(255, 255, 255, 0.1)', inputBorderHover: 'rgba(255, 255, 255, 0.2)', @@ -47,7 +46,6 @@ fgOnWhite: '@accent', panelHighlight: ':lighten<3<@panel', scrollbarHandle: 'rgba(255, 255, 255, 0.2)', - wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', panelHeaderDivider: 'rgba(0, 0, 0, 0)', scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', }, diff --git a/packages/frontend-shared/themes/d-u0.json5 b/packages/frontend-shared/themes/d-u0.json5 index 57b97c5d75..ddce06649c 100644 --- a/packages/frontend-shared/themes/d-u0.json5 +++ b/packages/frontend-shared/themes/d-u0.json5 @@ -42,7 +42,6 @@ fgOnWhite: '@accent', infoWarnBg: '#42321c', infoWarnFg: '#ffbd3e', - navHoverFg: ':lighten<17<@fg', codeBoolean: '#c59eff', dateLabelFg: '@fg', inputBorder: 'rgba(255, 255, 255, 0.1)', @@ -59,7 +58,6 @@ panelHighlight: ':lighten<3<@panel', scrollbarHandle: 'rgba(255, 255, 255, 0.2)', inputBorderHover: 'rgba(255, 255, 255, 0.2)', - wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', fgTransparentWeak: ':alpha<0.75<@fg', panelHeaderDivider: 'rgba(0, 0, 0, 0)', scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', diff --git a/packages/frontend-shared/themes/l-u0.json5 b/packages/frontend-shared/themes/l-u0.json5 index dd37ca2781..d8e403c961 100644 --- a/packages/frontend-shared/themes/l-u0.json5 +++ b/packages/frontend-shared/themes/l-u0.json5 @@ -43,7 +43,6 @@ fgOnWhite: '@accent', infoWarnBg: '#42321c', infoWarnFg: '#ffbd3e', - navHoverFg: ':lighten<17<@fg', codeBoolean: '#c59eff', dateLabelFg: '@fg', inputBorder: 'rgba(255, 255, 255, 0.1)', @@ -61,7 +60,6 @@ panelHighlight: ':lighten<3<@panel', scrollbarHandle: '#74747433', inputBorderHover: 'rgba(255, 255, 255, 0.2)', - wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', fgTransparentWeak: ':alpha<0.75<@fg', panelHeaderDivider: 'rgba(0, 0, 0, 0)', scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', diff --git a/packages/frontend-shared/themes/l-vivid.json5 b/packages/frontend-shared/themes/l-vivid.json5 index b3c0343e27..d69f024a6b 100644 --- a/packages/frontend-shared/themes/l-vivid.json5 +++ b/packages/frontend-shared/themes/l-vivid.json5 @@ -34,7 +34,6 @@ navActive: '@accent', infoWarnBg: '#fff0db', infoWarnFg: '#8f6e31', - navHoverFg: ':darken<17<@fg', dateLabelFg: '@fg', inputBorder: 'rgba(0, 0, 0, 0.1)', inputBorderHover: 'rgba(0, 0, 0, 0.2)', @@ -49,7 +48,6 @@ htmlThemeColor: '@bg', panelHighlight: ':darken<3<@panel', scrollbarHandle: 'rgba(0, 0, 0, 0.2)', - wallpaperOverlay: 'rgba(255, 255, 255, 0.5)', fgTransparentWeak: ':alpha<0.75<@fg', panelHeaderDivider: '@divider', scrollbarHandleHover: 'rgba(0, 0, 0, 0.4)', diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 47d4e8cd3d..a5f1604aab 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -75,7 +75,7 @@ "typescript": "5.8.2", "uuid": "11.1.0", "v-code-diff": "1.13.1", - "vite": "6.2.3", + "vite": "6.2.4", "vue": "3.5.13", "vuedraggable": "next", "wanakana": "5.3.1" diff --git a/packages/frontend/src/components/MkThemePreview.vue b/packages/frontend/src/components/MkThemePreview.vue index fb5e2b6571..013ab9d6a4 100644 --- a/packages/frontend/src/components/MkThemePreview.vue +++ b/packages/frontend/src/components/MkThemePreview.vue @@ -12,11 +12,13 @@ SPDX-License-Identifier: AGPL-3.0-only <path transform="scale(.26458)" d="m439.77 247.19c-43.673 0-78.832 35.157-78.832 78.83v249.98h407.06v-328.81z" :fill="themeVariables.panel"/> </g> <circle cx="32" cy="83" r="21" :fill="themeVariables.accentedBg"/> - <circle cx="136" cy="106" r="23" :fill="themeVariables.fg" fill-opacity="0.5"/> - <g :fill="themeVariables.fg" fill-rule="evenodd"> - <rect x="171" y="88" width="48" height="6" ry="3"/> - <rect x="171" y="108" width="48" height="6" ry="3"/> - <rect x="171" y="128" width="48" height="6" ry="3"/> + <g> + <rect x="120" y="88" width="40" height="6" ry="3" :fill="themeVariables.fg"/> + <rect x="170" y="88" width="20" height="6" ry="3" :fill="themeVariables.mention"/> + <rect x="120" y="108" width="20" height="6" ry="3" :fill="themeVariables.hashtag"/> + <rect x="150" y="108" width="40" height="6" ry="3" :fill="themeVariables.fg"/> + <rect x="120" y="128" width="40" height="6" ry="3" :fill="themeVariables.fg"/> + <rect x="170" y="128" width="20" height="6" ry="3" :fill="themeVariables.link"/> </g> <path d="m65.498 40.892h137.7" :stroke="themeVariables.divider" stroke-width="0.75"/> <g transform="matrix(.60823 0 0 .60823 25.45 75.755)" fill="none" :stroke="themeVariables.accent" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"> @@ -53,14 +55,23 @@ const themeVariables = ref<{ bg: string; panel: string; fg: string; + mention: string; + hashtag: string; + link: string; divider: string; accent: string; accentedBg: string; navBg: string; + success: string; + warn: string; + error: string; }>({ bg: 'var(--MI_THEME-bg)', panel: 'var(--MI_THEME-panel)', fg: 'var(--MI_THEME-fg)', + mention: 'var(--MI_THEME-mention)', + hashtag: 'var(--MI_THEME-hashtag)', + link: 'var(--MI_THEME-link)', divider: 'var(--MI_THEME-divider)', accent: 'var(--MI_THEME-accent)', accentedBg: 'var(--MI_THEME-accentedBg)', @@ -86,6 +97,9 @@ watch(() => props.theme, (theme) => { bg: compiled.bg ?? 'var(--MI_THEME-bg)', panel: compiled.panel ?? 'var(--MI_THEME-panel)', fg: compiled.fg ?? 'var(--MI_THEME-fg)', + mention: compiled.mention ?? 'var(--MI_THEME-mention)', + hashtag: compiled.hashtag ?? 'var(--MI_THEME-hashtag)', + link: compiled.link ?? 'var(--MI_THEME-link)', divider: compiled.divider ?? 'var(--MI_THEME-divider)', accent: compiled.accent ?? 'var(--MI_THEME-accent)', accentedBg: compiled.accentedBg ?? 'var(--MI_THEME-accentedBg)', diff --git a/packages/frontend/src/components/global/PageWithAnimBg.vue b/packages/frontend/src/components/global/PageWithAnimBg.vue index a00b196a04..7106ae20cd 100644 --- a/packages/frontend/src/components/global/PageWithAnimBg.vue +++ b/packages/frontend/src/components/global/PageWithAnimBg.vue @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only <template> <div> <MkAnimBg style="position: absolute;"/> - <div class="_pageScrollable" style="position: absolute; top: 0; width: 100%; height: 100%;"> + <div class="_pageScrollable" :class="$style.body"> <slot></slot> </div> </div> @@ -17,5 +17,13 @@ import MkAnimBg from '@/components/MkAnimBg.vue'; </script> <style lang="scss" module> +.body { + position: absolute; + top: 0; + width: 100%; + height: 100%; + // _pageScrollable はパフォーマンス上の理由で背景色が設定されているため + background: transparent !important; +} </style> diff --git a/packages/frontend/src/local-storage.ts b/packages/frontend/src/local-storage.ts index c43bd7cd9a..5c795b1f9d 100644 --- a/packages/frontend/src/local-storage.ts +++ b/packages/frontend/src/local-storage.ts @@ -17,7 +17,6 @@ export type Keys = ( 'lang' | 'drafts' | 'hashtags' | - 'wallpaper' | 'colorScheme' | 'useSystemFont' | 'fontSize' | diff --git a/packages/frontend/src/pages/settings/deck.vue b/packages/frontend/src/pages/settings/deck.vue index 902e058e0d..f4bce8a5dd 100644 --- a/packages/frontend/src/pages/settings/deck.vue +++ b/packages/frontend/src/pages/settings/deck.vue @@ -12,6 +12,8 @@ SPDX-License-Identifier: AGPL-3.0-only </MkSwitch> </SearchMarker> + <hr> + <SearchMarker :keywords="['ui', 'root', 'page']"> <MkPreferenceContainer k="deck.useSimpleUiForNonRootPages"> <MkSwitch v-model="useSimpleUiForNonRootPages"> @@ -74,19 +76,29 @@ SPDX-License-Identifier: AGPL-3.0-only </MkRange> </MkPreferenceContainer> </SearchMarker> + + <SearchMarker :keywords="['wallpaper']"> + <MkPreferenceContainer k="deck.wallpaper"> + <MkButton v-if="wallpaper == null" @click="setWallpaper"><SearchLabel>{{ i18n.ts.setWallpaper }}</SearchLabel></MkButton> + <MkButton v-else @click="wallpaper = null">{{ i18n.ts.removeWallpaper }}</MkButton> + </MkPreferenceContainer> + </SearchMarker> </div> </SearchMarker> </template> <script lang="ts" setup> -import { computed, ref } from 'vue'; +import { computed, ref, watch } from 'vue'; import MkSwitch from '@/components/MkSwitch.vue'; import MkRadios from '@/components/MkRadios.vue'; import MkRange from '@/components/MkRange.vue'; +import MkButton from '@/components/MkButton.vue'; import { i18n } from '@/i18n.js'; import { definePage } from '@/page.js'; import { prefer } from '@/preferences.js'; import MkPreferenceContainer from '@/components/MkPreferenceContainer.vue'; +import { reloadAsk } from '@/utility/reload-ask.js'; +import { selectFile } from '@/utility/select-file.js'; const navWindow = prefer.model('deck.navWindow'); const useSimpleUiForNonRootPages = prefer.model('deck.useSimpleUiForNonRootPages'); @@ -95,6 +107,17 @@ const columnAlign = prefer.model('deck.columnAlign'); const columnGap = prefer.model('deck.columnGap'); const menuPosition = prefer.model('deck.menuPosition'); const navbarPosition = prefer.model('deck.navbarPosition'); +const wallpaper = prefer.model('deck.wallpaper'); + +watch(wallpaper, async () => { + await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true }); +}); + +function setWallpaper(ev: MouseEvent) { + selectFile(ev.currentTarget ?? ev.target, null).then(file => { + wallpaper.value = file.url; + }); +} const profilesSyncEnabled = ref(prefer.isSyncEnabled('deck.profiles')); diff --git a/packages/frontend/src/pages/settings/theme.vue b/packages/frontend/src/pages/settings/theme.vue index 8976d104c7..5a96fdf0fb 100644 --- a/packages/frontend/src/pages/settings/theme.vue +++ b/packages/frontend/src/pages/settings/theme.vue @@ -189,17 +189,12 @@ SPDX-License-Identifier: AGPL-3.0-only <FormLink to="/theme-editor"><template #icon><i class="ti ti-paint"></i></template>{{ i18n.ts._theme.make }}</FormLink> </div> </FormSection> - - <SearchMarker :keywords="['wallpaper']"> - <MkButton v-if="wallpaper == null" @click="setWallpaper"><SearchLabel>{{ i18n.ts.setWallpaper }}</SearchLabel></MkButton> - <MkButton v-else @click="wallpaper = null">{{ i18n.ts.removeWallpaper }}</MkButton> - </SearchMarker> </div> </SearchMarker> </template> <script lang="ts" setup> -import { computed, onActivated, ref, watch } from 'vue'; +import { computed, ref, watch } from 'vue'; import JSON5 from 'json5'; import defaultLightTheme from '@@/themes/l-light.json5'; import defaultDarkTheme from '@@/themes/d-green-lime.json5'; @@ -207,7 +202,6 @@ import type { Theme } from '@/theme.js'; import MkSwitch from '@/components/MkSwitch.vue'; import FormSection from '@/components/form/section.vue'; import FormLink from '@/components/form/link.vue'; -import MkButton from '@/components/MkButton.vue'; import MkFolder from '@/components/MkFolder.vue'; import MkThemePreview from '@/components/MkThemePreview.vue'; import { getBuiltinThemesRef, getThemesRef } from '@/theme.js'; @@ -262,7 +256,6 @@ const lightThemeId = computed({ const darkMode = computed(store.makeGetterSetter('darkMode')); const syncDeviceDarkMode = prefer.model('syncDeviceDarkMode'); -const wallpaper = ref(miLocalStorage.getItem('wallpaper')); const themesCount = installedThemes.value.length; watch(syncDeviceDarkMode, () => { @@ -271,21 +264,6 @@ watch(syncDeviceDarkMode, () => { } }); -watch(wallpaper, async () => { - if (wallpaper.value == null) { - miLocalStorage.removeItem('wallpaper'); - } else { - miLocalStorage.setItem('wallpaper', wallpaper.value); - } - await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true }); -}); - -function setWallpaper(event) { - selectFile(event.currentTarget ?? event.target, null).then(file => { - wallpaper.value = file.url; - }); -} - const headerActions = computed(() => []); const headerTabs = computed(() => []); diff --git a/packages/frontend/src/preferences/def.ts b/packages/frontend/src/preferences/def.ts index bccc09921c..110d454df9 100644 --- a/packages/frontend/src/preferences/def.ts +++ b/packages/frontend/src/preferences/def.ts @@ -431,6 +431,9 @@ export const PREF_DEF = { 'deck.navbarPosition': { default: 'left' as 'left' | 'top' | 'bottom', }, + 'deck.wallpaper': { + default: null as string | null, + }, 'chat.showSenderName': { default: false, diff --git a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue index cbfe475627..138c04b5d4 100644 --- a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue +++ b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue @@ -228,7 +228,7 @@ function more() { &:hover { text-decoration: none; - color: var(--MI_THEME-navHoverFg); + color: light-dark(hsl(from var(--MI_THEME-navFg) h s calc(l - 17)), hsl(from var(--MI_THEME-navFg) h s calc(l + 17))); } &.active { diff --git a/packages/frontend/src/ui/_common_/navbar-h.vue b/packages/frontend/src/ui/_common_/navbar-h.vue index c93935dd26..13fc592e70 100644 --- a/packages/frontend/src/ui/_common_/navbar-h.vue +++ b/packages/frontend/src/ui/_common_/navbar-h.vue @@ -149,7 +149,7 @@ onMounted(() => { &:hover { text-decoration: none; - color: var(--MI_THEME-navHoverFg); + color: light-dark(hsl(from var(--MI_THEME-navFg) h s calc(l - 17)), hsl(from var(--MI_THEME-navFg) h s calc(l + 17))); } &.active { diff --git a/packages/frontend/src/ui/_common_/navbar.vue b/packages/frontend/src/ui/_common_/navbar.vue index 64763fee52..1948d01076 100644 --- a/packages/frontend/src/ui/_common_/navbar.vue +++ b/packages/frontend/src/ui/_common_/navbar.vue @@ -463,7 +463,7 @@ function menuEdit() { &:hover { text-decoration: none; - color: var(--MI_THEME-navHoverFg); + color: light-dark(hsl(from var(--MI_THEME-navFg) h s calc(l - 17)), hsl(from var(--MI_THEME-navFg) h s calc(l + 17))); } &.active { diff --git a/packages/frontend/src/ui/deck.vue b/packages/frontend/src/ui/deck.vue index a03d34da9d..79d8b1f1d2 100644 --- a/packages/frontend/src/ui/deck.vue +++ b/packages/frontend/src/ui/deck.vue @@ -117,13 +117,12 @@ SPDX-License-Identifier: AGPL-3.0-only </template> <script lang="ts" setup> -import { computed, defineAsyncComponent, ref, useTemplateRef, watch } from 'vue'; +import { computed, defineAsyncComponent, ref, useTemplateRef } from 'vue'; import { v4 as uuid } from 'uuid'; import XCommon from './_common_/common.vue'; import XSidebar from '@/ui/_common_/navbar.vue'; import XNavbarH from '@/ui/_common_/navbar-h.vue'; import XDrawerMenu from '@/ui/_common_/navbar-for-mobile.vue'; -import MkButton from '@/components/MkButton.vue'; import * as os from '@/os.js'; import { navbarItemDef } from '@/navbar.js'; import { $i } from '@/i.js'; @@ -143,7 +142,6 @@ import XRoleTimelineColumn from '@/ui/deck/role-timeline-column.vue'; import XFollowingColumn from '@/ui/deck/following-column.vue'; import { mainRouter } from '@/router.js'; import { columns, layout, columnTypes, switchProfileMenu, addColumn as addColumnToStore, deleteProfile as deleteProfile_ } from '@/deck.js'; -import { miLocalStorage } from '@/local-storage.js'; const XStatusBars = defineAsyncComponent(() => import('@/ui/_common_/statusbars.vue')); const XAnnouncements = defineAsyncComponent(() => import('@/ui/_common_/announcements.vue')); @@ -178,7 +176,7 @@ window.addEventListener('resize', () => { }); const snapScroll = deviceKind === 'smartphone' || deviceKind === 'tablet'; -const withWallpaper = miLocalStorage.getItem('wallpaper') != null; +const withWallpaper = prefer.s['deck.wallpaper'] != null; const drawerMenuShowing = ref(false); const gap = prefer.r['deck.columnGap']; @@ -234,9 +232,6 @@ function onWheel(ev: WheelEvent) { } } -window.document.documentElement.style.overflowY = 'hidden'; -window.document.documentElement.style.scrollBehavior = 'auto'; - async function deleteProfile() { if (prefer.s['deck.profile'] == null) return; @@ -251,6 +246,12 @@ async function deleteProfile() { os.success(); } +window.document.documentElement.style.overflowY = 'hidden'; +window.document.documentElement.style.scrollBehavior = 'auto'; + +if (prefer.s['deck.wallpaper'] != null) { + window.document.documentElement.style.backgroundImage = `url(${prefer.s['deck.wallpaper']})`; +} </script> <style lang="scss" module> diff --git a/packages/frontend/src/ui/deck/column.vue b/packages/frontend/src/ui/deck/column.vue index bb931dda3f..09f748fcc6 100644 --- a/packages/frontend/src/ui/deck/column.vue +++ b/packages/frontend/src/ui/deck/column.vue @@ -48,13 +48,13 @@ import type { MenuItem } from '@/types/menu.js'; import { updateColumn, swapLeftColumn, swapRightColumn, swapUpColumn, swapDownColumn, stackLeftColumn, popRightColumn, removeColumn, swapColumn } from '@/deck.js'; import * as os from '@/os.js'; import { i18n } from '@/i18n.js'; -import { miLocalStorage } from '@/local-storage.js'; +import { prefer } from '@/preferences.js'; provide('shouldHeaderThin', true); provide('shouldOmitHeaderTitle', true); provide('forceSpacerMin', true); -const withWallpaper = miLocalStorage.getItem('wallpaper') != null; +const withWallpaper = prefer.s['deck.wallpaper'] != null; const props = withDefaults(defineProps<{ column: Column; diff --git a/packages/frontend/src/utility/autogen/settings-search-index.ts b/packages/frontend/src/utility/autogen/settings-search-index.ts index 1563f19c34..08ab0d8811 100644 --- a/packages/frontend/src/utility/autogen/settings-search-index.ts +++ b/packages/frontend/src/utility/autogen/settings-search-index.ts @@ -37,11 +37,6 @@ export const searchIndexes: SearchIndexItem[] = [ label: i18n.ts.themeForDarkMode, keywords: ['dark', 'theme'], }, - { - id: '8wcoRp76b', - label: i18n.ts.setWallpaper, - keywords: ['wallpaper'], - }, ], label: i18n.ts.theme, keywords: ['theme'], @@ -861,40 +856,45 @@ export const searchIndexes: SearchIndexItem[] = [ keywords: ['sync', 'profiles', 'devices'], }, { - id: 'iEF0gqNAo', + id: 'wWH4pxMQN', label: i18n.ts._deck.useSimpleUiForNonRootPages, keywords: ['ui', 'root', 'page'], }, { - id: 'BNdSeWxZn', + id: '3LR509BvD', label: i18n.ts.defaultNavigationBehaviour, keywords: ['default', 'navigation', 'behaviour', 'window'], }, { - id: 'zT9pGm8DF', + id: 'ybU8RLXgm', label: i18n.ts._deck.alwaysShowMainColumn, keywords: ['always', 'show', 'main', 'column'], }, { - id: '5dk2xv1vc', + id: 'xRasZyAVl', label: i18n.ts._deck.columnAlign, keywords: ['column', 'align'], }, { - id: 'gtdEA4FTa', + id: '6qcyPd0oJ', label: i18n.ts._deck.deckMenuPosition, keywords: ['menu', 'position'], }, { - id: 'DHVFdPBT6', + id: '4zk2Now4S', label: i18n.ts._deck.navbarPosition, keywords: ['navbar', 'position'], }, { - id: '3UQ8rUssZ', + id: 'CGNtJ2I3n', label: i18n.ts._deck.columnGap, keywords: ['column', 'gap', 'margin'], }, + { + id: 'rxPDMo7bE', + label: i18n.ts.setWallpaper, + keywords: ['wallpaper'], + }, ], label: i18n.ts.deck, keywords: ['deck', 'ui'], diff --git a/packages/frontend/src/utility/intl-string.ts b/packages/frontend/src/utility/intl-string.ts index a5b5bbb592..4bc51e2cb0 100644 --- a/packages/frontend/src/utility/intl-string.ts +++ b/packages/frontend/src/utility/intl-string.ts @@ -9,9 +9,9 @@ import type { toHiragana as toHiraganaType } from 'wanakana'; let toHiragana: typeof toHiraganaType = (str?: string) => str ?? ''; let isWanakanaLoaded = false; -/** +/** * ローマ字変換のセットアップ(日本語以外の環境で読み込まないのでlazy-loading) - * + * * ここの比較系関数を使う際は事前に呼び出す必要がある */ export async function initIntlString(forceWanakana = false) { @@ -82,16 +82,17 @@ export function normalizeStringWithHiragana(str: string) { /** aとbが同じかどうか */ export function compareStringEquals(a: string, b: string) { - return ( - normalizeString(a) === normalizeString(b) || - normalizeStringWithHiragana(a) === normalizeStringWithHiragana(b) - ); + if (a === b) return true; // まったく同じ場合はtrue。なお、ノーマライズ前後で文字数が変化することがあるため、文字数が違うからといってfalseにはできない + if (normalizeString(a) === normalizeString(b)) return true; + if (normalizeStringWithHiragana(a) === normalizeStringWithHiragana(b)) return true; + return false; } /** baseにqueryが含まれているかどうか */ export function compareStringIncludes(base: string, query: string) { - return ( - normalizeString(base).includes(normalizeString(query)) || - normalizeStringWithHiragana(base).includes(normalizeStringWithHiragana(query)) - ); + if (base === query) return true; // まったく同じ場合は含まれていると考えてよいのでtrue + if (base.includes(query)) return true; + if (normalizeString(base).includes(normalizeString(query))) return true; + if (normalizeStringWithHiragana(base).includes(normalizeStringWithHiragana(query))) return true; + return false; } diff --git a/packages/misskey-js/generator/package.json b/packages/misskey-js/generator/package.json index 3fee53a99a..b63ddd3e58 100644 --- a/packages/misskey-js/generator/package.json +++ b/packages/misskey-js/generator/package.json @@ -8,9 +8,9 @@ }, "devDependencies": { "@readme/openapi-parser": "2.7.0", - "@types/node": "22.13.9", - "@typescript-eslint/eslint-plugin": "8.27.0", - "@typescript-eslint/parser": "8.27.0", + "@types/node": "22.13.15", + "@typescript-eslint/eslint-plugin": "8.29.0", + "@typescript-eslint/parser": "8.29.0", "eslint": "9.22.0", "openapi-types": "12.1.3", "openapi-typescript": "6.7.6", diff --git a/packages/misskey-js/package.json b/packages/misskey-js/package.json index 245a8c1924..024779499a 100644 --- a/packages/misskey-js/package.json +++ b/packages/misskey-js/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "misskey-js", - "version": "2025.3.2-beta.20", + "version": "2025.4.0-beta.0", "description": "Misskey SDK for JavaScript", "license": "MIT", "main": "./built/index.js", @@ -35,12 +35,12 @@ "directory": "packages/misskey-js" }, "devDependencies": { - "@microsoft/api-extractor": "7.51.1", + "@microsoft/api-extractor": "7.52.2", "@swc/jest": "0.2.37", "@types/jest": "29.5.14", - "@types/node": "22.13.9", - "@typescript-eslint/eslint-plugin": "8.27.0", - "@typescript-eslint/parser": "8.27.0", + "@types/node": "22.13.15", + "@typescript-eslint/eslint-plugin": "8.29.0", + "@typescript-eslint/parser": "8.29.0", "jest": "29.7.0", "jest-fetch-mock": "3.0.3", "jest-websocket-mock": "2.5.0", @@ -50,7 +50,7 @@ "execa": "8.0.1", "tsd": "0.31.2", "typescript": "5.8.2", - "esbuild": "0.25.0", + "esbuild": "0.25.2", "glob": "11.0.1" }, "files": [ |