eleven / messenger Public

Clone
git clone https://amadan.net/eleven/messenger

Plain git — no account needed to clone.

Download

Download this file

1# πŸ€– Icons β€” one system across web and native
2
3Three kinds of mark, three sources, one rule about emoji.
4
5## The three kinds
6
71. **UI chrome** (carets, the kebab, message actions, app marks for
8 first-party apps): **Lucide** on web (https://lucide.dev, ISC β€” vendored,
9 never a CDN), **SF Symbols** on iOS/Mac (built into Apple platforms;
10 their license keeps them off the web, which is why one literal library
11 everywhere isn't possible). The table below keeps the two in step.
122. **Brand marks** (the integration apps): real logos, vendored monochrome in
13 `web/static/logos.js` β€” Simple Icons (CC0) where available, an official
14 asset otherwise (DNSimple's mask icon β€” note it needs
15 `fill-rule="evenodd"` or the knockout fills solid). Brands have no SF
16 Symbols; native gets the same SVGs as template images in the asset
17 catalogs, tinted like SF.
183. **Emoji** β€” **content, never chrome.** An emoji is right where a person or
19 a model *chose* it: a member bot's title ("RTE News Hourly πŸ“Ί"), a member
20 app's glyph, a view's glyph, reactions. Interface furniture never uses
21 emoji. Every first-party app still declares an emoji `glyph` β€” it is the
22 cross-surface fallback (native command palette, string contexts) β€” but
23 web surfaces render its `logo`.
24
25## How it's wired (web)
26
27- `web/static/icons.js` β€” every chrome icon as a static in-code SVG string
28 (24Γ—24 viewBox, `currentColor`, stroke idiom). Only ever injected via
29 `innerHTML` with these constants β€” never user content.
30- `web/static/logos.js` β€” the brand marks, same shape.
31- Apps carry `logo:` beside `glyph:` in `defineApp`; `appGlyphInto(el, app)`
32 (apps.js) renders logo-else-glyph everywhere app identity draws.
33- The Views button's caret is the one inline SVG in `web/pages/index.html`
34 (static markup; same chevron as `ICON_CHEVRON_DOWN`).
35
36**Adding an icon** = vendor the Lucide SVG into `icons.js` (keep the
37`(Lucide: <slug>)` comment), add a row here with its SF Symbol, use it.
38
39## The mapping
40
41| Meaning | icons.js (Lucide slug) | SF Symbol (native) |
42|---|---|---|
43| Reply | `ICON_REPLY` (hand-drawn, pre-Lucide) | `arrowshape.turn.up.left` |
44| Close / dismiss | `ICON_X` | `xmark` |
45| Edit | `ICON_EDIT` | `pencil` |
46| React | `ICON_REACT` | `face.smiling` |
47| Delete | `ICON_TRASH` | `trash` |
48| Play | `ICON_PLAY` | `play.fill` |
49| Pinned chat | `ICON_PIN` | `pin.fill` |
50| Muted chat | `ICON_MUTE` | `bell.slash` |
51| Report | `ICON_REPORT` | `flag` |
52| Copy | `ICON_COPY` | `doc.on.doc` |
53| Dropdown caret | `ICON_CHEVRON_DOWN` (chevron-down) | `chevron.down` |
54| Back | `ICON_CHEVRON_LEFT` (chevron-left) | `chevron.left` |
55| Kebab | `ICON_MORE_VERTICAL` (ellipsis-vertical) | `ellipsis` |
56| Memory | `ICON_BRAIN` (brain) | `brain` |
57| To-do | `ICON_SQUARE_CHECK` (square-check) | `checkmark.square` |
58| Reminders | `ICON_ALARM_CLOCK` (alarm-clock) | `alarm` |
59| Bookmarks | `ICON_BOOKMARK` (bookmark) | `bookmark` |
60| Poll | `ICON_CHART_COLUMN` (chart-column) | `chart.bar` |
61| Board | `ICON_PRESENTATION` (presentation) | `rectangle.on.rectangle` |
62| Vault | `ICON_LOCK` (lock) | `lock` |
63| Emoji picker | `ICON_SMILE` (smile) | `face.smiling` |
64| GIF | `ICON_FILM` (film) | `film` |
65| Admin | `ICON_WRENCH` (wrench) | `wrench.adjustable` |
66| App Studio | `ICON_PUZZLE` (puzzle) | `puzzlepiece` |
67
68Brand marks (`logos.js`): GitHub, DNSimple, Stripe, HubSpot, Linear
69(awaiting the linear app), plus Lucide's `plug` for the Integrations app
70itself (a capability, not a brand).
71
72## Native status
73
74Built (`ios/LChatCore/Sources/LChatCore/AppIdentity.swift`): the appId β†’
75SF-Symbol map above plus the brand marks as vendored template PNGs in
76`LChatCore/Marks/` (the same SVGs as `logos.js`, rasterized
77black-on-transparent at 96px, tinted at render β€” regenerate with resvg,
78remembering the vendored strings need an `xmlns` added). Wired into both
79platforms' avatar ladders (photo β†’ mark β†’ symbol β†’ glyph β†’ initials): the
80iOS thread list/search/share rows, the Mac sidebar, rail, feed header,
81search, ⌘K palette, and both New-chat pickers. The old "β–¦" placeholder is
82gone β€” unmapped apps get `square.grid.2x2`. Device verify + the release
83changelog ride the next native release mint.
84