mirror of
https://github.com/Studio-Saelix/sencho.git
synced 2026-07-27 12:18:59 +00:00
370b67d7ec
* chore: ignore .superpowers/ brainstorm scratch dir
* feat(sidebar): add useStackMenuItems hook with grouped menu model
Pure transform hook that converts StackMenuCtx into four ordered MenuGroup
arrays (inspect, organize, lifecycle, destructive). Shared type contract in
sidebar-types.ts gives both the ContextMenu and DropdownMenu a single source
of truth so they cannot drift. Covered by 8 unit tests.
* refactor(sidebar): stabilize useStackMenuItems memoization deps
Destructure menuVisibility flags into primitive deps so inline object
literals from callers do not defeat memoization. Add a test confirming
isBusy disables all lifecycle items.
* feat(sidebar): add usePinnedStacks hook with per-node localStorage
* refactor(sidebar): stabilize usePinnedStacks eviction signal and isPinned dep
Change evictedOldest shape to { file, seq } so consumer effects re-fire on
repeated evictions. Narrow isPinned's useCallback dep to the current node's
pinned list so it only rebinds on local changes. Add test for eviction
side-effect and a second test for the seq counter.
* feat(sidebar): add useSidebarGroupCollapse hook with per-node keys
* refactor(sidebar): tighten useSidebarGroupCollapse effect ordering
Collapse the two write/read effects into a single skip-next-write ref
pattern so switching nodes no longer writes the previous node's map under
the new key before hydration. Also skip the no-op mount write. Add test
for setCollapsed.
* feat(sidebar): add row + group-header style helpers
* feat(sidebar): add SidebarBrand with mono kicker + serif hero
* feat(sidebar): add SidebarActions wrapper for create + scan
* feat(sidebar): extract SidebarSearch with kbd pill
* feat(sidebar): add StackRow with cyan-rail active state
* refactor(sidebar): dedupe tooltip markup in StackRow, widen test coverage
Extract a local RowTooltip helper so the update and git-pending branches
share the CursorProvider scaffolding. Add four behavioral tests covering
click, keyboard activation, kebab stop-propagation, and the busy loader
branch.
* feat(sidebar): unify context + kebab menus via useStackMenuItems
* feat(sidebar): add StackGroup with collapse and pinned variant
* feat(sidebar): add StackList with pinned + label groups
* feat(sidebar): add SidebarActivityTicker with idle fallback
* feat(sidebar): add StackSidebar container composing the regions
* feat(sidebar): replace sidebar block with StackSidebar composition
* docs(sidebar): add stack sidebar feature page with screenshots
* fix(sidebar): satisfy react-hooks purity and memoization rules
* fix(sidebar): restore "Sencho Logo" alt text for E2E selector
55 lines
2.3 KiB
Plaintext
55 lines
2.3 KiB
Plaintext
---
|
|
title: Stack Sidebar
|
|
description: Manage, group, and pin your stacks from the primary sidebar.
|
|
---
|
|
|
|
The stack sidebar is your cockpit for every stack on the active node. Stacks are grouped by label, your most-used stacks can be pinned to the top, and a live activity footer keeps you aware of what just happened.
|
|
|
|
<Frame>
|
|
<img src="/images/sidebar/sidebar-overview.png" alt="Stack sidebar overview" />
|
|
</Frame>
|
|
|
|
## Layout
|
|
|
|
From top to bottom:
|
|
|
|
1. **Branding header** shows your Sencho build version.
|
|
2. **Node switcher** selects which Sencho instance you are managing.
|
|
3. **Create Stack** opens the new-stack dialog. The folder icon scans your compose directory.
|
|
4. **Search** filters stacks by name. Press <kbd>⌘K</kbd> (or <kbd>Ctrl+K</kbd>) to focus it.
|
|
5. **Stack list** shows your stacks grouped by label.
|
|
6. **Activity footer** shows the most recent stack event.
|
|
|
|
## Groups
|
|
|
|
Stacks are grouped by label. Stacks with multiple labels appear in each matching group so you always see the full fleet membership per label. Stacks without labels appear in an **Unlabeled** group at the bottom. Click a group header to collapse or expand it; the collapsed state is remembered per node.
|
|
|
|
## Pinning
|
|
|
|
Right-click a stack and choose **Pin to top**. Pinned stacks sit in a dedicated **PINNED** group at the top of the list. Up to 10 stacks can be pinned per node; pinning an 11th evicts the oldest.
|
|
|
|
<Frame>
|
|
<img src="/images/sidebar/sidebar-pinned.png" alt="Pinned stacks appear in a PINNED group at top" />
|
|
</Frame>
|
|
|
|
## Context menu
|
|
|
|
Right-click any stack (or open the kebab that appears on hover) for its context menu, grouped by purpose:
|
|
|
|
- **Inspect**: view alerts, open the auto-heal sheet, check for image updates, open the running app.
|
|
- **Organize**: assign labels, pin or unpin the stack.
|
|
- **Lifecycle**: deploy, stop, restart, or update the stack.
|
|
- **Destructive**: delete the stack.
|
|
|
|
<Frame>
|
|
<img src="/images/sidebar/sidebar-context-menu.png" alt="Grouped stack context menu" />
|
|
</Frame>
|
|
|
|
## Activity footer
|
|
|
|
The footer shows the most recent stack lifecycle event within the last hour. Click it to jump to the global activity log. When nothing has happened recently, the footer reads **IDLE**.
|
|
|
|
<Frame>
|
|
<img src="/images/sidebar/sidebar-activity.png" alt="Activity footer ticker" />
|
|
</Frame>
|