? Sigue a @phanpy en Mastodon para recibir actualizaciones ✨
Todo está diseñado y fabricado siguiendo mi gusto y visión. Este es un proyecto paralelo personal para aprender sobre Mastodon y experimentar con nuevas ideas de UI/UX.
Características
? Varias cuentas
? Ventana emergente/entrada de redacción
? Tema claro/oscuro/automático
? Notificaciones agrupadas
? Hilo de comentarios anidados
? Recuperación de borrador no enviado
? Impulsa el carrusel™️
⚡ Accesos directos™️ con modos de visualización como varias columnas o barra de pestañas
#️⃣ Línea de tiempo con múltiples hashtags
Decisiones de diseño
Las acciones de estado (responder, impulsar, favorito, marcador, etc.) están ocultas de forma predeterminada . Sólo aparecen en la página de estado individual. Esto es para reducir el desorden y la distracción. Puede resultar en una menor participación, pero aquí no estamos persiguiendo números.
Boost está representado con el icono del cohete . El ícono de doble flecha verde (retwittear para Twitter) no parece correcto para el término "impulsar". El cohete verde se ve raro, así que uso morado.
Los nombres de usuario cortos ( @username ) se muestran en las líneas de tiempo, en lugar del nombre de usuario completo de la cuenta ( @username@instance ) . A pesar de que la directriz menciona que "la descentralización debe ser transparente para el usuario", no creo que debamos dejarlo en claro cada vez. También existen algunos problemas de accesibilidad relacionados con el lector de pantalla con el nombre de usuario completo, aunque lamentablemente aún no se puede acceder a esta aplicación web.
No hay reproducción automática de videos/GIF/lo que sea en la línea de tiempo . La línea de tiempo ya es un gran desastre con muchas personas, marcas, noticias y medios tratando de captar su atención. No lo empeore. (La excepción actual ahora serían los emojis animados).
URL basadas en hash . Esta aplicación web no pretende ser un reemplazo completo del front-end existente de Mastodon. No hay SEO, base de datos, sin servidor ni servidores de larga duración. Podría equivocarme algún día.
Implementaciones sutiles de UI
Visualización del nombre de usuario
En la línea de tiempo, el nombre de usuario se muestra como [NAME] @[username] .
Para @[username] , excluya siempre el nombre de dominio de la instancia.
Si [NAME]tiene el mismo aspecto que @[username] , entonces @[username] también se excluye.
Impulsa el carrusel
A partir de las publicaciones buscadas (por ejemplo, 20 publicaciones por búsqueda), si el número de mejoras es más de una cuarta parte del total de publicaciones o más de 3 mejoras consecutivas, se activará la interfaz de usuario del carrusel de mejoras.
Si el número de mejoras supera las 3 cuartas partes del total de publicaciones, la interfaz de usuario del carrusel de mejoras se ubicará al final del total de publicaciones recuperadas (por "página").
De lo contrario, la interfaz de usuario del carrusel de mejoras se ubicará entre las publicaciones.
Insignia de número de hilo (p. ej., hilo 1/X)
Verifique cada publicación en busca de inReplyToId desde la memoria caché o solicitudes de API adicionales, hasta que se encuentre la publicación raíz.
Si se encuentra la publicación raíz, la insignia mostrará el número de índice de la publicación en el hilo.
Limite hasta 3 solicitudes de API ya que la publicación raíz puede ser muy antigua o el hilo es muy largo.
Si no se puede encontrar el número de índice, la insignia volverá a mostrar Thread sin el número.
El relleno de hashtags se derrumba
El primer párrafo del contenido de la publicación con más de 3 hashtags se contraerá a un máximo de 3 líneas.
Los párrafos posteriores al primer párrafo con más de 3 hashtags se contraerán en 1 línea.
Los párrafos adyacentes con más de 1 hashtag después de los párrafos contraídos se contraerán en 1 línea.
Si hay texto alrededor o entre los hashtags, no se contraerán.
A los hashtags contraídos se les agregará ... al final.
También están ligeramente atenuados para reducir el ruido visual.
Al abrir la vista de publicaciones, se mostrarán los hashtags sin contraer.
Publicaciones filtradas
Las publicaciones filtradas "Ocultar completamente" se ocultarán y no habrá interfaz de usuario que las revele.
Las publicaciones filtradas "Ocultar con una advertencia" se ocultarán parcialmente y mostrarán el nombre del filtro y el nombre del autor.
El contenido se puede revelar parcialmente al pasar el cursor sobre la publicación, con información sobre herramientas que muestra el texto de la publicación.
Al hacer clic en él, se abrirá la página Publicar.
Al presionarlo prolongadamente o hacer clic con el botón derecho, se "mirará" la publicación con una interfaz de usuario en la hoja inferior.
En el carrusel de impulsos, se clasifican hasta el final del carrusel.
Desarrollo
Requisitos previos: Node.js 18+
npm install - Instalar dependencias
npm run dev : inicia el servidor de desarrollo y messages:extract ( clean + ``watch`) en paralelo
npm run build - Compilación para producción
npm run preview : vista previa de la compilación de producción
npm run fetch-instances : obtenga la lista de instancias de joinmastodon.org/servers, guárdela en src/data/instances.json
npm run sourcemap : ejecuta source-map-explorer en la compilación de producción
npm run messages:extract : extrae mensajes de archivos fuente y actualiza los catálogos de mensajes locales
Pila de tecnología
Vite - Herramienta de construcción
Preact - Biblioteca de interfaz de usuario
Valtio - Gestión estatal
Enrutador React - Enrutamiento
masto.js - Cliente API de Mastodon
Iconify - Biblioteca de iconos
MingCute iconos
Lingui - Internacionalización
Vanilla CSS: sí, soy de la vieja escuela.
Algunos de estos pueden cambiar en el futuro. El mundo del front-end está en constante cambio.
Internacionalización
Todas las traducciones están disponibles como archivos gettext .po en la carpeta src/locales . El idioma predeterminado es el inglés ( en ). Las reglas plurales CLDR se utilizan para la pluralización. Los idiomas RTL (de derecha a izquierda) también son compatibles con la dirección del texto, la representación de iconos y el diseño adecuados.
Al cargar la página, el idioma predeterminado se detecta mediante estos métodos, en orden (se utiliza la primera coincidencia):
lang del parámetro de URL /?lang=zh-Hant
lang la clave de localStorage
navigator.language del navegador del navegador
Los usuarios pueden cambiar el idioma en la configuración, lo que establece el lang de la clave localStorage .
Guía para traductores
*Inspirado en el manual de traducción de WordPress:
No traduzcas literalmente, traduce orgánicamente.
Intenta mantener el mismo nivel de formalidad (o informalidad)
No utilices jerga ni términos específicos de la audiencia.
Esté atento a los marcadores de posición para las variables. Muchas cadenas tienen marcadores de posición, por ejemplo, {account} (variable), <0>{name}0> (etiqueta con variable) y # (número de marcador de posición).
La elipsis (…) es intencional. No lo quites.
Nielsen Norman Group: "Incluir elipses en el texto del comando para indicar cuándo se requiere más información"
Pautas de interfaz humana de Apple: "Agregue puntos suspensivos a la etiqueta de un elemento de menú cuando la acción requiera más información antes de que pueda completarse. El carácter de puntos suspensivos (...) indica que las personas necesitan ingresar información o tomar decisiones adicionales, generalmente dentro de otra vista".
Desarrollo de aplicaciones de Windows: "Las elipses significan algo incompleto".
La API de internacionalización de ECMAScript maneja las marcas de fecha y hora, los rangos de fechas, los números, los nombres de idiomas y la segmentación de texto.
Intl.DateTimeFormat : por ejemplo, "8 de agosto", "08/08/2024"
Intl.RelativeTimeFormat : por ejemplo, "hace 2 días", "en 2 días"
Intl.NumberFormat : por ejemplo, "1000", "10K"
Intl.DisplayNames : por ejemplo, "inglés" ( en ) en chino tradicional ( zh-Hant ) es "英文"
Intl.Locale (con polyfill para navegadores más antiguos)
Intl.Segmenter (con polyfill para navegadores más antiguos)
Notas técnicas
Los ID de las cadenas se generan automáticamente en lugar de definirse explícitamente. Algunos de los beneficios son evitar el problema de "nombrar cosas" y evitar duplicados.
Es posible que en el futuro se introduzcan identificaciones explícitas cuando cambien los requisitos y las prioridades. La biblioteca (Lingui) permite ambas cosas.
Informe problemas si ciertas cadenas se traducen de manera diferente según el contexto, la cultura o la región.
No hay cadenas para las notificaciones push. El idioma se establece en el servidor de instancia.
Los selectores de fechas HTML nativos, por ejemplo, siempre seguirán la configuración regional del sistema y no la configuración regional establecida por el usuario.
"ALT" en la insignia ALT no está traducido. Sirve como un estándar reconocible en todos los idiomas.
Los nombres de emoji personalizados no están traducidos, por lo tanto, las búsquedas no funcionan en idiomas distintos del inglés.
La API GIPHY admite una lista de idiomas para búsquedas.
Es posible que sea necesario utilizar la marca Unicode de derecha a izquierda (RLM) ( U+200F , ) para texto RTL/LTR mixto, especialmente para el elemento ( document.title ).
En desarrollo, hay una configuración regional pseudo-LOCALE adicional, que se utiliza para la pseudolocalización. Es para pruebas y no aparecerá en producción.
Cuando se crea para producción, los mensajes del catálogo en inglés ( en ) no se agrupan por separado. Otras configuraciones regionales se agrupan como archivos separados y se cargan según demanda. Esto garantiza que en siempre esté disponible como alternativa.
Traducciones voluntarias
Las traducciones se gestionan en Crowdin. Puedes ayudar ofreciéndote traducciones.
Lea la documentación de introducción para comenzar.
Autohospedaje
Esta es una aplicación web puramente estática . Puedes alojarlo donde quieras.
Dos formas (elija una):
Manera fácil
Vaya a Lanzamientos y descargue la última versión phanpy-dist.zip o phanpy-dist.tar.gz . Está prediseñado, por lo que no es necesario ejecutar ningún comando de instalación/compilación. Extraerlo. Sirve la carpeta de archivos extraídos.
Forma de construcción personalizada
Requiere Node.js.
Descargue o git clone este repositorio. Utilice la rama production para versiones estables y main para las más recientes . Compílelo ejecutando npm run build (después de npm install ). Sirve la carpeta dist .
La personalización se puede realizar pasando variables de entorno al comando de compilación. Ejemplos:
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
También es posible configurarlos en el archivo .env .
Título de la página web, que se muestra en la ventana del navegador o en el título de la pestaña
Título de la aplicación, cuando se instala como PWA, se muestra en la pantalla de inicio, la base de macOS, la barra de tareas de Windows, etc.
Título de la tarjeta OpenGraph, cuando se comparte en las redes sociales
Nombre del cliente, al registrar la aplicación para autenticación y se muestra como cliente utilizado en publicaciones en algunas aplicaciones/clientes
PHANPY_WEBSITE (opcional pero recomendado, predeterminado: https://phanpy.social ) afecta:
URL canónica del sitio web
URL de la tarjeta OpenGraph, cuando se comparte en las redes sociales
Ruta raíz de la imagen de la tarjeta OpenGraph
URL del cliente, al registrar la aplicación para autenticación y se muestra como cliente utilizado en publicaciones en algunas aplicaciones/clientes
PHANPY_DEFAULT_INSTANCE (opcional, sin valores predeterminados):
por ejemplo, 'mastodon.social', sin https://
Instancia predeterminada para iniciar sesión
Al iniciar sesión, el usuario será redirigido instantáneamente a la página de autenticación de la instancia en lugar de tener que escribir manualmente la URL de la instancia y enviarla.
PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL (opcional, sin valores predeterminados):
URL de la página de registro de la instancia
Por ejemplo, https://mastodon.social/auth/sign_up
PHANPY_PRIVACY_POLICY_URL (opcional, predeterminado a la política de privacidad de la instancia oficial):
URL de la página de política de privacidad
Puede especificar la política de privacidad propia de la instancia.
PHANPY_DEFAULT_LANG (opcional):
El idioma predeterminado es inglés ( en ) si no se especifica.
Idioma alternativo después de múltiples métodos de detección (parámetro de consulta lang , clave lang en localStorage y navigator.language )
PHANPY_LINGVA_INSTANCES (opcional, lista separada por espacios, predeterminado: lingva.phanpy.social [...hard-coded list of fallback instances] ):
Especifique una lista de instancias separadas por espacios. Primero se utilizará de forma predeterminada antes de recurrir a las instancias posteriores. Si solo hay 1 instancia, significa que no hay respaldo.
Puede especificar una instancia de Lingva autohospedada, impulsada por lingva-translate o lingva-api
Lista de instancias alternativas codificadas en /.env
↗️ Lista de instancias de lingva-translate
PHANPY_IMG_ALT_API_URL (opcional, sin valores predeterminados):
Punto final de API para una instancia autohospedada de img-alt-api.
Si se proporciona, aparecerá una configuración para que los usuarios habiliten el generador de descripción de imágenes en el compositor. Deshabilitado por defecto.
PHANPY_GIPHY_API_KEY (opcional, sin valores predeterminados):
Clave API para GIPHY. Consulte los documentos de la API.
Si se proporciona, aparecerá una configuración para que los usuarios habiliten el selector de GIF en el compositor. Deshabilitado por defecto.
Esto no es autohospedado.
Alojamiento de sitios estáticos
Pruebe la búsqueda en línea de "cómo alojar sitios estáticos usted mismo", ya que hay muchas formas de hacerlo.
Alojamiento Lingva-translate o lingva-api
Consulte la documentación para lingva-translate o lingva-api.
Implementaciones comunitarias
Estos están alojados por otras personas maravillosas.
ferengi.one por @david@weaknotes.com
halo.mookiesplace.com por @mookie@mookiesplace.com
phanpy.bauxite.tech por @b4ux1t3@hachyderm.io
phanpy.blaede.family por @cassidy@blaede.family
phanpy.crmbl.uk por @snail@crmbl.uk
phanpy.cz por @zdendys@mamutovo.cz
phanpy.fulda.social por @Ganneff@fulda.social
phanpy.gotosocial.social por @admin@gotosocial.social
phanpy.hear-me.social por @admin@hear-me.social
phanpy.mastodon.world por @ruud@mastodon.world
phanpy.mstdn.mx por @maop@mstdn.mx
phanpy.social.tchncs.de por @milan@social.tchncs.de
phanpy.tilde.zone por @ben@tilde.zone
phanpy.vmst.io por @vmstan@vmst.io
social.qrk.one por @kev@fosstodon.org
Nota: Agrega el tuyo creando una solicitud de extracción.
Costos
Costos involucrados en la ejecución y desarrollo de esta aplicación web:
Nombre de dominio (.social): USD$23.18/año (USD$6.87 1er año)
Soy uno de los primeros usuarios de Twitter. Twitter se lanzó el 15 de julio de 2006. Me uní en diciembre de 2006 y mi primer tweet se publicó el 18 de diciembre de 2006.
Sé lo temprano que parece Twitter. Fue divertido.
En aquel entonces, hice un clon de Twitter llamado "Twig" escrito en Python y Google App Engine. Casi creé mi propio cliente de escritorio de Twitter escrito en Appcelerator Titanium. Di una de mis mejores charlas sobre el cliente Twitter en una miniconferencia. Creé esto llamado "Columnas de Twitter", una aplicación web que muestra tu lista de seguidores, los seguidores de tus seguidores, tus seguidores, los seguidores de tus seguidores, etc. En 2009, escribí una publicación de blog titulada "Cómo comencé con Twitter". Creé dos temas para DestroyTwitter (un cliente de escritorio creado con Adobe Air por Jonnie Hallman) y uno de ellos se llama "Vimeo". En 2013, escribí mi propio sitio de respaldo de tweets con una interfaz para ver mis tweets y un backend CouchDB para almacenarlos.
Han pasado más de 15 años .
Y aquí estoy. Construyendo un cliente web Mastodon.
Clientes web alternativos
Horquillas Phanpy ↓
Ágora
Delantal (retirado) - tenedores ↓
Semáforo
Enafore
cuco+
Sengi
Plataforma improvisada
Alce - tenedores ↓
elk.fedified.com
Mastocubierta
Bañador
Tooty
Caja de arena
Estatizador
colmillos
Mastodon Glitch Edition (interfaz independiente)
mangano
El escritorio
Más...
?♂️ Aviso para todos los demás desarrolladores de clientes de redes sociales
Por favor, copie las ideas y experimentos de la interfaz de usuario de esta aplicación. Creo que algunos de ellos son bastante buenos y sería genial si más aplicaciones los tuvieran.
Si no es desarrollador, informe a sus desarrolladores de clientes de redes sociales favoritos sobre esta aplicación y pídales que copien las ideas y experimentos de la interfaz de usuario.