Skip to content

feat(web): Prism, a chrome-and-glass theme - #141

Merged
logancsack merged 2 commits into
aldo/cloud-platformfrom
aldo/0y1ttg6fhf
Oct 1, 2026
Merged

logancsack merged 2 commits into
aldo/cloud-platformfrom
aldo/0y1ttg6fhf

Conversation

@logancsack

Copy link
Copy Markdown
Owner

What

A new built-in theme, Prism: liquid chrome on black (and on pearl in light mode), with glassmorphism throughout. It sits next to Grove, Ocean, Ember and Iris in Settings → Appearance.

  • Palette (packages/shared/src/themePalettes.ts): ink-black / pearl canvas, silver controls, electric-blue accent, gold and violet as the warm and cool refractions. Light base with a dark variant like the other built-ins, so mobile and the boot splash pick it up unchanged. The palette itself stays opaque so the theme editor, exports, and mobile read it like any other theme.
  • Glass (apps/web/src/index.css): the body paints one static scene (a blue-to-violet sweep, gold at the right edge, cyan under the sidebar, a lit spot behind the composer, two chrome ribbons with iridescent edges, a few sparks). Every pane over it is a translucent tint of its palette color, with specular top edges and hairline borders. Blur is limited to the panes that float over other content: the sidebar, the thread toolbar, the composer, and the popups that already carry it, so nothing re-blurs on every frame beyond what the app does today. The wordmark is set in chrome. Browsers without backdrop-filter fall back to the opaque palette.
  • Stage art pigments for the Dev/Nightly sidebar backdrop, the boot-splash copy in index.html (checked by the existing sync test), the maintainer card in Settings, and the mobile theme list in the docs.

How it was tested

  • vp test run src/themePalette.test.ts src/themeBoot.test.ts (web) and src/lib/mobileTheme.test.ts (mobile, contrast checks on every built-in) pass.
  • tsgo --noEmit in packages/shared and apps/web; vp lint and vp fmt --check on the changed files.
  • Built with VITE_ALDO_CLOUD=1 and run in the Aldo dev app: Settings → Appearance, the home page, a dialog, and the demo thread (composer, toolbar, sidebar, right panel) in both modes. Recording and screenshots in the comment below.

Done with Claude Fable 5.1 in Claude Code.

🤖 Generated with Claude Code

A new built-in theme in the spirit of liquid chrome on black: an ink-black
(or pearl) canvas lit by iridescent refractions, silver controls, an
electric-blue accent, and glassmorphism throughout. The palette itself
stays opaque so the theme editor, exports, and mobile read it like any
other theme; the web stylesheet adds the glass: the body paints one static
scene (blue-to-violet sweep, gold edge, chrome ribbons, a few sparks) and
every pane over it is a translucent tint of its palette color, with blur
limited to the sidebar, the thread toolbar, the composer, and the popups
that already carry it. The wordmark is set in chrome, and browsers without
backdrop-filter fall back to the opaque palette.

Also carried: the boot-splash copy in index.html, the maintainer card in
Settings → Appearance, and the mobile theme list in the docs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-01T01:06:22.746834Z 91723a8 PR opened
🔒 Security Review ✅ Completed 2026-10-01T01:02:29.562088Z 91723a8 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@logancsack

Copy link
Copy Markdown
Owner Author

🎬 Demo

Prism in the Aldo dev app: the demo thread in dark mode, Settings → Appearance switching to light, and both modes of the thread view

Prism theme: the demo thread in dark mode, then Settings → Appearance switching to light mode
▶️ Watch the recording: Prism theme: the demo thread in dark mode, then Settings → Appearance switching to light mode · 0:08

Prism theme: the demo thread in dark mode, then Settings → Appearance switching the theme to light
▶️ Watch the recording: Prism theme: the demo thread in dark mode, then Settings → Appearance switching the theme to light · 0:20

Prism theme, light mode: the demo thread with frosted composer, sidebar, and toolbar over the pearl scene

Prism theme, dark mode: the demo thread with the chrome ribbon and iridescent glows behind the frosted composer, sidebar, and toolbar

Recorded by the agent in its Aldo sandbox.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 91723a8175

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@@ -1,4 +1,4 @@
export const BUILT_IN_THEME_IDS = ["t3-chat", "grove", "ocean", "ember", "iris"] as const;
export const BUILT_IN_THEME_IDS = ["t3-chat", "grove", "ocean", "ember", "iris", "prism"] as const;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Regenerate the mobile Uniwind themes for Prism

Adding prism here also exposes it in the mobile theme picker, where getMobileUniwindThemeName produces prism-light or prism-dark; however, apps/mobile/generated-uniwind-theme-names.json still registers only the previous themes with Metro, and generated-uniwind-themes.css contains no Prism variants. Selecting Prism on mobile therefore requests an unregistered theme and cannot apply its variables. Regenerate and commit both outputs, and update the generator test's expected names.

AGENTS.md reference: AGENTS.md:L23-L31

Useful? React with 👍 / 👎.

Comment thread packages/shared/src/themePalettes.ts Outdated
Comment on lines +786 to +787
accent: "oklch(0.58 0.19 262)",
accentForeground: "oklch(0.99 0.002 255)",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Increase the light Prism primary contrast

On mobile, createMobileThemeVariables maps these roles directly to --color-primary and --color-primary-foreground, which are used together on normal-sized button labels throughout the app. After conversion to native sRGB, these values are approximately #3672e9 and #fbfcfd, yielding only about 4.31:1 contrast rather than the 4.5:1 required for this text size; the existing built-in contrast test omits this role pair. Darken the light accent or its foreground so Prism's mobile primary actions remain readable.

AGENTS.md reference: AGENTS.md:L65-L70

Useful? React with 👍 / 👎.

Comment thread apps/web/src/index.css
Comment on lines +1615 to +1617
@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
html[data-theme-id="prism"]:root,
html[data-theme-id="prism"] [data-app-sidebar] {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Make the no-backdrop composer fallback opaque

In browsers or embedded webviews without backdrop-filter, this fallback restores opaque variables only for the root and sidebar, but the Prism composer still overrides --chat-composer-glass-surface with a color mixed to 72% over transparency. ComposerSurface's own no-support rule then uses that already-translucent value as its supposedly solid background, allowing scrolling message content to show through the floating composer and reducing legibility. Include the composer variable in this fallback and reset it to var(--app-theme-surface-raised).

Useful? React with 👍 / 👎.

@@ -1,4 +1,4 @@
export const BUILT_IN_THEME_IDS = ["t3-chat", "grove", "ocean", "ember", "iris"] as const;
export const BUILT_IN_THEME_IDS = ["t3-chat", "grove", "ocean", "ember", "iris", "prism"] as const;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve existing custom themes named prism

Before this commit, prism was a valid custom-theme ID. Adding it to BUILT_IN_THEME_IDS also adds it to RESERVED_THEME_IDS, so parseStoredTheme now drops any previously saved custom theme with that ID, while the boot script and getThemeDefinition resolve the stored preference to the new built-in instead. A user who already created or imported a theme named Prism will silently see a different theme and can no longer edit or export their saved one through the UI. Migrate conflicting stored IDs and their preferences, or choose a built-in ID that cannot collide.

Useful? React with 👍 / 👎.

Review follow-ups: the generated Uniwind theme outputs now carry Prism so
the mobile picker can apply it; the light accent is darker so primary
button labels keep 4.5:1 on mobile (and the test now checks that pair for
every built-in); and the no-backdrop fallback also restores the opaque
composer surface.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@logancsack

Copy link
Copy Markdown
Owner Author

Thanks, Codex. Addressed in f0d51bb:

  • Mobile Uniwind outputs: regenerated generated-uniwind-theme-names.json and generated-uniwind-themes.css with prism-light / prism-dark, and the generator test expects them.
  • Light primary contrast: the light accent (and the focus, update, and terminal-cursor roles that share it) is now oklch(0.54 0.19 262), 5.08:1 against its foreground on mobile. The mobile contrast test now checks the primary pair for every built-in.
  • No-backdrop composer: the @supports not (backdrop-filter) fallback also resets --chat-composer-glass-surface to the opaque raised surface.

Custom themes already named "prism": leaving this as is. The id namespace is shared by design, and every built-in added before this one (grove, ocean, ember, iris) took its id the same way; a migration for stored ids plus the boot script's copy is more machinery than the case warrants. Reserved ids are refused at save and import time, so the only affected user is one who saved a theme named exactly "Prism" before this release, and their theme file stays importable under another name.

@logancsack
logancsack merged commit 33b0da6 into aldo/cloud-platform Oct 1, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant