-
-
- {generateText(length)}
-
-
+
);
};
diff --git a/app/soapbox/features/placeholder/components/placeholder_material_status.tsx b/app/soapbox/features/placeholder/components/placeholder-material-status.tsx
similarity index 87%
rename from app/soapbox/features/placeholder/components/placeholder_material_status.tsx
rename to app/soapbox/features/placeholder/components/placeholder-material-status.tsx
index 28581cb099..e3b289d70f 100644
--- a/app/soapbox/features/placeholder/components/placeholder_material_status.tsx
+++ b/app/soapbox/features/placeholder/components/placeholder-material-status.tsx
@@ -1,6 +1,6 @@
import React from 'react';
-import PlaceholderStatus from './placeholder_status';
+import PlaceholderStatus from './placeholder-status';
/** Fake material status to display while data is loading. */
const PlaceholderMaterialStatus: React.FC = () => {
diff --git a/app/soapbox/features/placeholder/components/placeholder_media_gallery.tsx b/app/soapbox/features/placeholder/components/placeholder-media-gallery.tsx
similarity index 100%
rename from app/soapbox/features/placeholder/components/placeholder_media_gallery.tsx
rename to app/soapbox/features/placeholder/components/placeholder-media-gallery.tsx
diff --git a/app/soapbox/features/placeholder/components/placeholder_notification.tsx b/app/soapbox/features/placeholder/components/placeholder-notification.tsx
similarity index 82%
rename from app/soapbox/features/placeholder/components/placeholder_notification.tsx
rename to app/soapbox/features/placeholder/components/placeholder-notification.tsx
index 8b673b5bb9..1a035066dd 100644
--- a/app/soapbox/features/placeholder/components/placeholder_notification.tsx
+++ b/app/soapbox/features/placeholder/components/placeholder-notification.tsx
@@ -1,8 +1,8 @@
import * as React from 'react';
-import PlaceholderAvatar from './placeholder_avatar';
-import PlaceholderDisplayName from './placeholder_display_name';
-import PlaceholderStatusContent from './placeholder_status_content';
+import PlaceholderAvatar from './placeholder-avatar';
+import PlaceholderDisplayName from './placeholder-display-name';
+import PlaceholderStatusContent from './placeholder-status-content';
/** Fake notification to display while data is loading. */
const PlaceholderNotification = () => (
diff --git a/app/soapbox/features/placeholder/components/placeholder_status_content.tsx b/app/soapbox/features/placeholder/components/placeholder-status-content.tsx
similarity index 100%
rename from app/soapbox/features/placeholder/components/placeholder_status_content.tsx
rename to app/soapbox/features/placeholder/components/placeholder-status-content.tsx
diff --git a/app/soapbox/features/placeholder/components/placeholder_status.tsx b/app/soapbox/features/placeholder/components/placeholder-status.tsx
similarity index 85%
rename from app/soapbox/features/placeholder/components/placeholder_status.tsx
rename to app/soapbox/features/placeholder/components/placeholder-status.tsx
index 1bff894594..b015c9df90 100644
--- a/app/soapbox/features/placeholder/components/placeholder_status.tsx
+++ b/app/soapbox/features/placeholder/components/placeholder-status.tsx
@@ -1,9 +1,9 @@
import classNames from 'clsx';
import * as React from 'react';
-import PlaceholderAvatar from './placeholder_avatar';
-import PlaceholderDisplayName from './placeholder_display_name';
-import PlaceholderStatusContent from './placeholder_status_content';
+import PlaceholderAvatar from './placeholder-avatar';
+import PlaceholderDisplayName from './placeholder-display-name';
+import PlaceholderStatusContent from './placeholder-status-content';
interface IPlaceholderStatus {
thread?: boolean
diff --git a/app/soapbox/features/preferences/index.tsx b/app/soapbox/features/preferences/index.tsx
index 3adb908614..6c620adb15 100644
--- a/app/soapbox/features/preferences/index.tsx
+++ b/app/soapbox/features/preferences/index.tsx
@@ -6,7 +6,7 @@ import { changeSetting } from 'soapbox/actions/settings';
import List, { ListItem } from 'soapbox/components/list';
import { Form } from 'soapbox/components/ui';
import { SelectDropdown } from 'soapbox/features/forms';
-import SettingToggle from 'soapbox/features/notifications/components/setting_toggle';
+import SettingToggle from 'soapbox/features/notifications/components/setting-toggle';
import { useFeatures, useSettings } from 'soapbox/hooks';
import ThemeToggle from '../ui/components/theme-toggle';
@@ -193,6 +193,10 @@ const Preferences = () => {
+
}>
+
+
+
{features.spoilers &&
}>
}
diff --git a/app/soapbox/features/public_layout/components/footer.tsx b/app/soapbox/features/public-layout/components/footer.tsx
similarity index 100%
rename from app/soapbox/features/public_layout/components/footer.tsx
rename to app/soapbox/features/public-layout/components/footer.tsx
diff --git a/app/soapbox/features/public_layout/components/header.tsx b/app/soapbox/features/public-layout/components/header.tsx
similarity index 100%
rename from app/soapbox/features/public_layout/components/header.tsx
rename to app/soapbox/features/public-layout/components/header.tsx
diff --git a/app/soapbox/features/public_layout/components/sonar.tsx b/app/soapbox/features/public-layout/components/sonar.tsx
similarity index 100%
rename from app/soapbox/features/public_layout/components/sonar.tsx
rename to app/soapbox/features/public-layout/components/sonar.tsx
diff --git a/app/soapbox/features/public_layout/index.tsx b/app/soapbox/features/public-layout/index.tsx
similarity index 96%
rename from app/soapbox/features/public_layout/index.tsx
rename to app/soapbox/features/public-layout/index.tsx
index 5615e950e2..0fdc8b946d 100644
--- a/app/soapbox/features/public_layout/index.tsx
+++ b/app/soapbox/features/public-layout/index.tsx
@@ -6,7 +6,7 @@ import { useAppSelector } from 'soapbox/hooks';
import { isStandalone } from 'soapbox/utils/state';
import AboutPage from '../about';
-import LandingPage from '../landing_page';
+import LandingPage from '../landing-page';
import Footer from './components/footer';
import Header from './components/header';
diff --git a/app/soapbox/features/public_timeline/index.tsx b/app/soapbox/features/public-timeline/index.tsx
similarity index 93%
rename from app/soapbox/features/public_timeline/index.tsx
rename to app/soapbox/features/public-timeline/index.tsx
index 34017a0d3f..6fec372ce8 100644
--- a/app/soapbox/features/public_timeline/index.tsx
+++ b/app/soapbox/features/public-timeline/index.tsx
@@ -6,12 +6,11 @@ import { changeSetting } from 'soapbox/actions/settings';
import { connectPublicStream } from 'soapbox/actions/streaming';
import { expandPublicTimeline } from 'soapbox/actions/timelines';
import PullToRefresh from 'soapbox/components/pull-to-refresh';
-import SubNavigation from 'soapbox/components/sub_navigation';
-import { Column } from 'soapbox/components/ui';
-import Accordion from 'soapbox/features/ui/components/accordion';
+import SubNavigation from 'soapbox/components/sub-navigation';
+import { Accordion, Column } from 'soapbox/components/ui';
import { useAppDispatch, useAppSelector, useSettings } from 'soapbox/hooks';
-import PinnedHostsPicker from '../remote_timeline/components/pinned_hosts_picker';
+import PinnedHostsPicker from '../remote-timeline/components/pinned-hosts-picker';
import Timeline from '../ui/components/timeline';
const messages = defineMessages({
diff --git a/app/soapbox/features/register_invite/index.tsx b/app/soapbox/features/register-invite/index.tsx
similarity index 92%
rename from app/soapbox/features/register_invite/index.tsx
rename to app/soapbox/features/register-invite/index.tsx
index e312c1126d..c974690119 100644
--- a/app/soapbox/features/register_invite/index.tsx
+++ b/app/soapbox/features/register-invite/index.tsx
@@ -3,7 +3,7 @@ import { FormattedMessage } from 'react-intl';
import { useParams } from 'react-router-dom';
import { Stack, CardTitle, Text } from 'soapbox/components/ui';
-import RegistrationForm from 'soapbox/features/auth_login/components/registration_form';
+import RegistrationForm from 'soapbox/features/auth-login/components/registration-form';
import { useAppSelector } from 'soapbox/hooks';
interface RegisterInviteParams {
diff --git a/app/soapbox/features/remote_timeline/components/pinned_hosts_picker.tsx b/app/soapbox/features/remote-timeline/components/pinned-hosts-picker.tsx
similarity index 100%
rename from app/soapbox/features/remote_timeline/components/pinned_hosts_picker.tsx
rename to app/soapbox/features/remote-timeline/components/pinned-hosts-picker.tsx
diff --git a/app/soapbox/features/remote_timeline/index.tsx b/app/soapbox/features/remote-timeline/index.tsx
similarity index 96%
rename from app/soapbox/features/remote_timeline/index.tsx
rename to app/soapbox/features/remote-timeline/index.tsx
index 00e2effe23..7ab185be94 100644
--- a/app/soapbox/features/remote_timeline/index.tsx
+++ b/app/soapbox/features/remote-timeline/index.tsx
@@ -4,14 +4,14 @@ import { useHistory } from 'react-router-dom';
import { connectRemoteStream } from 'soapbox/actions/streaming';
import { expandRemoteTimeline } from 'soapbox/actions/timelines';
-import IconButton from 'soapbox/components/icon_button';
+import IconButton from 'soapbox/components/icon-button';
import { HStack, Text } from 'soapbox/components/ui';
import Column from 'soapbox/features/ui/components/column';
import { useAppDispatch, useSettings } from 'soapbox/hooks';
import Timeline from '../ui/components/timeline';
-import PinnedHostsPicker from './components/pinned_hosts_picker';
+import PinnedHostsPicker from './components/pinned-hosts-picker';
const messages = defineMessages({
title: { id: 'column.remote', defaultMessage: 'Federated timeline' },
diff --git a/app/soapbox/features/reply_mentions/account.tsx b/app/soapbox/features/reply-mentions/account.tsx
similarity index 97%
rename from app/soapbox/features/reply_mentions/account.tsx
rename to app/soapbox/features/reply-mentions/account.tsx
index 87ba712785..53dc4e02ca 100644
--- a/app/soapbox/features/reply_mentions/account.tsx
+++ b/app/soapbox/features/reply-mentions/account.tsx
@@ -5,7 +5,7 @@ import { fetchAccount } from 'soapbox/actions/accounts';
import { addToMentions, removeFromMentions } from 'soapbox/actions/compose';
import Avatar from 'soapbox/components/avatar';
import DisplayName from 'soapbox/components/display-name';
-import IconButton from 'soapbox/components/icon_button';
+import IconButton from 'soapbox/components/icon-button';
import { useAppDispatch, useAppSelector, useCompose } from 'soapbox/hooks';
import { makeGetAccount } from 'soapbox/selectors';
diff --git a/app/soapbox/features/report/components/status_check_box.tsx b/app/soapbox/features/report/components/status-check-box.tsx
similarity index 97%
rename from app/soapbox/features/report/components/status_check_box.tsx
rename to app/soapbox/features/report/components/status-check-box.tsx
index cb2424ea72..f8b1f6635f 100644
--- a/app/soapbox/features/report/components/status_check_box.tsx
+++ b/app/soapbox/features/report/components/status-check-box.tsx
@@ -3,7 +3,7 @@ import React from 'react';
import Toggle from 'react-toggle';
import { toggleStatusReport } from 'soapbox/actions/reports';
-import StatusContent from 'soapbox/components/status_content';
+import StatusContent from 'soapbox/components/status-content';
import { useAppDispatch, useAppSelector } from 'soapbox/hooks';
import Bundle from '../../ui/components/bundle';
diff --git a/app/soapbox/features/scheduled_statuses/builder.tsx b/app/soapbox/features/scheduled-statuses/builder.tsx
similarity index 98%
rename from app/soapbox/features/scheduled_statuses/builder.tsx
rename to app/soapbox/features/scheduled-statuses/builder.tsx
index 9db827412d..dbd40f101d 100644
--- a/app/soapbox/features/scheduled_statuses/builder.tsx
+++ b/app/soapbox/features/scheduled-statuses/builder.tsx
@@ -4,7 +4,7 @@ import { normalizeStatus } from 'soapbox/normalizers/status';
import { calculateStatus } from 'soapbox/reducers/statuses';
import { makeGetAccount } from 'soapbox/selectors';
-import type { ScheduledStatus } from 'soapbox/reducers/scheduled_statuses';
+import type { ScheduledStatus } from 'soapbox/reducers/scheduled-statuses';
import type { RootState } from 'soapbox/store';
export const buildStatus = (state: RootState, scheduledStatus: ScheduledStatus) => {
diff --git a/app/soapbox/features/scheduled_statuses/components/scheduled_status_action_bar.tsx b/app/soapbox/features/scheduled-statuses/components/scheduled-status-action-bar.tsx
similarity index 96%
rename from app/soapbox/features/scheduled_statuses/components/scheduled_status_action_bar.tsx
rename to app/soapbox/features/scheduled-statuses/components/scheduled-status-action-bar.tsx
index dd73b8945b..6ee898eb6f 100644
--- a/app/soapbox/features/scheduled_statuses/components/scheduled_status_action_bar.tsx
+++ b/app/soapbox/features/scheduled-statuses/components/scheduled-status-action-bar.tsx
@@ -2,9 +2,9 @@ import React from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { openModal } from 'soapbox/actions/modals';
-import { cancelScheduledStatus } from 'soapbox/actions/scheduled_statuses';
+import { cancelScheduledStatus } from 'soapbox/actions/scheduled-statuses';
import { getSettings } from 'soapbox/actions/settings';
-import IconButton from 'soapbox/components/icon_button';
+import IconButton from 'soapbox/components/icon-button';
import { HStack } from 'soapbox/components/ui';
import { useAppDispatch } from 'soapbox/hooks';
diff --git a/app/soapbox/features/scheduled_statuses/components/scheduled_status.tsx b/app/soapbox/features/scheduled-statuses/components/scheduled-status.tsx
similarity index 88%
rename from app/soapbox/features/scheduled_statuses/components/scheduled_status.tsx
rename to app/soapbox/features/scheduled-statuses/components/scheduled-status.tsx
index b9b90ef27c..1d1a68c947 100644
--- a/app/soapbox/features/scheduled_statuses/components/scheduled_status.tsx
+++ b/app/soapbox/features/scheduled-statuses/components/scheduled-status.tsx
@@ -2,16 +2,16 @@ import classNames from 'clsx';
import React from 'react';
import AttachmentThumbs from 'soapbox/components/attachment-thumbs';
+import StatusContent from 'soapbox/components/status-content';
import StatusReplyMentions from 'soapbox/components/status-reply-mentions';
-import StatusContent from 'soapbox/components/status_content';
import { HStack } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
-import PollPreview from 'soapbox/features/ui/components/poll_preview';
+import AccountContainer from 'soapbox/containers/account-container';
+import PollPreview from 'soapbox/features/ui/components/poll-preview';
import { useAppSelector } from 'soapbox/hooks';
import { buildStatus } from '../builder';
-import ScheduledStatusActionBar from './scheduled_status_action_bar';
+import ScheduledStatusActionBar from './scheduled-status-action-bar';
import type { Account as AccountEntity, Status as StatusEntity } from 'soapbox/types/entities';
diff --git a/app/soapbox/features/scheduled_statuses/index.tsx b/app/soapbox/features/scheduled-statuses/index.tsx
similarity index 91%
rename from app/soapbox/features/scheduled_statuses/index.tsx
rename to app/soapbox/features/scheduled-statuses/index.tsx
index 1bf9b5aeeb..1982af5b99 100644
--- a/app/soapbox/features/scheduled_statuses/index.tsx
+++ b/app/soapbox/features/scheduled-statuses/index.tsx
@@ -2,13 +2,13 @@ import debounce from 'lodash/debounce';
import React, { useEffect } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
-import { fetchScheduledStatuses, expandScheduledStatuses } from 'soapbox/actions/scheduled_statuses';
-import ScrollableList from 'soapbox/components/scrollable_list';
+import { fetchScheduledStatuses, expandScheduledStatuses } from 'soapbox/actions/scheduled-statuses';
+import ScrollableList from 'soapbox/components/scrollable-list';
import { useAppSelector, useAppDispatch } from 'soapbox/hooks';
import Column from '../ui/components/column';
-import ScheduledStatus from './components/scheduled_status';
+import ScheduledStatus from './components/scheduled-status';
const messages = defineMessages({
heading: { id: 'column.scheduled_statuses', defaultMessage: 'Scheduled Posts' },
diff --git a/app/soapbox/features/search/index.tsx b/app/soapbox/features/search/index.tsx
index c17691c37f..a61700b2bc 100644
--- a/app/soapbox/features/search/index.tsx
+++ b/app/soapbox/features/search/index.tsx
@@ -3,7 +3,7 @@ import { defineMessages, useIntl } from 'react-intl';
import { Column } from 'soapbox/components/ui';
import Search from 'soapbox/features/compose/components/search';
-import SearchResults from 'soapbox/features/compose/components/search_results';
+import SearchResults from 'soapbox/features/compose/components/search-results';
const messages = defineMessages({
heading: { id: 'column.search', defaultMessage: 'Search' },
diff --git a/app/soapbox/features/security/mfa_form.tsx b/app/soapbox/features/security/mfa-form.tsx
similarity index 91%
rename from app/soapbox/features/security/mfa_form.tsx
rename to app/soapbox/features/security/mfa-form.tsx
index 1cbb15f7ea..1fd47445f2 100644
--- a/app/soapbox/features/security/mfa_form.tsx
+++ b/app/soapbox/features/security/mfa-form.tsx
@@ -5,9 +5,9 @@ import { fetchMfa } from 'soapbox/actions/mfa';
import { Card, CardBody, CardHeader, CardTitle, Column, Stack } from 'soapbox/components/ui';
import { useAppSelector, useAppDispatch } from 'soapbox/hooks';
-import DisableOtpForm from './mfa/disable_otp_form';
-import EnableOtpForm from './mfa/enable_otp_form';
-import OtpConfirmForm from './mfa/otp_confirm_form';
+import DisableOtpForm from './mfa/disable-otp-form';
+import EnableOtpForm from './mfa/enable-otp-form';
+import OtpConfirmForm from './mfa/otp-confirm-form';
/*
Security settings page for user account
diff --git a/app/soapbox/features/security/mfa/disable_otp_form.tsx b/app/soapbox/features/security/mfa/disable-otp-form.tsx
similarity index 100%
rename from app/soapbox/features/security/mfa/disable_otp_form.tsx
rename to app/soapbox/features/security/mfa/disable-otp-form.tsx
diff --git a/app/soapbox/features/security/mfa/enable_otp_form.tsx b/app/soapbox/features/security/mfa/enable-otp-form.tsx
similarity index 100%
rename from app/soapbox/features/security/mfa/enable_otp_form.tsx
rename to app/soapbox/features/security/mfa/enable-otp-form.tsx
diff --git a/app/soapbox/features/security/mfa/otp_confirm_form.tsx b/app/soapbox/features/security/mfa/otp-confirm-form.tsx
similarity index 100%
rename from app/soapbox/features/security/mfa/otp_confirm_form.tsx
rename to app/soapbox/features/security/mfa/otp-confirm-form.tsx
diff --git a/app/soapbox/features/server-info/index.tsx b/app/soapbox/features/server-info/index.tsx
new file mode 100644
index 0000000000..94619f72f5
--- /dev/null
+++ b/app/soapbox/features/server-info/index.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { defineMessages, useIntl } from 'react-intl';
+
+import { Column, Divider, Stack, Text } from 'soapbox/components/ui';
+import { useAppSelector } from 'soapbox/hooks';
+
+import LinkFooter from '../ui/components/link-footer';
+import PromoPanel from '../ui/components/promo-panel';
+
+const messages = defineMessages({
+ heading: { id: 'column.info', defaultMessage: 'Server information' },
+});
+
+const ServerInfo = () => {
+ const intl = useIntl();
+ const instance = useAppSelector((state) => state.instance);
+
+ return (
+
+
+
+ {instance.title}
+ {instance.description}
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ServerInfo;
diff --git a/app/soapbox/features/server_info/index.tsx b/app/soapbox/features/server_info/index.tsx
deleted file mode 100644
index 0e12538d47..0000000000
--- a/app/soapbox/features/server_info/index.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import React from 'react';
-import { defineMessages, useIntl } from 'react-intl';
-
-import { useAppSelector } from 'soapbox/hooks';
-
-import Column from '../ui/components/column';
-import LinkFooter from '../ui/components/link_footer';
-import PromoPanel from '../ui/components/promo_panel';
-
-const messages = defineMessages({
- heading: { id: 'column.info', defaultMessage: 'Server information' },
-});
-
-const ServerInfo = () => {
- const intl = useIntl();
- const instance = useAppSelector((state) => state.instance);
-
- return (
-
-
-
-
-
{instance.title}
-
-
- {instance.description}
-
-
-
-
-
-
- );
-};
-
-export default ServerInfo;
diff --git a/app/soapbox/features/settings/media_display.tsx b/app/soapbox/features/settings/media-display.tsx
similarity index 100%
rename from app/soapbox/features/settings/media_display.tsx
rename to app/soapbox/features/settings/media-display.tsx
diff --git a/app/soapbox/features/soapbox_config/components/color-picker.tsx b/app/soapbox/features/soapbox-config/components/color-picker.tsx
similarity index 96%
rename from app/soapbox/features/soapbox_config/components/color-picker.tsx
rename to app/soapbox/features/soapbox-config/components/color-picker.tsx
index 4ac3943fcf..4cba36e6a6 100644
--- a/app/soapbox/features/soapbox_config/components/color-picker.tsx
+++ b/app/soapbox/features/soapbox-config/components/color-picker.tsx
@@ -2,7 +2,7 @@ import { supportsPassiveEvents } from 'detect-passive-events';
import React, { useEffect, useRef } from 'react';
import { SketchPicker, ColorChangeHandler } from 'react-color';
-import { isMobile } from 'soapbox/is_mobile';
+import { isMobile } from 'soapbox/is-mobile';
const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
diff --git a/app/soapbox/features/soapbox_config/components/color-with-picker.tsx b/app/soapbox/features/soapbox-config/components/color-with-picker.tsx
similarity index 96%
rename from app/soapbox/features/soapbox_config/components/color-with-picker.tsx
rename to app/soapbox/features/soapbox-config/components/color-with-picker.tsx
index c82e1bf11e..c1c7dd3cd0 100644
--- a/app/soapbox/features/soapbox_config/components/color-with-picker.tsx
+++ b/app/soapbox/features/soapbox-config/components/color-with-picker.tsx
@@ -2,7 +2,7 @@ import React, { useState, useRef } from 'react';
// @ts-ignore: TODO: upgrade react-overlays. v3.1 and above have TS definitions
import Overlay from 'react-overlays/lib/Overlay';
-import { isMobile } from 'soapbox/is_mobile';
+import { isMobile } from 'soapbox/is-mobile';
import ColorPicker from './color-picker';
diff --git a/app/soapbox/features/soapbox_config/components/crypto-address-input.tsx b/app/soapbox/features/soapbox-config/components/crypto-address-input.tsx
similarity index 100%
rename from app/soapbox/features/soapbox_config/components/crypto-address-input.tsx
rename to app/soapbox/features/soapbox-config/components/crypto-address-input.tsx
diff --git a/app/soapbox/features/soapbox_config/components/footer-link-input.tsx b/app/soapbox/features/soapbox-config/components/footer-link-input.tsx
similarity index 100%
rename from app/soapbox/features/soapbox_config/components/footer-link-input.tsx
rename to app/soapbox/features/soapbox-config/components/footer-link-input.tsx
diff --git a/app/soapbox/features/soapbox-config/components/icon-picker-dropdown.tsx b/app/soapbox/features/soapbox-config/components/icon-picker-dropdown.tsx
new file mode 100644
index 0000000000..d23e9f004f
--- /dev/null
+++ b/app/soapbox/features/soapbox-config/components/icon-picker-dropdown.tsx
@@ -0,0 +1,85 @@
+import React, { useRef, useState } from 'react';
+import { defineMessages, useIntl } from 'react-intl';
+// @ts-ignore
+import Overlay from 'react-overlays/lib/Overlay';
+
+import Icon from 'soapbox/components/icon';
+
+import IconPickerMenu from './icon-picker-menu';
+
+const messages = defineMessages({
+ emoji: { id: 'icon_button.label', defaultMessage: 'Select icon' },
+});
+
+interface IIconPickerDropdown {
+ value: string,
+ onPickEmoji: React.ChangeEventHandler,
+}
+
+const IconPickerDropdown: React.FC
= ({ value, onPickEmoji }) => {
+ const intl = useIntl();
+
+ const [active, setActive] = useState(false);
+ const [placement, setPlacement] = useState<'bottom' | 'top'>();
+
+ const target = useRef(null);
+
+ const onShowDropdown: React.KeyboardEventHandler = ({ target }) => {
+ setActive(true);
+
+ const { top } = (target as any).getBoundingClientRect();
+ setPlacement(top * 2 < innerHeight ? 'bottom' : 'top');
+ };
+
+ const onHideDropdown = () => {
+ setActive(false);
+ };
+
+ const onToggle: React.KeyboardEventHandler = (e) => {
+ e.stopPropagation();
+ if (!e.key || e.key === 'Enter') {
+ if (active) {
+ onHideDropdown();
+ } else {
+ onShowDropdown(e);
+ }
+ }
+ };
+
+ const handleKeyDown: React.KeyboardEventHandler = (e) => {
+ if (e.key === 'Escape') {
+ onHideDropdown();
+ }
+ };
+
+ const title = intl.formatMessage(messages.emoji);
+ const forkAwesomeIcons = require('../forkawesome.json');
+
+ return (
+
+
}
+ onKeyDown={onToggle}
+ tabIndex={0}
+ >
+
+
+
+
+
+
+
+ );
+};
+
+export default IconPickerDropdown;
diff --git a/app/soapbox/features/soapbox-config/components/icon-picker-menu.tsx b/app/soapbox/features/soapbox-config/components/icon-picker-menu.tsx
new file mode 100644
index 0000000000..c88c1afd7e
--- /dev/null
+++ b/app/soapbox/features/soapbox-config/components/icon-picker-menu.tsx
@@ -0,0 +1,131 @@
+import classNames from 'clsx';
+import { supportsPassiveEvents } from 'detect-passive-events';
+// @ts-ignore
+import Picker from 'emoji-mart/dist-es/components/picker/picker';
+import React, { useCallback, useEffect, useRef } from 'react';
+import { defineMessages, useIntl } from 'react-intl';
+
+const messages = defineMessages({
+ emoji: { id: 'icon_button.label', defaultMessage: 'Select icon' },
+ emoji_search: { id: 'emoji_button.search', defaultMessage: 'Search…' },
+ emoji_not_found: { id: 'icon_button.not_found', defaultMessage: 'No icons!! (╯°□°)╯︵ ┻━┻' },
+ custom: { id: 'icon_button.icons', defaultMessage: 'Icons' },
+ search_results: { id: 'emoji_button.search_results', defaultMessage: 'Search results' },
+});
+
+const backgroundImageFn = () => '';
+const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
+
+const categoriesSort = ['custom'];
+
+interface IIconPickerMenu {
+ customEmojis: Record>,
+ onClose: () => void,
+ onPick: any,
+ style?: React.CSSProperties,
+}
+
+const IconPickerMenu: React.FC = ({ customEmojis, onClose, onPick, style }) => {
+ const intl = useIntl();
+
+ const node = useRef(null);
+
+ const handleDocumentClick = useCallback((e: MouseEvent | TouchEvent) => {
+ if (node.current && !node.current.contains(e.target as Node)) {
+ onClose();
+ }
+ }, []);
+
+ useEffect(() => {
+ document.addEventListener('click', handleDocumentClick, false);
+ document.addEventListener('touchend', handleDocumentClick, listenerOptions);
+
+ return () => {
+ document.removeEventListener('click', handleDocumentClick, false);
+ document.removeEventListener('touchend', handleDocumentClick, listenerOptions as any);
+
+ };
+ }, []);
+
+ const setRef = (c: HTMLDivElement) => {
+ node.current = c;
+
+ if (!c) return;
+
+ // Nice and dirty hack to display the icons
+ c.querySelectorAll('button.emoji-mart-emoji > img').forEach(elem => {
+ const newIcon = document.createElement('span');
+ newIcon.innerHTML = ``;
+ (elem.parentNode as any).replaceChild(newIcon, elem);
+ });
+ };
+
+ const getI18n = () => {
+
+ return {
+ search: intl.formatMessage(messages.emoji_search),
+ notfound: intl.formatMessage(messages.emoji_not_found),
+ categories: {
+ search: intl.formatMessage(messages.search_results),
+ custom: intl.formatMessage(messages.custom),
+ },
+ };
+ };
+
+ const handleClick = (emoji: Record) => {
+ emoji.native = emoji.colons;
+
+ onClose();
+ onPick(emoji);
+ };
+
+ const buildIcons = () => {
+ const emojis: Record = [];
+
+ Object.values(customEmojis).forEach((category) => {
+ category.forEach((icon) => {
+ const name = icon.replace('fa fa-', '');
+ if (icon !== 'email' && icon !== 'memo') {
+ emojis.push({
+ id: name,
+ name,
+ short_names: [name],
+ emoticons: [],
+ keywords: [name],
+ imageUrl: '',
+ });
+ }
+ });
+ });
+
+ return emojis;
+ };
+
+ const data = { compressed: true, categories: [], aliases: [], emojis: [] };
+ const title = intl.formatMessage(messages.emoji);
+
+ return (
+
+ );
+};
+
+export default IconPickerMenu;
diff --git a/app/soapbox/features/soapbox_config/components/icon-picker.tsx b/app/soapbox/features/soapbox-config/components/icon-picker.tsx
similarity index 88%
rename from app/soapbox/features/soapbox_config/components/icon-picker.tsx
rename to app/soapbox/features/soapbox-config/components/icon-picker.tsx
index 05020af740..f1e3de6707 100644
--- a/app/soapbox/features/soapbox_config/components/icon-picker.tsx
+++ b/app/soapbox/features/soapbox-config/components/icon-picker.tsx
@@ -1,6 +1,6 @@
import React from 'react';
-import IconPickerDropdown from './icon_picker_dropdown';
+import IconPickerDropdown from './icon-picker-dropdown';
interface IIconPicker {
value: string,
diff --git a/app/soapbox/features/soapbox_config/components/promo-panel-input.tsx b/app/soapbox/features/soapbox-config/components/promo-panel-input.tsx
similarity index 100%
rename from app/soapbox/features/soapbox_config/components/promo-panel-input.tsx
rename to app/soapbox/features/soapbox-config/components/promo-panel-input.tsx
diff --git a/app/soapbox/features/soapbox_config/components/site-preview.tsx b/app/soapbox/features/soapbox-config/components/site-preview.tsx
similarity index 99%
rename from app/soapbox/features/soapbox_config/components/site-preview.tsx
rename to app/soapbox/features/soapbox-config/components/site-preview.tsx
index 94c349e250..b9f795d4a4 100644
--- a/app/soapbox/features/soapbox_config/components/site-preview.tsx
+++ b/app/soapbox/features/soapbox-config/components/site-preview.tsx
@@ -4,7 +4,7 @@ import { FormattedMessage } from 'react-intl';
import { defaultSettings } from 'soapbox/actions/settings';
import SiteLogo from 'soapbox/components/site-logo';
-import BackgroundShapes from 'soapbox/features/ui/components/background_shapes';
+import BackgroundShapes from 'soapbox/features/ui/components/background-shapes';
import { useSystemTheme } from 'soapbox/hooks';
import { normalizeSoapboxConfig } from 'soapbox/normalizers';
import { generateThemeCss } from 'soapbox/utils/theme';
diff --git a/app/soapbox/features/soapbox_config/forkawesome.json b/app/soapbox/features/soapbox-config/forkawesome.json
similarity index 100%
rename from app/soapbox/features/soapbox_config/forkawesome.json
rename to app/soapbox/features/soapbox-config/forkawesome.json
diff --git a/app/soapbox/features/soapbox_config/index.tsx b/app/soapbox/features/soapbox-config/index.tsx
similarity index 99%
rename from app/soapbox/features/soapbox_config/index.tsx
rename to app/soapbox/features/soapbox-config/index.tsx
index 222c444346..72cd1de7d8 100644
--- a/app/soapbox/features/soapbox_config/index.tsx
+++ b/app/soapbox/features/soapbox-config/index.tsx
@@ -7,6 +7,7 @@ import { uploadMedia } from 'soapbox/actions/media';
import snackbar from 'soapbox/actions/snackbar';
import List, { ListItem } from 'soapbox/components/list';
import {
+ Accordion,
Column,
CardHeader,
CardTitle,
@@ -24,8 +25,6 @@ import ThemeSelector from 'soapbox/features/ui/components/theme-selector';
import { useAppSelector, useAppDispatch } from 'soapbox/hooks';
import { normalizeSoapboxConfig } from 'soapbox/normalizers';
-import Accordion from '../ui/components/accordion';
-
import ColorWithPicker from './components/color-with-picker';
import CryptoAddressInput from './components/crypto-address-input';
import FooterLinkInput from './components/footer-link-input';
diff --git a/app/soapbox/features/soapbox_config/components/icon-picker-menu.js b/app/soapbox/features/soapbox_config/components/icon-picker-menu.js
deleted file mode 100644
index a9b6be2f2c..0000000000
Binary files a/app/soapbox/features/soapbox_config/components/icon-picker-menu.js and /dev/null differ
diff --git a/app/soapbox/features/soapbox_config/components/icon_picker_dropdown.js b/app/soapbox/features/soapbox_config/components/icon_picker_dropdown.js
deleted file mode 100644
index 5393f0dc89..0000000000
Binary files a/app/soapbox/features/soapbox_config/components/icon_picker_dropdown.js and /dev/null differ
diff --git a/app/soapbox/features/status/components/card.tsx b/app/soapbox/features/status/components/card.tsx
index 3d83020fee..18dd427a51 100644
--- a/app/soapbox/features/status/components/card.tsx
+++ b/app/soapbox/features/status/components/card.tsx
@@ -5,7 +5,9 @@ import React, { useState, useEffect } from 'react';
import Blurhash from 'soapbox/components/blurhash';
import Icon from 'soapbox/components/icon';
import { HStack, Stack, Text } from 'soapbox/components/ui';
+import { useSettings } from 'soapbox/hooks';
import { normalizeAttachment } from 'soapbox/normalizers';
+import { addAutoPlay } from 'soapbox/utils/media';
import type { Card as CardEntity, Attachment } from 'soapbox/types/entities';
@@ -19,30 +21,6 @@ const trim = (text: string, len: number): string => {
return text.substring(0, cut) + (text.length > len ? '…' : '');
};
-const domParser = new DOMParser();
-
-const addAutoPlay = (html: string): string => {
- const document = domParser.parseFromString(html, 'text/html').documentElement;
- const iframe = document.querySelector('iframe');
-
- if (iframe) {
- if (iframe.src.includes('?')) {
- iframe.src += '&';
- } else {
- iframe.src += '?';
- }
-
- iframe.src += 'autoplay=1&auto_play=1';
- iframe.allow = 'autoplay';
-
- // DOM parser creates html/body elements around original HTML fragment,
- // so we need to get innerHTML out of the body and not the entire document
- return (document.querySelector('body') as HTMLBodyElement).innerHTML;
- }
-
- return html;
-};
-
interface ICard {
card: CardEntity,
maxTitle?: number,
@@ -64,6 +42,9 @@ const Card: React.FC = ({
onOpenMedia,
horizontal,
}): JSX.Element => {
+ const settings = useSettings();
+ const shouldAutoPlayVideo = settings.get('autoPlayVideo');
+
const [width, setWidth] = useState(defaultWidth);
const [embedded, setEmbedded] = useState(false);
@@ -111,7 +92,7 @@ const Card: React.FC = ({
};
const renderVideo = () => {
- const content = { __html: addAutoPlay(card.html) };
+ const content = { __html: shouldAutoPlayVideo ? addAutoPlay(card.html) : card.html };
const ratio = getRatio(card);
const height = width / ratio;
diff --git a/app/soapbox/features/status/components/detailed-status.tsx b/app/soapbox/features/status/components/detailed-status.tsx
index eb6fb240fc..80ab50022f 100644
--- a/app/soapbox/features/status/components/detailed-status.tsx
+++ b/app/soapbox/features/status/components/detailed-status.tsx
@@ -3,14 +3,14 @@ import React, { useRef } from 'react';
import { FormattedDate, FormattedMessage, useIntl } from 'react-intl';
import Icon from 'soapbox/components/icon';
+import StatusContent from 'soapbox/components/status-content';
import StatusMedia from 'soapbox/components/status-media';
import StatusReplyMentions from 'soapbox/components/status-reply-mentions';
-import StatusContent from 'soapbox/components/status_content';
import SensitiveContentOverlay from 'soapbox/components/statuses/sensitive-content-overlay';
import TranslateButton from 'soapbox/components/translate-button';
import { HStack, Stack, Text } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
-import QuotedStatus from 'soapbox/features/status/containers/quoted_status_container';
+import AccountContainer from 'soapbox/containers/account-container';
+import QuotedStatus from 'soapbox/features/status/containers/quoted-status-container';
import { getActualStatus } from 'soapbox/utils/status';
import StatusInteractionBar from './status-interaction-bar';
@@ -88,7 +88,7 @@ const DetailedStatus: React.FC = ({
(
diff --git a/app/soapbox/features/ui/components/accordion.tsx b/app/soapbox/features/ui/components/accordion.tsx
deleted file mode 100644
index f425e5321a..0000000000
--- a/app/soapbox/features/ui/components/accordion.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import classNames from 'clsx';
-import React from 'react';
-import { defineMessages, useIntl } from 'react-intl';
-
-import { Text } from 'soapbox/components/ui';
-import DropdownMenu from 'soapbox/containers/dropdown_menu_container';
-
-import type { Menu } from 'soapbox/components/dropdown_menu';
-
-const messages = defineMessages({
- collapse: { id: 'accordion.collapse', defaultMessage: 'Collapse' },
- expand: { id: 'accordion.expand', defaultMessage: 'Expand' },
-});
-
-interface IAccordion {
- headline: React.ReactNode,
- children?: React.ReactNode,
- menu?: Menu,
- expanded?: boolean,
- onToggle?: (value: boolean) => void,
-}
-
-const Accordion: React.FC = ({ headline, children, menu, expanded = false, onToggle = () => {} }) => {
- const intl = useIntl();
-
- const handleToggle = (e: React.MouseEvent) => {
- onToggle(!expanded);
- e.preventDefault();
- };
-
- return (
-
- {menu && (
-
-
-
- )}
-
-
- {children}
-
-
- );
-};
-
-export default Accordion;
diff --git a/app/soapbox/features/ui/components/background_shapes.tsx b/app/soapbox/features/ui/components/background-shapes.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/background_shapes.tsx
rename to app/soapbox/features/ui/components/background-shapes.tsx
diff --git a/app/soapbox/features/ui/components/better_column.js b/app/soapbox/features/ui/components/better-column.js
similarity index 91%
rename from app/soapbox/features/ui/components/better_column.js
rename to app/soapbox/features/ui/components/better-column.js
index 0efc19c3f1..2547acb339 100644
Binary files a/app/soapbox/features/ui/components/better_column.js and b/app/soapbox/features/ui/components/better-column.js differ
diff --git a/app/soapbox/features/ui/components/bundle_column_error.tsx b/app/soapbox/features/ui/components/bundle-column-error.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/bundle_column_error.tsx
rename to app/soapbox/features/ui/components/bundle-column-error.tsx
diff --git a/app/soapbox/features/ui/components/bundle_modal_error.tsx b/app/soapbox/features/ui/components/bundle-modal-error.tsx
similarity index 95%
rename from app/soapbox/features/ui/components/bundle_modal_error.tsx
rename to app/soapbox/features/ui/components/bundle-modal-error.tsx
index 2945c442b6..21e140d5b5 100644
--- a/app/soapbox/features/ui/components/bundle_modal_error.tsx
+++ b/app/soapbox/features/ui/components/bundle-modal-error.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import { defineMessages, useIntl } from 'react-intl';
-import IconButton from 'soapbox/components/icon_button';
+import IconButton from 'soapbox/components/icon-button';
const messages = defineMessages({
error: { id: 'bundle_modal_error.message', defaultMessage: 'Something went wrong while loading this page.' },
diff --git a/app/soapbox/features/ui/components/column_forbidden.tsx b/app/soapbox/features/ui/components/column-forbidden.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/column_forbidden.tsx
rename to app/soapbox/features/ui/components/column-forbidden.tsx
diff --git a/app/soapbox/features/ui/components/column_header.tsx b/app/soapbox/features/ui/components/column-header.tsx
similarity index 94%
rename from app/soapbox/features/ui/components/column_header.tsx
rename to app/soapbox/features/ui/components/column-header.tsx
index fc0d6e7c95..2c61be2359 100644
--- a/app/soapbox/features/ui/components/column_header.tsx
+++ b/app/soapbox/features/ui/components/column-header.tsx
@@ -2,7 +2,7 @@ import React from 'react';
// import classNames from 'clsx';
// import Icon from 'soapbox/components/icon';
-import SubNavigation from 'soapbox/components/sub_navigation';
+import SubNavigation from 'soapbox/components/sub-navigation';
interface IColumnHeader {
icon?: string,
diff --git a/app/soapbox/features/ui/components/column_loading.tsx b/app/soapbox/features/ui/components/column-loading.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/column_loading.tsx
rename to app/soapbox/features/ui/components/column-loading.tsx
diff --git a/app/soapbox/features/ui/components/column.tsx b/app/soapbox/features/ui/components/column.tsx
index f0bc6cfdfc..9604049b49 100644
--- a/app/soapbox/features/ui/components/column.tsx
+++ b/app/soapbox/features/ui/components/column.tsx
@@ -3,7 +3,7 @@ import React from 'react';
import Pullable from 'soapbox/components/pullable';
import { Column } from 'soapbox/components/ui';
-import ColumnHeader from './column_header';
+import ColumnHeader from './column-header';
import type { IColumn } from 'soapbox/components/ui/column/column';
diff --git a/app/soapbox/features/ui/components/columns_area.tsx b/app/soapbox/features/ui/components/columns-area.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/columns_area.tsx
rename to app/soapbox/features/ui/components/columns-area.tsx
diff --git a/app/soapbox/features/ui/components/funding_panel.tsx b/app/soapbox/features/ui/components/funding-panel.tsx
similarity index 75%
rename from app/soapbox/features/ui/components/funding_panel.tsx
rename to app/soapbox/features/ui/components/funding-panel.tsx
index 48245a7419..3d34413835 100644
--- a/app/soapbox/features/ui/components/funding_panel.tsx
+++ b/app/soapbox/features/ui/components/funding-panel.tsx
@@ -2,7 +2,7 @@ import React, { useEffect } from 'react';
import { FormattedMessage } from 'react-intl';
import { fetchPatronInstance } from 'soapbox/actions/patron';
-import { Widget, Button, ProgressBar, Text } from 'soapbox/components/ui';
+import { Widget, Button, ProgressBar, Text, Stack } from 'soapbox/components/ui';
import { useAppSelector, useAppDispatch } from 'soapbox/hooks';
/** Open link in a new tab. */
@@ -42,7 +42,7 @@ const FundingPanel: React.FC = () => {
let ratioText;
if (goalReached) {
- ratioText = <>{moneyFormat(goal)} per month— reached!>;
+ ratioText = <>{moneyFormat(goal)} per month — reached!>;
} else {
ratioText = <>{moneyFormat(amount)} out of {moneyFormat(goal)} per month>;
}
@@ -56,18 +56,19 @@ const FundingPanel: React.FC = () => {
title={}
onActionClick={handleDonateClick}
>
-
- {ratioText}
-
-
-
- {goalText}
-
-
-
-
+
+
+ {ratioText}
+
+
+
+
+ {goalText}
+
+
+
);
};
diff --git a/app/soapbox/features/ui/components/instance_info_panel.tsx b/app/soapbox/features/ui/components/instance-info-panel.tsx
similarity index 96%
rename from app/soapbox/features/ui/components/instance_info_panel.tsx
rename to app/soapbox/features/ui/components/instance-info-panel.tsx
index 3467455b37..281182cbce 100644
--- a/app/soapbox/features/ui/components/instance_info_panel.tsx
+++ b/app/soapbox/features/ui/components/instance-info-panel.tsx
@@ -3,7 +3,7 @@
import React from 'react';
import { useIntl, defineMessages } from 'react-intl';
-import { pinHost, unpinHost } from 'soapbox/actions/remote_timeline';
+import { pinHost, unpinHost } from 'soapbox/actions/remote-timeline';
import { Widget } from 'soapbox/components/ui';
import { useAppSelector, useAppDispatch, useSettings } from 'soapbox/hooks';
import { makeGetRemoteInstance } from 'soapbox/selectors';
diff --git a/app/soapbox/features/ui/components/instance_moderation_panel.tsx b/app/soapbox/features/ui/components/instance-moderation-panel.tsx
similarity index 90%
rename from app/soapbox/features/ui/components/instance_moderation_panel.tsx
rename to app/soapbox/features/ui/components/instance-moderation-panel.tsx
index 3ea9cf7150..4a53a769f3 100644
--- a/app/soapbox/features/ui/components/instance_moderation_panel.tsx
+++ b/app/soapbox/features/ui/components/instance-moderation-panel.tsx
@@ -5,8 +5,8 @@ import { useIntl, defineMessages, FormattedMessage } from 'react-intl';
import { openModal } from 'soapbox/actions/modals';
import { Widget } from 'soapbox/components/ui';
-import DropdownMenu from 'soapbox/containers/dropdown_menu_container';
-import InstanceRestrictions from 'soapbox/features/federation_restrictions/components/instance_restrictions';
+import DropdownMenu from 'soapbox/containers/dropdown-menu-container';
+import InstanceRestrictions from 'soapbox/features/federation-restrictions/components/instance-restrictions';
import { useAppSelector, useAppDispatch, useOwnAccount } from 'soapbox/hooks';
import { makeGetRemoteInstance } from 'soapbox/selectors';
diff --git a/app/soapbox/features/ui/components/link_footer.tsx b/app/soapbox/features/ui/components/link-footer.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/link_footer.tsx
rename to app/soapbox/features/ui/components/link-footer.tsx
diff --git a/app/soapbox/features/ui/components/list_panel.tsx b/app/soapbox/features/ui/components/list-panel.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/list_panel.tsx
rename to app/soapbox/features/ui/components/list-panel.tsx
diff --git a/app/soapbox/features/ui/components/modal_loading.tsx b/app/soapbox/features/ui/components/modal-loading.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/modal_loading.tsx
rename to app/soapbox/features/ui/components/modal-loading.tsx
diff --git a/app/soapbox/features/ui/components/modal_root.tsx b/app/soapbox/features/ui/components/modal-root.tsx
similarity index 93%
rename from app/soapbox/features/ui/components/modal_root.tsx
rename to app/soapbox/features/ui/components/modal-root.tsx
index 53e12b0c55..45733ddf61 100644
--- a/app/soapbox/features/ui/components/modal_root.tsx
+++ b/app/soapbox/features/ui/components/modal-root.tsx
@@ -1,6 +1,6 @@
import React from 'react';
-import Base from 'soapbox/components/modal_root';
+import Base from 'soapbox/components/modal-root';
import {
MediaModal,
VideoModal,
@@ -34,11 +34,11 @@ import {
PolicyModal,
} from 'soapbox/features/ui/util/async-components';
-import BundleContainer from '../containers/bundle_container';
+import BundleContainer from '../containers/bundle-container';
import { BundleProps } from './bundle';
-import BundleModalError from './bundle_modal_error';
-import ModalLoading from './modal_loading';
+import BundleModalError from './bundle-modal-error';
+import ModalLoading from './modal-loading';
const MODAL_COMPONENTS = {
'MEDIA': MediaModal,
diff --git a/app/soapbox/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx b/app/soapbox/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx
index 8c9f3df06d..264ffcfb4c 100644
--- a/app/soapbox/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx
+++ b/app/soapbox/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx
@@ -12,7 +12,7 @@ import { deactivateUserModal, deleteUserModal } from 'soapbox/actions/moderation
import snackbar from 'soapbox/actions/snackbar';
import Account from 'soapbox/components/account';
import List, { ListItem } from 'soapbox/components/list';
-import MissingIndicator from 'soapbox/components/missing_indicator';
+import MissingIndicator from 'soapbox/components/missing-indicator';
import OutlineBox from 'soapbox/components/outline-box';
import { Button, Text, HStack, Modal, Stack, Toggle } from 'soapbox/components/ui';
import { useAppDispatch, useAppSelector, useFeatures, useOwnAccount } from 'soapbox/hooks';
diff --git a/app/soapbox/features/ui/components/account_note_modal.tsx b/app/soapbox/features/ui/components/modals/account-note-modal.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/account_note_modal.tsx
rename to app/soapbox/features/ui/components/modals/account-note-modal.tsx
diff --git a/app/soapbox/features/ui/components/actions_modal.tsx b/app/soapbox/features/ui/components/modals/actions-modal.tsx
similarity index 93%
rename from app/soapbox/features/ui/components/actions_modal.tsx
rename to app/soapbox/features/ui/components/modals/actions-modal.tsx
index cc00126f63..7648069faf 100644
--- a/app/soapbox/features/ui/components/actions_modal.tsx
+++ b/app/soapbox/features/ui/components/modals/actions-modal.tsx
@@ -4,13 +4,13 @@ import { FormattedMessage } from 'react-intl';
import { spring } from 'react-motion';
import Icon from 'soapbox/components/icon';
-import StatusContent from 'soapbox/components/status_content';
+import StatusContent from 'soapbox/components/status-content';
import { Stack } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
+import AccountContainer from 'soapbox/containers/account-container';
-import Motion from '../util/optional_motion';
+import Motion from '../../util/optional-motion';
-import type { Menu, MenuItem } from 'soapbox/components/dropdown_menu';
+import type { Menu, MenuItem } from 'soapbox/components/dropdown-menu';
import type { Status as StatusEntity } from 'soapbox/types/entities';
interface IActionsModal {
diff --git a/app/soapbox/features/ui/components/birthdays_modal.tsx b/app/soapbox/features/ui/components/modals/birthdays-modal.tsx
similarity index 95%
rename from app/soapbox/features/ui/components/birthdays_modal.tsx
rename to app/soapbox/features/ui/components/modals/birthdays-modal.tsx
index 058a16cfc8..2eb9504eca 100644
--- a/app/soapbox/features/ui/components/birthdays_modal.tsx
+++ b/app/soapbox/features/ui/components/modals/birthdays-modal.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import { FormattedMessage } from 'react-intl';
-import ScrollableList from 'soapbox/components/scrollable_list';
+import ScrollableList from 'soapbox/components/scrollable-list';
import { Modal, Spinner } from 'soapbox/components/ui';
import Account from 'soapbox/features/birthdays/account';
import { useAppSelector } from 'soapbox/hooks';
diff --git a/app/soapbox/features/ui/components/boost_modal.tsx b/app/soapbox/features/ui/components/modals/boost-modal.tsx
similarity index 98%
rename from app/soapbox/features/ui/components/boost_modal.tsx
rename to app/soapbox/features/ui/components/modals/boost-modal.tsx
index 613fdaba27..3a09be5c32 100644
--- a/app/soapbox/features/ui/components/boost_modal.tsx
+++ b/app/soapbox/features/ui/components/modals/boost-modal.tsx
@@ -3,7 +3,7 @@ import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import Icon from 'soapbox/components/icon';
import { Modal, Stack, Text } from 'soapbox/components/ui';
-import ReplyIndicator from 'soapbox/features/compose/components/reply_indicator';
+import ReplyIndicator from 'soapbox/features/compose/components/reply-indicator';
import type { Status as StatusEntity } from 'soapbox/types/entities';
diff --git a/app/soapbox/features/ui/components/compare_history_modal.tsx b/app/soapbox/features/ui/components/modals/compare-history-modal.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/compare_history_modal.tsx
rename to app/soapbox/features/ui/components/modals/compare-history-modal.tsx
diff --git a/app/soapbox/features/ui/components/component_modal.tsx b/app/soapbox/features/ui/components/modals/component-modal.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/component_modal.tsx
rename to app/soapbox/features/ui/components/modals/component-modal.tsx
diff --git a/app/soapbox/features/ui/components/compose_modal.tsx b/app/soapbox/features/ui/components/modals/compose-modal.tsx
similarity index 95%
rename from app/soapbox/features/ui/components/compose_modal.tsx
rename to app/soapbox/features/ui/components/modals/compose-modal.tsx
index 5dc86766ba..bf2cdd5621 100644
--- a/app/soapbox/features/ui/components/compose_modal.tsx
+++ b/app/soapbox/features/ui/components/modals/compose-modal.tsx
@@ -3,11 +3,11 @@ import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import { cancelReplyCompose } from 'soapbox/actions/compose';
import { openModal, closeModal } from 'soapbox/actions/modals';
-import { checkComposeContent } from 'soapbox/components/modal_root';
+import { checkComposeContent } from 'soapbox/components/modal-root';
import { Modal } from 'soapbox/components/ui';
import { useAppDispatch, useCompose } from 'soapbox/hooks';
-import ComposeForm from '../../compose/components/compose-form';
+import ComposeForm from '../../../compose/components/compose-form';
const messages = defineMessages({
close: { id: 'lightbox.close', defaultMessage: 'Close' },
diff --git a/app/soapbox/features/ui/components/confirmation_modal.tsx b/app/soapbox/features/ui/components/modals/confirmation-modal.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/confirmation_modal.tsx
rename to app/soapbox/features/ui/components/modals/confirmation-modal.tsx
diff --git a/app/soapbox/features/ui/components/crypto_donate_modal.tsx b/app/soapbox/features/ui/components/modals/crypto-donate-modal.tsx
similarity index 67%
rename from app/soapbox/features/ui/components/crypto_donate_modal.tsx
rename to app/soapbox/features/ui/components/modals/crypto-donate-modal.tsx
index 29c2dfaa84..c1724ee78c 100644
--- a/app/soapbox/features/ui/components/crypto_donate_modal.tsx
+++ b/app/soapbox/features/ui/components/modals/crypto-donate-modal.tsx
@@ -1,9 +1,9 @@
import React from 'react';
import { Modal } from 'soapbox/components/ui';
-import DetailedCryptoAddress from 'soapbox/features/crypto_donate/components/detailed_crypto_address';
+import DetailedCryptoAddress from 'soapbox/features/crypto-donate/components/detailed-crypto-address';
-import type { ICryptoAddress } from '../../crypto_donate/components/crypto_address';
+import type { ICryptoAddress } from '../../../crypto-donate/components/crypto-address';
const CryptoDonateModal: React.FC void }> = ({ onClose, ...props }) => {
diff --git a/app/soapbox/features/ui/components/edit_federation_modal.tsx b/app/soapbox/features/ui/components/modals/edit-federation-modal.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/edit_federation_modal.tsx
rename to app/soapbox/features/ui/components/modals/edit-federation-modal.tsx
diff --git a/app/soapbox/features/ui/components/embed-modal.tsx b/app/soapbox/features/ui/components/modals/embed-modal.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/embed-modal.tsx
rename to app/soapbox/features/ui/components/modals/embed-modal.tsx
diff --git a/app/soapbox/features/ui/components/familiar_followers_modal.tsx b/app/soapbox/features/ui/components/modals/familiar-followers-modal.tsx
similarity index 93%
rename from app/soapbox/features/ui/components/familiar_followers_modal.tsx
rename to app/soapbox/features/ui/components/modals/familiar-followers-modal.tsx
index f276e9a9ad..3b137ca5f3 100644
--- a/app/soapbox/features/ui/components/familiar_followers_modal.tsx
+++ b/app/soapbox/features/ui/components/modals/familiar-followers-modal.tsx
@@ -2,9 +2,9 @@ import { OrderedSet as ImmutableOrderedSet } from 'immutable';
import React from 'react';
import { FormattedMessage } from 'react-intl';
-import ScrollableList from 'soapbox/components/scrollable_list';
+import ScrollableList from 'soapbox/components/scrollable-list';
import { Modal, Spinner } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
+import AccountContainer from 'soapbox/containers/account-container';
import { useAppSelector } from 'soapbox/hooks';
import { makeGetAccount } from 'soapbox/selectors';
diff --git a/app/soapbox/features/ui/components/modals/favourites-modal.tsx b/app/soapbox/features/ui/components/modals/favourites-modal.tsx
index d414a3c095..9e2b72a611 100644
--- a/app/soapbox/features/ui/components/modals/favourites-modal.tsx
+++ b/app/soapbox/features/ui/components/modals/favourites-modal.tsx
@@ -3,7 +3,7 @@ import { FormattedMessage } from 'react-intl';
import { fetchFavourites } from 'soapbox/actions/interactions';
import { Modal, Spinner, Stack } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
+import AccountContainer from 'soapbox/containers/account-container';
import { useAppDispatch, useAppSelector } from 'soapbox/hooks';
interface IFavouritesModal {
diff --git a/app/soapbox/features/ui/components/hotkeys_modal.tsx b/app/soapbox/features/ui/components/modals/hotkeys-modal.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/hotkeys_modal.tsx
rename to app/soapbox/features/ui/components/modals/hotkeys-modal.tsx
diff --git a/app/soapbox/features/ui/components/media-modal.tsx b/app/soapbox/features/ui/components/modals/media-modal.tsx
similarity index 97%
rename from app/soapbox/features/ui/components/media-modal.tsx
rename to app/soapbox/features/ui/components/modals/media-modal.tsx
index 1a432de3b7..6ed8ef4356 100644
--- a/app/soapbox/features/ui/components/media-modal.tsx
+++ b/app/soapbox/features/ui/components/modals/media-modal.tsx
@@ -4,13 +4,13 @@ import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { useHistory } from 'react-router-dom';
import ReactSwipeableViews from 'react-swipeable-views';
-import ExtendedVideoPlayer from 'soapbox/components/extended_video_player';
+import ExtendedVideoPlayer from 'soapbox/components/extended-video-player';
import Icon from 'soapbox/components/icon';
-import IconButton from 'soapbox/components/icon_button';
+import IconButton from 'soapbox/components/icon-button';
import Audio from 'soapbox/features/audio';
import Video from 'soapbox/features/video';
-import ImageLoader from './image-loader';
+import ImageLoader from '../image-loader';
import type { List as ImmutableList } from 'immutable';
import type { Account, Attachment, Status } from 'soapbox/types/entities';
diff --git a/app/soapbox/features/ui/components/mentions_modal.tsx b/app/soapbox/features/ui/components/modals/mentions-modal.tsx
similarity index 92%
rename from app/soapbox/features/ui/components/mentions_modal.tsx
rename to app/soapbox/features/ui/components/modals/mentions-modal.tsx
index 0cd104cfbe..1df00fb085 100644
--- a/app/soapbox/features/ui/components/mentions_modal.tsx
+++ b/app/soapbox/features/ui/components/modals/mentions-modal.tsx
@@ -3,9 +3,9 @@ import React, { useCallback, useEffect } from 'react';
import { FormattedMessage } from 'react-intl';
import { fetchStatusWithContext } from 'soapbox/actions/statuses';
-import ScrollableList from 'soapbox/components/scrollable_list';
+import ScrollableList from 'soapbox/components/scrollable-list';
import { Modal, Spinner } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
+import AccountContainer from 'soapbox/containers/account-container';
import { useAppDispatch, useAppSelector } from 'soapbox/hooks';
import { makeGetStatus } from 'soapbox/selectors';
diff --git a/app/soapbox/features/ui/components/missing_description_modal.tsx b/app/soapbox/features/ui/components/modals/missing-description-modal.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/missing_description_modal.tsx
rename to app/soapbox/features/ui/components/modals/missing-description-modal.tsx
diff --git a/app/soapbox/features/ui/components/mute_modal.tsx b/app/soapbox/features/ui/components/modals/mute-modal.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/mute_modal.tsx
rename to app/soapbox/features/ui/components/modals/mute-modal.tsx
diff --git a/app/soapbox/features/ui/components/reactions_modal.tsx b/app/soapbox/features/ui/components/modals/reactions-modal.tsx
similarity index 94%
rename from app/soapbox/features/ui/components/reactions_modal.tsx
rename to app/soapbox/features/ui/components/modals/reactions-modal.tsx
index 7d0498c6dd..60c8bd1585 100644
--- a/app/soapbox/features/ui/components/reactions_modal.tsx
+++ b/app/soapbox/features/ui/components/modals/reactions-modal.tsx
@@ -3,11 +3,11 @@ import React, { useEffect, useState } from 'react';
import { FormattedMessage, defineMessages, useIntl } from 'react-intl';
import { fetchFavourites, fetchReactions } from 'soapbox/actions/interactions';
-import ScrollableList from 'soapbox/components/scrollable_list';
+import ScrollableList from 'soapbox/components/scrollable-list';
import { Emoji, Modal, Spinner, Tabs } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
+import AccountContainer from 'soapbox/containers/account-container';
import { useAppDispatch, useAppSelector } from 'soapbox/hooks';
-import { ReactionRecord } from 'soapbox/reducers/user_lists';
+import { ReactionRecord } from 'soapbox/reducers/user-lists';
import type { Item } from 'soapbox/components/ui/tabs/tabs';
diff --git a/app/soapbox/features/ui/components/reblogs_modal.tsx b/app/soapbox/features/ui/components/modals/reblogs-modal.tsx
similarity index 92%
rename from app/soapbox/features/ui/components/reblogs_modal.tsx
rename to app/soapbox/features/ui/components/modals/reblogs-modal.tsx
index 3bacf3a25b..526e7507f9 100644
--- a/app/soapbox/features/ui/components/reblogs_modal.tsx
+++ b/app/soapbox/features/ui/components/modals/reblogs-modal.tsx
@@ -3,9 +3,9 @@ import { FormattedMessage } from 'react-intl';
import { fetchReblogs } from 'soapbox/actions/interactions';
import { fetchStatus } from 'soapbox/actions/statuses';
-import ScrollableList from 'soapbox/components/scrollable_list';
+import ScrollableList from 'soapbox/components/scrollable-list';
import { Modal, Spinner } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
+import AccountContainer from 'soapbox/containers/account-container';
import { useAppDispatch, useAppSelector } from 'soapbox/hooks';
interface IReblogsModal {
diff --git a/app/soapbox/features/ui/components/reply_mentions_modal.tsx b/app/soapbox/features/ui/components/modals/reply-mentions-modal.tsx
similarity index 96%
rename from app/soapbox/features/ui/components/reply_mentions_modal.tsx
rename to app/soapbox/features/ui/components/modals/reply-mentions-modal.tsx
index 2c8fc73b18..eb85d4ecb1 100644
--- a/app/soapbox/features/ui/components/reply_mentions_modal.tsx
+++ b/app/soapbox/features/ui/components/modals/reply-mentions-modal.tsx
@@ -6,7 +6,7 @@ import { useAppSelector, useCompose } from 'soapbox/hooks';
import { statusToMentionsAccountIdsArray } from 'soapbox/reducers/compose';
import { makeGetStatus } from 'soapbox/selectors';
-import Account from '../../reply_mentions/account';
+import Account from '../../../reply-mentions/account';
import type { Account as AccountEntity, Status as StatusEntity } from 'soapbox/types/entities';
diff --git a/app/soapbox/features/ui/components/modals/report-modal/report-modal.tsx b/app/soapbox/features/ui/components/modals/report-modal/report-modal.tsx
index a4db3bbf9d..8261a6e5f7 100644
--- a/app/soapbox/features/ui/components/modals/report-modal/report-modal.tsx
+++ b/app/soapbox/features/ui/components/modals/report-modal/report-modal.tsx
@@ -1,14 +1,15 @@
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
+
import { blockAccount } from 'soapbox/actions/accounts';
import { submitReport, submitReportSuccess, submitReportFail } from 'soapbox/actions/reports';
import { expandAccountTimeline } from 'soapbox/actions/timelines';
import AttachmentThumbs from 'soapbox/components/attachment-thumbs';
import List, { ListItem } from 'soapbox/components/list';
-import StatusContent from 'soapbox/components/status_content';
+import StatusContent from 'soapbox/components/status-content';
import { Avatar, HStack, Icon, Modal, ProgressBar, Stack, Text } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
+import AccountContainer from 'soapbox/containers/account-container';
import { useAccount, useAppDispatch, useAppSelector } from 'soapbox/hooks';
import ConfirmationStep from './steps/confirmation-step';
diff --git a/app/soapbox/features/ui/components/modals/report-modal/steps/other-actions-step.tsx b/app/soapbox/features/ui/components/modals/report-modal/steps/other-actions-step.tsx
index e50a90778c..964fbd1ca1 100644
--- a/app/soapbox/features/ui/components/modals/report-modal/steps/other-actions-step.tsx
+++ b/app/soapbox/features/ui/components/modals/report-modal/steps/other-actions-step.tsx
@@ -7,7 +7,7 @@ import Toggle from 'react-toggle';
import { changeReportBlock, changeReportForward } from 'soapbox/actions/reports';
import { fetchRules } from 'soapbox/actions/rules';
import { Button, FormGroup, HStack, Stack, Text } from 'soapbox/components/ui';
-import StatusCheckBox from 'soapbox/features/report/components/status_check_box';
+import StatusCheckBox from 'soapbox/features/report/components/status-check-box';
import { useAppSelector, useFeatures } from 'soapbox/hooks';
import { isRemote, getDomain } from 'soapbox/utils/accounts';
diff --git a/app/soapbox/features/ui/components/unauthorized_modal.tsx b/app/soapbox/features/ui/components/modals/unauthorized-modal.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/unauthorized_modal.tsx
rename to app/soapbox/features/ui/components/modals/unauthorized-modal.tsx
diff --git a/app/soapbox/features/ui/components/video_modal.tsx b/app/soapbox/features/ui/components/modals/video-modal.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/video_modal.tsx
rename to app/soapbox/features/ui/components/modals/video-modal.tsx
diff --git a/app/soapbox/features/ui/components/pending_status.tsx b/app/soapbox/features/ui/components/pending-status.tsx
similarity index 90%
rename from app/soapbox/features/ui/components/pending_status.tsx
rename to app/soapbox/features/ui/components/pending-status.tsx
index 64f0d168b7..5ea14a72bf 100644
--- a/app/soapbox/features/ui/components/pending_status.tsx
+++ b/app/soapbox/features/ui/components/pending-status.tsx
@@ -1,18 +1,18 @@
import classNames from 'clsx';
import React from 'react';
+import StatusContent from 'soapbox/components/status-content';
import StatusReplyMentions from 'soapbox/components/status-reply-mentions';
-import StatusContent from 'soapbox/components/status_content';
import { Card, HStack } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
-import PlaceholderCard from 'soapbox/features/placeholder/components/placeholder_card';
-import PlaceholderMediaGallery from 'soapbox/features/placeholder/components/placeholder_media_gallery';
-import QuotedStatus from 'soapbox/features/status/containers/quoted_status_container';
+import AccountContainer from 'soapbox/containers/account-container';
+import PlaceholderCard from 'soapbox/features/placeholder/components/placeholder-card';
+import PlaceholderMediaGallery from 'soapbox/features/placeholder/components/placeholder-media-gallery';
+import QuotedStatus from 'soapbox/features/status/containers/quoted-status-container';
import { useAppSelector } from 'soapbox/hooks';
-import { buildStatus } from '../util/pending_status_builder';
+import { buildStatus } from '../util/pending-status-builder';
-import PollPreview from './poll_preview';
+import PollPreview from './poll-preview';
import type { Account as AccountEntity, Status as StatusEntity } from 'soapbox/types/entities';
diff --git a/app/soapbox/features/ui/components/pinned_accounts_panel.tsx b/app/soapbox/features/ui/components/pinned-accounts-panel.tsx
similarity index 95%
rename from app/soapbox/features/ui/components/pinned_accounts_panel.tsx
rename to app/soapbox/features/ui/components/pinned-accounts-panel.tsx
index d1b168c7c9..8139f342e4 100644
--- a/app/soapbox/features/ui/components/pinned_accounts_panel.tsx
+++ b/app/soapbox/features/ui/components/pinned-accounts-panel.tsx
@@ -4,8 +4,8 @@ import { FormattedMessage } from 'react-intl';
import { fetchPinnedAccounts } from 'soapbox/actions/accounts';
import { Widget } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
-import BundleContainer from 'soapbox/features/ui/containers/bundle_container';
+import AccountContainer from 'soapbox/containers/account-container';
+import BundleContainer from 'soapbox/features/ui/containers/bundle-container';
import { WhoToFollowPanel } from 'soapbox/features/ui/util/async-components';
import { useAppDispatch, useAppSelector } from 'soapbox/hooks';
diff --git a/app/soapbox/features/ui/components/poll_preview.tsx b/app/soapbox/features/ui/components/poll-preview.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/poll_preview.tsx
rename to app/soapbox/features/ui/components/poll-preview.tsx
diff --git a/app/soapbox/features/ui/components/profile_familiar_followers.tsx b/app/soapbox/features/ui/components/profile-familiar-followers.tsx
similarity index 94%
rename from app/soapbox/features/ui/components/profile_familiar_followers.tsx
rename to app/soapbox/features/ui/components/profile-familiar-followers.tsx
index a07f18c4da..5a9d9ede9c 100644
--- a/app/soapbox/features/ui/components/profile_familiar_followers.tsx
+++ b/app/soapbox/features/ui/components/profile-familiar-followers.tsx
@@ -4,11 +4,11 @@ import { FormattedList, FormattedMessage } from 'react-intl';
import { useDispatch } from 'react-redux';
import { Link } from 'react-router-dom';
-import { fetchAccountFamiliarFollowers } from 'soapbox/actions/familiar_followers';
+import { fetchAccountFamiliarFollowers } from 'soapbox/actions/familiar-followers';
import { openModal } from 'soapbox/actions/modals';
-import HoverRefWrapper from 'soapbox/components/hover_ref_wrapper';
+import HoverRefWrapper from 'soapbox/components/hover-ref-wrapper';
import { Text } from 'soapbox/components/ui';
-import VerificationBadge from 'soapbox/components/verification_badge';
+import VerificationBadge from 'soapbox/components/verification-badge';
import { useAppSelector, useFeatures } from 'soapbox/hooks';
import { makeGetAccount } from 'soapbox/selectors';
diff --git a/app/soapbox/features/ui/components/profile_fields_panel.tsx b/app/soapbox/features/ui/components/profile-fields-panel.tsx
similarity index 99%
rename from app/soapbox/features/ui/components/profile_fields_panel.tsx
rename to app/soapbox/features/ui/components/profile-fields-panel.tsx
index 053226dcc6..dfa4dc84ad 100644
--- a/app/soapbox/features/ui/components/profile_fields_panel.tsx
+++ b/app/soapbox/features/ui/components/profile-fields-panel.tsx
@@ -3,7 +3,7 @@ import React from 'react';
import { defineMessages, useIntl, FormattedMessage, FormatDateOptions } from 'react-intl';
import { Widget, Stack, HStack, Icon, Text } from 'soapbox/components/ui';
-import BundleContainer from 'soapbox/features/ui/containers/bundle_container';
+import BundleContainer from 'soapbox/features/ui/containers/bundle-container';
import { CryptoAddress } from 'soapbox/features/ui/util/async-components';
import type { Account, Field } from 'soapbox/types/entities';
diff --git a/app/soapbox/features/ui/components/profile_info_panel.tsx b/app/soapbox/features/ui/components/profile-info-panel.tsx
similarity index 97%
rename from app/soapbox/features/ui/components/profile_info_panel.tsx
rename to app/soapbox/features/ui/components/profile-info-panel.tsx
index c6c6d084e3..cf97b78e7c 100644
--- a/app/soapbox/features/ui/components/profile_info_panel.tsx
+++ b/app/soapbox/features/ui/components/profile-info-panel.tsx
@@ -5,14 +5,14 @@ import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import Badge from 'soapbox/components/badge';
import { Icon, HStack, Stack, Text } from 'soapbox/components/ui';
-import VerificationBadge from 'soapbox/components/verification_badge';
+import VerificationBadge from 'soapbox/components/verification-badge';
import { useSoapboxConfig } from 'soapbox/hooks';
import { isLocal } from 'soapbox/utils/accounts';
import { badgeToTag, getBadges as getAccountBadges } from 'soapbox/utils/badges';
import { capitalize } from 'soapbox/utils/strings';
-import ProfileFamiliarFollowers from './profile_familiar_followers';
-import ProfileStats from './profile_stats';
+import ProfileFamiliarFollowers from './profile-familiar-followers';
+import ProfileStats from './profile-stats';
import type { Account } from 'soapbox/types/entities';
diff --git a/app/soapbox/features/ui/components/profile_media_panel.tsx b/app/soapbox/features/ui/components/profile-media-panel.tsx
similarity index 97%
rename from app/soapbox/features/ui/components/profile_media_panel.tsx
rename to app/soapbox/features/ui/components/profile-media-panel.tsx
index 78ecfa2c70..64d7c81800 100644
--- a/app/soapbox/features/ui/components/profile_media_panel.tsx
+++ b/app/soapbox/features/ui/components/profile-media-panel.tsx
@@ -9,7 +9,7 @@ import { Spinner, Widget } from 'soapbox/components/ui';
import { useAppSelector } from 'soapbox/hooks';
import { getAccountGallery } from 'soapbox/selectors';
-import MediaItem from '../../account_gallery/components/media_item';
+import MediaItem from '../../account-gallery/components/media-item';
import type { Account, Attachment } from 'soapbox/types/entities';
diff --git a/app/soapbox/features/ui/components/profile_stats.tsx b/app/soapbox/features/ui/components/profile-stats.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/profile_stats.tsx
rename to app/soapbox/features/ui/components/profile-stats.tsx
diff --git a/app/soapbox/features/ui/components/promo_panel.tsx b/app/soapbox/features/ui/components/promo-panel.tsx
similarity index 100%
rename from app/soapbox/features/ui/components/promo_panel.tsx
rename to app/soapbox/features/ui/components/promo-panel.tsx
diff --git a/app/soapbox/features/ui/components/timeline.tsx b/app/soapbox/features/ui/components/timeline.tsx
index 38c5a4341b..3b5e71f817 100644
--- a/app/soapbox/features/ui/components/timeline.tsx
+++ b/app/soapbox/features/ui/components/timeline.tsx
@@ -5,7 +5,7 @@ import { defineMessages } from 'react-intl';
import { dequeueTimeline, scrollTopTimeline } from 'soapbox/actions/timelines';
import ScrollTopButton from 'soapbox/components/scroll-top-button';
-import StatusList, { IStatusList } from 'soapbox/components/status_list';
+import StatusList, { IStatusList } from 'soapbox/components/status-list';
import { useAppSelector, useAppDispatch } from 'soapbox/hooks';
import { makeGetStatusIds } from 'soapbox/selectors';
diff --git a/app/soapbox/features/ui/components/upload_area.tsx b/app/soapbox/features/ui/components/upload-area.tsx
similarity index 97%
rename from app/soapbox/features/ui/components/upload_area.tsx
rename to app/soapbox/features/ui/components/upload-area.tsx
index 6aeb5caa2c..5cc0c9e647 100644
--- a/app/soapbox/features/ui/components/upload_area.tsx
+++ b/app/soapbox/features/ui/components/upload-area.tsx
@@ -5,7 +5,7 @@ import { spring } from 'react-motion';
import { Icon, Stack, Text } from 'soapbox/components/ui';
-import Motion from '../../ui/util/optional_motion';
+import Motion from '../util/optional-motion';
interface IUploadArea {
/** Whether the upload area is active. */
diff --git a/app/soapbox/features/ui/components/user_panel.tsx b/app/soapbox/features/ui/components/user-panel.tsx
similarity index 97%
rename from app/soapbox/features/ui/components/user_panel.tsx
rename to app/soapbox/features/ui/components/user-panel.tsx
index 3c801fd255..8f0fbf5171 100644
--- a/app/soapbox/features/ui/components/user_panel.tsx
+++ b/app/soapbox/features/ui/components/user-panel.tsx
@@ -3,9 +3,9 @@ import { FormattedMessage, useIntl } from 'react-intl';
import { Link } from 'react-router-dom';
import Avatar from 'soapbox/components/avatar';
-import StillImage from 'soapbox/components/still_image';
+import StillImage from 'soapbox/components/still-image';
import { HStack, Stack, Text } from 'soapbox/components/ui';
-import VerificationBadge from 'soapbox/components/verification_badge';
+import VerificationBadge from 'soapbox/components/verification-badge';
import { useAppSelector } from 'soapbox/hooks';
import { makeGetAccount } from 'soapbox/selectors';
import { getAcct } from 'soapbox/utils/accounts';
diff --git a/app/soapbox/features/ui/components/who-to-follow-panel.tsx b/app/soapbox/features/ui/components/who-to-follow-panel.tsx
index 852abcdba6..f479aceadb 100644
--- a/app/soapbox/features/ui/components/who-to-follow-panel.tsx
+++ b/app/soapbox/features/ui/components/who-to-follow-panel.tsx
@@ -3,7 +3,7 @@ import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import { Link } from 'react-router-dom';
import { Text, Widget } from 'soapbox/components/ui';
-import AccountContainer from 'soapbox/containers/account_container';
+import AccountContainer from 'soapbox/containers/account-container';
import PlaceholderSidebarSuggestions from 'soapbox/features/placeholder/components/placeholder-sidebar-suggestions';
import { useDismissSuggestion, useSuggestions } from 'soapbox/queries/suggestions';
diff --git a/app/soapbox/features/ui/containers/bundle_container.tsx b/app/soapbox/features/ui/containers/bundle-container.tsx
similarity index 100%
rename from app/soapbox/features/ui/containers/bundle_container.tsx
rename to app/soapbox/features/ui/containers/bundle-container.tsx
diff --git a/app/soapbox/features/ui/containers/modal_container.ts b/app/soapbox/features/ui/containers/modal-container.ts
similarity index 93%
rename from app/soapbox/features/ui/containers/modal_container.ts
rename to app/soapbox/features/ui/containers/modal-container.ts
index dc24254c39..987a8d574c 100644
--- a/app/soapbox/features/ui/containers/modal_container.ts
+++ b/app/soapbox/features/ui/containers/modal-container.ts
@@ -4,7 +4,7 @@ import { cancelReplyCompose } from 'soapbox/actions/compose';
import { closeModal } from 'soapbox/actions/modals';
import { cancelReport } from 'soapbox/actions/reports';
-import ModalRoot, { ModalType } from '../components/modal_root';
+import ModalRoot, { ModalType } from '../components/modal-root';
import type { AppDispatch, RootState } from 'soapbox/store';
diff --git a/app/soapbox/features/ui/containers/notifications_container.tsx b/app/soapbox/features/ui/containers/notifications-container.tsx
similarity index 100%
rename from app/soapbox/features/ui/containers/notifications_container.tsx
rename to app/soapbox/features/ui/containers/notifications-container.tsx
diff --git a/app/soapbox/features/ui/index.tsx b/app/soapbox/features/ui/index.tsx
index 23a1d36ed3..d3431a45a1 100644
--- a/app/soapbox/features/ui/index.tsx
+++ b/app/soapbox/features/ui/index.tsx
@@ -10,38 +10,38 @@ import { fetchFollowRequests } from 'soapbox/actions/accounts';
import { fetchReports, fetchUsers, fetchConfig } from 'soapbox/actions/admin';
import { fetchAnnouncements } from 'soapbox/actions/announcements';
import { uploadCompose, resetCompose } from 'soapbox/actions/compose';
-import { fetchCustomEmojis } from 'soapbox/actions/custom_emojis';
+import { fetchCustomEmojis } from 'soapbox/actions/custom-emojis';
import { fetchFilters } from 'soapbox/actions/filters';
import { fetchMarker } from 'soapbox/actions/markers';
import { openModal } from 'soapbox/actions/modals';
import { expandNotifications } from 'soapbox/actions/notifications';
-import { register as registerPushNotifications } from 'soapbox/actions/push_notifications';
-import { fetchScheduledStatuses } from 'soapbox/actions/scheduled_statuses';
+import { register as registerPushNotifications } from 'soapbox/actions/push-notifications';
+import { fetchScheduledStatuses } from 'soapbox/actions/scheduled-statuses';
import { connectUserStream } from 'soapbox/actions/streaming';
import { fetchSuggestionsForTimeline } from 'soapbox/actions/suggestions';
import { expandHomeTimeline } from 'soapbox/actions/timelines';
import Icon from 'soapbox/components/icon';
import SidebarNavigation from 'soapbox/components/sidebar-navigation';
-import ThumbNavigation from 'soapbox/components/thumb_navigation';
+import ThumbNavigation from 'soapbox/components/thumb-navigation';
import { Layout } from 'soapbox/components/ui';
import { useAppDispatch, useAppSelector, useOwnAccount, useSoapboxConfig, useFeatures } from 'soapbox/hooks';
-import AdminPage from 'soapbox/pages/admin_page';
+import AdminPage from 'soapbox/pages/admin-page';
import ChatsPage from 'soapbox/pages/chats-page';
-import DefaultPage from 'soapbox/pages/default_page';
-import HomePage from 'soapbox/pages/home_page';
-import ProfilePage from 'soapbox/pages/profile_page';
-import RemoteInstancePage from 'soapbox/pages/remote_instance_page';
-import StatusPage from 'soapbox/pages/status_page';
+import DefaultPage from 'soapbox/pages/default-page';
+import HomePage from 'soapbox/pages/home-page';
+import ProfilePage from 'soapbox/pages/profile-page';
+import RemoteInstancePage from 'soapbox/pages/remote-instance-page';
+import StatusPage from 'soapbox/pages/status-page';
import { usePendingPolicy } from 'soapbox/queries/policies';
import { getAccessToken, getVapidKey } from 'soapbox/utils/auth';
import { isStandalone } from 'soapbox/utils/state';
import { StatProvider } from '../../contexts/stat-context';
-import BackgroundShapes from './components/background_shapes';
+import BackgroundShapes from './components/background-shapes';
import { supportedPolicyIds } from './components/modals/policy-modal';
import Navbar from './components/navbar';
-import BundleContainer from './containers/bundle_container';
+import BundleContainer from './containers/bundle-container';
import {
Status,
CommunityTimeline,
@@ -108,7 +108,7 @@ import {
AuthTokenList,
ServiceWorkerInfo,
} from './util/async-components';
-import { WrappedRoute } from './util/react_router_helpers';
+import { WrappedRoute } from './util/react-router-helpers';
// Dummy import, to make sure that ends up in the application bundle.
// Without this it ends up in ~8 very commonly used bundles.
diff --git a/app/soapbox/features/ui/util/async-components.ts b/app/soapbox/features/ui/util/async-components.ts
index d59fe2cb26..e25bf46723 100644
--- a/app/soapbox/features/ui/util/async-components.ts
+++ b/app/soapbox/features/ui/util/async-components.ts
@@ -1,5 +1,5 @@
export function EmojiPicker() {
- return import(/* webpackChunkName: "emoji_picker" */'../../emoji/emoji_picker');
+ return import(/* webpackChunkName: "emoji_picker" */'../../emoji/emoji-picker');
}
export function Notifications() {
@@ -7,19 +7,19 @@ export function Notifications() {
}
export function HomeTimeline() {
- return import(/* webpackChunkName: "features/home_timeline" */'../../home_timeline');
+ return import(/* webpackChunkName: "features/home_timeline" */'../../home-timeline');
}
export function PublicTimeline() {
- return import(/* webpackChunkName: "features/public_timeline" */'../../public_timeline');
+ return import(/* webpackChunkName: "features/public_timeline" */'../../public-timeline');
}
export function RemoteTimeline() {
- return import(/* webpackChunkName: "features/remote_timeline" */'../../remote_timeline');
+ return import(/* webpackChunkName: "features/remote_timeline" */'../../remote-timeline');
}
export function CommunityTimeline() {
- return import(/* webpackChunkName: "features/community_timeline" */'../../community_timeline');
+ return import(/* webpackChunkName: "features/community_timeline" */'../../community-timeline');
}
export function HashtagTimeline() {
@@ -27,7 +27,7 @@ export function HashtagTimeline() {
}
export function DirectTimeline() {
- return import(/* webpackChunkName: "features/direct_timeline" */'../../direct_timeline');
+ return import(/* webpackChunkName: "features/direct_timeline" */'../../direct-timeline');
}
export function Conversations() {
@@ -35,7 +35,7 @@ export function Conversations() {
}
export function ListTimeline() {
- return import(/* webpackChunkName: "features/list_timeline" */'../../list_timeline');
+ return import(/* webpackChunkName: "features/list_timeline" */'../../list-timeline');
}
export function Lists() {
@@ -51,15 +51,15 @@ export function Status() {
}
export function PinnedStatuses() {
- return import(/* webpackChunkName: "features/pinned_statuses" */'../../pinned_statuses');
+ return import(/* webpackChunkName: "features/pinned_statuses" */'../../pinned-statuses');
}
export function AccountTimeline() {
- return import(/* webpackChunkName: "features/account_timeline" */'../../account_timeline');
+ return import(/* webpackChunkName: "features/account_timeline" */'../../account-timeline');
}
export function AccountGallery() {
- return import(/* webpackChunkName: "features/account_gallery" */'../../account_gallery');
+ return import(/* webpackChunkName: "features/account_gallery" */'../../account-gallery');
}
export function Followers() {
@@ -71,15 +71,15 @@ export function Following() {
}
export function FollowRequests() {
- return import(/* webpackChunkName: "features/follow_requests" */'../../follow_requests');
+ return import(/* webpackChunkName: "features/follow_requests" */'../../follow-requests');
}
export function GenericNotFound() {
- return import(/* webpackChunkName: "features/generic_not_found" */'../../generic_not_found');
+ return import(/* webpackChunkName: "features/generic_not_found" */'../../generic-not-found');
}
export function FavouritedStatuses() {
- return import(/* webpackChunkName: "features/favourited_statuses" */'../../favourited_statuses');
+ return import(/* webpackChunkName: "features/favourited_statuses" */'../../favourited-statuses');
}
export function Blocks() {
@@ -87,7 +87,7 @@ export function Blocks() {
}
export function DomainBlocks() {
- return import(/* webpackChunkName: "features/domain_blocks" */'../../domain_blocks');
+ return import(/* webpackChunkName: "features/domain_blocks" */'../../domain-blocks');
}
export function Mutes() {
@@ -95,7 +95,7 @@ export function Mutes() {
}
export function MuteModal() {
- return import(/* webpackChunkName: "modals/mute_modal" */'../components/mute_modal');
+ return import(/* webpackChunkName: "modals/mute_modal" */'../components/modals/mute-modal');
}
export function Filters() {
@@ -115,7 +115,7 @@ export function PolicyModal() {
}
export function MediaGallery() {
- return import(/* webpackChunkName: "status/media_gallery" */'../../../components/media_gallery');
+ return import(/* webpackChunkName: "status/media_gallery" */'../../../components/media-gallery');
}
export function Video() {
@@ -127,59 +127,59 @@ export function Audio() {
}
export function MediaModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/media-modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/media-modal');
}
export function VideoModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/video_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/video-modal');
}
export function BoostModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/boost_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/boost-modal');
}
export function ConfirmationModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/confirmation_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/confirmation-modal');
}
export function MissingDescriptionModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/missing_description_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/missing-description-modal');
}
export function ActionsModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/actions_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/actions-modal');
}
export function HotkeysModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/hotkeys_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/hotkeys-modal');
}
export function ComposeModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/compose_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/compose-modal');
}
export function ReplyMentionsModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/reply_mentions_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/reply-mentions-modal');
}
export function UnauthorizedModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/unauthorized_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/unauthorized-modal');
}
export function EditFederationModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/edit_federation_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/edit-federation-modal');
}
export function EmbedModal() {
- return import(/* webpackChunkName: "modals/embed_modal" */'../components/embed-modal');
+ return import(/* webpackChunkName: "modals/embed_modal" */'../components/modals/embed-modal');
}
export function ComponentModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/component_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/component-modal');
}
export function ReblogsModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/reblogs_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/reblogs-modal');
}
export function FavouritesModal() {
@@ -187,11 +187,11 @@ export function FavouritesModal() {
}
export function ReactionsModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/reactions_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/reactions-modal');
}
export function MentionsModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/mentions_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/mentions-modal');
}
export function LandingPageModal() {
@@ -199,7 +199,7 @@ export function LandingPageModal() {
}
export function BirthdaysModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/birthdays_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/birthdays-modal');
}
export function BirthdayPanel() {
@@ -207,15 +207,15 @@ export function BirthdayPanel() {
}
export function AccountNoteModal() {
- return import(/* webpackChunkName: "features/ui" */'../components/account_note_modal');
+ return import(/* webpackChunkName: "features/ui" */'../components/modals/account-note-modal');
}
export function ListEditor() {
- return import(/* webpackChunkName: "features/list_editor" */'../../list_editor');
+ return import(/* webpackChunkName: "features/list_editor" */'../../list-editor');
}
export function ListAdder() {
- return import(/*webpackChunkName: "features/list_adder" */'../../list_adder');
+ return import(/*webpackChunkName: "features/list_adder" */'../../list-adder');
}
export function Search() {
@@ -223,15 +223,15 @@ export function Search() {
}
export function LoginPage() {
- return import(/* webpackChunkName: "features/auth_login" */'../../auth_login/components/login_page');
+ return import(/* webpackChunkName: "features/auth_login" */'../../auth-login/components/login-page');
}
export function ExternalLogin() {
- return import(/* webpackChunkName: "features/external_login" */'../../external_login');
+ return import(/* webpackChunkName: "features/external_login" */'../../external-login');
}
export function LogoutPage() {
- return import(/* webpackChunkName: "features/auth_login" */'../../auth_login/components/logout');
+ return import(/* webpackChunkName: "features/auth_login" */'../../auth-login/components/logout');
}
export function Settings() {
@@ -239,39 +239,39 @@ export function Settings() {
}
export function MediaDisplay() {
- return import(/* webpackChunkName: "features/settings" */'../../settings/media_display');
+ return import(/* webpackChunkName: "features/settings" */'../../settings/media-display');
}
export function EditProfile() {
- return import(/* webpackChunkName: "features/edit_profile" */'../../edit_profile');
+ return import(/* webpackChunkName: "features/edit_profile" */'../../edit-profile');
}
export function EditEmail() {
- return import(/* webpackChunkName: "features/edit_email" */'../../edit_email');
+ return import(/* webpackChunkName: "features/edit_email" */'../../edit-email');
}
export function EmailConfirmation() {
- return import(/* webpackChunkName: "features/email_confirmation" */'../../email_confirmation');
+ return import(/* webpackChunkName: "features/email_confirmation" */'../../email-confirmation');
}
export function EditPassword() {
- return import(/* webpackChunkName: "features/edit_password" */'../../edit_password');
+ return import(/* webpackChunkName: "features/edit_password" */'../../edit-password');
}
export function DeleteAccount() {
- return import(/* webpackChunkName: "features/delete_account" */'../../delete_account');
+ return import(/* webpackChunkName: "features/delete_account" */'../../delete-account');
}
export function SoapboxConfig() {
- return import(/* webpackChunkName: "features/soapbox_config" */'../../soapbox_config');
+ return import(/* webpackChunkName: "features/soapbox_config" */'../../soapbox-config');
}
export function ExportData() {
- return import(/* webpackChunkName: "features/export_data" */ '../../export_data');
+ return import(/* webpackChunkName: "features/export_data" */ '../../export-data');
}
export function ImportData() {
- return import(/* webpackChunkName: "features/import_data" */'../../import_data');
+ return import(/* webpackChunkName: "features/import_data" */'../../import-data');
}
export function Backups() {
@@ -279,15 +279,15 @@ export function Backups() {
}
export function PasswordReset() {
- return import(/* webpackChunkName: "features/auth_login" */'../../auth_login/components/password_reset');
+ return import(/* webpackChunkName: "features/auth_login" */'../../auth-login/components/password-reset');
}
export function PasswordResetConfirm() {
- return import(/* webpackChunkName: "features/auth_login/password_reset_confirm" */'../../auth_login/components/password_reset_confirm');
+ return import(/* webpackChunkName: "features/auth_login/password_reset_confirm" */'../../auth-login/components/password-reset-confirm');
}
export function MfaForm() {
- return import(/* webpackChunkName: "features/security/mfa_form" */'../../security/mfa_form');
+ return import(/* webpackChunkName: "features/security/mfa_form" */'../../security/mfa-form');
}
export function ChatIndex() {
@@ -299,7 +299,7 @@ export function ChatWidget() {
}
export function ServerInfo() {
- return import(/* webpackChunkName: "features/server_info" */'../../server_info');
+ return import(/* webpackChunkName: "features/server_info" */'../../server-info');
}
export function Dashboard() {
@@ -307,15 +307,15 @@ export function Dashboard() {
}
export function ModerationLog() {
- return import(/* webpackChunkName: "features/admin/moderation_log" */'../../admin/moderation_log');
+ return import(/* webpackChunkName: "features/admin/moderation_log" */'../../admin/moderation-log');
}
export function UserPanel() {
- return import(/* webpackChunkName: "features/ui" */'../components/user_panel');
+ return import(/* webpackChunkName: "features/ui" */'../components/user-panel');
}
export function PromoPanel() {
- return import(/* webpackChunkName: "features/ui" */'../components/promo_panel');
+ return import(/* webpackChunkName: "features/ui" */'../components/promo-panel');
}
export function SignUpPanel() {
@@ -327,7 +327,7 @@ export function CtaBanner() {
}
export function FundingPanel() {
- return import(/* webpackChunkName: "features/ui" */'../components/funding_panel');
+ return import(/* webpackChunkName: "features/ui" */'../components/funding-panel');
}
export function TrendsPanel() {
@@ -335,47 +335,47 @@ export function TrendsPanel() {
}
export function ProfileInfoPanel() {
- return import(/* webpackChunkName: "features/account_timeline" */'../components/profile_info_panel');
+ return import(/* webpackChunkName: "features/account_timeline" */'../components/profile-info-panel');
}
export function ProfileMediaPanel() {
- return import(/* webpackChunkName: "features/account_gallery" */'../components/profile_media_panel');
+ return import(/* webpackChunkName: "features/account_gallery" */'../components/profile-media-panel');
}
export function ProfileFieldsPanel() {
- return import(/* webpackChunkName: "features/account_timeline" */'../components/profile_fields_panel');
+ return import(/* webpackChunkName: "features/account_timeline" */'../components/profile-fields-panel');
}
export function PinnedAccountsPanel() {
- return import(/* webpackChunkName: "features/pinned_accounts" */'../components/pinned_accounts_panel');
+ return import(/* webpackChunkName: "features/pinned_accounts" */'../components/pinned-accounts-panel');
}
export function InstanceInfoPanel() {
- return import(/* webpackChunkName: "features/remote_timeline" */'../components/instance_info_panel');
+ return import(/* webpackChunkName: "features/remote_timeline" */'../components/instance-info-panel');
}
export function InstanceModerationPanel() {
- return import(/* webpackChunkName: "features/remote_timeline" */'../components/instance_moderation_panel');
+ return import(/* webpackChunkName: "features/remote_timeline" */'../components/instance-moderation-panel');
}
export function LatestAccountsPanel() {
- return import(/* webpackChunkName: "features/admin" */'../../admin/components/latest_accounts_panel');
+ return import(/* webpackChunkName: "features/admin" */'../../admin/components/latest-accounts-panel');
}
export function SidebarMenu() {
- return import(/* webpackChunkName: "features/ui" */'../../../components/sidebar_menu');
+ return import(/* webpackChunkName: "features/ui" */'../../../components/sidebar-menu');
}
export function UploadArea() {
- return import(/* webpackChunkName: "features/compose" */'../components/upload_area');
+ return import(/* webpackChunkName: "features/compose" */'../components/upload-area');
}
export function NotificationsContainer() {
- return import(/* webpackChunkName: "features/ui" */'../containers/notifications_container');
+ return import(/* webpackChunkName: "features/ui" */'../containers/notifications-container');
}
export function ModalContainer() {
- return import(/* webpackChunkName: "features/ui" */'../containers/modal_container');
+ return import(/* webpackChunkName: "features/ui" */'../containers/modal-container');
}
export function ProfileHoverCard() {
@@ -387,31 +387,31 @@ export function StatusHoverCard() {
}
export function CryptoDonate() {
- return import(/* webpackChunkName: "features/crypto_donate" */'../../crypto_donate');
+ return import(/* webpackChunkName: "features/crypto_donate" */'../../crypto-donate');
}
export function CryptoDonatePanel() {
- return import(/* webpackChunkName: "features/crypto_donate" */'../../crypto_donate/components/crypto_donate_panel');
+ return import(/* webpackChunkName: "features/crypto_donate" */'../../crypto-donate/components/crypto-donate-panel');
}
export function CryptoAddress() {
- return import(/* webpackChunkName: "features/crypto_donate" */'../../crypto_donate/components/crypto_address');
+ return import(/* webpackChunkName: "features/crypto_donate" */'../../crypto-donate/components/crypto-address');
}
export function CryptoDonateModal() {
- return import(/* webpackChunkName: "features/crypto_donate" */'../components/crypto_donate_modal');
+ return import(/* webpackChunkName: "features/crypto_donate" */'../components/modals/crypto-donate-modal');
}
export function ScheduledStatuses() {
- return import(/* webpackChunkName: "features/scheduled_statuses" */'../../scheduled_statuses');
+ return import(/* webpackChunkName: "features/scheduled_statuses" */'../../scheduled-statuses');
}
export function UserIndex() {
- return import(/* webpackChunkName: "features/admin/user_index" */'../../admin/user_index');
+ return import(/* webpackChunkName: "features/admin/user_index" */'../../admin/user-index');
}
export function FederationRestrictions() {
- return import(/* webpackChunkName: "features/federation_restrictions" */'../../federation_restrictions');
+ return import(/* webpackChunkName: "features/federation_restrictions" */'../../federation-restrictions');
}
export function Aliases() {
@@ -423,7 +423,7 @@ export function Migration() {
}
export function ScheduleForm() {
- return import(/* webpackChunkName: "features/compose" */'../../compose/components/schedule_form');
+ return import(/* webpackChunkName: "features/compose" */'../../compose/components/schedule-form');
}
export function WhoToFollowPanel() {
@@ -439,7 +439,7 @@ export function Directory() {
}
export function RegisterInvite() {
- return import(/* webpackChunkName: "features/register_invite" */'../../register_invite');
+ return import(/* webpackChunkName: "features/register_invite" */'../../register-invite');
}
export function Share() {
@@ -447,11 +447,11 @@ export function Share() {
}
export function NewStatus() {
- return import(/* webpackChunkName: "features/new_status" */'../../new_status');
+ return import(/* webpackChunkName: "features/new_status" */'../../new-status');
}
export function IntentionalError() {
- return import(/* webpackChunkName: "error" */'../../intentional_error');
+ return import(/* webpackChunkName: "error" */'../../intentional-error');
}
export function Developers() {
@@ -467,7 +467,7 @@ export function SettingsStore() {
}
export function TestTimeline() {
- return import(/* webpackChunkName: "features/test_timeline" */'../../test_timeline');
+ return import(/* webpackChunkName: "features/test_timeline" */'../../test-timeline');
}
export function ServiceWorkerInfo() {
@@ -475,7 +475,7 @@ export function ServiceWorkerInfo() {
}
export function DatePicker() {
- return import(/* webpackChunkName: "date_picker" */'../../birthdays/date_picker');
+ return import(/* webpackChunkName: "date_picker" */'../../birthdays/date-picker');
}
export function OnboardingWizard() {
@@ -483,15 +483,15 @@ export function OnboardingWizard() {
}
export function WaitlistPage() {
- return import(/* webpackChunkName: "features/verification" */'../../verification/waitlist_page');
+ return import(/* webpackChunkName: "features/verification" */'../../verification/waitlist-page');
}
export function CompareHistoryModal() {
- return import(/*webpackChunkName: "modals/compare_history_modal" */'../components/compare_history_modal');
+ return import(/*webpackChunkName: "modals/compare_history_modal" */'../components/modals/compare-history-modal');
}
export function AuthTokenList() {
- return import(/* webpackChunkName: "features/auth_token_list" */'../../auth_token_list');
+ return import(/* webpackChunkName: "features/auth_token_list" */'../../auth-token-list');
}
export function VerifySmsModal() {
@@ -499,7 +499,7 @@ export function VerifySmsModal() {
}
export function FamiliarFollowersModal() {
- return import(/*webpackChunkName: "modals/familiar_followers_modal" */'../components/familiar_followers_modal');
+ return import(/*webpackChunkName: "modals/familiar_followers_modal" */'../components/modals/familiar-followers-modal');
}
export function AnnouncementsPanel() {
diff --git a/app/soapbox/features/ui/util/optional_motion.tsx b/app/soapbox/features/ui/util/optional-motion.tsx
similarity index 88%
rename from app/soapbox/features/ui/util/optional_motion.tsx
rename to app/soapbox/features/ui/util/optional-motion.tsx
index 15c0d0cd13..a51e847661 100644
--- a/app/soapbox/features/ui/util/optional_motion.tsx
+++ b/app/soapbox/features/ui/util/optional-motion.tsx
@@ -3,7 +3,7 @@ import { Motion, MotionProps } from 'react-motion';
import { useSettings } from 'soapbox/hooks';
-import ReducedMotion from './reduced_motion';
+import ReducedMotion from './reduced-motion';
const OptionalMotion = (props: MotionProps) => {
const reduceMotion = useSettings().get('reduceMotion');
diff --git a/app/soapbox/features/ui/util/pending_status_builder.ts b/app/soapbox/features/ui/util/pending-status-builder.ts
similarity index 96%
rename from app/soapbox/features/ui/util/pending_status_builder.ts
rename to app/soapbox/features/ui/util/pending-status-builder.ts
index 1ec288bbeb..cc3a06102f 100644
--- a/app/soapbox/features/ui/util/pending_status_builder.ts
+++ b/app/soapbox/features/ui/util/pending-status-builder.ts
@@ -4,7 +4,7 @@ import { normalizeStatus } from 'soapbox/normalizers/status';
import { calculateStatus } from 'soapbox/reducers/statuses';
import { makeGetAccount } from 'soapbox/selectors';
-import type { PendingStatus } from 'soapbox/reducers/pending_statuses';
+import type { PendingStatus } from 'soapbox/reducers/pending-statuses';
import type { RootState } from 'soapbox/store';
const getAccount = makeGetAccount();
diff --git a/app/soapbox/features/ui/util/react_router_helpers.tsx b/app/soapbox/features/ui/util/react-router-helpers.tsx
similarity index 90%
rename from app/soapbox/features/ui/util/react_router_helpers.tsx
rename to app/soapbox/features/ui/util/react-router-helpers.tsx
index 992a60e2bc..bb911af18b 100644
--- a/app/soapbox/features/ui/util/react_router_helpers.tsx
+++ b/app/soapbox/features/ui/util/react-router-helpers.tsx
@@ -4,11 +4,11 @@ import { Redirect, Route, useHistory, RouteProps, RouteComponentProps, match as
import { Layout } from 'soapbox/components/ui';
import { useOwnAccount, useSettings } from 'soapbox/hooks';
-import BundleColumnError from '../components/bundle_column_error';
-import ColumnForbidden from '../components/column_forbidden';
-import ColumnLoading from '../components/column_loading';
-import ColumnsArea from '../components/columns_area';
-import BundleContainer from '../containers/bundle_container';
+import BundleColumnError from '../components/bundle-column-error';
+import ColumnForbidden from '../components/column-forbidden';
+import ColumnLoading from '../components/column-loading';
+import ColumnsArea from '../components/columns-area';
+import BundleContainer from '../containers/bundle-container';
type PageProps = {
params?: MatchType['params'],
diff --git a/app/soapbox/features/ui/util/reduced_motion.tsx b/app/soapbox/features/ui/util/reduced-motion.tsx
similarity index 100%
rename from app/soapbox/features/ui/util/reduced_motion.tsx
rename to app/soapbox/features/ui/util/reduced-motion.tsx
diff --git a/app/soapbox/features/verification/email_passthru.tsx b/app/soapbox/features/verification/email-passthru.tsx
similarity index 100%
rename from app/soapbox/features/verification/email_passthru.tsx
rename to app/soapbox/features/verification/email-passthru.tsx
diff --git a/app/soapbox/features/verification/steps/email-verification.tsx b/app/soapbox/features/verification/steps/email-verification.tsx
index 95b888aef4..98c11b8290 100644
--- a/app/soapbox/features/verification/steps/email-verification.tsx
+++ b/app/soapbox/features/verification/steps/email-verification.tsx
@@ -11,7 +11,7 @@ import { useAppDispatch, useAppSelector } from 'soapbox/hooks';
const messages = defineMessages({
verificationSuccess: { id: 'email_verification.success', defaultMessage: 'Verification email sent successfully.' },
verificationFail: { id: 'email_verification.fail', defaultMessage: 'Failed to request email verification.' },
- verificationFailTakenAlert: { id: 'emai_verifilcation.exists', defaultMessage: 'This email has already been taken.' },
+ verificationFailTakenAlert: { id: 'email_verifilcation.exists', defaultMessage: 'This email has already been taken.' },
verificationFailTaken: { id: 'email_verification.taken', defaultMessage: 'is taken' },
});
diff --git a/app/soapbox/features/verification/waitlist_page.tsx b/app/soapbox/features/verification/waitlist-page.tsx
similarity index 100%
rename from app/soapbox/features/verification/waitlist_page.tsx
rename to app/soapbox/features/verification/waitlist-page.tsx
diff --git a/app/soapbox/features/video/index.tsx b/app/soapbox/features/video/index.tsx
index 871e80774d..f418714bd6 100644
--- a/app/soapbox/features/video/index.tsx
+++ b/app/soapbox/features/video/index.tsx
@@ -7,7 +7,7 @@ import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import Blurhash from 'soapbox/components/blurhash';
import Icon from 'soapbox/components/icon';
import { useSettings } from 'soapbox/hooks';
-import { isPanoramic, isPortrait, minimumAspectRatio, maximumAspectRatio } from 'soapbox/utils/media_aspect_ratio';
+import { isPanoramic, isPortrait, minimumAspectRatio, maximumAspectRatio } from 'soapbox/utils/media-aspect-ratio';
import { isFullscreen, requestFullscreen, exitFullscreen } from '../ui/util/fullscreen';
diff --git a/app/soapbox/is_mobile.ts b/app/soapbox/is-mobile.ts
similarity index 100%
rename from app/soapbox/is_mobile.ts
rename to app/soapbox/is-mobile.ts
diff --git a/app/soapbox/jest/test-helpers.tsx b/app/soapbox/jest/test-helpers.tsx
index ad0e22b0e6..9868288260 100644
--- a/app/soapbox/jest/test-helpers.tsx
+++ b/app/soapbox/jest/test-helpers.tsx
@@ -15,7 +15,7 @@ import { ChatProvider } from 'soapbox/contexts/chat-context';
import { StatProvider } from 'soapbox/contexts/stat-context';
import { queryClient } from 'soapbox/queries/client';
-import NotificationsContainer from '../features/ui/containers/notifications_container';
+import NotificationsContainer from '../features/ui/containers/notifications-container';
import { default as rootReducer } from '../reducers';
import type { AnyAction } from 'redux';
diff --git a/app/soapbox/jest/test-setup.ts b/app/soapbox/jest/test-setup.ts
index 9d37173d6b..0be183998f 100644
--- a/app/soapbox/jest/test-setup.ts
+++ b/app/soapbox/jest/test-setup.ts
@@ -1,6 +1,6 @@
'use strict';
-import { __clear as clearApiMocks } from '../__mocks__/api';
+import { __clear as clearApiMocks } from '../api/__mocks__';
// API mocking
jest.mock('soapbox/api');
diff --git a/app/soapbox/load_polyfills.ts b/app/soapbox/load-polyfills.ts
similarity index 97%
rename from app/soapbox/load_polyfills.ts
rename to app/soapbox/load-polyfills.ts
index e636098e72..cfd6f741f4 100644
--- a/app/soapbox/load_polyfills.ts
+++ b/app/soapbox/load-polyfills.ts
@@ -5,11 +5,11 @@
// it will execute in the same tick of the event loop (i.e. near-instant).
function importBasePolyfills() {
- return import(/* webpackChunkName: "base_polyfills" */ './base_polyfills');
+ return import(/* webpackChunkName: "base_polyfills" */ './base-polyfills');
}
function importExtraPolyfills() {
- return import(/* webpackChunkName: "extra_polyfills" */ './extra_polyfills');
+ return import(/* webpackChunkName: "extra_polyfills" */ './extra-polyfills');
}
function loadPolyfills() {
diff --git a/app/soapbox/locales/en.json b/app/soapbox/locales/en.json
index 030a4acc92..813d5fbe41 100644
--- a/app/soapbox/locales/en.json
+++ b/app/soapbox/locales/en.json
@@ -792,6 +792,7 @@
"poll_button.remove_poll": "Remove poll",
"pre_header.close": "Close",
"preferences.fields.auto_play_gif_label": "Auto-play animated GIFs",
+ "preferences.fields.auto_play_video_label": "Auto-play videos",
"preferences.fields.autoload_more_label": "Automatically load more items when scrolled to the bottom of the page",
"preferences.fields.autoload_timelines_label": "Automatically load new posts when scrolled to the top of the page",
"preferences.fields.boost_modal_label": "Show confirmation dialog before reposting",
diff --git a/app/soapbox/locales/pl.json b/app/soapbox/locales/pl.json
index 3f377400fe..de46354d53 100644
--- a/app/soapbox/locales/pl.json
+++ b/app/soapbox/locales/pl.json
@@ -42,6 +42,7 @@
"account.posts": "Wpisy",
"account.posts_with_replies": "Wpisy i odpowiedzi",
"account.profile": "Profil",
+ "account.profile_external": "Wyświetl profil na {domain}",
"account.register": "Rejestracja",
"account.remote_follow": "Obserwuj zdalnie",
"account.remove_from_followers": "Usuń tego obserwującego",
@@ -333,6 +334,8 @@
"compose_form.spoiler.marked": "Tekst jest ukryty za ostrzeżeniem",
"compose_form.spoiler.unmarked": "Tekst nie jest ukryty",
"compose_form.spoiler_placeholder": "Wprowadź swoje ostrzeżenie o zawartości",
+ "compose_form.spoiler_remove": "Usuń zaznaczenie jako wrażliwe",
+ "compose_form.spoiler_title": "Treści wrażliwe",
"confirmation_modal.cancel": "Anuluj",
"confirmation_resend.fields.username_placeholder": "Adres e-mail",
"confirmation_resend.request": "Wyślij ponownie instrukcje potwierdzania",
@@ -385,6 +388,9 @@
"confirmations.remove_from_followers.message": "Czy na pewno chcesz usunąć {name} ze swoich obserwowanych?",
"confirmations.reply.confirm": "Odpowiedz",
"confirmations.reply.message": "W ten sposób utracisz wpis który obecnie tworzysz. Czy na pewno chcesz to zrobić?",
+ "confirmations.revoke_session.confirm": "Unieważnij",
+ "confirmations.revoke_session.heading": "Uniewaznij obecną sesję",
+ "confirmations.revoke_session.message": "Zaraz unieważnisz swoją obecną sesję. Zostaniesz wylogowywany(-a).",
"confirmations.scheduled_status_delete.confirm": "Anuluj",
"confirmations.scheduled_status_delete.heading": "Anuluj zaplanowany wpis",
"confirmations.scheduled_status_delete.message": "Czy na pewno chcesz anulować ten zaplanowany wpis?",
@@ -474,6 +480,7 @@
"email_passthru.fail.expired": "Token z maila wygasł.",
"email_passthru.fail.generic": "Nie udało się potwierdzić adresu e-mail",
"email_passthru.fail.not_found": "Token z maila jest nieprawidłowy.",
+ "email_passthru.fail.invalid_token": "Wprowadzony token jest nieprawidłowy",
"email_passthru.generic_fail.body": "Poproś o nowe potwierdzenie adresu e-mail.",
"email_passthru.generic_fail.heading": "Coś poszło nie tak",
"email_passthru.success": "Twój adres e-mail został zweryfikowany",
@@ -484,6 +491,8 @@
"email_verification.exists": "Ten adres e-mail już jest zajęty",
"email_verification.fail": "Nie udało się zażądać weryfikacji e-mail",
"email_verification.header": "Wprowadź adres e-mail",
+ "email_verification.success": "Pomyślnie wysłano weryfikacyjny e-mail.",
+ "email_verification.taken": "jest zajęty",
"embed.instructions": "Osadź ten wpis na swojej stronie wklejając poniższy kod.",
"embed.preview": "Tak będzie to wyglądać:",
"emoji_button.activity": "Aktywność",
@@ -902,6 +911,7 @@
"poll_button.remove_poll": "Usuń głosowanie",
"pre_header.close": "Zamknij",
"preferences.fields.auto_play_gif_label": "Automatycznie odtwarzaj anonimowe GIF-y",
+ "preferences.fields.auto_play_video_label": "Automatycznie odtwarzaj filmy",
"preferences.fields.autoload_more_label": "Automatycznie ładuj więcej wpisów po przewinięciu na dół strony",
"preferences.fields.autoload_timelines_label": "Automatycznie załaduj nowe wpisy po przewinięciu na szczyt strony",
"preferences.fields.boost_modal_label": "Pokazuj prośbę o potwierdzenie przed podbiciem",
@@ -980,6 +990,7 @@
"registrations.success": "Witamy na {siteTitle}!",
"registrations.tagline": "Media społecznościowe, które nie wykluczają",
"registrations.unprocessable_entity": "Ta nazwa użytkownika jest już zajęta.",
+ "registrations.username.hint": "Może zawierać wyłącznie A-Z, 0-9 i podkreślniki",
"relative_time.days": "{number} dni",
"relative_time.hours": "{number} godz.",
"relative_time.just_now": "teraz",
@@ -1011,6 +1022,7 @@
"reply_mentions.account.remove": "Usuń z wspomnianych",
"reply_mentions.more": "{count} więcej",
"reply_mentions.reply": "W odpowiedzi do {accounts}",
+ "reply_mentions.reply.hoverable": "W odpowiedzi do {accounts}",
"reply_mentions.reply_empty": "W odpowiedzi na wpis",
"report.block": "Zablokuj {target}",
"report.block_hint": "Czy chcesz też zablokować to konto?",
@@ -1091,8 +1103,9 @@
"signup_panel.subtitle": "Zarejestruj się, aby przyłączyć się do dyskusji.",
"signup_panel.title": "Nowi na {site_title}?",
"site_preview.preview": "Podgląd",
- "sms_verification.header": "Wprowadź numer telefonu",
+ "sms_verification.expired": "Twój token SMS wygasł.",
"sms_verification.fail": "Nie udało się wysłać kodu weryfikującego na Twój numer telefonu.",
+ "sms_verification.header": "Wprowadź numer telefonu",
"sms_verification.invalid": "Twój token SMS wygasł.",
"sms_verification.modal.enter_code": "Wysłaliśmy Ci 6-cyfrowy kod SMS-em. Wprowadź go poniżej.",
"sms_verification.modal.resend_code": "Wysłać kod weryfikacyjny ponownie?",
@@ -1212,10 +1225,10 @@
"status.show_more": "Rozwiń",
"status.show_more_all": "Rozwiń wszystkie",
"status.show_original": "Pokaż oryginalny wpis",
- "status.title": "Wpis",
+ "status.title": "Wpis @{username}",
"status.title_direct": "Wiadomość bezpośrednia",
- "status.translated_from_with": "Przetłumaczono z {lang} z użyciem {provider}",
"status.translate": "Przetłumacz wpis",
+ "status.translated_from_with": "Przetłumaczono z {lang} z użyciem {provider}",
"status.unbookmark": "Usuń z zakładek",
"status.unbookmarked": "Usunięto z zakładek.",
"status.unmute_conversation": "Cofnij wyciszenie konwersacji",
@@ -1226,8 +1239,16 @@
"streamfield.add": "Dodaj",
"streamfield.remove": "Usuń",
"suggestions.dismiss": "Odrzuć sugestię",
+ "sw.restart": "Restartuj",
+ "sw.state.active": "Aktywny",
+ "sw.state.loading": "Ładowanie…",
+ "sw.state.unavailable": "Niedostępny",
+ "sw.state.unknown": "Nieznany",
+ "sw.state.waiting": "Oczekiwanie",
+ "sw.status": "Stan",
"sw.update": "Aktualizacja",
"sw.update_text": "Dostępna jest aktualizacja.",
+ "sw.url": "Adres URL skryptu",
"tabs_bar.all": "Wszystkie",
"tabs_bar.apps": "Aplikacje",
"tabs_bar.chats": "Rozmowy",
diff --git a/app/soapbox/main.tsx b/app/soapbox/main.tsx
index 84ea3739a2..b4a0eeaacb 100644
--- a/app/soapbox/main.tsx
+++ b/app/soapbox/main.tsx
@@ -8,7 +8,7 @@ import { defineMessages } from 'react-intl';
import snackbar from 'soapbox/actions/snackbar';
import { setSwUpdating } from 'soapbox/actions/sw';
-import * as BuildConfig from 'soapbox/build_config';
+import * as BuildConfig from 'soapbox/build-config';
import { store } from 'soapbox/store';
import { printConsoleWarning } from 'soapbox/utils/console';
diff --git a/app/soapbox/monitoring.ts b/app/soapbox/monitoring.ts
index cfa800bde0..da9bf46e7c 100644
--- a/app/soapbox/monitoring.ts
+++ b/app/soapbox/monitoring.ts
@@ -1,4 +1,4 @@
-import * as BuildConfig from 'soapbox/build_config';
+import * as BuildConfig from 'soapbox/build-config';
import type { CaptureContext } from '@sentry/types';
diff --git a/app/soapbox/normalizers/__tests__/account.test.ts b/app/soapbox/normalizers/__tests__/account.test.ts
index b5f4f5a756..6c2abc2b38 100644
--- a/app/soapbox/normalizers/__tests__/account.test.ts
+++ b/app/soapbox/normalizers/__tests__/account.test.ts
@@ -2,8 +2,8 @@ import { Record as ImmutableRecord, fromJS } from 'immutable';
import { normalizeAccount } from '../account';
-const AVATAR_MISSING = require('images/avatar-missing.png');
-const HEADER_MISSING = require('images/header-missing.png');
+const AVATAR_MISSING = require('assets/images/avatar-missing.png');
+const HEADER_MISSING = require('assets/images/header-missing.png');
describe('normalizeAccount()', () => {
it('adds base fields', () => {
@@ -131,15 +131,13 @@ describe('normalizeAccount()', () => {
it('emojifies display name as `display_name_html`', () => {
const account = require('soapbox/__fixtures__/account-with-emojis.json');
const result = normalizeAccount(account);
- const expected = 'Alex Gleason ';
- expect(result.display_name_html).toBe(expected);
+ expect(result.display_name_html).toContain('emojione');
});
it('emojifies note as `note_emojified`', () => {
const account = require('soapbox/__fixtures__/account-with-emojis.json');
const result = normalizeAccount(account);
- const expected = 'I create Fediverse software that empowers people online.
I'm vegan btw
Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.';
- expect(result.note_emojified).toBe(expected);
+ expect(result.note_emojified).toContain('emojione');
});
it('unescapes HTML note as `note_plain`', () => {
@@ -154,8 +152,8 @@ describe('normalizeAccount()', () => {
const result = normalizeAccount(account);
const field = result.fields.get(1);
- expect(field?.name_emojified).toBe('Soapbox ');
- expect(field?.value_emojified).toBe('https://soapbox.pub ');
+ expect(field?.name_emojified).toContain('emojione');
+ expect(field?.value_emojified).toContain('emojione');
expect(field?.value_plain).toBe('https://soapbox.pub :soapbox:');
});
diff --git a/app/soapbox/normalizers/__tests__/poll.test.ts b/app/soapbox/normalizers/__tests__/poll.test.ts
index b7ba0a46f8..d5226e9385 100644
--- a/app/soapbox/normalizers/__tests__/poll.test.ts
+++ b/app/soapbox/normalizers/__tests__/poll.test.ts
@@ -38,7 +38,7 @@ describe('normalizePoll()', () => {
// Emojifies poll options
expect(result.options.get(1)?.title_emojified)
- .toEqual('Custom emoji ');
+ .toContain('emojione');
// Parses emojis as Immutable.Record's
expect(ImmutableRecord.isRecord(result.emojis.get(0))).toBe(true);
diff --git a/app/soapbox/normalizers/__tests__/status.test.ts b/app/soapbox/normalizers/__tests__/status.test.ts
index b60373975c..5ad29d926b 100644
--- a/app/soapbox/normalizers/__tests__/status.test.ts
+++ b/app/soapbox/normalizers/__tests__/status.test.ts
@@ -183,7 +183,7 @@ describe('normalizeStatus()', () => {
// Emojifies poll options
expect(poll.options.get(1)?.title_emojified)
- .toEqual('Custom emoji ');
+ .toContain('emojione');
// Parses emojis as Immutable.Record's
expect(ImmutableRecord.isRecord(poll.emojis.get(0))).toBe(true);
diff --git a/app/soapbox/normalizers/account.ts b/app/soapbox/normalizers/account.ts
index 2c3bc7c0d3..1493af9766 100644
--- a/app/soapbox/normalizers/account.ts
+++ b/app/soapbox/normalizers/account.ts
@@ -100,7 +100,7 @@ const normalizePleromaLegacyFields = (account: ImmutableMap) => {
const normalizeAvatar = (account: ImmutableMap) => {
const avatar = account.get('avatar');
const avatarStatic = account.get('avatar_static');
- const missing = require('images/avatar-missing.png');
+ const missing = require('assets/images/avatar-missing.png');
return account.withMutations(account => {
account.set('avatar', avatar || avatarStatic || missing);
@@ -112,7 +112,7 @@ const normalizeAvatar = (account: ImmutableMap) => {
const normalizeHeader = (account: ImmutableMap) => {
const header = account.get('header');
const headerStatic = account.get('header_static');
- const missing = require('images/header-missing.png');
+ const missing = require('assets/images/header-missing.png');
return account.withMutations(account => {
account.set('header', header || headerStatic || missing);
diff --git a/app/soapbox/normalizers/admin_account.ts b/app/soapbox/normalizers/admin-account.ts
similarity index 100%
rename from app/soapbox/normalizers/admin_account.ts
rename to app/soapbox/normalizers/admin-account.ts
diff --git a/app/soapbox/normalizers/admin_report.ts b/app/soapbox/normalizers/admin-report.ts
similarity index 100%
rename from app/soapbox/normalizers/admin_report.ts
rename to app/soapbox/normalizers/admin-report.ts
diff --git a/app/soapbox/normalizers/announcement_reaction.ts b/app/soapbox/normalizers/announcement-reaction.ts
similarity index 100%
rename from app/soapbox/normalizers/announcement_reaction.ts
rename to app/soapbox/normalizers/announcement-reaction.ts
diff --git a/app/soapbox/normalizers/announcement.ts b/app/soapbox/normalizers/announcement.ts
index 59bc087ae8..b7573091c1 100644
--- a/app/soapbox/normalizers/announcement.ts
+++ b/app/soapbox/normalizers/announcement.ts
@@ -14,7 +14,7 @@ import emojify from 'soapbox/features/emoji/emoji';
import { normalizeEmoji } from 'soapbox/normalizers/emoji';
import { makeEmojiMap } from 'soapbox/utils/normalizers';
-import { normalizeAnnouncementReaction } from './announcement_reaction';
+import { normalizeAnnouncementReaction } from './announcement-reaction';
import { normalizeMention } from './mention';
import type { AnnouncementReaction, Emoji, Mention } from 'soapbox/types/entities';
diff --git a/app/soapbox/normalizers/chat_message.ts b/app/soapbox/normalizers/chat-message.ts
similarity index 100%
rename from app/soapbox/normalizers/chat_message.ts
rename to app/soapbox/normalizers/chat-message.ts
diff --git a/app/soapbox/normalizers/index.ts b/app/soapbox/normalizers/index.ts
index 9fdc04f68b..0d2d1622cc 100644
--- a/app/soapbox/normalizers/index.ts
+++ b/app/soapbox/normalizers/index.ts
@@ -1,12 +1,12 @@
export { AccountRecord, FieldRecord, normalizeAccount } from './account';
-export { AdminAccountRecord, normalizeAdminAccount } from './admin_account';
-export { AdminReportRecord, normalizeAdminReport } from './admin_report';
+export { AdminAccountRecord, normalizeAdminAccount } from './admin-account';
+export { AdminReportRecord, normalizeAdminReport } from './admin-report';
export { AnnouncementRecord, normalizeAnnouncement } from './announcement';
-export { AnnouncementReactionRecord, normalizeAnnouncementReaction } from './announcement_reaction';
+export { AnnouncementReactionRecord, normalizeAnnouncementReaction } from './announcement-reaction';
export { AttachmentRecord, normalizeAttachment } from './attachment';
export { CardRecord, normalizeCard } from './card';
export { ChatRecord, normalizeChat } from './chat';
-export { ChatMessageRecord, normalizeChatMessage } from './chat_message';
+export { ChatMessageRecord, normalizeChatMessage } from './chat-message';
export { EmojiRecord, normalizeEmoji } from './emoji';
export { FilterRecord, normalizeFilter } from './filter';
export { HistoryRecord, normalizeHistory } from './history';
@@ -17,8 +17,8 @@ export { NotificationRecord, normalizeNotification } from './notification';
export { PollRecord, PollOptionRecord, normalizePoll } from './poll';
export { RelationshipRecord, normalizeRelationship } from './relationship';
export { StatusRecord, normalizeStatus } from './status';
-export { StatusEditRecord, normalizeStatusEdit } from './status_edit';
+export { StatusEditRecord, normalizeStatusEdit } from './status-edit';
export { TagRecord, normalizeTag } from './tag';
export { AdRecord, normalizeAd } from './soapbox/ad';
-export { SoapboxConfigRecord, normalizeSoapboxConfig } from './soapbox/soapbox_config';
+export { SoapboxConfigRecord, normalizeSoapboxConfig } from './soapbox/soapbox-config';
diff --git a/app/soapbox/normalizers/soapbox/__tests__/soapbox_config-test.ts b/app/soapbox/normalizers/soapbox/__tests__/soapbox-config.test.ts
similarity index 95%
rename from app/soapbox/normalizers/soapbox/__tests__/soapbox_config-test.ts
rename to app/soapbox/normalizers/soapbox/__tests__/soapbox-config.test.ts
index e48198ecc1..9b70eba362 100644
--- a/app/soapbox/normalizers/soapbox/__tests__/soapbox_config-test.ts
+++ b/app/soapbox/normalizers/soapbox/__tests__/soapbox-config.test.ts
@@ -1,6 +1,6 @@
import { Record as ImmutableRecord } from 'immutable';
-import { normalizeSoapboxConfig } from '../soapbox_config';
+import { normalizeSoapboxConfig } from '../soapbox-config';
describe('normalizeSoapboxConfig()', () => {
it('adds base fields', () => {
diff --git a/app/soapbox/normalizers/soapbox/soapbox_config.ts b/app/soapbox/normalizers/soapbox/soapbox-config.ts
similarity index 100%
rename from app/soapbox/normalizers/soapbox/soapbox_config.ts
rename to app/soapbox/normalizers/soapbox/soapbox-config.ts
diff --git a/app/soapbox/normalizers/status_edit.ts b/app/soapbox/normalizers/status-edit.ts
similarity index 100%
rename from app/soapbox/normalizers/status_edit.ts
rename to app/soapbox/normalizers/status-edit.ts
diff --git a/app/soapbox/pages/admin_page.tsx b/app/soapbox/pages/admin-page.tsx
similarity index 88%
rename from app/soapbox/pages/admin_page.tsx
rename to app/soapbox/pages/admin-page.tsx
index 909955abe0..eeccc004cc 100644
--- a/app/soapbox/pages/admin_page.tsx
+++ b/app/soapbox/pages/admin-page.tsx
@@ -1,12 +1,12 @@
import React from 'react';
import { Layout } from 'soapbox/components/ui';
-import BundleContainer from 'soapbox/features/ui/containers/bundle_container';
+import BundleContainer from 'soapbox/features/ui/containers/bundle-container';
import {
LatestAccountsPanel,
} from 'soapbox/features/ui/util/async-components';
-import LinkFooter from '../features/ui/components/link_footer';
+import LinkFooter from '../features/ui/components/link-footer';
const AdminPage: React.FC = ({ children }) => {
return (
diff --git a/app/soapbox/pages/default_page.tsx b/app/soapbox/pages/default-page.tsx
similarity index 94%
rename from app/soapbox/pages/default_page.tsx
rename to app/soapbox/pages/default-page.tsx
index f6561cbf09..c95ca5bf14 100644
--- a/app/soapbox/pages/default_page.tsx
+++ b/app/soapbox/pages/default-page.tsx
@@ -1,7 +1,7 @@
import React from 'react';
-import LinkFooter from 'soapbox/features/ui/components/link_footer';
-import BundleContainer from 'soapbox/features/ui/containers/bundle_container';
+import LinkFooter from 'soapbox/features/ui/components/link-footer';
+import BundleContainer from 'soapbox/features/ui/containers/bundle-container';
import {
WhoToFollowPanel,
TrendsPanel,
diff --git a/app/soapbox/pages/empty_page.tsx b/app/soapbox/pages/empty-page.tsx
similarity index 100%
rename from app/soapbox/pages/empty_page.tsx
rename to app/soapbox/pages/empty-page.tsx
diff --git a/app/soapbox/pages/home_page.tsx b/app/soapbox/pages/home-page.tsx
similarity index 96%
rename from app/soapbox/pages/home_page.tsx
rename to app/soapbox/pages/home-page.tsx
index 2d73673d74..d3908fd1e5 100644
--- a/app/soapbox/pages/home_page.tsx
+++ b/app/soapbox/pages/home-page.tsx
@@ -2,7 +2,7 @@ import React, { useRef } from 'react';
import { Link } from 'react-router-dom';
import FeedCarousel from 'soapbox/features/feed-filtering/feed-carousel';
-import LinkFooter from 'soapbox/features/ui/components/link_footer';
+import LinkFooter from 'soapbox/features/ui/components/link-footer';
import {
WhoToFollowPanel,
TrendsPanel,
@@ -19,7 +19,7 @@ import { useAppSelector, useOwnAccount, useFeatures, useSoapboxConfig } from 'so
import Avatar from '../components/avatar';
import { Card, CardBody, Layout } from '../components/ui';
import ComposeForm from '../features/compose/components/compose-form';
-import BundleContainer from '../features/ui/containers/bundle_container';
+import BundleContainer from '../features/ui/containers/bundle-container';
// import GroupSidebarPanel from '../features/groups/sidebar_panel';
const HomePage: React.FC = ({ children }) => {
diff --git a/app/soapbox/pages/profile_page.tsx b/app/soapbox/pages/profile-page.tsx
similarity index 98%
rename from app/soapbox/pages/profile_page.tsx
rename to app/soapbox/pages/profile-page.tsx
index 1cc5f64feb..95f35bc6ad 100644
--- a/app/soapbox/pages/profile_page.tsx
+++ b/app/soapbox/pages/profile-page.tsx
@@ -4,8 +4,8 @@ import { Redirect, useHistory } from 'react-router-dom';
import { Column, Layout, Tabs } from 'soapbox/components/ui';
import Header from 'soapbox/features/account/components/header';
-import LinkFooter from 'soapbox/features/ui/components/link_footer';
-import BundleContainer from 'soapbox/features/ui/containers/bundle_container';
+import LinkFooter from 'soapbox/features/ui/components/link-footer';
+import BundleContainer from 'soapbox/features/ui/containers/bundle-container';
import {
WhoToFollowPanel,
ProfileInfoPanel,
diff --git a/app/soapbox/pages/remote_instance_page.tsx b/app/soapbox/pages/remote-instance-page.tsx
similarity index 94%
rename from app/soapbox/pages/remote_instance_page.tsx
rename to app/soapbox/pages/remote-instance-page.tsx
index e3488908ca..92f1eb56a1 100644
--- a/app/soapbox/pages/remote_instance_page.tsx
+++ b/app/soapbox/pages/remote-instance-page.tsx
@@ -1,7 +1,7 @@
import React from 'react';
-import LinkFooter from 'soapbox/features/ui/components/link_footer';
-import BundleContainer from 'soapbox/features/ui/containers/bundle_container';
+import LinkFooter from 'soapbox/features/ui/components/link-footer';
+import BundleContainer from 'soapbox/features/ui/containers/bundle-container';
import {
PromoPanel,
InstanceInfoPanel,
diff --git a/app/soapbox/pages/status_page.tsx b/app/soapbox/pages/status-page.tsx
similarity index 91%
rename from app/soapbox/pages/status_page.tsx
rename to app/soapbox/pages/status-page.tsx
index c0c99abd7b..feb9de2025 100644
--- a/app/soapbox/pages/status_page.tsx
+++ b/app/soapbox/pages/status-page.tsx
@@ -1,6 +1,6 @@
import React from 'react';
-import LinkFooter from 'soapbox/features/ui/components/link_footer';
+import LinkFooter from 'soapbox/features/ui/components/link-footer';
import {
WhoToFollowPanel,
TrendsPanel,
@@ -10,7 +10,7 @@ import {
import { useAppSelector, useFeatures } from 'soapbox/hooks';
import { Layout } from '../components/ui';
-import BundleContainer from '../features/ui/containers/bundle_container';
+import BundleContainer from '../features/ui/containers/bundle-container';
interface IStatusPage {
children: React.ReactNode,
diff --git a/app/soapbox/performance.ts b/app/soapbox/performance.ts
index b524b6e151..36f9948a60 100644
--- a/app/soapbox/performance.ts
+++ b/app/soapbox/performance.ts
@@ -1,6 +1,6 @@
'use strict';
-import * as BuildConfig from 'soapbox/build_config';
+import * as BuildConfig from 'soapbox/build-config';
//
// Tools for performance debugging, only enabled in development mode.
diff --git a/app/soapbox/queries/chats.ts b/app/soapbox/queries/chats.ts
index 0109a469d9..a57b32591e 100644
--- a/app/soapbox/queries/chats.ts
+++ b/app/soapbox/queries/chats.ts
@@ -4,11 +4,11 @@ import sumBy from 'lodash/sumBy';
import { importFetchedAccount, importFetchedAccounts } from 'soapbox/actions/importer';
import snackbar from 'soapbox/actions/snackbar';
import { getNextLink } from 'soapbox/api';
-import compareId from 'soapbox/compare_id';
import { ChatWidgetScreens, useChatContext } from 'soapbox/contexts/chat-context';
import { useStatContext } from 'soapbox/contexts/stat-context';
import { useApi, useAppDispatch, useAppSelector, useFeatures, useOwnAccount } from 'soapbox/hooks';
import { normalizeChatMessage } from 'soapbox/normalizers';
+import { compareId } from 'soapbox/utils/comparators';
import { flattenPages, PaginatedResult, updatePageItem } from 'soapbox/utils/queries';
import { queryClient } from './client';
diff --git a/app/soapbox/reducers/__tests__/accounts_counters.test.ts b/app/soapbox/reducers/__tests__/accounts-counters.test.ts
similarity index 97%
rename from app/soapbox/reducers/__tests__/accounts_counters.test.ts
rename to app/soapbox/reducers/__tests__/accounts-counters.test.ts
index 114f28b54e..f1259696ab 100644
--- a/app/soapbox/reducers/__tests__/accounts_counters.test.ts
+++ b/app/soapbox/reducers/__tests__/accounts-counters.test.ts
@@ -1,6 +1,6 @@
import { Map as ImmutableMap } from 'immutable';
-import reducer from '../accounts_counters';
+import reducer from '../accounts-counters';
// import { ACCOUNT_FOLLOW_SUCCESS, ACCOUNT_UNFOLLOW_SUCCESS } from 'soapbox/actions/accounts';
// import relationship from 'soapbox/__fixtures__/relationship.json';
// import accounts_counter_initial from 'soapbox/__fixtures__/accounts_counter_initial.json';
diff --git a/app/soapbox/reducers/__tests__/custom_emojis.test.ts b/app/soapbox/reducers/__tests__/custom-emojis.test.ts
similarity index 84%
rename from app/soapbox/reducers/__tests__/custom_emojis.test.ts
rename to app/soapbox/reducers/__tests__/custom-emojis.test.ts
index e2991d5fb7..294c9c0cf2 100644
--- a/app/soapbox/reducers/__tests__/custom_emojis.test.ts
+++ b/app/soapbox/reducers/__tests__/custom-emojis.test.ts
@@ -1,6 +1,6 @@
import { List as ImmutableList } from 'immutable';
-import reducer from '../custom_emojis';
+import reducer from '../custom-emojis';
describe('custom_emojis reducer', () => {
it('should return the initial state', () => {
diff --git a/app/soapbox/reducers/__tests__/domain_lists.test.ts b/app/soapbox/reducers/__tests__/domain-lists.test.ts
similarity index 85%
rename from app/soapbox/reducers/__tests__/domain_lists.test.ts
rename to app/soapbox/reducers/__tests__/domain-lists.test.ts
index 573ec9262f..7ba4d32f7e 100644
--- a/app/soapbox/reducers/__tests__/domain_lists.test.ts
+++ b/app/soapbox/reducers/__tests__/domain-lists.test.ts
@@ -1,4 +1,4 @@
-import reducer from '../domain_lists';
+import reducer from '../domain-lists';
describe('domain_lists reducer', () => {
it('should return the initial state', () => {
diff --git a/app/soapbox/reducers/__tests__/dropdown_menu.test.ts b/app/soapbox/reducers/__tests__/dropdown-menu.test.ts
similarity index 85%
rename from app/soapbox/reducers/__tests__/dropdown_menu.test.ts
rename to app/soapbox/reducers/__tests__/dropdown-menu.test.ts
index 676af592fb..5168d5e731 100644
--- a/app/soapbox/reducers/__tests__/dropdown_menu.test.ts
+++ b/app/soapbox/reducers/__tests__/dropdown-menu.test.ts
@@ -1,4 +1,4 @@
-import reducer from '../dropdown_menu';
+import reducer from '../dropdown-menu';
describe('dropdown_menu reducer', () => {
it('should return the initial state', () => {
diff --git a/app/soapbox/reducers/__tests__/list_adder.test.ts b/app/soapbox/reducers/__tests__/list-adder.test.ts
similarity index 98%
rename from app/soapbox/reducers/__tests__/list_adder.test.ts
rename to app/soapbox/reducers/__tests__/list-adder.test.ts
index 3989cf5e70..f3ede138c2 100644
--- a/app/soapbox/reducers/__tests__/list_adder.test.ts
+++ b/app/soapbox/reducers/__tests__/list-adder.test.ts
@@ -2,7 +2,7 @@ import { List as ImmutableList, Record as ImmutableRecord } from 'immutable';
import * as actions from 'soapbox/actions/lists';
-import reducer from '../list_adder';
+import reducer from '../list-adder';
describe('list_adder reducer', () => {
it('should return the initial state', () => {
diff --git a/app/soapbox/reducers/__tests__/push_notifications.test.ts b/app/soapbox/reducers/__tests__/push-notifications.test.ts
similarity index 90%
rename from app/soapbox/reducers/__tests__/push_notifications.test.ts
rename to app/soapbox/reducers/__tests__/push-notifications.test.ts
index 6afcba258a..89778cf236 100644
--- a/app/soapbox/reducers/__tests__/push_notifications.test.ts
+++ b/app/soapbox/reducers/__tests__/push-notifications.test.ts
@@ -1,4 +1,4 @@
-import reducer from '../push_notifications';
+import reducer from '../push-notifications';
describe('push_notifications reducer', () => {
it('should return the initial state', () => {
diff --git a/app/soapbox/reducers/__tests__/status_lists.test.ts b/app/soapbox/reducers/__tests__/status-lists.test.ts
similarity index 94%
rename from app/soapbox/reducers/__tests__/status_lists.test.ts
rename to app/soapbox/reducers/__tests__/status-lists.test.ts
index 2333df89ab..b01daee091 100644
--- a/app/soapbox/reducers/__tests__/status_lists.test.ts
+++ b/app/soapbox/reducers/__tests__/status-lists.test.ts
@@ -1,4 +1,4 @@
-import reducer from '../status_lists';
+import reducer from '../status-lists';
describe('status_lists reducer', () => {
it('should return the initial state', () => {
diff --git a/app/soapbox/reducers/__tests__/statuses.test.ts b/app/soapbox/reducers/__tests__/statuses.test.ts
index 06d82c871e..1db00ec64e 100644
--- a/app/soapbox/reducers/__tests__/statuses.test.ts
+++ b/app/soapbox/reducers/__tests__/statuses.test.ts
@@ -118,7 +118,7 @@ describe('statuses reducer', () => {
const status = require('soapbox/__fixtures__/status-custom-emoji.json');
const action = { type: STATUS_IMPORT, status };
- const expected = 'Hello world test ';
+ const expected = 'Hello world test ';
const result = reducer(undefined, action).getIn(['AGm7uC9DaAIGUa4KYK', 'contentHtml']);
expect(result).toBe(expected);
diff --git a/app/soapbox/reducers/__tests__/user_lists.test.ts b/app/soapbox/reducers/__tests__/user-lists.test.ts
similarity index 95%
rename from app/soapbox/reducers/__tests__/user_lists.test.ts
rename to app/soapbox/reducers/__tests__/user-lists.test.ts
index fa23f845f1..396ca7239a 100644
--- a/app/soapbox/reducers/__tests__/user_lists.test.ts
+++ b/app/soapbox/reducers/__tests__/user-lists.test.ts
@@ -1,6 +1,6 @@
import { OrderedSet as ImmutableOrderedSet } from 'immutable';
-import reducer from '../user_lists';
+import reducer from '../user-lists';
describe('user_lists reducer', () => {
it('should return the initial state', () => {
diff --git a/app/soapbox/reducers/account_notes.ts b/app/soapbox/reducers/account-notes.ts
similarity index 100%
rename from app/soapbox/reducers/account_notes.ts
rename to app/soapbox/reducers/account-notes.ts
diff --git a/app/soapbox/reducers/accounts_counters.ts b/app/soapbox/reducers/accounts-counters.ts
similarity index 100%
rename from app/soapbox/reducers/accounts_counters.ts
rename to app/soapbox/reducers/accounts-counters.ts
diff --git a/app/soapbox/reducers/accounts_meta.ts b/app/soapbox/reducers/accounts-meta.ts
similarity index 100%
rename from app/soapbox/reducers/accounts_meta.ts
rename to app/soapbox/reducers/accounts-meta.ts
diff --git a/app/soapbox/reducers/admin_log.ts b/app/soapbox/reducers/admin-log.ts
similarity index 100%
rename from app/soapbox/reducers/admin_log.ts
rename to app/soapbox/reducers/admin-log.ts
diff --git a/app/soapbox/reducers/admin.ts b/app/soapbox/reducers/admin.ts
index b51368f469..19a803f16d 100644
--- a/app/soapbox/reducers/admin.ts
+++ b/app/soapbox/reducers/admin.ts
@@ -25,7 +25,7 @@ import { normalizeId } from 'soapbox/utils/normalizers';
import type { AnyAction } from 'redux';
import type { APIEntity } from 'soapbox/types/entities';
-import type { Config } from 'soapbox/utils/config_db';
+import type { Config } from 'soapbox/utils/config-db';
const ReducerRecord = ImmutableRecord({
reports: ImmutableMap(),
diff --git a/app/soapbox/reducers/auth.js b/app/soapbox/reducers/auth.js
index ad0da1a1d0..c2ed9cdf6e 100644
Binary files a/app/soapbox/reducers/auth.js and b/app/soapbox/reducers/auth.js differ
diff --git a/app/soapbox/reducers/chat_message_lists.ts b/app/soapbox/reducers/chat-message-lists.ts
similarity index 100%
rename from app/soapbox/reducers/chat_message_lists.ts
rename to app/soapbox/reducers/chat-message-lists.ts
diff --git a/app/soapbox/reducers/chat_messages.ts b/app/soapbox/reducers/chat-messages.ts
similarity index 100%
rename from app/soapbox/reducers/chat_messages.ts
rename to app/soapbox/reducers/chat-messages.ts
diff --git a/app/soapbox/reducers/compose.ts b/app/soapbox/reducers/compose.ts
index 3f02f8cac6..8e7fe6b0e5 100644
--- a/app/soapbox/reducers/compose.ts
+++ b/app/soapbox/reducers/compose.ts
@@ -56,7 +56,7 @@ import { normalizeAttachment } from '../normalizers/attachment';
import { unescapeHTML } from '../utils/html';
import type { AnyAction } from 'redux';
-import type { Emoji } from 'soapbox/components/autosuggest_emoji';
+import type { Emoji } from 'soapbox/components/autosuggest-emoji';
import type {
Account as AccountEntity,
APIEntity,
diff --git a/app/soapbox/reducers/conversations.ts b/app/soapbox/reducers/conversations.ts
index 622d11a23d..57c9074484 100644
--- a/app/soapbox/reducers/conversations.ts
+++ b/app/soapbox/reducers/conversations.ts
@@ -9,7 +9,7 @@ import {
CONVERSATIONS_UPDATE,
CONVERSATIONS_READ,
} from '../actions/conversations';
-import compareId from '../compare_id';
+import { compareId } from '../utils/comparators';
import type { AnyAction } from 'redux';
import type { APIEntity } from 'soapbox/types/entities';
diff --git a/app/soapbox/reducers/custom_emojis.ts b/app/soapbox/reducers/custom-emojis.ts
similarity index 88%
rename from app/soapbox/reducers/custom_emojis.ts
rename to app/soapbox/reducers/custom-emojis.ts
index 38b54a6733..06b6bf79df 100644
--- a/app/soapbox/reducers/custom_emojis.ts
+++ b/app/soapbox/reducers/custom-emojis.ts
@@ -1,9 +1,9 @@
import { List as ImmutableList, Map as ImmutableMap, fromJS } from 'immutable';
-import { emojis as emojiData } from 'soapbox/features/emoji/emoji_mart_data_light';
-import { addCustomToPool } from 'soapbox/features/emoji/emoji_mart_search_light';
+import { emojis as emojiData } from 'soapbox/features/emoji/emoji-mart-data-light';
+import { addCustomToPool } from 'soapbox/features/emoji/emoji-mart-search-light';
-import { CUSTOM_EMOJIS_FETCH_SUCCESS } from '../actions/custom_emojis';
+import { CUSTOM_EMOJIS_FETCH_SUCCESS } from '../actions/custom-emojis';
import { buildCustomEmojis } from '../features/emoji/emoji';
import type { AnyAction } from 'redux';
diff --git a/app/soapbox/reducers/domain_lists.ts b/app/soapbox/reducers/domain-lists.ts
similarity index 96%
rename from app/soapbox/reducers/domain_lists.ts
rename to app/soapbox/reducers/domain-lists.ts
index 78af7f515e..30f55aaf8e 100644
--- a/app/soapbox/reducers/domain_lists.ts
+++ b/app/soapbox/reducers/domain-lists.ts
@@ -4,7 +4,7 @@ import {
DOMAIN_BLOCKS_FETCH_SUCCESS,
DOMAIN_BLOCKS_EXPAND_SUCCESS,
DOMAIN_UNBLOCK_SUCCESS,
-} from '../actions/domain_blocks';
+} from '../actions/domain-blocks';
import type { AnyAction } from 'redux';
diff --git a/app/soapbox/reducers/dropdown_menu.ts b/app/soapbox/reducers/dropdown-menu.ts
similarity index 94%
rename from app/soapbox/reducers/dropdown_menu.ts
rename to app/soapbox/reducers/dropdown-menu.ts
index 2b5c502522..dd5c703692 100644
--- a/app/soapbox/reducers/dropdown_menu.ts
+++ b/app/soapbox/reducers/dropdown-menu.ts
@@ -3,10 +3,10 @@ import { Record as ImmutableRecord } from 'immutable';
import {
DROPDOWN_MENU_OPEN,
DROPDOWN_MENU_CLOSE,
-} from '../actions/dropdown_menu';
+} from '../actions/dropdown-menu';
import type { AnyAction } from 'redux';
-import type { DropdownPlacement } from 'soapbox/components/dropdown_menu';
+import type { DropdownPlacement } from 'soapbox/components/dropdown-menu';
const ReducerRecord = ImmutableRecord({
openId: null as number | null,
diff --git a/app/soapbox/reducers/index.ts b/app/soapbox/reducers/index.ts
index 8c59c014f4..c900be16c2 100644
--- a/app/soapbox/reducers/index.ts
+++ b/app/soapbox/reducers/index.ts
@@ -2,33 +2,33 @@ import { Record as ImmutableRecord } from 'immutable';
import { combineReducers } from 'redux-immutable';
import { AUTH_LOGGED_OUT } from 'soapbox/actions/auth';
-import * as BuildConfig from 'soapbox/build_config';
+import * as BuildConfig from 'soapbox/build-config';
-import account_notes from './account_notes';
+import account_notes from './account-notes';
import accounts from './accounts';
-import accounts_counters from './accounts_counters';
-import accounts_meta from './accounts_meta';
+import accounts_counters from './accounts-counters';
+import accounts_meta from './accounts-meta';
import admin from './admin';
-import admin_log from './admin_log';
+import admin_log from './admin-log';
import alerts from './alerts';
import aliases from './aliases';
import announcements from './announcements';
import auth from './auth';
import backups from './backups';
-import chat_message_lists from './chat_message_lists';
-import chat_messages from './chat_messages';
+import chat_message_lists from './chat-message-lists';
+import chat_messages from './chat-messages';
import chats from './chats';
import compose from './compose';
import contexts from './contexts';
import conversations from './conversations';
-import custom_emojis from './custom_emojis';
-import domain_lists from './domain_lists';
-import dropdown_menu from './dropdown_menu';
+import custom_emojis from './custom-emojis';
+import domain_lists from './domain-lists';
+import dropdown_menu from './dropdown-menu';
import filters from './filters';
import history from './history';
import instance from './instance';
-import listAdder from './list_adder';
-import listEditor from './list_editor';
+import listAdder from './list-adder';
+import listEditor from './list-editor';
import lists from './lists';
import me from './me';
import meta from './meta';
@@ -37,27 +37,27 @@ import mutes from './mutes';
import notifications from './notifications';
import onboarding from './onboarding';
import patron from './patron';
-import pending_statuses from './pending_statuses';
+import pending_statuses from './pending-statuses';
import polls from './polls';
-import profile_hover_card from './profile_hover_card';
-import push_notifications from './push_notifications';
+import profile_hover_card from './profile-hover-card';
+import push_notifications from './push-notifications';
import relationships from './relationships';
import reports from './reports';
import rules from './rules';
-import scheduled_statuses from './scheduled_statuses';
+import scheduled_statuses from './scheduled-statuses';
import search from './search';
import security from './security';
import settings from './settings';
import sidebar from './sidebar';
import soapbox from './soapbox';
import status_hover_card from './status-hover-card';
-import status_lists from './status_lists';
+import status_lists from './status-lists';
import statuses from './statuses';
import suggestions from './suggestions';
import timelines from './timelines';
-import trending_statuses from './trending_statuses';
+import trending_statuses from './trending-statuses';
import trends from './trends';
-import user_lists from './user_lists';
+import user_lists from './user-lists';
import verification from './verification';
const reducers = {
diff --git a/app/soapbox/reducers/instance.ts b/app/soapbox/reducers/instance.ts
index 4c1456dc4d..1c15891e9f 100644
--- a/app/soapbox/reducers/instance.ts
+++ b/app/soapbox/reducers/instance.ts
@@ -3,8 +3,8 @@ import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
import { ADMIN_CONFIG_UPDATE_REQUEST, ADMIN_CONFIG_UPDATE_SUCCESS } from 'soapbox/actions/admin';
import { PLEROMA_PRELOAD_IMPORT } from 'soapbox/actions/preload';
import { normalizeInstance } from 'soapbox/normalizers/instance';
-import KVStore from 'soapbox/storage/kv_store';
-import { ConfigDB } from 'soapbox/utils/config_db';
+import KVStore from 'soapbox/storage/kv-store';
+import { ConfigDB } from 'soapbox/utils/config-db';
import {
rememberInstance,
diff --git a/app/soapbox/reducers/list_adder.ts b/app/soapbox/reducers/list-adder.ts
similarity index 100%
rename from app/soapbox/reducers/list_adder.ts
rename to app/soapbox/reducers/list-adder.ts
diff --git a/app/soapbox/reducers/list_editor.ts b/app/soapbox/reducers/list-editor.ts
similarity index 100%
rename from app/soapbox/reducers/list_editor.ts
rename to app/soapbox/reducers/list-editor.ts
diff --git a/app/soapbox/reducers/pending_statuses.ts b/app/soapbox/reducers/pending-statuses.ts
similarity index 100%
rename from app/soapbox/reducers/pending_statuses.ts
rename to app/soapbox/reducers/pending-statuses.ts
diff --git a/app/soapbox/reducers/profile_hover_card.ts b/app/soapbox/reducers/profile-hover-card.ts
similarity index 95%
rename from app/soapbox/reducers/profile_hover_card.ts
rename to app/soapbox/reducers/profile-hover-card.ts
index b07897715c..f662a3b990 100644
--- a/app/soapbox/reducers/profile_hover_card.ts
+++ b/app/soapbox/reducers/profile-hover-card.ts
@@ -4,7 +4,7 @@ import {
PROFILE_HOVER_CARD_OPEN,
PROFILE_HOVER_CARD_CLOSE,
PROFILE_HOVER_CARD_UPDATE,
-} from 'soapbox/actions/profile_hover_card';
+} from 'soapbox/actions/profile-hover-card';
import type { AnyAction } from 'redux';
diff --git a/app/soapbox/reducers/push_notifications.ts b/app/soapbox/reducers/push-notifications.ts
similarity index 95%
rename from app/soapbox/reducers/push_notifications.ts
rename to app/soapbox/reducers/push-notifications.ts
index 0448abf088..a2b8ca51ff 100644
--- a/app/soapbox/reducers/push_notifications.ts
+++ b/app/soapbox/reducers/push-notifications.ts
@@ -1,6 +1,6 @@
import { Map as ImmutableMap, Record as ImmutableRecord } from 'immutable';
-import { SET_BROWSER_SUPPORT, SET_SUBSCRIPTION, CLEAR_SUBSCRIPTION, SET_ALERTS } from '../actions/push_notifications';
+import { SET_BROWSER_SUPPORT, SET_SUBSCRIPTION, CLEAR_SUBSCRIPTION, SET_ALERTS } from '../actions/push-notifications';
import type { AnyAction } from 'redux';
diff --git a/app/soapbox/reducers/relationships.ts b/app/soapbox/reducers/relationships.ts
index 9aafa55420..47e2222602 100644
--- a/app/soapbox/reducers/relationships.ts
+++ b/app/soapbox/reducers/relationships.ts
@@ -26,7 +26,7 @@ import {
import {
DOMAIN_BLOCK_SUCCESS,
DOMAIN_UNBLOCK_SUCCESS,
-} from '../actions/domain_blocks';
+} from '../actions/domain-blocks';
import {
ACCOUNT_IMPORT,
ACCOUNTS_IMPORT,
diff --git a/app/soapbox/reducers/scheduled_statuses.ts b/app/soapbox/reducers/scheduled-statuses.ts
similarity index 97%
rename from app/soapbox/reducers/scheduled_statuses.ts
rename to app/soapbox/reducers/scheduled-statuses.ts
index 13b4a934d8..edcc86337a 100644
--- a/app/soapbox/reducers/scheduled_statuses.ts
+++ b/app/soapbox/reducers/scheduled-statuses.ts
@@ -5,7 +5,7 @@ import {
SCHEDULED_STATUSES_FETCH_SUCCESS,
SCHEDULED_STATUS_CANCEL_REQUEST,
SCHEDULED_STATUS_CANCEL_SUCCESS,
-} from 'soapbox/actions/scheduled_statuses';
+} from 'soapbox/actions/scheduled-statuses';
import { STATUS_CREATE_SUCCESS } from 'soapbox/actions/statuses';
import type { AnyAction } from 'redux';
diff --git a/app/soapbox/reducers/settings.ts b/app/soapbox/reducers/settings.ts
index ee8ddc558d..70a28a478e 100644
--- a/app/soapbox/reducers/settings.ts
+++ b/app/soapbox/reducers/settings.ts
@@ -13,7 +13,7 @@ import {
FE_NAME,
} from '../actions/settings';
-import type { Emoji } from 'soapbox/components/autosuggest_emoji';
+import type { Emoji } from 'soapbox/components/autosuggest-emoji';
import type { APIEntity } from 'soapbox/types/entities';
type State = ImmutableMap;
diff --git a/app/soapbox/reducers/soapbox.js b/app/soapbox/reducers/soapbox.js
index 0affe2e363..b959a5596f 100644
Binary files a/app/soapbox/reducers/soapbox.js and b/app/soapbox/reducers/soapbox.js differ
diff --git a/app/soapbox/reducers/status_lists.ts b/app/soapbox/reducers/status-lists.ts
similarity index 98%
rename from app/soapbox/reducers/status_lists.ts
rename to app/soapbox/reducers/status-lists.ts
index be87e2910a..3a19c5eea4 100644
--- a/app/soapbox/reducers/status_lists.ts
+++ b/app/soapbox/reducers/status-lists.ts
@@ -36,7 +36,7 @@ import {
} from '../actions/interactions';
import {
PINNED_STATUSES_FETCH_SUCCESS,
-} from '../actions/pin_statuses';
+} from '../actions/pin-statuses';
import {
SCHEDULED_STATUSES_FETCH_REQUEST,
SCHEDULED_STATUSES_FETCH_SUCCESS,
@@ -46,7 +46,7 @@ import {
SCHEDULED_STATUSES_EXPAND_FAIL,
SCHEDULED_STATUS_CANCEL_REQUEST,
SCHEDULED_STATUS_CANCEL_SUCCESS,
-} from '../actions/scheduled_statuses';
+} from '../actions/scheduled-statuses';
import type { AnyAction } from 'redux';
import type { Status as StatusEntity } from 'soapbox/types/entities';
diff --git a/app/soapbox/reducers/statuses.ts b/app/soapbox/reducers/statuses.ts
index 088191eddc..2c19b2511b 100644
--- a/app/soapbox/reducers/statuses.ts
+++ b/app/soapbox/reducers/statuses.ts
@@ -3,14 +3,14 @@ import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
import emojify from 'soapbox/features/emoji/emoji';
import { normalizeStatus } from 'soapbox/normalizers';
-import { simulateEmojiReact, simulateUnEmojiReact } from 'soapbox/utils/emoji_reacts';
+import { simulateEmojiReact, simulateUnEmojiReact } from 'soapbox/utils/emoji-reacts';
import { stripCompatibilityFeatures, unescapeHTML } from 'soapbox/utils/html';
import { makeEmojiMap, normalizeId } from 'soapbox/utils/normalizers';
import {
EMOJI_REACT_REQUEST,
UNEMOJI_REACT_REQUEST,
-} from '../actions/emoji_reacts';
+} from '../actions/emoji-reacts';
import { STATUS_IMPORT, STATUSES_IMPORT } from '../actions/importer';
import {
REBLOG_REQUEST,
diff --git a/app/soapbox/reducers/suggestions.ts b/app/soapbox/reducers/suggestions.ts
index 8335ff9ec6..e3d72a34c9 100644
--- a/app/soapbox/reducers/suggestions.ts
+++ b/app/soapbox/reducers/suggestions.ts
@@ -1,7 +1,7 @@
import { OrderedSet as ImmutableOrderedSet, Record as ImmutableRecord } from 'immutable';
import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS } from 'soapbox/actions/accounts';
-import { DOMAIN_BLOCK_SUCCESS } from 'soapbox/actions/domain_blocks';
+import { DOMAIN_BLOCK_SUCCESS } from 'soapbox/actions/domain-blocks';
import {
SUGGESTIONS_FETCH_REQUEST,
SUGGESTIONS_FETCH_SUCCESS,
diff --git a/app/soapbox/reducers/trending_statuses.ts b/app/soapbox/reducers/trending-statuses.ts
similarity index 96%
rename from app/soapbox/reducers/trending_statuses.ts
rename to app/soapbox/reducers/trending-statuses.ts
index c27ab31a07..189f7006d4 100644
--- a/app/soapbox/reducers/trending_statuses.ts
+++ b/app/soapbox/reducers/trending-statuses.ts
@@ -3,7 +3,7 @@ import { OrderedSet as ImmutableOrderedSet, Record as ImmutableRecord } from 'im
import {
TRENDING_STATUSES_FETCH_REQUEST,
TRENDING_STATUSES_FETCH_SUCCESS,
-} from 'soapbox/actions/trending_statuses';
+} from 'soapbox/actions/trending-statuses';
import { APIEntity } from 'soapbox/types/entities';
import type { AnyAction } from 'redux';
diff --git a/app/soapbox/reducers/user_lists.ts b/app/soapbox/reducers/user-lists.ts
similarity index 96%
rename from app/soapbox/reducers/user_lists.ts
rename to app/soapbox/reducers/user-lists.ts
index 4c84f1836e..7f5ce6716b 100644
--- a/app/soapbox/reducers/user_lists.ts
+++ b/app/soapbox/reducers/user-lists.ts
@@ -31,7 +31,7 @@ import {
} from '../actions/directory';
import {
FAMILIAR_FOLLOWERS_FETCH_SUCCESS,
-} from '../actions/familiar_followers';
+} from '../actions/familiar-followers';
import {
REBLOGS_FETCH_SUCCESS,
FAVOURITES_FETCH_SUCCESS,
@@ -97,7 +97,10 @@ const normalizeList = (state: State, path: NestedListPath | ListPath, accounts:
const appendToList = (state: State, path: NestedListPath | ListPath, accounts: APIEntity[], next: string | null) => {
return state.updateIn(path, map => {
- return (map as List).set('next', next).update('items', list => (list as Items).concat(accounts.map(item => item.id)));
+ return (map as List)
+ .set('next', next)
+ .set('isLoading', false)
+ .update('items', list => (list as Items).concat(accounts.map(item => item.id)));
});
};
diff --git a/app/soapbox/selectors/index.ts b/app/soapbox/selectors/index.ts
index 84165fc98b..047faefa6b 100644
--- a/app/soapbox/selectors/index.ts
+++ b/app/soapbox/selectors/index.ts
@@ -9,7 +9,7 @@ import { createSelector } from 'reselect';
import { getSettings } from 'soapbox/actions/settings';
import { getDomain } from 'soapbox/utils/accounts';
import { validId } from 'soapbox/utils/auth';
-import ConfigDB from 'soapbox/utils/config_db';
+import ConfigDB from 'soapbox/utils/config-db';
import { shouldFilter } from 'soapbox/utils/timelines';
import type { ReducerChat } from 'soapbox/reducers/chats';
diff --git a/app/soapbox/service-worker/entry.ts b/app/soapbox/service-worker/entry.ts
new file mode 100644
index 0000000000..3dbfee2ced
--- /dev/null
+++ b/app/soapbox/service-worker/entry.ts
@@ -0,0 +1 @@
+import './web-push-notifications';
diff --git a/app/soapbox/service_worker/web_push_locales.js b/app/soapbox/service-worker/web-push-locales.js
similarity index 100%
rename from app/soapbox/service_worker/web_push_locales.js
rename to app/soapbox/service-worker/web-push-locales.js
diff --git a/app/soapbox/service_worker/web_push_notifications.ts b/app/soapbox/service-worker/web-push-notifications.ts
similarity index 97%
rename from app/soapbox/service_worker/web_push_notifications.ts
rename to app/soapbox/service-worker/web-push-notifications.ts
index fe3d8e6526..c1da2b67d0 100644
--- a/app/soapbox/service_worker/web_push_notifications.ts
+++ b/app/soapbox/service-worker/web-push-notifications.ts
@@ -2,7 +2,7 @@ import IntlMessageFormat from 'intl-messageformat';
import 'intl-pluralrules';
import unescape from 'lodash/unescape';
-import locales from './web_push_locales';
+import locales from './web-push-locales';
import type {
Account as AccountEntity,
@@ -180,21 +180,21 @@ const handlePush = (event: PushEvent) => {
/** Native action to open a status on the device. */
const actionExpand = (preferred_locale: string) => ({
action: 'expand',
- icon: `/${require('../../images/web-push/web-push-icon_expand.png')}`,
+ icon: `/${require('../../assets/images/web-push/web-push-icon_expand.png')}`,
title: formatMessage('status.show_more', preferred_locale),
});
/** Native action to repost status. */
const actionReblog = (preferred_locale: string) => ({
action: 'reblog',
- icon: `/${require('../../images/web-push/web-push-icon_reblog.png')}`,
+ icon: `/${require('../../assets/images/web-push/web-push-icon_reblog.png')}`,
title: formatMessage('status.reblog', preferred_locale),
});
/** Native action to like status. */
const actionFavourite = (preferred_locale: string) => ({
action: 'favourite',
- icon: `/${require('../../images/web-push/web-push-icon_favourite.png')}`,
+ icon: `/${require('../../assets/images/web-push/web-push-icon_favourite.png')}`,
title: formatMessage('status.favourite', preferred_locale),
});
diff --git a/app/soapbox/service_worker/entry.ts b/app/soapbox/service_worker/entry.ts
deleted file mode 100644
index 364b670660..0000000000
--- a/app/soapbox/service_worker/entry.ts
+++ /dev/null
@@ -1 +0,0 @@
-import './web_push_notifications';
diff --git a/app/soapbox/storage/kv_store.ts b/app/soapbox/storage/kv-store.ts
similarity index 100%
rename from app/soapbox/storage/kv_store.ts
rename to app/soapbox/storage/kv-store.ts
diff --git a/app/soapbox/types/soapbox.ts b/app/soapbox/types/soapbox.ts
index 1a37d1a88d..3b8b247a69 100644
--- a/app/soapbox/types/soapbox.ts
+++ b/app/soapbox/types/soapbox.ts
@@ -4,7 +4,7 @@ import {
FooterItemRecord,
CryptoAddressRecord,
SoapboxConfigRecord,
-} from 'soapbox/normalizers/soapbox/soapbox_config';
+} from 'soapbox/normalizers/soapbox/soapbox-config';
type Me = string | null | false | undefined;
diff --git a/app/soapbox/__tests__/compare_id.test.ts b/app/soapbox/utils/__tests__/comparators.test.ts
similarity index 76%
rename from app/soapbox/__tests__/compare_id.test.ts
rename to app/soapbox/utils/__tests__/comparators.test.ts
index 583b4a1ebb..f1cf726345 100644
--- a/app/soapbox/__tests__/compare_id.test.ts
+++ b/app/soapbox/utils/__tests__/comparators.test.ts
@@ -1,7 +1,7 @@
-import compareId from '../compare_id';
+import { compareId } from '../comparators';
test('compareId', () => {
expect(compareId('3', '3')).toBe(0);
expect(compareId('10', '1')).toBe(1);
expect(compareId('99', '100')).toBe(-1);
-});
+});
\ No newline at end of file
diff --git a/app/soapbox/utils/__tests__/config_db.test.ts b/app/soapbox/utils/__tests__/config-db.test.ts
similarity index 90%
rename from app/soapbox/utils/__tests__/config_db.test.ts
rename to app/soapbox/utils/__tests__/config-db.test.ts
index a83757eb35..8f398ee9ac 100644
--- a/app/soapbox/utils/__tests__/config_db.test.ts
+++ b/app/soapbox/utils/__tests__/config-db.test.ts
@@ -2,7 +2,7 @@ import { List as ImmutableList, fromJS } from 'immutable';
import config_db from 'soapbox/__fixtures__/config_db.json';
-import { ConfigDB } from '../config_db';
+import { ConfigDB } from '../config-db';
test('find', () => {
const configs = fromJS(config_db).get('configs');
diff --git a/app/soapbox/utils/__tests__/emoji_reacts.test.ts b/app/soapbox/utils/__tests__/emoji-reacts.test.ts
similarity index 99%
rename from app/soapbox/utils/__tests__/emoji_reacts.test.ts
rename to app/soapbox/utils/__tests__/emoji-reacts.test.ts
index 14832210cb..97f8e34db4 100644
--- a/app/soapbox/utils/__tests__/emoji_reacts.test.ts
+++ b/app/soapbox/utils/__tests__/emoji-reacts.test.ts
@@ -11,7 +11,7 @@ import {
getReactForStatus,
simulateEmojiReact,
simulateUnEmojiReact,
-} from '../emoji_reacts';
+} from '../emoji-reacts';
const ALLOWED_EMOJI = ImmutableList([
'👍',
diff --git a/app/soapbox/utils/__tests__/media.test.ts b/app/soapbox/utils/__tests__/media.test.ts
new file mode 100644
index 0000000000..56a02aebc5
--- /dev/null
+++ b/app/soapbox/utils/__tests__/media.test.ts
@@ -0,0 +1,31 @@
+import { addAutoPlay } from '../media';
+
+describe('addAutoPlay()', () => {
+ describe('when the provider is Rumble', () => {
+ it('adds the correct query parameters to the src', () => {
+ const html = '';
+ expect(addAutoPlay(html)).toEqual('');
+ });
+
+ describe('when the iframe src already has params', () => {
+ it('adds the correct query parameters to the src', () => {
+ const html = '';
+ expect(addAutoPlay(html)).toEqual('');
+ });
+ });
+ });
+
+ describe('when the provider is not Rumble', () => {
+ it('adds the correct query parameters to the src', () => {
+ const html = '';
+ expect(addAutoPlay(html)).toEqual('');
+ });
+
+ describe('when the iframe src already has params', () => {
+ it('adds the correct query parameters to the src', () => {
+ const html = '';
+ expect(addAutoPlay(html)).toEqual('');
+ });
+ });
+ });
+});
diff --git a/app/soapbox/compare_id.ts b/app/soapbox/utils/comparators.ts
similarity index 86%
rename from app/soapbox/compare_id.ts
rename to app/soapbox/utils/comparators.ts
index b92a44cf10..14c3ba4df0 100644
--- a/app/soapbox/compare_id.ts
+++ b/app/soapbox/utils/comparators.ts
@@ -9,7 +9,7 @@
* - `1`: id1 > id2
* - `-1`: id1 < id2
*/
-export default function compareId(id1: string, id2: string) {
+function compareId(id1: string, id2: string) {
if (id1 === id2) {
return 0;
}
@@ -19,3 +19,5 @@ export default function compareId(id1: string, id2: string) {
return id1.length > id2.length ? 1 : -1;
}
}
+
+export { compareId };
\ No newline at end of file
diff --git a/app/soapbox/utils/config_db.ts b/app/soapbox/utils/config-db.ts
similarity index 100%
rename from app/soapbox/utils/config_db.ts
rename to app/soapbox/utils/config-db.ts
diff --git a/app/soapbox/utils/emoji_reacts.ts b/app/soapbox/utils/emoji-reacts.ts
similarity index 100%
rename from app/soapbox/utils/emoji_reacts.ts
rename to app/soapbox/utils/emoji-reacts.ts
diff --git a/app/soapbox/utils/favicon_service.ts b/app/soapbox/utils/favicon-service.ts
similarity index 100%
rename from app/soapbox/utils/favicon_service.ts
rename to app/soapbox/utils/favicon-service.ts
diff --git a/app/soapbox/utils/greentext.ts b/app/soapbox/utils/greentext.ts
index eab93b22ae..70c5e05d84 100644
--- a/app/soapbox/utils/greentext.ts
+++ b/app/soapbox/utils/greentext.ts
@@ -1,4 +1,4 @@
-import { processHtml } from './tiny_post_html_processor';
+import { processHtml } from './tiny-post-html-processor';
export const addGreentext = (html: string): string => {
// Copied from Pleroma FE
diff --git a/app/soapbox/utils/media_aspect_ratio.ts b/app/soapbox/utils/media-aspect-ratio.ts
similarity index 100%
rename from app/soapbox/utils/media_aspect_ratio.ts
rename to app/soapbox/utils/media-aspect-ratio.ts
diff --git a/app/soapbox/utils/media.ts b/app/soapbox/utils/media.ts
index 7947ef91f8..ff0bf502e1 100644
--- a/app/soapbox/utils/media.ts
+++ b/app/soapbox/utils/media.ts
@@ -51,4 +51,37 @@ const getVideoDuration = (file: File): Promise => {
return promise;
};
-export { getVideoDuration, formatBytes, truncateFilename };
+const domParser = new DOMParser();
+
+enum VideoProviders {
+ RUMBLE = 'rumble.com'
+}
+
+const addAutoPlay = (html: string): string => {
+ const document = domParser.parseFromString(html, 'text/html').documentElement;
+ const iframe = document.querySelector('iframe');
+
+ if (iframe) {
+ const url = new URL(iframe.src);
+ const provider = new URL(iframe.src).host;
+
+ if (provider === VideoProviders.RUMBLE) {
+ url.searchParams.append('pub', '7a20');
+ url.searchParams.append('autoplay', '2');
+ } else {
+ url.searchParams.append('autoplay', '1');
+ url.searchParams.append('auto_play', '1');
+ iframe.allow = 'autoplay';
+ }
+
+ iframe.src = url.toString();
+
+ // DOM parser creates html/body elements around original HTML fragment,
+ // so we need to get innerHTML out of the body and not the entire document
+ return (document.querySelector('body') as HTMLBodyElement).innerHTML;
+ }
+
+ return html;
+};
+
+export { getVideoDuration, formatBytes, truncateFilename, addAutoPlay };
diff --git a/app/soapbox/utils/resize_image.ts b/app/soapbox/utils/resize-image.ts
similarity index 100%
rename from app/soapbox/utils/resize_image.ts
rename to app/soapbox/utils/resize-image.ts
diff --git a/app/soapbox/utils/rich_content.ts b/app/soapbox/utils/rich-content.ts
similarity index 100%
rename from app/soapbox/utils/rich_content.ts
rename to app/soapbox/utils/rich-content.ts
diff --git a/app/soapbox/utils/soapbox_prop_types.ts b/app/soapbox/utils/soapbox-prop-types.ts
similarity index 100%
rename from app/soapbox/utils/soapbox_prop_types.ts
rename to app/soapbox/utils/soapbox-prop-types.ts
diff --git a/app/soapbox/utils/sounds.ts b/app/soapbox/utils/sounds.ts
index af4fc567f5..767949c4a8 100644
--- a/app/soapbox/utils/sounds.ts
+++ b/app/soapbox/utils/sounds.ts
@@ -35,21 +35,21 @@ const play = (audio: HTMLAudioElement): void => {
const soundCache: Record = {
boop: createAudio([
{
- src: require('../../sounds/boop.ogg'),
+ src: require('../../assets/sounds/boop.ogg'),
type: 'audio/ogg',
},
{
- src: require('../../sounds/boop.mp3'),
+ src: require('../../assets/sounds/boop.mp3'),
type: 'audio/mpeg',
},
]),
chat: createAudio([
{
- src: require('../../sounds/chat.oga'),
+ src: require('../../assets/sounds/chat.oga'),
type: 'audio/ogg',
},
{
- src: require('../../sounds/chat.mp3'),
+ src: require('../../assets/sounds/chat.mp3'),
type: 'audio/mpeg',
},
]),
diff --git a/app/soapbox/utils/state.ts b/app/soapbox/utils/state.ts
index 45e8499170..c3cfdb5706 100644
--- a/app/soapbox/utils/state.ts
+++ b/app/soapbox/utils/state.ts
@@ -4,7 +4,7 @@
*/
import { getSoapboxConfig } from 'soapbox/actions/soapbox';
-import * as BuildConfig from 'soapbox/build_config';
+import * as BuildConfig from 'soapbox/build-config';
import { isPrerendered } from 'soapbox/precheck';
import { isURL } from 'soapbox/utils/auth';
diff --git a/app/soapbox/utils/static.ts b/app/soapbox/utils/static.ts
index 79ba469316..0a8048a320 100644
--- a/app/soapbox/utils/static.ts
+++ b/app/soapbox/utils/static.ts
@@ -5,7 +5,7 @@
import { join } from 'path';
-import * as BuildConfig from 'soapbox/build_config';
+import * as BuildConfig from 'soapbox/build-config';
/** Gets the path to a file with build configuration being considered. */
export const joinPublicPath = (...paths: string[]): string => {
diff --git a/app/soapbox/utils/tiny_post_html_processor.ts b/app/soapbox/utils/tiny-post-html-processor.ts
similarity index 100%
rename from app/soapbox/utils/tiny_post_html_processor.ts
rename to app/soapbox/utils/tiny-post-html-processor.ts
diff --git a/app/styles/about.scss b/app/styles/about.scss
deleted file mode 100644
index 038e34ec8c..0000000000
--- a/app/styles/about.scss
+++ /dev/null
@@ -1,1064 +0,0 @@
-$maximum-width: 1235px;
-$fluid-breakpoint: $maximum-width + 20px;
-
-@keyframes upAndFadeIn {
- 0% {
- transform: rotate(-15deg) translateX(40%) translateY(20%) scale(1.15);
- }
-
- 100% {
- transform: rotate(-5deg) translateX(40%) translateY(0) scale(1.15);
- }
-}
-
-@keyframes upAndFadeInLeft {
- 0% {
- transform: rotate(30deg) translateX(30%) scale(1.15) translateY(30%);
- }
-
- 100% {
- transform: rotate(15deg) translateX(30%) scale(1.15) translateY(10%);
- }
-}
-
-@keyframes wave {
- 0% {
- transform: rotate(0);
- }
-
- 25% {
- transform: rotate(15deg);
- }
-
- 50% {
- transform: rotate(-10deg);
- }
-
- 75% {
- transform: rotate(15deg);
- }
-
- 100% {
- transform: rotate(0);
- }
-}
-
-.public-layout {
- .app-store-button {
- width: auto;
- height: 80px;
- display: inline-block;
- }
-
- .container {
- width: 100%;
- max-width: 1280px;
-
- @media screen and (max-width: $no-gap-breakpoint) {
- padding: 0;
- }
- }
-
- .content {
- width: 100%;
- display: block;
- margin: 40px 0;
- border-radius: 6px;
-
- @media screen and (max-width: 767px) {
- margin-top: 0;
- }
- }
-
- .header {
- height: 80px;
- display: flex;
- align-items: stretch;
- justify-content: center;
- flex-wrap: nowrap;
- padding: 14px 20px;
- box-sizing: border-box;
- position: relative;
-
- .header-container {
- display: flex;
- width: 1280px;
- align-items: stretch;
- justify-content: center;
- flex-wrap: nowrap;
-
- & > div {
- flex: 1 1 33.3%;
- min-height: 1px;
- }
- }
-
- .nav-left {
- display: flex;
- align-items: center;
- justify-content: flex-start;
- flex-wrap: nowrap;
- }
-
- .nav-center {
- display: flex;
- align-items: stretch;
- justify-content: center;
- flex-wrap: nowrap;
- }
-
- .nav-right {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- flex-wrap: nowrap;
-
- .simple_form.new_user,
- .simple_form--public {
- display: flex;
- flex-direction: row;
- align-items: center;
-
- .fields-group {
- display: flex;
- flex-direction: row;
- margin-bottom: 0;
- position: relative;
-
- p.hint.subtle-hint {
- position: absolute;
- top: 30px;
- left: 160px;
- border-radius: 4px;
- background: var(--foreground-color);
- overflow: hidden;
-
- a {
- padding: 4px;
- background-color: var(--brand-color--med);
- }
- }
-
- .input {
- flex: 1;
- margin-bottom: 0;
- margin-right: 10px;
-
- input {
- min-width: 150px;
- font-size: 14px;
- }
- }
- }
-
- .actions {
- display: flex;
- margin-top: 0;
-
- .button {
- margin-bottom: 0 !important;
- line-height: 38px !important;
- height: 38px !important;
- box-sizing: border-box !important;
- padding: 0 18px !important;
- text-transform: none !important;
- }
- }
- }
- }
-
- .brand {
- display: block;
-
- svg {
- display: block;
- height: 50px;
- width: auto;
- position: relative;
-
- @media screen and (max-width: $no-gap-breakpoint) {
- height: 20px;
- }
- }
- }
-
- .nav-link {
- display: flex;
- align-items: center;
- padding: 12px 22px;
- font-size: 14px;
- font-weight: 600;
- text-decoration: none;
- color: var(--primary-text-color);
- white-space: nowrap;
- text-align: center;
-
- &:hover,
- &:focus,
- &:active {
- text-decoration: underline;
- color: var(--primary-text-color);
- }
-
- &--hollow {
- background-color: var(--brand-color--med);
-
- &:hover,
- &:focus,
- &:active {
- color: var(--brand-color);
- }
- }
-
- @media screen and (max-width: 550px) {
- &.optional {
- display: none;
- }
- }
- }
-
- .nav-button {
- background: var(--brand-color);
- color: #fff;
- margin: 8px;
- margin-left: 0;
- border-radius: 4px;
-
- &:hover,
- &:focus,
- &:active {
- opacity: 0.9;
- color: #fff;
- text-decoration: none;
- }
- }
- }
-
- .faq {
- margin-bottom: 80px;
-
- .subtext {
- a {
- color: $color-4;
- }
- }
-
- .lead {
- font-weight: 600;
- font-size: 32px;
- line-height: 42px;
- margin-bottom: 10px;
- }
-
- .columns {
- display: flex;
- @media screen and (max-width: $fluid-breakpoint) {
- display: block;
- }
-
- .left-column {
- flex: 2;
- padding-right: 20px;
- }
-
- .right-column {
- flex: 4;
-
- span {
- font-style: italic;
- font-weight: 600;
- color: $color-4-dark;
- }
- }
-
- .question {
- font-size: 20px;
- font-weight: 600;
- }
- }
- }
-
- .mobile-page {
- height: 100%;
-
- .rich-formatting,
- .mobile-cta {
- height: 100%;
- }
-
- .rich-formatting {
- padding: 10px 0;
- }
-
- .flexed {
- height: 100%;
- display: flex;
-
- @media screen and (max-width: 768px) {
- flex-direction: column;
- }
-
- p {
- font-size: 20px;
- line-height: 1.4;
- margin-bottom: 40px;
- }
-
- h1 {
- letter-spacing: -0.02em;
- font-size: 80px;
- font-weight: 400;
- line-height: 80px;
- margin: 0 0 20px 0;
- -webkit-tap-highlight-color: lightblue !important;
-
- @media screen and (max-width: 768px) {
- font-size: 60px;
- line-height: 60px;
- }
-
- .alt-gradient {
- font-size: 70px;
- line-height: 70px;
- font-weight: 600;
- background: -webkit-linear-gradient(135deg, $color-9, $color-4-light, $color-2-light);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
-
- @media screen and (max-width: 768px) {
- font-size: 50px;
- line-height: 50px;
- }
- }
-
- .big {
- color: $color-4-dark;
- display: block;
- font-weight: 200;
- }
- }
-
- .column {
- position: relative;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: flex-start;
- flex: 1;
-
- @media screen and (max-width: 768px) {
- flex: 0;
- width: 100%;
- order: 1;
- }
-
- &:nth-of-type(2) {
- flex-direction: row;
- align-items: center;
-
- @media screen and (max-width: 768px) {
- padding-top: 80px;
- order: 0;
- }
- }
- }
- }
-
- .nested-column {
- flex: 1;
- }
-
- .screenshot-1,
- .screenshot-2 {
- position: relative;
- width: 100%;
- z-index: 10;
- }
-
- .screenshot-1 {
- animation: 1s ease-in upAndFadeIn;
- transform: rotate(-5deg) translateX(40%) scale(1.15);
-
- @media screen and (max-width: 768px) {
- animation: none;
- transform: rotate(-5deg) translateX(20%) scale(1.05);
- }
- }
-
- .screenshot-2 {
- animation: 1s ease-in upAndFadeInLeft;
- transform: rotate(15deg) translateX(30%) scale(1.15) translateY(10%);
- z-index: 9;
-
- @media screen and (max-width: 768px) {
- animation: none;
- transform: rotate(15deg) translateX(-10%) scale(0.9) translateY(5%);
- }
- }
- }
-
- .tips {
- padding: 80px 40px;
- border-radius: 10px;
- margin-bottom: 80px;
-
- @media screen and (max-width: $fluid-breakpoint) {
- padding: 20px;
- }
-
- .app-icon {
- width: 100px;
- border-radius: 16px;
- }
-
- .invite-icon {
- width: 100px;
- }
-
- .small-invite-icon {
- width: 40px;
- }
-
- span {
- font-style: italic;
- font-weight: 600;
- color: $color-4-dark;
- }
-
- .mb-40 {
- margin-bottom: 40px;
- }
-
- .tip {
- font-size: 20px;
- font-weight: 600;
- }
-
- ol {
- padding-left: 10px;
-
- li {
- img {
- width: 30px;
- height: 30px;
- display: inline;
- margin-bottom: -5px;
- }
- }
- }
-
- .columns {
- display: flex;
- @media screen and (max-width: $fluid-breakpoint) {
- display: block;
- }
-
- .left-column {
- display: flex;
- flex-direction: column;
- align-items: center;
- flex: 2;
- padding-right: 20px;
-
- img {
- width: 120px;
- height: 120px;
- }
-
- h2 {
- font-size: 32px;
- margin: 20px 0;
- font-weight: 600;
- color: $color-4;
- text-align: center;
- }
- }
-
- .right-column {
- flex: 4;
- }
- }
- }
-
- .static-pages-header {
- width: 100%;
- padding: 40px 0;
- border-bottom: 1px solid $color-6-dark;
- margin-bottom: 40px;
-
- h1 {
- font-size: 32px;
- font-weight: 600;
- color: $color-3-dark;
- margin-bottom: 10px;
- }
-
- p {
- font-size: 22px;
- }
- }
-
- .static-list-wrapper {
- display: grid;
- grid-template-columns: 1fr 1fr 1fr;
- grid-gap: 20px;
- width: 100%;
- list-style: none;
- padding: 40px 0;
-
- @media screen and (max-width: $fluid-breakpoint) {
- grid-template-columns: 100%;
- }
-
- li {
- .card {
- border-radius: 10px;
- background: linear-gradient(-45deg, $color-3-light, $color-3-dark);
-
- h4 {
- color: white;
- font-size: 24px;
- font-weight: 500;
- margin: 0 0 20px 0;
- }
-
- a {
- color: white;
- }
-
- p {
- color: transparentize($color-6-light, 0.1);
- }
-
- .card-header {
- padding: 20px;
- height: 160px;
- }
-
- .card-footer {
- background: transparentize($color-6-light, 0.9);
- text-align: right;
- border-radius: 0 0 10px 10px;
- padding: 10px 20px;
- }
- }
- }
- }
-}
-
-.container {
- position: relative;
- z-index: 20;
- box-sizing: border-box;
- max-width: $maximum-width;
- margin: 0 auto;
- width: 100%;
- padding: 0 10px;
-}
-
-.rich-formatting {
- @apply text-gray-900 dark:text-gray-100;
- font-family: var(--font-sans-serif), sans-serif;
- font-size: 16px;
- font-weight: 400;
- line-height: 30px;
- padding: 15px 30px;
-
- .text-center {
- text-align: center;
- }
-
- & > :first-child {
- margin-top: 0.5em;
- }
-
- a {
- color: var(--highlight-text-color);
- text-decoration: underline;
- }
-
- p {
- margin: 1em 0;
- }
-
- p,
- li {
- @apply text-gray-900 dark:text-gray-100;
- font-family: var(--font-sans-serif), sans-serif;
- font-size: 16px;
- font-weight: 400;
- line-height: 30px;
-
- a {
- color: var(--highlight-text-color);
- text-decoration: underline;
- }
- }
-
- strong,
- em,
- b {
- font-weight: bold;
- color: var(--primary-text-color);
- }
-
- h1,
- h2,
- h3,
- h4,
- h5,
- h6 {
- @apply text-gray-900 dark:text-gray-100;
- font-family: var(--font-display), sans-serif;
- margin-top: 2em;
- margin-bottom: 1.25em;
- }
-
- hr + {
- h1,
- h2,
- h3,
- h4,
- h5,
- h6 {
- margin-top: 1.25em;
- }
- }
-
- h1 {
- font-size: 26px;
- line-height: 30px;
-
- small {
- font-family: var(--font-sans-serif), sans-serif;
- display: block;
- font-size: 18px;
- font-weight: 400;
- color: var(--primary-text-color);
- }
- }
-
- h2 {
- font-weight: 600;
- font-size: 28px;
- line-height: 32px;
- }
-
- h3 {
- font-size: 18px;
- line-height: 24px;
- }
-
- h4 {
- font-size: 16px;
- line-height: 24px;
- }
-
- h5 {
- font-size: 14px;
- line-height: 24px;
- }
-
- h6 {
- font-size: 12px;
- line-height: 24px;
- }
-
- ul,
- ol {
- padding: 0 0 0 2em;
- margin: 0 0 0.85em;
-
- &[type="a"] {
- list-style-type: lower-alpha;
- }
-
- &[type="i"] {
- list-style-type: lower-roman;
- }
- }
-
- ul {
- list-style: disc;
- }
-
- ol {
- list-style: decimal;
- }
-
- li > ol,
- li > ul {
- margin-top: 6px;
- }
-
- li p {
- margin-top: 0;
- }
-
- hr {
- width: 100%;
- height: 0;
- border: 0;
- border-bottom: 1px solid hsla(var(--background-color_hsl), 0.6);
- margin: 2em 0;
-
- &.spacer {
- height: 1px;
- border: 0;
- }
- }
-
- pre {
- white-space: pre-wrap;
- }
-}
-
-.also-available {
- padding-top: 0;
-
- ul {
- display: inline;
- padding-left: 0;
- list-style: none;
-
- li {
- display: inline;
-
- &::after {
- content: " · ";
- }
- }
-
- li:last-child::after {
- content: "";
- }
- }
-}
-
-.public-layout {
- position: relative;
- background-size: 100% auto;
- background-repeat: no-repeat;
- background-position: 0 -106px;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-
- @media screen and (max-width: 767px) {
- .wave {
- display: none;
- }
-
- .follow-truth {
- margin-bottom: 20px;
- }
-
- .header {
- .nav-link {
- color: #fff;
-
- &:hover,
- &:focus,
- &:active {
- color: #fff;
- opacity: 0.9;
- }
- }
-
- .nav-button {
- background: var(--accent-color);
- color: #fff;
- transition: 0.2s;
-
- &:hover,
- &:focus,
- &:active {
- background: var(--accent-color--bright);
- }
- }
- }
- }
-}
-
-.app-holder > .public-layout {
- align-items: normal;
-}
-
-.landing {
- height: auto;
- min-height: 80vh;
-
- @media (min-width: 767px) {
- min-height: 550px;
- }
-
- .landing-columns {
- display: flex;
- flex-direction: row;
- padding: 40px 0 20px;
-
- &--left {
- margin-right: 80px;
- }
-
- &--right {
- margin-left: auto;
- width: 395px;
- background-color: var(--foreground-color);
- border-radius: 6px;
- height: 100%;
-
- .simple_form,
- .registrations-closed {
- padding: 20px;
- background-color: var(--brand-color--faint);
- border-radius: inherit;
- }
- }
-
- .registrations-closed {
- display: flex;
- flex-direction: column;
- height: 100%;
- align-items: center;
- justify-content: center;
- text-align: center;
- font-size: 18px;
-
- h2 {
- font-weight: bold;
- font-size: 24px;
- margin-bottom: 10px;
- }
- }
-
- @media (min-width: 767px) and (max-width: 1024px) {
- padding: 40px 20px 20px;
-
- &--left {
- margin-right: 40px;
- }
-
- &--right {
- width: 425px;
- }
- }
-
- @media screen and (max-width: 767px) {
- height: auto;
- padding: 20px 10px 30px;
- flex-direction: column;
- align-items: center;
-
- &--left {
- margin-right: 0;
- }
-
- &--right {
- width: 100%;
- margin-left: 0;
- margin-top: 30px;
- }
- }
- }
-
- &__brand {
- display: flex;
- justify-content: flex-start;
- align-items: center;
- flex-direction: column;
-
- .brand {
- margin-right: auto !important;
- line-height: normal;
- }
-
- img {
- height: 100px;
-
- @media (min-width: 767px) and (max-width: 1024px) {
- height: 60px;
- }
-
- @media screen and (max-width: 767px) {
- display: none;
- }
- }
-
- h1 {
- font-size: 40px;
- }
- }
-
- .directory {
- margin-top: 30px;
- background: transparent;
- box-shadow: none;
- border-radius: 0;
- }
-
- .simple_form .user_agreement .label_input > label {
- @apply text-gray-900 dark:text-gray-100 font-normal;
- }
-
- .simple_form p.lead {
- color: var(--primary-text-color);
- font-size: 15px;
- line-height: 20px;
- font-weight: 400;
- margin-bottom: 25px;
- }
-
- &__grid {
- max-width: 960px;
- margin: 0 auto;
- display: grid;
- grid-template-columns: minmax(0, 50%) minmax(0, 50%);
- grid-gap: 30px;
-
- @media screen and (max-width: 738px) {
- grid-template-columns: minmax(0, 100%);
- grid-gap: 10px;
-
- &__column-login {
- grid-row: 1;
- display: flex;
- flex-direction: column;
- }
-
- &__column-registration {
- grid-row: 2;
- }
-
- .directory {
- margin-top: 10px;
- }
- }
-
- @media screen and (max-width: $no-gap-breakpoint) {
- grid-gap: 0;
- }
- }
-}
-
-.brand {
- position: relative;
- text-decoration: none;
- margin-right: 15px;
-
- h1 {
- color: var(--brand-color);
- }
-}
-
-.brand__tagline {
- @apply text-black dark:text-white;
- display: block;
- width: 470px;
- font-size: 24px;
- line-height: 1.4;
- margin-top: 25px;
- font-weight: 400;
-
- @media (min-width: 767px) and (max-width: 1024px) {
- width: 320px;
- font-size: 20px;
- }
-
- @media screen and (max-width: 767px) {
- width: 100%;
- font-size: 22px;
- margin-top: 0;
- }
-}
-
-@media (min-width: 767px) {
- .hidden-sm {
- display: block;
- }
-
- .visible-sm {
- display: none;
- }
-}
-
-@media screen and (max-width: 767px) {
- .hidden-sm {
- display: none !important;
- }
-
- .visible-sm {
- display: block !important;
- }
-}
-
-.about-page {
- background: var(--brand-color--faint);
- border-radius: inherit;
-}
-
-.public-layout__top {
- position: relative;
- flex: 1;
-
- .header,
- .container {
- position: relative;
- }
-
- .otp-form-overlay__container {
- z-index: 9998;
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- display: flex;
- align-items: center;
- justify-content: center;
- background: rgba($base-overlay-background, 0.7);
-
- .otp-form-overlay__form {
- @include standard-panel-shadow;
- border-radius: 10px;
- z-index: 9999;
- margin: 0 auto;
- max-width: 800px;
- position: relative;
- padding: 20px;
- background-color: var(--background-color);
- display: flex;
- flex-direction: column;
-
- .simple_form {
- padding: 30px 50px 50px;
- }
-
- .otp-form-overlay__close {
- align-self: flex-end;
-
- .svg-icon {
- height: 20px;
- width: 20px;
- }
- }
- }
- }
-}
-
-.public-layout__top .wave {
- position: absolute;
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- bottom: 0;
- right: 0;
-}
-
-h1.otp-login {
- font-size: 16px;
- line-height: 24px;
- font-weight: 800;
- padding: 10px 0;
-}
diff --git a/app/styles/accounts.scss b/app/styles/accounts.scss
index b0412298b0..831559f9fa 100644
--- a/app/styles/accounts.scss
+++ b/app/styles/accounts.scss
@@ -203,23 +203,6 @@ a .account__avatar {
}
}
-.account__section-headline {
- button,
- a {
- flex: none;
- padding: 18px 15px;
- font-size: 16px;
- font-weight: 600;
-
- &.active {
- &::before,
- &::after {
- border-color: transparent transparent var(--foreground-color);
- }
- }
- }
-}
-
.account__moved-note {
padding: 14px 10px;
padding-bottom: 16px;
diff --git a/app/styles/application.scss b/app/styles/application.scss
index eefd83de8f..5ead30f5e6 100644
--- a/app/styles/application.scss
+++ b/app/styles/application.scss
@@ -11,19 +11,15 @@
@import 'themes';
@import 'variables';
@import 'fonts';
-@import 'reset';
@import 'basics';
-@import 'footer';
@import 'accounts';
@import 'boost';
@import 'loading';
@import 'ui';
// @import 'introduction';
-@import 'emoji_picker';
-@import 'about';
+@import 'emoji-picker';
@import 'rtl';
@import 'accessibility';
-@import 'donations';
@import 'dyslexic';
@import 'demetricator';
@import 'chats';
@@ -50,33 +46,19 @@
@import 'components/search';
@import 'components/react-toggle';
@import 'components/still-image';
-@import 'components/trends';
-@import 'components/wtf-panel';
@import 'components/profile-media-panel';
@import 'components/profile-info-panel';
-@import 'components/setting-toggle';
@import 'components/spoiler-button';
@import 'components/video-player';
@import 'components/audio-player';
-@import 'components/profile_hover_card';
+@import 'components/profile-hover-card';
@import 'components/filters';
@import 'components/snackbar';
-@import 'components/accordion';
-@import 'components/server-info';
@import 'components/admin';
@import 'components/backups';
@import 'components/crypto-donate';
-@import 'components/remote-timeline';
@import 'components/aliases';
@import 'components/icon';
-@import 'components/radio-button';
-@import 'components/directory';
-
-// Holiday
-@import 'holiday/halloween';
-
-// Truth custom styles
-@import 'truth';
@tailwind base;
@tailwind components;
diff --git a/app/styles/components/accordion.scss b/app/styles/components/accordion.scss
deleted file mode 100644
index 77c39ae1eb..0000000000
--- a/app/styles/components/accordion.scss
+++ /dev/null
@@ -1,71 +0,0 @@
-.explanation-box {
- padding: 5px 20px;
-}
-
-.accordion {
- @apply text-black dark:text-white bg-gray-100 dark:bg-gray-900;
- padding: 15px 20px;
- font-size: 14px;
- border-radius: 8px;
- margin: 0;
- position: relative;
-
- &__title {
- font-weight: bold !important;
- font-size: 16px !important;
- background: transparent !important;
- color: var(--primary-text-color) !important;
- padding: 0 !important;
- margin: 0 !important;
- text-transform: none !important;
- text-align: left !important;
- display: flex !important;
- align-items: center;
- border: 0;
- width: 100%;
-
- &::after {
- @apply text-black dark:text-white;
- content: '';
- display: block;
- font-family: 'Font Awesome 5 Free';
- font-weight: 900;
- font-size: 0.8em;
- padding-left: 0.6em;
- margin-left: auto;
- }
- }
-
- &__menu {
- position: absolute;
- top: 17px;
- right: 40px;
- }
-
- &__content {
- height: 0;
- overflow: hidden;
- }
-
- &--expanded &__title {
- margin-bottom: 10px !important;
-
- &::after {
- @apply text-black dark:text-white;
- content: '';
- }
- }
-
- &--expanded &__content {
- height: auto;
- }
-
- a {
- color: var(--brand-color--hicontrast);
- text-decoration: underline;
-
- &:hover {
- text-decoration: none;
- }
- }
-}
diff --git a/app/styles/components/admin.scss b/app/styles/components/admin.scss
index 6c6fb42fa1..302baa4e1d 100644
--- a/app/styles/components/admin.scss
+++ b/app/styles/components/admin.scss
@@ -111,17 +111,6 @@
}
}
- &__statuses .accordion {
- padding: 10px;
- margin-bottom: 6px;
-
- &__title {
- font-size: 12px !important;
- font-weight: normal !important;
- margin-bottom: 0 !important;
- }
- }
-
&__status-content {
overflow: hidden;
}
diff --git a/app/styles/components/columns.scss b/app/styles/components/columns.scss
index 5ac7619462..454c73cbd8 100644
--- a/app/styles/components/columns.scss
+++ b/app/styles/components/columns.scss
@@ -719,10 +719,6 @@
font-size: 20px;
}
-.column .explanation-box {
- background: var(--foreground-color);
-}
-
// Pull to refresh
.columns-area .column {
.ptr,
diff --git a/app/styles/components/compose-form.scss b/app/styles/components/compose-form.scss
index 0d76263d31..50ffbc2fef 100644
--- a/app/styles/components/compose-form.scss
+++ b/app/styles/components/compose-form.scss
@@ -135,12 +135,12 @@
position: relative;
&.video {
- background-image: url('../images/video-placeholder.png');
+ background-image: url('../assets/images/video-placeholder.png');
background-size: cover;
}
&.audio {
- background-image: url('../images/audio-placeholder.png');
+ background-image: url('../assets/images/audio-placeholder.png');
background-size: cover;
}
}
diff --git a/app/styles/components/directory.scss b/app/styles/components/directory.scss
deleted file mode 100644
index 7dc8e48cd5..0000000000
--- a/app/styles/components/directory.scss
+++ /dev/null
@@ -1,179 +0,0 @@
-.directory {
- &__filter-form {
- display: flex;
- gap: 30px;
- background: var(--foreground-color);
-
- &__column {
- padding-bottom: 10px;
- }
-
- .radio-button {
- display: block;
- }
- }
-
- &__list {
- display: grid;
- grid-gap: 10px;
- grid-template-columns: minmax(0, 50%) minmax(0, 50%);
- width: 100%;
- transition: opacity 100ms ease-in;
- box-sizing: border-box;
-
- &.loading {
- opacity: 0.7;
- }
-
- @media screen and (max-width: 630px) {
- grid-template-columns: minmax(0, 100%);
- }
- }
-
- &__card {
- @apply rounded-lg bg-gray-100 dark:bg-primary-800;
- box-sizing: border-box;
- margin-bottom: 0;
- box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.1);
- overflow: hidden;
- position: relative;
-
- &__info {
- z-index: 1;
- position: absolute;
- top: 10px;
- left: 10px;
- }
-
- &__action-button {
- z-index: 1;
- position: absolute;
- top: 78px;
- right: 12px;
- }
-
- &__img {
- @apply bg-primary-200 dark:bg-gray-600;
- height: 125px;
- position: relative;
-
- img {
- display: block;
- width: 100%;
- height: 100%;
- margin: 0;
- object-fit: cover;
- }
- }
-
- &__bar {
- @apply bg-primary-200 dark:bg-primary-700;
- display: flex;
- align-items: center;
- padding: 10px;
-
- &__name {
- flex: 1 1 auto;
- display: flex;
- align-items: center;
- text-decoration: none;
- overflow: hidden;
- }
-
- .account__avatar {
- flex: 0 0 auto;
- width: 48px;
- min-width: 48px;
- height: 48px;
- padding-top: 2px;
-
- img {
- width: 100%;
- height: 100%;
- display: block;
- margin: 0;
- border-radius: 4px;
- background: var(--brand-color--faint);
- object-fit: cover;
- }
- }
-
- .display-name {
- margin-left: 15px;
- text-align: left;
-
- strong {
- @apply text-black dark:text-white;
- font-size: 15px;
- font-weight: 500;
- overflow: hidden;
- text-overflow: ellipsis;
- }
-
- span:not(.verified-icon) {
- @apply text-gray-500 dark:text-gray-400;
- display: block;
- font-size: 14px;
- font-weight: 400;
- overflow: hidden;
- text-overflow: ellipsis;
- }
-
- .verified-icon div,
- .verified-icon svg {
- @apply inline;
- }
- }
- }
-
- &__extra {
- background: var(--foreground-color);
- display: flex;
- align-items: center;
- justify-content: center;
-
- .accounts-table__count {
- padding: 15px 0;
- text-align: center;
- font-size: 15px;
- font-weight: 500;
- width: 33.33%;
- flex: 0 0 auto;
-
- small {
- display: block;
- color: var(--primary-text-color--faint);
- font-weight: 400;
- font-size: 14px;
- }
- }
-
- .account__header__content {
- @apply border-b border-solid border-gray-200 dark:border-primary-500;
- box-sizing: border-box;
- padding: 15px 10px;
- width: 100%;
- min-height: 50px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-
- &.empty {
- border-color: transparent;
- }
-
- p {
- display: none;
-
- &:first-child {
- display: inline;
- }
- }
-
- br {
- display: none;
- }
- }
- }
- }
-}
diff --git a/app/styles/components/profile_hover_card.scss b/app/styles/components/profile-hover-card.scss
similarity index 100%
rename from app/styles/components/profile_hover_card.scss
rename to app/styles/components/profile-hover-card.scss
diff --git a/app/styles/components/radio-button.scss b/app/styles/components/radio-button.scss
deleted file mode 100644
index 77fb828466..0000000000
--- a/app/styles/components/radio-button.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-.radio-button {
- @apply text-black dark:text-white;
- font-size: 14px;
- position: relative;
- display: inline-block;
- padding: 6px 0;
- line-height: 18px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- cursor: pointer;
-
- input[type=radio],
- input[type=checkbox] {
- display: none;
- }
-
- &__input {
- @apply inline-block relative box-border border border-solid border-primary-600;
- width: 18px;
- height: 18px;
- flex: 0 0 auto;
- margin-right: 10px;
- top: -1px;
- border-radius: 50%;
- vertical-align: middle;
-
- &.checked {
- @apply bg-primary-600;
- }
-
- &:active,
- &:focus,
- &:hover {
- @apply border-4;
- }
- }
-}
diff --git a/app/styles/components/remote-timeline.scss b/app/styles/components/remote-timeline.scss
deleted file mode 100644
index c59427a3fe..0000000000
--- a/app/styles/components/remote-timeline.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-.federation-restriction {
- display: flex;
- padding: 15px 0;
-}
diff --git a/app/styles/components/server-info.scss b/app/styles/components/server-info.scss
deleted file mode 100644
index a24335eef0..0000000000
--- a/app/styles/components/server-info.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-.columns-area {
- .info_column_area {
- padding: 15px;
-
- .wtf-panel {
- border: 1px solid var(--brand-color--med);
- }
- }
-}
-
-.info__brand {
- .brand h1 {
- @apply text-2xl text-black dark:text-white;
- }
-
- .brand__tagline {
- font-size: 20px;
- line-height: 1.15;
- margin-top: 15px;
- }
-}
diff --git a/app/styles/components/setting-toggle.scss b/app/styles/components/setting-toggle.scss
deleted file mode 100644
index 1acbcfffec..0000000000
--- a/app/styles/components/setting-toggle.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.setting-toggle__label {
- color: var(--gray-800);
-}
diff --git a/app/styles/components/sidebar-menu.scss b/app/styles/components/sidebar-menu.scss
index 9c015badb6..9d36258630 100644
--- a/app/styles/components/sidebar-menu.scss
+++ b/app/styles/components/sidebar-menu.scss
@@ -16,8 +16,3 @@
transform: translateX(0);
}
}
-
-.sidebar-menu .wtf-panel {
- box-shadow: none !important;
- margin: 0;
-}
diff --git a/app/styles/components/trends.scss b/app/styles/components/trends.scss
deleted file mode 100644
index 7984aa8732..0000000000
--- a/app/styles/components/trends.scss
+++ /dev/null
@@ -1,78 +0,0 @@
-.trends {
- &__header {
- color: var(--primary-text-color);
- background: var(--brand-color--faint);
- border-bottom: 1px solid var(--brand-color--med);
- font-weight: 500;
- padding: 15px;
- font-size: 16px;
- cursor: default;
-
- .fa {
- display: inline-block;
- margin-right: 5px;
- }
- }
-
- &__item {
- display: flex;
- align-items: center;
- padding: 15px;
- border-bottom: 1px solid var(--brand-color--med);
-
- &:last-child {
- border-bottom: 0;
- }
-
- &__name {
- flex: 1 1 auto;
- color: var(--primary-text-color);
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- font-size: 13px;
-
- strong {
- font-weight: bold;
- }
-
- a {
- color: var(--primary-text-color--faint);
- text-decoration: none;
- font-size: 14px;
- font-weight: 500;
- display: block;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-
- &:hover,
- &:focus,
- &:active {
- span {
- text-decoration: underline;
- }
- }
- }
- }
-
- &__current {
- flex: 0 0 auto;
- width: 100px;
- font-size: 24px;
- line-height: 36px;
- font-weight: 500;
- text-align: center;
- color: var(--primary-text-color--faint);
- }
-
- &__sparkline {
- flex: 0 0 auto;
- width: 50px;
-
- path {
- stroke: var(--highlight-text-color) !important;
- }
- }
- }
-}
diff --git a/app/styles/components/wtf-panel.scss b/app/styles/components/wtf-panel.scss
deleted file mode 100644
index 2d536e7819..0000000000
--- a/app/styles/components/wtf-panel.scss
+++ /dev/null
@@ -1,73 +0,0 @@
-.wtf-panel {
- @include standard-panel;
- display: flex;
- width: 100%;
- flex-direction: column;
- height: auto;
- box-sizing: border-box;
-
- @media screen and (max-width: 580px) {
- border-radius: 0;
- }
-
- &:first-child {
- margin-top: 0;
- }
-
- &:not(:last-of-type) {
- margin-bottom: 10px;
- }
-
- .wtf-panel-header {
- display: flex;
- align-items: center;
- margin-bottom: 10px;
- padding: 15px 15px 0;
-
- &__icon {
- margin-right: 10px;
- font-size: 20px;
-
- &.svg-icon {
- width: 20px;
- height: 20px;
- }
- }
-
- &__label {
- flex: 1 1;
- color: var(--primary-text-color);
- font-size: 16px;
- font-weight: bold;
- line-height: 19px;
- }
- }
-
- &__content {
- width: 100%;
- padding-top: 8px;
- }
-
- &__list {
- padding: 0 5px;
- }
-
- &__expand-btn {
- @apply border-gray-300 dark:border-gray-600;
- display: block;
- width: 100%;
- height: 100%;
- max-height: 46px;
- position: relative;
- border-top: 1px solid;
- transition: max-height 150ms ease;
- overflow: hidden;
- opacity: 1;
- text-align: center;
- line-height: 46px;
- font-size: 14px;
- cursor: pointer;
- color: var(--primary-text-color);
- text-decoration: none;
- }
-}
diff --git a/app/styles/donations.scss b/app/styles/donations.scss
deleted file mode 100644
index 121e6fbc3a..0000000000
--- a/app/styles/donations.scss
+++ /dev/null
@@ -1,113 +0,0 @@
-.sub {
- border: 1px solid hsla(var(--primary-text-color_hsl), 0.5);
- padding: 20px;
- position: relative;
- border-radius: 4px;
-
- &__title {
- text-transform: uppercase;
- font-weight: bold;
- font-size: 1.3rem;
- margin-bottom: 4px;
- }
-
- &__amount {
- font-size: 2rem;
- line-height: normal;
- margin: 4px 0 12px;
- }
-
- &__billing {
- font-size: 14px;
- }
-
- &__button {
- margin-top: 20px;
- }
-
- /* Status indicator */
- &::before {
- content: '';
- display: block;
- position: absolute;
- top: 15px;
- right: 13px;
- border-radius: 100%;
- background-color: transparent;
- height: 13px;
- width: 13px;
- }
-
- &--trialing,
- &--active {
- &::before {
- background-color: #0f0;
- }
- }
-
- &--cancelling::before {
- background-color: #ff0;
- }
-
- &--incomplete,
- &--incomplete_expired,
- &--past_due,
- &--canceled,
- &--unpaid {
- &::before {
- background-color: #f00;
- }
- }
-}
-
-.subs {
- .sub {
- border-radius: 0;
-
- & + .sub {
- border-top: 0;
- }
-
- &:first-child {
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
- }
-
- &:last-child {
- border-bottom-left-radius: 4px;
- border-bottom-right-radius: 4px;
- }
- }
-}
-
-body.admin {
- .actions {
- margin-top: 40px;
- }
-}
-
-.funding-panel {
- margin-top: 15px;
-
- strong {
- font-weight: bold;
- }
-
- &__ratio {
- font-size: 14px;
- margin-bottom: 8px;
- }
-
- &__description {
- margin-top: 14px;
- font-size: 15px;
- }
-
- .button {
- margin-top: 20px;
- }
-
- &__reached {
- color: var(--brand-color);
- }
-}
diff --git a/app/styles/emoji_picker.scss b/app/styles/emoji-picker.scss
similarity index 100%
rename from app/styles/emoji_picker.scss
rename to app/styles/emoji-picker.scss
diff --git a/app/styles/fonts.scss b/app/styles/fonts.scss
index bd8f1bec56..fbb21c3814 100644
--- a/app/styles/fonts.scss
+++ b/app/styles/fonts.scss
@@ -3,26 +3,26 @@
// OpenDyslexic
@font-face {
font-family: 'OpenDyslexic';
- src: url('../fonts/OpenDyslexic/OpenDyslexic-Regular.woff2') format('woff2');
+ src: url('../assets/fonts/OpenDyslexic/OpenDyslexic-Regular.woff2') format('woff2');
}
@font-face {
font-family: 'OpenDyslexic';
font-weight: bold;
- src: url('../fonts/OpenDyslexic/OpenDyslexic-Bold.woff2') format('woff2');
+ src: url('../assets/fonts/OpenDyslexic/OpenDyslexic-Bold.woff2') format('woff2');
}
@font-face {
font-family: 'OpenDyslexic';
font-weight: bold;
font-style: italic;
- src: url('../fonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff2') format('woff2');
+ src: url('../assets/fonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff2') format('woff2');
}
@font-face {
font-family: 'OpenDyslexic';
font-style: italic;
- src: url('../fonts/OpenDyslexic/OpenDyslexic-Italic.woff2') format('woff2');
+ src: url('../assets/fonts/OpenDyslexic/OpenDyslexic-Italic.woff2') format('woff2');
}
// TYPEOGRAPHY MIXINS
@@ -62,11 +62,11 @@
// Soapbox icon font
@font-face {
font-family: 'soapbox';
- src: url('../fonts/soapbox/soapbox.eot?pryg6i');
- src: url('../fonts/soapbox/soapbox.eot?pryg6i#iefix') format('embedded-opentype'),
- url('../fonts/soapbox/soapbox.ttf?pryg6i') format('truetype'),
- url('../fonts/soapbox/soapbox.woff?pryg6i') format('woff'),
- url('../fonts/soapbox/soapbox.svg?pryg6i#soapbox') format('svg');
+ src: url('../assets/fonts/soapbox/soapbox.eot?pryg6i');
+ src: url('../assets/fonts/soapbox/soapbox.eot?pryg6i#iefix') format('embedded-opentype'),
+ url('../assets/fonts/soapbox/soapbox.ttf?pryg6i') format('truetype'),
+ url('../assets/fonts/soapbox/soapbox.woff?pryg6i') format('woff'),
+ url('../assets/fonts/soapbox/soapbox.svg?pryg6i#soapbox') format('svg');
font-weight: normal;
font-style: normal;
}
diff --git a/app/styles/footer.scss b/app/styles/footer.scss
deleted file mode 100644
index 835d40061a..0000000000
--- a/app/styles/footer.scss
+++ /dev/null
@@ -1,74 +0,0 @@
-.public-layout {
- .footer {
- display: flex;
- padding: 40px 0;
- font-size: 12px;
- justify-content: center;
- align-items: center;
- margin-top: auto;
- color: #fff;
- background-color: rgba(0, 0, 0, 0.15);
-
- @media screen and (max-width: 1024px) {
- padding: 40px 20px;
- }
-
- .footer-container {
- display: flex;
- width: 1280px;
- align-items: center;
- padding: 0 20px;
- flex-direction: column-reverse;
- justify-content: center;
- }
-
- h4 {
- text-transform: uppercase;
- font-weight: 700;
- margin-bottom: 8px;
- color: var(--primary-text-color--faint);
- font-size: 1.6rem;
- line-height: 1.5;
-
- a {
- color: inherit;
- text-decoration: none;
- }
- }
-
- .copyright {
- margin: 0 auto auto;
- text-align: center;
-
- span {
- font-size: 1.3rem;
- font-weight: 500;
- line-height: 1.5;
- }
- }
-
- ul {
- display: flex;
- flex-wrap: wrap;
- margin: 0 auto 20px;
-
- li {
- a {
- text-decoration: none;
- color: $color-5-dark;
- font-size: 1.3rem;
- font-weight: 500;
- line-height: 1.5;
- padding: 10px 4px;
- margin-left: 10px;
-
- &:hover,
- &:active,
- &:focus {
- text-decoration: underline;
- }
- }
- }
- }
- }
-}
diff --git a/app/styles/holiday/halloween.scss b/app/styles/holiday/halloween.scss
deleted file mode 100644
index 9fcf96ae56..0000000000
--- a/app/styles/holiday/halloween.scss
+++ /dev/null
@@ -1,144 +0,0 @@
-.halloween,
-.site-preview.halloween {
- // Set brand color to orange
- --brand-color_h: 29.727272727272727;
- --brand-color_s: 100%;
- --brand-color_l: 43.13725490196079%;
-
- // Stars BG
- background-color: #904700; // Color matches twinkle.svg
- background-image: url('../images/halloween/starfield.png');
- background-size: cover;
- background-attachment: fixed;
- background-position: center;
-
- // Full-screen pseudo-elements to hold BG graphics
- &::before,
- &::after,
- > .app-holder::before,
- > .app-holder::after {
- content: '';
- display: block;
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-size: cover;
- background-position: center;
- width: 100%;
- height: 100%;
- z-index: -100;
- }
-
- // Spiderweb BG
- &::before {
- background-image: url('../images/halloween/spiderweb.svg');
- }
-
- // Twinkle effect by masking with semi-transparent animated circles
- &::after {
- z-index: -101;
- background: transparent url("../images/halloween/twinkle.svg") repeat top center;
- animation: halloween-twinkle 200s linear infinite;
- }
-
- > .app-holder {
- // Vignette
- &::before {
- background-image: radial-gradient(
- circle,
- transparent 0%,
- transparent 60%,
- var(--vignette-color) 100%
- );
- }
-
- // Floating clouds BG
- &::after {
- background: transparent url("../images/halloween/clouds.png") repeat top center;
- animation: halloween-clouds 200s linear infinite;
- }
-
- // Dangling spider
- .ui .page__top::after,
- .ui .page__columns::after {
- content: '';
- display: block;
- width: 100px;
- height: 100px;
- right: 20px;
- background-image: url('../images/halloween/spider.svg');
- background-size: contain;
- background-repeat: no-repeat;
- background-position: top right;
- z-index: -1;
- pointer-events: none;
- }
-
- .ui .page__columns::after {
- position: fixed;
- top: 50px;
- }
-
- .ui .page__top::after {
- position: absolute;
- bottom: -100px;
- }
-
- .ui .page__top + .page__columns::after {
- display: none;
- }
-
- .profile-info-panel {
- color: #fff;
-
- &-content__name h1 {
- span:first-of-type {
- color: hsla(0, 0%, 100%, 0.6);
- }
-
- small {
- color: #fff;
- }
- }
-
- &-content__bio {
- color: #fff;
- }
-
- &-content__bio a,
- &-content__fields a {
- color: hsl(
- var(--brand-color_h),
- var(--brand-color_s),
- calc(var(--brand-color_l) + 8%)
- );
- }
- }
- }
-
- .column-header > button.grouped,
- .column-header > .btn.grouped {
- color: #fff;
-
- &:hover {
- color: #fff;
- }
-
- &::before {
- background-color: var(--brand-color);
- }
- }
-}
-
-// Animations
-@keyframes halloween-twinkle {
- from { background-position: 0 0; }
- to { background-position: -10000px 5000px; }
-}
-
-@keyframes halloween-clouds {
- from { background-position: 0 0; }
- to { background-position: 10000px 0; }
-}
diff --git a/app/styles/placeholder.scss b/app/styles/placeholder.scss
index 72a69c1550..7099266503 100644
--- a/app/styles/placeholder.scss
+++ b/app/styles/placeholder.scss
@@ -1,4 +1,3 @@
-.placeholder-hashtag,
.media-gallery--placeholder {
position: relative;
@@ -32,11 +31,6 @@
100% { background-position-x: 0; }
}
-.placeholder-hashtag .trends__item__name {
- color: var(--brand-color);
- opacity: 0.1;
-}
-
.chat-list-item--placeholder .chat__last-message {
letter-spacing: -1px;
color: var(--brand-color) !important;
diff --git a/app/styles/reset.scss b/app/styles/reset.scss
deleted file mode 100644
index 2906b3ac20..0000000000
--- a/app/styles/reset.scss
+++ /dev/null
@@ -1,54 +0,0 @@
-/* http://meyerweb.com/eric/tools/css/reset/
- v2.0 | 20110126
- License: none (public domain)
-*/
-
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, big, cite, code,
-del, dfn, em, img, ins, kbd, q, s, samp,
-small, strike, strong, sub, sup, tt, var,
-b, u, i, center,
-dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td,
-article, aside, canvas, details, embed,
-figure, figcaption, footer, header, hgroup,
-menu, nav, output, ruby, section, summary,
-time, mark, audio, video {
- margin: 0;
- padding: 0;
- border: 0;
- font-size: 100%;
- font: inherit;
- vertical-align: baseline;
-}
-
-/* HTML5 display-role reset for older browsers */
-article, aside, details, figcaption, figure,
-footer, header, hgroup, menu, nav, section {
- display: block;
-}
-
-body {
- line-height: 1;
-}
-
-ol, ul {
- list-style: none;
-}
-
-blockquote, q {
- quotes: none;
-}
-
-blockquote:before, blockquote:after,
-q:before, q:after {
- content: '';
- content: none;
-}
-
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
\ No newline at end of file
diff --git a/app/styles/truth.scss b/app/styles/truth.scss
deleted file mode 100644
index 5c7e1770fa..0000000000
--- a/app/styles/truth.scss
+++ /dev/null
@@ -1,339 +0,0 @@
-:root {
- --tmg-green: #008000;
-}
-
-.tabs-bar {
- background: var(--foreground-color);
- border-bottom: 1px solid hsla(var(--primary-text-color_hsl), 0.1);
-}
-
-.tabs-bar__link {
- &--logo {
- padding: 9px 5px;
- align-self: center;
- justify-self: center;
- filter: none;
- }
-
- .svg-icon {
- color: var(--brand-color);
- transition: none;
- }
-
- &:hover .svg-icon {
- color: white;
- }
-}
-
-.tabs-bar .react-toggle-track {
- background-color: var(--brand-color) !important;
-}
-
-.theme-mode-dark .primary-navigation > button::before,
-.theme-mode-dark .primary-navigation > .btn::before {
- background-color: var(--brand-color) !important;
-}
-
-@media screen and (max-width: 450px) {
- .tabs-bar__link--logo {
- margin: 0 auto;
- padding: 12px 5px;
- position: absolute;
- left: 0;
- right: 0;
- text-align: center;
- }
-
- .tabs-bar__split--right {
- margin: 0;
- order: -1;
- }
-}
-
-.account__section-headline .column-header__buttons,
-.account__header__extra__links > div {
- display: none;
-}
-
-.account__header__extra__links {
- justify-content: flex-start;
- border-bottom: 1px solid #ccc;
-
- a {
- display: flex;
- align-items: center;
- }
-
- span:first-of-type {
- margin-right: 5px;
- }
-}
-
-.display-name__name {
- display: inline-flex;
- align-items: center;
-}
-
-// .verified-icon {
-// display: inline-flex;
-// align-items: center;
-// margin: 0 3px;
-// padding-top: 2px;
-
-// svg {
-// width: 18px;
-// height: 18px;
-// }
-// }
-
-.theme-mode-light {
- --background-color_h: 0;
- --background-color_s: 0%;
- --background-color_l: 96%;
-}
-
-.status__action-bar__counter--reblog,
-.detailed-status__button--reblog {
- .icon-button.active {
- color: var(--tmg-green);
-
- .svg-icon svg {
- color: var(--tmg-green);
- }
- }
-}
-
-.status__action-bar__counter--favourite,
-.detailed-status__button--favourite {
- .icon-button.active {
- color: var(--accent-color);
- fill: var(--accent-color);
-
- .svg-icon svg {
- color: var(--accent-color);
- fill: var(--accent-color);
- }
- }
-}
-
-.emoji-react--reblogs {
- .svg-icon {
- color: var(--tmg-green);
- }
-}
-
-.sidebar-menu__close {
- top: 20px;
-}
-
-.primary-navigation__icon {
- stroke: currentColor;
-}
-
-.public-layout {
- background: linear-gradient(135deg, #fff, #f5f5f5);
-
- .header {
- .simple_form {
- button {
- background: $color-6-light;
- color: $color-3;
- font-size: 14px;
- line-height: 14px;
- padding: 10px 15px;
- border: 1px solid $color-3 !important;
-
- &:hover,
- &:active,
- &:focus {
- background: $color-6;
- }
-
- &::selection {
- background-color: transparent;
- color: $color-3;
- }
- }
-
- input[type="text"],
- input[type="password"] {
- padding: 8px 15px;
- font-size: 14px;
- line-height: 14px;
- background: $color-6-light;
- border-color: $color-6-dark;
- }
- }
-
- .nav-right .simple_form.new_user .fields-group p.hint.subtle-hint a {
- background-color: transparent;
- }
- }
-}
-
-.landing {
- .landing-columns--left {
- display: flex;
- align-items: center;
- }
-
- .landing-columns--right {
- display: flex;
- align-items: center;
-
- .simple_form {
- position: relative;
- z-index: 10;
- box-shadow: 0 0 30px 5px rgba(0, 0, 0, 0.05);
- background-color: $color-6-light;
- padding: 40px;
-
- h1 {
- text-align: center;
- font-size: 32px;
- font-weight: 600;
- color: $color-4-dark;
- margin-bottom: 30px;
- }
-
- input[type="text"],
- input[type="password"],
- input[type="email"] {
- padding: 10 15px;
- font-size: 14px;
- line-height: 14px;
- background: $color-6;
- border-color: $color-6-dark;
- margin-bottom: 10px;
- }
-
- button {
- background: $color-2;
- font-size: 16px;
- line-height: 16px;
- padding: 15px;
- border: none;
- border-radius: 8px;
- color: $color-6-light;
-
- &:hover,
- &:active,
- &:focus {
- background: $color-1;
- }
-
- &::selection {
- background-color: transparent;
- color: $color-3;
- }
- }
- }
- }
-}
-
-.public-layout {
- .brand__tagline {
- width: auto;
- max-width: 800px;
- }
-
- .landing__brand {
- align-items: flex-start;
- }
-
- .public-layout__top {
- display: flex;
- flex-direction: column;
-
- .header-container {
- position: relative;
- padding-top: 10px;
- }
-
- .nav-left,
- .nav-right {
- position: relative;
- z-index: 10;
- }
-
- .container {
- display: flex;
- flex: 1;
- }
-
- .landing {
- display: flex;
- flex: 1;
- align-items: center;
- justify-content: space-between;
- }
-
- .landing-columns {
- width: 100%;
-
- .landing-columns--right {
- margin-left: auto;
-
- form {
- margin: 0 auto;
- }
- }
-
- .landing-columns--left {
- position: relative;
- z-index: 10;
- margin-right: 0;
-
- svg {
- width: 700px;
- max-width: 100%;
- fill: $color-3-dark;
-
- .cls-1 {
- opacity: 0.33;
- }
-
- .cls-2 {
- opacity: 0.66;
- }
- }
- }
- }
- }
-
- .footer {
- display: flex;
- padding: 40px 0;
- font-size: 12px;
- justify-content: center;
- align-items: center;
- margin-top: auto;
- color: #fff;
- background-color: transparent;
-
- ul {
- justify-content: center;
- }
-
- .copyright {
- color: $color-5;
- }
- }
-}
-
-.compose-form__publish--direct button {
- background-color: var(--brand-color);
-}
-
-.sub-navigation__cog {
- display: none;
-}
-
-.detailed-status__link {
- pointer-events: none;
-}
-
-// Pull to refresh
-.ptr__pull-down {
- transform: translateY(10px);
-}
diff --git a/app/styles/ui.scss b/app/styles/ui.scss
index e110410891..6f81060513 100644
--- a/app/styles/ui.scss
+++ b/app/styles/ui.scss
@@ -232,7 +232,7 @@ article:last-child > .domain {
.image-loader__preview-canvas {
max-width: $media-modal-media-max-width;
max-height: $media-modal-media-max-height;
- background: url('../images/void.png') repeat;
+ background: url('../assets/images/void.png') repeat;
object-fit: contain;
}
@@ -522,8 +522,7 @@ article:last-child > .domain {
}
}
-.filter-bar,
-.account__section-headline {
+.filter-bar {
cursor: default;
display: flex;
flex-shrink: 0;
diff --git a/jest.config.js b/jest.config.js
index 468401c519..396486a396 100644
Binary files a/jest.config.js and b/jest.config.js differ
diff --git a/jsdoc.conf.js b/jsdoc.conf.js
index e3d2325a0e..ec2335fbe4 100644
Binary files a/jsdoc.conf.js and b/jsdoc.conf.js differ
diff --git a/soapbox-screenshot.png b/soapbox-screenshot.png
index 19c19e2c4b..61c57bb477 100644
Binary files a/soapbox-screenshot.png and b/soapbox-screenshot.png differ
diff --git a/webpack/configuration.ts b/webpack/configuration.ts
index 9596cf8e3e..39b8bef8e5 100644
--- a/webpack/configuration.ts
+++ b/webpack/configuration.ts
@@ -4,7 +4,7 @@ import { env } from 'process';
const {
FE_SUBDIRECTORY,
FE_BUILD_DIR,
-} = require(join(__dirname, '..', 'app', 'soapbox', 'build_config'));
+} = require(join(__dirname, '..', 'app', 'soapbox', 'build-config'));
const settings = {
source_path: 'app',
diff --git a/webpack/development.ts b/webpack/development.ts
index 1b85937176..57401e7d33 100644
--- a/webpack/development.ts
+++ b/webpack/development.ts
@@ -24,7 +24,7 @@ const DEFAULTS = {
PATRON_URL: 'http://localhost:3037',
};
-const { FE_SUBDIRECTORY } = require(join(__dirname, '..', 'app', 'soapbox', 'build_config'));
+const { FE_SUBDIRECTORY } = require(join(__dirname, '..', 'app', 'soapbox', 'build-config'));
const backendEndpoints = [
'/api',
diff --git a/webpack/production.ts b/webpack/production.ts
index 6115b6aa42..a1af5a0f96 100644
--- a/webpack/production.ts
+++ b/webpack/production.ts
@@ -12,7 +12,7 @@ import sharedConfig from './shared';
import type { Configuration } from 'webpack';
-const { FE_SUBDIRECTORY } = require(join(__dirname, '..', 'app', 'soapbox', 'build_config'));
+const { FE_SUBDIRECTORY } = require(join(__dirname, '..', 'app', 'soapbox', 'build-config'));
const joinPublicPath = (...paths: string[]) => join(FE_SUBDIRECTORY, ...paths);
const configuration: Configuration = {
@@ -95,7 +95,7 @@ const configuration: Configuration = {
],
ServiceWorker: {
cacheName: 'soapbox',
- entry: join(__dirname, '../app/soapbox/service_worker/entry.ts'),
+ entry: join(__dirname, '../app/soapbox/service-worker/entry.ts'),
events: true,
minify: true,
},
diff --git a/webpack/rules/assets.ts b/webpack/rules/assets.ts
index d8c8e3e18b..e9dd0202af 100644
--- a/webpack/rules/assets.ts
+++ b/webpack/rules/assets.ts
@@ -11,7 +11,7 @@ const rules: RuleSetRule[] = [{
test: /\.(png|svg)/,
type: 'asset/resource',
include: [
- resolve('app', 'images'),
+ resolve('app', 'assets', 'images'),
resolve('node_modules', 'emoji-datasource'),
],
generator: {
@@ -21,7 +21,7 @@ const rules: RuleSetRule[] = [{
test: /\.(ttf|eot|svg|woff|woff2)/,
type: 'asset/resource',
include: [
- resolve('app', 'fonts'),
+ resolve('app', 'assets', 'fonts'),
resolve('node_modules', 'fork-awesome'),
resolve('node_modules', 'line-awesome'),
resolve('node_modules', '@fontsource'),
@@ -32,7 +32,7 @@ const rules: RuleSetRule[] = [{
}, {
test: /\.(ogg|oga|mp3)/,
type: 'asset/resource',
- include: resolve('app', 'sounds'),
+ include: resolve('app', 'assets', 'sounds'),
generator: {
filename: 'packs/sounds/[name]-[contenthash:8][ext]',
},
@@ -46,7 +46,7 @@ const rules: RuleSetRule[] = [{
}, {
test: /\.svg$/,
type: 'asset/resource',
- include: resolve('app', 'icons'),
+ include: resolve('app', 'assets', 'icons'),
generator: {
filename: 'packs/icons/[name]-[contenthash:8][ext]',
},
diff --git a/webpack/rules/babel-build-config.ts b/webpack/rules/babel-build-config.ts
index 9e2e4e6579..0e1fa0b7cb 100644
--- a/webpack/rules/babel-build-config.ts
+++ b/webpack/rules/babel-build-config.ts
@@ -4,11 +4,11 @@ import { env } from '../configuration';
import type { RuleSetRule } from 'webpack';
-// This is a hack, used to force build_config @preval to recompile
+// This is a hack, used to force build-config @preval to recompile
// https://github.com/kentcdodds/babel-plugin-preval/issues/19
const rule: RuleSetRule = {
- test: resolve(__dirname, '../../app/soapbox/build_config.js'),
+ test: resolve(__dirname, '../../app/soapbox/build-config.js'),
use: [
{
loader: 'babel-loader',
diff --git a/webpack/shared.ts b/webpack/shared.ts
index dfcf9b2aaa..2f56ccca4d 100644
--- a/webpack/shared.ts
+++ b/webpack/shared.ts
@@ -15,7 +15,7 @@ import DeadCodePlugin from 'webpack-deadcode-plugin';
import { env, settings, output } from './configuration';
import rules from './rules';
-const { FE_SUBDIRECTORY, FE_INSTANCE_SOURCE_DIR } = require(join(__dirname, '..', 'app', 'soapbox', 'build_config'));
+const { FE_SUBDIRECTORY, FE_INSTANCE_SOURCE_DIR } = require(join(__dirname, '..', 'app', 'soapbox', 'build-config'));
/** Return file as string, or return empty string. */
const readFile = (filename: string) => {
@@ -114,7 +114,7 @@ const configuration: Configuration = {
'**/__*__/*',
'**/(LICENSE|README|COPYING)(.md|.txt)?',
// This file is imported with @preval
- 'app/soapbox/features/emoji/emoji_map.json',
+ 'app/soapbox/features/emoji/emoji-map.json',
],
}),
// https://github.com/jantimon/html-webpack-plugin#options