Move from toot to post

This commit is contained in:
Nick Colley 2023-03-12 16:45:41 +00:00
parent a7eaec3391
commit 1d48a247c5
12 changed files with 59 additions and 59 deletions

View File

@ -8,15 +8,15 @@ This will walk you through the basic usage of Semaphore and its major difference
## Home page ## Home page
The home page is both where you write toots and where you read your home timeline: The home page is both where you write posts and where you read your home timeline:
![Screenshot of home page](https://github.com/NickColley/semaphore/blob/main/docs/Screenshot1.png) ![Screenshot of home page](https://github.com/NickColley/semaphore/blob/main/docs/Screenshot1.png)
When you scroll down, the "toot" button transforms into a "compose" button: When you scroll down, the "post" button transforms into a "compose" button:
![Screenshot showing home page scrolled down](https://github.com/NickColley/semaphore/blob/main/docs/Screenshot2.png) ![Screenshot showing home page scrolled down](https://github.com/NickColley/semaphore/blob/main/docs/Screenshot2.png)
If you press this compose button, you can toot anywhere in your home timeline. If you press this compose button, you can post anywhere in your home timeline.
![Screenshot showing compose box in a modal dialog](https://github.com/NickColley/semaphore/blob/main/docs/Screenshot3.png) ![Screenshot showing compose box in a modal dialog](https://github.com/NickColley/semaphore/blob/main/docs/Screenshot3.png)

View File

@ -187,7 +187,7 @@ export default {
pinPage: 'Hefte {label} an', pinPage: 'Hefte {label} an',
// Status composition // Status composition
composeStatus: 'Tröt erstellen', composeStatus: 'Tröt erstellen',
postStatus: 'Tröt!', postStatus: 'Post',
contentWarning: 'Inhaltswarnung', contentWarning: 'Inhaltswarnung',
dropToUpload: 'Fallenlassen zum Hochladen', dropToUpload: 'Fallenlassen zum Hochladen',
invalidFileType: 'Ungültiger Dateityp', invalidFileType: 'Ungültiger Dateityp',

View File

@ -27,7 +27,7 @@ export default {
`, `,
// Manifest // Manifest
longAppName: 'Semaphore for Mastodon', longAppName: 'Semaphore for Mastodon',
newStatus: 'New toot', newStatus: 'New post',
// Generic UI // Generic UI
loading: 'Loading', loading: 'Loading',
okay: 'OK', okay: 'OK',
@ -66,7 +66,7 @@ export default {
local: 'Local', local: 'Local',
notifications: 'Notifications', notifications: 'Notifications',
mutedUsers: 'Muted users', mutedUsers: 'Muted users',
pinnedStatuses: 'Pinned toots', pinnedStatuses: 'Pinned posts',
followRequests: 'Follow requests', followRequests: 'Follow requests',
followRequestsLabel: `Follow requests {hasFollowRequests, select, followRequestsLabel: `Follow requests {hasFollowRequests, select,
true {({count})} true {({count})}
@ -102,7 +102,7 @@ export default {
listNotLoggedIn: 'A list will appear here when logged in.', listNotLoggedIn: 'A list will appear here when logged in.',
notificationsNotLoggedIn: 'Your notifications will appear here when logged in.', notificationsNotLoggedIn: 'Your notifications will appear here when logged in.',
notificationMentionsNotLoggedIn: 'Your notification mentions will appear here when logged in.', notificationMentionsNotLoggedIn: 'Your notification mentions will appear here when logged in.',
statusNotLoggedIn: 'A toot thread will appear here when logged in.', statusNotLoggedIn: 'A post thread will appear here when logged in.',
tagNotLoggedIn: 'A hashtag timeline will appear here when logged in.', tagNotLoggedIn: 'A hashtag timeline will appear here when logged in.',
// Notification subpages // Notification subpages
filters: 'Filters', filters: 'Filters',
@ -132,7 +132,7 @@ export default {
} }
to switch columns to switch columns
</li> </li>
<li><kbd>7</kbd> or <kbd>c</kbd> to compose a new toot</li> <li><kbd>7</kbd> or <kbd>c</kbd> to compose a new post</li>
<li><kbd>s</kbd> or <kbd>/</kbd> to search</li> <li><kbd>s</kbd> or <kbd>/</kbd> to search</li>
<li><kbd>g</kbd> + <kbd>h</kbd> to go home</li> <li><kbd>g</kbd> + <kbd>h</kbd> to go home</li>
<li><kbd>g</kbd> + <kbd>n</kbd> to go to notifications</li> <li><kbd>g</kbd> + <kbd>n</kbd> to go to notifications</li>
@ -144,8 +144,8 @@ export default {
<li><kbd>Backspace</kbd> to go back, close dialogs</li> <li><kbd>Backspace</kbd> to go back, close dialogs</li>
`, `,
timelineHotkeys: ` timelineHotkeys: `
<li><kbd>j</kbd> or <kbd></kbd> to activate the next toot</li> <li><kbd>j</kbd> or <kbd></kbd> to activate the next post</li>
<li><kbd>k</kbd> or <kbd></kbd> to activate the previous toot</li> <li><kbd>k</kbd> or <kbd></kbd> to activate the previous post</li>
<li><kbd>.</kbd> to show more and scroll to top</li> <li><kbd>.</kbd> to show more and scroll to top</li>
<li><kbd>o</kbd> to open</li> <li><kbd>o</kbd> to open</li>
<li><kbd>f</kbd> to favorite</li> <li><kbd>f</kbd> to favorite</li>
@ -192,8 +192,8 @@ export default {
}`, }`,
pinPage: 'Pin {label}', pinPage: 'Pin {label}',
// Status composition // Status composition
composeStatus: 'Compose toot', composeStatus: 'Compose post',
postStatus: 'Toot!', postStatus: 'Post',
contentWarning: 'Content warning', contentWarning: 'Content warning',
dropToUpload: 'Drop to upload', dropToUpload: 'Drop to upload',
invalidFileType: 'Invalid file type', invalidFileType: 'Invalid file type',
@ -275,25 +275,25 @@ export default {
additionalComments: 'Additional comments', additionalComments: 'Additional comments',
forwardDescription: 'Forward to the moderators of {instance} as well?', forwardDescription: 'Forward to the moderators of {instance} as well?',
forwardLabel: 'Forward to {instance}', forwardLabel: 'Forward to {instance}',
unableToLoadStatuses: 'Unable to load recent toots: {error}', unableToLoadStatuses: 'Unable to load recent posts: {error}',
report: 'Report', report: 'Report',
noContent: '(No content)', noContent: '(No content)',
noStatuses: 'No toots to report', noStatuses: 'No posts to report',
// Status options // Status options
unpinFromProfile: 'Unpin from profile', unpinFromProfile: 'Unpin from profile',
pinToProfile: 'Pin to profile', pinToProfile: 'Pin to profile',
muteConversation: 'Mute conversation', muteConversation: 'Mute conversation',
unmuteConversation: 'Unmute conversation', unmuteConversation: 'Unmute conversation',
bookmarkStatus: 'Bookmark toot', bookmarkStatus: 'Bookmark post',
unbookmarkStatus: 'Unbookmark toot', unbookmarkStatus: 'Unbookmark post',
deleteAndRedraft: 'Delete and redraft', deleteAndRedraft: 'Delete and redraft',
reportStatus: 'Report toot', reportStatus: 'Report post',
shareStatus: 'Share toot', shareStatus: 'Share post',
copyLinkToStatus: 'Copy link to toot', copyLinkToStatus: 'Copy link to post',
// Account profile // Account profile
profileForAccount: 'Profile for {account}', profileForAccount: 'Profile for {account}',
statisticsAndMoreOptions: 'Stats and more options', statisticsAndMoreOptions: 'Stats and more options',
statuses: 'Toots', statuses: 'posts',
follows: 'Follows', follows: 'Follows',
followers: 'Followers', followers: 'Followers',
moreOptions: 'More options', moreOptions: 'More options',
@ -373,10 +373,10 @@ export default {
largeMedia: 'Show large inline images and videos', largeMedia: 'Show large inline images and videos',
autoplayGifs: 'Autoplay animated GIFs', autoplayGifs: 'Autoplay animated GIFs',
hideCards: 'Hide link preview cards', hideCards: 'Hide link preview cards',
underlineLinks: 'Underline links in toots and profiles', underlineLinks: 'Underline links in posts and profiles',
accessibility: 'Accessibility', accessibility: 'Accessibility',
reduceMotion: 'Reduce motion in UI animations', reduceMotion: 'Reduce motion in UI animations',
disableTappable: 'Disable tappable area on entire toot', disableTappable: 'Disable tappable area on entire post',
removeEmoji: 'Remove emoji from user display names', removeEmoji: 'Remove emoji from user display names',
shortAria: 'Use short article ARIA labels', shortAria: 'Use short article ARIA labels',
theme: 'Theme', theme: 'Theme',
@ -416,7 +416,7 @@ export default {
// to see a description. It's hard to properly internationalize, so we just break up the strings. // to see a description. It's hard to properly internationalize, so we just break up the strings.
disableInfiniteScrollPre: 'Disable', disableInfiniteScrollPre: 'Disable',
disableInfiniteScrollText: 'infinite scroll', disableInfiniteScrollText: 'infinite scroll',
disableInfiniteScrollDescription: `When infinite scroll is disabled, new toots will not automatically appear at disableInfiniteScrollDescription: `When infinite scroll is disabled, new posts will not automatically appear at
the bottom or top of the timeline. Instead, buttons will allow you to the bottom or top of the timeline. Instead, buttons will allow you to
load more content on demand.`, load more content on demand.`,
disableInfiniteScrollPost: '', disableInfiniteScrollPost: '',
@ -475,7 +475,7 @@ export default {
newFollowers: 'New followers', newFollowers: 'New followers',
reblogs: 'Boosts', reblogs: 'Boosts',
pollResults: 'Poll results', pollResults: 'Poll results',
subscriptions: 'Subscribed toots', subscriptions: 'Subscribed posts',
needToReauthenticate: 'You need to reauthenticate in order to enable push notification. Log out of {instance}?', needToReauthenticate: 'You need to reauthenticate in order to enable push notification. Log out of {instance}?',
failedToUpdatePush: 'Failed to update push notification settings: {error}', failedToUpdatePush: 'Failed to update push notification settings: {error}',
// Themes // Themes
@ -509,11 +509,11 @@ export default {
one {1 time} one {1 time}
other {{count} times} other {{count} times}
}`, }`,
pinnedStatus: 'Pinned toot', pinnedStatus: 'Pinned post',
rebloggedYou: 'boosted your toot', rebloggedYou: 'boosted your post',
favoritedYou: 'favorited your toot', favoritedYou: 'favorited your post',
followedYou: 'followed you', followedYou: 'followed you',
edited: 'edited their toot', edited: 'edited their post',
requestedFollow: 'requested to follow you', requestedFollow: 'requested to follow you',
reported: 'filed a report', reported: 'filed a report',
signedUp: 'signed up', signedUp: 'signed up',
@ -529,14 +529,14 @@ export default {
clickToShowSensitive: 'Sensitive content. Click to show.', clickToShowSensitive: 'Sensitive content. Click to show.',
longPost: 'Long post', longPost: 'Long post',
// Accessible status labels // Accessible status labels
accountRebloggedYou: '{account} boosted your toot', accountRebloggedYou: '{account} boosted your post',
accountFavoritedYou: '{account} favorited your toot', accountFavoritedYou: '{account} favorited your post',
accountEdited: '{account} edited their toot', accountEdited: '{account} edited their post',
rebloggedByAccount: 'Boosted by {account}', rebloggedByAccount: 'Boosted by {account}',
contentWarningContent: 'Content warning: {spoiler}', contentWarningContent: 'Content warning: {spoiler}',
hasMedia: 'has media', hasMedia: 'has media',
hasPoll: 'has poll', hasPoll: 'has poll',
shortStatusLabel: '{privacy} toot by {account}', shortStatusLabel: '{privacy} post by {account}',
// Privacy types // Privacy types
public: 'Public', public: 'Public',
unlisted: 'Unlisted', unlisted: 'Unlisted',
@ -590,21 +590,21 @@ export default {
showCountMore: 'Show {count} more', showCountMore: 'Show {count} more',
nothingToShow: 'Nothing to show.', nothingToShow: 'Nothing to show.',
// status thread page // status thread page
statusThreadPage: 'Toot thread page', statusThreadPage: 'post thread page',
status: 'Toot', status: 'post',
// toast messages // toast messages
blockedAccount: 'Blocked account', blockedAccount: 'Blocked account',
unblockedAccount: 'Unblocked account', unblockedAccount: 'Unblocked account',
unableToBlock: 'Unable to block account: {error}', unableToBlock: 'Unable to block account: {error}',
unableToUnblock: 'Unable to unblock account: {error}', unableToUnblock: 'Unable to unblock account: {error}',
bookmarkedStatus: 'Bookmarked toot', bookmarkedStatus: 'Bookmarked post',
unbookmarkedStatus: 'Unbookmarked toot', unbookmarkedStatus: 'Unbookmarked post',
unableToBookmark: 'Unable to bookmark: {error}', unableToBookmark: 'Unable to bookmark: {error}',
unableToUnbookmark: 'Unable to unbookmark: {error}', unableToUnbookmark: 'Unable to unbookmark: {error}',
cannotPostOffline: 'You cannot post while offline', cannotPostOffline: 'You cannot post while offline',
unableToPost: 'Unable to post toot: {error}', unableToPost: 'Unable to post post: {error}',
statusDeleted: 'Toot deleted', statusDeleted: 'post deleted',
unableToDelete: 'Unable to delete toot: {error}', unableToDelete: 'Unable to delete post: {error}',
cannotFavoriteOffline: 'You cannot favorite while offline', cannotFavoriteOffline: 'You cannot favorite while offline',
cannotUnfavoriteOffline: 'You cannot unfavorite while offline', cannotUnfavoriteOffline: 'You cannot unfavorite while offline',
unableToFavorite: 'Unable to favorite: {error}', unableToFavorite: 'Unable to favorite: {error}',
@ -624,9 +624,9 @@ export default {
unmutedConversation: 'Unmuted conversation', unmutedConversation: 'Unmuted conversation',
unableToMuteConversation: 'Unable to mute conversation: {error}', unableToMuteConversation: 'Unable to mute conversation: {error}',
unableToUnmuteConversation: 'Unable to unmute conversation: {error}', unableToUnmuteConversation: 'Unable to unmute conversation: {error}',
unpinnedStatus: 'Unpinned toot', unpinnedStatus: 'Unpinned post',
unableToPinStatus: 'Unable to pin toot: {error}', unableToPinStatus: 'Unable to pin post: {error}',
unableToUnpinStatus: 'Unable to unpin toot: {error}', unableToUnpinStatus: 'Unable to unpin post: {error}',
unableToRefreshPoll: 'Unable to refresh poll: {error}', unableToRefreshPoll: 'Unable to refresh poll: {error}',
unableToVoteInPoll: 'Unable to vote in poll: {error}', unableToVoteInPoll: 'Unable to vote in poll: {error}',
cannotReblogOffline: 'You cannot boost while offline.', cannotReblogOffline: 'You cannot boost while offline.',
@ -652,7 +652,7 @@ export default {
unableToSubscribe: 'Unable to subscribe: {error}', unableToSubscribe: 'Unable to subscribe: {error}',
unableToUnsubscribe: 'Unable to unsubscribe: {error}', unableToUnsubscribe: 'Unable to unsubscribe: {error}',
showingOfflineContent: 'Internet request failed. Showing offline content.', showingOfflineContent: 'Internet request failed. Showing offline content.',
youAreOffline: 'You seem to be offline. You can still read toots while offline.', youAreOffline: 'You seem to be offline. You can still read posts while offline.',
// Snackbar UI // Snackbar UI
updateAvailable: 'App update available.', updateAvailable: 'App update available.',
// Word/phrase filters // Word/phrase filters

View File

@ -193,7 +193,7 @@ export default {
pinPage: 'Закрепить {label}', pinPage: 'Закрепить {label}',
// Status composition // Status composition
composeStatus: 'Создать запись', composeStatus: 'Создать запись',
postStatus: 'Опубликовать!', postStatus2: 'Опубликовать!',
contentWarning: 'Предупреждение о содержимом', contentWarning: 'Предупреждение о содержимом',
dropToUpload: 'Перетащите для загрузки', dropToUpload: 'Перетащите для загрузки',
invalidFileType: 'Неверный тип файла', invalidFileType: 'Неверный тип файла',

View File

@ -6,7 +6,7 @@ import { tryToFocusElement } from '../_utils/tryToFocusElement.js'
export function showMoreAndScrollToTop () { export function showMoreAndScrollToTop () {
// Similar to Twitter, pressing "." will click the "show more" button and select // Similar to Twitter, pressing "." will click the "show more" button and select
// the first toot. // the first post.
showMoreItemsForCurrentTimeline() showMoreItemsForCurrentTimeline()
const { const {
currentInstance, currentInstance,

View File

@ -200,7 +200,7 @@
} }
// The reason we add a scheduleIdleTask delay here is because we also use scheduleIdleTask // The reason we add a scheduleIdleTask delay here is because we also use scheduleIdleTask
// in ComposeInput.html to debounce the input events. If the user is very fast at typing // in ComposeInput.html to debounce the input events. If the user is very fast at typing
// at their keyboard and quickly presses Ctrl+Enter or the "Toot" button then there could // at their keyboard and quickly presses Ctrl+Enter or the "Post" button then there could
// be a race condition where not all of their status is posted. // be a race condition where not all of their status is posted.
this.set({ aboutToPostStatus: true }) this.set({ aboutToPostStatus: true })
scheduleIdleTask(() => { scheduleIdleTask(() => {

View File

@ -108,7 +108,7 @@
textarea.selectionStart = textarea.selectionEnd = newSelectionStart textarea.selectionStart = textarea.selectionEnd = newSelectionStart
} }
// this next autosize is required to resize after // this next autosize is required to resize after
// the user clicks the "toot" button // the user clicks the "post" button
mark('autosize.update()') mark('autosize.update()')
autosize.update(textarea) autosize.update(textarea)
stop('autosize.update()') stop('autosize.update()')
@ -173,7 +173,7 @@
}, },
onKeydown (e) { onKeydown (e) {
const { keyCode } = e const { keyCode } = e
// ctrl or cmd (on macs) was pressed; ctrl-enter means post a toot // ctrl or cmd (on macs) was pressed; ctrl-enter means create a post
const ctrlPressed = e.getModifierState('Control') || e.getModifierState('Meta') const ctrlPressed = e.getModifierState('Control') || e.getModifierState('Meta')
switch (keyCode) { switch (keyCode) {
case 9: { // tab case 9: { // tab

View File

@ -63,7 +63,7 @@
// so we should launch a new compose dialog // so we should launch a new compose dialog
this.showDialog() this.showDialog()
} else { } else {
// else we're actually posting a new toot, let our parent know // else we're actually posting a new post, let our parent know
this.fire('postAction') this.fire('postAction')
} }
}, },

View File

@ -18,12 +18,12 @@
[ [
{ {
name: '', name: '',
label: 'Toots', label: 'Posts',
href: `/accounts/${account.id}` href: `/accounts/${account.id}`
}, },
{ {
name: 'with_replies', name: 'with_replies',
label: 'Toots and replies', label: 'Posts and replies',
href: `/accounts/${account.id}/with_replies` href: `/accounts/${account.id}/with_replies`
}, },
{ {

View File

@ -119,8 +119,8 @@
if (!activeElement) { if (!activeElement) {
return null return null
} }
// The user might be focused on an element inside a toot. We want to // The user might be focused on an element inside a post. We want to
// move relative to that toot. // move relative to that post.
const activeArticle = activeElement.closest('article') const activeArticle = activeElement.closest('article')
if (!activeArticle) { if (!activeArticle) {
return null return null

View File

@ -220,7 +220,7 @@
sensitivesShown[uuid] = !sensitivesShown[uuid] sensitivesShown[uuid] = !sensitivesShown[uuid]
this.store.set({ sensitivesShown }) this.store.set({ sensitivesShown })
this.fire('recalculateHeight') this.fire('recalculateHeight')
// Only change focus for clicks, not for hotkeys. It's weird if, when the entire toot // Only change focus for clicks, not for hotkeys. It's weird if, when the entire post
// is focused and you press "y", that the focus changes to the sensitive media button. // is focused and you press "y", that the focus changes to the sensitive media button.
if (changeFocus) { if (changeFocus) {
requestAnimationFrame(() => { requestAnimationFrame(() => {

View File

@ -1,10 +1,10 @@
<DynamicPageBanner title="{intl.pinnedStatuses}" icon="#fa-thumb-tack" /> <DynamicPageBanner title="{intl.pinnedStatuses}" icon="#fa-thumb-tack" />
{#if $isUserLoggedIn } {#if $isUserLoggedIn }
<div class="pinned-toots-page"> <div class="pinned-posts-page">
{#if loading} {#if loading}
<LoadingPage /> <LoadingPage />
{:elseif statuses && statuses.length} {:elseif statuses && statuses.length}
<ul class="pinned-toots-results"> <ul class="pinned-posts-results">
{#each statuses as status, index} {#each statuses as status, index}
<StatusSearchResult {status} {index} length={statuses.length} /> <StatusSearchResult {status} {index} length={statuses.length} />
{/each} {/each}
@ -13,18 +13,18 @@
</div> </div>
{/if} {/if}
<style> <style>
.pinned-toots-page { .pinned-posts-page {
padding: 20px 20px; padding: 20px 20px;
position: relative; position: relative;
} }
.pinned-toots-results { .pinned-posts-results {
list-style: none; list-style: none;
box-sizing: border-box; box-sizing: border-box;
border: 1px solid var(--main-border); border: 1px solid var(--main-border);
border-radius: 2px; border-radius: 2px;
} }
@media (max-width: 767px) { @media (max-width: 767px) {
.pinned-toots-page { .pinned-posts-page {
padding: 20px 10px; padding: 20px 10px;
} }
} }