# Handcoded UI Components — Penguin UI Replacement Index > **Scope**: Every handcoded UI component. > Each item maps to a [Penguin UI](https://github.com/SalarHoushvand/penguinui-components/tree/main) component that duplicates the same purpose with fewer lines and better accessibility. ## Vendoring convention When a Penguin UI component can replace a handcoded one, we vendor its source and then use it (instead of hand-rolling): 1. Copy the component's source **byte-for-byte** from the [Penguin UI repo](https://github.com/SalarHoushvand/penguinui-components/tree/main) into `assets/views/penguinui/`, **mirroring the upstream repo hierarchy** (e.g. `toast-notification/stacking-toast-notification.html`). This directory is reserved exclusively for vendored Penguin UI components and is kept an **exact, unmodified mirror** of upstream — demo triggers, bugs and all. It's a reference, not the rendered markup. 2. Adapt it where it's actually used (strip docs-only demo triggers, fix obvious upstream bugs, wire data bindings). Note the deviations in a comment next to the adapted copy. 3. Rebuild Tailwind (`make css`) so any new utility classes get compiled. 4. Mark the section below as ✅ **DONE**. --- ## 0. Toast — ✅ DONE **Penguin UI: `toast-notification/stacking-toast-notification.html`** - Exact upstream mirror at `assets/views/penguinui/toast-notification/stacking-toast-notification.html` (reference only) - Adapted/rendered copy lives inline in `assets/views/base.html` (demo triggers removed; the upstream dismiss-button `` quote bugs fixed) - The global `toast('message')` JS helper now dispatches the component's `notify` event (`{ variant: 'success', message }`), so existing callsites (`shop/show.html`, `shop/_card.html`) keep working unchanged. --- ## 1. Navbar **Penguin UI: `navbar/`** | # | Location | What it is | Size | |---|----------|------------|------| | 1 | `assets/views/base.html:63-191` | Full site navbar: brand, desktop nav links, cart icon+badge, settings dropdown, mobile hamburger → mobile panel | ~130 lines | | 2 | `assets/views/admin/base.html:102-114` | Admin top bar: hamburger toggle + breadcrumb text | ~13 lines | **Details for #1 (site navbar):** - **Brand/logo**: `base.html:74-77` — plain `` with text - **Desktop nav links**: `base.html:80-92` — `