diff --git a/public/icons/calendar.png b/public/icons/calendar.png new file mode 100644 index 00000000..806fe7dc Binary files /dev/null and b/public/icons/calendar.png differ diff --git a/public/icons/contacts.png b/public/icons/contacts.png new file mode 100644 index 00000000..873ec321 Binary files /dev/null and b/public/icons/contacts.png differ diff --git a/src/apps/officer-web/Screens/Dashboard/Layout/Dock.tsx b/src/apps/officer-web/Screens/Dashboard/Layout/Dock.tsx index 57f255a8..0abf1714 100644 --- a/src/apps/officer-web/Screens/Dashboard/Layout/Dock.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Layout/Dock.tsx @@ -155,8 +155,6 @@ import { Store, Puzzle, Radar, - CalendarDays, - Contact, } from 'lucide-react'; /** @@ -187,8 +185,13 @@ export const CORE_DOCK_ITEMS: DockItem[] = [ // contacts became core, and deleting that entry took their tiles with it — the routes kept working // while the dock and the settings list went silent about them, which is exactly the shape of failure // this file's comment above warns about, arrived at from the other direction. - { label: 'Calendar', to: '/calendar', icon: CalendarDays, color: '#ef4444' }, - { label: 'Contacts', to: '/contacts', icon: Contact, color: '#8b5cf6' }, + // + // Artwork rather than glyphs since 2026-08-19: both were redrawn to the icon brief, so they carry + // the same voxel mark the phone apps show. `tile: 'bare'` for the same reason a plugin's artwork + // does — the art brings its own frame, and a coloured square behind it reads as a mistake. `color` + // still earns its place: the active glow, the indicator dot and the settings tint all use it. + { label: 'Calendar', to: '/calendar', image: '/icons/calendar.png', tile: 'bare', color: '#ef4444' }, + { label: 'Contacts', to: '/contacts', image: '/icons/contacts.png', tile: 'bare', color: '#8b5cf6' }, // Core because the tailnet is the perimeter — origin checking was removed on the grounds that the // tailnet stands in its place, so administering it cannot be an optional extra. It is `kind: 'admin'`, // and DashboardLayout filters every tile through canVisit(), so a member never sees this one.