diff --git a/DysonNetwork.Sphere/Client/package.json b/DysonNetwork.Sphere/Client/package.json
index 0d8e4be..4f38d7d 100644
--- a/DysonNetwork.Sphere/Client/package.json
+++ b/DysonNetwork.Sphere/Client/package.json
@@ -18,6 +18,9 @@
"@fingerprintjs/fingerprintjs": "^4.6.2",
"@fontsource-variable/nunito": "^5.2.6",
"@hcaptcha/vue3-hcaptcha": "^1.3.0",
+ "@milkdown/crepe": "^7.15.2",
+ "@milkdown/kit": "^7.15.2",
+ "@milkdown/vue": "^7.15.2",
"@tailwindcss/typography": "^0.5.16",
"@tailwindcss/vite": "^4.1.11",
"@vueuse/core": "^13.5.0",
diff --git a/DysonNetwork.Sphere/Client/src/components/AttachmentItem.vue b/DysonNetwork.Sphere/Client/src/components/AttachmentItem.vue
index b0e6ced..cd70071 100644
--- a/DysonNetwork.Sphere/Client/src/components/AttachmentItem.vue
+++ b/DysonNetwork.Sphere/Client/src/components/AttachmentItem.vue
@@ -14,5 +14,5 @@ const props = defineProps<{ item: any }>()
const itemType = computed(() => props.item.mime_type.split('/')[0] ?? 'unknown')
-const remoteSource = computed(() => `/cgi/drive/files/${props.item.id}`)
+const remoteSource = computed(() => `/cgi/drive/files/${props.item.id}?original=true`)
diff --git a/DysonNetwork.Sphere/Client/src/components/PostEditor.vue b/DysonNetwork.Sphere/Client/src/components/PostEditor.vue
new file mode 100644
index 0000000..d1da17d
--- /dev/null
+++ b/DysonNetwork.Sphere/Client/src/components/PostEditor.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
diff --git a/DysonNetwork.Sphere/Client/src/components/PostEditorPro.vue b/DysonNetwork.Sphere/Client/src/components/PostEditorPro.vue
new file mode 100644
index 0000000..070345b
--- /dev/null
+++ b/DysonNetwork.Sphere/Client/src/components/PostEditorPro.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/DysonNetwork.Sphere/Client/src/components/PubSelect.vue b/DysonNetwork.Sphere/Client/src/components/PubSelect.vue
new file mode 100644
index 0000000..30eed4b
--- /dev/null
+++ b/DysonNetwork.Sphere/Client/src/components/PubSelect.vue
@@ -0,0 +1,97 @@
+
+ emits('update:value', v)"
+ />
+
+
+
diff --git a/DysonNetwork.Sphere/Client/src/root.vue b/DysonNetwork.Sphere/Client/src/root.vue
index f838752..0520d7d 100644
--- a/DysonNetwork.Sphere/Client/src/root.vue
+++ b/DysonNetwork.Sphere/Client/src/root.vue
@@ -15,6 +15,8 @@ import { usePreferredDark } from '@vueuse/core'
import { useUserStore } from './stores/user'
import { onMounted } from 'vue'
import { useServicesStore } from './stores/services'
+import { MilkdownProvider } from '@milkdown/vue'
+import { usePubStore } from './stores/pub'
const themeOverrides = {
common: {
@@ -30,26 +32,30 @@ const isDark = usePreferredDark()
const userStore = useUserStore()
const servicesStore = useServicesStore()
+const pubStore = usePubStore()
onMounted(() => {
userStore.initialize()
userStore.fetchUser()
servicesStore.fetchServices()
+ pubStore.fetchPublishers()
})
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DysonNetwork.Sphere/Client/src/stores/pub.ts b/DysonNetwork.Sphere/Client/src/stores/pub.ts
new file mode 100644
index 0000000..62617af
--- /dev/null
+++ b/DysonNetwork.Sphere/Client/src/stores/pub.ts
@@ -0,0 +1,13 @@
+import { defineStore } from 'pinia'
+import { ref } from 'vue'
+
+export const usePubStore = defineStore('pub', () => {
+ const publishers = ref([])
+
+ async function fetchPublishers() {
+ const resp = await fetch('/api/publishers')
+ publishers.value = await resp.json()
+ }
+
+ return { publishers, fetchPublishers }
+})
diff --git a/DysonNetwork.Sphere/Client/src/views/index.vue b/DysonNetwork.Sphere/Client/src/views/index.vue
index 8e57671..cea94b9 100644
--- a/DysonNetwork.Sphere/Client/src/views/index.vue
+++ b/DysonNetwork.Sphere/Client/src/views/index.vue
@@ -9,7 +9,7 @@
-
+
Welcome to the Solar Network
The open social network. Friendly to everyone.
@@ -22,16 +22,27 @@
+
+
+
+
+ The flutter based web app Solian has been moved to
+ web.solian.app
+
+ 网页版 Solian 已经被移动到
+ web.solian.app
+