mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-21 19:07:46 +01:00
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:
parent
c08a198354
commit
ef52a1d6f0
@ -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">
|
||||||
|
@ -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) {
|
||||||
|
@ -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)}
|
||||||
>
|
>
|
||||||
|
@ -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("_", " ")}
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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" />
|
||||||
|
@ -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);
|
||||||
|
@ -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">
|
||||||
|
@ -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>
|
||||||
|
@ -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">
|
||||||
|
@ -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>
|
||||||
|
@ -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 />
|
||||||
|
@ -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>
|
||||||
|
@ -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 && (
|
||||||
|
@ -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>
|
||||||
|
@ -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 };
|
||||||
|
@ -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";
|
||||||
|
|
||||||
|
@ -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}
|
||||||
|
@ -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
|
||||||
|
@ -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`}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 />
|
||||||
|
@ -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 />
|
||||||
|
@ -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
|
||||||
@ -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
|
||||||
|
@ -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 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%;
|
||||||
|
Loading…
Reference in New Issue
Block a user