UI and visual conventions for the admin interface. Read this when working on ActiveAdmin show pages, forms, dashboards, or any view code.
Both panel and f.inputs support the icon: option:
panel "Title", icon: "icon-name" do
# ...
end
f.inputs "Title", icon: "icon-name" do
f.input :field
endIcons render at half opacity (opacity-50) at size-5 — a muted visual cue, not a distraction.
Only titled fieldsets get icons — bare f.inputs do blocks (no title string) should never receive an icon.
When a fieldset has extra options, place icon: before them:
f.inputs "Title", icon: "icon-name", data: { controller: "..." } do
f.inputs "Title", icon: "icon-name", "data-controller" => "..." doUse the same icon for the same concept everywhere (panels, fieldsets, nav).
All icons are sourced from Lucide, stored as SVGs in
app/assets/images/icons/. Two custom exceptions are noted below.
The panel icon for a concept must match the nav icon when one exists.
| Concept | Icon Name | Nav | Notes |
|---|---|---|---|
| Member | users |
✓ | Plural for collections |
| Membership | calendar-range |
✓ | |
| Delivery | calendar |
||
| Basket | shopping-bag |
✓ | Paniers nav (basket_content.rb) |
| Shop / Shop Orders | shopping-basket |
✓ | Shop nav (active_admin.rb) |
| Activity | handshake |
✓ | Nav uses same icon |
| Invoice / Billing | banknotes |
✓ | |
| Payment | banknotes |
✓ | Same as above |
| Absence | tent |
||
| Email / Mails | mails |
✓ | Plural; nav uses mail |
| Newsletter | megaphone |
||
| Mail Template | clipboard |
||
| Announcement | megaphone |
Same as newsletter | |
| Bidding Round | scale |
||
| Shares | receipt-text |
||
| Basket Content | sprout |
| Concept | Icon Name | Notes |
|---|---|---|
| Details | notebook-text |
ID, dates, validation info |
| Contact | contact-round |
Name, email, phone, address |
| Billing (panel) | banknotes |
|
| Amount / Pricing | receipt-text |
Monetary breakdown |
| Notes | notepad-text |
Free-text notes |
| Comments | message-square-text |
ActiveAdmin comments |
| Waiting / Pending | clock |
Waiting membership |
| Config / Settings | sliders-horizontal |
Configuration options |
| Renewal | refresh-cw |
Membership renewal |
| Sheets / PDF | file-spreadsheet |
PDF sheet documents |
| Attachments | paperclip |
File attachments |
| Notifications | mail-check |
Email notifications |
| Registration / Form | form |
Member registration form |
| Recipients | users |
Mail recipients list |
| Preview | eye |
Content preview |
| Carpooling | car |
Carpooling info |
| State / Status | circle-check-big |
State/validation info |
| Address / Location | map |
Physical address |
| Overdue Notices | mail-warning |
Overdue/reminder notices |
| Periods | calendar-days |
Delivery cycle periods |
| Information | info |
Info/help text |
| Missing Deliveries | triangle-alert |
Warning/missing data |
| Support | life-buoy |
Help / support |
| Updates | gift |
What's new |
Two icons in app/assets/images/icons/ are not from Lucide:
banknotes— Custom Heroicon (stacked bills). Lucide only has singularbanknote. Used for billing/payment panels and nav.redo-off— Custom icon (redo arrow with slash). Hand-made for "no renewal" state.
- Find the icon on Lucide
- Download the SVG and save to
app/assets/images/icons/{name}.svg - Set
stroke-width="1.5"and remove theclassattribute - Use via
icon("name"),panel "Title", icon: "name", orf.inputs "Title", icon: "name"
- Lucide only — all icons come from Lucide (two custom exceptions noted above)
- 24px / stroke 1.5 — all SVGs use
width="24" height="24"andstroke-width="1.5" - Match nav icons — if a concept has a nav icon, the panel must use the same one
- One icon per concept — same concept = same icon everywhere