refactor
This commit is contained in:
		
							parent
							
								
									58ae2ccbfa
								
							
						
					
					
						commit
						047262ab20
					
				
					 90 changed files with 949 additions and 884 deletions
				
			
		|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="bcekxzvu _gap _panel"> | <div class="bcekxzvu _margin _panel"> | ||||||
| 	<div class="target"> | 	<div class="target"> | ||||||
| 		<MkA v-user-preview="report.targetUserId" class="info" :to="`/user-info/${report.targetUserId}`"> | 		<MkA v-user-preview="report.targetUserId" class="info" :to="`/user-info/${report.targetUserId}`"> | ||||||
| 			<MkAvatar class="avatar" :user="report.targetUser" :show-indicator="true" :disable-link="true"/> | 			<MkAvatar class="avatar" :user="report.targetUser" :show-indicator="true" :disable-link="true"/> | ||||||
|  | @ -8,7 +8,7 @@ | ||||||
| 				<MkAcct class="acct" :user="report.targetUser" style="display: block;"/> | 				<MkAcct class="acct" :user="report.targetUser" style="display: block;"/> | ||||||
| 			</div> | 			</div> | ||||||
| 		</MkA> | 		</MkA> | ||||||
| 		<MkKeyValue class="_formBlock"> | 		<MkKeyValue> | ||||||
| 			<template #key>{{ i18n.ts.registeredDate }}</template> | 			<template #key>{{ i18n.ts.registeredDate }}</template> | ||||||
| 			<template #value>{{ dateString(report.targetUser.createdAt) }} (<MkTime :time="report.targetUser.createdAt"/>)</template> | 			<template #value>{{ dateString(report.targetUser.createdAt) }} (<MkTime :time="report.targetUser.createdAt"/>)</template> | ||||||
| 		</MkKeyValue> | 		</MkKeyValue> | ||||||
|  |  | ||||||
|  | @ -54,8 +54,6 @@ const props = defineProps<{ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .urempief { | .urempief { | ||||||
| 	margin-top: var(--margin); |  | ||||||
| 
 |  | ||||||
| 	&.list { | 	&.list { | ||||||
| 		> .file { | 		> .file { | ||||||
| 			display: flex; | 			display: flex; | ||||||
|  | @ -89,7 +87,6 @@ const props = defineProps<{ | ||||||
| 		display: grid; | 		display: grid; | ||||||
| 		grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); | 		grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); | ||||||
| 		grid-gap: 12px; | 		grid-gap: 12px; | ||||||
| 		margin: var(--margin) 0; |  | ||||||
| 
 | 
 | ||||||
| 		> .file { | 		> .file { | ||||||
| 			position: relative; | 			position: relative; | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| <template> | <template> | ||||||
| <XModalWindow ref="dialog" | <XModalWindow | ||||||
|  | 	ref="dialog" | ||||||
| 	:width="370" | 	:width="370" | ||||||
| 	:height="400" | 	:height="400" | ||||||
| 	@close="dialog.close()" | 	@close="dialog.close()" | ||||||
|  | @ -8,18 +9,18 @@ | ||||||
| 	<template #header>{{ i18n.ts.forgotPassword }}</template> | 	<template #header>{{ i18n.ts.forgotPassword }}</template> | ||||||
| 
 | 
 | ||||||
| 	<form v-if="instance.enableEmail" class="bafeceda" @submit.prevent="onSubmit"> | 	<form v-if="instance.enableEmail" class="bafeceda" @submit.prevent="onSubmit"> | ||||||
| 		<div class="main _formRoot"> | 		<div class="main _autoGap"> | ||||||
| 			<MkInput v-model="username" class="_formBlock" type="text" pattern="^[a-zA-Z0-9_]+$" :spellcheck="false" autofocus required> | 			<MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" :spellcheck="false" autofocus required> | ||||||
| 				<template #label>{{ i18n.ts.username }}</template> | 				<template #label>{{ i18n.ts.username }}</template> | ||||||
| 				<template #prefix>@</template> | 				<template #prefix>@</template> | ||||||
| 			</MkInput> | 			</MkInput> | ||||||
| 
 | 
 | ||||||
| 			<MkInput v-model="email" class="_formBlock" type="email" :spellcheck="false" required> | 			<MkInput v-model="email" type="email" :spellcheck="false" required> | ||||||
| 				<template #label>{{ i18n.ts.emailAddress }}</template> | 				<template #label>{{ i18n.ts.emailAddress }}</template> | ||||||
| 				<template #caption>{{ i18n.ts._forgotPassword.enterEmail }}</template> | 				<template #caption>{{ i18n.ts._forgotPassword.enterEmail }}</template> | ||||||
| 			</MkInput> | 			</MkInput> | ||||||
| 
 | 
 | ||||||
| 			<MkButton class="_formBlock" type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ i18n.ts.send }}</MkButton> | 			<MkButton type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ i18n.ts.send }}</MkButton> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div class="sub"> | 		<div class="sub"> | ||||||
| 			<MkA to="/about" class="_link">{{ i18n.ts._forgotPassword.ifNoEmail }}</MkA> | 			<MkA to="/about" class="_link">{{ i18n.ts._forgotPassword.ifNoEmail }}</MkA> | ||||||
|  |  | ||||||
|  | @ -15,37 +15,37 @@ | ||||||
| 	</template> | 	</template> | ||||||
| 
 | 
 | ||||||
| 	<MkSpacer :margin-min="20" :margin-max="32"> | 	<MkSpacer :margin-min="20" :margin-max="32"> | ||||||
| 		<div class="xkpnjxcv _formRoot"> | 		<div class="xkpnjxcv _autoGap"> | ||||||
| 			<template v-for="item in Object.keys(form).filter(item => !form[item].hidden)"> | 			<template v-for="item in Object.keys(form).filter(item => !form[item].hidden)"> | ||||||
| 				<FormInput v-if="form[item].type === 'number'" v-model="values[item]" type="number" :step="form[item].step || 1" class="_formBlock"> | 				<FormInput v-if="form[item].type === 'number'" v-model="values[item]" type="number" :step="form[item].step || 1"> | ||||||
| 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | ||||||
| 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template> | 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template> | ||||||
| 				</FormInput> | 				</FormInput> | ||||||
| 				<FormInput v-else-if="form[item].type === 'string' && !form[item].multiline" v-model="values[item]" type="text" class="_formBlock"> | 				<FormInput v-else-if="form[item].type === 'string' && !form[item].multiline" v-model="values[item]" type="text"> | ||||||
| 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | ||||||
| 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template> | 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template> | ||||||
| 				</FormInput> | 				</FormInput> | ||||||
| 				<FormTextarea v-else-if="form[item].type === 'string' && form[item].multiline" v-model="values[item]" class="_formBlock"> | 				<FormTextarea v-else-if="form[item].type === 'string' && form[item].multiline" v-model="values[item]"> | ||||||
| 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | ||||||
| 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template> | 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template> | ||||||
| 				</FormTextarea> | 				</FormTextarea> | ||||||
| 				<FormSwitch v-else-if="form[item].type === 'boolean'" v-model="values[item]" class="_formBlock"> | 				<FormSwitch v-else-if="form[item].type === 'boolean'" v-model="values[item]"> | ||||||
| 					<span v-text="form[item].label || item"></span> | 					<span v-text="form[item].label || item"></span> | ||||||
| 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template> | 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template> | ||||||
| 				</FormSwitch> | 				</FormSwitch> | ||||||
| 				<FormSelect v-else-if="form[item].type === 'enum'" v-model="values[item]" class="_formBlock"> | 				<FormSelect v-else-if="form[item].type === 'enum'" v-model="values[item]"> | ||||||
| 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | ||||||
| 					<option v-for="item in form[item].enum" :key="item.value" :value="item.value">{{ item.label }}</option> | 					<option v-for="item in form[item].enum" :key="item.value" :value="item.value">{{ item.label }}</option> | ||||||
| 				</FormSelect> | 				</FormSelect> | ||||||
| 				<FormRadios v-else-if="form[item].type === 'radio'" v-model="values[item]" class="_formBlock"> | 				<FormRadios v-else-if="form[item].type === 'radio'" v-model="values[item]"> | ||||||
| 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | ||||||
| 					<option v-for="item in form[item].options" :key="item.value" :value="item.value">{{ item.label }}</option> | 					<option v-for="item in form[item].options" :key="item.value" :value="item.value">{{ item.label }}</option> | ||||||
| 				</FormRadios> | 				</FormRadios> | ||||||
| 				<FormRange 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" class="_formBlock"> | 				<FormRange 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"> | ||||||
| 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> | ||||||
| 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template> | 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template> | ||||||
| 				</FormRange> | 				</FormRange> | ||||||
| 				<MkButton v-else-if="form[item].type === 'button'" class="_formBlock" @click="form[item].action($event, values)"> | 				<MkButton v-else-if="form[item].type === 'button'" @click="form[item].action($event, values)"> | ||||||
| 					<span v-text="form[item].content || item"></span> | 					<span v-text="form[item].content || item"></span> | ||||||
| 				</MkButton> | 				</MkButton> | ||||||
| 			</template> | 			</template> | ||||||
|  |  | ||||||
|  | @ -12,20 +12,20 @@ | ||||||
| 	<template #header>{{ i18n.ts.notificationSetting }}</template> | 	<template #header>{{ i18n.ts.notificationSetting }}</template> | ||||||
| 
 | 
 | ||||||
| 	<MkSpacer :margin-min="20" :margin-max="28"> | 	<MkSpacer :margin-min="20" :margin-max="28"> | ||||||
| 		<div class="_formRoot"> | 		<div class="_autoGap"> | ||||||
| 			<template v-if="showGlobalToggle"> | 			<template v-if="showGlobalToggle"> | ||||||
| 				<MkSwitch v-model="useGlobalSetting" class="_formBlock"> | 				<MkSwitch v-model="useGlobalSetting"> | ||||||
| 					{{ i18n.ts.useGlobalSetting }} | 					{{ i18n.ts.useGlobalSetting }} | ||||||
| 					<template #caption>{{ i18n.ts.useGlobalSettingDesc }}</template> | 					<template #caption>{{ i18n.ts.useGlobalSettingDesc }}</template> | ||||||
| 				</MkSwitch> | 				</MkSwitch> | ||||||
| 			</template> | 			</template> | ||||||
| 			<template v-if="!useGlobalSetting"> | 			<template v-if="!useGlobalSetting"> | ||||||
| 				<MkInfo class="_formBlock">{{ i18n.ts.notificationSettingDesc }}</MkInfo> | 				<MkInfo>{{ i18n.ts.notificationSettingDesc }}</MkInfo> | ||||||
| 				<div style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | 				<div style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | ||||||
| 					<MkButton inline @click="disableAll">{{ i18n.ts.disableAll }}</MkButton> | 					<MkButton inline @click="disableAll">{{ i18n.ts.disableAll }}</MkButton> | ||||||
| 					<MkButton inline @click="enableAll">{{ i18n.ts.enableAll }}</MkButton> | 					<MkButton inline @click="enableAll">{{ i18n.ts.enableAll }}</MkButton> | ||||||
| 				</div> | 				</div> | ||||||
| 				<MkSwitch v-for="ntype in notificationTypes" class="_formBlock" :key="ntype" v-model="typesMap[ntype]">{{ i18n.t(`_notification._types.${ntype}`) }}</MkSwitch> | 				<MkSwitch v-for="ntype in notificationTypes" :key="ntype" v-model="typesMap[ntype]">{{ i18n.t(`_notification._types.${ntype}`) }}</MkSwitch> | ||||||
| 			</template> | 			</template> | ||||||
| 		</div> | 		</div> | ||||||
| 	</MkSpacer> | 	</MkSpacer> | ||||||
|  |  | ||||||
|  | @ -14,14 +14,14 @@ | ||||||
| 	</div> | 	</div> | ||||||
| 
 | 
 | ||||||
| 	<div v-else ref="rootEl"> | 	<div v-else ref="rootEl"> | ||||||
| 		<div v-show="pagination.reversed && more" key="_more_" class="cxiknjgy _gap"> | 		<div v-show="pagination.reversed && more" key="_more_" class="cxiknjgy _margin"> | ||||||
| 			<MkButton v-if="!moreFetching" class="button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" primary @click="fetchMoreAhead"> | 			<MkButton v-if="!moreFetching" class="button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" primary @click="fetchMoreAhead"> | ||||||
| 				{{ i18n.ts.loadMore }} | 				{{ i18n.ts.loadMore }} | ||||||
| 			</MkButton> | 			</MkButton> | ||||||
| 			<MkLoading v-else class="loading"/> | 			<MkLoading v-else class="loading"/> | ||||||
| 		</div> | 		</div> | ||||||
| 		<slot :items="items"></slot> | 		<slot :items="items"></slot> | ||||||
| 		<div v-show="!pagination.reversed && more" key="_more_" class="cxiknjgy _gap"> | 		<div v-show="!pagination.reversed && more" key="_more_" class="cxiknjgy _margin"> | ||||||
| 			<MkButton v-if="!moreFetching" v-appear="($store.state.enableInfiniteScroll && !disableAutoLoad) ? fetchMore : null" class="button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" primary @click="fetchMore"> | 			<MkButton v-if="!moreFetching" v-appear="($store.state.enableInfiniteScroll && !disableAutoLoad) ? fetchMore : null" class="button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" primary @click="fetchMore"> | ||||||
| 				{{ i18n.ts.loadMore }} | 				{{ i18n.ts.loadMore }} | ||||||
| 			</MkButton> | 			</MkButton> | ||||||
|  |  | ||||||
|  | @ -1,20 +1,20 @@ | ||||||
| <template> | <template> | ||||||
| <form class="eppvobhk _monolithic_" :class="{ signing, totpLogin }" @submit.prevent="onSubmit"> | <form class="eppvobhk _monolithic_" :class="{ signing, totpLogin }" @submit.prevent="onSubmit"> | ||||||
| 	<div class="auth _section _formRoot"> | 	<div class="auth _section _autoGap"> | ||||||
| 		<div v-show="withAvatar" class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null, marginBottom: message ? '1.5em' : null }"></div> | 		<div v-show="withAvatar" class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null, marginBottom: message ? '1.5em' : null }"></div> | ||||||
| 		<MkInfo v-if="message"> | 		<MkInfo v-if="message"> | ||||||
| 			{{ message }} | 			{{ message }} | ||||||
| 		</MkInfo> | 		</MkInfo> | ||||||
| 		<div v-if="!totpLogin" class="normal-signin"> | 		<div v-if="!totpLogin" class="normal-signin _autoGap"> | ||||||
| 			<MkInput v-model="username" class="_formBlock" :placeholder="i18n.ts.username" type="text" pattern="^[a-zA-Z0-9_]+$" :spellcheck="false" 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" autofocus required data-cy-signin-username @update:model-value="onUsernameChange"> | ||||||
| 				<template #prefix>@</template> | 				<template #prefix>@</template> | ||||||
| 				<template #suffix>@{{ host }}</template> | 				<template #suffix>@{{ host }}</template> | ||||||
| 			</MkInput> | 			</MkInput> | ||||||
| 			<MkInput v-if="!user || user && !user.usePasswordLessLogin" v-model="password" class="_formBlock" :placeholder="i18n.ts.password" type="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" :with-password-toggle="true" required data-cy-signin-password> | ||||||
| 				<template #prefix><i class="ti ti-lock"></i></template> | 				<template #prefix><i class="ti ti-lock"></i></template> | ||||||
| 				<template #caption><button class="_textButton" type="button" @click="resetPassword">{{ i18n.ts.forgotPassword }}</button></template> | 				<template #caption><button class="_textButton" type="button" @click="resetPassword">{{ i18n.ts.forgotPassword }}</button></template> | ||||||
| 			</MkInput> | 			</MkInput> | ||||||
| 			<MkButton class="_formBlock" type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? i18n.ts.loggingIn : i18n.ts.login }}</MkButton> | 			<MkButton type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? i18n.ts.loggingIn : i18n.ts.login }}</MkButton> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div v-if="totpLogin" class="2fa-signin" :class="{ securityKeys: user && user.securityKeys }"> | 		<div v-if="totpLogin" class="2fa-signin" :class="{ securityKeys: user && user.securityKeys }"> | ||||||
| 			<div v-if="user && user.securityKeys" class="twofa-group tap-group"> | 			<div v-if="user && user.securityKeys" class="twofa-group tap-group"> | ||||||
|  | @ -41,9 +41,9 @@ | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
| 	<div class="social _section"> | 	<div class="social _section"> | ||||||
| 		<a v-if="meta && meta.enableTwitterIntegration" class="_borderButton _gap" :href="`${apiUrl}/signin/twitter`"><i class="ti ti-brand-twitter" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'Twitter' }) }}</a> | 		<a v-if="meta && meta.enableTwitterIntegration" class="_borderButton _margin" :href="`${apiUrl}/signin/twitter`"><i class="ti ti-brand-twitter" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'Twitter' }) }}</a> | ||||||
| 		<a v-if="meta && meta.enableGithubIntegration" class="_borderButton _gap" :href="`${apiUrl}/signin/github`"><i class="ti ti-brand-github" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'GitHub' }) }}</a> | 		<a v-if="meta && meta.enableGithubIntegration" class="_borderButton _margin" :href="`${apiUrl}/signin/github`"><i class="ti ti-brand-github" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'GitHub' }) }}</a> | ||||||
| 		<a v-if="meta && meta.enableDiscordIntegration" class="_borderButton _gap" :href="`${apiUrl}/signin/discord`"><i class="ti ti-brand-discord" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'Discord' }) }}</a> | 		<a v-if="meta && meta.enableDiscordIntegration" class="_borderButton _margin" :href="`${apiUrl}/signin/discord`"><i class="ti ti-brand-discord" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'Discord' }) }}</a> | ||||||
| 	</div> | 	</div> | ||||||
| </form> | </form> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -1,10 +1,10 @@ | ||||||
| <template> | <template> | ||||||
| <form class="qlvuhzng _formRoot" autocomplete="new-password" @submit.prevent="onSubmit"> | <form class="qlvuhzng _autoGap" autocomplete="new-password" @submit.prevent="onSubmit"> | ||||||
| 	<MkInput v-if="instance.disableRegistration" v-model="invitationCode" class="_formBlock" type="text" :spellcheck="false" required> | 	<MkInput v-if="instance.disableRegistration" v-model="invitationCode" type="text" :spellcheck="false" required> | ||||||
| 		<template #label>{{ i18n.ts.invitationCode }}</template> | 		<template #label>{{ i18n.ts.invitationCode }}</template> | ||||||
| 		<template #prefix><i class="ti ti-key"></i></template> | 		<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 	</MkInput> | 	</MkInput> | ||||||
| 	<MkInput v-model="username" class="_formBlock" 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:model-value="onChangeUsername"> | ||||||
| 		<template #label>{{ i18n.ts.username }} <div v-tooltip:dialog="i18n.ts.usernameInfo" class="_button _help"><i class="ti ti-question-circle"></i></div></template> | 		<template #label>{{ i18n.ts.username }} <div v-tooltip:dialog="i18n.ts.usernameInfo" class="_button _help"><i class="ti ti-question-circle"></i></div></template> | ||||||
| 		<template #prefix>@</template> | 		<template #prefix>@</template> | ||||||
| 		<template #suffix>@{{ host }}</template> | 		<template #suffix>@{{ host }}</template> | ||||||
|  | @ -18,7 +18,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> | 			<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> | 		</template> | ||||||
| 	</MkInput> | 	</MkInput> | ||||||
| 	<MkInput v-if="instance.emailRequiredForSignup" v-model="email" class="_formBlock" :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:model-value="onChangeEmail"> | ||||||
| 		<template #label>{{ i18n.ts.emailAddress }} <div v-tooltip:dialog="i18n.ts._signup.emailAddressInfo" class="_button _help"><i class="ti ti-question-circle"></i></div></template> | 		<template #label>{{ i18n.ts.emailAddress }} <div v-tooltip:dialog="i18n.ts._signup.emailAddressInfo" class="_button _help"><i class="ti ti-question-circle"></i></div></template> | ||||||
| 		<template #prefix><i class="ti ti-mail"></i></template> | 		<template #prefix><i class="ti ti-mail"></i></template> | ||||||
| 		<template #caption> | 		<template #caption> | ||||||
|  | @ -33,7 +33,7 @@ | ||||||
| 			<span v-else-if="emailState === 'error'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts.error }}</span> | 			<span v-else-if="emailState === 'error'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts.error }}</span> | ||||||
| 		</template> | 		</template> | ||||||
| 	</MkInput> | 	</MkInput> | ||||||
| 	<MkInput v-model="password" class="_formBlock" 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:model-value="onChangePassword"> | ||||||
| 		<template #label>{{ i18n.ts.password }}</template> | 		<template #label>{{ i18n.ts.password }}</template> | ||||||
| 		<template #prefix><i class="ti ti-lock"></i></template> | 		<template #prefix><i class="ti ti-lock"></i></template> | ||||||
| 		<template #caption> | 		<template #caption> | ||||||
|  | @ -42,7 +42,7 @@ | ||||||
| 			<span v-if="passwordStrength == 'high'" style="color: var(--success)"><i class="ti ti-check ti-fw"></i> {{ i18n.ts.strongPassword }}</span> | 			<span v-if="passwordStrength == 'high'" style="color: var(--success)"><i class="ti ti-check ti-fw"></i> {{ i18n.ts.strongPassword }}</span> | ||||||
| 		</template> | 		</template> | ||||||
| 	</MkInput> | 	</MkInput> | ||||||
| 	<MkInput v-model="retypedPassword" class="_formBlock" 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:model-value="onChangePasswordRetype"> | ||||||
| 		<template #label>{{ i18n.ts.password }} ({{ i18n.ts.retype }})</template> | 		<template #label>{{ i18n.ts.password }} ({{ i18n.ts.retype }})</template> | ||||||
| 		<template #prefix><i class="ti ti-lock"></i></template> | 		<template #prefix><i class="ti ti-lock"></i></template> | ||||||
| 		<template #caption> | 		<template #caption> | ||||||
|  | @ -50,17 +50,17 @@ | ||||||
| 			<span v-if="passwordRetypeState == 'not-match'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts.passwordNotMatched }}</span> | 			<span v-if="passwordRetypeState == 'not-match'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts.passwordNotMatched }}</span> | ||||||
| 		</template> | 		</template> | ||||||
| 	</MkInput> | 	</MkInput> | ||||||
| 	<MkSwitch v-if="instance.tosUrl" v-model="ToSAgreement" class="_formBlock tou"> | 	<MkSwitch v-if="instance.tosUrl" v-model="ToSAgreement" class="tou"> | ||||||
| 		<I18n :src="i18n.ts.agreeTo"> | 		<I18n :src="i18n.ts.agreeTo"> | ||||||
| 			<template #0> | 			<template #0> | ||||||
| 				<a :href="instance.tosUrl" class="_link" target="_blank">{{ i18n.ts.tos }}</a> | 				<a :href="instance.tosUrl" class="_link" target="_blank">{{ i18n.ts.tos }}</a> | ||||||
| 			</template> | 			</template> | ||||||
| 		</I18n> | 		</I18n> | ||||||
| 	</MkSwitch> | 	</MkSwitch> | ||||||
| 	<MkCaptcha v-if="instance.enableHcaptcha" ref="hcaptcha" v-model="hCaptchaResponse" class="_formBlock captcha" provider="hcaptcha" :sitekey="instance.hcaptchaSiteKey"/> | 	<MkCaptcha v-if="instance.enableHcaptcha" ref="hcaptcha" v-model="hCaptchaResponse" class="captcha" provider="hcaptcha" :sitekey="instance.hcaptchaSiteKey"/> | ||||||
| 	<MkCaptcha v-if="instance.enableRecaptcha" ref="recaptcha" v-model="reCaptchaResponse" class="_formBlock captcha" provider="recaptcha" :sitekey="instance.recaptchaSiteKey"/> | 	<MkCaptcha v-if="instance.enableRecaptcha" ref="recaptcha" v-model="reCaptchaResponse" class="captcha" provider="recaptcha" :sitekey="instance.recaptchaSiteKey"/> | ||||||
| 	<MkCaptcha v-if="instance.enableTurnstile" ref="turnstile" v-model="turnstileResponse" class="_formBlock captcha" provider="turnstile" :sitekey="instance.turnstileSiteKey"/> | 	<MkCaptcha v-if="instance.enableTurnstile" ref="turnstile" v-model="turnstileResponse" class="captcha" provider="turnstile" :sitekey="instance.turnstileSiteKey"/> | ||||||
| 	<MkButton class="_formBlock" type="submit" :disabled="shouldDisableSubmitting" gradate data-cy-signup-submit>{{ i18n.ts.start }}</MkButton> | 	<MkButton type="submit" :disabled="shouldDisableSubmitting" gradate data-cy-signup-submit>{{ i18n.ts.start }}</MkButton> | ||||||
| </form> | </form> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -13,21 +13,21 @@ | ||||||
| 	<template #header>{{ title || $ts.generateAccessToken }}</template> | 	<template #header>{{ title || $ts.generateAccessToken }}</template> | ||||||
| 
 | 
 | ||||||
