# Hack Cove UI
> An opinionated UI library that is fully integrated with its theming.
Hack Cove UI is strict on purpose. It fixes the look and feel, so a site built with it, by people or by agents, looks good every time. It is not an extensible framework with every option.
The components and the themes are designed together. Every theme remaps every palette utility the components use, and the library's tests enforce it for each theme. Switching theme reskins a whole site with no component change, and there is nothing to configure.
The aim is a site built only from Hack Cove components, configured through props, with no custom CSS or Tailwind.
Every component has one right way to use it. There are no extension recipes and no styling escape hatches: do not restyle a component, compose the parts.
## AppShell
Group: Layout
When to use: Every page of an app sits in one `AppShell`; it is the only place the page canvas, the font and the header live.
### The one right way
`AppShellBrand` makes the logo and the label one link, so the whole brand is the way home; `collapse` leaves only the logo below `sm`.
```tsx
import { Avatar, AppShellBrand } from "@hackcove/ui";
} label="Quotes" collapse />
```
### Do
- Fill the slots and write no wrapper: `brand`, `nav` (a `NavTabs`), `controls` (a picker, a `ColourSchemeToggle`), then an optional `subnav` row and `footer`.
- `brand` is an `AppShellBrand`: logo and label in one link. `collapse` leaves only the logo below `sm`.
- With a router, give `AppShellBrand` a `render` that draws the app's own `` instead of an `href`.
- Header, main and footer each sit in a `Container`, so a page never sets its own width or padding. Do not add a `Container` inside the shell.
- `bleed` drops main's `Container` for a layout that needs the whole width (`FullBleedLayout`); `SidebarLayout` needs no `bleed`.
- `hideChromeInPrint` hides the header and footer and main's padding on paper; screen is unchanged.
- `header` is for a node no other slot covers. Prefer `brand`, `nav` and `controls`.
- Put `appShellRootClassFor(scheme)` on the app's own ``. `AppShell` never touches ``.
- A theme sets the canvas colour and the font; the app writes no page background or font rule.
### Don't
A logo and a name as two separate links are two targets, and the logo link has no name. Put both in `AppShellBrand`.
```tsx
import { Avatar, Cluster, TextLink } from "@hackcove/ui";
Quotes
```
### Accessibility
- The header is a `` (the banner landmark), main is `` and the footer is `