mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-10 21:25:24 +03:00
fix colors for default light mode theme
This commit is contained in:
parent
c08a198354
commit
25b335aa18
@ -32,7 +32,7 @@ export default function Statusbar() {
|
|||||||
const { potentialProblems } = useStats(stats);
|
const { potentialProblems } = useStats(stats);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="absolute left-0 bottom-0 right-0 w-full h-8 flex justify-between items-center px-4 bg-primary z-10 dark:text-secondary-foreground border-t border-secondary-highlight">
|
<div className="absolute left-0 bottom-0 right-0 w-full h-8 flex justify-between items-center px-4 bg-background_alt z-10 dark:text-secondary-foreground border-t border-secondary-highlight">
|
||||||
<div className="h-full flex items-center gap-2">
|
<div className="h-full flex items-center gap-2">
|
||||||
{cpuPercent && (
|
{cpuPercent && (
|
||||||
<div className="flex items-center text-sm gap-2">
|
<div className="flex items-center text-sm gap-2">
|
||||||
|
|||||||
@ -131,7 +131,7 @@ export function CameraGroupSelector({ className }: CameraGroupSelectorProps) {
|
|||||||
size="xs"
|
size="xs"
|
||||||
onClick={() => setAddGroup(true)}
|
onClick={() => setAddGroup(true)}
|
||||||
>
|
>
|
||||||
<LuPlus className="size-4 text-primary-foreground" />
|
<LuPlus className="size-4 text-primary" />
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@ -253,7 +253,7 @@ function NewGroupDialog({ open, setOpen, currentGroups }: NewGroupDialogProps) {
|
|||||||
{currentGroups.length > 0 && <DropdownMenuSeparator />}
|
{currentGroups.length > 0 && <DropdownMenuSeparator />}
|
||||||
{editState == "none" && (
|
{editState == "none" && (
|
||||||
<Button
|
<Button
|
||||||
className="text-primary-foreground justify-start"
|
className="text-primary justify-start"
|
||||||
variant="ghost"
|
variant="ghost"
|
||||||
onClick={() => setEditState("add")}
|
onClick={() => setEditState("add")}
|
||||||
>
|
>
|
||||||
|
|||||||
@ -19,7 +19,7 @@ export default function FilterCheckBox({
|
|||||||
}: FilterCheckBoxProps) {
|
}: FilterCheckBoxProps) {
|
||||||
return (
|
return (
|
||||||
<Button
|
<Button
|
||||||
className="capitalize flex justify-between items-center cursor-pointer w-full text-primary-foreground"
|
className="capitalize flex justify-between items-center cursor-pointer w-full text-primary"
|
||||||
variant="ghost"
|
variant="ghost"
|
||||||
onClick={() => onCheckedChange(!isChecked)}
|
onClick={() => onCheckedChange(!isChecked)}
|
||||||
>
|
>
|
||||||
|
|||||||
@ -19,7 +19,7 @@ export function LogLevelFilterButton({
|
|||||||
const trigger = (
|
const trigger = (
|
||||||
<Button size="sm" className="flex items-center gap-2" variant="secondary">
|
<Button size="sm" className="flex items-center gap-2" variant="secondary">
|
||||||
<FaFilter className="text-secondary-foreground" />
|
<FaFilter className="text-secondary-foreground" />
|
||||||
<div className="hidden md:block text-primary-foreground">Filter</div>
|
<div className="hidden md:block text-primary">Filter</div>
|
||||||
</Button>
|
</Button>
|
||||||
);
|
);
|
||||||
const content = (
|
const content = (
|
||||||
@ -61,7 +61,7 @@ export function GeneralFilterContent({
|
|||||||
<div className="h-auto overflow-y-auto overflow-x-hidden">
|
<div className="h-auto overflow-y-auto overflow-x-hidden">
|
||||||
<div className="flex justify-between items-center my-2.5">
|
<div className="flex justify-between items-center my-2.5">
|
||||||
<Label
|
<Label
|
||||||
className="mx-2 text-primary-foreground cursor-pointer"
|
className="mx-2 text-primary cursor-pointer"
|
||||||
htmlFor="allLabels"
|
htmlFor="allLabels"
|
||||||
>
|
>
|
||||||
All Logs
|
All Logs
|
||||||
@ -82,7 +82,7 @@ export function GeneralFilterContent({
|
|||||||
{["debug", "info", "warning", "error"].map((item) => (
|
{["debug", "info", "warning", "error"].map((item) => (
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<Label
|
<Label
|
||||||
className="w-full mx-2 text-primary-foreground capitalize cursor-pointer"
|
className="w-full mx-2 text-primary capitalize cursor-pointer"
|
||||||
htmlFor={item}
|
htmlFor={item}
|
||||||
>
|
>
|
||||||
{item.replaceAll("_", " ")}
|
{item.replaceAll("_", " ")}
|
||||||
|
|||||||
@ -40,7 +40,7 @@ export default function ReviewActionGroup({
|
|||||||
<div className="p-1">{`${selectedReviews.length} selected`}</div>
|
<div className="p-1">{`${selectedReviews.length} selected`}</div>
|
||||||
<div className="p-1">{"|"}</div>
|
<div className="p-1">{"|"}</div>
|
||||||
<div
|
<div
|
||||||
className="p-2 text-primary-foreground cursor-pointer hover:bg-secondary hover:rounded-lg"
|
className="p-2 text-primary cursor-pointer hover:bg-secondary hover:rounded-lg"
|
||||||
onClick={onClearSelected}
|
onClick={onClearSelected}
|
||||||
>
|
>
|
||||||
Unselect
|
Unselect
|
||||||
@ -58,7 +58,7 @@ export default function ReviewActionGroup({
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<FaCompactDisc />
|
<FaCompactDisc />
|
||||||
{isDesktop && <div className="text-primary-foreground">Export</div>}
|
{isDesktop && <div className="text-primary">Export</div>}
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
<Button
|
<Button
|
||||||
@ -68,9 +68,7 @@ export default function ReviewActionGroup({
|
|||||||
onClick={onMarkAsReviewed}
|
onClick={onMarkAsReviewed}
|
||||||
>
|
>
|
||||||
<FaCircleCheck />
|
<FaCircleCheck />
|
||||||
{isDesktop && (
|
{isDesktop && <div className="text-primary">Mark as reviewed</div>}
|
||||||
<div className="text-primary-foreground">Mark as reviewed</div>
|
|
||||||
)}
|
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
className="p-2 flex items-center gap-1"
|
className="p-2 flex items-center gap-1"
|
||||||
@ -79,7 +77,7 @@ export default function ReviewActionGroup({
|
|||||||
onClick={onDelete}
|
onClick={onDelete}
|
||||||
>
|
>
|
||||||
<HiTrash />
|
<HiTrash />
|
||||||
{isDesktop && <div className="text-primary-foreground">Delete</div>}
|
{isDesktop && <div className="text-primary">Delete</div>}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -227,10 +227,10 @@ function CamerasFilterButton({
|
|||||||
size="sm"
|
size="sm"
|
||||||
>
|
>
|
||||||
<FaVideo
|
<FaVideo
|
||||||
className={`${selectedCameras?.length ? "text-primary dark:text-primary-foreground" : "text-secondary-foreground"}`}
|
className={`${selectedCameras?.length ? "text-primary dark:text-primary" : "text-secondary-foreground"}`}
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
className={`hidden md:block ${selectedCameras?.length ? "text-primary dark:text-primary-foreground" : "text-primary-foreground"}`}
|
className={`hidden md:block ${selectedCameras?.length ? "text-primary dark:text-primary" : "text-primary"}`}
|
||||||
>
|
>
|
||||||
{selectedCameras == undefined
|
{selectedCameras == undefined
|
||||||
? "All Cameras"
|
? "All Cameras"
|
||||||
@ -379,7 +379,7 @@ function ShowReviewFilter({
|
|||||||
);
|
);
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="hidden h-9 md:flex p-2 justify-start items-center text-sm bg-secondary hover:bg-secondary/80 text-primary-foreground rounded-md cursor-pointer">
|
<div className="hidden h-9 md:flex p-2 justify-start items-center text-sm bg-secondary hover:bg-secondary/80 rounded-md cursor-pointer">
|
||||||
<Switch
|
<Switch
|
||||||
id="reviewed"
|
id="reviewed"
|
||||||
checked={showReviewedSwitch == 1}
|
checked={showReviewedSwitch == 1}
|
||||||
@ -387,7 +387,7 @@ function ShowReviewFilter({
|
|||||||
setShowReviewedSwitch(showReviewedSwitch == 0 ? 1 : 0)
|
setShowReviewedSwitch(showReviewedSwitch == 0 ? 1 : 0)
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
<Label className="ml-2 cursor-pointer" htmlFor="reviewed">
|
<Label className="ml-2 cursor-pointer text-primary" htmlFor="reviewed">
|
||||||
Show Reviewed
|
Show Reviewed
|
||||||
</Label>
|
</Label>
|
||||||
</div>
|
</div>
|
||||||
@ -428,10 +428,10 @@ function CalendarFilterButton({
|
|||||||
variant="secondary"
|
variant="secondary"
|
||||||
>
|
>
|
||||||
<FaCalendarAlt
|
<FaCalendarAlt
|
||||||
className={`${day == undefined ? "text-secondary-foreground" : "text-primary dark:text-primary-foreground"}`}
|
className={`${day == undefined ? "text-secondary-foreground" : "text-primary dark:text-primary"}`}
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
className={`hidden md:block ${day == undefined ? "text-primary-foreground" : "text-primary dark:text-primary-foreground"}`}
|
className={`hidden md:block ${day == undefined ? "text-primary" : "text-primary dark:text-primary"}`}
|
||||||
>
|
>
|
||||||
{day == undefined ? "Last 24 Hours" : selectedDate}
|
{day == undefined ? "Last 24 Hours" : selectedDate}
|
||||||
</div>
|
</div>
|
||||||
@ -493,7 +493,7 @@ function GeneralFilterButton({
|
|||||||
const trigger = (
|
const trigger = (
|
||||||
<Button size="sm" className="flex items-center gap-2" variant="secondary">
|
<Button size="sm" className="flex items-center gap-2" variant="secondary">
|
||||||
<FaFilter className="text-secondary-foreground" />
|
<FaFilter className="text-secondary-foreground" />
|
||||||
<div className="hidden md:block text-primary-foreground">Filter</div>
|
<div className="hidden md:block text-primary">Filter</div>
|
||||||
</Button>
|
</Button>
|
||||||
);
|
);
|
||||||
const content = (
|
const content = (
|
||||||
@ -565,7 +565,7 @@ export function GeneralFilterContent({
|
|||||||
<div className="h-auto overflow-y-auto overflow-x-hidden">
|
<div className="h-auto overflow-y-auto overflow-x-hidden">
|
||||||
<div className="flex justify-between items-center my-2.5">
|
<div className="flex justify-between items-center my-2.5">
|
||||||
<Label
|
<Label
|
||||||
className="mx-2 text-primary-foreground cursor-pointer"
|
className="mx-2 text-primary cursor-pointer"
|
||||||
htmlFor="allLabels"
|
htmlFor="allLabels"
|
||||||
>
|
>
|
||||||
All Labels
|
All Labels
|
||||||
@ -586,7 +586,7 @@ export function GeneralFilterContent({
|
|||||||
{allLabels.map((item) => (
|
{allLabels.map((item) => (
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<Label
|
<Label
|
||||||
className="w-full mx-2 text-primary-foreground capitalize cursor-pointer"
|
className="w-full mx-2 text-primary capitalize cursor-pointer"
|
||||||
htmlFor={item}
|
htmlFor={item}
|
||||||
>
|
>
|
||||||
{item.replaceAll("_", " ")}
|
{item.replaceAll("_", " ")}
|
||||||
@ -664,7 +664,7 @@ function ShowMotionOnlyButton({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="hidden md:inline-flex items-center justify-center whitespace-nowrap text-sm bg-secondary hover:bg-secondary/80 text-primary-foreground h-9 rounded-md px-3 mx-1 cursor-pointer">
|
<div className="hidden md:inline-flex items-center justify-center whitespace-nowrap text-sm bg-secondary hover:bg-secondary/80 text-primary h-9 rounded-md px-3 mx-1 cursor-pointer">
|
||||||
<Switch
|
<Switch
|
||||||
className="ml-1"
|
className="ml-1"
|
||||||
id="collapse-motion"
|
id="collapse-motion"
|
||||||
@ -672,7 +672,7 @@ function ShowMotionOnlyButton({
|
|||||||
onCheckedChange={setMotionOnlyButton}
|
onCheckedChange={setMotionOnlyButton}
|
||||||
/>
|
/>
|
||||||
<Label
|
<Label
|
||||||
className="mx-2 text-primary-foreground cursor-pointer"
|
className="mx-2 text-primary cursor-pointer"
|
||||||
htmlFor="collapse-motion"
|
htmlFor="collapse-motion"
|
||||||
>
|
>
|
||||||
Motion only
|
Motion only
|
||||||
|
|||||||
@ -128,7 +128,7 @@ export function ThresholdBarGraph({
|
|||||||
<div className="w-full flex flex-col">
|
<div className="w-full flex flex-col">
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
<div className="text-xs text-muted-foreground">{name}</div>
|
<div className="text-xs text-muted-foreground">{name}</div>
|
||||||
<div className="text-xs text-primary-foreground">
|
<div className="text-xs text-primary">
|
||||||
{lastValue}
|
{lastValue}
|
||||||
{unit}
|
{unit}
|
||||||
</div>
|
</div>
|
||||||
@ -219,15 +219,13 @@ export function StorageGraph({ graphId, used, total }: StorageGraphProps) {
|
|||||||
<div className="w-full flex flex-col gap-2.5">
|
<div className="w-full flex flex-col gap-2.5">
|
||||||
<div className="w-full flex justify-between items-center gap-1">
|
<div className="w-full flex justify-between items-center gap-1">
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
<div className="text-xs text-primary-foreground">
|
<div className="text-xs text-primary">{getUnitSize(used)}</div>
|
||||||
{getUnitSize(used)}
|
<div className="text-xs text-primary">/</div>
|
||||||
</div>
|
|
||||||
<div className="text-xs text-primary-foreground">/</div>
|
|
||||||
<div className="text-xs text-muted-foreground">
|
<div className="text-xs text-muted-foreground">
|
||||||
{getUnitSize(total)}
|
{getUnitSize(total)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-xs text-primary-foreground">
|
<div className="text-xs text-primary">
|
||||||
{Math.round((used / total) * 100)}%
|
{Math.round((used / total) * 100)}%
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -367,7 +365,7 @@ export function CameraLineGraph({
|
|||||||
style={{ color: GRAPH_COLORS[labelIdx] }}
|
style={{ color: GRAPH_COLORS[labelIdx] }}
|
||||||
/>
|
/>
|
||||||
<div className="text-xs text-muted-foreground">{label}</div>
|
<div className="text-xs text-muted-foreground">{label}</div>
|
||||||
<div className="text-xs text-primary-foreground">
|
<div className="text-xs text-primary">
|
||||||
{lastValues[labelIdx]}
|
{lastValues[labelIdx]}
|
||||||
{unit}
|
{unit}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -49,7 +49,7 @@ export function LogChip({ severity, onClickSeverity }: LogChipProps) {
|
|||||||
const severityClassName = useMemo(() => {
|
const severityClassName = useMemo(() => {
|
||||||
switch (severity) {
|
switch (severity) {
|
||||||
case "info":
|
case "info":
|
||||||
return "text-primary-foreground/60 bg-secondary hover:bg-secondary/60";
|
return "text-primary/60 bg-secondary hover:bg-secondary/60";
|
||||||
case "warning":
|
case "warning":
|
||||||
return "text-warning-foreground bg-warning hover:bg-warning/80";
|
return "text-warning-foreground bg-warning hover:bg-warning/80";
|
||||||
case "error":
|
case "error":
|
||||||
|
|||||||
@ -10,7 +10,7 @@ function Sidebar() {
|
|||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<aside className="absolute w-[52px] z-10 left-o inset-y-0 overflow-y-auto scrollbar-hidden py-4 flex flex-col justify-between bg-primary border-r border-secondary-highlight">
|
<aside className="absolute w-[52px] z-10 left-o inset-y-0 overflow-y-auto scrollbar-hidden py-4 flex flex-col justify-between bg-background_alt border-r border-secondary-highlight">
|
||||||
<span tabIndex={0} className="sr-only" />
|
<span tabIndex={0} className="sr-only" />
|
||||||
<div className="w-full flex flex-col gap-0 items-center">
|
<div className="w-full flex flex-col gap-0 items-center">
|
||||||
<Logo className="w-8 h-8 mb-6" />
|
<Logo className="w-8 h-8 mb-6" />
|
||||||
|
|||||||
@ -126,7 +126,7 @@ export default function ExportDialog({
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<FaArrowDown className="p-1 fill-secondary bg-secondary-foreground rounded-md" />
|
<FaArrowDown className="p-1 fill-secondary bg-secondary-foreground rounded-md" />
|
||||||
{isDesktop && <div className="text-primary-foreground">Export</div>}
|
{isDesktop && <div className="text-primary">Export</div>}
|
||||||
</Button>
|
</Button>
|
||||||
</Trigger>
|
</Trigger>
|
||||||
<Content
|
<Content
|
||||||
|
|||||||
@ -32,28 +32,24 @@ export default function LogInfoDialog({
|
|||||||
{logLine && (
|
{logLine && (
|
||||||
<div className="size-full flex flex-col gap-5">
|
<div className="size-full flex flex-col gap-5">
|
||||||
<div className="w-min flex flex-col gap-1.5">
|
<div className="w-min flex flex-col gap-1.5">
|
||||||
<div className="text-sm text-primary-foreground/40">Type</div>
|
<div className="text-sm text-primary/40">Type</div>
|
||||||
<LogChip severity={logLine.severity} />
|
<LogChip severity={logLine.severity} />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col gap-1.5">
|
<div className="flex flex-col gap-1.5">
|
||||||
<div className="text-sm text-primary-foreground/40">
|
<div className="text-sm text-primary/40">Timestamp</div>
|
||||||
Timestamp
|
|
||||||
</div>
|
|
||||||
<div className="text-sm">{logLine.dateStamp}</div>
|
<div className="text-sm">{logLine.dateStamp}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col gap-1.5">
|
<div className="flex flex-col gap-1.5">
|
||||||
<div className="text-sm text-primary-foreground/40">Tag</div>
|
<div className="text-sm text-primary/40">Tag</div>
|
||||||
<div className="text-sm">{logLine.section}</div>
|
<div className="text-sm">{logLine.section}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col gap-1.5">
|
<div className="flex flex-col gap-1.5">
|
||||||
<div className="text-sm text-primary-foreground/40">Message</div>
|
<div className="text-sm text-primary/40">Message</div>
|
||||||
<div className="text-sm">{logLine.content}</div>
|
<div className="text-sm">{logLine.content}</div>
|
||||||
</div>
|
</div>
|
||||||
{helpfulLinks.length > 0 && (
|
{helpfulLinks.length > 0 && (
|
||||||
<div className="flex flex-col gap-1.5">
|
<div className="flex flex-col gap-1.5">
|
||||||
<div className="text-sm text-primary-foreground/40">
|
<div className="text-sm text-primary/40">Helpful Links</div>
|
||||||
Helpful Links
|
|
||||||
</div>
|
|
||||||
{helpfulLinks.map((tip) => (
|
{helpfulLinks.map((tip) => (
|
||||||
<Link to={tip.link} target="_blank" rel="noopener noreferrer">
|
<Link to={tip.link} target="_blank" rel="noopener noreferrer">
|
||||||
<div className="text-sm text-selected hover:underline">
|
<div className="text-sm text-selected hover:underline">
|
||||||
|
|||||||
@ -137,7 +137,8 @@ export default function MobileReviewSettingsDrawer({
|
|||||||
<div className="w-full p-4 flex flex-col gap-2">
|
<div className="w-full p-4 flex flex-col gap-2">
|
||||||
{features.includes("export") && (
|
{features.includes("export") && (
|
||||||
<Button
|
<Button
|
||||||
className="w-full flex justify-center items-center gap-2"
|
className="w-full flex justify-center items-center gap-2 dark:text-primary-foreground"
|
||||||
|
variant="secondary"
|
||||||
onClick={() => setDrawerMode("export")}
|
onClick={() => setDrawerMode("export")}
|
||||||
>
|
>
|
||||||
<FaArrowDown className="p-1 fill-secondary bg-secondary-foreground rounded-md" />
|
<FaArrowDown className="p-1 fill-secondary bg-secondary-foreground rounded-md" />
|
||||||
@ -146,7 +147,8 @@ export default function MobileReviewSettingsDrawer({
|
|||||||
)}
|
)}
|
||||||
{features.includes("calendar") && (
|
{features.includes("calendar") && (
|
||||||
<Button
|
<Button
|
||||||
className="w-full flex justify-center items-center gap-2"
|
className="w-full flex justify-center items-center gap-2 dark:text-primary-foreground"
|
||||||
|
variant="secondary"
|
||||||
onClick={() => setDrawerMode("calendar")}
|
onClick={() => setDrawerMode("calendar")}
|
||||||
>
|
>
|
||||||
<FaCalendarAlt className="fill-secondary-foreground" />
|
<FaCalendarAlt className="fill-secondary-foreground" />
|
||||||
@ -155,7 +157,8 @@ export default function MobileReviewSettingsDrawer({
|
|||||||
)}
|
)}
|
||||||
{features.includes("filter") && (
|
{features.includes("filter") && (
|
||||||
<Button
|
<Button
|
||||||
className="w-full flex justify-center items-center gap-2"
|
className="w-full flex justify-center items-center gap-2 dark:text-primary-foreground"
|
||||||
|
variant="secondary"
|
||||||
onClick={() => setDrawerMode("filter")}
|
onClick={() => setDrawerMode("filter")}
|
||||||
>
|
>
|
||||||
<FaFilter className="fill-secondary-foreground" />
|
<FaFilter className="fill-secondary-foreground" />
|
||||||
|
|||||||
@ -31,7 +31,7 @@ export default function SaveExportOverlay({
|
|||||||
Save Export
|
Save Export
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
className="flex items-center gap-1 text-primary-foreground"
|
className="flex items-center gap-1 text-primary"
|
||||||
size="sm"
|
size="sm"
|
||||||
variant="secondary"
|
variant="secondary"
|
||||||
onClick={onCancel}
|
onClick={onCancel}
|
||||||
|
|||||||
@ -142,7 +142,7 @@ export default function VideoControls({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={`px-4 py-2 flex justify-between items-center gap-8 text-primary-foreground dark:text-white z-50 bg-secondary-foreground/60 dark:bg-secondary/60 rounded-lg ${className ?? ""}`}
|
className={`px-4 py-2 flex justify-between items-center gap-8 text-primary dark:text-white z-50 bg-secondary-foreground/60 dark:bg-secondary/60 rounded-lg ${className ?? ""}`}
|
||||||
>
|
>
|
||||||
{video && features.volume && (
|
{video && features.volume && (
|
||||||
<div className="flex justify-normal items-center gap-2">
|
<div className="flex justify-normal items-center gap-2">
|
||||||
|
|||||||
@ -32,7 +32,7 @@ export function MinimapBounds({
|
|||||||
<>
|
<>
|
||||||
{isFirstSegmentInMinimap && (
|
{isFirstSegmentInMinimap && (
|
||||||
<div
|
<div
|
||||||
className="absolute inset-0 -bottom-7 w-full flex items-center justify-center text-primary-foreground font-medium z-20 text-center text-[10px] scroll-mt-8 pointer-events-none select-none"
|
className="absolute inset-0 -bottom-7 w-full flex items-center justify-center text-primary font-medium z-20 text-center text-[10px] scroll-mt-8 pointer-events-none select-none"
|
||||||
ref={firstMinimapSegmentRef}
|
ref={firstMinimapSegmentRef}
|
||||||
>
|
>
|
||||||
{new Date(alignedMinimapStartTime * 1000).toLocaleTimeString([], {
|
{new Date(alignedMinimapStartTime * 1000).toLocaleTimeString([], {
|
||||||
@ -44,7 +44,7 @@ export function MinimapBounds({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{isLastSegmentInMinimap && (
|
{isLastSegmentInMinimap && (
|
||||||
<div className="absolute inset-0 -top-3 w-full flex items-center justify-center text-primary-foreground font-medium z-20 text-center text-[10px] pointer-events-none select-none">
|
<div className="absolute inset-0 -top-3 w-full flex items-center justify-center text-primary font-medium z-20 text-center text-[10px] pointer-events-none select-none">
|
||||||
{new Date(alignedMinimapEndTime * 1000).toLocaleTimeString([], {
|
{new Date(alignedMinimapEndTime * 1000).toLocaleTimeString([], {
|
||||||
hour: "2-digit",
|
hour: "2-digit",
|
||||||
minute: "2-digit",
|
minute: "2-digit",
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import * as React from "react"
|
import * as React from "react";
|
||||||
import { cva, type VariantProps } from "class-variance-authority"
|
import { cva, type VariantProps } from "class-variance-authority";
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils";
|
||||||
|
|
||||||
const badgeVariants = cva(
|
const badgeVariants = cva(
|
||||||
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
||||||
@ -9,7 +9,7 @@ const badgeVariants = cva(
|
|||||||
variants: {
|
variants: {
|
||||||
variant: {
|
variant: {
|
||||||
default:
|
default:
|
||||||
"border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
|
"border-transparent bg-primary text-primary hover:bg-primary/80",
|
||||||
secondary:
|
secondary:
|
||||||
"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
||||||
destructive:
|
destructive:
|
||||||
@ -20,8 +20,8 @@ const badgeVariants = cva(
|
|||||||
defaultVariants: {
|
defaultVariants: {
|
||||||
variant: "default",
|
variant: "default",
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
)
|
);
|
||||||
|
|
||||||
export interface BadgeProps
|
export interface BadgeProps
|
||||||
extends React.HTMLAttributes<HTMLDivElement>,
|
extends React.HTMLAttributes<HTMLDivElement>,
|
||||||
@ -30,7 +30,7 @@ export interface BadgeProps
|
|||||||
function Badge({ className, variant, ...props }: BadgeProps) {
|
function Badge({ className, variant, ...props }: BadgeProps) {
|
||||||
return (
|
return (
|
||||||
<div className={cn(badgeVariants({ variant }), className)} {...props} />
|
<div className={cn(badgeVariants({ variant }), className)} {...props} />
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Badge, badgeVariants }
|
export { Badge, badgeVariants };
|
||||||
|
|||||||
@ -33,7 +33,7 @@ const buttonVariants = cva(
|
|||||||
variant: "default",
|
variant: "default",
|
||||||
size: "default",
|
size: "default",
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
export interface ButtonProps
|
export interface ButtonProps
|
||||||
@ -52,7 +52,7 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
|||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
Button.displayName = "Button";
|
Button.displayName = "Button";
|
||||||
|
|
||||||
|
|||||||
@ -15,13 +15,13 @@ const Toaster = ({ ...props }: ToasterProps) => {
|
|||||||
toast:
|
toast:
|
||||||
"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
|
"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
|
||||||
description: "group-[.toast]:text-muted-foreground",
|
description: "group-[.toast]:text-muted-foreground",
|
||||||
actionButton:
|
actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary",
|
||||||
"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
|
|
||||||
cancelButton:
|
cancelButton:
|
||||||
"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
|
"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
|
||||||
success:
|
success:
|
||||||
"group toast group-[.toaster]:bg-success group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
|
"group toast group-[.toaster]:bg-success group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
|
||||||
error: "group toast group-[.toaster]:bg-danger group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
|
error:
|
||||||
|
"group toast group-[.toaster]:bg-danger group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
|
||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
{...props}
|
{...props}
|
||||||
|
|||||||
@ -360,7 +360,7 @@ function Logs() {
|
|||||||
onClick={handleCopyLogs}
|
onClick={handleCopyLogs}
|
||||||
>
|
>
|
||||||
<FaCopy />
|
<FaCopy />
|
||||||
<div className="hidden md:block text-primary-foreground">
|
<div className="hidden md:block text-primary">
|
||||||
Copy to Clipboard
|
Copy to Clipboard
|
||||||
</div>
|
</div>
|
||||||
</Button>
|
</Button>
|
||||||
@ -386,8 +386,8 @@ function Logs() {
|
|||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="size-full flex flex-col my-2 font-mono text-sm sm:p-2 whitespace-pre-wrap bg-primary border border-secondary rounded-md overflow-hidden">
|
<div className="size-full flex flex-col my-2 font-mono text-sm sm:p-2 whitespace-pre-wrap bg-background_alt border border-secondary rounded-md overflow-hidden">
|
||||||
<div className="grid grid-cols-5 sm:grid-cols-8 md:grid-cols-12 *:px-2 *:py-3 *:text-sm *:text-primary-foreground/40">
|
<div className="grid grid-cols-5 sm:grid-cols-8 md:grid-cols-12 *:px-2 *:py-3 *:text-sm *:text-primary/40">
|
||||||
<div className="p-1 flex items-center capitalize">Type</div>
|
<div className="p-1 flex items-center capitalize">Type</div>
|
||||||
<div className="col-span-2 sm:col-span-1 flex items-center">
|
<div className="col-span-2 sm:col-span-1 flex items-center">
|
||||||
Timestamp
|
Timestamp
|
||||||
|
|||||||
@ -239,7 +239,7 @@ function PlusFilterGroup({
|
|||||||
<Trigger asChild>
|
<Trigger asChild>
|
||||||
<Button size="sm" className="mx-1 capitalize" variant="secondary">
|
<Button size="sm" className="mx-1 capitalize" variant="secondary">
|
||||||
<FaVideo className="md:mr-[10px] text-secondary-foreground" />
|
<FaVideo className="md:mr-[10px] text-secondary-foreground" />
|
||||||
<div className="hidden md:block text-primary-foreground">
|
<div className="hidden md:block text-primary">
|
||||||
{selectedCameras == undefined
|
{selectedCameras == undefined
|
||||||
? "All Cameras"
|
? "All Cameras"
|
||||||
: `${selectedCameras.length} Cameras`}
|
: `${selectedCameras.length} Cameras`}
|
||||||
@ -316,7 +316,7 @@ function PlusFilterGroup({
|
|||||||
<Trigger asChild>
|
<Trigger asChild>
|
||||||
<Button size="sm" className="mx-1 capitalize" variant="secondary">
|
<Button size="sm" className="mx-1 capitalize" variant="secondary">
|
||||||
<FaList className="md:mr-[10px] text-secondary-foreground" />
|
<FaList className="md:mr-[10px] text-secondary-foreground" />
|
||||||
<div className="hidden md:block text-primary-foreground">
|
<div className="hidden md:block text-primary">
|
||||||
{selectedLabels == undefined
|
{selectedLabels == undefined
|
||||||
? "All Labels"
|
? "All Labels"
|
||||||
: `${selectedLabels.length} Labels`}
|
: `${selectedLabels.length} Labels`}
|
||||||
|
|||||||
@ -318,7 +318,11 @@ function UIPlayground() {
|
|||||||
<CameraActivityIndicator />
|
<CameraActivityIndicator />
|
||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<Button onClick={handleZoomOut} disabled={zoomLevel === 0}>
|
<Button
|
||||||
|
variant="default"
|
||||||
|
onClick={handleZoomOut}
|
||||||
|
disabled={zoomLevel === 0}
|
||||||
|
>
|
||||||
Zoom Out
|
Zoom Out
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@ -258,7 +258,7 @@ export function RecordingView({
|
|||||||
onClick={() => navigate(-1)}
|
onClick={() => navigate(-1)}
|
||||||
>
|
>
|
||||||
<IoMdArrowRoundBack className="size-5" size="small" />
|
<IoMdArrowRoundBack className="size-5" size="small" />
|
||||||
{isDesktop && <div className="text-primary-foreground">Back</div>}
|
{isDesktop && <div className="text-primary">Back</div>}
|
||||||
</Button>
|
</Button>
|
||||||
<div className="flex items-center justify-end gap-2">
|
<div className="flex items-center justify-end gap-2">
|
||||||
<MobileCameraDrawer
|
<MobileCameraDrawer
|
||||||
|
|||||||
@ -133,7 +133,7 @@ export default function LiveBirdseyeView() {
|
|||||||
onClick={() => navigate(-1)}
|
onClick={() => navigate(-1)}
|
||||||
>
|
>
|
||||||
<IoMdArrowBack className="size-5" />
|
<IoMdArrowBack className="size-5" />
|
||||||
{isDesktop && <div className="text-primary-foreground">Back</div>}
|
{isDesktop && <div className="text-primary">Back</div>}
|
||||||
</Button>
|
</Button>
|
||||||
) : (
|
) : (
|
||||||
<div />
|
<div />
|
||||||
|
|||||||
@ -230,9 +230,7 @@ export default function LiveCameraView({ camera }: LiveCameraViewProps) {
|
|||||||
onClick={() => navigate(-1)}
|
onClick={() => navigate(-1)}
|
||||||
>
|
>
|
||||||
<IoMdArrowRoundBack className="size-5" />
|
<IoMdArrowRoundBack className="size-5" />
|
||||||
{isDesktop && (
|
{isDesktop && <div className="text-primary">Back</div>}
|
||||||
<div className="text-primary-foreground">Back</div>
|
|
||||||
)}
|
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
className="flex items-center gap-2.5 rounded-lg"
|
className="flex items-center gap-2.5 rounded-lg"
|
||||||
@ -252,9 +250,7 @@ export default function LiveCameraView({ camera }: LiveCameraViewProps) {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<LuHistory className="size-5" />
|
<LuHistory className="size-5" />
|
||||||
{isDesktop && (
|
{isDesktop && <div className="text-primary">History</div>}
|
||||||
<div className="text-primary-foreground">History</div>
|
|
||||||
)}
|
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
@ -522,7 +518,7 @@ function PtzControlPanel({
|
|||||||
{ptz?.features?.includes("pt-r-fov") && (
|
{ptz?.features?.includes("pt-r-fov") && (
|
||||||
<>
|
<>
|
||||||
<Button
|
<Button
|
||||||
className={`${clickOverlay ? "text-selected" : "text-primary-foreground"}`}
|
className={`${clickOverlay ? "text-selected" : "text-primary"}`}
|
||||||
onClick={() => setClickOverlay(!clickOverlay)}
|
onClick={() => setClickOverlay(!clickOverlay)}
|
||||||
>
|
>
|
||||||
<HiViewfinderCircle />
|
<HiViewfinderCircle />
|
||||||
|
|||||||
@ -159,7 +159,7 @@ export default function CameraMetrics({
|
|||||||
</div>
|
</div>
|
||||||
<div key={camera.name} className="grid sm:grid-cols-2 gap-2">
|
<div key={camera.name} className="grid sm:grid-cols-2 gap-2">
|
||||||
{Object.keys(cameraCpuSeries).includes(camera.name) ? (
|
{Object.keys(cameraCpuSeries).includes(camera.name) ? (
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">CPU</div>
|
<div className="mb-5">CPU</div>
|
||||||
<CameraLineGraph
|
<CameraLineGraph
|
||||||
graphId={`${camera.name}-cpu`}
|
graphId={`${camera.name}-cpu`}
|
||||||
@ -175,7 +175,7 @@ export default function CameraMetrics({
|
|||||||
<Skeleton className="size-full aspect-video" />
|
<Skeleton className="size-full aspect-video" />
|
||||||
)}
|
)}
|
||||||
{Object.keys(cameraFpsSeries).includes(camera.name) ? (
|
{Object.keys(cameraFpsSeries).includes(camera.name) ? (
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">DPS</div>
|
<div className="mb-5">DPS</div>
|
||||||
<CameraLineGraph
|
<CameraLineGraph
|
||||||
graphId={`${camera.name}-dps`}
|
graphId={`${camera.name}-dps`}
|
||||||
|
|||||||
@ -285,7 +285,7 @@ export default function GeneralMetrics({
|
|||||||
</div>
|
</div>
|
||||||
<div className="w-full mt-4 grid grid-cols-1 sm:grid-cols-3 gap-2">
|
<div className="w-full mt-4 grid grid-cols-1 sm:grid-cols-3 gap-2">
|
||||||
{statsHistory.length != 0 ? (
|
{statsHistory.length != 0 ? (
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">Detector Inference Speed</div>
|
<div className="mb-5">Detector Inference Speed</div>
|
||||||
{detInferenceTimeSeries.map((series) => (
|
{detInferenceTimeSeries.map((series) => (
|
||||||
<ThresholdBarGraph
|
<ThresholdBarGraph
|
||||||
@ -303,7 +303,7 @@ export default function GeneralMetrics({
|
|||||||
<Skeleton className="w-full aspect-video" />
|
<Skeleton className="w-full aspect-video" />
|
||||||
)}
|
)}
|
||||||
{statsHistory.length != 0 ? (
|
{statsHistory.length != 0 ? (
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">Detector CPU Usage</div>
|
<div className="mb-5">Detector CPU Usage</div>
|
||||||
{detCpuSeries.map((series) => (
|
{detCpuSeries.map((series) => (
|
||||||
<ThresholdBarGraph
|
<ThresholdBarGraph
|
||||||
@ -321,7 +321,7 @@ export default function GeneralMetrics({
|
|||||||
<Skeleton className="w-full aspect-video" />
|
<Skeleton className="w-full aspect-video" />
|
||||||
)}
|
)}
|
||||||
{statsHistory.length != 0 ? (
|
{statsHistory.length != 0 ? (
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">Detector Memory Usage</div>
|
<div className="mb-5">Detector Memory Usage</div>
|
||||||
{detMemSeries.map((series) => (
|
{detMemSeries.map((series) => (
|
||||||
<ThresholdBarGraph
|
<ThresholdBarGraph
|
||||||
@ -359,7 +359,7 @@ export default function GeneralMetrics({
|
|||||||
</div>
|
</div>
|
||||||
<div className=" mt-4 grid grid-cols-1 sm:grid-cols-2 gap-2">
|
<div className=" mt-4 grid grid-cols-1 sm:grid-cols-2 gap-2">
|
||||||
{statsHistory.length != 0 ? (
|
{statsHistory.length != 0 ? (
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">GPU Usage</div>
|
<div className="mb-5">GPU Usage</div>
|
||||||
{gpuSeries.map((series) => (
|
{gpuSeries.map((series) => (
|
||||||
<ThresholdBarGraph
|
<ThresholdBarGraph
|
||||||
@ -377,7 +377,7 @@ export default function GeneralMetrics({
|
|||||||
<Skeleton className="w-full aspect-video" />
|
<Skeleton className="w-full aspect-video" />
|
||||||
)}
|
)}
|
||||||
{statsHistory.length != 0 ? (
|
{statsHistory.length != 0 ? (
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">GPU Memory</div>
|
<div className="mb-5">GPU Memory</div>
|
||||||
{gpuMemSeries.map((series) => (
|
{gpuMemSeries.map((series) => (
|
||||||
<ThresholdBarGraph
|
<ThresholdBarGraph
|
||||||
@ -403,7 +403,7 @@ export default function GeneralMetrics({
|
|||||||
</div>
|
</div>
|
||||||
<div className="mt-4 grid grid-cols-1 sm:grid-cols-2 gap-2">
|
<div className="mt-4 grid grid-cols-1 sm:grid-cols-2 gap-2">
|
||||||
{statsHistory.length != 0 ? (
|
{statsHistory.length != 0 ? (
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">Process CPU Usage</div>
|
<div className="mb-5">Process CPU Usage</div>
|
||||||
{otherProcessCpuSeries.map((series) => (
|
{otherProcessCpuSeries.map((series) => (
|
||||||
<ThresholdBarGraph
|
<ThresholdBarGraph
|
||||||
@ -421,7 +421,7 @@ export default function GeneralMetrics({
|
|||||||
<Skeleton className="w-full aspect-tall" />
|
<Skeleton className="w-full aspect-tall" />
|
||||||
)}
|
)}
|
||||||
{statsHistory.length != 0 ? (
|
{statsHistory.length != 0 ? (
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">Process Memory Usage</div>
|
<div className="mb-5">Process Memory Usage</div>
|
||||||
{otherProcessMemSeries.map((series) => (
|
{otherProcessMemSeries.map((series) => (
|
||||||
<ThresholdBarGraph
|
<ThresholdBarGraph
|
||||||
|
|||||||
@ -47,7 +47,7 @@ export default function StorageMetrics({
|
|||||||
General Storage
|
General Storage
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-4 grid grid-cols-1 sm:grid-cols-3 gap-2">
|
<div className="mt-4 grid grid-cols-1 sm:grid-cols-3 gap-2">
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">Recordings</div>
|
<div className="mb-5">Recordings</div>
|
||||||
<StorageGraph
|
<StorageGraph
|
||||||
graphId="general-recordings"
|
graphId="general-recordings"
|
||||||
@ -55,7 +55,7 @@ export default function StorageMetrics({
|
|||||||
total={totalStorage.total}
|
total={totalStorage.total}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">/tmp/cache</div>
|
<div className="mb-5">/tmp/cache</div>
|
||||||
<StorageGraph
|
<StorageGraph
|
||||||
graphId="general-cache"
|
graphId="general-cache"
|
||||||
@ -63,7 +63,7 @@ export default function StorageMetrics({
|
|||||||
total={stats.service.storage["/tmp/cache"]["total"]}
|
total={stats.service.storage["/tmp/cache"]["total"]}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5">/dev/shm</div>
|
<div className="mb-5">/dev/shm</div>
|
||||||
<StorageGraph
|
<StorageGraph
|
||||||
graphId="general-shared-memory"
|
graphId="general-shared-memory"
|
||||||
@ -77,7 +77,7 @@ export default function StorageMetrics({
|
|||||||
</div>
|
</div>
|
||||||
<div className="mt-4 grid grid-cols-1 sm:grid-cols-3 gap-2">
|
<div className="mt-4 grid grid-cols-1 sm:grid-cols-3 gap-2">
|
||||||
{Object.keys(cameraStorage).map((camera) => (
|
{Object.keys(cameraStorage).map((camera) => (
|
||||||
<div className="p-2.5 bg-secondary dark:bg-primary rounded-2xl flex-col">
|
<div className="p-2.5 bg-background_alt rounded-2xl flex-col">
|
||||||
<div className="mb-5 capitalize">{camera.replaceAll("_", " ")}</div>
|
<div className="mb-5 capitalize">{camera.replaceAll("_", " ")}</div>
|
||||||
<StorageGraph
|
<StorageGraph
|
||||||
graphId={`${camera}-storage`}
|
graphId={`${camera}-storage`}
|
||||||
|
|||||||
@ -44,6 +44,7 @@ module.exports = {
|
|||||||
danger: "#ef4444",
|
danger: "#ef4444",
|
||||||
success: "#22c55e",
|
success: "#22c55e",
|
||||||
background: "hsl(var(--background))",
|
background: "hsl(var(--background))",
|
||||||
|
background_alt: "hsl(var(--background-alt))",
|
||||||
foreground: "hsl(var(--foreground))",
|
foreground: "hsl(var(--foreground))",
|
||||||
selected: "hsl(var(--selected))",
|
selected: "hsl(var(--selected))",
|
||||||
primary: {
|
primary: {
|
||||||
|
|||||||
@ -3,6 +3,9 @@
|
|||||||
--background-hsl: hsl(0 0% 100%);
|
--background-hsl: hsl(0 0% 100%);
|
||||||
--background: 0 0% 100%;
|
--background: 0 0% 100%;
|
||||||
|
|
||||||
|
--background-alt-hsl: hsl(0 0% 98.5%);
|
||||||
|
--background-alt: 0 0% 98.5%;
|
||||||
|
|
||||||
--foreground: hsl(222.2 84% 4.9%);
|
--foreground: hsl(222.2 84% 4.9%);
|
||||||
--foreground: 222.2 84% 4.9%;
|
--foreground: 222.2 84% 4.9%;
|
||||||
|
|
||||||
@ -18,17 +21,17 @@
|
|||||||
--popover-foreground: hsl(222.2 84% 4.9%);
|
--popover-foreground: hsl(222.2 84% 4.9%);
|
||||||
--popover-foreground: 222.2 84% 4.9%;
|
--popover-foreground: 222.2 84% 4.9%;
|
||||||
|
|
||||||
--primary: hsl(0 0% 100%);
|
--primary: hsl(222.2, 37.4%, 11.2%);
|
||||||
--primary: 0 0% 100%;
|
--primary: 222.2 47.4% 11.2%;
|
||||||
|
|
||||||
--primary-foreground: hsl(0, 0%, 0%);
|
--primary-foreground: hsl(210 40% 98%);
|
||||||
--primary-foreground: 0 0% 0%;
|
--primary-foreground: 210 40% 98%;
|
||||||
|
|
||||||
--secondary: hsl(0, 0%, 96%);
|
--secondary: hsl(210 20% 94.1%);
|
||||||
--secondary: 0 0% 96%;
|
--secondary: 210 20% 94.1%;
|
||||||
|
|
||||||
--secondary-foreground: hsl(0, 0%, 70%);
|
--secondary-foreground: hsl(222.2 47.4% 21.2%);
|
||||||
--secondary-foreground: 0 0% 70%;
|
--secondary-foreground: 222.2 47.4% 21.2%;
|
||||||
|
|
||||||
--secondary-highlight: hsl(0, 0%, 94%);
|
--secondary-highlight: hsl(0, 0%, 94%);
|
||||||
--secondary-highlight: 0 0% 94%;
|
--secondary-highlight: 0 0% 94%;
|
||||||
@ -36,8 +39,8 @@
|
|||||||
--muted: hsl(210 40% 96.1%);
|
--muted: hsl(210 40% 96.1%);
|
||||||
--muted: 210 40% 96.1%;
|
--muted: 210 40% 96.1%;
|
||||||
|
|
||||||
--muted-foreground: hsl(0, 0%, 64%);
|
--muted-foreground: hsl(215.4 6.3% 46.9%);
|
||||||
--muted-foreground: 0, 0%, 64%;
|
--muted-foreground: 215.4 6.3% 46.9%;
|
||||||
|
|
||||||
--accent: hsl(210 40% 96.1%);
|
--accent: hsl(210 40% 96.1%);
|
||||||
--accent: 210 40% 96.1%;
|
--accent: 210 40% 96.1%;
|
||||||
@ -94,6 +97,9 @@
|
|||||||
--background-hsl: hsl(0 0 0%);
|
--background-hsl: hsl(0 0 0%);
|
||||||
--background: 0 0% 0%;
|
--background: 0 0% 0%;
|
||||||
|
|
||||||
|
--background-alt-hsl: hsl(0 0 9%);
|
||||||
|
--background-alt: 0 0% 9%;
|
||||||
|
|
||||||
--foreground: hsl(0, 0%, 100%);
|
--foreground: hsl(0, 0%, 100%);
|
||||||
--foreground: 0, 0%, 100%;
|
--foreground: 0, 0%, 100%;
|
||||||
|
|
||||||
@ -109,8 +115,8 @@
|
|||||||
--popover-foreground: hsl(0, 0%, 100%);
|
--popover-foreground: hsl(0, 0%, 100%);
|
||||||
--popover-foreground: 210 40% 98%;
|
--popover-foreground: 210 40% 98%;
|
||||||
|
|
||||||
--primary: hsl(0, 0%, 9%);
|
--primary: hsl(0, 0%, 91%);
|
||||||
--primary: 0 0% 9%;
|
--primary: 0 0% 91%;
|
||||||
|
|
||||||
--primary-foreground: hsl(0, 0%, 100%);
|
--primary-foreground: hsl(0, 0%, 100%);
|
||||||
--primary-foreground: 0 0% 100%;
|
--primary-foreground: 0 0% 100%;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user