Skip to content
Snippets Groups Projects
about-misskey.vue 6.46 KiB
Newer Older
syuilo's avatar
syuilo committed
<div style="overflow: clip;">
syuilo's avatar
syuilo committed
	<MkSpacer :content-max="600" :margin-min="20">
		<div class="_formRoot znqjceqz">
			<div id="debug"></div>
			<div ref="containerEl" v-panel class="_formBlock about" :class="{ playing: easterEggEngine != null }">
syuilo's avatar
syuilo committed
				<img src="/client-assets/about-icon.png" alt="" class="icon" draggable="false" @load="iconLoaded" @click="gravity"/>
syuilo's avatar
syuilo committed
				<div class="misskey">Misskey</div>
				<div class="version">v{{ version }}</div>
syuilo's avatar
syuilo committed
				<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" :custom-emojis="$instance.emojis" :is-reaction="false" :normal="true" :no-style="true"/></span>
syuilo's avatar
syuilo committed
			</div>
syuilo's avatar
syuilo committed
			<div class="_formBlock" 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>
syuilo's avatar
syuilo committed
			</div>
			<div class="_formBlock" style="text-align: center;">
				<MkButton primary rounded inline @click="iLoveMisskey">I <Mfm text="$[jelly ❤]"/> #Misskey</MkButton>
			</div>
syuilo's avatar
syuilo committed
			<FormSection>
				<div class="_formLinks">
					<FormLink to="https://github.com/misskey-dev/misskey" external>
						<template #icon><i class="fas fa-code"></i></template>
						{{ i18n.ts._aboutMisskey.source }}
syuilo's avatar
syuilo committed
						<template #suffix>GitHub</template>
					</FormLink>
					<FormLink to="https://crowdin.com/project/misskey" external>
						<template #icon><i class="fas fa-language"></i></template>
						{{ i18n.ts._aboutMisskey.translation }}
syuilo's avatar
syuilo committed
						<template #suffix>Crowdin</template>
					</FormLink>
					<FormLink to="https://www.patreon.com/syuilo" external>
						<template #icon><i class="fas fa-hand-holding-medical"></i></template>
						{{ i18n.ts._aboutMisskey.donate }}
syuilo's avatar
syuilo committed
						<template #suffix>Patreon</template>
					</FormLink>
				</div>
			</FormSection>
			<FormSection>
				<template #label>{{ i18n.ts._aboutMisskey.contributors }}</template>
syuilo's avatar
syuilo committed
				<div class="_formLinks">
					<FormLink to="https://github.com/syuilo" external>@syuilo</FormLink>
					<FormLink to="https://github.com/AyaMorisawa" external>@AyaMorisawa</FormLink>
					<FormLink to="https://github.com/mei23" external>@mei23</FormLink>
					<FormLink to="https://github.com/acid-chicken" external>@acid-chicken</FormLink>
					<FormLink to="https://github.com/tamaina" external>@tamaina</FormLink>
					<FormLink to="https://github.com/rinsuki" external>@rinsuki</FormLink>
					<FormLink to="https://github.com/Xeltica" external>@Xeltica</FormLink>
					<FormLink to="https://github.com/u1-liquid" external>@u1-liquid</FormLink>
					<FormLink to="https://github.com/marihachi" external>@marihachi</FormLink>
				</div>
				<template #caption><MkLink url="https://github.com/misskey-dev/misskey/graphs/contributors">{{ i18n.ts._aboutMisskey.allContributors }}</MkLink></template>
syuilo's avatar
syuilo committed
			</FormSection>
			<FormSection>
				<template #label><Mfm text="$[jelly ❤]"/> {{ i18n.ts._aboutMisskey.patrons }}</template>
syuilo's avatar
syuilo committed
				<div v-for="patron in patrons" :key="patron">{{ patron }}</div>
				<template #caption>{{ i18n.ts._aboutMisskey.morePatrons }}</template>
syuilo's avatar
syuilo committed
			</FormSection>
		</div>
	</MkSpacer>
