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: postgres:
image: postgres:12.2 image: postgres:12.2
env: env:
POSTGRES_USER: pinafore POSTGRES_USER: semaphore
POSTGRES_PASSWORD: pinafore POSTGRES_PASSWORD: semaphore
POSTGRES_DB: pinafore_development POSTGRES_DB: semaphore_development
POSTGRES_HOST: 127.0.0.1 POSTGRES_HOST: 127.0.0.1
POSTGRES_PORT: 5432 POSTGRES_PORT: 5432
ports: ports:

View File

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

View File

@ -1,4 +1,4 @@
# Contributing to Pinafore # Contributing to semaphore
## Installing ## Installing
@ -20,7 +20,7 @@ because of [this issue](https://github.com/paulmillr/chokidar/issues/237).
## Linting ## Linting
Pinafore uses [JavaScript Standard Style](https://standardjs.com/). semaphore uses [JavaScript Standard Style](https://standardjs.com/).
Lint: Lint:
@ -61,7 +61,7 @@ If the script isn't able to set up the Postgres database, try running:
Then: 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 ### Testing in development mode
@ -71,7 +71,7 @@ In separate terminals:
yarn run run-mastodon yarn run run-mastodon
2\. Run a Pinafore dev server: 2\. Run a Semaphore dev server:
yarn run dev 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.: 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.semaphore.social/report.html](https://dev.semaphore.social/report.html)
- [dev.pinafore.social/stats.json](https://dev.pinafore.social/stats.json) - [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`. This is also available locally after `yarn run build` at `.sapper/client/report.html`.
## Deploying ## Deploying
This section only applies to `dev.pinafore.social` and `pinafore.social`, not if you're hosting your own version of This section only applies to `dev.semaphore.social` and `semaphore.social`, not if you're hosting your own version of
Pinafore. Semaphore.
The site uses [Vercel](https://vercel.com). The `master` branch publishes to `dev.pinafore.social` and the `production` The site uses [Vercel](https://vercel.com). The `master` branch publishes to `dev.semaphore.social` and the `production`
branch deploys to `pinafore.social`. branch deploys to `semaphore.social`.
## Architecture ## Architecture

View File

@ -6,7 +6,7 @@ FROM node:16-alpine
WORKDIR /app WORKDIR /app
COPY . /app COPY . /app
# Install Pinafore # Install Semaphore
RUN yarn --production --pure-lockfile && \ RUN yarn --production --pure-lockfile && \
yarn build && \ yarn build && \
yarn cache clean && \ 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. 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. 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 ## Browser support
Pinafore supports the latest versions of the following browsers: Semaphore supports the latest versions of the following browsers:
- Chrome - Chrome
- Edge - Edge
@ -69,9 +58,9 @@ Compatible versions of each (Opera, Brave, Samsung, etc.) should be fine.
## Building ## 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 yarn --production --pure-lockfile
@ -90,7 +79,7 @@ To build a Docker image for production:
docker build . docker build .
docker run -d -p 4002:4002 [your-image] docker run -d -p 4002:4002 [your-image]
Now Pinafore is running at `localhost:4002`. Now Semaphore is running at `localhost:4002`.
### docker-compose ### docker-compose
@ -102,13 +91,13 @@ The image will build and start, then detach from the terminal running at `localh
### Updating ### 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) git checkout $(git tag -l | sort -Vr | head -n 1)
### Exporting ### 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`. 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 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) - [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) - 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 ## Developing and testing
See [CONTRIBUTING.md](https://github.com/nolanlawson/pinafore/blob/master/CONTRIBUTING.md) for See [CONTRIBUTING.md](https://github.com/nolanlawson/semaphore/blob/master/CONTRIBUTING.md) for
how to run Pinafore in dev mode and run tests. how to run Semaphore in dev mode and run tests.
## Changelog ## 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? ## 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. 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.
</summary>

View File

@ -3,6 +3,6 @@
set -x set -x
set -e 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 cd mastodon/public/system
tar -czf ../../../tests/fixtures/system.tgz . tar -czf ../../../tests/fixtures/system.tgz .

View File

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

View File

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

View File

@ -1,5 +1,5 @@
export default [ 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-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', 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' }, { id: 'fa-bell-o', src: 'src/thirdparty/font-awesome-svg-png/white/svg/bell-o.svg' },

View File

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

View File

@ -1,14 +1,14 @@
Admin Guide 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 ```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 myinstance.com/api/v1/instance
``` ```
@ -18,12 +18,12 @@ If you see this in the output:
Access-Control-Allow-Origin: * 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 ## 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. are some quirks, which are described below. This list of quirks is non-exhaustive.
## Why Svelte v2 / Sapper ? ## 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 ## 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. 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 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" ## Every Sapper page is "duplicated"

View File

@ -1,6 +1,6 @@
# Internationalization # 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. 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). (which already comes with English built-in).
Note that internationalization is currently experimental. Client-side locale switching is not supported when you build 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 LOCALE=fr yarn build
@ -16,4 +16,4 @@ or
LOCALE=fr yarn dev 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 ## 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 First, create a file `scss/themes/foobar.scss`, write some SCSS inside and add
the following at the bottom of `scss/themes/foobar.scss`. 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) * [Home page](#home-page)
* [Community page](#community-page) * [Community page](#community-page)

View File

@ -1,5 +1,5 @@
{ {
"name": "pinafore", "name": "semaphore",
"description": "Alternative web client for Mastodon", "description": "Alternative web client for Mastodon",
"version": "2.6.0", "version": "2.6.0",
"type": "module", "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="/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="/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 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 --> <!-- inline CSS -->

View File

@ -1,10 +1,10 @@
export default { export default {
// Home page, basic <title> and <description> // 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.', appDescription: 'Ein alternativer Web Client für Mastodon, der auf Geschwindigkeit und einfache Bedienung ausgelegt ist.',
homeDescription: ` homeDescription: `
<p> <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>, <a rel="noopener" target="_blank" href="https://joinmastodon.org">Mastodon</a>,
der für Geschwindigkeit und einfache Bedienung konzipiert wurde. der für Geschwindigkeit und einfache Bedienung konzipiert wurde.
</p> </p>
@ -17,7 +17,7 @@ export default {
logIn: 'Anmelden', logIn: 'Anmelden',
footer: ` footer: `
<p> <p>
Pinafore ist Semaphore ist
<a rel="noopener" target="_blank" href="https://github.com/semaphore-social/semaphore">quelloffene Software</a>, <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> erstellt von <a rel="noopener" target="_blank" href="https://nolanlawson.com">Nolan Lawson</a>
und verteilt unter der und verteilt unter der
@ -174,7 +174,7 @@ export default {
· ·
{showInstanceName, select, {showInstanceName, select,
true {{instanceName}} true {{instanceName}}
other {Pinafore} other {Semaphore}
} }
`, `,
pinLabel: `{label} {pinnable, select, pinLabel: `{label} {pinnable, select,
@ -315,10 +315,10 @@ export default {
profilePageForAccount: 'Profilseite für {account}', profilePageForAccount: 'Profilseite für {account}',
// About page // About page
about: 'Über', about: 'Über',
aboutApp: 'Über Pinafore', aboutApp: 'Über Semaphore',
aboutAppDescription: ` aboutAppDescription: `
<p> <p>
Pinafore ist Semaphore ist
<a rel="noopener" target="_blank" <a rel="noopener" target="_blank"
href="https://github.com/semaphore-social/semaphore">freie und quelloffene Software</a> href="https://github.com/semaphore-social/semaphore">freie und quelloffene Software</a>
erstellt von erstellt von
@ -331,13 +331,13 @@ export default {
<h2 id="privacy-policy">Datenschutzerklärung</h2> <h2 id="privacy-policy">Datenschutzerklärung</h2>
<p> <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, einschließlich, aber nicht beschränkt auf, Namen, E-Mail-Adressen,
IP-Adressen, Beiträgen, und Fotos. IP-Adressen, Beiträgen, und Fotos.
</p> </p>
<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> </p>
<h2>Mitwirkende</h2> <h2>Mitwirkende</h2>
@ -406,7 +406,7 @@ export default {
notificationFilters: 'Filter für Benachrichtigungen', notificationFilters: 'Filter für Benachrichtigungen',
pushNotifications: 'Push-Benachrichtigungen', pushNotifications: 'Push-Benachrichtigungen',
// Add instance page // 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.', javaScriptError: 'Du musst zum Einloggen javaScript einschalten.',
enterInstanceName: 'Namen der Instanz eingeben', enterInstanceName: 'Namen der Instanz eingeben',
instanceColon: 'Instanz:', instanceColon: 'Instanz:',
@ -426,7 +426,7 @@ export default {
// Link text // Link text
logInToAnInstancePre: '', logInToAnInstancePre: '',
logInToAnInstanceText: 'Melde Dich bei einer Instanz an', logInToAnInstanceText: 'Melde Dich bei einer Instanz an',
logInToAnInstancePost: 'um Pinafore zu verwenden.', logInToAnInstancePost: 'um Semaphore zu verwenden.',
// Another custom tooltip // Another custom tooltip
showRingPre: 'Immer einen', showRingPre: 'Immer einen',
showRingText: 'Fokusring', showRingText: 'Fokusring',

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,7 +2,7 @@
<FreeTextLayout> <FreeTextLayout>
<div class="not-logged-in-home"> <div class="not-logged-in-home">
<div class="banner"> <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> <h1>{intl.appName}</h1>
</div> </div>
<div> <div>

View File

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

View File

@ -216,7 +216,7 @@
contentWarning, contentWarning,
realm, realm,
overLimit, overLimit,
inReplyToUuid, // typical replies, using Pinafore-specific uuid inReplyToUuid, // typical replies, using Semaphore-specific uuid
inReplyToId, // delete-and-redraft replies, using standard id inReplyToId, // delete-and-redraft replies, using standard id
poll, poll,
sensitive 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 PINNED_STATUSES_STORE = 'pinned_statuses-v4'
export const THREADS_STORE = 'threads-v4' export const THREADS_STORE = 'threads-v4'
export const TIMESTAMP = '__pinafore_ts' export const TIMESTAMP = '__semaphore_ts'
export const ACCOUNT_ID = '__pinafore_acct_id' export const ACCOUNT_ID = '__semaphore_acct_id'
export const STATUS_ID = '__pinafore_status_id' export const STATUS_ID = '__semaphore_status_id'
export const REBLOG_ID = '__pinafore_reblog_id' export const REBLOG_ID = '__semaphore_reblog_id'
export const USERNAME_LOWERCASE = '__pinafore_acct_lc' export const USERNAME_LOWERCASE = '__semaphore_acct_lc'
export const DB_VERSION_INITIAL = 9 export const DB_VERSION_INITIAL = 9
export const DB_VERSION_SEARCH_ACCOUNTS = 10 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 // Using an object for these so that unit tests can change them
export const DB_VERSION_CURRENT = { version: 12 } 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",' + export const FONT_FAMILY = '"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol",' +
'"Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif' '"Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif'

View File

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

View File

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

View File

@ -73,17 +73,17 @@ const nonPersistedState = {
const state = Object.assign({}, persistedState, nonPersistedState) const state = Object.assign({}, persistedState, nonPersistedState)
const keysToStoreInLocalStorage = new Set(Object.keys(persistedState)) const keysToStoreInLocalStorage = new Set(Object.keys(persistedState))
export class PinaforeStore extends LocalStorageStore { export class SemaphoreStore extends LocalStorageStore {
constructor (state) { constructor (state) {
super(state, keysToStoreInLocalStorage) 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) computations(store)
observers(store) observers(store)

View File

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

View File

@ -4,7 +4,7 @@
body { body {
margin: 0; margin: 0;
font-family: system-ui, -apple-system, PinaforeRegular, sans-serif; font-family: system-ui, -apple-system, SemaphoreRegular, sans-serif;
font-size: 14px; font-size: 14px;
line-height: 1.4; line-height: 1.4;
color: var(--body-text-color); color: var(--body-text-color);
@ -161,7 +161,7 @@ input:required, input:invalid {
} }
textarea { 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; font-size: inherit;
box-sizing: border-box; box-sizing: border-box;
} }
@ -205,7 +205,7 @@ textarea {
} }
.inline-emoji { .inline-emoji {
font-family: CountryFlagEmojiPolyfill, PinaforeEmoji, sans-serif; font-family: CountryFlagEmojiPolyfill, SemaphoreEmoji, sans-serif;
} }
.invisible { .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 => { test('has the correct <h1>', async t => {
await t await t
.expect($('.main-content h1').innerText).eql('Pinafore') .expect($('.main-content h1').innerText).eql('Semaphore')
}) })
test('navigates to about', async t => { test('navigates to about', async t => {
@ -15,7 +15,7 @@ test('navigates to about', async t => {
.expect(getUrl()).contains('/settings') .expect(getUrl()).contains('/settings')
.click('a[href="/settings/about"]') .click('a[href="/settings/about"]')
.expect(getUrl()).contains('/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 => { 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 => { test('Pressing / without logging in just goes to the search page', async t => {
await t await t
.expect(getUrl()).eql('http://localhost:4002/') .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 sleep(500) // wait for keyboard shortcuts to be active
await t await t
.pressKey('/') .pressKey('/')