mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-10-26 19:14:12 +00:00 
			
		
		
		
	refactor
This commit is contained in:
		
							parent
							
								
									95b9284e79
								
							
						
					
					
						commit
						6a5ef5b6f2
					
				
					 81 changed files with 342 additions and 354 deletions
				
			
		|  | @ -62,9 +62,8 @@ module.exports = { | |||
| 		'vue/max-attributes-per-line': 'off', | ||||
| 		'vue/html-self-closing': 'off', | ||||
| 		'vue/singleline-html-element-content-newline': 'off', | ||||
| 		// (vue/vue3-recommended disabled the autofix for Vue 2 compatibility)
 | ||||
| 		'vue/v-on-event-hyphenation': ['warn', 'always', { autofix: true }], | ||||
| 		'vue/attribute-hyphenation': ['warn', 'never'], | ||||
| 		'vue/v-on-event-hyphenation': ['error', 'never', { autofix: true }], | ||||
| 		'vue/attribute-hyphenation': ['error', 'never'], | ||||
| 	}, | ||||
| 	globals: { | ||||
| 		// Node.js
 | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkWindow ref="uiWindow" :initial-width="400" :initial-height="500" :can-resize="true" @closed="emit('closed')"> | ||||
| <MkWindow ref="uiWindow" :initialWidth="400" :initialHeight="500" :canResize="true" @closed="emit('closed')"> | ||||
| 	<template #header> | ||||
| 		<i class="ti ti-exclamation-circle" style="margin-right: 0.5em;"></i> | ||||
| 		<I18n :src="i18n.ts.reportAbuseOf" tag="span"> | ||||
|  | @ -8,7 +8,7 @@ | |||
| 			</template> | ||||
| 		</I18n> | ||||
| 	</template> | ||||
| 	<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 	<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 		<div class="_gaps_m" :class="$style.root"> | ||||
| 			<div class=""> | ||||
| 				<MkTextarea v-model="comment"> | ||||
|  |  | |||
|  | @ -7,11 +7,11 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts" setup> | ||||
| import { ref } from 'vue'; | ||||
| import { UserLite } from 'misskey-js/built/entities'; | ||||
| import MkMention from './MkMention.vue'; | ||||
| import { i18n } from '@/i18n'; | ||||
| import { host as localHost } from '@/config'; | ||||
| import { ref } from 'vue'; | ||||
| import { UserLite } from 'misskey-js/built/entities'; | ||||
| import { api } from '@/os'; | ||||
| 
 | ||||
| const user = ref<UserLite>(); | ||||
|  |  | |||
|  | @ -11,29 +11,29 @@ | |||
| 	<div v-else-if="c.type === 'buttons'" class="_buttons" :style="{ justifyContent: align }"> | ||||
| 		<MkButton v-for="button in c.buttons" :primary="button.primary" :rounded="button.rounded" :disabled="button.disabled" inline :small="size === 'small'" @click="button.onClick">{{ button.text }}</MkButton> | ||||
| 	</div> | ||||
| 	<MkSwitch v-else-if="c.type === 'switch'" :model-value="valueForSwitch" @update:model-value="onSwitchUpdate"> | ||||
| 	<MkSwitch v-else-if="c.type === 'switch'" :modelValue="valueForSwitch" @update:modelValue="onSwitchUpdate"> | ||||
| 		<template v-if="c.label" #label>{{ c.label }}</template> | ||||
| 		<template v-if="c.caption" #caption>{{ c.caption }}</template> | ||||
| 	</MkSwitch> | ||||
| 	<MkTextarea v-else-if="c.type === 'textarea'" :model-value="c.default" @update:model-value="c.onInput"> | ||||
| 	<MkTextarea v-else-if="c.type === 'textarea'" :modelValue="c.default" @update:modelValue="c.onInput"> | ||||
| 		<template v-if="c.label" #label>{{ c.label }}</template> | ||||
| 		<template v-if="c.caption" #caption>{{ c.caption }}</template> | ||||
| 	</MkTextarea> | ||||
| 	<MkInput v-else-if="c.type === 'textInput'" :small="size === 'small'" :model-value="c.default" @update:model-value="c.onInput"> | ||||
| 	<MkInput v-else-if="c.type === 'textInput'" :small="size === 'small'" :modelValue="c.default" @update:modelValue="c.onInput"> | ||||
| 		<template v-if="c.label" #label>{{ c.label }}</template> | ||||
| 		<template v-if="c.caption" #caption>{{ c.caption }}</template> | ||||
| 	</MkInput> | ||||
| 	<MkInput v-else-if="c.type === 'numberInput'" :small="size === 'small'" :model-value="c.default" type="number" @update:model-value="c.onInput"> | ||||
| 	<MkInput v-else-if="c.type === 'numberInput'" :small="size === 'small'" :modelValue="c.default" type="number" @update:modelValue="c.onInput"> | ||||
| 		<template v-if="c.label" #label>{{ c.label }}</template> | ||||
| 		<template v-if="c.caption" #caption>{{ c.caption }}</template> | ||||
| 	</MkInput> | ||||
| 	<MkSelect v-else-if="c.type === 'select'" :small="size === 'small'" :model-value="c.default" @update:model-value="c.onChange"> | ||||
| 	<MkSelect v-else-if="c.type === 'select'" :small="size === 'small'" :modelValue="c.default" @update:modelValue="c.onChange"> | ||||
| 		<template v-if="c.label" #label>{{ c.label }}</template> | ||||
| 		<template v-if="c.caption" #caption>{{ c.caption }}</template> | ||||
| 		<option v-for="item in c.items" :key="item.value" :value="item.value">{{ item.text }}</option> | ||||
| 	</MkSelect> | ||||
| 	<MkButton v-else-if="c.type === 'postFormButton'" :primary="c.primary" :rounded="c.rounded" :small="size === 'small'" inline @click="openPostForm">{{ c.text }}</MkButton> | ||||
| 	<MkFolder v-else-if="c.type === 'folder'" :default-open="c.opened"> | ||||
| 	<MkFolder v-else-if="c.type === 'folder'" :defaultOpen="c.opened"> | ||||
| 		<template #label>{{ c.title }}</template> | ||||
| 		<template v-for="child in c.children" :key="child"> | ||||
| 			<MkAsUi v-if="!g(child).hidden" :component="g(child)" :components="props.components" :size="size"/> | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| <template> | ||||
| <div> | ||||
| 	<div v-for="user in users" :key="user.id" style="display:inline-block;width:32px;height:32px;margin-right:8px;"> | ||||
| 		<MkAvatar :user="user" style="width:32px;height:32px;" indicator link preview/> | ||||
| 		<MkAvatar :user="user" style="width:32px; height:32px;" indicator link preview/> | ||||
| 	</div> | ||||
| </div> | ||||
| </template> | ||||
|  |  | |||
|  | @ -1,8 +1,8 @@ | |||
| <template> | ||||
| <div class="cbbedffa"> | ||||
| <div :class="$style.root"> | ||||
| 	<canvas ref="chartEl"></canvas> | ||||
| 	<MkChartLegend ref="legendEl" style="margin-top: 8px;"/> | ||||
| 	<div v-if="fetching" class="fetching"> | ||||
| 	<div v-if="fetching" :class="$style.fetching"> | ||||
| 		<MkLoading/> | ||||
| 	</div> | ||||
| </div> | ||||
|  | @ -817,22 +817,22 @@ onMounted(() => { | |||
| /* eslint-enable id-denylist */ | ||||
| </script> | ||||
| 
 | ||||
| <style lang="scss" scoped> | ||||
| .cbbedffa { | ||||
| <style lang="scss" module> | ||||
| .root { | ||||
| 	position: relative; | ||||
| } | ||||
| 
 | ||||
| 	> .fetching { | ||||
| 		position: absolute; | ||||
| 		top: 0; | ||||
| 		left: 0; | ||||
| 		width: 100%; | ||||
| 		height: 100%; | ||||
| 		-webkit-backdrop-filter: var(--blur, blur(12px)); | ||||
| 		backdrop-filter: var(--blur, blur(12px)); | ||||
| 		display: flex; | ||||
| 		justify-content: center; | ||||
| 		align-items: center; | ||||
| 		cursor: wait; | ||||
| 	} | ||||
| .fetching { | ||||
| 	position: absolute; | ||||
| 	top: 0; | ||||
| 	left: 0; | ||||
| 	width: 100%; | ||||
| 	height: 100%; | ||||
| 	-webkit-backdrop-filter: var(--blur, blur(12px)); | ||||
| 	backdrop-filter: var(--blur, blur(12px)); | ||||
| 	display: flex; | ||||
| 	justify-content: center; | ||||
| 	align-items: center; | ||||
| 	cursor: wait; | ||||
| } | ||||
| </style> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkTooltip ref="tooltip" :showing="showing" :x="x" :y="y" :max-width="340" :direction="'top'" :inner-margin="16" @closed="emit('closed')"> | ||||
| <MkTooltip ref="tooltip" :showing="showing" :x="x" :y="y" :maxWidth="340" :direction="'top'" :innerMargin="16" @closed="emit('closed')"> | ||||
| 	<div v-if="title || series"> | ||||
| 		<div v-if="title" :class="$style.title">{{ title }}</div> | ||||
| 		<template v-if="series"> | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ | |||
| 			<slot name="header"></slot> | ||||
| 		</div> | ||||
| 		<div :class="$style.headerSub"> | ||||
| 			<slot name="func" :button-style-class="$style.headerButton"></slot> | ||||
| 			<slot name="func" :buttonStyleClass="$style.headerButton"></slot> | ||||
| 			<button v-if="foldable" :class="$style.headerButton" class="_button" @click="() => showBody = !showBody"> | ||||
| 				<template v-if="showBody"><i class="ti ti-chevron-up"></i></template> | ||||
| 				<template v-else><i class="ti ti-chevron-down"></i></template> | ||||
|  | @ -14,14 +14,14 @@ | |||
| 		</div> | ||||
| 	</header> | ||||
| 	<Transition | ||||
| 		:enter-active-class="defaultStore.state.animation ? $style.transition_toggle_enterActive : ''" | ||||
| 		:leave-active-class="defaultStore.state.animation ? $style.transition_toggle_leaveActive : ''" | ||||
| 		:enter-from-class="defaultStore.state.animation ? $style.transition_toggle_enterFrom : ''" | ||||
| 		:leave-to-class="defaultStore.state.animation ? $style.transition_toggle_leaveTo : ''" | ||||
| 		:enterActiveClass="defaultStore.state.animation ? $style.transition_toggle_enterActive : ''" | ||||
| 		:leaveActiveClass="defaultStore.state.animation ? $style.transition_toggle_leaveActive : ''" | ||||
| 		:enterFromClass="defaultStore.state.animation ? $style.transition_toggle_enterFrom : ''" | ||||
| 		:leaveToClass="defaultStore.state.animation ? $style.transition_toggle_leaveTo : ''" | ||||
| 		@enter="enter" | ||||
| 		@after-enter="afterEnter" | ||||
| 		@afterEnter="afterEnter" | ||||
| 		@leave="leave" | ||||
| 		@after-leave="afterLeave" | ||||
| 		@afterLeave="afterLeave" | ||||
| 	> | ||||
| 		<div v-show="showBody" ref="contentEl" :class="[$style.content, { [$style.omitted]: omitted }]"> | ||||
| 			<slot></slot> | ||||
|  |  | |||
|  | @ -1,10 +1,10 @@ | |||
| <template> | ||||
| <Transition | ||||
| 	appear | ||||
| 	:enter-active-class="defaultStore.state.animation ? $style.transition_fade_enterActive : ''" | ||||
| 	:leave-active-class="defaultStore.state.animation ? $style.transition_fade_leaveActive : ''" | ||||
| 	:enter-from-class="defaultStore.state.animation ? $style.transition_fade_enterFrom : ''" | ||||
| 	:leave-to-class="defaultStore.state.animation ? $style.transition_fade_leaveTo : ''" | ||||
| 	:enterActiveClass="defaultStore.state.animation ? $style.transition_fade_enterActive : ''" | ||||
| 	:leaveActiveClass="defaultStore.state.animation ? $style.transition_fade_leaveActive : ''" | ||||
| 	:enterFromClass="defaultStore.state.animation ? $style.transition_fade_enterFrom : ''" | ||||
| 	:leaveToClass="defaultStore.state.animation ? $style.transition_fade_leaveTo : ''" | ||||
| > | ||||
| 	<div ref="rootEl" :class="$style.root" :style="{ zIndex }" @contextmenu.prevent.stop="() => {}"> | ||||
| 		<MkMenu :items="items" :align="'left'" @close="$emit('closed')"/> | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
| 	:width="800" | ||||
| 	:height="500" | ||||
| 	:scroll="false" | ||||
| 	:with-ok-button="true" | ||||
| 	:withOkButton="true" | ||||
| 	@close="cancel()" | ||||
| 	@ok="ok()" | ||||
| 	@closed="$emit('closed')" | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkModal ref="modal" :prefer-type="'dialog'" :z-priority="'high'" @click="done(true)" @closed="emit('closed')"> | ||||
| <MkModal ref="modal" :preferType="'dialog'" :zPriority="'high'" @click="done(true)" @closed="emit('closed')"> | ||||
| 	<div :class="$style.root"> | ||||
| 		<div v-if="icon" :class="$style.icon"> | ||||
| 			<i :class="icon"></i> | ||||
|  |  | |||
|  | @ -1,13 +1,13 @@ | |||
| <template> | ||||
| <div class="drylbebk" | ||||
| 	:class="{ draghover }" | ||||
| <div | ||||
| 	:class="[$style.root, { [$style.draghover]: draghover }]" | ||||
| 	@click="onClick" | ||||
| 	@dragover.prevent.stop="onDragover" | ||||
| 	@dragenter="onDragenter" | ||||
| 	@dragleave="onDragleave" | ||||
| 	@drop.stop="onDrop" | ||||
| > | ||||
| 	<i v-if="folder == null" class="ti ti-cloud"></i> | ||||
| 	<i v-if="folder == null" class="ti ti-cloud" style="margin-right: 4px;"></i> | ||||
| 	<span>{{ folder == null ? i18n.ts.drive : folder.name }}</span> | ||||
| </div> | ||||
| </template> | ||||
|  | @ -130,18 +130,10 @@ function onDrop(ev: DragEvent) { | |||
| } | ||||
| </script> | ||||
| 
 | ||||
| <style lang="scss" scoped> | ||||
| .drylbebk { | ||||
| 	> * { | ||||
| 		pointer-events: none; | ||||
| 	} | ||||
| 
 | ||||
| <style lang="scss" module> | ||||
| .root { | ||||
| 	&.draghover { | ||||
| 		background: #eee; | ||||
| 	} | ||||
| 
 | ||||
| 	> i { | ||||
| 		margin-right: 4px; | ||||
| 	} | ||||
| } | ||||
| </style> | ||||
|  |  | |||
|  | @ -4,21 +4,21 @@ | |||
| 		<div class="path" @contextmenu.prevent.stop="() => {}"> | ||||
| 			<XNavFolder | ||||
| 				:class="{ current: folder == null }" | ||||
| 				:parent-folder="folder" | ||||
| 				:parentFolder="folder" | ||||
| 				@move="move" | ||||
| 				@upload="upload" | ||||
| 				@remove-file="removeFile" | ||||
| 				@remove-folder="removeFolder" | ||||
| 				@removeFile="removeFile" | ||||
| 				@removeFolder="removeFolder" | ||||
| 			/> | ||||
| 			<template v-for="f in hierarchyFolders"> | ||||
| 				<span class="separator"><i class="ti ti-chevron-right"></i></span> | ||||
| 				<XNavFolder | ||||
| 					:folder="f" | ||||
| 					:parent-folder="folder" | ||||
| 					:parentFolder="folder" | ||||
| 					@move="move" | ||||
| 					@upload="upload" | ||||
| 					@remove-file="removeFile" | ||||
| 					@remove-folder="removeFolder" | ||||
| 					@removeFile="removeFile" | ||||
| 					@removeFolder="removeFolder" | ||||
| 				/> | ||||
| 			</template> | ||||
| 			<span v-if="folder != null" class="separator"><i class="ti ti-chevron-right"></i></span> | ||||
|  | @ -43,13 +43,13 @@ | |||
| 					v-anim="i" | ||||
| 					class="folder" | ||||
| 					:folder="f" | ||||
| 					:select-mode="select === 'folder'" | ||||
| 					:is-selected="selectedFolders.some(x => x.id === f.id)" | ||||
| 					:selectMode="select === 'folder'" | ||||
| 					:isSelected="selectedFolders.some(x => x.id === f.id)" | ||||
| 					@chosen="chooseFolder" | ||||
| 					@move="move" | ||||
| 					@upload="upload" | ||||
| 					@remove-file="removeFile" | ||||
| 					@remove-folder="removeFolder" | ||||
| 					@removeFile="removeFile" | ||||
| 					@removeFolder="removeFolder" | ||||
| 					@dragstart="isDragSource = true" | ||||
| 					@dragend="isDragSource = false" | ||||
| 				/> | ||||
|  | @ -64,8 +64,8 @@ | |||
| 					v-anim="i" | ||||
| 					class="file" | ||||
| 					:file="file" | ||||
| 					:select-mode="select === 'file'" | ||||
| 					:is-selected="selectedFiles.some(x => x.id === file.id)" | ||||
| 					:selectMode="select === 'file'" | ||||
| 					:isSelected="selectedFiles.some(x => x.id === file.id)" | ||||
| 					@chosen="chooseFile" | ||||
| 					@dragstart="isDragSource = true" | ||||
| 					@dragend="isDragSource = false" | ||||
|  |  | |||
|  | @ -1,16 +1,16 @@ | |||
| <template> | ||||
| <div ref="thumbnail" class="zdjebgpv"> | ||||
| <div ref="thumbnail" :class="$style.root"> | ||||
| 	<ImgWithBlurhash v-if="isThumbnailAvailable" :hash="file.blurhash" :src="file.thumbnailUrl" :alt="file.name" :title="file.name" :cover="fit !== 'contain'"/> | ||||
| 	<i v-else-if="is === 'image'" class="ti ti-photo icon"></i> | ||||
| 	<i v-else-if="is === 'video'" class="ti ti-video icon"></i> | ||||
| 	<i v-else-if="is === 'audio' || is === 'midi'" class="ti ti-file-music icon"></i> | ||||
| 	<i v-else-if="is === 'csv'" class="ti ti-file-text icon"></i> | ||||
| 	<i v-else-if="is === 'pdf'" class="ti ti-file-text icon"></i> | ||||
| 	<i v-else-if="is === 'textfile'" class="ti ti-file-text icon"></i> | ||||
| 	<i v-else-if="is === 'archive'" class="ti ti-file-zip icon"></i> | ||||
| 	<i v-else class="ti ti-file icon"></i> | ||||
| 	<i v-else-if="is === 'image'" class="ti ti-photo" :class="$style.icon"></i> | ||||
| 	<i v-else-if="is === 'video'" class="ti ti-video" :class="$style.icon"></i> | ||||
| 	<i v-else-if="is === 'audio' || is === 'midi'" class="ti ti-file-music" :class="$style.icon"></i> | ||||
| 	<i v-else-if="is === 'csv'" class="ti ti-file-text" :class="$style.icon"></i> | ||||
| 	<i v-else-if="is === 'pdf'" class="ti ti-file-text" :class="$style.icon"></i> | ||||
| 	<i v-else-if="is === 'textfile'" class="ti ti-file-text" :class="$style.icon"></i> | ||||
| 	<i v-else-if="is === 'archive'" class="ti ti-file-zip" :class="$style.icon"></i> | ||||
| 	<i v-else class="ti ti-file" :class="$style.icon"></i> | ||||
| 
 | ||||
| 	<i v-if="isThumbnailAvailable && is === 'video'" class="ti ti-video icon-sub"></i> | ||||
| 	<i v-if="isThumbnailAvailable && is === 'video'" class="ti ti-video" :class="$style.iconSub"></i> | ||||
| </div> | ||||
| </template> | ||||
| 
 | ||||
|  | @ -53,28 +53,28 @@ const isThumbnailAvailable = computed(() => { | |||
| }); | ||||
| </script> | ||||
| 
 | ||||
| <style lang="scss" scoped> | ||||
| .zdjebgpv { | ||||
| <style lang="scss" module> | ||||
| .root { | ||||
| 	position: relative; | ||||
| 	display: flex; | ||||
| 	background: var(--panel); | ||||
| 	border-radius: 8px; | ||||
| 	overflow: clip; | ||||
| } | ||||
| 
 | ||||
| 	> .icon-sub { | ||||
| 		position: absolute; | ||||
| 		width: 30%; | ||||
| 		height: auto; | ||||
| 		margin: 0; | ||||
| 		right: 4%; | ||||
| 		bottom: 4%; | ||||
| 	} | ||||
| .iconSub { | ||||
| 	position: absolute; | ||||
| 	width: 30%; | ||||
| 	height: auto; | ||||
| 	margin: 0; | ||||
| 	right: 4%; | ||||
| 	bottom: 4%; | ||||
| } | ||||
| 
 | ||||
| 	> .icon { | ||||
| 		pointer-events: none; | ||||
| 		margin: auto; | ||||
| 		font-size: 32px; | ||||
| 		color: #777; | ||||
| 	} | ||||
| .icon { | ||||
| 	pointer-events: none; | ||||
| 	margin: auto; | ||||
| 	font-size: 32px; | ||||
| 	color: #777; | ||||
| } | ||||
| </style> | ||||
|  |  | |||
|  | @ -3,8 +3,8 @@ | |||
| 	ref="dialog" | ||||
| 	:width="800" | ||||
| 	:height="500" | ||||
| 	:with-ok-button="true" | ||||
| 	:ok-button-disabled="(type === 'file') && (selected.length === 0)" | ||||
| 	:withOkButton="true" | ||||
| 	:okButtonDisabled="(type === 'file') && (selected.length === 0)" | ||||
| 	@click="cancel()" | ||||
| 	@close="cancel()" | ||||
| 	@ok="ok()" | ||||
|  | @ -14,7 +14,7 @@ | |||
| 		{{ multiple ? ((type === 'file') ? i18n.ts.selectFiles : i18n.ts.selectFolders) : ((type === 'file') ? i18n.ts.selectFile : i18n.ts.selectFolder) }} | ||||
| 		<span v-if="selected.length > 0" style="margin-left: 8px; opacity: 0.5;">({{ number(selected.length) }})</span> | ||||
| 	</template> | ||||
| 	<XDrive :multiple="multiple" :select="type" @change-selection="onChangeSelection" @selected="ok()"/> | ||||
| 	<XDrive :multiple="multiple" :select="type" @changeSelection="onChangeSelection" @selected="ok()"/> | ||||
| </MkModalWindow> | ||||
| </template> | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,15 +1,15 @@ | |||
| <template> | ||||
| <MkWindow | ||||
| 	ref="window" | ||||
| 	:initial-width="800" | ||||
| 	:initial-height="500" | ||||
| 	:can-resize="true" | ||||
| 	:initialWidth="800" | ||||
| 	:initialHeight="500" | ||||
| 	:canResize="true" | ||||
| 	@closed="emit('closed')" | ||||
| > | ||||
| 	<template #header> | ||||
| 		{{ i18n.ts.drive }} | ||||
| 	</template> | ||||
| 	<XDrive :initial-folder="initialFolder"/> | ||||
| 	<XDrive :initialFolder="initialFolder"/> | ||||
| </MkWindow> | ||||
| </template> | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,10 +2,10 @@ | |||
| <MkModal | ||||
| 	ref="modal" | ||||
| 	v-slot="{ type, maxHeight }" | ||||
| 	:z-priority="'middle'" | ||||
| 	:prefer-type="asReactionPicker && defaultStore.state.reactionPickerUseDrawerForMobile === false ? 'popup' : 'auto'" | ||||
| 	:transparent-bg="true" | ||||
| 	:manual-showing="manualShowing" | ||||
| 	:zPriority="'middle'" | ||||
| 	:preferType="asReactionPicker && defaultStore.state.reactionPickerUseDrawerForMobile === false ? 'popup' : 'auto'" | ||||
| 	:transparentBg="true" | ||||
| 	:manualShowing="manualShowing" | ||||
| 	:src="src" | ||||
| 	@click="modal?.close()" | ||||
| 	@opening="opening" | ||||
|  | @ -16,9 +16,9 @@ | |||
| 		ref="picker" | ||||
| 		class="ryghynhb _popup _shadow" | ||||
| 		:class="{ drawer: type === 'drawer' }" | ||||
| 		:show-pinned="showPinned" | ||||
| 		:as-reaction-picker="asReactionPicker" | ||||
| 		:as-drawer="type === 'drawer'" | ||||
| 		:showPinned="showPinned" | ||||
| 		:asReactionPicker="asReactionPicker" | ||||
| 		:asDrawer="type === 'drawer'" | ||||
| 		:max-height="maxHeight" | ||||
| 		@chosen="chosen" | ||||
| 	/> | ||||
|  |  | |||
|  | @ -1,13 +1,14 @@ | |||
| <template> | ||||
| <MkWindow ref="window" | ||||
| 	:initial-width="300" | ||||
| 	:initial-height="290" | ||||
| 	:can-resize="true" | ||||
| <MkWindow | ||||
| 	ref="window" | ||||
| 	:initialWidth="300" | ||||
| 	:initialHeight="290" | ||||
| 	:canResize="true" | ||||
| 	:mini="true" | ||||
| 	:front="true" | ||||
| 	@closed="emit('closed')" | ||||
| > | ||||
| 	<MkEmojiPicker :show-pinned="showPinned" :as-reaction-picker="asReactionPicker" as-window :class="$style.picker" @chosen="chosen"/> | ||||
| 	<MkEmojiPicker :showPinned="showPinned" :asReactionPicker="asReactionPicker" asWindow :class="$style.picker" @chosen="chosen"/> | ||||
| </MkWindow> | ||||
| </template> | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,14 +3,14 @@ | |||
| 	ref="dialog" | ||||
| 	:width="400" | ||||
| 	:height="450" | ||||
| 	:with-ok-button="true" | ||||
| 	:ok-button-disabled="false" | ||||
| 	:withOkButton="true" | ||||
| 	:okButtonDisabled="false" | ||||
| 	@ok="ok()" | ||||
| 	@close="dialog.close()" | ||||
| 	@closed="emit('closed')" | ||||
| > | ||||
| 	<template #header>{{ i18n.ts.describeFile }}</template> | ||||
| 	<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 	<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 		<MkDriveFileThumbnail :file="file" fit="contain" style="height: 100px; margin-bottom: 16px;"/> | ||||
| 		<MkTextarea v-model="caption" autofocus :placeholder="i18n.ts.inputNewDescription"> | ||||
| 			<template #label>{{ i18n.ts.caption }}</template> | ||||
|  |  | |||
|  | @ -1,9 +1,9 @@ | |||
| <template> | ||||
| <div ref="el" class="ssazuxis"> | ||||
| 	<header class="_button" :style="{ background: bg }" @click="showBody = !showBody"> | ||||
| 		<div class="title"><div><slot name="header"></slot></div></div> | ||||
| 		<div class="divider"></div> | ||||
| 		<button class="_button"> | ||||
| <div ref="el" :class="$style.root"> | ||||
| 	<header :class="$style.header" class="_button" :style="{ background: bg }" @click="showBody = !showBody"> | ||||
| 		<div :class="$style.title"><div><slot name="header"></slot></div></div> | ||||
| 		<div :class="$style.divider"></div> | ||||
| 		<button class="_button" :class="$style.button"> | ||||
| 			<template v-if="showBody"><i class="ti ti-chevron-up"></i></template> | ||||
| 			<template v-else><i class="ti ti-chevron-down"></i></template> | ||||
| 		</button> | ||||
|  | @ -11,9 +11,9 @@ | |||
| 	<Transition | ||||
| 		:name="defaultStore.state.animation ? 'folder-toggle' : ''" | ||||
| 		@enter="enter" | ||||
| 		@after-enter="afterEnter" | ||||
| 		@afterEnter="afterEnter" | ||||
| 		@leave="leave" | ||||
| 		@after-leave="afterLeave" | ||||
| 		@afterLeave="afterLeave" | ||||
| 	> | ||||
| 		<div v-show="showBody"> | ||||
| 			<slot></slot> | ||||
|  | @ -86,7 +86,7 @@ onMounted(() => { | |||
| }); | ||||
| </script> | ||||
| 
 | ||||
| <style lang="scss" scoped> | ||||
| <style lang="scss" module> | ||||
| .folder-toggle-enter-active, .folder-toggle-leave-active { | ||||
| 	overflow-y: clip; | ||||
| 	transition: opacity 0.5s, height 0.5s !important; | ||||
|  | @ -98,45 +98,41 @@ onMounted(() => { | |||
| 	opacity: 0; | ||||
| } | ||||
| 
 | ||||
| .ssazuxis { | ||||
| .root { | ||||
| 	position: relative; | ||||
| } | ||||
| 
 | ||||
| 	> header { | ||||
| 		display: flex; | ||||
| 		position: relative; | ||||
| 		z-index: 10; | ||||
| 		position: sticky; | ||||
| 		top: var(--stickyTop, 0px); | ||||
| 		-webkit-backdrop-filter: var(--blur, blur(8px)); | ||||
| 		backdrop-filter: var(--blur, blur(20px)); | ||||
| .header { | ||||
| 	display: flex; | ||||
| 	position: relative; | ||||
| 	z-index: 10; | ||||
| 	position: sticky; | ||||
| 	top: var(--stickyTop, 0px); | ||||
| 	-webkit-backdrop-filter: var(--blur, blur(8px)); | ||||
| 	backdrop-filter: var(--blur, blur(20px)); | ||||
| } | ||||
| 
 | ||||
| 		> .title { | ||||
| 			display: grid; | ||||
| 			place-content: center; | ||||
| 			margin: 0; | ||||
| 			padding: 12px 16px 12px 0; | ||||
| 		} | ||||
| .title { | ||||
| 	display: grid; | ||||
| 	place-content: center; | ||||
| 	margin: 0; | ||||
| 	padding: 12px 16px 12px 0; | ||||
| } | ||||
| 
 | ||||
| 		> .divider { | ||||
| 			flex: 1; | ||||
| 			margin: auto; | ||||
| 			height: 1px; | ||||
| 			background: var(--divider); | ||||
| 		} | ||||
| .divider { | ||||
| 	flex: 1; | ||||
| 	margin: auto; | ||||
| 	height: 1px; | ||||
| 	background: var(--divider); | ||||
| } | ||||
| 
 | ||||
| 		> button { | ||||
| 			padding: 12px 0 12px 16px; | ||||
| 		} | ||||
| 	} | ||||
| .button { | ||||
| 	padding: 12px 0 12px 16px; | ||||
| } | ||||
| 
 | ||||
| @container (max-width: 500px) { | ||||
| 	.ssazuxis { | ||||
| 		> header { | ||||
| 			> .title { | ||||
| 				padding: 8px 10px 8px 0; | ||||
| 			} | ||||
| 		} | ||||
| 	.title { | ||||
| 		padding: 8px 10px 8px 0; | ||||
| 	} | ||||
| } | ||||
| </style> | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ | |||
| 				<div :class="$style.headerIcon"><slot name="icon"></slot></div> | ||||
| 				<div :class="$style.headerText"> | ||||
| 					<div :class="$style.headerTextMain"> | ||||
| 						<MkCondensedLine :min-scale="2 / 3"><slot name="label"></slot></MkCondensedLine> | ||||
| 						<MkCondensedLine :minScale="2 / 3"><slot name="label"></slot></MkCondensedLine> | ||||
| 					</div> | ||||
| 					<div :class="$style.headerTextSub"> | ||||
| 						<slot name="caption"></slot> | ||||
|  | @ -22,18 +22,18 @@ | |||
| 
 | ||||
| 		<div v-if="openedAtLeastOnce" :class="[$style.body, { [$style.bgSame]: bgSame }]" :style="{ maxHeight: maxHeight ? `${maxHeight}px` : null, overflow: maxHeight ? `auto` : null }" :aria-hidden="!opened"> | ||||
| 			<Transition | ||||
| 				:enter-active-class="defaultStore.state.animation ? $style.transition_toggle_enterActive : ''" | ||||
| 				:leave-active-class="defaultStore.state.animation ? $style.transition_toggle_leaveActive : ''" | ||||
| 				:enter-from-class="defaultStore.state.animation ? $style.transition_toggle_enterFrom : ''" | ||||
| 				:leave-to-class="defaultStore.state.animation ? $style.transition_toggle_leaveTo : ''" | ||||
| 				:enterActiveClass="defaultStore.state.animation ? $style.transition_toggle_enterActive : ''" | ||||
| 				:leaveActiveClass="defaultStore.state.animation ? $style.transition_toggle_leaveActive : ''" | ||||
| 				:enterFromClass="defaultStore.state.animation ? $style.transition_toggle_enterFrom : ''" | ||||
| 				:leaveToClass="defaultStore.state.animation ? $style.transition_toggle_leaveTo : ''" | ||||
| 				@enter="enter" | ||||
| 				@after-enter="afterEnter" | ||||
| 				@afterEnter="afterEnter" | ||||
| 				@leave="leave" | ||||
| 				@after-leave="afterLeave" | ||||
| 				@afterLeave="afterLeave" | ||||
| 			> | ||||
| 				<KeepAlive> | ||||
| 					<div v-show="opened"> | ||||
| 						<MkSpacer :margin-min="14" :margin-max="22"> | ||||
| 						<MkSpacer :marginMin="14" :marginMax="22"> | ||||
| 							<slot></slot> | ||||
| 						</MkSpacer> | ||||
| 					</div> | ||||
|  |  | |||
|  | @ -2,9 +2,9 @@ | |||
| <MkModalWindow | ||||
| 	ref="dialog" | ||||
| 	:width="450" | ||||
| 	:can-close="false" | ||||
| 	:with-ok-button="true" | ||||
| 	:ok-button-disabled="false" | ||||
| 	:canClose="false" | ||||
| 	:withOkButton="true" | ||||
| 	:okButtonDisabled="false" | ||||
| 	@click="cancel()" | ||||
| 	@ok="ok()" | ||||
| 	@close="cancel()" | ||||
|  | @ -14,7 +14,7 @@ | |||
| 		{{ title }} | ||||
| 	</template> | ||||
| 
 | ||||
| 	<MkSpacer :margin-min="20" :margin-max="32"> | ||||
| 	<MkSpacer :marginMin="20" :marginMax="32"> | ||||
| 		<div class="_gaps_m"> | ||||
| 			<template v-for="item in Object.keys(form).filter(item => !form[item].hidden)"> | ||||
| 				<MkInput v-if="form[item].type === 'number'" v-model="values[item]" type="number" :step="form[item].step || 1"> | ||||
|  | @ -41,7 +41,7 @@ | |||
| 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ i18n.ts.optional }})</span></template> | ||||
| 					<option v-for="item in form[item].options" :key="item.value" :value="item.value">{{ item.label }}</option> | ||||
| 				</MkRadios> | ||||
| 				<MkRange v-else-if="form[item].type === 'range'" v-model="values[item]" :min="form[item].min" :max="form[item].max" :step="form[item].step" :text-converter="form[item].textConverter"> | ||||
| 				<MkRange v-else-if="form[item].type === 'range'" v-model="values[item]" :min="form[item].min" :max="form[item].max" :step="form[item].step" :textConverter="form[item].textConverter"> | ||||
| 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ i18n.ts.optional }})</span></template> | ||||
| 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template> | ||||
| 				</MkRange> | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ | |||
| 				}" | ||||
| 				:src="post.files[0].thumbnailUrl" | ||||
| 				:hash="post.files[0].blurhash" | ||||
| 				:force-blurhash="!show" | ||||
| 				:forceBlurhash="!show" | ||||
| 			/> | ||||
| 		</Transition> | ||||
| 	</div> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkModal ref="modal" :z-priority="'middle'" @click="modal.close()" @closed="emit('closed')"> | ||||
| <MkModal ref="modal" :zPriority="'middle'" @click="modal.close()" @closed="emit('closed')"> | ||||
| 	<div class="xubzgfga"> | ||||
| 		<header>{{ image.name }}</header> | ||||
| 		<img :src="image.url" :alt="image.comment" :title="image.comment" @click="modal.close()"/> | ||||
|  |  | |||
|  | @ -2,12 +2,12 @@ | |||
| <div ref="root" :class="[$style.root, { [$style.cover]: cover }]" :title="title ?? ''"> | ||||
| 	<TransitionGroup | ||||
| 		:duration="defaultStore.state.animation && props.transition?.duration || undefined" | ||||
| 		:enter-active-class="defaultStore.state.animation && props.transition?.enterActiveClass || undefined" | ||||
| 		:leave-active-class="defaultStore.state.animation && (props.transition?.leaveActiveClass ?? $style['transition_leaveActive']) || undefined" | ||||
| 		:enter-from-class="defaultStore.state.animation && props.transition?.enterFromClass || undefined" | ||||
| 		:leave-to-class="defaultStore.state.animation && props.transition?.leaveToClass || undefined" | ||||
| 		:enter-to-class="defaultStore.state.animation && props.transition?.enterToClass || undefined" | ||||
| 		:leave-from-class="defaultStore.state.animation && props.transition?.leaveFromClass || undefined" | ||||
| 		:enterActiveClass="defaultStore.state.animation && props.transition?.enterActiveClass || undefined" | ||||
| 		:leaveActiveClass="defaultStore.state.animation && (props.transition?.leaveActiveClass ?? $style['transition_leaveActive']) || undefined" | ||||
| 		:enterFromClass="defaultStore.state.animation && props.transition?.enterFromClass || undefined" | ||||
| 		:leaveToClass="defaultStore.state.animation && props.transition?.leaveToClass || undefined" | ||||
| 		:enterToClass="defaultStore.state.animation && props.transition?.enterToClass || undefined" | ||||
| 		:leaveFromClass="defaultStore.state.animation && props.transition?.leaveFromClass || undefined" | ||||
| 	> | ||||
| 		<canvas v-show="hide" key="canvas" ref="canvas" :class="$style.canvas" :width="canvasWidth" :height="canvasHeight" :title="title ?? undefined"/> | ||||
| 		<img v-show="!hide" key="img" ref="img" :height="imgHeight" :width="imgWidth" :class="$style.img" :src="src ?? undefined" :title="title ?? undefined" :alt="alt ?? undefined" loading="eager" decoding="async"/> | ||||
|  | @ -16,10 +16,10 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { $ref } from 'vue/macros'; | ||||
| import DrawBlurhash from '@/workers/draw-blurhash?worker'; | ||||
| import TestWebGL2 from '@/workers/test-webgl2?worker'; | ||||
| import { WorkerMultiDispatch } from '@/scripts/worker-multi-dispatch'; | ||||
| import { $ref } from 'vue/macros'; | ||||
| import { extractAvgColorFromBlurhash } from '@/scripts/extract-avg-color-from-blurhash'; | ||||
| 
 | ||||
| const workerPromise = new Promise<WorkerMultiDispatch | null>(resolve => { | ||||
|  |  | |||
|  | @ -1,9 +1,9 @@ | |||
| <template> | ||||
| <div class="alqyeyti" :class="{ oneline }"> | ||||
| 	<div class="key"> | ||||
| <div :class="[$style.root, { [$style.oneline]: oneline }]"> | ||||
| 	<div :class="$style.key"> | ||||
| 		<slot name="key"></slot> | ||||
| 	</div> | ||||
| 	<div class="value"> | ||||
| 	<div :class="$style.value"> | ||||
| 		<slot name="value"></slot> | ||||
| 		<button v-if="copy" v-tooltip="i18n.ts.copy" class="_textButton" style="margin-left: 0.5em;" @click="copy_"><i class="ti ti-copy"></i></button> | ||||
| 	</div> | ||||
|  | @ -30,24 +30,18 @@ const copy_ = () => { | |||
| }; | ||||
| </script> | ||||
| 
 | ||||
| <style lang="scss" scoped> | ||||
| .alqyeyti { | ||||
| 	> .key { | ||||
| 		font-size: 0.85em; | ||||
| 		padding: 0 0 0.25em 0; | ||||
| 		opacity: 0.75; | ||||
| 	} | ||||
| 
 | ||||
| <style lang="scss" module> | ||||
| .root { | ||||
| 	&.oneline { | ||||
| 		display: flex; | ||||
| 
 | ||||
| 		> .key { | ||||
| 		.key { | ||||
| 			width: 30%; | ||||
| 			font-size: 1em; | ||||
| 			padding: 0 8px 0 0; | ||||
| 		} | ||||
| 
 | ||||
| 		> .value { | ||||
| 		.value { | ||||
| 			width: 70%; | ||||
| 			white-space: nowrap; | ||||
| 			overflow: hidden; | ||||
|  | @ -55,4 +49,10 @@ const copy_ = () => { | |||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| .key { | ||||
| 	font-size: 0.85em; | ||||
| 	padding: 0 0 0.25em 0; | ||||
| 	opacity: 0.75; | ||||
| } | ||||
| </style> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkModal ref="modal" v-slot="{ type, maxHeight }" :prefer-type="preferedModalType" :anchor="anchor" :transparent-bg="true" :src="src" @click="modal.close()" @closed="emit('closed')"> | ||||
| <MkModal ref="modal" v-slot="{ type, maxHeight }" :preferType="preferedModalType" :anchor="anchor" :transparentBg="true" :src="src" @click="modal.close()" @closed="emit('closed')"> | ||||
| 	<div class="szkkfdyq _popup _shadow" :class="{ asDrawer: type === 'drawer' }" :style="{ maxHeight: maxHeight ? maxHeight + 'px' : '' }"> | ||||
| 		<div class="main"> | ||||
| 			<template v-for="item in items"> | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ | |||
| 		<ImgWithBlurhash | ||||
| 			:hash="image.blurhash" | ||||
| 			:src="(defaultStore.state.enableDataSaverMode && hide) ? null : url" | ||||
| 			:force-blurhash="hide" | ||||
| 			:forceBlurhash="hide" | ||||
| 			:cover="hide" | ||||
| 			:alt="image.comment || image.name" | ||||
| 			:title="image.comment || image.name" | ||||
|  |  | |||
|  | @ -27,8 +27,8 @@ | |||
| <script lang="ts" setup> | ||||
| import { ref } from 'vue'; | ||||
| import * as misskey from 'misskey-js'; | ||||
| import bytes from '@/filters/bytes'; | ||||
| import VuePlyr from 'vue-plyr'; | ||||
| import bytes from '@/filters/bytes'; | ||||
| import { defaultStore } from '@/store'; | ||||
| import 'vue-plyr/dist/vue-plyr.css'; | ||||
| import { i18n } from '@/i18n'; | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| <template> | ||||
| <div ref="el" :class="$style.root"> | ||||
| 	<MkMenu :items="items" :align="align" :width="width" :as-drawer="false" @close="onChildClosed"/> | ||||
| 	<MkMenu :items="items" :align="align" :width="width" :asDrawer="false" @close="onChildClosed"/> | ||||
| </div> | ||||
| </template> | ||||
| 
 | ||||
|  |  | |||
|  | @ -50,7 +50,7 @@ | |||
| 		</span> | ||||
| 	</div> | ||||
| 	<div v-if="childMenu" :class="$style.child"> | ||||
| 		<XChild ref="child" :items="childMenu" :target-element="childTarget" :root-element="itemsEl" showing @actioned="childActioned"/> | ||||
| 		<XChild ref="child" :items="childMenu" :targetElement="childTarget" :rootElement="itemsEl" showing @actioned="childActioned"/> | ||||
| 	</div> | ||||
| </div> | ||||
| </template> | ||||
|  |  | |||
|  | @ -1,11 +1,11 @@ | |||
| <template> | ||||
| <Transition | ||||
| 	:name="transitionName" | ||||
| 	:enter-active-class="$style['transition_' + transitionName + '_enterActive']" | ||||
| 	:leave-active-class="$style['transition_' + transitionName + '_leaveActive']" | ||||
| 	:enter-from-class="$style['transition_' + transitionName + '_enterFrom']" | ||||
| 	:leave-to-class="$style['transition_' + transitionName + '_leaveTo']" | ||||
| 	:duration="transitionDuration" appear @after-leave="emit('closed')" @enter="emit('opening')" @after-enter="onOpened" | ||||
| 	:enterActiveClass="$style['transition_' + transitionName + '_enterActive']" | ||||
| 	:leaveActiveClass="$style['transition_' + transitionName + '_leaveActive']" | ||||
| 	:enterFromClass="$style['transition_' + transitionName + '_enterFrom']" | ||||
| 	:leaveToClass="$style['transition_' + transitionName + '_leaveTo']" | ||||
| 	:duration="transitionDuration" appear @afterLeave="emit('closed')" @enter="emit('opening')" @afterEnter="onOpened" | ||||
| > | ||||
| 	<div v-show="manualShowing != null ? manualShowing : showing" v-hotkey.global="keymap" :class="[$style.root, { [$style.drawer]: type === 'drawer', [$style.dialog]: type === 'dialog', [$style.popup]: type === 'popup' }]" :style="{ zIndex, pointerEvents: (manualShowing != null ? manualShowing : showing) ? 'auto' : 'none', '--transformOrigin': transformOrigin }"> | ||||
| 		<div data-cy-bg :data-cy-transparent="isEnableBgTransparent" class="_modalBg" :class="[$style.bg, { [$style.bgTransparent]: isEnableBgTransparent }]" :style="{ zIndex }" @click="onBgClick" @mousedown="onBgClick" @contextmenu.prevent.stop="() => {}"></div> | ||||
|  |  | |||
|  | @ -55,17 +55,17 @@ | |||
| 					<div :class="$style.text"> | ||||
| 						<span v-if="appearNote.isHidden" style="opacity: 0.5">({{ i18n.ts.private }})</span> | ||||
| 						<MkA v-if="appearNote.replyId" :class="$style.replyIcon" :to="`/notes/${appearNote.replyId}`"><i class="ti ti-arrow-back-up"></i></MkA> | ||||
| 						<Mfm v-if="appearNote.text" :text="appearNote.text" :author="appearNote.user" :i="$i" :emoji-urls="appearNote.emojis"/> | ||||
| 						<Mfm v-if="appearNote.text" :text="appearNote.text" :author="appearNote.user" :i="$i" :emojiUrls="appearNote.emojis"/> | ||||
| 						<div v-if="translating || translation" :class="$style.translation"> | ||||
| 							<MkLoading v-if="translating" mini/> | ||||
| 							<div v-else :class="$style.translated"> | ||||
| 								<b>{{ i18n.t('translatedFrom', { x: translation.sourceLang }) }}: </b> | ||||
| 								<Mfm :text="translation.text" :author="appearNote.user" :i="$i" :emoji-urls="appearNote.emojis"/> | ||||
| 								<Mfm :text="translation.text" :author="appearNote.user" :i="$i" :emojiUrls="appearNote.emojis"/> | ||||
| 							</div> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 					<div v-if="appearNote.files.length > 0" :class="$style.files"> | ||||
| 						<MkMediaList :media-list="appearNote.files"/> | ||||
| 						<MkMediaList :mediaList="appearNote.files"/> | ||||
| 					</div> | ||||
| 					<MkPoll v-if="appearNote.poll" :note="appearNote" :class="$style.poll"/> | ||||
| 					<MkUrlPreview v-for="url in urls" :key="url" :url="url" :compact="true" :detail="false" :class="$style.urlPreview"/> | ||||
|  | @ -79,7 +79,7 @@ | |||
| 				</div> | ||||
| 				<MkA v-if="appearNote.channel && !inChannel" :class="$style.channel" :to="`/channels/${appearNote.channel.id}`"><i class="ti ti-device-tv"></i> {{ appearNote.channel.name }}</MkA> | ||||
| 			</div> | ||||
| 			<MkReactionsViewer :note="appearNote" :max-number="16"> | ||||
| 			<MkReactionsViewer :note="appearNote" :maxNumber="16"> | ||||
| 				<template #more> | ||||
| 					<button class="_button" :class="$style.reactionDetailsButton" @click="showReactions"> | ||||
| 						{{ i18n.ts.more }} | ||||
|  |  | |||
|  | @ -65,18 +65,18 @@ | |||
| 					<div class="text"> | ||||
| 						<span v-if="appearNote.isHidden" style="opacity: 0.5">({{ i18n.ts.private }})</span> | ||||
| 						<MkA v-if="appearNote.replyId" class="reply" :to="`/notes/${appearNote.replyId}`"><i class="ti ti-arrow-back-up"></i></MkA> | ||||
| 						<Mfm v-if="appearNote.text" :text="appearNote.text" :author="appearNote.user" :i="$i" :emoji-urls="appearNote.emojis"/> | ||||
| 						<Mfm v-if="appearNote.text" :text="appearNote.text" :author="appearNote.user" :i="$i" :emojiUrls="appearNote.emojis"/> | ||||
| 						<a v-if="appearNote.renote != null" class="rp">RN:</a> | ||||
| 						<div v-if="translating || translation" class="translation"> | ||||
| 							<MkLoading v-if="translating" mini/> | ||||
| 							<div v-else class="translated"> | ||||
| 								<b>{{ i18n.t('translatedFrom', { x: translation.sourceLang }) }}: </b> | ||||
| 								<Mfm :text="translation.text" :author="appearNote.user" :i="$i" :emoji-urls="appearNote.emojis"/> | ||||
| 								<Mfm :text="translation.text" :author="appearNote.user" :i="$i" :emojiUrls="appearNote.emojis"/> | ||||
| 							</div> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 					<div v-if="appearNote.files.length > 0" class="files"> | ||||
| 						<MkMediaList :media-list="appearNote.files"/> | ||||
| 						<MkMediaList :mediaList="appearNote.files"/> | ||||
| 					</div> | ||||
| 					<MkPoll v-if="appearNote.poll" ref="pollViewer" :note="appearNote" class="poll"/> | ||||
| 					<MkUrlPreview v-for="url in urls" :key="url" :url="url" :compact="true" :detail="true" class="url-preview"/> | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 		<MkNoteHeader :class="$style.header" :note="note" :mini="true"/> | ||||
| 		<div> | ||||
| 			<p v-if="note.cw != null" :class="$style.cw"> | ||||
| 				<Mfm v-if="note.cw != ''" style="margin-right: 8px;" :text="note.cw" :author="note.user" :i="$i" :emoji-urls="note.emojis"/> | ||||
| 				<Mfm v-if="note.cw != ''" style="margin-right: 8px;" :text="note.cw" :author="note.user" :i="$i" :emojiUrls="note.emojis"/> | ||||
| 				<MkCwButton v-model="showContent" :note="note"/> | ||||
| 			</p> | ||||
| 			<div v-show="note.cw == null || showContent"> | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ | |||
| 				:items="notes" | ||||
| 				:direction="pagination.reversed ? 'up' : 'down'" | ||||
| 				:reversed="pagination.reversed" | ||||
| 				:no-gap="noGap" | ||||
| 				:noGap="noGap" | ||||
| 				:ad="true" | ||||
| 				:class="$style.notes" | ||||
| 			> | ||||
|  |  | |||
|  | @ -20,8 +20,8 @@ | |||
| 				v-else-if="notification.type === 'reaction'" | ||||
| 				ref="reactionRef" | ||||
| 				:reaction="notification.reaction ? notification.reaction.replace(/^:(\w+):$/, ':$1@.:') : notification.reaction" | ||||
| 				:custom-emojis="notification.note.emojis" | ||||
| 				:no-style="true" | ||||
| 				:customEmojis="notification.note.emojis" | ||||
| 				:noStyle="true" | ||||
| 				style="width: 100%; height: 100%;" | ||||
| 			/> | ||||
| 		</div> | ||||
|  |  | |||
|  | @ -3,15 +3,15 @@ | |||
| 	ref="dialog" | ||||
| 	:width="400" | ||||
| 	:height="450" | ||||
| 	:with-ok-button="true" | ||||
| 	:ok-button-disabled="false" | ||||
| 	:withOkButton="true" | ||||
| 	:okButtonDisabled="false" | ||||
| 	@ok="ok()" | ||||
| 	@close="dialog?.close()" | ||||
| 	@closed="emit('closed')" | ||||
| > | ||||
| 	<template #header>{{ i18n.ts.notificationSetting }}</template> | ||||
| 
 | ||||
| 	<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 	<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 		<div class="_gaps_m"> | ||||
| 			<template v-if="showGlobalToggle"> | ||||
| 				<MkSwitch v-model="useGlobalSetting"> | ||||
|  |  | |||
|  | @ -8,9 +8,9 @@ | |||
| 	</template> | ||||
| 
 | ||||
| 	<template #default="{ items: notifications }"> | ||||
| 		<MkDateSeparatedList v-slot="{ item: notification }" :class="$style.list" :items="notifications" :no-gap="true"> | ||||
| 		<MkDateSeparatedList v-slot="{ item: notification }" :class="$style.list" :items="notifications" :noGap="true"> | ||||
| 			<MkNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :key="notification.id" :note="notification.note"/> | ||||
| 			<XNotification v-else :key="notification.id" :notification="notification" :with-time="true" :full="true" class="_panel notification"/> | ||||
| 			<XNotification v-else :key="notification.id" :notification="notification" :withTime="true" :full="true" class="_panel notification"/> | ||||
| 		</MkDateSeparatedList> | ||||
| 	</template> | ||||
| </MkPagination> | ||||
|  |  | |||
|  | @ -1,12 +1,12 @@ | |||
| <template> | ||||
| <MkWindow | ||||
| 	ref="windowEl" | ||||
| 	:initial-width="500" | ||||
| 	:initial-height="500" | ||||
| 	:can-resize="true" | ||||
| 	:close-button="true" | ||||
| 	:buttons-left="buttonsLeft" | ||||
| 	:buttons-right="buttonsRight" | ||||
| 	:initialWidth="500" | ||||
| 	:initialHeight="500" | ||||
| 	:canResize="true" | ||||
| 	:closeButton="true" | ||||
| 	:buttonsLeft="buttonsLeft" | ||||
| 	:buttonsRight="buttonsRight" | ||||
| 	:contextmenu="contextmenu" | ||||
| 	@closed="$emit('closed')" | ||||
| > | ||||
|  |  | |||
|  | @ -1,9 +1,9 @@ | |||
| <template> | ||||
| <Transition | ||||
| 	:enter-active-class="defaultStore.state.animation ? $style.transition_fade_enterActive : ''" | ||||
| 	:leave-active-class="defaultStore.state.animation ? $style.transition_fade_leaveActive : ''" | ||||
| 	:enter-from-class="defaultStore.state.animation ? $style.transition_fade_enterFrom : ''" | ||||
| 	:leave-to-class="defaultStore.state.animation ? $style.transition_fade_leaveTo : ''" | ||||
| 	:enterActiveClass="defaultStore.state.animation ? $style.transition_fade_enterActive : ''" | ||||
| 	:leaveActiveClass="defaultStore.state.animation ? $style.transition_fade_leaveActive : ''" | ||||
| 	:enterFromClass="defaultStore.state.animation ? $style.transition_fade_enterFrom : ''" | ||||
| 	:leaveToClass="defaultStore.state.animation ? $style.transition_fade_leaveTo : ''" | ||||
| 	mode="out-in" | ||||
| > | ||||
| 	<MkLoading v-if="fetching"/> | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 	</p> | ||||
| 	<ul> | ||||
| 		<li v-for="(choice, i) in choices" :key="i"> | ||||
| 			<MkInput class="input" small :model-value="choice" :placeholder="i18n.t('_poll.choiceN', { n: i + 1 })" @update:model-value="onInput(i, $event)"> | ||||
| 			<MkInput class="input" small :modelValue="choice" :placeholder="i18n.t('_poll.choiceN', { n: i + 1 })" @update:modelValue="onInput(i, $event)"> | ||||
| 			</MkInput> | ||||
| 			<button class="_button" @click="remove(i)"> | ||||
| 				<i class="ti ti-x"></i> | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| <template> | ||||
| <MkModal ref="modal" v-slot="{ type, maxHeight }" :z-priority="'high'" :src="src" :transparent-bg="true" @click="modal.close()" @close="emit('closing')" @closed="emit('closed')"> | ||||
| 	<MkMenu :items="items" :align="align" :width="width" :max-height="maxHeight" :as-drawer="type === 'drawer'" :class="{ [$style.drawer]: type === 'drawer' }" @close="modal.close()"/> | ||||
| <MkModal ref="modal" v-slot="{ type, maxHeight }" :zPriority="'high'" :src="src" :transparentBg="true" @click="modal.close()" @close="emit('closing')" @closed="emit('closed')"> | ||||
| 	<MkMenu :items="items" :align="align" :width="width" :max-height="maxHeight" :asDrawer="type === 'drawer'" :class="{ [$style.drawer]: type === 'drawer' }" @close="modal.close()"/> | ||||
| </MkModal> | ||||
| </template> | ||||
| 
 | ||||
|  |  | |||
|  | @ -66,7 +66,7 @@ | |||
| 		<div v-if="maxTextLength - textLength < 100" :class="['_acrylic', $style.textCount, { [$style.textOver]: textLength > maxTextLength }]">{{ maxTextLength - textLength }}</div> | ||||
| 	</div> | ||||
| 	<input v-show="withHashtags" ref="hashtagsInputEl" v-model="hashtags" :class="$style.hashtags" :placeholder="i18n.ts.hashtags" list="hashtags"> | ||||
| 	<XPostFormAttaches v-model="files" :class="$style.attaches" @detach="detachFile" @change-sensitive="updateFileSensitive" @change-name="updateFileName"/> | ||||
| 	<XPostFormAttaches v-model="files" :class="$style.attaches" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/> | ||||
| 	<MkPollEditor v-if="poll" v-model="poll" @destroyed="poll = null"/> | ||||
| 	<MkNotePreview v-if="showPreview" :class="$style.preview" :text="text"/> | ||||
| 	<div v-if="showingOptions" style="padding: 8px 16px;"> | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| <template> | ||||
| <div v-show="props.modelValue.length != 0" class="skeikyzd"> | ||||
| 	<Sortable :model-value="props.modelValue" class="files" item-key="id" :animation="150" :delay="100" :delay-on-touch-only="true" @update:model-value="v => emit('update:modelValue', v)"> | ||||
| 	<Sortable :modelValue="props.modelValue" class="files" itemKey="id" :animation="150" :delay="100" :delayOnTouchOnly="true" @update:modelValue="v => emit('update:modelValue', v)"> | ||||
| 		<template #item="{element}"> | ||||
| 			<div class="file" @click="showFileMenu(element, $event)" @contextmenu.prevent="showFileMenu(element, $event)"> | ||||
| 				<MkDriveFileThumbnail :data-id="element.id" class="thumbnail" :file="element" fit="cover"/> | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| <template> | ||||
| <MkModal ref="modal" :prefer-type="'dialog'" @click="modal.close()" @closed="onModalClosed()"> | ||||
| 	<MkPostForm ref="form" style="margin: 0 auto auto auto;" v-bind="props" autofocus freeze-after-posted @posted="onPosted" @cancel="modal.close()" @esc="modal.close()"/> | ||||
| <MkModal ref="modal" :preferType="'dialog'" @click="modal.close()" @closed="onModalClosed()"> | ||||
| 	<MkPostForm ref="form" style="margin: 0 auto auto auto;" v-bind="props" autofocus freezeAfterPosted @posted="onPosted" @cancel="modal.close()" @esc="modal.close()"/> | ||||
| </MkModal> | ||||
| </template> | ||||
| 
 | ||||
|  |  | |||
|  | @ -72,28 +72,28 @@ function subscribe() { | |||
| 		userVisibleOnly: true, | ||||
| 		applicationServerKey: urlBase64ToUint8Array(instance.swPublickey), | ||||
| 	}) | ||||
| 	.then(async subscription => { | ||||
| 		pushSubscription = subscription; | ||||
| 		.then(async subscription => { | ||||
| 			pushSubscription = subscription; | ||||
| 
 | ||||
| 		// Register | ||||
| 		pushRegistrationInServer = await api('sw/register', { | ||||
| 			endpoint: subscription.endpoint, | ||||
| 			auth: encode(subscription.getKey('auth')), | ||||
| 			publickey: encode(subscription.getKey('p256dh')), | ||||
| 		}); | ||||
| 	}, async err => { // When subscribe failed | ||||
| 			// Register | ||||
| 			pushRegistrationInServer = await api('sw/register', { | ||||
| 				endpoint: subscription.endpoint, | ||||
| 				auth: encode(subscription.getKey('auth')), | ||||
| 				publickey: encode(subscription.getKey('p256dh')), | ||||
| 			}); | ||||
| 		}, async err => { // When subscribe failed | ||||
| 		// 通知が許可されていなかったとき | ||||
| 		if (err?.name === 'NotAllowedError') { | ||||
| 			console.info('User denied the notification permission request.'); | ||||
| 			return; | ||||
| 		} | ||||
| 			if (err?.name === 'NotAllowedError') { | ||||
| 				console.info('User denied the notification permission request.'); | ||||
| 				return; | ||||
| 			} | ||||
| 
 | ||||
| 		// 違うapplicationServerKey (または gcm_sender_id)のサブスクリプションが | ||||
| 		// 既に存在していることが原因でエラーになった可能性があるので、 | ||||
| 		// そのサブスクリプションを解除しておく | ||||
| 		// (これは実行されなさそうだけど、おまじない的に古い実装から残してある) | ||||
| 		await unsubscribe(); | ||||
| 	}), null, null); | ||||
| 			// 違うapplicationServerKey (または gcm_sender_id)のサブスクリプションが | ||||
| 			// 既に存在していることが原因でエラーになった可能性があるので、 | ||||
| 			// そのサブスクリプションを解除しておく | ||||
| 			// (これは実行されなさそうだけど、おまじない的に古い実装から残してある) | ||||
| 			await unsubscribe(); | ||||
| 		}), null, null); | ||||
| } | ||||
| 
 | ||||
| async function unsubscribe() { | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ | |||
| > | ||||
| 	<template #header>{{ i18n.ts.reactionsList }}</template> | ||||
| 
 | ||||
| 	<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 	<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 		<div v-if="note" class="_gaps"> | ||||
| 			<div v-if="reactions.length === 0" class="_fullinfo"> | ||||
| 				<img src="https://xn--931a.moe/assets/info.jpg" class="_ghost"/> | ||||
|  | @ -22,7 +22,7 @@ | |||
| 					</button> | ||||
| 				</div> | ||||
| 				<MkA v-for="user in users" :key="user.id" :to="userPage(user)" @click="dialog.close()"> | ||||
| 					<MkUserCardMini :user="user" :with-chart="false"/> | ||||
| 					<MkUserCardMini :user="user" :withChart="false"/> | ||||
| 				</MkA> | ||||
| 			</template> | ||||
| 		</div> | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| <template> | ||||
| <MkCustomEmoji v-if="reaction[0] === ':'" :name="reaction" :normal="true" :no-style="noStyle" :url="emojiUrl"/> | ||||
| <MkEmoji v-else :emoji="reaction" :normal="true" :no-style="noStyle"/> | ||||
| <MkCustomEmoji v-if="reaction[0] === ':'" :name="reaction" :normal="true" :noStyle="noStyle" :url="emojiUrl"/> | ||||
| <MkEmoji v-else :emoji="reaction" :normal="true" :noStyle="noStyle"/> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts" setup> | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| <template> | ||||
| <MkTooltip ref="tooltip" :showing="showing" :target-element="targetElement" :max-width="340" @closed="emit('closed')"> | ||||
| <MkTooltip ref="tooltip" :showing="showing" :targetElement="targetElement" :maxWidth="340" @closed="emit('closed')"> | ||||
| 	<div :class="$style.root"> | ||||
| 		<MkReactionIcon :reaction="reaction" :class="$style.icon" :no-style="true"/> | ||||
| 		<MkReactionIcon :reaction="reaction" :class="$style.icon" :noStyle="true"/> | ||||
| 		<div :class="$style.name">{{ reaction.replace('@.', '') }}</div> | ||||
| 	</div> | ||||
| </MkTooltip> | ||||
|  |  | |||
|  | @ -1,8 +1,8 @@ | |||
| <template> | ||||
| <MkTooltip ref="tooltip" :showing="showing" :target-element="targetElement" :max-width="340" @closed="emit('closed')"> | ||||
| <MkTooltip ref="tooltip" :showing="showing" :targetElement="targetElement" :maxWidth="340" @closed="emit('closed')"> | ||||
| 	<div :class="$style.root"> | ||||
| 		<div :class="$style.reaction"> | ||||
| 			<MkReactionIcon :reaction="reaction" :class="$style.reactionIcon" :no-style="true"/> | ||||
| 			<MkReactionIcon :reaction="reaction" :class="$style.reactionIcon" :noStyle="true"/> | ||||
| 			<div :class="$style.reactionName">{{ getReactionName(reaction) }}</div> | ||||
| 		</div> | ||||
| 		<div :class="$style.users"> | ||||
|  |  | |||
|  | @ -1,13 +1,13 @@ | |||
| <template> | ||||
| <TransitionGroup | ||||
| 	:enter-active-class="defaultStore.state.animation ? $style.transition_x_enterActive : ''" | ||||
| 	:leave-active-class="defaultStore.state.animation ? $style.transition_x_leaveActive : ''" | ||||
| 	:enter-from-class="defaultStore.state.animation ? $style.transition_x_enterFrom : ''" | ||||
| 	:leave-to-class="defaultStore.state.animation ? $style.transition_x_leaveTo : ''" | ||||
| 	:move-class="defaultStore.state.animation ? $style.transition_x_move : ''" | ||||
| 	:enterActiveClass="defaultStore.state.animation ? $style.transition_x_enterActive : ''" | ||||
| 	:leaveActiveClass="defaultStore.state.animation ? $style.transition_x_leaveActive : ''" | ||||
| 	:enterFromClass="defaultStore.state.animation ? $style.transition_x_enterFrom : ''" | ||||
| 	:leaveToClass="defaultStore.state.animation ? $style.transition_x_leaveTo : ''" | ||||
| 	:moveClass="defaultStore.state.animation ? $style.transition_x_move : ''" | ||||
| 	tag="div" :class="$style.root" | ||||
| > | ||||
| 	<XReaction v-for="[reaction, count] in reactions" :key="reaction" :reaction="reaction" :count="count" :is-initial="initialReactions.has(reaction)" :note="note"/> | ||||
| 	<XReaction v-for="[reaction, count] in reactions" :key="reaction" :reaction="reaction" :count="count" :isInitial="initialReactions.has(reaction)" :note="note"/> | ||||
| 	<slot v-if="hasMoreReactions" name="more"/> | ||||
| </TransitionGroup> | ||||
| </template> | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ | |||
| > | ||||
| 	<template #header>{{ i18n.ts.renotesList }}</template> | ||||
| 
 | ||||
| 	<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 	<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 		<div v-if="renotes" class="_gaps"> | ||||
| 			<div v-if="renotes.length === 0" class="_fullinfo"> | ||||
| 				<img src="https://xn--931a.moe/assets/info.jpg" class="_ghost"/> | ||||
|  | @ -16,7 +16,7 @@ | |||
| 			</div> | ||||
| 			<template v-else> | ||||
| 				<MkA v-for="user in users" :key="user.id" :to="userPage(user)" @click="dialog.close()"> | ||||
| 					<MkUserCardMini :user="user" :with-chart="false"/> | ||||
| 					<MkUserCardMini :user="user" :withChart="false"/> | ||||
| 				</MkA> | ||||
| 			</template> | ||||
| 		</div> | ||||
|  |  | |||
|  | @ -6,11 +6,11 @@ | |||
| 			{{ message }} | ||||
| 		</MkInfo> | ||||
| 		<div v-if="!totpLogin" class="normal-signin _gaps_m"> | ||||
| 			<MkInput v-model="username" :placeholder="i18n.ts.username" type="text" pattern="^[a-zA-Z0-9_]+$" :spellcheck="false" autocomplete="username" autofocus required data-cy-signin-username @update:model-value="onUsernameChange"> | ||||
| 			<MkInput v-model="username" :placeholder="i18n.ts.username" type="text" pattern="^[a-zA-Z0-9_]+$" :spellcheck="false" autocomplete="username" autofocus required data-cy-signin-username @update:modelValue="onUsernameChange"> | ||||
| 				<template #prefix>@</template> | ||||
| 				<template #suffix>@{{ host }}</template> | ||||
| 			</MkInput> | ||||
| 			<MkInput v-if="!user || user && !user.usePasswordLessLogin" v-model="password" :placeholder="i18n.ts.password" type="password" autocomplete="current-password" :with-password-toggle="true" required data-cy-signin-password> | ||||
| 			<MkInput v-if="!user || user && !user.usePasswordLessLogin" v-model="password" :placeholder="i18n.ts.password" type="password" autocomplete="current-password" :withPasswordToggle="true" required data-cy-signin-password> | ||||
| 				<template #prefix><i class="ti ti-lock"></i></template> | ||||
| 				<template #caption><button class="_textButton" type="button" @click="resetPassword">{{ i18n.ts.forgotPassword }}</button></template> | ||||
| 			</MkInput> | ||||
|  | @ -28,7 +28,7 @@ | |||
| 			</div> | ||||
| 			<div class="twofa-group totp-group"> | ||||
| 				<p style="margin-bottom:0;">{{ i18n.ts.twoStepAuthentication }}</p> | ||||
| 				<MkInput v-if="user && user.usePasswordLessLogin" v-model="password" type="password" autocomplete="current-password" :with-password-toggle="true" required> | ||||
| 				<MkInput v-if="user && user.usePasswordLessLogin" v-model="password" type="password" autocomplete="current-password" :withPasswordToggle="true" required> | ||||
| 					<template #label>{{ i18n.ts.password }}</template> | ||||
| 					<template #prefix><i class="ti ti-lock"></i></template> | ||||
| 				</MkInput> | ||||
|  |  | |||
|  | @ -8,8 +8,8 @@ | |||
| > | ||||
| 	<template #header>{{ i18n.ts.login }}</template> | ||||
| 
 | ||||
| 	<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 		<MkSignin :auto-set="autoSet" :message="message" @login="onLogin"/> | ||||
| 	<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 		<MkSignin :autoSet="autoSet" :message="message" @login="onLogin"/> | ||||
| 	</MkSpacer> | ||||
| </MkModalWindow> | ||||
| </template> | ||||
|  |  | |||
|  | @ -3,13 +3,13 @@ | |||
| 	<div :class="$style.banner"> | ||||
| 		<i class="ti ti-user-edit"></i> | ||||
| 	</div> | ||||
| 	<MkSpacer :margin-min="20" :margin-max="32"> | ||||
| 	<MkSpacer :marginMin="20" :marginMax="32"> | ||||
| 		<form class="_gaps_m" autocomplete="new-password" @submit.prevent="onSubmit"> | ||||
| 			<MkInput v-if="instance.disableRegistration" v-model="invitationCode" type="text" :spellcheck="false" required> | ||||
| 				<template #label>{{ i18n.ts.invitationCode }}</template> | ||||
| 				<template #prefix><i class="ti ti-key"></i></template> | ||||
| 			</MkInput> | ||||
| 			<MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :spellcheck="false" required data-cy-signup-username @update:model-value="onChangeUsername"> | ||||
| 			<MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :spellcheck="false" required data-cy-signup-username @update:modelValue="onChangeUsername"> | ||||
| 				<template #label>{{ i18n.ts.username }} <div v-tooltip:dialog="i18n.ts.usernameInfo" class="_button _help"><i class="ti ti-help-circle"></i></div></template> | ||||
| 				<template #prefix>@</template> | ||||
| 				<template #suffix>@{{ host }}</template> | ||||
|  | @ -24,7 +24,7 @@ | |||
| 					<span v-else-if="usernameState === 'max-range'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts.tooLong }}</span> | ||||
| 				</template> | ||||
| 			</MkInput> | ||||
| 			<MkInput v-if="instance.emailRequiredForSignup" v-model="email" :debounce="true" type="email" :spellcheck="false" required data-cy-signup-email @update:model-value="onChangeEmail"> | ||||
| 			<MkInput v-if="instance.emailRequiredForSignup" v-model="email" :debounce="true" type="email" :spellcheck="false" required data-cy-signup-email @update:modelValue="onChangeEmail"> | ||||
| 				<template #label>{{ i18n.ts.emailAddress }} <div v-tooltip:dialog="i18n.ts._signup.emailAddressInfo" class="_button _help"><i class="ti ti-help-circle"></i></div></template> | ||||
| 				<template #prefix><i class="ti ti-mail"></i></template> | ||||
| 				<template #caption> | ||||
|  | @ -39,7 +39,7 @@ | |||
| 					<span v-else-if="emailState === 'error'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts.error }}</span> | ||||
| 				</template> | ||||
| 			</MkInput> | ||||
| 			<MkInput v-model="password" type="password" autocomplete="new-password" required data-cy-signup-password @update:model-value="onChangePassword"> | ||||
| 			<MkInput v-model="password" type="password" autocomplete="new-password" required data-cy-signup-password @update:modelValue="onChangePassword"> | ||||
| 				<template #label>{{ i18n.ts.password }}</template> | ||||
| 				<template #prefix><i class="ti ti-lock"></i></template> | ||||
| 				<template #caption> | ||||
|  | @ -48,7 +48,7 @@ | |||
| 					<span v-if="passwordStrength == 'high'" style="color: var(--success)"><i class="ti ti-check ti-fw"></i> {{ i18n.ts.strongPassword }}</span> | ||||
| 				</template> | ||||
| 			</MkInput> | ||||
| 			<MkInput v-model="retypedPassword" type="password" autocomplete="new-password" required data-cy-signup-password-retype @update:model-value="onChangePasswordRetype"> | ||||
| 			<MkInput v-model="retypedPassword" type="password" autocomplete="new-password" required data-cy-signup-password-retype @update:modelValue="onChangePasswordRetype"> | ||||
| 				<template #label>{{ i18n.ts.password }} ({{ i18n.ts.retype }})</template> | ||||
| 				<template #prefix><i class="ti ti-lock"></i></template> | ||||
| 				<template #caption> | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| 	<div :class="$style.banner"> | ||||
| 		<i class="ti ti-checklist"></i> | ||||
| 	</div> | ||||
| 	<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 	<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 		<div class="_gaps_m"> | ||||
| 			<div v-if="instance.disableRegistration"> | ||||
| 				<MkInfo warn>{{ i18n.ts.invitationRequiredToRegister }}</MkInfo> | ||||
|  | @ -11,7 +11,7 @@ | |||
| 
 | ||||
| 			<div style="text-align: center;">{{ i18n.ts.pleaseConfirmBelowBeforeSignup }}</div> | ||||
| 
 | ||||
| 			<MkFolder v-if="availableServerRules" :default-open="true"> | ||||
| 			<MkFolder v-if="availableServerRules" :defaultOpen="true"> | ||||
| 				<template #label>{{ i18n.ts.serverRules }}</template> | ||||
| 				<template #suffix><i v-if="agreeServerRules" class="ti ti-check" style="color: var(--success)"></i></template> | ||||
| 
 | ||||
|  | @ -22,7 +22,7 @@ | |||
| 				<MkSwitch v-model="agreeServerRules" style="margin-top: 16px;">{{ i18n.ts.agree }}</MkSwitch> | ||||
| 			</MkFolder> | ||||
| 
 | ||||
| 			<MkFolder v-if="availableTos" :default-open="true"> | ||||
| 			<MkFolder v-if="availableTos" :defaultOpen="true"> | ||||
| 				<template #label>{{ i18n.ts.termsOfService }}</template> | ||||
| 				<template #suffix><i v-if="agreeTos" class="ti ti-check" style="color: var(--success)"></i></template> | ||||
| 
 | ||||
|  | @ -31,7 +31,7 @@ | |||
| 				<MkSwitch v-model="agreeTos" style="margin-top: 16px;">{{ i18n.ts.agree }}</MkSwitch> | ||||
| 			</MkFolder> | ||||
| 
 | ||||
| 			<MkFolder :default-open="true"> | ||||
| 			<MkFolder :defaultOpen="true"> | ||||
| 				<template #label>{{ i18n.ts.basicNotesBeforeCreateAccount }}</template> | ||||
| 				<template #suffix><i v-if="agreeNote" class="ti ti-check" style="color: var(--success)"></i></template> | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,16 +11,16 @@ | |||
| 	<div style="overflow-x: clip;"> | ||||
| 		<Transition | ||||
| 			mode="out-in" | ||||
| 			:enter-active-class="$style.transition_x_enterActive" | ||||
| 			:leave-active-class="$style.transition_x_leaveActive" | ||||
| 			:enter-from-class="$style.transition_x_enterFrom" | ||||
| 			:leave-to-class="$style.transition_x_leaveTo" | ||||
| 			:enterActiveClass="$style.transition_x_enterActive" | ||||
| 			:leaveActiveClass="$style.transition_x_leaveActive" | ||||
| 			:enterFromClass="$style.transition_x_enterFrom" | ||||
| 			:leaveToClass="$style.transition_x_leaveTo" | ||||
| 		> | ||||
| 			<template v-if="!isAcceptedServerRule"> | ||||
| 				<XServerRules @done="isAcceptedServerRule = true" @cancel="dialog.close()"/> | ||||
| 			</template> | ||||
| 			<template v-else> | ||||
| 				<XSignup :auto-set="autoSet" @signup="onSignup" @signup-email-pending="onSignupEmailPending"/> | ||||
| 				<XSignup :autoSet="autoSet" @signup="onSignup" @signupEmailPending="onSignupEmailPending"/> | ||||
| 			</template> | ||||
| 		</Transition> | ||||
| 	</div> | ||||
|  |  | |||
|  | @ -4,12 +4,12 @@ | |||
| 		<span v-if="note.isHidden" style="opacity: 0.5">({{ i18n.ts.private }})</span> | ||||
| 		<span v-if="note.deletedAt" style="opacity: 0.5">({{ i18n.ts.deleted }})</span> | ||||
| 		<MkA v-if="note.replyId" :class="$style.reply" :to="`/notes/${note.replyId}`"><i class="ti ti-arrow-back-up"></i></MkA> | ||||
| 		<Mfm v-if="note.text" :text="note.text" :author="note.user" :i="$i" :emoji-urls="note.emojis"/> | ||||
| 		<Mfm v-if="note.text" :text="note.text" :author="note.user" :i="$i" :emojiUrls="note.emojis"/> | ||||
| 		<MkA v-if="note.renoteId" :class="$style.rp" :to="`/notes/${note.renoteId}`">RN: ...</MkA> | ||||
| 	</div> | ||||
| 	<details v-if="note.files.length > 0"> | ||||
| 		<summary>({{ i18n.t('withNFiles', { n: note.files.length }) }})</summary> | ||||
| 		<MkMediaList :media-list="note.files"/> | ||||
| 		<MkMediaList :mediaList="note.files"/> | ||||
| 	</details> | ||||
| 	<details v-if="note.poll"> | ||||
| 		<summary>{{ i18n.ts.poll }}</summary> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkNotes ref="tlComponent" :no-gap="!defaultStore.state.showGapBetweenNotesInTimeline" :pagination="pagination" @queue="emit('queue', $event)"/> | ||||
| <MkNotes ref="tlComponent" :noGap="!defaultStore.state.showGapBetweenNotesInTimeline" :pagination="pagination" @queue="emit('queue', $event)"/> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts" setup> | ||||
|  |  | |||
|  | @ -1,11 +1,11 @@ | |||
| <template> | ||||
| <div> | ||||
| 	<Transition | ||||
| 		:enter-active-class="defaultStore.state.animation ? $style.transition_toast_enterActive : ''" | ||||
| 		:leave-active-class="defaultStore.state.animation ? $style.transition_toast_leaveActive : ''" | ||||
| 		:enter-from-class="defaultStore.state.animation ? $style.transition_toast_enterFrom : ''" | ||||
| 		:leave-to-class="defaultStore.state.animation ? $style.transition_toast_leaveTo : ''" | ||||
| 		appear @after-leave="emit('closed')" | ||||
| 		:enterActiveClass="defaultStore.state.animation ? $style.transition_toast_enterActive : ''" | ||||
| 		:leaveActiveClass="defaultStore.state.animation ? $style.transition_toast_leaveActive : ''" | ||||
| 		:enterFromClass="defaultStore.state.animation ? $style.transition_toast_enterFrom : ''" | ||||
| 		:leaveToClass="defaultStore.state.animation ? $style.transition_toast_leaveTo : ''" | ||||
| 		appear @afterLeave="emit('closed')" | ||||
| 	> | ||||
| 		<div v-if="showing" class="_acrylic" :class="$style.root" :style="{ zIndex }"> | ||||
| 			<div style="padding: 16px 24px;"> | ||||
|  |  | |||
|  | @ -3,16 +3,16 @@ | |||
| 	ref="dialog" | ||||
| 	:width="400" | ||||
| 	:height="450" | ||||
| 	:with-ok-button="true" | ||||
| 	:ok-button-disabled="false" | ||||
| 	:can-close="false" | ||||
| 	:withOkButton="true" | ||||
| 	:okButtonDisabled="false" | ||||
| 	:canClose="false" | ||||
| 	@close="dialog.close()" | ||||
| 	@closed="$emit('closed')" | ||||
| 	@ok="ok()" | ||||
| > | ||||
| 	<template #header>{{ title || i18n.ts.generateAccessToken }}</template> | ||||
| 
 | ||||
| 	<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 	<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 		<div class="_gaps_m"> | ||||
| 			<div v-if="information"> | ||||
| 				<MkInfo warn>{{ information }}</MkInfo> | ||||
|  |  | |||
|  | @ -1,10 +1,10 @@ | |||
| <template> | ||||
| <Transition | ||||
| 	:enter-active-class="defaultStore.state.animation ? $style.transition_tooltip_enterActive : ''" | ||||
| 	:leave-active-class="defaultStore.state.animation ? $style.transition_tooltip_leaveActive : ''" | ||||
| 	:enter-from-class="defaultStore.state.animation ? $style.transition_tooltip_enterFrom : ''" | ||||
| 	:leave-to-class="defaultStore.state.animation ? $style.transition_tooltip_leaveTo : ''" | ||||
| 	appear @after-leave="emit('closed')" | ||||
| 	:enterActiveClass="defaultStore.state.animation ? $style.transition_tooltip_enterActive : ''" | ||||
| 	:leaveActiveClass="defaultStore.state.animation ? $style.transition_tooltip_leaveActive : ''" | ||||
| 	:enterFromClass="defaultStore.state.animation ? $style.transition_tooltip_enterFrom : ''" | ||||
| 	:leaveToClass="defaultStore.state.animation ? $style.transition_tooltip_leaveTo : ''" | ||||
| 	appear @afterLeave="emit('closed')" | ||||
| > | ||||
| 	<div v-show="showing" ref="el" :class="$style.root" class="_acrylic _shadow" :style="{ zIndex, maxWidth: maxWidth + 'px' }"> | ||||
| 		<slot> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkModal ref="modal" :z-priority="'middle'" @click="$refs.modal.close()" @closed="$emit('closed')"> | ||||
| <MkModal ref="modal" :zPriority="'middle'" @click="$refs.modal.close()" @closed="$emit('closed')"> | ||||
| 	<div :class="$style.root"> | ||||
| 		<div :class="$style.title"><MkSparkle>{{ i18n.ts.misskeyUpdated }}</MkSparkle></div> | ||||
| 		<div :class="$style.version">✨{{ version }}🚀</div> | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| <template> | ||||
| <div :class="$style.root" :style="{ zIndex, top: top + 'px', left: left + 'px' }"> | ||||
| 	<Transition :name="defaultStore.state.animation ? '_transition_zoom' : ''" @after-leave="emit('closed')"> | ||||
| 	<Transition :name="defaultStore.state.animation ? '_transition_zoom' : ''" @afterLeave="emit('closed')"> | ||||
| 		<MkUrlPreview v-if="showing" class="_popup _shadow" :url="url"/> | ||||
| 	</Transition> | ||||
| </div> | ||||
|  |  | |||
|  | @ -1,10 +1,10 @@ | |||
| <template> | ||||
| <Transition | ||||
| 	:enter-active-class="defaultStore.state.animation ? $style.transition_popup_enterActive : ''" | ||||
| 	:leave-active-class="defaultStore.state.animation ? $style.transition_popup_leaveActive : ''" | ||||
| 	:enter-from-class="defaultStore.state.animation ? $style.transition_popup_enterFrom : ''" | ||||
| 	:leave-to-class="defaultStore.state.animation ? $style.transition_popup_leaveTo : ''" | ||||
| 	appear @after-leave="emit('closed')" | ||||
| 	:enterActiveClass="defaultStore.state.animation ? $style.transition_popup_enterActive : ''" | ||||
| 	:leaveActiveClass="defaultStore.state.animation ? $style.transition_popup_leaveActive : ''" | ||||
| 	:enterFromClass="defaultStore.state.animation ? $style.transition_popup_enterFrom : ''" | ||||
| 	:leaveToClass="defaultStore.state.animation ? $style.transition_popup_leaveTo : ''" | ||||
| 	appear @afterLeave="emit('closed')" | ||||
| > | ||||
| 	<div v-if="showing" :class="$style.root" class="_popup _shadow" :style="{ zIndex, top: top + 'px', left: left + 'px' }" @mouseover="() => { emit('mouseover'); }" @mouseleave="() => { emit('mouseleave'); }"> | ||||
| 		<div v-if="user != null"> | ||||
|  |  | |||
|  | @ -1,8 +1,8 @@ | |||
| <template> | ||||
| <MkModalWindow | ||||
| 	ref="dialogEl" | ||||
| 	:with-ok-button="true" | ||||
| 	:ok-button-disabled="selected == null" | ||||
| 	:withOkButton="true" | ||||
| 	:okButtonDisabled="selected == null" | ||||
| 	@click="cancel()" | ||||
| 	@close="cancel()" | ||||
| 	@ok="ok()" | ||||
|  | @ -11,12 +11,12 @@ | |||
| 	<template #header>{{ i18n.ts.selectUser }}</template> | ||||
| 	<div :class="$style.root"> | ||||
| 		<div :class="$style.form"> | ||||
| 			<FormSplit :min-width="170"> | ||||
| 				<MkInput v-model="username" :autofocus="true" @update:model-value="search"> | ||||
| 			<FormSplit :minWidth="170"> | ||||
| 				<MkInput v-model="username" :autofocus="true" @update:modelValue="search"> | ||||
| 					<template #label>{{ i18n.ts.username }}</template> | ||||
| 					<template #prefix>@</template> | ||||
| 				</MkInput> | ||||
| 				<MkInput v-model="host" :datalist="[hostname]" @update:model-value="search"> | ||||
| 				<MkInput v-model="host" :datalist="[hostname]" @update:modelValue="search"> | ||||
| 					<template #label>{{ i18n.ts.host }}</template> | ||||
| 					<template #prefix>@</template> | ||||
| 				</MkInput> | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| <div class="_gaps"> | ||||
| 	<div style="text-align: center;">{{ i18n.ts._initialAccountSetting.followUsers }}</div> | ||||
| 
 | ||||
| 	<MkFolder :default-open="true"> | ||||
| 	<MkFolder :defaultOpen="true"> | ||||
| 		<template #label>{{ i18n.ts.recommended }}</template> | ||||
| 
 | ||||
| 		<MkPagination :pagination="pinnedUsers"> | ||||
|  | @ -14,7 +14,7 @@ | |||
| 		</MkPagination> | ||||
| 	</MkFolder> | ||||
| 
 | ||||
| 	<MkFolder :default-open="true"> | ||||
| 	<MkFolder :defaultOpen="true"> | ||||
| 		<template #label>{{ i18n.ts.popularUsers }}</template> | ||||
| 
 | ||||
| 		<MkPagination :pagination="popularUsers"> | ||||
|  |  | |||
|  | @ -12,11 +12,11 @@ | |||
| 		</div> | ||||
| 	</FormSlot> | ||||
| 
 | ||||
| 	<MkInput v-model="name" :max="30" manual-save data-cy-user-setup-user-name> | ||||
| 	<MkInput v-model="name" :max="30" manualSave data-cy-user-setup-user-name> | ||||
| 		<template #label>{{ i18n.ts._profile.name }}</template> | ||||
| 	</MkInput> | ||||
| 
 | ||||
| 	<MkTextarea v-model="description" :max="500" tall manual-save data-cy-user-setup-user-description> | ||||
| 	<MkTextarea v-model="description" :max="500" tall manualSave data-cy-user-setup-user-description> | ||||
| 		<template #label>{{ i18n.ts._profile.description }}</template> | ||||
| 	</MkTextarea> | ||||
| 
 | ||||
|  |  | |||
|  | @ -20,15 +20,15 @@ | |||
| 		</div> | ||||
| 		<Transition | ||||
| 			mode="out-in" | ||||
| 			:enter-active-class="$style.transition_x_enterActive" | ||||
| 			:leave-active-class="$style.transition_x_leaveActive" | ||||
| 			:enter-from-class="$style.transition_x_enterFrom" | ||||
| 			:leave-to-class="$style.transition_x_leaveTo" | ||||
| 			:enterActiveClass="$style.transition_x_enterActive" | ||||
| 			:leaveActiveClass="$style.transition_x_leaveActive" | ||||
| 			:enterFromClass="$style.transition_x_enterFrom" | ||||
| 			:leaveToClass="$style.transition_x_leaveTo" | ||||
| 		> | ||||
| 			<template v-if="page === 0"> | ||||
| 				<div :class="$style.centerPage"> | ||||
| 					<MkAnimBg style="position: absolute; top: 0;" :scale="1.5"/> | ||||
| 					<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 					<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 						<div class="_gaps" style="text-align: center;"> | ||||
| 							<i class="ti ti-confetti" style="display: block; margin: auto; font-size: 3em; color: var(--accent);"></i> | ||||
| 							<div style="font-size: 120%;">{{ i18n.ts._initialAccountSetting.accountCreated }}</div> | ||||
|  | @ -40,7 +40,7 @@ | |||
| 			</template> | ||||
| 			<template v-else-if="page === 1"> | ||||
| 				<div style="height: 100cqh; overflow: auto;"> | ||||
| 					<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 					<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 						<XProfile/> | ||||
| 						<div class="_buttonsCenter" style="margin-top: 16px;"> | ||||
| 							<MkButton primary rounded gradate data-cy-user-setup-continue @click="page++">{{ i18n.ts.continue }} <i class="ti ti-arrow-right"></i></MkButton> | ||||
|  | @ -50,7 +50,7 @@ | |||
| 			</template> | ||||
| 			<template v-else-if="page === 2"> | ||||
| 				<div style="height: 100cqh; overflow: auto;"> | ||||
| 					<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 					<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 						<XPrivacy/> | ||||
| 						<div class="_buttonsCenter" style="margin-top: 16px;"> | ||||
| 							<MkButton primary rounded gradate data-cy-user-setup-continue @click="page++">{{ i18n.ts.continue }} <i class="ti ti-arrow-right"></i></MkButton> | ||||
|  | @ -60,7 +60,7 @@ | |||
| 			</template> | ||||
| 			<template v-else-if="page === 3"> | ||||
| 				<div style="height: 100cqh; overflow: auto;"> | ||||
| 					<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 					<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 						<XFollow/> | ||||
| 					</MkSpacer> | ||||
| 					<div :class="$style.pageFooter"> | ||||
|  | @ -70,12 +70,12 @@ | |||
| 			</template> | ||||
| 			<template v-else-if="page === 4"> | ||||
| 				<div :class="$style.centerPage"> | ||||
| 					<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 					<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 						<div class="_gaps" style="text-align: center;"> | ||||
| 							<i class="ti ti-bell-ringing-2" style="display: block; margin: auto; font-size: 3em; color: var(--accent);"></i> | ||||
| 							<div style="font-size: 120%;">{{ i18n.ts.pushNotification }}</div> | ||||
| 							<div style="padding: 0 16px;">{{ i18n.t('_initialAccountSetting.pushNotificationDescription', { name: instance.name ?? host }) }}</div> | ||||
| 							<MkPushNotificationAllowButton primary show-only-to-register style="margin: 0 auto;"/> | ||||
| 							<MkPushNotificationAllowButton primary showOnlyToRegister style="margin: 0 auto;"/> | ||||
| 							<MkButton primary rounded gradate style="margin: 16px auto 0 auto;" data-cy-user-setup-continue @click="page++">{{ i18n.ts.continue }} <i class="ti ti-arrow-right"></i></MkButton> | ||||
| 						</div> | ||||
| 					</MkSpacer> | ||||
|  | @ -84,7 +84,7 @@ | |||
| 			<template v-else-if="page === 5"> | ||||
| 				<div :class="$style.centerPage"> | ||||
| 					<MkAnimBg style="position: absolute; top: 0;" :scale="1.5"/> | ||||
| 					<MkSpacer :margin-min="20" :margin-max="28"> | ||||
| 					<MkSpacer :marginMin="20" :marginMax="28"> | ||||
| 						<div class="_gaps" style="text-align: center;"> | ||||
| 							<i class="ti ti-check" style="display: block; margin: auto; font-size: 3em; color: var(--accent);"></i> | ||||
| 							<div style="font-size: 120%;">{{ i18n.ts._initialAccountSetting.initialAccountSettingCompleted }}</div> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkTooltip ref="tooltip" :showing="showing" :target-element="targetElement" :max-width="250" @closed="emit('closed')"> | ||||
| <MkTooltip ref="tooltip" :showing="showing" :targetElement="targetElement" :maxWidth="250" @closed="emit('closed')"> | ||||
| 	<div :class="$style.root"> | ||||
| 		<div v-for="u in users" :key="u.id" :class="$style.user"> | ||||
| 			<MkAvatar :class="$style.avatar" :user="u"/> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkModal ref="modal" v-slot="{ type }" :z-priority="'high'" :src="src" @click="modal.close()" @closed="emit('closed')"> | ||||
| <MkModal ref="modal" v-slot="{ type }" :zPriority="'high'" :src="src" @click="modal.close()" @closed="emit('closed')"> | ||||
| 	<div class="_popup" :class="{ [$style.root]: true, [$style.asDrawer]: type === 'drawer' }"> | ||||
| 		<div :class="[$style.label, $style.item]"> | ||||
| 			{{ i18n.ts.visibility }} | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkModal ref="modal" :prefer-type="'dialog'" :z-priority="'high'" @click="success ? done() : () => {}" @closed="emit('closed')"> | ||||
| <MkModal ref="modal" :preferType="'dialog'" :zPriority="'high'" @click="success ? done() : () => {}" @closed="emit('closed')"> | ||||
| 	<div :class="[$style.root, { [$style.iconOnly]: (text == null) || success }]"> | ||||
| 		<i v-if="success" :class="[$style.icon, $style.success]" class="ti ti-check"></i> | ||||
| 		<MkLoading v-else :class="[$style.icon, $style.waiting]" :em="true"/> | ||||
|  |  | |||
|  | @ -10,26 +10,26 @@ | |||
| 			<MkButton inline @click="$emit('exit')">{{ i18n.ts.close }}</MkButton> | ||||
| 		</header> | ||||
| 		<Sortable | ||||
| 			:model-value="props.widgets" | ||||
| 			item-key="id" | ||||
| 			:modelValue="props.widgets" | ||||
| 			itemKey="id" | ||||
| 			handle=".handle" | ||||
| 			:animation="150" | ||||
| 			:group="{ name: 'SortableMkWidgets' }" | ||||
| 			:class="$style['edit-editing']" | ||||
| 			@update:model-value="v => emit('updateWidgets', v)" | ||||
| 			@update:modelValue="v => emit('updateWidgets', v)" | ||||
| 		> | ||||
| 			<template #item="{element}"> | ||||
| 				<div :class="[$style.widget, $style['customize-container']]" data-cy-customize-container> | ||||
| 					<button :class="$style['customize-container-config']" class="_button" @click.prevent.stop="configWidget(element.id)"><i class="ti ti-settings"></i></button> | ||||
| 					<button :class="$style['customize-container-remove']" data-cy-customize-container-remove class="_button" @click.prevent.stop="removeWidget(element)"><i class="ti ti-x"></i></button> | ||||
| 					<div class="handle"> | ||||
| 						<component :is="`widget-${element.name}`" :ref="el => widgetRefs[element.id] = el" class="widget" :class="$style['customize-container-handle-widget']" :widget="element" @update-props="updateWidget(element.id, $event)"/> | ||||
| 						<component :is="`widget-${element.name}`" :ref="el => widgetRefs[element.id] = el" class="widget" :class="$style['customize-container-handle-widget']" :widget="element" @updateProps="updateWidget(element.id, $event)"/> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 			</template> | ||||
| 		</Sortable> | ||||
| 	</template> | ||||
| 	<component :is="`widget-${widget.name}`" v-for="widget in widgets" v-else :key="widget.id" :ref="el => widgetRefs[widget.id] = el" :class="$style.widget" :widget="widget" @update-props="updateWidget(widget.id, $event)" @contextmenu.stop="onContextmenu(widget, $event)"/> | ||||
| 	<component :is="`widget-${widget.name}`" v-for="widget in widgets" v-else :key="widget.id" :ref="el => widgetRefs[widget.id] = el" :class="$style.widget" :widget="widget" @updateProps="updateWidget(widget.id, $event)" @contextmenu.stop="onContextmenu(widget, $event)"/> | ||||
| </div> | ||||
| </template> | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,11 +1,11 @@ | |||
| <template> | ||||
| <Transition | ||||
| 	:enter-active-class="defaultStore.state.animation ? $style.transition_window_enterActive : ''" | ||||
| 	:leave-active-class="defaultStore.state.animation ? $style.transition_window_leaveActive : ''" | ||||
| 	:enter-from-class="defaultStore.state.animation ? $style.transition_window_enterFrom : ''" | ||||
| 	:leave-to-class="defaultStore.state.animation ? $style.transition_window_leaveTo : ''" | ||||
| 	:enterActiveClass="defaultStore.state.animation ? $style.transition_window_enterActive : ''" | ||||
| 	:leaveActiveClass="defaultStore.state.animation ? $style.transition_window_leaveActive : ''" | ||||
| 	:enterFromClass="defaultStore.state.animation ? $style.transition_window_enterFrom : ''" | ||||
| 	:leaveToClass="defaultStore.state.animation ? $style.transition_window_leaveTo : ''" | ||||
| 	appear | ||||
| 	@after-leave="$emit('closed')" | ||||
| 	@afterLeave="$emit('closed')" | ||||
| > | ||||
| 	<div v-if="showing" ref="rootEl" :class="[$style.root, { [$style.maximized]: maximized }]"> | ||||
| 		<div :class="$style.body" class="_shadow" @mousedown="onBodyMousedown" @keydown="onKeydown"> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkWindow :initial-width="640" :initial-height="402" :can-resize="true" :close-button="true"> | ||||
| <MkWindow :initialWidth="640" :initialHeight="402" :canResize="true" :closeButton="true"> | ||||
| 	<template #header> | ||||
| 		<i class="icon ti ti-brand-youtube" style="margin-right: 0.5em;"></i> | ||||
| 		<span>{{ title ?? 'YouTube' }}</span> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <MkCondensedLine v-if="defaultStore.state.enableCondensedLineForAcct" :min-scale="2 / 3"> | ||||
| <MkCondensedLine v-if="defaultStore.state.enableCondensedLineForAcct" :minScale="2 / 3"> | ||||
| 	<span>@{{ user.username }}</span> | ||||
| 	<span v-if="user.host || detail || defaultStore.state.showFullAcct" style="opacity: 0.5;">@{{ user.host || host }}</span> | ||||
| </MkCondensedLine> | ||||
|  |  | |||
|  | @ -24,13 +24,13 @@ | |||
| <script lang="ts" setup> | ||||
| import { watch } from 'vue'; | ||||
| import * as misskey from 'misskey-js'; | ||||
| import MkImgWithBlurhash from '../MkImgWithBlurhash.vue'; | ||||
| import MkA from './MkA.vue'; | ||||
| import { getStaticImageUrl } from '@/scripts/media-proxy'; | ||||
| import { extractAvgColorFromBlurhash } from '@/scripts/extract-avg-color-from-blurhash'; | ||||
| import { acct, userPage } from '@/filters/user'; | ||||
| import MkUserOnlineIndicator from '@/components/MkUserOnlineIndicator.vue'; | ||||
| import { defaultStore } from '@/store'; | ||||
| import MkImgWithBlurhash from '../MkImgWithBlurhash.vue'; | ||||
| 
 | ||||
| const animation = $ref(defaultStore.state.animation); | ||||
| const squareAvatars = $ref(defaultStore.state.squareAvatars); | ||||
|  |  | |||
|  | @ -15,8 +15,8 @@ | |||
| 					{{ t.title }} | ||||
| 				</div> | ||||
| 				<Transition | ||||
| 					v-else mode="in-out" @enter="enter" @after-enter="afterEnter" @leave="leave" | ||||
| 					@after-leave="afterLeave" | ||||
| 					v-else mode="in-out" @enter="enter" @afterEnter="afterEnter" @leave="leave" | ||||
| 					@afterLeave="afterLeave" | ||||
| 				> | ||||
| 					<div v-show="t.key === tab" :class="[$style.tabTitle, $style.animate]">{{ t.title }}</div> | ||||
| 				</Transition> | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ | |||
| 					</div> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 			<XTabs v-if="!narrow || hideTitle" :class="$style.tabs" :tab="tab" :tabs="tabs" :root-el="el" @update:tab="key => emit('update:tab', key)" @tab-click="onTabClick"/> | ||||
| 			<XTabs v-if="!narrow || hideTitle" :class="$style.tabs" :tab="tab" :tabs="tabs" :rootEl="el" @update:tab="key => emit('update:tab', key)" @tabClick="onTabClick"/> | ||||
| 		</template> | ||||
| 		<div v-if="(!thin_ && narrow && !hideTitle) || (actions && actions.length > 0)" :class="$style.buttonsRight"> | ||||
| 			<template v-for="action in actions"> | ||||
|  | @ -30,7 +30,7 @@ | |||
| 		</div> | ||||
| 	</div> | ||||
| 	<div v-if="(narrow && !hideTitle) && hasTabs" :class="[$style.lower, { [$style.slim]: narrow, [$style.thin]: thin_ }]"> | ||||
| 		<XTabs :class="$style.tabs" :tab="tab" :tabs="tabs" :root-el="el" @update:tab="key => emit('update:tab', key)" @tab-click="onTabClick"/> | ||||
| 		<XTabs :class="$style.tabs" :tab="tab" :tabs="tabs" :rootEl="el" @update:tab="key => emit('update:tab', key)" @tabClick="onTabClick"/> | ||||
| 	</div> | ||||
| </div> | ||||
| </template> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| <Mfm :text="user.name ?? user.username" :author="user" :plain="true" :nowrap="nowrap" :emoji-urls="user.emojis"/> | ||||
| <Mfm :text="user.name ?? user.username" :author="user" :plain="true" :nowrap="nowrap" :emojiUrls="user.emojis"/> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts" setup> | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue