diff --git a/src/components/sidebar-menu.tsx b/src/components/sidebar-menu.tsx index 6028241d5..817cdd1c7 100644 --- a/src/components/sidebar-menu.tsx +++ b/src/components/sidebar-menu.tsx @@ -280,15 +280,6 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { text={features.federating ? instance.domain : } onClick={onClose} /> - - {features.federating && ( - } - onClick={onClose} - /> - )} } diff --git a/src/components/sidebar-navigation.tsx b/src/components/sidebar-navigation.tsx index 932a22b6f..fb3ee7dbf 100644 --- a/src/components/sidebar-navigation.tsx +++ b/src/components/sidebar-navigation.tsx @@ -6,6 +6,7 @@ import userFilledIcon from '@tabler/icons/filled/user.svg'; import atIcon from '@tabler/icons/outline/at.svg'; import bellIcon from '@tabler/icons/outline/bell.svg'; import bookmarkIcon from '@tabler/icons/outline/bookmark.svg'; +import compassIcon from '@tabler/icons/outline/brand-safari.svg'; import calendarEventIcon from '@tabler/icons/outline/calendar-event.svg'; import circlesIcon from '@tabler/icons/outline/circles.svg'; import codeIcon from '@tabler/icons/outline/code.svg'; @@ -15,7 +16,6 @@ import homeIcon from '@tabler/icons/outline/home.svg'; import listIcon from '@tabler/icons/outline/list.svg'; import mailIcon from '@tabler/icons/outline/mail.svg'; import messagesIcon from '@tabler/icons/outline/messages.svg'; -import rocketIcon from '@tabler/icons/outline/rocket.svg'; import settingsIcon from '@tabler/icons/outline/settings.svg'; import userPlusIcon from '@tabler/icons/outline/user-plus.svg'; import userIcon from '@tabler/icons/outline/user.svg'; @@ -162,8 +162,8 @@ const SidebarNavigation = () => { /> } /> @@ -223,14 +223,6 @@ const SidebarNavigation = () => { text={features.federating ? instance.domain : } /> )} - - {(features.federating && (account || !restrictUnauth.timelines.federated)) && ( - } - /> - )} )} diff --git a/src/components/thumb-navigation.tsx b/src/components/thumb-navigation.tsx index 9a335a874..36ef538b3 100644 --- a/src/components/thumb-navigation.tsx +++ b/src/components/thumb-navigation.tsx @@ -3,12 +3,12 @@ import circlesFilledIcon from '@tabler/icons/filled/circles.svg'; import homeFilledIcon from '@tabler/icons/filled/home.svg'; import mailFilledIcon from '@tabler/icons/filled/mail.svg'; import bellIcon from '@tabler/icons/outline/bell.svg'; +import compassIcon from '@tabler/icons/outline/brand-safari.svg'; import circlesIcon from '@tabler/icons/outline/circles.svg'; import dashboardIcon from '@tabler/icons/outline/dashboard.svg'; import homeIcon from '@tabler/icons/outline/home.svg'; import mailIcon from '@tabler/icons/outline/mail.svg'; import messagesIcon from '@tabler/icons/outline/messages.svg'; -import rocketIcon from '@tabler/icons/outline/rocket.svg'; import { FormattedMessage } from 'react-intl'; import ThumbNavigationLink from 'soapbox/components/thumb-navigation-link.tsx'; @@ -84,9 +84,9 @@ const ThumbNavigation: React.FC = (): JSX.Element => { )} } - to='/search' + to='/explorer' exact /> diff --git a/src/components/ui/explorer-tabs.tsx b/src/components/ui/explorer-tabs.tsx new file mode 100644 index 000000000..6f34e48da --- /dev/null +++ b/src/components/ui/explorer-tabs.tsx @@ -0,0 +1,91 @@ +import clsx from 'clsx'; +import { useState } from 'react'; + +import HStack from 'soapbox/components/ui/hstack.tsx'; +import SvgIcon from 'soapbox/components/ui/svg-icon.tsx'; +import Text from 'soapbox/components/ui/text.tsx'; +import Search from 'soapbox/features/compose/components/search.tsx'; +import { useIsMobile } from 'soapbox/hooks/useIsMobile.ts'; + +interface TabItem { + name: string; + label: string; + action: () => void; + icon: string; +} + +interface TabsProps { + items: TabItem[]; + activeItem?: string; +} + +/** + * + */ +const ExplorerTabs: React.FC = ({ items, activeItem }) => { + const [activeTab, setActiveTab] = useState(activeItem || items[0].name); + const [lastSelected, setLastSelected] = useState(''); + const isMobile = useIsMobile(); + + const handleTabClick = (name: string) => { + setLastSelected(activeTab); + setActiveTab(name); + const activeItem = items.find(item => item.name === name); + if (activeItem && typeof activeItem.action === 'function') { + activeItem.action(); + } + }; + + return ( + + {/* Header */} + + {items.map(({ name, label, icon }) => { + const isSelected = activeTab === name; + const shouldKeepBg = lastSelected === name && activeTab === 'search'; + + return ( + + {name === 'search' && isSelected ? ( + + ) : ( + handleTabClick(name)} + /* eslint-disable-next-line tailwindcss/no-custom-classname */ + className={clsx( + 'group cursor-pointer rounded-full px-5 py-3 text-sm font-medium transition-all duration-300', + isSelected || shouldKeepBg + ? 'border-gray-500 bg-gray-500 text-white shadow-md dark:border-gray-700 dark:bg-gray-700' + : 'dark:hover:bg-gray-800/200 text-gray-500 hover:bg-gray-400/60 hover:!text-white', + { '!p-2': shouldKeepBg }, + )} + > + + {(activeTab !== 'search' || isSelected) && + (isMobile ? isSelected : !isMobile) && ( + + {label} + + )} + + )} + + ); + })} + + + ); +}; + +export default ExplorerTabs; \ No newline at end of file diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index e251d3a91..930c5cb3f 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -68,7 +68,6 @@ const Input = forwardRef( clsx('relative', { 'rounded-md': theme !== 'search', 'rounded-full': theme === 'search', - 'mt-1': !String(outerClassName).includes('mt-'), [String(outerClassName)]: typeof outerClassName !== 'undefined', }) } diff --git a/src/features/account/components/header.tsx b/src/features/account/components/header.tsx index 754840f65..2ebd625a1 100644 --- a/src/features/account/components/header.tsx +++ b/src/features/account/components/header.tsx @@ -259,7 +259,7 @@ const Header: React.FC = ({ account }) => { const onSearch = () => { dispatch(setSearchAccount(account.id)); - history.push('/search'); + history.push('/explorer'); }; const onAvatarClick = () => { diff --git a/src/features/compose/components/search-results.tsx b/src/features/compose/components/search-results.tsx index 03a7509c3..e310c18e7 100644 --- a/src/features/compose/components/search-results.tsx +++ b/src/features/compose/components/search-results.tsx @@ -1,48 +1,59 @@ +import globeIcon from '@tabler/icons/outline/globe.svg'; +import searchIcon from '@tabler/icons/outline/search.svg'; +import trendIcon from '@tabler/icons/outline/trending-up.svg'; +import userIcon from '@tabler/icons/outline/user.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; -import { useEffect, useRef } from 'react'; -import { - FormattedMessage, - // defineMessages, - // useIntl +import { useEffect, useRef, useState } from 'react'; +import { + FormattedMessage, + defineMessages, + useIntl, } from 'react-intl'; -import { +import { expandSearch, - // setFilter, - // setSearchAccount + setFilter, + setSearchAccount, } from 'soapbox/actions/search.ts'; import { expandTrendingStatuses, fetchTrendingStatuses } from 'soapbox/actions/trending-statuses.ts'; -// import { useAccount } from 'soapbox/api/hooks/index.ts'; +import { useAccount } from 'soapbox/api/hooks/index.ts'; import Hashtag from 'soapbox/components/hashtag.tsx'; +import IconButton from 'soapbox/components/icon-button.tsx'; import ScrollableList from 'soapbox/components/scrollable-list.tsx'; +import ExplorerTabs from 'soapbox/components/ui/explorer-tabs.tsx'; +import HStack from 'soapbox/components/ui/hstack.tsx'; import Spinner from 'soapbox/components/ui/spinner.tsx'; -// import Tabs from 'soapbox/components/ui/tabs.tsx'; +import Text from 'soapbox/components/ui/text.tsx'; import AccountContainer from 'soapbox/containers/account-container.tsx'; import StatusContainer from 'soapbox/containers/status-container.tsx'; import PlaceholderAccount from 'soapbox/features/placeholder/components/placeholder-account.tsx'; import PlaceholderHashtag from 'soapbox/features/placeholder/components/placeholder-hashtag.tsx'; import PlaceholderStatus from 'soapbox/features/placeholder/components/placeholder-status.tsx'; +import PublicTimeline from 'soapbox/features/public-timeline/index.tsx'; import { useAppDispatch } from 'soapbox/hooks/useAppDispatch.ts'; import { useAppSelector } from 'soapbox/hooks/useAppSelector.ts'; import { useSuggestions } from 'soapbox/queries/suggestions.ts'; +import { SearchFilter } from 'soapbox/reducers/search.ts'; import type { OrderedSet as ImmutableOrderedSet } from 'immutable'; import type { VirtuosoHandle } from 'react-virtuoso'; -// import type { SearchFilter } from 'soapbox/reducers/search.ts'; -// const messages = defineMessages({ -// accounts: { id: 'search_results.accounts', defaultMessage: 'People' }, -// statuses: { id: 'search_results.statuses', defaultMessage: 'Posts' }, -// hashtags: { id: 'search_results.hashtags', defaultMessage: 'Hashtags' }, -// }); +const messages = defineMessages({ + accounts: { id: 'search_results.posts', defaultMessage: 'Accounts' }, + statuses: { id: 'search_results.accounts', defaultMessage: 'Posts' }, + trends: { id: 'search_results.trends', defaultMessage: 'Trends' }, + search: { id: 'common.search', defaultMessage: 'Search' }, +}); const SearchResults = () => { const node = useRef(null); - // const intl = useIntl(); + const intl = useIntl(); const dispatch = useAppDispatch(); const { data: suggestions } = useSuggestions(); + const [globalTimeline, setGlobalTimeline] = useState(true); const value = useAppSelector((state) => state.search.submittedValue); const results = useAppSelector((state) => state.search.results); @@ -51,8 +62,8 @@ const SearchResults = () => { const trends = useAppSelector((state) => state.trends.items); const submitted = useAppSelector((state) => state.search.submitted); const selectedFilter = useAppSelector((state) => state.search.filter); - // const filterByAccount = useAppSelector((state) => state.search.accountId || undefined); - // const { account } = useAccount(filterByAccount); + const filterByAccount = useAppSelector((state) => state.search.accountId || undefined); + const { account } = useAccount(filterByAccount); const handleLoadMore = () => { if (results.accounts.size || results.statuses.size || results.hashtags.size) { @@ -62,35 +73,45 @@ const SearchResults = () => { } }; - // const handleUnsetAccount = () => dispatch(setSearchAccount(null)); + const handleUnsetAccount = () => dispatch(setSearchAccount(null)); + const handleAction = (filter: SearchFilter) =>{ + setGlobalTimeline(false); + selectFilter(filter); + }; - // const selectFilter = (newActiveFilter: SearchFilter) => dispatch(setFilter(newActiveFilter)); + const selectFilter = (newActiveFilter: SearchFilter) => dispatch(setFilter(newActiveFilter)); - // const renderFilterBar = () => { - // const items = []; - // items.push( - // { - // text: intl.formatMessage(messages.statuses), - // action: () => selectFilter('statuses'), - // name: 'statuses', - // }, - // { - // text: intl.formatMessage(messages.accounts), - // action: () => selectFilter('accounts'), - // name: 'accounts', - // }, - // ); + const renderFilterBar = () => { + const items = []; + items.push( + { + label: intl.formatMessage(messages.statuses), + action: () => setGlobalTimeline(true), + name: 'statuses', + icon: globeIcon, + }, + { + label: intl.formatMessage(messages.trends), + action: () => handleAction('statuses'), + name: 'trends', + icon: trendIcon, + }, + { + label: intl.formatMessage(messages.accounts), + action: () => handleAction('accounts'), + name: 'accounts', + icon: userIcon, + }, + { + label: intl.formatMessage(messages.search), + action: () => null, + name: 'search', + icon: searchIcon, + }, + ); - // items.push( - // { - // text: intl.formatMessage(messages.hashtags), - // action: () => selectFilter('hashtags'), - // name: 'hashtags', - // }, - // ); - - // return ; - // }; + return ; + }; const getCurrentIndex = (id: string): number => { return resultsIds?.keySeq().findIndex(key => key === id); @@ -219,7 +240,7 @@ const SearchResults = () => { return ( <> - {/* {filterByAccount ? ( + {filterByAccount ? ( @@ -231,10 +252,12 @@ const SearchResults = () => { ) : ( -
{renderFilterBar()}
- )} */} +
+ {renderFilterBar()} +
+ )} - {noResultsMessage || ( + {globalTimeline ? : (noResultsMessage || ( { > {searchResults || []} - )} + ))} ); }; diff --git a/src/features/compose/components/search-zap-split.tsx b/src/features/compose/components/search-zap-split.tsx index 01c8ed2ca..335604ee9 100644 --- a/src/features/compose/components/search-zap-split.tsx +++ b/src/features/compose/components/search-zap-split.tsx @@ -76,7 +76,7 @@ const SearchZapSplit = (props: ISearchZapSplit) => { dispatch(setSearchAccount(null)); dispatch(submitSearch()); - history.push('/search'); + history.push('/explorer'); } else { dispatch(submitSearch()); } diff --git a/src/features/compose/components/search.tsx b/src/features/compose/components/search.tsx index 818c2c0f1..8c7a039a3 100644 --- a/src/features/compose/components/search.tsx +++ b/src/features/compose/components/search.tsx @@ -88,7 +88,7 @@ const Search = (props: ISearch) => { dispatch(setSearchAccount(null)); dispatch(submitSearch()); - history.push('/search'); + history.push('/explorer'); } else { dispatch(submitSearch()); } diff --git a/src/features/search/components/explorer-cards.tsx b/src/features/explorer/components/explorer-cards.tsx similarity index 89% rename from src/features/search/components/explorer-cards.tsx rename to src/features/explorer/components/explorer-cards.tsx index a6e7e13a7..5a9f2e2d2 100644 --- a/src/features/search/components/explorer-cards.tsx +++ b/src/features/explorer/components/explorer-cards.tsx @@ -24,10 +24,10 @@ const ExplorerCards = () => { const [isOpen, setIsOpen] = useState(true); const intl = useIntl(); return ( - + @@ -53,11 +53,11 @@ const ExplorerCards = () => { - + {/* Nostr */} @@ -82,7 +82,7 @@ const ExplorerCards = () => { {/* Bridge */} {/* Title */} diff --git a/src/features/search/components/explorerFilter.tsx b/src/features/explorer/components/explorerFilter.tsx similarity index 97% rename from src/features/search/components/explorerFilter.tsx rename to src/features/explorer/components/explorerFilter.tsx index 4d65aa63f..8035f8f45 100644 --- a/src/features/search/components/explorerFilter.tsx +++ b/src/features/explorer/components/explorerFilter.tsx @@ -15,7 +15,7 @@ import { PlatformFilters, RepliesFilter, generateFilter, -} from 'soapbox/features/search/components/filters.tsx'; +} from 'soapbox/features/explorer/components/filters.tsx'; import { useAppDispatch } from 'soapbox/hooks/useAppDispatch.ts'; const messages = defineMessages({ diff --git a/src/features/search/components/filters.tsx b/src/features/explorer/components/filters.tsx similarity index 96% rename from src/features/search/components/filters.tsx rename to src/features/explorer/components/filters.tsx index 1e9b21834..5d6b59bf1 100644 --- a/src/features/search/components/filters.tsx +++ b/src/features/explorer/components/filters.tsx @@ -13,9 +13,8 @@ import Stack from 'soapbox/components/ui/stack.tsx'; import SvgIcon from 'soapbox/components/ui/svg-icon.tsx'; import Text from 'soapbox/components/ui/text.tsx'; import Toggle from 'soapbox/components/ui/toggle.tsx'; +import { IGenerateFilter } from 'soapbox/features/explorer/components/explorerFilter.tsx'; import { SelectDropdown } from 'soapbox/features/forms/index.tsx'; -import { IGenerateFilter } from 'soapbox/features/search/components/explorerFilter.tsx'; -// import { useAppDispatch } from 'soapbox/hooks/useAppDispatch.ts'; const messages = defineMessages({ filters: { id: 'column.explorer.filters', defaultMessage: 'Filters:' }, @@ -48,7 +47,6 @@ const languages = { da: 'Dansk', de: 'Deutsch', el: 'Ελληνικά', - 'en-Shaw': '𐑖𐑱𐑝𐑾𐑯', eo: 'Esperanto', es: 'Español', eu: 'Euskara', @@ -80,14 +78,12 @@ const languages = { oc: 'Occitan', pl: 'Polski', pt: 'Português', - 'pt-BR': 'Português do Brasil', ro: 'Română', ru: 'Русский', sk: 'Slovenčina', sl: 'Slovenščina', sq: 'Shqip', sr: 'Српски', - 'sr-Latn': 'Srpski (latinica)', sv: 'Svenska', ta: 'தமிழ்', te: 'తెలుగు', @@ -95,9 +91,6 @@ const languages = { tr: 'Türkçe', uk: 'Українська', zh: '中文', - 'zh-CN': '简体中文', - 'zh-HK': '繁體中文(香港)', - 'zh-TW': '繁體中文(臺灣)', }; interface IFilter { @@ -370,6 +363,7 @@ const MediaFilter = ({ onChangeFilters }: IFilter) => { const generateFilter = ({ name, state }: IGenerateFilter, onChangeFilters: React.Dispatch>) => { let borderColor = ''; let textColor = ''; + let hasButton = false; switch (name.toLowerCase()) { case 'nostr': borderColor = 'border-purple-500'; @@ -391,19 +385,20 @@ const generateFilter = ({ name, state }: IGenerateFilter, onChangeFilters: React } borderColor = state ? 'border-green-500' : 'border-red-500'; textColor = state ? 'text-green-500' : 'text-red-500'; + hasButton = true; } return (
{name} - onChangeFilters((prevValue) => { return prevValue.filter((x) => x.name !== name); })} - /> + />}
); }; diff --git a/src/features/search/components/people-to-follow-card.tsx b/src/features/explorer/components/popular-accounts.tsx similarity index 94% rename from src/features/search/components/people-to-follow-card.tsx rename to src/features/explorer/components/popular-accounts.tsx index 4e8b566dc..7f91980d9 100644 --- a/src/features/search/components/people-to-follow-card.tsx +++ b/src/features/explorer/components/popular-accounts.tsx @@ -17,9 +17,10 @@ import { useSuggestions, } from 'soapbox/queries/suggestions.ts'; +// @ts-ignore import 'swiper/css'; -const PeopleToFollowCard = ({ id }: { id: string }) => { +const PopularAccounts = ({ id }: { id: string }) => { const account = useAccount(id).account; const { logo } = useSoapboxConfig(); @@ -70,7 +71,7 @@ const PeopleToFollowCard = ({ id }: { id: string }) => { const AccountsCarousel = () => { const isMobile = useIsMobile(); const { data: suggestions, isFetching } = useSuggestions(); - const [isOpen, setIsOpen] = useState(false); + const [isOpen, setIsOpen] = useState(true); if (!isFetching && !suggestions.length) { @@ -101,7 +102,7 @@ const AccountsCarousel = () => { > {suggestions.map((suggestion) => ( - + ))} diff --git a/src/features/search/index.tsx b/src/features/explorer/index.tsx similarity index 56% rename from src/features/search/index.tsx rename to src/features/explorer/index.tsx index f8cb6eaf0..525d8839c 100644 --- a/src/features/search/index.tsx +++ b/src/features/explorer/index.tsx @@ -4,20 +4,19 @@ import { Column } from 'soapbox/components/ui/column.tsx'; import Divider from 'soapbox/components/ui/divider.tsx'; import Stack from 'soapbox/components/ui/stack.tsx'; import SearchResults from 'soapbox/features/compose/components/search-results.tsx'; -import Search from 'soapbox/features/compose/components/search.tsx'; -import ExplorerCards from 'soapbox/features/search/components/explorer-cards.tsx'; -import ExplorerFilter from 'soapbox/features/search/components/explorerFilter.tsx'; -import AccountsCarousel from 'soapbox/features/search/components/people-to-follow-card.tsx'; +import ExplorerCards from 'soapbox/features/explorer/components/explorer-cards.tsx'; +import ExplorerFilter from 'soapbox/features/explorer/components/explorerFilter.tsx'; +import AccountsCarousel from 'soapbox/features/explorer/components/popular-accounts.tsx'; const messages = defineMessages({ - heading: { id: 'column.search', defaultMessage: 'Explorer' }, + heading: { id: 'column.explorer', defaultMessage: 'Explorer' }, }); const SearchPage = () => { const intl = useIntl(); return ( - + @@ -32,11 +31,8 @@ const SearchPage = () => { -
- -
- +
); diff --git a/src/features/public-timeline/index.tsx b/src/features/public-timeline/index.tsx index 9de335902..0dde4c547 100644 --- a/src/features/public-timeline/index.tsx +++ b/src/features/public-timeline/index.tsx @@ -70,6 +70,7 @@ const PublicTimeline = () => { return ( : null} slim diff --git a/src/features/ui/components/trends-panel.tsx b/src/features/ui/components/trends-panel.tsx index fd1afefec..dfcb6f0b9 100644 --- a/src/features/ui/components/trends-panel.tsx +++ b/src/features/ui/components/trends-panel.tsx @@ -38,7 +38,7 @@ const TrendsPanel = ({ limit }: ITrendsPanel) => { } action={ - + {intl.formatMessage(messages.viewAll)} diff --git a/src/features/ui/index.tsx b/src/features/ui/index.tsx index d6422624e..0eac22889 100644 --- a/src/features/ui/index.tsx +++ b/src/features/ui/index.tsx @@ -48,7 +48,6 @@ import Navbar from './components/navbar.tsx'; import { Status, CommunityTimeline, - PublicTimeline, RemoteTimeline, AccountTimeline, AccountGallery, @@ -194,7 +193,6 @@ const SwitchingColumnsArea: React.FC = ({ children }) => https://stackoverflow.com/a/68637108 */} {features.federating && } - {features.federating && } {features.federating && } {features.conversations && } @@ -209,11 +207,11 @@ const SwitchingColumnsArea: React.FC = ({ children }) => - + {/* Pleroma FE web routes */} - + @@ -251,7 +249,7 @@ const SwitchingColumnsArea: React.FC = ({ children }) => - + @@ -261,7 +259,7 @@ const SwitchingColumnsArea: React.FC = ({ children }) => - + {features.suggestionsLocal && } {features.suggestions && } {features.profileDirectory && } diff --git a/src/features/ui/util/async-components.ts b/src/features/ui/util/async-components.ts index e6717d626..6941e4425 100644 --- a/src/features/ui/util/async-components.ts +++ b/src/features/ui/util/async-components.ts @@ -58,7 +58,7 @@ export const BirthdaysModal = lazy(() => import('soapbox/features/ui/components/ export const BirthdayPanel = lazy(() => import('soapbox/components/birthday-panel.tsx')); export const ListEditor = lazy(() => import('soapbox/features/list-editor/index.tsx')); export const ListAdder = lazy(() => import('soapbox/features/list-adder/index.tsx')); -export const Search = lazy(() => import('soapbox/features/search/index.tsx')); +export const Search = lazy(() => import('soapbox/features/explorer/index.tsx')); export const LoginPage = lazy(() => import('soapbox/features/auth-login/components/login-page.tsx')); export const ExternalLogin = lazy(() => import('soapbox/features/external-login/index.tsx')); export const LogoutPage = lazy(() => import('soapbox/features/auth-login/components/logout.tsx')); diff --git a/src/locales/en.json b/src/locales/en.json index 7ff7524f1..7bda59c24 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -368,6 +368,7 @@ "column.event_map": "Event location", "column.event_participants": "Event participants", "column.events": "Events", + "column.explorer": "Explorer", "column.explorer.bridge_card.text": "Curious about Bridges? Click here", "column.explorer.bridge_card.title": "Bridge", "column.explorer.filters": "Filters:", @@ -451,7 +452,6 @@ "column.reblogs": "Reposts", "column.registration": "Sign Up", "column.scheduled_statuses": "Scheduled Posts", - "column.search": "Explorer", "column.settings_store": "Settings store", "column.soapbox_config": "Soapbox config", "column.test": "Test timeline", @@ -459,6 +459,7 @@ "column_forbidden.body": "You do not have permission to access this page.", "column_forbidden.title": "Forbidden", "common.cancel": "Cancel", + "common.search": "Search", "compare_history_modal.header": "Edit history", "compose.character_counter.title": "Used {chars} out of {maxChars} {maxChars, plural, one {character} other {characters}}", "compose.edit_success": "Your post was edited", @@ -1442,6 +1443,10 @@ "scheduled_status.cancel": "Cancel", "search.action": "Search for “{query}”", "search.placeholder": "Search", + "search_results.accounts": "Posts", + "search_results.filter_message": "You are searching for posts from @{acct}.", + "search_results.posts": "Accounts", + "search_results.trends": "Trends", "security.codes.fail": "Failed to fetch backup codes", "security.confirm.fail": "Incorrect code or password. Try again.", "security.delete_account.fail": "Account deletion failed.",