# 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 — PENDING **Penguin UI: `navbar/`** > **Priority: MEDIUM** | ~143 lines across2 sites. > Penguin match: `navbar/default-navbar.html` — provides mobile-responsive structure, > hamburger animation, and link treatment that would replace our hand-rolled `