diff --git a/web/components/api-token/modal/create-token-modal.tsx b/web/components/api-token/modal/create-token-modal.tsx index 32305ba5be..966da76e82 100644 --- a/web/components/api-token/modal/create-token-modal.tsx +++ b/web/components/api-token/modal/create-token-modal.tsx @@ -111,7 +111,7 @@ export const CreateApiTokenModal: React.FC = (props) => { leaveFrom="opacity-100 translate-y-0 sm:scale-100" leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" > - + {generatedToken ? ( ) : ( diff --git a/web/components/api-token/modal/generated-token-details.tsx b/web/components/api-token/modal/generated-token-details.tsx index d2bbfd7a1f..81e5963a30 100644 --- a/web/components/api-token/modal/generated-token-details.tsx +++ b/web/components/api-token/modal/generated-token-details.tsx @@ -28,8 +28,8 @@ export const GeneratedTokenDetails: React.FC = (props) => { }; return ( -
-
+
+

Key created

Copy and save this secret key in Plane Pages. You can{"'"}t see this key after you hit Close. A CSV file @@ -39,11 +39,11 @@ export const GeneratedTokenDetails: React.FC = (props) => {

diff --git a/web/components/headers/workspace-settings.tsx b/web/components/headers/workspace-settings.tsx index 673d65ba49..5cae7269b0 100644 --- a/web/components/headers/workspace-settings.tsx +++ b/web/components/headers/workspace-settings.tsx @@ -1,13 +1,11 @@ import { FC } from "react"; import { observer } from "mobx-react-lite"; import { useRouter } from "next/router"; -// ui import { Settings } from "lucide-react"; -import { Breadcrumbs, CustomMenu } from "@plane/ui"; -// hooks +// ui +import { Breadcrumbs } from "@plane/ui"; // components import { BreadcrumbLink } from "@/components/common"; -import { WORKSPACE_SETTINGS_LINKS } from "@/constants/workspace"; export interface IWorkspaceSettingHeader { title: string; @@ -20,7 +18,7 @@ export const WorkspaceSettingHeader: FC = observer((pro const { workspaceSlug } = router.query; return ( -
+
@@ -34,28 +32,9 @@ export const WorkspaceSettingHeader: FC = observer((pro /> } /> -
- } /> -
+ } />
- - {title} - - } - placement="bottom-start" - closeOnSelect - > - {WORKSPACE_SETTINGS_LINKS.map((item) => ( - router.push(`/${workspaceSlug}${item.href}`)}> - {item.label} - - ))} -
); diff --git a/web/components/profile/preferences/preferences-mobile-header.tsx b/web/components/profile/preferences/preferences-mobile-header.tsx new file mode 100644 index 0000000000..41ad464aea --- /dev/null +++ b/web/components/profile/preferences/preferences-mobile-header.tsx @@ -0,0 +1,38 @@ +import Link from "next/link"; +import router from "next/router"; +// helpers +import { cn } from "@/helpers/common.helper"; + +export const PreferencesMobileHeader = () => { + const profilePreferenceLinks: Array<{ + label: string; + href: string; + }> = [ + { + label: "Theme", + href: `/profile/preferences/theme`, + }, + { + label: "Email", + href: `/profile/preferences/email`, + }, + ]; + + return ( +
+ {profilePreferenceLinks.map((link, index) => ( + console.log(router.asPath)} + className={cn( + "flex justify-around py-2 w-full", + router.asPath.includes(link.label.toLowerCase()) ? "border-b-2 border-custom-primary-100" : "" + )} + > +
{link.label}
+ + ))} +
+ ); +}; diff --git a/web/components/profile/profile-issues-mobile-header.tsx b/web/components/profile/profile-issues-mobile-header.tsx new file mode 100644 index 0000000000..6880f6b4ba --- /dev/null +++ b/web/components/profile/profile-issues-mobile-header.tsx @@ -0,0 +1,177 @@ +import { useCallback } from "react"; +import { observer } from "mobx-react"; +import { useRouter } from "next/router"; +// icons +import { ChevronDown } from "lucide-react"; +// types +import { IIssueDisplayFilterOptions, IIssueDisplayProperties, IIssueFilterOptions, TIssueLayouts } from "@plane/types"; +// ui +import { CustomMenu } from "@plane/ui"; +// components +import { DisplayFiltersSelection, FilterSelection, FiltersDropdown } from "@/components/issues"; +// constants +import { EIssueFilterType, EIssuesStoreType, ISSUE_DISPLAY_FILTERS_BY_LAYOUT, ISSUE_LAYOUTS } from "@/constants/issue"; +// hooks +import { useIssues, useLabel } from "@/hooks/store"; + + +const ProfileIssuesMobileHeader = observer(() => { + // router + const router = useRouter(); + const { workspaceSlug, userId } = router.query; + // store hook + const { + issuesFilter: { issueFilters, updateFilters }, + } = useIssues(EIssuesStoreType.PROFILE); + + const { workspaceLabels } = useLabel(); + // derived values + const states = undefined; + // const members = undefined; + // const activeLayout = issueFilters?.displayFilters?.layout; + // const states = undefined; + const members = undefined; + const activeLayout = issueFilters?.displayFilters?.layout; + + const handleLayoutChange = useCallback( + (layout: TIssueLayouts) => { + if (!workspaceSlug || !userId) return; + updateFilters( + workspaceSlug.toString(), + undefined, + EIssueFilterType.DISPLAY_FILTERS, + { layout: layout }, + userId.toString() + ); + }, + [workspaceSlug, updateFilters, userId] + ); + + const handleFiltersUpdate = useCallback( + (key: keyof IIssueFilterOptions, value: string | string[]) => { + if (!workspaceSlug || !userId) return; + const newValues = issueFilters?.filters?.[key] ?? []; + + if (Array.isArray(value)) { + value.forEach((val) => { + if (!newValues.includes(val)) newValues.push(val); + }); + } else { + if (issueFilters?.filters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1); + else newValues.push(value); + } + + updateFilters( + workspaceSlug.toString(), + undefined, + EIssueFilterType.FILTERS, + { [key]: newValues }, + userId.toString() + ); + }, + [workspaceSlug, issueFilters, updateFilters, userId] + ); + + const handleDisplayFilters = useCallback( + (updatedDisplayFilter: Partial) => { + if (!workspaceSlug || !userId) return; + updateFilters( + workspaceSlug.toString(), + undefined, + EIssueFilterType.DISPLAY_FILTERS, + updatedDisplayFilter, + userId.toString() + ); + }, + [workspaceSlug, updateFilters, userId] + ); + + const handleDisplayProperties = useCallback( + (property: Partial) => { + if (!workspaceSlug || !userId) return; + updateFilters( + workspaceSlug.toString(), + undefined, + EIssueFilterType.DISPLAY_PROPERTIES, + property, + userId.toString() + ); + }, + [workspaceSlug, updateFilters, userId] + ); + return ( +
+ Layout} + customButtonClassName="flex flex-grow justify-center text-custom-text-200 text-sm" + closeOnSelect + > + {ISSUE_LAYOUTS.map((layout, index) => { + if (layout.key === "spreadsheet" || layout.key === "gantt_chart" || layout.key === "calendar") return; + return ( + { + handleLayoutChange(ISSUE_LAYOUTS[index].key); + }} + className="flex items-center gap-2" + > + +
{layout.title}
+
+ ); + })} +
+
+ + Filters + + + } + > + + +
+
+ + Display + + + } + > + + +
+
+ ); +}); + +export default ProfileIssuesMobileHeader; diff --git a/web/components/web-hooks/create-webhook-modal.tsx b/web/components/web-hooks/create-webhook-modal.tsx index 48c72a70d7..fbe7b8c894 100644 --- a/web/components/web-hooks/create-webhook-modal.tsx +++ b/web/components/web-hooks/create-webhook-modal.tsx @@ -124,7 +124,7 @@ export const CreateWebhookModal: React.FC = (props) => { leaveFrom="opacity-100 translate-y-0 sm:scale-100" leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" > - + {!generatedWebhook ? ( ) : ( diff --git a/web/components/web-hooks/form/secret-key.tsx b/web/components/web-hooks/form/secret-key.tsx index a55d296ef4..09bdfa214e 100644 --- a/web/components/web-hooks/form/secret-key.tsx +++ b/web/components/web-hooks/form/secret-key.tsx @@ -94,15 +94,15 @@ export const WebhookSecretKey: FC = observer((props) => {
{webhookId &&
Secret key
}
Generate a token to sign-in to the webhook payload
-
-
+
+
{shouldShowKey ? (

{webhookSecretKey}

) : ( -
+
{[...Array(30)].map((_, index) => ( -
+
))}
)} diff --git a/web/components/workspace/send-workspace-invitation-modal.tsx b/web/components/workspace/send-workspace-invitation-modal.tsx index 2d1969db29..3006346f22 100644 --- a/web/components/workspace/send-workspace-invitation-modal.tsx +++ b/web/components/workspace/send-workspace-invitation-modal.tsx @@ -104,7 +104,7 @@ export const SendWorkspaceInvitationModal: React.FC = observer((props) => leaveFrom="opacity-100 translate-y-0 sm:scale-100" leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" > - +
{ @@ -121,8 +121,8 @@ export const SendWorkspaceInvitationModal: React.FC = observer((props) =>
{fields.map((field, index) => ( -
-
+
+
= observer((props) => )} />
-
+
= observer((props) => { }} onSubmit={handleRemove} /> -
-
+
+
{memberDetails.member.avatar && memberDetails.member.avatar.trim() !== "" ? ( @@ -123,86 +123,90 @@ export const WorkspaceMembersListItem: FC = observer((props) => { )} -
- - - {memberDetails.member.first_name} {memberDetails.member.last_name} - - -
-

{memberDetails.member.display_name}

- {isAdmin && ( - <> - -

{memberDetails.member.email}

- - )} -
-
-
-
- - - {ROLE[memberDetails.role]} - - {hasRoleChangeAccess && ( - - +
+
+ +
+ + {memberDetails.member.first_name} {memberDetails.member.last_name} +
+ +
+

{memberDetails.member.display_name}

+ {isAdmin && ( + <> + +

{memberDetails.member.email}

+ )}
- } - value={memberDetails.role} - onChange={(value: EUserWorkspaceRoles) => { - if (!workspaceSlug || !value) return; +
+
+ + + {ROLE[memberDetails.role]} + + {hasRoleChangeAccess && ( + + + + )} +
+ } + value={memberDetails.role} + onChange={(value: EUserWorkspaceRoles) => { + if (!workspaceSlug || !value) return; - updateMember(workspaceSlug.toString(), memberDetails.member.id, { - role: value, - }).catch(() => { - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: "An error occurred while updating member role. Please try again.", - }); - }); - }} - disabled={!hasRoleChangeAccess} - placement="bottom-end" - > - {Object.keys(ROLE).map((key) => { - if (currentWorkspaceRole && currentWorkspaceRole !== 20 && currentWorkspaceRole < parseInt(key)) - return null; + updateMember(workspaceSlug.toString(), memberDetails.member.id, { + role: value, + }).catch(() => { + setToast({ + type: TOAST_TYPE.ERROR, + title: "Error!", + message: "An error occurred while updating member role. Please try again.", + }); + }); + }} + disabled={!hasRoleChangeAccess} + placement="bottom-end" + > + {Object.keys(ROLE).map((key) => { + if (currentWorkspaceRole && currentWorkspaceRole !== 20 && currentWorkspaceRole < parseInt(key)) + return null; - return ( - - <>{ROLE[parseInt(key) as keyof typeof ROLE]} - - ); - })} - - - - + return ( + + <>{ROLE[parseInt(key) as keyof typeof ROLE]} + + ); + })} + + + + +
+
diff --git a/web/components/workspace/settings/mobile-workspace-settings-tabs.tsx b/web/components/workspace/settings/mobile-workspace-settings-tabs.tsx new file mode 100644 index 0000000000..1cea866bde --- /dev/null +++ b/web/components/workspace/settings/mobile-workspace-settings-tabs.tsx @@ -0,0 +1,25 @@ +import router from "next/router"; +import { WORKSPACE_SETTINGS_LINKS } from "@/constants/workspace"; + +const MobileWorkspaceSettingsTabs = () => { + const { workspaceSlug } = router.query; + return ( +
+ {WORKSPACE_SETTINGS_LINKS.map((item, index) => ( +
router.push(`/${workspaceSlug}${item.href}`)} + > + {item.label} +
+ ))} +
+ ); +}; + +export default MobileWorkspaceSettingsTabs; diff --git a/web/components/workspace/settings/workspace-details.tsx b/web/components/workspace/settings/workspace-details.tsx index 64b4a30030..4919fc9e1b 100644 --- a/web/components/workspace/settings/workspace-details.tsx +++ b/web/components/workspace/settings/workspace-details.tsx @@ -174,7 +174,7 @@ export const WorkspaceDetails: FC = observer(() => { /> )} /> -
+

{watch("name")}

- {isAdmin && ( diff --git a/web/layouts/settings-layout/profile/preferences/layout.tsx b/web/layouts/settings-layout/profile/preferences/layout.tsx index f7fff2ef13..4219696e2f 100644 --- a/web/layouts/settings-layout/profile/preferences/layout.tsx +++ b/web/layouts/settings-layout/profile/preferences/layout.tsx @@ -1,10 +1,7 @@ import { FC, ReactNode } from "react"; // layout -import Link from "next/link"; -import { useRouter } from "next/router"; -import { ChevronDown } from "lucide-react"; -import { CustomMenu } from "@plane/ui"; import { SidebarHamburgerToggle } from "@/components/core/sidebar/sidebar-menu-hamburger-toggle"; +import { PreferencesMobileHeader } from "@/components/profile/preferences/preferences-mobile-header"; import { useApplication } from "@/hooks/store"; import { ProfileSettingsLayout } from "@/layouts/settings-layout"; import { ProfilePreferenceSettingsSidebar } from "./sidebar"; @@ -16,65 +13,26 @@ interface IProfilePreferenceSettingsLayout { export const ProfilePreferenceSettingsLayout: FC = (props) => { const { children, header } = props; - const router = useRouter(); const { theme: themeStore } = useApplication(); - const showMenuItem = () => { - const item = router.asPath.split("/"); - let splittedItem = item[item.length - 1]; - splittedItem = splittedItem.replace(splittedItem[0], splittedItem[0].toUpperCase()); - return splittedItem; - }; - - const profilePreferenceLinks: Array<{ - label: string; - href: string; - }> = [ - { - label: "Theme", - href: `/profile/preferences/theme`, - }, - { - label: "Email", - href: `/profile/preferences/email`, - }, - ]; return ( themeStore.toggleSidebar()} /> - - {showMenuItem()} - -
- } - customButtonClassName="flex flex-grow justify-start text-custom-text-200 text-sm" - > - <> - {profilePreferenceLinks.map((link) => ( - - - {link.label} - - - ))} -
} > -
- -
- {header} -
{children}
-
+
+ +
+ +
+ {header} +
{children}
+
+
); diff --git a/web/layouts/settings-layout/workspace/layout.tsx b/web/layouts/settings-layout/workspace/layout.tsx index 3d5d057beb..6ed06fecbe 100644 --- a/web/layouts/settings-layout/workspace/layout.tsx +++ b/web/layouts/settings-layout/workspace/layout.tsx @@ -1,5 +1,6 @@ import { FC, ReactNode } from "react"; // components +import MobileWorkspaceSettingsTabs from "@/components/workspace/settings/mobile-workspace-settings-tabs"; import { WorkspaceSettingsSidebar } from "./sidebar"; export interface IWorkspaceSettingLayout { @@ -14,8 +15,11 @@ export const WorkspaceSettingLayout: FC = (props) => {
-
- {children} +
+ +
+ {children} +
); diff --git a/web/layouts/user-profile-layout/layout.tsx b/web/layouts/user-profile-layout/layout.tsx index ba7a3a88e1..4f173353aa 100644 --- a/web/layouts/user-profile-layout/layout.tsx +++ b/web/layouts/user-profile-layout/layout.tsx @@ -2,10 +2,10 @@ import { observer } from "mobx-react-lite"; import { useRouter } from "next/router"; // components import { ProfileNavbar, ProfileSidebar } from "@/components/profile"; -// hooks -import { useUser } from "@/hooks/store"; // constants import { EUserWorkspaceRoles } from "@/constants/workspace"; +// hooks +import { useUser } from "@/hooks/store"; type Props = { children: React.ReactNode; @@ -28,8 +28,7 @@ export const ProfileAuthWrapper: React.FC = observer((props) => { const isAuthorizedPath = router.pathname.includes("assigned" || "created" || "subscribed"); return ( -
- +
{isAuthorized || !isAuthorizedPath ? ( @@ -40,6 +39,7 @@ export const ProfileAuthWrapper: React.FC = observer((props) => {
)}
+
); }); diff --git a/web/pages/[workspaceSlug]/profile/[userId]/assigned.tsx b/web/pages/[workspaceSlug]/profile/[userId]/assigned.tsx index bc770cc95d..2d73195fe4 100644 --- a/web/pages/[workspaceSlug]/profile/[userId]/assigned.tsx +++ b/web/pages/[workspaceSlug]/profile/[userId]/assigned.tsx @@ -1,11 +1,12 @@ import React, { ReactElement } from "react"; -// layouts +// components import { PageHead } from "@/components/core"; import { UserProfileHeader } from "@/components/headers"; import { ProfileIssuesPage } from "@/components/profile/profile-issues"; +import ProfileIssuesMobileHeader from "@/components/profile/profile-issues-mobile-header"; +// layouts import { AppLayout } from "@/layouts/app-layout"; import { ProfileAuthWrapper } from "@/layouts/user-profile-layout"; -// components // types import { NextPageWithLayout } from "@/lib/types"; @@ -18,7 +19,7 @@ const ProfileAssignedIssuesPage: NextPageWithLayout = () => ( ProfileAssignedIssuesPage.getLayout = function getLayout(page: ReactElement) { return ( - }> + } mobileHeader={}> {page} ); diff --git a/web/pages/[workspaceSlug]/profile/[userId]/created.tsx b/web/pages/[workspaceSlug]/profile/[userId]/created.tsx index ef7179f0b9..169ab4841e 100644 --- a/web/pages/[workspaceSlug]/profile/[userId]/created.tsx +++ b/web/pages/[workspaceSlug]/profile/[userId]/created.tsx @@ -1,13 +1,14 @@ import { ReactElement } from "react"; // store import { observer } from "mobx-react-lite"; -// layouts +// components import { PageHead } from "@/components/core"; import { UserProfileHeader } from "@/components/headers"; import { ProfileIssuesPage } from "@/components/profile/profile-issues"; +import ProfileIssuesMobileHeader from "@/components/profile/profile-issues-mobile-header"; +// layouts import { AppLayout } from "@/layouts/app-layout"; import { ProfileAuthWrapper } from "@/layouts/user-profile-layout"; -// components // types import { NextPageWithLayout } from "@/lib/types"; @@ -20,7 +21,7 @@ const ProfileCreatedIssuesPage: NextPageWithLayout = () => ( ProfileCreatedIssuesPage.getLayout = function getLayout(page: ReactElement) { return ( - }> + } mobileHeader={}> {page} ); diff --git a/web/pages/[workspaceSlug]/profile/[userId]/subscribed.tsx b/web/pages/[workspaceSlug]/profile/[userId]/subscribed.tsx index e4a871ec8b..feb7a01602 100644 --- a/web/pages/[workspaceSlug]/profile/[userId]/subscribed.tsx +++ b/web/pages/[workspaceSlug]/profile/[userId]/subscribed.tsx @@ -1,13 +1,14 @@ import { ReactElement } from "react"; // store import { observer } from "mobx-react-lite"; -// layouts +// components import { PageHead } from "@/components/core"; import { UserProfileHeader } from "@/components/headers"; import { ProfileIssuesPage } from "@/components/profile/profile-issues"; +import ProfileIssuesMobileHeader from "@/components/profile/profile-issues-mobile-header"; +// layouts import { AppLayout } from "@/layouts/app-layout"; import { ProfileAuthWrapper } from "@/layouts/user-profile-layout"; -// components // types import { NextPageWithLayout } from "@/lib/types"; @@ -20,7 +21,7 @@ const ProfileSubscribedIssuesPage: NextPageWithLayout = () => ( ProfileSubscribedIssuesPage.getLayout = function getLayout(page: ReactElement) { return ( - }> + } mobileHeader={}> {page} ); diff --git a/web/pages/[workspaceSlug]/settings/api-tokens.tsx b/web/pages/[workspaceSlug]/settings/api-tokens.tsx index 3df25bae01..bc10481aa8 100644 --- a/web/pages/[workspaceSlug]/settings/api-tokens.tsx +++ b/web/pages/[workspaceSlug]/settings/api-tokens.tsx @@ -64,7 +64,7 @@ const ApiTokensPage: NextPageWithLayout = observer(() => { <> setIsCreateTokenModalOpen(false)} /> -
+
{tokens.length > 0 ? ( <>
diff --git a/web/pages/[workspaceSlug]/settings/billing.tsx b/web/pages/[workspaceSlug]/settings/billing.tsx index a4bd5b697e..25911a15d8 100644 --- a/web/pages/[workspaceSlug]/settings/billing.tsx +++ b/web/pages/[workspaceSlug]/settings/billing.tsx @@ -37,7 +37,7 @@ const BillingSettingsPage: NextPageWithLayout = observer(() => { return ( <> -
+

Billing & Plans

diff --git a/web/pages/[workspaceSlug]/settings/exports.tsx b/web/pages/[workspaceSlug]/settings/exports.tsx index 0264016b9e..fb64158d06 100644 --- a/web/pages/[workspaceSlug]/settings/exports.tsx +++ b/web/pages/[workspaceSlug]/settings/exports.tsx @@ -38,7 +38,7 @@ const ExportsPage: NextPageWithLayout = observer(() => { return ( <> -
+

Exports

diff --git a/web/pages/[workspaceSlug]/settings/members.tsx b/web/pages/[workspaceSlug]/settings/members.tsx index f644a294b1..3ed75e7332 100644 --- a/web/pages/[workspaceSlug]/settings/members.tsx +++ b/web/pages/[workspaceSlug]/settings/members.tsx @@ -95,7 +95,7 @@ const WorkspaceMembersSettingsPage: NextPageWithLayout = observer(() => { onClose={() => setInviteModal(false)} onSubmit={handleWorkspaceInvite} /> -
+

Members

diff --git a/web/pages/[workspaceSlug]/settings/webhooks/[webhookId].tsx b/web/pages/[workspaceSlug]/settings/webhooks/[webhookId].tsx index e6ebe3644d..c0ec917a91 100644 --- a/web/pages/[workspaceSlug]/settings/webhooks/[webhookId].tsx +++ b/web/pages/[workspaceSlug]/settings/webhooks/[webhookId].tsx @@ -95,7 +95,7 @@ const WebhookDetailsPage: NextPageWithLayout = observer(() => { <> setDeleteWebhookModal(false)} /> -
+
await handleUpdateWebhook(data)} data={currentWebhook} /> {currentWebhook && setDeleteWebhookModal(true)} />}
diff --git a/web/pages/[workspaceSlug]/settings/webhooks/index.tsx b/web/pages/[workspaceSlug]/settings/webhooks/index.tsx index 3c5ae614a7..d4dd1138cb 100644 --- a/web/pages/[workspaceSlug]/settings/webhooks/index.tsx +++ b/web/pages/[workspaceSlug]/settings/webhooks/index.tsx @@ -62,7 +62,7 @@ const WebhooksListPage: NextPageWithLayout = observer(() => { return ( <> -
+
{ /> {Object.keys(webhooks).length > 0 ? (
-
+
Webhooks

Change password

diff --git a/web/pages/profile/index.tsx b/web/pages/profile/index.tsx index 6d2fe4d548..55c158e8f7 100644 --- a/web/pages/profile/index.tsx +++ b/web/pages/profile/index.tsx @@ -172,7 +172,7 @@ const ProfileSettingsPage: NextPageWithLayout = observer(() => { )} /> setDeactivateAccountModal(false)} /> -
+
@@ -222,7 +222,7 @@ const ProfileSettingsPage: NextPageWithLayout = observer(() => {
-
+
{`${watch("first_name")} ${watch("last_name")}`} @@ -238,7 +238,7 @@ const ProfileSettingsPage: NextPageWithLayout = observer(() => { */}
-
+

First name* @@ -423,7 +423,7 @@ const ProfileSettingsPage: NextPageWithLayout = observer(() => {

- + {({ open }) => ( <> { return ( <> -
+
diff --git a/web/pages/profile/preferences/theme.tsx b/web/pages/profile/preferences/theme.tsx index 09dc9043ee..0965716b4d 100644 --- a/web/pages/profile/preferences/theme.tsx +++ b/web/pages/profile/preferences/theme.tsx @@ -54,7 +54,7 @@ const ProfilePreferencesThemePage: NextPageWithLayout = observer(() => { <> {currentUser ? ( -
+

Preferences