summaryrefslogtreecommitdiff
path: root/packages/frontend-embed/src/components/EmInstanceTicker.vue
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend-embed/src/components/EmInstanceTicker.vue')
-rw-r--r--packages/frontend-embed/src/components/EmInstanceTicker.vue87
1 files changed, 87 insertions, 0 deletions
diff --git a/packages/frontend-embed/src/components/EmInstanceTicker.vue b/packages/frontend-embed/src/components/EmInstanceTicker.vue
new file mode 100644
index 0000000000..4a116e317a
--- /dev/null
+++ b/packages/frontend-embed/src/components/EmInstanceTicker.vue
@@ -0,0 +1,87 @@
+<!--
+SPDX-FileCopyrightText: syuilo and misskey-project
+SPDX-License-Identifier: AGPL-3.0-only
+-->
+
+<template>
+<div :class="$style.root" :style="bg">
+ <img v-if="faviconUrl" :class="$style.icon" :src="faviconUrl"/>
+ <div :class="$style.name">{{ instance.name }}</div>
+</div>
+</template>
+
+<script lang="ts" setup>
+import { computed, inject } from 'vue';
+
+import { DI } from '@/di.js';
+
+const serverMetadata = inject(DI.serverMetadata)!;
+const mediaProxy = inject(DI.mediaProxy)!;
+
+const props = defineProps<{
+ instance?: {
+ faviconUrl?: string | null
+ name?: string | null
+ themeColor?: string | null
+ }
+}>();
+
+// if no instance data is given, this is for the local instance
+const instance = props.instance ?? {
+ name: serverMetadata.name,
+ themeColor: (document.querySelector('meta[name="theme-color-orig"]') as HTMLMetaElement)?.content,
+};
+
+const faviconUrl = computed(() => props.instance ? mediaProxy.getProxiedImageUrlNullable(props.instance.faviconUrl, 'preview') : mediaProxy.getProxiedImageUrlNullable(serverMetadata.iconUrl, 'preview') ?? '/favicon.ico');
+
+const themeColor = props.instance?.themeColor ?? serverMetadata.themeColor ?? '#777777';
+
+const bg = {
+ background: `linear-gradient(90deg, ${themeColor}, ${themeColor}00)`,
+};
+</script>
+
+<style lang="scss" module>
+$height: 2ex;
+
+.root {
+ display: flex;
+ align-items: center;
+ height: $height;
+ border-radius: 4px 0 0 4px;
+ overflow: clip;
+ color: #fff;
+ text-shadow: /* .866 ≈ sin(60deg) */
+ 1px 0 1px #000,
+ .866px .5px 1px #000,
+ .5px .866px 1px #000,
+ 0 1px 1px #000,
+ -.5px .866px 1px #000,
+ -.866px .5px 1px #000,
+ -1px 0 1px #000,
+ -.866px -.5px 1px #000,
+ -.5px -.866px 1px #000,
+ 0 -1px 1px #000,
+ .5px -.866px 1px #000,
+ .866px -.5px 1px #000;
+ mask-image: linear-gradient(90deg,
+ rgb(0,0,0),
+ rgb(0,0,0) calc(100% - 16px),
+ rgba(0,0,0,0) 100%
+ );
+}
+
+.icon {
+ height: $height;
+ flex-shrink: 0;
+}
+
+.name {
+ margin-left: 4px;
+ line-height: 1;
+ font-size: 0.9em;
+ font-weight: bold;
+ white-space: nowrap;
+ overflow: visible;
+}
+</style>