syuilo's avatar
syuilo committed
</div>
<script lang="ts" setup>
import { nextTick, onBeforeUnmount } from 'vue';
syuilo's avatar
syuilo committed
import { version } from '@/config';
syuilo's avatar
syuilo committed
import FormLink from '@/components/form/link.vue';
import FormSection from '@/components/form/section.vue';
import MkButton from '@/components/ui/button.vue';
syuilo's avatar
syuilo committed
import MkLink from '@/components/link.vue';
import { physics } from '@/scripts/physics';
import * as symbols from '@/symbols';
import { i18n } from '@/i18n';
import { defaultStore } from '@/store';
import * as os from '@/os';
syuilo's avatar
syuilo committed
const patrons = [
syuilo's avatar
syuilo committed
	'まっちゃとーにゅ',
syuilo's avatar
syuilo committed
	'mametsuko',
syuilo's avatar
syuilo committed
	'noellabo',
syuilo's avatar
syuilo committed
	'AureoleArk',
syuilo's avatar
syuilo committed
	'Gargron',
syuilo's avatar
syuilo committed
	'Nokotaro Takeda',
syuilo's avatar
syuilo committed
	'Suji Yan',
syuilo's avatar
syuilo committed
	'oi_yekssim',
	'regtan',
syuilo's avatar
syuilo committed
	'Hekovic',
syuilo's avatar
syuilo committed
	'nenohi',
syuilo's avatar
syuilo committed
	'Gitmo Life Services',
syuilo's avatar
syuilo committed
	'naga_rus',
	'Efertone',
syuilo's avatar
syuilo committed
	'Melilot',
syuilo's avatar
syuilo committed
	'motcha',
syuilo's avatar
syuilo committed
	'nanami kan',
	'sevvie Rose',
	'Hayato Ishikawa',
	'Puniko',
	'skehmatics',
syuilo's avatar
syuilo committed
	'Quinton Macejkovic',
syuilo's avatar
syuilo committed
	'YUKIMOCHI',
syuilo's avatar
syuilo committed
	'dansup',
syuilo's avatar
syuilo committed
	'mewl hayabusa',
syuilo's avatar
syuilo committed
	'Emilis',
	'Fristi',
syuilo's avatar
syuilo committed
	'makokunsan',
syuilo's avatar
syuilo committed
	'chidori ninokura',
syuilo's avatar
syuilo committed
	'Peter G.',
syuilo's avatar
syuilo committed
	'見当かなみ',
	'natalie',
syuilo's avatar
syuilo committed
	'Maronu',
	'Steffen K9',
syuilo's avatar
syuilo committed
	'takimura',
	'sikyosyounin',
syuilo's avatar
syuilo committed
	'Nesakko',
syuilo's avatar
syuilo committed
	'YuzuRyo61',
syuilo's avatar
syuilo committed
	'blackskye',
syuilo's avatar
syuilo committed
	'sheeta.s',
	'osapon',
syuilo's avatar
syuilo committed
	'public_yusuke',
syuilo's avatar
syuilo committed
	'CG',
syuilo's avatar
syuilo committed
	'吴浥',
	't_w',
	'Jerry',
syuilo's avatar
syuilo committed
	'nafuchoco',
	'Takumi Sugita',
syuilo's avatar
syuilo committed
	'GLaTAN',
	'mkatze',
syuilo's avatar
syuilo committed
	'kabo2468y',
syuilo's avatar
syuilo committed
	'mydarkstar',
syuilo's avatar
syuilo committed
	'Roujo',
syuilo's avatar
syuilo committed
	'DignifiedSilence',
syuilo's avatar
syuilo committed
	'uroco @99',
	'totokoro',
syuilo's avatar
syuilo committed
	'うし',
	'kiritan',
	'weepjp',
	'Liaizon Wakest',
	'Duponin',
	'Blue',
	'Naoki Hirayama',
syuilo's avatar
syuilo committed
	'wara',
syuilo's avatar
syuilo committed
	'Wataru Manji (manji0)',
	'みなしま',
	'kanoy',
	'xianon',
syuilo's avatar
syuilo committed
	'Denshi',
	'Osushimaru',
syuilo's avatar
syuilo committed
	'にょんへら',
	'おのだい',
	'Leni',
	'oss',
	'Weeble',
	'蝉暮せせせ',
Kainoa Kanter's avatar
Kainoa Kanter committed
	'ThatOneCalculator',
let easterEggReady = false;
let easterEggEmojis = $ref([]);
let easterEggEngine = $ref(null);
const containerEl = $ref<HTMLElement>();

function iconLoaded() {
	const emojis = defaultStore.state.reactions;
	const containerWidth = containerEl.offsetWidth;
	for (let i = 0; i < 32; i++) {
		easterEggEmojis.push({
			id: i.toString(),
			top: -(128 + (Math.random() * 256)),
			left: (Math.random() * containerWidth),
			emoji: emojis[Math.floor(Math.random() * emojis.length)],
		});
	}
syuilo's avatar
syuilo committed

	nextTick(() => {
		easterEggReady = true;
	});
}
syuilo's avatar
syuilo committed

function gravity() {
	if (!easterEggReady) return;
	easterEggReady = false;
	easterEggEngine = physics(containerEl);
}
syuilo's avatar
syuilo committed

function iLoveMisskey() {
	os.post({
		initialText: 'I $[jelly ❤] #Misskey',
		instant: true,
onBeforeUnmount(() => {
	if (easterEggEngine) {
		easterEggEngine.stop();
syuilo's avatar
syuilo committed
	}

defineExpose({
	[symbols.PAGE_INFO]: {
		title: i18n.ts.aboutMisskey,
syuilo's avatar
syuilo committed

<style lang="scss" scoped>
.znqjceqz {
syuilo's avatar
syuilo committed
	> .about {
syuilo's avatar
syuilo committed
		position: relative;
		text-align: center;
		padding: 16px;
		border-radius: var(--radius);

		&.playing {
			&, * {
				user-select: none;
syuilo's avatar
syuilo committed
			}

syuilo's avatar
syuilo committed
			* {
				will-change: transform;
syuilo's avatar
syuilo committed
			}

syuilo's avatar
syuilo committed
			> .emoji {
				visibility: visible;
syuilo's avatar
syuilo committed
			}
syuilo's avatar
syuilo committed
		}
syuilo's avatar
syuilo committed

syuilo's avatar
syuilo committed
		> .icon {
			display: block;
			width: 100px;
			margin: 0 auto;
			border-radius: 16px;
		}

		> .misskey {
			margin: 0.75em auto 0 auto;
			width: max-content;
		}

		> .version {
			margin: 0 auto;
			width: max-content;
			opacity: 0.5;
		}

		> .emoji {
			position: absolute;
			top: 0;
			left: 0;
			visibility: hidden;
syuilo's avatar
syuilo committed

			> .emoji {
syuilo's avatar
syuilo committed
				pointer-events: none;
				font-size: 24px;
				width: 24px;
syuilo's avatar
syuilo committed
			}
		}
	}
syuilo's avatar
syuilo committed
}
</style>