From 3f27ec2e61df00792b63ca4216697165cd003ecc Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 8 Nov 2024 16:13:22 -0600 Subject: [PATCH 1/6] Remove "npx" from package.json commands --- package.json | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 8ada79d3e..7be62bef9 100644 --- a/package.json +++ b/package.json @@ -21,16 +21,15 @@ "url": "lightning:alex@alexgleason.me" }, "scripts": { - "start": "npx vite serve", - "dev": "npx vite serve", - "build": "npx vite build --emptyOutDir", - "preview": "npx vite preview", - "audit:fix": "npx yarn-audit-fix", - "i18n": "npx formatjs extract 'src/**/*.{ts,tsx}' --ignore '**/*.d.ts' --out-file build/messages.json && npx formatjs compile build/messages.json --out-file src/locales/en.json", - "test": "npx vitest", + "start": "vite serve", + "dev": "vite serve", + "build": "vite build --emptyOutDir", + "preview": "vite preview", + "i18n": "formatjs extract 'src/**/*.{ts,tsx}' --ignore '**/*.d.ts' --out-file build/messages.json && formatjs compile build/messages.json --out-file src/locales/en.json", + "test": "vitest", "lint": "npm run lint:js && npm run lint:sass", - "lint:js": "npx eslint --ext .js,.jsx,.cjs,.mjs,.ts,.tsx . --cache", - "lint:sass": "npx stylelint src/styles/**/*.scss", + "lint:js": "eslint --ext .js,.jsx,.cjs,.mjs,.ts,.tsx . --cache", + "lint:sass": "stylelint src/styles/**/*.scss", "prepare": "husky install" }, "license": "AGPL-3.0-or-later", From 8c130e6bef09763e32216d054e5aab2a3ff214b6 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 8 Nov 2024 16:42:35 -0600 Subject: [PATCH 2/6] Remove usage of csstype package --- src/components/media-gallery.tsx | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/components/media-gallery.tsx b/src/components/media-gallery.tsx index 0edf7528c..381cfdf89 100644 --- a/src/components/media-gallery.tsx +++ b/src/components/media-gallery.tsx @@ -1,5 +1,5 @@ import clsx from 'clsx'; -import React, { useState, useRef, useLayoutEffect } from 'react'; +import React, { useState, useRef, useLayoutEffect, CSSProperties } from 'react'; import Blurhash from 'soapbox/components/blurhash'; import StillImage from 'soapbox/components/still-image'; @@ -13,7 +13,6 @@ import { isPanoramic, isPortrait, isNonConformingRatio, minimumAspectRatio, maxi import SvgIcon from './ui/icon/svg-icon'; -import type { Property } from 'csstype'; import type { List as ImmutableList } from 'immutable'; // const Gameboy = React.lazy(() => import('./gameboy')); @@ -22,18 +21,18 @@ const ATTACHMENT_LIMIT = 4; const MAX_FILENAME_LENGTH = 45; interface Dimensions { - w: Property.Width | number; - h: Property.Height | number; - t?: Property.Top; - r?: Property.Right; - b?: Property.Bottom; - l?: Property.Left; - float?: Property.Float; - pos?: Property.Position; + w: CSSProperties['width']; + h: CSSProperties['height']; + t?: CSSProperties['top']; + r?: CSSProperties['right']; + b?: CSSProperties['bottom']; + l?: CSSProperties['left']; + float?: CSSProperties['float']; + pos?: CSSProperties['position']; } interface SizeData { - style: React.CSSProperties; + style: CSSProperties; itemsDimensions: Dimensions[]; size: number; width: number; From 9d9f237fd213824b99f86d1cd49864fdd5761023 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 8 Nov 2024 18:31:13 -0600 Subject: [PATCH 3/6] Rewrite all `require` to ES6 imports --- package.json | 1 - src/actions/moderation.tsx | 12 +- src/components/account-search.tsx | 6 +- src/components/account.tsx | 3 +- src/components/authorize-reject-buttons.tsx | 9 +- src/components/autosuggest-location.tsx | 9 +- src/components/big-card.tsx | 3 +- src/components/domain.tsx | 5 +- .../dropdown-menu/dropdown-menu.tsx | 3 +- src/components/event-preview.tsx | 6 +- src/components/gameboy.tsx | 17 +- src/components/list.tsx | 6 +- src/components/load-gap.tsx | 3 +- src/components/location-search.tsx | 6 +- src/components/media-gallery.tsx | 6 +- src/components/modal-root.tsx | 5 +- src/components/pending-items-row.tsx | 6 +- src/components/polls/poll-option.tsx | 6 +- src/components/preview-card.tsx | 12 +- src/components/profile-hover-card.tsx | 3 +- src/components/quoted-status-indicator.tsx | 3 +- src/components/quoted-status.tsx | 3 +- src/components/scroll-top-button.tsx | 3 +- src/components/sidebar-menu.tsx | 58 ++- src/components/sidebar-navigation.tsx | 66 ++- src/components/site-logo.tsx | 6 +- src/components/status-action-bar.tsx | 112 ++++-- src/components/status-content.tsx | 3 +- src/components/status.tsx | 11 +- .../statuses/sensitive-content-overlay.tsx | 17 +- src/components/thumb-navigation.tsx | 33 +- src/components/translate-button.tsx | 5 +- src/components/ui/accordion/accordion.tsx | 7 +- src/components/ui/avatar/avatar.tsx | 3 +- src/components/ui/card/card.tsx | 3 +- src/components/ui/carousel/carousel.tsx | 6 +- .../ui/emoji-selector/emoji-selector.tsx | 3 +- src/components/ui/input/input.tsx | 4 +- .../language-dropdown/language-dropdown.tsx | 5 +- src/components/ui/modal/modal.tsx | 6 +- src/components/ui/streamfield/streamfield.tsx | 3 +- src/components/ui/tag-input/tag.tsx | 3 +- src/components/ui/toast/toast.tsx | 12 +- src/components/ui/widget/widget.tsx | 3 +- src/components/upload-progress.tsx | 3 +- src/components/upload.tsx | 3 +- src/components/validation-checkmark.tsx | 4 +- src/components/verification-badge.tsx | 3 +- .../account-gallery/components/media-item.tsx | 6 +- .../components/moved-note.tsx | 3 +- src/features/account/components/header.tsx | 86 ++-- src/features/admin/announcements.tsx | 3 +- .../admin/components/report-status.tsx | 9 +- src/features/admin/components/report.tsx | 9 +- src/features/admin/domains.tsx | 3 +- src/features/admin/manage-zap-split.tsx | 3 +- src/features/admin/rules.tsx | 3 +- src/features/admin/tabs/dashboard.tsx | 10 +- src/features/aliases/components/account.tsx | 3 +- src/features/aliases/components/search.tsx | 3 +- src/features/aliases/index.tsx | 3 +- src/features/audio/index.tsx | 11 +- .../auth-login/components/consumer-button.tsx | 21 +- .../components/registration-form.tsx | 6 +- src/features/auth-token-list/index.tsx | 3 +- src/features/birthdays/account.tsx | 3 +- src/features/bookmark-folders/index.tsx | 6 +- src/features/bookmarks/index.tsx | 9 +- .../chats/components/chat-composer.tsx | 3 +- .../chats/components/chat-list-item.tsx | 6 +- .../components/chat-message-list-intro.tsx | 3 +- .../chats/components/chat-message.tsx | 22 +- .../chat-page/components/chat-page-main.tsx | 12 +- .../chat-page/components/chat-page-new.tsx | 3 +- .../components/chat-page-settings.tsx | 3 +- .../components/chat-page-sidebar.tsx | 6 +- .../chats/components/chat-pane/chat-pane.tsx | 3 +- .../chats/components/chat-search-input.tsx | 4 +- .../components/chat-search/chat-search.tsx | 4 +- .../chats/components/chat-upload-preview.tsx | 3 +- src/features/chats/components/chat-upload.tsx | 3 +- .../chat-widget/chat-pane-header.tsx | 4 +- .../components/chat-widget/chat-settings.tsx | 9 +- .../components/chat-widget/chat-window.tsx | 7 +- .../headers/chat-search-header.tsx | 3 +- .../compose/components/compose-form.tsx | 6 +- .../compose/components/markdown-button.tsx | 3 +- .../compose/components/poll-button.tsx | 3 +- .../compose/components/privacy-dropdown.tsx | 12 +- .../compose/components/reply-indicator.tsx | 3 +- .../compose/components/schedule-button.tsx | 3 +- .../compose/components/schedule-form.tsx | 3 +- .../compose/components/search-results.tsx | 3 +- .../compose/components/search-zap-split.tsx | 3 +- src/features/compose/components/search.tsx | 8 +- .../compose/components/spoiler-button.tsx | 3 +- .../compose/components/upload-button.tsx | 6 +- .../components/crypto-address.tsx | 6 +- .../components/detailed-crypto-address.tsx | 3 +- src/features/developers/developers-menu.tsx | 24 +- .../developers/service-worker-info.tsx | 3 +- src/features/edit-identity/index.tsx | 3 +- .../edit-profile/components/avatar-picker.tsx | 3 +- .../edit-profile/components/header-picker.tsx | 6 +- .../emoji/components/emoji-picker.tsx | 5 +- .../emoji-picker-dropdown-container.tsx | 3 +- .../event/components/event-action-button.tsx | 6 +- src/features/event/components/event-date.tsx | 3 +- .../event/components/event-header.tsx | 71 ++-- src/features/event/event-information.tsx | 9 +- .../events/components/event-carousel.tsx | 6 +- .../components/instance-restrictions.tsx | 23 +- .../components/restricted-instance.tsx | 4 +- .../group/components/group-header-image.tsx | 3 +- .../group/components/group-header.tsx | 3 +- .../components/group-member-list-item.tsx | 11 +- .../group/components/group-options-button.tsx | 15 +- .../group/components/group-privacy.tsx | 10 +- .../group/components/group-relationship.tsx | 6 +- .../group/components/group-tag-list-item.tsx | 16 +- src/features/group/edit-group.tsx | 3 +- src/features/group/group-tag-timeline.tsx | 3 +- src/features/group/group-tags.tsx | 3 +- src/features/group/group-timeline.tsx | 3 +- src/features/group/manage-group.tsx | 3 +- .../components/discover/group-list-item.tsx | 4 +- .../components/discover/layout-buttons.tsx | 6 +- .../discover/search/recent-searches.tsx | 3 +- src/features/groups/discover.tsx | 7 +- src/features/groups/index.tsx | 3 +- src/features/groups/tag.tsx | 6 +- src/features/list-adder/components/list.tsx | 9 +- .../list-editor/components/account.tsx | 6 +- .../list-editor/components/search.tsx | 3 +- src/features/lists/index.tsx | 9 +- .../notifications/components/filter-bar.tsx | 21 +- .../notifications/components/notification.tsx | 52 ++- src/features/public-timeline/index.tsx | 3 +- src/features/remote-timeline/index.tsx | 3 +- src/features/reply-mentions/account.tsx | 6 +- .../scheduled-status-action-bar.tsx | 3 +- .../components/icon-picker-dropdown.tsx | 3 +- .../status/components/detailed-status.tsx | 9 +- src/features/test-timeline/index.tsx | 15 +- src/features/theme-editor/index.tsx | 9 +- src/features/ui/components/action-button.tsx | 6 +- src/features/ui/components/error-column.tsx | 3 +- .../ui/components/floating-action-button.tsx | 5 +- .../ui/components/instance-info-panel.tsx | 4 +- .../components/instance-moderation-panel.tsx | 6 +- .../account-moderation-modal.tsx | 3 +- .../ui/components/modals/boost-modal.tsx | 3 +- .../compose-event-modal.tsx | 11 +- .../compose-event-modal/upload-button.tsx | 3 +- .../ui/components/modals/compose-modal.tsx | 3 +- .../modals/edit-bookmark-folder-modal.tsx | 3 +- .../ui/components/modals/event-map-modal.tsx | 12 +- .../components/modals/landing-page-modal.tsx | 3 +- .../steps/confirmation-step.tsx | 6 +- .../ui/components/modals/media-modal.tsx | 16 +- .../steps/extension-step.tsx | 3 +- .../nostr-signup-modal/steps/keygen-step.tsx | 3 +- .../steps/avatar-step.tsx | 6 +- .../onboarding-flow-modal/steps/bio-step.tsx | 3 +- .../steps/completed-step.tsx | 6 +- .../steps/cover-photo-selection-step.tsx | 6 +- .../steps/display-name-step.tsx | 3 +- .../steps/suggested-accounts-step.tsx | 3 +- .../modals/reply-mentions-modal.tsx | 3 +- .../modals/report-modal/report-modal.tsx | 3 +- .../report-modal/steps/other-actions-step.tsx | 6 +- .../modals/select-bookmark-folder-modal.tsx | 6 +- .../ui/components/modals/zap-invoice.tsx | 6 +- .../components/modals/zap-split/zap-split.tsx | 3 +- src/features/ui/components/navbar.tsx | 3 +- .../ui/components/new-account-zap-split.tsx | 3 +- .../ui/components/panels/new-event-panel.tsx | 3 +- .../ui/components/profile-dropdown.tsx | 6 +- src/features/ui/components/profile-field.tsx | 3 +- .../ui/components/profile-info-panel.tsx | 15 +- .../ui/components/subscription-button.tsx | 4 +- src/features/ui/components/theme-selector.tsx | 15 +- .../ui/components/who-to-follow-panel.tsx | 3 +- src/features/video/index.tsx | 12 +- .../zap/components/zap-pay-request-form.tsx | 11 +- src/jest/test-setup.ts | 2 +- src/normalizers/account.ts | 12 +- src/normalizers/group.ts | 12 +- src/pages/group-page.tsx | 9 +- src/schemas/account.ts | 5 +- src/schemas/group.ts | 5 +- src/schemas/instance.test.ts | 40 +- src/service-worker/sw.ts | 10 +- src/utils/accounts.ts | 7 +- vite.config.ts | 3 - yarn.lock | 379 +----------------- 196 files changed, 1079 insertions(+), 942 deletions(-) diff --git a/package.json b/package.json index 7be62bef9..4e39ed057 100644 --- a/package.json +++ b/package.json @@ -152,7 +152,6 @@ "vite": "^5.4.8", "vite-plugin-compile-time": "^0.2.1", "vite-plugin-html": "^3.2.2", - "vite-plugin-require": "^1.2.14", "vite-plugin-static-copy": "^1.0.6", "zod": "^3.23.5", "zustand": "^5.0.0" diff --git a/src/actions/moderation.tsx b/src/actions/moderation.tsx index ddee5fe1d..a01d9f4fd 100644 --- a/src/actions/moderation.tsx +++ b/src/actions/moderation.tsx @@ -1,3 +1,7 @@ +import alertTriangleIcon from '@tabler/icons/outline/alert-triangle.svg'; +import trashIcon from '@tabler/icons/outline/trash.svg'; +import userMinusIcon from '@tabler/icons/outline/user-minus.svg'; +import userOffIcon from '@tabler/icons/outline/user-off.svg'; import React from 'react'; import { defineMessages, IntlShape } from 'react-intl'; @@ -58,7 +62,7 @@ const deactivateUserModal = (intl: IntlShape, accountId: string, afterConfirm = ); dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/user-off.svg'), + icon: userOffIcon, heading: intl.formatMessage(messages.deactivateUserHeading, { acct }), message, confirm: intl.formatMessage(messages.deactivateUserConfirm, { name }), @@ -96,7 +100,7 @@ const deleteUserModal = (intl: IntlShape, accountId: string, afterConfirm = () = const checkbox = local ? intl.formatMessage(messages.deleteLocalUserCheckbox) : false; dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/user-minus.svg'), + icon: userMinusIcon, heading: intl.formatMessage(messages.deleteUserHeading, { acct }), message, confirm, @@ -118,7 +122,7 @@ const toggleStatusSensitivityModal = (intl: IntlShape, statusId: string, sensiti const acct = state.statuses.get(statusId)!.account.acct; dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/alert-triangle.svg'), + icon: alertTriangleIcon, heading: intl.formatMessage(sensitive === false ? messages.markStatusSensitiveHeading : messages.markStatusNotSensitiveHeading), message: intl.formatMessage(sensitive === false ? messages.markStatusSensitivePrompt : messages.markStatusNotSensitivePrompt, { acct }), confirm: intl.formatMessage(sensitive === false ? messages.markStatusSensitiveConfirm : messages.markStatusNotSensitiveConfirm), @@ -138,7 +142,7 @@ const deleteStatusModal = (intl: IntlShape, statusId: string, afterConfirm = () const acct = state.statuses.get(statusId)!.account.acct; dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, heading: intl.formatMessage(messages.deleteStatusHeading), message: intl.formatMessage(messages.deleteStatusPrompt, { acct: {acct} }), confirm: intl.formatMessage(messages.deleteStatusConfirm), diff --git a/src/components/account-search.tsx b/src/components/account-search.tsx index cec7fc8f8..9dbac4fbb 100644 --- a/src/components/account-search.tsx +++ b/src/components/account-search.tsx @@ -1,3 +1,5 @@ +import searchIcon from '@tabler/icons/outline/search.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import React, { useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -76,12 +78,12 @@ const AccountSearch: React.FC = ({ onSelected, ...rest }) => { onClick={handleClear} > diff --git a/src/components/account.tsx b/src/components/account.tsx index a9eb9a546..5f2244b43 100644 --- a/src/components/account.tsx +++ b/src/components/account.tsx @@ -1,3 +1,4 @@ +import pencilIcon from '@tabler/icons/outline/pencil.svg'; import React, { useRef, useState } from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; import { Link, useHistory } from 'react-router-dom'; @@ -275,7 +276,7 @@ const Account = ({ <> · {/* eslint-disable-line formatjs/no-literal-string-in-jsx */} - + ) : null} diff --git a/src/components/authorize-reject-buttons.tsx b/src/components/authorize-reject-buttons.tsx index 358704682..fcf80d1ef 100644 --- a/src/components/authorize-reject-buttons.tsx +++ b/src/components/authorize-reject-buttons.tsx @@ -1,3 +1,6 @@ +import playerStopFilledIcon from '@tabler/icons/filled/player-stop.svg'; +import checkIcon from '@tabler/icons/outline/check.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import React, { useEffect, useRef, useState } from 'react'; import { FormattedMessage } from 'react-intl'; @@ -106,7 +109,7 @@ const AuthorizeRejectButtons: React.FC = ({ onAuthorize = ({ onAuthorize /> = ({ theme, icon, } > = { house: homeIcon, street: roadIcon, diff --git a/src/components/big-card.tsx b/src/components/big-card.tsx index f6b7ce614..b816d047e 100644 --- a/src/components/big-card.tsx +++ b/src/components/big-card.tsx @@ -1,9 +1,10 @@ +import xIcon from '@tabler/icons/outline/x.svg'; import React from 'react'; import { Card, CardBody, Stack, Text } from 'soapbox/components/ui'; import IconButton from 'soapbox/components/ui/icon-button/icon-button'; -const closeIcon = require('@tabler/icons/outline/x.svg'); +const closeIcon = xIcon; interface IBigCard { title: React.ReactNode; diff --git a/src/components/domain.tsx b/src/components/domain.tsx index 2b2d25bea..77b71189d 100644 --- a/src/components/domain.tsx +++ b/src/components/domain.tsx @@ -1,3 +1,4 @@ +import lockOpenIcon from '@tabler/icons/outline/lock-open.svg'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -21,7 +22,7 @@ const Domain: React.FC = ({ domain }) => { // const onBlockDomain = () => { // dispatch(openModal('CONFIRM', { - // icon: require('@tabler/icons/outline/ban.svg'), + // icon: banIcon, // heading: , // message: {domain} }} />, // confirm: intl.formatMessage(messages.blockDomainConfirm), @@ -38,7 +39,7 @@ const Domain: React.FC = ({ domain }) => { {domain} - + ); }; diff --git a/src/components/dropdown-menu/dropdown-menu.tsx b/src/components/dropdown-menu/dropdown-menu.tsx index 735664fc9..92fecd6c9 100644 --- a/src/components/dropdown-menu/dropdown-menu.tsx +++ b/src/components/dropdown-menu/dropdown-menu.tsx @@ -1,4 +1,5 @@ import { offset, Placement, useFloating, flip, arrow, shift } from '@floating-ui/react'; +import dotsIcon from '@tabler/icons/outline/dots.svg'; import clsx from 'clsx'; import { supportsPassiveEvents } from 'detect-passive-events'; import React, { useEffect, useMemo, useRef, useState } from 'react'; @@ -43,7 +44,7 @@ const DropdownMenu = (props: IDropdownMenu) => { onOpen, onShiftClick, placement: initialPlacement = 'top', - src = require('@tabler/icons/outline/dots.svg'), + src = dotsIcon, title = 'Menu', ...filteredProps } = props; diff --git a/src/components/event-preview.tsx b/src/components/event-preview.tsx index 1983b6e67..50f06d9ba 100644 --- a/src/components/event-preview.tsx +++ b/src/components/event-preview.tsx @@ -1,3 +1,5 @@ +import mapPinIcon from '@tabler/icons/outline/map-pin.svg'; +import userIcon from '@tabler/icons/outline/user.svg'; import clsx from 'clsx'; import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -67,7 +69,7 @@ const EventPreview: React.FC = ({ status, className, hideAction,
- + {account.verified && } @@ -78,7 +80,7 @@ const EventPreview: React.FC = ({ status, className, hideAction, {event.location && ( - + {event.location.get('name')} diff --git a/src/components/gameboy.tsx b/src/components/gameboy.tsx index fd632db52..e7635c22d 100644 --- a/src/components/gameboy.tsx +++ b/src/components/gameboy.tsx @@ -1,6 +1,13 @@ +import { WasmBoy } from '@soapbox.pub/wasmboy'; +import arrowsMaximizeIcon from '@tabler/icons/outline/arrows-maximize.svg'; +import arrowsMinimizeIcon from '@tabler/icons/outline/arrows-minimize.svg'; +import downloadIcon from '@tabler/icons/outline/download.svg'; +import playerPauseIcon from '@tabler/icons/outline/player-pause.svg'; +import playerPlayIcon from '@tabler/icons/outline/player-play.svg'; +import volume3Icon from '@tabler/icons/outline/volume-3.svg'; +import volumeIcon from '@tabler/icons/outline/volume.svg'; // @ts-ignore No types available // eslint-disable-next-line import/no-unresolved -import { WasmBoy } from '@soapbox.pub/wasmboy'; import clsx from 'clsx'; import React, { useCallback, useEffect, useRef, useState } from 'react'; @@ -139,13 +146,13 @@ const Gameboy: React.FC = ({ className, src, aspect = 'normal', onFocu theme='transparent' className='text-white' onClick={togglePaused} - src={paused ? require('@tabler/icons/outline/player-play.svg') : require('@tabler/icons/outline/player-pause.svg')} + src={paused ? playerPlayIcon : playerPauseIcon} /> @@ -153,14 +160,14 @@ const Gameboy: React.FC = ({ className, src, aspect = 'normal', onFocu diff --git a/src/components/list.tsx b/src/components/list.tsx index 487e2d282..5de7b3efa 100644 --- a/src/components/list.tsx +++ b/src/components/list.tsx @@ -1,3 +1,5 @@ +import checkIcon from '@tabler/icons/outline/check.svg'; +import chevronRightIcon from '@tabler/icons/outline/chevron-right.svg'; import clsx from 'clsx'; import React from 'react'; import { Link } from 'react-router-dom'; @@ -72,7 +74,7 @@ const ListItem: React.FC = ({ label, hint, children, to, onClick, onS {children} - + ) : null} @@ -90,7 +92,7 @@ const ListItem: React.FC = ({ label, hint, children, to, onClick, onS } > = ({ disabled, maxId, onClick }) => { return ( ); }; diff --git a/src/components/location-search.tsx b/src/components/location-search.tsx index b3c9430b6..2eb1b2eb3 100644 --- a/src/components/location-search.tsx +++ b/src/components/location-search.tsx @@ -1,3 +1,5 @@ +import backspaceIcon from '@tabler/icons/outline/backspace.svg'; +import searchIcon from '@tabler/icons/outline/search.svg'; import clsx from 'clsx'; import { OrderedSet as ImmutableOrderedSet } from 'immutable'; import throttle from 'lodash/throttle'; @@ -100,8 +102,8 @@ const LocationSearch: React.FC = ({ onSelected }) => { renderSuggestion={AutosuggestLocation} />
- - + +
); diff --git a/src/components/media-gallery.tsx b/src/components/media-gallery.tsx index 381cfdf89..7648850d9 100644 --- a/src/components/media-gallery.tsx +++ b/src/components/media-gallery.tsx @@ -1,3 +1,5 @@ +import paperclipIcon from '@tabler/icons/outline/paperclip.svg'; +import volumeIcon from '@tabler/icons/outline/volume.svg'; import clsx from 'clsx'; import React, { useState, useRef, useLayoutEffect, CSSProperties } from 'react'; @@ -156,7 +158,7 @@ const Item: React.FC = ({ const attachmentIcon = ( ); @@ -233,7 +235,7 @@ const Item: React.FC = ({ target='_blank' title={attachment.description} > - + {ext} ); diff --git a/src/components/modal-root.tsx b/src/components/modal-root.tsx index 0612b90ad..cd4daa142 100644 --- a/src/components/modal-root.tsx +++ b/src/components/modal-root.tsx @@ -1,3 +1,4 @@ +import trashIcon from '@tabler/icons/outline/trash.svg'; import clsx from 'clsx'; import React, { useCallback, useEffect, useRef, useState } from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -74,7 +75,7 @@ const ModalRoot: React.FC = ({ children, onCancel, onClose, type }) if (hasComposeContent && type === 'COMPOSE') { const isEditing = compose!.id !== null; dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, heading: isEditing ? : , @@ -93,7 +94,7 @@ const ModalRoot: React.FC = ({ children, onCancel, onClose, type }) } else if (hasEventComposeContent && type === 'COMPOSE_EVENT') { const isEditing = getState().compose_event.id !== null; dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, heading: isEditing ? : , diff --git a/src/components/pending-items-row.tsx b/src/components/pending-items-row.tsx index 4f8a250f8..5952a3b9a 100644 --- a/src/components/pending-items-row.tsx +++ b/src/components/pending-items-row.tsx @@ -1,3 +1,5 @@ +import chevronRightIcon from '@tabler/icons/outline/chevron-right.svg'; +import exclamationCircleIcon from '@tabler/icons/outline/exclamation-circle.svg'; import clsx from 'clsx'; import React from 'react'; import { FormattedMessage } from 'react-intl'; @@ -25,7 +27,7 @@ const PendingItemsRow: React.FC = ({ to, count, size = 'md' }) })} > = ({ to, count, size = 'md' }) diff --git a/src/components/polls/poll-option.tsx b/src/components/polls/poll-option.tsx index 1c0760188..df711263b 100644 --- a/src/components/polls/poll-option.tsx +++ b/src/components/polls/poll-option.tsx @@ -1,3 +1,5 @@ +import checkIcon from '@tabler/icons/outline/check.svg'; +import circleCheckIcon from '@tabler/icons/outline/circle-check.svg'; import clsx from 'clsx'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -86,7 +88,7 @@ const PollOptionText: React.FC = ({ poll, option, index, active aria-label={option.title} > {active && ( - + )} @@ -143,7 +145,7 @@ const PollOption: React.FC = (props): JSX.Element | null => { {voted ? ( diff --git a/src/components/preview-card.tsx b/src/components/preview-card.tsx index fe51863c1..2f9a2e436 100644 --- a/src/components/preview-card.tsx +++ b/src/components/preview-card.tsx @@ -1,3 +1,7 @@ +import externalLinkIcon from '@tabler/icons/outline/external-link.svg'; +import linkIcon from '@tabler/icons/outline/link.svg'; +import playerPlayIcon from '@tabler/icons/outline/player-play.svg'; +import zoomInIcon from '@tabler/icons/outline/zoom-in.svg'; import clsx from 'clsx'; import { List as ImmutableList } from 'immutable'; import React, { useState, useEffect } from 'react'; @@ -135,7 +139,7 @@ const PreviewCard: React.FC = ({ )} - + {card.provider_name} @@ -168,10 +172,10 @@ const PreviewCard: React.FC = ({ if (embedded) { embed = renderVideo(); } else { - let iconVariant = require('@tabler/icons/outline/player-play.svg'); + let iconVariant = playerPlayIcon; if (card.type === 'photo') { - iconVariant = require('@tabler/icons/outline/zoom-in.svg'); + iconVariant = zoomInIcon; } embed = ( @@ -198,7 +202,7 @@ const PreviewCard: React.FC = ({ className='text-gray-700 hover:text-gray-900 dark:text-gray-500 dark:hover:text-gray-100' > diff --git a/src/components/profile-hover-card.tsx b/src/components/profile-hover-card.tsx index b204e3d45..91232dce6 100644 --- a/src/components/profile-hover-card.tsx +++ b/src/components/profile-hover-card.tsx @@ -1,4 +1,5 @@ import { useFloating } from '@floating-ui/react'; +import calendarIcon from '@tabler/icons/outline/calendar.svg'; import clsx from 'clsx'; import React, { useEffect, useState } from 'react'; import { useIntl, FormattedMessage } from 'react-intl'; @@ -123,7 +124,7 @@ export const ProfileHoverCard: React.FC = ({ visible = true } {account.local ? ( diff --git a/src/components/quoted-status-indicator.tsx b/src/components/quoted-status-indicator.tsx index c70e00f5f..b19693261 100644 --- a/src/components/quoted-status-indicator.tsx +++ b/src/components/quoted-status-indicator.tsx @@ -1,3 +1,4 @@ +import quoteIcon from '@tabler/icons/outline/quote.svg'; import React, { useCallback } from 'react'; import { HStack, Icon, Text } from 'soapbox/components/ui'; @@ -18,7 +19,7 @@ const QuotedStatusIndicator: React.FC = ({ statusId }) = return ( - + {status.url} ); diff --git a/src/components/quoted-status.tsx b/src/components/quoted-status.tsx index b90e753e6..569d81503 100644 --- a/src/components/quoted-status.tsx +++ b/src/components/quoted-status.tsx @@ -1,3 +1,4 @@ +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import React, { MouseEventHandler, useEffect, useRef, useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -85,7 +86,7 @@ const QuotedStatus: React.FC = ({ status, onCancel, compose }) => if (onCancel) { actions = { onActionClick: handleClose, - actionIcon: require('@tabler/icons/outline/x.svg'), + actionIcon: xIcon, actionAlignment: 'top', actionTitle: intl.formatMessage(messages.cancel), }; diff --git a/src/components/scroll-top-button.tsx b/src/components/scroll-top-button.tsx index 489aa0503..31b32ceb6 100644 --- a/src/components/scroll-top-button.tsx +++ b/src/components/scroll-top-button.tsx @@ -1,3 +1,4 @@ +import arrowBarToUpIcon from '@tabler/icons/outline/arrow-bar-to-up.svg'; import throttle from 'lodash/throttle'; import React, { useState, useEffect, useCallback } from 'react'; import { useIntl, MessageDescriptor } from 'react-intl'; @@ -92,7 +93,7 @@ const ScrollTopButton: React.FC = ({ > diff --git a/src/components/sidebar-menu.tsx b/src/components/sidebar-menu.tsx index f5ab9fcd3..2e4d5bd64 100644 --- a/src/components/sidebar-menu.tsx +++ b/src/components/sidebar-menu.tsx @@ -1,3 +1,21 @@ +import atIcon from '@tabler/icons/outline/at.svg'; +import banIcon from '@tabler/icons/outline/ban.svg'; +import bookmarkIcon from '@tabler/icons/outline/bookmark.svg'; +import calendarEventIcon from '@tabler/icons/outline/calendar-event.svg'; +import chevronDownIcon from '@tabler/icons/outline/chevron-down.svg'; +import circleXIcon from '@tabler/icons/outline/circle-x.svg'; +import circlesIcon from '@tabler/icons/outline/circles.svg'; +import codeIcon from '@tabler/icons/outline/code.svg'; +import filterIcon from '@tabler/icons/outline/filter.svg'; +import hashIcon from '@tabler/icons/outline/hash.svg'; +import listIcon from '@tabler/icons/outline/list.svg'; +import logoutIcon from '@tabler/icons/outline/logout.svg'; +import plusIcon from '@tabler/icons/outline/plus.svg'; +import settingsIcon from '@tabler/icons/outline/settings.svg'; +import userPlusIcon from '@tabler/icons/outline/user-plus.svg'; +import userIcon from '@tabler/icons/outline/user.svg'; +import worldIcon from '@tabler/icons/outline/world.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; /* eslint-disable jsx-a11y/interactive-supports-focus */ import clsx from 'clsx'; import React, { useCallback } from 'react'; @@ -163,7 +181,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { { @@ -194,7 +212,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {(account.locked || followRequestsCount > 0) && ( @@ -203,7 +221,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {features.bookmarks && ( @@ -212,7 +230,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {features.groups && ( @@ -221,7 +239,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {features.lists && ( @@ -230,7 +248,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {features.events && ( @@ -239,7 +257,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {settings.get('isDeveloper') && ( @@ -250,7 +268,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { } onClick={onClose} /> @@ -258,7 +276,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {features.federating && ( } onClick={onClose} /> @@ -270,7 +288,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {features.blocks && ( @@ -278,14 +296,14 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { { {features.federating && ( @@ -303,7 +321,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {(features.filters || features.filtersV2) && ( @@ -312,7 +330,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {features.followedHashtagsList && ( @@ -321,7 +339,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {account.admin && ( @@ -331,7 +349,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { @@ -346,7 +364,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { { {otherAccounts.map(account => renderAccount(account))} - + {intl.formatMessage(messages.addAccount)} diff --git a/src/components/sidebar-navigation.tsx b/src/components/sidebar-navigation.tsx index adab520b4..da887902d 100644 --- a/src/components/sidebar-navigation.tsx +++ b/src/components/sidebar-navigation.tsx @@ -1,3 +1,25 @@ +import bellFilledIcon from '@tabler/icons/filled/bell.svg'; +import circlesFilledIcon from '@tabler/icons/filled/circles.svg'; +import homeFilledIcon from '@tabler/icons/filled/home.svg'; +import settingsFilledIcon from '@tabler/icons/filled/settings.svg'; +import userFilledIcon from '@tabler/icons/filled/user.svg'; +import atIcon from '@tabler/icons/outline/at.svg'; +import bellIcon from '@tabler/icons/outline/bell.svg'; +import bookmarkIcon from '@tabler/icons/outline/bookmark.svg'; +import calendarEventIcon from '@tabler/icons/outline/calendar-event.svg'; +import circlesIcon from '@tabler/icons/outline/circles.svg'; +import codeIcon from '@tabler/icons/outline/code.svg'; +import dashboardIcon from '@tabler/icons/outline/dashboard.svg'; +import dotsCircleHorizontalIcon from '@tabler/icons/outline/dots-circle-horizontal.svg'; +import homeIcon from '@tabler/icons/outline/home.svg'; +import listIcon from '@tabler/icons/outline/list.svg'; +import mailIcon from '@tabler/icons/outline/mail.svg'; +import messagesIcon from '@tabler/icons/outline/messages.svg'; +import searchIcon from '@tabler/icons/outline/search.svg'; +import settingsIcon from '@tabler/icons/outline/settings.svg'; +import userPlusIcon from '@tabler/icons/outline/user-plus.svg'; +import userIcon from '@tabler/icons/outline/user.svg'; +import worldIcon from '@tabler/icons/outline/world.svg'; import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -43,7 +65,7 @@ const SidebarNavigation = () => { menu.push({ to: '/follow_requests', text: intl.formatMessage(messages.follow_requests), - icon: require('@tabler/icons/outline/user-plus.svg'), + icon: userPlusIcon, count: followRequestsCount, }); } @@ -52,7 +74,7 @@ const SidebarNavigation = () => { menu.push({ to: '/bookmarks', text: intl.formatMessage(messages.bookmarks), - icon: require('@tabler/icons/outline/bookmark.svg'), + icon: bookmarkIcon, }); } @@ -60,7 +82,7 @@ const SidebarNavigation = () => { menu.push({ to: '/lists', text: intl.formatMessage(messages.lists), - icon: require('@tabler/icons/outline/list.svg'), + icon: listIcon, }); } @@ -68,14 +90,14 @@ const SidebarNavigation = () => { menu.push({ to: '/events', text: intl.formatMessage(messages.events), - icon: require('@tabler/icons/outline/calendar-event.svg'), + icon: calendarEventIcon, }); } if (isDeveloper) { menu.push({ to: '/developers', - icon: require('@tabler/icons/outline/code.svg'), + icon: codeIcon, text: intl.formatMessage(messages.developers), }); } @@ -92,7 +114,7 @@ const SidebarNavigation = () => { return ( } @@ -104,7 +126,7 @@ const SidebarNavigation = () => { return ( } /> ); @@ -118,14 +140,14 @@ const SidebarNavigation = () => { } /> } /> @@ -133,8 +155,8 @@ const SidebarNavigation = () => { <> } /> @@ -144,23 +166,23 @@ const SidebarNavigation = () => { {features.groups && ( } /> )} } /> } count={settingsNotifications.size} /> @@ -168,7 +190,7 @@ const SidebarNavigation = () => { {account.staff && ( } /> @@ -181,7 +203,7 @@ const SidebarNavigation = () => { {(account || !restrictUnauth.timelines.local) && ( } /> )} @@ -189,7 +211,7 @@ const SidebarNavigation = () => { {(features.federating && (account || !restrictUnauth.timelines.federated)) && ( } /> )} @@ -199,7 +221,7 @@ const SidebarNavigation = () => { {menu.length > 0 && ( } /> diff --git a/src/components/site-logo.tsx b/src/components/site-logo.tsx index e42d19e52..cc107b266 100644 --- a/src/components/site-logo.tsx +++ b/src/components/site-logo.tsx @@ -1,6 +1,8 @@ import clsx from 'clsx'; import React from 'react'; +import soapboxLogoWhiteSrc from 'soapbox/assets/images/soapbox-logo-white.svg'; +import soapboxLogoSrc from 'soapbox/assets/images/soapbox-logo.svg'; import { useSoapboxConfig, useSettings, useTheme } from 'soapbox/hooks'; interface ISiteLogo extends React.ComponentProps<'img'> { @@ -19,9 +21,7 @@ const SiteLogo: React.FC = ({ className, theme, ...rest }) => { if (theme === 'dark') darkMode = true; /** Soapbox logo. */ - const soapboxLogo = darkMode - ? require('soapbox/assets/images/soapbox-logo-white.svg') - : require('soapbox/assets/images/soapbox-logo.svg'); + const soapboxLogo = darkMode ? soapboxLogoWhiteSrc : soapboxLogoSrc; // Use the right logo if provided, then use fallbacks. const getSrc = () => { diff --git a/src/components/status-action-bar.tsx b/src/components/status-action-bar.tsx index 93b03cd15..4c2add1be 100644 --- a/src/components/status-action-bar.tsx +++ b/src/components/status-action-bar.tsx @@ -1,3 +1,35 @@ +import alertTriangleIcon from '@tabler/icons/outline/alert-triangle.svg'; +import arrowsVerticalIcon from '@tabler/icons/outline/arrows-vertical.svg'; +import atIcon from '@tabler/icons/outline/at.svg'; +import banIcon from '@tabler/icons/outline/ban.svg'; +import bellOffIcon from '@tabler/icons/outline/bell-off.svg'; +import bellIcon from '@tabler/icons/outline/bell.svg'; +import boltIcon from '@tabler/icons/outline/bolt.svg'; +import bookmarkOffIcon from '@tabler/icons/outline/bookmark-off.svg'; +import bookmarkIcon from '@tabler/icons/outline/bookmark.svg'; +import clipboardCopyIcon from '@tabler/icons/outline/clipboard-copy.svg'; +import dotsIcon from '@tabler/icons/outline/dots.svg'; +import editIcon from '@tabler/icons/outline/edit.svg'; +import externalLinkIcon from '@tabler/icons/outline/external-link.svg'; +import flagIcon from '@tabler/icons/outline/flag.svg'; +import foldersIcon from '@tabler/icons/outline/folders.svg'; +import gavelIcon from '@tabler/icons/outline/gavel.svg'; +import heartIcon from '@tabler/icons/outline/heart.svg'; +import lockIcon from '@tabler/icons/outline/lock.svg'; +import mailIcon from '@tabler/icons/outline/mail.svg'; +import messageCircleIcon from '@tabler/icons/outline/message-circle.svg'; +import messagesIcon from '@tabler/icons/outline/messages.svg'; +import pencilIcon from '@tabler/icons/outline/pencil.svg'; +import pinIcon from '@tabler/icons/outline/pin.svg'; +import pinnedOffIcon from '@tabler/icons/outline/pinned-off.svg'; +import quoteIcon from '@tabler/icons/outline/quote.svg'; +import repeatIcon from '@tabler/icons/outline/repeat.svg'; +import shareIcon from '@tabler/icons/outline/share.svg'; +import thumbDownIcon from '@tabler/icons/outline/thumb-down.svg'; +import thumbUpIcon from '@tabler/icons/outline/thumb-up.svg'; +import trashIcon from '@tabler/icons/outline/trash.svg'; +import uploadIcon from '@tabler/icons/outline/upload.svg'; +import volume3Icon from '@tabler/icons/outline/volume-3.svg'; import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { useHistory, useRouteMatch } from 'react-router-dom'; @@ -238,7 +270,7 @@ const StatusActionBar: React.FC = ({ dispatch(deleteStatus(status.id, withRedraft)); } else { dispatch(openModal('CONFIRM', { - icon: withRedraft ? require('@tabler/icons/outline/edit.svg') : require('@tabler/icons/outline/trash.svg'), + icon: withRedraft ? editIcon : trashIcon, heading: intl.formatMessage(withRedraft ? messages.redraftHeading : messages.deleteHeading), message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), @@ -319,7 +351,7 @@ const StatusActionBar: React.FC = ({ const account = status.account; dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, heading: , message: @{account.acct} }} />, // eslint-disable-line formatjs/no-literal-string-in-jsx confirm: intl.formatMessage(messages.blockConfirm), @@ -409,7 +441,7 @@ const StatusActionBar: React.FC = ({ if (expandable) { menu.push({ text: intl.formatMessage(messages.open), - icon: require('@tabler/icons/outline/arrows-vertical.svg'), + icon: arrowsVerticalIcon, to: `/@${status.account.acct}/posts/${status.id}`, }); } @@ -418,14 +450,14 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(messages.copy), action: handleCopy, - icon: require('@tabler/icons/outline/clipboard-copy.svg'), + icon: clipboardCopyIcon, }); if (features.embeds && account.local) { menu.push({ text: intl.formatMessage(messages.embed), action: handleEmbed, - icon: require('@tabler/icons/outline/share.svg'), + icon: shareIcon, }); } } @@ -436,7 +468,7 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(messages.external, { domain }), - icon: require('@tabler/icons/outline/external-link.svg'), + icon: externalLinkIcon, href: externalNostrUrl || status.uri, target: '_blank', }); @@ -454,7 +486,7 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(status.pinned ? messages.unpinFromGroup : messages.pinToGroup), action: handleGroupPinClick, - icon: status.pinned ? require('@tabler/icons/outline/pinned-off.svg') : require('@tabler/icons/outline/pin.svg'), + icon: status.pinned ? pinnedOffIcon : pinIcon, }); } } @@ -463,7 +495,7 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(status.bookmarked ? messages.unbookmark : messages.bookmark), action: handleBookmarkClick, - icon: status.bookmarked ? require('@tabler/icons/outline/bookmark-off.svg') : require('@tabler/icons/outline/bookmark.svg'), + icon: status.bookmarked ? bookmarkOffIcon : bookmarkIcon, }); } @@ -471,7 +503,7 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(status.pleroma.get('bookmark_folder') ? messages.bookmarkChangeFolder : messages.bookmarkSetFolder), action: handleBookmarkFolderClick, - icon: require('@tabler/icons/outline/folders.svg'), + icon: foldersIcon, }); } @@ -480,7 +512,7 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: handleConversationMuteClick, - icon: mutingConversation ? require('@tabler/icons/outline/bell.svg') : require('@tabler/icons/outline/bell-off.svg'), + icon: mutingConversation ? bellIcon : bellOffIcon, }); menu.push(null); @@ -490,14 +522,14 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(status.pinned ? messages.unpin : messages.pin), action: handlePinClick, - icon: status.pinned ? require('@tabler/icons/outline/pinned-off.svg') : require('@tabler/icons/outline/pin.svg'), + icon: status.pinned ? pinnedOffIcon : pinIcon, }); } else { if (status.visibility === 'private') { menu.push({ text: intl.formatMessage(status.reblogged ? messages.cancel_reblog_private : messages.reblog_private), action: handleReblogClick, - icon: require('@tabler/icons/outline/repeat.svg'), + icon: repeatIcon, }); } } @@ -505,20 +537,20 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(messages.delete), action: handleDeleteClick, - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, destructive: true, }); if (features.editStatuses) { menu.push({ text: intl.formatMessage(messages.edit), action: handleEditClick, - icon: require('@tabler/icons/outline/edit.svg'), + icon: editIcon, }); } else { menu.push({ text: intl.formatMessage(messages.redraft), action: handleRedraftClick, - icon: require('@tabler/icons/outline/edit.svg'), + icon: editIcon, destructive: true, }); } @@ -526,20 +558,20 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(messages.mention, { name: username }), action: handleMentionClick, - icon: require('@tabler/icons/outline/at.svg'), + icon: atIcon, }); if (status.account.pleroma?.accepts_chat_messages === true) { menu.push({ text: intl.formatMessage(messages.chat, { name: username }), action: handleChatClick, - icon: require('@tabler/icons/outline/messages.svg'), + icon: messagesIcon, }); } else if (features.privacyScopes) { menu.push({ text: intl.formatMessage(messages.direct, { name: username }), action: handleDirectClick, - icon: require('@tabler/icons/outline/mail.svg'), + icon: mailIcon, }); } @@ -547,7 +579,7 @@ const StatusActionBar: React.FC = ({ if (features.groupsMuting && status.group) { menu.push({ text: isMutingGroup ? intl.formatMessage(messages.unmuteGroup) : intl.formatMessage(messages.muteGroup), - icon: require('@tabler/icons/outline/volume-3.svg'), + icon: volume3Icon, action: isMutingGroup ? handleUnmuteGroupClick : handleMuteGroupClick, }); menu.push(null); @@ -556,19 +588,19 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(messages.mute, { name: username }), action: handleMuteClick, - icon: require('@tabler/icons/outline/volume-3.svg'), + icon: volume3Icon, }); if (features.blocks) { menu.push({ text: intl.formatMessage(messages.block, { name: username }), action: handleBlockClick, - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, }); } menu.push({ text: intl.formatMessage(messages.report, { name: username }), action: handleReport, - icon: require('@tabler/icons/outline/flag.svg'), + icon: flagIcon, }); } @@ -590,7 +622,7 @@ const StatusActionBar: React.FC = ({ menu.push({ text: 'Ban from Group', action: handleBlockFromGroup, - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, destructive: true, }); } @@ -599,7 +631,7 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(messages.groupModDelete), action: handleDeleteFromGroup, - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, destructive: true, }); } @@ -611,28 +643,28 @@ const StatusActionBar: React.FC = ({ menu.push({ text: intl.formatMessage(messages.adminAccount, { name: username }), action: onModerate, - icon: require('@tabler/icons/outline/gavel.svg'), + icon: gavelIcon, }); if (isAdmin) { menu.push({ text: intl.formatMessage(messages.admin_status), href: `/pleroma/admin/#/statuses/${status.id}/`, - icon: require('@tabler/icons/outline/pencil.svg'), + icon: pencilIcon, }); } menu.push({ text: intl.formatMessage(status.sensitive === false ? messages.markStatusSensitive : messages.markStatusNotSensitive), action: handleToggleStatusSensitivity, - icon: require('@tabler/icons/outline/alert-triangle.svg'), + icon: alertTriangleIcon, }); if (!ownAccount) { menu.push({ text: intl.formatMessage(messages.deleteStatus), action: handleDeleteStatus, - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, destructive: true, }); } @@ -670,14 +702,14 @@ const StatusActionBar: React.FC = ({ const meEmojiTitle = intl.formatMessage(reactMessages[meEmojiName || ''] || messages.favourite); const menu = _makeMenu(publicStatus); - let reblogIcon = require('@tabler/icons/outline/repeat.svg'); + let reblogIcon = repeatIcon; let replyTitle; let replyDisabled = false; if (status.visibility === 'direct') { - reblogIcon = require('@tabler/icons/outline/mail.svg'); + reblogIcon = mailIcon; } else if (status.visibility === 'private') { - reblogIcon = require('@tabler/icons/outline/lock.svg'); + reblogIcon = lockIcon; } if ((status.group as Group)?.membership_required && !groupRelationship?.member) { @@ -688,11 +720,11 @@ const StatusActionBar: React.FC = ({ const reblogMenu = [{ text: intl.formatMessage(status.reblogged ? messages.cancel_reblog_private : messages.reblog), action: handleReblogClick, - icon: require('@tabler/icons/outline/repeat.svg'), + icon: repeatIcon, }, { text: intl.formatMessage(messages.quotePost), action: handleQuoteClick, - icon: require('@tabler/icons/outline/quote.svg'), + icon: quoteIcon, }]; const reblogButton = ( @@ -741,7 +773,7 @@ const StatusActionBar: React.FC = ({ > = ({ = ({ ) : ( = ({ {features.dislikes && ( = ({ {(acceptsZaps) && ( = ({ {canShare && ( @@ -830,7 +862,7 @@ const StatusActionBar: React.FC = ({ diff --git a/src/components/status-content.tsx b/src/components/status-content.tsx index 8d537aa62..3f7c4011b 100644 --- a/src/components/status-content.tsx +++ b/src/components/status-content.tsx @@ -1,3 +1,4 @@ +import chevronRightIcon from '@tabler/icons/outline/chevron-right.svg'; import clsx from 'clsx'; import parse, { Element, type HTMLReactParserOptions, domToReact, type DOMNode } from 'html-react-parser'; import React, { useState, useRef, useLayoutEffect, useMemo } from 'react'; @@ -27,7 +28,7 @@ interface IReadMoreButton { const ReadMoreButton: React.FC = ({ onClick }) => ( ); diff --git a/src/components/status.tsx b/src/components/status.tsx index 022eab385..016153563 100644 --- a/src/components/status.tsx +++ b/src/components/status.tsx @@ -1,3 +1,6 @@ +import circlesIcon from '@tabler/icons/outline/circles.svg'; +import pinnedIcon from '@tabler/icons/outline/pinned.svg'; +import repeatIcon from '@tabler/icons/outline/repeat.svg'; import clsx from 'clsx'; import React, { useEffect, useRef, useState } from 'react'; import { useIntl, FormattedMessage, defineMessages } from 'react-intl'; @@ -212,7 +215,7 @@ const Status: React.FC = (props) => { return ( } + icon={} text={ = (props) => { return ( } + icon={} text={ = (props) => { return ( } + icon={} text={ } @@ -289,7 +292,7 @@ const Status: React.FC = (props) => { return ( } + icon={} text={ {intl.formatMessage(messages.contact)} @@ -153,7 +158,7 @@ const SensitiveContentOverlay = React.forwardRef {intl.formatMessage(messages.show)} @@ -162,7 +167,7 @@ const SensitiveContentOverlay = React.forwardRef ) : null} diff --git a/src/components/thumb-navigation.tsx b/src/components/thumb-navigation.tsx index 08d792e22..35008843c 100644 --- a/src/components/thumb-navigation.tsx +++ b/src/components/thumb-navigation.tsx @@ -1,3 +1,14 @@ +import bellFilledIcon from '@tabler/icons/filled/bell.svg'; +import circlesFilledIcon from '@tabler/icons/filled/circles.svg'; +import homeFilledIcon from '@tabler/icons/filled/home.svg'; +import mailFilledIcon from '@tabler/icons/filled/mail.svg'; +import bellIcon from '@tabler/icons/outline/bell.svg'; +import circlesIcon from '@tabler/icons/outline/circles.svg'; +import dashboardIcon from '@tabler/icons/outline/dashboard.svg'; +import homeIcon from '@tabler/icons/outline/home.svg'; +import mailIcon from '@tabler/icons/outline/mail.svg'; +import messagesIcon from '@tabler/icons/outline/messages.svg'; +import searchIcon from '@tabler/icons/outline/search.svg'; import React from 'react'; import { FormattedMessage } from 'react-intl'; @@ -19,7 +30,7 @@ const ThumbNavigation: React.FC = (): JSX.Element => { if (features.chats) { return ( } to='/chats' exact @@ -32,8 +43,8 @@ const ThumbNavigation: React.FC = (): JSX.Element => { if (features.directTimeline || features.conversations) { return ( } to='/messages' paths={['/messages', '/conversations']} @@ -47,8 +58,8 @@ const ThumbNavigation: React.FC = (): JSX.Element => { return (
} to='/' exact @@ -56,8 +67,8 @@ const ThumbNavigation: React.FC = (): JSX.Element => { {features.groups && ( } to='/groups' exact @@ -65,7 +76,7 @@ const ThumbNavigation: React.FC = (): JSX.Element => { )} } to='/search' exact @@ -73,8 +84,8 @@ const ThumbNavigation: React.FC = (): JSX.Element => { {account && ( } to='/notifications' exact @@ -86,7 +97,7 @@ const ThumbNavigation: React.FC = (): JSX.Element => { {(account && account.staff) && ( } to='/soapbox/admin' count={dashboardCount} diff --git a/src/components/translate-button.tsx b/src/components/translate-button.tsx index bfe0fe4e6..86a996807 100644 --- a/src/components/translate-button.tsx +++ b/src/components/translate-button.tsx @@ -1,3 +1,4 @@ +import languageIcon from '@tabler/icons/outline/language.svg'; import React from 'react'; import { FormattedMessage, useIntl } from 'react-intl'; @@ -53,7 +54,7 @@ const TranslateButton: React.FC = ({ status }) => {
diff --git a/src/components/ui/accordion/accordion.tsx b/src/components/ui/accordion/accordion.tsx index ec9e1a4cf..577bf1234 100644 --- a/src/components/ui/accordion/accordion.tsx +++ b/src/components/ui/accordion/accordion.tsx @@ -1,3 +1,6 @@ +import chevronDownIcon from '@tabler/icons/outline/chevron-down.svg'; +import chevronUpIcon from '@tabler/icons/outline/chevron-up.svg'; +import dotsVerticalIcon from '@tabler/icons/outline/dots-vertical.svg'; import clsx from 'clsx'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -60,7 +63,7 @@ const Accordion: React.FC = ({ headline, children, menu, expanded = {menu && ( )} {action && actionIcon && ( @@ -72,7 +75,7 @@ const Accordion: React.FC = ({ headline, children, menu, expanded = )}
diff --git a/src/components/ui/avatar/avatar.tsx b/src/components/ui/avatar/avatar.tsx index c6d1af6c8..99627b5b2 100644 --- a/src/components/ui/avatar/avatar.tsx +++ b/src/components/ui/avatar/avatar.tsx @@ -1,3 +1,4 @@ +import photoOffIcon from '@tabler/icons/outline/photo-off.svg'; import clsx from 'clsx'; import React, { useState } from 'react'; @@ -35,7 +36,7 @@ const Avatar = (props: IAvatar) => { className={clsx('flex items-center justify-center rounded-full bg-gray-200 dark:bg-gray-900', className)} > diff --git a/src/components/ui/card/card.tsx b/src/components/ui/card/card.tsx index 242d50f34..31887948e 100644 --- a/src/components/ui/card/card.tsx +++ b/src/components/ui/card/card.tsx @@ -1,3 +1,4 @@ +import arrowLeftIcon from '@tabler/icons/outline/arrow-left.svg'; import clsx from 'clsx'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -72,7 +73,7 @@ const CardHeader: React.FC = ({ className, children, backHref, onBa return ( - + {intl.formatMessage(messages.back)} ); diff --git a/src/components/ui/carousel/carousel.tsx b/src/components/ui/carousel/carousel.tsx index 1cd4f2e8a..1739587c4 100644 --- a/src/components/ui/carousel/carousel.tsx +++ b/src/components/ui/carousel/carousel.tsx @@ -1,3 +1,5 @@ +import chevronLeftIcon from '@tabler/icons/outline/chevron-left.svg'; +import chevronRightIcon from '@tabler/icons/outline/chevron-right.svg'; import React, { useEffect, useState } from 'react'; import { useDimensions } from 'soapbox/hooks'; @@ -68,7 +70,7 @@ const Carousel: React.FC = (props): JSX.Element => { disabled={!hasPrevPage || isDisabled} > @@ -100,7 +102,7 @@ const Carousel: React.FC = (props): JSX.Element => { disabled={!hasNextPage || isDisabled} > diff --git a/src/components/ui/emoji-selector/emoji-selector.tsx b/src/components/ui/emoji-selector/emoji-selector.tsx index 9a28bffa1..1ba4ee14f 100644 --- a/src/components/ui/emoji-selector/emoji-selector.tsx +++ b/src/components/ui/emoji-selector/emoji-selector.tsx @@ -1,4 +1,5 @@ import { shift, useFloating, Placement, offset, OffsetOptions } from '@floating-ui/react'; +import dotsIcon from '@tabler/icons/outline/dots.svg'; import clsx from 'clsx'; import React, { useEffect, useState } from 'react'; @@ -134,7 +135,7 @@ const EmojiSelector: React.FC = ({ {all && ( )} diff --git a/src/components/ui/input/input.tsx b/src/components/ui/input/input.tsx index 94daf1dcb..6bc634636 100644 --- a/src/components/ui/input/input.tsx +++ b/src/components/ui/input/input.tsx @@ -1,3 +1,5 @@ +import eyeOffIcon from '@tabler/icons/outline/eye-off.svg'; +import eyeIcon from '@tabler/icons/outline/eye.svg'; import clsx from 'clsx'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -123,7 +125,7 @@ const Input = React.forwardRef( className='h-full px-2 text-gray-700 hover:text-gray-500 focus:ring-2 focus:ring-primary-500 dark:text-gray-600 dark:hover:text-gray-400' > diff --git a/src/components/ui/language-dropdown/language-dropdown.tsx b/src/components/ui/language-dropdown/language-dropdown.tsx index b6eac2f15..756ada8b6 100644 --- a/src/components/ui/language-dropdown/language-dropdown.tsx +++ b/src/components/ui/language-dropdown/language-dropdown.tsx @@ -1,3 +1,4 @@ +import worldIcon from '@tabler/icons/outline/world.svg'; import React from 'react'; import { openDropdownMenu } from 'soapbox/actions/dropdown-menu'; @@ -26,7 +27,7 @@ const LanguageDropdown: React.FC = ({ language, setLanguage } const dispatch = useAppDispatch(); const formattedLanguages = formatLanguages(languages); - const newMenu: MenuItem[] = [{ icon: require('@tabler/icons/outline/world.svg'), text: 'Default', action: () => { + const newMenu: MenuItem[] = [{ icon: worldIcon, text: 'Default', action: () => { setLanguage(''); } }]; @@ -51,7 +52,7 @@ const LanguageDropdown: React.FC = ({ language, setLanguage } {language.toUpperCase()} ) : ( - + )} ); diff --git a/src/components/ui/modal/modal.tsx b/src/components/ui/modal/modal.tsx index 82b9e6482..6d516fc91 100644 --- a/src/components/ui/modal/modal.tsx +++ b/src/components/ui/modal/modal.tsx @@ -1,3 +1,5 @@ +import arrowLeftIcon from '@tabler/icons/outline/arrow-left.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import React from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -72,7 +74,7 @@ const Modal = React.forwardRef(({ cancelAction, cancelText, children, - closeIcon = require('@tabler/icons/outline/x.svg'), + closeIcon = xIcon, closePosition = 'right', confirmationAction, confirmationDisabled, @@ -115,7 +117,7 @@ const Modal = React.forwardRef(({ > {onBack && ( = ({ onRemoveItem(i)} title={intl.formatMessage(messages.remove)} /> diff --git a/src/components/ui/tag-input/tag.tsx b/src/components/ui/tag-input/tag.tsx index d6bf05c75..4ca668fef 100644 --- a/src/components/ui/tag-input/tag.tsx +++ b/src/components/ui/tag-input/tag.tsx @@ -1,3 +1,4 @@ +import xIcon from '@tabler/icons/outline/x.svg'; import React from 'react'; import IconButton from '../icon-button/icon-button'; @@ -18,7 +19,7 @@ const Tag: React.FC = ({ tag, onDelete }) => { onDelete(tag)} /> diff --git a/src/components/ui/toast/toast.tsx b/src/components/ui/toast/toast.tsx index f5a9cb2a9..11626f722 100644 --- a/src/components/ui/toast/toast.tsx +++ b/src/components/ui/toast/toast.tsx @@ -1,3 +1,7 @@ +import alertCircleIcon from '@tabler/icons/outline/alert-circle.svg'; +import circleCheckIcon from '@tabler/icons/outline/circle-check.svg'; +import infoCircleIcon from '@tabler/icons/outline/info-circle.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import React from 'react'; import toast, { Toast as RHToast } from 'react-hot-toast'; @@ -42,7 +46,7 @@ const Toast = (props: IToast) => { case 'success': return ( @@ -50,7 +54,7 @@ const Toast = (props: IToast) => { case 'info': return ( @@ -58,7 +62,7 @@ const Toast = (props: IToast) => { case 'error': return ( @@ -143,7 +147,7 @@ const Toast = (props: IToast) => { data-testid='toast-dismiss' > - +
diff --git a/src/components/ui/widget/widget.tsx b/src/components/ui/widget/widget.tsx index 4d2f8482b..446312c16 100644 --- a/src/components/ui/widget/widget.tsx +++ b/src/components/ui/widget/widget.tsx @@ -1,3 +1,4 @@ +import arrowRightIcon from '@tabler/icons/outline/arrow-right.svg'; import React from 'react'; import HStack from 'soapbox/components/ui/hstack/hstack'; @@ -42,7 +43,7 @@ const Widget: React.FC = ({ title, children, onActionClick, - actionIcon = require('@tabler/icons/outline/arrow-right.svg'), + actionIcon = arrowRightIcon, actionTitle, action, }): JSX.Element => { diff --git a/src/components/upload-progress.tsx b/src/components/upload-progress.tsx index 10b0490d2..e2f44fc64 100644 --- a/src/components/upload-progress.tsx +++ b/src/components/upload-progress.tsx @@ -1,3 +1,4 @@ +import cloudUploadIcon from '@tabler/icons/outline/cloud-upload.svg'; import React from 'react'; import { FormattedMessage } from 'react-intl'; @@ -13,7 +14,7 @@ const UploadProgress: React.FC = ({ progress }) => { return ( diff --git a/src/components/upload.tsx b/src/components/upload.tsx index 23393a54e..441ca66f9 100644 --- a/src/components/upload.tsx +++ b/src/components/upload.tsx @@ -1,3 +1,4 @@ +import alertTriangleIcon from '@tabler/icons/outline/alert-triangle.svg'; import bookIcon from '@tabler/icons/outline/book.svg'; import fileCodeIcon from '@tabler/icons/outline/file-code.svg'; import fileSpreadsheetIcon from '@tabler/icons/outline/file-spreadsheet.svg'; @@ -240,7 +241,7 @@ const Upload: React.FC = ({ 'opacity-100': !active, })} > - + )} diff --git a/src/components/validation-checkmark.tsx b/src/components/validation-checkmark.tsx index cb4e06816..2a4acd144 100644 --- a/src/components/validation-checkmark.tsx +++ b/src/components/validation-checkmark.tsx @@ -1,3 +1,5 @@ +import checkIcon from '@tabler/icons/outline/check.svg'; +import pointIcon from '@tabler/icons/outline/point.svg'; import clsx from 'clsx'; import React from 'react'; @@ -12,7 +14,7 @@ const ValidationCheckmark = ({ isValid, text }: IValidationCheckmark) => { return ( = ({ className }) => { const soapboxConfig = useSoapboxConfig(); // Prefer a custom icon if found - const icon = soapboxConfig.verifiedIcon || require('soapbox/assets/icons/verified.svg'); + const icon = soapboxConfig.verifiedIcon || verifiedIcon; // Render component based on file extension const Element = icon.endsWith('.svg') ? Icon : 'img'; diff --git a/src/features/account-gallery/components/media-item.tsx b/src/features/account-gallery/components/media-item.tsx index b7c77a7d3..0dc5a7ea2 100644 --- a/src/features/account-gallery/components/media-item.tsx +++ b/src/features/account-gallery/components/media-item.tsx @@ -1,3 +1,5 @@ +import eyeOffIcon from '@tabler/icons/outline/eye-off.svg'; +import volumeIcon from '@tabler/icons/outline/volume.svg'; import clsx from 'clsx'; import React, { useState } from 'react'; @@ -103,7 +105,7 @@ const MediaItem: React.FC = ({ attachment, onOpenMedia }) => { const fileExtension = remoteURL.slice(fileExtensionLastIndex + 1).toUpperCase(); thumbnail = (
- + {fileExtension}
); @@ -112,7 +114,7 @@ const MediaItem: React.FC = ({ attachment, onOpenMedia }) => { if (!visible) { icon = ( - + ); } diff --git a/src/features/account-timeline/components/moved-note.tsx b/src/features/account-timeline/components/moved-note.tsx index c8924cdbe..dbef926ed 100644 --- a/src/features/account-timeline/components/moved-note.tsx +++ b/src/features/account-timeline/components/moved-note.tsx @@ -1,3 +1,4 @@ +import briefcaseIcon from '@tabler/icons/outline/briefcase.svg'; import React from 'react'; import { FormattedMessage } from 'react-intl'; @@ -16,7 +17,7 @@ const MovedNote: React.FC = ({ from, to }) => (
diff --git a/src/features/account/components/header.tsx b/src/features/account/components/header.tsx index a9bd79b1a..0b215ccc9 100644 --- a/src/features/account/components/header.tsx +++ b/src/features/account/components/header.tsx @@ -1,3 +1,23 @@ +import atIcon from '@tabler/icons/outline/at.svg'; +import banIcon from '@tabler/icons/outline/ban.svg'; +import boltIcon from '@tabler/icons/outline/bolt.svg'; +import circleXIcon from '@tabler/icons/outline/circle-x.svg'; +import clipboardCopyIcon from '@tabler/icons/outline/clipboard-copy.svg'; +import dotsIcon from '@tabler/icons/outline/dots.svg'; +import externalLinkIcon from '@tabler/icons/outline/external-link.svg'; +import flagIcon from '@tabler/icons/outline/flag.svg'; +import gavelIcon from '@tabler/icons/outline/gavel.svg'; +import listIcon from '@tabler/icons/outline/list.svg'; +import mailIcon from '@tabler/icons/outline/mail.svg'; +import messagesIcon from '@tabler/icons/outline/messages.svg'; +import repeatIcon from '@tabler/icons/outline/repeat.svg'; +import rssIcon from '@tabler/icons/outline/rss.svg'; +import searchIcon from '@tabler/icons/outline/search.svg'; +import settingsIcon from '@tabler/icons/outline/settings.svg'; +import uploadIcon from '@tabler/icons/outline/upload.svg'; +import userCheckIcon from '@tabler/icons/outline/user-check.svg'; +import userXIcon from '@tabler/icons/outline/user-x.svg'; +import userIcon from '@tabler/icons/outline/user.svg'; import { useMutation } from '@tanstack/react-query'; import { AxiosError } from 'axios'; import { List as ImmutableList } from 'immutable'; @@ -135,7 +155,7 @@ const Header: React.FC = ({ account }) => { dispatch(unblockAccount(account.id)); } else { dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, heading: , message: @{account.acct} }} />, // eslint-disable-line formatjs/no-literal-string-in-jsx confirm: intl.formatMessage(messages.blockConfirm), @@ -191,7 +211,7 @@ const Header: React.FC = ({ account }) => { const onBlockDomain = (domain: string) => { dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, heading: , message: {domain} }} />, confirm: intl.formatMessage(messages.blockDomainConfirm), @@ -298,7 +318,7 @@ const Header: React.FC = ({ account }) => { if (features.rssFeeds && account.local) { menu.push({ text: intl.formatMessage(messages.subscribeFeed), - icon: require('@tabler/icons/outline/rss.svg'), + icon: rssIcon, href: software === MASTODON ? `${account.url}.rss` : `${account.url}/feed.rss`, target: '_blank', }); @@ -308,7 +328,7 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.share, { name: account.username }), action: handleShare, - icon: require('@tabler/icons/outline/upload.svg'), + icon: uploadIcon, }); } @@ -321,7 +341,7 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.profileExternal, { domain }), action: () => onProfileExternal(url), - icon: require('@tabler/icons/outline/external-link.svg'), + icon: externalLinkIcon, href: url, }); } @@ -330,14 +350,14 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.copy), action: handleCopy, - icon: require('@tabler/icons/outline/clipboard-copy.svg'), + icon: clipboardCopyIcon, }); if (account.nostr.pubkey) { menu.push({ text: intl.formatMessage(messages.npub), action: handleCopyNpub, - icon: require('@tabler/icons/outline/clipboard-copy.svg'), + icon: clipboardCopyIcon, }); } @@ -347,7 +367,7 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(account.id === ownAccount.id ? messages.searchSelf : messages.search, { name: account.username }), action: onSearch, - icon: require('@tabler/icons/outline/search.svg'), + icon: searchIcon, }); } @@ -359,38 +379,38 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.edit_profile), to: '/settings/profile', - icon: require('@tabler/icons/outline/user.svg'), + icon: userIcon, }); menu.push({ text: intl.formatMessage(messages.preferences), to: '/settings', - icon: require('@tabler/icons/outline/settings.svg'), + icon: settingsIcon, }); menu.push(null); menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes', - icon: require('@tabler/icons/outline/circle-x.svg'), + icon: circleXIcon, }); if (features.blocks) { menu.push({ text: intl.formatMessage(messages.blocks), to: '/blocks', - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, }); } } else { menu.push({ text: intl.formatMessage(messages.mention, { name: account.username }), action: onMention, - icon: require('@tabler/icons/outline/at.svg'), + icon: atIcon, }); if (features.privacyScopes) { menu.push({ text: intl.formatMessage(messages.direct, { name: account.username }), action: onDirect, - icon: require('@tabler/icons/outline/mail.svg'), + icon: mailIcon, }); } @@ -399,13 +419,13 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.hideReblogs, { name: account.username }), action: onReblogToggle, - icon: require('@tabler/icons/outline/repeat.svg'), + icon: repeatIcon, }); } else { menu.push({ text: intl.formatMessage(messages.showReblogs, { name: account.username }), action: onReblogToggle, - icon: require('@tabler/icons/outline/repeat.svg'), + icon: repeatIcon, }); } @@ -413,7 +433,7 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.add_or_remove_from_list), action: onAddToList, - icon: require('@tabler/icons/outline/list.svg'), + icon: listIcon, }); } @@ -421,14 +441,14 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(account.relationship?.endorsed ? messages.unendorse : messages.endorse), action: onEndorseToggle, - icon: require('@tabler/icons/outline/user-check.svg'), + icon: userCheckIcon, }); } } else if (features.lists && features.unrestrictedLists) { menu.push({ text: intl.formatMessage(messages.add_or_remove_from_list), action: onAddToList, - icon: require('@tabler/icons/outline/list.svg'), + icon: listIcon, }); } @@ -438,7 +458,7 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.removeFromFollowers), action: onRemoveFromFollowers, - icon: require('@tabler/icons/outline/user-x.svg'), + icon: userXIcon, }); } @@ -446,13 +466,13 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.unmute, { name: account.username }), action: onMute, - icon: require('@tabler/icons/outline/circle-x.svg'), + icon: circleXIcon, }); } else { menu.push({ text: intl.formatMessage(messages.mute, { name: account.username }), action: onMute, - icon: require('@tabler/icons/outline/circle-x.svg'), + icon: circleXIcon, }); } @@ -461,13 +481,13 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.unblock, { name: account.username }), action: onBlock, - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, }); } else { menu.push({ text: intl.formatMessage(messages.block, { name: account.username }), action: onBlock, - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, }); } } @@ -475,7 +495,7 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.report, { name: account.username }), action: onReport, - icon: require('@tabler/icons/outline/flag.svg'), + icon: flagIcon, }); } @@ -488,13 +508,13 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: () => onUnblockDomain(domain), - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, }); } else { menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), action: () => onBlockDomain(domain), - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, }); } } @@ -505,7 +525,7 @@ const Header: React.FC = ({ account }) => { menu.push({ text: intl.formatMessage(messages.adminAccount, { name: account.username }), action: onModerate, - icon: require('@tabler/icons/outline/gavel.svg'), + icon: gavelIcon, }); } @@ -592,7 +612,7 @@ const Header: React.FC = ({ account }) => { return ( createAndNavigateToChat.mutate(account.id)} title={intl.formatMessage(messages.chat, { name: account.username })} theme='outlined' @@ -604,7 +624,7 @@ const Header: React.FC = ({ account }) => { } else if (account.pleroma?.accepts_chat_messages) { return ( createAndNavigateToChat.mutate(account.id)} title={intl.formatMessage(messages.chat, { name: account.username })} theme='outlined' @@ -626,7 +646,7 @@ const Header: React.FC = ({ account }) => { return ( = ({ account }) => { const renderZapAccount = () => { return ( = ({ account }) => { {menu.length > 0 && ( { - + ); diff --git a/src/features/admin/domains.tsx b/src/features/admin/domains.tsx index 7ae4b19f3..32b4614be 100644 --- a/src/features/admin/domains.tsx +++ b/src/features/admin/domains.tsx @@ -1,3 +1,4 @@ +import plusIcon from '@tabler/icons/outline/plus.svg'; import React, { useEffect } from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -122,7 +123,7 @@ const Domains: React.FC = () => { diff --git a/src/features/aliases/index.tsx b/src/features/aliases/index.tsx index 36a3327de..01d3c0806 100644 --- a/src/features/aliases/index.tsx +++ b/src/features/aliases/index.tsx @@ -1,3 +1,4 @@ +import xIcon from '@tabler/icons/outline/x.svg'; import React, { useEffect } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -79,7 +80,7 @@ const Aliases = () => { {alias}
- +
diff --git a/src/features/audio/index.tsx b/src/features/audio/index.tsx index 61a43d89b..39effef8d 100644 --- a/src/features/audio/index.tsx +++ b/src/features/audio/index.tsx @@ -1,3 +1,8 @@ +import downloadIcon from '@tabler/icons/outline/download.svg'; +import playerPauseIcon from '@tabler/icons/outline/player-pause.svg'; +import playerPlayIcon from '@tabler/icons/outline/player-play.svg'; +import volume3Icon from '@tabler/icons/outline/volume-3.svg'; +import volumeIcon from '@tabler/icons/outline/volume.svg'; import clsx from 'clsx'; import debounce from 'lodash/debounce'; import throttle from 'lodash/throttle'; @@ -534,7 +539,7 @@ const Audio: React.FC = (props) => { className={clsx('inline-block flex-none border-0 bg-transparent px-[6px] py-[5px] text-[16px] text-white/75 opacity-75 outline-none hover:text-white hover:opacity-100 active:text-white active:opacity-100 ')} onClick={togglePlay} > - +
= (props) => { download target='_blank' > - +
diff --git a/src/features/auth-login/components/consumer-button.tsx b/src/features/auth-login/components/consumer-button.tsx index feac5f75b..3218d6434 100644 --- a/src/features/auth-login/components/consumer-button.tsx +++ b/src/features/auth-login/components/consumer-button.tsx @@ -1,3 +1,10 @@ +import brandFacebookIcon from '@tabler/icons/outline/brand-facebook.svg'; +import brandGithubIcon from '@tabler/icons/outline/brand-github.svg'; +import brandGoogleIcon from '@tabler/icons/outline/brand-google.svg'; +import brandSlackIcon from '@tabler/icons/outline/brand-slack.svg'; +import brandTwitterIcon from '@tabler/icons/outline/brand-twitter.svg'; +import brandWindowsIcon from '@tabler/icons/outline/brand-windows.svg'; +import keyIcon from '@tabler/icons/outline/key.svg'; import React from 'react'; import { useIntl, defineMessages } from 'react-intl'; @@ -12,12 +19,12 @@ const messages = defineMessages({ /** Map between OAuth providers and brand icons. */ const BRAND_ICONS: Record = { - twitter: require('@tabler/icons/outline/brand-twitter.svg'), - facebook: require('@tabler/icons/outline/brand-facebook.svg'), - google: require('@tabler/icons/outline/brand-google.svg'), - microsoft: require('@tabler/icons/outline/brand-windows.svg'), - slack: require('@tabler/icons/outline/brand-slack.svg'), - github: require('@tabler/icons/outline/brand-github.svg'), + twitter: brandTwitterIcon, + facebook: brandFacebookIcon, + google: brandGoogleIcon, + microsoft: brandWindowsIcon, + slack: brandSlackIcon, + github: brandGithubIcon, }; interface IConsumerButton { @@ -29,7 +36,7 @@ const ConsumerButton: React.FC = ({ provider }) => { const intl = useIntl(); const dispatch = useAppDispatch(); - const icon = BRAND_ICONS[provider] || require('@tabler/icons/outline/key.svg'); + const icon = BRAND_ICONS[provider] || keyIcon; const handleClick = () => { dispatch(prepareRequest(provider)); diff --git a/src/features/auth-login/components/registration-form.tsx b/src/features/auth-login/components/registration-form.tsx index ea5c9c94b..43d5e895c 100644 --- a/src/features/auth-login/components/registration-form.tsx +++ b/src/features/auth-login/components/registration-form.tsx @@ -1,3 +1,5 @@ +import atIcon from '@tabler/icons/outline/at.svg'; +import checkIcon from '@tabler/icons/outline/check.svg'; import axios from 'axios'; import { Map as ImmutableMap } from 'immutable'; import debounce from 'lodash/debounce'; @@ -152,7 +154,7 @@ const RegistrationForm: React.FC = ({ inviteToken }) => { const heading = confirmationHeading || approvalHeading; dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/check.svg'), + icon: checkIcon, heading: heading, message, confirm: intl.formatMessage(messages.close), @@ -255,7 +257,7 @@ const RegistrationForm: React.FC = ({ inviteToken }) => { autoCorrect='off' autoCapitalize='off' pattern='^[a-zA-Z\d_-]+' - icon={require('@tabler/icons/outline/at.svg')} + icon={atIcon} onChange={onUsernameChange} value={params.get('username', '')} required diff --git a/src/features/auth-token-list/index.tsx b/src/features/auth-token-list/index.tsx index caaf6a66f..21cad4ccd 100644 --- a/src/features/auth-token-list/index.tsx +++ b/src/features/auth-token-list/index.tsx @@ -1,3 +1,4 @@ +import alertTriangleIcon from '@tabler/icons/outline/alert-triangle.svg'; import React, { useEffect } from 'react'; import { defineMessages, FormattedDate, useIntl } from 'react-intl'; @@ -27,7 +28,7 @@ const AuthToken: React.FC = ({ token, isCurrent }) => { const handleRevoke = () => { if (isCurrent) dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/alert-triangle.svg'), + icon: alertTriangleIcon, heading: intl.formatMessage(messages.revokeSessionHeading), message: intl.formatMessage(messages.revokeSessionMessage), confirm: intl.formatMessage(messages.revokeSessionConfirm), diff --git a/src/features/birthdays/account.tsx b/src/features/birthdays/account.tsx index 33d14cf1b..1cfcd4e4d 100644 --- a/src/features/birthdays/account.tsx +++ b/src/features/birthdays/account.tsx @@ -1,3 +1,4 @@ +import balloonIcon from '@tabler/icons/outline/balloon.svg'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -36,7 +37,7 @@ const Account: React.FC = ({ accountId }) => { date: formattedBirthday, })} > - + {formattedBirthday}
diff --git a/src/features/bookmark-folders/index.tsx b/src/features/bookmark-folders/index.tsx index 754e12cbb..e4f87046f 100644 --- a/src/features/bookmark-folders/index.tsx +++ b/src/features/bookmark-folders/index.tsx @@ -1,3 +1,5 @@ +import bookmarksIcon from '@tabler/icons/outline/bookmarks.svg'; +import folderIcon from '@tabler/icons/outline/folder.svg'; import React from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; import { Redirect } from 'react-router-dom'; @@ -40,7 +42,7 @@ const BookmarkFolders: React.FC = () => { to='/bookmarks/all' label={ - + } @@ -57,7 +59,7 @@ const BookmarkFolders: React.FC = () => { src={folder.emoji_url || undefined} className='size-5 flex-none' /> - ) : } + ) : } {folder.name} } diff --git a/src/features/bookmarks/index.tsx b/src/features/bookmarks/index.tsx index f637a7a68..3921dad63 100644 --- a/src/features/bookmarks/index.tsx +++ b/src/features/bookmarks/index.tsx @@ -1,3 +1,6 @@ +import dotsVerticalIcon from '@tabler/icons/outline/dots-vertical.svg'; +import editIcon from '@tabler/icons/outline/edit.svg'; +import trashIcon from '@tabler/icons/outline/trash.svg'; import { OrderedSet as ImmutableOrderedSet } from 'immutable'; import debounce from 'lodash/debounce'; import React from 'react'; @@ -93,12 +96,12 @@ const Bookmarks: React.FC = ({ params }) => { { text: intl.formatMessage(messages.editFolder), action: handleEditFolder, - icon: require('@tabler/icons/outline/edit.svg'), + icon: editIcon, }, { text: intl.formatMessage(messages.deleteFolder), action: handleDeleteFolder, - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, }, ] : []; @@ -106,7 +109,7 @@ const Bookmarks: React.FC = ({ params }) => { + } transparent={!isMobile} > diff --git a/src/features/chats/components/chat-composer.tsx b/src/features/chats/components/chat-composer.tsx index 785538f20..1228836c5 100644 --- a/src/features/chats/components/chat-composer.tsx +++ b/src/features/chats/components/chat-composer.tsx @@ -1,3 +1,4 @@ +import sendIcon from '@tabler/icons/outline/send.svg'; import React, { useState } from 'react'; import { defineMessages, IntlShape, useIntl } from 'react-intl'; @@ -230,7 +231,7 @@ const ChatComposer = React.forwardRef ) : null} = ({ chat, onClick }) => { }, })); }, - icon: require('@tabler/icons/outline/logout.svg'), + icon: logoutIcon, }], []); const handleKeyDown: React.KeyboardEventHandler = (event) => { @@ -124,7 +126,7 @@ const ChatListItem: React.FC = ({ chat, onClick }) => {
{ ) : ( - + {chat.message_expiration && ( {intl.formatMessage(messages.messageLifespan, { day: secondsToDays(chat.message_expiration) })} diff --git a/src/features/chats/components/chat-message.tsx b/src/features/chats/components/chat-message.tsx index 0f1537076..218e7bc42 100644 --- a/src/features/chats/components/chat-message.tsx +++ b/src/features/chats/components/chat-message.tsx @@ -1,3 +1,9 @@ +import checkIcon from '@tabler/icons/outline/check.svg'; +import copyIcon from '@tabler/icons/outline/copy.svg'; +import dotsIcon from '@tabler/icons/outline/dots.svg'; +import flagIcon from '@tabler/icons/outline/flag.svg'; +import moodSmileIcon from '@tabler/icons/outline/mood-smile.svg'; +import trashIcon from '@tabler/icons/outline/trash.svg'; import { useMutation } from '@tanstack/react-query'; import clsx from 'clsx'; import { List as ImmutableList, Map as ImmutableMap } from 'immutable'; @@ -159,7 +165,7 @@ const ChatMessage = (props: IChatMessage) => { menu.push({ text: intl.formatMessage(messages.copy), action: () => handleCopyText(chatMessage), - icon: require('@tabler/icons/outline/copy.svg'), + icon: copyIcon, }); } @@ -167,7 +173,7 @@ const ChatMessage = (props: IChatMessage) => { menu.push({ text: intl.formatMessage(messages.delete), action: () => handleDeleteMessage.mutate(chatMessage.id), - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, destructive: true, }); } else { @@ -175,13 +181,13 @@ const ChatMessage = (props: IChatMessage) => { menu.push({ text: intl.formatMessage(messages.report), action: () => dispatch(initReport(ReportableEntities.CHAT_MESSAGE, chat.account, { chatMessage })), - icon: require('@tabler/icons/outline/flag.svg'), + icon: flagIcon, }); } menu.push({ text: intl.formatMessage(messages.deleteForMe), action: () => handleDeleteMessage.mutate(chatMessage.id), - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, destructive: true, }); } @@ -222,7 +228,7 @@ const ChatMessage = (props: IChatMessage) => { })} > @@ -244,7 +250,7 @@ const ChatMessage = (props: IChatMessage) => { data-testid='chat-message-menu' > @@ -362,7 +368,7 @@ const ChatMessage = (props: IChatMessage) => { {isRead ? ( @@ -370,7 +376,7 @@ const ChatMessage = (props: IChatMessage) => { ) : ( diff --git a/src/features/chats/components/chat-page/components/chat-page-main.tsx b/src/features/chats/components/chat-page/components/chat-page-main.tsx index 71934fa9b..530eec265 100644 --- a/src/features/chats/components/chat-page/components/chat-page-main.tsx +++ b/src/features/chats/components/chat-page/components/chat-page-main.tsx @@ -1,3 +1,7 @@ +import arrowLeftIcon from '@tabler/icons/outline/arrow-left.svg'; +import banIcon from '@tabler/icons/outline/ban.svg'; +import infoCircleIcon from '@tabler/icons/outline/info-circle.svg'; +import logoutIcon from '@tabler/icons/outline/logout.svg'; import React, { useRef } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { Link, useHistory, useParams } from 'react-router-dom'; @@ -120,7 +124,7 @@ const ChatPageMain = () => { history.push('/chats')} /> @@ -162,7 +166,7 @@ const ChatPageMain = () => { @@ -213,7 +217,7 @@ const ChatPageMain = () => { className='!px-0 hover:!bg-transparent' >
- + {intl.formatMessage(isBlocking ? messages.unblockUser : messages.blockUser, { acct: chat.account.acct })}
@@ -225,7 +229,7 @@ const ChatPageMain = () => { className='!px-0 hover:!bg-transparent' >
- + {intl.formatMessage(messages.leaveChat)}
diff --git a/src/features/chats/components/chat-page/components/chat-page-new.tsx b/src/features/chats/components/chat-page/components/chat-page-new.tsx index bb5fa407c..3b3e879ed 100644 --- a/src/features/chats/components/chat-page/components/chat-page-new.tsx +++ b/src/features/chats/components/chat-page/components/chat-page-new.tsx @@ -1,3 +1,4 @@ +import arrowLeftIcon from '@tabler/icons/outline/arrow-left.svg'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; @@ -23,7 +24,7 @@ const ChatPageNew: React.FC = () => { history.push('/chats')} /> diff --git a/src/features/chats/components/chat-page/components/chat-page-settings.tsx b/src/features/chats/components/chat-page/components/chat-page-settings.tsx index b04d0def3..099e8c8ce 100644 --- a/src/features/chats/components/chat-page/components/chat-page-settings.tsx +++ b/src/features/chats/components/chat-page/components/chat-page-settings.tsx @@ -1,3 +1,4 @@ +import arrowLeftIcon from '@tabler/icons/outline/arrow-left.svg'; import React, { useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; @@ -50,7 +51,7 @@ const ChatPageSettings = () => { history.push('/chats')} /> diff --git a/src/features/chats/components/chat-page/components/chat-page-sidebar.tsx b/src/features/chats/components/chat-page/components/chat-page-sidebar.tsx index 3f08e1a6b..65db6b536 100644 --- a/src/features/chats/components/chat-page/components/chat-page-sidebar.tsx +++ b/src/features/chats/components/chat-page/components/chat-page-sidebar.tsx @@ -1,3 +1,5 @@ +import editIcon from '@tabler/icons/outline/edit.svg'; +import settingsIcon from '@tabler/icons/outline/settings.svg'; import React, { useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; @@ -42,13 +44,13 @@ const ChatPageSidebar = () => { diff --git a/src/features/chats/components/chat-pane/chat-pane.tsx b/src/features/chats/components/chat-pane/chat-pane.tsx index 1f0dde8f8..031b0becd 100644 --- a/src/features/chats/components/chat-pane/chat-pane.tsx +++ b/src/features/chats/components/chat-pane/chat-pane.tsx @@ -1,3 +1,4 @@ +import editIcon from '@tabler/icons/outline/edit.svg'; import React, { useState } from 'react'; import { FormattedMessage } from 'react-intl'; @@ -111,7 +112,7 @@ const ChatPane = () => { toggleChatPane(); } }} - secondaryActionIcon={require('@tabler/icons/outline/edit.svg')} + secondaryActionIcon={editIcon} /> {isOpen ? renderBody() : null} diff --git a/src/features/chats/components/chat-search-input.tsx b/src/features/chats/components/chat-search-input.tsx index 45728cd79..6737d9783 100644 --- a/src/features/chats/components/chat-search-input.tsx +++ b/src/features/chats/components/chat-search-input.tsx @@ -1,3 +1,5 @@ +import searchIcon from '@tabler/icons/outline/search.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -34,7 +36,7 @@ const ChatSearchInput: React.FC = ({ value, onChange, onClear append={ ); diff --git a/src/features/chats/components/chat-widget/chat-pane-header.tsx b/src/features/chats/components/chat-widget/chat-pane-header.tsx index 5cff70014..76130c690 100644 --- a/src/features/chats/components/chat-widget/chat-pane-header.tsx +++ b/src/features/chats/components/chat-widget/chat-pane-header.tsx @@ -1,3 +1,5 @@ +import chevronDownIcon from '@tabler/icons/outline/chevron-down.svg'; +import chevronUpIcon from '@tabler/icons/outline/chevron-up.svg'; import React, { HTMLAttributes } from 'react'; import { HStack, IconButton, Text } from 'soapbox/components/ui'; @@ -65,7 +67,7 @@ const ChatPaneHeader = (props: IChatPaneHeader) => { diff --git a/src/features/chats/components/chat-widget/chat-settings.tsx b/src/features/chats/components/chat-widget/chat-settings.tsx index 6c337f60c..40a4d6f74 100644 --- a/src/features/chats/components/chat-widget/chat-settings.tsx +++ b/src/features/chats/components/chat-widget/chat-settings.tsx @@ -1,3 +1,6 @@ +import arrowLeftIcon from '@tabler/icons/outline/arrow-left.svg'; +import banIcon from '@tabler/icons/outline/ban.svg'; +import logoutIcon from '@tabler/icons/outline/logout.svg'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -95,7 +98,7 @@ const ChatSettings = () => { @@ -136,13 +139,13 @@ const ChatSettings = () => { {features.chatsDelete && ( )} diff --git a/src/features/chats/components/chat-widget/chat-window.tsx b/src/features/chats/components/chat-widget/chat-window.tsx index 1e9ca007f..cd3f6c931 100644 --- a/src/features/chats/components/chat-widget/chat-window.tsx +++ b/src/features/chats/components/chat-widget/chat-window.tsx @@ -1,3 +1,6 @@ +import arrowLeftIcon from '@tabler/icons/outline/arrow-left.svg'; +import editIcon from '@tabler/icons/outline/edit.svg'; +import infoCircleIcon from '@tabler/icons/outline/info-circle.svg'; import React, { useRef } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -72,7 +75,7 @@ const ChatWindow = () => { {isOpen && ( @@ -107,7 +110,7 @@ const ChatWindow = () => { } secondaryAction={secondaryAction()} - secondaryActionIcon={isOpen ? require('@tabler/icons/outline/info-circle.svg') : require('@tabler/icons/outline/edit.svg')} + secondaryActionIcon={isOpen ? infoCircleIcon : editIcon} isToggleable={!isOpen} isOpen={isOpen} onToggle={toggleChatPane} diff --git a/src/features/chats/components/chat-widget/headers/chat-search-header.tsx b/src/features/chats/components/chat-widget/headers/chat-search-header.tsx index 81828f51f..cf76a6442 100644 --- a/src/features/chats/components/chat-widget/headers/chat-search-header.tsx +++ b/src/features/chats/components/chat-widget/headers/chat-search-header.tsx @@ -1,3 +1,4 @@ +import arrowLeftIcon from '@tabler/icons/outline/arrow-left.svg'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -26,7 +27,7 @@ const ChatSearchHeader = () => { }} > diff --git a/src/features/compose/components/compose-form.tsx b/src/features/compose/components/compose-form.tsx index 8b0f7b19a..af8218509 100644 --- a/src/features/compose/components/compose-form.tsx +++ b/src/features/compose/components/compose-form.tsx @@ -1,3 +1,5 @@ +import lockIcon from '@tabler/icons/outline/lock.svg'; +import mailIcon from '@tabler/icons/outline/mail.svg'; import clsx from 'clsx'; import { CLEAR_EDITOR_COMMAND, TextNode, type LexicalEditor, $getRoot } from 'lexical'; import React, { Suspense, useCallback, useEffect, useRef, useState } from 'react'; @@ -229,10 +231,10 @@ const ComposeForm = ({ id, shouldCondense, autoFocus, clickab if (isEditing) { publishText = intl.formatMessage(messages.saveChanges); } else if (privacy === 'direct') { - publishIcon = require('@tabler/icons/outline/mail.svg'); + publishIcon = mailIcon; publishText = intl.formatMessage(messages.message); } else if (privacy === 'private') { - publishIcon = require('@tabler/icons/outline/lock.svg'); + publishIcon = lockIcon; publishText = intl.formatMessage(messages.publish); } else { publishText = privacy !== 'unlisted' ? intl.formatMessage(messages.publishLoud, { publish: intl.formatMessage(messages.publish) }) : intl.formatMessage(messages.publish); diff --git a/src/features/compose/components/markdown-button.tsx b/src/features/compose/components/markdown-button.tsx index daedd132b..62e3621b7 100644 --- a/src/features/compose/components/markdown-button.tsx +++ b/src/features/compose/components/markdown-button.tsx @@ -1,3 +1,4 @@ +import markdownIcon from '@tabler/icons/outline/markdown.svg'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -25,7 +26,7 @@ const MarkdownButton: React.FC = ({ composeId }) => { return ( = ({ composeId, disabled }) => { return ( = ({ const [placement, setPlacement] = useState('bottom'); const options = [ - { icon: require('@tabler/icons/outline/world.svg'), value: 'public', text: intl.formatMessage(messages.public_short), meta: intl.formatMessage(messages.public_long) }, - { icon: require('@tabler/icons/outline/lock-open.svg'), value: 'unlisted', text: intl.formatMessage(messages.unlisted_short), meta: intl.formatMessage(messages.unlisted_long) }, - { icon: require('@tabler/icons/outline/lock.svg'), value: 'private', text: intl.formatMessage(messages.private_short), meta: intl.formatMessage(messages.private_long) }, - { icon: require('@tabler/icons/outline/mail.svg'), value: 'direct', text: intl.formatMessage(messages.direct_short), meta: intl.formatMessage(messages.direct_long) }, + { icon: worldIcon, value: 'public', text: intl.formatMessage(messages.public_short), meta: intl.formatMessage(messages.public_long) }, + { icon: lockOpenIcon, value: 'unlisted', text: intl.formatMessage(messages.unlisted_short), meta: intl.formatMessage(messages.unlisted_long) }, + { icon: lockIcon, value: 'private', text: intl.formatMessage(messages.private_short), meta: intl.formatMessage(messages.private_long) }, + { icon: mailIcon, value: 'direct', text: intl.formatMessage(messages.direct_short), meta: intl.formatMessage(messages.direct_long) }, ]; const onChange = (value: string | null) => value && dispatch(changeComposeVisibility(composeId, value)); diff --git a/src/features/compose/components/reply-indicator.tsx b/src/features/compose/components/reply-indicator.tsx index 4ed3db70e..694ace5cb 100644 --- a/src/features/compose/components/reply-indicator.tsx +++ b/src/features/compose/components/reply-indicator.tsx @@ -1,3 +1,4 @@ +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import React from 'react'; @@ -29,7 +30,7 @@ const ReplyIndicator: React.FC = ({ className, status, hideActi if (!hideActions && onCancel) { actions = { onActionClick: handleClick, - actionIcon: require('@tabler/icons/outline/x.svg'), + actionIcon: xIcon, actionAlignment: 'top', actionTitle: 'Dismiss', }; diff --git a/src/features/compose/components/schedule-button.tsx b/src/features/compose/components/schedule-button.tsx index cf4e8bbbf..65ebce9a7 100644 --- a/src/features/compose/components/schedule-button.tsx +++ b/src/features/compose/components/schedule-button.tsx @@ -1,3 +1,4 @@ +import calendarStatsIcon from '@tabler/icons/outline/calendar-stats.svg'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -39,7 +40,7 @@ const ScheduleButton: React.FC = ({ composeId, disabled }) => { return ( = ({ composeId }) => { diff --git a/src/features/compose/components/search-results.tsx b/src/features/compose/components/search-results.tsx index 87e85fd1f..a6cc2df1a 100644 --- a/src/features/compose/components/search-results.tsx +++ b/src/features/compose/components/search-results.tsx @@ -1,3 +1,4 @@ +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import React, { useEffect, useRef } from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -213,7 +214,7 @@ const SearchResults = () => { <> {filterByAccount ? ( - + { > diff --git a/src/features/compose/components/search.tsx b/src/features/compose/components/search.tsx index b91438a2d..8c48c15b6 100644 --- a/src/features/compose/components/search.tsx +++ b/src/features/compose/components/search.tsx @@ -1,3 +1,5 @@ +import searchIcon from '@tabler/icons/outline/search.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import debounce from 'lodash/debounce'; import React, { useCallback, useEffect } from 'react'; @@ -111,7 +113,7 @@ const Search = (props: ISearch) => { const makeMenu = () => [ { text: intl.formatMessage(messages.action, { query: value }), - icon: require('@tabler/icons/outline/search.svg'), + icon: searchIcon, action: handleSubmit, }, ]; @@ -166,12 +168,12 @@ const Search = (props: ISearch) => { onClick={handleClear} > diff --git a/src/features/compose/components/spoiler-button.tsx b/src/features/compose/components/spoiler-button.tsx index 235209a83..38eca8177 100644 --- a/src/features/compose/components/spoiler-button.tsx +++ b/src/features/compose/components/spoiler-button.tsx @@ -1,3 +1,4 @@ +import alertTriangleIcon from '@tabler/icons/outline/alert-triangle.svg'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -26,7 +27,7 @@ const SpoilerButton: React.FC = ({ composeId }) => { return ( = ({ const src = icon || ( onlyImages(attachmentTypes) - ? require('@tabler/icons/outline/photo.svg') - : require('@tabler/icons/outline/paperclip.svg') + ? photoIcon + : paperclipIcon ); return ( diff --git a/src/features/crypto-donate/components/crypto-address.tsx b/src/features/crypto-donate/components/crypto-address.tsx index 0c07387eb..fa6f4c0ba 100644 --- a/src/features/crypto-donate/components/crypto-address.tsx +++ b/src/features/crypto-donate/components/crypto-address.tsx @@ -1,3 +1,5 @@ +import externalLinkIcon from '@tabler/icons/outline/external-link.svg'; +import qrcodeIcon from '@tabler/icons/outline/qrcode.svg'; import React from 'react'; import { openModal } from 'soapbox/actions/modals'; @@ -42,12 +44,12 @@ const CryptoAddress: React.FC = (props): JSX.Element => { - + {explorerUrl && ( - + )} diff --git a/src/features/crypto-donate/components/detailed-crypto-address.tsx b/src/features/crypto-donate/components/detailed-crypto-address.tsx index 554c05ade..29d70ae07 100644 --- a/src/features/crypto-donate/components/detailed-crypto-address.tsx +++ b/src/features/crypto-donate/components/detailed-crypto-address.tsx @@ -1,3 +1,4 @@ +import externalLinkIcon from '@tabler/icons/outline/external-link.svg'; import { QRCodeCanvas as QRCode } from 'qrcode.react'; import React from 'react'; @@ -30,7 +31,7 @@ const DetailedCryptoAddress: React.FC = ({ address, tick
{title || ticker.toUpperCase()}
{explorerUrl && - + }
diff --git a/src/features/developers/developers-menu.tsx b/src/features/developers/developers-menu.tsx index 185f289b2..37b0718d9 100644 --- a/src/features/developers/developers-menu.tsx +++ b/src/features/developers/developers-menu.tsx @@ -1,3 +1,11 @@ +import appsIcon from '@tabler/icons/outline/apps.svg'; +import codePlusIcon from '@tabler/icons/outline/code-plus.svg'; +import homeIcon from '@tabler/icons/outline/home.svg'; +import logoutIcon from '@tabler/icons/outline/logout.svg'; +import moodSadIcon from '@tabler/icons/outline/mood-sad.svg'; +import refreshIcon from '@tabler/icons/outline/refresh.svg'; +import scriptIcon from '@tabler/icons/outline/script.svg'; +import urgentIcon from '@tabler/icons/outline/urgent.svg'; import React from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; import { Link, useHistory } from 'react-router-dom'; @@ -57,7 +65,7 @@ const Developers: React.FC = () => {
- + @@ -65,7 +73,7 @@ const Developers: React.FC = () => { - + @@ -73,7 +81,7 @@ const Developers: React.FC = () => { - + @@ -81,7 +89,7 @@ const Developers: React.FC = () => { - + @@ -89,7 +97,7 @@ const Developers: React.FC = () => { - + @@ -97,7 +105,7 @@ const Developers: React.FC = () => { - + @@ -105,7 +113,7 @@ const Developers: React.FC = () => { - + @@ -113,7 +121,7 @@ const Developers: React.FC = () => { - + diff --git a/src/features/developers/service-worker-info.tsx b/src/features/developers/service-worker-info.tsx index 69f36bac6..7b786e95f 100644 --- a/src/features/developers/service-worker-info.tsx +++ b/src/features/developers/service-worker-info.tsx @@ -1,3 +1,4 @@ +import externalLinkIcon from '@tabler/icons/outline/external-link.svg'; import React, { useEffect, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -120,7 +121,7 @@ const ServiceWorkerInfo: React.FC = () => { {url} diff --git a/src/features/edit-identity/index.tsx b/src/features/edit-identity/index.tsx index e124316b6..3e27f5c2f 100644 --- a/src/features/edit-identity/index.tsx +++ b/src/features/edit-identity/index.tsx @@ -1,3 +1,4 @@ +import atIcon from '@tabler/icons/outline/at.svg'; import { useMutation, useQuery } from '@tanstack/react-query'; import React, { useEffect, useState } from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -169,7 +170,7 @@ const UsernameInput: React.FC> = (props) => { placeholder={intl.formatMessage(messages.username)} append={( - + {instance.domain} )} diff --git a/src/features/edit-profile/components/avatar-picker.tsx b/src/features/edit-profile/components/avatar-picker.tsx index 7e0a8e0fb..18d5d6ffa 100644 --- a/src/features/edit-profile/components/avatar-picker.tsx +++ b/src/features/edit-profile/components/avatar-picker.tsx @@ -1,3 +1,4 @@ +import cameraPlusIcon from '@tabler/icons/outline/camera-plus.svg'; import clsx from 'clsx'; import React, { useRef } from 'react'; import { FormattedMessage } from 'react-intl'; @@ -43,7 +44,7 @@ const AvatarPicker = React.forwardRef(({ classNam })} > diff --git a/src/features/edit-profile/components/header-picker.tsx b/src/features/edit-profile/components/header-picker.tsx index bf27afc17..88a8b2069 100644 --- a/src/features/edit-profile/components/header-picker.tsx +++ b/src/features/edit-profile/components/header-picker.tsx @@ -1,3 +1,5 @@ +import photoPlusIcon from '@tabler/icons/outline/photo-plus.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import React, { useRef } from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -55,7 +57,7 @@ const HeaderPicker = React.forwardRef(({ src, onC justifyContent='center' > @@ -76,7 +78,7 @@ const HeaderPicker = React.forwardRef(({ src, onC {onClear && src && ( { - return require('emoji-datasource/img/twitter/sheets/32.png'); -}; +const getSpritesheetURL = () => spriteSheet; const getImageURL = (set: string, name: string) => { return joinPublicPath(`/packs/emoji/${name}.svg`); diff --git a/src/features/emoji/containers/emoji-picker-dropdown-container.tsx b/src/features/emoji/containers/emoji-picker-dropdown-container.tsx index 51ade8de2..b38f332f7 100644 --- a/src/features/emoji/containers/emoji-picker-dropdown-container.tsx +++ b/src/features/emoji/containers/emoji-picker-dropdown-container.tsx @@ -1,4 +1,5 @@ import { useFloating, shift } from '@floating-ui/react'; +import moodHappyIcon from '@tabler/icons/outline/mood-happy.svg'; import clsx from 'clsx'; import React, { KeyboardEvent, useState } from 'react'; import { createPortal } from 'react-dom'; @@ -40,7 +41,7 @@ const EmojiPickerDropdownContainer = ( 'text-gray-600 hover:text-gray-700 dark:hover:text-gray-500': true, })} ref={refs.setReference} - src={require('@tabler/icons/outline/mood-happy.svg')} + src={moodHappyIcon} title={title} aria-label={title} aria-expanded={visible} diff --git a/src/features/event/components/event-action-button.tsx b/src/features/event/components/event-action-button.tsx index 413942eed..7dcb6a7b7 100644 --- a/src/features/event/components/event-action-button.tsx +++ b/src/features/event/components/event-action-button.tsx @@ -1,3 +1,5 @@ +import banIcon from '@tabler/icons/outline/ban.svg'; +import checkIcon from '@tabler/icons/outline/check.svg'; import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -70,14 +72,14 @@ const EventActionButton: React.FC = ({ status, theme = 'secondary' switch (event.join_state) { case 'accept': buttonLabel = ; - buttonIcon = require('@tabler/icons/outline/check.svg'); + buttonIcon = checkIcon; break; case 'pending': buttonLabel = ; break; case 'reject': buttonLabel = ; - buttonIcon = require('@tabler/icons/outline/ban.svg'); + buttonIcon = banIcon; buttonDisabled = true; break; default: diff --git a/src/features/event/components/event-date.tsx b/src/features/event/components/event-date.tsx index 978f49213..e657bf4de 100644 --- a/src/features/event/components/event-date.tsx +++ b/src/features/event/components/event-date.tsx @@ -1,3 +1,4 @@ +import calendarIcon from '@tabler/icons/outline/calendar.svg'; import React from 'react'; import { FormattedDate } from 'react-intl'; @@ -50,7 +51,7 @@ const EventDate: React.FC = ({ status }) => { return ( - + {date} ); diff --git a/src/features/event/components/event-header.tsx b/src/features/event/components/event-header.tsx index cd21a2565..624fe727d 100644 --- a/src/features/event/components/event-header.tsx +++ b/src/features/event/components/event-header.tsx @@ -1,3 +1,26 @@ +import alertTriangleIcon from '@tabler/icons/outline/alert-triangle.svg'; +import atIcon from '@tabler/icons/outline/at.svg'; +import banIcon from '@tabler/icons/outline/ban.svg'; +import bookmarkOffIcon from '@tabler/icons/outline/bookmark-off.svg'; +import bookmarkIcon from '@tabler/icons/outline/bookmark.svg'; +import calendarPlusIcon from '@tabler/icons/outline/calendar-plus.svg'; +import circleXIcon from '@tabler/icons/outline/circle-x.svg'; +import dotsIcon from '@tabler/icons/outline/dots.svg'; +import externalLinkIcon from '@tabler/icons/outline/external-link.svg'; +import flag3Icon from '@tabler/icons/outline/flag-3.svg'; +import flagIcon from '@tabler/icons/outline/flag.svg'; +import gavelIcon from '@tabler/icons/outline/gavel.svg'; +import linkIcon from '@tabler/icons/outline/link.svg'; +import mailIcon from '@tabler/icons/outline/mail.svg'; +import mapPinIcon from '@tabler/icons/outline/map-pin.svg'; +import messagesIcon from '@tabler/icons/outline/messages.svg'; +import pencilIcon from '@tabler/icons/outline/pencil.svg'; +import pinIcon from '@tabler/icons/outline/pin.svg'; +import pinnedOffIcon from '@tabler/icons/outline/pinned-off.svg'; +import quoteIcon from '@tabler/icons/outline/quote.svg'; +import repeatIcon from '@tabler/icons/outline/repeat.svg'; +import trashIcon from '@tabler/icons/outline/trash.svg'; +import usersIcon from '@tabler/icons/outline/users.svg'; import { List as ImmutableList } from 'immutable'; import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -136,7 +159,7 @@ const EventHeader: React.FC = ({ status }) => { const handleDeleteClick = () => { dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, heading: intl.formatMessage(messages.deleteHeading), message: intl.formatMessage(messages.deleteMessage), confirm: intl.formatMessage(messages.deleteConfirm), @@ -162,7 +185,7 @@ const EventHeader: React.FC = ({ status }) => { const handleBlockClick = () => { dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, heading: , message: {/* eslint-disable-line formatjs/no-literal-string-in-jsx */}@{account.acct} }} />, confirm: intl.formatMessage(messages.blockConfirm), @@ -202,19 +225,19 @@ const EventHeader: React.FC = ({ status }) => { { text: intl.formatMessage(messages.exportIcs), action: handleExportClick, - icon: require('@tabler/icons/outline/calendar-plus.svg'), + icon: calendarPlusIcon, }, { text: intl.formatMessage(messages.copy), action: handleCopy, - icon: require('@tabler/icons/outline/link.svg'), + icon: linkIcon, }, ]; if (features.federating && !account.local) { menu.push({ text: intl.formatMessage(messages.external, { domain }), - icon: require('@tabler/icons/outline/external-link.svg'), + icon: externalLinkIcon, href: status.uri, target: '_blank', }); @@ -226,7 +249,7 @@ const EventHeader: React.FC = ({ status }) => { menu.push({ text: intl.formatMessage(status.bookmarked ? messages.unbookmark : messages.bookmark), action: handleBookmarkClick, - icon: status.bookmarked ? require('@tabler/icons/outline/bookmark-off.svg') : require('@tabler/icons/outline/bookmark.svg'), + icon: status.bookmarked ? bookmarkOffIcon : bookmarkIcon, }); } @@ -234,14 +257,14 @@ const EventHeader: React.FC = ({ status }) => { menu.push({ text: intl.formatMessage(status.reblogged ? messages.unreblog : messages.reblog), action: handleReblogClick, - icon: require('@tabler/icons/outline/repeat.svg'), + icon: repeatIcon, }); if (features.quotePosts) { menu.push({ text: intl.formatMessage(messages.quotePost), action: handleQuoteClick, - icon: require('@tabler/icons/outline/quote.svg'), + icon: quoteIcon, }); } } @@ -253,34 +276,34 @@ const EventHeader: React.FC = ({ status }) => { menu.push({ text: intl.formatMessage(status.pinned ? messages.unpin : messages.pin), action: handlePinClick, - icon: status.pinned ? require('@tabler/icons/outline/pinned-off.svg') : require('@tabler/icons/outline/pin.svg'), + icon: status.pinned ? pinnedOffIcon : pinIcon, }); } menu.push({ text: intl.formatMessage(messages.delete), action: handleDeleteClick, - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, destructive: true, }); } else { menu.push({ text: intl.formatMessage(messages.mention, { name: username }), action: handleMentionClick, - icon: require('@tabler/icons/outline/at.svg'), + icon: atIcon, }); if (status.getIn(['account', 'pleroma', 'accepts_chat_messages']) === true) { menu.push({ text: intl.formatMessage(messages.chat, { name: username }), action: handleChatClick, - icon: require('@tabler/icons/outline/messages.svg'), + icon: messagesIcon, }); } else if (features.privacyScopes) { menu.push({ text: intl.formatMessage(messages.direct, { name: username }), action: handleDirectClick, - icon: require('@tabler/icons/outline/mail.svg'), + icon: mailIcon, }); } @@ -288,17 +311,17 @@ const EventHeader: React.FC = ({ status }) => { menu.push({ text: intl.formatMessage(messages.mute, { name: username }), action: handleMuteClick, - icon: require('@tabler/icons/outline/circle-x.svg'), + icon: circleXIcon, }); menu.push({ text: intl.formatMessage(messages.block, { name: username }), action: handleBlockClick, - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, }); menu.push({ text: intl.formatMessage(messages.report, { name: username }), action: handleReport, - icon: require('@tabler/icons/outline/flag.svg'), + icon: flagIcon, }); } @@ -308,28 +331,28 @@ const EventHeader: React.FC = ({ status }) => { menu.push({ text: intl.formatMessage(messages.adminAccount, { name: account.username }), action: handleModerate, - icon: require('@tabler/icons/outline/gavel.svg'), + icon: gavelIcon, }); if (isAdmin) { menu.push({ text: intl.formatMessage(messages.adminStatus), action: handleModerateStatus, - icon: require('@tabler/icons/outline/pencil.svg'), + icon: pencilIcon, }); } menu.push({ text: intl.formatMessage(status.sensitive === false ? messages.markStatusSensitive : messages.markStatusNotSensitive), action: handleToggleStatusSensitivity, - icon: require('@tabler/icons/outline/alert-triangle.svg'), + icon: alertTriangleIcon, }); if (account.id !== ownAccount?.id) { menu.push({ text: intl.formatMessage(messages.deleteStatus), action: handleDeleteStatus, - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, destructive: true, }); } @@ -378,7 +401,7 @@ const EventHeader: React.FC = ({ status }) => { = ({ status }) => { - + = ({ status }) => { - + = ({ status }) => { {event.location && ( - + {event.location.get('name')} diff --git a/src/features/event/event-information.tsx b/src/features/event/event-information.tsx index d84d6096b..bcb13c9e4 100644 --- a/src/features/event/event-information.tsx +++ b/src/features/event/event-information.tsx @@ -1,3 +1,6 @@ +import calendarIcon from '@tabler/icons/outline/calendar.svg'; +import linkIcon from '@tabler/icons/outline/link.svg'; +import mapPinIcon from '@tabler/icons/outline/map-pin.svg'; import React, { useCallback, useEffect, useState } from 'react'; import { FormattedDate, FormattedMessage } from 'react-intl'; @@ -102,7 +105,7 @@ const EventInformation: React.FC = ({ params }) => { - + {text} @@ -125,7 +128,7 @@ const EventInformation: React.FC = ({ params }) => { - + = ({ params }) => { {status.event.links.map(link => ( - + {(link.remote_url || link.url).replace(/^https?:\/\//, '')} diff --git a/src/features/events/components/event-carousel.tsx b/src/features/events/components/event-carousel.tsx index 85768ff07..f22619651 100644 --- a/src/features/events/components/event-carousel.tsx +++ b/src/features/events/components/event-carousel.tsx @@ -1,3 +1,5 @@ +import chevronLeftIcon from '@tabler/icons/outline/chevron-left.svg'; +import chevronRightIcon from '@tabler/icons/outline/chevron-right.svg'; import React, { useCallback, useState } from 'react'; import { Link } from 'react-router-dom'; import ReactSwipeableViews from 'react-swipeable-views'; @@ -59,7 +61,7 @@ const EventCarousel: React.FC = ({ statusIds, isLoading, emptyMe onClick={() => handleChangeIndex(index - 1)} className='flex size-8 items-center justify-center rounded-full bg-white/50 backdrop-blur dark:bg-gray-900/50' > - +
)} @@ -72,7 +74,7 @@ const EventCarousel: React.FC = ({ statusIds, isLoading, emptyMe onClick={() => handleChangeIndex(index + 1)} className='flex size-8 items-center justify-center rounded-full bg-white/50 backdrop-blur dark:bg-gray-900/50' > - + )} diff --git a/src/features/federation-restrictions/components/instance-restrictions.tsx b/src/features/federation-restrictions/components/instance-restrictions.tsx index 938502ae8..f0f38dc58 100644 --- a/src/features/federation-restrictions/components/instance-restrictions.tsx +++ b/src/features/federation-restrictions/components/instance-restrictions.tsx @@ -1,3 +1,10 @@ +import eyeOffIcon from '@tabler/icons/outline/eye-off.svg'; +import lockOpenIcon from '@tabler/icons/outline/lock-open.svg'; +import lockIcon from '@tabler/icons/outline/lock.svg'; +import photoOffIcon from '@tabler/icons/outline/photo-off.svg'; +import shieldCheckIcon from '@tabler/icons/outline/shield-check.svg'; +import shieldLockIcon from '@tabler/icons/outline/shield-lock.svg'; +import shieldXIcon from '@tabler/icons/outline/shield-x.svg'; import React from 'react'; import { FormattedMessage } from 'react-intl'; @@ -53,7 +60,7 @@ const InstanceRestrictions: React.FC = ({ remoteInstance if (followers_only) { items.push(( - + = ({ remoteInstance )); } else if (federated_timeline_removal) { items.push(( - + = ({ remoteInstance if (fullMediaRemoval) { items.push(( - + = ({ remoteInstance )); } else if (partialMediaRemoval) { items.push(( - + = ({ remoteInstance if (!fullMediaRemoval && media_nsfw) { items.push(( - + = ({ remoteInstance if (remoteInstance.federation.reject === true) { return ( - + = ({ remoteInstance } else if (hasRestrictions(remoteInstance)) { return ( <> - + = ({ remoteInstance ); } else { return ( - + = ({ host }) => { return ( diff --git a/src/features/group/components/group-header.tsx b/src/features/group/components/group-header.tsx index 3cb84d4b8..5d28a9939 100644 --- a/src/features/group/components/group-header.tsx +++ b/src/features/group/components/group-header.tsx @@ -1,3 +1,4 @@ +import photoOffIcon from '@tabler/icons/outline/photo-off.svg'; import { List as ImmutableList } from 'immutable'; import React, { useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -112,7 +113,7 @@ const GroupHeader: React.FC = ({ group }) => { className='flex h-32 w-full items-center justify-center bg-gray-200 dark:bg-gray-800/30 md:rounded-t-xl lg:h-52' > {isHeaderMissing ? ( - + ) : header} ); diff --git a/src/features/group/components/group-member-list-item.tsx b/src/features/group/components/group-member-list-item.tsx index f1102965c..5e3ec2637 100644 --- a/src/features/group/components/group-member-list-item.tsx +++ b/src/features/group/components/group-member-list-item.tsx @@ -1,3 +1,6 @@ +import banIcon from '@tabler/icons/outline/ban.svg'; +import briefcaseIcon from '@tabler/icons/outline/briefcase.svg'; +import userMinusIcon from '@tabler/icons/outline/user-minus.svg'; import clsx from 'clsx'; import React, { useMemo } from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -137,13 +140,13 @@ const GroupMemberListItem = (props: IGroupMemberListItem) => { if (isMemberUser) { items.push({ text: intl.formatMessage(messages.groupModPromoteMod, { role: GroupRoles.ADMIN }), - icon: require('@tabler/icons/outline/briefcase.svg'), + icon: briefcaseIcon, action: handleAdminAssignment, }); } else if (isMemberAdmin) { items.push({ text: intl.formatMessage(messages.groupModDemote, { role: GroupRoles.ADMIN, name: account.username }), - icon: require('@tabler/icons/outline/briefcase.svg'), + icon: briefcaseIcon, action: handleUserAssignment, destructive: true, }); @@ -158,14 +161,14 @@ const GroupMemberListItem = (props: IGroupMemberListItem) => { if (features.groupsKick) { items.push({ text: intl.formatMessage(messages.groupModKick, { name: account.username }), - icon: require('@tabler/icons/outline/user-minus.svg'), + icon: userMinusIcon, action: handleKickFromGroup, }); } items.push({ text: intl.formatMessage(messages.groupModBlock, { name: account.username }), - icon: require('@tabler/icons/outline/ban.svg'), + icon: banIcon, action: handleBlockFromGroup, destructive: true, }); diff --git a/src/features/group/components/group-options-button.tsx b/src/features/group/components/group-options-button.tsx index c52bc1eaa..64b25ef21 100644 --- a/src/features/group/components/group-options-button.tsx +++ b/src/features/group/components/group-options-button.tsx @@ -1,3 +1,8 @@ +import dotsIcon from '@tabler/icons/outline/dots.svg'; +import flagIcon from '@tabler/icons/outline/flag.svg'; +import logoutIcon from '@tabler/icons/outline/logout.svg'; +import shareIcon from '@tabler/icons/outline/share.svg'; +import volume3Icon from '@tabler/icons/outline/volume-3.svg'; import React, { useMemo } from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -98,7 +103,7 @@ const GroupOptionsButton = ({ group }: IGroupActionButton) => { if (canShare) { items.push({ text: intl.formatMessage(messages.share), - icon: require('@tabler/icons/outline/share.svg'), + icon: shareIcon, action: handleShare, }); } @@ -106,7 +111,7 @@ const GroupOptionsButton = ({ group }: IGroupActionButton) => { if (isInGroup) { items.push({ text: isMuting ? intl.formatMessage(messages.unmute) : intl.formatMessage(messages.mute), - icon: require('@tabler/icons/outline/volume-3.svg'), + icon: volume3Icon, action: isMuting ? handleUnmute : handleMute, }); } @@ -114,7 +119,7 @@ const GroupOptionsButton = ({ group }: IGroupActionButton) => { if (isMember || isAdmin) { items.push({ text: intl.formatMessage(messages.report), - icon: require('@tabler/icons/outline/flag.svg'), + icon: flagIcon, action: () => dispatch(initReport(ReportableEntities.GROUP, account as Account, { group })), }); } @@ -123,7 +128,7 @@ const GroupOptionsButton = ({ group }: IGroupActionButton) => { items.push(null); items.push({ text: intl.formatMessage(messages.leave), - icon: require('@tabler/icons/outline/logout.svg'), + icon: logoutIcon, action: handleLeave, }); } @@ -138,7 +143,7 @@ const GroupOptionsButton = ({ group }: IGroupActionButton) => { return ( ( @@ -49,8 +51,8 @@ const GroupPrivacy = ({ group }: IGroupPolicy) => ( className='size-4' src={ group.locked - ? require('@tabler/icons/outline/lock.svg') - : require('@tabler/icons/outline/world.svg') + ? lockIcon + : worldIcon } /> diff --git a/src/features/group/components/group-relationship.tsx b/src/features/group/components/group-relationship.tsx index ebcdc017d..69a6a957c 100644 --- a/src/features/group/components/group-relationship.tsx +++ b/src/features/group/components/group-relationship.tsx @@ -1,3 +1,5 @@ +import gavelIcon from '@tabler/icons/outline/gavel.svg'; +import usersIcon from '@tabler/icons/outline/users.svg'; import React from 'react'; import { FormattedMessage } from 'react-intl'; @@ -28,8 +30,8 @@ const GroupRelationship = ({ group }: IGroupRelationship) => { className='size-4' src={ isOwner - ? require('@tabler/icons/outline/users.svg') - : require('@tabler/icons/outline/gavel.svg') + ? usersIcon + : gavelIcon } /> diff --git a/src/features/group/components/group-tag-list-item.tsx b/src/features/group/components/group-tag-list-item.tsx index 3680f5afd..572e995a5 100644 --- a/src/features/group/components/group-tag-list-item.tsx +++ b/src/features/group/components/group-tag-list-item.tsx @@ -1,3 +1,7 @@ +import pinFilledIcon from '@tabler/icons/filled/pin.svg'; +import eyeOffIcon from '@tabler/icons/outline/eye-off.svg'; +import eyeIcon from '@tabler/icons/outline/eye.svg'; +import pinIcon from '@tabler/icons/outline/pin.svg'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -87,7 +91,7 @@ const GroupTagListItem = (props: IGroupMemberListItem) => { if (!isOwner && tag.pinned) { return ( @@ -112,8 +116,8 @@ const GroupTagListItem = (props: IGroupMemberListItem) => { theme='transparent' src={ tag.pinned ? - require('@tabler/icons/filled/pin.svg') : - require('@tabler/icons/outline/pin.svg') + pinFilledIcon : + pinIcon } iconClassName='h-5 w-5 text-primary-500 dark:text-accent-blue' data-testid='pin-icon' @@ -128,7 +132,7 @@ const GroupTagListItem = (props: IGroupMemberListItem) => { @@ -185,8 +189,8 @@ const GroupTagListItem = (props: IGroupMemberListItem) => { theme='transparent' src={ tag.visible ? - require('@tabler/icons/outline/eye.svg') : - require('@tabler/icons/outline/eye-off.svg') + eyeIcon : + eyeOffIcon } iconClassName='h-5 w-5 text-primary-500 dark:text-accent-blue' /> diff --git a/src/features/group/edit-group.tsx b/src/features/group/edit-group.tsx index a23cae445..4b5fa5062 100644 --- a/src/features/group/edit-group.tsx +++ b/src/features/group/edit-group.tsx @@ -1,3 +1,4 @@ +import lockIcon from '@tabler/icons/outline/lock.svg'; import React, { useEffect, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -115,7 +116,7 @@ const EditGroup: React.FC = ({ params: { groupId } }) => { placeholder={intl.formatMessage(messages.groupNamePlaceholder)} maxLength={maxName} {...displayName} - append={} + append={} disabled /> diff --git a/src/features/group/group-tag-timeline.tsx b/src/features/group/group-tag-timeline.tsx index 92b25bfaa..b5caee49d 100644 --- a/src/features/group/group-tag-timeline.tsx +++ b/src/features/group/group-tag-timeline.tsx @@ -1,3 +1,4 @@ +import message2Icon from '@tabler/icons/outline/message-2.svg'; import React, { useEffect } from 'react'; import { FormattedMessage } from 'react-intl'; @@ -50,7 +51,7 @@ const GroupTagTimeline: React.FC = (props) => {
diff --git a/src/features/group/group-tags.tsx b/src/features/group/group-tags.tsx index 6e1951886..f519fbecb 100644 --- a/src/features/group/group-tags.tsx +++ b/src/features/group/group-tags.tsx @@ -1,3 +1,4 @@ +import hashIcon from '@tabler/icons/outline/hash.svg'; import React from 'react'; import { FormattedMessage } from 'react-intl'; @@ -41,7 +42,7 @@ const GroupTopics: React.FC = (props) => {
diff --git a/src/features/group/group-timeline.tsx b/src/features/group/group-timeline.tsx index 656a2f9ba..418f9db62 100644 --- a/src/features/group/group-timeline.tsx +++ b/src/features/group/group-timeline.tsx @@ -1,3 +1,4 @@ +import message2Icon from '@tabler/icons/outline/message-2.svg'; import clsx from 'clsx'; import React, { useEffect, useRef } from 'react'; import { FormattedMessage, useIntl } from 'react-intl'; @@ -110,7 +111,7 @@ const GroupTimeline: React.FC = (props) => {
diff --git a/src/features/group/manage-group.tsx b/src/features/group/manage-group.tsx index bf857996a..8dafe252e 100644 --- a/src/features/group/manage-group.tsx +++ b/src/features/group/manage-group.tsx @@ -1,3 +1,4 @@ +import trashIcon from '@tabler/icons/outline/trash.svg'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; @@ -61,7 +62,7 @@ const ManageGroup: React.FC = ({ params }) => { const onDeleteGroup = () => dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, heading: intl.formatMessage(messages.deleteHeading), message: intl.formatMessage(messages.deleteMessage), confirm: intl.formatMessage(messages.deleteConfirm), diff --git a/src/features/groups/components/discover/group-list-item.tsx b/src/features/groups/components/discover/group-list-item.tsx index 3294e6312..0b3c56057 100644 --- a/src/features/groups/components/discover/group-list-item.tsx +++ b/src/features/groups/components/discover/group-list-item.tsx @@ -1,3 +1,5 @@ +import lockIcon from '@tabler/icons/outline/lock.svg'; +import worldIcon from '@tabler/icons/outline/world.svg'; import React from 'react'; import { FormattedMessage } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -39,7 +41,7 @@ const GroupListItem = (props: IGroupListItem) => { diff --git a/src/features/groups/components/discover/layout-buttons.tsx b/src/features/groups/components/discover/layout-buttons.tsx index 3500f40a5..dd206975b 100644 --- a/src/features/groups/components/discover/layout-buttons.tsx +++ b/src/features/groups/components/discover/layout-buttons.tsx @@ -1,3 +1,5 @@ +import layoutGridIcon from '@tabler/icons/outline/layout-grid.svg'; +import layoutListIcon from '@tabler/icons/outline/layout-list.svg'; import clsx from 'clsx'; import React from 'react'; @@ -20,7 +22,7 @@ const LayoutButtons = ({ layout, onSelect }: ILayoutButtons) => ( onClick={() => onSelect(GroupLayout.LIST)} > ( onClick={() => onSelect(GroupLayout.GRID)} > {
diff --git a/src/features/groups/discover.tsx b/src/features/groups/discover.tsx index 6b42876c1..062dcdd12 100644 --- a/src/features/groups/discover.tsx +++ b/src/features/groups/discover.tsx @@ -1,3 +1,6 @@ +import arrowLeftIcon from '@tabler/icons/outline/arrow-left.svg'; +import searchIcon from '@tabler/icons/outline/search.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import React, { useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -36,7 +39,7 @@ const Discover: React.FC = () => { {isSearching ? ( { append={ @@ -74,7 +75,7 @@ const GroupFAB: React.FC = () => { diff --git a/src/features/ui/components/instance-info-panel.tsx b/src/features/ui/components/instance-info-panel.tsx index 26a52df84..8f397ca18 100644 --- a/src/features/ui/components/instance-info-panel.tsx +++ b/src/features/ui/components/instance-info-panel.tsx @@ -1,3 +1,5 @@ +import pinIcon from '@tabler/icons/outline/pin.svg'; +import pinnedOffIcon from '@tabler/icons/outline/pinned-off.svg'; import React from 'react'; import { useIntl, defineMessages } from 'react-intl'; @@ -41,7 +43,7 @@ const InstanceInfoPanel: React.FC = ({ host }) => { ); diff --git a/src/features/ui/components/instance-moderation-panel.tsx b/src/features/ui/components/instance-moderation-panel.tsx index 75cb34b05..f64725e69 100644 --- a/src/features/ui/components/instance-moderation-panel.tsx +++ b/src/features/ui/components/instance-moderation-panel.tsx @@ -1,3 +1,5 @@ +import dotsVerticalIcon from '@tabler/icons/outline/dots-vertical.svg'; +import editIcon from '@tabler/icons/outline/edit.svg'; import React from 'react'; import { useIntl, defineMessages, FormattedMessage } from 'react-intl'; @@ -35,7 +37,7 @@ const InstanceModerationPanel: React.FC = ({ host }) = return [{ text: intl.formatMessage(messages.editFederation), action: handleEditFederation, - icon: require('@tabler/icons/outline/edit.svg'), + icon: editIcon, }]; }; @@ -45,7 +47,7 @@ const InstanceModerationPanel: React.FC = ({ host }) = } action={account?.admin ? ( - + ) : undefined} > diff --git a/src/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx b/src/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx index d8df08427..22e3ac915 100644 --- a/src/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx +++ b/src/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx @@ -1,3 +1,4 @@ +import externalLinkIcon from '@tabler/icons/outline/external-link.svg'; import React, { ChangeEventHandler, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -186,7 +187,7 @@ const AccountModerationModal: React.FC = ({ onClose, ac {features.adminFE && ( - diff --git a/src/features/ui/components/modals/boost-modal.tsx b/src/features/ui/components/modals/boost-modal.tsx index 19acf46fe..badb827c2 100644 --- a/src/features/ui/components/modals/boost-modal.tsx +++ b/src/features/ui/components/modals/boost-modal.tsx @@ -1,3 +1,4 @@ +import repeatIcon from '@tabler/icons/outline/repeat.svg'; import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -39,7 +40,7 @@ const BoostModal: React.FC = ({ status, onReblog, onClose }) => { {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} - Shift + }} /> + Shift + }} />
diff --git a/src/features/ui/components/modals/compose-event-modal/compose-event-modal.tsx b/src/features/ui/components/modals/compose-event-modal/compose-event-modal.tsx index 67965c0e2..ac6a035a3 100644 --- a/src/features/ui/components/modals/compose-event-modal/compose-event-modal.tsx +++ b/src/features/ui/components/modals/compose-event-modal/compose-event-modal.tsx @@ -1,3 +1,6 @@ +import mapPinIcon from '@tabler/icons/outline/map-pin.svg'; +import trashIcon from '@tabler/icons/outline/trash.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import React, { useEffect, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -137,7 +140,7 @@ const ComposeEventModal: React.FC = ({ onClose }) => { dispatch((dispatch, getState) => { if (checkEventComposeContent(getState().compose_event)) { dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, heading: id ? : , @@ -177,12 +180,12 @@ const ComposeEventModal: React.FC = ({ onClose }) => { const renderLocation = () => location && ( - + {location.description} {[location.street, location.locality, location.country].filter(val => val?.trim()).join(' · ')} - onChangeLocation(null)} /> + onChangeLocation(null)} /> ); @@ -213,7 +216,7 @@ const ComposeEventModal: React.FC = ({ onClose }) => { {banner ? ( <> - + ) : ( diff --git a/src/features/ui/components/modals/compose-event-modal/upload-button.tsx b/src/features/ui/components/modals/compose-event-modal/upload-button.tsx index c36861a6c..ea8a0bce1 100644 --- a/src/features/ui/components/modals/compose-event-modal/upload-button.tsx +++ b/src/features/ui/components/modals/compose-event-modal/upload-button.tsx @@ -1,3 +1,4 @@ +import photoPlusIcon from '@tabler/icons/outline/photo-plus.svg'; import React, { useRef } from 'react'; import { FormattedMessage } from 'react-intl'; @@ -28,7 +29,7 @@ const UploadButton: React.FC = ({ disabled, onSelectFile }) => { return ( diff --git a/src/features/ui/components/modals/compose-modal.tsx b/src/features/ui/components/modals/compose-modal.tsx index b5fc73c33..ee4965dcb 100644 --- a/src/features/ui/components/modals/compose-modal.tsx +++ b/src/features/ui/components/modals/compose-modal.tsx @@ -1,3 +1,4 @@ +import trashIcon from '@tabler/icons/outline/trash.svg'; import clsx from 'clsx'; import React, { useRef } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -36,7 +37,7 @@ const ComposeModal: React.FC = ({ onClose, composeId = 'compose-m const onClickClose = () => { if (checkComposeContent(compose)) { dispatch(openModal('CONFIRM', { - icon: require('@tabler/icons/outline/trash.svg'), + icon: trashIcon, heading: statusId ? : , diff --git a/src/features/ui/components/modals/edit-bookmark-folder-modal.tsx b/src/features/ui/components/modals/edit-bookmark-folder-modal.tsx index 4ecf6b0e9..e68b98228 100644 --- a/src/features/ui/components/modals/edit-bookmark-folder-modal.tsx +++ b/src/features/ui/components/modals/edit-bookmark-folder-modal.tsx @@ -1,4 +1,5 @@ import { useFloating, shift } from '@floating-ui/react'; +import moodHappyIcon from '@tabler/icons/outline/mood-happy.svg'; import React, { useState } from 'react'; import { createPortal } from 'react-dom'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -58,7 +59,7 @@ const EmojiPicker: React.FC = ({ emoji, emojiUrl, ...props }) => { > {emoji ? - : } + : } {createPortal( diff --git a/src/features/ui/components/modals/event-map-modal.tsx b/src/features/ui/components/modals/event-map-modal.tsx index 2a16a84f3..24bc56193 100644 --- a/src/features/ui/components/modals/event-map-modal.tsx +++ b/src/features/ui/components/modals/event-map-modal.tsx @@ -1,4 +1,8 @@ +import gpsIcon from '@tabler/icons/outline/gps.svg'; import L from 'leaflet'; +import iconRetinaUrl from 'leaflet/dist/images/marker-icon-2x.png'; +import iconUrl from 'leaflet/dist/images/marker-icon.png'; +import shadowUrl from 'leaflet/dist/images/marker-shadow.png'; import React, { useCallback, useEffect, useRef } from 'react'; import { FormattedMessage } from 'react-intl'; @@ -11,9 +15,9 @@ import type { Status as StatusEntity } from 'soapbox/types/entities'; import 'leaflet/dist/leaflet.css'; L.Icon.Default.mergeOptions({ - iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png'), - iconUrl: require('leaflet/dist/images/marker-icon.png'), - shadowUrl: require('leaflet/dist/images/marker-shadow.png'), + iconRetinaUrl, + iconUrl, + shadowUrl, }); interface IEventMapModal { @@ -64,7 +68,7 @@ const EventMapModal: React.FC = ({ onClose, statusId }) => { >
- diff --git a/src/features/ui/components/modals/landing-page-modal.tsx b/src/features/ui/components/modals/landing-page-modal.tsx index 251bc5f9a..b2e1196b1 100644 --- a/src/features/ui/components/modals/landing-page-modal.tsx +++ b/src/features/ui/components/modals/landing-page-modal.tsx @@ -1,3 +1,4 @@ +import lifebuoyIcon from '@tabler/icons/outline/lifebuoy.svg'; import clsx from 'clsx'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; @@ -38,7 +39,7 @@ const LandingPageModal: React.FC = ({ onClose }) => { target='_blank' className='flex items-center space-x-3 rounded-md p-3 hover:bg-gray-50 dark:hover:bg-gray-900/50' > - + {intl.formatMessage(messages.helpCenter)} diff --git a/src/features/ui/components/modals/manage-group-modal/steps/confirmation-step.tsx b/src/features/ui/components/modals/manage-group-modal/steps/confirmation-step.tsx index 6dbb4e667..1346a81f1 100644 --- a/src/features/ui/components/modals/manage-group-modal/steps/confirmation-step.tsx +++ b/src/features/ui/components/modals/manage-group-modal/steps/confirmation-step.tsx @@ -1,3 +1,5 @@ +import linkIcon from '@tabler/icons/outline/link.svg'; +import shareIcon from '@tabler/icons/outline/share.svg'; import React from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -101,12 +103,12 @@ const ConfirmationStep: React.FC = ({ group }) => { {('share' in navigator) && ( - )} - diff --git a/src/features/ui/components/modals/media-modal.tsx b/src/features/ui/components/modals/media-modal.tsx index 5d7ffaec4..6eca2c813 100644 --- a/src/features/ui/components/modals/media-modal.tsx +++ b/src/features/ui/components/modals/media-modal.tsx @@ -1,3 +1,9 @@ +import arrowLeftIcon from '@tabler/icons/outline/arrow-left.svg'; +import arrowRightIcon from '@tabler/icons/outline/arrow-right.svg'; +import arrowsMaximizeIcon from '@tabler/icons/outline/arrows-maximize.svg'; +import arrowsMinimizeIcon from '@tabler/icons/outline/arrows-minimize.svg'; +import downloadIcon from '@tabler/icons/outline/download.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import debounce from 'lodash/debounce'; import React, { useCallback, useEffect, useState } from 'react'; @@ -255,7 +261,7 @@ const MediaModal: React.FC = (props) => { > = (props) => { = (props) => { {status && ( = (props) => { onClick={handlePrevClick} aria-label={intl.formatMessage(messages.previous)} > - +
)} @@ -318,7 +324,7 @@ const MediaModal: React.FC = (props) => { onClick={handleNextClick} aria-label={intl.formatMessage(messages.next)} > - + )} diff --git a/src/features/ui/components/modals/nostr-login-modal/steps/extension-step.tsx b/src/features/ui/components/modals/nostr-login-modal/steps/extension-step.tsx index 36688eb16..e65dac0ba 100644 --- a/src/features/ui/components/modals/nostr-login-modal/steps/extension-step.tsx +++ b/src/features/ui/components/modals/nostr-login-modal/steps/extension-step.tsx @@ -1,3 +1,4 @@ +import alertTriangleIcon from '@tabler/icons/outline/alert-triangle.svg'; import React from 'react'; import { FormattedMessage } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -62,7 +63,7 @@ const ExtensionStep: React.FC = ({ isLogin, onClickAlt, onClose - diff --git a/src/features/ui/components/modals/nostr-signup-modal/steps/keygen-step.tsx b/src/features/ui/components/modals/nostr-signup-modal/steps/keygen-step.tsx index 7ae2e6164..ebc448dac 100644 --- a/src/features/ui/components/modals/nostr-signup-modal/steps/keygen-step.tsx +++ b/src/features/ui/components/modals/nostr-signup-modal/steps/keygen-step.tsx @@ -1,3 +1,4 @@ +import downloadIcon from '@tabler/icons/outline/download.svg'; import { generateSecretKey, getPublicKey, nip19 } from 'nostr-tools'; import React, { useEffect, useMemo, useState } from 'react'; import { FormattedMessage } from 'react-intl'; @@ -93,7 +94,7 @@ const KeygenStep: React.FC = ({ onClose }) => {
- diff --git a/src/features/ui/components/modals/onboarding-flow-modal/steps/avatar-step.tsx b/src/features/ui/components/modals/onboarding-flow-modal/steps/avatar-step.tsx index 21f0f5dcd..c7f8117e4 100644 --- a/src/features/ui/components/modals/onboarding-flow-modal/steps/avatar-step.tsx +++ b/src/features/ui/components/modals/onboarding-flow-modal/steps/avatar-step.tsx @@ -1,3 +1,5 @@ +import plusIcon from '@tabler/icons/outline/plus.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import React from 'react'; import { FormattedMessage, defineMessages } from 'react-intl'; @@ -12,7 +14,7 @@ import resizeImage from 'soapbox/utils/resize-image'; import type { AxiosError } from 'axios'; -const closeIcon = require('@tabler/icons/outline/x.svg'); +const closeIcon = xIcon; const messages = defineMessages({ error: { id: 'onboarding.error', defaultMessage: 'An unexpected error occurred. Please try again or skip this step.' }, @@ -105,7 +107,7 @@ const AvatarSelectionModal: React.FC = ({ onClose, onNext })} disabled={isSubmitting} > - + diff --git a/src/features/ui/components/modals/onboarding-flow-modal/steps/bio-step.tsx b/src/features/ui/components/modals/onboarding-flow-modal/steps/bio-step.tsx index ce5e7aac8..b043a73ac 100644 --- a/src/features/ui/components/modals/onboarding-flow-modal/steps/bio-step.tsx +++ b/src/features/ui/components/modals/onboarding-flow-modal/steps/bio-step.tsx @@ -1,3 +1,4 @@ +import xIcon from '@tabler/icons/outline/x.svg'; import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -14,7 +15,7 @@ const messages = defineMessages({ error: { id: 'onboarding.error', defaultMessage: 'An unexpected error occurred. Please try again or skip this step.' }, }); -const closeIcon = require('@tabler/icons/outline/x.svg'); +const closeIcon = xIcon; interface IBioStep { onClose(): void; diff --git a/src/features/ui/components/modals/onboarding-flow-modal/steps/completed-step.tsx b/src/features/ui/components/modals/onboarding-flow-modal/steps/completed-step.tsx index 5fee84b4a..321cd3a69 100644 --- a/src/features/ui/components/modals/onboarding-flow-modal/steps/completed-step.tsx +++ b/src/features/ui/components/modals/onboarding-flow-modal/steps/completed-step.tsx @@ -1,10 +1,12 @@ +import confettiIcon from '@tabler/icons/outline/confetti.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import React from 'react'; import { FormattedMessage } from 'react-intl'; import { Button, Icon, Stack, Text } from 'soapbox/components/ui'; import IconButton from 'soapbox/components/ui/icon-button/icon-button'; -const closeIcon = require('@tabler/icons/outline/x.svg'); +const closeIcon = xIcon; interface ICompletedModal { onClose?(): void; @@ -19,7 +21,7 @@ const CompletedModal: React.FC = ({ onClose, onComplete }) => {
- + diff --git a/src/features/ui/components/modals/onboarding-flow-modal/steps/cover-photo-selection-step.tsx b/src/features/ui/components/modals/onboarding-flow-modal/steps/cover-photo-selection-step.tsx index 0dac39e3f..de40a1932 100644 --- a/src/features/ui/components/modals/onboarding-flow-modal/steps/cover-photo-selection-step.tsx +++ b/src/features/ui/components/modals/onboarding-flow-modal/steps/cover-photo-selection-step.tsx @@ -1,3 +1,5 @@ +import plusIcon from '@tabler/icons/outline/plus.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import clsx from 'clsx'; import React from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -13,7 +15,7 @@ import resizeImage from 'soapbox/utils/resize-image'; import type { AxiosError } from 'axios'; -const closeIcon = require('@tabler/icons/outline/x.svg'); +const closeIcon = xIcon; const messages = defineMessages({ header: { id: 'account.header.alt', defaultMessage: 'Profile header' }, @@ -123,7 +125,7 @@ const CoverPhotoSelectionModal: React.FC = ({ onClose })} disabled={isSubmitting} > - + diff --git a/src/features/ui/components/modals/onboarding-flow-modal/steps/display-name-step.tsx b/src/features/ui/components/modals/onboarding-flow-modal/steps/display-name-step.tsx index b12e89d18..cf51decd0 100644 --- a/src/features/ui/components/modals/onboarding-flow-modal/steps/display-name-step.tsx +++ b/src/features/ui/components/modals/onboarding-flow-modal/steps/display-name-step.tsx @@ -1,3 +1,4 @@ +import xIcon from '@tabler/icons/outline/x.svg'; import React from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -9,7 +10,7 @@ import toast from 'soapbox/toast'; import type { AxiosError } from 'axios'; -const closeIcon = require('@tabler/icons/outline/x.svg'); +const closeIcon = xIcon; const messages = defineMessages({ usernamePlaceholder: { id: 'onboarding.display_name.placeholder', defaultMessage: 'Eg. John Smith' }, diff --git a/src/features/ui/components/modals/onboarding-flow-modal/steps/suggested-accounts-step.tsx b/src/features/ui/components/modals/onboarding-flow-modal/steps/suggested-accounts-step.tsx index 1576a69c7..e186cd27a 100644 --- a/src/features/ui/components/modals/onboarding-flow-modal/steps/suggested-accounts-step.tsx +++ b/src/features/ui/components/modals/onboarding-flow-modal/steps/suggested-accounts-step.tsx @@ -1,3 +1,4 @@ +import xIcon from '@tabler/icons/outline/x.svg'; import debounce from 'lodash/debounce'; import React from 'react'; import { FormattedMessage } from 'react-intl'; @@ -8,7 +9,7 @@ import IconButton from 'soapbox/components/ui/icon-button/icon-button'; import AccountContainer from 'soapbox/containers/account-container'; import { useOnboardingSuggestions } from 'soapbox/queries/suggestions'; -const closeIcon = require('@tabler/icons/outline/x.svg'); +const closeIcon = xIcon; interface ICoverPhotoSelectionModal { onClose?(): void; diff --git a/src/features/ui/components/modals/reply-mentions-modal.tsx b/src/features/ui/components/modals/reply-mentions-modal.tsx index 69ae41acd..9717694bd 100644 --- a/src/features/ui/components/modals/reply-mentions-modal.tsx +++ b/src/features/ui/components/modals/reply-mentions-modal.tsx @@ -1,3 +1,4 @@ +import arrowLeftIcon from '@tabler/icons/outline/arrow-left.svg'; import React, { useCallback } from 'react'; import { FormattedMessage } from 'react-intl'; @@ -33,7 +34,7 @@ const ReplyMentionsModal: React.FC = ({ composeId, onClose } onClose={onClickClose} - closeIcon={require('@tabler/icons/outline/arrow-left.svg')} + closeIcon={arrowLeftIcon} closePosition='left' >
diff --git a/src/features/ui/components/modals/report-modal/report-modal.tsx b/src/features/ui/components/modals/report-modal/report-modal.tsx index 42727fbe2..27d35832a 100644 --- a/src/features/ui/components/modals/report-modal/report-modal.tsx +++ b/src/features/ui/components/modals/report-modal/report-modal.tsx @@ -1,3 +1,4 @@ +import infoCircleIcon from '@tabler/icons/outline/info-circle.svg'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -226,7 +227,7 @@ const ReportModal = ({ onClose }: IReportModal) => { } + label={} > {intl.formatMessage(messages.reportContext)} diff --git a/src/features/ui/components/modals/report-modal/steps/other-actions-step.tsx b/src/features/ui/components/modals/report-modal/steps/other-actions-step.tsx index 67a56d66b..40b135c20 100644 --- a/src/features/ui/components/modals/report-modal/steps/other-actions-step.tsx +++ b/src/features/ui/components/modals/report-modal/steps/other-actions-step.tsx @@ -1,3 +1,5 @@ +import arrowsMinimizeIcon from '@tabler/icons/outline/arrows-minimize.svg'; +import plusIcon from '@tabler/icons/outline/plus.svg'; import { OrderedSet } from 'immutable'; import React, { useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -60,7 +62,7 @@ const OtherActionsStep = ({ account }: IOtherActionsStep) => {
-
-
diff --git a/src/features/ui/components/who-to-follow-panel.tsx b/src/features/ui/components/who-to-follow-panel.tsx index f2b8dbed0..8209fccb5 100644 --- a/src/features/ui/components/who-to-follow-panel.tsx +++ b/src/features/ui/components/who-to-follow-panel.tsx @@ -1,3 +1,4 @@ +import xIcon from '@tabler/icons/outline/x.svg'; import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -54,7 +55,7 @@ const WhoToFollowPanel = ({ limit }: IWhoToFollowPanel) => { key={suggestion.account} // @ts-ignore: TS thinks `id` is passed to , but it isn't id={suggestion.account} - actionIcon={require('@tabler/icons/outline/x.svg')} + actionIcon={xIcon} actionTitle={intl.formatMessage(messages.dismissSuggestion)} onActionClick={account ? handleDismiss : undefined} /> diff --git a/src/features/video/index.tsx b/src/features/video/index.tsx index d3e7a574a..25836c515 100644 --- a/src/features/video/index.tsx +++ b/src/features/video/index.tsx @@ -1,3 +1,9 @@ +import arrowsMaximizeIcon from '@tabler/icons/outline/arrows-maximize.svg'; +import arrowsMinimizeIcon from '@tabler/icons/outline/arrows-minimize.svg'; +import playerPauseIcon from '@tabler/icons/outline/player-pause.svg'; +import playerPlayIcon from '@tabler/icons/outline/player-play.svg'; +import volume3Icon from '@tabler/icons/outline/volume-3.svg'; +import volumeIcon from '@tabler/icons/outline/volume.svg'; import clsx from 'clsx'; import debounce from 'lodash/debounce'; import throttle from 'lodash/throttle'; @@ -598,7 +604,7 @@ const Video: React.FC = ({ onClick={togglePlay} autoFocus={autoFocus} > - +
= ({ , { 'py-[10px]': fullscreen })} onClick={toggleFullscreen} > - +
diff --git a/src/features/zap/components/zap-pay-request-form.tsx b/src/features/zap/components/zap-pay-request-form.tsx index b30c8cb1c..0528a3245 100644 --- a/src/features/zap/components/zap-pay-request-form.tsx +++ b/src/features/zap/components/zap-pay-request-form.tsx @@ -1,3 +1,6 @@ +import boltIcon from '@tabler/icons/outline/bolt.svg'; +import infoSquareRoundedIcon from '@tabler/icons/outline/info-square-rounded.svg'; +import xIcon from '@tabler/icons/outline/x.svg'; import React, { useEffect, useState } from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -34,7 +37,7 @@ interface IZapPayRequestForm { onClose?(): void; } -const closeIcon = require('@tabler/icons/outline/x.svg'); +const closeIcon = xIcon; const messages = defineMessages({ zap_button_rounded: { id: 'zap.button.text.rounded', defaultMessage: 'Zap {amount}K sats' }, @@ -149,7 +152,7 @@ const ZapPayRequestForm = ({ account, status, onClose }: IZapPayRequestForm) => {hasZapSplit ? -