finish nuking theme
This commit is contained in:
1 parent
dd463bb60b
commit
b6c699c141
10 files changed
+92
-105
No files matched your search
@@ -29,12 +29,11 @@ export const HeaderRange = ({
|
||||
<ButtonGroup
|
||||
orientation={isSmall ? "vertical" : "horizontal"}
|
||||
fullWidth={isSmall}
|
||||
variant="contained"
|
||||
color="secondary"
|
||||
>
|
||||
{all && (
|
||||
<Button
|
||||
variant={range === "all" ? "contained" : "outlined"}
|
||||
variant="contained"
|
||||
onClick={() => setRange("all")}
|
||||
loading={loading}
|
||||
>
|
||||
@@ -42,28 +41,28 @@ export const HeaderRange = ({
|
||||
</Button>
|
||||
)}
|
||||
<Button
|
||||
variant={range === "2h" ? "contained" : "outlined"}
|
||||
variant="contained"
|
||||
onClick={() => setRange("2h")}
|
||||
loading={loading}
|
||||
>
|
||||
Recent
|
||||
</Button>
|
||||
<Button
|
||||
variant={range === "24h" ? "contained" : "outlined"}
|
||||
variant="contained"
|
||||
onClick={() => setRange("24h")}
|
||||
loading={loading}
|
||||
>
|
||||
Day
|
||||
</Button>
|
||||
<Button
|
||||
variant={range === "7d" ? "contained" : "outlined"}
|
||||
variant="contained"
|
||||
onClick={() => setRange("7d")}
|
||||
loading={loading}
|
||||
>
|
||||
7 days
|
||||
</Button>
|
||||
<Button
|
||||
variant={range === "30d" ? "contained" : "outlined"}
|
||||
variant="contained"
|
||||
onClick={() => setRange("30d")}
|
||||
loading={loading}
|
||||
>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import Box from "@mui/material/Box";
|
||||
// Using strip + square; icons removed
|
||||
import { useTheme } from "@mui/material/styles";
|
||||
import type { ICheck } from "@/types/check";
|
||||
import { getResponseColor } from "@/utils/DataUtils";
|
||||
@@ -20,7 +19,6 @@ export const HeatmapResponseTime = ({
|
||||
responseCellSx,
|
||||
}: HeatmapResponseTimeProps) => {
|
||||
const theme = useTheme();
|
||||
|
||||
if (!gap) {
|
||||
gap = theme.spacing(0.5);
|
||||
}
|
||||
@@ -66,7 +64,11 @@ export const HeatmapResponseTime = ({
|
||||
end: theme.palette.error.main,
|
||||
});
|
||||
const statusBorder =
|
||||
check.status === "placeholder" ? theme.palette.divider : check.status === "up" ? theme.palette.success.main : theme.palette.error.main;
|
||||
check.status === "placeholder"
|
||||
? theme.palette.divider
|
||||
: check.status === "up"
|
||||
? theme.palette.success.main
|
||||
: theme.palette.error.main;
|
||||
|
||||
return (
|
||||
<HeatmapResponseTimeTooltip key={`${check}-${index}`} check={check}>
|
||||
@@ -83,9 +85,31 @@ export const HeatmapResponseTime = ({
|
||||
gap: theme.spacing(2),
|
||||
}}
|
||||
>
|
||||
<Box sx={{ position: "relative", width: "100%", aspectRatio: "10" }}>
|
||||
<Box sx={{ position: "absolute", inset: 0, bgcolor: statusBg, borderRadius: theme.spacing(0.5), ...availabilityCellSx }} />
|
||||
<Box sx={{ position: "absolute", inset: 0, pointerEvents: "none", borderRadius: theme.spacing(0.5), boxShadow: `inset 0 0 0 2px ${statusBorder}` }} />
|
||||
<Box
|
||||
sx={{
|
||||
position: "relative",
|
||||
width: "100%",
|
||||
aspectRatio: "10",
|
||||
}}
|
||||
>
|
||||
<Box
|
||||
sx={{
|
||||
position: "absolute",
|
||||
inset: 0,
|
||||
bgcolor: statusBg,
|
||||
borderRadius: theme.spacing(0.5),
|
||||
...availabilityCellSx,
|
||||
}}
|
||||
/>
|
||||
<Box
|
||||
sx={{
|
||||
position: "absolute",
|
||||
inset: 0,
|
||||
pointerEvents: "none",
|
||||
borderRadius: theme.spacing(0.5),
|
||||
boxShadow: `inset 0 0 0 2px ${statusBorder}`,
|
||||
}}
|
||||
/>
|
||||
</Box>
|
||||
<Box
|
||||
sx={{
|
||||
|
||||
@@ -4,6 +4,16 @@ import { useTheme } from "@mui/material/styles";
|
||||
|
||||
export const ButtonInput = ({ sx, ...props }: ButtonProps) => {
|
||||
const theme = useTheme();
|
||||
const outlinedSx =
|
||||
props.variant === "outlined"
|
||||
? {
|
||||
color: theme.palette.text.primary,
|
||||
borderColor: theme.palette.divider,
|
||||
"&:hover": {
|
||||
borderColor: theme.palette.text.secondary,
|
||||
},
|
||||
}
|
||||
: {};
|
||||
return (
|
||||
<Button
|
||||
{...props}
|
||||
@@ -19,6 +29,7 @@ export const ButtonInput = ({ sx, ...props }: ButtonProps) => {
|
||||
"&:hover": {
|
||||
boxShadow: "none",
|
||||
},
|
||||
...outlinedSx,
|
||||
...sx,
|
||||
}}
|
||||
/>
|
||||
|
||||
@@ -65,9 +65,6 @@ export const ButtonGroupInput: React.FC<ButtonGroupProps> = ({
|
||||
sx={{
|
||||
boxShadow: "none",
|
||||
width: "100%",
|
||||
"& .MuiButtonGroup-grouped": {
|
||||
borderColor: theme.palette.divider,
|
||||
},
|
||||
...sx,
|
||||
}}
|
||||
>
|
||||
|
||||
@@ -102,7 +102,6 @@ export const NavItem = ({
|
||||
>
|
||||
<Typography
|
||||
variant="body1"
|
||||
color={theme.palette.primary.contrastText}
|
||||
sx={{
|
||||
fontWeight: fontWeight,
|
||||
opacity: 0.9,
|
||||
|
||||
@@ -29,7 +29,7 @@ const UptimeDetailsPage = () => {
|
||||
// Local state
|
||||
const [range, setRange] = useState("2h");
|
||||
|
||||
const { response, isValidating, error, refetch } = useGet<
|
||||
const { response, loading, error, refetch } = useGet<
|
||||
ApiResponse<IMonitorWithMonitorStats>
|
||||
>(
|
||||
`/monitors/${id}?embedChecks=true&range=${range}`,
|
||||
@@ -40,7 +40,7 @@ const UptimeDetailsPage = () => {
|
||||
|
||||
const {
|
||||
response: upResponse,
|
||||
isValidating: upIsValidating,
|
||||
loading: upIsLoading,
|
||||
error: upError,
|
||||
} = useGet<ApiResponse<IMonitorWithMonitorStats>>(
|
||||
`/monitors/${id}?embedChecks=true&range=${range}&status=up`,
|
||||
@@ -51,7 +51,7 @@ const UptimeDetailsPage = () => {
|
||||
const {
|
||||
response: downResponse,
|
||||
error: downError,
|
||||
isValidating: downIsValidating,
|
||||
loading: downIsLoading,
|
||||
} = useGet<ApiResponse<IMonitorWithMonitorStats>>(
|
||||
`/monitors/${id}?embedChecks=true&range=${range}&status=down`,
|
||||
{},
|
||||
@@ -144,7 +144,7 @@ const UptimeDetailsPage = () => {
|
||||
/>
|
||||
</Stack>
|
||||
<HeaderRange
|
||||
loading={isValidating || upIsValidating || downIsValidating}
|
||||
loading={loading || upIsLoading || downIsLoading}
|
||||
range={range}
|
||||
setRange={setRange}
|
||||
/>
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import { lighten, darken } from "@mui/material/styles";
|
||||
|
||||
const typographyBase = 13;
|
||||
|
||||
export const typographyLevels = {
|
||||
@@ -12,100 +10,25 @@ export const typographyLevels = {
|
||||
};
|
||||
|
||||
export const colors = {
|
||||
offWhite: "#FEFEFE",
|
||||
offBlack: "#131315",
|
||||
gray0: "#FDFDFD",
|
||||
gray10: "#F4F4FF",
|
||||
gray50: "#F9F9F9",
|
||||
gray100: "#F3F3F3",
|
||||
gray200: "#EFEFEF",
|
||||
gray250: "#DADADA",
|
||||
gray500: "#A2A3A3",
|
||||
gray700: "#313131",
|
||||
gray900: "#1c1c1c",
|
||||
blueGray50: "#E8F0FE",
|
||||
blueGray400: "#8b9dc3",
|
||||
blueGray450: "#7C8BA1",
|
||||
blueGray500: "#475467",
|
||||
blueGray600: "#344054",
|
||||
blueGray800: "#1C2130",
|
||||
blueGray900: "#515151",
|
||||
blueBlueWave: "#1570EF",
|
||||
lightBlueWave: "#CDE2FF",
|
||||
green100: "#67cd78",
|
||||
green200: "#4B9B77",
|
||||
green400: "#079455",
|
||||
green700: "#026513",
|
||||
orange100: "#FD8F22",
|
||||
orange200: "#D69A5D",
|
||||
orange600: "#9B734B",
|
||||
orange700: "#884605",
|
||||
red100: "#F27C7C",
|
||||
red400: "#D92020",
|
||||
red600: "#9B4B4B",
|
||||
red700: "#980303",
|
||||
};
|
||||
|
||||
export const lightPalette = {
|
||||
primary: {
|
||||
main: colors.blueBlueWave,
|
||||
light: lighten(colors.blueBlueWave, 0.4),
|
||||
dark: darken(colors.blueBlueWave, 0.2),
|
||||
},
|
||||
secondary: {
|
||||
main: colors.gray200,
|
||||
light: colors.lightBlueWave,
|
||||
dark: lighten(colors.gray200, 0.1),
|
||||
},
|
||||
// Tertiary is a custom helper palette
|
||||
success: {
|
||||
main: colors.green700,
|
||||
contrastText: colors.offWhite,
|
||||
light: lighten(colors.green700, 0.35),
|
||||
dark: darken(colors.green700, 0.2),
|
||||
},
|
||||
warning: {
|
||||
main: colors.orange700,
|
||||
contrastText: colors.offWhite,
|
||||
light: lighten(colors.orange700, 0.4),
|
||||
dark: darken(colors.orange700, 0.2),
|
||||
},
|
||||
error: {
|
||||
main: colors.red700,
|
||||
contrastText: colors.offWhite,
|
||||
light: lighten(colors.red700, 0.35),
|
||||
dark: darken(colors.red700, 0.2),
|
||||
},
|
||||
};
|
||||
|
||||
export const darkPalette = {
|
||||
primary: {
|
||||
main: colors.blueBlueWave,
|
||||
light: lighten(colors.blueBlueWave, 0.4),
|
||||
dark: darken(colors.blueBlueWave, 0.2),
|
||||
},
|
||||
secondary: {
|
||||
main: colors.gray700,
|
||||
light: colors.lightBlueWave,
|
||||
dark: lighten(colors.gray700, 0.1),
|
||||
},
|
||||
// Tertiary is a custom helper palette
|
||||
success: {
|
||||
main: colors.green100,
|
||||
contrastText: colors.offBlack,
|
||||
light: lighten(colors.green100, 0.25),
|
||||
dark: darken(colors.green100, 0.15),
|
||||
},
|
||||
warning: {
|
||||
main: colors.orange200,
|
||||
contrastText: colors.offBlack,
|
||||
light: lighten(colors.orange200, 0.25),
|
||||
dark: darken(colors.orange200, 0.15),
|
||||
},
|
||||
error: {
|
||||
main: colors.red100,
|
||||
contrastText: colors.offBlack,
|
||||
light: lighten(colors.red100, 0.25),
|
||||
dark: darken(colors.red100, 0.15),
|
||||
},
|
||||
};
|
||||
@@ -104,6 +104,9 @@ export const theme = (mode: string, palette: any) =>
|
||||
},
|
||||
},
|
||||
},
|
||||
MuiButton: {
|
||||
styleOverrides: {},
|
||||
},
|
||||
},
|
||||
shape: {
|
||||
borderRadius: 2,
|
||||
|
||||
Vendored
+7
-2
@@ -1,9 +1,14 @@
|
||||
import "@mui/material/Button";
|
||||
|
||||
declare module "@mui/material/styles" {}
|
||||
declare module "@mui/material/styles" {
|
||||
interface Palette {}
|
||||
interface PaletteOptions {}
|
||||
}
|
||||
|
||||
declare module "@mui/material/Button" {
|
||||
interface ButtonPropsColorOverrides {}
|
||||
interface ButtonPropsColorOverrides {
|
||||
neutral: true;
|
||||
}
|
||||
}
|
||||
|
||||
declare module "@mui/material/CircularProgress" {
|
||||
|
||||
@@ -59,20 +59,46 @@ export const getResponseColor = (
|
||||
if (!safe.mid) safe.mid = "#ff9800"; // fallback orange
|
||||
if (!safe.end) safe.end = "#f44336"; // fallback red
|
||||
|
||||
const toHex = (c: number) => c.toString(16).padStart(2, "0");
|
||||
const clamp = (n: number) => Math.min(255, Math.max(0, Math.round(n)));
|
||||
const rgbToHex = (r: number, g: number, b: number) => `#${toHex(clamp(r))}${toHex(clamp(g))}${toHex(clamp(b))}`;
|
||||
|
||||
const normalizeToHex = (value: string) => {
|
||||
const v = value.trim();
|
||||
if (v.startsWith("#")) {
|
||||
const h = v.slice(1);
|
||||
const full =
|
||||
h.length === 3
|
||||
? h.split("").map((c) => c + c).join("")
|
||||
: h.substring(0, 6);
|
||||
return `#${full.toLowerCase()}`;
|
||||
}
|
||||
const m = v
|
||||
.replace(/\s+/g, "")
|
||||
.match(/^rgba?\((\d{1,3}),(\d{1,3}),(\d{1,3})(?:,(0|0?\.\d+|1))?\)$/i);
|
||||
if (m) {
|
||||
const r = parseInt(m[1], 10);
|
||||
const g = parseInt(m[2], 10);
|
||||
const b = parseInt(m[3], 10);
|
||||
return rgbToHex(r, g, b);
|
||||
}
|
||||
// Fallback neutral
|
||||
return "#7f7f7f";
|
||||
};
|
||||
|
||||
const parseHex = (hex: string) => {
|
||||
const h = hex.replace("#", "");
|
||||
const full = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
|
||||
const n = parseInt(full, 16);
|
||||
return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 };
|
||||
};
|
||||
const toHex = (c: number) => c.toString(16).padStart(2, "0");
|
||||
const mix = (a: number, b: number, t: number) => Math.round(a + (b - a) * t);
|
||||
|
||||
const v = Math.max(0, ms);
|
||||
if (v <= 300) {
|
||||
const t = v / 300; // 0..1 from start->mid
|
||||
const s = parseHex(safe.start);
|
||||
const m = parseHex(safe.mid);
|
||||
const s = parseHex(normalizeToHex(safe.start));
|
||||
const m = parseHex(normalizeToHex(safe.mid));
|
||||
const r = mix(s.r, m.r, t);
|
||||
const g = mix(s.g, m.g, t);
|
||||
const b = mix(s.b, m.b, t);
|
||||
@@ -80,12 +106,12 @@ export const getResponseColor = (
|
||||
}
|
||||
if (v <= 600) {
|
||||
const t = (v - 300) / 300; // 0..1 from mid->end
|
||||
const m = parseHex(safe.mid);
|
||||
const e = parseHex(safe.end);
|
||||
const m = parseHex(normalizeToHex(safe.mid));
|
||||
const e = parseHex(normalizeToHex(safe.end));
|
||||
const r = mix(m.r, e.r, t);
|
||||
const g = mix(m.g, e.g, t);
|
||||
const b = mix(m.b, e.b, t);
|
||||
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
||||
}
|
||||
return safe.end;
|
||||
return normalizeToHex(safe.end);
|
||||
};
|
||||
Reference in new issue
Block a user