Fix colors for default light mode theme (#10909)

* fix colors for default light mode theme

* remove redundancy

* fix export dialog

* don't use primary-foreground

* change secondary button variant to be default button

* change filters button to bg-selected when filtering

* slightly lighten secondary-foreground in light mode

* fix mobile motion only button
This commit is contained in:
Josh Hawkins 2024-04-09 17:49:14 -05:00 committed by GitHub
parent c08a198354
commit ef52a1d6f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
34 changed files with 144 additions and 154 deletions

View File

@ -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">

View File

@ -34,7 +34,6 @@ export default function NewReviewData({
? "animate-in slide-in-from-top duration-500" ? "animate-in slide-in-from-top duration-500"
: "invisible" : "invisible"
} text-center mt-5 mx-auto bg-gray-400 text-white`} } text-center mt-5 mx-auto bg-gray-400 text-white`}
variant="secondary"
onClick={() => { onClick={() => {
pullLatestData(); pullLatestData();
if (contentRef.current) { if (contentRef.current) {

View File

@ -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")}
> >

View File

@ -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)}
> >

View File

@ -17,9 +17,9 @@ export function LogLevelFilterButton({
updateLabelFilter, updateLabelFilter,
}: LogLevelFilterButtonProps) { }: LogLevelFilterButtonProps) {
const trigger = ( const trigger = (
<Button size="sm" className="flex items-center gap-2" variant="secondary"> <Button size="sm" className="flex items-center gap-2">
<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("_", " ")}

View File

@ -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
@ -50,7 +50,6 @@ export default function ReviewActionGroup({
{selectedReviews.length == 1 && ( {selectedReviews.length == 1 && (
<Button <Button
className="p-2 flex items-center gap-2" className="p-2 flex items-center gap-2"
variant="secondary"
size="sm" size="sm"
onClick={() => { onClick={() => {
onExport(selectedReviews[0]); onExport(selectedReviews[0]);
@ -58,28 +57,24 @@ 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
className="p-2 flex items-center gap-2" className="p-2 flex items-center gap-2"
variant="secondary"
size="sm" size="sm"
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"
variant="secondary"
size="sm" size="sm"
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>

View File

@ -223,14 +223,13 @@ function CamerasFilterButton({
const trigger = ( const trigger = (
<Button <Button
className={`flex items-center gap-2 capitalize ${selectedCameras?.length ? "bg-selected hover:bg-selected" : ""}`} className={`flex items-center gap-2 capitalize ${selectedCameras?.length ? "bg-selected hover:bg-selected" : ""}`}
variant="secondary"
size="sm" size="sm"
> >
<FaVideo <FaVideo
className={`${selectedCameras?.length ? "text-primary dark:text-primary-foreground" : "text-secondary-foreground"}`} className={`${selectedCameras?.length ? "text-background 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-background dark:text-primary" : "text-primary"}`}
> >
{selectedCameras == undefined {selectedCameras == undefined
? "All Cameras" ? "All Cameras"
@ -316,7 +315,6 @@ function CamerasFilterButton({
Apply Apply
</Button> </Button>
<Button <Button
variant="secondary"
onClick={() => { onClick={() => {
setCurrentCameras(undefined); setCurrentCameras(undefined);
updateCameraFilter(undefined); updateCameraFilter(undefined);
@ -379,7 +377,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 +385,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>
@ -395,11 +393,10 @@ function ShowReviewFilter({
<Button <Button
className={`block md:hidden duration-0 ${showReviewedSwitch == 1 ? "bg-selected hover:bg-selected" : "bg-secondary hover:bg-secondary/80"}`} className={`block md:hidden duration-0 ${showReviewedSwitch == 1 ? "bg-selected hover:bg-selected" : "bg-secondary hover:bg-secondary/80"}`}
size="sm" size="sm"
variant="secondary"
onClick={() => setShowReviewedSwitch(showReviewedSwitch == 0 ? 1 : 0)} onClick={() => setShowReviewedSwitch(showReviewedSwitch == 0 ? 1 : 0)}
> >
<FaCheckCircle <FaCheckCircle
className={`${showReviewedSwitch == 1 ? "fill-primary dark:fill-primary-foreground" : "text-muted-foreground"}`} className={`${showReviewedSwitch == 1 ? "text-background dark:text-primary" : "text-secondary-foreground"}`}
/> />
</Button> </Button>
</> </>
@ -425,13 +422,12 @@ function CalendarFilterButton({
<Button <Button
size="sm" size="sm"
className={`flex items-center gap-2 ${day == undefined ? "bg-secondary hover:bg-secondary/80" : "bg-selected hover:bg-selected"}`} className={`flex items-center gap-2 ${day == undefined ? "bg-secondary hover:bg-secondary/80" : "bg-selected hover:bg-selected"}`}
variant="secondary"
> >
<FaCalendarAlt <FaCalendarAlt
className={`${day == undefined ? "text-secondary-foreground" : "text-primary dark:text-primary-foreground"}`} className={`${day == undefined ? "text-secondary-foreground" : "text-background 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-background dark:text-primary"}`}
> >
{day == undefined ? "Last 24 Hours" : selectedDate} {day == undefined ? "Last 24 Hours" : selectedDate}
</div> </div>
@ -447,7 +443,6 @@ function CalendarFilterButton({
<DropdownMenuSeparator /> <DropdownMenuSeparator />
<div className="p-2 flex justify-center items-center"> <div className="p-2 flex justify-center items-center">
<Button <Button
variant="secondary"
onClick={() => { onClick={() => {
updateSelectedDay(undefined); updateSelectedDay(undefined);
}} }}
@ -491,9 +486,18 @@ function GeneralFilterButton({
); );
const trigger = ( const trigger = (
<Button size="sm" className="flex items-center gap-2" variant="secondary"> <Button
<FaFilter className="text-secondary-foreground" /> size="sm"
<div className="hidden md:block text-primary-foreground">Filter</div> className={`flex items-center gap-2 capitalize ${selectedLabels?.length ? "bg-selected hover:bg-selected" : ""}`}
>
<FaFilter
className={`${selectedLabels?.length ? "text-background dark:text-primary" : "text-secondary-foreground"}`}
/>
<div
className={`hidden md:block ${selectedLabels?.length ? "text-background dark:text-primary" : "text-primary"}`}
>
Filter
</div>
</Button> </Button>
); );
const content = ( const content = (
@ -565,7 +569,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 +590,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("_", " ")}
@ -636,7 +640,6 @@ export function GeneralFilterContent({
Apply Apply
</Button> </Button>
<Button <Button
variant="secondary"
onClick={() => { onClick={() => {
setCurrentLabels(undefined); setCurrentLabels(undefined);
updateLabelFilter(undefined); updateLabelFilter(undefined);
@ -664,7 +667,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 +675,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
@ -682,12 +685,11 @@ function ShowMotionOnlyButton({
<div className="block md:hidden"> <div className="block md:hidden">
<Button <Button
size="sm" size="sm"
variant="secondary"
className={`duration-0 ${motionOnlyButton ? "bg-selected hover:bg-selected" : "bg-secondary hover:bg-secondary/80"}`} className={`duration-0 ${motionOnlyButton ? "bg-selected hover:bg-selected" : "bg-secondary hover:bg-secondary/80"}`}
onClick={() => setMotionOnlyButton(!motionOnlyButton)} onClick={() => setMotionOnlyButton(!motionOnlyButton)}
> >
<FaRunning <FaRunning
className={`${motionOnlyButton ? "fill-primary dark:fill-primary-foreground" : "text-muted-foreground"}`} className={`${motionOnlyButton ? "text-background dark:text-primary" : "text-secondary-foreground"}`}
/> />
</Button> </Button>
</div> </div>

View File

@ -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>

View File

@ -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":

View File

@ -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" />

View File

@ -119,14 +119,13 @@ export default function ExportDialog({
<Trigger asChild> <Trigger asChild>
<Button <Button
className="flex items-center gap-2" className="flex items-center gap-2"
variant="secondary"
size="sm" size="sm"
onClick={() => { onClick={() => {
setMode("select"); setMode("select");
}} }}
> >
<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
@ -374,7 +373,7 @@ function CustomTimeSelector({
return ( return (
<div <div
className={`mt-3 flex items-center bg-secondary rounded-lg ${isDesktop ? "mx-8 px-2 gap-2" : "pl-2"}`} className={`mt-3 flex items-center bg-secondary text-secondary-foreground rounded-lg ${isDesktop ? "mx-8 px-2 gap-2" : "pl-2"}`}
> >
<FaCalendarAlt /> <FaCalendarAlt />
<Popover <Popover
@ -387,8 +386,8 @@ function CustomTimeSelector({
> >
<PopoverTrigger asChild> <PopoverTrigger asChild>
<Button <Button
className={isDesktop ? "" : "text-xs"} className={`text-primary ${isDesktop ? "" : "text-xs"}`}
variant={startOpen ? "select" : "secondary"} variant={startOpen ? "select" : "default"}
size="sm" size="sm"
onClick={() => { onClick={() => {
setStartOpen(true); setStartOpen(true);
@ -438,7 +437,7 @@ function CustomTimeSelector({
/> />
</PopoverContent> </PopoverContent>
</Popover> </Popover>
<FaArrowRight className="size-4" /> <FaArrowRight className="size-4 text-primary" />
<Popover <Popover
open={endOpen} open={endOpen}
onOpenChange={(open) => { onOpenChange={(open) => {
@ -449,8 +448,8 @@ function CustomTimeSelector({
> >
<PopoverTrigger asChild> <PopoverTrigger asChild>
<Button <Button
className={isDesktop ? "" : "text-xs"} className={`text-primary ${isDesktop ? "" : "text-xs"}`}
variant={endOpen ? "select" : "secondary"} variant={endOpen ? "select" : "default"}
size="sm" size="sm"
onClick={() => { onClick={() => {
setEndOpen(true); setEndOpen(true);

View File

@ -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">

View File

@ -23,7 +23,7 @@ export default function MobileCameraDrawer({
return ( return (
<Drawer open={cameraDrawer} onOpenChange={setCameraDrawer}> <Drawer open={cameraDrawer} onOpenChange={setCameraDrawer}>
<DrawerTrigger asChild> <DrawerTrigger asChild>
<Button className="rounded-lg capitalize" size="sm" variant="secondary"> <Button className="rounded-lg capitalize" size="sm">
<FaVideo className="text-secondary-foreground" /> <FaVideo className="text-secondary-foreground" />
</Button> </Button>
</DrawerTrigger> </DrawerTrigger>

View File

@ -146,19 +146,23 @@ 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 ${filter?.after ? "bg-selected text-background dark:text-primary" : ""}`}
onClick={() => setDrawerMode("calendar")} onClick={() => setDrawerMode("calendar")}
> >
<FaCalendarAlt className="fill-secondary-foreground" /> <FaCalendarAlt
className={`${filter?.after ? "text-background dark:text-primary" : "text-secondary-foreground"}`}
/>
Calendar Calendar
</Button> </Button>
)} )}
{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 ${filter?.labels ? "bg-selected text-background dark:text-primary" : ""}`}
onClick={() => setDrawerMode("filter")} onClick={() => setDrawerMode("filter")}
> >
<FaFilter className="fill-secondary-foreground" /> <FaFilter
className={`${filter?.labels ? "text-background dark:text-primary" : "text-secondary-foreground"}`}
/>
Filter Filter
</Button> </Button>
)} )}
@ -220,7 +224,6 @@ export default function MobileReviewSettingsDrawer({
<SelectSeparator /> <SelectSeparator />
<div className="p-2 flex justify-center items-center"> <div className="p-2 flex justify-center items-center">
<Button <Button
variant="secondary"
onClick={() => { onClick={() => {
onUpdateFilter({ onUpdateFilter({
...filter, ...filter,
@ -280,12 +283,13 @@ export default function MobileReviewSettingsDrawer({
> >
<DrawerTrigger asChild> <DrawerTrigger asChild>
<Button <Button
className="rounded-lg capitalize" className={`rounded-lg capitalize ${filter?.labels || filter?.after ? "bg-selected hover:bg-selected" : "bg-secondary hover:bg-secondary/80"}`}
size="sm" size="sm"
variant="secondary"
onClick={() => setDrawerMode("select")} onClick={() => setDrawerMode("select")}
> >
<FaCog className="text-secondary-foreground" /> <FaCog
className={`${filter?.labels || filter?.after ? "text-background dark:text-primary" : "text-secondary-foreground"}`}
/>
</Button> </Button>
</DrawerTrigger> </DrawerTrigger>
<DrawerContent className="max-h-[80dvh] overflow-hidden flex flex-col items-center gap-2 px-4 pb-4 mx-1 rounded-t-2xl"> <DrawerContent className="max-h-[80dvh] overflow-hidden flex flex-col items-center gap-2 px-4 pb-4 mx-1 rounded-t-2xl">

View File

@ -22,7 +22,7 @@ export default function MobileTimelineDrawer({
return ( return (
<Drawer open={drawer} onOpenChange={setDrawer}> <Drawer open={drawer} onOpenChange={setDrawer}>
<DrawerTrigger asChild> <DrawerTrigger asChild>
<Button className="rounded-lg capitalize" size="sm" variant="secondary"> <Button className="rounded-lg capitalize" size="sm">
<FaFlag className="text-secondary-foreground" /> <FaFlag className="text-secondary-foreground" />
</Button> </Button>
</DrawerTrigger> </DrawerTrigger>

View File

@ -31,9 +31,8 @@ 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"
onClick={onCancel} onClick={onCancel}
> >
<LuX /> <LuX />

View File

@ -44,9 +44,7 @@ export default function VainfoDialog({
<ActivityIndicator /> <ActivityIndicator />
)} )}
<DialogFooter> <DialogFooter>
<Button variant="secondary" onClick={() => setShowVainfo(false)}> <Button onClick={() => setShowVainfo(false)}>Close</Button>
Close
</Button>
<Button variant="select" onClick={() => onCopyVainfo()}> <Button variant="select" onClick={() => onCopyVainfo()}>
Copy Copy
</Button> </Button>

View File

@ -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 z-50 bg-background/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">
@ -170,9 +170,9 @@ export default function VideoControls({
)} )}
<div className="cursor-pointer" onClick={onTogglePlay}> <div className="cursor-pointer" onClick={onTogglePlay}>
{isPlaying ? ( {isPlaying ? (
<LuPause className="size-5 fill-primary-foreground dark:fill-white" /> <LuPause className="size-5 text-primary fill-primary" />
) : ( ) : (
<LuPlay className="size-5 fill-primary-foreground dark:fill-white" /> <LuPlay className="size-5 text-primary fill-primary" />
)} )}
</div> </div>
{features.seek && ( {features.seek && (

View File

@ -355,7 +355,7 @@ export function SummaryTimeline({
ref={visibleSectionRef} ref={visibleSectionRef}
onMouseDown={handleMouseDown} onMouseDown={handleMouseDown}
onTouchStart={handleMouseDown} onTouchStart={handleMouseDown}
className={`bg-primary-foreground/30 z-20 absolute w-full touch-none ${ className={`bg-primary/30 z-20 absolute w-full touch-none ${
isDragging ? "cursor-grabbing" : "cursor-grab" isDragging ? "cursor-grabbing" : "cursor-grab"
}`} }`}
></div> ></div>

View File

@ -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",

View File

@ -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 };

View File

@ -9,14 +9,13 @@ const buttonVariants = cva(
{ {
variants: { variants: {
variant: { variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90", default: "bg-secondary text-primary hover:bg-secondary/80",
select: "bg-selected text-white hover:bg-opacity-90", select: "bg-selected text-white hover:bg-opacity-90",
destructive: destructive:
"bg-destructive text-destructive-foreground hover:bg-destructive/90", "bg-destructive text-destructive-foreground hover:bg-destructive/90",
outline: outline:
"border border-input bg-background hover:bg-accent hover:text-accent-foreground", "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
secondary: secondary: "bg-primary text-primary-foreground hover:bg-primary/90",
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost: ghost:
"text-muted-foreground hover:bg-accent hover:text-accent-foreground", "text-muted-foreground hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline", link: "text-primary underline-offset-4 hover:underline",
@ -33,7 +32,7 @@ const buttonVariants = cva(
variant: "default", variant: "default",
size: "default", size: "default",
}, },
} },
); );
export interface ButtonProps export interface ButtonProps
@ -52,7 +51,7 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
{...props} {...props}
/> />
); );
} },
); );
Button.displayName = "Button"; Button.displayName = "Button";

View File

@ -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}

View File

@ -356,11 +356,10 @@ function Logs() {
<Button <Button
className="flex justify-between items-center gap-2" className="flex justify-between items-center gap-2"
size="sm" size="sm"
variant="secondary"
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>
@ -373,8 +372,7 @@ function Logs() {
{initialScroll && !endVisible && ( {initialScroll && !endVisible && (
<Button <Button
className="absolute bottom-8 left-[50%] -translate-x-[50%] rounded-md text-primary-foreground bg-secondary-foreground z-20 p-2" className="absolute bottom-8 left-[50%] -translate-x-[50%] rounded-md text-primary bg-secondary-foreground z-20 p-2"
variant="secondary"
onClick={() => onClick={() =>
contentRef.current?.scrollTo({ contentRef.current?.scrollTo({
top: contentRef.current?.scrollHeight, top: contentRef.current?.scrollHeight,
@ -386,8 +384,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

View File

@ -237,9 +237,9 @@ function PlusFilterGroup({
}} }}
> >
<Trigger asChild> <Trigger asChild>
<Button size="sm" className="mx-1 capitalize" variant="secondary"> <Button size="sm" className="mx-1 capitalize">
<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`}
@ -314,9 +314,9 @@ function PlusFilterGroup({
}} }}
> >
<Trigger asChild> <Trigger asChild>
<Button size="sm" className="mx-1 capitalize" variant="secondary"> <Button size="sm" className="mx-1 capitalize">
<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`}

View File

@ -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

View File

@ -254,11 +254,10 @@ export function RecordingView({
<Button <Button
className="flex items-center gap-2 rounded-lg" className="flex items-center gap-2 rounded-lg"
size="sm" size="sm"
variant="secondary"
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

View File

@ -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 />

View File

@ -226,18 +226,14 @@ export default function LiveCameraView({ camera }: LiveCameraViewProps) {
<Button <Button
className={`flex items-center gap-2.5 rounded-lg`} className={`flex items-center gap-2.5 rounded-lg`}
size="sm" size="sm"
variant="secondary"
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"
size="sm" size="sm"
variant="secondary"
onClick={() => { onClick={() => {
navigate("events", { navigate("events", {
state: { state: {
@ -252,9 +248,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 +516,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 />

View File

@ -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`}

View File

@ -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
@ -349,7 +349,6 @@ export default function GeneralMetrics({
{canGetGpuInfo && ( {canGetGpuInfo && (
<Button <Button
className="cursor-pointer" className="cursor-pointer"
variant="secondary"
size="sm" size="sm"
onClick={() => setShowVainfo(true)} onClick={() => setShowVainfo(true)}
> >
@ -359,7 +358,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 +376,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 +402,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 +420,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

View File

@ -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`}

View File

@ -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: {

View File

@ -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 17.4% 36.2%);
--secondary-foreground: 0 0% 70%; --secondary-foreground: 222.2 17.4% 36.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,11 +115,11 @@
--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%, 9%);
--primary-foreground: 0 0% 100%; --primary-foreground: 0 0% 9%;
--secondary: hsl(0, 0%, 15%); --secondary: hsl(0, 0%, 15%);
--secondary: 0 0% 15%; --secondary: 0 0% 15%;