refactor(client): use css modules
This commit is contained in:
		
							parent
							
								
									99bdb11d24
								
							
						
					
					
						commit
						c41879c542
					
				
					 10 changed files with 139 additions and 147 deletions
				
			
		|  | @ -8,7 +8,7 @@ | ||||||
| 	</template> | 	</template> | ||||||
| 
 | 
 | ||||||
| 	<template #default="{ items: notifications }"> | 	<template #default="{ items: notifications }"> | ||||||
| 		<MkDateSeparatedList v-slot="{ item: notification }" class="elsfgstc" :items="notifications" :no-gap="true"> | 		<MkDateSeparatedList v-slot="{ item: notification }" :class="$style.list" :items="notifications" :no-gap="true"> | ||||||
| 			<XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :key="notification.id" :note="notification.note"/> | 			<XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :key="notification.id" :note="notification.note"/> | ||||||
| 			<XNotification v-else :key="notification.id" :notification="notification" :with-time="true" :full="true" class="_panel notification"/> | 			<XNotification v-else :key="notification.id" :notification="notification" :with-time="true" :full="true" class="_panel notification"/> | ||||||
| 		</MkDateSeparatedList> | 		</MkDateSeparatedList> | ||||||
|  | @ -97,8 +97,8 @@ onUnmounted(() => { | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" module> | ||||||
| .elsfgstc { | .list { | ||||||
| 	background: var(--panel); | 	background: var(--panel); | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ | ||||||
| 		</template> | 		</template> | ||||||
| 	</template> | 	</template> | ||||||
| 
 | 
 | ||||||
| 	<div class="yrolvcoq" :style="{ background: pageMetadata?.value?.bg }" style="container-type: inline-size;"> | 	<div :class="$style.root" :style="{ background: pageMetadata?.value?.bg }" style="container-type: inline-size;"> | ||||||
| 		<RouterView :router="router"/> | 		<RouterView :router="router"/> | ||||||
| 	</div> | 	</div> | ||||||
| </MkWindow> | </MkWindow> | ||||||
|  | @ -133,8 +133,8 @@ defineExpose({ | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" module> | ||||||
| .yrolvcoq { | .root { | ||||||
| 	min-height: 100%; | 	min-height: 100%; | ||||||
| 	background: var(--bg); | 	background: var(--bg); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| <template> | <template> | ||||||
| <div :class="$style.root" :style="{ zIndex, top: `${y - 64}px`, left: `${x - 64}px` }"> | <div :class="$style.root" :style="{ zIndex, top: `${y - 64}px`, left: `${x - 64}px` }"> | ||||||
| 	<span class="text" :class="{ up }"> | 	<span :class="[$style.text, { [$style.up]: up }]"> | ||||||
| 		<MkReactionIcon class="icon" :reaction="reaction"/> | 		<MkReactionIcon class="icon" :reaction="reaction"/> | ||||||
| 	</span> | 	</span> | ||||||
| </div> | </div> | ||||||
|  | @ -43,30 +43,28 @@ onMounted(() => { | ||||||
| 	position: fixed; | 	position: fixed; | ||||||
| 	width: 128px; | 	width: 128px; | ||||||
| 	height: 128px; | 	height: 128px; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| 	&:global { | .text { | ||||||
| 		> .text { | 	display: block; | ||||||
| 			display: block; | 	height: 1em; | ||||||
| 			height: 1em; | 	text-align: center; | ||||||
| 			text-align: center; | 	position: absolute; | ||||||
| 			position: absolute; | 	top: 0; | ||||||
| 			top: 0; | 	left: 0; | ||||||
| 			left: 0; | 	right: 0; | ||||||
| 			right: 0; | 	bottom: 0; | ||||||
| 			bottom: 0; | 	margin: auto; | ||||||
| 			margin: auto; | 	color: var(--accent); | ||||||
| 			color: var(--accent); | 	font-size: 18px; | ||||||
| 			font-size: 18px; | 	font-weight: bold; | ||||||
| 			font-weight: bold; | 	transform: translateY(-30px); | ||||||
| 			transform: translateY(-30px); | 	transition: transform 1s cubic-bezier(0,.5,0,1), opacity 1s cubic-bezier(.5,0,1,.5); | ||||||
| 			transition: transform 1s cubic-bezier(0,.5,0,1), opacity 1s cubic-bezier(.5,0,1,.5); | 	will-change: opacity, transform; | ||||||
| 			will-change: opacity, transform; |  | ||||||
| 
 | 
 | ||||||
| 			&.up { | 	&.up { | ||||||
| 				opacity: 0; | 		opacity: 0; | ||||||
| 				transform: translateY(-50px) rotateZ(v-bind(angle)); | 		transform: translateY(-50px) rotateZ(v-bind(angle)); | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
|  | @ -1,8 +1,8 @@ | ||||||
| <template> | <template> | ||||||
| <MkTooltip ref="tooltip" :showing="showing" :target-element="targetElement" :max-width="340" @closed="emit('closed')"> | <MkTooltip ref="tooltip" :showing="showing" :target-element="targetElement" :max-width="340" @closed="emit('closed')"> | ||||||
| 	<div class="beeadbfb"> | 	<div :class="$style.root"> | ||||||
| 		<MkReactionIcon :reaction="reaction" class="icon" :no-style="true"/> | 		<MkReactionIcon :reaction="reaction" :class="$style.icon" :no-style="true"/> | ||||||
| 		<div class="name">{{ reaction.replace('@.', '') }}</div> | 		<div :class="$style.name">{{ reaction.replace('@.', '') }}</div> | ||||||
| 	</div> | 	</div> | ||||||
| </MkTooltip> | </MkTooltip> | ||||||
| </template> | </template> | ||||||
|  | @ -23,20 +23,20 @@ const emit = defineEmits<{ | ||||||
| }>(); | }>(); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" module> | ||||||
| .beeadbfb { | .root { | ||||||
| 	text-align: center; | 	text-align: center; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| 	> .icon { | .icon { | ||||||
| 		display: block; | 	display: block; | ||||||
| 		width: 60px; | 	width: 60px; | ||||||
| 		font-size: 60px; // unicodeな絵文字についてはwidthが効かないため | 	font-size: 60px; // unicodeな絵文字についてはwidthが効かないため | ||||||
| 		margin: 0 auto; | 	margin: 0 auto; | ||||||
| 		object-fit: contain; | 	object-fit: contain; | ||||||
| 	} | } | ||||||
| 
 | 
 | ||||||
| 	> .name { | .name { | ||||||
| 		font-size: 0.9em; | 	font-size: 0.9em; | ||||||
| 	} |  | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
|  | @ -1,16 +1,16 @@ | ||||||
| <template> | <template> | ||||||
| <MkTooltip ref="tooltip" :showing="showing" :target-element="targetElement" :max-width="340" @closed="emit('closed')"> | <MkTooltip ref="tooltip" :showing="showing" :target-element="targetElement" :max-width="340" @closed="emit('closed')"> | ||||||
| 	<div class="bqxuuuey"> | 	<div :class="$style.root"> | ||||||
| 		<div class="reaction"> | 		<div :class="$style.reaction"> | ||||||
| 			<MkReactionIcon :reaction="reaction" class="icon" :no-style="true"/> | 			<MkReactionIcon :reaction="reaction" :class="$style.reactionIcon" :no-style="true"/> | ||||||
| 			<div class="name">{{ getReactionName(reaction) }}</div> | 			<div :class="$style.reactionName">{{ getReactionName(reaction) }}</div> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div class="users"> | 		<div :class="$style.users"> | ||||||
| 			<div v-for="u in users" :key="u.id" class="user"> | 			<div v-for="u in users" :key="u.id" :class="$style.user"> | ||||||
| 				<MkAvatar class="avatar" :user="u"/> | 				<MkAvatar :class="$style.avatar" :user="u"/> | ||||||
| 				<MkUserName class="name" :user="u" :nowrap="true"/> | 				<MkUserName :user="u" :nowrap="true"/> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div v-if="users.length > 10" class="omitted">+{{ count - 10 }}</div> | 			<div v-if="users.length > 10">+{{ count - 10 }}</div> | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
| </MkTooltip> | </MkTooltip> | ||||||
|  | @ -43,53 +43,53 @@ function getReactionName(reaction: string): string { | ||||||
| } | } | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" module> | ||||||
| .bqxuuuey { | .root { | ||||||
| 	display: flex; | 	display: flex; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| 	> .reaction { | .reaction { | ||||||
| 		max-width: 100px; | 	max-width: 100px; | ||||||
| 		text-align: center; | 	text-align: center; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| 		> .icon { | .reactionIcon { | ||||||
| 			display: block; | 	display: block; | ||||||
| 			width: 60px; | 	width: 60px; | ||||||
| 			font-size: 60px; // unicodeな絵文字についてはwidthが効かないため | 	font-size: 60px; // unicodeな絵文字についてはwidthが効かないため | ||||||
| 			object-fit: contain; | 	object-fit: contain; | ||||||
| 			margin: 0 auto; | 	margin: 0 auto; | ||||||
| 		} | } | ||||||
| 
 | 
 | ||||||
| 		> .name { | .reactionName { | ||||||
| 			font-size: 1em; | 	font-size: 1em; | ||||||
| 		} | } | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	> .users { | .users { | ||||||
| 		flex: 1; | 	flex: 1; | ||||||
| 		min-width: 0; | 	min-width: 0; | ||||||
| 		font-size: 0.95em; | 	font-size: 0.95em; | ||||||
| 		border-left: solid 0.5px var(--divider); | 	border-left: solid 0.5px var(--divider); | ||||||
| 		padding-left: 10px; | 	padding-left: 10px; | ||||||
| 		margin-left: 10px; | 	margin-left: 10px; | ||||||
| 		margin-right: 14px; | 	margin-right: 14px; | ||||||
| 		text-align: left; | 	text-align: left; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| 		> .user { | .user { | ||||||
| 			line-height: 24px; | 	line-height: 24px; | ||||||
| 			white-space: nowrap; | 	white-space: nowrap; | ||||||
| 			overflow: hidden; | 	overflow: hidden; | ||||||
| 			text-overflow: ellipsis; | 	text-overflow: ellipsis; | ||||||
| 
 | 
 | ||||||
| 			&:not(:last-child) { | 	&:not(:last-child) { | ||||||
| 				margin-bottom: 3px; | 		margin-bottom: 3px; | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			> .avatar { |  | ||||||
| 				width: 24px; |  | ||||||
| 				height: 24px; |  | ||||||
| 				margin-right: 3px; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | .avatar { | ||||||
|  | 	width: 24px; | ||||||
|  | 	height: 24px; | ||||||
|  | 	margin-right: 3px; | ||||||
|  | } | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
|  | @ -2,12 +2,12 @@ | ||||||
| <button | <button | ||||||
| 	ref="buttonEl" | 	ref="buttonEl" | ||||||
| 	v-ripple="canToggle" | 	v-ripple="canToggle" | ||||||
| 	class="hkzvhatu _button" | 	class="_button" | ||||||
| 	:class="{ reacted: note.myReaction == reaction, canToggle }" | 	:class="[$style.root, { [$style.reacted]: note.myReaction == reaction, [$style.canToggle]: canToggle }]" | ||||||
| 	@click="toggleReaction()" | 	@click="toggleReaction()" | ||||||
| > | > | ||||||
| 	<MkReactionIcon class="icon" :reaction="reaction"/> | 	<MkReactionIcon :class="$style.icon" :reaction="reaction"/> | ||||||
| 	<span class="count">{{ count }}</span> | 	<span :class="$style.count">{{ count }}</span> | ||||||
| </button> | </button> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  | @ -92,8 +92,8 @@ useTooltip(buttonEl, async (showing) => { | ||||||
| }, 100); | }, 100); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" module> | ||||||
| .hkzvhatu { | .root { | ||||||
| 	display: inline-block; | 	display: inline-block; | ||||||
| 	height: 32px; | 	height: 32px; | ||||||
| 	margin: 2px; | 	margin: 2px; | ||||||
|  | @ -127,11 +127,11 @@ useTooltip(buttonEl, async (showing) => { | ||||||
| 			filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.5)); | 			filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.5)); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| 	> .count { | .count { | ||||||
| 		font-size: 0.9em; | 	font-size: 0.9em; | ||||||
| 		line-height: 32px; | 	line-height: 32px; | ||||||
| 		margin: 0 0 0 4px; | 	margin: 0 0 0 4px; | ||||||
| 	} |  | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,12 @@ | ||||||
| <template> | <template> | ||||||
| <TransitionGroup :name="$store.state.animation ? 'x' : ''" tag="div" class="tdflqwzn" :class="{ isMe }"> | <TransitionGroup | ||||||
|  | 	:enter-active-class="$store.state.animation ? $style.transition_x_enterActive : ''" | ||||||
|  | 	:leave-active-class="$store.state.animation ? $style.transition_x_leaveActive : ''" | ||||||
|  | 	:enter-from-class="$store.state.animation ? $style.transition_x_enterFrom : ''" | ||||||
|  | 	:leave-to-class="$store.state.animation ? $style.transition_x_leaveTo : ''" | ||||||
|  | 	:move-class="$store.state.animation ? $style.transition_x_move : ''" | ||||||
|  | 	tag="div" :class="$style.root" | ||||||
|  | > | ||||||
| 	<XReaction v-for="(count, reaction) in note.reactions" :key="reaction" :reaction="reaction" :count="count" :is-initial="initialReactions.has(reaction)" :note="note"/> | 	<XReaction v-for="(count, reaction) in note.reactions" :key="reaction" :reaction="reaction" :count="count" :is-initial="initialReactions.has(reaction)" :note="note"/> | ||||||
| </TransitionGroup> | </TransitionGroup> | ||||||
| </template> | </template> | ||||||
|  | @ -19,29 +26,26 @@ const initialReactions = new Set(Object.keys(props.note.reactions)); | ||||||
| const isMe = computed(() => $i && $i.id === props.note.userId); | const isMe = computed(() => $i && $i.id === props.note.userId); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" module> | ||||||
| .x-move, .x-enter-active, .x-leave-active { | .transition_x_move, | ||||||
|  | .transition_x_enterActive, | ||||||
|  | .transition_x_leaveActive { | ||||||
| 	transition: opacity 0.2s cubic-bezier(0,.5,.5,1), transform 0.2s cubic-bezier(0,.5,.5,1) !important; | 	transition: opacity 0.2s cubic-bezier(0,.5,.5,1), transform 0.2s cubic-bezier(0,.5,.5,1) !important; | ||||||
| } | } | ||||||
| .x-enter-from, .x-leave-to { | .transition_x_enterFrom, | ||||||
|  | .transition_x_leaveTo { | ||||||
| 	opacity: 0; | 	opacity: 0; | ||||||
| 	transform: scale(0.7); | 	transform: scale(0.7); | ||||||
| } | } | ||||||
| .x-leave-active { | .transition_x_leaveActive { | ||||||
|   position: absolute; | 	position: absolute; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .tdflqwzn { | .root { | ||||||
| 	margin: 4px -2px 0 -2px; | 	margin: 4px -2px 0 -2px; | ||||||
| 
 | 
 | ||||||
| 	&:empty { | 	&:empty { | ||||||
| 		display: none; | 		display: none; | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	&.isMe { |  | ||||||
| 		> span { |  | ||||||
| 			cursor: default !important; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div class="jmgmzlwq"><i class="ti ti-alert-triangle" style="margin-right: 8px;"></i>{{ i18n.ts.remoteUserCaution }}<a class="link" :href="href" rel="nofollow noopener" target="_blank">{{ i18n.ts.showOnRemote }}</a></div> | <div :class="$style.root"><i class="ti ti-alert-triangle" style="margin-right: 8px;"></i>{{ i18n.ts.remoteUserCaution }}<a :class="$style.link" :href="href" rel="nofollow noopener" target="_blank">{{ i18n.ts.showOnRemote }}</a></div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <script lang="ts" setup> | <script lang="ts" setup> | ||||||
|  | @ -10,18 +10,18 @@ defineProps<{ | ||||||
| }>(); | }>(); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" module> | ||||||
| .jmgmzlwq { | .root { | ||||||
| 	font-size: 0.8em; | 	font-size: 0.8em; | ||||||
| 	padding: 16px; | 	padding: 16px; | ||||||
| 	background: var(--infoWarnBg); | 	background: var(--infoWarnBg); | ||||||
| 	color: var(--infoWarnFg); | 	color: var(--infoWarnFg); | ||||||
| 	border-radius: var(--radius); | 	border-radius: var(--radius); | ||||||
| 	overflow: clip; | 	overflow: clip; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| 	> .link { | .link { | ||||||
| 		margin-left: 4px; | 	margin-left: 4px; | ||||||
| 		color: var(--accent); | 	color: var(--accent); | ||||||
| 	} |  | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| <template> | <template> | ||||||
| <span class="mk-sparkle"> | <span :class="$style.root"> | ||||||
| 	<span ref="el"> | 	<span ref="el" style="display: inline-block;"> | ||||||
| 		<slot></slot> | 		<slot></slot> | ||||||
| 	</span> | 	</span> | ||||||
| 	<!-- なぜか path に対する key が機能しないため | 	<!-- なぜか path に対する key が機能しないため | ||||||
|  | @ -32,7 +32,7 @@ | ||||||
| 		</path> | 		</path> | ||||||
| 	</svg> | 	</svg> | ||||||
| 	--> | 	--> | ||||||
| 	<svg v-for="particle in particles" :key="particle.id" :width="width" :height="height" :viewBox="`0 0 ${width} ${height}`" xmlns="http://www.w3.org/2000/svg"> | 	<svg v-for="particle in particles" :key="particle.id" :width="width" :height="height" :viewBox="`0 0 ${width} ${height}`" xmlns="http://www.w3.org/2000/svg" style="position: absolute; top: -32px; left: -32px;"> | ||||||
| 		<path | 		<path | ||||||
| 			style="transform-origin: center; transform-box: fill-box;" | 			style="transform-origin: center; transform-box: fill-box;" | ||||||
| 			:transform="`translate(${particle.x} ${particle.y})`" | 			:transform="`translate(${particle.x} ${particle.y})`" | ||||||
|  | @ -111,20 +111,10 @@ onUnmounted(() => { | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" module> | ||||||
| .mk-sparkle { | .root { | ||||||
| 	position: relative; | 	position: relative; | ||||||
| 	display: inline-block; | 	display: inline-block; | ||||||
| 
 | 	pointer-events: none; | ||||||
| 	> span { |  | ||||||
| 		display: inline-block; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	> svg { |  | ||||||
| 		position: absolute; |  | ||||||
| 		top: -32px; |  | ||||||
| 		left: -32px; |  | ||||||
| 		pointer-events: none; |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <template> | <template> | ||||||
| <div v-tooltip="text" class="fzgwjkgc" :class="user.onlineStatus"></div> | <div v-tooltip="text" :class="[$style.root, $style['status_' + user.onlineStatus]]"></div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <script lang="ts" setup> | <script lang="ts" setup> | ||||||
|  | @ -21,24 +21,24 @@ const text = $computed(() => { | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" module> | ||||||
| .fzgwjkgc { | .root { | ||||||
| 	box-shadow: 0 0 0 3px var(--panel); | 	box-shadow: 0 0 0 3px var(--panel); | ||||||
| 	border-radius: 120%; // Blinkのバグか知らんけど、100%ぴったりにすると何故か若干楕円でレンダリングされる | 	border-radius: 120%; // Blinkのバグか知らんけど、100%ぴったりにすると何故か若干楕円でレンダリングされる | ||||||
| 
 | 
 | ||||||
| 	&.online { | 	&.status_online { | ||||||
| 		background: #58d4c9; | 		background: #58d4c9; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	&.active { | 	&.status_active { | ||||||
| 		background: #e4bc48; | 		background: #e4bc48; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	&.offline { | 	&.status_offline { | ||||||
| 		background: #ea5353; | 		background: #ea5353; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	&.unknown { | 	&.status_unknown { | ||||||
| 		background: #888; | 		background: #888; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue