diff --git a/packages/frontend/src/components/MkNoteSub.vue b/packages/frontend/src/components/MkNoteSub.vue
index 822b4de83..3e33c7aa6 100644
--- a/packages/frontend/src/components/MkNoteSub.vue
+++ b/packages/frontend/src/components/MkNoteSub.vue
@@ -5,12 +5,11 @@ SPDX-License-Identifier: AGPL-3.0-only
-
-
+
@@ -107,7 +106,6 @@ import { getNoteMenu } from '@/scripts/get-note-menu.js';
import { useNoteCapture } from '@/scripts/use-note-capture.js';
const canRenote = computed(() => ['public', 'home'].includes(props.note.visibility) || props.note.userId === $i.id);
-const hideLine = computed(() => { return props.detail ? true : false; });
const props = withDefaults(defineProps<{
note: Misskey.entities.Note;
@@ -363,7 +361,7 @@ if (props.detail) {
diff --git a/packages/frontend/src/components/SkNote.vue b/packages/frontend/src/components/SkNote.vue
new file mode 100644
index 000000000..924437def
--- /dev/null
+++ b/packages/frontend/src/components/SkNote.vue
@@ -0,0 +1,1201 @@
+
+
+
+
+
+
{{ i18n.ts.pinnedNote }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
({{ i18n.ts.private }})
+
+
+
+
+ {{ i18n.t('translatedFrom', { x: translation.sourceLang }) }}:
+
+
+
+
{{ i18n.ts._animatedMFM.play }}
+
{{ i18n.ts._animatedMFM.stop }}
+
+
+
+
+
+
+
+
+
+
+
{{ appearNote.channel.name }}
+
+
+
+ {{ i18n.ts.more }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/components/SkNoteDetailed.vue b/packages/frontend/src/components/SkNoteDetailed.vue
new file mode 100644
index 000000000..91db2047e
--- /dev/null
+++ b/packages/frontend/src/components/SkNoteDetailed.vue
@@ -0,0 +1,1082 @@
+
+
+
+
+
+ {{ i18n.ts.loadConversation }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
bot
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
({{ i18n.ts.private }})
+
+
RN:
+
+
+
+ {{ i18n.t('translatedFrom', { x: translation.sourceLang }) }}:
+
+
+
+
{{ i18n.ts._animatedMFM.play }}
+
{{ i18n.ts._animatedMFM.stop }}
+
+
+
+
+
+
+
+
{{ appearNote.channel.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ i18n.ts.loadReplies }}
+
+
+
+
+
+
+ {{ i18n.ts.loadReplies }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/components/SkNoteHeader.vue b/packages/frontend/src/components/SkNoteHeader.vue
new file mode 100644
index 000000000..d3ecdf17b
--- /dev/null
+++ b/packages/frontend/src/components/SkNoteHeader.vue
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
bot
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ bot
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/components/SkNoteSimple.vue b/packages/frontend/src/components/SkNoteSimple.vue
new file mode 100644
index 000000000..8ebd24b32
--- /dev/null
+++ b/packages/frontend/src/components/SkNoteSimple.vue
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/components/SkNoteSub.vue b/packages/frontend/src/components/SkNoteSub.vue
new file mode 100644
index 000000000..aab30e54d
--- /dev/null
+++ b/packages/frontend/src/components/SkNoteSub.vue
@@ -0,0 +1,545 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ i18n.ts.continueThread }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/pages/note.vue b/packages/frontend/src/pages/note.vue
index c43b5f900..9bafa1700 100644
--- a/packages/frontend/src/pages/note.vue
+++ b/packages/frontend/src/pages/note.vue
@@ -16,10 +16,14 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
+
+
+
+
{{ i18n.ts.clip }}
@@ -48,6 +52,7 @@ import { computed, watch } from 'vue';
import * as Misskey from 'misskey-js';
import MkNoteDetailed from '@/components/MkNoteDetailed.vue';
import MkNotes from '@/components/MkNotes.vue';
+import SkNoteDetailed from '@/components/SkNoteDetailed.vue';
import MkRemoteCaution from '@/components/MkRemoteCaution.vue';
import MkButton from '@/components/MkButton.vue';
import * as os from '@/os.js';
diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue
index c55728dc7..51be3b21b 100644
--- a/packages/frontend/src/pages/settings/general.vue
+++ b/packages/frontend/src/pages/settings/general.vue
@@ -59,6 +59,11 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+ Note Design
+
+
+
@@ -273,6 +278,7 @@ const keepScreenOn = computed(defaultStore.makeGetterSetter('keepScreenOn'));
const disableStreamingTimeline = computed(defaultStore.makeGetterSetter('disableStreamingTimeline'));
const useGroupedNotifications = computed(defaultStore.makeGetterSetter('useGroupedNotifications'));
const showTickerOnReplies = computed(defaultStore.makeGetterSetter('showTickerOnReplies'));
+const noteDesign = computed(defaultStore.makeGetterSetter('noteDesign'));
watch(lang, () => {
miLocalStorage.setItem('lang', lang.value as string);
diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts
index 9443e8b21..e823e84eb 100644
--- a/packages/frontend/src/store.ts
+++ b/packages/frontend/src/store.ts
@@ -254,6 +254,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device',
default: false,
},
+ noteDesign: {
+ where: 'device',
+ default: 'sharkey' as 'sharkey' | 'misskey',
+ },
enableInfiniteScroll: {
where: 'device',
default: true,