inspector/clients/web/src/theme/Text.ts
Cliff Hall dbda70e83b
Monitoring sidebar toggle, Prompts-style Tools results, and icon-button UI polish (#1661) (#1662)
* feat(web): single header MonitoringToggle + Prompts-style Tools results (#1661)

Consolidate the monitoring column's open/close affordances into one header
toggle, and align the Tools/Prompts result panes and the sidebar log layout.

- Add a single `MonitoringToggle` in the header, to the right of the theme
  icon. It opens/closes the monitoring column and only shows when a server is
  connected OR a connect attempt failed (wide viewport + a monitor tab
  available) — the same availability rule the column uses.
- Remove the scattered pin/close icons: delete `PinColumnButton`; drop `onPin`
  from the Logs/Protocol/Network/Console screens and their stream panels; drop
  `onOpenMonitor` from the server list; remove the close button from
  `MonitoringControls`/`MonitoringScreen`.
- Tools screen: remove the "Results will appear here" placeholder pane. Results
  now replace the input form in a single content pane (the Prompts pattern),
  with a top-left X (ToolResultPanel) that dismisses them back to the form;
  form values are preserved for a re-run.
- Prompts screen: the argument form fills the content pane width (drop the 40%
  cap), matching the Tools input.
- LogEntry: add a `compact` two-line layout (time/level/logger on line one,
  message wrapping below) used by the embedded monitoring-column Logs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015sMW1YZXkM7fDkdPtHpE95

* polish(web): tooltips on icon buttons + rename "monitoring column" → "monitoring sidebar" (#1661)

- Add Mantine `Tooltip`s to the icon-only controls: Client settings, Theme
  (dynamic light/dark label), the monitoring-sidebar toggle, the list-level and
  per-entry Expand/Collapse toggles, the Pin/Unpin toggle, and the Replay
  button. Labels mirror each control's existing aria-label.
- Rename the feature term "monitoring column" → "monitoring sidebar" across the
  user-facing labels (Open/Close/Resize), comments, and tests, so the UI calls
  it a sidebar consistently.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015sMW1YZXkM7fDkdPtHpE95

* review: consistent sidebar wording + reuse MonitoringToggleProps (#1661)

Address the two optional notes from the PR #1662 review:
- Make the MonitoringToggle JSDoc voice consistent ("sidebar" throughout,
  no lingering "column").
- Drop ViewHeader's duplicate `MonitorToggleProps` and reuse the element's
  exported `MonitoringToggleProps` as the single source of truth.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015sMW1YZXkM7fDkdPtHpE95

* feat(web): slide-in/out animation for the monitoring-sidebar toggle (#1661)

The header MonitoringToggle now animates in/out via a Mantine Transition whose
in/out styles drive width + margin-left (plus opacity/translateX): as its slot
grows from 0 → the 36px icon, the flex-end header row reflows and pushes the
theme + client-settings buttons one slot to the left; the exit reverses and they
slide back over. A negative margin-left while collapsed cancels the row gap so
the theme icon stays flush-right when the toggle is absent. Only appearance/
disappearance (connect / disconnect / narrow viewport) animates — opening or
closing the sidebar leaves the toggle in place.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015sMW1YZXkM7fDkdPtHpE95

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 17:30:16 -04:00

73 lines
2.5 KiB
TypeScript

import { Text } from "@mantine/core";
export const ThemeText = Text.extend({
// `tabGlow` labels carry the `.tab-glow` class so a freshly-appeared tab can
// pulse a red glow (the keyframe + `[data-glow="on"]` trigger live in
// App.css). Auto-assigning the class keeps `className` out of the JSX (#1450).
classNames: (_theme, props) => {
if (props.variant === "tabGlow") return { root: "tab-glow" };
return {};
},
styles: (_theme, props) => {
if (props.variant === "monoBreak") {
return {
root: {
wordBreak: "break-all",
},
};
}
// Single-line text that never wraps — used inside a horizontal ScrollArea so
// a long value (e.g. a network URL in the compact column) scrolls instead of
// wrapping to many lines (#1616).
if (props.variant === "nowrap") {
return {
root: {
whiteSpace: "nowrap",
},
};
}
// A line of captured server stderr (#1621): preserve the process's own
// newlines/whitespace (`pre-wrap`) while still wrapping over-long lines
// inside the narrow monitoring sidebar (`break-word`).
if (props.variant === "consoleLine") {
return {
root: {
whiteSpace: "pre-wrap",
wordBreak: "break-word",
},
};
}
// Two small, unobtrusive labels pinned to the bottom corners of the screen
// on the same row (#1639): the build version (bottom-left) and the
// copyright notice (bottom-right). Each occupies the full-height `xl` bottom
// margin band (`height: xl` + flex centering) so the text sits vertically
// centered in it, and insets by `xl` horizontally to line up with the
// content's left/right margins. Both are grey, non-interactive (clicks pass
// through), and out of the tab/selection flow.
if (
props.variant === "versionBadge" ||
props.variant === "copyrightBadge"
) {
const horizontal =
props.variant === "versionBadge"
? { left: "var(--mantine-spacing-xl)" }
: { right: "var(--mantine-spacing-xl)" };
return {
root: {
position: "fixed",
bottom: 0,
height: "var(--mantine-spacing-xl)",
display: "flex",
alignItems: "center",
...horizontal,
zIndex: 100,
color: "var(--inspector-text-secondary)",
fontSize: "var(--mantine-font-size-xs)",
pointerEvents: "none",
userSelect: "none",
},
};
}
return { root: {} };
},
});