@@ -312,6 +312,7 @@ const hardMuted = ref(props.withHardMute && checkMute(appearNote.value, $i?.hard
const translation = ref(null);
const translating = ref(false);
const showTicker = (defaultStore.state.instanceTicker === 'always') || (defaultStore.state.instanceTicker === 'remote' && appearNote.value.user.instance);
+const showInstanceIcon = ref(defaultStore.state.instanceIcon);
const canRenote = computed(() => ['public', 'home'].includes(appearNote.value.visibility) || (appearNote.value.visibility === 'followers' && appearNote.value.userId === $i?.id));
const renoteCollapsed = ref(
defaultStore.state.collapseRenotes && isRenote && (
diff --git a/packages/frontend/src/components/global/MkAvatar.vue b/packages/frontend/src/components/global/MkAvatar.vue
index de62fe12a9..cd343fdba1 100755
--- a/packages/frontend/src/components/global/MkAvatar.vue
+++ b/packages/frontend/src/components/global/MkAvatar.vue
@@ -35,6 +35,7 @@ SPDX-License-Identifier: AGPL-3.0-only
}"
alt=""
>
+
@@ -49,6 +50,7 @@ import { extractAvgColorFromBlurhash } from '@/scripts/extract-avg-color-from-bl
import { acct, userPage } from '@/filters/user.js';
import MkUserOnlineIndicator from '@/components/MkUserOnlineIndicator.vue';
import { defaultStore } from '@/store.js';
+import MkInstanceIcon from '@/components/MkInstanceIcon.vue';
const animation = ref(defaultStore.state.animation);
const squareAvatars = ref(defaultStore.state.squareAvatars);
@@ -62,6 +64,7 @@ const props = withDefaults(defineProps<{
indicator?: boolean;
decorations?: Omit[];
forceShowDecoration?: boolean;
+ showInstance?: boolean;
}>(), {
target: null,
link: false,
@@ -69,6 +72,7 @@ const props = withDefaults(defineProps<{
indicator: false,
decorations: undefined,
forceShowDecoration: false,
+ showInstance: false,
});
const emit = defineEmits<{
@@ -330,4 +334,43 @@ watch(() => props.user.avatarBlurhash, () => {
width: 200%;
pointer-events: none;
}
+
+.decorationBlink {
+ animation: blink 1s infinite;
+}
+
+@keyframes blink {
+ 0%, 100% {
+ filter: brightness(2);
+ }
+ 50% {
+ filter: brightness(1);
+ }
+}
+
+.instanceicon {
+ height: 25px;
+ z-index: 2;
+ position: absolute;
+ left: 0;
+ bottom: 0;
+}
+
+@container (max-width: 580px) {
+ .instanceicon {
+ height: 21px;
+ }
+}
+
+@container (max-width: 450px) {
+ .instanceicon {
+ height: 19px;
+ }
+}
+
+@container (max-width: 300px) {
+ .instanceicon {
+ height: 17px;
+ }
+}
diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue
index 6fb9b4b336..1dffdb92b6 100755
--- a/packages/frontend/src/pages/settings/general.vue
+++ b/packages/frontend/src/pages/settings/general.vue
@@ -110,10 +110,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
- {{ i18n.ts.instanceIcon }}
- {{ i18n.ts.originalFeature }}
-
+ {{ i18n.ts.instanceIcon }}
{{ i18n.ts.displayOfSensitiveMedia }}
@@ -418,6 +415,7 @@ const showFixedPostFormInChannel = computed(defaultStore.makeGetterSetter('showF
const numberOfPageCache = computed(defaultStore.makeGetterSetter('numberOfPageCache'));
const numberOfReplies = computed(defaultStore.makeGetterSetter('numberOfReplies'));
const instanceTicker = computed(defaultStore.makeGetterSetter('instanceTicker'));
+const instanceIcon = computed(defaultStore.makeGetterSetter('instanceIcon'));
const enableInfiniteScroll = computed(defaultStore.makeGetterSetter('enableInfiniteScroll'));
const useReactionPickerForContextMenu = computed(defaultStore.makeGetterSetter('useReactionPickerForContextMenu'));
const squareAvatars = computed(defaultStore.makeGetterSetter('squareAvatars'));
diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts
index 618cc98421..eb1e96e19c 100755
--- a/packages/frontend/src/store.ts
+++ b/packages/frontend/src/store.ts
@@ -344,6 +344,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device',
default: 'remote' as 'none' | 'remote' | 'always',
},
+ instanceIcon: {
+ where: 'device',
+ default: false,
+ },
emojiPickerScale: {
where: 'device',
default: 1,