Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
a71dbb0
wip: reveal by main's cursor
Maxaubert Oct 11, 2026
f01101e
fix: the pop-out title bar and the collapsed sidebar stay under the hand
Maxaubert Oct 11, 2026
4ee5e7a
fix: the pop-out bar starts at the sidebar's on-screen edge, a slid-o…
Maxaubert Oct 11, 2026
e82dac1
fix: no line under the pop-out title bar
Maxaubert Oct 11, 2026
5621a25
feat: a Secondary colour for the sidebar and title bar, New tab at th…
Maxaubert Oct 11, 2026
bd98e0c
feat: Ctrl+Shift+B opens or collapses the sidebar, and its button goes
Maxaubert Oct 11, 2026
332426d
fix: light themes get a darker secondary colour, 10 percent toward th…
Maxaubert Oct 11, 2026
6438514
feat: sidebar shadow, Help and Settings in the title bar, light theme…
Maxaubert Oct 11, 2026
8353c11
fix: no line at the sidebar's edge, its shadow is the edge
Maxaubert Oct 11, 2026
d8f653c
feat: the title bar and the sidebar merge round the terminal's corner
Maxaubert Oct 11, 2026
e9c2237
fix: the sidebar's shadow falls on the terminal's side only, no seam …
Maxaubert Oct 11, 2026
acb7eec
fix: the dropped title bar's shadow falls below it only, no line alon…
Maxaubert Oct 11, 2026
bd626cc
feat: the sidebar in the terminal's own colour with a hairline, the t…
Maxaubert Oct 11, 2026
536307e
feat: the sidebar looks: find a tab, folder line, New tab at the foot…
Maxaubert Oct 12, 2026
b4478ba
feat: one even sidebar step on every theme, its text held to 7:1
Maxaubert Oct 12, 2026
11d0c18
feat: the app's icon and name at the top of the sidebar
Maxaubert Oct 12, 2026
e271d43
feat: the app's mark in the accent; saves keep the accent's hue, whit…
Maxaubert Oct 12, 2026
db8a7ff
feat: no Show title bar: tabs in the top row, or a bar beside the sid…
Maxaubert Oct 12, 2026
23018f5
feat: fixed tabs only, a line on every tab, a slid-out sidebar that j…
Maxaubert Oct 12, 2026
4a52de6
fix: under See-through, no sidebar edge and a clean terminal corner
Maxaubert Oct 12, 2026
25f1753
docs: the see-through sidebar edge and corner in the vertical tabs spec
Maxaubert Oct 12, 2026
d99a050
fix: the sidebar's edge drawn once on the terminal, a line on black, …
Maxaubert Oct 12, 2026
92393e0
fix: the sidebar ends on a whole screen pixel, so no line shows under…
Maxaubert Oct 12, 2026
3c6ef21
feat: one line round the terminal on every theme, by Panel edges; the…
Maxaubert Oct 12, 2026
e481cbf
fix: the slid-out sidebar covers Settings' search icon
Maxaubert Oct 12, 2026
d90c85b
feat: the app's name in a bar across the window, the sidebar under it
Maxaubert Oct 12, 2026
b9c3fb0
feat: the slid-out sidebar is the window's acrylic under See-through
Maxaubert Oct 12, 2026
a3bda4a
fix: no darker square at the slid-out sidebar's corner under See-through
Maxaubert Oct 12, 2026
7bbea13
fix: one curve for both sides of the sidebar corner, no square line
Maxaubert Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ session comes back when you reopen the app.
|---|---|
| **Agent indicator on every tab** | A tab lights the moment Claude Code or Codex starts working and shows when the answer has landed, a question is waiting, or a turn failed. Pick Minimal, Ring or Full: Ring is one small mark by the name in its own ink (a spinner, a check, a dot or a cross); with Minimal and Full a finished tab wears the app icon's rainbow, flowing. |
| **Two tab styles** | Classic flat tabs, or Powerline: chevron segments whose arrow edge is the agent's mark. `Ctrl+Tab` goes along the strip or back to the tab you used last. |
| **Tabs along the top or down the side** | A sidebar of tabs instead of the strip: kept open beside the terminal and resized at its edge, or collapsed, sliding over the terminal when the pointer reaches the window's left edge. With the title bar off, the window's buttons slide down at the top edge. |
| **Tabs along the top or down the side** | A sidebar of tabs instead of the strip: kept open beside the terminal and resized at its edge, or collapsed, sliding over the terminal when the pointer reaches the window's left edge; `Ctrl+Shift+B` switches between the two. The sidebar runs from the window's top, with the window's buttons in a bar beside it. |
| **Sessions that come back** | Close the app and reopen it: every tab returns in its folder, and agent conversations resume on their own. |
| **Local dictation** | Hold `Right Alt` and speak. [whisper.cpp](https://github.com/ggml-org/whisper.cpp) runs on your PC, offline, and never presses Enter. |
| **Command help** | Press `F1`, describe a task in plain words and copy the command. Works offline. |
Expand Down
18 changes: 18 additions & 0 deletions build/icon-mark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "prism-term-core",
"version": "0.33.0",
"version": "0.33.1",
"description": "What Prism Terminal and Prism share: the terminal (pty, shells, agent detection and indicator, themes, links, the panel, dictation) and the update chip with its window. TypeScript source, compiled by the host.",
"license": "MIT",
"private": true,
Expand Down
6 changes: 5 additions & 1 deletion core/renderer/settings/fields.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,11 @@ export const ROW_BUTTON =

/** The pressed segment: a step lighter than the control round it (darker on a
* light theme), in the text's own ink. */
export const SEGMENT_ON = 'bg-[color-mix(in_srgb,var(--p-text)_16%,var(--p-control))] text-[var(--p-text)]'
// The host may say how a pressed segment reads (Prism Terminal, 2026-10-12: a
// dark pill with light ink on a light theme, where a 16 percent grey on a pale
// control was "a very light gray color for buttons"); unset, the grey as before.
export const SEGMENT_ON =
'bg-[var(--p-pressed,color-mix(in_srgb,var(--p-text)_16%,var(--p-control)))] text-[var(--p-pressed-ink,var(--p-text))]'

/**
* A switch that is on WEARS THE THEME'S ACCENT (#138; owner, 2026-10-07:
Expand Down
22 changes: 17 additions & 5 deletions core/renderer/settings/sections/TerminalThemeSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,27 @@ import { acrylicLabel, acrylicSub, opt, saveSetupTitle, sectionTitle, themeSub }
*/
export function TerminalThemeSection({
afterTheme,
onThemePicked
onThemePicked,
extraDirty = false,
onSaved
}: {
/** The host's own rows that a theme sets, under the wall and acrylic. */
afterTheme?: ReactNode
/** A card was picked (Custom included), after the pick landed. */
onThemePicked?: () => void
/** A card was picked (Custom included, `id` says which; the editor's save
* says `edited`), after the pick landed. */
onThemePicked?: (id: string) => void
/** The host's own unsaved changes (its window colours): they light Save
* changes too, and a save tells the host (`onSaved`) to keep them. */
extraDirty?: boolean
onSaved?: () => void
} = {}): JSX.Element {
const acrylicOn = useTermAcrylic()
const { dirty, save } = useTermSetup()
const setup = useTermSetup()
const dirty = setup.dirty || extraDirty
const save = (): void => {
setup.save()
onSaved?.()
}
const noAcrylic = useNoAcrylic()
const theme = opt('term-theme')
const acrylic = opt('term-acrylic')
Expand All @@ -37,7 +49,7 @@ export function TerminalThemeSection({
<SaveButton dirty={dirty} onClick={save} title={saveSetupTitle()} />
</SettingRow>
<SettingBlock pad data-term-wall="">
<ThemeWall onThemePicked={onThemePicked} />
<ThemeWall onThemePicked={onThemePicked} extraDirty={extraDirty} onSaved={onSaved} />
</SettingBlock>
{/* The material does not exist before Windows 11, so there the row says
why instead of offering a switch that would do nothing. */}
Expand Down
32 changes: 26 additions & 6 deletions core/renderer/settings/theme/ThemeWall.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -279,14 +279,34 @@ const TWO_ROWS = 268
* The wall itself: Custom, the host's default, Follow style where the host
* has styles, then every preset neutral-first, black to white (#157); the pencil on the chosen card;
* Show all; the question when a pick would drop unsaved changes; the editor.
* `onThemePicked`: a pick landed (Custom included), for a host whose own rows
* follow the theme (Prism Terminal forgets its picked background and accent).
* `onThemePicked`: a pick landed (Custom included, `id` says which; the
* editor's save says `edited`), for a host whose own rows follow the theme
* (Prism Terminal forgets its picked window colours, or brings Custom's back).
* `extraDirty` / `onSaved`: the host's own unsaved changes (Prism Terminal's
* window colours) light Save changes and ask before a pick drops them too, and
* a save tells the host to keep them with Custom (owner, 2026-10-12: Save
* changes "never grey when there are changes to save").
*/
export function ThemeWall({ onThemePicked, className = '' }: { onThemePicked?: () => void; className?: string }): JSX.Element {
export function ThemeWall({
onThemePicked,
extraDirty = false,
onSaved,
className = ''
}: {
onThemePicked?: (id: string) => void
extraDirty?: boolean
onSaved?: () => void
className?: string
}): JSX.Element {
const themeId = useTermThemeId()
const acrylicOn = useTermAcrylic()
const custom = useCustomTermTheme()
const { dirty, save } = useTermSetup()
const setup = useTermSetup()
const dirty = setup.dirty || extraDirty
const save = (): void => {
setup.save()
onSaved?.()
}
const noAcrylic = useNoAcrylic()
const windowAcrylic = hostOwnsWindowAcrylic()
// The Custom card draws what the terminal draws (#113 review), not the raw
Expand Down Expand Up @@ -326,7 +346,7 @@ export function ThemeWall({ onThemePicked, className = '' }: { onThemePicked?: (
// acrylic come back with it when the save captured them.
applyCustomExtras(saved)
} else pickPreset(id)
onThemePicked?.()
onThemePicked?.(id)
}
const pick = (id: string): void => {
if (dirty) setAsking(id)
Expand Down Expand Up @@ -459,7 +479,7 @@ export function ThemeWall({ onThemePicked, className = '' }: { onThemePicked?: (
// the edited background is the one that shows.
saveAsCustom(t)
setEditing(null)
onThemePicked?.()
onThemePicked?.('edited')
}}
onCancel={() => setEditing(null)}
/>
Expand Down
2 changes: 1 addition & 1 deletion core/shared/termVersion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
* so a core release that bumps `core/package.json` (or xterm) without this
* fails `npm test` (core/README.md, "Releasing the core").
*/
export const TERM_CORE_VERSION = '0.33.0'
export const TERM_CORE_VERSION = '0.33.1'
export const XTERM_VERSION = '6.0.0'
Loading
Loading