From a748ad20858277c2edb0fc41334b01e176d6f746 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Fri, 3 Oct 2025 00:18:39 +0200 Subject: [PATCH 1/3] fix FormSwitch --- packages/discord-types/src/components.d.ts | 13 ------ src/components/FormDivider.css | 5 ++ src/components/FormDivider.tsx | 13 ++++++ src/components/FormSwitch.css | 23 ++++++++++ src/components/FormSwitch.tsx | 46 +++++++++++++++++++ src/components/{settings => }/Switch.css | 2 +- src/components/{settings => }/Switch.tsx | 0 src/components/settings/AddonCard.tsx | 2 +- src/components/settings/index.ts | 2 +- .../tabs/patchHelper/ReplacementInput.tsx | 12 ++--- .../plugins/components/BooleanSetting.tsx | 2 +- .../settings/tabs/sync/CloudTab.tsx | 21 ++++----- .../settings/tabs/updater/index.tsx | 21 ++++----- .../settings/tabs/vencord/index.tsx | 12 ++--- .../components/EncryptionModal.tsx | 10 ++-- src/plugins/translate/TranslateModal.tsx | 12 ++--- src/webpack/common/components.ts | 4 +- 17 files changed, 137 insertions(+), 63 deletions(-) create mode 100644 src/components/FormDivider.css create mode 100644 src/components/FormDivider.tsx create mode 100644 src/components/FormSwitch.css create mode 100644 src/components/FormSwitch.tsx rename src/components/{settings => }/Switch.css (97%) rename src/components/{settings => }/Switch.tsx (100%) diff --git a/packages/discord-types/src/components.d.ts b/packages/discord-types/src/components.d.ts index f9e778d8d..178cbdb00 100644 --- a/packages/discord-types/src/components.d.ts +++ b/packages/discord-types/src/components.d.ts @@ -161,19 +161,6 @@ export type Button = ComponentType & { Link: any; }; -export type Switch = ComponentType>; - export type CheckboxAligns = { CENTER: "center"; TOP: "top"; diff --git a/src/components/FormDivider.css b/src/components/FormDivider.css new file mode 100644 index 000000000..66f988d5a --- /dev/null +++ b/src/components/FormDivider.css @@ -0,0 +1,5 @@ +.vc-form-divider { + border-top: thin solid var(--border-subtle); + width: 100%; + height: 1px; +} \ No newline at end of file diff --git a/src/components/FormDivider.tsx b/src/components/FormDivider.tsx new file mode 100644 index 000000000..f7465829e --- /dev/null +++ b/src/components/FormDivider.tsx @@ -0,0 +1,13 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import "./FormDivider.css"; + +import { classes } from "@utils/misc"; + +export function FormDivider({ className }: { className?: string; }) { + return
; +} diff --git a/src/components/FormSwitch.css b/src/components/FormSwitch.css new file mode 100644 index 000000000..d2a90064f --- /dev/null +++ b/src/components/FormSwitch.css @@ -0,0 +1,23 @@ +.vc-form-switch-wrapper { + margin-bottom: 20px; +} + +.vc-form-switch { + display: flex; + width: 100%; + + > :last-child { + margin-left: auto; + } +} + +.vc-form-switch-text { + display: flex; + flex-direction: column; + justify-content: center; + gap: 8px; +} + +.vc-form-switch-border { + margin-top: 20px; +} \ No newline at end of file diff --git a/src/components/FormSwitch.tsx b/src/components/FormSwitch.tsx new file mode 100644 index 000000000..12b0ab127 --- /dev/null +++ b/src/components/FormSwitch.tsx @@ -0,0 +1,46 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import "./FormSwitch.css"; + +import { classes } from "@utils/misc"; +import { Text } from "@webpack/common"; +import type { PropsWithChildren, ReactNode } from "react"; + +import { FormDivider } from "./FormDivider"; +import { Switch } from "./Switch"; + +export interface FormSwitchProps { + title: ReactNode; + description?: ReactNode; + value: boolean; + onChange(value: boolean): void; + + className?: string; + disabled?: boolean; + hideBorder?: boolean; +} + +export function FormSwitch({ onChange, title, value, description, disabled, className, hideBorder }: FormSwitchProps) { + return ( +
+
+
+ {title} + {description && {description}} +
+ + +
+ {!hideBorder && } +
+ ); +} + +/** Compatibility with Discord's old FormSwitch */ +export function FormSwitchCompat(props: PropsWithChildren) { + return ; +} diff --git a/src/components/settings/Switch.css b/src/components/Switch.css similarity index 97% rename from src/components/settings/Switch.css rename to src/components/Switch.css index e6dcf5626..685f6b228 100644 --- a/src/components/settings/Switch.css +++ b/src/components/Switch.css @@ -1,3 +1,3 @@ .vc-switch-slider { transition: 100ms transform ease-in-out; -} +} \ No newline at end of file diff --git a/src/components/settings/Switch.tsx b/src/components/Switch.tsx similarity index 100% rename from src/components/settings/Switch.tsx rename to src/components/Switch.tsx diff --git a/src/components/settings/AddonCard.tsx b/src/components/settings/AddonCard.tsx index 3701d7cf2..0dc69d6f8 100644 --- a/src/components/settings/AddonCard.tsx +++ b/src/components/settings/AddonCard.tsx @@ -20,7 +20,7 @@ import "./AddonCard.css"; import { classNameFactory } from "@api/Styles"; import { AddonBadge } from "@components/settings/PluginBadge"; -import { Switch } from "@components/settings/Switch"; +import { Switch } from "@components/Switch"; import { Text, useRef } from "@webpack/common"; import type { MouseEventHandler, ReactNode } from "react"; diff --git a/src/components/settings/index.ts b/src/components/settings/index.ts index c793ef38c..a7b9cdef4 100644 --- a/src/components/settings/index.ts +++ b/src/components/settings/index.ts @@ -9,5 +9,5 @@ export * from "./DonateButton"; export * from "./PluginBadge"; export * from "./QuickAction"; export * from "./SpecialCard"; -export * from "./Switch"; +export * from "../Switch"; export * from "./tabs"; diff --git a/src/components/settings/tabs/patchHelper/ReplacementInput.tsx b/src/components/settings/tabs/patchHelper/ReplacementInput.tsx index c028c4774..99b3bbc68 100644 --- a/src/components/settings/tabs/patchHelper/ReplacementInput.tsx +++ b/src/components/settings/tabs/patchHelper/ReplacementInput.tsx @@ -4,8 +4,9 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { FormSwitch } from "@components/FormSwitch"; import { Margins } from "@utils/margins"; -import { Forms, Parser, Switch, TextInput, useEffect, useState } from "@webpack/common"; +import { Forms, Parser, TextInput, useEffect, useState } from "@webpack/common"; const RegexGuide = { "\\i": "Special regex escape sequence that matches identifiers (varnames, classnames, etc.)", @@ -69,15 +70,14 @@ export function ReplacementInput({ replacement, setReplacement, replacementError
)} - - Treat as Function - + /> ); } diff --git a/src/components/settings/tabs/plugins/components/BooleanSetting.tsx b/src/components/settings/tabs/plugins/components/BooleanSetting.tsx index c5408cb9b..44265c724 100644 --- a/src/components/settings/tabs/plugins/components/BooleanSetting.tsx +++ b/src/components/settings/tabs/plugins/components/BooleanSetting.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import { Switch } from "@components/settings/Switch"; +import { Switch } from "@components/Switch"; import { PluginOptionBoolean } from "@utils/types"; import { React, useState } from "@webpack/common"; diff --git a/src/components/settings/tabs/sync/CloudTab.tsx b/src/components/settings/tabs/sync/CloudTab.tsx index 1d1fd9789..0afa575df 100644 --- a/src/components/settings/tabs/sync/CloudTab.tsx +++ b/src/components/settings/tabs/sync/CloudTab.tsx @@ -19,13 +19,14 @@ import { showNotification } from "@api/Notifications"; import { Settings, useSettings } from "@api/Settings"; import { CheckedTextInput } from "@components/CheckedTextInput"; +import { FormSwitch } from "@components/FormSwitch"; import { Grid } from "@components/Grid"; import { Link } from "@components/Link"; import { SettingsTab, wrapTab } from "@components/settings/tabs/BaseTab"; import { authorizeCloud, checkCloudUrlCsp, cloudLogger, deauthorizeCloud, getCloudAuth, getCloudUrl } from "@utils/cloud"; import { Margins } from "@utils/margins"; import { deleteCloudSettings, getCloudSettings, putCloudSettings } from "@utils/settingsSync"; -import { Alerts, Button, Forms, Switch, Tooltip } from "@webpack/common"; +import { Alerts, Button, Forms, Tooltip } from "@webpack/common"; function validateUrl(url: string) { try { @@ -74,14 +75,13 @@ function SettingsSyncSection() { Synchronize your settings to the cloud. This allows easy synchronization across multiple devices with minimal effort. - { cloud.settingsSync = v; }} - > - Settings Sync - + disabled={!cloud.authenticated} + />