Merge branch 'misskey-develop' into merge/2025-03-24

# Conflicts:
#	.github/workflows/storybook.yml
#	package.json
#	packages/frontend/src/utility/autogen/settings-search-index.ts
#	pnpm-lock.yaml
This commit is contained in:
Hazelnoot 2025-04-05 12:20:19 -04:00
commit 7e7350eab5
65 changed files with 486 additions and 1651 deletions

File diff suppressed because it is too large Load diff

View file

@ -5,7 +5,6 @@
"scripts": {
"watch": "vite",
"build": "vite build",
"build-search-index": "vite-node --config \"./vite-node.config.ts\" \"./scripts/generate-search-index.ts\"",
"storybook-dev": "nodemon --verbose --watch src --ext \"mdx,ts,vue\" --ignore \"*.stories.ts\" --exec \"pnpm build-storybook-pre && pnpm exec storybook dev -p 6006 --ci\"",
"build-storybook-pre": "(tsc -p .storybook || echo done.) && node .storybook/generate.js && node .storybook/preload-locale.js && node .storybook/preload-theme.js",
"build-storybook": "pnpm build-storybook-pre && storybook build --webpack-stats-json storybook-static",
@ -120,6 +119,7 @@
"@typescript-eslint/eslint-plugin": "8.27.0",
"@typescript-eslint/parser": "8.27.0",
"@vitest/coverage-v8": "3.0.9",
"@vue/compiler-core": "3.5.13",
"@vue/runtime-core": "3.5.13",
"acorn": "8.14.1",
"cross-env": "7.0.3",
@ -129,6 +129,7 @@
"happy-dom": "17.4.4",
"intersection-observer": "0.12.2",
"micromatch": "4.0.8",
"minimatch": "10.0.1",
"msw": "2.7.3",
"msw-storybook-addon": "2.0.4",
"nodemon": "3.1.9",

View file

@ -1,15 +0,0 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { searchIndexes } from '../vite.config.js';
import { generateSearchIndex } from '../lib/vite-plugin-create-search-index.js';
async function main() {
for (const searchIndex of searchIndexes) {
await generateSearchIndex(searchIndex);
}
}
main();

View file

@ -140,7 +140,7 @@ watch(v, newValue => {
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View file

@ -60,7 +60,7 @@ const onInput = () => {
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View file

@ -181,12 +181,17 @@ onUnmounted(() => {
left: 0;
color: var(--MI_THEME-panelHeaderFg);
background: var(--MI_THEME-panelHeaderBg);
border-bottom: solid 0.5px var(--MI_THEME-panelHeaderDivider);
z-index: 2;
line-height: 1.4em;
background: color-mix(in srgb, var(--MI_THEME-panelHeaderBg) 35%, transparent);
}
@container style(--MI_THEME-panelHeaderBg: var(--MI_THEME-panel)) {
.header {
box-shadow: 0 0.5px 0 0 light-dark(#0002, #fff2);
}
}
.title {
margin: 0;
padding: 12px 16px;

View file

@ -175,7 +175,7 @@ onMounted(() => {
}
.headerLower {
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
font-size: .85em;
padding-left: 4px;
}
@ -209,13 +209,13 @@ onMounted(() => {
}
.headerTextSub {
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
font-size: .85em;
}
.headerRight {
margin-left: auto;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
white-space: nowrap;
}

View file

@ -201,7 +201,7 @@ defineExpose({
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View file

@ -78,7 +78,7 @@ export default defineComponent({
> .caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View file

@ -213,7 +213,7 @@ function onMousedown(ev: MouseEvent | TouchEvent) {
> .caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View file

@ -268,7 +268,7 @@ function show() {
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View file

@ -94,7 +94,7 @@ export type SuperMenuDef = {
<script lang="ts" setup>
import { useTemplateRef, ref, watch, nextTick } from 'vue';
import type { SearchIndexItem } from '@/utility/autogen/settings-search-index.js';
import type { SearchIndexItem } from '@/utility/settings-search-index.js';
import MkInput from '@/components/MkInput.vue';
import { i18n } from '@/i18n.js';
import { getScrollContainer } from '@@/js/scroll.js';

View file

@ -100,7 +100,7 @@ const toggle = () => {
.caption {
margin: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
font-size: 0.85em;
&:empty {

View file

@ -307,6 +307,6 @@ onMounted(async () => {
.description {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View file

@ -160,7 +160,7 @@ onUnmounted(() => {
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View file

@ -298,7 +298,7 @@ onMounted(() => {
.statusItemLabel {
font-size: 0.7em;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
.menu {

View file

@ -193,7 +193,7 @@ function showMenu(ev: MouseEvent) {
}
.statsItemLabel {
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
font-size: 0.9em;
}

View file

@ -79,7 +79,7 @@ const props = defineProps<{
margin-right: 0.75em;
flex-shrink: 0;
text-align: center;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View file

@ -49,7 +49,7 @@ defineProps<{
.description {
font-size: 0.85em;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
margin: 0 0 8px 0;
}
</style>

View file

@ -35,7 +35,7 @@ function focus() {
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View file

@ -81,7 +81,7 @@ const emit = defineEmits<{
const displayBackButton = props.displayBackButton && window.history.state.key !== 'index' && window.history.length > 1 && inject('shouldBackButton', true);
//const viewId = inject(DI.viewId);
const injectedPageMetadata = inject(DI.pageMetadata);
const injectedPageMetadata = inject(DI.pageMetadata, ref(null));
const pageMetadata = computed(() => props.overridePageMetadata ?? injectedPageMetadata.value);
const hideTitle = computed(() => inject('shouldOmitHeaderTitle', false) || props.hideTitle);

View file

@ -10,7 +10,7 @@ export const DI = {
routerCurrentDepth: Symbol() as InjectionKey<number>,
router: Symbol() as InjectionKey<Router>,
mock: Symbol() as InjectionKey<boolean>,
pageMetadata: Symbol() as InjectionKey<Ref<Record<string, any>>>,
pageMetadata: Symbol() as InjectionKey<Ref<Record<string, any> | null>>,
viewId: Symbol() as InjectionKey<string>,
currentStickyTop: Symbol() as InjectionKey<Ref<number>>,
currentStickyBottom: Symbol() as InjectionKey<Ref<number>>,

View file

@ -724,7 +724,7 @@ definePage(() => ({
.roleItemSub {
padding: 6px 12px;
font-size: 85%;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
.roleUnassign {

View file

@ -66,7 +66,7 @@ const emit = defineEmits<{
(ev: 'update:tab', key: string);
}>();
const pageMetadata = inject(DI.pageMetadata);
const pageMetadata = inject(DI.pageMetadata, ref(null));
const el = useTemplateRef('el');
const tabHighlightEl = useTemplateRef('tabHighlightEl');

View file

@ -184,7 +184,7 @@ definePage(() => ({
.userItemSub {
padding: 6px 12px;
font-size: 85%;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
.userItemMainBody {

View file

@ -459,6 +459,6 @@ definePage(() => ({
<style lang="scss" module>
.subCaption {
font-size: 0.85em;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View file

@ -75,6 +75,6 @@ function onDeleteClick() {
margin-right: 0.75em;
flex-shrink: 0;
text-align: center;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View file

@ -247,7 +247,7 @@ definePage(() => ({
}
.uiInspectorUnShown {
color: var(--MI_THEME-fgTransparent);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.5);
}
.uiInspectorType {

View file

@ -351,7 +351,7 @@ async function search() {
width: 100%;
height: 100%;
padding: 12px;
border: 2px dashed var(--MI_THEME-fgTransparent);
border: 2px dashed color(from var(--MI_THEME-fg) srgb r g b / 0.5);
}
.userSelectButtonInner {

View file

@ -161,6 +161,6 @@ function del(ev: MouseEvent) {
.editorCaption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View file

@ -285,6 +285,6 @@ definePage(() => ({
.editorCaption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View file

@ -42,7 +42,7 @@ import { instance } from '@/instance.js';
import { definePage, provideMetadataReceiver, provideReactiveMetadata } from '@/page.js';
import * as os from '@/os.js';
import { useRouter } from '@/router.js';
import { searchIndexes } from '@/utility/autogen/settings-search-index.js';
import { searchIndexes } from '@/utility/settings-search-index.js';
import { enableAutoBackup, getPreferencesProfileMenu } from '@/preferences/utility.js';
import { store } from '@/store.js';
import { signout } from '@/signout.js';

View file

@ -308,7 +308,7 @@ definePage(() => ({
.userItemSub {
padding: 6px 12px;
font-size: 85%;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
.userItemMainBody {

View file

@ -184,6 +184,6 @@ definePage(() => ({
.description {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View file

@ -653,7 +653,7 @@ onUnmounted(() => {
> .heading {
text-align: left;
color: var(--MI_THEME-fgTransparent);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.5);
line-height: 1.5;
font-size: 85%;
}

View file

@ -67,7 +67,7 @@ export function migrateOldSettings() {
prefer.commit('collapseRenotes', store.s.collapseRenotes);
prefer.commit('rememberNoteVisibility', store.s.rememberNoteVisibility);
prefer.commit('uploadFolder', store.s.uploadFolder);
prefer.commit('menu', store.s.menu);
prefer.commit('menu', [...store.s.menu, 'chat']);
prefer.commit('statusbars', store.s.statusbars);
prefer.commit('pinnedUserLists', store.s.pinnedUserLists);
prefer.commit('serverDisconnectedBehavior', store.s.serverDisconnectedBehavior);

View file

@ -413,11 +413,16 @@ function onDrop(ev) {
font-size: 0.9em;
color: var(--MI_THEME-panelHeaderFg);
background: var(--MI_THEME-panelHeaderBg);
box-shadow: 0 0.5px 0 0 var(--MI_THEME-panelHeaderDivider);
cursor: pointer;
user-select: none;
}
@container style(--MI_THEME-panelHeaderBg: var(--MI_THEME-panel)) {
.header {
box-shadow: 0 0.5px 0 0 light-dark(#0002, #fff2);
}
}
.color {
position: absolute;
top: 12px;

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,43 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { searchIndexes as generated } from 'search-index:settings';
import type { GeneratedSearchIndexItem } from 'search-index:settings';
export type SearchIndexItem = {
id: string;
path?: string;
label: string;
keywords: string[];
icon?: string;
children?: SearchIndexItem[];
};
const rootMods = new Map(generated.map(item => [item.id, item]));
function walk(item: GeneratedSearchIndexItem) {
if (item.inlining) {
for (const id of item.inlining) {
const inline = rootMods.get(id);
if (inline) {
(item.children ??= []).push(inline);
rootMods.delete(id);
} else {
console.log('[Settings Search Index] Failed to inline', id);
}
}
}
for (const child of item.children ?? []) {
walk(child);
}
}
for (const item of generated) {
walk(item);
}
export const searchIndexes: SearchIndexItem[] = generated;

View file

@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
declare module 'search-index:settings' {
export type GeneratedSearchIndexItem = {
id: string;
path?: string;
label: string;
keywords: string[];
icon?: string;
inlining?: string[];
children?: GeneratedSearchIndexItem[];
};
export const searchIndexes: GeneratedSearchIndexItem[];
}

View file

@ -73,6 +73,6 @@ defineExpose<WidgetComponentExpose>({
}
.text {
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View file

@ -23,7 +23,8 @@ const extensions = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.json', '.json5', '.s
*/
export const searchIndexes = [{
targetFilePaths: ['src/pages/settings/*.vue'],
exportFilePath: './src/utility/autogen/settings-search-index.ts',
mainVirtualModule: 'search-index:settings',
modulesToHmrOnUpdate: ['src/pages/settings/index.vue'],
verbose: process.env.FRONTEND_SEARCH_INDEX_VERBOSE === 'true',
}] satisfies SearchIndexOptions[];