From a573ea49bffb0a8a6dcd4cc83db01aaf409bd4e6 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Fri, 24 Jul 2026 16:15:58 -0500 Subject: [PATCH] update icons and i18n for 2026.2 frigate+ labels (#23803) --- web/public/locales/en/objects.json | 4 ++- web/src/components/icons/SkunkIcon.tsx | 39 ++++++++++++++++++++++++++ web/src/utils/iconUtil.tsx | 26 +++++++++++++++-- 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 web/src/components/icons/SkunkIcon.tsx diff --git a/web/public/locales/en/objects.json b/web/public/locales/en/objects.json index d48f609a13..9d764ae7c1 100644 --- a/web/public/locales/en/objects.json +++ b/web/public/locales/en/objects.json @@ -125,5 +125,7 @@ "baby": "Baby", "baby_stroller": "Baby Stroller", "rickshaw": "Rickshaw", - "rodent": "Rodent" + "rodent": "Rodent", + "possum": "Possum", + "garbage_truck": "Garbage Truck" } diff --git a/web/src/components/icons/SkunkIcon.tsx b/web/src/components/icons/SkunkIcon.tsx new file mode 100644 index 0000000000..6148b2733a --- /dev/null +++ b/web/src/components/icons/SkunkIcon.tsx @@ -0,0 +1,39 @@ +import { SVGProps } from "react"; + +/** + * Skunk silhouette for the `skunk` object label. + * + * react-icons has no skunk in any of its packs. The usable stand-ins are + * either squirrels, which are indistinguishable from the `squirrel` label, or + * animals such as porcupine and hedgehog that are themselves Frigate+ + * candidate labels. + * + * Adapted from "skunk silhouette" by dear_theophilus, published by Openclipart + * and released into the public domain, which permits reproduction, + * distribution and derivative works: + * https://openclipart.org/detail/170808/skunk-silhouette-by-dear_theophilus-170808 + * + * Changes from the original: the unused Inkscape text region was dropped, the + * layer translate was folded into the viewBox, the viewBox was padded to give + * the same optical margin as the surrounding react-icons, and the fill was + * switched to currentColor. The white back stripe is negative space in a + * single path under the default nonzero fill rule, so no fill-rule override is + * needed here. + * + * Sized to sit alongside the react-icons set: currentColor fill and a 1em + * default box. + */ +export default function SkunkIcon(props: SVGProps) { + return ( + + + + ); +} diff --git a/web/src/utils/iconUtil.tsx b/web/src/utils/iconUtil.tsx index 04324aabe2..88fe1b40d4 100644 --- a/web/src/utils/iconUtil.tsx +++ b/web/src/utils/iconUtil.tsx @@ -1,9 +1,12 @@ import { IconName } from "@/components/icons/IconPicker"; +import SkunkIcon from "@/components/icons/SkunkIcon"; import { FrigateConfig } from "@/types/frigateConfig"; import { EventType } from "@/types/search"; import { BsPersonWalking } from "react-icons/bs"; import { FaAmazon, + FaBaby, + FaBabyCarriage, FaBicycle, FaBus, FaCarSide, @@ -24,6 +27,8 @@ import { FaUsps, } from "react-icons/fa"; import { + GiBarbecue, + GiCow, GiDeer, GiFox, GiGoat, @@ -32,7 +37,9 @@ import { GiPostStamp, GiRabbit, GiRaccoonHead, + GiRat, GiSailboat, + GiSeatedMouse, GiSoundWaves, GiSquirrel, } from "react-icons/gi"; @@ -40,6 +47,7 @@ import { LuBox, LuLassoSelect, LuScanBarcode } from "react-icons/lu"; import * as LuIcons from "react-icons/lu"; import { MdRecordVoiceOver } from "react-icons/md"; import { PiBirdFill } from "react-icons/pi"; +import { HiMiniTruck } from "react-icons/hi2"; export function getAttributeLabels(config?: FrigateConfig) { if (!config) { @@ -74,6 +82,12 @@ export function getIconForLabel( switch (label) { // objects + case "baby": + return ; + case "baby_stroller": + return ; + case "bbq_grill": + return ; case "bear": return ; case "bicycle": @@ -90,6 +104,8 @@ export function getIconForLabel( return ; case "cat": return ; + case "cow": + return ; case "deer": return ; case "animal": @@ -98,6 +114,8 @@ export function getIconForLabel( return ; case "fox": return ; + case "garbage_truck": + return ; case "goat": return ; case "horse": @@ -114,18 +132,22 @@ export function getIconForLabel( return ; case "person": return ; + case "possum": + return ; case "rabbit": return ; case "raccoon": return ; case "robot_lawnmower": return ; + case "rodent": + return ; case "sports_ball": return ; case "skunk": - return ; + return ; case "squirrel": - return ; + return ; case "umbrella": return ; case "waste_bin":