Repository navigation
fix(station-chrome): animate header insets only on station toggle - #1838
Merged
Merged
Conversation
Header rows that reserve space for the pinned window chrome now slide their insets only while My Station or Agent Station opens or closes. Tab and session changes inside a station snap, so header controls no longer glide on every tab switch. useStationToggleInsetTransition applies the shared transition for 320 ms after effectiveChatPanelMaximizedAtom flips, in the same render as the new inset. The chat pane header has no bottom rule in any layout: the border class, hideBottomBorder and the joinWithFollowingRow override are removed. The chat header was that flag's only writer, so it is dropped from both header slot types and the station header strips always draw their rule.
This was referenced Sep 15, 2026
hbrls
pushed a commit
to nice-fungal/ORG2
that referenced
this pull request
Sep 29, 2026
Add the architecture audit of My Station (behaviour defects, findings by area, suggested PR waves) and the companion UI audit of its 36px bars and sidebars (21 fix, 8 abstract, 12 keep with reason, 1 watch). Both reports note what the follow-up PRs apply: org2AI#1838 (inset motion only on station toggle, no chat header rule) and org2AI#1841 (unreachable code removal).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Header rows that reserve space for the macOS pinned window chrome (the My Station tab bar, the Agent Station header and both chat header rows) change their padding whenever that chrome moves.
a5547913a7removedCHROME_INSET_TRANSITION_CLASSESfrom the My Station tab bar and the chat header rows because the padding slid on every tab change (leaving the empty Launchpad hides the pinned group), while the Agent Station header kept animating every change. As a result, opening or closing a station makes those headers jump by the reservation and then glide with the panes, and the two stations behave differently.The chat published header also carried border logic that could never render:
joinWithFollowingRowwas forced on when the tab row was collapsed andhideBottomBordercovered the other branch, next to a comment saying the publisher decides. The intended design is no bottom rule.Solution
useStationToggleInsetTransition()insrc/modules/shared/layoutsreturns the shared inset transition classes for 320 ms aftereffectiveChatPanelMaximizedAtomflips, that is while My Station or Agent Station opens or closes, and an empty string otherwise. The class is added in the same render as the new inset (state adjusted during render), because CSS takes transition timing from the after-change style. Tab and session changes inside an open station therefore snap.MainAppPageHeaderkeeps its always-on transition because it is not a station header.hideBottomBorderand thejoinWithFollowingRowoverride. The chat header was the flag's only writer, so the field is removed fromPublishedHeaderSlots,WorkstationTabHeaderSlots, the slot duck-type and the chat publish equality check. The My Station and Agent Station header strips now always draw their bottom rule, which is what they already did since nothing set the flag.Potential risks
Verification
node_modules/.bin/prettier --check,node_modules/.bin/oxlint -c .oxlintrc.json --max-warnings 0andnode_modules/.bin/eslint --max-warnings 0 --report-unused-disable-directiveson the 14 changed files: all pass.node_modules/.bin/tsgo --noEmit --pretty false: exit 0.node_modules/.bin/vitest run --config config/vitest.config.tsoversrc/modules/shared/layouts,src/engines/ChatPanel/header,src/engines/ChatPanel/ChatPanelHeader.test.ts,src/modules/WorkStation/AppShell,src/modules/WorkStation/shared/SessionReplay,src/modules/WorkStation/shared/TabBar,src/store/workstation,src/modules/MainApp/WorkManagementandsrc/engines/ChatPanel/panels/ProjectPanelView.test.ts: 106 files, 671 tests passed. The newuseStationToggleInsetTransition.test.tscovers rest, tab re-renders, close and open, and a quick reopen;ChatPanelPublishedHeader.test.tsasserts no rule and a transition only when one is passed.node scripts/quality/check-test-placement.mjs: consistent.git diff --check: clean..gitis a file, so the "Pre-commit hook ran." trailer is not appended.check:typed-lint, and the app itself. No screenshots or recording: the change is motion timing plus the removal of a rule that never rendered, and neither was captured in this session.