;
-const colors = [
- "secondary",
- "primary",
-] as const satisfies CircularProgressProps["color"][];
+import styles from "./CircularProgress.determinate.module.css";
export default () => {
- const exampleId = React.useId();
+ const labelId = React.useId();
+ const progress = 50;
- return colors.map((color) => {
- const labelId = `${exampleId}-${color}`;
- return (
-
-
-
- {color.charAt(0).toUpperCase()}
- {color.slice(1)}…
+ return (
+ <>
+
+
+
+ {progress}%
-
- );
- });
+
+ Uploading…
+ >
+ );
};
diff --git a/examples/mui/LinearProgress._colors.tsx b/examples/mui/LinearProgress._colors.tsx
deleted file mode 100644
index 9b40ee86c9b7..000000000000
--- a/examples/mui/LinearProgress._colors.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
- * See LICENSE.md in the project root for license terms and full copyright notice.
- *--------------------------------------------------------------------------------------------*/
-
-import * as React from "react";
-import LinearProgress from "@mui/material/LinearProgress";
-import Typography from "@mui/material/Typography";
-
-type LinearProgressProps = React.ComponentProps;
-const colors = [
- "secondary",
- "primary",
-] as const satisfies LinearProgressProps["color"][];
-
-export default () => {
- const exampleId = React.useId();
-
- return colors.map((color) => {
- const labelId = `${exampleId}-${color}`;
- return (
-
-
-
- {color.charAt(0).toUpperCase()}
- {color.slice(1)}…
-
-
- );
- });
-};
diff --git a/examples/mui/LinearProgress.buffer.tsx b/examples/mui/LinearProgress.buffer.tsx
new file mode 100644
index 000000000000..8965b9ab0796
--- /dev/null
+++ b/examples/mui/LinearProgress.buffer.tsx
@@ -0,0 +1,24 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
+ * See LICENSE.md in the project root for license terms and full copyright notice.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as React from "react";
+import LinearProgress from "@mui/material/LinearProgress";
+import Typography from "@mui/material/Typography";
+
+export default () => {
+ const labelId = React.useId();
+
+ return (
+ <>
+
+ Buffering results…
+ >
+ );
+};
diff --git a/examples/mui/LinearProgress.colors.tsx b/examples/mui/LinearProgress.colors.tsx
new file mode 100644
index 000000000000..906cc2c3c63c
--- /dev/null
+++ b/examples/mui/LinearProgress.colors.tsx
@@ -0,0 +1,19 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
+ * See LICENSE.md in the project root for license terms and full copyright notice.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as React from "react";
+import LinearProgress from "@mui/material/LinearProgress";
+import Typography from "@mui/material/Typography";
+
+export default () => {
+ const labelId = React.useId();
+
+ return (
+ <>
+
+ Analyzing results…
+ >
+ );
+};
diff --git a/examples/mui/LinearProgress.determinate.tsx b/examples/mui/LinearProgress.determinate.tsx
new file mode 100644
index 000000000000..5841959ae60b
--- /dev/null
+++ b/examples/mui/LinearProgress.determinate.tsx
@@ -0,0 +1,28 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
+ * See LICENSE.md in the project root for license terms and full copyright notice.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as React from "react";
+import LinearProgress from "@mui/material/LinearProgress";
+import Stack from "@mui/material/Stack";
+import Typography from "@mui/material/Typography";
+
+export default () => {
+ const labelId = React.useId();
+ const progress = 50;
+
+ return (
+ <>
+
+
+ Uploading…
+ {progress}%
+
+ >
+ );
+};
diff --git a/packages/mui/src/types.ts b/packages/mui/src/types.ts
index 4b04dd1d6498..abbbcc998ed2 100644
--- a/packages/mui/src/types.ts
+++ b/packages/mui/src/types.ts
@@ -255,6 +255,31 @@ declare module "@mui/material/Chip" {
}
}
+declare module "@mui/material/LinearProgress" {
+ interface LinearProgressPropsColorOverrides {
+ inherit: false;
+ info: false;
+ }
+}
+
+declare module "@mui/material/CircularProgress" {
+ interface CircularProgressOwnProps {
+ /**
+ * The default value with `@stratakit/mui` is `true`.
+ *
+ * @default true
+ */
+ enableTrackSlot?: boolean;
+
+ /**
+ * The default thickness with `@stratakit/mui` is `5`.
+ *
+ * @default 5
+ */
+ thickness?: number;
+ }
+}
+
declare module "@mui/material/Dialog" {
interface DialogProps extends Pick {
/** @deprecated Use `render` prop instead. */
diff --git a/packages/mui/src/~components.css b/packages/mui/src/~components.css
index 416adc5e1728..50548fd3934d 100644
--- a/packages/mui/src/~components.css
+++ b/packages/mui/src/~components.css
@@ -17,11 +17,13 @@
@import "./~components/MuiCard.css";
@import "./~components/MuiCheckbox.css";
@import "./~components/MuiChip.css";
+@import "./~components/MuiCircularProgress.css";
@import "./~components/MuiDialog.css";
@import "./~components/MuiDivider.css";
@import "./~components/MuiForm.css";
@import "./~components/MuiIconButton.css";
@import "./~components/MuiInput.css";
+@import "./~components/MuiLinearProgress.css";
@import "./~components/MuiLink.css";
@import "./~components/MuiList.css";
@import "./~components/MuiMenu.css";
diff --git a/packages/mui/src/~components/MuiCircularProgress.css b/packages/mui/src/~components/MuiCircularProgress.css
new file mode 100644
index 000000000000..c649acac9aa1
--- /dev/null
+++ b/packages/mui/src/~components/MuiCircularProgress.css
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
+ * See LICENSE.md in the project root for license terms and full copyright notice.
+ *--------------------------------------------------------------------------------------------*/
+
+.MuiCircularProgress-root {
+ --_MuiCircularProgress-track-thickness: 1px;
+ --_MuiCircularProgress-fill-thickness: 5px;
+
+ &:where(.MuiCircularProgress-colorPrimary) {
+ --_MuiCircularProgress-color: var(--stratakit-color-icon-accent-strong);
+ }
+
+ &:where(.MuiCircularProgress-colorSecondary) {
+ --_MuiCircularProgress-color: var(--stratakit-color-icon-neutral-base);
+ }
+
+ &:where(.MuiCircularProgress-colorError) {
+ --_MuiCircularProgress-color: var(--stratakit-color-icon-critical-base);
+ }
+
+ &:where(.MuiCircularProgress-colorWarning) {
+ --_MuiCircularProgress-color: var(--stratakit-color-icon-attention-base);
+ }
+
+ &:where(.MuiCircularProgress-colorInfo) {
+ --_MuiCircularProgress-color: var(--stratakit-color-icon-info-base);
+ }
+
+ &:where(.MuiCircularProgress-colorSuccess) {
+ --_MuiCircularProgress-color: var(--stratakit-color-icon-positive-base);
+ }
+}
+
+:is(.MuiCircularProgress-track, .MuiCircularProgress-circle) {
+ stroke: var(--_MuiCircularProgress-color);
+}
+
+.MuiCircularProgress-track {
+ opacity: 1;
+ stroke-width: var(--_MuiCircularProgress-track-thickness);
+}
+
+.MuiCircularProgress-circle {
+ stroke-linecap: round;
+ stroke-width: var(--_MuiCircularProgress-fill-thickness);
+}
diff --git a/packages/mui/src/~components/MuiLinearProgress.css b/packages/mui/src/~components/MuiLinearProgress.css
new file mode 100644
index 000000000000..2d35f5efee58
--- /dev/null
+++ b/packages/mui/src/~components/MuiLinearProgress.css
@@ -0,0 +1,83 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
+ * See LICENSE.md in the project root for license terms and full copyright notice.
+ *--------------------------------------------------------------------------------------------*/
+
+.MuiLinearProgress-root {
+ --_MuiLinearProgress-track-thickness: 1px;
+ --_MuiLinearProgress-fill-thickness: 5px;
+
+ background-color: transparent;
+ block-size: var(--_MuiLinearProgress-fill-thickness);
+ border-radius: calc(infinity * 1px);
+
+ &:where(.MuiLinearProgress-colorPrimary) {
+ --_MuiLinearProgress-color: var(--stratakit-color-icon-accent-strong);
+ }
+
+ &:where(.MuiLinearProgress-colorSecondary) {
+ --_MuiLinearProgress-color: var(--stratakit-color-icon-neutral-base);
+ }
+
+ &:where(.MuiLinearProgress-colorError) {
+ --_MuiLinearProgress-color: var(--stratakit-color-icon-critical-base);
+ }
+
+ &:where(.MuiLinearProgress-colorWarning) {
+ --_MuiLinearProgress-color: var(--stratakit-color-icon-attention-base);
+ }
+
+ &:where(.MuiLinearProgress-colorInfo) {
+ --_MuiLinearProgress-color: var(--stratakit-color-icon-info-base);
+ }
+
+ &:where(.MuiLinearProgress-colorSuccess) {
+ --_MuiLinearProgress-color: var(--stratakit-color-icon-positive-base);
+ }
+
+ &:where(.MuiLinearProgress-determinate, .MuiLinearProgress-indeterminate) {
+ &::before {
+ content: "";
+ position: absolute;
+ block-size: var(--_MuiLinearProgress-track-thickness);
+ inset-block-start: calc(
+ (var(--_MuiLinearProgress-fill-thickness) - var(--_MuiLinearProgress-track-thickness)) *
+ 0.5
+ );
+ inset-inline: 0;
+ background-color: var(--_MuiLinearProgress-color);
+ border-radius: inherit;
+ }
+ }
+
+ &:where(.MuiLinearProgress-buffer, .MuiLinearProgress-determinate) {
+ &::after {
+ content: "";
+ position: absolute;
+ inset-inline-end: 0;
+ inset-block: 0;
+ aspect-ratio: 1;
+ background-color: var(--_MuiLinearProgress-color);
+ border-radius: inherit;
+ }
+ }
+}
+
+.MuiLinearProgress-bar {
+ border-radius: inherit;
+ background-color: var(--_MuiLinearProgress-color);
+}
+
+.MuiLinearProgress-bar2 {
+ :where(.MuiLinearProgress-root.MuiLinearProgress-buffer) & {
+ block-size: var(--_MuiLinearProgress-track-thickness);
+ inset-block-start: calc(
+ (var(--_MuiLinearProgress-fill-thickness) - var(--_MuiLinearProgress-track-thickness)) *
+ 0.5
+ );
+ }
+}
+
+.MuiLinearProgress-dashed {
+ display: none; /* We're not using the animated dashed line */
+}
diff --git a/packages/mui/src/~createTheme.tsx b/packages/mui/src/~createTheme.tsx
index fb6313bc7662..3bba6816d316 100644
--- a/packages/mui/src/~createTheme.tsx
+++ b/packages/mui/src/~createTheme.tsx
@@ -325,6 +325,12 @@ function createTheme(args: CreateThemeArgs) {
},
},
},
+ MuiCircularProgress: {
+ defaultProps: {
+ enableTrackSlot: true,
+ thickness: 5,
+ },
+ },
MuiContainer: { defaultProps: { component: Role.div } },
MuiDialog: { defaultProps: { component: Role.div } },
MuiDialogContentText: {
diff --git a/packages/mui/src/~forced-colors.css b/packages/mui/src/~forced-colors.css
index 2c633b51a5f8..40b20f2fe9c4 100644
--- a/packages/mui/src/~forced-colors.css
+++ b/packages/mui/src/~forced-colors.css
@@ -114,6 +114,10 @@
}
}
+.MuiCircularProgress-root {
+ --_MuiCircularProgress-color: CanvasText;
+}
+
.MuiDialog-paper {
border: 1px solid;
}
@@ -158,11 +162,7 @@
}
.MuiLinearProgress-root {
- border: 1px solid;
-}
-
-.MuiLinearProgress-bar {
- background-color: CanvasText;
+ --_MuiLinearProgress-color: CanvasText;
}
.MuiListItemIcon-root {