diff --git a/app/javascript/mastodon/features/getting_started/index.jsx b/app/javascript/mastodon/features/getting_started/index.jsx
index ff3166da35..14622e573d 100644
--- a/app/javascript/mastodon/features/getting_started/index.jsx
+++ b/app/javascript/mastodon/features/getting_started/index.jsx
@@ -14,6 +14,8 @@ import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?re
import BookmarksIcon from '@/material-icons/400-24px/bookmarks-fill.svg?react';
import ExploreIcon from '@/material-icons/400-24px/explore.svg?react';
import ModerationIcon from '@/material-icons/400-24px/gavel.svg?react';
+import HashtagIcon from '@/material-icons/400-24px/tag.svg?react';
+import Directory from '@/material-icons/400-24px/group.svg?react';
import PeopleIcon from '@/material-icons/400-24px/group.svg?react';
import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react';
import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react';
@@ -27,7 +29,7 @@ import AntennaIcon from '@/material-icons/400-24px/wifi.svg?react';
import { fetchFollowRequests } from 'mastodon/actions/accounts';
import Column from 'mastodon/components/column';
import ColumnHeader from 'mastodon/components/column_header';
-import { LinkFooter } from 'mastodon/features/ui/components/link_footer';
+import LinkFooter from 'mastodon/features/ui/components/link_footer';
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
import { canManageReports, canViewAdminDashboard } from 'mastodon/permissions';
@@ -42,6 +44,8 @@ const messages = defineMessages({
home_timeline: { id: 'tabs_bar.home', defaultMessage: 'Home' },
notifications: { id: 'tabs_bar.notifications', defaultMessage: 'Notifications' },
public_timeline: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' },
+ followed_tags: { id: 'navigation_bar.followed_tags', defaultMessage: 'Followed Hashtags' },
+ directory: { id: 'navigation_bar.directory', defaultMessage: 'Profile directory' },
settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' },
community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },
deep_timeline: { id: 'navigation_bar.deep_timeline', defaultMessage: 'Deep timeline' },
@@ -144,8 +148,9 @@ class GettingStarted extends ImmutablePureComponent {
,
,
,
+ ,
,
- ,
+ ,
,
);
diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
index 95828ef25e..b9aabb48c2 100644
--- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
+++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
@@ -13,6 +13,8 @@ import BookmarksActiveIcon from '@/material-icons/400-24px/bookmarks-fill.svg?re
import BookmarksIcon from '@/material-icons/400-24px/bookmarks.svg?react';
import ExploreActiveIcon from '@/material-icons/400-24px/explore-fill.svg?react';
import ExploreIcon from '@/material-icons/400-24px/explore.svg?react';
+import HashtagIcon from '@/material-icons/400-24px/tag.svg?react';
+import DirectoryIcon from '@/material-icons/400-24px/group.svg?react';
import ModerationIcon from '@/material-icons/400-24px/gavel.svg?react';
import PeopleIcon from '@/material-icons/400-24px/group.svg?react';
import HomeActiveIcon from '@/material-icons/400-24px/home-fill.svg?react';
@@ -50,6 +52,8 @@ const messages = defineMessages({
home: { id: 'tabs_bar.home', defaultMessage: 'Home' },
notifications: { id: 'tabs_bar.notifications', defaultMessage: 'Notifications' },
explore: { id: 'explore.title', defaultMessage: 'Explore' },
+ followed_tags: { id: 'navigation_bar.followed_tags', defaultMessage: 'Followed hashtags' },
+ directory: { id: 'navigation_bar.directory', defaultMessage: 'Profiles directory' },
local: { id: 'column.local', defaultMessage: 'Local' },
deepLocal: { id: 'column.deep_local', defaultMessage: 'Deep' },
firehose: { id: 'column.firehose', defaultMessage: 'Live feeds' },
@@ -228,7 +232,42 @@ class NavigationPanel extends Component {
+
+ >
+ )}
+
+ {signedIn && (
+ <>
+
+
+
+
+
+
+
+ >
+ )}
+
+ {signedIn && explorer}
+
+ {signedIn && (
+ <>
+
+ { !isHideItem('favourite_menu') &&
}
+
+
+
+
+ {canManageReports(permissions) &&
}
+ {canViewAdminDashboard(permissions) &&
}
+ >
+ )}
+
+ {!signedIn && (
+
+
+ { disabledAccountId ? : }
diff --git a/app/validators/status_pin_validator.rb b/app/validators/status_pin_validator.rb
index c9c1effba8..fa997f1c5b 100644
--- a/app/validators/status_pin_validator.rb
+++ b/app/validators/status_pin_validator.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class StatusPinValidator < ActiveModel::Validator
- PIN_LIMIT = 5
+ PIN_LIMIT = (ENV['MAX_PINNED_TOOTS'] || 5).to_i
def validate(pin)
pin.errors.add(:base, I18n.t('statuses.pin_errors.reblog')) if pin.status.reblog?