# kitchen-ui
The shared UI of the neuro-kitchen apps, for desktop apps built on
[GPUI](https://www.gpui.rs) through [gpui-kit](https://crates.io/crates/gpui-kit):
- **Design tokens**:
- spacing on an 8 px grid;
- a type scale on a 15 px base;
- radii by size and gaps between panes;
- plain grey neutrals for light and dark themes, plus status colours.
- **Accents**:
- each app supplies a default palette (`Palette::LIME`, `Palette::EOSIN`, or its own);
- the user can pick any colour instead. `Palette::from_rgb` keeps its hue and changes only its
lightness until text, fills and marks pass WCAG contrast in both themes (in the dark theme it
also makes the colour less saturated).
- **Widgets**: accent picker, titled section, labelled row (the control drops under its label
when the panel is narrow), slider, dropdown, stepper, dragged number, colour swatch, empty
state, icon button.
- **Text views**:
- `CodeView`: code in gpui-kit's editor (line numbers, Rust, Python and JSON highlighting,
current line, selection and copy), read-only or editable, errors marked on their lines;
- `DiffView`: a git-style diff of two texts (old and new line numbers, hunks, unchanged runs
folded), or of two JSON documents compared by key with long arrays as one summary line;
optional Accept / Reject per hunk for reviewing a proposed change (`diff` holds the model);
- `TextView`: wrapped, selectable light markdown (headings, `code`, lists, fenced code).
- **Chat pane** (`chat::ChatPane`): an agent conversation (user, agent and tool-call rows, agent
text streaming in) and a prompt box with context chips. It holds no agent: it emits `Send` and
`Stop`, the app pushes messages in, and the conversation is plain serializable data.
- **Parameter editor**: edits any op that serialises to a JSON object. Numbers become inputs,
choices become menus and switches become checkboxes.
- **Icons**:
- `AppAssets` ships gpui-kit's icons plus the ones an app adds;
- `assert_icons_bundled` is a test helper that scans an app's sources for every icon name it
uses (aliases included) and fails if any of them is not shipped.
## Usage
```rust,ignore
use kitchen_ui::theme::{self, Look, Palette, Rgb};
use kitchen_ui::widgets::{row, slider, Section};
gpui_kit::application().with_assets(kitchen_ui::icons::AppAssets::new()).run(|cx| {
gpui_kit::init(cx);
// The app's palette, or the colour the user picked (saved in their preferences)
let accent: Option<Rgb> = None;
theme::use_look(Look::new(Palette::LIME).with_accent(accent), cx);
// open windows with gpui_kit::open_window(…)
});
// In a view's render: