Skip to content

fix(web): refine prompt anchor and sidebar branding - #201

Merged
elkaix merged 1 commit into
mainfrom
fix/prompt-anchor-redesign
Aug 26, 2026
Merged

fix(web): refine prompt anchor and sidebar branding#201
elkaix merged 1 commit into
mainfrom
fix/prompt-anchor-redesign

Conversation

@elkaix

@elkaix elkaix commented Aug 26, 2026

Copy link
Copy Markdown
Member

Replace the prompt timeline with a compact line index that expands to prompt-only navigation while keeping clear of the composer.

Use theme-specific Pythinker banners in the shared desktop sidebar and rebuild the committed web bundle.

Task: tasks/todo.md#prompt-anchor-redesign

Related Issue

Resolve #(issue_number)

Problem

What changed

Checklist

  • I have read the CONTRIBUTING document.
  • I have linked a related issue (external PRs: the issue must have a maintainer's /approve).
  • I have added tests that prove my feature works.
  • Ran gen-changesets skill, or this PR needs no changeset.
  • Ran gen-docs skill, or this PR needs no doc update.

Summary by CodeRabbit

  • New Features

    • Replaced the conversation timeline with a compact prompt index beside the chat.
    • Expand the index to view prompt labels, with hover, focus, and keyboard navigation support.
    • Added responsive spacing and constrained scrolling for narrower layouts.
    • Added light- and dark-mode sidebar banners with updated branding dimensions.
  • Bug Fixes

    • Improved conversation index positioning and occlusion handling.
    • Prevented theme detection errors in environments without media-query support.
Replace the prompt timeline with a compact line index that expands to prompt-only navigation while keeping clear of the composer.

Use theme-specific Pythinker banners in the shared desktop sidebar and rebuild the committed web bundle.

Task: tasks/todo.md#prompt-anchor-redesign
@coderabbitai

coderabbitai Bot commented Aug 26, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 7d4a5839-69de-4015-b42f-c2f1b8a75abe

📥 Commits

Reviewing files that changed from the base of the PR and between b9268d4 and 359d568.

⛔ Files ignored due to path filters (4)
  • apps/pythinker-code/dist-web/brand/pythinker_banner_dark.svg is excluded by !**/*.svg
  • apps/pythinker-code/dist-web/brand/pythinker_banner_light.svg is excluded by !**/*.svg
  • apps/pythinker-web/public/brand/pythinker_banner_dark.svg is excluded by !**/*.svg
  • apps/pythinker-web/public/brand/pythinker_banner_light.svg is excluded by !**/*.svg
📒 Files selected for processing (107)
  • .changeset/compact-prompt-anchor.md
  • .changeset/theme-sidebar-banners.md
  • apps/pythinker-code/dist-web/.web-bundle-manifest.json
  • apps/pythinker-code/dist-web/assets/CodeBlockNode-CYtk5BQA.js
  • apps/pythinker-code/dist-web/assets/DesignSystemView-C3c2Sx-Q.css
  • apps/pythinker-code/dist-web/assets/DesignSystemView-I872M2Sr.css
  • apps/pythinker-code/dist-web/assets/DesignSystemView-P3HoRLfC.js
  • apps/pythinker-code/dist-web/assets/DesignSystemView-fNr4617i.js
  • apps/pythinker-code/dist-web/assets/Tooltip-Bd1T-QAF.js
  • apps/pythinker-code/dist-web/assets/abnfDiagram-VCTEODGH-HUY2MQ9-.js
  • apps/pythinker-code/dist-web/assets/arc-BBrr3zil.js
  • apps/pythinker-code/dist-web/assets/architectureDiagram-5GKGNRK7-BVAIWV1l.js
  • apps/pythinker-code/dist-web/assets/blockDiagram-NRAW4CY4-C3joAb3C.js
  • apps/pythinker-code/dist-web/assets/c4Diagram-UCG6FXSJ-r-wp_LM8.js
  • apps/pythinker-code/dist-web/assets/channel-C7v8EKJy.js
  • apps/pythinker-code/dist-web/assets/channel-Ciw2qhjx.js
  • apps/pythinker-code/dist-web/assets/chunk-2Q5K7J3B-DbMa7N9m.js
  • apps/pythinker-code/dist-web/assets/chunk-5VM5RSS4-qMqgYuQO.js
  • apps/pythinker-code/dist-web/assets/chunk-F27PBJKO-Cvp7XNrs.js
  • apps/pythinker-code/dist-web/assets/chunk-G27WJ6UU-D4y85bNC.js
  • apps/pythinker-code/dist-web/assets/chunk-JWPE2WC7-LAfb_B09.js
  • apps/pythinker-code/dist-web/assets/chunk-LCL6LL3I-CCDDS6VU.js
  • apps/pythinker-code/dist-web/assets/chunk-POPQ4Y6H-C0uJIpOy.js
  • apps/pythinker-code/dist-web/assets/chunk-SVP7TREG-ZtqWDSDE.js
  • apps/pythinker-code/dist-web/assets/chunk-XXDRQBXY-DXSIwbAW.js
  • apps/pythinker-code/dist-web/assets/classDiagram-DTDB5LWJ-D0aRBW2X.js
  • apps/pythinker-code/dist-web/assets/classDiagram-DTDB5LWJ-DHmaOoJN.js
  • apps/pythinker-code/dist-web/assets/classDiagram-v2-JRS7N3AN-D0aRBW2X.js
  • apps/pythinker-code/dist-web/assets/classDiagram-v2-JRS7N3AN-DHmaOoJN.js
  • apps/pythinker-code/dist-web/assets/cose-bilkent-JH36ORCC-NSx8AI57.js
  • apps/pythinker-code/dist-web/assets/cssMode-CihySWB0.js
  • apps/pythinker-code/dist-web/assets/cynefin-OW5HDTMX-DjUEZyzR.js
  • apps/pythinker-code/dist-web/assets/cynefinDiagram-5FMLGOSQ-C6QjAhh9.js
  • apps/pythinker-code/dist-web/assets/dagre-3AP2YEHR-D6KKReN1.js
  • apps/pythinker-code/dist-web/assets/diagram-S7CK7UJ4-CA1ycQ6E.js
  • apps/pythinker-code/dist-web/assets/diagram-UQ7AKVKN-C-BteJpy.js
  • apps/pythinker-code/dist-web/assets/diagram-VSXAHHWV-CwCIxJ5p.js
  • apps/pythinker-code/dist-web/assets/diagram-VX7I27RA-BXRJkwwq.js
  • apps/pythinker-code/dist-web/assets/diagram-Z3DM3KII-Bp11azBy.js
  • apps/pythinker-code/dist-web/assets/ebnfDiagram-PWID7BFC-ZL8QOfA8.js
  • apps/pythinker-code/dist-web/assets/editor.main-DJCBp8ak.js
  • apps/pythinker-code/dist-web/assets/erDiagram-SSCWMZ5O-DVmYT7zG.js
  • apps/pythinker-code/dist-web/assets/flowDiagram-A5DVABFB-0msThmi0.js
  • apps/pythinker-code/dist-web/assets/freemarker2-BhVrFZTR.js
  • apps/pythinker-code/dist-web/assets/ganttDiagram-EL5Y4UJY-yS7jF0ec.js
  • apps/pythinker-code/dist-web/assets/gitGraphDiagram-WWUBYQGX-B18z93JN.js
  • apps/pythinker-code/dist-web/assets/handlebars-QA_3BWhU.js
  • apps/pythinker-code/dist-web/assets/html-CaSwBbBR.js
  • apps/pythinker-code/dist-web/assets/htmlMode-Qm74vyrn.js
  • apps/pythinker-code/dist-web/assets/index-4aMuDsy6.js
  • apps/pythinker-code/dist-web/assets/index-Am4Sos9A.js
  • apps/pythinker-code/dist-web/assets/index-CLj3rNGv.js
  • apps/pythinker-code/dist-web/assets/index-CVpt_hkV.js
  • apps/pythinker-code/dist-web/assets/index-DwgDWcL3.css
  • apps/pythinker-code/dist-web/assets/index10-BSmM2hMc.js
  • apps/pythinker-code/dist-web/assets/index11-BGa_OFvl.js
  • apps/pythinker-code/dist-web/assets/index5-eTyhrzdb.js
  • apps/pythinker-code/dist-web/assets/index6-Dll44opX.js
  • apps/pythinker-code/dist-web/assets/index7-Bzf77oHu.js
  • apps/pythinker-code/dist-web/assets/index8-CVkklFkf.js
  • apps/pythinker-code/dist-web/assets/infoDiagram-RXCK75RN-D7JyJNeu.js
  • apps/pythinker-code/dist-web/assets/ishikawaDiagram-5VMMS53U-SJ3Z3vww.js
  • apps/pythinker-code/dist-web/assets/javascript-nnSycged.js
  • apps/pythinker-code/dist-web/assets/journeyDiagram-EYS64GPL-z2TQl2yD.js
  • apps/pythinker-code/dist-web/assets/jsonMode-BPMFTehf.js
  • apps/pythinker-code/dist-web/assets/kanban-definition-3QL26DDD-DAVKG1Hw.js
  • apps/pythinker-code/dist-web/assets/layout-CYN2IDut.js
  • apps/pythinker-code/dist-web/assets/linear-DtZqjChL.js
  • apps/pythinker-code/dist-web/assets/liquid-B3oSZO07.js
  • apps/pythinker-code/dist-web/assets/lspLanguageFeatures-DFfakkeL.js
  • apps/pythinker-code/dist-web/assets/mdx-y8OvkvC0.js
  • apps/pythinker-code/dist-web/assets/mermaid.core-BkLGZspL.js
  • apps/pythinker-code/dist-web/assets/mindmap-definition-FBJOCRG2-CvgWN-dk.js
  • apps/pythinker-code/dist-web/assets/pegDiagram-XKGWAZYB-ByIfObcz.js
  • apps/pythinker-code/dist-web/assets/pieDiagram-E7YTZNPT-DBjJak4e.js
  • apps/pythinker-code/dist-web/assets/python-CNKNSeb6.js
  • apps/pythinker-code/dist-web/assets/quadrantDiagram-AXDQQJYC-Cc_zG5eQ.js
  • apps/pythinker-code/dist-web/assets/railroadDiagram-O6MQD6OU-D1j0mKF6.js
  • apps/pythinker-code/dist-web/assets/razor-C5UNViQU.js
  • apps/pythinker-code/dist-web/assets/requirementDiagram-EFPCY7ZU-Dv17uzjh.js
  • apps/pythinker-code/dist-web/assets/sankeyDiagram-P5KCCOFB-Bs1BxsQq.js
  • apps/pythinker-code/dist-web/assets/sequenceDiagram-WJ2MYXX4-BceijKk8.js
  • apps/pythinker-code/dist-web/assets/sizeCapture-X5ZJPWSS-vlreXklw.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-HBIQ2CUA-D5FCCxo-.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-v2-4QOOHH4V-DHo0DYww.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-v2-4QOOHH4V-s_O8-VHp.js
  • apps/pythinker-code/dist-web/assets/swimlanes-XN3QIQJK-Wz-61-D2.js
  • apps/pythinker-code/dist-web/assets/swimlanesDiagram-VK2B7HYN-CWZwvd-3.js
  • apps/pythinker-code/dist-web/assets/swimlanesDiagram-VK2B7HYN-ClGMa8pf.js
  • apps/pythinker-code/dist-web/assets/timeline-definition-24CTP7MA-DqGtEWay.js
  • apps/pythinker-code/dist-web/assets/tsMode-B7Zd4kwI.js
  • apps/pythinker-code/dist-web/assets/typescript-Kd7r7AhX.js
  • apps/pythinker-code/dist-web/assets/vennDiagram-4TSXK5OY-DuEXeXti.js
  • apps/pythinker-code/dist-web/assets/vue.runtime.esm-bundler-CZDwlSWW.js
  • apps/pythinker-code/dist-web/assets/wardleyDiagram-VM6X3IG4-BowlyXSJ.js
  • apps/pythinker-code/dist-web/assets/xml-CPhQqqHr.js
  • apps/pythinker-code/dist-web/assets/xychartDiagram-S5SC5T6Z-COxtfCiL.js
  • apps/pythinker-code/dist-web/assets/yaml-D6icS4w-.js
  • apps/pythinker-code/dist-web/index.html
  • apps/pythinker-web/src/components/Sidebar.vue
  • apps/pythinker-web/src/components/chat/ConversationPane.vue
  • apps/pythinker-web/src/components/chat/ConversationToc.vue
  • apps/pythinker-web/src/composables/useIsDark.ts
  • apps/pythinker-web/src/i18n/locales/en/settings.ts
  • apps/pythinker-web/src/views/DesignSystemView.vue
  • apps/pythinker-web/test/app-shell-contracts.test.ts
  • apps/pythinker-web/test/conversation-toc.test.ts

📝 Walkthrough

Walkthrough

The change replaces the conversation timeline with a compact prompt index, adds theme-aware sidebar banners, improves media-query fallback handling, updates related tests and documentation, and regenerates web assets with new editor, Mermaid, Vue, and diagram modules.

Changes

Web interface updates

Layer / File(s) Summary
Compact conversation outline
apps/pythinker-web/src/components/chat/*, apps/pythinker-web/src/i18n/locales/en/settings.ts, apps/pythinker-web/src/views/DesignSystemView.vue, apps/pythinker-web/test/conversation-toc.test.ts
The conversation outline now uses compact horizontal markers, hover and focus expansion, constrained scrolling, responsive reading-column spacing, and marker-based occlusion checks. Tests and specifications use the new line-index behavior.
Theme-aware sidebar branding
apps/pythinker-web/src/components/Sidebar.vue, apps/pythinker-web/src/composables/useIsDark.ts, apps/pythinker-web/src/views/DesignSystemView.vue, apps/pythinker-web/test/app-shell-contracts.test.ts
The sidebar selects light or dark Pythinker banners. The logo width and platform documentation are updated. Media-query access now tolerates unavailable browser APIs.

Generated web bundle

Layer / File(s) Summary
Editor and runtime modules
apps/pythinker-code/dist-web/assets/{tsMode,typescript,razor,xml,yaml,vue.runtime,sizeCapture}*
The bundle adds TypeScript language services, editor language definitions, the Vue runtime wrapper, and Mermaid size-capture helpers.
Mermaid diagram modules
apps/pythinker-code/dist-web/assets/*Diagram*, apps/pythinker-code/dist-web/assets/*definition*
The bundle adds compiled class, quadrant, railroad, requirement, Sankey, state, swimlane, timeline, Venn, Wardley, and XY chart modules.
Generated asset references
apps/pythinker-code/dist-web/assets/*, apps/pythinker-code/dist-web/index.html, apps/pythinker-code/dist-web/.web-bundle-manifest.json
Generated imports, dynamic imports, manifest metadata, and entry-point references now use the regenerated hashed assets.

Release metadata

Layer / File(s) Summary
Patch release changesets
.changeset/*
The package receives patch changesets for compact prompt anchors and theme-matched sidebar banners.

Estimated code review effort: 4 (Complex) | ~45 minutes

Warning

Some tools did not complete. Review the errors below.

🔧 ast-grep (0.45.2)
apps/pythinker-code/dist-web/assets/cynefin-OW5HDTMX-DjUEZyzR.js

ast-grep timed out on this file

apps/pythinker-code/dist-web/.web-bundle-manifest.json

ast-grep did not scan this file: retry isolation stopped after a systemic timeout or after exhausting the retry isolation budget

apps/pythinker-code/dist-web/assets/CodeBlockNode-CYtk5BQA.js

ast-grep did not scan this file: retry isolation stopped after a systemic timeout or after exhausting the retry isolation budget

  • 20 others

Comment @coderabbitai help to get the list of available commands.

@pkg-pr-new

pkg-pr-new Bot commented Aug 26, 2026

Copy link
Copy Markdown
pnpm dlx https://pkg.pr.new/@pymodel/pythinker-code@359d568
npx https://pkg.pr.new/@pymodel/pythinker-code@359d568

commit: 359d568

Comment thread apps/pythinker-code/dist-web/assets/chunk-G27WJ6UU-D4y85bNC.js
Comment thread apps/pythinker-code/dist-web/assets/chunk-G27WJ6UU-D4y85bNC.js
@elkaix
elkaix merged commit 5f087d8 into main Aug 26, 2026
26 of 27 checks passed
@elkaix
elkaix deleted the fix/prompt-anchor-redesign branch August 26, 2026 04:06
@elkaix elkaix mentioned this pull request Aug 26, 2026
5 tasks
elkaix added a commit that referenced this pull request Aug 26, 2026
## Related Issue

N/A — maintainer desktop release task.

## Problem

The prompt anchor and sidebar branding changes from #201 are on `main`,
but the current Stable desktop release is still 0.3.4.

## What changed

- Bump the private desktop package version from 0.3.4 to 0.3.5.
- Let the existing release workflow cut `desktop-v0.3.5` after merge and
start the signed macOS and Windows release.

## Validation

- `pnpm test:release` — 20 passed
- `pnpm exec vitest run apps/desktop/tests` — 168 passed
- Desktop `tsc` and `tsgo` checks passed
- `pnpm lint` — 0 errors

## Checklist

- [x] I have read the
[CONTRIBUTING](https://github.com/PyModel/pythinker-code/blob/main/CONTRIBUTING.md)
document.
- [x] This is a maintainer release task; no related issue is required.
- [x] Existing release and desktop tests cover this version signal.
- [x] Ran `gen-changesets`; no changeset is needed for the private
desktop-only version bump.
- [x] No documentation update is needed because behavior and usage do
not change.
elkaix pushed a commit that referenced this pull request Aug 27, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @pymodel/pythinker-code@1.4.0

### Minor Changes

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Remove the
`--allow-remote-terminals` flag from `pythinker web`; PTY terminal
routes now stay available on loopback binds only.

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Add
`PYTHINKER_CODE_INFINITE_RETRY=1` to retry every failed model request
indefinitely with backoff instead of failing the turn, for long
unattended runs.

- [#208](#208)
[`bd0eadd`](bd0eadd)
Thanks [@elkaix](https://github.com/elkaix)! - Add an option to reveal
saved plan files in your file manager. Select Reveal in file manager
from a saved plan.

### Patch Changes

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Silence the
MaxListenersExceededWarning that could appear during long agent turns
with many parallel tool calls.

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Fix messages sent from
one web client not appearing on other clients connected to the same
session.

- [#207](#207)
[`3a1d761`](3a1d761)
Thanks [@elkaix](https://github.com/elkaix)! - Fix context usage updates
in interactive clients.

- [#214](#214)
[`48510be`](48510be)
Thanks [@elkaix](https://github.com/elkaix)! - Complete a Codex sign-in
as soon as the browser tab becomes visible again, not only when the
window regains focus.

- [#201](#201)
[`5f087d8`](5f087d8)
Thanks [@elkaix](https://github.com/elkaix)! - Make the chat prompt
anchor a compact line index that opens prompt and response previews.

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Persist a picked thinking
effort as the default only up to the model's own default effort; a more
expensive pick stays session-only.

- [#204](#204)
[`2d76cad`](2d76cad)
Thanks [@elkaix](https://github.com/elkaix)! - Fix prompt anchor
selection when a conversation has two prompts.

- [#198](#198)
[`6be446e`](6be446e)
Thanks [@elkaix](https://github.com/elkaix)! - Wrap narrow Changes
editor lines while keeping line numbers visible.

- [#207](#207)
[`3a1d761`](3a1d761)
Thanks [@elkaix](https://github.com/elkaix)! - Fix session history after
steering or undoing a turn.

- [#211](#211)
[`7040eed`](7040eed)
Thanks [@elkaix](https://github.com/elkaix)! - Add a setting to pin
every subagent to the selected model, use the dark banner in every
sidebar, and show Pythinker desktop updates as one continuous download.

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Show the /plugins
marketplace catalog as soon as it loads, with latest-version lookups
running in the background.

- [#192](#192)
[`8b6cc70`](8b6cc70)
Thanks [@elkaix](https://github.com/elkaix)! - Preserve subagent model
aliases when provider models refresh.

- [#215](#215)
[`e4ed37f`](e4ed37f)
Thanks [@elkaix](https://github.com/elkaix)! - Fix a resumed session
showing a stale "manually stopped" or failed state when its last turn
had actually completed.

- [#198](#198)
[`6be446e`](6be446e)
Thanks [@elkaix](https://github.com/elkaix)! - Show available desktop
updates as a sidebar button with release notes and update controls.

- [#192](#192)
[`8b6cc70`](8b6cc70)
Thanks [@elkaix](https://github.com/elkaix)! - Stop goal turns when
automatic context compaction is cancelled or fails.

- [#192](#192)
[`8b6cc70`](8b6cc70)
Thanks [@elkaix](https://github.com/elkaix)! - Let subagents inherit the
calling agent model from the Agent settings tab.

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Fix foreground subagents
being reported as background tasks on the task list.

- [#201](#201)
[`5f087d8`](5f087d8)
Thanks [@elkaix](https://github.com/elkaix)! - Use theme-matched
Pythinker banners in the sidebar.

- [#207](#207)
[`3a1d761`](3a1d761)
Thanks [@elkaix](https://github.com/elkaix)! - Fix loss of large tool
outputs in long conversations.

- [#213](#213)
[`0753f13`](0753f13)
Thanks [@elkaix](https://github.com/elkaix)! - Fix the "manually
stopped" state lingering after undoing the interrupted turn.

- [#198](#198)
[`6be446e`](6be446e)
Thanks [@elkaix](https://github.com/elkaix)! - Replace the sidebar robot
icon with the Pythinker Code banner.
## pythinker@0.9.6

### Patch Changes

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Persist a picked thinking
effort as the default only up to the model's own default effort; a more
expensive pick stays session-only.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant