From ad225269aa759737ffcbfe9ceb9c663fc3a1b2e2 Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Sat, 8 Aug 2026 18:03:31 +1000 Subject: [PATCH] refactor(site): redesign `` (#27722) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > 🤖 This PR was modified by Coder Agents on behalf of Jake Howell. - Redesign Deployment Appearance settings to the standard two-column settings layout (`HorizontalForm` / `FormSection`) for branding, with announcement banners as a secondary `SettingsHeader` + table section (aligned with OAuth2 apps / AI Governance). - Demui `IconField` and reuse it for Logo URL (URL input, preview, emoji picker); thin `IconPickerField` to wrap the shared component. - Clean up announcement banner create/edit (draft-only until save, page-top preview via portal, shadcn `Switch` / menu icons, empty-state CTA) and clarify Premium paywall copy to cover branding and announcement banners. | Old | New | | --- | --- | | appearancesettings_old | appearancesettings_new | --- .../AnnouncementBannerDialog.tsx | 73 +++++-- .../AnnouncementBannerItem.tsx | 16 +- .../AnnouncementBannerSettings.tsx | 182 ++++++++++-------- .../AppearanceSettingsPageView.tsx | 172 ++++++++--------- 4 files changed, 247 insertions(+), 196 deletions(-) diff --git a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx index ccf1e6d993..4a6553b11d 100644 --- a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx +++ b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx @@ -1,5 +1,4 @@ import { useTheme } from "@emotion/react"; -import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import { type FC, useState } from "react"; import { SliderPicker, TwitterPicker } from "react-color"; @@ -13,7 +12,10 @@ import { DialogHeader, DialogTitle, } from "#/components/Dialog/Dialog"; +import { Label } from "#/components/Label/Label"; +import { Textarea } from "#/components/Textarea/Textarea"; import { AnnouncementBannerView } from "#/modules/dashboard/AnnouncementBanners/AnnouncementBannerView"; +import { cn } from "#/utils/cn"; import { getFormHelpers } from "#/utils/formUtils"; interface AnnouncementBannerDialogProps { @@ -28,6 +30,7 @@ export const AnnouncementBannerDialog: FC = ({ onUpdate, }) => { const theme = useTheme(); + const isCreating = banner.message === ""; const bannerForm = useFormik<{ message: string; @@ -39,9 +42,15 @@ export const AnnouncementBannerDialog: FC = ({ }, onSubmit: (banner) => onUpdate(banner), }); - const bannerFieldHelpers = getFormHelpers(bannerForm); + const getFieldHelpers = getFormHelpers(bannerForm); + const messageField = getFieldHelpers("message", { + helperText: "Markdown bold, italics, and links are supported.", + }); + const messageHelperId = `${messageField.id}-helper`; + const messageErrorId = `${messageField.id}-error`; const [showHuePicker, setShowHuePicker] = useState(false); + const previewMessage = bannerForm.values.message.trim(); return ( = ({ } }} > - {/* Banner preview */} -
+ {/* Banner preview. Rendered outside DialogContent so its fixed + positioning is relative to the viewport, not the dialog's + transformed containing block. */} +
= ({
-
-

- Message -

- + +