# 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 The full library is now vendored locally at repo-root `penguinui-components/` (177 component `.html` files, moved there 2026-06-18). Read components from there — **NO** network/curl/WebFetch needed anymore. ### HARD RULE — read-only, never edit `penguinui-components/` is a read-only third-party library, **NOT our code**. Never edit, never `{% include %}`, never adapt in place. It is reference only; **copy markup OUT** of it and adapt at the use-site. When a Penguin UI component can replace a handcoded one: 1. Find the component in the local `penguinui-components/` directory. 2. Copy its markup **out** into the appropriate `assets/views/` location, adapting it where used (strip docs-only demo triggers, fix obvious upstream bugs, wire data bindings, map Penguin classes to our design tokens). Note the deviations in a comment next to the adapted copy. 3. Keep the original `penguinui-components/` file **untouched** — it stays as a byte-for-byte reference snapshot. 4. Rebuild Tailwind (`make css`) so any new utility classes get compiled. 5. Mark the section below as ✅ **DONE**. ### Why it's at repo root + the build guard Moved OUT of `assets/views/` to repo root because Tailwind v4 auto-detects sources from the project root — so `assets/css/app.css` carries `@source not "../../penguinui-components";` to explicitly exclude it from the build. If the build ever balloons, check that exclusion is intact. --- ## 0. Toast — ✅ DONE **Penguin UI: `toast-notification/stacking-toast-notification.html`** - Exact upstream mirror at `penguinui-components/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` — `