dock: Calendar and Contacts carry their artwork, not a glyph

Both were redrawn to the icon brief today, so the dock shows the same voxel mark
the phone apps do rather than a lucide CalendarDays and Contact.

tile: 'bare' for the same reason a plugin's artwork gets it — the art brings its
own frame, and a coloured square behind it reads as a mistake. color stays
because the active glow, the indicator dot and the settings tint all still use
it.

These two are core rather than plugins, so the files live in public/icons/
alongside the duck rather than arriving through publishAssets.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 07:48:26 +01:00
co-authored by Claude Opus 5
parent 3ef078210a
commit 839199bf53
3 changed files with 7 additions and 4 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

@@ -155,8 +155,6 @@ import {
Store, Store,
Puzzle, Puzzle,
Radar, Radar,
CalendarDays,
Contact,
} from 'lucide-react'; } 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 // 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 // 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. // 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 // 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'`, // 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. // and DashboardLayout filters every tile through canVisit(), so a member never sees this one.