Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
07bb2d7
feat: "v1" of changes (WIP)
jakehwll Dec 8, 2025
fbbe799
Merge branch 'main' into jakehwll/mui-css-cleanup
jakehwll Dec 8, 2025
564cfd3
fix: resolve `<Alert />` issues
jakehwll Dec 8, 2025
e228572
fix: resolve `<Fieldset />`
jakehwll Dec 8, 2025
dff4c4f
chore: resolve `<WorkspaceBuildProgress />`
jakehwll Dec 8, 2025
22c50b0
fix: resolve colors on `schedule-controls-autostop`
jakehwll Dec 8, 2025
f1f9b17
Merge branch 'main' into jakehwll/mui-css-cleanup
jakehwll Dec 8, 2025
e43653c
fix: resolve unused variables
jakehwll Dec 8, 2025
f078f3a
Merge branch 'main' into jakehwll/mui-css-cleanup
jakehwll Dec 8, 2025
84fb26d
feat: "v2" of changes (WIP)
jakehwll Dec 8, 2025
d8f2997
Merge branch 'main' into jakehwll/mui-css-cleanup
jakehwll Dec 8, 2025
9070cf0
fix: resolve `<PageHeader />` and `<HelpTooltip />`
jakehwll Dec 8, 2025
7f6947d
Merge branch 'main' into jakehwll/mui-css-cleanup
jakehwll Dec 8, 2025
64dd242
fix: lint
jakehwll Dec 8, 2025
fff1dc5
fix: resolve `<CodeExample />` background color
jakehwll Dec 8, 2025
115d991
fix: resolve `IconField` adornment size
jakehwll Dec 9, 2025
6f76439
chore: fix resolve `<PageHeader />` sizing
jakehwll Dec 9, 2025
674f476
fix: resolve `<UserGroupsCell />`
jakehwll Dec 9, 2025
7f354e1
Revert "chore: fix resolve `<PageHeader />` sizing"
jakehwll Dec 9, 2025
f2b203c
fix: resolve `<HelpTooltip />`
jakehwll Dec 9, 2025
f489159
fix: properly center the `<Badge />`'s
jakehwll Dec 9, 2025
f0a5e10
Revert "fix: resolve `<HelpTooltip />`"
jakehwll Dec 9, 2025
758a2f4
fix: merge classes on `<Topbar />`
jakehwll Dec 9, 2025
2d33d83
chore: replace `10.5` with `[42px]`
jakehwll Dec 9, 2025
6e0076e
chore: resolve `<PageHeader />` mobile responsive
jakehwll Dec 9, 2025
fb54ddf
fix: resolve `<TemplateVersionEditor />`
jakehwll Dec 9, 2025
81fa9d8
fix: resolve content paddings
jakehwll Dec 9, 2025
9b39515
Merge branch 'main' into jakehwll/mui-css-cleanup
jakehwll Dec 9, 2025
107b165
fix: ensure `py-12` (not sure why this being overwritten differently)
jakehwll Dec 9, 2025
32dadf0
feat: "v3" of changes (WIP)
jakehwll Dec 9, 2025
72a3f0f
fix: resolve `<IconsPage />`
jakehwll Dec 9, 2025
84b7482
fix: resolve wrapping
jakehwll Dec 9, 2025
cc63af3
feat: resolve layout issues
jakehwll Dec 9, 2025
168cb6e
Merge branch 'main' into jakehwll/mui-css-cleanup
jakehwll Dec 9, 2025
20780ac
feat: resolve further layout issues
jakehwll Dec 9, 2025
36aebd1
Merge branch 'main' into jakehwll/mui-css-cleanup
jakehwll Dec 10, 2025
fbd33a7
feat: "v4" of changes (WIP)
jakehwll Dec 10, 2025
c592c3a
Merge branch 'main' into jakehwll/mui-css-cleanup
jakehwll Dec 10, 2025
4fbc640
Merge branch 'main' into jakehwll/mui-css-cleanup
jakehwll Dec 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions site/src/components/Alert/Alert.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
type ReactNode,
useState,
} from "react";
import { cn } from "utils/cn";
export type AlertColor = MuiAlertColor;