| 	<MkSpacer :margin-min="20" :margin-max="28"> | 	<MkSpacer :margin-min="20" :margin-max="28"> | ||||||
| 		<div class="_formRoot"> | 		<div class="_autoGap"> | ||||||
| 			<div v-if="information" class="_formBlock"> | 			<div v-if="information"> | ||||||
| 				<MkInfo warn>{{ information }}</MkInfo> | 				<MkInfo warn>{{ information }}</MkInfo> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="_formBlock"> | 			<div> | ||||||
| 				<MkInput v-model="name"> | 				<MkInput v-model="name"> | ||||||
| 					<template #label>{{ $ts.name }}</template> | 					<template #label>{{ $ts.name }}</template> | ||||||
| 				</MkInput> | 				</MkInput> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="_formBlock"><b>{{ $ts.permission }}</b></div> | 			<div><b>{{ $ts.permission }}</b></div> | ||||||
| 			<div style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | 			<div style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | ||||||
| 				<MkButton inline @click="disableAll">{{ i18n.ts.disableAll }}</MkButton> | 				<MkButton inline @click="disableAll">{{ i18n.ts.disableAll }}</MkButton> | ||||||
| 				<MkButton inline @click="enableAll">{{ i18n.ts.enableAll }}</MkButton> | 				<MkButton inline @click="enableAll">{{ i18n.ts.enableAll }}</MkButton> | ||||||
| 			</div> | 			</div> | ||||||
| 			<MkSwitch v-for="kind in (initialPermissions || kinds)" :key="kind" v-model="permissions[kind]" class="_formBlock">{{ $t(`_permissions.${kind}`) }}</MkSwitch> | 			<MkSwitch v-for="kind in (initialPermissions || kinds)" :key="kind" v-model="permissions[kind]">{{ $t(`_permissions.${kind}`) }}</MkSwitch> | ||||||
| 		</div> | 		</div> | ||||||
| 	</MkSpacer> | 	</MkSpacer> | ||||||
| </XModalWindow> | </XModalWindow> | ||||||
|  |  | ||||||
|  | @ -1,35 +1,27 @@ | ||||||
| <template> | <template> | ||||||
| <div class="vrtktovh _formBlock"> | <div class="vrtktovh" :class="{ first }"> | ||||||
| 	<div class="label"><slot name="label"></slot></div> | 	<div class="label"><slot name="label"></slot></div> | ||||||
| 	<div class="main _formRoot"> | 	<div class="main"> | ||||||
| 		<slot></slot> | 		<slot></slot> | ||||||
| 	</div> | 	</div> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <script lang="ts" setup> | <script lang="ts" setup> | ||||||
|  | defineProps<{ | ||||||
|  | 	first?: boolean; | ||||||
|  | }>(); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" scoped> | ||||||
| .vrtktovh { | .vrtktovh { | ||||||
| 	border-top: solid 0.5px var(--divider); | 	border-top: solid 0.5px var(--divider); | ||||||
| 	border-bottom: solid 0.5px var(--divider); | 	//border-bottom: solid 0.5px var(--divider); | ||||||
| 
 |  | ||||||
| 	& + .vrtktovh { |  | ||||||
| 		border-top: none; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	&:first-child { |  | ||||||
| 		border-top: none; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	&:last-child { |  | ||||||
| 		border-bottom: none; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	> .label { | 	> .label { | ||||||
| 		font-weight: bold; | 		font-weight: bold; | ||||||
| 		margin: 1.5em 0 16px 0; | 		padding: 1.5em 0 0 0; | ||||||
|  | 		margin: 0 0 16px 0; | ||||||
| 
 | 
 | ||||||
| 		&:empty { | 		&:empty { | ||||||
| 			display: none; | 			display: none; | ||||||
|  | @ -37,7 +29,15 @@ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	> .main { | 	> .main { | ||||||
| 		margin: 1.5em 0; | 		margin: 1.5em 0 0 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	&.first { | ||||||
|  | 		border-top: none; | ||||||
|  | 
 | ||||||
|  | 		> .label { | ||||||
|  | 			padding-top: 0; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="terlnhxf _formBlock"> | <div class="terlnhxf"> | ||||||
| 	<slot></slot> | 	<slot></slot> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -3,18 +3,17 @@ | ||||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<div style="overflow: clip;"> | 	<div style="overflow: clip;"> | ||||||
| 		<MkSpacer :content-max="600" :margin-min="20"> | 		<MkSpacer :content-max="600" :margin-min="20"> | ||||||
| 			<div class="_formRoot znqjceqz"> | 			<div class="_autoGap znqjceqz"> | ||||||
| 				<div id="debug"></div> | 				<div ref="containerEl" v-panel class="about" :class="{ playing: easterEggEngine != null }"> | ||||||
| 				<div ref="containerEl" v-panel class="_formBlock about" :class="{ playing: easterEggEngine != null }"> |  | ||||||
| 					<img src="/client-assets/about-icon.png" alt="" class="icon" draggable="false" @load="iconLoaded" @click="gravity"/> | 					<img src="/client-assets/about-icon.png" alt="" class="icon" draggable="false" @load="iconLoaded" @click="gravity"/> | ||||||
| 					<div class="misskey">Misskey</div> | 					<div class="misskey">Misskey</div> | ||||||
| 					<div class="version">v{{ version }}</div> | 					<div class="version">v{{ version }}</div> | ||||||
| 					<span v-for="emoji in easterEggEmojis" :key="emoji.id" class="emoji" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :is-reaction="false" :normal="true" :no-style="true"/></span> | 					<span v-for="emoji in easterEggEmojis" :key="emoji.id" class="emoji" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :is-reaction="false" :normal="true" :no-style="true"/></span> | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="_formBlock" style="text-align: center;"> | 				<div style="text-align: center;"> | ||||||
| 					{{ i18n.ts._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/misskey.html" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a> | 					{{ i18n.ts._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/misskey.html" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a> | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="_formBlock" style="text-align: center;"> | 				<div style="text-align: center;"> | ||||||
| 					<MkButton primary rounded inline @click="iLoveMisskey">I <Mfm text="$[jelly ❤]"/> #Misskey</MkButton> | 					<MkButton primary rounded inline @click="iLoveMisskey">I <Mfm text="$[jelly ❤]"/> #Misskey</MkButton> | ||||||
| 				</div> | 				</div> | ||||||
| 				<FormSection> | 				<FormSection> | ||||||
|  |  | ||||||
|  | @ -2,8 +2,8 @@ | ||||||
| <MkStickyContainer> | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer v-if="tab === 'overview'" :content-max="600" :margin-min="20"> | 	<MkSpacer v-if="tab === 'overview'" :content-max="600" :margin-min="20"> | ||||||
| 		<div class="_formRoot"> | 		<div class="_autoGap"> | ||||||
| 			<div class="_formBlock fwhjspax" :style="{ backgroundImage: `url(${ $instance.bannerUrl })` }"> | 			<div class="fwhjspax" :style="{ backgroundImage: `url(${ $instance.bannerUrl })` }"> | ||||||
| 				<div class="content"> | 				<div class="content"> | ||||||
| 					<img :src="$instance.iconUrl ?? $instance.faviconUrl ?? '/favicon.ico'" alt="" class="icon"/> | 					<img :src="$instance.iconUrl ?? $instance.faviconUrl ?? '/favicon.ico'" alt="" class="icon"/> | ||||||
| 					<div class="name"> | 					<div class="name"> | ||||||
|  | @ -12,44 +12,48 @@ | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 
 | 
 | ||||||
| 			<MkKeyValue class="_formBlock"> | 			<MkKeyValue> | ||||||
| 				<template #key>{{ i18n.ts.description }}</template> | 				<template #key>{{ i18n.ts.description }}</template> | ||||||
| 				<template #value><div v-html="$instance.description"></div></template> | 				<template #value><div v-html="$instance.description"></div></template> | ||||||
| 			</MkKeyValue> | 			</MkKeyValue> | ||||||
| 
 | 
 | ||||||
| 			<FormSection> | 			<FormSection> | ||||||
| 				<MkKeyValue class="_formBlock" :copy="version"> | 				<div class="_autoGap"> | ||||||
|  | 					<MkKeyValue :copy="version"> | ||||||
| 						<template #key>Misskey</template> | 						<template #key>Misskey</template> | ||||||
| 						<template #value>{{ version }}</template> | 						<template #value>{{ version }}</template> | ||||||
| 					</MkKeyValue> | 					</MkKeyValue> | ||||||
| 				<div class="_formBlock" v-html="i18n.t('poweredByMisskeyDescription', { name: $instance.name ?? host })"> | 					<div v-html="i18n.t('poweredByMisskeyDescription', { name: $instance.name ?? host })"> | ||||||
| 					</div> | 					</div> | ||||||
| 					<FormLink to="/about-misskey">{{ i18n.ts.aboutMisskey }}</FormLink> | 					<FormLink to="/about-misskey">{{ i18n.ts.aboutMisskey }}</FormLink> | ||||||
|  | 				</div> | ||||||
| 			</FormSection> | 			</FormSection> | ||||||
| 
 | 
 | ||||||
| 			<FormSection> | 			<FormSection> | ||||||
|  | 				<div class="_autoGap"> | ||||||
| 					<FormSplit> | 					<FormSplit> | ||||||
| 					<MkKeyValue class="_formBlock"> | 						<MkKeyValue> | ||||||
| 							<template #key>{{ i18n.ts.administrator }}</template> | 							<template #key>{{ i18n.ts.administrator }}</template> | ||||||
| 							<template #value>{{ $instance.maintainerName }}</template> | 							<template #value>{{ $instance.maintainerName }}</template> | ||||||
| 						</MkKeyValue> | 						</MkKeyValue> | ||||||
| 					<MkKeyValue class="_formBlock"> | 						<MkKeyValue> | ||||||
| 							<template #key>{{ i18n.ts.contact }}</template> | 							<template #key>{{ i18n.ts.contact }}</template> | ||||||
| 							<template #value>{{ $instance.maintainerEmail }}</template> | 							<template #value>{{ $instance.maintainerEmail }}</template> | ||||||
| 						</MkKeyValue> | 						</MkKeyValue> | ||||||
| 					</FormSplit> | 					</FormSplit> | ||||||
| 				<FormLink v-if="$instance.tosUrl" :to="$instance.tosUrl" class="_formBlock" external>{{ i18n.ts.tos }}</FormLink> | 					<FormLink v-if="$instance.tosUrl" :to="$instance.tosUrl" external>{{ i18n.ts.tos }}</FormLink> | ||||||
|  | 				</div> | ||||||
| 			</FormSection> | 			</FormSection> | ||||||
| 
 | 
 | ||||||
| 			<FormSuspense :p="initStats"> | 			<FormSuspense :p="initStats"> | ||||||
| 				<FormSection> | 				<FormSection> | ||||||
| 					<template #label>{{ i18n.ts.statistics }}</template> | 					<template #label>{{ i18n.ts.statistics }}</template> | ||||||
| 					<FormSplit> | 					<FormSplit> | ||||||
| 						<MkKeyValue class="_formBlock"> | 						<MkKeyValue> | ||||||
| 							<template #key>{{ i18n.ts.users }}</template> | 							<template #key>{{ i18n.ts.users }}</template> | ||||||
| 							<template #value>{{ number(stats.originalUsersCount) }}</template> | 							<template #value>{{ number(stats.originalUsersCount) }}</template> | ||||||
| 						</MkKeyValue> | 						</MkKeyValue> | ||||||
| 						<MkKeyValue class="_formBlock"> | 						<MkKeyValue> | ||||||
| 							<template #key>{{ i18n.ts.notes }}</template> | 							<template #key>{{ i18n.ts.notes }}</template> | ||||||
| 							<template #value>{{ number(stats.originalNotesCount) }}</template> | 							<template #value>{{ number(stats.originalNotesCount) }}</template> | ||||||
| 						</MkKeyValue> | 						</MkKeyValue> | ||||||
|  |  | ||||||
|  | @ -2,11 +2,11 @@ | ||||||
| <MkStickyContainer> | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer v-if="file" :content-max="600" :margin-min="16" :margin-max="32"> | 	<MkSpacer v-if="file" :content-max="600" :margin-min="16" :margin-max="32"> | ||||||
| 		<div v-if="tab === 'overview'" class="cxqhhsmd _formRoot"> | 		<div v-if="tab === 'overview'" class="cxqhhsmd _autoGap"> | ||||||
| 			<a class="_formBlock thumbnail" :href="file.url" target="_blank"> | 			<a class="thumbnail" :href="file.url" target="_blank"> | ||||||
| 				<MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/> | 				<MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/> | ||||||
| 			</a> | 			</a> | ||||||
| 			<div class="_formBlock"> | 			<div> | ||||||
| 				<MkKeyValue :copy="file.type" oneline style="margin: 1em 0;"> | 				<MkKeyValue :copy="file.type" oneline style="margin: 1em 0;"> | ||||||
| 					<template #key>MIME Type</template> | 					<template #key>MIME Type</template> | ||||||
| 					<template #value><span class="_monospace">{{ file.type }}</span></template> | 					<template #value><span class="_monospace">{{ file.type }}</span></template> | ||||||
|  | @ -31,29 +31,29 @@ | ||||||
| 			<MkA v-if="file.user" class="user" :to="`/user-info/${file.user.id}`"> | 			<MkA v-if="file.user" class="user" :to="`/user-info/${file.user.id}`"> | ||||||
| 				<MkUserCardMini :user="file.user"/> | 				<MkUserCardMini :user="file.user"/> | ||||||
| 			</MkA> | 			</MkA> | ||||||
| 			<div class="_formBlock"> | 			<div> | ||||||
| 				<MkSwitch v-model="isSensitive" @update:model-value="toggleIsSensitive">NSFW</MkSwitch> | 				<MkSwitch v-model="isSensitive" @update:model-value="toggleIsSensitive">NSFW</MkSwitch> | ||||||
| 			</div> | 			</div> | ||||||
| 
 | 
 | ||||||
| 			<div class="_formBlock"> | 			<div> | ||||||
| 				<MkButton danger @click="del"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> | 				<MkButton danger @click="del"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> | ||||||
| 			</div> | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div v-else-if="tab === 'ip' && info" class="_formRoot"> | 		<div v-else-if="tab === 'ip' && info" class="_autoGap"> | ||||||
| 			<MkInfo v-if="!iAmAdmin" warn>{{ i18n.ts.requireAdminForView }}</MkInfo> | 			<MkInfo v-if="!iAmAdmin" warn>{{ i18n.ts.requireAdminForView }}</MkInfo> | ||||||
| 			<MkKeyValue v-if="info.requestIp" class="_formBlock _monospace" :copy="info.requestIp" oneline> | 			<MkKeyValue v-if="info.requestIp" class="_monospace" :copy="info.requestIp" oneline> | ||||||
| 				<template #key>IP</template> | 				<template #key>IP</template> | ||||||
| 				<template #value>{{ info.requestIp }}</template> | 				<template #value>{{ info.requestIp }}</template> | ||||||
| 			</MkKeyValue> | 			</MkKeyValue> | ||||||
| 			<FormSection v-if="info.requestHeaders"> | 			<FormSection v-if="info.requestHeaders"> | ||||||
| 				<template #label>Headers</template> | 				<template #label>Headers</template> | ||||||
| 				<MkKeyValue v-for="(v, k) in info.requestHeaders" :key="k" class="_formBlock _monospace"> | 				<MkKeyValue v-for="(v, k) in info.requestHeaders" :key="k" class="_monospace"> | ||||||
| 					<template #key>{{ k }}</template> | 					<template #key>{{ k }}</template> | ||||||
| 					<template #value>{{ v }}</template> | 					<template #value>{{ v }}</template> | ||||||
| 				</MkKeyValue> | 				</MkKeyValue> | ||||||
| 			</FormSection> | 			</FormSection> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div v-else-if="tab === 'raw'" class="_formRoot"> | 		<div v-else-if="tab === 'raw'" class="_autoGap"> | ||||||
| 			<MkObjectView v-if="info" tall :value="info"> | 			<MkObjectView v-if="info" tall :value="info"> | ||||||
| 			</MkObjectView> | 			</MkObjectView> | ||||||
| 		</div> | 		</div> | ||||||
|  |  | ||||||
|  | @ -3,15 +3,15 @@ | ||||||
| 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="900"> | 	<MkSpacer :content-max="900"> | ||||||
| 		<div class="uqshojas"> | 		<div class="uqshojas"> | ||||||
| 			<div v-for="ad in ads" class="_panel _formRoot ad"> | 			<div v-for="ad in ads" class="_panel _autoGap ad"> | ||||||
| 				<MkAd v-if="ad.url" :specify="ad"/> | 				<MkAd v-if="ad.url" :specify="ad"/> | ||||||
| 				<MkInput v-model="ad.url" type="url" class="_formBlock"> | 				<MkInput v-model="ad.url" type="url"> | ||||||
| 					<template #label>URL</template> | 					<template #label>URL</template> | ||||||
| 				</MkInput> | 				</MkInput> | ||||||
| 				<MkInput v-model="ad.imageUrl" class="_formBlock"> | 				<MkInput v-model="ad.imageUrl"> | ||||||
| 					<template #label>{{ i18n.ts.imageUrl }}</template> | 					<template #label>{{ i18n.ts.imageUrl }}</template> | ||||||
| 				</MkInput> | 				</MkInput> | ||||||
| 				<FormRadios v-model="ad.place" class="_formBlock"> | 				<FormRadios v-model="ad.place"> | ||||||
| 					<template #label>Form</template> | 					<template #label>Form</template> | ||||||
| 					<option value="square">square</option> | 					<option value="square">square</option> | ||||||
| 					<option value="horizontal">horizontal</option> | 					<option value="horizontal">horizontal</option> | ||||||
|  | @ -33,10 +33,10 @@ | ||||||
| 						<template #label>{{ i18n.ts.expiration }}</template> | 						<template #label>{{ i18n.ts.expiration }}</template> | ||||||
| 					</MkInput> | 					</MkInput> | ||||||
| 				</FormSplit> | 				</FormSplit> | ||||||
| 				<MkTextarea v-model="ad.memo" class="_formBlock"> | 				<MkTextarea v-model="ad.memo"> | ||||||
| 					<template #label>{{ i18n.ts.memo }}</template> | 					<template #label>{{ i18n.ts.memo }}</template> | ||||||
| 				</MkTextarea> | 				</MkTextarea> | ||||||
| 				<div class="buttons _formBlock"> | 				<div class="buttons"> | ||||||
| 					<MkButton class="button" inline primary style="margin-right: 12px;" @click="save(ad)"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton> | 					<MkButton class="button" inline primary style="margin-right: 12px;" @click="save(ad)"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton> | ||||||
| 					<MkButton class="button" inline danger @click="remove(ad)"><i class="ti ti-trash"></i> {{ i18n.ts.remove }}</MkButton> | 					<MkButton class="button" inline danger @click="remove(ad)"><i class="ti ti-trash"></i> {{ i18n.ts.remove }}</MkButton> | ||||||
| 				</div> | 				</div> | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ | ||||||
| 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="900"> | 	<MkSpacer :content-max="900"> | ||||||
| 		<div class="ztgjmzrw"> | 		<div class="ztgjmzrw"> | ||||||
| 			<section v-for="announcement in announcements" class="_card _gap announcements"> | 			<section v-for="announcement in announcements" class="_card _margin announcements"> | ||||||
| 				<div class="_content announcement"> | 				<div class="_content announcement"> | ||||||
| 					<MkInput v-model="announcement.title"> | 					<MkInput v-model="announcement.title"> | ||||||
| 						<template #label>{{ i18n.ts.title }}</template> | 						<template #label>{{ i18n.ts.title }}</template> | ||||||
|  |  | ||||||
|  | @ -1,8 +1,8 @@ | ||||||
| <template> | <template> | ||||||
| <div> | <div> | ||||||
| 	<FormSuspense :p="init"> | 	<FormSuspense :p="init"> | ||||||
| 		<div class="_formRoot"> | 		<div class="_autoGap"> | ||||||
| 			<FormRadios v-model="provider" class="_formBlock"> | 			<FormRadios v-model="provider"> | ||||||
| 				<option :value="null">{{ i18n.ts.none }} ({{ i18n.ts.notRecommended }})</option> | 				<option :value="null">{{ i18n.ts.none }} ({{ i18n.ts.notRecommended }})</option> | ||||||
| 				<option value="hcaptcha">hCaptcha</option> | 				<option value="hcaptcha">hCaptcha</option> | ||||||
| 				<option value="recaptcha">reCAPTCHA</option> | 				<option value="recaptcha">reCAPTCHA</option> | ||||||
|  | @ -10,43 +10,43 @@ | ||||||
| 			</FormRadios> | 			</FormRadios> | ||||||
| 
 | 
 | ||||||
| 			<template v-if="provider === 'hcaptcha'"> | 			<template v-if="provider === 'hcaptcha'"> | ||||||
| 				<FormInput v-model="hcaptchaSiteKey" class="_formBlock"> | 				<FormInput v-model="hcaptchaSiteKey"> | ||||||
| 					<template #prefix><i class="ti ti-key"></i></template> | 					<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 					<template #label>{{ i18n.ts.hcaptchaSiteKey }}</template> | 					<template #label>{{ i18n.ts.hcaptchaSiteKey }}</template> | ||||||
| 				</FormInput> | 				</FormInput> | ||||||
| 				<FormInput v-model="hcaptchaSecretKey" class="_formBlock"> | 				<FormInput v-model="hcaptchaSecretKey"> | ||||||
| 					<template #prefix><i class="ti ti-key"></i></template> | 					<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 					<template #label>{{ i18n.ts.hcaptchaSecretKey }}</template> | 					<template #label>{{ i18n.ts.hcaptchaSecretKey }}</template> | ||||||
| 				</FormInput> | 				</FormInput> | ||||||
| 				<FormSlot class="_formBlock"> | 				<FormSlot> | ||||||
| 					<template #label>{{ i18n.ts.preview }}</template> | 					<template #label>{{ i18n.ts.preview }}</template> | ||||||
| 					<MkCaptcha provider="hcaptcha" :sitekey="hcaptchaSiteKey || '10000000-ffff-ffff-ffff-000000000001'"/> | 					<MkCaptcha provider="hcaptcha" :sitekey="hcaptchaSiteKey || '10000000-ffff-ffff-ffff-000000000001'"/> | ||||||
| 				</FormSlot> | 				</FormSlot> | ||||||
| 			</template> | 			</template> | ||||||
| 			<template v-else-if="provider === 'recaptcha'"> | 			<template v-else-if="provider === 'recaptcha'"> | ||||||
| 				<FormInput v-model="recaptchaSiteKey" class="_formBlock"> | 				<FormInput v-model="recaptchaSiteKey"> | ||||||
| 					<template #prefix><i class="ti ti-key"></i></template> | 					<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 					<template #label>{{ i18n.ts.recaptchaSiteKey }}</template> | 					<template #label>{{ i18n.ts.recaptchaSiteKey }}</template> | ||||||
| 				</FormInput> | 				</FormInput> | ||||||
| 				<FormInput v-model="recaptchaSecretKey" class="_formBlock"> | 				<FormInput v-model="recaptchaSecretKey"> | ||||||
| 					<template #prefix><i class="ti ti-key"></i></template> | 					<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 					<template #label>{{ i18n.ts.recaptchaSecretKey }}</template> | 					<template #label>{{ i18n.ts.recaptchaSecretKey }}</template> | ||||||
| 				</FormInput> | 				</FormInput> | ||||||
| 				<FormSlot v-if="recaptchaSiteKey" class="_formBlock"> | 				<FormSlot v-if="recaptchaSiteKey"> | ||||||
| 					<template #label>{{ i18n.ts.preview }}</template> | 					<template #label>{{ i18n.ts.preview }}</template> | ||||||
| 					<MkCaptcha provider="recaptcha" :sitekey="recaptchaSiteKey"/> | 					<MkCaptcha provider="recaptcha" :sitekey="recaptchaSiteKey"/> | ||||||
| 				</FormSlot> | 				</FormSlot> | ||||||
| 			</template> | 			</template> | ||||||
| 			<template v-else-if="provider === 'turnstile'"> | 			<template v-else-if="provider === 'turnstile'"> | ||||||
| 				<FormInput v-model="turnstileSiteKey" class="_formBlock"> | 				<FormInput v-model="turnstileSiteKey"> | ||||||
| 					<template #prefix><i class="ti ti-key"></i></template> | 					<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 					<template #label>{{ i18n.ts.turnstileSiteKey }}</template> | 					<template #label>{{ i18n.ts.turnstileSiteKey }}</template> | ||||||
| 				</FormInput> | 				</FormInput> | ||||||
| 				<FormInput v-model="turnstileSecretKey" class="_formBlock"> | 				<FormInput v-model="turnstileSecretKey"> | ||||||
| 					<template #prefix><i class="ti ti-key"></i></template> | 					<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 					<template #label>{{ i18n.ts.turnstileSecretKey }}</template> | 					<template #label>{{ i18n.ts.turnstileSecretKey }}</template> | ||||||
| 				</FormInput> | 				</FormInput> | ||||||
| 				<FormSlot class="_formBlock"> | 				<FormSlot> | ||||||
| 					<template #label>{{ i18n.ts.preview }}</template> | 					<template #label>{{ i18n.ts.preview }}</template> | ||||||
| 					<MkCaptcha provider="turnstile" :sitekey="turnstileSiteKey || '1x00000000000000000000AA'"/> | 					<MkCaptcha provider="turnstile" :sitekey="turnstileSiteKey || '1x00000000000000000000AA'"/> | ||||||
| 				</FormSlot> | 				</FormSlot> | ||||||
|  |  | ||||||
|  | @ -3,40 +3,43 @@ | ||||||
| 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | ||||||
| 		<FormSuspense :p="init"> | 		<FormSuspense :p="init"> | ||||||
| 			<div class="_formRoot"> | 			<div class="_autoGap"> | ||||||
| 				<FormSwitch v-model="enableEmail" class="_formBlock"> | 				<FormSwitch v-model="enableEmail"> | ||||||
| 					<template #label>{{ i18n.ts.enableEmail }} ({{ i18n.ts.recommended }})</template> | 					<template #label>{{ i18n.ts.enableEmail }} ({{ i18n.ts.recommended }})</template> | ||||||
| 					<template #caption>{{ i18n.ts.emailConfigInfo }}</template> | 					<template #caption>{{ i18n.ts.emailConfigInfo }}</template> | ||||||
| 				</FormSwitch> | 				</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 				<template v-if="enableEmail"> | 				<template v-if="enableEmail"> | ||||||
| 					<FormInput v-model="email" type="email" class="_formBlock"> | 					<FormInput v-model="email" type="email"> | ||||||
| 						<template #label>{{ i18n.ts.emailAddress }}</template> | 						<template #label>{{ i18n.ts.emailAddress }}</template> | ||||||
| 					</FormInput> | 					</FormInput> | ||||||
| 
 | 
 | ||||||
| 					<FormSection> | 					<FormSection> | ||||||
| 						<template #label>{{ i18n.ts.smtpConfig }}</template> | 						<template #label>{{ i18n.ts.smtpConfig }}</template> | ||||||
|  | 
 | ||||||
|  | 						<div class="_autoGap"> | ||||||
| 							<FormSplit :min-width="280"> | 							<FormSplit :min-width="280"> | ||||||
| 							<FormInput v-model="smtpHost" class="_formBlock"> | 								<FormInput v-model="smtpHost"> | ||||||
| 									<template #label>{{ i18n.ts.smtpHost }}</template> | 									<template #label>{{ i18n.ts.smtpHost }}</template> | ||||||
| 								</FormInput> | 								</FormInput> | ||||||
| 							<FormInput v-model="smtpPort" type="number" class="_formBlock"> | 								<FormInput v-model="smtpPort" type="number"> | ||||||
| 									<template #label>{{ i18n.ts.smtpPort }}</template> | 									<template #label>{{ i18n.ts.smtpPort }}</template> | ||||||
| 								</FormInput> | 								</FormInput> | ||||||
| 							</FormSplit> | 							</FormSplit> | ||||||
| 							<FormSplit :min-width="280"> | 							<FormSplit :min-width="280"> | ||||||
| 							<FormInput v-model="smtpUser" class="_formBlock"> | 								<FormInput v-model="smtpUser"> | ||||||
| 									<template #label>{{ i18n.ts.smtpUser }}</template> | 									<template #label>{{ i18n.ts.smtpUser }}</template> | ||||||
| 								</FormInput> | 								</FormInput> | ||||||
| 							<FormInput v-model="smtpPass" type="password" class="_formBlock"> | 								<FormInput v-model="smtpPass" type="password"> | ||||||
| 									<template #label>{{ i18n.ts.smtpPass }}</template> | 									<template #label>{{ i18n.ts.smtpPass }}</template> | ||||||
| 								</FormInput> | 								</FormInput> | ||||||
| 							</FormSplit> | 							</FormSplit> | ||||||
| 						<FormInfo class="_formBlock">{{ i18n.ts.emptyToDisableSmtpAuth }}</FormInfo> | 							<FormInfo>{{ i18n.ts.emptyToDisableSmtpAuth }}</FormInfo> | ||||||
| 						<FormSwitch v-model="smtpSecure" class="_formBlock"> | 							<FormSwitch v-model="smtpSecure"> | ||||||
| 								<template #label>{{ i18n.ts.smtpSecure }}</template> | 								<template #label>{{ i18n.ts.smtpSecure }}</template> | ||||||
| 								<template #caption>{{ i18n.ts.smtpSecureInfo }}</template> | 								<template #caption>{{ i18n.ts.smtpSecureInfo }}</template> | ||||||
| 							</FormSwitch> | 							</FormSwitch> | ||||||
|  | 						</div> | ||||||
| 					</FormSection> | 					</FormSection> | ||||||
| 				</template> | 				</template> | ||||||
| 			</div> | 			</div> | ||||||
|  |  | ||||||
|  | @ -9,22 +9,22 @@ | ||||||
| > | > | ||||||
| 	<template #header>:{{ emoji.name }}:</template> | 	<template #header>:{{ emoji.name }}:</template> | ||||||
| 
 | 
 | ||||||
| 	<div class="_monolithic_"> | 	<MkSpacer :margin-min="20" :margin-max="28"> | ||||||
| 		<div class="yigymqpb _section"> | 		<div class="yigymqpb _autoGap"> | ||||||
| 			<img :src="`/emoji/${emoji.name}.webp`" class="img"/> | 			<img :src="`/emoji/${emoji.name}.webp`" class="img"/> | ||||||
| 			<MkInput v-model="name" class="_formBlock"> | 			<MkInput v-model="name"> | ||||||
| 				<template #label>{{ i18n.ts.name }}</template> | 				<template #label>{{ i18n.ts.name }}</template> | ||||||
| 			</MkInput> | 			</MkInput> | ||||||
| 			<MkInput v-model="category" class="_formBlock" :datalist="categories"> | 			<MkInput v-model="category" :datalist="categories"> | ||||||
| 				<template #label>{{ i18n.ts.category }}</template> | 				<template #label>{{ i18n.ts.category }}</template> | ||||||
| 			</MkInput> | 			</MkInput> | ||||||
| 			<MkInput v-model="aliases" class="_formBlock"> | 			<MkInput v-model="aliases"> | ||||||
| 				<template #label>{{ i18n.ts.tags }}</template> | 				<template #label>{{ i18n.ts.tags }}</template> | ||||||
| 				<template #caption>{{ i18n.ts.setMultipleBySeparatingWithSpace }}</template> | 				<template #caption>{{ i18n.ts.setMultipleBySeparatingWithSpace }}</template> | ||||||
| 			</MkInput> | 			</MkInput> | ||||||
| 			<MkButton danger @click="del()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> | 			<MkButton danger @click="del()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</MkSpacer> | ||||||
| </XModalWindow> | </XModalWindow> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -3,12 +3,12 @@ | ||||||
| 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | ||||||
| 		<FormSuspense :p="init"> | 		<FormSuspense :p="init"> | ||||||
| 			<FormTextarea v-model="blockedHosts" class="_formBlock"> | 			<FormTextarea v-model="blockedHosts"> | ||||||
| 				<span>{{ i18n.ts.blockedInstances }}</span> | 				<span>{{ i18n.ts.blockedInstances }}</span> | ||||||
| 				<template #caption>{{ i18n.ts.blockedInstancesDescription }}</template> | 				<template #caption>{{ i18n.ts.blockedInstancesDescription }}</template> | ||||||
| 			</FormTextarea> | 			</FormTextarea> | ||||||
| 
 | 
 | ||||||
| 			<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | 			<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | ||||||
| 		</FormSuspense> | 		</FormSuspense> | ||||||
| 	</MkSpacer> | 	</MkSpacer> | ||||||
| </MkStickyContainer> | </MkStickyContainer> | ||||||
|  |  | ||||||
|  | @ -1,25 +1,25 @@ | ||||||
| <template> | <template> | ||||||
| <FormSuspense :p="init"> | <FormSuspense :p="init"> | ||||||
| 	<div class="_formRoot"> | 	<div class="_autoGap"> | ||||||
| 		<FormSwitch v-model="enableDiscordIntegration" class="_formBlock"> | 		<FormSwitch v-model="enableDiscordIntegration"> | ||||||
| 			<template #label>{{ i18n.ts.enable }}</template> | 			<template #label>{{ i18n.ts.enable }}</template> | ||||||
| 		</FormSwitch> | 		</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 		<template v-if="enableDiscordIntegration"> | 		<template v-if="enableDiscordIntegration"> | ||||||
| 			<FormInfo class="_formBlock">Callback URL: {{ `${uri}/api/dc/cb` }}</FormInfo> | 			<FormInfo>Callback URL: {{ `${uri}/api/dc/cb` }}</FormInfo> | ||||||
| 		 | 		 | ||||||
| 			<FormInput v-model="discordClientId" class="_formBlock"> | 			<FormInput v-model="discordClientId"> | ||||||
| 				<template #prefix><i class="ti ti-key"></i></template> | 				<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 				<template #label>Client ID</template> | 				<template #label>Client ID</template> | ||||||
| 			</FormInput> | 			</FormInput> | ||||||
| 
 | 
 | ||||||
| 			<FormInput v-model="discordClientSecret" class="_formBlock"> | 			<FormInput v-model="discordClientSecret"> | ||||||
| 				<template #prefix><i class="ti ti-key"></i></template> | 				<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 				<template #label>Client Secret</template> | 				<template #label>Client Secret</template> | ||||||
| 			</FormInput> | 			</FormInput> | ||||||
| 		</template> | 		</template> | ||||||
| 
 | 
 | ||||||
| 		<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | 		<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | ||||||
| 	</div> | 	</div> | ||||||
| </FormSuspense> | </FormSuspense> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -1,25 +1,25 @@ | ||||||
| <template> | <template> | ||||||
| <FormSuspense :p="init"> | <FormSuspense :p="init"> | ||||||
| 	<div class="_formRoot"> | 	<div class="_autoGap"> | ||||||
| 		<FormSwitch v-model="enableGithubIntegration" class="_formBlock"> | 		<FormSwitch v-model="enableGithubIntegration"> | ||||||
| 			<template #label>{{ i18n.ts.enable }}</template> | 			<template #label>{{ i18n.ts.enable }}</template> | ||||||
| 		</FormSwitch> | 		</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 		<template v-if="enableGithubIntegration"> | 		<template v-if="enableGithubIntegration"> | ||||||
| 			<FormInfo class="_formBlock">Callback URL: {{ `${uri}/api/gh/cb` }}</FormInfo> | 			<FormInfo>Callback URL: {{ `${uri}/api/gh/cb` }}</FormInfo> | ||||||
| 		 | 		 | ||||||
| 			<FormInput v-model="githubClientId" class="_formBlock"> | 			<FormInput v-model="githubClientId"> | ||||||
| 				<template #prefix><i class="ti ti-key"></i></template> | 				<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 				<template #label>Client ID</template> | 				<template #label>Client ID</template> | ||||||
| 			</FormInput> | 			</FormInput> | ||||||
| 
 | 
 | ||||||
| 			<FormInput v-model="githubClientSecret" class="_formBlock"> | 			<FormInput v-model="githubClientSecret"> | ||||||
| 				<template #prefix><i class="ti ti-key"></i></template> | 				<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 				<template #label>Client Secret</template> | 				<template #label>Client Secret</template> | ||||||
| 			</FormInput> | 			</FormInput> | ||||||
| 		</template> | 		</template> | ||||||
| 
 | 
 | ||||||
| 		<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | 		<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | ||||||
| 	</div> | 	</div> | ||||||
| </FormSuspense> | </FormSuspense> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -1,25 +1,25 @@ | ||||||
| <template> | <template> | ||||||
| <FormSuspense :p="init"> | <FormSuspense :p="init"> | ||||||
| 	<div class="_formRoot"> | 	<div class="_autoGap"> | ||||||
| 		<FormSwitch v-model="enableTwitterIntegration" class="_formBlock"> | 		<FormSwitch v-model="enableTwitterIntegration"> | ||||||
| 			<template #label>{{ i18n.ts.enable }}</template> | 			<template #label>{{ i18n.ts.enable }}</template> | ||||||
| 		</FormSwitch> | 		</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 		<template v-if="enableTwitterIntegration"> | 		<template v-if="enableTwitterIntegration"> | ||||||
| 			<FormInfo class="_formBlock">Callback URL: {{ `${uri}/api/tw/cb` }}</FormInfo> | 			<FormInfo>Callback URL: {{ `${uri}/api/tw/cb` }}</FormInfo> | ||||||
| 		 | 		 | ||||||
| 			<FormInput v-model="twitterConsumerKey" class="_formBlock"> | 			<FormInput v-model="twitterConsumerKey"> | ||||||
| 				<template #prefix><i class="ti ti-key"></i></template> | 				<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 				<template #label>Consumer Key</template> | 				<template #label>Consumer Key</template> | ||||||
| 			</FormInput> | 			</FormInput> | ||||||
| 
 | 
 | ||||||
| 			<FormInput v-model="twitterConsumerSecret" class="_formBlock"> | 			<FormInput v-model="twitterConsumerSecret"> | ||||||
| 				<template #prefix><i class="ti ti-key"></i></template> | 				<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 				<template #label>Consumer Secret</template> | 				<template #label>Consumer Secret</template> | ||||||
| 			</FormInput> | 			</FormInput> | ||||||
| 		</template> | 		</template> | ||||||
| 
 | 
 | ||||||
| 		<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | 		<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | ||||||
| 	</div> | 	</div> | ||||||
| </FormSuspense> | </FormSuspense> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -1,27 +1,31 @@ | ||||||
| <template><MkStickyContainer> | <template> | ||||||
|  | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | ||||||
| 		<FormSuspense :p="init"> | 		<FormSuspense :p="init"> | ||||||
| 		<FormFolder class="_formBlock"> | 			<div class="_autoGap"> | ||||||
|  | 				<FormFolder> | ||||||
| 					<template #icon><i class="ti ti-brand-twitter"></i></template> | 					<template #icon><i class="ti ti-brand-twitter"></i></template> | ||||||
| 					<template #label>Twitter</template> | 					<template #label>Twitter</template> | ||||||
| 					<template #suffix>{{ enableTwitterIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template> | 					<template #suffix>{{ enableTwitterIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template> | ||||||
| 					<XTwitter/> | 					<XTwitter/> | ||||||
| 				</FormFolder> | 				</FormFolder> | ||||||
| 		<FormFolder class="_formBlock"> | 				<FormFolder> | ||||||
| 					<template #icon><i class="ti ti-brand-github"></i></template> | 					<template #icon><i class="ti ti-brand-github"></i></template> | ||||||
| 					<template #label>GitHub</template> | 					<template #label>GitHub</template> | ||||||
| 					<template #suffix>{{ enableGithubIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template> | 					<template #suffix>{{ enableGithubIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template> | ||||||
| 					<XGithub/> | 					<XGithub/> | ||||||
| 				</FormFolder> | 				</FormFolder> | ||||||
| 		<FormFolder class="_formBlock"> | 				<FormFolder> | ||||||
| 					<template #icon><i class="ti ti-brand-discord"></i></template> | 					<template #icon><i class="ti ti-brand-discord"></i></template> | ||||||
| 					<template #label>Discord</template> | 					<template #label>Discord</template> | ||||||
| 					<template #suffix>{{ enableDiscordIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template> | 					<template #suffix>{{ enableDiscordIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template> | ||||||
| 					<XDiscord/> | 					<XDiscord/> | ||||||
| 				</FormFolder> | 				</FormFolder> | ||||||
|  | 			</div> | ||||||
| 		</FormSuspense> | 		</FormSuspense> | ||||||
| </MkSpacer></MkStickyContainer> | 	</MkSpacer> | ||||||
|  | </MkStickyContainer> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <script lang="ts" setup> | <script lang="ts" setup> | ||||||
|  |  | ||||||
|  | @ -3,62 +3,62 @@ | ||||||
| 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | ||||||
| 		<FormSuspense :p="init"> | 		<FormSuspense :p="init"> | ||||||
| 			<div class="_formRoot"> | 			<div class="_autoGap"> | ||||||
| 				<FormSwitch v-model="useObjectStorage" class="_formBlock">{{ i18n.ts.useObjectStorage }}</FormSwitch> | 				<FormSwitch v-model="useObjectStorage">{{ i18n.ts.useObjectStorage }}</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 				<template v-if="useObjectStorage"> | 				<template v-if="useObjectStorage"> | ||||||
| 					<FormInput v-model="objectStorageBaseUrl" class="_formBlock"> | 					<FormInput v-model="objectStorageBaseUrl"> | ||||||
| 						<template #label>{{ i18n.ts.objectStorageBaseUrl }}</template> | 						<template #label>{{ i18n.ts.objectStorageBaseUrl }}</template> | ||||||
| 						<template #caption>{{ i18n.ts.objectStorageBaseUrlDesc }}</template> | 						<template #caption>{{ i18n.ts.objectStorageBaseUrlDesc }}</template> | ||||||
| 					</FormInput> | 					</FormInput> | ||||||
| 
 | 
 | ||||||
| 					<FormInput v-model="objectStorageBucket" class="_formBlock"> | 					<FormInput v-model="objectStorageBucket"> | ||||||
| 						<template #label>{{ i18n.ts.objectStorageBucket }}</template> | 						<template #label>{{ i18n.ts.objectStorageBucket }}</template> | ||||||
| 						<template #caption>{{ i18n.ts.objectStorageBucketDesc }}</template> | 						<template #caption>{{ i18n.ts.objectStorageBucketDesc }}</template> | ||||||
| 					</FormInput> | 					</FormInput> | ||||||
| 
 | 
 | ||||||
| 					<FormInput v-model="objectStoragePrefix" class="_formBlock"> | 					<FormInput v-model="objectStoragePrefix"> | ||||||
| 						<template #label>{{ i18n.ts.objectStoragePrefix }}</template> | 						<template #label>{{ i18n.ts.objectStoragePrefix }}</template> | ||||||
| 						<template #caption>{{ i18n.ts.objectStoragePrefixDesc }}</template> | 						<template #caption>{{ i18n.ts.objectStoragePrefixDesc }}</template> | ||||||
| 					</FormInput> | 					</FormInput> | ||||||
| 
 | 
 | ||||||
| 					<FormInput v-model="objectStorageEndpoint" class="_formBlock"> | 					<FormInput v-model="objectStorageEndpoint"> | ||||||
| 						<template #label>{{ i18n.ts.objectStorageEndpoint }}</template> | 						<template #label>{{ i18n.ts.objectStorageEndpoint }}</template> | ||||||
| 						<template #caption>{{ i18n.ts.objectStorageEndpointDesc }}</template> | 						<template #caption>{{ i18n.ts.objectStorageEndpointDesc }}</template> | ||||||
| 					</FormInput> | 					</FormInput> | ||||||
| 
 | 
 | ||||||
| 					<FormInput v-model="objectStorageRegion" class="_formBlock"> | 					<FormInput v-model="objectStorageRegion"> | ||||||
| 						<template #label>{{ i18n.ts.objectStorageRegion }}</template> | 						<template #label>{{ i18n.ts.objectStorageRegion }}</template> | ||||||
| 						<template #caption>{{ i18n.ts.objectStorageRegionDesc }}</template> | 						<template #caption>{{ i18n.ts.objectStorageRegionDesc }}</template> | ||||||
| 					</FormInput> | 					</FormInput> | ||||||
| 
 | 
 | ||||||
| 					<FormSplit :min-width="280"> | 					<FormSplit :min-width="280"> | ||||||
| 						<FormInput v-model="objectStorageAccessKey" class="_formBlock"> | 						<FormInput v-model="objectStorageAccessKey"> | ||||||
| 							<template #prefix><i class="ti ti-key"></i></template> | 							<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 							<template #label>Access key</template> | 							<template #label>Access key</template> | ||||||
| 						</FormInput> | 						</FormInput> | ||||||
| 
 | 
 | ||||||
| 						<FormInput v-model="objectStorageSecretKey" class="_formBlock"> | 						<FormInput v-model="objectStorageSecretKey"> | ||||||
| 							<template #prefix><i class="ti ti-key"></i></template> | 							<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 							<template #label>Secret key</template> | 							<template #label>Secret key</template> | ||||||
| 						</FormInput> | 						</FormInput> | ||||||
| 					</FormSplit> | 					</FormSplit> | ||||||
| 
 | 
 | ||||||
| 					<FormSwitch v-model="objectStorageUseSSL" class="_formBlock"> | 					<FormSwitch v-model="objectStorageUseSSL"> | ||||||
| 						<template #label>{{ i18n.ts.objectStorageUseSSL }}</template> | 						<template #label>{{ i18n.ts.objectStorageUseSSL }}</template> | ||||||
| 						<template #caption>{{ i18n.ts.objectStorageUseSSLDesc }}</template> | 						<template #caption>{{ i18n.ts.objectStorageUseSSLDesc }}</template> | ||||||
| 					</FormSwitch> | 					</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 					<FormSwitch v-model="objectStorageUseProxy" class="_formBlock"> | 					<FormSwitch v-model="objectStorageUseProxy"> | ||||||
| 						<template #label>{{ i18n.ts.objectStorageUseProxy }}</template> | 						<template #label>{{ i18n.ts.objectStorageUseProxy }}</template> | ||||||
| 						<template #caption>{{ i18n.ts.objectStorageUseProxyDesc }}</template> | 						<template #caption>{{ i18n.ts.objectStorageUseProxyDesc }}</template> | ||||||
| 					</FormSwitch> | 					</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 					<FormSwitch v-model="objectStorageSetPublicRead" class="_formBlock"> | 					<FormSwitch v-model="objectStorageSetPublicRead"> | ||||||
| 						<template #label>{{ i18n.ts.objectStorageSetPublicRead }}</template> | 						<template #label>{{ i18n.ts.objectStorageSetPublicRead }}</template> | ||||||
| 					</FormSwitch> | 					</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 					<FormSwitch v-model="objectStorageS3ForcePathStyle" class="_formBlock"> | 					<FormSwitch v-model="objectStorageS3ForcePathStyle"> | ||||||
| 						<template #label>s3ForcePathStyle</template> | 						<template #label>s3ForcePathStyle</template> | ||||||
| 					</FormSwitch> | 					</FormSwitch> | ||||||
| 				</template> | 				</template> | ||||||
|  |  | ||||||
|  | @ -1,16 +1,18 @@ | ||||||
| <template><MkStickyContainer> | <template> | ||||||
|  | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | ||||||
| 		<FormSuspense :p="init"> | 		<FormSuspense :p="init"> | ||||||
| 		<MkInfo class="_formBlock">{{ i18n.ts.proxyAccountDescription }}</MkInfo> | 			<MkInfo>{{ i18n.ts.proxyAccountDescription }}</MkInfo> | ||||||
| 		<MkKeyValue class="_formBlock"> | 			<MkKeyValue> | ||||||
| 				<template #key>{{ i18n.ts.proxyAccount }}</template> | 				<template #key>{{ i18n.ts.proxyAccount }}</template> | ||||||
| 				<template #value>{{ proxyAccount ? `@${proxyAccount.username}` : i18n.ts.none }}</template> | 				<template #value>{{ proxyAccount ? `@${proxyAccount.username}` : i18n.ts.none }}</template> | ||||||
| 			</MkKeyValue> | 			</MkKeyValue> | ||||||
| 
 | 
 | ||||||
| 		<FormButton primary class="_formBlock" @click="chooseProxyAccount">{{ i18n.ts.selectAccount }}</FormButton> | 			<FormButton primary @click="chooseProxyAccount">{{ i18n.ts.selectAccount }}</FormButton> | ||||||
| 		</FormSuspense> | 		</FormSuspense> | ||||||
| </MkSpacer></MkStickyContainer> | 	</MkSpacer> | ||||||
|  | </MkStickyContainer> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <script lang="ts" setup> | <script lang="ts" setup> | ||||||
|  |  | ||||||
|  | @ -3,8 +3,8 @@ | ||||||
| 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | ||||||
| 		<FormSuspense :p="init"> | 		<FormSuspense :p="init"> | ||||||
| 			<div class="_formRoot"> | 			<div class="_autoGap"> | ||||||
| 				<FormFolder class="_formBlock"> | 				<FormFolder> | ||||||
| 					<template #icon><i class="ti ti-shield"></i></template> | 					<template #icon><i class="ti ti-shield"></i></template> | ||||||
| 					<template #label>{{ i18n.ts.botProtection }}</template> | 					<template #label>{{ i18n.ts.botProtection }}</template> | ||||||
| 					<template v-if="enableHcaptcha" #suffix>hCaptcha</template> | 					<template v-if="enableHcaptcha" #suffix>hCaptcha</template> | ||||||
|  | @ -15,7 +15,7 @@ | ||||||
| 					<XBotProtection/> | 					<XBotProtection/> | ||||||
| 				</FormFolder> | 				</FormFolder> | ||||||
| 
 | 
 | ||||||
| 				<FormFolder class="_formBlock"> | 				<FormFolder> | ||||||
| 					<template #icon><i class="ti ti-eye-off"></i></template> | 					<template #icon><i class="ti ti-eye-off"></i></template> | ||||||
| 					<template #label>{{ i18n.ts.sensitiveMediaDetection }}</template> | 					<template #label>{{ i18n.ts.sensitiveMediaDetection }}</template> | ||||||
| 					<template v-if="sensitiveMediaDetection === 'all'" #suffix>{{ i18n.ts.all }}</template> | 					<template v-if="sensitiveMediaDetection === 'all'" #suffix>{{ i18n.ts.all }}</template> | ||||||
|  | @ -23,76 +23,76 @@ | ||||||
| 					<template v-else-if="sensitiveMediaDetection === 'remote'" #suffix>{{ i18n.ts.remoteOnly }}</template> | 					<template v-else-if="sensitiveMediaDetection === 'remote'" #suffix>{{ i18n.ts.remoteOnly }}</template> | ||||||
| 					<template v-else #suffix>{{ i18n.ts.none }}</template> | 					<template v-else #suffix>{{ i18n.ts.none }}</template> | ||||||
| 
 | 
 | ||||||
| 					<div class="_formRoot"> | 					<div class="_autoGap"> | ||||||
| 						<span class="_formBlock">{{ i18n.ts._sensitiveMediaDetection.description }}</span> | 						<span>{{ i18n.ts._sensitiveMediaDetection.description }}</span> | ||||||
| 
 | 
 | ||||||
| 						<FormRadios v-model="sensitiveMediaDetection" class="_formBlock"> | 						<FormRadios v-model="sensitiveMediaDetection"> | ||||||
| 							<option value="none">{{ i18n.ts.none }}</option> | 							<option value="none">{{ i18n.ts.none }}</option> | ||||||
| 							<option value="all">{{ i18n.ts.all }}</option> | 							<option value="all">{{ i18n.ts.all }}</option> | ||||||
| 							<option value="local">{{ i18n.ts.localOnly }}</option> | 							<option value="local">{{ i18n.ts.localOnly }}</option> | ||||||
| 							<option value="remote">{{ i18n.ts.remoteOnly }}</option> | 							<option value="remote">{{ i18n.ts.remoteOnly }}</option> | ||||||
| 						</FormRadios> | 						</FormRadios> | ||||||
| 
 | 
 | ||||||
| 						<FormRange v-model="sensitiveMediaDetectionSensitivity" :min="0" :max="4" :step="1" :text-converter="(v) => `${v + 1}`" class="_formBlock"> | 						<FormRange v-model="sensitiveMediaDetectionSensitivity" :min="0" :max="4" :step="1" :text-converter="(v) => `${v + 1}`"> | ||||||
| 							<template #label>{{ i18n.ts._sensitiveMediaDetection.sensitivity }}</template> | 							<template #label>{{ i18n.ts._sensitiveMediaDetection.sensitivity }}</template> | ||||||
| 							<template #caption>{{ i18n.ts._sensitiveMediaDetection.sensitivityDescription }}</template> | 							<template #caption>{{ i18n.ts._sensitiveMediaDetection.sensitivityDescription }}</template> | ||||||
| 						</FormRange> | 						</FormRange> | ||||||
| 
 | 
 | ||||||
| 						<FormSwitch v-model="enableSensitiveMediaDetectionForVideos" class="_formBlock"> | 						<FormSwitch v-model="enableSensitiveMediaDetectionForVideos"> | ||||||
| 							<template #label>{{ i18n.ts._sensitiveMediaDetection.analyzeVideos }}<span class="_beta">{{ i18n.ts.beta }}</span></template> | 							<template #label>{{ i18n.ts._sensitiveMediaDetection.analyzeVideos }}<span class="_beta">{{ i18n.ts.beta }}</span></template> | ||||||
| 							<template #caption>{{ i18n.ts._sensitiveMediaDetection.analyzeVideosDescription }}</template> | 							<template #caption>{{ i18n.ts._sensitiveMediaDetection.analyzeVideosDescription }}</template> | ||||||
| 						</FormSwitch> | 						</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 						<FormSwitch v-model="setSensitiveFlagAutomatically" class="_formBlock"> | 						<FormSwitch v-model="setSensitiveFlagAutomatically"> | ||||||
| 							<template #label>{{ i18n.ts._sensitiveMediaDetection.setSensitiveFlagAutomatically }} ({{ i18n.ts.notRecommended }})</template> | 							<template #label>{{ i18n.ts._sensitiveMediaDetection.setSensitiveFlagAutomatically }} ({{ i18n.ts.notRecommended }})</template> | ||||||
| 							<template #caption>{{ i18n.ts._sensitiveMediaDetection.setSensitiveFlagAutomaticallyDescription }}</template> | 							<template #caption>{{ i18n.ts._sensitiveMediaDetection.setSensitiveFlagAutomaticallyDescription }}</template> | ||||||
| 						</FormSwitch> | 						</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 						<!-- 現状 false positive が多すぎて実用に耐えない | 						<!-- 現状 false positive が多すぎて実用に耐えない | ||||||
| 						<FormSwitch v-model="disallowUploadWhenPredictedAsPorn" class="_formBlock"> | 						<FormSwitch v-model="disallowUploadWhenPredictedAsPorn"> | ||||||
| 							<template #label>{{ i18n.ts._sensitiveMediaDetection.disallowUploadWhenPredictedAsPorn }}</template> | 							<template #label>{{ i18n.ts._sensitiveMediaDetection.disallowUploadWhenPredictedAsPorn }}</template> | ||||||
| 						</FormSwitch> | 						</FormSwitch> | ||||||
| 						--> | 						--> | ||||||
| 
 | 
 | ||||||
| 						<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | 						<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | ||||||
| 					</div> | 					</div> | ||||||
| 				</FormFolder> | 				</FormFolder> | ||||||
| 
 | 
 | ||||||
| 				<FormFolder class="_formBlock"> | 				<FormFolder> | ||||||
| 					<template #label>Active Email Validation</template> | 					<template #label>Active Email Validation</template> | ||||||
| 					<template v-if="enableActiveEmailValidation" #suffix>Enabled</template> | 					<template v-if="enableActiveEmailValidation" #suffix>Enabled</template> | ||||||
| 					<template v-else #suffix>Disabled</template> | 					<template v-else #suffix>Disabled</template> | ||||||
| 
 | 
 | ||||||
| 					<div class="_formRoot"> | 					<div class="_autoGap"> | ||||||
| 						<span class="_formBlock">{{ i18n.ts.activeEmailValidationDescription }}</span> | 						<span>{{ i18n.ts.activeEmailValidationDescription }}</span> | ||||||
| 						<FormSwitch v-model="enableActiveEmailValidation" class="_formBlock" @update:model-value="save"> | 						<FormSwitch v-model="enableActiveEmailValidation" @update:model-value="save"> | ||||||
| 							<template #label>Enable</template> | 							<template #label>Enable</template> | ||||||
| 						</FormSwitch> | 						</FormSwitch> | ||||||
| 					</div> | 					</div> | ||||||
| 				</FormFolder> | 				</FormFolder> | ||||||
| 
 | 
 | ||||||
| 				<FormFolder class="_formBlock"> | 				<FormFolder> | ||||||
| 					<template #label>Log IP address</template> | 					<template #label>Log IP address</template> | ||||||
| 					<template v-if="enableIpLogging" #suffix>Enabled</template> | 					<template v-if="enableIpLogging" #suffix>Enabled</template> | ||||||
| 					<template v-else #suffix>Disabled</template> | 					<template v-else #suffix>Disabled</template> | ||||||
| 
 | 
 | ||||||
| 					<div class="_formRoot"> | 					<div class="_autoGap"> | ||||||
| 						<FormSwitch v-model="enableIpLogging" class="_formBlock" @update:model-value="save"> | 						<FormSwitch v-model="enableIpLogging" @update:model-value="save"> | ||||||
| 							<template #label>Enable</template> | 							<template #label>Enable</template> | ||||||
| 						</FormSwitch> | 						</FormSwitch> | ||||||
| 					</div> | 					</div> | ||||||
| 				</FormFolder> | 				</FormFolder> | ||||||
| 
 | 
 | ||||||
| 				<FormFolder class="_formBlock"> | 				<FormFolder> | ||||||
| 					<template #label>Summaly Proxy</template> | 					<template #label>Summaly Proxy</template> | ||||||
| 
 | 
 | ||||||
| 					<div class="_formRoot"> | 					<div class="_autoGap"> | ||||||
| 						<FormInput v-model="summalyProxy" class="_formBlock"> | 						<FormInput v-model="summalyProxy"> | ||||||
| 							<template #prefix><i class="ti ti-link"></i></template> | 							<template #prefix><i class="ti ti-link"></i></template> | ||||||
| 							<template #label>Summaly Proxy URL</template> | 							<template #label>Summaly Proxy URL</template> | ||||||
| 						</FormInput> | 						</FormInput> | ||||||
| 
 | 
 | ||||||
| 						<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | 						<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton> | ||||||
| 					</div> | 					</div> | ||||||
| 				</FormFolder> | 				</FormFolder> | ||||||
| 			</div> | 			</div> | ||||||
|  |  | ||||||
|  | @ -4,141 +4,153 @@ | ||||||
| 		<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | 		<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 		<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | 		<MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> | ||||||
| 			<FormSuspense :p="init"> | 			<FormSuspense :p="init"> | ||||||
| 				<div class="_formRoot"> | 				<div class="_autoGap"> | ||||||
| 					<FormInput v-model="name" class="_formBlock"> | 					<FormInput v-model="name"> | ||||||
| 						<template #label>{{ i18n.ts.instanceName }}</template> | 						<template #label>{{ i18n.ts.instanceName }}</template> | ||||||
| 					</FormInput> | 					</FormInput> | ||||||
| 
 | 
 | ||||||
| 					<FormTextarea v-model="description" class="_formBlock"> | 					<FormTextarea v-model="description"> | ||||||
| 						<template #label>{{ i18n.ts.instanceDescription }}</template> | 						<template #label>{{ i18n.ts.instanceDescription }}</template> | ||||||
| 					</FormTextarea> | 					</FormTextarea> | ||||||
| 
 | 
 | ||||||
| 					<FormInput v-model="tosUrl" class="_formBlock"> | 					<FormInput v-model="tosUrl"> | ||||||
| 						<template #prefix><i class="ti ti-link"></i></template> | 						<template #prefix><i class="ti ti-link"></i></template> | ||||||
| 						<template #label>{{ i18n.ts.tosUrl }}</template> | 						<template #label>{{ i18n.ts.tosUrl }}</template> | ||||||
| 					</FormInput> | 					</FormInput> | ||||||
| 
 | 
 | ||||||
| 					<FormSplit :min-width="300"> | 					<FormSplit :min-width="300"> | ||||||
| 						<FormInput v-model="maintainerName" class="_formBlock"> | 						<FormInput v-model="maintainerName"> | ||||||
| 							<template #label>{{ i18n.ts.maintainerName }}</template> | 							<template #label>{{ i18n.ts.maintainerName }}</template> | ||||||
| 						</FormInput> | 						</FormInput> | ||||||
| 
 | 
 | ||||||
| 						<FormInput v-model="maintainerEmail" type="email" class="_formBlock"> | 						<FormInput v-model="maintainerEmail" type="email"> | ||||||
| 							<template #prefix><i class="ti ti-mail"></i></template> | 							<template #prefix><i class="ti ti-mail"></i></template> | ||||||
| 							<template #label>{{ i18n.ts.maintainerEmail }}</template> | 							<template #label>{{ i18n.ts.maintainerEmail }}</template> | ||||||
| 						</FormInput> | 						</FormInput> | ||||||
| 					</FormSplit> | 					</FormSplit> | ||||||
| 
 | 
 | ||||||
| 					<FormTextarea v-model="pinnedUsers" class="_formBlock"> | 					<FormTextarea v-model="pinnedUsers"> | ||||||
| 						<template #label>{{ i18n.ts.pinnedUsers }}</template> | 						<template #label>{{ i18n.ts.pinnedUsers }}</template> | ||||||
| 						<template #caption>{{ i18n.ts.pinnedUsersDescription }}</template> | 						<template #caption>{{ i18n.ts.pinnedUsersDescription }}</template> | ||||||
| 					</FormTextarea> | 					</FormTextarea> | ||||||
| 
 | 
 | ||||||
| 					<FormSection> | 					<FormSection> | ||||||
| 						<FormSwitch v-model="enableRegistration" class="_formBlock"> | 						<div class="_autoGap_half"> | ||||||
|  | 							<FormSwitch v-model="enableRegistration"> | ||||||
| 								<template #label>{{ i18n.ts.enableRegistration }}</template> | 								<template #label>{{ i18n.ts.enableRegistration }}</template> | ||||||
| 							</FormSwitch> | 							</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 						<FormSwitch v-model="emailRequiredForSignup" class="_formBlock"> | 							<FormSwitch v-model="emailRequiredForSignup"> | ||||||
| 								<template #label>{{ i18n.ts.emailRequiredForSignup }}</template> | 								<template #label>{{ i18n.ts.emailRequiredForSignup }}</template> | ||||||
| 							</FormSwitch> | 							</FormSwitch> | ||||||
|  | 						</div> | ||||||
| 					</FormSection> | 					</FormSection> | ||||||
| 
 | 
 | ||||||
| 					<FormSection> | 					<FormSection> | ||||||
| 						<FormSwitch v-model="enableLocalTimeline" class="_formBlock">{{ i18n.ts.enableLocalTimeline }}</FormSwitch> | 						<div class="_autoGap_half"> | ||||||
| 						<FormSwitch v-model="enableGlobalTimeline" class="_formBlock">{{ i18n.ts.enableGlobalTimeline }}</FormSwitch> | 							<FormSwitch v-model="enableLocalTimeline">{{ i18n.ts.enableLocalTimeline }}</FormSwitch> | ||||||
| 						<FormInfo class="_formBlock">{{ i18n.ts.disablingTimelinesInfo }}</FormInfo> | 							<FormSwitch v-model="enableGlobalTimeline">{{ i18n.ts.enableGlobalTimeline }}</FormSwitch> | ||||||
|  | 							<FormInfo>{{ i18n.ts.disablingTimelinesInfo }}</FormInfo> | ||||||
|  | 						</div> | ||||||
| 					</FormSection> | 					</FormSection> | ||||||
| 
 | 
 | ||||||
| 					<FormSection> | 					<FormSection> | ||||||
| 						<template #label>{{ i18n.ts.theme }}</template> | 						<template #label>{{ i18n.ts.theme }}</template> | ||||||
| 
 | 
 | ||||||
| 						<FormInput v-model="iconUrl" class="_formBlock"> | 						<div class="_autoGap"> | ||||||
|  | 							<FormInput v-model="iconUrl"> | ||||||
| 								<template #prefix><i class="ti ti-link"></i></template> | 								<template #prefix><i class="ti ti-link"></i></template> | ||||||
| 								<template #label>{{ i18n.ts.iconUrl }}</template> | 								<template #label>{{ i18n.ts.iconUrl }}</template> | ||||||
| 							</FormInput> | 							</FormInput> | ||||||
| 
 | 
 | ||||||
| 						<FormInput v-model="bannerUrl" class="_formBlock"> | 							<FormInput v-model="bannerUrl"> | ||||||
| 								<template #prefix><i class="ti ti-link"></i></template> | 								<template #prefix><i class="ti ti-link"></i></template> | ||||||
| 								<template #label>{{ i18n.ts.bannerUrl }}</template> | 								<template #label>{{ i18n.ts.bannerUrl }}</template> | ||||||
| 							</FormInput> | 							</FormInput> | ||||||
| 
 | 
 | ||||||
| 						<FormInput v-model="backgroundImageUrl" class="_formBlock"> | 							<FormInput v-model="backgroundImageUrl"> | ||||||
| 								<template #prefix><i class="ti ti-link"></i></template> | 								<template #prefix><i class="ti ti-link"></i></template> | ||||||
| 								<template #label>{{ i18n.ts.backgroundImageUrl }}</template> | 								<template #label>{{ i18n.ts.backgroundImageUrl }}</template> | ||||||
| 							</FormInput> | 							</FormInput> | ||||||
| 
 | 
 | ||||||
| 						<FormInput v-model="themeColor" class="_formBlock"> | 							<FormInput v-model="themeColor"> | ||||||
| 								<template #prefix><i class="ti ti-palette"></i></template> | 								<template #prefix><i class="ti ti-palette"></i></template> | ||||||
| 								<template #label>{{ i18n.ts.themeColor }}</template> | 								<template #label>{{ i18n.ts.themeColor }}</template> | ||||||
| 								<template #caption>#RRGGBB</template> | 								<template #caption>#RRGGBB</template> | ||||||
| 							</FormInput> | 							</FormInput> | ||||||
| 
 | 
 | ||||||
| 						<FormTextarea v-model="defaultLightTheme" class="_formBlock"> | 							<FormTextarea v-model="defaultLightTheme"> | ||||||
| 								<template #label>{{ i18n.ts.instanceDefaultLightTheme }}</template> | 								<template #label>{{ i18n.ts.instanceDefaultLightTheme }}</template> | ||||||
| 								<template #caption>{{ i18n.ts.instanceDefaultThemeDescription }}</template> | 								<template #caption>{{ i18n.ts.instanceDefaultThemeDescription }}</template> | ||||||
| 							</FormTextarea> | 							</FormTextarea> | ||||||
| 
 | 
 | ||||||
| 						<FormTextarea v-model="defaultDarkTheme" class="_formBlock"> | 							<FormTextarea v-model="defaultDarkTheme"> | ||||||
| 								<template #label>{{ i18n.ts.instanceDefaultDarkTheme }}</template> | 								<template #label>{{ i18n.ts.instanceDefaultDarkTheme }}</template> | ||||||
| 								<template #caption>{{ i18n.ts.instanceDefaultThemeDescription }}</template> | 								<template #caption>{{ i18n.ts.instanceDefaultThemeDescription }}</template> | ||||||
| 							</FormTextarea> | 							</FormTextarea> | ||||||
|  | 						</div> | ||||||
| 					</FormSection> | 					</FormSection> | ||||||
| 
 | 
 | ||||||
| 					<FormSection> | 					<FormSection> | ||||||
| 						<template #label>{{ i18n.ts.files }}</template> | 						<template #label>{{ i18n.ts.files }}</template> | ||||||
| 
 | 
 | ||||||
| 						<FormSwitch v-model="cacheRemoteFiles" class="_formBlock"> | 						<div class="_autoGap"> | ||||||
|  | 							<FormSwitch v-model="cacheRemoteFiles"> | ||||||
| 								<template #label>{{ i18n.ts.cacheRemoteFiles }}</template> | 								<template #label>{{ i18n.ts.cacheRemoteFiles }}</template> | ||||||
| 								<template #caption>{{ i18n.ts.cacheRemoteFilesDescription }}</template> | 								<template #caption>{{ i18n.ts.cacheRemoteFilesDescription }}</template> | ||||||
| 							</FormSwitch> | 							</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 							<FormSplit :min-width="280"> | 							<FormSplit :min-width="280"> | ||||||
| 							<FormInput v-model="localDriveCapacityMb" type="number" class="_formBlock"> | 								<FormInput v-model="localDriveCapacityMb" type="number"> | ||||||
| 									<template #label>{{ i18n.ts.driveCapacityPerLocalAccount }}</template> | 									<template #label>{{ i18n.ts.driveCapacityPerLocalAccount }}</template> | ||||||
| 									<template #suffix>MB</template> | 									<template #suffix>MB</template> | ||||||
| 									<template #caption>{{ i18n.ts.inMb }}</template> | 									<template #caption>{{ i18n.ts.inMb }}</template> | ||||||
| 								</FormInput> | 								</FormInput> | ||||||
| 
 | 
 | ||||||
| 							<FormInput v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles" class="_formBlock"> | 								<FormInput v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles"> | ||||||
| 									<template #label>{{ i18n.ts.driveCapacityPerRemoteAccount }}</template> | 									<template #label>{{ i18n.ts.driveCapacityPerRemoteAccount }}</template> | ||||||
| 									<template #suffix>MB</template> | 									<template #suffix>MB</template> | ||||||
| 									<template #caption>{{ i18n.ts.inMb }}</template> | 									<template #caption>{{ i18n.ts.inMb }}</template> | ||||||
| 								</FormInput> | 								</FormInput> | ||||||
| 							</FormSplit> | 							</FormSplit> | ||||||
|  | 						</div> | ||||||
| 					</FormSection> | 					</FormSection> | ||||||
| 
 | 
 | ||||||
| 					<FormSection> | 					<FormSection> | ||||||
| 						<template #label>ServiceWorker</template> | 						<template #label>ServiceWorker</template> | ||||||
| 
 | 
 | ||||||
| 						<FormSwitch v-model="enableServiceWorker" class="_formBlock"> | 						<div class="_autoGap"> | ||||||
|  | 							<FormSwitch v-model="enableServiceWorker"> | ||||||
| 								<template #label>{{ i18n.ts.enableServiceworker }}</template> | 								<template #label>{{ i18n.ts.enableServiceworker }}</template> | ||||||
| 								<template #caption>{{ i18n.ts.serviceworkerInfo }}</template> | 								<template #caption>{{ i18n.ts.serviceworkerInfo }}</template> | ||||||
| 							</FormSwitch> | 							</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 							<template v-if="enableServiceWorker"> | 							<template v-if="enableServiceWorker"> | ||||||
| 							<FormInput v-model="swPublicKey" class="_formBlock"> | 								<FormInput v-model="swPublicKey"> | ||||||
| 									<template #prefix><i class="ti ti-key"></i></template> | 									<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 									<template #label>Public key</template> | 									<template #label>Public key</template> | ||||||
| 								</FormInput> | 								</FormInput> | ||||||
| 
 | 
 | ||||||
| 							<FormInput v-model="swPrivateKey" class="_formBlock"> | 								<FormInput v-model="swPrivateKey"> | ||||||
| 									<template #prefix><i class="ti ti-key"></i></template> | 									<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 									<template #label>Private key</template> | 									<template #label>Private key</template> | ||||||
| 								</FormInput> | 								</FormInput> | ||||||
| 							</template> | 							</template> | ||||||
|  | 						</div> | ||||||
| 					</FormSection> | 					</FormSection> | ||||||
| 
 | 
 | ||||||
| 					<FormSection> | 					<FormSection> | ||||||
| 						<template #label>DeepL Translation</template> | 						<template #label>DeepL Translation</template> | ||||||
| 
 | 
 | ||||||
| 						<FormInput v-model="deeplAuthKey" class="_formBlock"> | 						<div class="_autoGap"> | ||||||
|  | 							<FormInput v-model="deeplAuthKey"> | ||||||
| 								<template #prefix><i class="ti ti-key"></i></template> | 								<template #prefix><i class="ti ti-key"></i></template> | ||||||
| 								<template #label>DeepL Auth Key</template> | 								<template #label>DeepL Auth Key</template> | ||||||
| 							</FormInput> | 							</FormInput> | ||||||
| 						<FormSwitch v-model="deeplIsPro" class="_formBlock"> | 							<FormSwitch v-model="deeplIsPro"> | ||||||
| 								<template #label>Pro account</template> | 								<template #label>Pro account</template> | ||||||
| 							</FormSwitch> | 							</FormSwitch> | ||||||
|  | 						</div> | ||||||
| 					</FormSection> | 					</FormSection> | ||||||
| 				</div> | 				</div> | ||||||
| 			</FormSuspense> | 			</FormSuspense> | ||||||
|  |  | ||||||
|  | @ -2,23 +2,23 @@ | ||||||
| <MkStickyContainer> | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="700"> | 	<MkSpacer :content-max="700"> | ||||||
| 		<div class="_formRoot"> | 		<div class="_autoGap"> | ||||||
| 			<div class="_formBlock"> | 			<div class="_autoGap"> | ||||||
| 				<MkInput v-model="endpoint" :datalist="endpoints" class="_formBlock" @update:model-value="onEndpointChange()"> | 				<MkInput v-model="endpoint" :datalist="endpoints" @update:model-value="onEndpointChange()"> | ||||||
| 					<template #label>Endpoint</template> | 					<template #label>Endpoint</template> | ||||||
| 				</MkInput> | 				</MkInput> | ||||||
| 				<MkTextarea v-model="body" class="_formBlock" code> | 				<MkTextarea v-model="body" code> | ||||||
| 					<template #label>Params (JSON or JSON5)</template> | 					<template #label>Params (JSON or JSON5)</template> | ||||||
| 				</MkTextarea> | 				</MkTextarea> | ||||||
| 				<MkSwitch v-model="withCredential" class="_formBlock"> | 				<MkSwitch v-model="withCredential"> | ||||||
| 					With credential | 					With credential | ||||||
| 				</MkSwitch> | 				</MkSwitch> | ||||||
| 				<MkButton class="_formBlock" primary :disabled="sending" @click="send"> | 				<MkButton primary :disabled="sending" @click="send"> | ||||||
| 					<template v-if="sending"><MkEllipsis/></template> | 					<template v-if="sending"><MkEllipsis/></template> | ||||||
| 					<template v-else><i class="ti ti-send"></i> Send</template> | 					<template v-else><i class="ti ti-send"></i> Send</template> | ||||||
| 				</MkButton> | 				</MkButton> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div v-if="res" class="_formBlock"> | 			<div v-if="res"> | ||||||
| 				<MkTextarea v-model="res" code readonly tall> | 				<MkTextarea v-model="res" code readonly tall> | ||||||
| 					<template #label>Response</template> | 					<template #label>Response</template> | ||||||
| 				</MkTextarea> | 				</MkTextarea> | ||||||
|  |  | ||||||
|  | @ -2,12 +2,12 @@ | ||||||
| <MkStickyContainer> | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="700"> | 	<MkSpacer :content-max="700"> | ||||||
| 		<div class="_formRoot"> | 		<div class="_autoGap"> | ||||||
| 			<MkInput v-model="name" class="_formBlock"> | 			<MkInput v-model="name"> | ||||||
| 				<template #label>{{ i18n.ts.name }}</template> | 				<template #label>{{ i18n.ts.name }}</template> | ||||||
| 			</MkInput> | 			</MkInput> | ||||||
| 
 | 
 | ||||||
| 			<MkTextarea v-model="description" class="_formBlock"> | 			<MkTextarea v-model="description"> | ||||||
| 				<template #label>{{ i18n.ts.description }}</template> | 				<template #label>{{ i18n.ts.description }}</template> | ||||||
| 			</MkTextarea> | 			</MkTextarea> | ||||||
| 
 | 
 | ||||||
|  | @ -18,7 +18,7 @@ | ||||||
| 					<MkButton @click="removeBannerImage()"><i class="ti ti-trash"></i> {{ i18n.ts._channel.removeBanner }}</MkButton> | 					<MkButton @click="removeBannerImage()"><i class="ti ti-trash"></i> {{ i18n.ts._channel.removeBanner }}</MkButton> | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="_formBlock"> | 			<div> | ||||||
| 				<MkButton primary @click="save()"><i class="ti ti-device-floppy"></i> {{ channelId ? i18n.ts.save : i18n.ts.create }}</MkButton> | 				<MkButton primary @click="save()"><i class="ti ti-device-floppy"></i> {{ channelId ? i18n.ts.save : i18n.ts.create }}</MkButton> | ||||||
| 			</div> | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ | ||||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="700"> | 	<MkSpacer :content-max="700"> | ||||||
| 		<div v-if="channel"> | 		<div v-if="channel"> | ||||||
| 			<div class="wpgynlbz _panel _gap" :class="{ hide: !showBanner }"> | 			<div class="wpgynlbz _panel _margin" :class="{ hide: !showBanner }"> | ||||||
| 				<XChannelFollowButton :channel="channel" :full="true" class="subscribe"/> | 				<XChannelFollowButton :channel="channel" :full="true" class="subscribe"/> | ||||||
| 				<button class="_button toggle" @click="() => showBanner = !showBanner"> | 				<button class="_button toggle" @click="() => showBanner = !showBanner"> | ||||||
| 					<template v-if="showBanner"><i class="ti ti-chevron-up"></i></template> | 					<template v-if="showBanner"><i class="ti ti-chevron-up"></i></template> | ||||||
|  | @ -23,9 +23,9 @@ | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 
 | 
 | ||||||
| 			<XPostForm v-if="$i" :channel="channel" class="post-form _panel _gap" fixed/> | 			<XPostForm v-if="$i" :channel="channel" class="post-form _panel _margin" fixed/> | ||||||
| 
 | 
 | ||||||
| 			<XTimeline :key="channelId" class="_gap" src="channel" :channel="channelId" @before="before" @after="after"/> | 			<XTimeline :key="channelId" class="_margin" src="channel" :channel="channelId" @before="before" @after="after"/> | ||||||
| 		</div> | 		</div> | ||||||
| 	</MkSpacer> | 	</MkSpacer> | ||||||
| </MkStickyContainer> | </MkStickyContainer> | ||||||
|  |  | ||||||
|  | @ -4,18 +4,18 @@ | ||||||
| 	<MkSpacer :content-max="700"> | 	<MkSpacer :content-max="700"> | ||||||
| 		<div v-if="tab === 'featured'" class="_content grwlizim featured"> | 		<div v-if="tab === 'featured'" class="_content grwlizim featured"> | ||||||
| 			<MkPagination v-slot="{items}" :pagination="featuredPagination"> | 			<MkPagination v-slot="{items}" :pagination="featuredPagination"> | ||||||
| 				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_gap" :channel="channel"/> | 				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_margin" :channel="channel"/> | ||||||
| 			</MkPagination> | 			</MkPagination> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div v-else-if="tab === 'following'" class="_content grwlizim following"> | 		<div v-else-if="tab === 'following'" class="_content grwlizim following"> | ||||||
| 			<MkPagination v-slot="{items}" :pagination="followingPagination"> | 			<MkPagination v-slot="{items}" :pagination="followingPagination"> | ||||||
| 				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_gap" :channel="channel"/> | 				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_margin" :channel="channel"/> | ||||||
| 			</MkPagination> | 			</MkPagination> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div v-else-if="tab === 'owned'" class="_content grwlizim owned"> | 		<div v-else-if="tab === 'owned'" class="_content grwlizim owned"> | ||||||
| 			<MkButton class="new" @click="create()"><i class="ti ti-plus"></i></MkButton> | 			<MkButton class="new" @click="create()"><i class="ti ti-plus"></i></MkButton> | ||||||
| 			<MkPagination v-slot="{items}" :pagination="ownedPagination"> | 			<MkPagination v-slot="{items}" :pagination="ownedPagination"> | ||||||
| 				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_gap" :channel="channel"/> | 				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_margin" :channel="channel"/> | ||||||
| 			</MkPagination> | 			</MkPagination> | ||||||
| 		</div> | 		</div> | ||||||
| 	</MkSpacer> | 	</MkSpacer> | ||||||
|  |  | ||||||
|  | @ -6,26 +6,26 @@ | ||||||
| 	</MkTab> | 	</MkTab> | ||||||
| 	<div v-if="origin === 'local'"> | 	<div v-if="origin === 'local'"> | ||||||
| 		<template v-if="tag == null"> | 		<template v-if="tag == null"> | ||||||
| 			<MkFolder class="_gap" persist-key="explore-pinned-users"> | 			<MkFolder class="_margin" persist-key="explore-pinned-users"> | ||||||
| 				<template #header><i class="fas fa-bookmark ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.pinnedUsers }}</template> | 				<template #header><i class="fas fa-bookmark ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.pinnedUsers }}</template> | ||||||
| 				<XUserList :pagination="pinnedUsers"/> | 				<XUserList :pagination="pinnedUsers"/> | ||||||
| 			</MkFolder> | 			</MkFolder> | ||||||
| 			<MkFolder class="_gap" persist-key="explore-popular-users"> | 			<MkFolder class="_margin" persist-key="explore-popular-users"> | ||||||
| 				<template #header><i class="fas fa-chart-line ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.popularUsers }}</template> | 				<template #header><i class="fas fa-chart-line ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.popularUsers }}</template> | ||||||
| 				<XUserList :pagination="popularUsers"/> | 				<XUserList :pagination="popularUsers"/> | ||||||
| 			</MkFolder> | 			</MkFolder> | ||||||
| 			<MkFolder class="_gap" persist-key="explore-recently-updated-users"> | 			<MkFolder class="_margin" persist-key="explore-recently-updated-users"> | ||||||
| 				<template #header><i class="fas fa-comment-alt ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyUpdatedUsers }}</template> | 				<template #header><i class="fas fa-comment-alt ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyUpdatedUsers }}</template> | ||||||
| 				<XUserList :pagination="recentlyUpdatedUsers"/> | 				<XUserList :pagination="recentlyUpdatedUsers"/> | ||||||
| 			</MkFolder> | 			</MkFolder> | ||||||
| 			<MkFolder class="_gap" persist-key="explore-recently-registered-users"> | 			<MkFolder class="_margin" persist-key="explore-recently-registered-users"> | ||||||
| 				<template #header><i class="ti ti-plus ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyRegisteredUsers }}</template> | 				<template #header><i class="ti ti-plus ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyRegisteredUsers }}</template> | ||||||
| 				<XUserList :pagination="recentlyRegisteredUsers"/> | 				<XUserList :pagination="recentlyRegisteredUsers"/> | ||||||
| 			</MkFolder> | 			</MkFolder> | ||||||
| 		</template> | 		</template> | ||||||
| 	</div> | 	</div> | ||||||
| 	<div v-else> | 	<div v-else> | ||||||
| 		<MkFolder ref="tagsEl" :foldable="true" :expanded="false" class="_gap"> | 		<MkFolder ref="tagsEl" :foldable="true" :expanded="false" class="_margin"> | ||||||
| 			<template #header><i class="ti ti-hash ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.popularTags }}</template> | 			<template #header><i class="ti ti-hash ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.popularTags }}</template> | ||||||
| 
 | 
 | ||||||
| 			<div class="vxjfqztj"> | 			<div class="vxjfqztj"> | ||||||
|  | @ -34,21 +34,21 @@ | ||||||
| 			</div> | 			</div> | ||||||
| 		</MkFolder> | 		</MkFolder> | ||||||
| 
 | 
 | ||||||
| 		<MkFolder v-if="tag != null" :key="`${tag}`" class="_gap"> | 		<MkFolder v-if="tag != null" :key="`${tag}`" class="_margin"> | ||||||
| 			<template #header><i class="ti ti-hash ti-fw" style="margin-right: 0.5em;"></i>{{ tag }}</template> | 			<template #header><i class="ti ti-hash ti-fw" style="margin-right: 0.5em;"></i>{{ tag }}</template> | ||||||
| 			<XUserList :pagination="tagUsers"/> | 			<XUserList :pagination="tagUsers"/> | ||||||
| 		</MkFolder> | 		</MkFolder> | ||||||
| 
 | 
 | ||||||
| 		<template v-if="tag == null"> | 		<template v-if="tag == null"> | ||||||
| 			<MkFolder class="_gap"> | 			<MkFolder class="_margin"> | ||||||
| 				<template #header><i class="fas fa-chart-line ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.popularUsers }}</template> | 				<template #header><i class="fas fa-chart-line ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.popularUsers }}</template> | ||||||
| 				<XUserList :pagination="popularUsersF"/> | 				<XUserList :pagination="popularUsersF"/> | ||||||
| 			</MkFolder> | 			</MkFolder> | ||||||
| 			<MkFolder class="_gap"> | 			<MkFolder class="_margin"> | ||||||
| 				<template #header><i class="fas fa-comment-alt ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyUpdatedUsers }}</template> | 				<template #header><i class="fas fa-comment-alt ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyUpdatedUsers }}</template> | ||||||
| 				<XUserList :pagination="recentlyUpdatedUsersF"/> | 				<XUserList :pagination="recentlyUpdatedUsersF"/> | ||||||
| 			</MkFolder> | 			</MkFolder> | ||||||
| 			<MkFolder class="_gap"> | 			<MkFolder class="_margin"> | ||||||
| 				<template #header><i class="fas fa-rocket ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyDiscoveredUsers }}</template> | 				<template #header><i class="fas fa-rocket ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyDiscoveredUsers }}</template> | ||||||
| 				<XUserList :pagination="recentlyRegisteredUsersF"/> | 				<XUserList :pagination="recentlyRegisteredUsersF"/> | ||||||
| 			</MkFolder> | 			</MkFolder> | ||||||
|  |  | ||||||
|  | @ -11,18 +11,18 @@ | ||||||
| 		<div v-else-if="tab === 'search'"> | 		<div v-else-if="tab === 'search'"> | ||||||
| 			<MkSpacer :content-max="1200"> | 			<MkSpacer :content-max="1200"> | ||||||
| 				<div> | 				<div> | ||||||
| 					<MkInput v-model="searchQuery" :debounce="true" type="search" class="_formBlock"> | 					<MkInput v-model="searchQuery" :debounce="true" type="search"> | ||||||
| 						<template #prefix><i class="ti ti-search"></i></template> | 						<template #prefix><i class="ti ti-search"></i></template> | ||||||
| 						<template #label>{{ i18n.ts.searchUser }}</template> | 						<template #label>{{ i18n.ts.searchUser }}</template> | ||||||
| 					</MkInput> | 					</MkInput> | ||||||
| 					<MkRadios v-model="searchOrigin" class="_formBlock"> | 					<MkRadios v-model="searchOrigin"> | ||||||
| 						<option value="combined">{{ i18n.ts.all }}</option> | 						<option value="combined">{{ i18n.ts.all }}</option> | ||||||
| 						<option value="local">{{ i18n.ts.local }}</option> | 						<option value="local">{{ i18n.ts.local }}</option> | ||||||
| 						<option value="remote">{{ i18n.ts.remote }}</option> | 						<option value="remote">{{ i18n.ts.remote }}</option> | ||||||
| 					</MkRadios> | 					</MkRadios> | ||||||
| 				</div> | 				</div> | ||||||
| 
 | 
 | ||||||
| 				<XUserList v-if="searchQuery" ref="searchEl" class="_gap" :pagination="searchPagination"/> | 				<XUserList v-if="searchQuery" ref="searchEl" class="_margin" :pagination="searchPagination"/> | ||||||
| 			</MkSpacer> | 			</MkSpacer> | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
|  |  | ||||||
|  | @ -2,19 +2,21 @@ | ||||||
| <MkStickyContainer> | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="700"> | 	<MkSpacer :content-max="700"> | ||||||
| 		<MkInput v-model="title" class="_formBlock"> | 		<div class="_autoGap"> | ||||||
|  | 			<MkInput v-model="title"> | ||||||
| 				<template #label>{{ i18n.ts._play.title }}</template> | 				<template #label>{{ i18n.ts._play.title }}</template> | ||||||
| 			</MkInput> | 			</MkInput> | ||||||
| 		<MkTextarea v-model="summary" class="_formBlock"> | 			<MkTextarea v-model="summary"> | ||||||
| 				<template #label>{{ i18n.ts._play.summary }}</template> | 				<template #label>{{ i18n.ts._play.summary }}</template> | ||||||
| 			</MkTextarea> | 			</MkTextarea> | ||||||
| 		<MkTextarea v-model="script" class="_formBlock _monospace" tall spellcheck="false"> | 			<MkTextarea v-model="script" class="_monospace" tall spellcheck="false"> | ||||||
| 				<template #label>{{ i18n.ts._play.script }}</template> | 				<template #label>{{ i18n.ts._play.script }}</template> | ||||||
| 			</MkTextarea> | 			</MkTextarea> | ||||||
| 			<div style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | 			<div style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | ||||||
| 				<MkButton primary @click="save"><i class="ti ti-check"></i> {{ i18n.ts.save }}</MkButton> | 				<MkButton primary @click="save"><i class="ti ti-check"></i> {{ i18n.ts.save }}</MkButton> | ||||||
| 				<MkButton @click="show"><i class="ti ti-eye"></i> {{ i18n.ts.show }}</MkButton> | 				<MkButton @click="show"><i class="ti ti-eye"></i> {{ i18n.ts.show }}</MkButton> | ||||||
| 			</div> | 			</div> | ||||||
|  | 		</div> | ||||||
| 	</MkSpacer> | 	</MkSpacer> | ||||||
| </MkStickyContainer> | </MkStickyContainer> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -27,7 +27,7 @@ | ||||||
| 						</div> | 						</div> | ||||||
| 					</div> | 					</div> | ||||||
| 				</Transition> | 				</Transition> | ||||||
| 				<FormFolder class="_formBlock"> | 				<FormFolder class="_margin"> | ||||||
| 					<template #icon><i class="ti ti-code"></i></template> | 					<template #icon><i class="ti ti-code"></i></template> | ||||||
| 					<template #label>{{ i18n.ts._play.viewSource }}</template> | 					<template #label>{{ i18n.ts._play.viewSource }}</template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
| 	<MkSpacer :content-max="1400"> | 	<MkSpacer :content-max="1400"> | ||||||
| 		<div class="_root"> | 		<div class="_root"> | ||||||
| 			<div v-if="tab === 'explore'"> | 			<div v-if="tab === 'explore'"> | ||||||
| 				<MkFolder class="_gap"> | 				<MkFolder class="_margin"> | ||||||
| 					<template #header><i class="ti ti-clock"></i>{{ i18n.ts.recentPosts }}</template> | 					<template #header><i class="ti ti-clock"></i>{{ i18n.ts.recentPosts }}</template> | ||||||
| 					<MkPagination v-slot="{items}" :pagination="recentPostsPagination" :disable-auto-load="true"> | 					<MkPagination v-slot="{items}" :pagination="recentPostsPagination" :disable-auto-load="true"> | ||||||
| 						<div class="vfpdbgtk"> | 						<div class="vfpdbgtk"> | ||||||
|  | @ -12,7 +12,7 @@ | ||||||
| 						</div> | 						</div> | ||||||
| 					</MkPagination> | 					</MkPagination> | ||||||
| 				</MkFolder> | 				</MkFolder> | ||||||
| 				<MkFolder class="_gap"> | 				<MkFolder class="_margin"> | ||||||
| 					<template #header><i class="ti ti-comet"></i>{{ i18n.ts.popularPosts }}</template> | 					<template #header><i class="ti ti-comet"></i>{{ i18n.ts.popularPosts }}</template> | ||||||
| 					<MkPagination v-slot="{items}" :pagination="popularPostsPagination" :disable-auto-load="true"> | 					<MkPagination v-slot="{items}" :pagination="popularPostsPagination" :disable-auto-load="true"> | ||||||
| 						<div class="vfpdbgtk"> | 						<div class="vfpdbgtk"> | ||||||
|  |  | ||||||
|  | @ -2,23 +2,25 @@ | ||||||
| <MkStickyContainer> | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer v-if="instance" :content-max="600" :margin-min="16" :margin-max="32"> | 	<MkSpacer v-if="instance" :content-max="600" :margin-min="16" :margin-max="32"> | ||||||
| 		<div v-if="tab === 'overview'" class="_formRoot"> | 		<div v-if="tab === 'overview'" class="_autoGap"> | ||||||
| 			<div class="fnfelxur"> | 			<div class="fnfelxur"> | ||||||
| 				<img :src="faviconUrl" alt="" class="icon"/> | 				<img :src="faviconUrl" alt="" class="icon"/> | ||||||
| 				<span class="name">{{ instance.name || `(${i18n.ts.unknown})` }}</span> | 				<span class="name">{{ instance.name || `(${i18n.ts.unknown})` }}</span> | ||||||
| 			</div> | 			</div> | ||||||
| 			<MkKeyValue :copy="host" oneline style="margin: 1em 0;"> | 			<div style="display: flex; flex-direction: column; gap: 1em;"> | ||||||
|  | 				<MkKeyValue :copy="host" oneline> | ||||||
| 					<template #key>Host</template> | 					<template #key>Host</template> | ||||||
| 					<template #value><span class="_monospace"><MkLink :url="`https://${host}`">{{ host }}</MkLink></span></template> | 					<template #value><span class="_monospace"><MkLink :url="`https://${host}`">{{ host }}</MkLink></span></template> | ||||||
| 				</MkKeyValue> | 				</MkKeyValue> | ||||||
| 			<MkKeyValue oneline style="margin: 1em 0;"> | 				<MkKeyValue oneline> | ||||||
| 					<template #key>{{ i18n.ts.software }}</template> | 					<template #key>{{ i18n.ts.software }}</template> | ||||||
| 					<template #value><span class="_monospace">{{ instance.softwareName || `(${i18n.ts.unknown})` }} / {{ instance.softwareVersion || `(${i18n.ts.unknown})` }}</span></template> | 					<template #value><span class="_monospace">{{ instance.softwareName || `(${i18n.ts.unknown})` }} / {{ instance.softwareVersion || `(${i18n.ts.unknown})` }}</span></template> | ||||||
| 				</MkKeyValue> | 				</MkKeyValue> | ||||||
| 			<MkKeyValue oneline style="margin: 1em 0;"> | 				<MkKeyValue oneline> | ||||||
| 					<template #key>{{ i18n.ts.administrator }}</template> | 					<template #key>{{ i18n.ts.administrator }}</template> | ||||||
| 					<template #value>{{ instance.maintainerName || `(${i18n.ts.unknown})` }} ({{ instance.maintainerEmail || `(${i18n.ts.unknown})` }})</template> | 					<template #value>{{ instance.maintainerName || `(${i18n.ts.unknown})` }} ({{ instance.maintainerEmail || `(${i18n.ts.unknown})` }})</template> | ||||||
| 				</MkKeyValue> | 				</MkKeyValue> | ||||||
|  | 			</div> | ||||||
| 			<MkKeyValue> | 			<MkKeyValue> | ||||||
| 				<template #key>{{ i18n.ts.description }}</template> | 				<template #key>{{ i18n.ts.description }}</template> | ||||||
| 				<template #value>{{ instance.description }}</template> | 				<template #value>{{ instance.description }}</template> | ||||||
|  | @ -26,9 +28,11 @@ | ||||||
| 
 | 
 | ||||||
| 			<FormSection v-if="iAmModerator"> | 			<FormSection v-if="iAmModerator"> | ||||||
| 				<template #label>Moderation</template> | 				<template #label>Moderation</template> | ||||||
| 				<FormSwitch v-model="suspended" class="_formBlock" @update:model-value="toggleSuspend">{{ i18n.ts.stopActivityDelivery }}</FormSwitch> | 				<div class="_autoGap_half"> | ||||||
| 				<FormSwitch v-model="isBlocked" class="_formBlock" @update:model-value="toggleBlock">{{ i18n.ts.blockThisInstance }}</FormSwitch> | 					<FormSwitch v-model="suspended" @update:model-value="toggleSuspend">{{ i18n.ts.stopActivityDelivery }}</FormSwitch> | ||||||
|  | 					<FormSwitch v-model="isBlocked" @update:model-value="toggleBlock">{{ i18n.ts.blockThisInstance }}</FormSwitch> | ||||||
| 					<MkButton @click="refreshMetadata"><i class="ti ti-refresh"></i> Refresh metadata</MkButton> | 					<MkButton @click="refreshMetadata"><i class="ti ti-refresh"></i> Refresh metadata</MkButton> | ||||||
|  | 				</div> | ||||||
| 			</FormSection> | 			</FormSection> | ||||||
| 
 | 
 | ||||||
| 			<FormSection> | 			<FormSection> | ||||||
|  | @ -66,7 +70,7 @@ | ||||||
| 				<FormLink :to="`https://${host}/manifest.json`" external style="margin-bottom: 8px;">manifest.json</FormLink> | 				<FormLink :to="`https://${host}/manifest.json`" external style="margin-bottom: 8px;">manifest.json</FormLink> | ||||||
| 			</FormSection> | 			</FormSection> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div v-else-if="tab === 'chart'" class="_formRoot"> | 		<div v-else-if="tab === 'chart'" class="_autoGap"> | ||||||
| 			<div class="cmhjzshl"> | 			<div class="cmhjzshl"> | ||||||
| 				<div class="selects"> | 				<div class="selects"> | ||||||
| 					<MkSelect v-model="chartSrc" style="margin: 0 10px 0 0; flex: 1;"> | 					<MkSelect v-model="chartSrc" style="margin: 0 10px 0 0; flex: 1;"> | ||||||
|  | @ -91,14 +95,14 @@ | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div v-else-if="tab === 'users'" class="_formRoot"> | 		<div v-else-if="tab === 'users'" class="_autoGap"> | ||||||
| 			<MkPagination v-slot="{items}" :pagination="usersPagination" style="display: grid; grid-template-columns: repeat(auto-fill,minmax(270px,1fr)); grid-gap: 12px;"> | 			<MkPagination v-slot="{items}" :pagination="usersPagination" style="display: grid; grid-template-columns: repeat(auto-fill,minmax(270px,1fr)); grid-gap: 12px;"> | ||||||
| 				<MkA v-for="user in items" :key="user.id" v-tooltip.mfm="`Last posted: ${dateString(user.updatedAt)}`" class="user" :to="`/user-info/${user.id}`"> | 				<MkA v-for="user in items" :key="user.id" v-tooltip.mfm="`Last posted: ${dateString(user.updatedAt)}`" class="user" :to="`/user-info/${user.id}`"> | ||||||
| 					<MkUserCardMini :user="user"/> | 					<MkUserCardMini :user="user"/> | ||||||
| 				</MkA> | 				</MkA> | ||||||
| 			</MkPagination> | 			</MkPagination> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div v-else-if="tab === 'raw'" class="_formRoot"> | 		<div v-else-if="tab === 'raw'" class="_autoGap"> | ||||||
| 			<MkObjectView tall :value="instance"> | 			<MkObjectView tall :value="instance"> | ||||||
| 			</MkObjectView> | 			</MkObjectView> | ||||||
| 		</div> | 		</div> | ||||||
|  |  | ||||||
|  | @ -1,10 +1,11 @@ | ||||||
| <template> | <template> | ||||||
|  | <MkSpacer :content-max="700"> | ||||||
| 	<div class="shaynizk"> | 	<div class="shaynizk"> | ||||||
| 	<div class="form"> | 		<div class="_autoGap"> | ||||||
| 		<MkInput v-model="name" class="_formBlock"> | 			<MkInput v-model="name"> | ||||||
| 				<template #label>{{ i18n.ts.name }}</template> | 				<template #label>{{ i18n.ts.name }}</template> | ||||||
| 			</MkInput> | 			</MkInput> | ||||||
| 		<MkSelect v-model="src" class="_formBlock"> | 			<MkSelect v-model="src"> | ||||||
| 				<template #label>{{ i18n.ts.antennaSource }}</template> | 				<template #label>{{ i18n.ts.antennaSource }}</template> | ||||||
| 				<option value="all">{{ i18n.ts._antennaSources.all }}</option> | 				<option value="all">{{ i18n.ts._antennaSources.all }}</option> | ||||||
| 				<!--<option value="home">{{ i18n.ts._antennaSources.homeTimeline }}</option>--> | 				<!--<option value="home">{{ i18n.ts._antennaSources.homeTimeline }}</option>--> | ||||||
|  | @ -12,36 +13,37 @@ | ||||||
| 				<!--<option value="list">{{ i18n.ts._antennaSources.userList }}</option>--> | 				<!--<option value="list">{{ i18n.ts._antennaSources.userList }}</option>--> | ||||||
| 				<!--<option value="group">{{ i18n.ts._antennaSources.userGroup }}</option>--> | 				<!--<option value="group">{{ i18n.ts._antennaSources.userGroup }}</option>--> | ||||||
| 			</MkSelect> | 			</MkSelect> | ||||||
| 		<MkSelect v-if="src === 'list'" v-model="userListId" class="_formBlock"> | 			<MkSelect v-if="src === 'list'" v-model="userListId"> | ||||||
| 				<template #label>{{ i18n.ts.userList }}</template> | 				<template #label>{{ i18n.ts.userList }}</template> | ||||||
| 				<option v-for="list in userLists" :key="list.id" :value="list.id">{{ list.name }}</option> | 				<option v-for="list in userLists" :key="list.id" :value="list.id">{{ list.name }}</option> | ||||||
| 			</MkSelect> | 			</MkSelect> | ||||||
| 		<MkSelect v-else-if="src === 'group'" v-model="userGroupId" class="_formBlock"> | 			<MkSelect v-else-if="src === 'group'" v-model="userGroupId"> | ||||||
| 				<template #label>{{ i18n.ts.userGroup }}</template> | 				<template #label>{{ i18n.ts.userGroup }}</template> | ||||||
| 				<option v-for="group in userGroups" :key="group.id" :value="group.id">{{ group.name }}</option> | 				<option v-for="group in userGroups" :key="group.id" :value="group.id">{{ group.name }}</option> | ||||||
| 			</MkSelect> | 			</MkSelect> | ||||||
| 		<MkTextarea v-else-if="src === 'users'" v-model="users" class="_formBlock"> | 			<MkTextarea v-else-if="src === 'users'" v-model="users"> | ||||||
| 				<template #label>{{ i18n.ts.users }}</template> | 				<template #label>{{ i18n.ts.users }}</template> | ||||||
| 				<template #caption>{{ i18n.ts.antennaUsersDescription }} <button class="_textButton" @click="addUser">{{ i18n.ts.addUser }}</button></template> | 				<template #caption>{{ i18n.ts.antennaUsersDescription }} <button class="_textButton" @click="addUser">{{ i18n.ts.addUser }}</button></template> | ||||||
| 			</MkTextarea> | 			</MkTextarea> | ||||||
| 		<MkSwitch v-model="withReplies" class="_formBlock">{{ i18n.ts.withReplies }}</MkSwitch> | 			<MkSwitch v-model="withReplies">{{ i18n.ts.withReplies }}</MkSwitch> | ||||||
| 		<MkTextarea v-model="keywords" class="_formBlock"> | 			<MkTextarea v-model="keywords"> | ||||||
| 				<template #label>{{ i18n.ts.antennaKeywords }}</template> | 				<template #label>{{ i18n.ts.antennaKeywords }}</template> | ||||||
| 				<template #caption>{{ i18n.ts.antennaKeywordsDescription }}</template> | 				<template #caption>{{ i18n.ts.antennaKeywordsDescription }}</template> | ||||||
| 			</MkTextarea> | 			</MkTextarea> | ||||||
| 		<MkTextarea v-model="excludeKeywords" class="_formBlock"> | 			<MkTextarea v-model="excludeKeywords"> | ||||||
| 				<template #label>{{ i18n.ts.antennaExcludeKeywords }}</template> | 				<template #label>{{ i18n.ts.antennaExcludeKeywords }}</template> | ||||||
| 				<template #caption>{{ i18n.ts.antennaKeywordsDescription }}</template> | 				<template #caption>{{ i18n.ts.antennaKeywordsDescription }}</template> | ||||||
| 			</MkTextarea> | 			</MkTextarea> | ||||||
| 		<MkSwitch v-model="caseSensitive" class="_formBlock">{{ i18n.ts.caseSensitive }}</MkSwitch> | 			<MkSwitch v-model="caseSensitive">{{ i18n.ts.caseSensitive }}</MkSwitch> | ||||||
| 		<MkSwitch v-model="withFile" class="_formBlock">{{ i18n.ts.withFileAntenna }}</MkSwitch> | 			<MkSwitch v-model="withFile">{{ i18n.ts.withFileAntenna }}</MkSwitch> | ||||||
| 		<MkSwitch v-model="notify" class="_formBlock">{{ i18n.ts.notifyAntenna }}</MkSwitch> | 			<MkSwitch v-model="notify">{{ i18n.ts.notifyAntenna }}</MkSwitch> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div class="actions"> | 		<div class="actions"> | ||||||
| 			<MkButton inline primary @click="saveAntenna()"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton> | 			<MkButton inline primary @click="saveAntenna()"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton> | ||||||
| 			<MkButton v-if="antenna.id != null" inline danger @click="deleteAntenna()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> | 			<MkButton v-if="antenna.id != null" inline danger @click="deleteAntenna()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
|  | </MkSpacer> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <script lang="ts" setup> | <script lang="ts" setup> | ||||||
|  | @ -143,12 +145,9 @@ function addUser() { | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" scoped> | ||||||
| .shaynizk { | .shaynizk { | ||||||
| 	> .form { |  | ||||||
| 		padding: 32px; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	> .actions { | 	> .actions { | ||||||
| 		padding: 24px 32px; | 		margin-top: 16px; | ||||||
|  | 		padding: 24px 0; | ||||||
| 		border-top: solid 0.5px var(--divider); | 		border-top: solid 0.5px var(--divider); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ | ||||||
| 			<MkButton primary class="add" @click="create"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton> | 			<MkButton primary class="add" @click="create"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton> | ||||||
| 
 | 
 | ||||||
| 			<MkPagination v-slot="{items}" ref="pagingComponent" :pagination="pagination" class="list"> | 			<MkPagination v-slot="{items}" ref="pagingComponent" :pagination="pagination" class="list"> | ||||||
| 				<MkA v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _gap"> | 				<MkA v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _margin"> | ||||||
| 					<b>{{ item.name }}</b> | 					<b>{{ item.name }}</b> | ||||||
| 					<div v-if="item.description" class="description">{{ item.description }}</div> | 					<div v-if="item.description" class="description">{{ item.description }}</div> | ||||||
| 				</MkA> | 				</MkA> | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ | ||||||
| 			</Transition> | 			</Transition> | ||||||
| 
 | 
 | ||||||
| 			<Transition :name="$store.state.animation ? '_transition_zoom' : ''" mode="out-in"> | 			<Transition :name="$store.state.animation ? '_transition_zoom' : ''" mode="out-in"> | ||||||
| 				<div v-if="list" class="_section members _gap"> | 				<div v-if="list" class="_section members _margin"> | ||||||
| 					<div class="_title">{{ i18n.ts.members }}</div> | 					<div class="_title">{{ i18n.ts.members }}</div> | ||||||
| 					<div class="_content"> | 					<div class="_content"> | ||||||
| 						<div class="users"> | 						<div class="users"> | ||||||
|  |  | ||||||
|  | @ -5,19 +5,19 @@ | ||||||
| 		<div class="fcuexfpr"> | 		<div class="fcuexfpr"> | ||||||
| 			<Transition :name="$store.state.animation ? 'fade' : ''" mode="out-in"> | 			<Transition :name="$store.state.animation ? 'fade' : ''" mode="out-in"> | ||||||
| 				<div v-if="note" class="note"> | 				<div v-if="note" class="note"> | ||||||
| 					<div v-if="showNext" class="_gap"> | 					<div v-if="showNext" class="_margin"> | ||||||
| 						<XNotes class="_content" :pagination="nextPagination" :no-gap="true"/> | 						<XNotes class="_content" :pagination="nextPagination" :no-gap="true"/> | ||||||
| 					</div> | 					</div> | ||||||
| 
 | 
 | ||||||
| 					<div class="main _gap"> | 					<div class="main _margin"> | ||||||
| 						<MkButton v-if="!showNext && hasNext" class="load next" @click="showNext = true"><i class="ti ti-chevron-up"></i></MkButton> | 						<MkButton v-if="!showNext && hasNext" class="load next" @click="showNext = true"><i class="ti ti-chevron-up"></i></MkButton> | ||||||
| 						<div class="note _gap"> | 						<div class="note _margin"> | ||||||
| 							<MkRemoteCaution v-if="note.user.host != null" :href="note.url ?? note.uri"/> | 							<MkRemoteCaution v-if="note.user.host != null" :href="note.url ?? note.uri"/> | ||||||
| 							<XNoteDetailed :key="note.id" v-model:note="note" class="note"/> | 							<XNoteDetailed :key="note.id" v-model:note="note" class="note"/> | ||||||
| 						</div> | 						</div> | ||||||
| 						<div v-if="clips && clips.length > 0" class="_content clips _gap"> | 						<div v-if="clips && clips.length > 0" class="_content clips _margin"> | ||||||
| 							<div class="title">{{ i18n.ts.clip }}</div> | 							<div class="title">{{ i18n.ts.clip }}</div> | ||||||
| 							<MkA v-for="item in clips" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _gap"> | 							<MkA v-for="item in clips" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _margin"> | ||||||
| 								<b>{{ item.name }}</b> | 								<b>{{ item.name }}</b> | ||||||
| 								<div v-if="item.description" class="description">{{ item.description }}</div> | 								<div v-if="item.description" class="description">{{ item.description }}</div> | ||||||
| 								<div class="user"> | 								<div class="user"> | ||||||
|  | @ -28,7 +28,7 @@ | ||||||
| 						<MkButton v-if="!showPrev && hasPrev" class="load prev" @click="showPrev = true"><i class="ti ti-chevron-down"></i></MkButton> | 						<MkButton v-if="!showPrev && hasPrev" class="load prev" @click="showPrev = true"><i class="ti ti-chevron-down"></i></MkButton> | ||||||
| 					</div> | 					</div> | ||||||
| 
 | 
 | ||||||
| 					<div v-if="showPrev" class="_gap"> | 					<div v-if="showPrev" class="_margin"> | ||||||
| 						<XNotes class="_content" :pagination="prevPagination" :no-gap="true"/> | 						<XNotes class="_content" :pagination="prevPagination" :no-gap="true"/> | ||||||
| 					</div> | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
|  |  | ||||||
|  | @ -10,29 +10,29 @@ | ||||||
| 		</div> | 		</div> | ||||||
| 
 | 
 | ||||||
| 		<div v-if="tab === 'settings'"> | 		<div v-if="tab === 'settings'"> | ||||||
| 			<div class="_formRoot"> | 			<div class="_autoGap"> | ||||||
| 				<MkInput v-model="title" class="_formBlock"> | 				<MkInput v-model="title"> | ||||||
| 					<template #label>{{ $ts._pages.title }}</template> | 					<template #label>{{ $ts._pages.title }}</template> | ||||||
| 				</MkInput> | 				</MkInput> | ||||||
| 
 | 
 | ||||||
| 				<MkInput v-model="summary" class="_formBlock"> | 				<MkInput v-model="summary"> | ||||||
| 					<template #label>{{ $ts._pages.summary }}</template> | 					<template #label>{{ $ts._pages.summary }}</template> | ||||||
| 				</MkInput> | 				</MkInput> | ||||||
| 
 | 
 | ||||||
| 				<MkInput v-model="name" class="_formBlock"> | 				<MkInput v-model="name"> | ||||||
| 					<template #prefix>{{ url }}/@{{ author.username }}/pages/</template> | 					<template #prefix>{{ url }}/@{{ author.username }}/pages/</template> | ||||||
| 					<template #label>{{ $ts._pages.url }}</template> | 					<template #label>{{ $ts._pages.url }}</template> | ||||||
| 				</MkInput> | 				</MkInput> | ||||||
| 
 | 
 | ||||||
| 				<MkSwitch v-model="alignCenter" class="_formBlock">{{ $ts._pages.alignCenter }}</MkSwitch> | 				<MkSwitch v-model="alignCenter">{{ $ts._pages.alignCenter }}</MkSwitch> | ||||||
| 
 | 
 | ||||||
| 				<MkSelect v-model="font" class="_formBlock"> | 				<MkSelect v-model="font"> | ||||||
| 					<template #label>{{ $ts._pages.font }}</template> | 					<template #label>{{ $ts._pages.font }}</template> | ||||||
| 					<option value="serif">{{ $ts._pages.fontSerif }}</option> | 					<option value="serif">{{ $ts._pages.fontSerif }}</option> | ||||||
| 					<option value="sans-serif">{{ $ts._pages.fontSansSerif }}</option> | 					<option value="sans-serif">{{ $ts._pages.fontSansSerif }}</option> | ||||||
| 				</MkSelect> | 				</MkSelect> | ||||||
| 
 | 
 | ||||||
| 				<MkSwitch v-model="hideTitleWhenPinned" class="_formBlock">{{ $ts._pages.hideTitleWhenPinned }}</MkSwitch> | 				<MkSwitch v-model="hideTitleWhenPinned">{{ $ts._pages.hideTitleWhenPinned }}</MkSwitch> | ||||||
| 
 | 
 | ||||||
| 				<div class="eyeCatch"> | 				<div class="eyeCatch"> | ||||||
| 					<MkButton v-if="eyeCatchingImageId == null && !readonly" @click="setEyeCatchingImage"><i class="ti ti-plus"></i> {{ $ts._pages.eyeCatchingImageSet }}</MkButton> | 					<MkButton v-if="eyeCatchingImageId == null && !readonly" @click="setEyeCatchingImage"><i class="ti ti-plus"></i> {{ $ts._pages.eyeCatchingImageSet }}</MkButton> | ||||||
|  |  | ||||||
|  | @ -51,7 +51,7 @@ | ||||||
| 				<MkContainer :max-height="300" :foldable="true" class="other"> | 				<MkContainer :max-height="300" :foldable="true" class="other"> | ||||||
| 					<template #header><i class="ti ti-clock"></i> {{ i18n.ts.recentPosts }}</template> | 					<template #header><i class="ti ti-clock"></i> {{ i18n.ts.recentPosts }}</template> | ||||||
| 					<MkPagination v-slot="{items}" :pagination="otherPostsPagination"> | 					<MkPagination v-slot="{items}" :pagination="otherPostsPagination"> | ||||||
| 						<MkPagePreview v-for="page in items" :key="page.id" :page="page" class="_gap"/> | 						<MkPagePreview v-for="page in items" :key="page.id" :page="page" class="_margin"/> | ||||||
| 					</MkPagination> | 					</MkPagination> | ||||||
| 				</MkContainer> | 				</MkContainer> | ||||||
| 			</div> | 			</div> | ||||||
|  |  | ||||||
|  | @ -2,12 +2,13 @@ | ||||||
| <MkStickyContainer> | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="600" :margin-min="16"> | 	<MkSpacer :content-max="600" :margin-min="16"> | ||||||
|  | 		<div class="_autoGap"> | ||||||
| 			<FormSplit> | 			<FormSplit> | ||||||
| 			<MkKeyValue class="_formBlock"> | 				<MkKeyValue> | ||||||
| 					<template #key>{{ i18n.ts._registry.domain }}</template> | 					<template #key>{{ i18n.ts._registry.domain }}</template> | ||||||
| 					<template #value>{{ i18n.ts.system }}</template> | 					<template #value>{{ i18n.ts.system }}</template> | ||||||
| 				</MkKeyValue> | 				</MkKeyValue> | ||||||
| 			<MkKeyValue class="_formBlock"> | 				<MkKeyValue> | ||||||
| 					<template #key>{{ i18n.ts._registry.scope }}</template> | 					<template #key>{{ i18n.ts._registry.scope }}</template> | ||||||
| 					<template #value>{{ scope.join('/') }}</template> | 					<template #value>{{ scope.join('/') }}</template> | ||||||
| 				</MkKeyValue> | 				</MkKeyValue> | ||||||
|  | @ -21,6 +22,7 @@ | ||||||
| 					<FormLink v-for="key in keys" :to="`/registry/value/system/${scope.join('/')}/${key[0]}`" class="_monospace">{{ key[0] }}<template #suffix>{{ key[1].toUpperCase() }}</template></FormLink> | 					<FormLink v-for="key in keys" :to="`/registry/value/system/${scope.join('/')}/${key[0]}`" class="_monospace">{{ key[0] }}<template #suffix>{{ key[1].toUpperCase() }}</template></FormLink> | ||||||
| 				</div> | 				</div> | ||||||
| 			</FormSection> | 			</FormSection> | ||||||
|  | 		</div> | ||||||
| 	</MkSpacer> | 	</MkSpacer> | ||||||
| </MkStickyContainer> | </MkStickyContainer> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -2,37 +2,39 @@ | ||||||
| <MkStickyContainer> | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="600" :margin-min="16"> | 	<MkSpacer :content-max="600" :margin-min="16"> | ||||||
|  | 		<div class="_autoGap"> | ||||||
| 			<FormInfo warn>{{ i18n.ts.editTheseSettingsMayBreakAccount }}</FormInfo> | 			<FormInfo warn>{{ i18n.ts.editTheseSettingsMayBreakAccount }}</FormInfo> | ||||||
| 
 | 
 | ||||||
| 			<template v-if="value"> | 			<template v-if="value"> | ||||||
| 				<FormSplit> | 				<FormSplit> | ||||||
| 				<MkKeyValue class="_formBlock"> | 					<MkKeyValue> | ||||||
| 						<template #key>{{ i18n.ts._registry.domain }}</template> | 						<template #key>{{ i18n.ts._registry.domain }}</template> | ||||||
| 						<template #value>{{ i18n.ts.system }}</template> | 						<template #value>{{ i18n.ts.system }}</template> | ||||||
| 					</MkKeyValue> | 					</MkKeyValue> | ||||||
| 				<MkKeyValue class="_formBlock"> | 					<MkKeyValue> | ||||||
| 						<template #key>{{ i18n.ts._registry.scope }}</template> | 						<template #key>{{ i18n.ts._registry.scope }}</template> | ||||||
| 						<template #value>{{ scope.join('/') }}</template> | 						<template #value>{{ scope.join('/') }}</template> | ||||||
| 					</MkKeyValue> | 					</MkKeyValue> | ||||||
| 				<MkKeyValue class="_formBlock"> | 					<MkKeyValue> | ||||||
| 						<template #key>{{ i18n.ts._registry.key }}</template> | 						<template #key>{{ i18n.ts._registry.key }}</template> | ||||||
| 						<template #value>{{ key }}</template> | 						<template #value>{{ key }}</template> | ||||||
| 					</MkKeyValue> | 					</MkKeyValue> | ||||||
| 				</FormSplit> | 				</FormSplit> | ||||||
| 				 | 				 | ||||||
| 			<FormTextarea v-model="valueForEditor" tall class="_formBlock _monospace"> | 				<FormTextarea v-model="valueForEditor" tall class="_monospace"> | ||||||
| 					<template #label>{{ i18n.ts.value }} (JSON)</template> | 					<template #label>{{ i18n.ts.value }} (JSON)</template> | ||||||
| 				</FormTextarea> | 				</FormTextarea> | ||||||
| 
 | 
 | ||||||
| 			<MkButton class="_formBlock" primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton> | 				<MkButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton> | ||||||
| 
 | 
 | ||||||
| 			<MkKeyValue class="_formBlock"> | 				<MkKeyValue> | ||||||
| 					<template #key>{{ i18n.ts.updatedAt }}</template> | 					<template #key>{{ i18n.ts.updatedAt }}</template> | ||||||
| 					<template #value><MkTime :time="value.updatedAt" mode="detail"/></template> | 					<template #value><MkTime :time="value.updatedAt" mode="detail"/></template> | ||||||
| 				</MkKeyValue> | 				</MkKeyValue> | ||||||
| 
 | 
 | ||||||
| 				<MkButton danger @click="del"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> | 				<MkButton danger @click="del"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> | ||||||
| 			</template> | 			</template> | ||||||
|  | 		</div> | ||||||
| 	</MkSpacer> | 	</MkSpacer> | ||||||
| </MkStickyContainer> | </MkStickyContainer> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -2,13 +2,13 @@ | ||||||
| <MkStickyContainer> | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer v-if="token" :content-max="700" :margin-min="16" :margin-max="32"> | 	<MkSpacer v-if="token" :content-max="700" :margin-min="16" :margin-max="32"> | ||||||
| 		<div class="_formRoot"> | 		<div class="_autoGap"> | ||||||
| 			<FormInput v-model="password" type="password" class="_formBlock"> | 			<FormInput v-model="password" type="password"> | ||||||
| 				<template #prefix><i class="ti ti-lock"></i></template> | 				<template #prefix><i class="ti ti-lock"></i></template> | ||||||
| 				<template #label>{{ i18n.ts.newPassword }}</template> | 				<template #label>{{ i18n.ts.newPassword }}</template> | ||||||
| 			</FormInput> | 			</FormInput> | ||||||
| 		 | 		 | ||||||
| 			<FormButton primary class="_formBlock" @click="save">{{ i18n.ts.save }}</FormButton> | 			<FormButton primary @click="save">{{ i18n.ts.save }}</FormButton> | ||||||
| 		</div> | 		</div> | ||||||
| 	</MkSpacer> | 	</MkSpacer> | ||||||
| </MkStickyContainer> | </MkStickyContainer> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<MkKeyValue> | 	<MkKeyValue> | ||||||
| 		<template #key>ID</template> | 		<template #key>ID</template> | ||||||
| 		<template #value><span class="_monospace">{{ $i.id }}</span></template> | 		<template #value><span class="_monospace">{{ $i.id }}</span></template> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSuspense :p="init"> | 	<FormSuspense :p="init"> | ||||||
| 		<FormButton primary @click="addAccount"><i class="ti ti-plus"></i> {{ i18n.ts.addAccount }}</FormButton> | 		<FormButton primary @click="addAccount"><i class="ti ti-plus"></i> {{ i18n.ts.addAccount }}</FormButton> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,8 +1,8 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormButton primary class="_formBlock" @click="generateToken">{{ i18n.ts.generateAccessToken }}</FormButton> | 	<FormButton primary @click="generateToken">{{ i18n.ts.generateAccessToken }}</FormButton> | ||||||
| 	<FormLink to="/settings/apps" class="_formBlock">{{ i18n.ts.manageAccessTokens }}</FormLink> | 	<FormLink to="/settings/apps">{{ i18n.ts.manageAccessTokens }}</FormLink> | ||||||
| 	<FormLink to="/api-console" :behavior="isDesktop ? 'window' : null" class="_formBlock">API console</FormLink> | 	<FormLink to="/api-console" :behavior="isDesktop ? 'window' : null">API console</FormLink> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormPagination ref="list" :pagination="pagination"> | 	<FormPagination ref="list" :pagination="pagination"> | ||||||
| 		<template #empty> | 		<template #empty> | ||||||
| 			<div class="_fullinfo"> | 			<div class="_fullinfo"> | ||||||
|  | @ -8,20 +8,20 @@ | ||||||
| 			</div> | 			</div> | ||||||
| 		</template> | 		</template> | ||||||
| 		<template #default="{items}"> | 		<template #default="{items}"> | ||||||
| 			<div v-for="token in items" :key="token.id" class="_panel _formBlock bfomjevm"> | 			<div v-for="token in items" :key="token.id" class="_panel bfomjevm"> | ||||||
| 				<img v-if="token.iconUrl" class="icon" :src="token.iconUrl" alt=""/> | 				<img v-if="token.iconUrl" class="icon" :src="token.iconUrl" alt=""/> | ||||||
| 				<div class="body"> | 				<div class="body"> | ||||||
| 					<div class="name">{{ token.name }}</div> | 					<div class="name">{{ token.name }}</div> | ||||||
| 					<div class="description">{{ token.description }}</div> | 					<div class="description">{{ token.description }}</div> | ||||||
| 					<MkKeyValue class="_formBlock" oneline> | 					<MkKeyValue oneline> | ||||||
| 						<template #key>{{ i18n.ts.installedDate }}</template> | 						<template #key>{{ i18n.ts.installedDate }}</template> | ||||||
| 						<template #value><MkTime :time="token.createdAt"/></template> | 						<template #value><MkTime :time="token.createdAt"/></template> | ||||||
| 					</MkKeyValue> | 					</MkKeyValue> | ||||||
| 					<MkKeyValue class="_formBlock" oneline> | 					<MkKeyValue oneline> | ||||||
| 						<template #key>{{ i18n.ts.lastUsedDate }}</template> | 						<template #key>{{ i18n.ts.lastUsedDate }}</template> | ||||||
| 						<template #value><MkTime :time="token.lastUsedAt"/></template> | 						<template #value><MkTime :time="token.lastUsedAt"/></template> | ||||||
| 					</MkKeyValue> | 					</MkKeyValue> | ||||||
| 					<details class="_formBlock"> | 					<details> | ||||||
| 						<summary>{{ i18n.ts.details }}</summary> | 						<summary>{{ i18n.ts.details }}</summary> | ||||||
| 						<ul> | 						<ul> | ||||||
| 							<li v-for="p in token.permission" :key="p">{{ $t(`_permissions.${p}`) }}</li> | 							<li v-for="p in token.permission" :key="p">{{ $t(`_permissions.${p}`) }}</li> | ||||||
|  |  | ||||||
|  | @ -1,8 +1,8 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormInfo warn class="_formBlock">{{ i18n.ts.customCssWarn }}</FormInfo> | 	<FormInfo warn>{{ i18n.ts.customCssWarn }}</FormInfo> | ||||||
| 
 | 
 | ||||||
| 	<FormTextarea v-model="localCustomCss" manual-save tall class="_monospace _formBlock" style="tab-size: 2;"> | 	<FormTextarea v-model="localCustomCss" manual-save tall class="_monospace" style="tab-size: 2;"> | ||||||
| 		<template #label>CSS</template> | 		<template #label>CSS</template> | ||||||
| 	</FormTextarea> | 	</FormTextarea> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|  | @ -1,10 +1,10 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSwitch v-model="navWindow">{{ i18n.ts.defaultNavigationBehaviour }}: {{ i18n.ts.openInWindow }}</FormSwitch> | 	<FormSwitch v-model="navWindow">{{ i18n.ts.defaultNavigationBehaviour }}: {{ i18n.ts.openInWindow }}</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 	<FormSwitch v-model="alwaysShowMainColumn" class="_formBlock">{{ i18n.ts._deck.alwaysShowMainColumn }}</FormSwitch> | 	<FormSwitch v-model="alwaysShowMainColumn">{{ i18n.ts._deck.alwaysShowMainColumn }}</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 	<FormRadios v-model="columnAlign" class="_formBlock"> | 	<FormRadios v-model="columnAlign"> | ||||||
| 		<template #label>{{ i18n.ts._deck.columnAlign }}</template> | 		<template #label>{{ i18n.ts._deck.columnAlign }}</template> | ||||||
| 		<option value="left">{{ i18n.ts.left }}</option> | 		<option value="left">{{ i18n.ts.left }}</option> | ||||||
| 		<option value="center">{{ i18n.ts.center }}</option> | 		<option value="center">{{ i18n.ts.center }}</option> | ||||||
|  |  | ||||||
|  | @ -1,8 +1,8 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormInfo warn class="_formBlock">{{ i18n.ts._accountDelete.mayTakeTime }}</FormInfo> | 	<FormInfo warn>{{ i18n.ts._accountDelete.mayTakeTime }}</FormInfo> | ||||||
| 	<FormInfo class="_formBlock">{{ i18n.ts._accountDelete.sendEmail }}</FormInfo> | 	<FormInfo>{{ i18n.ts._accountDelete.sendEmail }}</FormInfo> | ||||||
| 	<FormButton v-if="!$i.isDeleted" danger class="_formBlock" @click="deleteAccount">{{ i18n.ts._accountDelete.requestAccountDelete }}</FormButton> | 	<FormButton v-if="!$i.isDeleted" danger @click="deleteAccount">{{ i18n.ts._accountDelete.requestAccountDelete }}</FormButton> | ||||||
| 	<FormButton v-else disabled>{{ i18n.ts._accountDelete.inProgress }}</FormButton> | 	<FormButton v-else disabled>{{ i18n.ts._accountDelete.inProgress }}</FormButton> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -1,20 +1,23 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSection v-if="!fetching"> | 	<FormSection v-if="!fetching" first> | ||||||
| 		<template #label>{{ i18n.ts.usageAmount }}</template> | 		<template #label>{{ i18n.ts.usageAmount }}</template> | ||||||
| 		<div class="_formBlock uawsfosz"> | 
 | ||||||
|  | 		<div class="_autoGap"> | ||||||
|  | 			<div class="uawsfosz"> | ||||||
| 				<div class="meter"><div :style="meterStyle"></div></div> | 				<div class="meter"><div :style="meterStyle"></div></div> | ||||||
| 			</div> | 			</div> | ||||||
| 			<FormSplit> | 			<FormSplit> | ||||||
| 			<MkKeyValue class="_formBlock"> | 				<MkKeyValue> | ||||||
| 					<template #key>{{ i18n.ts.capacity }}</template> | 					<template #key>{{ i18n.ts.capacity }}</template> | ||||||
| 					<template #value>{{ bytes(capacity, 1) }}</template> | 					<template #value>{{ bytes(capacity, 1) }}</template> | ||||||
| 				</MkKeyValue> | 				</MkKeyValue> | ||||||
| 			<MkKeyValue class="_formBlock"> | 				<MkKeyValue> | ||||||
| 					<template #key>{{ i18n.ts.inUse }}</template> | 					<template #key>{{ i18n.ts.inUse }}</template> | ||||||
| 					<template #value>{{ bytes(usage, 1) }}</template> | 					<template #value>{{ bytes(usage, 1) }}</template> | ||||||
| 				</MkKeyValue> | 				</MkKeyValue> | ||||||
| 			</FormSplit> | 			</FormSplit> | ||||||
|  | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 
 | 
 | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
|  | @ -23,22 +26,24 @@ | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 
 | 
 | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
|  | 		<div class="_autoGap"> | ||||||
| 			<FormLink @click="chooseUploadFolder()"> | 			<FormLink @click="chooseUploadFolder()"> | ||||||
| 				{{ i18n.ts.uploadFolder }} | 				{{ i18n.ts.uploadFolder }} | ||||||
| 				<template #suffix>{{ uploadFolder ? uploadFolder.name : '-' }}</template> | 				<template #suffix>{{ uploadFolder ? uploadFolder.name : '-' }}</template> | ||||||
| 				<template #suffixIcon><i class="fas fa-folder-open"></i></template> | 				<template #suffixIcon><i class="fas fa-folder-open"></i></template> | ||||||
| 			</FormLink> | 			</FormLink> | ||||||
| 		<FormSwitch v-model="keepOriginalUploading" class="_formBlock"> | 			<FormSwitch v-model="keepOriginalUploading"> | ||||||
| 				<template #label>{{ i18n.ts.keepOriginalUploading }}</template> | 				<template #label>{{ i18n.ts.keepOriginalUploading }}</template> | ||||||
| 				<template #caption>{{ i18n.ts.keepOriginalUploadingDescription }}</template> | 				<template #caption>{{ i18n.ts.keepOriginalUploadingDescription }}</template> | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
| 		<FormSwitch v-model="alwaysMarkNsfw" class="_formBlock" @update:model-value="saveProfile()"> | 			<FormSwitch v-model="alwaysMarkNsfw" @update:model-value="saveProfile()"> | ||||||
| 				<template #label>{{ i18n.ts.alwaysMarkSensitive }}</template> | 				<template #label>{{ i18n.ts.alwaysMarkSensitive }}</template> | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
| 		<FormSwitch v-model="autoSensitive" class="_formBlock" @update:model-value="saveProfile()"> | 			<FormSwitch v-model="autoSensitive" @update:model-value="saveProfile()"> | ||||||
| 				<template #label>{{ i18n.ts.enableAutoSensitive }}<span class="_beta">{{ i18n.ts.beta }}</span></template> | 				<template #label>{{ i18n.ts.enableAutoSensitive }}<span class="_beta">{{ i18n.ts.beta }}</span></template> | ||||||
| 				<template #caption>{{ i18n.ts.enableAutoSensitiveDescription }}</template> | 				<template #caption>{{ i18n.ts.enableAutoSensitiveDescription }}</template> | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
|  | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label>{{ i18n.ts.emailAddress }}</template> | 		<template #label>{{ i18n.ts.emailAddress }}</template> | ||||||
| 		<FormInput v-model="emailAddress" type="email" manual-save> | 		<FormInput v-model="emailAddress" type="email" manual-save> | ||||||
|  | @ -17,24 +17,27 @@ | ||||||
| 
 | 
 | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label>{{ i18n.ts.emailNotification }}</template> | 		<template #label>{{ i18n.ts.emailNotification }}</template> | ||||||
| 		<FormSwitch v-model="emailNotification_mention" class="_formBlock"> | 
 | ||||||
|  | 		<div class="_autoGap_half"> | ||||||
|  | 			<FormSwitch v-model="emailNotification_mention"> | ||||||
| 				{{ i18n.ts._notification._types.mention }} | 				{{ i18n.ts._notification._types.mention }} | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
| 		<FormSwitch v-model="emailNotification_reply" class="_formBlock"> | 			<FormSwitch v-model="emailNotification_reply"> | ||||||
| 				{{ i18n.ts._notification._types.reply }} | 				{{ i18n.ts._notification._types.reply }} | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
| 		<FormSwitch v-model="emailNotification_quote" class="_formBlock"> | 			<FormSwitch v-model="emailNotification_quote"> | ||||||
| 				{{ i18n.ts._notification._types.quote }} | 				{{ i18n.ts._notification._types.quote }} | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
| 		<FormSwitch v-model="emailNotification_follow" class="_formBlock"> | 			<FormSwitch v-model="emailNotification_follow"> | ||||||
| 				{{ i18n.ts._notification._types.follow }} | 				{{ i18n.ts._notification._types.follow }} | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
| 		<FormSwitch v-model="emailNotification_receiveFollowRequest" class="_formBlock"> | 			<FormSwitch v-model="emailNotification_receiveFollowRequest"> | ||||||
| 				{{ i18n.ts._notification._types.receiveFollowRequest }} | 				{{ i18n.ts._notification._types.receiveFollowRequest }} | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
| 		<FormSwitch v-model="emailNotification_groupInvited" class="_formBlock"> | 			<FormSwitch v-model="emailNotification_groupInvited"> | ||||||
| 				{{ i18n.ts._notification._types.groupInvited }} | 				{{ i18n.ts._notification._types.groupInvited }} | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
|  | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSelect v-model="lang" class="_formBlock"> | 	<FormSelect v-model="lang"> | ||||||
| 		<template #label>{{ i18n.ts.uiLanguage }}</template> | 		<template #label>{{ i18n.ts.uiLanguage }}</template> | ||||||
| 		<option v-for="x in langs" :key="x[0]" :value="x[0]">{{ x[1] }}</option> | 		<option v-for="x in langs" :key="x[0]" :value="x[0]">{{ x[1] }}</option> | ||||||
| 		<template #caption> | 		<template #caption> | ||||||
|  | @ -12,7 +12,7 @@ | ||||||
| 		</template> | 		</template> | ||||||
| 	</FormSelect> | 	</FormSelect> | ||||||
| 
 | 
 | ||||||
| 	<FormRadios v-model="overridedDeviceKind" class="_formBlock"> | 	<FormRadios v-model="overridedDeviceKind"> | ||||||
| 		<template #label>{{ i18n.ts.overridedDeviceKind }}</template> | 		<template #label>{{ i18n.ts.overridedDeviceKind }}</template> | ||||||
| 		<option :value="null">{{ i18n.ts.auto }}</option> | 		<option :value="null">{{ i18n.ts.auto }}</option> | ||||||
| 		<option value="smartphone"><i class="ti ti-device-mobile"/> {{ i18n.ts.smartphone }}</option> | 		<option value="smartphone"><i class="ti ti-device-mobile"/> {{ i18n.ts.smartphone }}</option> | ||||||
|  | @ -20,34 +20,43 @@ | ||||||
| 		<option value="desktop"><i class="ti ti-device-desktop"/> {{ i18n.ts.desktop }}</option> | 		<option value="desktop"><i class="ti ti-device-desktop"/> {{ i18n.ts.desktop }}</option> | ||||||
| 	</FormRadios> | 	</FormRadios> | ||||||
| 
 | 
 | ||||||
| 	<FormSwitch v-model="showFixedPostForm" class="_formBlock">{{ i18n.ts.showFixedPostForm }}</FormSwitch> | 	<FormSwitch v-model="showFixedPostForm">{{ i18n.ts.showFixedPostForm }}</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label>{{ i18n.ts.behavior }}</template> | 		<template #label>{{ i18n.ts.behavior }}</template> | ||||||
| 		<FormSwitch v-model="imageNewTab" class="_formBlock">{{ i18n.ts.openImageInNewTab }}</FormSwitch> |  | ||||||
| 		<FormSwitch v-model="enableInfiniteScroll" class="_formBlock">{{ i18n.ts.enableInfiniteScroll }}</FormSwitch> |  | ||||||
| 		<FormSwitch v-model="useReactionPickerForContextMenu" class="_formBlock">{{ i18n.ts.useReactionPickerForContextMenu }}</FormSwitch> |  | ||||||
| 
 | 
 | ||||||
| 		<FormSelect v-model="serverDisconnectedBehavior" class="_formBlock"> | 		<div class="_autoGap"> | ||||||
|  | 			<div class="_autoGap_half"> | ||||||
|  | 				<FormSwitch v-model="imageNewTab">{{ i18n.ts.openImageInNewTab }}</FormSwitch> | ||||||
|  | 				<FormSwitch v-model="enableInfiniteScroll">{{ i18n.ts.enableInfiniteScroll }}</FormSwitch> | ||||||
|  | 				<FormSwitch v-model="useReactionPickerForContextMenu">{{ i18n.ts.useReactionPickerForContextMenu }}</FormSwitch> | ||||||
|  | 			</div> | ||||||
|  | 			<FormSelect v-model="serverDisconnectedBehavior"> | ||||||
| 				<template #label>{{ i18n.ts.whenServerDisconnected }}</template> | 				<template #label>{{ i18n.ts.whenServerDisconnected }}</template> | ||||||
| 				<option value="reload">{{ i18n.ts._serverDisconnectedBehavior.reload }}</option> | 				<option value="reload">{{ i18n.ts._serverDisconnectedBehavior.reload }}</option> | ||||||
| 				<option value="dialog">{{ i18n.ts._serverDisconnectedBehavior.dialog }}</option> | 				<option value="dialog">{{ i18n.ts._serverDisconnectedBehavior.dialog }}</option> | ||||||
| 				<option value="quiet">{{ i18n.ts._serverDisconnectedBehavior.quiet }}</option> | 				<option value="quiet">{{ i18n.ts._serverDisconnectedBehavior.quiet }}</option> | ||||||
| 			</FormSelect> | 			</FormSelect> | ||||||
|  | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 
 | 
 | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label>{{ i18n.ts.appearance }}</template> | 		<template #label>{{ i18n.ts.appearance }}</template> | ||||||
| 		<FormSwitch v-model="disableAnimatedMfm" class="_formBlock">{{ i18n.ts.disableAnimatedMfm }}</FormSwitch> | 
 | ||||||
| 		<FormSwitch v-model="reduceAnimation" class="_formBlock">{{ i18n.ts.reduceUiAnimation }}</FormSwitch> | 		<div class="_autoGap"> | ||||||
| 		<FormSwitch v-model="useBlurEffect" class="_formBlock">{{ i18n.ts.useBlurEffect }}</FormSwitch> | 			<div class="_autoGap_half"> | ||||||
| 		<FormSwitch v-model="useBlurEffectForModal" class="_formBlock">{{ i18n.ts.useBlurEffectForModal }}</FormSwitch> | 				<FormSwitch v-model="disableAnimatedMfm">{{ i18n.ts.disableAnimatedMfm }}</FormSwitch> | ||||||
| 		<FormSwitch v-model="showGapBetweenNotesInTimeline" class="_formBlock">{{ i18n.ts.showGapBetweenNotesInTimeline }}</FormSwitch> | 				<FormSwitch v-model="reduceAnimation">{{ i18n.ts.reduceUiAnimation }}</FormSwitch> | ||||||
| 		<FormSwitch v-model="loadRawImages" class="_formBlock">{{ i18n.ts.loadRawImages }}</FormSwitch> | 				<FormSwitch v-model="useBlurEffect">{{ i18n.ts.useBlurEffect }}</FormSwitch> | ||||||
| 		<FormSwitch v-model="disableShowingAnimatedImages" class="_formBlock">{{ i18n.ts.disableShowingAnimatedImages }}</FormSwitch> | 				<FormSwitch v-model="useBlurEffectForModal">{{ i18n.ts.useBlurEffectForModal }}</FormSwitch> | ||||||
| 		<FormSwitch v-model="squareAvatars" class="_formBlock">{{ i18n.ts.squareAvatars }}</FormSwitch> | 				<FormSwitch v-model="showGapBetweenNotesInTimeline">{{ i18n.ts.showGapBetweenNotesInTimeline }}</FormSwitch> | ||||||
| 		<FormSwitch v-model="useSystemFont" class="_formBlock">{{ i18n.ts.useSystemFont }}</FormSwitch> | 				<FormSwitch v-model="loadRawImages">{{ i18n.ts.loadRawImages }}</FormSwitch> | ||||||
| 		<div class="_formBlock"> | 				<FormSwitch v-model="disableShowingAnimatedImages">{{ i18n.ts.disableShowingAnimatedImages }}</FormSwitch> | ||||||
|  | 				<FormSwitch v-model="squareAvatars">{{ i18n.ts.squareAvatars }}</FormSwitch> | ||||||
|  | 				<FormSwitch v-model="useSystemFont">{{ i18n.ts.useSystemFont }}</FormSwitch> | ||||||
|  | 				<FormSwitch v-model="disableDrawer">{{ i18n.ts.disableDrawer }}</FormSwitch> | ||||||
|  | 			</div> | ||||||
|  | 			<div> | ||||||
| 				<FormRadios v-model="emojiStyle"> | 				<FormRadios v-model="emojiStyle"> | ||||||
| 					<template #label>{{ i18n.ts.emojiStyle }}</template> | 					<template #label>{{ i18n.ts.emojiStyle }}</template> | ||||||
| 					<option value="native">{{ i18n.ts.native }}</option> | 					<option value="native">{{ i18n.ts.native }}</option> | ||||||
|  | @ -57,43 +66,42 @@ | ||||||
| 				<div style="margin: 8px 0 0 0; font-size: 1.5em;"><Mfm :key="emojiStyle" text="🍮🍦🍭🍩🍰🍫🍬🥞🍪"/></div> | 				<div style="margin: 8px 0 0 0; font-size: 1.5em;"><Mfm :key="emojiStyle" text="🍮🍦🍭🍩🍰🍫🍬🥞🍪"/></div> | ||||||
| 			</div> | 			</div> | ||||||
| 
 | 
 | ||||||
| 		<FormSwitch v-model="disableDrawer" class="_formBlock">{{ i18n.ts.disableDrawer }}</FormSwitch> | 			<FormRadios v-model="fontSize"> | ||||||
| 
 |  | ||||||
| 		<FormRadios v-model="fontSize" class="_formBlock"> |  | ||||||
| 				<template #label>{{ i18n.ts.fontSize }}</template> | 				<template #label>{{ i18n.ts.fontSize }}</template> | ||||||
| 				<option :value="null"><span style="font-size: 14px;">Aa</span></option> | 				<option :value="null"><span style="font-size: 14px;">Aa</span></option> | ||||||
| 				<option value="1"><span style="font-size: 15px;">Aa</span></option> | 				<option value="1"><span style="font-size: 15px;">Aa</span></option> | ||||||
| 				<option value="2"><span style="font-size: 16px;">Aa</span></option> | 				<option value="2"><span style="font-size: 16px;">Aa</span></option> | ||||||
| 				<option value="3"><span style="font-size: 17px;">Aa</span></option> | 				<option value="3"><span style="font-size: 17px;">Aa</span></option> | ||||||
| 			</FormRadios> | 			</FormRadios> | ||||||
|  | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 
 | 
 | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<FormSwitch v-model="aiChanMode">{{ i18n.ts.aiChanMode }}</FormSwitch> | 		<FormSwitch v-model="aiChanMode">{{ i18n.ts.aiChanMode }}</FormSwitch> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 
 | 
 | ||||||
| 	<FormSelect v-model="instanceTicker" class="_formBlock"> | 	<FormSelect v-model="instanceTicker"> | ||||||
| 		<template #label>{{ i18n.ts.instanceTicker }}</template> | 		<template #label>{{ i18n.ts.instanceTicker }}</template> | ||||||
| 		<option value="none">{{ i18n.ts._instanceTicker.none }}</option> | 		<option value="none">{{ i18n.ts._instanceTicker.none }}</option> | ||||||
| 		<option value="remote">{{ i18n.ts._instanceTicker.remote }}</option> | 		<option value="remote">{{ i18n.ts._instanceTicker.remote }}</option> | ||||||
| 		<option value="always">{{ i18n.ts._instanceTicker.always }}</option> | 		<option value="always">{{ i18n.ts._instanceTicker.always }}</option> | ||||||
| 	</FormSelect> | 	</FormSelect> | ||||||
| 
 | 
 | ||||||
| 	<FormSelect v-model="nsfw" class="_formBlock"> | 	<FormSelect v-model="nsfw"> | ||||||
| 		<template #label>{{ i18n.ts.nsfw }}</template> | 		<template #label>{{ i18n.ts.nsfw }}</template> | ||||||
| 		<option value="respect">{{ i18n.ts._nsfw.respect }}</option> | 		<option value="respect">{{ i18n.ts._nsfw.respect }}</option> | ||||||
| 		<option value="ignore">{{ i18n.ts._nsfw.ignore }}</option> | 		<option value="ignore">{{ i18n.ts._nsfw.ignore }}</option> | ||||||
| 		<option value="force">{{ i18n.ts._nsfw.force }}</option> | 		<option value="force">{{ i18n.ts._nsfw.force }}</option> | ||||||
| 	</FormSelect> | 	</FormSelect> | ||||||
| 
 | 
 | ||||||
| 	<FormRange v-model="numberOfPageCache" :min="1" :max="10" :step="1" easing class="_formBlock"> | 	<FormRange v-model="numberOfPageCache" :min="1" :max="10" :step="1" easing> | ||||||
| 		<template #label>{{ i18n.ts.numberOfPageCache }}</template> | 		<template #label>{{ i18n.ts.numberOfPageCache }}</template> | ||||||
| 		<template #caption>{{ i18n.ts.numberOfPageCacheDescription }}</template> | 		<template #caption>{{ i18n.ts.numberOfPageCacheDescription }}</template> | ||||||
| 	</FormRange> | 	</FormRange> | ||||||
| 
 | 
 | ||||||
| 	<FormLink to="/settings/deck" class="_formBlock">{{ i18n.ts.deck }}</FormLink> | 	<FormLink to="/settings/deck">{{ i18n.ts.deck }}</FormLink> | ||||||
| 
 | 
 | ||||||
| 	<FormLink to="/settings/custom-css" class="_formBlock"><template #icon><i class="ti ti-code"></i></template>{{ i18n.ts.customCss }}</FormLink> | 	<FormLink to="/settings/custom-css"><template #icon><i class="ti ti-code"></i></template>{{ i18n.ts.customCss }}</FormLink> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label><i class="ti ti-pencil"></i> {{ i18n.ts._exportOrImport.allNotes }}</template> | 		<template #label><i class="ti ti-pencil"></i> {{ i18n.ts._exportOrImport.allNotes }}</template> | ||||||
| 		<FormFolder> | 		<FormFolder> | ||||||
|  | @ -18,18 +18,18 @@ | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label><i class="ti ti-users"></i> {{ i18n.ts._exportOrImport.followingList }}</template> | 		<template #label><i class="ti ti-users"></i> {{ i18n.ts._exportOrImport.followingList }}</template> | ||||||
| 		<FormFolder class="_formBlock"> | 		<FormFolder> | ||||||
| 			<template #label>{{ i18n.ts.export }}</template> | 			<template #label>{{ i18n.ts.export }}</template> | ||||||
| 			<template #icon><i class="ti ti-download"></i></template> | 			<template #icon><i class="ti ti-download"></i></template> | ||||||
| 			<FormSwitch v-model="excludeMutingUsers" class="_formBlock"> | 			<FormSwitch v-model="excludeMutingUsers"> | ||||||
| 				{{ i18n.ts._exportOrImport.excludeMutingUsers }} | 				{{ i18n.ts._exportOrImport.excludeMutingUsers }} | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
| 			<FormSwitch v-model="excludeInactiveUsers" class="_formBlock"> | 			<FormSwitch v-model="excludeInactiveUsers"> | ||||||
| 				{{ i18n.ts._exportOrImport.excludeInactiveUsers }} | 				{{ i18n.ts._exportOrImport.excludeInactiveUsers }} | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
| 			<MkButton primary :class="$style.button" inline @click="exportFollowing()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton> | 			<MkButton primary :class="$style.button" inline @click="exportFollowing()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton> | ||||||
| 		</FormFolder> | 		</FormFolder> | ||||||
| 		<FormFolder class="_formBlock"> | 		<FormFolder> | ||||||
| 			<template #label>{{ i18n.ts.import }}</template> | 			<template #label>{{ i18n.ts.import }}</template> | ||||||
| 			<template #icon><i class="ti ti-upload"></i></template> | 			<template #icon><i class="ti ti-upload"></i></template> | ||||||
| 			<MkButton primary :class="$style.button" inline @click="importFollowing($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton> | 			<MkButton primary :class="$style.button" inline @click="importFollowing($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton> | ||||||
|  | @ -37,12 +37,12 @@ | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label><i class="ti ti-users"></i> {{ i18n.ts._exportOrImport.userLists }}</template> | 		<template #label><i class="ti ti-users"></i> {{ i18n.ts._exportOrImport.userLists }}</template> | ||||||
| 		<FormFolder class="_formBlock"> | 		<FormFolder> | ||||||
| 			<template #label>{{ i18n.ts.export }}</template> | 			<template #label>{{ i18n.ts.export }}</template> | ||||||
| 			<template #icon><i class="ti ti-download"></i></template> | 			<template #icon><i class="ti ti-download"></i></template> | ||||||
| 			<MkButton primary :class="$style.button" inline @click="exportUserLists()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton> | 			<MkButton primary :class="$style.button" inline @click="exportUserLists()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton> | ||||||
| 		</FormFolder> | 		</FormFolder> | ||||||
| 		<FormFolder class="_formBlock"> | 		<FormFolder> | ||||||
| 			<template #label>{{ i18n.ts.import }}</template> | 			<template #label>{{ i18n.ts.import }}</template> | ||||||
| 			<template #icon><i class="ti ti-upload"></i></template> | 			<template #icon><i class="ti ti-upload"></i></template> | ||||||
| 			<MkButton primary :class="$style.button" inline @click="importUserLists($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton> | 			<MkButton primary :class="$style.button" inline @click="importUserLists($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton> | ||||||
|  | @ -50,12 +50,12 @@ | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label><i class="ti ti-user-off"></i> {{ i18n.ts._exportOrImport.muteList }}</template> | 		<template #label><i class="ti ti-user-off"></i> {{ i18n.ts._exportOrImport.muteList }}</template> | ||||||
| 		<FormFolder class="_formBlock"> | 		<FormFolder> | ||||||
| 			<template #label>{{ i18n.ts.export }}</template> | 			<template #label>{{ i18n.ts.export }}</template> | ||||||
| 			<template #icon><i class="ti ti-download"></i></template> | 			<template #icon><i class="ti ti-download"></i></template> | ||||||
| 			<MkButton primary :class="$style.button" inline @click="exportMuting()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton> | 			<MkButton primary :class="$style.button" inline @click="exportMuting()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton> | ||||||
| 		</FormFolder> | 		</FormFolder> | ||||||
| 		<FormFolder class="_formBlock"> | 		<FormFolder> | ||||||
| 			<template #label>{{ i18n.ts.import }}</template> | 			<template #label>{{ i18n.ts.import }}</template> | ||||||
| 			<template #icon><i class="ti ti-upload"></i></template> | 			<template #icon><i class="ti ti-upload"></i></template> | ||||||
| 			<MkButton primary :class="$style.button" inline @click="importMuting($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton> | 			<MkButton primary :class="$style.button" inline @click="importMuting($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton> | ||||||
|  | @ -63,12 +63,12 @@ | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label><i class="ti ti-user-off"></i> {{ i18n.ts._exportOrImport.blockingList }}</template> | 		<template #label><i class="ti ti-user-off"></i> {{ i18n.ts._exportOrImport.blockingList }}</template> | ||||||
| 		<FormFolder class="_formBlock"> | 		<FormFolder> | ||||||
| 			<template #label>{{ i18n.ts.export }}</template> | 			<template #label>{{ i18n.ts.export }}</template> | ||||||
| 			<template #icon><i class="ti ti-download"></i></template> | 			<template #icon><i class="ti ti-download"></i></template> | ||||||
| 			<MkButton primary :class="$style.button" inline @click="exportBlocking()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton> | 			<MkButton primary :class="$style.button" inline @click="exportBlocking()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton> | ||||||
| 		</FormFolder> | 		</FormFolder> | ||||||
| 		<FormFolder class="_formBlock"> | 		<FormFolder> | ||||||
| 			<template #label>{{ i18n.ts.import }}</template> | 			<template #label>{{ i18n.ts.import }}</template> | ||||||
| 			<template #icon><i class="ti ti-upload"></i></template> | 			<template #icon><i class="ti ti-upload"></i></template> | ||||||
| 			<MkButton primary :class="$style.button" inline @click="importBlocking($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton> | 			<MkButton primary :class="$style.button" inline @click="importBlocking($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton> | ||||||
|  |  | ||||||
|  | @ -1,11 +1,11 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<MkInfo>{{ i18n.ts._instanceMute.title }}</MkInfo> | 	<MkInfo>{{ i18n.ts._instanceMute.title }}</MkInfo> | ||||||
| 	<FormTextarea v-model="instanceMutes" class="_formBlock"> | 	<FormTextarea v-model="instanceMutes"> | ||||||
| 		<template #label>{{ i18n.ts._instanceMute.heading }}</template> | 		<template #label>{{ i18n.ts._instanceMute.heading }}</template> | ||||||
| 		<template #caption>{{ i18n.ts._instanceMute.instanceMuteDescription }}<br>{{ i18n.ts._instanceMute.instanceMuteDescription2 }}</template> | 		<template #caption>{{ i18n.ts._instanceMute.instanceMuteDescription }}<br>{{ i18n.ts._instanceMute.instanceMuteDescription2 }}</template> | ||||||
| 	</FormTextarea> | 	</FormTextarea> | ||||||
| 	<MkButton primary :disabled="!changed" class="_formBlock" @click="save()"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton> | 	<MkButton primary :disabled="!changed" @click="save()"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSection v-if="instance.enableTwitterIntegration"> | 	<FormSection v-if="instance.enableTwitterIntegration"> | ||||||
| 		<template #label><i class="ti ti-brand-twitter"></i> Twitter</template> | 		<template #label><i class="ti ti-brand-twitter"></i> Twitter</template> | ||||||
| 		<p v-if="integrations.twitter">{{ i18n.ts.connectedTo }}: <a :href="`https://twitter.com/${integrations.twitter.screenName}`" rel="nofollow noopener" target="_blank">@{{ integrations.twitter.screenName }}</a></p> | 		<p v-if="integrations.twitter">{{ i18n.ts.connectedTo }}: <a :href="`https://twitter.com/${integrations.twitter.screenName}`" rel="nofollow noopener" target="_blank">@{{ integrations.twitter.screenName }}</a></p> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<MkTab v-model="tab" style="margin-bottom: var(--margin);"> | 	<MkTab v-model="tab" style="margin-bottom: var(--margin);"> | ||||||
| 		<option value="mute">{{ i18n.ts.mutedUsers }}</option> | 		<option value="mute">{{ i18n.ts.mutedUsers }}</option> | ||||||
| 		<option value="block">{{ i18n.ts.blockedUsers }}</option> | 		<option value="block">{{ i18n.ts.blockedUsers }}</option> | ||||||
|  |  | ||||||
|  | @ -1,11 +1,11 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormTextarea v-model="items" tall manual-save class="_formBlock"> | 	<FormTextarea v-model="items" tall manual-save> | ||||||
| 		<template #label>{{ i18n.ts.navbar }}</template> | 		<template #label>{{ i18n.ts.navbar }}</template> | ||||||
| 		<template #caption><button class="_textButton" @click="addItem">{{ i18n.ts.addItem }}</button></template> | 		<template #caption><button class="_textButton" @click="addItem">{{ i18n.ts.addItem }}</button></template> | ||||||
| 	</FormTextarea> | 	</FormTextarea> | ||||||
| 
 | 
 | ||||||
| 	<FormRadios v-model="menuDisplay" class="_formBlock"> | 	<FormRadios v-model="menuDisplay"> | ||||||
| 		<template #label>{{ i18n.ts.display }}</template> | 		<template #label>{{ i18n.ts.display }}</template> | ||||||
| 		<option value="sideFull">{{ i18n.ts._menuDisplay.sideFull }}</option> | 		<option value="sideFull">{{ i18n.ts._menuDisplay.sideFull }}</option> | ||||||
| 		<option value="sideIcon">{{ i18n.ts._menuDisplay.sideIcon }}</option> | 		<option value="sideIcon">{{ i18n.ts._menuDisplay.sideIcon }}</option> | ||||||
|  | @ -13,7 +13,7 @@ | ||||||
| 		<!-- <MkRadio v-model="menuDisplay" value="hide" disabled>{{ i18n.ts._menuDisplay.hide }}</MkRadio>--> <!-- TODO: サイドバーを完全に隠せるようにすると、別途ハンバーガーボタンのようなものをUIに表示する必要があり面倒 --> | 		<!-- <MkRadio v-model="menuDisplay" value="hide" disabled>{{ i18n.ts._menuDisplay.hide }}</MkRadio>--> <!-- TODO: サイドバーを完全に隠せるようにすると、別途ハンバーガーボタンのようなものをUIに表示する必要があり面倒 --> | ||||||
| 	</FormRadios> | 	</FormRadios> | ||||||
| 
 | 
 | ||||||
| 	<FormButton danger class="_formBlock" @click="reset()"><i class="ti ti-reload"></i> {{ i18n.ts.default }}</FormButton> | 	<FormButton danger @click="reset()"><i class="ti ti-reload"></i> {{ i18n.ts.default }}</FormButton> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,15 +1,19 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormLink class="_formBlock" @click="configure"><template #icon><i class="ti ti-settings"></i></template>{{ i18n.ts.notificationSetting }}</FormLink> | 	<FormLink @click="configure"><template #icon><i class="ti ti-settings"></i></template>{{ i18n.ts.notificationSetting }}</FormLink> | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<FormLink class="_formBlock" @click="readAllNotifications">{{ i18n.ts.markAsReadAllNotifications }}</FormLink> | 		<div class="_autoGap"> | ||||||
| 		<FormLink class="_formBlock" @click="readAllUnreadNotes">{{ i18n.ts.markAsReadAllUnreadNotes }}</FormLink> | 			<FormLink @click="readAllNotifications">{{ i18n.ts.markAsReadAllNotifications }}</FormLink> | ||||||
| 		<FormLink class="_formBlock" @click="readAllMessagingMessages">{{ i18n.ts.markAsReadAllTalkMessages }}</FormLink> | 			<FormLink @click="readAllUnreadNotes">{{ i18n.ts.markAsReadAllUnreadNotes }}</FormLink> | ||||||
|  | 			<FormLink @click="readAllMessagingMessages">{{ i18n.ts.markAsReadAllTalkMessages }}</FormLink> | ||||||
|  | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label>{{ i18n.ts.pushNotification }}</template> | 		<template #label>{{ i18n.ts.pushNotification }}</template> | ||||||
|  | 
 | ||||||
|  | 		<div class="_autoGap"> | ||||||
| 			<MkPushNotificationAllowButton ref="allowButton"/> | 			<MkPushNotificationAllowButton ref="allowButton"/> | ||||||
| 		<FormSwitch class="_formBlock" :disabled="!pushRegistrationInServer" :model-value="sendReadMessage" @update:model-value="onChangeSendReadMessage"> | 			<FormSwitch :disabled="!pushRegistrationInServer" :model-value="sendReadMessage" @update:model-value="onChangeSendReadMessage"> | ||||||
| 				<template #label>{{ i18n.ts.sendPushNotificationReadMessage }}</template> | 				<template #label>{{ i18n.ts.sendPushNotificationReadMessage }}</template> | ||||||
| 				<template #caption> | 				<template #caption> | ||||||
| 					<I18n :src="i18n.ts.sendPushNotificationReadMessageCaption"> | 					<I18n :src="i18n.ts.sendPushNotificationReadMessageCaption"> | ||||||
|  | @ -17,6 +21,7 @@ | ||||||
| 					</I18n> | 					</I18n> | ||||||
| 				</template> | 				</template> | ||||||
| 			</FormSwitch> | 			</FormSwitch> | ||||||
|  | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -1,18 +1,18 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSwitch v-model="$i.injectFeaturedNote" class="_formBlock" @update:model-value="onChangeInjectFeaturedNote"> | 	<FormSwitch v-model="$i.injectFeaturedNote" @update:model-value="onChangeInjectFeaturedNote"> | ||||||
| 		{{ i18n.ts.showFeaturedNotesInTimeline }} | 		{{ i18n.ts.showFeaturedNotesInTimeline }} | ||||||
| 	</FormSwitch> | 	</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 	<!-- | 	<!-- | ||||||
| 	<FormSwitch v-model="reportError" class="_formBlock">{{ i18n.ts.sendErrorReports }}<template #caption>{{ i18n.ts.sendErrorReportsDescription }}</template></FormSwitch> | 	<FormSwitch v-model="reportError">{{ i18n.ts.sendErrorReports }}<template #caption>{{ i18n.ts.sendErrorReportsDescription }}</template></FormSwitch> | ||||||
| 	--> | 	--> | ||||||
| 
 | 
 | ||||||
| 	<FormLink to="/settings/account-info" class="_formBlock">{{ i18n.ts.accountInfo }}</FormLink> | 	<FormLink to="/settings/account-info">{{ i18n.ts.accountInfo }}</FormLink> | ||||||
| 
 | 
 | ||||||
| 	<FormLink to="/registry" class="_formBlock"><template #icon><i class="ti ti-adjustments"></i></template>{{ i18n.ts.registry }}</FormLink> | 	<FormLink to="/registry"><template #icon><i class="ti ti-adjustments"></i></template>{{ i18n.ts.registry }}</FormLink> | ||||||
| 
 | 
 | ||||||
| 	<FormLink to="/settings/delete-account" class="_formBlock"><template #icon><i class="ti ti-alert-triangle"></i></template>{{ i18n.ts.closeAccount }}</FormLink> | 	<FormLink to="/settings/delete-account"><template #icon><i class="ti ti-alert-triangle"></i></template>{{ i18n.ts.closeAccount }}</FormLink> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,12 +1,12 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormInfo warn class="_formBlock">{{ i18n.ts._plugin.installWarn }}</FormInfo> | 	<FormInfo warn>{{ i18n.ts._plugin.installWarn }}</FormInfo> | ||||||
| 
 | 
 | ||||||
| 	<FormTextarea v-model="code" tall class="_formBlock"> | 	<FormTextarea v-model="code" tall> | ||||||
| 		<template #label>{{ i18n.ts.code }}</template> | 		<template #label>{{ i18n.ts.code }}</template> | ||||||
| 	</FormTextarea> | 	</FormTextarea> | ||||||
| 
 | 
 | ||||||
| 	<div class="_formBlock"> | 	<div> | ||||||
| 		<FormButton :disabled="code == null" primary inline @click="install"><i class="ti ti-check"></i> {{ i18n.ts.install }}</FormButton> | 		<FormButton :disabled="code == null" primary inline @click="install"><i class="ti ti-check"></i> {{ i18n.ts.install }}</FormButton> | ||||||
| 	</div> | 	</div> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|  | @ -1,23 +1,23 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormLink to="/settings/plugin/install"><template #icon><i class="ti ti-download"></i></template>{{ i18n.ts._plugin.install }}</FormLink> | 	<FormLink to="/settings/plugin/install"><template #icon><i class="ti ti-download"></i></template>{{ i18n.ts._plugin.install }}</FormLink> | ||||||
| 
 | 
 | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label>{{ i18n.ts.manage }}</template> | 		<template #label>{{ i18n.ts.manage }}</template> | ||||||
| 		<div v-for="plugin in plugins" :key="plugin.id" class="_formBlock _panel" style="padding: 20px;"> | 		<div v-for="plugin in plugins" :key="plugin.id" class="_panel _autoGap_half" style="padding: 20px;"> | ||||||
| 			<span style="display: flex;"><b>{{ plugin.name }}</b><span style="margin-left: auto;">v{{ plugin.version }}</span></span> | 			<span style="display: flex;"><b>{{ plugin.name }}</b><span style="margin-left: auto;">v{{ plugin.version }}</span></span> | ||||||
| 
 | 
 | ||||||
| 			<FormSwitch class="_formBlock" :model-value="plugin.active" @update:model-value="changeActive(plugin, $event)">{{ i18n.ts.makeActive }}</FormSwitch> | 			<FormSwitch :model-value="plugin.active" @update:model-value="changeActive(plugin, $event)">{{ i18n.ts.makeActive }}</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 			<MkKeyValue class="_formBlock"> | 			<MkKeyValue> | ||||||
| 				<template #key>{{ i18n.ts.author }}</template> | 				<template #key>{{ i18n.ts.author }}</template> | ||||||
| 				<template #value>{{ plugin.author }}</template> | 				<template #value>{{ plugin.author }}</template> | ||||||
| 			</MkKeyValue> | 			</MkKeyValue> | ||||||
| 			<MkKeyValue class="_formBlock"> | 			<MkKeyValue> | ||||||
| 				<template #key>{{ i18n.ts.description }}</template> | 				<template #key>{{ i18n.ts.description }}</template> | ||||||
| 				<template #value>{{ plugin.description }}</template> | 				<template #value>{{ plugin.description }}</template> | ||||||
| 			</MkKeyValue> | 			</MkKeyValue> | ||||||
| 			<MkKeyValue class="_formBlock"> | 			<MkKeyValue> | ||||||
| 				<template #key>{{ i18n.ts.permission }}</template> | 				<template #key>{{ i18n.ts.permission }}</template> | ||||||
| 				<template #value>{{ plugin.permission }}</template> | 				<template #value>{{ plugin.permission }}</template> | ||||||
| 			</MkKeyValue> | 			</MkKeyValue> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<div :class="$style.buttons"> | 	<div :class="$style.buttons"> | ||||||
| 		<MkButton inline primary @click="saveNew">{{ ts._preferencesBackups.saveNew }}</MkButton> | 		<MkButton inline primary @click="saveNew">{{ ts._preferencesBackups.saveNew }}</MkButton> | ||||||
| 		<MkButton inline @click="loadFile">{{ ts._preferencesBackups.loadFile }}</MkButton> | 		<MkButton inline @click="loadFile">{{ ts._preferencesBackups.loadFile }}</MkButton> | ||||||
|  | @ -8,10 +8,11 @@ | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label>{{ ts._preferencesBackups.list }}</template> | 		<template #label>{{ ts._preferencesBackups.list }}</template> | ||||||
| 		<template v-if="profiles && Object.keys(profiles).length > 0"> | 		<template v-if="profiles && Object.keys(profiles).length > 0"> | ||||||
|  | 			<div class="_autoGap_half"> | ||||||
| 				<div | 				<div | ||||||
| 					v-for="(profile, id) in profiles" | 					v-for="(profile, id) in profiles" | ||||||
| 					:key="id" | 					:key="id" | ||||||
| 				class="_formBlock _panel" | 					class="_panel" | ||||||
| 					:class="$style.profile" | 					:class="$style.profile" | ||||||
| 					@click="$event => menu($event, id)" | 					@click="$event => menu($event, id)" | ||||||
| 					@contextmenu.prevent.stop="$event => menu($event, id)" | 					@contextmenu.prevent.stop="$event => menu($event, id)" | ||||||
|  | @ -20,6 +21,7 @@ | ||||||
| 					<div :class="$style.profileTime">{{ t('_preferencesBackups.createdAt', { date: (new Date(profile.createdAt)).toLocaleDateString(), time: (new Date(profile.createdAt)).toLocaleTimeString() }) }}</div> | 					<div :class="$style.profileTime">{{ t('_preferencesBackups.createdAt', { date: (new Date(profile.createdAt)).toLocaleDateString(), time: (new Date(profile.createdAt)).toLocaleTimeString() }) }}</div> | ||||||
| 					<div v-if="profile.updatedAt" :class="$style.profileTime">{{ t('_preferencesBackups.updatedAt', { date: (new Date(profile.updatedAt)).toLocaleDateString(), time: (new Date(profile.updatedAt)).toLocaleTimeString() }) }}</div> | 					<div v-if="profile.updatedAt" :class="$style.profileTime">{{ t('_preferencesBackups.updatedAt', { date: (new Date(profile.updatedAt)).toLocaleDateString(), time: (new Date(profile.updatedAt)).toLocaleTimeString() }) }}</div> | ||||||
| 				</div> | 				</div> | ||||||
|  | 			</div> | ||||||
| 		</template> | 		</template> | ||||||
| 		<div v-else-if="profiles"> | 		<div v-else-if="profiles"> | ||||||
| 			<MkInfo>{{ ts._preferencesBackups.noBackups }}</MkInfo> | 			<MkInfo>{{ ts._preferencesBackups.noBackups }}</MkInfo> | ||||||
|  |  | ||||||
|  | @ -1,14 +1,14 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSwitch v-model="isLocked" class="_formBlock" @update:model-value="save()">{{ i18n.ts.makeFollowManuallyApprove }}<template #caption>{{ i18n.ts.lockedAccountInfo }}</template></FormSwitch> | 	<FormSwitch v-model="isLocked" @update:model-value="save()">{{ i18n.ts.makeFollowManuallyApprove }}<template #caption>{{ i18n.ts.lockedAccountInfo }}</template></FormSwitch> | ||||||
| 	<FormSwitch v-if="isLocked" v-model="autoAcceptFollowed" class="_formBlock" @update:model-value="save()">{{ i18n.ts.autoAcceptFollowed }}</FormSwitch> | 	<FormSwitch v-if="isLocked" v-model="autoAcceptFollowed" @update:model-value="save()">{{ i18n.ts.autoAcceptFollowed }}</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 	<FormSwitch v-model="publicReactions" class="_formBlock" @update:model-value="save()"> | 	<FormSwitch v-model="publicReactions" @update:model-value="save()"> | ||||||
| 		{{ i18n.ts.makeReactionsPublic }} | 		{{ i18n.ts.makeReactionsPublic }} | ||||||
| 		<template #caption>{{ i18n.ts.makeReactionsPublicDescription }}</template> | 		<template #caption>{{ i18n.ts.makeReactionsPublicDescription }}</template> | ||||||
| 	</FormSwitch> | 	</FormSwitch> | ||||||
| 		 | 		 | ||||||
| 	<FormSelect v-model="ffVisibility" class="_formBlock" @update:model-value="save()"> | 	<FormSelect v-model="ffVisibility" @update:model-value="save()"> | ||||||
| 		<template #label>{{ i18n.ts.ffVisibility }}</template> | 		<template #label>{{ i18n.ts.ffVisibility }}</template> | ||||||
| 		<option value="public">{{ i18n.ts._ffVisibility.public }}</option> | 		<option value="public">{{ i18n.ts._ffVisibility.public }}</option> | ||||||
| 		<option value="followers">{{ i18n.ts._ffVisibility.followers }}</option> | 		<option value="followers">{{ i18n.ts._ffVisibility.followers }}</option> | ||||||
|  | @ -16,39 +16,43 @@ | ||||||
| 		<template #caption>{{ i18n.ts.ffVisibilityDescription }}</template> | 		<template #caption>{{ i18n.ts.ffVisibilityDescription }}</template> | ||||||
| 	</FormSelect> | 	</FormSelect> | ||||||
| 		 | 		 | ||||||
| 	<FormSwitch v-model="hideOnlineStatus" class="_formBlock" @update:model-value="save()"> | 	<FormSwitch v-model="hideOnlineStatus" @update:model-value="save()"> | ||||||
| 		{{ i18n.ts.hideOnlineStatus }} | 		{{ i18n.ts.hideOnlineStatus }} | ||||||
| 		<template #caption>{{ i18n.ts.hideOnlineStatusDescription }}</template> | 		<template #caption>{{ i18n.ts.hideOnlineStatusDescription }}</template> | ||||||
| 	</FormSwitch> | 	</FormSwitch> | ||||||
| 	<FormSwitch v-model="noCrawle" class="_formBlock" @update:model-value="save()"> | 	<FormSwitch v-model="noCrawle" @update:model-value="save()"> | ||||||
| 		{{ i18n.ts.noCrawle }} | 		{{ i18n.ts.noCrawle }} | ||||||
| 		<template #caption>{{ i18n.ts.noCrawleDescription }}</template> | 		<template #caption>{{ i18n.ts.noCrawleDescription }}</template> | ||||||
| 	</FormSwitch> | 	</FormSwitch> | ||||||
| 	<FormSwitch v-model="isExplorable" class="_formBlock" @update:model-value="save()"> | 	<FormSwitch v-model="isExplorable" @update:model-value="save()"> | ||||||
| 		{{ i18n.ts.makeExplorable }} | 		{{ i18n.ts.makeExplorable }} | ||||||
| 		<template #caption>{{ i18n.ts.makeExplorableDescription }}</template> | 		<template #caption>{{ i18n.ts.makeExplorableDescription }}</template> | ||||||
| 	</FormSwitch> | 	</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<FormSwitch v-model="rememberNoteVisibility" class="_formBlock" @update:model-value="save()">{{ i18n.ts.rememberNoteVisibility }}</FormSwitch> | 		<div class="_autoGap"> | ||||||
| 		<FormFolder v-if="!rememberNoteVisibility" class="_formBlock"> | 			<FormSwitch v-model="rememberNoteVisibility" @update:model-value="save()">{{ i18n.ts.rememberNoteVisibility }}</FormSwitch> | ||||||
|  | 			<FormFolder v-if="!rememberNoteVisibility"> | ||||||
| 				<template #label>{{ i18n.ts.defaultNoteVisibility }}</template> | 				<template #label>{{ i18n.ts.defaultNoteVisibility }}</template> | ||||||
| 				<template v-if="defaultNoteVisibility === 'public'" #suffix>{{ i18n.ts._visibility.public }}</template> | 				<template v-if="defaultNoteVisibility === 'public'" #suffix>{{ i18n.ts._visibility.public }}</template> | ||||||
| 				<template v-else-if="defaultNoteVisibility === 'home'" #suffix>{{ i18n.ts._visibility.home }}</template> | 				<template v-else-if="defaultNoteVisibility === 'home'" #suffix>{{ i18n.ts._visibility.home }}</template> | ||||||
| 				<template v-else-if="defaultNoteVisibility === 'followers'" #suffix>{{ i18n.ts._visibility.followers }}</template> | 				<template v-else-if="defaultNoteVisibility === 'followers'" #suffix>{{ i18n.ts._visibility.followers }}</template> | ||||||
| 				<template v-else-if="defaultNoteVisibility === 'specified'" #suffix>{{ i18n.ts._visibility.specified }}</template> | 				<template v-else-if="defaultNoteVisibility === 'specified'" #suffix>{{ i18n.ts._visibility.specified }}</template> | ||||||
| 
 | 
 | ||||||
| 			<FormSelect v-model="defaultNoteVisibility" class="_formBlock"> | 				<div class="_autoGap"> | ||||||
|  | 					<FormSelect v-model="defaultNoteVisibility"> | ||||||
| 						<option value="public">{{ i18n.ts._visibility.public }}</option> | 						<option value="public">{{ i18n.ts._visibility.public }}</option> | ||||||
| 						<option value="home">{{ i18n.ts._visibility.home }}</option> | 						<option value="home">{{ i18n.ts._visibility.home }}</option> | ||||||
| 						<option value="followers">{{ i18n.ts._visibility.followers }}</option> | 						<option value="followers">{{ i18n.ts._visibility.followers }}</option> | ||||||
| 						<option value="specified">{{ i18n.ts._visibility.specified }}</option> | 						<option value="specified">{{ i18n.ts._visibility.specified }}</option> | ||||||
| 					</FormSelect> | 					</FormSelect> | ||||||
| 			<FormSwitch v-model="defaultNoteLocalOnly" class="_formBlock">{{ i18n.ts._visibility.localOnly }}</FormSwitch> | 					<FormSwitch v-model="defaultNoteLocalOnly">{{ i18n.ts._visibility.localOnly }}</FormSwitch> | ||||||
|  | 				</div> | ||||||
| 			</FormFolder> | 			</FormFolder> | ||||||
|  | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 
 | 
 | ||||||
| 	<FormSwitch v-model="keepCw" class="_formBlock" @update:model-value="save()">{{ i18n.ts.keepCw }}</FormSwitch> | 	<FormSwitch v-model="keepCw" @update:model-value="save()">{{ i18n.ts.keepCw }}</FormSwitch> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<div class="llvierxe" :style="{ backgroundImage: $i.bannerUrl ? `url(${ $i.bannerUrl })` : null }"> | 	<div class="llvierxe" :style="{ backgroundImage: $i.bannerUrl ? `url(${ $i.bannerUrl })` : null }"> | ||||||
| 		<div class="avatar"> | 		<div class="avatar"> | ||||||
| 			<MkAvatar class="avatar" :user="$i" :disable-link="true" @click="changeAvatar"/> | 			<MkAvatar class="avatar" :user="$i" :disable-link="true" @click="changeAvatar"/> | ||||||
|  | @ -8,37 +8,37 @@ | ||||||
| 		<MkButton primary rounded class="bannerEdit" @click="changeBanner">{{ i18n.ts._profile.changeBanner }}</MkButton> | 		<MkButton primary rounded class="bannerEdit" @click="changeBanner">{{ i18n.ts._profile.changeBanner }}</MkButton> | ||||||
| 	</div> | 	</div> | ||||||
| 
 | 
 | ||||||
| 	<FormInput v-model="profile.name" :max="30" manual-save class="_formBlock"> | 	<FormInput v-model="profile.name" :max="30" manual-save> | ||||||
| 		<template #label>{{ i18n.ts._profile.name }}</template> | 		<template #label>{{ i18n.ts._profile.name }}</template> | ||||||
| 	</FormInput> | 	</FormInput> | ||||||
| 
 | 
 | ||||||
| 	<FormTextarea v-model="profile.description" :max="500" tall manual-save class="_formBlock"> | 	<FormTextarea v-model="profile.description" :max="500" tall manual-save> | ||||||
| 		<template #label>{{ i18n.ts._profile.description }}</template> | 		<template #label>{{ i18n.ts._profile.description }}</template> | ||||||
| 		<template #caption>{{ i18n.ts._profile.youCanIncludeHashtags }}</template> | 		<template #caption>{{ i18n.ts._profile.youCanIncludeHashtags }}</template> | ||||||
| 	</FormTextarea> | 	</FormTextarea> | ||||||
| 
 | 
 | ||||||
| 	<FormInput v-model="profile.location" manual-save class="_formBlock"> | 	<FormInput v-model="profile.location" manual-save> | ||||||
| 		<template #label>{{ i18n.ts.location }}</template> | 		<template #label>{{ i18n.ts.location }}</template> | ||||||
| 		<template #prefix><i class="ti ti-map-pin"></i></template> | 		<template #prefix><i class="ti ti-map-pin"></i></template> | ||||||
| 	</FormInput> | 	</FormInput> | ||||||
| 
 | 
 | ||||||
| 	<FormInput v-model="profile.birthday" type="date" manual-save class="_formBlock"> | 	<FormInput v-model="profile.birthday" type="date" manual-save> | ||||||
| 		<template #label>{{ i18n.ts.birthday }}</template> | 		<template #label>{{ i18n.ts.birthday }}</template> | ||||||
| 		<template #prefix><i class="ti ti-cake"></i></template> | 		<template #prefix><i class="ti ti-cake"></i></template> | ||||||
| 	</FormInput> | 	</FormInput> | ||||||
| 
 | 
 | ||||||
| 	<FormSelect v-model="profile.lang" class="_formBlock"> | 	<FormSelect v-model="profile.lang"> | ||||||
| 		<template #label>{{ i18n.ts.language }}</template> | 		<template #label>{{ i18n.ts.language }}</template> | ||||||
| 		<option v-for="x in Object.keys(langmap)" :key="x" :value="x">{{ langmap[x].nativeName }}</option> | 		<option v-for="x in Object.keys(langmap)" :key="x" :value="x">{{ langmap[x].nativeName }}</option> | ||||||
| 	</FormSelect> | 	</FormSelect> | ||||||
| 
 | 
 | ||||||
| 	<FormSlot class="_formBlock"> | 	<FormSlot> | ||||||
| 		<FormFolder> | 		<FormFolder> | ||||||
| 			<template #icon><i class="ti ti-list"></i></template> | 			<template #icon><i class="ti ti-list"></i></template> | ||||||
| 			<template #label>{{ i18n.ts._profile.metadataEdit }}</template> | 			<template #label>{{ i18n.ts._profile.metadataEdit }}</template> | ||||||
| 
 | 
 | ||||||
| 			<div class="_formRoot"> | 			<div class="_autoGap"> | ||||||
| 				<FormSplit v-for="(record, i) in fields" :min-width="250" class="_formBlock"> | 				<FormSplit v-for="(record, i) in fields" :min-width="250"> | ||||||
| 					<FormInput v-model="record.name" small> | 					<FormInput v-model="record.name" small> | ||||||
| 						<template #label>{{ i18n.ts._profile.metadataLabel }} #{{ i + 1 }}</template> | 						<template #label>{{ i18n.ts._profile.metadataLabel }} #{{ i + 1 }}</template> | ||||||
| 					</FormInput> | 					</FormInput> | ||||||
|  | @ -46,9 +46,11 @@ | ||||||
| 						<template #label>{{ i18n.ts._profile.metadataContent }} #{{ i + 1 }}</template> | 						<template #label>{{ i18n.ts._profile.metadataContent }} #{{ i + 1 }}</template> | ||||||
| 					</FormInput> | 					</FormInput> | ||||||
| 				</FormSplit> | 				</FormSplit> | ||||||
|  | 				<div> | ||||||
| 					<MkButton :disabled="fields.length >= 16" inline style="margin-right: 8px;" @click="addField"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton> | 					<MkButton :disabled="fields.length >= 16" inline style="margin-right: 8px;" @click="addField"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton> | ||||||
| 					<MkButton inline primary @click="saveFields"><i class="ti ti-check"></i> {{ i18n.ts.save }}</MkButton> | 					<MkButton inline primary @click="saveFields"><i class="ti ti-check"></i> {{ i18n.ts.save }}</MkButton> | ||||||
| 				</div> | 				</div> | ||||||
|  | 			</div> | ||||||
| 		</FormFolder> | 		</FormFolder> | ||||||
| 		<template #caption>{{ i18n.ts._profile.metadataDescription }}</template> | 		<template #caption>{{ i18n.ts._profile.metadataDescription }}</template> | ||||||
| 	</FormSlot> | 	</FormSlot> | ||||||
|  | @ -56,13 +58,13 @@ | ||||||
| 	<FormFolder> | 	<FormFolder> | ||||||
| 		<template #label>{{ i18n.ts.advancedSettings }}</template> | 		<template #label>{{ i18n.ts.advancedSettings }}</template> | ||||||
| 
 | 
 | ||||||
| 		<div class="_formRoot"> | 		<div class="_autoGap"> | ||||||
| 			<FormSwitch v-model="profile.isCat" class="_formBlock">{{ i18n.ts.flagAsCat }}<template #caption>{{ i18n.ts.flagAsCatDescription }}</template></FormSwitch> | 			<FormSwitch v-model="profile.isCat">{{ i18n.ts.flagAsCat }}<template #caption>{{ i18n.ts.flagAsCatDescription }}</template></FormSwitch> | ||||||
| 			<FormSwitch v-model="profile.isBot" class="_formBlock">{{ i18n.ts.flagAsBot }}<template #caption>{{ i18n.ts.flagAsBotDescription }}</template></FormSwitch> | 			<FormSwitch v-model="profile.isBot">{{ i18n.ts.flagAsBot }}<template #caption>{{ i18n.ts.flagAsBotDescription }}</template></FormSwitch> | ||||||
| 		</div> | 		</div> | ||||||
| 	</FormFolder> | 	</FormFolder> | ||||||
| 
 | 
 | ||||||
| 	<FormSwitch v-model="profile.showTimelineReplies" class="_formBlock">{{ i18n.ts.flagShowTimelineReplies }}<template #caption>{{ i18n.ts.flagShowTimelineRepliesDescription }} {{ i18n.ts.reflectMayTakeTime }}</template></FormSwitch> | 	<FormSwitch v-model="profile.showTimelineReplies">{{ i18n.ts.flagShowTimelineReplies }}<template #caption>{{ i18n.ts.flagShowTimelineRepliesDescription }} {{ i18n.ts.reflectMayTakeTime }}</template></FormSwitch> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FromSlot class="_formBlock"> | 	<FromSlot> | ||||||
| 		<template #label>{{ i18n.ts.reactionSettingDescription }}</template> | 		<template #label>{{ i18n.ts.reactionSettingDescription }}</template> | ||||||
| 		<div v-panel style="border-radius: 6px;"> | 		<div v-panel style="border-radius: 6px;"> | ||||||
| 			<Sortable v-model="reactions" class="zoaiodol" :item-key="item => item" :animation="150" :delay="100" :delay-on-touch-only="true"> | 			<Sortable v-model="reactions" class="zoaiodol" :item-key="item => item" :animation="150" :delay="100" :delay-on-touch-only="true"> | ||||||
|  | @ -17,13 +17,13 @@ | ||||||
| 		<template #caption>{{ i18n.ts.reactionSettingDescription2 }} <button class="_textButton" @click="preview">{{ i18n.ts.preview }}</button></template> | 		<template #caption>{{ i18n.ts.reactionSettingDescription2 }} <button class="_textButton" @click="preview">{{ i18n.ts.preview }}</button></template> | ||||||
| 	</FromSlot> | 	</FromSlot> | ||||||
| 
 | 
 | ||||||
| 	<FormRadios v-model="reactionPickerSize" class="_formBlock"> | 	<FormRadios v-model="reactionPickerSize"> | ||||||
| 		<template #label>{{ i18n.ts.size }}</template> | 		<template #label>{{ i18n.ts.size }}</template> | ||||||
| 		<option :value="1">{{ i18n.ts.small }}</option> | 		<option :value="1">{{ i18n.ts.small }}</option> | ||||||
| 		<option :value="2">{{ i18n.ts.medium }}</option> | 		<option :value="2">{{ i18n.ts.medium }}</option> | ||||||
| 		<option :value="3">{{ i18n.ts.large }}</option> | 		<option :value="3">{{ i18n.ts.large }}</option> | ||||||
| 	</FormRadios> | 	</FormRadios> | ||||||
| 	<FormRadios v-model="reactionPickerWidth" class="_formBlock"> | 	<FormRadios v-model="reactionPickerWidth"> | ||||||
| 		<template #label>{{ i18n.ts.numberOfColumn }}</template> | 		<template #label>{{ i18n.ts.numberOfColumn }}</template> | ||||||
| 		<option :value="1">5</option> | 		<option :value="1">5</option> | ||||||
| 		<option :value="2">6</option> | 		<option :value="2">6</option> | ||||||
|  | @ -31,7 +31,7 @@ | ||||||
| 		<option :value="4">8</option> | 		<option :value="4">8</option> | ||||||
| 		<option :value="5">9</option> | 		<option :value="5">9</option> | ||||||
| 	</FormRadios> | 	</FormRadios> | ||||||
| 	<FormRadios v-model="reactionPickerHeight" class="_formBlock"> | 	<FormRadios v-model="reactionPickerHeight"> | ||||||
| 		<template #label>{{ i18n.ts.height }}</template> | 		<template #label>{{ i18n.ts.height }}</template> | ||||||
| 		<option :value="1">{{ i18n.ts.small }}</option> | 		<option :value="1">{{ i18n.ts.small }}</option> | ||||||
| 		<option :value="2">{{ i18n.ts.medium }}</option> | 		<option :value="2">{{ i18n.ts.medium }}</option> | ||||||
|  | @ -39,7 +39,7 @@ | ||||||
| 		<option :value="4">{{ i18n.ts.large }}+</option> | 		<option :value="4">{{ i18n.ts.large }}+</option> | ||||||
| 	</FormRadios> | 	</FormRadios> | ||||||
| 
 | 
 | ||||||
| 	<FormSwitch v-model="reactionPickerUseDrawerForMobile" class="_formBlock"> | 	<FormSwitch v-model="reactionPickerUseDrawerForMobile"> | ||||||
| 		{{ i18n.ts.useDrawerReactionPickerForMobile }} | 		{{ i18n.ts.useDrawerReactionPickerForMobile }} | ||||||
| 		<template #caption>{{ i18n.ts.needReloadToApply }}</template> | 		<template #caption>{{ i18n.ts.needReloadToApply }}</template> | ||||||
| 	</FormSwitch> | 	</FormSwitch> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label>{{ i18n.ts.password }}</template> | 		<template #label>{{ i18n.ts.password }}</template> | ||||||
| 		<FormButton primary @click="change()">{{ i18n.ts.changePassword }}</FormButton> | 		<FormButton primary @click="change()">{{ i18n.ts.changePassword }}</FormButton> | ||||||
|  |  | ||||||
|  | @ -1,10 +1,10 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSelect v-model="type"> | 	<FormSelect v-model="type"> | ||||||
| 		<template #label>{{ i18n.ts.sound }}</template> | 		<template #label>{{ i18n.ts.sound }}</template> | ||||||
| 		<option v-for="x in soundsTypes" :key="x" :value="x">{{ x == null ? i18n.ts.none : x }}</option> | 		<option v-for="x in soundsTypes" :key="x" :value="x">{{ x == null ? i18n.ts.none : x }}</option> | ||||||
| 	</FormSelect> | 	</FormSelect> | ||||||
| 	<FormRange v-model="volume" :min="0" :max="1" :step="0.05" :text-converter="(v) => `${Math.floor(v * 100)}%`" class="_formBlock"> | 	<FormRange v-model="volume" :min="0" :max="1" :step="0.05" :text-converter="(v) => `${Math.floor(v * 100)}%`"> | ||||||
| 		<template #label>{{ i18n.ts.volume }}</template> | 		<template #label>{{ i18n.ts.volume }}</template> | ||||||
| 	</FormRange> | 	</FormRange> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,20 +1,22 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormRange v-model="masterVolume" :min="0" :max="1" :step="0.05" :text-converter="(v) => `${Math.floor(v * 100)}%`" class="_formBlock"> | 	<FormRange v-model="masterVolume" :min="0" :max="1" :step="0.05" :text-converter="(v) => `${Math.floor(v * 100)}%`"> | ||||||
| 		<template #label>{{ i18n.ts.masterVolume }}</template> | 		<template #label>{{ i18n.ts.masterVolume }}</template> | ||||||
| 	</FormRange> | 	</FormRange> | ||||||
| 
 | 
 | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label>{{ i18n.ts.sounds }}</template> | 		<template #label>{{ i18n.ts.sounds }}</template> | ||||||
| 		<FormFolder v-for="type in Object.keys(sounds)" :key="type" style="margin-bottom: 8px;"> | 		<div class="_autoGap_half"> | ||||||
|  | 			<FormFolder v-for="type in Object.keys(sounds)" :key="type"> | ||||||
| 				<template #label>{{ $t('_sfx.' + type) }}</template> | 				<template #label>{{ $t('_sfx.' + type) }}</template> | ||||||
| 				<template #suffix>{{ sounds[type].type ?? i18n.ts.none }}</template> | 				<template #suffix>{{ sounds[type].type ?? i18n.ts.none }}</template> | ||||||
| 
 | 
 | ||||||
| 				<XSound :type="sounds[type].type" :volume="sounds[type].volume" @update="(res) => updated(type, res)"/> | 				<XSound :type="sounds[type].type" :volume="sounds[type].volume" @update="(res) => updated(type, res)"/> | ||||||
| 			</FormFolder> | 			</FormFolder> | ||||||
|  | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 
 | 
 | ||||||
| 	<FormButton danger class="_formBlock" @click="reset()"><i class="ti ti-reload"></i> {{ i18n.ts.default }}</FormButton> | 	<FormButton danger @click="reset()"><i class="ti ti-reload"></i> {{ i18n.ts.default }}</FormButton> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,21 +1,21 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSelect v-model="statusbar.type" placeholder="Please select" class="_formBlock"> | 	<FormSelect v-model="statusbar.type" placeholder="Please select"> | ||||||
| 		<template #label>{{ i18n.ts.type }}</template> | 		<template #label>{{ i18n.ts.type }}</template> | ||||||
| 		<option value="rss">RSS</option> | 		<option value="rss">RSS</option> | ||||||
| 		<option value="federation">Federation</option> | 		<option value="federation">Federation</option> | ||||||
| 		<option value="userList">User list timeline</option> | 		<option value="userList">User list timeline</option> | ||||||
| 	</FormSelect> | 	</FormSelect> | ||||||
| 
 | 
 | ||||||
| 	<MkInput v-model="statusbar.name" manual-save class="_formBlock"> | 	<MkInput v-model="statusbar.name" manual-save> | ||||||
| 		<template #label>{{ i18n.ts.label }}</template> | 		<template #label>{{ i18n.ts.label }}</template> | ||||||
| 	</MkInput> | 	</MkInput> | ||||||
| 
 | 
 | ||||||
| 	<MkSwitch v-model="statusbar.black" class="_formBlock"> | 	<MkSwitch v-model="statusbar.black"> | ||||||
| 		<template #label>Black</template> | 		<template #label>Black</template> | ||||||
| 	</MkSwitch> | 	</MkSwitch> | ||||||
| 
 | 
 | ||||||
| 	<FormRadios v-model="statusbar.size" class="_formBlock"> | 	<FormRadios v-model="statusbar.size"> | ||||||
| 		<template #label>{{ i18n.ts.size }}</template> | 		<template #label>{{ i18n.ts.size }}</template> | ||||||
| 		<option value="verySmall">{{ i18n.ts.small }}+</option> | 		<option value="verySmall">{{ i18n.ts.small }}+</option> | ||||||
| 		<option value="small">{{ i18n.ts.small }}</option> | 		<option value="small">{{ i18n.ts.small }}</option> | ||||||
|  | @ -25,51 +25,51 @@ | ||||||
| 	</FormRadios> | 	</FormRadios> | ||||||
| 
 | 
 | ||||||
| 	<template v-if="statusbar.type === 'rss'"> | 	<template v-if="statusbar.type === 'rss'"> | ||||||
| 		<MkInput v-model="statusbar.props.url" manual-save class="_formBlock" type="url"> | 		<MkInput v-model="statusbar.props.url" manual-save type="url"> | ||||||
| 			<template #label>URL</template> | 			<template #label>URL</template> | ||||||
| 		</MkInput> | 		</MkInput> | ||||||
| 		<MkSwitch v-model="statusbar.props.shuffle" class="_formBlock"> | 		<MkSwitch v-model="statusbar.props.shuffle"> | ||||||
| 			<template #label>{{ i18n.ts.shuffle }}</template> | 			<template #label>{{ i18n.ts.shuffle }}</template> | ||||||
| 		</MkSwitch> | 		</MkSwitch> | ||||||
| 		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save class="_formBlock" type="number"> | 		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save type="number"> | ||||||
| 			<template #label>{{ i18n.ts.refreshInterval }}</template> | 			<template #label>{{ i18n.ts.refreshInterval }}</template> | ||||||
| 		</MkInput> | 		</MkInput> | ||||||
| 		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1" class="_formBlock"> | 		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1"> | ||||||
| 			<template #label>{{ i18n.ts.speed }}</template> | 			<template #label>{{ i18n.ts.speed }}</template> | ||||||
| 			<template #caption>{{ i18n.ts.fast }} <-> {{ i18n.ts.slow }}</template> | 			<template #caption>{{ i18n.ts.fast }} <-> {{ i18n.ts.slow }}</template> | ||||||
| 		</FormRange> | 		</FormRange> | ||||||
| 		<MkSwitch v-model="statusbar.props.marqueeReverse" class="_formBlock"> | 		<MkSwitch v-model="statusbar.props.marqueeReverse"> | ||||||
| 			<template #label>{{ i18n.ts.reverse }}</template> | 			<template #label>{{ i18n.ts.reverse }}</template> | ||||||
| 		</MkSwitch> | 		</MkSwitch> | ||||||
| 	</template> | 	</template> | ||||||
| 	<template v-else-if="statusbar.type === 'federation'"> | 	<template v-else-if="statusbar.type === 'federation'"> | ||||||
| 		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save class="_formBlock" type="number"> | 		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save type="number"> | ||||||
| 			<template #label>{{ i18n.ts.refreshInterval }}</template> | 			<template #label>{{ i18n.ts.refreshInterval }}</template> | ||||||
| 		</MkInput> | 		</MkInput> | ||||||
| 		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1" class="_formBlock"> | 		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1"> | ||||||
| 			<template #label>{{ i18n.ts.speed }}</template> | 			<template #label>{{ i18n.ts.speed }}</template> | ||||||
| 			<template #caption>{{ i18n.ts.fast }} <-> {{ i18n.ts.slow }}</template> | 			<template #caption>{{ i18n.ts.fast }} <-> {{ i18n.ts.slow }}</template> | ||||||
| 		</FormRange> | 		</FormRange> | ||||||
| 		<MkSwitch v-model="statusbar.props.marqueeReverse" class="_formBlock"> | 		<MkSwitch v-model="statusbar.props.marqueeReverse"> | ||||||
| 			<template #label>{{ i18n.ts.reverse }}</template> | 			<template #label>{{ i18n.ts.reverse }}</template> | ||||||
| 		</MkSwitch> | 		</MkSwitch> | ||||||
| 		<MkSwitch v-model="statusbar.props.colored" class="_formBlock"> | 		<MkSwitch v-model="statusbar.props.colored"> | ||||||
| 			<template #label>{{ i18n.ts.colored }}</template> | 			<template #label>{{ i18n.ts.colored }}</template> | ||||||
| 		</MkSwitch> | 		</MkSwitch> | ||||||
| 	</template> | 	</template> | ||||||
| 	<template v-else-if="statusbar.type === 'userList' && userLists != null"> | 	<template v-else-if="statusbar.type === 'userList' && userLists != null"> | ||||||
| 		<FormSelect v-model="statusbar.props.userListId" class="_formBlock"> | 		<FormSelect v-model="statusbar.props.userListId"> | ||||||
| 			<template #label>{{ i18n.ts.userList }}</template> | 			<template #label>{{ i18n.ts.userList }}</template> | ||||||
| 			<option v-for="list in userLists" :value="list.id">{{ list.name }}</option> | 			<option v-for="list in userLists" :value="list.id">{{ list.name }}</option> | ||||||
| 		</FormSelect> | 		</FormSelect> | ||||||
| 		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save class="_formBlock" type="number"> | 		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save type="number"> | ||||||
| 			<template #label>{{ i18n.ts.refreshInterval }}</template> | 			<template #label>{{ i18n.ts.refreshInterval }}</template> | ||||||
| 		</MkInput> | 		</MkInput> | ||||||
| 		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1" class="_formBlock"> | 		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1"> | ||||||
| 			<template #label>{{ i18n.ts.speed }}</template> | 			<template #label>{{ i18n.ts.speed }}</template> | ||||||
| 			<template #caption>{{ i18n.ts.fast }} <-> {{ i18n.ts.slow }}</template> | 			<template #caption>{{ i18n.ts.fast }} <-> {{ i18n.ts.slow }}</template> | ||||||
| 		</FormRange> | 		</FormRange> | ||||||
| 		<MkSwitch v-model="statusbar.props.marqueeReverse" class="_formBlock"> | 		<MkSwitch v-model="statusbar.props.marqueeReverse"> | ||||||
| 			<template #label>{{ i18n.ts.reverse }}</template> | 			<template #label>{{ i18n.ts.reverse }}</template> | ||||||
| 		</MkSwitch> | 		</MkSwitch> | ||||||
| 	</template> | 	</template> | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormFolder v-for="x in statusbars" :key="x.id" class="_formBlock"> | 	<FormFolder v-for="x in statusbars" :key="x.id"> | ||||||
| 		<template #label>{{ x.type ?? i18n.ts.notSet }}</template> | 		<template #label>{{ x.type ?? i18n.ts.notSet }}</template> | ||||||
| 		<template #suffix>{{ x.name }}</template> | 		<template #suffix>{{ x.name }}</template> | ||||||
| 		<XStatusbar :_id="x.id" :user-lists="userLists"/> | 		<XStatusbar :_id="x.id" :user-lists="userLists"/> | ||||||
|  |  | ||||||
|  | @ -1,10 +1,10 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormTextarea v-model="installThemeCode" class="_formBlock"> | 	<FormTextarea v-model="installThemeCode"> | ||||||
| 		<template #label>{{ i18n.ts._theme.code }}</template> | 		<template #label>{{ i18n.ts._theme.code }}</template> | ||||||
| 	</FormTextarea> | 	</FormTextarea> | ||||||
| 
 | 
 | ||||||
| 	<div class="_formBlock" style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | 	<div style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | ||||||
| 		<FormButton :disabled="installThemeCode == null" inline @click="() => preview(installThemeCode)"><i class="ti ti-eye"></i> {{ i18n.ts.preview }}</FormButton> | 		<FormButton :disabled="installThemeCode == null" inline @click="() => preview(installThemeCode)"><i class="ti ti-eye"></i> {{ i18n.ts.preview }}</FormButton> | ||||||
| 		<FormButton :disabled="installThemeCode == null" primary inline @click="() => install(installThemeCode)"><i class="ti ti-check"></i> {{ i18n.ts.install }}</FormButton> | 		<FormButton :disabled="installThemeCode == null" primary inline @click="() => install(installThemeCode)"><i class="ti ti-check"></i> {{ i18n.ts.install }}</FormButton> | ||||||
| 	</div> | 	</div> | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSelect v-model="selectedThemeId" class="_formBlock"> | 	<FormSelect v-model="selectedThemeId"> | ||||||
| 		<template #label>{{ i18n.ts.theme }}</template> | 		<template #label>{{ i18n.ts.theme }}</template> | ||||||
| 		<optgroup :label="i18n.ts._theme.installedThemes"> | 		<optgroup :label="i18n.ts._theme.installedThemes"> | ||||||
| 			<option v-for="x in installedThemes" :key="x.id" :value="x.id">{{ x.name }}</option> | 			<option v-for="x in installedThemes" :key="x.id" :value="x.id">{{ x.name }}</option> | ||||||
|  | @ -10,17 +10,17 @@ | ||||||
| 		</optgroup> | 		</optgroup> | ||||||
| 	</FormSelect> | 	</FormSelect> | ||||||
| 	<template v-if="selectedTheme"> | 	<template v-if="selectedTheme"> | ||||||
| 		<FormInput readonly :model-value="selectedTheme.author" class="_formBlock"> | 		<FormInput readonly :model-value="selectedTheme.author"> | ||||||
| 			<template #label>{{ i18n.ts.author }}</template> | 			<template #label>{{ i18n.ts.author }}</template> | ||||||
| 		</FormInput> | 		</FormInput> | ||||||
| 		<FormTextarea v-if="selectedTheme.desc" readonly :model-value="selectedTheme.desc" class="_formBlock"> | 		<FormTextarea v-if="selectedTheme.desc" readonly :model-value="selectedTheme.desc"> | ||||||
| 			<template #label>{{ i18n.ts._theme.description }}</template> | 			<template #label>{{ i18n.ts._theme.description }}</template> | ||||||
| 		</FormTextarea> | 		</FormTextarea> | ||||||
| 		<FormTextarea readonly tall :model-value="selectedThemeCode" class="_formBlock"> | 		<FormTextarea readonly tall :model-value="selectedThemeCode"> | ||||||
| 			<template #label>{{ i18n.ts._theme.code }}</template> | 			<template #label>{{ i18n.ts._theme.code }}</template> | ||||||
| 			<template #caption><button class="_textButton" @click="copyThemeCode()">{{ i18n.ts.copy }}</button></template> | 			<template #caption><button class="_textButton" @click="copyThemeCode()">{{ i18n.ts.copy }}</button></template> | ||||||
| 		</FormTextarea> | 		</FormTextarea> | ||||||
| 		<FormButton v-if="!builtinThemes.some(t => t.id == selectedTheme.id)" class="_formBlock" danger @click="uninstall()"><i class="ti ti-trash"></i> {{ i18n.ts.uninstall }}</FormButton> | 		<FormButton v-if="!builtinThemes.some(t => t.id == selectedTheme.id)" danger @click="uninstall()"><i class="ti ti-trash"></i> {{ i18n.ts.uninstall }}</FormButton> | ||||||
| 	</template> | 	</template> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot rsljpzjq"> | <div class="_autoGap rsljpzjq"> | ||||||
| 	<div v-adaptive-border class="rfqxtzch _panel _formBlock"> | 	<div v-adaptive-border class="rfqxtzch _panel"> | ||||||
| 		<div class="toggle"> | 		<div class="toggle"> | ||||||
| 			<div class="toggleWrapper"> | 			<div class="toggleWrapper"> | ||||||
| 				<input id="dn" v-model="darkMode" type="checkbox" class="dn"/> | 				<input id="dn" v-model="darkMode" type="checkbox" class="dn"/> | ||||||
|  | @ -26,7 +26,7 @@ | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
| 
 | 
 | ||||||
| 	<div class="selects _formBlock"> | 	<div class="selects"> | ||||||
| 		<FormSelect v-model="lightThemeId" large class="select"> | 		<FormSelect v-model="lightThemeId" large class="select"> | ||||||
| 			<template #label>{{ i18n.ts.themeForLightMode }}</template> | 			<template #label>{{ i18n.ts.themeForLightMode }}</template> | ||||||
| 			<template #prefix><i class="ti ti-sun"></i></template> | 			<template #prefix><i class="ti ti-sun"></i></template> | ||||||
|  | @ -60,8 +60,8 @@ | ||||||
| 		</div> | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 
 | 
 | ||||||
| 	<FormButton v-if="wallpaper == null" class="_formBlock" @click="setWallpaper">{{ i18n.ts.setWallpaper }}</FormButton> | 	<FormButton v-if="wallpaper == null" @click="setWallpaper">{{ i18n.ts.setWallpaper }}</FormButton> | ||||||
| 	<FormButton v-else class="_formBlock" @click="wallpaper = null">{{ i18n.ts.removeWallpaper }}</FormButton> | 	<FormButton v-else @click="wallpaper = null">{{ i18n.ts.removeWallpaper }}</FormButton> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,14 +1,14 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormInput v-model="name" class="_formBlock"> | 	<FormInput v-model="name"> | ||||||
| 		<template #label>Name</template> | 		<template #label>Name</template> | ||||||
| 	</FormInput> | 	</FormInput> | ||||||
| 
 | 
 | ||||||
| 	<FormInput v-model="url" type="url" class="_formBlock"> | 	<FormInput v-model="url" type="url"> | ||||||
| 		<template #label>URL</template> | 		<template #label>URL</template> | ||||||
| 	</FormInput> | 	</FormInput> | ||||||
| 
 | 
 | ||||||
| 	<FormInput v-model="secret" class="_formBlock"> | 	<FormInput v-model="secret"> | ||||||
| 		<template #prefix><i class="ti ti-lock"></i></template> | 		<template #prefix><i class="ti ti-lock"></i></template> | ||||||
| 		<template #label>Secret</template> | 		<template #label>Secret</template> | ||||||
| 	</FormInput> | 	</FormInput> | ||||||
|  | @ -16,18 +16,20 @@ | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label>Events</template> | 		<template #label>Events</template> | ||||||
| 
 | 
 | ||||||
| 		<FormSwitch v-model="event_follow" class="_formBlock">Follow</FormSwitch> | 		<div class="_autoGap_half"> | ||||||
| 		<FormSwitch v-model="event_followed" class="_formBlock">Followed</FormSwitch> | 			<FormSwitch v-model="event_follow">Follow</FormSwitch> | ||||||
| 		<FormSwitch v-model="event_note" class="_formBlock">Note</FormSwitch> | 			<FormSwitch v-model="event_followed">Followed</FormSwitch> | ||||||
| 		<FormSwitch v-model="event_reply" class="_formBlock">Reply</FormSwitch> | 			<FormSwitch v-model="event_note">Note</FormSwitch> | ||||||
| 		<FormSwitch v-model="event_renote" class="_formBlock">Renote</FormSwitch> | 			<FormSwitch v-model="event_reply">Reply</FormSwitch> | ||||||
| 		<FormSwitch v-model="event_reaction" class="_formBlock">Reaction</FormSwitch> | 			<FormSwitch v-model="event_renote">Renote</FormSwitch> | ||||||
| 		<FormSwitch v-model="event_mention" class="_formBlock">Mention</FormSwitch> | 			<FormSwitch v-model="event_reaction">Reaction</FormSwitch> | ||||||
|  | 			<FormSwitch v-model="event_mention">Mention</FormSwitch> | ||||||
|  | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 
 | 
 | ||||||
| 	<FormSwitch v-model="active" class="_formBlock">Active</FormSwitch> | 	<FormSwitch v-model="active">Active</FormSwitch> | ||||||
| 
 | 
 | ||||||
| 	<div class="_formBlock" style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | 	<div style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | ||||||
| 		<FormButton primary inline @click="save"><i class="ti ti-check"></i> {{ i18n.ts.save }}</FormButton> | 		<FormButton primary inline @click="save"><i class="ti ti-check"></i> {{ i18n.ts.save }}</FormButton> | ||||||
| 	</div> | 	</div> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|  | @ -1,14 +1,14 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormInput v-model="name" class="_formBlock"> | 	<FormInput v-model="name"> | ||||||
| 		<template #label>Name</template> | 		<template #label>Name</template> | ||||||
| 	</FormInput> | 	</FormInput> | ||||||
| 
 | 
 | ||||||
| 	<FormInput v-model="url" type="url" class="_formBlock"> | 	<FormInput v-model="url" type="url"> | ||||||
| 		<template #label>URL</template> | 		<template #label>URL</template> | ||||||
| 	</FormInput> | 	</FormInput> | ||||||
| 
 | 
 | ||||||
| 	<FormInput v-model="secret" class="_formBlock"> | 	<FormInput v-model="secret"> | ||||||
| 		<template #prefix><i class="ti ti-lock"></i></template> | 		<template #prefix><i class="ti ti-lock"></i></template> | ||||||
| 		<template #label>Secret</template> | 		<template #label>Secret</template> | ||||||
| 	</FormInput> | 	</FormInput> | ||||||
|  | @ -16,16 +16,18 @@ | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<template #label>Events</template> | 		<template #label>Events</template> | ||||||
| 
 | 
 | ||||||
| 		<FormSwitch v-model="event_follow" class="_formBlock">Follow</FormSwitch> | 		<div class="_autoGap_half"> | ||||||
| 		<FormSwitch v-model="event_followed" class="_formBlock">Followed</FormSwitch> | 			<FormSwitch v-model="event_follow">Follow</FormSwitch> | ||||||
| 		<FormSwitch v-model="event_note" class="_formBlock">Note</FormSwitch> | 			<FormSwitch v-model="event_followed">Followed</FormSwitch> | ||||||
| 		<FormSwitch v-model="event_reply" class="_formBlock">Reply</FormSwitch> | 			<FormSwitch v-model="event_note">Note</FormSwitch> | ||||||
| 		<FormSwitch v-model="event_renote" class="_formBlock">Renote</FormSwitch> | 			<FormSwitch v-model="event_reply">Reply</FormSwitch> | ||||||
| 		<FormSwitch v-model="event_reaction" class="_formBlock">Reaction</FormSwitch> | 			<FormSwitch v-model="event_renote">Renote</FormSwitch> | ||||||
| 		<FormSwitch v-model="event_mention" class="_formBlock">Mention</FormSwitch> | 			<FormSwitch v-model="event_reaction">Reaction</FormSwitch> | ||||||
|  | 			<FormSwitch v-model="event_mention">Mention</FormSwitch> | ||||||
|  | 		</div> | ||||||
| 	</FormSection> | 	</FormSection> | ||||||
| 
 | 
 | ||||||
| 	<div class="_formBlock" style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | 	<div style="display: flex; gap: var(--margin); flex-wrap: wrap;"> | ||||||
| 		<FormButton primary inline @click="create"><i class="ti ti-check"></i> {{ i18n.ts.create }}</FormButton> | 		<FormButton primary inline @click="create"><i class="ti ti-check"></i> {{ i18n.ts.create }}</FormButton> | ||||||
| 	</div> | 	</div> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|  | @ -1,15 +1,13 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<FormSection> |  | ||||||
| 	<FormLink :to="`/settings/webhook/new`"> | 	<FormLink :to="`/settings/webhook/new`"> | ||||||
| 		Create webhook | 		Create webhook | ||||||
| 	</FormLink> | 	</FormLink> | ||||||
| 	</FormSection> |  | ||||||
| 
 | 
 | ||||||
| 	<FormSection> | 	<FormSection> | ||||||
| 		<MkPagination :pagination="pagination"> | 		<MkPagination :pagination="pagination"> | ||||||
| 			<template #default="{items}"> | 			<template #default="{items}"> | ||||||
| 				<FormLink v-for="webhook in items" :key="webhook.id" :to="`/settings/webhook/edit/${webhook.id}`" class="_formBlock"> | 				<FormLink v-for="webhook in items" :key="webhook.id" :to="`/settings/webhook/edit/${webhook.id}`" class="_margin"> | ||||||
| 					<template #icon> | 					<template #icon> | ||||||
| 						<i v-if="webhook.active === false" class="ti ti-player-pause"></i> | 						<i v-if="webhook.active === false" class="ti ti-player-pause"></i> | ||||||
| 						<i v-else-if="webhook.latestStatus === null" class="ti ti-circle"></i> | 						<i v-else-if="webhook.latestStatus === null" class="ti ti-circle"></i> | ||||||
|  |  | ||||||
|  | @ -1,24 +1,24 @@ | ||||||
| <template> | <template> | ||||||
| <div class="_formRoot"> | <div class="_autoGap"> | ||||||
| 	<MkTab v-model="tab" class="_formBlock"> | 	<MkTab v-model="tab"> | ||||||
| 		<option value="soft">{{ i18n.ts._wordMute.soft }}</option> | 		<option value="soft">{{ i18n.ts._wordMute.soft }}</option> | ||||||
| 		<option value="hard">{{ i18n.ts._wordMute.hard }}</option> | 		<option value="hard">{{ i18n.ts._wordMute.hard }}</option> | ||||||
| 	</MkTab> | 	</MkTab> | ||||||
| 	<div class="_formBlock"> | 	<div> | ||||||
| 		<div v-show="tab === 'soft'"> | 		<div v-show="tab === 'soft'" class="_autoGap"> | ||||||
| 			<MkInfo class="_formBlock">{{ i18n.ts._wordMute.softDescription }}</MkInfo> | 			<MkInfo>{{ i18n.ts._wordMute.softDescription }}</MkInfo> | ||||||
| 			<FormTextarea v-model="softMutedWords" class="_formBlock"> | 			<FormTextarea v-model="softMutedWords"> | ||||||
| 				<span>{{ i18n.ts._wordMute.muteWords }}</span> | 				<span>{{ i18n.ts._wordMute.muteWords }}</span> | ||||||
| 				<template #caption>{{ i18n.ts._wordMute.muteWordsDescription }}<br>{{ i18n.ts._wordMute.muteWordsDescription2 }}</template> | 				<template #caption>{{ i18n.ts._wordMute.muteWordsDescription }}<br>{{ i18n.ts._wordMute.muteWordsDescription2 }}</template> | ||||||
| 			</FormTextarea> | 			</FormTextarea> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div v-show="tab === 'hard'"> | 		<div v-show="tab === 'hard'" class="_autoGap"> | ||||||
| 			<MkInfo class="_formBlock">{{ i18n.ts._wordMute.hardDescription }} {{ i18n.ts.reflectMayTakeTime }}</MkInfo> | 			<MkInfo>{{ i18n.ts._wordMute.hardDescription }} {{ i18n.ts.reflectMayTakeTime }}</MkInfo> | ||||||
| 			<FormTextarea v-model="hardMutedWords" class="_formBlock"> | 			<FormTextarea v-model="hardMutedWords"> | ||||||
| 				<span>{{ i18n.ts._wordMute.muteWords }}</span> | 				<span>{{ i18n.ts._wordMute.muteWords }}</span> | ||||||
| 				<template #caption>{{ i18n.ts._wordMute.muteWordsDescription }}<br>{{ i18n.ts._wordMute.muteWordsDescription2 }}</template> | 				<template #caption>{{ i18n.ts._wordMute.muteWordsDescription }}<br>{{ i18n.ts._wordMute.muteWordsDescription2 }}</template> | ||||||
| 			</FormTextarea> | 			</FormTextarea> | ||||||
| 			<MkKeyValue v-if="hardWordMutedNotesCount != null" class="_formBlock"> | 			<MkKeyValue v-if="hardWordMutedNotesCount != null"> | ||||||
| 				<template #key>{{ i18n.ts._wordMute.mutedNotes }}</template> | 				<template #key>{{ i18n.ts._wordMute.mutedNotes }}</template> | ||||||
| 				<template #value>{{ number(hardWordMutedNotesCount) }}</template> | 				<template #value>{{ number(hardWordMutedNotesCount) }}</template> | ||||||
| 			</MkKeyValue> | 			</MkKeyValue> | ||||||
|  |  | ||||||
|  | @ -2,8 +2,8 @@ | ||||||
| <MkStickyContainer> | <MkStickyContainer> | ||||||
| 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="800" :margin-min="16" :margin-max="32"> | 	<MkSpacer :content-max="800" :margin-min="16" :margin-max="32"> | ||||||
| 		<div class="cwepdizn _formRoot"> | 		<div class="cwepdizn _autoGap"> | ||||||
| 			<FormFolder :default-open="true" class="_formBlock"> | 			<FormFolder :default-open="true"> | ||||||
| 				<template #label>{{ i18n.ts.backgroundColor }}</template> | 				<template #label>{{ i18n.ts.backgroundColor }}</template> | ||||||
| 				<div class="cwepdizn-colors"> | 				<div class="cwepdizn-colors"> | ||||||
| 					<div class="row"> | 					<div class="row"> | ||||||
|  | @ -19,7 +19,7 @@ | ||||||
| 				</div> | 				</div> | ||||||
| 			</FormFolder> | 			</FormFolder> | ||||||
| 
 | 
 | ||||||
| 			<FormFolder :default-open="true" class="_formBlock"> | 			<FormFolder :default-open="true"> | ||||||
| 				<template #label>{{ i18n.ts.accentColor }}</template> | 				<template #label>{{ i18n.ts.accentColor }}</template> | ||||||
| 				<div class="cwepdizn-colors"> | 				<div class="cwepdizn-colors"> | ||||||
| 					<div class="row"> | 					<div class="row"> | ||||||
|  | @ -30,7 +30,7 @@ | ||||||
| 				</div> | 				</div> | ||||||
| 			</FormFolder> | 			</FormFolder> | ||||||
| 
 | 
 | ||||||
| 			<FormFolder :default-open="true" class="_formBlock"> | 			<FormFolder :default-open="true"> | ||||||
| 				<template #label>{{ i18n.ts.textColor }}</template> | 				<template #label>{{ i18n.ts.textColor }}</template> | ||||||
| 				<div class="cwepdizn-colors"> | 				<div class="cwepdizn-colors"> | ||||||
| 					<div class="row"> | 					<div class="row"> | ||||||
|  | @ -41,22 +41,22 @@ | ||||||
| 				</div> | 				</div> | ||||||
| 			</FormFolder> | 			</FormFolder> | ||||||
| 
 | 
 | ||||||
| 			<FormFolder :default-open="false" class="_formBlock"> | 			<FormFolder :default-open="false"> | ||||||
| 				<template #icon><i class="ti ti-code"></i></template> | 				<template #icon><i class="ti ti-code"></i></template> | ||||||
| 				<template #label>{{ i18n.ts.editCode }}</template> | 				<template #label>{{ i18n.ts.editCode }}</template> | ||||||
| 
 | 
 | ||||||
| 				<div class="_formRoot"> | 				<div class="_autoGap"> | ||||||
| 					<FormTextarea v-model="themeCode" tall class="_formBlock"> | 					<FormTextarea v-model="themeCode" tall> | ||||||
| 						<template #label>{{ i18n.ts._theme.code }}</template> | 						<template #label>{{ i18n.ts._theme.code }}</template> | ||||||
| 					</FormTextarea> | 					</FormTextarea> | ||||||
| 					<FormButton primary class="_formBlock" @click="applyThemeCode">{{ i18n.ts.apply }}</FormButton> | 					<FormButton primary @click="applyThemeCode">{{ i18n.ts.apply }}</FormButton> | ||||||
| 				</div> | 				</div> | ||||||
| 			</FormFolder> | 			</FormFolder> | ||||||
| 
 | 
 | ||||||
| 			<FormFolder :default-open="false" class="_formBlock"> | 			<FormFolder :default-open="false"> | ||||||
| 				<template #label>{{ i18n.ts.addDescription }}</template> | 				<template #label>{{ i18n.ts.addDescription }}</template> | ||||||
| 
 | 
 | ||||||
| 				<div class="_formRoot"> | 				<div class="_autoGap"> | ||||||
| 					<FormTextarea v-model="description"> | 					<FormTextarea v-model="description"> | ||||||
| 						<template #label>{{ i18n.ts._theme.description }}</template> | 						<template #label>{{ i18n.ts._theme.description }}</template> | ||||||
| 					</FormTextarea> | 					</FormTextarea> | ||||||
|  |  | ||||||
|  | @ -3,8 +3,8 @@ | ||||||
| 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template> | 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template> | ||||||
| 	<MkSpacer :content-max="600" :margin-min="16" :margin-max="32"> | 	<MkSpacer :content-max="600" :margin-min="16" :margin-max="32"> | ||||||
| 		<FormSuspense :p="init"> | 		<FormSuspense :p="init"> | ||||||
| 			<div v-if="tab === 'overview'" class="_formRoot"> | 			<div v-if="tab === 'overview'" class="_autoGap"> | ||||||
| 				<div class="_formBlock aeakzknw"> | 				<div class="aeakzknw"> | ||||||
| 					<MkAvatar class="avatar" :user="user" :show-indicator="true"/> | 					<MkAvatar class="avatar" :user="user" :show-indicator="true"/> | ||||||
| 					<div class="body"> | 					<div class="body"> | ||||||
| 						<span class="name"><MkUserName class="name" :user="user"/></span> | 						<span class="name"><MkUserName class="name" :user="user"/></span> | ||||||
|  | @ -17,36 +17,36 @@ | ||||||
| 					</div> | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
| 
 | 
 | ||||||
| 				<MkInfo v-if="user.username.includes('.')" class="_formBlock">{{ i18n.ts.isSystemAccount }}</MkInfo> | 				<MkInfo v-if="user.username.includes('.')">{{ i18n.ts.isSystemAccount }}</MkInfo> | ||||||
| 
 | 
 | ||||||
| 				<div v-if="user.url" class="_formLinksGrid _formBlock"> | 				<div v-if="user.url" class="_formLinksGrid"> | ||||||
| 					<FormLink :to="userPage(user)">Profile</FormLink> | 					<FormLink :to="userPage(user)">Profile</FormLink> | ||||||
| 					<FormLink :to="user.url" :external="true">Profile (remote)</FormLink> | 					<FormLink :to="user.url" :external="true">Profile (remote)</FormLink> | ||||||
| 				</div> | 				</div> | ||||||
| 				<FormLink v-else class="_formBlock" :to="userPage(user)">Profile</FormLink> | 				<FormLink v-else :to="userPage(user)">Profile</FormLink> | ||||||
| 
 | 
 | ||||||
| 				<FormLink v-if="user.host" class="_formBlock" :to="`/instance-info/${user.host}`">{{ i18n.ts.instanceInfo }}</FormLink> | 				<FormLink v-if="user.host" :to="`/instance-info/${user.host}`">{{ i18n.ts.instanceInfo }}</FormLink> | ||||||
| 
 | 
 | ||||||
| 				<div class="_formBlock"> | 				<div style="display: flex; flex-direction: column; gap: 1em;"> | ||||||
| 					<MkKeyValue :copy="user.id" oneline style="margin: 1em 0;"> | 					<MkKeyValue :copy="user.id" oneline> | ||||||
| 						<template #key>ID</template> | 						<template #key>ID</template> | ||||||
| 						<template #value><span class="_monospace">{{ user.id }}</span></template> | 						<template #value><span class="_monospace">{{ user.id }}</span></template> | ||||||
| 					</MkKeyValue> | 					</MkKeyValue> | ||||||
| 					<!-- 要る? | 					<!-- 要る? | ||||||
| 					<MkKeyValue v-if="ips.length > 0" :copy="user.id" oneline style="margin: 1em 0;"> | 					<MkKeyValue v-if="ips.length > 0" :copy="user.id" oneline> | ||||||
| 						<template #key>IP (recent)</template> | 						<template #key>IP (recent)</template> | ||||||
| 						<template #value><span class="_monospace">{{ ips[0].ip }}</span></template> | 						<template #value><span class="_monospace">{{ ips[0].ip }}</span></template> | ||||||
| 					</MkKeyValue> | 					</MkKeyValue> | ||||||
| 					--> | 					--> | ||||||
| 					<MkKeyValue oneline style="margin: 1em 0;"> | 					<MkKeyValue oneline> | ||||||
| 						<template #key>{{ i18n.ts.createdAt }}</template> | 						<template #key>{{ i18n.ts.createdAt }}</template> | ||||||
| 						<template #value><span class="_monospace"><MkTime :time="user.createdAt" :mode="'detail'"/></span></template> | 						<template #value><span class="_monospace"><MkTime :time="user.createdAt" :mode="'detail'"/></span></template> | ||||||
| 					</MkKeyValue> | 					</MkKeyValue> | ||||||
| 					<MkKeyValue v-if="info" oneline style="margin: 1em 0;"> | 					<MkKeyValue v-if="info" oneline> | ||||||
| 						<template #key>{{ i18n.ts.lastActiveDate }}</template> | 						<template #key>{{ i18n.ts.lastActiveDate }}</template> | ||||||
| 						<template #value><span class="_monospace"><MkTime :time="info.lastActiveDate" :mode="'detail'"/></span></template> | 						<template #value><span class="_monospace"><MkTime :time="info.lastActiveDate" :mode="'detail'"/></span></template> | ||||||
| 					</MkKeyValue> | 					</MkKeyValue> | ||||||
| 					<MkKeyValue v-if="info" oneline style="margin: 1em 0;"> | 					<MkKeyValue v-if="info" oneline> | ||||||
| 						<template #key>{{ i18n.ts.email }}</template> | 						<template #key>{{ i18n.ts.email }}</template> | ||||||
| 						<template #value><span class="_monospace">{{ info.email }}</span></template> | 						<template #value><span class="_monospace">{{ info.email }}</span></template> | ||||||
| 					</MkKeyValue> | 					</MkKeyValue> | ||||||
|  | @ -55,48 +55,50 @@ | ||||||
| 				<FormSection> | 				<FormSection> | ||||||
| 					<template #label>ActivityPub</template> | 					<template #label>ActivityPub</template> | ||||||
| 
 | 
 | ||||||
| 					<div class="_formBlock"> | 					<div class="_autoGap"> | ||||||
| 						<MkKeyValue v-if="user.host" oneline style="margin: 1em 0;"> | 						<div style="display: flex; flex-direction: column; gap: 1em;"> | ||||||
|  | 							<MkKeyValue v-if="user.host" oneline> | ||||||
| 								<template #key>{{ i18n.ts.instanceInfo }}</template> | 								<template #key>{{ i18n.ts.instanceInfo }}</template> | ||||||
| 								<template #value><MkA :to="`/instance-info/${user.host}`" class="_link">{{ user.host }} <i class="ti ti-chevron-right"></i></MkA></template> | 								<template #value><MkA :to="`/instance-info/${user.host}`" class="_link">{{ user.host }} <i class="ti ti-chevron-right"></i></MkA></template> | ||||||
| 							</MkKeyValue> | 							</MkKeyValue> | ||||||
| 						<MkKeyValue v-else oneline style="margin: 1em 0;"> | 							<MkKeyValue v-else oneline> | ||||||
| 								<template #key>{{ i18n.ts.instanceInfo }}</template> | 								<template #key>{{ i18n.ts.instanceInfo }}</template> | ||||||
| 								<template #value>(Local user)</template> | 								<template #value>(Local user)</template> | ||||||
| 							</MkKeyValue> | 							</MkKeyValue> | ||||||
| 						<MkKeyValue oneline style="margin: 1em 0;"> | 							<MkKeyValue oneline> | ||||||
| 								<template #key>{{ i18n.ts.updatedAt }}</template> | 								<template #key>{{ i18n.ts.updatedAt }}</template> | ||||||
| 								<template #value><MkTime v-if="user.lastFetchedAt" mode="detail" :time="user.lastFetchedAt"/><span v-else>N/A</span></template> | 								<template #value><MkTime v-if="user.lastFetchedAt" mode="detail" :time="user.lastFetchedAt"/><span v-else>N/A</span></template> | ||||||
| 							</MkKeyValue> | 							</MkKeyValue> | ||||||
| 						<MkKeyValue v-if="ap" oneline style="margin: 1em 0;"> | 							<MkKeyValue v-if="ap" oneline> | ||||||
| 								<template #key>Type</template> | 								<template #key>Type</template> | ||||||
| 								<template #value><span class="_monospace">{{ ap.type }}</span></template> | 								<template #value><span class="_monospace">{{ ap.type }}</span></template> | ||||||
| 							</MkKeyValue> | 							</MkKeyValue> | ||||||
| 						</div> | 						</div> | ||||||
| 
 | 
 | ||||||
| 					<FormButton v-if="user.host != null" class="_formBlock" @click="updateRemoteUser"><i class="ti ti-refresh"></i> {{ i18n.ts.updateRemoteUser }}</FormButton> | 						<FormButton v-if="user.host != null" @click="updateRemoteUser"><i class="ti ti-refresh"></i> {{ i18n.ts.updateRemoteUser }}</FormButton> | ||||||
| 
 | 
 | ||||||
| 					<FormFolder class="_formBlock"> | 						<FormFolder> | ||||||
| 							<template #label>Raw</template> | 							<template #label>Raw</template> | ||||||
| 
 | 
 | ||||||
| 							<MkObjectView v-if="ap" tall :value="ap"> | 							<MkObjectView v-if="ap" tall :value="ap"> | ||||||
| 							</MkObjectView> | 							</MkObjectView> | ||||||
| 						</FormFolder> | 						</FormFolder> | ||||||
|  | 					</div> | ||||||
| 				</FormSection> | 				</FormSection> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div v-else-if="tab === 'moderation'" class="_formRoot"> | 			<div v-else-if="tab === 'moderation'" class="_autoGap"> | ||||||
| 				<FormSwitch v-if="user.host == null && $i.isAdmin && (moderator || !user.isAdmin)" v-model="moderator" class="_formBlock" @update:model-value="toggleModerator">{{ i18n.ts.moderator }}</FormSwitch> | 				<FormSwitch v-if="user.host == null && $i.isAdmin && (moderator || !user.isAdmin)" v-model="moderator" @update:model-value="toggleModerator">{{ i18n.ts.moderator }}</FormSwitch> | ||||||
| 				<FormSwitch v-model="silenced" class="_formBlock" @update:model-value="toggleSilence">{{ i18n.ts.silence }}</FormSwitch> | 				<FormSwitch v-model="silenced" @update:model-value="toggleSilence">{{ i18n.ts.silence }}</FormSwitch> | ||||||
| 				<FormSwitch v-model="suspended" class="_formBlock" @update:model-value="toggleSuspend">{{ i18n.ts.suspend }}</FormSwitch> | 				<FormSwitch v-model="suspended" @update:model-value="toggleSuspend">{{ i18n.ts.suspend }}</FormSwitch> | ||||||
| 				{{ i18n.ts.reflectMayTakeTime }} | 				{{ i18n.ts.reflectMayTakeTime }} | ||||||
| 				<div class="_formBlock"> | 				<div> | ||||||
| 					<FormButton v-if="user.host == null && iAmModerator" inline style="margin-right: 8px;" @click="resetPassword"><i class="ti ti-key"></i> {{ i18n.ts.resetPassword }}</FormButton> | 					<FormButton v-if="user.host == null && iAmModerator" inline style="margin-right: 8px;" @click="resetPassword"><i class="ti ti-key"></i> {{ i18n.ts.resetPassword }}</FormButton> | ||||||
| 					<FormButton v-if="$i.isAdmin" inline danger @click="deleteAccount">{{ i18n.ts.deleteAccount }}</FormButton> | 					<FormButton v-if="$i.isAdmin" inline danger @click="deleteAccount">{{ i18n.ts.deleteAccount }}</FormButton> | ||||||
| 				</div> | 				</div> | ||||||
| 				<FormTextarea v-model="moderationNote" manual-save class="_formBlock"> | 				<FormTextarea v-model="moderationNote" manual-save> | ||||||
| 					<template #label>Moderation note</template> | 					<template #label>Moderation note</template> | ||||||
| 				</FormTextarea> | 				</FormTextarea> | ||||||
| 				<FormFolder class="_formBlock"> | 				<FormFolder> | ||||||
| 					<template #label>IP</template> | 					<template #label>IP</template> | ||||||
| 					<MkInfo v-if="!iAmAdmin" warn>{{ i18n.ts.requireAdminForView }}</MkInfo> | 					<MkInfo v-if="!iAmAdmin" warn>{{ i18n.ts.requireAdminForView }}</MkInfo> | ||||||
| 					<MkInfo v-else>The date is the IP address was first acknowledged.</MkInfo> | 					<MkInfo v-else>The date is the IP address was first acknowledged.</MkInfo> | ||||||
|  | @ -107,7 +109,7 @@ | ||||||
| 						</div> | 						</div> | ||||||
| 					</template> | 					</template> | ||||||
| 				</FormFolder> | 				</FormFolder> | ||||||
| 				<FormFolder class="_formBlock"> | 				<FormFolder> | ||||||
| 					<template #label>{{ i18n.ts.files }}</template> | 					<template #label>{{ i18n.ts.files }}</template> | ||||||
| 
 | 
 | ||||||
| 					<MkFileListForAdmin :pagination="filesPagination" view-mode="grid"/> | 					<MkFileListForAdmin :pagination="filesPagination" view-mode="grid"/> | ||||||
|  | @ -124,7 +126,7 @@ | ||||||
| 					</FormInput> | 					</FormInput> | ||||||
| 				</FormSection> | 				</FormSection> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div v-else-if="tab === 'chart'" class="_formRoot"> | 			<div v-else-if="tab === 'chart'" class="_autoGap"> | ||||||
| 				<div class="cmhjzshm"> | 				<div class="cmhjzshm"> | ||||||
| 					<div class="selects"> | 					<div class="selects"> | ||||||
| 						<MkSelect v-model="chartSrc" style="margin: 0 10px 0 0; flex: 1;"> | 						<MkSelect v-model="chartSrc" style="margin: 0 10px 0 0; flex: 1;"> | ||||||
|  | @ -139,7 +141,7 @@ | ||||||
| 					</div> | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div v-else-if="tab === 'raw'" class="_formRoot"> | 			<div v-else-if="tab === 'raw'" class="_autoGap"> | ||||||
| 				<MkObjectView v-if="info && $i.isAdmin" tall :value="info"> | 				<MkObjectView v-if="info && $i.isAdmin" tall :value="info"> | ||||||
| 				</MkObjectView> | 				</MkObjectView> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ | ||||||
| <MkSpacer :content-max="700"> | <MkSpacer :content-max="700"> | ||||||
| 	<div class="pages-user-clips"> | 	<div class="pages-user-clips"> | ||||||
| 		<MkPagination v-slot="{items}" ref="list" :pagination="pagination" class="list"> | 		<MkPagination v-slot="{items}" ref="list" :pagination="pagination" class="list"> | ||||||
| 			<MkA v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _gap"> | 			<MkA v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _margin"> | ||||||
| 				<b>{{ item.name }}</b> | 				<b>{{ item.name }}</b> | ||||||
| 				<div v-if="item.description" class="description">{{ item.description }}</div> | 				<div v-if="item.description" class="description">{{ item.description }}</div> | ||||||
| 			</MkA> | 			</MkA> | ||||||
|  |  | ||||||
|  | @ -86,7 +86,7 @@ | ||||||
| 			</div> | 			</div> | ||||||
| 
 | 
 | ||||||
| 			<div class="contents"> | 			<div class="contents"> | ||||||
| 				<div v-if="user.pinnedNotes.length > 0" class="_gap"> | 				<div v-if="user.pinnedNotes.length > 0" class="_margin"> | ||||||
| 					<XNote v-for="note in user.pinnedNotes" :key="note.id" class="note _block" :note="note" :pinned="true"/> | 					<XNote v-for="note in user.pinnedNotes" :key="note.id" class="note _block" :note="note" :pinned="true"/> | ||||||
| 				</div> | 				</div> | ||||||
| 				<MkInfo v-else-if="$i && $i.id === user.id">{{ i18n.ts.userPagePinTip }}</MkInfo> | 				<MkInfo v-else-if="$i && $i.id === user.id">{{ i18n.ts.userPagePinTip }}</MkInfo> | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| <template> | <template> | ||||||
| <MkSpacer :content-max="700"> | <MkSpacer :content-max="700"> | ||||||
| 	<MkPagination v-slot="{items}" ref="list" :pagination="pagination"> | 	<MkPagination v-slot="{items}" ref="list" :pagination="pagination"> | ||||||
| 		<MkPagePreview v-for="page in items" :key="page.id" :page="page" class="_gap"/> | 		<MkPagePreview v-for="page in items" :key="page.id" :page="page" class="_margin"/> | ||||||
| 	</MkPagination> | 	</MkPagination> | ||||||
| </MkSpacer> | </MkSpacer> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| <template> | <template> | ||||||
| <MkSpacer :content-max="700"> | <MkSpacer :content-max="700"> | ||||||
| 	<MkPagination v-slot="{items}" ref="list" :pagination="pagination"> | 	<MkPagination v-slot="{items}" ref="list" :pagination="pagination"> | ||||||
| 		<div v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _gap afdcfbfb"> | 		<div v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _margin afdcfbfb"> | ||||||
| 			<div class="header"> | 			<div class="header"> | ||||||
| 				<MkAvatar class="avatar" :user="user"/> | 				<MkAvatar class="avatar" :user="user"/> | ||||||
| 				<MkReactionIcon class="reaction" :reaction="item.type" :no-style="true"/> | 				<MkReactionIcon class="reaction" :reaction="item.type" :no-style="true"/> | ||||||
|  |  | ||||||
|  | @ -1,18 +1,18 @@ | ||||||
| <template> | <template> | ||||||
| <form class="mk-setup" @submit.prevent="submit()"> | <form class="mk-setup" @submit.prevent="submit()"> | ||||||
| 	<h1>Welcome to Misskey!</h1> | 	<h1>Welcome to Misskey!</h1> | ||||||
| 	<div class="_formRoot"> | 	<div class="_autoGap"> | ||||||
| 		<p>{{ $ts.intro }}</p> | 		<p>{{ $ts.intro }}</p> | ||||||
| 		<MkInput v-model="username" pattern="^[a-zA-Z0-9_]{1,20}$" :spellcheck="false" required data-cy-admin-username class="_formBlock"> | 		<MkInput v-model="username" pattern="^[a-zA-Z0-9_]{1,20}$" :spellcheck="false" required data-cy-admin-username> | ||||||
| 			<template #label>{{ $ts.username }}</template> | 			<template #label>{{ $ts.username }}</template> | ||||||
| 			<template #prefix>@</template> | 			<template #prefix>@</template> | ||||||
| 			<template #suffix>@{{ host }}</template> | 			<template #suffix>@{{ host }}</template> | ||||||
| 		</MkInput> | 		</MkInput> | ||||||
| 		<MkInput v-model="password" type="password" data-cy-admin-password class="_formBlock"> | 		<MkInput v-model="password" type="password" data-cy-admin-password> | ||||||
| 			<template #label>{{ $ts.password }}</template> | 			<template #label>{{ $ts.password }}</template> | ||||||
| 			<template #prefix><i class="ti ti-lock"></i></template> | 			<template #prefix><i class="ti ti-lock"></i></template> | ||||||
| 		</MkInput> | 		</MkInput> | ||||||
| 		<div class="bottom _formBlock"> | 		<div class="bottom"> | ||||||
| 			<MkButton gradate type="submit" :disabled="submitting" data-cy-admin-ok> | 			<MkButton gradate type="submit" :disabled="submitting" data-cy-admin-ok> | ||||||
| 				{{ submitting ? $ts.processing : $ts.done }}<MkEllipsis v-if="submitting"/> | 				{{ submitting ? $ts.processing : $ts.done }}<MkEllipsis v-if="submitting"/> | ||||||
| 			</MkButton> | 			</MkButton> | ||||||
|  |  | ||||||
|  | @ -252,6 +252,7 @@ hr { | ||||||
| 	overflow: clip; | 	overflow: clip; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // TODO: 廃止 | ||||||
| ._block { | ._block { | ||||||
| 	@extend ._panel; | 	@extend ._panel; | ||||||
| 
 | 
 | ||||||
|  | @ -260,10 +261,22 @@ hr { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ._gap { | ._margin { | ||||||
| 	margin: var(--margin) 0; | 	margin: var(--margin) 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | ._autoGap { | ||||||
|  | 	display: flex; | ||||||
|  | 	flex-direction: column; | ||||||
|  | 	gap: 1.5em; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ._autoGap_half { | ||||||
|  | 	display: flex; | ||||||
|  | 	flex-direction: column; | ||||||
|  | 	gap: 0.75em; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // TODO: 廃止 | // TODO: 廃止 | ||||||
| ._card { | ._card { | ||||||
| 	@extend ._panel; | 	@extend ._panel; | ||||||
|  | @ -370,20 +383,6 @@ hr { | ||||||
| 	backdrop-filter: var(--blur, blur(15px)); | 	backdrop-filter: var(--blur, blur(15px)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ._formBlock { |  | ||||||
| 	margin: 1.5em 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ._formRoot { |  | ||||||
| 	> ._formBlock:first-child { |  | ||||||
| 		margin-top: 0; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	> ._formBlock:last-child { |  | ||||||
| 		margin-bottom: 0; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ._formLinksGrid { | ._formLinksGrid { | ||||||
| 	display: grid; | 	display: grid; | ||||||
| 	grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); | 	grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue