# Changelog ## 0.11.0 1. **Run an app inside the terminal.** `terminal: true` renders into the current terminal instead of a native window, on macOS and Linux. `GPUIX_TERMINAL=1` turns it on without a code change. ```tsx render(, { terminal: true }) ``` Frames render offscreen and are shown with the kitty graphics protocol, in kitty and Ghostty. On the same machine they go through shared memory. Over SSH each frame is sent inline, zlib compressed, with at most two frames in flight so input stays responsive. Mouse, hover, scroll, keyboard with key-up, paste, focus and resize all reach the app. ctrl-c quits, also from a focused text field. The terminal is restored on quit, SIGTERM, SIGINT, a native panic and `process.exit()`. `isTerminal()`, exported by `@gpuix/react` and `@gpuix/solid`, tells an app it runs in a terminal, so it can drop the space reserved for the macOS traffic lights. See [Run in a terminal](./README.md#run-in-a-terminal). 2. **Add a headless `Dialog`, and make Escape close only the top overlay.** Same parts as Base UI: ```tsx import * as Dialog from '@gpuix/react/dialog' // or '@gpuix/solid/dialog' Settings Settings Done ``` - `Portal` is a full-window deferred layer, so the dialog paints over ``. A modal dialog blocks clicks and the wheel behind it - The popup takes focus on open, keeps Tab inside while modal, and returns focus on close. `initialFocus` and `finalFocus` take `true`, `false`, a ref or element, or a function returning one. Without a `Trigger`, focus returns to the element focused when the popup opened - A press on `Backdrop` closes it, unless `disablePointerDismissal` is set Escape now runs on one layer stack per window. Every open Dialog, Select, Combobox and Tooltip is a layer, and Escape closes only the most recent one, so a Select inside a Dialog closes first. `event.preventDefault()` in any `onKeyDown` keeps the layer open. Custom overlays join with ``, or `pushDismissLayer(renderer, layer)` without a framework. `` covers the whole window and follows a resize in the same frame. An `` with an explicit `backgroundColor: "transparent"` now paints no fill. 3. **Tab and Shift+Tab move focus by default**, like a browser. Any `onKeyDown` can cancel it: ```tsx
{ if (event.key !== 'tab') return event.preventDefault() // keep this Tab, for example to indent insertIndent() }} /> ``` - `event.preventDefault()` cancels the focus move, `event.stopPropagation()` skips ancestor and window `onKeyDown` handlers, `event.defaultPrevented` reports an earlier `preventDefault()` - `render(, { tabNavigation: false })` turns the default off - every key event has a `keystrokeId`, shared by all events of one keystroke - Tab no longer types a tab character into `` or `