From 781b73fa69ff889d1c1472585f92d10bbd06886f Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 3 Oct 2023 19:00:45 +0000 Subject: [PATCH 01/15] emotion: `CodeExample` --- .../components/CodeExample/CodeExample.tsx | 74 +++++++++---------- 1 file changed, 33 insertions(+), 41 deletions(-) diff --git a/site/src/components/CodeExample/CodeExample.tsx b/site/src/components/CodeExample/CodeExample.tsx index abfdf3b206d0a..aaf5aca6432a0 100644 --- a/site/src/components/CodeExample/CodeExample.tsx +++ b/site/src/components/CodeExample/CodeExample.tsx @@ -1,9 +1,7 @@ -import { makeStyles } from "@mui/styles"; -import { FC } from "react"; +import { type FC } from "react"; +import { useTheme } from "@emotion/react"; import { MONOSPACE_FONT_FAMILY } from "theme/constants"; -import { combineClasses } from "utils/combineClasses"; import { CopyButton } from "../CopyButton/CopyButton"; -import { Theme } from "@mui/material/styles"; export interface CodeExampleProps { code: string; @@ -14,46 +12,40 @@ export interface CodeExampleProps { /** * Component to show single-line code examples, with a copy button */ -export const CodeExample: FC = ({ - code, - password, - className, -}) => { - const styles = useStyles({ password }); +export const CodeExample: FC = (props) => { + const { code, password, className } = props; + const theme = useTheme(); return ( -
- {code} +
+ + {code} +
); }; - -interface styleProps { - inline?: boolean; - password?: boolean; -} - -const useStyles = makeStyles((theme) => ({ - root: (props) => ({ - display: props.inline ? "inline-flex" : "flex", - flexDirection: "row", - alignItems: "center", - background: "rgb(0 0 0 / 30%)", - color: theme.palette.primary.contrastText, - fontFamily: MONOSPACE_FONT_FAMILY, - fontSize: 14, - borderRadius: theme.shape.borderRadius, - padding: theme.spacing(1), - lineHeight: "150%", - border: `1px solid ${theme.palette.divider}`, - }), - code: { - padding: theme.spacing(0, 1), - width: "100%", - display: "flex", - alignItems: "center", - wordBreak: "break-all", - "-webkit-text-security": (props) => (props.password ? "disc" : undefined), - }, -})); From 20b1b7396a79015facf9cddde56b9ccac79ce8c8 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 3 Oct 2023 19:26:09 +0000 Subject: [PATCH 02/15] emotion + refactor: `DropdownArrow` --- .../Navbar/UserDropdown/UserDropdown.tsx | 11 +---- .../DropdownArrow/DropdownArrow.tsx | 28 +++++++++++++ .../DropdownArrows/DropdownArrows.tsx | 42 ------------------- site/src/components/Expander/Expander.tsx | 13 +++--- site/src/components/IconField/IconField.tsx | 4 +- site/src/components/Resources/AgentRow.tsx | 9 ++-- .../src/components/Resources/ResourceCard.tsx | 11 +---- site/src/components/Resources/Resources.tsx | 16 ++----- .../AuditPage/AuditLogRow/AuditLogRow.tsx | 7 +--- 9 files changed, 47 insertions(+), 94 deletions(-) create mode 100644 site/src/components/DropdownArrow/DropdownArrow.tsx delete mode 100644 site/src/components/DropdownArrows/DropdownArrows.tsx diff --git a/site/src/components/Dashboard/Navbar/UserDropdown/UserDropdown.tsx b/site/src/components/Dashboard/Navbar/UserDropdown/UserDropdown.tsx index c285cbc61fa00..50143eeecf217 100644 --- a/site/src/components/Dashboard/Navbar/UserDropdown/UserDropdown.tsx +++ b/site/src/components/Dashboard/Navbar/UserDropdown/UserDropdown.tsx @@ -5,10 +5,7 @@ import { colors } from "theme/colors"; import * as TypesGen from "api/typesGenerated"; import { navHeight } from "theme/constants"; import { BorderedMenu } from "./BorderedMenu"; -import { - CloseDropdown, - OpenDropdown, -} from "components/DropdownArrows/DropdownArrows"; +import { DropdownArrow } from "components/DropdownArrow/DropdownArrow"; import { UserAvatar } from "components/UserAvatar/UserAvatar"; import { UserDropdownContent } from "./UserDropdownContent"; import { BUTTON_SM_HEIGHT } from "theme/theme"; @@ -69,11 +66,7 @@ export const UserDropdown: FC> = ({ avatarURL={user.avatar_url} /> - {anchorEl ? ( - - ) : ( - - )} +
diff --git a/site/src/components/DropdownArrow/DropdownArrow.tsx b/site/src/components/DropdownArrow/DropdownArrow.tsx new file mode 100644 index 0000000000000..1e769692ccc24 --- /dev/null +++ b/site/src/components/DropdownArrow/DropdownArrow.tsx @@ -0,0 +1,28 @@ +import KeyboardArrowDown from "@mui/icons-material/KeyboardArrowDown"; +import KeyboardArrowUp from "@mui/icons-material/KeyboardArrowUp"; +import { type FC } from "react"; +import { type Theme } from "@emotion/react"; + +interface ArrowProps { + margin?: boolean; + color?: string; + close?: boolean; +} + +export const DropdownArrow: FC = (props) => { + const { margin = true, color, close } = props; + + const Arrow = close ? KeyboardArrowUp : KeyboardArrowDown; + + return ( + ({ + color: color ?? theme.palette.primary.contrastText, + marginLeft: margin ? theme.spacing(1) : 0, + width: 16, + height: 16, + })} + /> + ); +}; diff --git a/site/src/components/DropdownArrows/DropdownArrows.tsx b/site/src/components/DropdownArrows/DropdownArrows.tsx deleted file mode 100644 index af0f73ea5052e..0000000000000 --- a/site/src/components/DropdownArrows/DropdownArrows.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { makeStyles } from "@mui/styles"; -import KeyboardArrowDown from "@mui/icons-material/KeyboardArrowDown"; -import KeyboardArrowUp from "@mui/icons-material/KeyboardArrowUp"; -import { FC } from "react"; -import { Theme } from "@mui/material/styles"; - -const useStyles = makeStyles((theme: Theme) => ({ - arrowIcon: { - color: ({ color }) => color ?? theme.palette.primary.contrastText, - marginLeft: ({ margin }) => (margin ? theme.spacing(1) : 0), - width: 16, - height: 16, - }, - arrowIconUp: { - color: ({ color }) => color ?? theme.palette.primary.contrastText, - }, -})); - -interface ArrowProps { - margin?: boolean; - color?: string; -} - -export const OpenDropdown: FC = ({ margin = true, color }) => { - const styles = useStyles({ margin, color }); - return ( - - ); -}; - -export const CloseDropdown: FC = ({ margin = true, color }) => { - const styles = useStyles({ margin, color }); - return ( - - ); -}; diff --git a/site/src/components/Expander/Expander.tsx b/site/src/components/Expander/Expander.tsx index 5fb61376786c7..25fac1d7ad2ec 100644 --- a/site/src/components/Expander/Expander.tsx +++ b/site/src/components/Expander/Expander.tsx @@ -1,11 +1,8 @@ +import Collapse from "@mui/material/Collapse"; import Link from "@mui/material/Link"; import makeStyles from "@mui/styles/makeStyles"; -import { - CloseDropdown, - OpenDropdown, -} from "components/DropdownArrows/DropdownArrows"; -import { PropsWithChildren, FC } from "react"; -import Collapse from "@mui/material/Collapse"; +import { DropdownArrow } from "components/DropdownArrow/DropdownArrow"; +import { type FC, type PropsWithChildren } from "react"; import { combineClasses } from "utils/combineClasses"; export interface ExpanderProps { @@ -28,7 +25,7 @@ export const Expander: FC> = ({ Click here to learn more - + )} @@ -42,7 +39,7 @@ export const Expander: FC> = ({ > Click here to hide - + )} diff --git a/site/src/components/IconField/IconField.tsx b/site/src/components/IconField/IconField.tsx index 0d11665257f07..2e5e0ba606a1a 100644 --- a/site/src/components/IconField/IconField.tsx +++ b/site/src/components/IconField/IconField.tsx @@ -2,7 +2,7 @@ import Button from "@mui/material/Button"; import InputAdornment from "@mui/material/InputAdornment"; import Popover from "@mui/material/Popover"; import TextField, { TextFieldProps } from "@mui/material/TextField"; -import { OpenDropdown } from "components/DropdownArrows/DropdownArrows"; +import { DropdownArrow } from "components/DropdownArrow/DropdownArrow"; import { useRef, FC, useState } from "react"; import Picker from "@emoji-mart/react"; import { makeStyles } from "@mui/styles"; @@ -52,7 +52,7 @@ const IconField: FC = ({ onPickEmoji, ...textFieldProps }) => { ) : ( @@ -456,7 +453,7 @@ export const AgentRow: FC = ({ setShowLogs((v) => !v); }} > - + Show logs )} diff --git a/site/src/components/Resources/ResourceCard.tsx b/site/src/components/Resources/ResourceCard.tsx index e19137ad0e551..04007b172bb9b 100644 --- a/site/src/components/Resources/ResourceCard.tsx +++ b/site/src/components/Resources/ResourceCard.tsx @@ -4,10 +4,7 @@ import { WorkspaceAgent, WorkspaceResource } from "api/typesGenerated"; import { Stack } from "../Stack/Stack"; import { ResourceAvatar } from "./ResourceAvatar"; import { SensitiveValue } from "./SensitiveValue"; -import { - OpenDropdown, - CloseDropdown, -} from "components/DropdownArrows/DropdownArrows"; +import { DropdownArrow } from "components/DropdownArrow/DropdownArrow"; import IconButton from "@mui/material/IconButton"; import Tooltip from "@mui/material/Tooltip"; import { CopyableValue } from "components/CopyableValue/CopyableValue"; @@ -95,11 +92,7 @@ export const ResourceCard: FC = ({ resource, agentRow }) => { }} size="large" > - {shouldDisplayAllMetadata ? ( - - ) : ( - - )} + )} diff --git a/site/src/components/Resources/Resources.tsx b/site/src/components/Resources/Resources.tsx index cfb24b565aaf2..28152756ab598 100644 --- a/site/src/components/Resources/Resources.tsx +++ b/site/src/components/Resources/Resources.tsx @@ -1,9 +1,6 @@ import Button from "@mui/material/Button"; import { makeStyles } from "@mui/styles"; -import { - CloseDropdown, - OpenDropdown, -} from "components/DropdownArrows/DropdownArrows"; +import { DropdownArrow } from "components/DropdownArrow/DropdownArrow"; import { FC, useState } from "react"; import { WorkspaceAgent, WorkspaceResource } from "api/typesGenerated"; import { Stack } from "../Stack/Stack"; @@ -49,15 +46,8 @@ export const Resources: FC> = ({ size="small" onClick={() => setShouldDisplayHideResources((v) => !v)} > - {shouldDisplayHideResources ? ( - <> - Hide resources - - ) : ( - <> - Show hidden resources - - )} + {shouldDisplayHideResources ? "Hide" : "Show hidden"} resources + )} diff --git a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx index 3537b37d29fee..dbeefc6d3d56b 100644 --- a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx +++ b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx @@ -2,10 +2,7 @@ import Collapse from "@mui/material/Collapse"; import { makeStyles } from "@mui/styles"; import TableCell from "@mui/material/TableCell"; import { AuditLog } from "api/typesGenerated"; -import { - CloseDropdown, - OpenDropdown, -} from "components/DropdownArrows/DropdownArrows"; +import { DropdownArrow } from "components/DropdownArrow/DropdownArrow"; import { Pill, type PillType } from "components/Pill/Pill"; import { Stack } from "components/Stack/Stack"; import { TimelineEntry } from "components/Timeline/TimelineEntry"; @@ -154,7 +151,7 @@ export const AuditLogRow: React.FC = ({ {shouldDisplayDiff ? ( -
{isDiffOpen ? : }
+
{}
) : (
)} From 01bdcd6bdc2bc392f3d9b4b1b0ef233251e80154 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 3 Oct 2023 19:29:33 +0000 Subject: [PATCH 03/15] emotion: `InfoTooltip` --- .../components/InfoTooltip/InfoTooltip.tsx | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/site/src/components/InfoTooltip/InfoTooltip.tsx b/site/src/components/InfoTooltip/InfoTooltip.tsx index 528dc30d9f23d..7466ec512a92f 100644 --- a/site/src/components/InfoTooltip/InfoTooltip.tsx +++ b/site/src/components/InfoTooltip/InfoTooltip.tsx @@ -5,7 +5,7 @@ import { HelpTooltipTitle, } from "components/HelpTooltip/HelpTooltip"; import InfoIcon from "@mui/icons-material/InfoOutlined"; -import { makeStyles } from "@mui/styles"; +import { css } from "@emotion/css"; import { colors } from "theme/colors"; interface InfoTooltipProps { @@ -17,31 +17,22 @@ interface InfoTooltipProps { export const InfoTooltip: FC = (props) => { const { title, message, type = "info" } = props; - const styles = useStyles({ type }); - return ( {title} {message} ); }; - -const useStyles = makeStyles>(() => ({ - icon: ({ type }) => ({ - color: type === "info" ? colors.blue[5] : colors.yellow[5], - }), - - button: { - opacity: 1, - - "&:hover": { - opacity: 1, - }, - }, -})); From d995bcd5719462c1620a24f057dce3f115d6210e Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 3 Oct 2023 19:37:50 +0000 Subject: [PATCH 04/15] emotion: `ResourceCard` --- .../src/components/Resources/ResourceCard.tsx | 164 +++++++++--------- 1 file changed, 81 insertions(+), 83 deletions(-) diff --git a/site/src/components/Resources/ResourceCard.tsx b/site/src/components/Resources/ResourceCard.tsx index 04007b172bb9b..879a993311219 100644 --- a/site/src/components/Resources/ResourceCard.tsx +++ b/site/src/components/Resources/ResourceCard.tsx @@ -1,14 +1,66 @@ -import { makeStyles } from "@mui/styles"; -import { FC, useState } from "react"; +import { type FC, useState } from "react"; +import IconButton from "@mui/material/IconButton"; +import Tooltip from "@mui/material/Tooltip"; +import { type CSSObject, type Interpolation, type Theme } from "@emotion/react"; import { WorkspaceAgent, WorkspaceResource } from "api/typesGenerated"; +import { DropdownArrow } from "components/DropdownArrow/DropdownArrow"; +import { CopyableValue } from "components/CopyableValue/CopyableValue"; import { Stack } from "../Stack/Stack"; import { ResourceAvatar } from "./ResourceAvatar"; import { SensitiveValue } from "./SensitiveValue"; -import { DropdownArrow } from "components/DropdownArrow/DropdownArrow"; -import IconButton from "@mui/material/IconButton"; -import Tooltip from "@mui/material/Tooltip"; -import { CopyableValue } from "components/CopyableValue/CopyableValue"; -import { type Theme } from "@mui/material/styles"; + +const styles = { + resourceCard: (theme) => ({ + background: theme.palette.background.paper, + borderRadius: theme.shape.borderRadius, + border: `1px solid ${theme.palette.divider}`, + + "&:not(:first-of-type)": { + borderTop: 0, + borderTopLeftRadius: 0, + borderTopRightRadius: 0, + }, + + "&:not(:last-child)": { + borderBottomLeftRadius: 0, + borderBottomRightRadius: 0, + }, + }), + + resourceCardProfile: { + flexShrink: 0, + width: "fit-content", + }, + + resourceCardHeader: (theme) => ({ + padding: theme.spacing(3, 4), + borderBottom: `1px solid ${theme.palette.divider}`, + + "&:last-child": { + borderBottom: 0, + }, + }), + + metadata: (theme) => ({ + ...(theme.typography.body2 as CSSObject), + lineHeight: "120%", + }), + + metadataLabel: (theme) => ({ + fontSize: 12, + color: theme.palette.text.secondary, + textOverflow: "ellipsis", + overflow: "hidden", + whiteSpace: "nowrap", + }), + + metadataValue: (theme) => ({ + textOverflow: "ellipsis", + overflow: "hidden", + whiteSpace: "nowrap", + ...(theme.typography.body1 as CSSObject), + }), +} satisfies Record>; export interface ResourceCardProps { resource: WorkspaceResource; @@ -30,44 +82,53 @@ export const ResourceCard: FC = ({ resource, agentRow }) => { metadataLength += 1; visibleMetadata.pop(); } - const styles = useStyles({ metadataLength }); return (
-
-
{resource.type}
-
{resource.name}
+
+
{resource.type}
+
{resource.name}
-
+
({ + flexGrow: 2, + display: "grid", + gridTemplateColumns: `repeat(${ + metadataLength === 1 ? 1 : 4 + }, minmax(0, 1fr))`, + gap: theme.spacing(5), + rowGap: theme.spacing(3), + })} + > {resource.daily_cost > 0 && ( -
-
+
+
cost
-
{resource.daily_cost}
+
{resource.daily_cost}
)} {visibleMetadata.map((meta) => { return ( -
-
{meta.key}
-
+
+
{meta.key}
+
{meta.sensitive ? ( ) : ( @@ -104,66 +165,3 @@ export const ResourceCard: FC = ({ resource, agentRow }) => {
); }; - -const useStyles = makeStyles((theme) => ({ - resourceCard: { - background: theme.palette.background.paper, - borderRadius: theme.shape.borderRadius, - border: `1px solid ${theme.palette.divider}`, - - "&:not(:first-of-type)": { - borderTop: 0, - borderTopLeftRadius: 0, - borderTopRightRadius: 0, - }, - - "&:not(:last-child)": { - borderBottomLeftRadius: 0, - borderBottomRightRadius: 0, - }, - }, - - resourceCardProfile: { - flexShrink: 0, - width: "fit-content", - }, - - resourceCardHeader: { - padding: theme.spacing(3, 4), - borderBottom: `1px solid ${theme.palette.divider}`, - - "&:last-child": { - borderBottom: 0, - }, - }, - - metadataHeader: (props) => ({ - flexGrow: 2, - display: "grid", - gridTemplateColumns: `repeat(${ - props.metadataLength === 1 ? 1 : 4 - }, minmax(0, 1fr))`, - gap: theme.spacing(5), - rowGap: theme.spacing(3), - }), - - metadata: { - ...theme.typography.body2, - lineHeight: "120%", - }, - - metadataLabel: { - fontSize: 12, - color: theme.palette.text.secondary, - textOverflow: "ellipsis", - overflow: "hidden", - whiteSpace: "nowrap", - }, - - metadataValue: { - textOverflow: "ellipsis", - overflow: "hidden", - whiteSpace: "nowrap", - ...theme.typography.body1, - }, -})); From 632d05b3339e0b4a9b7754fe22cc775c5d70e1dc Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 3 Oct 2023 19:45:36 +0000 Subject: [PATCH 05/15] emotion: `RichParameterInput` --- .../RichParameterInput/RichParameterInput.tsx | 204 +++++++++--------- 1 file changed, 100 insertions(+), 104 deletions(-) diff --git a/site/src/components/RichParameterInput/RichParameterInput.tsx b/site/src/components/RichParameterInput/RichParameterInput.tsx index 79a460d0d0408..d2b2436c966dd 100644 --- a/site/src/components/RichParameterInput/RichParameterInput.tsx +++ b/site/src/components/RichParameterInput/RichParameterInput.tsx @@ -1,27 +1,111 @@ import FormControlLabel from "@mui/material/FormControlLabel"; import Radio from "@mui/material/Radio"; import RadioGroup from "@mui/material/RadioGroup"; -import { makeStyles } from "@mui/styles"; import TextField, { TextFieldProps } from "@mui/material/TextField"; -import { Stack } from "components/Stack/Stack"; +import Box from "@mui/material/Box"; import { FC } from "react"; import { TemplateVersionParameter } from "api/typesGenerated"; -import { colors } from "theme/colors"; import { MemoizedMarkdown } from "components/Markdown/Markdown"; +import { Stack } from "components/Stack/Stack"; +import { colors } from "theme/colors"; import { MultiTextField } from "./MultiTextField"; -import Box from "@mui/material/Box"; -import { Theme } from "@mui/material/styles"; +import { Interpolation, Theme } from "@emotion/react"; const isBoolean = (parameter: TemplateVersionParameter) => { return parameter.type === "bool"; }; +const styles = { + label: (theme) => ({ + marginBottom: theme.spacing(0.5), + }), + labelCaption: (theme) => ({ + fontSize: 14, + color: theme.palette.text.secondary, + + ".small &": { + fontSize: 13, + lineHeight: "140%", + }, + }), + labelPrimary: (theme) => ({ + fontSize: 16, + color: theme.palette.text.primary, + fontWeight: 600, + + "& p": { + margin: 0, + lineHeight: "24px", // Keep the same as ParameterInput + }, + + ".small &": { + fontSize: 14, + }, + }), + labelImmutable: (theme) => ({ + marginTop: theme.spacing(0.5), + marginBottom: theme.spacing(0.5), + color: colors.yellow[7], + }), + textField: { + ".small & .MuiInputBase-root": { + height: 36, + fontSize: 14, + borderRadius: 6, + }, + }, + radioGroup: (theme) => ({ + ".small & .MuiFormControlLabel-label": { + fontSize: 14, + }, + ".small & .MuiRadio-root": { + padding: theme.spacing(0.75, "9px"), // 8px + 1px border + }, + ".small & .MuiRadio-root svg": { + width: 16, + height: 16, + }, + }), + checkbox: (theme) => ({ + display: "flex", + alignItems: "center", + gap: theme.spacing(1), + }), + labelIconWrapper: (theme) => ({ + width: theme.spacing(2.5), + height: theme.spacing(2.5), + display: "block", + + ".small &": { + display: "none", + }, + }), + labelIcon: { + width: "100%", + height: "100%", + objectFit: "contain", + }, + radioOption: (theme) => ({ + display: "flex", + alignItems: "center", + gap: theme.spacing(1.5), + }), + optionIcon: { + maxHeight: 20, + width: 20, + + ".small &": { + maxHeight: 16, + width: 16, + }, + }, +} satisfies Record>; + export interface ParameterLabelProps { parameter: TemplateVersionParameter; } const ParameterLabel: FC = ({ parameter }) => { - const styles = useStyles(); const hasDescription = parameter.description && parameter.description !== ""; const displayName = parameter.display_name ? parameter.display_name @@ -31,9 +115,9 @@ const ParameterLabel: FC = ({ parameter }) => { @@ -94,14 +178,12 @@ const RichParameterField: React.FC = ({ size, ...props }) => { - const styles = useStyles(); - if (isBoolean(parameter)) { return ( onChange(value)} > @@ -126,7 +208,7 @@ const RichParameterField: React.FC = ({ onChange(value)} > @@ -137,10 +219,10 @@ const RichParameterField: React.FC = ({ value={option.value} control={} label={ - + {option.icon && ( Parameter icon = ({ {...props} id={parameter.name} data-testid="parameter-field-text" - className={styles.textField} + css={styles.textField} type={parameter.type} disabled={disabled} required={parameter.required} @@ -210,89 +292,3 @@ const RichParameterField: React.FC = ({ /> ); }; - -const useStyles = makeStyles((theme) => ({ - label: { - marginBottom: theme.spacing(0.5), - }, - labelCaption: { - fontSize: 14, - color: theme.palette.text.secondary, - - ".small &": { - fontSize: 13, - lineHeight: "140%", - }, - }, - labelPrimary: { - fontSize: 16, - color: theme.palette.text.primary, - fontWeight: 600, - - "& p": { - margin: 0, - lineHeight: "24px", // Keep the same as ParameterInput - }, - - ".small &": { - fontSize: 14, - }, - }, - labelImmutable: { - marginTop: theme.spacing(0.5), - marginBottom: theme.spacing(0.5), - color: colors.yellow[7], - }, - textField: { - ".small & .MuiInputBase-root": { - height: 36, - fontSize: 14, - borderRadius: 6, - }, - }, - radioGroup: { - ".small & .MuiFormControlLabel-label": { - fontSize: 14, - }, - ".small & .MuiRadio-root": { - padding: theme.spacing(0.75, "9px"), // 8px + 1px border - }, - ".small & .MuiRadio-root svg": { - width: 16, - height: 16, - }, - }, - checkbox: { - display: "flex", - alignItems: "center", - gap: theme.spacing(1), - }, - labelIconWrapper: { - width: theme.spacing(2.5), - height: theme.spacing(2.5), - display: "block", - - ".small &": { - display: "none", - }, - }, - labelIcon: { - width: "100%", - height: "100%", - objectFit: "contain", - }, - radioOption: { - display: "flex", - alignItems: "center", - gap: theme.spacing(1.5), - }, - optionIcon: { - maxHeight: 20, - width: 20, - - ".small &": { - maxHeight: 16, - width: 16, - }, - }, -})); From 515511c6bae4cc052f670f5f6d5ab4d2a8e91554 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 3 Oct 2023 19:55:46 +0000 Subject: [PATCH 06/15] emotion: `CreateUserForm` --- .../pages/CreateUserPage/CreateUserForm.tsx | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/site/src/pages/CreateUserPage/CreateUserForm.tsx b/site/src/pages/CreateUserPage/CreateUserForm.tsx index 43767ad921aac..a4fc45e670e37 100644 --- a/site/src/pages/CreateUserPage/CreateUserForm.tsx +++ b/site/src/pages/CreateUserPage/CreateUserForm.tsx @@ -1,7 +1,10 @@ import TextField from "@mui/material/TextField"; +import MenuItem from "@mui/material/MenuItem"; +import Link from "@mui/material/Link"; import { FormikContextType, useFormik } from "formik"; import { FC } from "react"; import * as Yup from "yup"; +import { hasApiFieldErrors, isApiError } from "api/errors"; import * as TypesGen from "api/typesGenerated"; import { getFormHelpers, @@ -12,11 +15,6 @@ import { FormFooter } from "components/FormFooter/FormFooter"; import { FullPageForm } from "components/FullPageForm/FullPageForm"; import { Stack } from "components/Stack/Stack"; import { ErrorAlert } from "components/Alert/ErrorAlert"; -import { hasApiFieldErrors, isApiError } from "api/errors"; -import MenuItem from "@mui/material/MenuItem"; -import { makeStyles } from "@mui/styles"; -import { Theme } from "@mui/material/styles"; -import Link from "@mui/material/Link"; export const Language = { emailLabel: "Email", @@ -104,8 +102,6 @@ export const CreateUserForm: FC< error, ); - const styles = useStyles(); - const methods = [ authMethods?.password.enabled && "password", authMethods?.oidc.enabled && "oidc", @@ -163,7 +159,14 @@ export const CreateUserForm: FC< {language.displayName} - + ({ + fontSize: 14, + color: theme.palette.text.secondary, + wordWrap: "normal", + whiteSpace: "break-spaces", + })} + > {language.description} @@ -192,12 +195,3 @@ export const CreateUserForm: FC< ); }; - -const useStyles = makeStyles((theme) => ({ - labelDescription: { - fontSize: 14, - color: theme.palette.text.secondary, - wordWrap: "normal", - whiteSpace: "break-spaces", - }, -})); From 627d09b7fb75baba5cb6c506496e810c4f58e197 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 3 Oct 2023 20:41:51 +0000 Subject: [PATCH 07/15] emotion: `TemplateVersionEditor` --- .../TemplateVersionEditor.stories.tsx | 3 + .../TemplateVersionEditor.tsx | 171 ++++++++---------- .../TemplateVersionEditorPage.tsx | 2 +- .../templateVersionEditorXService.ts | 1 + 4 files changed, 76 insertions(+), 101 deletions(-) diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx index bc40bf5cd38ef..c235acdcf5a91 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx @@ -34,12 +34,14 @@ export const Example: Story = {}; export const Logs = { args: { + isBuildingNewVersion: true, buildLogs: MockWorkspaceBuildLogs, }, }; export const Resources: Story = { args: { + isBuildingNewVersion: true, buildLogs: MockWorkspaceBuildLogs, resources: [ MockWorkspaceResource, @@ -54,6 +56,7 @@ export const Resources: Story = { export const ManyLogs = { args: { + isBuildingNewVersion: true, templateVersion: { ...MockTemplateVersion, job: { diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx index 8bbe8947e135a..626fb1221a24f 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx @@ -1,7 +1,6 @@ import Button from "@mui/material/Button"; import IconButton from "@mui/material/IconButton"; import Link from "@mui/material/Link"; -import { makeStyles } from "@mui/styles"; import Tooltip from "@mui/material/Tooltip"; import CreateIcon from "@mui/icons-material/AddOutlined"; import BuildIcon from "@mui/icons-material/BuildOutlined"; @@ -21,7 +20,7 @@ import { AvatarData } from "components/AvatarData/AvatarData"; import { TemplateResourcesTable } from "components/TemplateResourcesTable/TemplateResourcesTable"; import { WorkspaceBuildLogs } from "components/WorkspaceBuildLogs/WorkspaceBuildLogs"; import { PublishVersionData } from "pages/TemplateVersionEditorPage/types"; -import { FC, useCallback, useEffect, useRef, useState } from "react"; +import { type FC, useCallback, useEffect, useRef, useState } from "react"; import { createFile, existsFile, @@ -46,17 +45,17 @@ import { getStatus, TemplateVersionStatusBadge, } from "./TemplateVersionStatusBadge"; -import { Theme } from "@mui/material/styles"; import AlertTitle from "@mui/material/AlertTitle"; import { DashboardFullPage } from "components/Dashboard/DashboardLayout"; +import { type Interpolation, type Theme, useTheme } from "@emotion/react"; export interface TemplateVersionEditorProps { template: Template; templateVersion: TemplateVersion; + isBuildingNewVersion: boolean; defaultFileTree: FileTree; buildLogs?: ProvisionerJobLog[]; resources?: WorkspaceResource[]; - deploymentBannerVisible?: boolean; disablePreview: boolean; disableUpdate: boolean; onPreview: (files: FileTree) => void; @@ -92,8 +91,8 @@ export const TemplateVersionEditor: FC = ({ disablePreview, disableUpdate, template, - deploymentBannerVisible, templateVersion, + isBuildingNewVersion, defaultFileTree, onPreview, onPublish, @@ -111,6 +110,7 @@ export const TemplateVersionEditor: FC = ({ onSubmitMissingVariableValues, onCancelSubmitMissingVariableValues, }) => { + const theme = useTheme(); // If resources are provided, show them by default! // This is for Storybook! const [selectedTab, setSelectedTab] = useState(() => (resources ? 1 : 0)); @@ -173,22 +173,20 @@ export const TemplateVersionEditor: FC = ({ const templateVersionSucceeded = templateVersion.job.status === "succeeded"; const showBuildLogs = Boolean(buildLogs); const editorValue = getFileContent(activePath ?? "", fileTree) as string; - const firstTemplateVersionOnEditor = useRef(templateVersion); useEffect(() => { window.dispatchEvent(new Event("resize")); }, [showBuildLogs]); - const styles = useStyles({ - templateVersionSucceeded, - showBuildLogs, - deploymentBannerVisible, - }); return ( <> - -
-
+ +
+
= ({ )} -
- {/* Only start to show the build when a new template version is building */} - {templateVersion.id !== firstTemplateVersionOnEditor.current.id && ( -
- -
+
+ {isBuildingNewVersion && ( + )}
-
-
-
+
+
+
Template files -
+
= ({ />
-
-
+
+
{activePath ? ( = ({ )}
-
-
+
+
{templateVersion.job.error && (
@@ -419,9 +426,13 @@ export const TemplateVersionEditor: FC = ({
{resources && ( = ({ )}
- - {templateVersionSucceeded && ( - <> -
- - )}
@@ -462,18 +467,8 @@ export const TemplateVersionEditor: FC = ({ ); }; -const useStyles = makeStyles< - Theme, - { - templateVersionSucceeded: boolean; - showBuildLogs: boolean; - deploymentBannerVisible?: boolean; - } ->((theme) => ({ - root: { - background: theme.palette.background.default, - }, - topbar: { +const styles = { + topbar: (theme) => ({ padding: theme.spacing(2), borderBottom: `1px solid ${theme.palette.divider}`, display: "flex", @@ -481,29 +476,24 @@ const useStyles = makeStyles< justifyContent: "space-between", height: topbarHeight, background: theme.palette.background.paper, - }, - topbarSides: { + }), + topbarSides: (theme) => ({ display: "flex", alignItems: "center", gap: theme.spacing(2), - }, - buildStatus: { - display: "flex", - alignItems: "center", - gap: 8, - }, + }), sidebarAndEditor: { display: "flex", flex: 1, flexBasis: 0, overflow: "hidden", }, - sidebar: { + sidebar: (theme) => ({ minWidth: 256, backgroundColor: theme.palette.background.paper, borderRight: `1px solid ${theme.palette.divider}`, - }, - sidebarTitle: { + }), + sidebarTitle: (theme) => ({ fontSize: 10, textTransform: "uppercase", padding: theme.spacing(1, 2), @@ -512,45 +502,33 @@ const useStyles = makeStyles< letterSpacing: "0.5px", display: "flex", alignItems: "center", - }, - sidebarActions: { + }), + sidebarActions: (theme) => ({ marginLeft: "auto", "& svg": { fill: theme.palette.text.primary, }, - }, - editorPane: { - display: "grid", - width: "100%", - gridTemplateColumns: (props) => - props.showBuildLogs ? "1fr 1fr" : "1fr 0fr", - minHeight: "100%", - overflow: "hidden", - }, + }), editor: { flex: 1, }, - panelWrapper: { + panelWrapper: (theme) => ({ flex: 1, borderLeft: `1px solid ${theme.palette.divider}`, overflow: "hidden", display: "flex", flexDirection: "column", - }, + }), panel: { overflowY: "auto", height: "100%", - "&.hidden": { - display: "none", - }, - // Hack to access customize resource-card from here "& .resource-card": { border: 0, }, }, - tabs: { + tabs: (theme) => ({ borderBottom: `1px solid ${theme.palette.divider}`, display: "flex", boxShadow: "#000000 0 6px 6px -6px inset", @@ -561,8 +539,8 @@ const useStyles = makeStyles< textTransform: "none", letterSpacing: "unset", }, - }, - tab: { + }), + tab: (theme) => ({ cursor: "pointer", padding: theme.spacing(1.5), fontSize: 10, @@ -601,8 +579,8 @@ const useStyles = makeStyles< "&:hover": { color: theme.palette.text.primary, }, - }, - tabBar: { + }), + tabBar: (theme) => ({ padding: "8px 16px", position: "sticky", top: 0, @@ -615,12 +593,5 @@ const useStyles = makeStyles< "&.top": { borderTop: `1px solid ${theme.palette.divider}`, }, - }, - buildLogs: { - display: "flex", - flexDirection: "column", - }, - resources: { - paddingBottom: theme.spacing(2), - }, -})); + }), +} satisfies Record>; diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx index 6065f61bdb833..402c9e25eea87 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx @@ -45,8 +45,8 @@ export const TemplateVersionEditorPage: FC = () => { {isSuccess && ( { sendEvent({ diff --git a/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts b/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts index 823bb374e8f37..ad65d2cc873ff 100644 --- a/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts +++ b/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts @@ -78,6 +78,7 @@ export const templateVersionEditorMachine = createMachine( }, tsTypes: {} as import("./templateVersionEditorXService.typegen").Typegen0, initial: "initializing", + states: { initializing: { on: { From e06c71bc98bf0134bdc9ccff73159674ca7d611f Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 3 Oct 2023 21:34:55 +0000 Subject: [PATCH 08/15] emotion: `HelpTooltip` --- .../components/HelpTooltip/HelpTooltip.tsx | 156 ++++++++---------- 1 file changed, 68 insertions(+), 88 deletions(-) diff --git a/site/src/components/HelpTooltip/HelpTooltip.tsx b/site/src/components/HelpTooltip/HelpTooltip.tsx index 184ca9bc93b55..8050c433798e4 100644 --- a/site/src/components/HelpTooltip/HelpTooltip.tsx +++ b/site/src/components/HelpTooltip/HelpTooltip.tsx @@ -1,6 +1,5 @@ import Link from "@mui/material/Link"; import Popover, { PopoverProps } from "@mui/material/Popover"; -import { makeStyles } from "@mui/styles"; import HelpIcon from "@mui/icons-material/HelpOutline"; import OpenInNewIcon from "@mui/icons-material/OpenInNew"; import { @@ -11,9 +10,10 @@ import { FC, PropsWithChildren, } from "react"; -import { combineClasses } from "utils/combineClasses"; import { Stack } from "components/Stack/Stack"; import Box, { BoxProps } from "@mui/material/Box"; +import { type CSSObject, css as className } from "@emotion/css"; +import { css, type Interpolation, type Theme, useTheme } from "@emotion/react"; type Icon = typeof HelpIcon; @@ -46,12 +46,24 @@ const useHelpTooltip = () => { export const HelpPopover: FC< PopoverProps & { onOpen: () => void; onClose: () => void } > = ({ onOpen, onClose, children, ...props }) => { - const styles = useStyles({ size: "small" }); + const theme = useTheme(); return ( > = ({ iconClassName, buttonClassName, }) => { - const styles = useStyles({ size }); + const theme = useTheme(); const anchorRef = useRef(null); const [isOpen, setIsOpen] = useState(Boolean(open)); const id = isOpen ? "help-popover" : undefined; @@ -94,7 +106,24 @@ export const HelpTooltip: FC> = ({ > = ({ export const HelpTooltipTitle: FC> = ({ children, }) => { - const styles = useStyles({}); - - return

{children}

; + return

{children}

; }; export const HelpTooltipText = (props: BoxProps) => { - const styles = useStyles({}); - - return ( - - ); + return ; }; export const HelpTooltipLink: FC> = ({ children, href, }) => { - const styles = useStyles({}); - return ( - - + + {children} ); @@ -165,20 +188,19 @@ export const HelpTooltipAction: FC< ariaLabel?: string; }> > = ({ children, icon: Icon, onClick, ariaLabel }) => { - const styles = useStyles({}); const tooltip = useHelpTooltip(); return ( ); @@ -187,10 +209,8 @@ export const HelpTooltipAction: FC< export const HelpTooltipLinksGroup: FC> = ({ children, }) => { - const styles = useStyles({}); - return ( - + {children} ); @@ -216,80 +236,40 @@ const getIconSpacingFromSize = (size?: Size): number => { } }; -const useStyles = makeStyles((theme) => ({ - button: { - display: "flex", - alignItems: "center", - justifyContent: "center", - width: ({ size }: { size?: Size }) => - theme.spacing(getButtonSpacingFromSize(size)), - height: ({ size }: { size?: Size }) => - theme.spacing(getButtonSpacingFromSize(size)), - padding: 0, - border: 0, - background: "transparent", - color: theme.palette.text.primary, - opacity: 0.5, - cursor: "pointer", - - "&:hover": { - opacity: 0.75, - }, - }, - - icon: { - width: ({ size }: { size?: Size }) => - theme.spacing(getIconSpacingFromSize(size)), - height: ({ size }: { size?: Size }) => - theme.spacing(getIconSpacingFromSize(size)), - }, - - popover: { - pointerEvents: "none", - }, - - popoverPaper: { - marginTop: theme.spacing(0.5), - width: theme.spacing(38), - padding: theme.spacing(2.5), - color: theme.palette.text.secondary, - pointerEvents: "auto", - ...theme.typography.body2, - }, - - title: { +const styles = { + title: (theme) => ({ marginTop: 0, marginBottom: theme.spacing(1), color: theme.palette.text.primary, fontSize: 14, lineHeight: "120%", fontWeight: 600, - }, + }), - text: { + text: (theme) => ({ marginTop: theme.spacing(0.5), marginBottom: theme.spacing(0.5), - ...theme.typography.body2, - }, + ...(theme.typography.body2 as CSSObject), + }), - link: { + link: (theme) => ({ display: "flex", alignItems: "center", - ...theme.typography.body2, - }, + ...(theme.typography.body2 as CSSObject), + }), - linkIcon: { + linkIcon: (theme) => ({ color: "inherit", width: 14, height: 14, marginRight: theme.spacing(1), - }, + }), - linksGroup: { + linksGroup: (theme) => ({ marginTop: theme.spacing(2), - }, + }), - action: { + action: (theme) => ({ display: "flex", alignItems: "center", background: "none", @@ -298,12 +278,12 @@ const useStyles = makeStyles((theme) => ({ padding: 0, cursor: "pointer", fontSize: 14, - }, + }), - actionIcon: { + actionIcon: (theme) => ({ color: "inherit", width: 14, height: 14, marginRight: theme.spacing(1), - }, -})); + }), +} satisfies Record>; From ad20b7738fdb7d262f56b8184765817554ee3fe6 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 3 Oct 2023 22:37:09 +0000 Subject: [PATCH 09/15] =?UTF-8?q?=F0=9F=A7=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/src/components/Resources/ResourceCard.tsx | 7 +++---- .../TemplateVersionEditor.tsx | 11 ++++------- .../TemplateVersionEditorPage.tsx | 2 -- .../templateVersionEditorXService.ts | 1 - 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/site/src/components/Resources/ResourceCard.tsx b/site/src/components/Resources/ResourceCard.tsx index 879a993311219..4767b46d29be5 100644 --- a/site/src/components/Resources/ResourceCard.tsx +++ b/site/src/components/Resources/ResourceCard.tsx @@ -82,9 +82,10 @@ export const ResourceCard: FC = ({ resource, agentRow }) => { metadataLength += 1; visibleMetadata.pop(); } + const gridWidth = metadataLength === 1 ? 1 : 4; return ( -
+
= ({ resource, agentRow }) => { css={(theme) => ({ flexGrow: 2, display: "grid", - gridTemplateColumns: `repeat(${ - metadataLength === 1 ? 1 : 4 - }, minmax(0, 1fr))`, + gridTemplateColumns: `repeat(${gridWidth}, minmax(0, 1fr))`, gap: theme.spacing(5), rowGap: theme.spacing(3), })} diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx index 626fb1221a24f..ce7f9734f2c27 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx @@ -170,7 +170,6 @@ export const TemplateVersionEditor: FC = ({ }, [templateVersion]); const hasIcon = template.icon && template.icon !== ""; - const templateVersionSucceeded = templateVersion.job.status === "succeeded"; const showBuildLogs = Boolean(buildLogs); const editorValue = getFileContent(activePath ?? "", fileTree) as string; @@ -358,9 +357,8 @@ export const TemplateVersionEditor: FC = ({