diff --git a/docs/data/base/components/badge/BadgeVisibility.js b/docs/data/base/components/badge/BadgeVisibility.js
index d65fa409ed..8eddfdf2b3 100644
--- a/docs/data/base/components/badge/BadgeVisibility.js
+++ b/docs/data/base/components/badge/BadgeVisibility.js
@@ -1,15 +1,178 @@
import * as React from 'react';
-import { Badge } from '@mui/base/Badge';
+import { Badge as BaseBadge, badgeClasses } from '@mui/base/Badge';
// Auxiliary demo components
-import { Stack } from '@mui/system';
-import { Button } from '@mui/base/Button';
-import { Switch } from '@mui/base/Switch';
+import { styled, Stack } from '@mui/system';
+import { Button, buttonClasses } from '@mui/base/Button';
+import { Switch as BaseSwitch } from '@mui/base/Switch';
import Divider from '@mui/material/Divider';
// Icons
import AddIcon from '@mui/icons-material/Add';
import RemoveIcon from '@mui/icons-material/Remove';
import MailIcon from '@mui/icons-material/Mail';
+const blue = {
+ 200: '#99CCF3',
+ 500: '#007FFF',
+ 700: '#0059B2',
+};
+
+const grey = {
+ 50: '#F3F6F9',
+ 100: '#E5EAF2',
+ 200: '#DAE2ED',
+ 300: '#C7D0DD',
+ 400: '#B0B8C4',
+ 500: '#9DA8B7',
+ 600: '#6B7A90',
+ 700: '#434D5B',
+ 800: '#303740',
+ 900: '#1C2025',
+};
+
+const Badge = styled(BaseBadge)(
+ ({ theme }) => `
+ box-sizing: border-box;
+ position: relative;
+ display: flex;
+ align-self: center;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ font-family: 'IBM Plex Sans', sans-serif;
+ font-size: 14px;
+ line-height: 1;
+
+ & .${badgeClasses.badge} {
+ z-index: auto;
+ position: absolute;
+ top: 0;
+ right: 0;
+ min-width: 22px;
+ height: 22px;
+ padding: 0 6px;
+ color: #fff;
+ font-weight: 600;
+ font-size: 12px;
+ line-height: 22px;
+ white-space: nowrap;
+ text-align: center;
+ border-radius: 12px;
+ background: ${blue[500]};
+ box-shadow: 0px 4px 6x ${theme.palette.mode === 'dark' ? grey[900] : grey[300]};
+ transform: translate(50%, -50%);
+ transform-origin: 100% 0;
+ }
+
+ & .${badgeClasses.invisible} {
+ opacity: 0;
+ pointer-events: none;
+ }
+ `,
+);
+
+const StyledButton = styled(Button)(
+ ({ theme }) => `
+ cursor: pointer;
+ padding: 4px 8px;
+ display: flex;
+ align-items: center;
+ border-radius: 8px;
+ transition: all 150ms ease;
+ background-color: transparent;
+ border: 1px solid ${theme.palette.mode === 'dark' ? grey[800] : grey[200]};
+
+ &:hover {
+ background: ${theme.palette.mode === 'dark' ? grey[800] : grey[50]};
+ }
+
+ &.${buttonClasses.active} {
+ background: ${theme.palette.mode === 'dark' ? grey[900] : grey[100]};
+ }
+
+ &.${buttonClasses.focusVisible} {
+ box-shadow: 0 3px 20px 0 rgba(61, 71, 82, 0.1), 0 0 0 4px rgba(0, 127, 255, 0.5);
+ outline: none;
+ }
+ `,
+);
+
+const Switch = styled(BaseSwitch)(
+ ({ theme }) => `
+ width: 32px;
+ height: 20px;
+ padding: 0;
+ box-sizing: border-box;
+ background: ${theme.palette.mode === 'dark' ? grey[600] : grey[400]};
+ border-radius: 16px;
+ border: none;
+ display: inline-flex;
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 120ms;
+ box-shadow: inset 0px 1px 1px ${
+ theme.palette.mode === 'dark' ? 'rgba(0, 0, 0, 0.5)' : 'rgba(0, 0, 0, 0.05)'
+ };
+
+ &[data-disabled] {
+ opacity: 0.4;
+ cursor: not-allowed;
+ }
+
+ &:hover:not([data-disabled]) {
+ background: ${theme.palette.mode === 'dark' ? grey[800] : grey[100]};
+ border-color: ${theme.palette.mode === 'dark' ? grey[600] : grey[300]};
+ }
+
+ &:focus-visible {
+ box-shadow: 0 0 0 3px ${theme.palette.mode === 'dark' ? blue[700] : blue[200]};
+ }
+
+ &[data-state="checked"] {
+ border: none;
+ background: ${blue[500]};
+ }
+
+ &[data-state="checked"]:not([data-disabled]):hover {
+ background: ${blue[700]};
+ }
+ `,
+);
+
+const Thumb = styled(BaseSwitch.Thumb)(
+ ({ theme }) => `
+ box-sizing: border-box;
+ border: 1px solid ${theme.palette.mode === 'dark' ? grey[800] : grey[200]};
+ display: block;
+ width: 14px;
+ height: 14px;
+ left: 3px;
+ top: 3px;
+ border-radius: 16px;
+ background-color: #FFF;
+ position: relative;
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 120ms;
+ box-shadow: 0px 1px 2px ${
+ theme.palette.mode === 'dark' ? 'rgba(0, 0, 0, 0.25)' : 'rgba(0, 0, 0, 0.1)'
+ };
+
+ &[data-state="checked"] {
+ left: 15px;
+ background-color: #fff;
+ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3);
+ }
+`,
+);
+
+const StyledLabel = styled('label')(
+ ({ theme }) => `
+ font-family: 'IBM Plex Sans', sans-serif;
+ font-size: 0.875rem;
+ color: ${theme.palette.mode === 'dark' ? grey[300] : grey[900]};
+ `,
+);
+
export default function BadgeVisibility() {
const [count, setCount] = React.useState(1);
const [invisible, setInvisible] = React.useState(false);
@@ -31,30 +194,28 @@ export default function BadgeVisibility() {
gap={1}
useFlexGap
>
-
-
+
-
+ Show badge
+
+
+
diff --git a/docs/data/base/components/badge/BadgeVisibility.tsx b/docs/data/base/components/badge/BadgeVisibility.tsx
index d65fa409ed..8eddfdf2b3 100644
--- a/docs/data/base/components/badge/BadgeVisibility.tsx
+++ b/docs/data/base/components/badge/BadgeVisibility.tsx
@@ -1,15 +1,178 @@
import * as React from 'react';
-import { Badge } from '@mui/base/Badge';
+import { Badge as BaseBadge, badgeClasses } from '@mui/base/Badge';
// Auxiliary demo components
-import { Stack } from '@mui/system';
-import { Button } from '@mui/base/Button';
-import { Switch } from '@mui/base/Switch';
+import { styled, Stack } from '@mui/system';
+import { Button, buttonClasses } from '@mui/base/Button';
+import { Switch as BaseSwitch } from '@mui/base/Switch';
import Divider from '@mui/material/Divider';
// Icons
import AddIcon from '@mui/icons-material/Add';
import RemoveIcon from '@mui/icons-material/Remove';
import MailIcon from '@mui/icons-material/Mail';
+const blue = {
+ 200: '#99CCF3',
+ 500: '#007FFF',
+ 700: '#0059B2',
+};
+
+const grey = {
+ 50: '#F3F6F9',
+ 100: '#E5EAF2',
+ 200: '#DAE2ED',
+ 300: '#C7D0DD',
+ 400: '#B0B8C4',
+ 500: '#9DA8B7',
+ 600: '#6B7A90',
+ 700: '#434D5B',
+ 800: '#303740',
+ 900: '#1C2025',
+};
+
+const Badge = styled(BaseBadge)(
+ ({ theme }) => `
+ box-sizing: border-box;
+ position: relative;
+ display: flex;
+ align-self: center;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ font-family: 'IBM Plex Sans', sans-serif;
+ font-size: 14px;
+ line-height: 1;
+
+ & .${badgeClasses.badge} {
+ z-index: auto;
+ position: absolute;
+ top: 0;
+ right: 0;
+ min-width: 22px;
+ height: 22px;
+ padding: 0 6px;
+ color: #fff;
+ font-weight: 600;
+ font-size: 12px;
+ line-height: 22px;
+ white-space: nowrap;
+ text-align: center;
+ border-radius: 12px;
+ background: ${blue[500]};
+ box-shadow: 0px 4px 6x ${theme.palette.mode === 'dark' ? grey[900] : grey[300]};
+ transform: translate(50%, -50%);
+ transform-origin: 100% 0;
+ }
+
+ & .${badgeClasses.invisible} {
+ opacity: 0;
+ pointer-events: none;
+ }
+ `,
+);
+
+const StyledButton = styled(Button)(
+ ({ theme }) => `
+ cursor: pointer;
+ padding: 4px 8px;
+ display: flex;
+ align-items: center;
+ border-radius: 8px;
+ transition: all 150ms ease;
+ background-color: transparent;
+ border: 1px solid ${theme.palette.mode === 'dark' ? grey[800] : grey[200]};
+
+ &:hover {
+ background: ${theme.palette.mode === 'dark' ? grey[800] : grey[50]};
+ }
+
+ &.${buttonClasses.active} {
+ background: ${theme.palette.mode === 'dark' ? grey[900] : grey[100]};
+ }
+
+ &.${buttonClasses.focusVisible} {
+ box-shadow: 0 3px 20px 0 rgba(61, 71, 82, 0.1), 0 0 0 4px rgba(0, 127, 255, 0.5);
+ outline: none;
+ }
+ `,
+);
+
+const Switch = styled(BaseSwitch)(
+ ({ theme }) => `
+ width: 32px;
+ height: 20px;
+ padding: 0;
+ box-sizing: border-box;
+ background: ${theme.palette.mode === 'dark' ? grey[600] : grey[400]};
+ border-radius: 16px;
+ border: none;
+ display: inline-flex;
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 120ms;
+ box-shadow: inset 0px 1px 1px ${
+ theme.palette.mode === 'dark' ? 'rgba(0, 0, 0, 0.5)' : 'rgba(0, 0, 0, 0.05)'
+ };
+
+ &[data-disabled] {
+ opacity: 0.4;
+ cursor: not-allowed;
+ }
+
+ &:hover:not([data-disabled]) {
+ background: ${theme.palette.mode === 'dark' ? grey[800] : grey[100]};
+ border-color: ${theme.palette.mode === 'dark' ? grey[600] : grey[300]};
+ }
+
+ &:focus-visible {
+ box-shadow: 0 0 0 3px ${theme.palette.mode === 'dark' ? blue[700] : blue[200]};
+ }
+
+ &[data-state="checked"] {
+ border: none;
+ background: ${blue[500]};
+ }
+
+ &[data-state="checked"]:not([data-disabled]):hover {
+ background: ${blue[700]};
+ }
+ `,
+);
+
+const Thumb = styled(BaseSwitch.Thumb)(
+ ({ theme }) => `
+ box-sizing: border-box;
+ border: 1px solid ${theme.palette.mode === 'dark' ? grey[800] : grey[200]};
+ display: block;
+ width: 14px;
+ height: 14px;
+ left: 3px;
+ top: 3px;
+ border-radius: 16px;
+ background-color: #FFF;
+ position: relative;
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 120ms;
+ box-shadow: 0px 1px 2px ${
+ theme.palette.mode === 'dark' ? 'rgba(0, 0, 0, 0.25)' : 'rgba(0, 0, 0, 0.1)'
+ };
+
+ &[data-state="checked"] {
+ left: 15px;
+ background-color: #fff;
+ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3);
+ }
+`,
+);
+
+const StyledLabel = styled('label')(
+ ({ theme }) => `
+ font-family: 'IBM Plex Sans', sans-serif;
+ font-size: 0.875rem;
+ color: ${theme.palette.mode === 'dark' ? grey[300] : grey[900]};
+ `,
+);
+
export default function BadgeVisibility() {
const [count, setCount] = React.useState(1);
const [invisible, setInvisible] = React.useState(false);
@@ -31,30 +194,28 @@ export default function BadgeVisibility() {
gap={1}
useFlexGap
>
-
-
+
-
+ Show badge
+
+
+