mungkin akan melihat hal-hal keren baru lebih cepat
mungkin lebih sering patah
mungkin diperbaiki lebih cepat juga
? Ikuti @phanpy di Mastodon untuk pembaruan ✨
Semuanya dirancang dan direkayasa mengikuti selera dan visi saya. Ini adalah proyek sampingan pribadi bagi saya untuk belajar tentang Mastodon dan bereksperimen dengan ide-ide UI/UX baru.
Fitur
? Banyak akun
? Jendela tulis pop-out/in
? Tema terang/gelap/otomatis
? Notifikasi yang dikelompokkan
? Rangkaian komentar bersarang
? Pemulihan draf yang belum terkirim
? Meningkatkan Korsel™️
⚡ Pintasan™️ dengan mode tampilan seperti multi-kolom atau bilah tab
#️⃣ Garis waktu multi-hashtag
Keputusan desain
Tindakan status (balas, peningkatan, favorit, bookmark, dll) disembunyikan secara default . Mereka hanya muncul di halaman status individual. Hal ini untuk mengurangi kekacauan dan gangguan. Hal ini mungkin mengakibatkan keterlibatan yang lebih rendah, namun kami tidak mengejar angka di sini.
Boost diwakili dengan ikon roket . Ikon panah ganda berwarna hijau (retweet untuk Twitter) tidak cocok untuk istilah "boost". Roket hijau terlihat aneh, jadi saya menggunakan warna ungu.
Nama pengguna pendek ( @username ) ditampilkan di garis waktu, bukan nama pengguna akun lengkap ( @username@instance ) . Meskipun pedoman tersebut menyebutkan bahwa "Desentralisasi harus transparan kepada pengguna", menurut saya kita tidak harus memaksakan hal ini setiap saat. Ada juga beberapa masalah aksesibilitas terkait pembaca layar dengan nama pengguna lengkap, meskipun sayangnya aplikasi web ini belum dapat diakses.
Tidak ada putar otomatis untuk video/GIF/apa pun di timeline . Garis waktu sudah sangat kacau dengan banyak orang, merek, berita, dan media yang mencoba menarik perhatian Anda. Jangan memperburuk keadaan. (Pengecualian saat ini adalah emoji animasi.)
URL berbasis hash . Aplikasi web ini tidak dimaksudkan sebagai pengganti penuh front-end Mastodon yang sudah ada. Tidak ada SEO, database, tanpa server, atau server apa pun yang berjalan lama. Saya bisa saja salah suatu hari nanti.
Implementasi UI yang halus
Tampilan nama pengguna
Di timeline, nama pengguna ditampilkan sebagai [NAME] @[username] .
Untuk @[username] , selalu kecualikan nama domain instance.
Jika [NAME]terlihat sama dengan @[username] , maka @[username] juga dikecualikan.
Meningkatkan Korsel
Dari postingan yang diambil (misalnya 20 postingan per pengambilan), jika jumlah peningkatan lebih dari seperempat total postingan atau lebih dari 3 peningkatan berturut-turut, UI carousel peningkatan akan dipicu.
Jika jumlah peningkatan lebih dari 3 perempat total postingan, UI carousel peningkatan akan ditempatkan di akhir total postingan yang diambil (per "halaman").
Jika tidak, peningkatan carousel UI akan ditempatkan di antara postingan.
Lencana nomor ulir (misalnya, ulir 1/X)
Periksa setiap postingan untuk inReplyToId dari cache atau permintaan API tambahan, hingga postingan root ditemukan.
Jika postingan root ditemukan, badge akan menampilkan nomor indeks postingan di thread.
Batasi hingga 3 permintaan API karena postingan root mungkin sudah sangat lama atau threadnya sangat panjang.
Jika nomor indeks tidak dapat ditemukan, lencana akan kembali menampilkan Thread tanpa nomor.
Isian hastag runtuh
Paragraf pertama konten postingan dengan lebih dari 3 hashtag akan diciutkan hingga maksimal 3 baris.
Paragraf berikutnya setelah paragraf pertama dengan lebih dari 3 hashtag akan diciutkan menjadi 1 baris.
Paragraf yang berdekatan dengan lebih dari 1 hashtag setelah paragraf diciutkan akan diciutkan menjadi 1 baris.
Jika ada teks di sekitar atau di antara hashtag, teks tersebut tidak akan diciutkan.
Hashtag yang diciutkan akan ditambahkan dengan ... di bagian akhir.
Mereka juga sedikit memudar untuk mengurangi kebisingan visual.
Membuka tampilan postingan akan menampilkan hashtag yang tidak diciutkan.
Postingan yang difilter
Postingan yang difilter "Sembunyikan sepenuhnya" akan disembunyikan, tanpa UI untuk mengungkapkannya.
Postingan yang difilter "Sembunyikan dengan peringatan" akan disembunyikan sebagian, menampilkan nama filter dan nama penulis.
Konten dapat diungkapkan sebagian dengan mengarahkan kursor ke postingan, dengan tooltip menampilkan teks postingan.
Mengkliknya akan membuka halaman Posting.
Menekan lama atau mengklik kanan akan "mengintip" postingan dengan UI lembar bawah.
Pada boost carousel, mereka diurutkan hingga akhir carousel.
Perkembangan
Prasyarat: Node.js 18+
npm install - Instal dependensi
npm run dev - Mulai server pengembangan dan messages:extract ( clean + ``tonton`) secara paralel
npm run build - Bangun untuk produksi
npm run preview - Pratinjau build produksi
npm run fetch-instances - Ambil daftar instance dari joinmastodon.org/servers, simpan ke src/data/instances.json
npm run sourcemap - Jalankan source-map-explorer pada build produksi
npm run messages:extract - Ekstrak pesan dari file sumber dan perbarui katalog pesan lokal
Tumpukan teknologi
Vite - Alat pembuat
Prekta - perpustakaan UI
Valtio - Manajemen negara
React Router - Perutean
masto.js - klien API Mastodon
Iconify - Perpustakaan ikon
Ikon MingLucu
Lingui - Internasionalisasi
Vanilla CSS - Ya, saya jadul.
Beberapa di antaranya mungkin berubah di masa depan. Dunia front-end selalu berubah.
Internasionalisasi
Semua terjemahan tersedia sebagai file gettext .po di folder src/locales . Bahasa defaultnya adalah bahasa Inggris ( en ). Aturan Plural CLDR digunakan untuk pluralisasi. Bahasa RTL (kanan ke kiri) juga didukung dengan arah teks, rendering ikon, dan tata letak yang tepat.
Saat memuat halaman, bahasa default terdeteksi melalui metode berikut, secara berurutan (pencocokan pertama digunakan):
Parameter URL lang misalnya /?lang=zh-Hant
kunci localStoragelang
navigator.language
Pengguna dapat mengubah bahasa dalam pengaturan, yang mengatur kunci localStoragelang .
Panduan untuk penerjemah
*Terinspirasi oleh Buku Panduan Terjemahan WordPress:
Jangan menerjemahkan secara harfiah, terjemahkan secara organik.
Cobalah untuk menjaga tingkat formalitas (atau informalitas) yang sama
Jangan gunakan istilah slang atau istilah khusus audiens
Perhatikan placeholder untuk variabel. Banyak string yang memiliki placeholder, misalnya {account} (variabel), <0>{name}0> (tag dengan variabel) dan # (nomor placeholder).
Elipsis (…) disengaja. Jangan hapus itu.
Nielsen Norman Group: "Sertakan Elips dalam Teks Perintah untuk Menunjukkan Kapan Informasi Lebih Lanjut Diperlukan"
Pedoman Antarmuka Manusia Apple: "Tambahkan elipsis ke label item menu ketika tindakan memerlukan lebih banyak informasi sebelum dapat diselesaikan. Karakter elipsis (…) menandakan bahwa orang perlu memasukkan informasi atau membuat pilihan tambahan, biasanya dalam tampilan lain."
Pengembangan Aplikasi Windows: "Elipsis berarti ketidaklengkapan."
Stempel waktu tanggal, rentang tanggal, angka, nama bahasa, dan segmentasi teks ditangani oleh API Internasionalisasi ECMAScript.
Intl.DateTimeFormat - misalnya "8 Agustus", "08/08/2024"
Intl.RelativeTimeFormat - misalnya "2 hari yang lalu", "dalam 2 hari"
Intl.NumberFormat - misalnya "1.000", "10K"
Intl.DisplayNames - misalnya "Bahasa Inggris" ( en ) dalam bahasa China Tradisional ( zh-Hant ) adalah "英文"
Intl.Locale (dengan polyfill untuk browser lama)
Intl.Segmenter (dengan polyfill untuk browser lama)
Catatan teknis
ID untuk string dibuat secara otomatis, bukan ditentukan secara eksplisit. Beberapa manfaatnya adalah menghindari masalah "penamaan sesuatu" dan menghindari duplikat.
ID eksplisit mungkin diperkenalkan di masa mendatang ketika persyaratan dan prioritas berubah. Perpustakaan (Lingui) mengizinkan keduanya.
Silakan laporkan masalah jika string tertentu diterjemahkan secara berbeda berdasarkan konteks, budaya, atau wilayah.
Tidak ada string untuk pemberitahuan push. Bahasa diatur di server instans.
Pemilih tanggal HTML asli, misalnya akan selalu mengikuti lokal sistem dan bukan lokal yang ditetapkan pengguna.
"ALT" pada lencana ALT tidak diterjemahkan. Ini berfungsi sebagai standar yang dapat dikenali di berbagai bahasa.
Nama emoji khusus tidak dilokalkan, oleh karena itu penelusuran tidak berfungsi untuk bahasa selain Inggris.
GIPHY API mendukung daftar bahasa untuk pencarian.
Unicode Tanda kanan-ke-kiri (RLM) ( U+200F , ) mungkin perlu digunakan untuk teks RTL/LTR campuran, terutama untuk elemen ( document.title ).
Pada pengembangan, ada lokal pseudo-LOCALE tambahan, yang digunakan untuk lokalisasi semu. Ini untuk pengujian dan tidak akan muncul di produksi.
Saat dibuat untuk produksi, pesan katalog berbahasa Inggris ( en ) tidak digabungkan secara terpisah. Lokal lainnya digabungkan sebagai file terpisah dan dimuat sesuai permintaan. Hal ini memastikan bahwa en selalu tersedia sebagai cadangan.
Terjemahan sukarela
Terjemahan dikelola di Crowdin. Anda dapat membantu dengan menjadi sukarelawan penerjemahan.
Baca dokumentasi intro untuk memulai.
Hosting mandiri
Ini adalah aplikasi web statis murni . Anda dapat menyimpannya di mana pun Anda mau.
Dua cara (pilih salah satu):
Cara mudah
Buka Rilis dan unduh phanpy-dist.zip atau phanpy-dist.tar.gz terbaru. Ini sudah dibuat sebelumnya sehingga tidak perlu menjalankan perintah instal/bangun apa pun. Ekstrak itu. Sajikan folder file yang diekstraksi.
Cara pembuatan khusus
Membutuhkan Node.js.
Unduh atau git clone repositori ini. Gunakan cabang production untuk rilis stabil , main untuk rilis terbaru . Bangun dengan menjalankan npm run build (setelah npm install ). Sajikan folder dist .
Kustomisasi dapat dilakukan dengan meneruskan variabel lingkungan ke perintah build. Contoh:
PHANPY_CLIENT_NAME= " Phanpy Dev "
PHANPY_WEBSITE= " https://dev.phanpy.social "
npm run build
PHANPY_DEFAULT_INSTANCE=hachyderm.io
PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL=https://hachyderm.io/auth/sign_up
PHANPY_PRIVACY_POLICY_URL=https://hachyderm.io/privacy-policy
npm run build
Dimungkinkan juga untuk mengaturnya di file .env .
Judul halaman web, ditampilkan di jendela browser atau judul tab
Judul aplikasi, ketika diinstal sebagai PWA, ditampilkan di layar Utama, dok macOS, bilah tugas Windows, dll
Judul kartu OpenGraph, ketika dibagikan di jejaring sosial
Nama klien, saat mendaftarkan aplikasi untuk autentikasi dan ditampilkan sebagai klien yang digunakan pada postingan di beberapa aplikasi/klien
PHANPY_WEBSITE (opsional tetapi disarankan, default: https://phanpy.social ) memengaruhi:
URL kanonik situs web
URL kartu OpenGraph, ketika dibagikan di jejaring sosial
Jalur root untuk gambar kartu OpenGraph
URL klien, saat mendaftarkan aplikasi untuk autentikasi dan ditampilkan sebagai klien yang digunakan pada postingan di beberapa aplikasi/klien
PHANPY_DEFAULT_INSTANCE (opsional, tidak ada default):
misalnya 'mastodon.social', tanpa https://
Contoh default untuk masuk
Saat masuk, pengguna akan diarahkan langsung ke halaman otentikasi instance daripada harus mengetikkan URL instance secara manual dan mengirimkannya
PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL (opsional, tanpa default):
URL halaman pendaftaran instance
Misalnya https://mastodon.social/auth/sign_up
PHANPY_PRIVACY_POLICY_URL (opsional, default pada kebijakan privasi instansi resmi):
URL halaman kebijakan privasi
Dapat menentukan kebijakan privasi instance itu sendiri
PHANPY_DEFAULT_LANG (opsional):
Bahasa default adalah bahasa Inggris ( en ) jika tidak ditentukan.
Bahasa cadangan setelah beberapa metode deteksi (parameter kueri lang , kunci lang di localStorage , dan navigator.language )
PHANPY_LINGVA_INSTANCES (opsional, daftar yang dipisahkan spasi, default: lingva.phanpy.social [...hard-coded list of fallback instances] ):
Tentukan daftar instance yang dipisahkan spasi. Yang pertama akan digunakan sebagai default sebelum kembali ke instance berikutnya. Jika hanya ada 1 instance, berarti tidak ada fallback.
Dapat menentukan instance Lingva yang dihosting sendiri, didukung oleh lingva-translate atau lingva-api
Daftar instance fallback yang di-hardcode di /.env
↗️ Daftar contoh terjemahan lingva
PHANPY_IMG_ALT_API_URL (opsional, tidak ada default):
Titik akhir API untuk instance img-alt-api yang dihosting sendiri.
Jika tersedia, akan muncul pengaturan bagi pengguna untuk mengaktifkan generator deskripsi gambar di komposer. Dinonaktifkan secara default.
PHANPY_GIPHY_API_KEY (opsional, tidak ada default):
Kunci API untuk GIPHY. Lihat dokumen API.
Jika disediakan, akan muncul pengaturan bagi pengguna untuk mengaktifkan pemilih GIF di komposer. Dinonaktifkan secara default.
Ini tidak dihosting sendiri.
Hosting situs statis
Coba telusuri online untuk "cara menghosting sendiri situs statis" karena ada banyak cara untuk melakukannya.
Lingva-translate atau hosting lingva-api
Lihat dokumentasi untuk lingva-translate atau lingva-api.
Penerapan komunitas
Ini diselenggarakan sendiri oleh orang-orang hebat lainnya.
ferengi.one oleh @david@weaknotes.com
halo.mookiesplace.com oleh @mookie@mookiesplace.com
phanpy.bauxite.tech oleh @b4ux1t3@hachyderm.io
phanpy.blaede.family oleh @cassidy@blaede.family
phanpy.crmbl.uk oleh @snail@crmbl.uk
phanpy.cz oleh @zdendys@mamutovo.cz
phanpy.fulda.social oleh @Ganneff@fulda.social
phanpy.gotosocial.social oleh @admin@gotosocial.social
phanpy.hear-me.social oleh @admin@hear-me.social
phanpy.mastodon.world oleh @ruud@mastodon.world
phanpy.mstdn.mx oleh @maop@mstdn.mx
phanpy.social.tchncs.de oleh @milan@social.tchncs.de
phanpy.tilde.zone oleh @ben@tilde.zone
phanpy.vmst.io oleh @vmstan@vmst.io
sosial.qrk.one oleh @kev@fosstodon.org
Catatan: Tambahkan milik Anda dengan membuat permintaan tarik.
Biaya
Biaya yang diperlukan untuk menjalankan dan mengembangkan aplikasi web ini:
Nama domain (.sosial): USD$23,18/tahun (USD$6,87 tahun pertama)
Tuan Rumah: Gratis
Pengembangan, desain, pemeliharaan: "Gratis" (Waktu saya yang berharga)
Saya salah satu pengguna Twitter pertama. Twitter diluncurkan pada 15 Juli 2006. Saya bergabung pada Desember 2006 dan tweet pertama saya diposting pada 18 Desember 2006.
Saya tahu seperti apa awal mula Twitter. Itu menyenangkan.
Saat itu, saya membuat tiruan Twitter bernama "Twig" yang ditulis dengan Python dan Google App Engine. Saya hampir membuat klien desktop Twitter saya sendiri yang ditulis dalam Appcelerator Titanium. Saya memberikan salah satu pembicaraan terbaik saya tentang klien Twitter dalam konferensi mini. Saya membuat sesuatu yang disebut "Kolom Twitter", sebuah aplikasi web yang menampilkan daftar pengikut Anda, pengikut Anda, pengikut Anda, pengikut pengikut Anda, dan sebagainya. Pada tahun 2009, saya menulis postingan blog berjudul "Bagaimana Saya Memulai Twitter". Saya membuat dua tema untuk DestroyTwitter (klien desktop yang dibuat dengan Adobe Air oleh Jonnie Hallman) dan salah satunya disebut "Vimeo". Pada tahun 2013, saya menulis situs cadangan tweet saya sendiri dengan front-end untuk melihat tweet saya dan backend CouchDB untuk menyimpannya.
Sudah lebih dari 15 tahun .
Dan inilah saya. Membangun klien web Mastodon.
Klien web alternatif
Garpu Phanpy ↓
Agora
Pinafore (pensiun) - garpu ↓
Tiang sinyal
sebelumnya
kukuk+
sengi
Kotak sabun
Rusa - garpu ↓
rusa.fedified.com
dek mastodek
batang
terlalu besar
kotak sampah
pembuat status
bergading
Edisi Mastodon Glitch (frontend mandiri)
Mangan
Meja
Lagi...
?♂️ Pemberitahuan kepada semua pengembang klien media sosial lainnya
Silakan salin ide dan eksperimen UI dari aplikasi ini. Menurut saya beberapa di antaranya cukup bagus dan akan sangat bagus jika lebih banyak aplikasi yang memilikinya.
Jika Anda bukan pengembang, beri tahu pengembang klien media sosial favorit Anda tentang aplikasi ini dan minta mereka menyalin ide dan eksperimen UI.