diff --git a/site/package.json b/site/package.json
index 06e1bc04f6d..1573aad5b70 100644
--- a/site/package.json
+++ b/site/package.json
@@ -56,7 +56,6 @@
"@lexical/utils": "0.48.0",
"@monaco-editor/react": "4.7.0",
"@mui/material": "5.18.0",
- "@mui/system": "5.18.0",
"@novnc/novnc": "^1.5.0",
"@pierre/diffs": "1.2.7",
"@pierre/trees": "1.0.0-beta.4",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index 05e9d781263..adaad85617e 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -89,9 +89,6 @@ importers:
'@mui/material':
specifier: 5.18.0
version: 5.18.0(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.2.8))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.2.8))(@types/react@19.2.17)(react@19.2.8))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
- '@mui/system':
- specifier: 5.18.0
- version: 5.18.0(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.2.8))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.17)(react@19.2.8))(@types/react@19.2.17)(react@19.2.8))(@types/react@19.2.17)(react@19.2.8)
'@novnc/novnc':
specifier: ^1.5.0
version: 1.5.0
diff --git a/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx b/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx
index b401f71ff95..2c7ede309f9 100644
--- a/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx
+++ b/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx
@@ -1,9 +1,9 @@
-import Link from "@mui/material/Link";
import type { FC, HTMLAttributes } from "react";
import { Link as RouterLink } from "react-router";
import type { TemplateExample } from "#/api/typesGenerated";
import { Button } from "#/components/Button/Button";
import { ExternalImage } from "#/components/ExternalImage/ExternalImage";
+import { Link } from "#/components/Link/Link";
import { Pill } from "#/components/Pill/Pill";
import { cn } from "#/utils/cn";
@@ -53,11 +53,13 @@ export const TemplateExampleCard: FC = ({
{example.description}{" "}
- Read more
+
+ Read more
+
diff --git a/site/src/pages/CreateTemplatePage/TemplateUpload.tsx b/site/src/pages/CreateTemplatePage/TemplateUpload.tsx
index e5a9e67f2df..1a0882c4c40 100644
--- a/site/src/pages/CreateTemplatePage/TemplateUpload.tsx
+++ b/site/src/pages/CreateTemplatePage/TemplateUpload.tsx
@@ -1,7 +1,7 @@
-import Link from "@mui/material/Link";
import type { FC } from "react";
import { Link as RouterLink } from "react-router";
import { FileUpload } from "#/components/FileUpload/FileUpload";
+import { Link } from "#/components/Link/Link";
export interface TemplateUploadProps {
isUploading: boolean;
@@ -20,14 +20,15 @@ export const TemplateUpload: FC = ({
<>
The template has to be a .tar or .zip file. You can also use our{" "}
{
e.stopPropagation();
}}
+ asChild
+ showExternalIcon={false}
+ className="p-0"
>
- starter templates
+ starter templates
{" "}
to get started with Coder.
>
diff --git a/site/src/pages/CreateTemplatePage/VariableInput.tsx b/site/src/pages/CreateTemplatePage/VariableInput.tsx
index 3d2e4c1070c..b5ed2ae05ca 100644
--- a/site/src/pages/CreateTemplatePage/VariableInput.tsx
+++ b/site/src/pages/CreateTemplatePage/VariableInput.tsx
@@ -1,9 +1,8 @@
-import FormControlLabel from "@mui/material/FormControlLabel";
-import Radio from "@mui/material/Radio";
-import RadioGroup from "@mui/material/RadioGroup";
-import TextField from "@mui/material/TextField";
import type { FC } from "react";
import type { TemplateVersionVariable } from "#/api/typesGenerated";
+import { Input } from "#/components/Input/Input";
+import { Label } from "#/components/Label/Label";
+import { RadioGroup, RadioGroupItem } from "#/components/RadioGroup/RadioGroup";
const isBoolean = (variable: TemplateVersionVariable) => {
return variable.type === "bool";
@@ -62,35 +61,36 @@ const VariableField: FC = ({
defaultValue,
}) => {
if (isBoolean(variable)) {
+ const trueId = `${variable.name}-true`;
+ const falseId = `${variable.name}-false`;
+
return (
{
- onChange(event.target.value);
- }}
+ disabled={disabled}
+ onValueChange={onChange}
>
- }
- label="True"
- />
- }
- label="False"
- />
+
+
+
+
+
+
+
+
);
}
return (
- = ({
? "number"
: variable.sensitive
? "password"
- : "string"
+ : "text"
}
/>
);
diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.tsx
index fdff2130f93..e6558478e0d 100644
--- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.tsx
+++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.tsx
@@ -1,4 +1,3 @@
-import FormHelperText from "@mui/material/FormHelperText";
import type { FC } from "react";
import { Button } from "#/components/Button/Button";
import {
@@ -54,9 +53,9 @@ export const TemplateScheduleAutostart: FC = ({
))}
-
+
-
+
);
};
diff --git a/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx b/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx
index ef0d5ec17c9..a00fd1750e7 100644
--- a/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx
+++ b/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx
@@ -1,6 +1,6 @@
-import TextField from "@mui/material/TextField";
import { type ChangeEvent, type FC, useState } from "react";
import { ConfirmDialog } from "#/components/Dialog/ConfirmDialog/ConfirmDialog";
+import { FormField } from "#/components/FormField/FormField";
import { type FileTree, isFolder, validatePath } from "#/utils/filetree";
interface CreateFileDialogProps {
@@ -63,22 +63,25 @@ export const CreateFileDialog: FC = ({
Specify the path to a file to be created. This path can contain
slashes too.
-
- {/**
- * 2025-09-03 - Without disablePortal, the tooltip will render under the dialog;
- * this prop may not need to be set when we switch away from MuiDialog
- */}
-
+ Active versions
Templates can enforce that the active version be used for
diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx
index 9107b6a9495..3004762e9c7 100644
--- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx
+++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx
@@ -1,5 +1,6 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { action } from "storybook/actions";
+import { expect, userEvent, within } from "storybook/test";
import {
MockFailedProvisionerJob,
MockRunningProvisionerJob,
@@ -156,12 +157,28 @@ export const WithError = {
},
};
-export const PublishDialog = {
+export const PublishDialog: Story = {
args: {
isAskingPublishParameters: true,
},
};
+export const PublishDialogActiveVersionHelp: Story = {
+ args: {
+ isAskingPublishParameters: true,
+ },
+ play: async ({ canvasElement }) => {
+ // The dialog and popover are portaled, so query against the document body.
+ const body = within(canvasElement.ownerDocument.body);
+ const trigger = await body.findByRole("button", { name: "More info" });
+ await userEvent.click(trigger);
+ await expect(await body.findByText("Active versions")).toBeInTheDocument();
+ await expect(
+ body.getByRole("link", { name: "Review the documentation" }),
+ ).toBeInTheDocument();
+ },
+};
+
export const Published = {
args: {
publishedVersion: MockTemplateVersion,
diff --git a/site/src/pages/TemplatesPage/EmptyTemplates.tsx b/site/src/pages/TemplatesPage/EmptyTemplates.tsx
index a3d1848e203..c8680ad404b 100644
--- a/site/src/pages/TemplatesPage/EmptyTemplates.tsx
+++ b/site/src/pages/TemplatesPage/EmptyTemplates.tsx
@@ -1,9 +1,9 @@
-import Link from "@mui/material/Link";
import type { FC } from "react";
import { Link as RouterLink } from "react-router";
import type { TemplateExample } from "#/api/typesGenerated";
import { Button } from "#/components/Button/Button";
import { CodeExample } from "#/components/CodeExample/CodeExample";
+import { Link } from "#/components/Link/Link";
import { TableEmpty } from "#/components/TableEmpty/TableEmpty";
import { TemplateExampleCard } from "#/modules/templates/TemplateExampleCard/TemplateExampleCard";
import { docs } from "#/utils/docs";
@@ -64,6 +64,8 @@ export const EmptyTemplates: FC = ({
href={docs("/admin/templates/creating-templates")}
target="_blank"
rel="noreferrer"
+ showExternalIcon={false}
+ className="p-0 text-xs"
>
create your own