Pinafore to Semaphore

This commit is contained in:
Nick Colley 2023-01-10 14:21:38 +00:00
parent 2e533d91ac
commit e976da6b1e
37 changed files with 1241 additions and 1229 deletions

View File

@ -9,9 +9,9 @@ jobs:
postgres:
image: postgres:12.2
env:
POSTGRES_USER: pinafore
POSTGRES_PASSWORD: pinafore
POSTGRES_DB: pinafore_development
POSTGRES_USER: semaphore
POSTGRES_PASSWORD: semaphore
POSTGRES_DB: semaphore_development
POSTGRES_HOST: 127.0.0.1
POSTGRES_PORT: 5432
ports:

View File

@ -9,9 +9,9 @@ jobs:
postgres:
image: postgres:12.2
env:
POSTGRES_USER: pinafore
POSTGRES_PASSWORD: pinafore
POSTGRES_DB: pinafore_development
POSTGRES_USER: semaphore
POSTGRES_PASSWORD: semaphore
POSTGRES_DB: semaphore_development
POSTGRES_HOST: 127.0.0.1
POSTGRES_PORT: 5432
ports:

View File

@ -1,4 +1,4 @@
# Contributing to Pinafore
# Contributing to semaphore
## Installing
@ -20,7 +20,7 @@ because of [this issue](https://github.com/paulmillr/chokidar/issues/237).
## Linting
Pinafore uses [JavaScript Standard Style](https://standardjs.com/).
semaphore uses [JavaScript Standard Style](https://standardjs.com/).
Lint:
@ -61,7 +61,7 @@ If the script isn't able to set up the Postgres database, try running:
Then:
psql -d template1 -c "CREATE USER pinafore WITH PASSWORD 'pinafore' CREATEDB;"
psql -d template1 -c "CREATE USER semaphore WITH PASSWORD 'semaphore' CREATEDB;"
### Testing in development mode
@ -71,7 +71,7 @@ In separate terminals:
yarn run run-mastodon
2\. Run a Pinafore dev server:
2\. Run a Semaphore dev server:
yarn run dev
@ -148,18 +148,18 @@ To disable minification in a production build (for debugging purposes), you can
The Webpack Bundle Analyzer `report.html` and `stats.json` are available publicly via e.g.:
- [dev.pinafore.social/report.html](https://dev.pinafore.social/report.html)
- [dev.pinafore.social/stats.json](https://dev.pinafore.social/stats.json)
- [dev.semaphore.social/report.html](https://dev.semaphore.social/report.html)
- [dev.semaphore.social/stats.json](https://dev.semaphore.social/stats.json)
This is also available locally after `yarn run build` at `.sapper/client/report.html`.
## Deploying
This section only applies to `dev.pinafore.social` and `pinafore.social`, not if you're hosting your own version of
Pinafore.
This section only applies to `dev.semaphore.social` and `semaphore.social`, not if you're hosting your own version of
Semaphore.
The site uses [Vercel](https://vercel.com). The `master` branch publishes to `dev.pinafore.social` and the `production`
branch deploys to `pinafore.social`.
The site uses [Vercel](https://vercel.com). The `master` branch publishes to `dev.semaphore.social` and the `production`
branch deploys to `semaphore.social`.
## Architecture

View File

@ -6,7 +6,7 @@ FROM node:16-alpine
WORKDIR /app
COPY . /app
# Install Pinafore
# Install Semaphore
RUN yarn --production --pure-lockfile && \
yarn build && \
yarn cache clean && \

View File

@ -6,28 +6,17 @@ Continuation of the [Pinafore project](https://github.com/nolanlawson/pinafore).
Credit must go to Nolan and the original contributors for their excellent work.
## What's with the name?
Semaphore is a fork of Pinafore and apparently they were going to call the boat H.M.S Semaphore but thought Pinafore was more fun.
Bonus - semaphore is an old communication method.
<details>
<summary>Original Pinafore readme</summary>
_**Note:** Pinafore is unmaintained. Read [this](https://nolanlawson.com/2023/01/09/retiring-pinafore/). Original documentation follows._
An alternative web client for [Mastodon](https://joinmastodon.org), focused on speed and simplicity.
Pinafore is available at [pinafore.social](https://pinafore.social). Beta releases are at [dev.pinafore.social](https://dev.pinafore.social).
Semaphore is available at [semaphore.social](https://semaphore.social). Beta releases are at [dev.semaphore.social](https://dev.semaphore.social).
See the [user guide](https://github.com/nolanlawson/pinafore/blob/master/docs/User-Guide.md) for basic usage. See the [admin guide](https://github.com/nolanlawson/pinafore/blob/master/docs/Admin-Guide.md) if Pinafore cannot connect to your instance.
See the [user guide](https://github.com/nolanlawson/semaphore/blob/master/docs/User-Guide.md) for basic usage. See the [admin guide](https://github.com/nolanlawson/semaphore/blob/master/docs/Admin-Guide.md) if Semaphore cannot connect to your instance.
For updates and support, follow [@pinafore@fosstodon.org](https://fosstodon.org/@pinafore).
For updates and support, follow [@semaphore@fosstodon.org](https://fosstodon.org/@semaphore).
## Browser support
Pinafore supports the latest versions of the following browsers:
Semaphore supports the latest versions of the following browsers:
- Chrome
- Edge
@ -69,9 +58,9 @@ Compatible versions of each (Opera, Brave, Samsung, etc.) should be fine.
## Building
Pinafore requires [Node.js](https://nodejs.org/en/) and [Yarn](https://yarnpkg.com).
Semaphore requires [Node.js](https://nodejs.org/en/) and [Yarn](https://yarnpkg.com).
To build Pinafore for production, first install dependencies:
To build Semaphore for production, first install dependencies:
yarn --production --pure-lockfile
@ -90,7 +79,7 @@ To build a Docker image for production:
docker build .
docker run -d -p 4002:4002 [your-image]
Now Pinafore is running at `localhost:4002`.
Now Semaphore is running at `localhost:4002`.
### docker-compose
@ -102,13 +91,13 @@ The image will build and start, then detach from the terminal running at `localh
### Updating
To keep your version of Pinafore up to date, you can use `git` to check out the latest tag:
To keep your version of Semaphore up to date, you can use `git` to check out the latest tag:
git checkout $(git tag -l | sort -Vr | head -n 1)
### Exporting
Pinafore is a static site. When you run `yarn build`, static files will be
Semaphore is a static site. When you run `yarn build`, static files will be
written to `__sapper__/export`.
It is _not_ recommended to directly expose these files when self-hosting. Instead, you should use `node server.js` (e.g. with an
@ -117,21 +106,21 @@ nginx or Apache proxy in front). This adds several things you don't get from the
- [CSP headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) (important for security)
- Certain dynamic routes (less important because of Service Worker managing routing, but certain things could break if Service Workers are disabled in the user's browser)
Having an [nginx config generator](https://github.com/nolanlawson/pinafore/issues/1878) is currently an open issue.
Having an [nginx config generator](https://github.com/nolanlawson/semaphore/issues/1878) is currently an open issue.
## Developing and testing
See [CONTRIBUTING.md](https://github.com/nolanlawson/pinafore/blob/master/CONTRIBUTING.md) for
how to run Pinafore in dev mode and run tests.
See [CONTRIBUTING.md](https://github.com/nolanlawson/semaphore/blob/master/CONTRIBUTING.md) for
how to run Semaphore in dev mode and run tests.
## Changelog
For a changelog, see the [GitHub releases](http://github.com/nolanlawson/pinafore/releases/).
For a changelog, see the [GitHub releases](http://github.com/nolanlawson/semaphore/releases/).
For a list of breaking changes, see [BREAKING_CHANGES.md](https://github.com/nolanlawson/semaphore/blob/master/BREAKING_CHANGES.md).
For a list of breaking changes, see [BREAKING_CHANGES.md](https://github.com/nolanlawson/pinafore/blob/master/BREAKING_CHANGES.md).
## What's with the name?
Pinafore is named after the [Gilbert and Sullivan play](https://en.wikipedia.org/wiki/Hms_pinafore). The [soundtrack](https://www.allmusic.com/album/gilbert-sullivan-hms-pinafore-1949-mw0001830483) is very good.
</summary>
Semaphore is a fork of Pinafore and apparently they were going to call the boat H.M.S Semaphore but thought Pinafore was more fun.
Bonus - semaphore is an old communication method.

View File

@ -3,6 +3,6 @@
set -x
set -e
PGPASSWORD=pinafore pg_dump -U pinafore -w pinafore_development -h 127.0.0.1 > tests/fixtures/dump.sql
PGPASSWORD=semaphore pg_dump -U semaphore -w semaphore_development -h 127.0.0.1 > tests/fixtures/dump.sql
cd mastodon/public/system
tar -czf ../../../tests/fixtures/system.tgz .

View File

@ -1,8 +1,8 @@
import path from 'path'
export const DB_NAME = 'pinafore_development'
export const DB_USER = 'pinafore'
export const DB_PASS = 'pinafore'
export const DB_NAME = 'semaphore_development'
export const DB_USER = 'semaphore'
export const DB_PASS = 'semaphore'
export const DB_PORT = process.env.PGPORT || 5432
export const DB_HOST = '127.0.0.1'

View File

@ -24,5 +24,5 @@ Export successful! Static files are in:
__sapper__/export/
Enjoy Pinafore!
Enjoy Semaphore!
`)

View File

@ -1,5 +1,5 @@
export default [
{ id: 'pinafore-logo', src: 'src/static/sailboat.svg', inline: true },
{ id: 'semaphore-logo', src: 'src/static/sailboat.svg', inline: true },
{ id: 'fa-arrow-left', src: 'src/thirdparty/font-awesome-svg-png/white/svg/arrow-left.svg' },
{ id: 'fa-bell', src: 'src/thirdparty/font-awesome-svg-png/white/svg/bell.svg', inline: true },
{ id: 'fa-bell-o', src: 'src/thirdparty/font-awesome-svg-png/white/svg/bell-o.svg' },

View File

@ -1,11 +1,11 @@
---
version: "3"
services:
pinafore:
semaphore:
restart: unless-stopped
build:
context: .
dockerfile: Dockerfile
image: pinafore:latest
image: semaphore:latest
ports:
- 4002:4002

View File

@ -1,14 +1,14 @@
Admin Guide
====
This guide is for instance admins who may be having trouble with Pinafore compatibility.
This guide is for instance admins who may be having trouble with Semaphore compatibility.
By default, [Mastodon allows cross-origin access to the `/api` endpoint](https://github.com/tootsuite/mastodon/blob/50529cbceb84e611bca497624a7a4c38113e5135/config/initializers/cors.rb#L15-L20). Thus Pinafore should "just work" for most Mastodon servers.
By default, [Mastodon allows cross-origin access to the `/api` endpoint](https://github.com/tootsuite/mastodon/blob/50529cbceb84e611bca497624a7a4c38113e5135/config/initializers/cors.rb#L15-L20). Thus Semaphore should "just work" for most Mastodon servers.
If the nginx/Apache settings have been changed, though, then Pinafore might not be able to connect to an instance. To check if the instance is supported, run this command (replacing `myinstance.com` with your instance URL):
If the nginx/Apache settings have been changed, though, then Semaphore might not be able to connect to an instance. To check if the instance is supported, run this command (replacing `myinstance.com` with your instance URL):
```bash
curl -sLv -H 'Origin: https://pinafore.social' -o /dev/null \
curl -sLv -H 'Origin: https://semaphore.social' -o /dev/null \
myinstance.com/api/v1/instance
```
@ -18,12 +18,12 @@ If you see this in the output:
Access-Control-Allow-Origin: *
```
Then Pinafore should work as expected!
Then Semaphore should work as expected!
Otherwise, if the instance admin would like to whitelist only certain websites (including Pinafore) to work with CORS, then they will need to make sure that the server echoes:
Otherwise, if the instance admin would like to whitelist only certain websites (including Semaphore) to work with CORS, then they will need to make sure that the server echoes:
```
Access-Control-Allow-Origin: https://pinafore.social
Access-Control-Allow-Origin: https://semaphore.social
```
when Pinafore tries to access it. Note that this is a bit complicated to configure (compared to the simpler `*` approach), but [there are instructions on StackOverflow](https://stackoverflow.com/q/1653308) for nginx, Apache, and other servers.
when Semaphore tries to access it. Note that this is a bit complicated to configure (compared to the simpler `*` approach), but [there are instructions on StackOverflow](https://stackoverflow.com/q/1653308) for nginx, Apache, and other servers.

View File

@ -5,16 +5,16 @@ Basically think of it as a "lay of the land" as well as "weird unusual stuff tha
## Overview
Pinafore uses [SvelteJS](https://svelte.technology) v2 and [SapperJS](https://sapper.svelte.technology). Most of it is a fairly typical Svelte/Sapper project, but there
Semaphore uses [SvelteJS](https://svelte.technology) v2 and [SapperJS](https://sapper.svelte.technology). Most of it is a fairly typical Svelte/Sapper project, but there
are some quirks, which are described below. This list of quirks is non-exhaustive.
## Why Svelte v2 / Sapper ?
There is [no upgrade path from Svelte v2 to v3](https://github.com/sveltejs/svelte/issues/2462). Doing so would require manually migrating every component over. And in the end, it would probably not change the UX (user experience) of Pinafore only the DX (developer experience).
There is [no upgrade path from Svelte v2 to v3](https://github.com/sveltejs/svelte/issues/2462). Doing so would require manually migrating every component over. And in the end, it would probably not change the UX (user experience) of Semaphore only the DX (developer experience).
Similarly, [Sapper would need to be migrated to SvelteKit](https://kit.svelte.dev/docs/migrating). Since Pinafore generates static files, there is probably not much benefit in moving from Sapper to SvelteKit.
Similarly, [Sapper would need to be migrated to SvelteKit](https://kit.svelte.dev/docs/migrating). Since Semaphore generates static files, there is probably not much benefit in moving from Sapper to SvelteKit.
For this reason, Pinafore has been stuck on Svelte v2 and Sapper for a long time. Migrating it is not something I've considered. The [v2 Svelte docs](https://v2.svelte.dev/) are still online, and share many similarities with Svelte v3.
For this reason, Semaphore has been stuck on Svelte v2 and Sapper for a long time. Migrating it is not something I've considered. The [v2 Svelte docs](https://v2.svelte.dev/) are still online, and share many similarities with Svelte v3.
## Prebuild process
@ -37,7 +37,7 @@ as a bundled custom element, not as a Svelte component.
For various reasons, `a11y-dialog`, `autosize`, and `timeago` are forked and bundled into the source code.
This was either because something needed to be tweaked or fixed, or I was trimming unused code and didn't
see much value in contributing it back, because it was too Pinafore-specific.
see much value in contributing it back, because it was too Semaphore-specific.
## Every Sapper page is "duplicated"

View File

@ -1,6 +1,6 @@
# Internationalization
To contribute or change translations for Pinafore, look in the [src/intl](https://github.com/semaphore-social/semaphore/tree/master/src/intl) directory. Create a new file or edit an existing file based on its [two-letter language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) and optionally, a region. For instance, `en-US.js` is American English, and `fr.js` is French.
To contribute or change translations for Semaphore, look in the [src/intl](https://github.com/semaphore-social/semaphore/tree/master/src/intl) directory. Create a new file or edit an existing file based on its [two-letter language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) and optionally, a region. For instance, `en-US.js` is American English, and `fr.js` is French.
The default is `en-US.js`, and any strings not defined in a language file will fall back to the strings from that file.
@ -8,7 +8,7 @@ There is also an `intl/emoji-picker` directory, which contains translations for
(which already comes with English built-in).
Note that internationalization is currently experimental. Client-side locale switching is not supported when you build
the instance of Pinafore, it is either one language or another. To build in a particular language, use (for example):
the instance of Semaphore, it is either one language or another. To build in a particular language, use (for example):
LOCALE=fr yarn build
@ -16,4 +16,4 @@ or
LOCALE=fr yarn dev
To host a localized version of Pinafore using Vercel, you can see this example: [buildCommand in vercel.json for Spanish](https://github.com/nvdaes/vercelPinafore/blob/45c70fb2088fe5f2380a729dab83e6f3ab4e6291/vercel.json#L9).
To host a localized version of Semaphore using Vercel, you can see this example: [buildCommand in vercel.json for Spanish](https://github.com/nvdaes/vercelPinafore/blob/45c70fb2088fe5f2380a729dab83e6f3ab4e6291/vercel.json#L9).

View File

@ -1,6 +1,6 @@
## Theming
This document describes how to write your own theme for Pinafore.
This document describes how to write your own theme for Semaphore.
First, create a file `scss/themes/foobar.scss`, write some SCSS inside and add
the following at the bottom of `scss/themes/foobar.scss`.

View File

@ -1,6 +1,6 @@
# Pinafore user guide
# Semaphore user guide
This will walk you through the basic usage of Pinafore and its major differences with the Mastodon web UI.
This will walk you through the basic usage of Semaphore and its major differences with the Mastodon web UI.
* [Home page](#home-page)
* [Community page](#community-page)

View File

@ -1,5 +1,5 @@
{
"name": "pinafore",
"name": "semaphore",
"description": "Alternative web client for Mastodon",
"version": "2.6.0",
"type": "module",

View File

@ -28,7 +28,7 @@
<link href="/ipadpro1_splash.png" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
<link href="/ipadpro3_splash.png" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
<link href="/ipadpro2_splash.png" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
<link rel="me" href="https://fosstodon.org/@pinafore">
<link rel="me" href="https://fosstodon.org/@semaphore">
<!-- inline CSS -->

View File

@ -1,10 +1,10 @@
export default {
// Home page, basic <title> and <description>
appName: 'Pinafore',
appName: 'Semaphore',
appDescription: 'Ein alternativer Web Client für Mastodon, der auf Geschwindigkeit und einfache Bedienung ausgelegt ist.',
homeDescription: `
<p>
Pinafore ist ein Web Client für
Semaphore ist ein Web Client für
<a rel="noopener" target="_blank" href="https://joinmastodon.org">Mastodon</a>,
der für Geschwindigkeit und einfache Bedienung konzipiert wurde.
</p>
@ -17,7 +17,7 @@ export default {
logIn: 'Anmelden',
footer: `
<p>
Pinafore ist
Semaphore ist
<a rel="noopener" target="_blank" href="https://github.com/semaphore-social/semaphore">quelloffene Software</a>,
erstellt von <a rel="noopener" target="_blank" href="https://nolanlawson.com">Nolan Lawson</a>
und verteilt unter der
@ -174,7 +174,7 @@ export default {
·
{showInstanceName, select,
true {{instanceName}}
other {Pinafore}
other {Semaphore}
}
`,
pinLabel: `{label} {pinnable, select,
@ -315,10 +315,10 @@ export default {
profilePageForAccount: 'Profilseite für {account}',
// About page
about: 'Über',
aboutApp: 'Über Pinafore',
aboutApp: 'Über Semaphore',
aboutAppDescription: `
<p>
Pinafore ist
Semaphore ist
<a rel="noopener" target="_blank"
href="https://github.com/semaphore-social/semaphore">freie und quelloffene Software</a>
erstellt von
@ -331,13 +331,13 @@ export default {
<h2 id="privacy-policy">Datenschutzerklärung</h2>
<p>
Pinafore speichert keine persönlichen Informationen auf seinen Servern,
Semaphore speichert keine persönlichen Informationen auf seinen Servern,
einschließlich, aber nicht beschränkt auf, Namen, E-Mail-Adressen,
IP-Adressen, Beiträgen, und Fotos.
</p>
<p>
Pinafore ist eine statische Seite. Alle Daten werden lokal in Ihrem Browser gespeichert und mit den Instanzen des Fediversums geteilt, zu denen Sie sich verbinden.
Semaphore ist eine statische Seite. Alle Daten werden lokal in Ihrem Browser gespeichert und mit den Instanzen des Fediversums geteilt, zu denen Sie sich verbinden.
</p>
<h2>Mitwirkende</h2>
@ -406,7 +406,7 @@ export default {
notificationFilters: 'Filter für Benachrichtigungen',
pushNotifications: 'Push-Benachrichtigungen',
// Add instance page
storageError: 'Es sieht so aus als ob Pinafore lokal keine Daten speichern kann. Ist Dein Browser im privaten Modus oder blockiert Cookies? Pinafore speichert alle Daten lokal und braucht zum ordnungsgemäßen Betrieb LocalStorage und IndexedDB.',
storageError: 'Es sieht so aus als ob Semaphore lokal keine Daten speichern kann. Ist Dein Browser im privaten Modus oder blockiert Cookies? Semaphore speichert alle Daten lokal und braucht zum ordnungsgemäßen Betrieb LocalStorage und IndexedDB.',
javaScriptError: 'Du musst zum Einloggen javaScript einschalten.',
enterInstanceName: 'Namen der Instanz eingeben',
instanceColon: 'Instanz:',
@ -426,7 +426,7 @@ export default {
// Link text
logInToAnInstancePre: '',
logInToAnInstanceText: 'Melde Dich bei einer Instanz an',
logInToAnInstancePost: 'um Pinafore zu verwenden.',
logInToAnInstancePost: 'um Semaphore zu verwenden.',
// Another custom tooltip
showRingPre: 'Immer einen',
showRingText: 'Fokusring',

View File

@ -1,10 +1,10 @@
export default {
// Home page, basic <title> and <description>
appName: 'Pinafore',
appName: 'Semaphore',
appDescription: 'An alternative web client for Mastodon, focused on speed and simplicity.',
homeDescription: `
<p>
Pinafore is a web client for
Semaphore is a web client for
<a rel="noopener" target="_blank" href="https://joinmastodon.org">Mastodon</a>,
designed for speed and simplicity.
</p>
@ -17,7 +17,7 @@ export default {
logIn: 'Log in',
footer: `
<p>
Pinafore is
Semaphore is
<a rel="noopener" target="_blank" href="https://github.com/semaphore-social/semaphore">open-source software</a>
created by
<a rel="noopener" target="_blank" href="https://nolanlawson.com">Nolan Lawson</a>
@ -28,7 +28,7 @@ export default {
</p>
`,
// Manifest
longAppName: 'Pinafore for Mastodon',
longAppName: 'Semaphore for Mastodon',
newStatus: 'New toot',
// Generic UI
loading: 'Loading',
@ -180,7 +180,7 @@ export default {
·
{showInstanceName, select,
true {{instanceName}}
other {Pinafore}
other {Semaphore}
}
`,
pinLabel: `{label} {pinnable, select,
@ -327,10 +327,10 @@ export default {
profilePageForAccount: 'Profile page for {account}',
// About page
about: 'About',
aboutApp: 'About Pinafore',
aboutApp: 'About Semaphore',
aboutAppDescription: `
<p>
Pinafore is
Semaphore is
<a rel="noopener" target="_blank"
href="https://github.com/semaphore-social/semaphore">free and open-source software</a>
created by
@ -343,13 +343,13 @@ export default {
<h2 id="privacy-policy">Privacy Policy</h2>
<p>
Pinafore does not store any personal information on its servers,
Semaphore does not store any personal information on its servers,
including but not limited to names, email addresses,
IP addresses, posts, and photos.
</p>
<p>
Pinafore is a static site. All data is stored locally in your browser and shared with the fediverse
Semaphore is a static site. All data is stored locally in your browser and shared with the fediverse
instance(s) you connect to.
</p>
@ -427,8 +427,8 @@ export default {
notificationFilters: 'Notification filters',
pushNotifications: 'Push notifications',
// Add instance page
storageError: `It seems Pinafore cannot store data locally. Is your browser in private mode
or blocking cookies? Pinafore stores all data locally, and requires LocalStorage and
storageError: `It seems Semaphore cannot store data locally. Is your browser in private mode
or blocking cookies? Semaphore stores all data locally, and requires LocalStorage and
IndexedDB to work correctly.`,
javaScriptError: 'You must enable JavaScript to log in.',
enterInstanceName: 'Enter instance name',
@ -449,7 +449,7 @@ export default {
// Link text
logInToAnInstancePre: '',
logInToAnInstanceText: 'Log in to an instance',
logInToAnInstancePost: 'to start using Pinafore.',
logInToAnInstancePost: 'to start using Semaphore.',
// Another custom tooltip
showRingPre: 'Always show',
showRingText: 'focus ring',

View File

@ -1,10 +1,10 @@
export default {
// Home page, basic <title> and <description>
appName: 'Pinafore',
appName: 'Semaphore',
appDescription: 'Un cliente web alternativo para Mastodon, centrado en la velocidad y la sencillez.',
homeDescription: `
<p>
Pinafore es un cliente web para
Semaphore es un cliente web para
<a rel="noopener" target="_blank" href="https://joinmastodon.org">Mastodon</a>,
diseñado para ser rápido y sencillo.
</p>
@ -17,7 +17,7 @@ export default {
logIn: 'Iniciar sesión',
footer: `
<p>
Pinafore es
Semaphore es
<a rel="noopener" target="_blank" href="https://github.com/semaphore-social/semaphore">software de código abierto</a>
creado por
<a rel="noopener" target="_blank" href="https://nolanlawson.com">Nolan Lawson</a>
@ -28,7 +28,7 @@ export default {
</p>
`,
// Manifest
longAppName: 'Pinafore para Mastodon',
longAppName: 'Semaphore para Mastodon',
newStatus: 'Nuevo toot',
// Generic UI
loading: 'Cargando',
@ -180,7 +180,7 @@ export default {
·
{showInstanceName, select,
true {{instanceName}}
other {Pinafore}
other {Semaphore}
}
`,
pinLabel: `{label} {pinnable, select,
@ -327,10 +327,10 @@ export default {
profilePageForAccount: 'Página de perfil para {account}',
// About page
about: 'Acerca de',
aboutApp: 'Acerca de Pinafore',
aboutApp: 'Acerca de Semaphore',
aboutAppDescription: `
<p>
Pinafore es
Semaphore es
<a rel="noopener" target="_blank"
href="https://github.com/semaphore-social/semaphore">software libre y de código abierto</a>
creado por
@ -343,13 +343,13 @@ export default {
<h2 id="privacy-policy">Política de privacidad</h2>
<p>
Pinafore no almacena ninguna información personal en sus servidores,
Semaphore no almacena ninguna información personal en sus servidores,
incluyendo, pero no limitándose a nombres, direcciones de correo electrónico,
direcciones IP, posts y fotos.
</p>
<p>
Pinafore es un sitio estático. Todos los datos son almacenados en tu navegador y compartidos con las instancias del fediverso
Semaphore es un sitio estático. Todos los datos son almacenados en tu navegador y compartidos con las instancias del fediverso
a las que te conectas.
</p>
@ -425,8 +425,8 @@ export default {
notificationFilters: 'Filtros para notificaciones',
pushNotifications: 'Notificaciones Push',
// Add instance page
storageError: `Parece que Pinafore no puede almacenar datos localmente. ¿Está tu navegador en modo privado
o bloqueando las cookies? Pinafore almacena todos los datos localmente, y requiere LocalStorage e
storageError: `Parece que Semaphore no puede almacenar datos localmente. ¿Está tu navegador en modo privado
o bloqueando las cookies? Semaphore almacena todos los datos localmente, y requiere LocalStorage e
IndexedDB para funcionar correctamente.`,
javaScriptError: 'Debes habilitar JavaScript para iniciar sesión.',
enterInstanceName: 'Introducir nombre de instancia',
@ -447,7 +447,7 @@ export default {
// Link text
logInToAnInstancePre: '',
logInToAnInstanceText: 'Inicia sesión en una instancia',
logInToAnInstancePost: 'para empezar a usar Pinafore.',
logInToAnInstancePost: 'para empezar a usar Semaphore.',
// Another custom tooltip
showRingPre: 'Mostrar siempre',
showRingText: 'anillo del foco',

View File

@ -1,10 +1,10 @@
export default {
// Home page, basic <title> and <description>
appName: 'Pinafore',
appName: 'Semaphore',
appDescription: 'Un client alternatif pour Mastodon, concentré sur la vitesse et la simplicité',
homeDescription: `
<p>
Pinafore est un client web pour
Semaphore est un client web pour
<a rel="noopener" target="_blank" href="https://joinmastodon.org">Mastodon</a>,
dessiné pour la vitesse et la simplicité.
</p>
@ -17,7 +17,7 @@ export default {
logIn: 'Se connecter',
footer: `
<p>
Pinafore est
Semaphore est
<a rel="noopener" target="_blank" href="https://github.com/semaphore-social/semaphore">logiciel open-source</a>
créé par
<a rel="noopener" target="_blank" href="https://nolanlawson.com">Nolan Lawson</a>
@ -175,7 +175,7 @@ export default {
·
{showInstanceName, select,
true {{instanceName}}
other {Pinafore}
other {Semaphore}
}
`,
pinLabel: `{label} {pinnable, select,
@ -316,10 +316,10 @@ export default {
profilePageForAccount: 'Page de profil pour {account}',
// About page
about: 'Infos',
aboutApp: 'Infos sur Pinafore',
aboutApp: 'Infos sur Semaphore',
aboutAppDescription: `
<p>
Pinafore est un logiciel
Semaphore est un logiciel
<a rel="noopener" target="_blank"
href="https://github.com/semaphore-social/semaphore">gratuit et open-source</a>
créé par
@ -332,12 +332,12 @@ export default {
<h2 id="privacy-policy">Politique de confidentialité</h2>
<p>
Pinafore ne garde pas d'informations personelles dans ses serveurs,
Semaphore ne garde pas d'informations personelles dans ses serveurs,
y compris les noms, addresses courriel, addresses IP, messages, et photos.
</p>
<p>
Pinafore est un site statique. Tous données sont gardées en locale dans le navigateur, et sont partagée qu'avec
Semaphore est un site statique. Tous données sont gardées en locale dans le navigateur, et sont partagée qu'avec
les instances auxquelles vous vous connectez.
</p>
@ -409,8 +409,8 @@ export default {
notificationFilters: 'Filtres de notifications',
pushNotifications: 'Filtres de notifications push',
// Add instance page
storageError: `Il semble que Pinafore ne peut pas stocker les données en locale. Est-ce que votre navigateur
est en mode privé, ou est-ce qu'il bloque les cookies? Pinafore garde tous ses données en locale et
storageError: `Il semble que Semaphore ne peut pas stocker les données en locale. Est-ce que votre navigateur
est en mode privé, ou est-ce qu'il bloque les cookies? Semaphore garde tous ses données en locale et
ne peut pas fonctionner sans LocalStorage ou IndexedDB.`,
javaScriptError: 'Le JavaScript devrait être activé pour continuer.',
enterInstanceName: "Saisir le nom d'instance",
@ -431,7 +431,7 @@ export default {
// Link text
logInToAnInstancePre: '',
logInToAnInstanceText: 'Se connecter à une instance',
logInToAnInstancePost: 'pour utiliser Pinafore.',
logInToAnInstancePost: 'pour utiliser Semaphore.',
// Another custom tooltip
showRingPre: 'Afficher toujours',
showRingText: "l'anneau de focus",

View File

@ -1,10 +1,10 @@
export default {
// Home page, basic <title> and <description>
appName: 'Pinafore',
appName: 'Semaphore',
appDescription: 'Альтернативный веб-клиент для Mastodon, ориентированный на скорость и простоту.',
homeDescription: `
<p>
Pinafore — веб-клиент для
Semaphore — веб-клиент для
<a rel="noopener" target="_blank" href="https://joinmastodon.org">Mastodon</a>,
разработан для скорости и простоты.
</p>
@ -17,7 +17,7 @@ export default {
logIn: 'Войти',
footer: `
<p>
Pinafore — это
Semaphore — это
<a rel="noopener" target="_blank" href="https://github.com/semaphore-social/semaphore">программное обеспечение с открытым исходным кодом</a>
созданное
<a rel="noopener" target="_blank" href="https://nolanlawson.com">Ноланом Лоусоном</a>
@ -28,7 +28,7 @@ export default {
</p>
`,
// Manifest
longAppName: 'Pinafore для Mastodon',
longAppName: 'Semaphore для Mastodon',
newStatus: 'Новая запись',
// Generic UI
loading: 'Загрузка',
@ -176,7 +176,7 @@ export default {
}
{showInstanceName, select,
true {{instanceName}}
other {Pinafore}
other {Semaphore}
}
·
{name}
@ -325,10 +325,10 @@ export default {
profilePageForAccount: 'Страница профиля для {account}',
// About page
about: 'О нас',
aboutApp: 'О Pinafore',
aboutApp: 'О Semaphore',
aboutAppDescription: `
<p>
Pinafore — это
Semaphore — это
<a rel="noopener" target="_blank"
href="https://github.com/semaphore-social/semaphore">бесплатное программное обеспечение с открытым исходным кодом</a>
создано
@ -341,13 +341,13 @@ export default {
<h2 id="privacy-policy">Политика конфиденциальности</h2>
<p>
Pinafore не хранит никакой личной информации на своих серверах,
Semaphore не хранит никакой личной информации на своих серверах,
включая, помимо прочего, имена, адреса электронной почты,
IP-адреса, сообщения и фотографии.
</p>
<p>
Pinafore — это статический сайт. Все данные хранятся локально в вашем браузере и передаются через Федиверс
Semaphore — это статический сайт. Все данные хранятся локально в вашем браузере и передаются через Федиверс
инстансы, к которым вы подключаетесь.
</p>
@ -424,8 +424,8 @@ export default {
notificationFilters: 'Фильтры уведомлений',
pushNotifications: 'Всплывающее уведомление',
// Add instance page
storageError: `Похоже, Pinafore не может хранить данные локально. Ваш браузер находится в приватном режиме
или блокирует файлов cookie? Pinafore хранит все данные локально, и для этого требуется LocalStorage и
storageError: `Похоже, Semaphore не может хранить данные локально. Ваш браузер находится в приватном режиме
или блокирует файлов cookie? Semaphore хранит все данные локально, и для этого требуется LocalStorage и
IndexedDB для корректной работы.`,
javaScriptError: 'Вы должны включить JavaScript, чтобы войти в систему.',
enterInstanceName: 'Введите имя инстанса',
@ -446,7 +446,7 @@ export default {
// Link text
logInToAnInstancePre: '',
logInToAnInstanceText: 'Войти в инстанс',
logInToAnInstancePost: 'чтобы начать использовать Pinafore.',
logInToAnInstancePost: 'чтобы начать использовать Semaphore.',
// Another custom tooltip
showRingPre: 'Всегда показывать',
showRingText: 'кольцо фокусировки',

View File

@ -1,9 +1,9 @@
import { post, paramsString, WRITE_TIMEOUT } from '../_utils/ajax.js'
import { basename } from './utils.js'
const WEBSITE = 'https://pinafore.social'
const WEBSITE = 'https://semaphore.social'
const SCOPES = 'read write follow push'
const CLIENT_NAME = 'Pinafore'
const CLIENT_NAME = 'Semaphore'
export function registerApplication (instanceName, redirectUri) {
const url = `${basename(instanceName)}/api/v1/apps`

View File

@ -2,7 +2,7 @@
<FreeTextLayout>
<div class="not-logged-in-home">
<div class="banner">
<SvgIcon className="not-logged-in-home-svg" href="#pinafore-logo" />
<SvgIcon className="not-logged-in-home-svg" href="#semaphore-logo" />
<h1>{intl.appName}</h1>
</div>
<div>

View File

@ -98,7 +98,7 @@
fill: var(--deemphasized-text-color);
}
.compose-autosuggest-list-item-native-emoji {
font-family: CountryFlagEmojiPolyfill, PinaforeEmoji;
font-family: CountryFlagEmojiPolyfill, SemaphoreEmoji;
font-size: 32px;
line-height: 1;
display: flex;

View File

@ -216,7 +216,7 @@
contentWarning,
realm,
overLimit,
inReplyToUuid, // typical replies, using Pinafore-specific uuid
inReplyToUuid, // typical replies, using Semaphore-specific uuid
inReplyToId, // delete-and-redraft replies, using standard id
poll,
sensitive

View File

@ -0,0 +1,23 @@
export const STATUSES_STORE = 'statuses-v4'
export const STATUS_TIMELINES_STORE = 'status_timelines-v4'
export const META_STORE = 'meta-v4'
export const ACCOUNTS_STORE = 'accounts-v4'
export const RELATIONSHIPS_STORE = 'relationships-v4'
export const NOTIFICATIONS_STORE = 'notifications-v4'
export const NOTIFICATION_TIMELINES_STORE = 'notification_timelines-v4'
export const PINNED_STATUSES_STORE = 'pinned_statuses-v4'
export const THREADS_STORE = 'threads-v4'
export const TIMESTAMP = '__semaphore_ts'
export const ACCOUNT_ID = '__semaphore_acct_id'
export const STATUS_ID = '__semaphore_status_id'
export const REBLOG_ID = '__semaphore_reblog_id'
export const USERNAME_LOWERCASE = '__semaphore_acct_lc'
export const DB_VERSION_INITIAL = 9
export const DB_VERSION_SEARCH_ACCOUNTS = 10
export const DB_VERSION_SNOWFLAKE_IDS = 12 // 11 skipped because of mistake deployed to dev.semaphore.social
// Using an object for these so that unit tests can change them
export const DB_VERSION_CURRENT = { version: 12 }
export const CURRENT_TIME = { now: () => Date.now() }

View File

@ -8,15 +8,15 @@ export const NOTIFICATION_TIMELINES_STORE = 'notification_timelines-v4'
export const PINNED_STATUSES_STORE = 'pinned_statuses-v4'
export const THREADS_STORE = 'threads-v4'
export const TIMESTAMP = '__pinafore_ts'
export const ACCOUNT_ID = '__pinafore_acct_id'
export const STATUS_ID = '__pinafore_status_id'
export const REBLOG_ID = '__pinafore_reblog_id'
export const USERNAME_LOWERCASE = '__pinafore_acct_lc'
export const TIMESTAMP = '__semaphore_ts'
export const ACCOUNT_ID = '__semaphore_acct_id'
export const STATUS_ID = '__semaphore_status_id'
export const REBLOG_ID = '__semaphore_reblog_id'
export const USERNAME_LOWERCASE = '__semaphore_acct_lc'
export const DB_VERSION_INITIAL = 9
export const DB_VERSION_SEARCH_ACCOUNTS = 10
export const DB_VERSION_SNOWFLAKE_IDS = 12 // 11 skipped because of mistake deployed to dev.pinafore.social
export const DB_VERSION_SNOWFLAKE_IDS = 12 // 11 skipped because of mistake deployed to dev.semaphore.social
// Using an object for these so that unit tests can change them
export const DB_VERSION_CURRENT = { version: 12 }

View File

@ -1,3 +1,3 @@
// same as the one used for PinaforeEmoji
// same as the one used for SemaphoreEmoji
export const FONT_FAMILY = '"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol",' +
'"Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif'

View File

@ -69,7 +69,7 @@ export function navComputations (store) {
{
name: 'home',
href: '/',
svg: '#pinafore-logo',
svg: '#semaphore-logo',
label: 'intl.home'
},
{

View File

@ -2,7 +2,7 @@ import { timelineMixins } from './timelineMixins.js'
import { statusMixins } from './statusMixins.js'
import { autosuggestMixins } from './autosuggestMixins.js'
import { composeMixins } from './composeMixins.js'
import { PinaforeStore as Store } from '../store.js'
import { SemaphoreStore as Store } from '../store.js'
export function loggedInMixins () {
composeMixins(Store)

View File

@ -73,17 +73,17 @@ const nonPersistedState = {
const state = Object.assign({}, persistedState, nonPersistedState)
const keysToStoreInLocalStorage = new Set(Object.keys(persistedState))
export class PinaforeStore extends LocalStorageStore {
export class SemaphoreStore extends LocalStorageStore {
constructor (state) {
super(state, keysToStoreInLocalStorage)
}
}
PinaforeStore.prototype.observe = observe
SemaphoreStore.prototype.observe = observe
export const store = new PinaforeStore(state)
export const store = new SemaphoreStore(state)
mixins(PinaforeStore)
mixins(SemaphoreStore)
computations(store)
observers(store)

View File

@ -1,5 +1,5 @@
@font-face {
font-family: PinaforeRegular;
font-family: SemaphoreRegular;
src: local("BlinkMacSystemFont"),
local("Segoe UI"),
local("Roboto"),
@ -12,7 +12,7 @@
}
@font-face {
font-family: PinaforeEmoji;
font-family: SemaphoreEmoji;
src:
local("Twemoji Mozilla"),
local("Apple Color Emoji"),

View File

@ -4,7 +4,7 @@
body {
margin: 0;
font-family: system-ui, -apple-system, PinaforeRegular, sans-serif;
font-family: system-ui, -apple-system, SemaphoreRegular, sans-serif;
font-size: 14px;
line-height: 1.4;
color: var(--body-text-color);
@ -161,7 +161,7 @@ input:required, input:invalid {
}
textarea {
font-family: CountryFlagEmojiPolyfill, system-ui, -apple-system, PinaforeRegular, sans-serif, PinaforeEmoji;
font-family: CountryFlagEmojiPolyfill, system-ui, -apple-system, SemaphoreRegular, sans-serif, SemaphoreEmoji;
font-size: inherit;
box-sizing: border-box;
}
@ -205,7 +205,7 @@ textarea {
}
.inline-emoji {
font-family: CountryFlagEmojiPolyfill, PinaforeEmoji, sans-serif;
font-family: CountryFlagEmojiPolyfill, SemaphoreEmoji, sans-serif;
}
.invisible {

2144
tests/fixtures/dump.sql vendored

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,7 @@ fixture`001-basic-spec.js`
test('has the correct <h1>', async t => {
await t
.expect($('.main-content h1').innerText).eql('Pinafore')
.expect($('.main-content h1').innerText).eql('Semaphore')
})
test('navigates to about', async t => {
@ -15,7 +15,7 @@ test('navigates to about', async t => {
.expect(getUrl()).contains('/settings')
.click('a[href="/settings/about"]')
.expect(getUrl()).contains('/about')
.expect($('.main-content h1').innerText).eql('About Pinafore')
.expect($('.main-content h1').innerText).eql('About Semaphore')
})
test('navigates to /settings/instances/add', async t => {

View File

@ -39,7 +39,7 @@ test('Pressing / focuses the search input if we are already on the search page',
test('Pressing / without logging in just goes to the search page', async t => {
await t
.expect(getUrl()).eql('http://localhost:4002/')
.expect($('.main-content h1').innerText).eql('Pinafore')
.expect($('.main-content h1').innerText).eql('Semaphore')
await sleep(500) // wait for keyboard shortcuts to be active
await t
.pressKey('/')