From 07bb2d7e4b44666c53bef543fa3f66dab27becf2 Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Mon, 8 Dec 2025 03:16:34 +0000 Subject: [PATCH 01/29] feat: "v1" of changes (WIP) --- site/src/components/Alert/Alert.tsx | 7 +- site/src/components/Avatar/AvatarCard.tsx | 16 ++-- site/src/components/CustomLogo/CustomLogo.tsx | 3 +- .../Dialogs/DeleteDialog/DeleteDialog.tsx | 2 +- .../DurationField/DurationField.tsx | 7 +- site/src/modules/resources/AgentRow.tsx | 6 +- .../pages/CreateTokenPage/CreateTokenPage.tsx | 7 +- .../pages/CreateUserPage/CreateUserForm.tsx | 16 +--- .../pages/DeploymentSettingsPage/Fieldset.tsx | 31 ++------ .../TemplateVariablesPageView.tsx | 4 +- .../UsersPage/UsersTable/UserGroupsCell.tsx | 15 +--- .../UsersPage/UsersTable/UsersTableBody.tsx | 6 +- site/src/pages/WorkspaceBuildPage/Sidebar.tsx | 44 +++-------- .../pages/WorkspacePage/HistorySidebar.tsx | 2 +- .../pages/WorkspacePage/ResourcesSidebar.tsx | 39 ++-------- .../BuildParametersPopover.tsx | 26 +++---- .../WorkspaceActions/WorkspaceActions.tsx | 5 +- .../WorkspaceBuildLogsSection.tsx | 36 ++------- .../WorkspacePage/WorkspaceBuildProgress.tsx | 6 +- .../WorkspaceNotifications/Notifications.tsx | 41 +++------- .../WorkspaceNotifications.tsx | 12 +-- .../src/pages/WorkspacePage/WorkspacePage.tsx | 2 +- .../WorkspaceScheduleControls.tsx | 73 +++++------------- .../pages/WorkspacePage/WorkspaceTopbar.tsx | 60 ++++----------- .../WorkspaceParametersPage.tsx | 7 +- .../WorkspaceScheduleForm.tsx | 11 +-- .../WorkspaceSchedulePage.tsx | 2 +- .../WorkspaceSettingsForm.tsx | 14 ++-- .../WorkspaceSettingsLayout.tsx | 4 +- .../WorkspaceSettingsPageView.tsx | 6 +- .../pages/WorkspacesPage/WorkspacesButton.tsx | 76 +++++-------------- .../WorkspacesPage/WorkspacesPageView.tsx | 10 +-- 32 files changed, 142 insertions(+), 454 deletions(-) diff --git a/site/src/components/Alert/Alert.tsx b/site/src/components/Alert/Alert.tsx index 86ae99b3b0c86..b0db11f0c8da5 100644 --- a/site/src/components/Alert/Alert.tsx +++ b/site/src/components/Alert/Alert.tsx @@ -40,7 +40,7 @@ export const Alert: FC = ({ @@ -72,10 +72,7 @@ export const Alert: FC = ({ export const AlertDetail: FC = ({ children }) => { return ( - ({ color: theme.palette.text.secondary, fontSize: 13 })} - data-chromatic="ignore" - > + {children} ); diff --git a/site/src/components/Avatar/AvatarCard.tsx b/site/src/components/Avatar/AvatarCard.tsx index 97df5c6ee765c..187c9ffa50cdd 100644 --- a/site/src/components/Avatar/AvatarCard.tsx +++ b/site/src/components/Avatar/AvatarCard.tsx @@ -1,6 +1,7 @@ import { type CSSObject, useTheme } from "@emotion/react"; import { Avatar } from "components/Avatar/Avatar"; import type { FC, ReactNode } from "react"; +import { cn } from "utils/cn"; type AvatarCardProps = { header: string; @@ -19,16 +20,13 @@ export const AvatarCard: FC = ({ return (
{/** @@ -37,7 +35,7 @@ export const AvatarCard: FC = ({ * * @see {@link https://css-tricks.com/flexbox-truncated-text/} */} -
+

}> = (props) => { onLoad={(e) => { e.currentTarget.style.display = "inline"; }} - css={{ maxWidth: 200 }} - className="application-logo" + className="application-logo max-w-50" /> ) : ( diff --git a/site/src/components/Dialogs/DeleteDialog/DeleteDialog.tsx b/site/src/components/Dialogs/DeleteDialog/DeleteDialog.tsx index 9bee94fe24714..851dd5534c836 100644 --- a/site/src/components/Dialogs/DeleteDialog/DeleteDialog.tsx +++ b/site/src/components/Dialogs/DeleteDialog/DeleteDialog.tsx @@ -78,7 +78,7 @@ export const DeleteDialog: FC = ({ = (props) => { return (
-
+
= ({
{hasStartupFeatures && ( -
({ - borderTop: `1px solid ${theme.palette.divider}`, - })} - > +
{({ width }) => ( diff --git a/site/src/pages/CreateTokenPage/CreateTokenPage.tsx b/site/src/pages/CreateTokenPage/CreateTokenPage.tsx index 5184efb908d1d..813a81be1cdd1 100644 --- a/site/src/pages/CreateTokenPage/CreateTokenPage.tsx +++ b/site/src/pages/CreateTokenPage/CreateTokenPage.tsx @@ -72,12 +72,7 @@ const CreateTokenPage: FC = () => { ); diff --git a/site/src/pages/CreateUserPage/CreateUserForm.tsx b/site/src/pages/CreateUserPage/CreateUserForm.tsx index 3cad2f2a718cb..9961f788aa287 100644 --- a/site/src/pages/CreateUserPage/CreateUserForm.tsx +++ b/site/src/pages/CreateUserPage/CreateUserForm.tsx @@ -188,21 +188,9 @@ export const CreateUserForm: FC< const language = authMethodLanguage[value]; return ( - + {language.displayName} - ({ - fontSize: 14, - color: theme.palette.text.secondary, - wordWrap: "normal", - whiteSpace: "break-spaces", - })} - > + {language.description} diff --git a/site/src/pages/DeploymentSettingsPage/Fieldset.tsx b/site/src/pages/DeploymentSettingsPage/Fieldset.tsx index 9a6e479fa8bc7..f9c5cf5c26325 100644 --- a/site/src/pages/DeploymentSettingsPage/Fieldset.tsx +++ b/site/src/pages/DeploymentSettingsPage/Fieldset.tsx @@ -25,34 +25,13 @@ export const Fieldset: FC = ({ return (
-
-
- {title} -
+
+
{title}
{subtitle && ( -
- {subtitle} -
+
{subtitle}
)}
{children} @@ -70,7 +49,7 @@ export const Fieldset: FC = ({ }, ]} > -
{validation}
+
{validation}
{button || ( diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index f46589a0a67fb..7173b3d4933d0 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -167,10 +167,7 @@ export const WorkspaceActions: FC = ({ }; return ( -
+
{/* Restarting must be handled separately, because it otherwise would appear as stopping */} {isUpdating ? buttonMapping.updating diff --git a/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx b/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx index e5d74cf3c422f..58343c772b519 100644 --- a/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx @@ -14,45 +14,19 @@ export const WorkspaceBuildLogsSection: FC = ({ const theme = useTheme(); return ( -
-
+
+
Build logs
-
+
{logs ? ( ) : ( -
+
)} diff --git a/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx b/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx index 32061f2a6590e..32833c780d26c 100644 --- a/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx @@ -120,7 +120,7 @@ export const WorkspaceBuildProgress: FC = ({ return null; } return ( -
+
{variant === "task" && (
@@ -174,10 +174,6 @@ const classNames = { }; const styles = { - stack: { - paddingLeft: 2, - paddingRight: 2, - }, label: (theme) => ({ fontSize: 12, display: "block", diff --git a/site/src/pages/WorkspacePage/WorkspaceNotifications/Notifications.tsx b/site/src/pages/WorkspacePage/WorkspaceNotifications/Notifications.tsx index 308a763716969..776d4b8ba929e 100644 --- a/site/src/pages/WorkspacePage/WorkspaceNotifications/Notifications.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceNotifications/Notifications.tsx @@ -10,6 +10,7 @@ import { } from "components/Tooltip/Tooltip"; import { type FC, type ReactNode, useState } from "react"; import type { ThemeRole } from "theme/roles"; +import { cn } from "utils/cn"; export type NotificationItem = { title: string; @@ -36,10 +37,7 @@ export const Notifications: FC = ({ -
+
= ({ notification }) => { return ( -
-

{notification.title}

+
+

{notification.title}

{notification.detail && ( -

{notification.detail}

+

+ {notification.detail} +

)}
{notification.actions}
@@ -107,26 +111,3 @@ const NotificationItem: FC = ({ notification }) => { export const NotificationActionButton: FC = (props) => { return @@ -80,7 +82,10 @@ export const WorkspaceScheduleControls: FC = ({ } return ( -
+
{isWorkspaceOn(workspace) ? ( = ({ const display = ( ({ - color: `${theme.roles.danger.fill.outline} !important`, - })) - } + className={cn([danger && "!text-content-destructive"])} > {message} ); const controls = canUpdateSchedule && canEditDeadline(workspace) && ( -
+
svg]:size-icon-xs" + } onClick={() => { handleDeadlineChange(deadline.subtract(1, "h")); }} @@ -217,7 +219,9 @@ const AutostopDisplay: FC = ({ svg]:size-icon-xs" + } onClick={() => { handleDeadlineChange(deadline.add(1, "h")); }} @@ -253,12 +257,7 @@ const ScheduleSettingsLink = forwardRef( ref={ref} component={RouterLink} to="settings/schedule" - css={{ - color: "inherit", - "&:first-letter": { - textTransform: "uppercase", - }, - }} + className="text-inherit [&:first-letter]:uppercase" {...props} /> ); @@ -282,41 +281,3 @@ const shouldDisplayScheduleControls = (workspace: Workspace): boolean => { const willAutoStart = !isWorkspaceOn(workspace) && hasAutoStart(workspace); return willAutoStop || willAutoStart; }; - -const styles = { - scheduleIconButton: { - display: "flex", - alignItems: "center", - background: "transparent", - border: 0, - padding: 0, - fontSize: "inherit", - lineHeight: "inherit", - cursor: "pointer", - }, - - scheduleValue: { - display: "flex", - alignItems: "center", - gap: 12, - fontVariantNumeric: "tabular-nums", - }, - - scheduleControls: { - display: "flex", - alignItems: "center", - gap: 4, - }, - - scheduleButton: (theme) => ({ - border: `1px solid ${theme.palette.divider}`, - borderRadius: 4, - width: 20, - height: 20, - - "& svg.MuiSvgIcon-root": { - width: 12, - height: 12, - }, - }), -} satisfies Record>; diff --git a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx index 59b7b9472e2b5..1b3649e423daa 100644 --- a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx @@ -1,4 +1,4 @@ -import { type Interpolation, type Theme, useTheme } from "@emotion/react"; +import { useTheme } from "@emotion/react"; import Link from "@mui/material/Link"; import { workspaceQuota } from "api/queries/workspaceQuota"; import type * as TypesGen from "api/typesGenerated"; @@ -111,7 +111,7 @@ export const WorkspaceTopbar: FC = ({ ); return ( - + @@ -121,7 +121,7 @@ export const WorkspaceTopbar: FC = ({ Back to workspaces -
+
= ({ {quota && quota.budget > 0 && ( = ({ {workspace.latest_build.daily_cost}{" "} - - credits of - {" "} + credits of{" "} {quota.budget} @@ -198,7 +196,7 @@ export const WorkspaceTopbar: FC = ({ component={RouterLink} to={`${templateLink}/settings/schedule`} title="Schedule settings" - css={{ color: "inherit" }} + className="text-inherit" > {workspace.deleting_at ? ( <> @@ -265,9 +263,9 @@ const OwnerBreadcrumb: FC = ({ return ( - + - {ownerName} + {ownerName} @@ -292,14 +290,14 @@ const OrganizationBreadcrumb: FC = ({ return ( - + - {orgName} + {orgName} @@ -310,7 +308,7 @@ const OrganizationBreadcrumb: FC = ({ {orgName} @@ -352,13 +350,13 @@ const WorkspaceBreadcrumb: FC = ({
- + - + {workspaceName} @@ -370,7 +368,7 @@ const WorkspaceBreadcrumb: FC = ({ {templateDisplayName} @@ -379,7 +377,7 @@ const WorkspaceBreadcrumb: FC = ({ Version: {latestBuildVersionName} @@ -399,31 +397,3 @@ const WorkspaceBreadcrumb: FC = ({
); }; - -const styles = { - topbarLeft: { - display: "flex", - alignItems: "center", - columnGap: 24, - rowGap: 8, - flexWrap: "wrap", - // 12px - It is needed to keep vertical spacing when the content is wrapped - padding: "12px", - marginRight: "auto", - }, - - breadcrumbSegment: { - display: "flex", - alignItems: "center", - flexFlow: "row nowrap", - gap: "8px", - maxWidth: "160px", - whiteSpace: "nowrap", - cursor: "default", - }, - - breadcrumbText: { - overflowX: "hidden", - textOverflow: "ellipsis", - }, -} satisfies Record>; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx index db67b52429fa1..0e4dc63a8501b 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx @@ -151,7 +151,7 @@ export const WorkspaceParametersPageView: FC<
{submitError && !isApiValidationError(submitError) ? ( - + ) : null} {templateVersionParameters && buildParameters ? ( @@ -185,10 +185,7 @@ export const WorkspaceParametersPageView: FC< } - css={(theme) => ({ - border: `1px solid ${theme.palette.divider}`, - borderRadius: 8, - })} + className="border border-solid border-zinc-700 rounded-lg" /> ) ) : ( diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx index cdf1f5b0d9726..c6fdc4ed73c5d 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx @@ -334,18 +334,11 @@ export const WorkspaceScheduleForm: FC = ({ - + {Language.daysOfWeekLabel} - + {checkboxes.map((checkbox) => ( { <> {pageTitle(workspaceName, "Schedule")} - + Workspace Schedule diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx index 0b388e913ed07..5b5ede52d0529 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx @@ -17,6 +17,7 @@ import { Spinner } from "components/Spinner/Spinner"; import { useFormik } from "formik"; import upperFirst from "lodash/upperFirst"; import type { FC } from "react"; +import { cn } from "utils/cn"; import { getFormHelpers, nameValidator, @@ -75,7 +76,10 @@ export const WorkspaceSettingsForm: FC = ({ autoFocus fullWidth label="Name" - css={workspace.allow_renames && styles.nameWarning} + className={cn([ + workspace.allow_renames && + "[& .MuiFormHelperText-root]:text-warning-light", + ])} helperText={ workspace.allow_renames ? form.values.name !== form.initialValues.name && @@ -131,11 +135,3 @@ export const WorkspaceSettingsForm: FC = ({ ); }; - -const styles = { - nameWarning: (theme: Theme) => ({ - "& .MuiFormHelperText-root": { - color: theme.palette.warning.light, - }, - }), -}; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx index 57bf6a07df80a..1bdbe27c5bae3 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx @@ -46,7 +46,7 @@ export const WorkspaceSettingsLayout: FC = () => { {pageTitle(workspaceName, "Settings")} - + {isError ? ( ) : ( @@ -54,7 +54,7 @@ export const WorkspaceSettingsLayout: FC = () => { }> -
+
diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.tsx index beedf9dffc48f..d080234bb4d38 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.tsx @@ -18,11 +18,7 @@ export const WorkspaceSettingsPageView: FC = ({ }) => { return ( <> - + Workspace Settings diff --git a/site/src/pages/WorkspacesPage/WorkspacesButton.tsx b/site/src/pages/WorkspacesPage/WorkspacesButton.tsx index 38e5adc10c2e5..7bd121fb22b76 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesButton.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesButton.tsx @@ -19,6 +19,7 @@ import { Link as RouterLink, type LinkProps as RouterLinkProps, } from "react-router"; +import { cn } from "utils/cn"; type TemplatesQuery = UseQueryResult; @@ -72,15 +73,7 @@ export const WorkspacesButton: FC = ({ aria-label="Template select for workspace" /> - + {templatesFetchStatus === "pending" ? ( ) : ( @@ -94,20 +87,10 @@ export const WorkspacesButton: FC = ({ )} -
({ - padding: "8px 0", - borderTop: `1px solid ${theme.palette.divider}`, - })} - > +
({ - display: "flex", - alignItems: "center", - columnGap: 12, - color: theme.palette.primary.main, - })} + className="flex items-center gap-x-3 text-content-link" > See all templates @@ -131,11 +114,7 @@ const WorkspaceResultsRow: FC = ({ template }) => { return ( = ({ template }) => { fallback={template.display_name || template.name} /> -
({ - color: theme.palette.text.primary, - display: "flex", - flexDirection: "column", - lineHeight: "140%", - fontSize: 14, - overflow: "hidden", - })} - > - +
+ {template.display_name || template.name || "[Unnamed]"} - ({ - fontSize: 13, - color: theme.palette.text.secondary, - })} - > + {/* * There are some templates that have -1 as their user count – * basically functioning like a null value in JS. Can safely just @@ -176,24 +141,19 @@ const WorkspaceResultsRow: FC = ({ template }) => { ); }; -const PopoverLink: FC = ({ children, ...linkProps }) => { +const PopoverLink: FC = ({ + children, + className, + ...linkProps +}) => { return ( ({ - color: theme.palette.text.primary, - padding: "8px 16px", - fontSize: 14, - outline: "none", - textDecoration: "none", - "&:focus": { - backgroundColor: theme.palette.action.focus, - }, - "&:hover": { - textDecoration: "none", - backgroundColor: theme.palette.action.hover, - }, - })} + className={cn( + className, + "text-sky-500 px-4 py-2 text-sm outline-none no-underline", + "focus:bg-surface-tertiary hover:no-underline hover:bg-zinc-800", + )} > {children} diff --git a/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx b/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx index 06250c181789a..b442eadd45b29 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx @@ -201,18 +201,14 @@ export const WorkspacesPageView: FC = ({ limit={limit} totalRecords={count} currentOffsetStart={(page - 1) * limit + 1} - css={{ paddingBottom: "0" }} + className="pb-0" /> ) )} - {pageNumberIsInvalid ? ( ({ - border: `1px solid ${theme.palette.divider}`, - borderRadius: theme.shape.borderRadius, - })} + className="border border-solid border-zinc-700 rounded-md" message="Page not found" description="The page you are trying to access does not exist." cta={ @@ -243,7 +239,7 @@ export const WorkspacesPageView: FC = ({ // Temporary styling stopgap before component is migrated to using // PaginationContainer (which renders PaginationWidgetBase using CSS // flexbox gaps) -
+
Date: Mon, 8 Dec 2025 06:46:54 +0000 Subject: [PATCH 02/29] fix: resolve `` issues --- site/src/components/Alert/Alert.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/site/src/components/Alert/Alert.tsx b/site/src/components/Alert/Alert.tsx index b0db11f0c8da5..65d826daf60de 100644 --- a/site/src/components/Alert/Alert.tsx +++ b/site/src/components/Alert/Alert.tsx @@ -11,6 +11,7 @@ import { type ReactNode, useState, } from "react"; +import { cn } from "utils/cn"; export type AlertColor = MuiAlertColor; export type AlertProps = MuiAlertProps & { @@ -40,7 +41,7 @@ export const Alert: FC = ({ @@ -72,7 +73,10 @@ export const Alert: FC = ({ export const AlertDetail: FC = ({ children }) => { return ( - + {children} ); From e228572392a0c1ae413ff0397828aee9c2ea1860 Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Mon, 8 Dec 2025 06:58:04 +0000 Subject: [PATCH 03/29] fix: resolve `
` --- site/src/pages/DeploymentSettingsPage/Fieldset.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/site/src/pages/DeploymentSettingsPage/Fieldset.tsx b/site/src/pages/DeploymentSettingsPage/Fieldset.tsx index f9c5cf5c26325..9414ba081afa9 100644 --- a/site/src/pages/DeploymentSettingsPage/Fieldset.tsx +++ b/site/src/pages/DeploymentSettingsPage/Fieldset.tsx @@ -25,13 +25,17 @@ export const Fieldset: FC = ({ return (
-
{title}
+
+ {title} +
{subtitle && ( -
{subtitle}
+
+ {subtitle} +
)}
{children} From dff4c4f3a373dee603e8ee771aad2f52ce074d7f Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Mon, 8 Dec 2025 07:02:45 +0000 Subject: [PATCH 04/29] chore: resolve `` --- site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx b/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx index 32833c780d26c..529c739847613 100644 --- a/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx @@ -120,7 +120,7 @@ export const WorkspaceBuildProgress: FC = ({ return null; } return ( -
+
{variant === "task" && (
From 22c50b0352cc49157277991be249d14c5bd52eac Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Mon, 8 Dec 2025 07:09:32 +0000 Subject: [PATCH 05/29] fix: resolve colors on `schedule-controls-autostop` --- site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx b/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx index 7f4115c0fbc0f..871b252603bae 100644 --- a/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx @@ -192,14 +192,14 @@ const AutostopDisplay: FC = ({ const display = ( {message} ); const controls = canUpdateSchedule && canEditDeadline(workspace) && ( -
+
Date: Mon, 8 Dec 2025 07:44:00 +0000 Subject: [PATCH 06/29] fix: resolve unused variables --- site/src/pages/WorkspacePage/ResourcesSidebar.tsx | 4 +--- .../WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx | 4 ---- site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx | 3 --- .../WorkspacePage/WorkspaceNotifications/Notifications.tsx | 2 +- .../WorkspaceNotifications/WorkspaceNotifications.tsx | 1 - site/src/pages/WorkspacePage/WorkspaceTopbar.tsx | 2 -- .../src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx | 1 - 7 files changed, 2 insertions(+), 15 deletions(-) diff --git a/site/src/pages/WorkspacePage/ResourcesSidebar.tsx b/site/src/pages/WorkspacePage/ResourcesSidebar.tsx index 3d85a6bea19e4..7cfb91f35f2a9 100644 --- a/site/src/pages/WorkspacePage/ResourcesSidebar.tsx +++ b/site/src/pages/WorkspacePage/ResourcesSidebar.tsx @@ -1,4 +1,4 @@ -import { type Interpolation, type Theme, useTheme } from "@emotion/react"; +import type { Interpolation, Theme } from "@emotion/react"; import Skeleton from "@mui/material/Skeleton"; import type { WorkspaceResource } from "api/typesGenerated"; import { @@ -22,8 +22,6 @@ export const ResourcesSidebar: FC = ({ isSelected, resources, }) => { - const theme = useTheme(); - return ( Resources diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx index 44a6ae38c1d7b..d13d182db1b68 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx @@ -1,5 +1,3 @@ -import { useTheme } from "@emotion/react"; -import visuallyHidden from "@mui/utils/visuallyHidden"; import { richParameters } from "api/queries/templates"; import { workspaceBuildParameters } from "api/queries/workspaceBuilds"; import type { @@ -104,8 +102,6 @@ const BuildParametersPopoverContent: FC = ({ onSubmit, setIsOpen, }) => { - const theme = useTheme(); - if ( !workspace.template_use_classic_parameter_flow && ephemeralParameters && diff --git a/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx b/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx index 58343c772b519..7df420d9b011a 100644 --- a/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx @@ -1,4 +1,3 @@ -import { useTheme } from "@emotion/react"; import type { ProvisionerJobLog } from "api/typesGenerated"; import { Loader } from "components/Loader/Loader"; import { WorkspaceBuildLogs } from "modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs"; @@ -11,8 +10,6 @@ interface WorkspaceBuildLogsSectionProps { export const WorkspaceBuildLogsSection: FC = ({ logs, }) => { - const theme = useTheme(); - return (
diff --git a/site/src/pages/WorkspacePage/WorkspaceNotifications/Notifications.tsx b/site/src/pages/WorkspacePage/WorkspaceNotifications/Notifications.tsx index 776d4b8ba929e..515e498480a3e 100644 --- a/site/src/pages/WorkspacePage/WorkspaceNotifications/Notifications.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceNotifications/Notifications.tsx @@ -1,4 +1,4 @@ -import { type Interpolation, type Theme, useTheme } from "@emotion/react"; +import { useTheme } from "@emotion/react"; import type { AlertProps } from "components/Alert/Alert"; import { Button, type ButtonProps } from "components/Button/Button"; import { Pill } from "components/Pill/Pill"; diff --git a/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx b/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx index dbff2e55fdc1c..630c3b5078046 100644 --- a/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx @@ -1,4 +1,3 @@ -import type { Interpolation, Theme } from "@emotion/react"; import { workspaceResolveAutostart } from "api/queries/workspaceQuota"; import type { Template, diff --git a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx index 1b3649e423daa..f16083e071689 100644 --- a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx @@ -1,4 +1,3 @@ -import { useTheme } from "@emotion/react"; import Link from "@mui/material/Link"; import { workspaceQuota } from "api/queries/workspaceQuota"; import type * as TypesGen from "api/typesGenerated"; @@ -73,7 +72,6 @@ export const WorkspaceTopbar: FC = ({ }) => { const { entitlements, organizations, showOrganizations } = useDashboard(); const getLink = useLinks(); - const theme = useTheme(); // Quota const hasDailyCost = workspace.latest_build.daily_cost > 0; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx index 5b5ede52d0529..1654836a531a5 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx @@ -1,4 +1,3 @@ -import type { Theme } from "@emotion/react"; import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { From 84fb26de6884880494cbe215bdca11dfad2840d2 Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Mon, 8 Dec 2025 13:26:53 +0000 Subject: [PATCH 07/29] feat: "v2" of changes (WIP) --- site/src/components/Avatar/AvatarCard.tsx | 12 +- site/src/components/Badges/Badges.stories.tsx | 12 ++ site/src/components/Badges/Badges.tsx | 161 ++++++------------ .../components/CodeExample/CodeExample.tsx | 50 ++---- .../Dialogs/DeleteDialog/DeleteDialog.tsx | 17 +- .../DropdownArrow/DropdownArrow.tsx | 16 +- site/src/components/Filter/Filter.tsx | 16 +- site/src/components/Filter/SelectFilter.tsx | 6 +- site/src/components/Form/Form.tsx | 4 +- site/src/components/FullPageLayout/Topbar.tsx | 22 +-- .../GlobalSnackbar/GlobalSnackbar.tsx | 4 +- .../components/HelpTooltip/HelpTooltip.tsx | 10 +- site/src/components/IconField/IconField.tsx | 30 ++-- site/src/components/Logs/Logs.tsx | 2 +- site/src/components/Margins/Margins.tsx | 4 +- site/src/components/Markdown/Markdown.tsx | 8 +- site/src/components/Menu/MenuSearch.tsx | 3 +- .../OverflowY/OverflowY.stories.tsx | 5 +- site/src/components/OverflowY/OverflowY.tsx | 4 +- .../PageHeader/FullWidthPageHeader.tsx | 33 +--- site/src/components/PageHeader/PageHeader.tsx | 28 +-- site/src/modules/apps/AppStatusStateIcon.tsx | 3 +- .../LicenseBanner/LicenseBannerView.tsx | 103 ++++++----- .../OrganizationSettingsPageView.tsx | 4 +- .../TemplateSchedulePage/ScheduleDialog.tsx | 4 +- .../TemplateVersionEditor.tsx | 111 ++---------- .../SSHKeysPage/SSHKeysPageView.tsx | 23 +-- .../SecurityPage/SingleSignOnSection.tsx | 17 +- .../WorkspaceProxyPage/WorkspaceProxyRow.tsx | 26 +-- .../UsersPage/UsersTable/UserGroupsCell.tsx | 22 +-- .../UsersPage/UsersTable/UsersTableBody.tsx | 2 +- .../pages/WorkspacePage/ResourceMetadata.tsx | 50 ++---- 32 files changed, 230 insertions(+), 582 deletions(-) diff --git a/site/src/components/Avatar/AvatarCard.tsx b/site/src/components/Avatar/AvatarCard.tsx index 187c9ffa50cdd..3b1a4f57c091f 100644 --- a/site/src/components/Avatar/AvatarCard.tsx +++ b/site/src/components/Avatar/AvatarCard.tsx @@ -39,16 +39,8 @@ export const AvatarCard: FC = ({

{header}

diff --git a/site/src/components/Badges/Badges.stories.tsx b/site/src/components/Badges/Badges.stories.tsx index 36c8fddb37ea9..2deca004660a1 100644 --- a/site/src/components/Badges/Badges.stories.tsx +++ b/site/src/components/Badges/Badges.stories.tsx @@ -2,8 +2,10 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { AlphaBadge, Badges, + DeprecatedBadge, DisabledBadge, EnabledBadge, + EnterpriseBadge, EntitledBadge, HealthyBadge, NotHealthyBadge, @@ -50,6 +52,11 @@ export const Disabled: Story = { children: , }, }; +export const Enterprise: Story = { + args: { + children: , + }, +}; export const Premium: Story = { args: { children: , @@ -65,3 +72,8 @@ export const Alpha: Story = { children: , }, }; +export const Deprecated: Story = { + args: { + children: , + }, +}; diff --git a/site/src/components/Badges/Badges.tsx b/site/src/components/Badges/Badges.tsx index cef5288091373..f18a7134d00cc 100644 --- a/site/src/components/Badges/Badges.tsx +++ b/site/src/components/Badges/Badges.tsx @@ -1,5 +1,3 @@ -import type { Interpolation, Theme } from "@emotion/react"; -import { Stack } from "components/Stack/Stack"; import { Tooltip, TooltipContent, @@ -11,49 +9,44 @@ import { type HTMLAttributes, type PropsWithChildren, } from "react"; +import { cn } from "utils/cn"; -const styles = { - badge: { - fontSize: 10, - height: 24, - fontWeight: 600, - textTransform: "uppercase", - letterSpacing: "0.085em", - padding: "0 12px", - borderRadius: 9999, - display: "flex", - alignItems: "center", - width: "fit-content", - whiteSpace: "nowrap", - }, - - enabledBadge: (theme) => ({ - border: `1px solid ${theme.roles.success.outline}`, - backgroundColor: theme.roles.success.background, - color: theme.roles.success.text, - }), - errorBadge: (theme) => ({ - border: `1px solid ${theme.roles.error.outline}`, - backgroundColor: theme.roles.error.background, - color: theme.roles.error.text, - }), - warnBadge: (theme) => ({ - border: `1px solid ${theme.roles.warning.outline}`, - backgroundColor: theme.roles.warning.background, - color: theme.roles.warning.text, - }), -} satisfies Record>; +const badgeClasses = { + root: [ + "text-[10px] h-6 font-semibold uppercase tracking-[0.085em]", + "px-3 rounded-full flex items-center w-fit whitespace-nowrap", + "border border-solid", + ], + enabled: ["border-green-500 bg-green-950 text-green-50"], + error: ["border-red-600 bg-red-950 text-red-50"], + warn: ["border-amber-300 bg-amber-950 text-amber-50"], + enterprise: ["border-blue-400 bg-blue-950 text-blue-50"], + disabled: ["border-zinc-700 bg-zinc-900 text-white"], + premium: ["border-violet-400 bg-violet-950 text-violet-50"], + preview: ["border-violet-500 bg-violet-950 text-violet-50"], + deprecated: ["border-orange-500 bg-orange-950 text-orange-50"], +} as const; export const EnabledBadge: FC = () => { return ( - + Enabled ); }; export const EntitledBadge: FC = () => { - return Entitled; + return ( + + Entitled + + ); }; interface HealthyBadge { @@ -61,21 +54,25 @@ interface HealthyBadge { } export const HealthyBadge: FC = ({ derpOnly }) => { return ( - + {derpOnly ? "Healthy (DERP only)" : "Healthy"} ); }; export const NotHealthyBadge: FC = () => { - return Unhealthy; + return ( + Unhealthy + ); }; export const NotRegisteredBadge: FC = () => { return ( - Never seen + + Never seen + Workspace Proxy has never come online and needs to be started. @@ -88,7 +85,9 @@ export const NotReachableBadge: FC = () => { return ( - Not reachable + + Not reachable + Workspace Proxy not responding to http(s) requests. @@ -105,15 +104,11 @@ export const DisabledBadge: FC = forwardRef< ({ - border: `1px solid ${theme.experimental.l1.outline}`, - backgroundColor: theme.experimental.l1.background, - color: theme.experimental.l1.text, - }), - ]} - className="option-disabled" + className={cn([ + "option-disabled", + badgeClasses.root, + badgeClasses.disabled, + ])} > Disabled @@ -122,16 +117,7 @@ export const DisabledBadge: FC = forwardRef< export const EnterpriseBadge: FC = () => { return ( - ({ - backgroundColor: theme.branding.enterprise.background, - border: `1px solid ${theme.branding.enterprise.border}`, - color: theme.branding.enterprise.text, - }), - ]} - > + Enterprise ); @@ -139,67 +125,25 @@ export const EnterpriseBadge: FC = () => { export const PremiumBadge: FC = () => { return ( - ({ - backgroundColor: theme.branding.premium.background, - border: `1px solid ${theme.branding.premium.border}`, - color: theme.branding.premium.text, - }), - ]} - > - Premium - + Premium ); }; export const PreviewBadge: FC = () => { return ( - ({ - border: `1px solid ${theme.roles.preview.outline}`, - backgroundColor: theme.roles.preview.background, - color: theme.roles.preview.text, - }), - ]} - > - Preview - + Preview ); }; export const AlphaBadge: FC = () => { return ( - ({ - border: `1px solid ${theme.roles.preview.outline}`, - backgroundColor: theme.roles.preview.background, - color: theme.roles.preview.text, - }), - ]} - > - Alpha - + Alpha ); }; export const DeprecatedBadge: FC = () => { return ( - ({ - border: `1px solid ${theme.roles.danger.outline}`, - backgroundColor: theme.roles.danger.background, - color: theme.roles.danger.text, - }), - ]} - > + Deprecated ); @@ -207,13 +151,6 @@ export const DeprecatedBadge: FC = () => { export const Badges: FC = ({ children }) => { return ( - - {children} - +
{children}
); }; diff --git a/site/src/components/CodeExample/CodeExample.tsx b/site/src/components/CodeExample/CodeExample.tsx index 42759889fd1eb..c349884d7775a 100644 --- a/site/src/components/CodeExample/CodeExample.tsx +++ b/site/src/components/CodeExample/CodeExample.tsx @@ -1,4 +1,3 @@ -import type { Interpolation, Theme } from "@emotion/react"; import { Button } from "components/Button/Button"; import { Tooltip, @@ -7,7 +6,7 @@ import { } from "components/Tooltip/Tooltip"; import { EyeIcon, EyeOffIcon } from "lucide-react"; import { type FC, useState } from "react"; -import { MONOSPACE_FONT_FAMILY } from "theme/constants"; +import { cn } from "utils/cn"; import { CopyButton } from "../CopyButton/CopyButton"; interface CodeExampleProps { @@ -52,8 +51,21 @@ export const CodeExample: FC = ({ ); return ( -
- +
+ {secret ? ( <> {/* @@ -99,33 +111,3 @@ export const CodeExample: FC = ({ function obfuscateText(text: string): string { return new Array(text.length).fill("*").join(""); } - -const styles = { - container: (theme) => ({ - cursor: "pointer", - display: "flex", - flexDirection: "row", - alignItems: "center", - color: theme.experimental.l1.text, - fontFamily: MONOSPACE_FONT_FAMILY, - fontSize: 14, - borderRadius: 8, - padding: 8, - lineHeight: "150%", - border: `1px solid ${theme.experimental.l1.outline}`, - - "&:hover": { - backgroundColor: theme.experimental.l2.hover.background, - }, - }), - - code: { - padding: "0 8px", - flexGrow: 1, - wordBreak: "break-all", - }, - - secret: { - "-webkit-text-security": "disc", // also supported by firefox - }, -} satisfies Record>; diff --git a/site/src/components/Dialogs/DeleteDialog/DeleteDialog.tsx b/site/src/components/Dialogs/DeleteDialog/DeleteDialog.tsx index 851dd5534c836..cdc4b63949e63 100644 --- a/site/src/components/Dialogs/DeleteDialog/DeleteDialog.tsx +++ b/site/src/components/Dialogs/DeleteDialog/DeleteDialog.tsx @@ -1,4 +1,3 @@ -import type { Interpolation, Theme } from "@emotion/react"; import TextField from "@mui/material/TextField"; import { type FC, type FormEvent, useId, useState } from "react"; import { Stack } from "../../Stack/Stack"; @@ -67,7 +66,11 @@ export const DeleteDialog: FC = ({ {verb ?? "Deleting"} this {entity} is irreversible!

- {Boolean(info) &&
{info}
} + {Boolean(info) && ( +
+ {info} +
+ )}

Type {name} below to confirm. @@ -105,13 +108,3 @@ export const DeleteDialog: FC = ({ /> ); }; - -const styles = { - callout: (theme) => ({ - backgroundColor: theme.roles.danger.background, - border: `1px solid ${theme.roles.danger.outline}`, - borderRadius: theme.shape.borderRadius, - color: theme.roles.danger.text, - padding: "8px 16px", - }), -} satisfies Record>; diff --git a/site/src/components/DropdownArrow/DropdownArrow.tsx b/site/src/components/DropdownArrow/DropdownArrow.tsx index a791f2e26e1cc..abf230b5f8a90 100644 --- a/site/src/components/DropdownArrow/DropdownArrow.tsx +++ b/site/src/components/DropdownArrow/DropdownArrow.tsx @@ -1,6 +1,6 @@ -import type { Interpolation, Theme } from "@emotion/react"; import { ChevronDownIcon, ChevronUpIcon } from "lucide-react"; import type { FC } from "react"; +import { cn } from "utils/cn"; interface ArrowProps { margin?: boolean; @@ -18,20 +18,8 @@ export const DropdownArrow: FC = ({ return ( ); }; - -const styles = { - base: { - color: "currentcolor", - width: 16, - height: 16, - }, - - withMargin: { - marginLeft: 8, - }, -} satisfies Record>; diff --git a/site/src/components/Filter/Filter.tsx b/site/src/components/Filter/Filter.tsx index 1ee162acccf99..18ddaf2b8c395 100644 --- a/site/src/components/Filter/Filter.tsx +++ b/site/src/components/Filter/Filter.tsx @@ -15,6 +15,7 @@ import { SearchField } from "components/SearchField/SearchField"; import { useDebouncedFunction } from "hooks/debounce"; import { ChevronDownIcon, ExternalLinkIcon } from "lucide-react"; import { type FC, type ReactNode, useEffect, useRef, useState } from "react"; +import { cn } from "utils/cn"; type PresetFilter = { name: string; @@ -133,8 +134,8 @@ const BaseSkeleton: FC = ({ children, ...skeletonProps }) => { {...skeletonProps} css={(theme) => ({ backgroundColor: theme.palette.background.paper, - borderRadius: "6px", })} + className={cn("rounded-md", skeletonProps.className)} > {children} @@ -142,7 +143,7 @@ const BaseSkeleton: FC = ({ children, ...skeletonProps }) => { }; export const MenuSkeleton: FC = () => { - return ; + return ; }; type FilterProps = { @@ -201,12 +202,9 @@ export const Filter: FC = ({ return (

= ({ ) : ( <> - + filter.update(query)} presets={presets} @@ -228,7 +226,7 @@ export const Filter: FC = ({ learnMoreLink2={learnMoreLink2} /> = ({ > {presets.map((presetFilter) => ( { onSelect(presetFilter.query); diff --git a/site/src/components/Filter/SelectFilter.tsx b/site/src/components/Filter/SelectFilter.tsx index 786698e230b7a..4f13c8684ad96 100644 --- a/site/src/components/Filter/SelectFilter.tsx +++ b/site/src/components/Filter/SelectFilter.tsx @@ -97,13 +97,9 @@ export const SelectFilter: FC = ({ ) : (
({ - display: "flex", - alignItems: "center", - justifyContent: "center", - padding: 32, color: theme.palette.text.secondary, - lineHeight: 1, })} + className="flex items-center justify-center p-8 leading-none" > {emptyText || "No options found"}
diff --git a/site/src/components/Form/Form.tsx b/site/src/components/Form/Form.tsx index d535a63642324..08c0b3fffc2db 100644 --- a/site/src/components/Form/Form.tsx +++ b/site/src/components/Form/Form.tsx @@ -29,11 +29,9 @@ export const Form: FC = ({ direction, ...formProps }) => { > = (props) => {
); }; @@ -39,15 +37,11 @@ export const TopbarIconButton = forwardRef( {...props} size="small" css={{ - padding: 0, - borderRadius: 0, - height: 48, - width: 48, - "& svg": { fontSize: 20, }, }} + className="p-0 rounded-none size-12" /> ); }, @@ -60,17 +54,7 @@ export const TopbarButton = forwardRef( ); export const TopbarData: FC> = (props) => { - return ( -
- ); + return
; }; export const TopbarDivider: FC> = (props) => { diff --git a/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx b/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx index 081bdf7f3a826..9eed091766c6a 100644 --- a/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx +++ b/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx @@ -46,7 +46,7 @@ export const GlobalSnackbar: FC = () => { } anchorOrigin={{ vertical: "bottom", horizontal: "right" }} message={ -
+
{notificationMsg.msgType === MsgType.Error && ( )} @@ -85,7 +85,7 @@ const AdditionalMessageDisplay: FC = ({ if (isNotificationList(message)) { return ( -
    +
      {message.map((item, idx) => (
    • {item} diff --git a/site/src/components/HelpTooltip/HelpTooltip.tsx b/site/src/components/HelpTooltip/HelpTooltip.tsx index 7b73aec7067e4..51f87cd73c8a3 100644 --- a/site/src/components/HelpTooltip/HelpTooltip.tsx +++ b/site/src/components/HelpTooltip/HelpTooltip.tsx @@ -84,15 +84,6 @@ export const HelpTooltipIconTrigger = forwardRef< ref={ref} css={[ css` - display: flex; - align-items: center; - justify-content: center; - padding: 4px 0; - border: 0; - background: transparent; - cursor: pointer; - color: inherit; - & svg { width: ${getIconSpacingFromSize(size)}px; height: ${getIconSpacingFromSize(size)}px; @@ -100,6 +91,7 @@ export const HelpTooltipIconTrigger = forwardRef< `, hoverEffect ? hoverEffectStyles : null, ]} + className="flex items-center justify-center py-1 border-none bg-transparent cursor-pointer text-inherit" > {children} diff --git a/site/src/components/IconField/IconField.tsx b/site/src/components/IconField/IconField.tsx index 4c6156899b1f1..30d013b2fc0a7 100644 --- a/site/src/components/IconField/IconField.tsx +++ b/site/src/components/IconField/IconField.tsx @@ -48,18 +48,7 @@ export const IconField: FC = ({ endAdornment: hasIcon ? ( = ({ {/* - - This component takes a long time to load (easily several seconds), so we - don't want to wait until the user actually clicks the button to start loading. - Unfortunately, React doesn't provide an API to start warming a lazy component, - so we just have to sneak it into the DOM, which is kind of annoying, but means - that users shouldn't ever spend time waiting for it to load. - - Except we don't do it when running tests, because Jest doesn't define - `IntersectionObserver`, and it would make them slower anyway. */} + - This component takes a long time to load (easily several seconds), so we + don't want to wait until the user actually clicks the button to start loading. + Unfortunately, React doesn't provide an API to start warming a lazy component, + so we just have to sneak it into the DOM, which is kind of annoying, but means + that users shouldn't ever spend time waiting for it to load. + - Except we don't do it when running tests, because Jest doesn't define + `IntersectionObserver`, and it would make them slower anyway. + */} {process.env.NODE_ENV !== "test" && ( -
      +
      {}} /> diff --git a/site/src/components/Logs/Logs.tsx b/site/src/components/Logs/Logs.tsx index 75a7acc961913..cf40855b34b15 100644 --- a/site/src/components/Logs/Logs.tsx +++ b/site/src/components/Logs/Logs.tsx @@ -18,7 +18,7 @@ export const Logs: FC = ({ }) => { return (
      -
      +
      {lines.map((line) => ( {!hideTimestamps && ( diff --git a/site/src/components/Margins/Margins.tsx b/site/src/components/Margins/Margins.tsx index cd7a9db9e4b62..2e2ed8242a5eb 100644 --- a/site/src/components/Margins/Margins.tsx +++ b/site/src/components/Margins/Margins.tsx @@ -27,13 +27,11 @@ export const Margins: FC = ({
      {children}
      diff --git a/site/src/components/Markdown/Markdown.tsx b/site/src/components/Markdown/Markdown.tsx index d131861e35aa5..f0ee50432dbde 100644 --- a/site/src/components/Markdown/Markdown.tsx +++ b/site/src/components/Markdown/Markdown.tsx @@ -85,12 +85,10 @@ export const Markdown: FC = (props) => { ) : ( ({ - padding: "1px 4px", background: theme.palette.divider, - borderRadius: 4, color: theme.palette.text.primary, - fontSize: 14, })} + className="py-[1px] px-1 rounded-sm text-sm leading-none" {...props} > {children} @@ -206,12 +204,10 @@ export const InlineMarkdown: FC = (props) => { code: ({ node, className, children, style, ...props }) => ( ({ - padding: "1px 4px", background: theme.palette.divider, - borderRadius: 4, color: theme.palette.text.primary, - fontSize: 14, })} + className="py-[1px] px-1 rounded-sm text-sm leading-none" {...props} > {children} diff --git a/site/src/components/Menu/MenuSearch.tsx b/site/src/components/Menu/MenuSearch.tsx index c7e6607d9d0a7..99c7720544560 100644 --- a/site/src/components/Menu/MenuSearch.tsx +++ b/site/src/components/Menu/MenuSearch.tsx @@ -9,13 +9,12 @@ export const MenuSearch: FC = (props) => { fullWidth css={(theme) => ({ "& fieldset": { - border: 0, - borderRadius: 0, // MUI has so many nested selectors that it's easier to just // override the border directly using the `!important` hack borderBottom: `1px solid ${theme.palette.divider} !important`, }, })} + className={"[& fieldset]:border-0 [& fieldset]:rounded-none"} {...props} /> ); diff --git a/site/src/components/OverflowY/OverflowY.stories.tsx b/site/src/components/OverflowY/OverflowY.stories.tsx index 65a76755ef3a2..d1e3e61f48dd7 100644 --- a/site/src/components/OverflowY/OverflowY.stories.tsx +++ b/site/src/components/OverflowY/OverflowY.stories.tsx @@ -15,12 +15,9 @@ const meta: Meta = {

      Element {num}

      diff --git a/site/src/components/OverflowY/OverflowY.tsx b/site/src/components/OverflowY/OverflowY.tsx index 46c553f8a37f1..3513283ae84bb 100644 --- a/site/src/components/OverflowY/OverflowY.tsx +++ b/site/src/components/OverflowY/OverflowY.tsx @@ -28,12 +28,10 @@ export const OverflowY: FC = ({ return (
      {children} diff --git a/site/src/components/PageHeader/FullWidthPageHeader.tsx b/site/src/components/PageHeader/FullWidthPageHeader.tsx index f369c88fb619e..ea40a8edffd6b 100644 --- a/site/src/components/PageHeader/FullWidthPageHeader.tsx +++ b/site/src/components/PageHeader/FullWidthPageHeader.tsx @@ -1,5 +1,6 @@ import { type CSSObject, useTheme } from "@emotion/react"; import type { FC, PropsWithChildren, ReactNode } from "react"; +import { cn } from "utils/cn"; interface FullWidthPageHeaderProps { children?: ReactNode; @@ -17,16 +18,8 @@ export const FullWidthPageHeader: FC = ({ css={[ { ...(theme.typography.body2 as CSSObject), - padding: 24, background: theme.palette.background.default, borderBottom: `1px solid ${theme.palette.divider}`, - display: "flex", - alignItems: "center", - gap: 48, - - zIndex: 10, - flexWrap: "wrap", - [theme.breakpoints.down("lg")]: { position: "unset", alignItems: "flex-start", @@ -35,11 +28,11 @@ export const FullWidthPageHeader: FC = ({ flexDirection: "column", }, }, - sticky && { - position: "sticky", - top: 0, - }, ]} + className={cn( + "p-6 flex items-center gap-12 z-10 flex-wrap", + sticky && "sticky top-0", + )} > {children}
@@ -63,18 +56,7 @@ const _PageHeaderActions: FC = ({ children }) => { }; export const PageHeaderTitle: FC = ({ children }) => { - return ( -

- {children} -

- ); + return

{children}

; }; export const PageHeaderSubtitle: FC = ({ children }) => { @@ -82,10 +64,9 @@ export const PageHeaderSubtitle: FC = ({ children }) => { return ( {children} diff --git a/site/src/components/PageHeader/PageHeader.tsx b/site/src/components/PageHeader/PageHeader.tsx index c839700c995ac..42294f98c718d 100644 --- a/site/src/components/PageHeader/PageHeader.tsx +++ b/site/src/components/PageHeader/PageHeader.tsx @@ -1,4 +1,5 @@ import type { FC, PropsWithChildren, ReactNode } from "react"; +import { cn } from "utils/cn"; import { Stack } from "../Stack/Stack"; interface PageHeaderProps { @@ -14,19 +15,13 @@ export const PageHeader: FC = ({ }) => { return (
({ - display: "flex", - alignItems: "center", - paddingTop: 48, - paddingBottom: 48, - gap: 32, - [theme.breakpoints.down("md")]: { flexDirection: "column", alignItems: "flex-start", }, })} + className={cn("flex items-center py-12 gap-8", className)} data-testid="header" >
{children}
@@ -51,18 +46,7 @@ export const PageHeader: FC = ({ export const PageHeaderTitle: FC = ({ children }) => { return ( -

- {children} -

+

{children}

); }; @@ -78,14 +62,10 @@ export const PageHeaderSubtitle: FC = ({ return (

({ - fontSize: 16, color: theme.palette.text.secondary, - fontWeight: 400, - display: "block", - margin: 0, marginTop: condensed ? 4 : 8, - lineHeight: "140%", })} + className="text-base font-normal block m-0" > {children}

diff --git a/site/src/modules/apps/AppStatusStateIcon.tsx b/site/src/modules/apps/AppStatusStateIcon.tsx index 1800c81958c4e..7f724140a0338 100644 --- a/site/src/modules/apps/AppStatusStateIcon.tsx +++ b/site/src/modules/apps/AppStatusStateIcon.tsx @@ -36,9 +36,8 @@ export const AppStatusStateIcon: FC = ({ // remove the stroke so it is not overly thick. return ( = ({ const isError = errors.length > 0; const messages = [...errors, ...warnings]; const type = isError ? "error" : "warning"; - - const containerStyles = css` - ${theme.typography.body2 as CSSObject} - - display: flex; - align-items: center; - padding: 12px; - background-color: ${theme.roles[type].background}; - `; - const textColor = theme.roles[type].text; - if (messages.length === 1) { - return ( -
- {Language.licenseIssue} -
- {formatMessage(messages[0])} -   - - {messages[0] === LicenseTelemetryRequiredErrorText - ? Language.exception - : Language.upgrade} - -
-
- ); - } - return ( -
- {Language.licenseIssues(messages.length)} +
+ + {messages.length === 1 + ? Language.licenseIssue + : Language.licenseIssues(messages.length)} +
-
- {Language.exceeded} -   - - {Language.upgrade} - -
- -
    - {messages.map((message) => ( -
  • - {formatMessage(message)} -
  • - ))} -
-
+ {messages.length === 1 ? ( + <> + {formatMessage(messages[0])} +   + + {messages[0] === LicenseTelemetryRequiredErrorText + ? Language.exception + : Language.upgrade} + + + ) : ( + <> +
+ {Language.exceeded} +   + + {Language.upgrade} + +
+ +
    + {messages.map((message) => ( +
  • + {formatMessage(message)} +
  • + ))} +
+
+ + )}
); diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.tsx index a5891df618471..bc7ac515214f8 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.tsx @@ -74,7 +74,7 @@ export const OrganizationSettingsPageView: FC< {Boolean(error) && !isApiValidationError(error) && ( -
+
)} @@ -89,7 +89,7 @@ export const OrganizationSettingsPageView: FC< >
= ({ inactivity period for all template workspaces?

= ({ dormancy period for all template workspaces?

= ({ return ( <> -
- +
+
@@ -242,12 +236,8 @@ export const TemplateVersionEditor: FC = ({ to={templateLink} css={{ color: theme.palette.text.primary, - textDecoration: "none", - - "&:hover": { - textDecoration: "underline", - }, }} + className="no-underline hover:underline" > {template.display_name || template.name} @@ -257,15 +247,7 @@ export const TemplateVersionEditor: FC = ({ -
+ -
+
{publishedVersion && (
= ({ )} -
+
= ({
= ({ /> -
-
+
+
{activePath ? ( isEditorValueBinary ? (
-
+
-

+

The file is not displayed in the text editor because it is either binary or uses an unsupported text encoding.

@@ -530,19 +461,16 @@ export const TemplateVersionEditor: FC = ({
= ({ onClick={() => { setSelectedTab(undefined); }} - css={{ - marginLeft: "auto", - width: 36, - height: 36, - borderRadius: 0, - }} + className="ml-auto size-9 rounded-none" > @@ -619,7 +542,7 @@ export const TemplateVersionEditor: FC = ({ tags={templateVersion.job.tags} variant={AlertVariant.Inline} /> - + ) )} diff --git a/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPageView.tsx b/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPageView.tsx index 2bc0ad5d320c5..6694824d16fc4 100644 --- a/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPageView.tsx +++ b/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPageView.tsx @@ -1,4 +1,3 @@ -import { useTheme } from "@emotion/react"; import CircularProgress from "@mui/material/CircularProgress"; import type { GitSSHKey } from "api/typesGenerated"; import { ErrorAlert } from "components/Alert/ErrorAlert"; @@ -20,11 +19,9 @@ export const SSHKeysPageView: FC = ({ sshKey, onRegenerateClick, }) => { - const theme = useTheme(); - if (isLoading) { return ( -
+
); @@ -38,25 +35,11 @@ export const SSHKeysPageView: FC = ({ {sshKey && ( <> -

+

The following public key is used to authenticate Git in workspaces. You may add it to Git services (such as GitHub) that you need to access from your workspace. Coder configures authentication via{" "} - + $GIT_SSH_COMMAND . diff --git a/site/src/pages/UserSettingsPage/SecurityPage/SingleSignOnSection.tsx b/site/src/pages/UserSettingsPage/SecurityPage/SingleSignOnSection.tsx index d8f1a51f13d2b..55208a6264862 100644 --- a/site/src/pages/UserSettingsPage/SecurityPage/SingleSignOnSection.tsx +++ b/site/src/pages/UserSettingsPage/SecurityPage/SingleSignOnSection.tsx @@ -144,7 +144,7 @@ export const SingleSignOnSection: FC = ({ title="Single Sign On" description="Authenticate in Coder using one-click" > -

+
{userLoginType.login_type === "password" ? ( <> {authMethods.github.enabled && ( @@ -179,14 +179,9 @@ export const SingleSignOnSection: FC = ({
= ({ : getOIDCLabel(authMethods.oidc)} -
+
{userLoginType.login_type === "github" ? ( ) : ( @@ -235,11 +230,7 @@ const OIDCIcon: FC = ({ oidcAuth }) => { } return ( - Open ID Connect icon + Open ID Connect icon ); }; diff --git a/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx b/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx index 17fa32fc8443a..d80cdcaa9a2ff 100644 --- a/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx +++ b/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx @@ -76,22 +76,18 @@ export const ProxyRow: FC = ({ proxy, latency }) => { {latency ? `${latency.latencyMS.toFixed(0)} ms` : "Not available"} {shouldShowMessages && ( - + = ({ title, messages }) => { padding: "16px 64px", }} > -
+
{title}
{messages.map((error, index) => ( -
+				
 					{error}
 				
))} diff --git a/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx b/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx index 056f08a4e7b92..429b60c82adbc 100644 --- a/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx +++ b/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx @@ -1,4 +1,3 @@ -import { useTheme } from "@emotion/react"; import List from "@mui/material/List"; import ListItem from "@mui/material/ListItem"; import type { Group } from "api/typesGenerated"; @@ -20,28 +19,19 @@ type GroupsCellProps = { }; export const UserGroupsCell: FC = ({ userGroups }) => { - const theme = useTheme(); - return ( {userGroups === undefined ? ( // Felt right to add emphasis to the undefined state for semantics // ("hey, this isn't normal"), but the default italics looked weird in // the table UI - N/A + N/A ) : ( diff --git a/site/src/components/PageHeader/PageHeader.tsx b/site/src/components/PageHeader/PageHeader.tsx index 42294f98c718d..51d134c143141 100644 --- a/site/src/components/PageHeader/PageHeader.tsx +++ b/site/src/components/PageHeader/PageHeader.tsx @@ -46,7 +46,9 @@ export const PageHeader: FC = ({ export const PageHeaderTitle: FC = ({ children }) => { return ( -

{children}

+

+ {children} +

); }; @@ -65,7 +67,7 @@ export const PageHeaderSubtitle: FC = ({ color: theme.palette.text.secondary, marginTop: condensed ? 4 : 8, })} - className="text-base font-normal block m-0" + className="text-base font-normal block mb-0 leading-[1.4]" > {children}

From 64dd242e8423aa25c1db433e5bfe7e7a2fca53c9 Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Mon, 8 Dec 2025 23:56:15 +0000 Subject: [PATCH 09/29] fix: lint --- site/src/components/IconField/IconField.tsx | 1 - site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/site/src/components/IconField/IconField.tsx b/site/src/components/IconField/IconField.tsx index 30d013b2fc0a7..027c2238f327b 100644 --- a/site/src/components/IconField/IconField.tsx +++ b/site/src/components/IconField/IconField.tsx @@ -1,7 +1,6 @@ import { css, Global, useTheme } from "@emotion/react"; import InputAdornment from "@mui/material/InputAdornment"; import TextField, { type TextFieldProps } from "@mui/material/TextField"; -import { visuallyHidden } from "@mui/utils"; import { Button } from "components/Button/Button"; import { ExternalImage } from "components/ExternalImage/ExternalImage"; import { Loader } from "components/Loader/Loader"; diff --git a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx index c545044f3ee8d..51014f0fe98d7 100644 --- a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx +++ b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx @@ -1,6 +1,5 @@ import { type CSSObject, - css, type Interpolation, type Theme, useTheme, From fff1dc5e8f583d752501752f71c036ea4e51ccfe Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Mon, 8 Dec 2025 23:59:26 +0000 Subject: [PATCH 10/29] fix: resolve `` background color --- site/src/components/CodeExample/CodeExample.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/components/CodeExample/CodeExample.tsx b/site/src/components/CodeExample/CodeExample.tsx index c349884d7775a..58f4411b836da 100644 --- a/site/src/components/CodeExample/CodeExample.tsx +++ b/site/src/components/CodeExample/CodeExample.tsx @@ -56,7 +56,7 @@ export const CodeExample: FC = ({ "cursor-pointer flex flex-row items-center text-sm font-mono rounded-lg p-2", "leading-normal text-content-primary border border-solid", "border-gray-300 hover:bg-gray-200", - "dark:bg-zinc-800 dark:border-zinc-700 dark:hover:bg-zinc-800", + "dark:border-zinc-700 dark:hover:bg-zinc-800", className, )} > From 115d9918b89efbda626de97bd7a5bd1597805d93 Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Tue, 9 Dec 2025 00:01:03 +0000 Subject: [PATCH 11/29] fix: resolve `IconField` adornment size --- site/src/components/IconField/IconField.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/components/IconField/IconField.tsx b/site/src/components/IconField/IconField.tsx index 027c2238f327b..a5047e9a9ca31 100644 --- a/site/src/components/IconField/IconField.tsx +++ b/site/src/components/IconField/IconField.tsx @@ -47,7 +47,7 @@ export const IconField: FC = ({ endAdornment: hasIcon ? ( Date: Tue, 9 Dec 2025 00:02:13 +0000 Subject: [PATCH 12/29] chore: fix resolve `` sizing --- site/src/components/PageHeader/PageHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/components/PageHeader/PageHeader.tsx b/site/src/components/PageHeader/PageHeader.tsx index 51d134c143141..0eda021a3880d 100644 --- a/site/src/components/PageHeader/PageHeader.tsx +++ b/site/src/components/PageHeader/PageHeader.tsx @@ -21,7 +21,7 @@ export const PageHeader: FC = ({ alignItems: "flex-start", }, })} - className={cn("flex items-center py-12 gap-8", className)} + className={cn("flex items-center pt-2 pb-12 gap-8", className)} data-testid="header" >
{children}
From 674f47610729998201731c6f6339a5818a5f652d Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Tue, 9 Dec 2025 00:04:15 +0000 Subject: [PATCH 13/29] fix: resolve `` --- site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx b/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx index 429b60c82adbc..79cf7a0de76c6 100644 --- a/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx +++ b/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx @@ -31,7 +31,7 @@ export const UserGroupsCell: FC = ({ userGroups }) => { From f489159d15bb68bfe192e9b30c715a6bb4a5ef32 Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Tue, 9 Dec 2025 00:36:27 +0000 Subject: [PATCH 16/29] fix: properly center the ``'s --- site/src/components/Badges/Badges.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/components/Badges/Badges.tsx b/site/src/components/Badges/Badges.tsx index f18a7134d00cc..fe0a45db2dad1 100644 --- a/site/src/components/Badges/Badges.tsx +++ b/site/src/components/Badges/Badges.tsx @@ -15,7 +15,7 @@ const badgeClasses = { root: [ "text-[10px] h-6 font-semibold uppercase tracking-[0.085em]", "px-3 rounded-full flex items-center w-fit whitespace-nowrap", - "border border-solid", + "border border-solid leading-none", ], enabled: ["border-green-500 bg-green-950 text-green-50"], error: ["border-red-600 bg-red-950 text-red-50"], From f0a5e1020a34e853930394098609a628eefdc948 Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Tue, 9 Dec 2025 00:38:51 +0000 Subject: [PATCH 17/29] Revert "fix: resolve ``" This reverts commit f2b203ced5b0dfb395f17ec5d159f8dd772ecab7. --- site/src/components/HelpTooltip/HelpTooltip.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/components/HelpTooltip/HelpTooltip.tsx b/site/src/components/HelpTooltip/HelpTooltip.tsx index e88453a84eed1..403ec680424b5 100644 --- a/site/src/components/HelpTooltip/HelpTooltip.tsx +++ b/site/src/components/HelpTooltip/HelpTooltip.tsx @@ -91,7 +91,7 @@ export const HelpTooltipIconTrigger = forwardRef< `, hoverEffect ? hoverEffectStyles : null, ]} - className="flex items-center justify-center py-1 px-0 border-none bg-transparent cursor-pointer text-inherit opacity-100 hover:opacity-100" + className="flex items-center justify-center py-1 px-0 border-none bg-transparent cursor-pointer text-inherit" > {children} From 758a2f4cec8464bf995d9888c8e4a008abb5118e Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Tue, 9 Dec 2025 00:39:03 +0000 Subject: [PATCH 18/29] fix: merge classes on `` --- site/src/components/FullPageLayout/Topbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/components/FullPageLayout/Topbar.tsx b/site/src/components/FullPageLayout/Topbar.tsx index 10efade7e0871..d292a135e2e4b 100644 --- a/site/src/components/FullPageLayout/Topbar.tsx +++ b/site/src/components/FullPageLayout/Topbar.tsx @@ -24,7 +24,7 @@ export const Topbar: FC> = (props) => { fontSize: 13, lineHeight: "1.2", }} - className="min-h-12 flex items-center" + className={cn("min-h-12 flex items-center", props.className)} /> ); }; From 2d33d83d90e27aff667a887d24a8eef121f08bce Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Tue, 9 Dec 2025 00:45:37 +0000 Subject: [PATCH 19/29] chore: replace `10.5` with `[42px]` --- .../pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx index 92a84c2720094..41fdeeafae30b 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx @@ -318,7 +318,7 @@ export const TemplateVersionEditor: FC = ({ )} -
+
Date: Tue, 9 Dec 2025 02:02:07 +0000 Subject: [PATCH 20/29] chore: resolve `` mobile responsive --- site/src/components/PageHeader/PageHeader.tsx | 23 ++++--------------- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/site/src/components/PageHeader/PageHeader.tsx b/site/src/components/PageHeader/PageHeader.tsx index 51d134c143141..641076f2753d0 100644 --- a/site/src/components/PageHeader/PageHeader.tsx +++ b/site/src/components/PageHeader/PageHeader.tsx @@ -15,28 +15,15 @@ export const PageHeader: FC = ({ }) => { return (
({ - [theme.breakpoints.down("md")]: { - flexDirection: "column", - alignItems: "flex-start", - }, - })} - className={cn("flex items-center py-12 gap-8", className)} + className={cn( + "flex flex-col md:flex-row items-start md:items-center py-12 gap-8", + className, + )} data-testid="header" >
{children}
{actions && ( - ({ - marginLeft: "auto", - - [theme.breakpoints.down("md")]: { - marginLeft: "initial", - width: "100%", - }, - })} - > + {actions} )} From fb54ddf906802b740e8f4e344772a0ac7ed4143e Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Tue, 9 Dec 2025 02:10:34 +0000 Subject: [PATCH 21/29] fix: resolve `` --- .../pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx index 41fdeeafae30b..7a06d6094f70a 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx @@ -291,7 +291,7 @@ export const TemplateVersionEditor: FC = ({
-
+
{publishedVersion && (
Date: Tue, 9 Dec 2025 03:11:37 +0000 Subject: [PATCH 22/29] fix: resolve content paddings --- site/src/components/FullPageLayout/Sidebar.tsx | 5 +++-- site/src/components/FullPageLayout/Topbar.tsx | 2 +- site/src/components/HelpTooltip/HelpTooltip.tsx | 14 +++++--------- site/src/components/InfoTooltip/InfoTooltip.tsx | 15 ++++----------- .../components/OverflowY/OverflowY.stories.tsx | 2 +- .../components/PageHeader/FullWidthPageHeader.tsx | 7 ++----- site/src/components/PageHeader/PageHeader.tsx | 2 +- .../pages/GroupsPage/GroupSettingsPageView.tsx | 2 +- .../TemplateSettingsPageView.tsx | 2 +- .../TemplateSchedulePageView.tsx | 2 +- .../WorkspaceProxyPage/WorkspaceProxyRow.tsx | 10 ++++++++-- site/src/pages/WorkspacePage/ResourcesSidebar.tsx | 6 ++++-- .../WorkspacePage/WorkspaceBuildLogsSection.tsx | 2 +- .../WorkspaceSchedulePage.tsx | 2 +- .../WorkspaceSettingsLayout.tsx | 2 +- .../pages/WorkspacesPage/WorkspacesPageView.tsx | 2 +- 16 files changed, 36 insertions(+), 41 deletions(-) diff --git a/site/src/components/FullPageLayout/Sidebar.tsx b/site/src/components/FullPageLayout/Sidebar.tsx index f58e97ac607c2..6d0e1a4bb0b2c 100644 --- a/site/src/components/FullPageLayout/Sidebar.tsx +++ b/site/src/components/FullPageLayout/Sidebar.tsx @@ -66,12 +66,13 @@ export const SidebarIconButton: FC = ({ }) => { return ( ); }; diff --git a/site/src/components/FullPageLayout/Topbar.tsx b/site/src/components/FullPageLayout/Topbar.tsx index d292a135e2e4b..c33a91f305e88 100644 --- a/site/src/components/FullPageLayout/Topbar.tsx +++ b/site/src/components/FullPageLayout/Topbar.tsx @@ -41,7 +41,7 @@ export const TopbarIconButton = forwardRef( fontSize: 20, }, }} - className="p-0 rounded-none size-12" + className={cn("p-0 rounded-none size-12", props.className)} /> ); }, diff --git a/site/src/components/HelpTooltip/HelpTooltip.tsx b/site/src/components/HelpTooltip/HelpTooltip.tsx index 403ec680424b5..7d433e08b4c13 100644 --- a/site/src/components/HelpTooltip/HelpTooltip.tsx +++ b/site/src/components/HelpTooltip/HelpTooltip.tsx @@ -69,13 +69,6 @@ export const HelpTooltipIconTrigger = forwardRef< ...buttonProps } = props; - const hoverEffectStyles = css({ - opacity: 0.5, - "&:hover": { - opacity: 0.75, - }, - }); - return ( diff --git a/site/src/components/InfoTooltip/InfoTooltip.tsx b/site/src/components/InfoTooltip/InfoTooltip.tsx index 411d9aef69d1c..872d5c3ed0e88 100644 --- a/site/src/components/InfoTooltip/InfoTooltip.tsx +++ b/site/src/components/InfoTooltip/InfoTooltip.tsx @@ -26,7 +26,10 @@ export const InfoTooltip: FC = ({ return ( - + @@ -36,13 +39,3 @@ export const InfoTooltip: FC = ({ ); }; - -const styles = { - button: css` - opacity: 1; - - &:hover { - opacity: 1; - } - `, -} satisfies Record>; diff --git a/site/src/components/OverflowY/OverflowY.stories.tsx b/site/src/components/OverflowY/OverflowY.stories.tsx index d1e3e61f48dd7..5e762a995607c 100644 --- a/site/src/components/OverflowY/OverflowY.stories.tsx +++ b/site/src/components/OverflowY/OverflowY.stories.tsx @@ -17,7 +17,7 @@ const meta: Meta = { css={{ backgroundColor: i % 2 === 0 ? "white" : "gray", }} - className="h-12.5 p-0 m-0 text-black" + className="h-[50px] p-0 m-0 text-black" > Element {num}

diff --git a/site/src/components/PageHeader/FullWidthPageHeader.tsx b/site/src/components/PageHeader/FullWidthPageHeader.tsx index ea40a8edffd6b..c8cb59e5e56de 100644 --- a/site/src/components/PageHeader/FullWidthPageHeader.tsx +++ b/site/src/components/PageHeader/FullWidthPageHeader.tsx @@ -29,10 +29,7 @@ export const FullWidthPageHeader: FC = ({ }, }, ]} - className={cn( - "p-6 flex items-center gap-12 z-10 flex-wrap", - sticky && "sticky top-0", - )} + className={cn("p-6 flex gap-12 z-10 flex-wrap", sticky && "sticky top-0")} > {children} @@ -66,7 +63,7 @@ export const PageHeaderSubtitle: FC = ({ children }) => { css={{ color: theme.palette.text.secondary, }} - className="text-sm leading-none block" + className="text-sm leading-[22.4px] block" > {children} diff --git a/site/src/components/PageHeader/PageHeader.tsx b/site/src/components/PageHeader/PageHeader.tsx index 641076f2753d0..6ee1a6b00c2b4 100644 --- a/site/src/components/PageHeader/PageHeader.tsx +++ b/site/src/components/PageHeader/PageHeader.tsx @@ -16,7 +16,7 @@ export const PageHeader: FC = ({ return (
= ({ = ({ }) => { return ( <> - + General Settings diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePageView.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePageView.tsx index 6a371ed068060..61f81b7423978 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePageView.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePageView.tsx @@ -26,7 +26,7 @@ export const TemplateSchedulePageView: FC = ({ }) => { return ( <> - + Template schedule diff --git a/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx b/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx index d80cdcaa9a2ff..cfde27fc6c94e 100644 --- a/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx +++ b/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx @@ -146,11 +146,17 @@ const ProxyMessagesList: FC = ({ title, messages }) => { padding: "16px 64px", }} > -
+
{title}
{messages.map((error, index) => ( -
+				
 					{error}
 				
))} diff --git a/site/src/pages/WorkspacePage/ResourcesSidebar.tsx b/site/src/pages/WorkspacePage/ResourcesSidebar.tsx index 7cfb91f35f2a9..a640931130215 100644 --- a/site/src/pages/WorkspacePage/ResourcesSidebar.tsx +++ b/site/src/pages/WorkspacePage/ResourcesSidebar.tsx @@ -26,7 +26,7 @@ export const ResourcesSidebar: FC = ({ Resources {failed && ( -

+

Your workspace build failed, so the necessary resources couldn't be created.

@@ -54,7 +54,9 @@ export const ResourcesSidebar: FC = ({
{r.name} - {r.type} + + {r.type} +
))} diff --git a/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx b/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx index 7df420d9b011a..ab7d50f1491ab 100644 --- a/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx @@ -12,7 +12,7 @@ export const WorkspaceBuildLogsSection: FC = ({ }) => { return (
-
+
Build logs
diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx index cf9dbed5e36df..09775057cd037 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx @@ -79,7 +79,7 @@ const WorkspaceSchedulePage: FC = () => { <> {pageTitle(workspaceName, "Schedule")} - + Workspace Schedule diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx index 1bdbe27c5bae3..47921cf4f6a53 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx @@ -46,7 +46,7 @@ export const WorkspaceSettingsLayout: FC = () => { {pageTitle(workspaceName, "Settings")} - + {isError ? ( ) : ( diff --git a/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx b/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx index b442eadd45b29..00ab628a761f5 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx @@ -208,7 +208,7 @@ export const WorkspacesPageView: FC = ({ {pageNumberIsInvalid ? ( Date: Tue, 9 Dec 2025 03:20:13 +0000 Subject: [PATCH 23/29] fix: ensure `py-12` (not sure why this being overwritten differently) --- site/src/components/PageHeader/PageHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/components/PageHeader/PageHeader.tsx b/site/src/components/PageHeader/PageHeader.tsx index 6ee1a6b00c2b4..641076f2753d0 100644 --- a/site/src/components/PageHeader/PageHeader.tsx +++ b/site/src/components/PageHeader/PageHeader.tsx @@ -16,7 +16,7 @@ export const PageHeader: FC = ({ return (
Date: Tue, 9 Dec 2025 09:23:00 +0000 Subject: [PATCH 24/29] feat: "v3" of changes (WIP) --- .../Dialogs/ConfirmDialog/ConfirmDialog.tsx | 97 ++++---- .../DurationField/DurationField.tsx | 2 +- site/src/components/FileUpload/FileUpload.tsx | 93 +++---- site/src/components/Filter/Filter.tsx | 16 +- site/src/components/FullPageLayout/Topbar.tsx | 7 +- site/src/components/Loader/Loader.tsx | 1 + site/src/components/OverflowY/OverflowY.tsx | 5 +- site/src/components/PageHeader/PageHeader.tsx | 7 +- .../PaginationWidget/PaginationContainer.tsx | 10 +- .../PaginationWidget/PaginationHeader.tsx | 14 +- .../src/components/Paywall/PopoverPaywall.tsx | 4 +- site/src/components/Sidebar/Sidebar.tsx | 8 +- .../management/DeploymentSettingsLayout.tsx | 2 +- site/src/modules/provisioners/Provisioner.tsx | 52 +--- .../modules/provisioners/ProvisionerTag.tsx | 2 +- site/src/modules/resources/AgentLatency.tsx | 5 +- .../resources/AgentLogs/AgentLogLine.tsx | 2 +- .../modules/resources/PortForwardButton.tsx | 27 +-- .../PortForwardPopoverView.stories.tsx | 3 +- .../VSCodeDesktopButton.tsx | 8 +- .../VSCodeDevContainerButton.tsx | 8 +- .../TemplateExampleCard.tsx | 8 +- .../TemplateFileTree.stories.tsx | 3 +- .../templates/TemplateFiles/TemplateFiles.tsx | 11 +- .../WorkspaceBuildData/WorkspaceBuildData.tsx | 26 +- .../UpdateBuildParametersDialog.tsx | 2 +- .../WorkspaceDeleteDialog.tsx | 14 +- .../WorkspaceOutdatedTooltip.tsx | 4 +- .../WorkspaceTiming/StagesChart.tsx | 8 +- .../WorkspaceTiming/WorkspaceTimings.tsx | 6 +- .../CliInstallPage/CliInstallPageView.tsx | 6 +- .../CreateTemplateGalleryPageView.tsx | 24 +- .../StarterTemplates.tsx | 11 +- .../CreateTemplatePage/CreateTemplateForm.tsx | 13 +- .../pages/CreateUserPage/CreateUserForm.tsx | 2 +- .../AnnouncementBannerDialog.tsx | 2 +- .../AnnouncementBannerSettings.tsx | 19 +- .../AppearanceSettingsPageView.tsx | 9 +- .../ExternalAuthSettingsPageView.tsx | 9 +- .../pages/DeploymentSettingsPage/Fieldset.tsx | 5 +- .../AddNewLicensePageView.tsx | 2 +- .../NotificationsPage/NotificationEvents.tsx | 6 +- .../NotificationsPage/Troubleshooting.tsx | 4 +- .../EditOAuth2AppPageView.tsx | 9 +- .../OAuth2AppsSettingsPage/OAuth2AppForm.tsx | 2 +- .../OAuth2AppsSettingsPageView.tsx | 4 +- .../pages/DeploymentSettingsPage/Option.tsx | 27 +-- .../ExternalAuthPage/ExternalAuthPage.tsx | 2 +- site/src/pages/GroupsPage/GroupPage.tsx | 2 +- site/src/pages/GroupsPage/GroupsPageView.tsx | 2 +- site/src/pages/HealthPage/Content.tsx | 72 ++---- site/src/pages/HealthPage/DERPPage.tsx | 6 +- site/src/pages/HealthPage/DERPRegionPage.tsx | 30 +-- .../pages/HealthPage/DismissWarningButton.tsx | 2 +- site/src/pages/HealthPage/WebsocketPage.tsx | 5 +- .../pages/HealthPage/WorkspaceProxyPage.tsx | 50 +--- site/src/pages/IconsPage/IconsPage.tsx | 29 +-- site/src/pages/LoginPage/OAuthSignInForm.tsx | 4 +- .../pages/LoginPage/PasswordSignInForm.tsx | 6 +- .../CreateOrganizationPageView.tsx | 2 +- .../ResetPasswordPage/ChangePasswordPage.tsx | 17 +- .../ResetPasswordPage/RequestOTPPage.tsx | 35 +-- site/src/pages/SetupPage/SetupPageView.tsx | 36 +-- .../StarterTemplatePageView.tsx | 24 +- .../TemplateDocsPage/TemplateDocsPage.tsx | 13 +- .../TemplateEmbedPage/TemplateEmbedPage.tsx | 25 +- .../TemplateInsightsPage/IntervalMenu.tsx | 4 +- .../TemplateInsightsPage.tsx | 227 +++++------------- .../TemplateInsightsPage/WeekPicker.tsx | 5 +- .../TemplateVersionsPage/VersionsTable.tsx | 2 +- .../TemplateSettingsForm.tsx | 2 +- .../TemplateSettingsLayout.tsx | 4 +- .../ProvisionerTagsPopover.tsx | 7 +- .../pages/TemplatesPage/EmptyTemplates.tsx | 2 +- .../pages/TemplatesPage/TemplatesPageView.tsx | 9 +- .../src/pages/TerminalPage/TerminalAlerts.tsx | 5 +- site/src/pages/TerminalPage/TerminalPage.tsx | 10 +- .../AccountPage/AccountUserGroups.tsx | 5 +- .../ExternalAuthPage/ExternalAuthPageView.tsx | 6 +- site/src/pages/UserSettingsPage/Layout.tsx | 4 +- .../NotificationsPage/NotificationsPage.tsx | 69 +++--- .../OAuth2ProviderPageView.tsx | 2 +- site/src/pages/UserSettingsPage/Section.tsx | 18 +- .../TokensPage/TokensPage.tsx | 2 +- .../WorkspaceProxyPage/WorkspaceProxyRow.tsx | 4 +- .../pages/UsersPage/ResetPasswordDialog.tsx | 7 +- 86 files changed, 419 insertions(+), 946 deletions(-) diff --git a/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.tsx b/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.tsx index 1b253ad848c77..24d4f294ca8dd 100644 --- a/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.tsx +++ b/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.tsx @@ -52,48 +52,6 @@ export interface ConfirmDialogProps readonly title: string; } -const styles = { - dialogWrapper: (theme) => ({ - "& .MuiPaper-root": { - background: theme.palette.background.paper, - border: `1px solid ${theme.palette.divider}`, - width: "100%", - maxWidth: 440, - }, - "& .MuiDialogActions-spacing": { - padding: "0 40px 40px", - }, - }), - dialogContent: (theme) => ({ - color: theme.palette.text.secondary, - padding: "40px 40px 20px", - }), - dialogTitle: (theme) => ({ - margin: 0, - marginBottom: 16, - color: theme.palette.text.primary, - fontWeight: 400, - fontSize: 20, - }), - dialogDescription: (theme) => ({ - color: theme.palette.text.secondary, - lineHeight: "160%", - fontSize: 16, - - "& strong": { - color: theme.palette.text.primary, - }, - - "& p:not(.MuiFormHelperText-root)": { - margin: 0, - }, - - "& > p": { - margin: "8px 0", - }, - }), -} satisfies Record>; - /** * Quick-use version of the Dialog component with slightly alternative styles, * great to use for dialogs that don't have any interaction beyond yes / no. @@ -119,14 +77,61 @@ export const ConfirmDialog: FC = ({ return ( ({ + "& .MuiPaper-root": { + background: theme.palette.background.paper, + border: `1px solid ${theme.palette.divider}`, + width: "100%", + maxWidth: 440, + }, + "& .MuiDialogActions-spacing": { + padding: "0 40px 40px", + }, + })} onClose={onClose} open={open} data-testid="dialog" > -
-

{title}

- {description &&
{description}
} +
({ + color: theme.palette.text.secondary, + padding: "40px 40px 20px", + })} + > +

({ + margin: 0, + marginBottom: 16, + color: theme.palette.text.primary, + fontWeight: 400, + fontSize: 20, + })} + > + {title} +

+ {description && ( +
({ + color: theme.palette.text.secondary, + lineHeight: "160%", + fontSize: 16, + + "& strong": { + color: theme.palette.text.primary, + }, + + "& p:not(.MuiFormHelperText-root)": { + margin: 0, + }, + + "& > p": { + margin: "8px 0", + }, + })} + > + {description} +
+ )}
diff --git a/site/src/components/DurationField/DurationField.tsx b/site/src/components/DurationField/DurationField.tsx index a051324996367..8d94ae6f87037 100644 --- a/site/src/components/DurationField/DurationField.tsx +++ b/site/src/components/DurationField/DurationField.tsx @@ -104,7 +104,7 @@ export const DurationField: FC = (props) => { /> = ({
Shared Ports @@ -536,10 +520,9 @@ export const PortForwardPopoverView: FC = ({ > diff --git a/site/src/modules/resources/PortForwardPopoverView.stories.tsx b/site/src/modules/resources/PortForwardPopoverView.stories.tsx index e1663f1db4590..c116d1403e416 100644 --- a/site/src/modules/resources/PortForwardPopoverView.stories.tsx +++ b/site/src/modules/resources/PortForwardPopoverView.stories.tsx @@ -16,11 +16,10 @@ const meta: Meta = { (Story) => (
({ - width: 404, border: `1px solid ${theme.palette.divider}`, - borderRadius: 8, backgroundColor: theme.palette.background.paper, })} + className="w-[404px] rounded-lg" >
diff --git a/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.tsx b/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.tsx index 56f3b5d07027c..5ff59698ba423 100644 --- a/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.tsx +++ b/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.tsx @@ -78,21 +78,21 @@ export const VSCodeDesktopButton: FC = (props) => { }} > { selectVariant("vscode"); }} > - + {DisplayAppNameMap.vscode} { selectVariant("vscode-insiders"); }} > - + {DisplayAppNameMap.vscode_insiders} diff --git a/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.tsx b/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.tsx index efd6ecc9bc00c..9afca2b364240 100644 --- a/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.tsx +++ b/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.tsx @@ -82,21 +82,21 @@ export const VSCodeDevContainerButton: FC = ( }} > { selectVariant("vscode"); }} > - + {DisplayAppNameMap.vscode} { selectVariant("vscode-insiders"); }} > - + {DisplayAppNameMap.vscode_insiders} diff --git a/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx b/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx index 6ecdc11ed84d9..1ef73c1fe98d7 100644 --- a/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx +++ b/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx @@ -23,7 +23,7 @@ export const TemplateExampleCard: FC = ({
@@ -39,15 +39,13 @@ export const TemplateExampleCard: FC = ({
-

- {example.name} -

+

{example.name}

{example.description}{" "} Read more diff --git a/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx b/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx index 45191a2320a3f..96f71e80772bb 100644 --- a/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx +++ b/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx @@ -27,10 +27,9 @@ const meta: Meta = { return (
diff --git a/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx b/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx index e23a42762013a..698c261cef8d0 100644 --- a/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx +++ b/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx @@ -61,7 +61,7 @@ export const TemplateFiles: FC = ({ return (
-
+
= ({ {filename} -
+
Edit diff --git a/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.tsx b/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.tsx index 9cd258caf892d..b396b05fc4890 100644 --- a/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.tsx +++ b/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.tsx @@ -25,26 +25,19 @@ export const WorkspaceBuildData = ({ build }: { build: WorkspaceBuild }) => { -
+
- {build.transition}{" "} - by{" "} - + {build.transition} by{" "} + {getDisplayWorkspaceBuildInitiatedBy(build)} {!systemBuildReasons.includes(build.reason) && @@ -66,9 +59,9 @@ export const WorkspaceBuildData = ({ build }: { build: WorkspaceBuild }) => {
{createDayString(build.created_at)}
@@ -83,12 +76,7 @@ export const WorkspaceBuildDataSkeleton = () => {
- +
); diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialog.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialog.tsx index 20f962eb41fb9..b94efb168a32d 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialog.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialog.tsx @@ -61,7 +61,7 @@ export const UpdateBuildParametersDialog: FC< Workspace parameters - + This template has new parameters that must be configured to complete the update diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx index 245f95c0f74d8..1ed7e573165db 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx @@ -74,7 +74,7 @@ export const WorkspaceDeleteDialog: FC = ({

{workspace.name}

workspace

-
+

{dayjs(workspace.created_at).fromNow()}

created

@@ -90,7 +90,7 @@ export const WorkspaceDeleteDialog: FC = ({ = ({ /> {hasTask && (
-
+

This workspace is related to a task

- + Deleting this workspace will also delete{" "} = ({ )} {canOrphan && (
-
+
= ({ data-testid="orphan-checkbox" />
-
+

Orphan Resources

- + As a Template Admin, you may skip resource cleanup to delete a failed workspace. Resources such as volumes and virtual machines will not be destroyed.  diff --git a/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.tsx b/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.tsx index 6de6f2c40df50..db8b4f0c54ee8 100644 --- a/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.tsx +++ b/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.tsx @@ -79,7 +79,7 @@ const WorkspaceOutdatedTooltipContent: FC = ({
-
+
New version
{activeVersion ? ( @@ -96,7 +96,7 @@ const WorkspaceOutdatedTooltipContent: FC = ({
-
+
Message
{activeVersion ? ( diff --git a/site/src/modules/workspaces/WorkspaceTiming/StagesChart.tsx b/site/src/modules/workspaces/WorkspaceTiming/StagesChart.tsx index 103d4717f20c6..692bbb40926a3 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/StagesChart.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/StagesChart.tsx @@ -159,13 +159,7 @@ export const StagesChart: FC = ({ }} > {t.error && ( - + )} diff --git a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx index c4e0e63228314..30bcca10a3594 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx @@ -107,14 +107,14 @@ export const WorkspaceTimings: FC = ({ onClick={() => setIsOpen((o) => !o)} > {isOpen ? ( - + ) : ( - + )} Build timeline ({ - marginLeft: "auto", color: theme.palette.text.secondary, })} > diff --git a/site/src/pages/CliInstallPage/CliInstallPageView.tsx b/site/src/pages/CliInstallPage/CliInstallPageView.tsx index 0dc7240870759..ca1fd3874a1fb 100644 --- a/site/src/pages/CliInstallPage/CliInstallPageView.tsx +++ b/site/src/pages/CliInstallPage/CliInstallPageView.tsx @@ -15,16 +15,16 @@ export const CliInstallPageView: FC = ({ origin }) => {

Copy the command below and{" "} - paste it in your terminal. + paste it in your terminal.

-
+
Go to workspaces diff --git a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx index 0dfdb4a219504..fc87dcbb2958e 100644 --- a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx @@ -44,38 +44,24 @@ export const CreateTemplateGalleryPageView: FC< -
+

Choose a starting point for your new template

-
- +
+ - +
diff --git a/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx b/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx index 7f7171af551dd..9916e9f7caef5 100644 --- a/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx @@ -66,7 +66,7 @@ export const StarterTemplates: FC = ({ return ( {starterTemplatesByTag && tags && ( - +

Choose a starter template

Filter {tags.map((tag) => ( @@ -81,14 +81,7 @@ export const StarterTemplates: FC = ({
)} -
+
{visibleTemplates?.map((example) => ( ({ diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx index e3528e9b707be..f23c41a4b037b 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx @@ -30,6 +30,7 @@ import { SelectedTemplate } from "pages/CreateWorkspacePage/SelectedTemplate"; import { type FC, useState } from "react"; import { useQuery } from "react-query"; import { useSearchParams } from "react-router"; +import { cn } from "utils/cn"; import { docs } from "utils/docs"; import { displayNameValidator, @@ -389,19 +390,15 @@ export const CreateTemplateForm: FC = (props) => { type="button" onClick={onOpenBuildLogsDrawer} css={(theme) => ({ - backgroundColor: "transparent", - border: 0, - fontWeight: 500, - fontSize: 14, - cursor: "pointer", color: theme.palette.text.secondary, - "&:hover": { - textDecoration: "underline", - textUnderlineOffset: 4, color: theme.palette.text.primary, }, })} + className={cn([ + "bg-transparent border-0 font-medium text-sm leading-normal cursor-pointer", + "hover:underline hover:underline-offset-4", + ])} > Show build logs diff --git a/site/src/pages/CreateUserPage/CreateUserForm.tsx b/site/src/pages/CreateUserPage/CreateUserForm.tsx index 9961f788aa287..bca8e47fd043e 100644 --- a/site/src/pages/CreateUserPage/CreateUserForm.tsx +++ b/site/src/pages/CreateUserPage/CreateUserForm.tsx @@ -124,7 +124,7 @@ export const CreateUserForm: FC< return ( {isApiError(error) && !hasApiFieldErrors(error) && ( - + )} diff --git a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx index 510a369c85807..432127fcfee0b 100644 --- a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx +++ b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx @@ -41,7 +41,7 @@ export const AnnouncementBannerDialog: FC = ({ return ( {/* Banner preview */} -
+
-

+

Announcement Banners

-
+
@@ -152,9 +143,9 @@ export const AnnouncementBannerSettings: FC< theme.typography.body2 as CSSObject, { background: theme.palette.background.paper, - padding: "16px 24px", }, ]} + className="py-4 px-6" >

diff --git a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx index 52f8f690de2e1..7ff17d1b59212 100644 --- a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx @@ -132,14 +132,7 @@ export const AppearanceSettingsPageView: FC< endAdornment: ( -

+
}> Integrating with multiple External authentication providers is an Premium feature. @@ -87,7 +82,7 @@ export const ExternalAuthSettingsPageView: FC< config.external_auth?.length === 0) && ( -
+
No providers have been configured!
diff --git a/site/src/pages/DeploymentSettingsPage/Fieldset.tsx b/site/src/pages/DeploymentSettingsPage/Fieldset.tsx index 9414ba081afa9..4dfaa661c2e37 100644 --- a/site/src/pages/DeploymentSettingsPage/Fieldset.tsx +++ b/site/src/pages/DeploymentSettingsPage/Fieldset.tsx @@ -46,12 +46,9 @@ export const Fieldset: FC = ({ theme.typography.body2 as CSSObject, { background: theme.palette.background.paper, - padding: "16px 24px", - display: "flex", - alignItems: "center", - justifyContent: "space-between", }, ]} + className="py-4 px-6 flex items-center justify-between" >
{validation}
{button || ( diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePageView.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePageView.tsx index 2815bfe15aa83..060f7fd9c44cf 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePageView.tsx @@ -79,7 +79,7 @@ export const AddNewLicensePageView: FC = ({ description="Select a text file that contains your license key." /> - + or
= ({ )} {Object.entries(templatesByGroup).map(([group, templates]) => ( - + diff --git a/site/src/pages/DeploymentSettingsPage/NotificationsPage/Troubleshooting.tsx b/site/src/pages/DeploymentSettingsPage/NotificationsPage/Troubleshooting.tsx index 8d773942c1582..f3b00258b3a04 100644 --- a/site/src/pages/DeploymentSettingsPage/NotificationsPage/Troubleshooting.tsx +++ b/site/src/pages/DeploymentSettingsPage/NotificationsPage/Troubleshooting.tsx @@ -18,11 +18,9 @@ export const Troubleshooting: FC = () => { <>
Send a test notification to troubleshoot your notification settings.
diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx index 7e2c4e31bcd06..1ebe3a32339af 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx @@ -111,12 +111,7 @@ export const EditOAuth2AppPageView: FC = ({

} @@ -248,7 +243,7 @@ const OAuth2AppSecretsTable: FC = ({ {!isLoadingSecrets && (!secrets || secrets.length === 0) && ( -
+
No client secrets have been generated.
diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppForm.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppForm.tsx index 0bb08327f5fa3..3d7459d59f9c1 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppForm.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppForm.tsx @@ -31,7 +31,7 @@ export const OAuth2AppForm: FC = ({ return ( { event.preventDefault(); const formData = new FormData(event.target as HTMLFormElement); diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.tsx index 3c40874ef453f..6416002d8ee04 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.tsx @@ -76,7 +76,7 @@ const OAuth2AppsSettingsPageView: FC = ({ {apps?.length === 0 && ( -
+
No OAuth2 applications have been configured.
@@ -109,7 +109,7 @@ const OAuth2AppRow: FC = ({ app }) => { -
+
diff --git a/site/src/pages/DeploymentSettingsPage/Option.tsx b/site/src/pages/DeploymentSettingsPage/Option.tsx index ae13db003c41e..a8ff8de41bd07 100644 --- a/site/src/pages/DeploymentSettingsPage/Option.tsx +++ b/site/src/pages/DeploymentSettingsPage/Option.tsx @@ -3,6 +3,7 @@ import { DisabledBadge, EnabledBadge } from "components/Badges/Badges"; import { WrenchIcon } from "lucide-react"; import type { FC, HTMLAttributes, PropsWithChildren } from "react"; import { MONOSPACE_FONT_FAMILY } from "theme/constants"; +import { cn } from "utils/cn"; export const OptionName: FC = ({ children }) => { return ( @@ -58,7 +59,7 @@ export const OptionValue: FC = (props) => { if (typeof value === "object" && !Array.isArray(value)) { return ( -
    +
      {Object.entries(value) .sort((a, b) => a[0].localeCompare(b[0])) .map(([option, isEnabled]) => ( @@ -67,20 +68,16 @@ export const OptionValue: FC = (props) => { css={[ styles.option, !isEnabled && { - marginLeft: 32, color: theme.palette.text.disabled, }, ]} - className={`option-array-item-${option} ${ - isEnabled ? "option-enabled" : "option-disabled" - }`} + className={cn([ + `option-array-item-${option}`, + isEnabled && "option-enabled", + !isEnabled && "option-disabled ml-8", + ])} > -
      +
      {isEnabled && } {option}
      @@ -127,16 +124,10 @@ export const OptionConfigFlag: FC> = (props) => { return (
      ); }; diff --git a/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx b/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx index c4ae645d015c2..1da00f2f18aae 100644 --- a/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx +++ b/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx @@ -83,7 +83,7 @@ const ExternalAuthPage: FC = () => { Failed to validate oauth access token -

      +

      Attempted to validate the user's oauth access token from the authentication flow. This situation may occur as a result of an external authentication provider misconfiguration. Verify the diff --git a/site/src/pages/GroupsPage/GroupPage.tsx b/site/src/pages/GroupsPage/GroupPage.tsx index 4213a0ac20400..d0e12cfc656b3 100644 --- a/site/src/pages/GroupsPage/GroupPage.tsx +++ b/site/src/pages/GroupsPage/GroupPage.tsx @@ -320,7 +320,7 @@ const GroupMemberRow: FC = ({ css={[styles.status, member.status === "suspended" && styles.suspended]} >

      {member.status}
      - + {canUpdate && ( diff --git a/site/src/pages/GroupsPage/GroupsPageView.tsx b/site/src/pages/GroupsPage/GroupsPageView.tsx index 1eb3f6b809648..2ac3a154f5950 100644 --- a/site/src/pages/GroupsPage/GroupsPageView.tsx +++ b/site/src/pages/GroupsPage/GroupsPageView.tsx @@ -167,7 +167,7 @@ const TableLoader: FC = () => { -
      +
      diff --git a/site/src/pages/HealthPage/Content.tsx b/site/src/pages/HealthPage/Content.tsx index 97729a12184c3..b1f2e8bd4c61c 100644 --- a/site/src/pages/HealthPage/Content.tsx +++ b/site/src/pages/HealthPage/Content.tsx @@ -14,6 +14,7 @@ import { type HTMLAttributes, type ReactElement, } from "react"; +import { cn } from "utils/cn"; import { docs } from "utils/docs"; import { healthyColor } from "./healthyColor"; @@ -23,11 +24,9 @@ export const Header: FC> = (props) => { return (
      ); @@ -36,15 +35,10 @@ export const Header: FC> = (props) => { export const HeaderTitle: FC> = (props) => { return (

      ); @@ -73,11 +67,9 @@ export const HealthyDot: FC = ({ severity }) => { return (
      ); }; @@ -87,10 +79,8 @@ export const Main: FC> = (props) => {
      ); @@ -99,15 +89,7 @@ export const Main: FC> = (props) => { export const GridData: FC> = (props) => { return (
      ); @@ -118,10 +100,9 @@ export const GridDataLabel: FC> = (props) => { return ( ); @@ -132,9 +113,9 @@ export const GridDataValue: FC> = (props) => { return ( ); @@ -142,16 +123,7 @@ export const GridDataValue: FC> = (props) => { export const SectionLabel: FC> = (props) => { return ( -

      +

      ); }; @@ -167,17 +139,9 @@ export const Pill = forwardRef((props, ref) => {
      {cloneElement(icon, { className: "size-[14px]" })} @@ -222,19 +186,13 @@ export const Logs: FC = ({ lines, ...divProps }) => { return (
      {lines.map((line, index) => ( - + {line} ))} diff --git a/site/src/pages/HealthPage/DERPPage.tsx b/site/src/pages/HealthPage/DERPPage.tsx index 3a913f23e05d5..d614e2741ae43 100644 --- a/site/src/pages/HealthPage/DERPPage.tsx +++ b/site/src/pages/HealthPage/DERPPage.tsx @@ -75,7 +75,7 @@ const DERPPage: FC = () => {
      Flags -
      +
      {flags.map((flag) => ( {flag} @@ -86,7 +86,7 @@ const DERPPage: FC = () => {
      Regions -
      +
      {Object.values(regions ?? {}) .filter((region) => { // Values can technically be null @@ -123,10 +123,10 @@ const DERPPage: FC = () => { ({ - borderRadius: 8, border: `1px solid ${theme.palette.divider}`, color: theme.palette.text.secondary, })} + className="rounded-lg" />

      diff --git a/site/src/pages/HealthPage/DERPRegionPage.tsx b/site/src/pages/HealthPage/DERPRegionPage.tsx index bc0830fbf5fb8..30907320838d1 100644 --- a/site/src/pages/HealthPage/DERPRegionPage.tsx +++ b/site/src/pages/HealthPage/DERPRegionPage.tsx @@ -47,24 +47,15 @@ const DERPRegionPage: FC = () => {
      - + Back to DERP @@ -88,7 +79,7 @@ const DERPRegionPage: FC = () => { })}
      -
      +
      }> @@ -123,9 +114,8 @@ const DERPRegionPage: FC = () => { key={node!.HostName} css={{ border: `1px solid ${theme.palette.divider}`, - borderRadius: 8, - fontSize: 14, }} + className="text-sm leading-none rounded-lg" >
      @@ -177,20 +167,12 @@ type StatusCircleProps = { color: string }; const StatusCircle: FC = ({ color }) => { return ( -
      +
      ); diff --git a/site/src/pages/HealthPage/DismissWarningButton.tsx b/site/src/pages/HealthPage/DismissWarningButton.tsx index b1d04d2859b7a..71af70e313630 100644 --- a/site/src/pages/HealthPage/DismissWarningButton.tsx +++ b/site/src/pages/HealthPage/DismissWarningButton.tsx @@ -23,7 +23,7 @@ export const DismissWarningButton = (props: { healthcheck: HealthSection }) => { variant="rectangular" height={36} width={170} - css={{ borderRadius: 8 }} + className="rounded-lg" /> ); } diff --git a/site/src/pages/HealthPage/WebsocketPage.tsx b/site/src/pages/HealthPage/WebsocketPage.tsx index d91e1cfca6634..7c50ab70f574c 100644 --- a/site/src/pages/HealthPage/WebsocketPage.tsx +++ b/site/src/pages/HealthPage/WebsocketPage.tsx @@ -65,11 +65,8 @@ const WebsocketPage = () => { css={{ backgroundColor: theme.palette.background.paper, border: `1px solid ${theme.palette.divider}`, - borderRadius: 8, - fontSize: 14, - padding: 24, - fontFamily: MONOSPACE_FONT_FAMILY, }} + className="rounded-lg text-sm p-6 font-mono" > {websocket.body !== "" ? ( websocket.body diff --git a/site/src/pages/HealthPage/WorkspaceProxyPage.tsx b/site/src/pages/HealthPage/WorkspaceProxyPage.tsx index e80786e1dffa0..9aeb3f82ef041 100644 --- a/site/src/pages/HealthPage/WorkspaceProxyPage.tsx +++ b/site/src/pages/HealthPage/WorkspaceProxyPage.tsx @@ -64,51 +64,32 @@ const WorkspaceProxyPage: FC = () => {
      -
      -
      -
      +
      +
      +
      -
      -

      - {region.display_name} -

      +
      +

      {region.display_name}

      {region.version}
      -
      +
      {region.wildcard_hostname && ( @@ -150,27 +131,18 @@ const WorkspaceProxyPage: FC = () => {
      {region.status?.status === "unregistered" ? ( Has not connected yet ) : warnings.length === 0 && errors.length === 0 ? ( OK ) : ( -
      +
      {[...errors, ...warnings].map((msg) => ( - + {msg} ))} diff --git a/site/src/pages/IconsPage/IconsPage.tsx b/site/src/pages/IconsPage/IconsPage.tsx index 801601f7adc12..0879d537d2b5f 100644 --- a/site/src/pages/IconsPage/IconsPage.tsx +++ b/site/src/pages/IconsPage/IconsPage.tsx @@ -150,30 +150,13 @@ const IconsPage: FC = () => { {icon.url} -
      +
      {icon.description}
      diff --git a/site/src/pages/LoginPage/OAuthSignInForm.tsx b/site/src/pages/LoginPage/OAuthSignInForm.tsx index 9cf90c9a83b7c..8780b29be4b2b 100644 --- a/site/src/pages/LoginPage/OAuthSignInForm.tsx +++ b/site/src/pages/LoginPage/OAuthSignInForm.tsx @@ -18,7 +18,7 @@ export const OAuthSignInForm: FC = ({ authMethods, }) => { return ( -
      +
      {authMethods?.github.enabled && (
      From fbd33a7e3a151f7552c11e44334296d35221b828 Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Wed, 10 Dec 2025 10:31:03 +0000 Subject: [PATCH 29/29] feat: "v4" of changes (WIP) --- site/src/components/Avatar/AvatarCard.tsx | 20 +--- .../Dialogs/ConfirmDialog/ConfirmDialog.tsx | 55 ++------- site/src/components/Expander/Expander.tsx | 32 ++--- site/src/components/FileUpload/FileUpload.tsx | 22 +--- site/src/components/Filter/Filter.tsx | 13 +- site/src/components/Filter/SelectFilter.tsx | 7 +- site/src/components/Form/Form.tsx | 111 ++++-------------- site/src/components/FullPageLayout/Topbar.tsx | 19 +-- .../GitDeviceAuth/GitDeviceAuth.tsx | 65 +++------- .../GlobalSnackbar/GlobalSnackbar.tsx | 34 ++---- .../components/HelpTooltip/HelpTooltip.tsx | 84 +++++-------- site/src/components/Icons/JetBrainsIcon.tsx | 2 +- .../components/InfoTooltip/InfoTooltip.tsx | 5 +- site/src/components/Loader/Loader.tsx | 31 ++--- site/src/components/Logs/LogLine.tsx | 93 ++++++--------- site/src/components/Logs/Logs.tsx | 26 ++-- site/src/components/Margins/Margins.tsx | 9 +- .../components/Markdown/Markdown.stories.tsx | 8 ++ site/src/components/Markdown/Markdown.tsx | 20 ++-- site/src/components/Menu/MenuSearch.tsx | 15 ++- .../OrganizationAutocomplete.tsx | 6 +- .../OverflowY/OverflowY.stories.tsx | 2 +- site/src/components/OverflowY/OverflowY.tsx | 13 +- .../PageHeader/FullWidthPageHeader.tsx | 22 +--- site/src/components/PageHeader/PageHeader.tsx | 15 +-- .../PaginationWidget/PaginationHeader.tsx | 10 +- site/src/components/Paywall/Paywall.tsx | 45 ++----- .../RichParameterInput/RichParameterInput.tsx | 2 +- .../components/Timeline/TimelineDateRow.tsx | 24 ++-- .../UserAutocomplete/UserAutocomplete.tsx | 6 +- .../modules/dashboard/Navbar/ProxyMenu.tsx | 37 ++---- .../resources/AgentLogs/AgentLogLine.tsx | 12 +- .../VSCodeDevContainerButton.tsx | 7 +- .../TemplateExampleCard.tsx | 103 +++++----------- .../TemplateVersionEditor.tsx | 59 +++------- .../src/pages/TerminalPage/TerminalAlerts.tsx | 6 +- site/src/pages/TerminalPage/TerminalPage.tsx | 7 +- .../AccountPage/AccountUserGroups.tsx | 7 +- .../ExternalAuthPage/ExternalAuthPageView.tsx | 6 +- .../NotificationsPage/NotificationsPage.tsx | 16 +-- site/src/pages/UserSettingsPage/Section.tsx | 25 +--- .../SecurityPage/SecurityPageView.stories.tsx | 6 +- .../SecurityPage/SingleSignOnSection.tsx | 20 +--- .../TokensPage/TokensPage.tsx | 19 +-- .../WorkspaceProxyPage/WorkspaceProxyRow.tsx | 24 +--- .../UsersPage/UsersTable/UsersTableBody.tsx | 38 +++--- .../pages/WorkspacePage/ResourcesSidebar.tsx | 17 +-- .../WorkspacePage/WorkspaceBuildProgress.tsx | 26 +--- .../WorkspaceNotifications/Notifications.tsx | 13 +- .../pages/WorkspacesPage/WorkspacesButton.tsx | 2 +- 50 files changed, 385 insertions(+), 881 deletions(-) diff --git a/site/src/components/Avatar/AvatarCard.tsx b/site/src/components/Avatar/AvatarCard.tsx index 3b1a4f57c091f..c7f29a66ad616 100644 --- a/site/src/components/Avatar/AvatarCard.tsx +++ b/site/src/components/Avatar/AvatarCard.tsx @@ -1,4 +1,3 @@ -import { type CSSObject, useTheme } from "@emotion/react"; import { Avatar } from "components/Avatar/Avatar"; import type { FC, ReactNode } from "react"; import { cn } from "utils/cn"; @@ -16,17 +15,16 @@ export const AvatarCard: FC = ({ subtitle, maxWidth = "none", }) => { - const theme = useTheme(); - return (
      {/** @@ -39,19 +37,13 @@ export const AvatarCard: FC = ({

      {header}

      {subtitle && ( -
      +
      {subtitle}
      )} diff --git a/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.tsx b/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.tsx index 24d4f294ca8dd..6ffd7075a3d10 100644 --- a/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.tsx +++ b/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.tsx @@ -1,6 +1,6 @@ -import type { Interpolation, Theme } from "@emotion/react"; import DialogActions from "@mui/material/DialogActions"; import type { FC, ReactNode } from "react"; +import { cn } from "utils/cn"; import { Dialog, DialogActionButtons, @@ -77,58 +77,21 @@ export const ConfirmDialog: FC = ({ return ( ({ - "& .MuiPaper-root": { - background: theme.palette.background.paper, - border: `1px solid ${theme.palette.divider}`, - width: "100%", - maxWidth: 440, - }, - "& .MuiDialogActions-spacing": { - padding: "0 40px 40px", - }, - })} + className={cn( + "[&_.MuiPaper-root]:bg-surface-secondary [&_.MuiPaper-root]:border", + "[&_.MuiPaper-root]:border-solid [&_.MuiPaper-root]:w-full [&_.MuiPaper-root]:max-w-[440px]", + "[&_.MuiDialogActions-spacing]:pt-0 [&_.MuiDialogActions-spacing]:px-10 [&_.MuiDialogActions-spacing]:pb-10", + )} onClose={onClose} open={open} data-testid="dialog" > -
      ({ - color: theme.palette.text.secondary, - padding: "40px 40px 20px", - })} - > -

      ({ - margin: 0, - marginBottom: 16, - color: theme.palette.text.primary, - fontWeight: 400, - fontSize: 20, - })} - > +
      +

      {title}

      {description && ( -
      ({ - color: theme.palette.text.secondary, - lineHeight: "160%", - fontSize: 16, - - "& strong": { - color: theme.palette.text.primary, - }, - - "& p:not(.MuiFormHelperText-root)": { - margin: 0, - }, - - "& > p": { - margin: "8px 0", - }, - })} - > +
      {description}
      )} diff --git a/site/src/components/Expander/Expander.tsx b/site/src/components/Expander/Expander.tsx index 394f6081e2897..d05bdff2bbab4 100644 --- a/site/src/components/Expander/Expander.tsx +++ b/site/src/components/Expander/Expander.tsx @@ -1,8 +1,8 @@ -import type { Interpolation, Theme } from "@emotion/react"; import Collapse from "@mui/material/Collapse"; import Link from "@mui/material/Link"; import { DropdownArrow } from "components/DropdownArrow/DropdownArrow"; import type { FC, ReactNode } from "react"; +import { cn } from "utils/cn"; interface ExpanderProps { expanded: boolean; @@ -20,22 +20,22 @@ export const Expander: FC = ({ return ( <> {!expanded && ( - - + + Click here to learn more )} -
      {children}
      +
      {children}
      {expanded && ( - + Click here to hide @@ -45,18 +45,8 @@ export const Expander: FC = ({ ); }; -const styles = { - expandLink: (theme) => ({ - cursor: "pointer", - color: theme.palette.text.secondary, - }), - collapseLink: { - marginTop: 16, - }, - text: (theme) => ({ - display: "flex", - alignItems: "center", - color: theme.palette.text.secondary, - fontSize: theme.typography.caption.fontSize, - }), -} satisfies Record>; +const classNames = { + expandLink: "cursor-pointer text-content-secondary", + collapseLink: "mt-4", + text: "flex items-center text-content-secondary text-xs leading-loose", +}; diff --git a/site/src/components/FileUpload/FileUpload.tsx b/site/src/components/FileUpload/FileUpload.tsx index 037503a906d20..d4afb2ccd13f4 100644 --- a/site/src/components/FileUpload/FileUpload.tsx +++ b/site/src/components/FileUpload/FileUpload.tsx @@ -37,11 +37,7 @@ export const FileUpload: FC = ({ if (!isUploading && file) { return ( ({ - border: `1px solid ${theme.palette.divider}`, - background: theme.palette.background.paper, - })} - className="rounded-lg p-4" + className="rounded-lg p-4 border border-solid bg-surface-secondary" direction="row" justifyContent="space-between" alignItems="center" @@ -62,16 +58,9 @@ export const FileUpload: FC = ({ <>
      css` - border: 2px dashed ${theme.palette.divider}; - &:hover { - background-color: ${theme.palette.background.paper}; - } - `, - ]} className={cn( "flex items-center justify-center rounded-lg p-12 cursor-pointer", + "border-2 border-dashed hover:bg-surface-secondary", isUploading && "pointer-events-none opacity-75", )} {...clickable} @@ -91,12 +80,7 @@ export const FileUpload: FC = ({ {title} - ({ - color: theme.palette.text.secondary, - })} - className="text-center max-w-[400px] text-sm leading-normal mt-1" - > + {description} diff --git a/site/src/components/Filter/Filter.tsx b/site/src/components/Filter/Filter.tsx index 663af022f211c..c4d2610f463df 100644 --- a/site/src/components/Filter/Filter.tsx +++ b/site/src/components/Filter/Filter.tsx @@ -132,10 +132,7 @@ const BaseSkeleton: FC = ({ children, ...skeletonProps }) => { variant="rectangular" height={36} {...skeletonProps} - css={(theme) => ({ - backgroundColor: theme.palette.background.paper, - })} - className={cn("rounded-md", skeletonProps.className)} + className={cn("rounded-md bg-surface-secondary", skeletonProps.className)} > {children} @@ -290,11 +287,11 @@ const PresetMenu: FC = ({ vertical: "top", horizontal: "left", }} - css={{ "& .MuiMenu-paper": { paddingTop: 8, paddingBottom: 8 } }} + className="[&_.MuiMenu-paper]:py-2" > {presets.map((presetFilter) => ( { onSelect(presetFilter.query); @@ -304,9 +301,7 @@ const PresetMenu: FC = ({ {presetFilter.name} ))} - {learnMoreLink && ( - - )} + {learnMoreLink && } {learnMoreLink && ( = ({ })} ) : ( -
      ({ - color: theme.palette.text.secondary, - })} - className="flex items-center justify-center p-8 leading-none" - > +
      {emptyText || "No options found"}
      ) diff --git a/site/src/components/Form/Form.tsx b/site/src/components/Form/Form.tsx index 08c0b3fffc2db..b59e528b3b1d1 100644 --- a/site/src/components/Form/Form.tsx +++ b/site/src/components/Form/Form.tsx @@ -1,4 +1,3 @@ -import { type Interpolation, type Theme, useTheme } from "@emotion/react"; import { AlphaBadge, DeprecatedBadge } from "components/Badges/Badges"; import { Stack } from "components/Stack/Stack"; import { @@ -23,19 +22,15 @@ type FormProps = HTMLProps & { }; export const Form: FC = ({ direction, ...formProps }) => { - const theme = useTheme(); - return ( ); @@ -93,25 +88,33 @@ export const FormSection = forwardRef( return (
      -

      +

      {title} {alpha && } {deprecated && }

      -
      {description}
      +
      + {description} +
      {children} @@ -122,72 +125,10 @@ export const FormSection = forwardRef( export const FormFields: FC> = (props) => { return ( - + ); }; -const styles = { - formSection: (theme) => ({ - display: "flex", - alignItems: "flex-start", - flexDirection: "column", - gap: 24, - - [theme.breakpoints.down("lg")]: { - flexDirection: "column", - gap: 16, - }, - }), - formSectionHorizontal: { - flexDirection: "row", - gap: 120, - }, - formSectionInfo: (theme) => ({ - width: "100%", - flexShrink: 0, - top: 24, - - [theme.breakpoints.down("md")]: { - width: "100%", - position: "initial" as const, - }, - }), - formSectionInfoHorizontal: (theme) => ({ - maxWidth: 312, - - [theme.breakpoints.up("lg")]: { - position: "sticky", - }, - }), - formSectionInfoTitle: (theme) => ({ - fontSize: 20, - color: theme.palette.text.primary, - fontWeight: 500, - margin: 0, - marginBottom: 8, - display: "flex", - flexDirection: "row", - alignItems: "center", - gap: 12, - }), - - formSectionInfoDescription: (theme) => ({ - fontSize: 14, - color: theme.palette.text.secondary, - lineHeight: "160%", - margin: 0, - }), - - formSectionFields: { - width: "100%", - }, -} satisfies Record>; - export const FormFooter: FC> = ({ className, ...props diff --git a/site/src/components/FullPageLayout/Topbar.tsx b/site/src/components/FullPageLayout/Topbar.tsx index 54a824b6358ed..f2d7ba4b0c356 100644 --- a/site/src/components/FullPageLayout/Topbar.tsx +++ b/site/src/components/FullPageLayout/Topbar.tsx @@ -14,16 +14,12 @@ import { import { cn } from "utils/cn"; export const Topbar: FC> = (props) => { - const theme = useTheme(); - return (
      @@ -37,12 +33,10 @@ export const TopbarIconButton = forwardRef( ref={ref} {...props} size="small" - css={{ - "& svg": { - fontSize: 20, - }, - }} - className={cn("p-0 rounded-none size-12", props.className)} + className={cn( + "p-0 rounded-none size-12 [&_svg]:text-xl leading-none", + props.className, + )} /> ); }, @@ -59,9 +53,8 @@ export const TopbarData: FC> = (props) => { }; export const TopbarDivider: FC> = (props) => { - const theme = useTheme(); return ( - + / ); diff --git a/site/src/components/GitDeviceAuth/GitDeviceAuth.tsx b/site/src/components/GitDeviceAuth/GitDeviceAuth.tsx index 7b3d8091abfeb..58aebaaf54f78 100644 --- a/site/src/components/GitDeviceAuth/GitDeviceAuth.tsx +++ b/site/src/components/GitDeviceAuth/GitDeviceAuth.tsx @@ -1,4 +1,3 @@ -import type { Interpolation, Theme } from "@emotion/react"; import AlertTitle from "@mui/material/AlertTitle"; import CircularProgress from "@mui/material/CircularProgress"; import Link from "@mui/material/Link"; @@ -73,7 +72,7 @@ export const GitDeviceAuth: FC = ({ deviceExchangeError, }) => { let status = ( -

      +

      Checking for authentication...

      @@ -130,10 +129,12 @@ export const GitDeviceAuth: FC = ({ return (
      -

      +

      Copy your one-time code:  -

      - {externalAuthDevice.user_code} +
      + + {externalAuthDevice.user_code} +  {" "} = ({
      Then open the link below and paste it:

      -
      +
      = ({ ); }; -const styles = { - text: (theme) => ({ - fontSize: 16, - color: theme.palette.text.secondary, - textAlign: "center", - lineHeight: "160%", - margin: 0, - }), - - copyCode: { - display: "inline-flex", - alignItems: "center", - }, - - code: (theme) => ({ - fontWeight: "bold", - color: theme.palette.text.primary, - }), - - links: { - display: "flex", - gap: 4, - margin: 16, - flexDirection: "column", - }, - - link: { - display: "flex", - alignItems: "center", - justifyContent: "center", - fontSize: 16, - gap: 8, - }, - - status: (theme) => ({ - display: "flex", - alignItems: "center", - justifyContent: "center", - gap: 8, - color: theme.palette.text.disabled, - }), -} satisfies Record>; +const classNames = { + text: "text-base text-content-secondary text-center leading-relaxed m-0", + copyCode: "inline-flex items-center", + code: "font-bold text-content-primary", + links: "flex flex-col gap-1 m-4", + link: "flex items-center justify-center font-base gap-2", + status: "flex items-center justify-center gap-2 text-content-disabled", +}; diff --git a/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx b/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx index 9eed091766c6a..916f4c6e6b870 100644 --- a/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx +++ b/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx @@ -1,4 +1,3 @@ -import type { Interpolation, Theme } from "@emotion/react"; import { useCustomEvent } from "hooks/events"; import { type FC, useState } from "react"; import { ErrorIcon } from "../Icons/ErrorIcon"; @@ -48,11 +47,13 @@ export const GlobalSnackbar: FC = () => { message={
      {notificationMsg.msgType === MsgType.Error && ( - + )}
      - {notificationMsg.msg} + + {notificationMsg.msg} + {notificationMsg.additionalMsgs?.map((msg, index) => ( @@ -72,12 +73,12 @@ const AdditionalMessageDisplay: FC = ({ message, }) => { if (isNotificationText(message)) { - return {message}; + return {message}; } if (isNotificationTextPrefixed(message)) { return ( - + {message.prefix}: {message.text} ); @@ -88,7 +89,7 @@ const AdditionalMessageDisplay: FC = ({
        {message.map((item, idx) => (
      • - {item} + {item}
      • ))}
      @@ -98,19 +99,8 @@ const AdditionalMessageDisplay: FC = ({ return null; }; -const styles = { - messageTitle: { - fontSize: 14, - fontWeight: 600, - }, - messageSubtitle: { - marginTop: 4, - "&:first-letter": { - textTransform: "uppercase", - }, - }, - errorIcon: (theme) => ({ - color: theme.palette.error.contrastText, - marginRight: 16, - }), -} satisfies Record>; +const classNames = { + messageTitle: "text-sm font-semibold", + messageSubtitle: "mt-1 first-letter:uppercase", + errorIcon: "text-content-destructive mr-4", +}; diff --git a/site/src/components/HelpTooltip/HelpTooltip.tsx b/site/src/components/HelpTooltip/HelpTooltip.tsx index 7d433e08b4c13..e446e8b38f249 100644 --- a/site/src/components/HelpTooltip/HelpTooltip.tsx +++ b/site/src/components/HelpTooltip/HelpTooltip.tsx @@ -75,16 +75,12 @@ export const HelpTooltipIconTrigger = forwardRef< {...buttonProps} aria-label="More info" ref={ref} - css={[ - css` - & svg { - width: ${getIconSpacingFromSize(size)}px; - height: ${getIconSpacingFromSize(size)}px; - } - `, - ]} + style={{ + "--icon-spacing": `${getIconSpacingFromSize(size)}px`, + }} className={cn( - "flex items-center justify-center py-1 px-0 border-none bg-transparent cursor-pointer text-inherit", + "flex items-center justify-center py-1 px-0 border-none bg-transparent", + "cursor-pointer text-inherit [&_svg]:size-[var(--icon-spacing)]", hoverEffect && "opacity-50 hover:opacity-75", buttonProps.className, )} @@ -100,7 +96,7 @@ export const HelpTooltipTitle: FC> = ({ ...attrs }) => { return ( -

      +

      {children}

      ); @@ -111,7 +107,7 @@ export const HelpTooltipText: FC> = ({ ...attrs }) => { return ( -

      +

      {children}

      ); @@ -124,8 +120,14 @@ interface HelpTooltipLink { export const HelpTooltipLink: FC = ({ children, href }) => { return ( - - + + {children} ); @@ -148,10 +150,11 @@ export const HelpTooltipAction: FC = ({ ); @@ -159,7 +162,7 @@ export const HelpTooltipAction: FC = ({ export const HelpTooltipLinksGroup: FC = ({ children }) => { return ( - + {children} ); @@ -174,55 +177,26 @@ const getIconSpacingFromSize = (size?: Size): number => { } }; -const styles = { - title: (theme) => ({ - marginTop: 0, - marginBottom: 8, - color: theme.palette.text.primary, - fontSize: 14, - lineHeight: "150%", - fontWeight: 600, - }), +const classNames = { + title: "mt-0 mb-2 text-content-primary text-sm leading-relaxed font-semibold", + text: "my-1", + link: "flex items-center", + linkIcon: "size-icon-xs mr-2 text-inherit", + linksGroup: "mt-4", + action: + "flex items-center bg-transparent border-none p-0 cursor-pointer text-sm", + actionIcon: "text-inherit size-3.5 mr-2", +}; +const styles = { text: (theme) => ({ - marginTop: 4, - marginBottom: 4, ...(theme.typography.body2 as CSSObject), }), - link: (theme) => ({ - display: "flex", - alignItems: "center", ...(theme.typography.body2 as CSSObject), color: theme.roles.active.fill.outline, }), - - linkIcon: { - color: "inherit", - width: 14, - height: 14, - marginRight: 8, - }, - - linksGroup: { - marginTop: 16, - }, - action: (theme) => ({ - display: "flex", - alignItems: "center", - background: "none", - border: 0, color: theme.palette.primary.light, - padding: 0, - cursor: "pointer", - fontSize: 14, }), - - actionIcon: { - color: "inherit", - width: 14, - height: 14, - marginRight: 8, - }, } satisfies Record>; diff --git a/site/src/components/Icons/JetBrainsIcon.tsx b/site/src/components/Icons/JetBrainsIcon.tsx index 033f65186a3ab..ddaebd031628f 100644 --- a/site/src/components/Icons/JetBrainsIcon.tsx +++ b/site/src/components/Icons/JetBrainsIcon.tsx @@ -24,7 +24,7 @@ export const JetBrainsIcon = (props: SvgIconProps): JSX.Element => ( 25.59l85.73-58.84a7.35 7.35 0 0 0 3.17-6.05z" fill="#fff" /> - + = ({ size="small" className="opacity-100 hover:opacity-100" > - + {title} diff --git a/site/src/components/Loader/Loader.tsx b/site/src/components/Loader/Loader.tsx index 8fd43c2010e32..418e4da74a7c8 100644 --- a/site/src/components/Loader/Loader.tsx +++ b/site/src/components/Loader/Loader.tsx @@ -1,4 +1,3 @@ -import type { Interpolation, Theme } from "@emotion/react"; import { Spinner } from "components/Spinner/Spinner"; import type { FC, HTMLAttributes } from "react"; import { cn } from "utils/cn"; @@ -20,7 +19,10 @@ export const Loader: FC = ({ }) => { return (
      @@ -29,23 +31,8 @@ export const Loader: FC = ({ ); }; -const styles = { - inline: { - padding: 32, - width: "100%", - display: "flex", - alignItems: "center", - justifyContent: "center", - }, - fullscreen: (theme) => ({ - position: "absolute", - top: "0", - left: "0", - right: "0", - bottom: "0", - display: "flex", - justifyContent: "center", - alignItems: "center", - background: theme.palette.background.default, - }), -} satisfies Record>; +const classNames = { + inline: "p-8 w-full flex items-center justify-center", + fullscreen: + "absolute inset-0 flex justify-center items-center bg-content-primary", +}; diff --git a/site/src/components/Logs/LogLine.tsx b/site/src/components/Logs/LogLine.tsx index 7c2e56f190568..bb41648d1b5cd 100644 --- a/site/src/components/Logs/LogLine.tsx +++ b/site/src/components/Logs/LogLine.tsx @@ -1,7 +1,6 @@ -import type { Interpolation, Theme } from "@emotion/react"; import type { LogLevel } from "api/typesGenerated"; import type { FC, HTMLAttributes } from "react"; -import { MONOSPACE_FONT_FAMILY } from "theme/constants"; +import { cn } from "utils/cn"; const DEFAULT_LOG_LINE_SIDE_PADDING = 24; @@ -20,62 +19,48 @@ type LogLineProps = { export const LogLine: FC = ({ level, ...divProps }) => { return (
       ({
      +				padding: `0 var(--log-line-side-padding, ${DEFAULT_LOG_LINE_SIDE_PADDING}px)`,
      +				"&.error": {
      +					backgroundColor: theme.roles.error.background,
      +					color: theme.roles.error.text,
      +					"& .dashed-line": {
      +						backgroundColor: theme.roles.error.outline,
      +					},
      +				},
      +				"&.debug": {
      +					backgroundColor: theme.roles.notice.background,
      +					color: theme.roles.notice.text,
      +					"& .dashed-line": {
      +						backgroundColor: theme.roles.notice.outline,
      +					},
      +				},
      +				"&.warn": {
      +					backgroundColor: theme.roles.warning.background,
      +					color: theme.roles.warning.text,
      +
      +					"& .dashed-line": {
      +						backgroundColor: theme.roles.warning.outline,
      +					},
      +				},
      +			})}
      +			className={cn(
      +				"m-0 break-all flex items-center text-[13px]",
      +				"text-content-primary font-mono h-auto",
      +				level,
      +				divProps.className,
      +				"logs-line",
      +			)}
       			{...divProps}
       		/>
       	);
       };
       
       export const LogLinePrefix: FC> = (props) => {
      -	return 
      ;
      +	return (
      +		
      +	);
       };
      -
      -const styles = {
      -	line: (theme) => ({
      -		margin: 0,
      -		wordBreak: "break-all",
      -		display: "flex",
      -		alignItems: "center",
      -		fontSize: 13,
      -		color: theme.palette.text.primary,
      -		fontFamily: MONOSPACE_FONT_FAMILY,
      -		height: "auto",
      -		padding: `0 var(--log-line-side-padding, ${DEFAULT_LOG_LINE_SIDE_PADDING}px)`,
      -
      -		"&.error": {
      -			backgroundColor: theme.roles.error.background,
      -			color: theme.roles.error.text,
      -
      -			"& .dashed-line": {
      -				backgroundColor: theme.roles.error.outline,
      -			},
      -		},
      -
      -		"&.debug": {
      -			backgroundColor: theme.roles.notice.background,
      -			color: theme.roles.notice.text,
      -
      -			"& .dashed-line": {
      -				backgroundColor: theme.roles.notice.outline,
      -			},
      -		},
      -
      -		"&.warn": {
      -			backgroundColor: theme.roles.warning.background,
      -			color: theme.roles.warning.text,
      -
      -			"& .dashed-line": {
      -				backgroundColor: theme.roles.warning.outline,
      -			},
      -		},
      -	}),
      -
      -	prefix: (theme) => ({
      -		userSelect: "none",
      -		margin: 0,
      -		display: "inline-block",
      -		color: theme.palette.text.secondary,
      -		marginRight: 24,
      -	}),
      -} satisfies Record>;
      diff --git a/site/src/components/Logs/Logs.tsx b/site/src/components/Logs/Logs.tsx
      index cf40855b34b15..89186506c0479 100644
      --- a/site/src/components/Logs/Logs.tsx
      +++ b/site/src/components/Logs/Logs.tsx
      @@ -1,6 +1,7 @@
       import type { Interpolation, Theme } from "@emotion/react";
       import dayjs from "dayjs";
       import type { FC } from "react";
      +import { cn } from "utils/cn";
       import { type Line, LogLine, LogLinePrefix } from "./LogLine";
       
       export const DEFAULT_LOG_LINE_SIDE_PADDING = 24;
      @@ -17,7 +18,15 @@ export const Logs: FC = ({
       	className = "",
       }) => {
       	return (
      -		
      +
      {lines.map((line) => ( @@ -33,18 +42,3 @@ export const Logs: FC = ({
      ); }; - -const styles = { - root: (theme) => ({ - minHeight: 156, - padding: "8px 0", - borderRadius: 8, - overflowX: "auto", - background: theme.palette.background.default, - - "&:not(:last-child)": { - borderBottom: `1px solid ${theme.palette.divider}`, - borderRadius: 0, - }, - }), -} satisfies Record>; diff --git a/site/src/components/Margins/Margins.tsx b/site/src/components/Margins/Margins.tsx index 2e2ed8242a5eb..b2e750a6e2e92 100644 --- a/site/src/components/Margins/Margins.tsx +++ b/site/src/components/Margins/Margins.tsx @@ -26,12 +26,11 @@ export const Margins: FC = ({ return (
      {children}
      diff --git a/site/src/components/Markdown/Markdown.stories.tsx b/site/src/components/Markdown/Markdown.stories.tsx index b2351c1d43153..b60637ec93391 100644 --- a/site/src/components/Markdown/Markdown.stories.tsx +++ b/site/src/components/Markdown/Markdown.stories.tsx @@ -10,6 +10,14 @@ export default meta; type Story = StoryObj; export const WithCode: Story = { + args: { + children: ` + foobar + `, + }, +}; + +export const WithCodeblock: Story = { args: { children: ` ## Required permissions / policy diff --git a/site/src/components/Markdown/Markdown.tsx b/site/src/components/Markdown/Markdown.tsx index f0ee50432dbde..39d4edb6d1b55 100644 --- a/site/src/components/Markdown/Markdown.tsx +++ b/site/src/components/Markdown/Markdown.tsx @@ -84,12 +84,13 @@ export const Markdown: FC = (props) => { ) : ( ({ - background: theme.palette.divider, - color: theme.palette.text.primary, - })} - className="py-[1px] px-1 rounded-sm text-sm leading-none" {...props} + className={cn([ + "py-[1px] px-1 rounded-sm text-sm leading-none", + "bg-surface-tertiary dark:bg-surface-quaternary", + "text-content-primary", + props.className, + ])} > {children} @@ -203,11 +204,10 @@ export const InlineMarkdown: FC = (props) => { code: ({ node, className, children, style, ...props }) => ( ({ - background: theme.palette.divider, - color: theme.palette.text.primary, - })} - className="py-[1px] px-1 rounded-sm text-sm leading-none" + className={cn( + "py-[1px] px-1 rounded-sm text-sm leading-none text-content-primary", + "bg-surface-tertiary dark:bg-surface-quaternary", + )} {...props} > {children} diff --git a/site/src/components/Menu/MenuSearch.tsx b/site/src/components/Menu/MenuSearch.tsx index 99c7720544560..62fd9246a2b57 100644 --- a/site/src/components/Menu/MenuSearch.tsx +++ b/site/src/components/Menu/MenuSearch.tsx @@ -3,18 +3,17 @@ import { type SearchFieldProps, } from "components/SearchField/SearchField"; import type { FC } from "react"; +import { cn } from "utils/cn"; + export const MenuSearch: FC = (props) => { return ( ({ - "& fieldset": { - // MUI has so many nested selectors that it's easier to just - // override the border directly using the `!important` hack - borderBottom: `1px solid ${theme.palette.divider} !important`, - }, - })} - className={"[& fieldset]:border-0 [& fieldset]:rounded-none"} + className={cn( + "[&_fieldset]:border-0 [&_fieldset]:rounded-none", + "[&_fieldset]:!border-0 [&_fieldset]:!border-b", + "[&_fieldset]:!border-surface-quaternary", + )} {...props} /> ); diff --git a/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.tsx b/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.tsx index 5b29a8a22c0ef..08358c6180c3d 100644 --- a/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.tsx +++ b/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.tsx @@ -111,11 +111,7 @@ export const OrganizationAutocomplete: FC = ({ size={size} label={label} placeholder="Organization name" - css={{ - "&:not(:has(label))": { - margin: 0, - }, - }} + className="[&:not(:has(label))]:m-0" InputProps={{ ...params.InputProps, startAdornment: selected && ( diff --git a/site/src/components/OverflowY/OverflowY.stories.tsx b/site/src/components/OverflowY/OverflowY.stories.tsx index 5e762a995607c..406e817dafa69 100644 --- a/site/src/components/OverflowY/OverflowY.stories.tsx +++ b/site/src/components/OverflowY/OverflowY.stories.tsx @@ -14,7 +14,7 @@ const meta: Meta = { children: numbers.map((num, i) => (

      = ({ return (

      {children}
      diff --git a/site/src/components/PageHeader/FullWidthPageHeader.tsx b/site/src/components/PageHeader/FullWidthPageHeader.tsx index c8cb59e5e56de..2c340fab097ec 100644 --- a/site/src/components/PageHeader/FullWidthPageHeader.tsx +++ b/site/src/components/PageHeader/FullWidthPageHeader.tsx @@ -37,19 +37,7 @@ export const FullWidthPageHeader: FC = ({ }; const _PageHeaderActions: FC = ({ children }) => { - const theme = useTheme(); - return ( -
      - {children} -
      - ); + return
      {children}
      ; }; export const PageHeaderTitle: FC = ({ children }) => { @@ -57,14 +45,8 @@ export const PageHeaderTitle: FC = ({ children }) => { }; export const PageHeaderSubtitle: FC = ({ children }) => { - const theme = useTheme(); return ( - + {children} ); diff --git a/site/src/components/PageHeader/PageHeader.tsx b/site/src/components/PageHeader/PageHeader.tsx index 3695fa5d409a0..75dbca4b167f6 100644 --- a/site/src/components/PageHeader/PageHeader.tsx +++ b/site/src/components/PageHeader/PageHeader.tsx @@ -50,11 +50,8 @@ export const PageHeaderSubtitle: FC = ({ }) => { return (

      ({ - color: theme.palette.text.secondary, - })} className={cn( - "text-base font-normal block mb-0 leading-[1.4]", + "text-base font-normal block mb-0 text-content-secondary leading-[1.4]", condensed && "mt-1", !condensed && "mt-2", )} @@ -66,15 +63,7 @@ export const PageHeaderSubtitle: FC = ({ export const PageHeaderCaption: FC = ({ children }) => { return ( - ({ - fontSize: 12, - color: theme.palette.text.secondary, - fontWeight: 600, - textTransform: "uppercase", - letterSpacing: "0.1em", - })} - > + {children} ); diff --git a/site/src/components/PaginationWidget/PaginationHeader.tsx b/site/src/components/PaginationWidget/PaginationHeader.tsx index 9cb8a4f5100f8..3647999833c15 100644 --- a/site/src/components/PaginationWidget/PaginationHeader.tsx +++ b/site/src/components/PaginationWidget/PaginationHeader.tsx @@ -1,4 +1,3 @@ -import { useTheme } from "@emotion/react"; import Skeleton from "@mui/material/Skeleton"; import type { FC } from "react"; import { cn } from "utils/cn"; @@ -21,18 +20,11 @@ export const PaginationHeader: FC = ({ currentOffsetStart, className, }) => { - const theme = useTheme(); - return (
      = ({ documentationLink, }) => { return ( -
      +
      {message}
      @@ -40,19 +39,19 @@ export const Paywall: FC = ({
        -
      • +
      • High availability & workspace proxies
      • -
      • +
      • Multi-org & role-based access control
      • -
      • +
      • 24x7 global support with SLA
      • -
      • +
      • Unlimited Git & external auth integrations
      • @@ -77,33 +76,15 @@ const FeatureIcon: FC = () => { return (