export type AlertProps = MuiAlertProps & {
Expand Down Expand Up @@ -39,7 +40,7 @@ export const Alert: FC<AlertProps> = ({
<Collapse in>
<MuiAlert
{...alertProps}
css={{ textAlign: "left" }}
className={cn("text-left", alertProps.className)}
severity={severity}
action={
<>
Expand Down Expand Up @@ -72,7 +73,7 @@ export const Alert: FC<AlertProps> = ({
export const AlertDetail: FC<PropsWithChildren> = ({ children }) => {
return (
<span
css={(theme) => ({ color: theme.palette.text.secondary, fontSize: 13 })}
className={"text-[13px] text-content-secondary"}
data-chromatic="ignore"
>
{children}
Expand Down
42 changes: 12 additions & 30 deletions site/src/components/Avatar/AvatarCard.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
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;
Expand All @@ -15,20 +15,16 @@ export const AvatarCard: FC<AvatarCardProps> = ({
subtitle,
maxWidth = "none",
}) => {
const theme = useTheme();

return (
<div
css={{
maxWidth: maxWidth === "none" ? undefined : `${maxWidth}px`,
display: "flex",
flexFlow: "row nowrap",
alignItems: "center",
border: `1px solid ${theme.palette.divider}`,
gap: "16px",
padding: "16px",
borderRadius: "8px",
cursor: "default",
className={cn(
"flex flex-row flex-nowrap items-center gap-4",
"p-4 rounded-lg cursor-default",
"border border-solid border-zinc-200 dark:border-zinc-700",
)}
// TODO: We don't actually use this prop, so we should remove it.
style={{
...(maxWidth !== "none" ? { maxWidth: `${maxWidth}px` } : {}),
}}
>
{/**
Expand All @@ -37,31 +33,17 @@ export const AvatarCard: FC<AvatarCardProps> = ({
*
* @see {@link https://css-tricks.com/flexbox-truncated-text/}
*/}
<div css={{ marginRight: "auto", minWidth: 0 }}>
<div className="mr-auto min-w-0">
<h3
// Lets users hover over truncated text to see whole thing
title={header}
css={[
theme.typography.body1 as CSSObject,
{
lineHeight: 1.4,
margin: 0,
overflow: "hidden",
whiteSpace: "nowrap",
textOverflow: "ellipsis",
},
]}
className="leading-[1.4] m-0 overflow-hidden whitespace-nowrap text-ellipsis font-normal text-base"
>
{header}
</h3>

{subtitle && (
<div
css={[
theme.typography.body2 as CSSObject,
{ color: theme.palette.text.secondary },
]}
>
<div className="text-sm leading-relaxed text-zinc-600 dark:text-zinc-400">
{subtitle}
</div>
)}
Expand Down
12 changes: 12 additions & 0 deletions site/src/components/Badges/Badges.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import type { Meta, StoryObj } from "@storybook/react-vite";
import {
AlphaBadge,
Badges,
DeprecatedBadge,
DisabledBadge,
EnabledBadge,
EnterpriseBadge,
EntitledBadge,
HealthyBadge,
NotHealthyBadge,
Expand Down Expand Up @@ -50,6 +52,11 @@ export const Disabled: Story = {
children: <DisabledBadge />,
},
};
export const Enterprise: Story = {
args: {
children: <EnterpriseBadge />,
},
};
export const Premium: Story = {
args: {
children: <PremiumBadge />,
Expand All @@ -65,3 +72,8 @@ export const Alpha: Story = {
children: <AlphaBadge />,
},
};
export const Deprecated: Story = {
args: {
children: <DeprecatedBadge />,
},
};
161 changes: 49 additions & 112 deletions site/src/components/Badges/Badges.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import type { Interpolation, Theme } from "@emotion/react";
import { Stack } from "components/Stack/Stack";
import {
Tooltip,
TooltipContent,
Expand All @@ -11,71 +9,70 @@ 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<string, Interpolation<Theme>>;
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 leading-none",
],
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 (
<span css={[styles.badge, styles.enabledBadge]} className="option-enabled">
<span
className={cn([
"option-enabled",
badgeClasses.root,
badgeClasses.enabled,
])}
>
Enabled
</span>
);
};

export const EntitledBadge: FC = () => {
return <span css={[styles.badge, styles.enabledBadge]}>Entitled</span>;
return (
<span className={cn(badgeClasses.root, badgeClasses.enabled)}>
Entitled
</span>
);
};

interface HealthyBadge {
derpOnly?: boolean;
}
export const HealthyBadge: FC<HealthyBadge> = ({ derpOnly }) => {
return (
<span css={[styles.badge, styles.enabledBadge]}>
<span className={cn(badgeClasses.root, badgeClasses.enabled)}>
{derpOnly ? "Healthy (DERP only)" : "Healthy"}
</span>
);
};

export const NotHealthyBadge: FC = () => {
return <span css={[styles.badge, styles.errorBadge]}>Unhealthy</span>;
return (
<span className={cn(badgeClasses.root, badgeClasses.error)}>Unhealthy</span>
);
};

export const NotRegisteredBadge: FC = () => {
return (
<Tooltip>
<TooltipTrigger asChild>
<span css={[styles.badge, styles.warnBadge]}>Never seen</span>
<span className={cn(badgeClasses.root, badgeClasses.warn)}>
Never seen
</span>
</TooltipTrigger>
<TooltipContent side="bottom" className="max-w-xs">
Workspace Proxy has never come online and needs to be started.
Expand All @@ -88,7 +85,9 @@ export const NotReachableBadge: FC = () => {
return (
<Tooltip>
<TooltipTrigger asChild>
<span css={[styles.badge, styles.warnBadge]}>Not reachable</span>
<span className={cn(badgeClasses.root, badgeClasses.warn)}>
Not reachable
</span>
</TooltipTrigger>
<TooltipContent side="bottom" className="max-w-xs">
Workspace Proxy not responding to http(s) requests.
Expand All @@ -105,15 +104,11 @@ export const DisabledBadge: FC = forwardRef<
<span
{...props}
ref={ref}
css={[
styles.badge,
(theme) => ({
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
</span>
Expand All @@ -122,98 +117,40 @@ export const DisabledBadge: FC = forwardRef<

export const EnterpriseBadge: FC = () => {
return (
<span
css={[
styles.badge,
(theme) => ({
backgroundColor: theme.branding.enterprise.background,
border: `1px solid ${theme.branding.enterprise.border}`,
color: theme.branding.enterprise.text,
}),
]}
>
<span className={cn(badgeClasses.root, badgeClasses.enterprise)}>
Enterprise
</span>
);
};

export const PremiumBadge: FC = () => {
return (
<span
css={[
styles.badge,
(theme) => ({
backgroundColor: theme.branding.premium.background,
border: `1px solid ${theme.branding.premium.border}`,
color: theme.branding.premium.text,
}),
]}
>
Premium
</span>
<span className={cn(badgeClasses.root, badgeClasses.premium)}>Premium</span>
);
};

export const PreviewBadge: FC = () => {
return (
<span
css={[
styles.badge,
(theme) => ({
border: `1px solid ${theme.roles.preview.outline}`,
backgroundColor: theme.roles.preview.background,
color: theme.roles.preview.text,
}),
]}
>
Preview
</span>
<span className={cn(badgeClasses.root, badgeClasses.preview)}>Preview</span>
);
};

export const AlphaBadge: FC = () => {
return (
<span
css={[
styles.badge,
(theme) => ({
border: `1px solid ${theme.roles.preview.outline}`,
backgroundColor: theme.roles.preview.background,
color: theme.roles.preview.text,
}),
]}
>
Alpha
</span>
<span className={cn(badgeClasses.root, badgeClasses.preview)}>Alpha</span>
);
};

export const DeprecatedBadge: FC = () => {
return (
<span
css={[
styles.badge,
(theme) => ({
border: `1px solid ${theme.roles.danger.outline}`,
backgroundColor: theme.roles.danger.background,
color: theme.roles.danger.text,
}),
]}
>
<span className={cn(badgeClasses.root, badgeClasses.deprecated)}>
Deprecated
</span>
);
};

export const Badges: FC<PropsWithChildren> = ({ children }) => {
return (
<Stack
css={{ margin: "0 0 16px" }}
direction="row"
alignItems="center"
spacing={1}
>
{children}
</Stack>
<div className="flex flex-row items-center gap-2 mb-4">{children}</div>
);
};
Loading
Loading