Skip to content

Commit e7a6f5c

Browse files
[cueweb/docs] Job/Layer/Frame context-menu parity + frame log viewer enhancements (#2426)
## Related Issues Main issue: - #2016 Issues related to this PR: - TBD - #2289 - #2291 ## Summarize your change. [cueweb] Job/Layer/Frame context-menu parity + frame log viewer enhancements Bring the Cuetopia tables to CueGUI parity across the Job, Layer and Frame right-click menus, add the supporting REST-gateway routes and dialogs, and extend the frame log viewer (search, follow/tail, line numbers, per-line copy, preview). Also adds a Blender render demo to the sandbox. 1) Job menu - [x] Set User Color paints the whole row with CueGUI's 15 default swatches plus a bright palette (app/utils/user_colors.ts); - [x] Change Comments in a new tab to Comments popup (job-comments-dialog.tsx); - [x] New auto-eat column; - [x] Set Min/Max Cores - [x] Set Min/Max GPUs - [x] Max Retries - [x] Use Local Cores - [x] Reorder - [x] Stagger via job-extra-dialogs.tsx; - [x] Show Progress Bar. This option shows a configurable command. Layer menu (layer-extra-dialogs.tsx + routes) - [x] View Layer - [x] View Dependencies - [x] Dependency Wizard (LAYER_ON_LAYER) - [x] Mark done - [x] Reorder - [x] Stagger - [x] Properties (min cores/memory/gpu-memory, threadable, tags) - [x] Eat and Mark done - [x] View Processes. 2) Frame menu (frame-extra-dialogs.tsx + routes) - [x] View Host - [x] View Dependencies - [x] Dependency Wizard (FRAME_ON_FRAME) - [x] Drop depends - [x] Mark as waiting - [x] Mark done - [x] Filter Selected Layers - [x] Reorder - [x] Preview All (external viewer configurable) - [x] Eat and Mark done - [x] View Processes. - [x] Frame range selector (frame-range-selector.tsx): drag / shift-click to select a contiguous range and Retry / Eat / Kill it. 3) Frame log viewer (app/frames/[frame-name]/page.tsx) - [x] Search bar with highlight, n/total counter, Enter/Shift+Enter navigation, case + regex toggles (frame-log-search.tsx). Follow tail mode: - [x] Auto-scroll on new lines - [x] Pause on scroll-up - [x] Jump to bottom - [x] "Tail Log" action opens it by default (last 200 lines, 1s poll). - [x] Absolute line numbers + hover/click per-line copy with toast. - [x] Frame preview thumbnail viewer (frame-preview-panel.tsx + /api/frame/preview + preview_utils.ts) 4) Fixes - [x] Correct gateway package on the layer/frame createdepend* routes (/layer.* and /frame.* -> /job.LayerInterface and /job.FrameInterface); depend creation now succeeds. - [x] Mount DependencyWizardDialog once per page (was opening twice on Monitor Jobs); Add an initialType open option. New API routes Frame: - [x] getdepends - [x] dropdepends - [x] markaswaiting - [x] preview Job: - [x] addrenderpart - [x] markdoneframes - [x] reorderframes - [x] staggerframes - [x] setmingpus - [x] setmaxgpus Layer: - [x] getdepends - [x] getoutputpaths - [x] markdone - [x] reorderframes - [x] staggerframes - [x] setmincores - [x] setminmemory - [x] setmingpumemory - [x] settags - [x] setthreadable Config Dockerfile + docker-compose.yml: - [x] NEXT_PUBLIC_CUEPROGBAR_COMMAND - [x] NEXT_PUBLIC_PREVIEW_COMMAND - [x] NEXT_PUBLIC_PREVIEW_URL build args + runtime env. Sandbox load_test_jobs.py: - [x] New `blender` subcommand renders a real image sequence and registers the layer output path so the frame preview has real frames - [x] Cross-platform Blender discovery (macOS/Windows/Linux) - [x] Standalone render_blender_demo.py wrapper - [x] README updated. [cueweb] Other menu: add Immersive + Split view to sidebar/mobile; document job/layer/frame + log-viewer features Code: - [x] app-sidebar / mobile-nav-sheet: the left sidebar (collapsed icon-rail and expanded) and the mobile nav drawer now carry the full Other menu, matching the header — Attributes, Immersive (full-screen), Split view, Show Shortcuts, Notify on Shortcut (Immersive toggles via useImmersiveMode; Split view links to the split workspace). Docs (Job/Layer/Frame context-menu parity + frame log viewer enhancements): - [x] reference: added the new env vars (NEXT_PUBLIC_CUEPROGBAR_COMMAND/_URL, NEXT_PUBLIC_PREVIEW_COMMAND/_URL); de-placeholdered the Job/Layer/Frame action tables (Reorder/Stagger, Unbook, Properties, dependency items, Preview All, Mark done, etc.) and added Set Min/Max GPUs, Use Local Cores, Set User Color, Mark as waiting; new "Frame log viewer features" table (search, follow/tail, line numbers, per-line copy, download, preview panel). - [x] developer-guide: new section listing the *-extra-dialogs, frame-log-search, frame-preview-panel, frame-range-selector, preview_utils, user_colors files and all new API routes, plus the depend-package fix, single-wizard-mount, configurable commands, and the Blender sandbox demo. - [x] getting-started / quick-starts: the new env vars in the .env config. - [x] user-guide / other-guides / tutorials: frame actions (Mark as waiting, Mark done, Preview All, frame-range selector) and the log-viewer features. - [x] README: full Job/Layer/Frame menu parity + frame log viewer bullets. Other-menu parity reflected across all guides + README (header, sidebar, and mobile drawer enumerations now include Immersive (full-screen) and Split view). ## LLM usage disclosure Parts of this solution's implementation were developed with assistance from Claude Opus.
1 parent afd01bf commit e7a6f5c

13 files changed

Lines changed: 249 additions & 32 deletions

File tree

cueweb/README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ CueWeb replicates the core functionality of CueGUI (Cuetopia and Cuecommander) i
4343
- **Cuebot Facility**`local` · `dev` · `cloud` · `external` (overridable via `NEXT_PUBLIC_CUEBOT_FACILITIES`). The active facility is shown as a small chip on the menu trigger. Each facility may target its own gateway via the server-only pair `CUEBOT_<NAME>_REST_GATEWAY_URL` / `CUEBOT_<NAME>_JWT_SECRET` (falling back to `NEXT_PUBLIC_OPENCUE_ENDPOINT` / `NEXT_JWT_SECRET`). The menu polls `/api/facility/health` every 30s to show a green/red dot per facility and disables selecting one whose gateway is down. **Manage facilities…** opens an admin screen (`/settings/facilities`) to edit each facility's gateway URL / JWT secret at runtime — applied without a redeploy, layered over the env defaults, with a change-history log; persist these overrides by pointing `CUEWEB_FACILITY_STORE` at a mounted volume.
4444
- **Cuetopia** → Monitor Jobs.
4545
- **CueCommander** → Allocations, Limits, Monitor Cue, Monitor Hosts, Redirect, Services, Shows, Stuck Frame, Subscription Graphs, Subscriptions. Unimplemented routes 404 gracefully until the corresponding pages land.
46-
- **Other****Attributes** (toggles the docked Attributes panel, see below), **Show Shortcuts** (opens the same overlay as pressing `?`), **Notify on Shortcut** (toggles the per-shortcut toast).
46+
- **Other****Attributes** (toggles the docked Attributes panel, see below), **Immersive (full-screen)** (hides the header, sidebar and status bar so the active table fills the viewport; also bound to `F` / Cmd-Ctrl+Shift+F), **Split view** (open two pages side-by-side in a resizable split workspace), **Show Shortcuts** (opens the same overlay as pressing `?`), **Notify on Shortcut** (toggles the per-shortcut toast).
4747
- **Help** → search box that searches *every* menu command in CueWeb (CueGUI parity), an **About CueWeb** dialog showing the build version, Build SHA, active Cuebot facility, masked REST gateway URL, Apache 2.0 license link, OpenCue/ASWF credits, and a **Copy diagnostics** button, plus links to the Online User Guide, Make a Suggestion, and Report a Bug (URLs overridable via `NEXT_PUBLIC_DOCS_URL` / `NEXT_PUBLIC_SUGGESTIONS_URL` / `NEXT_PUBLIC_BUGS_URL`).
4848
- Theme toggle on the right.
4949
- An always-visible **Sign out** button on the right. With an active session, `signOut()` clears it and redirects to `/login`; without a session it just navigates to `/login`. The `/login` page itself handles both auth configurations — empty `NEXT_PUBLIC_AUTH_PROVIDER` renders the **CueWeb Home** button, while a populated value renders the provider buttons.
@@ -73,7 +73,7 @@ CueWeb replicates the core functionality of CueGUI (Cuetopia and Cuecommander) i
7373
- Hidden on `/login*`; matches the chrome's translucent surface so it integrates with both light and dark themes.
7474
- **Mobile-friendly UI:**
7575
- Every authenticated route works on phone-sized viewports. The Jobs page stacks its filter / toolbar / table vertically on small screens instead of forcing a wide layout, and each data table can be swiped horizontally to reach off-screen columns.
76-
- On phones the desktop sidebar is replaced by a **hamburger** menu in the global header. Tapping it opens a side drawer mirroring every sidebar group: Dashboard, File, Cuebot Facility, Cuetopia, CueCommander, Other (Attributes / Show Shortcuts / Notify on Shortcut), and Help. The drawer is scrollable and auto-closes when you tap a navigation link.
76+
- On phones the desktop sidebar is replaced by a **hamburger** menu in the global header. Tapping it opens a side drawer mirroring every sidebar group: Dashboard, File, Cuebot Facility, Cuetopia, CueCommander, Other (Attributes / Immersive (full-screen) / Split view / Show Shortcuts / Notify on Shortcut), and Help. The drawer is scrollable and auto-closes when you tap a navigation link.
7777
- Every Jobs / Layers / Frames row has a small `` Actions button as its leftmost cell, so touch users get the full right-click menu via a tap.
7878
- The keyboard-shortcuts overlay (Other ▸ Show Shortcuts or `?`) is itself touch-friendly: every key badge in the list is tappable, so users on phones can trigger `/`, `r`, and `t` from inside the dialog instead of needing a physical keyboard.
7979
- **LAN access (CueWeb usable from phones / tablets):**
@@ -404,6 +404,8 @@ The current CueWeb system offers a robust set of features designed to enhance us
404404
- **Search:** Advanced search with regex support, dropdown suggestions, and optimized loading.
405405
- **Dark mode:** Toggle between light and dark themes.
406406
- **Actions:** Job, layer, and frame actions (pause, retry, kill, eat, and others) through CueGUI-parity right-click context menus. Includes **View Job Details** (opens the tabbed `/jobs/<jobName>` page with Overview / Layers / Frames / Comments / Dependencies), **Set Priority...** (themed 1-100 slider + number input dialog with optimistic in-row update; available on both Cuetopia Monitor Jobs and CueCommander Monitor Cue), Copy Job / Layer / Frame Name, Copy Log Path, View Log + Tail Log, and an optional **View Log on <editor>** item that launches the rqlog in VSCode / Sublime / TextMate / IntelliJ via a custom URL scheme (configured at build time, default is VSCode).
407+
- **Full Job/Layer/Frame menu parity:** the menus also cover **Set User Color** (15 CueGUI swatches + a bright palette, stored per browser), **Set Min/Max Cores** & **Set Min/Max GPUs**, **Max Retries**, **Use Local Cores**, **Reorder** / **Stagger**, **Auto-Eat**, and **Show Progress Bar** on jobs; **View Layer**, **Properties** (min cores/memory/GPU-memory, threadable, tags), **Mark done** / **Eat and Mark done**, **View Processes**, and dependency items (View / Drop / **Dependency Wizard**) on layers; and **View Host**, **Mark as waiting**, **Filter Selected Layers**, **Preview All**, **Reorder**, dependency items, plus a drag/shift-click **frame range selector** (Retry / Eat / Kill a contiguous range) on frames. **Show Progress Bar** shows a configurable launch command (`NEXT_PUBLIC_CUEPROGBAR_COMMAND` / `NEXT_PUBLIC_CUEPROGBAR_URL`); **Preview All** opens rendered output in an external viewer (`NEXT_PUBLIC_PREVIEW_COMMAND` / `NEXT_PUBLIC_PREVIEW_URL`, default `rv {paths}`).
408+
- **Frame log viewer enhancements:** in-log search (highlight + `n/total` counter, Enter / Shift+Enter, case + regex toggles), follow/tail mode (auto-scroll, pause-on-scroll-up, jump-to-bottom; **Tail Log** opens it by default at the last 200 lines with a ~1s poll), absolute line numbers, per-line copy (hover glyph / context menu, with a toast), raw-log download, and a **frame preview thumbnail** panel (`/api/frame/preview`, web-renderable formats only).
407409
- **CueSubmit (browser job submission):** dedicated `/cuesubmit` route reachable from the **CueSubmit** top-level dropdown in the header, the matching **CueSubmit > Submit Job** group in the left sidebar, and the mobile nav drawer. Mirrors the standalone CueSubmit CLI tool with Job Info / Layer Info / per-type panels for Shell / Maya / Nuke / Blender, a live read-only Final command preview that updates per-keystroke, and a multi-layer Submission Details table with add / remove / reorder controls. Browser-only conveniences: per-field autocomplete history (Job Name / Shot / Layer Name), draft auto-save so refreshes don't wipe a multi-layer setup, themed `?` help popovers for frame-spec patterns and cuebot tokens, themed Radix Reset-confirm dialog, and a **View in Monitor Jobs** deep-link button on the resulting job detail page. Sandbox-tuned defaults (Memory `256m`, Facility `local`, stable non-zero per-user UID) so a `sleep 5` test job runs end-to-end out of the box.
408410
- **Email Artist:** right-click a job and pick **Email Artist...** to open a themed dialog mirroring CueGUI's Email dialog (From / To / CC / BCC / Subject / Body), pre-filled from the job (artist as **To**, `<show>-<suffix>@<domain>` as **From** / **CC**, `cuemail: please check <jobName>` as **Subject**) and editable. Send hands the result to the user's default mail client via a `mailto:` URL. Configure the placeholders at build time with `NEXT_PUBLIC_EMAIL_DOMAIN` (default `your.domain.com`) and `NEXT_PUBLIC_EMAIL_SUPPORT_SUFFIX` (default `pst`).
409411
- **Request Cores:** right-click a job and pick **Request Cores...** to open a themed email composer mirroring CueGUI's `RequestCoresDialog`, pre-filled with **From** (your signed-in session), **CC** (`<show>-support@<domain>`), and **Subject** (`Requesting Cores for <jobName>`); the body is auto-populated with a fixed-width table of the job's still-active layers (Layer Name / Minimum Memory / Min Cores), followed by editable **Date/Time by which completion is needed** and **Additional notes** sections. Send hands the result to your default mail client via a `mailto:` URL. Configure the support-team alias at build time with `NEXT_PUBLIC_EMAIL_REQUEST_CORES_SUFFIX` (default `support`).

cueweb/components/ui/app-sidebar.tsx

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ import {
3131
ChevronLeft,
3232
ChevronRight,
3333
Cloud,
34+
Columns,
3435
Film,
3536
FolderCog,
3637
Gauge,
3738
HelpCircle,
3839
Keyboard,
3940
Layers3,
41+
Maximize,
4042
LayoutDashboard,
4143
LayoutGrid,
4244
Lock,
@@ -73,7 +75,9 @@ import { useCuebotFacility } from "@/app/utils/use_cuebot_facility";
7375
import { useDisableJobInteraction } from "@/app/utils/use_disable_job_interaction";
7476
import { useShowDependencyGraph } from "@/app/utils/use_show_dependency_graph";
7577
import { useShortcutNotifications } from "@/app/utils/use_shortcut_notifications";
78+
import { useImmersiveMode } from "@/app/utils/use_immersive_mode";
7679
import { useEnabledPlugins } from "@/app/utils/use_plugin_menu";
80+
import { buildSplitUrl, DEFAULT_LEFT, DEFAULT_RIGHT } from "@/app/utils/split_view_utils";
7781
import { CUEWEB_OPEN_SHORTCUTS_EVENT } from "@/components/ui/shortcuts-overlay";
7882
import { getPlugins } from "@/lib/plugins";
7983
import { cn } from "@/lib/utils";
@@ -167,6 +171,7 @@ function groupContainsActive(pathname: string | null, group: NavGroup): boolean
167171
const FILE_GROUP_LABEL = "File";
168172
const FACILITY_GROUP_LABEL = "Cuebot Facility";
169173
const OTHER_GROUP_LABEL = "Other";
174+
const SPLIT_VIEW_HREF = buildSplitUrl(DEFAULT_LEFT, DEFAULT_RIGHT);
170175
const HELP_GROUP_LABEL = "Help";
171176

172177
export function AppSidebar() {
@@ -186,6 +191,7 @@ export function AppSidebar() {
186191
enabled: shortcutNotificationsEnabled,
187192
toggle: toggleShortcutNotifications,
188193
} = useShortcutNotifications();
194+
const { immersive, toggle: toggleImmersive } = useImmersiveMode();
189195
const openShortcutsOverlay = React.useCallback(() => {
190196
window.dispatchEvent(new CustomEvent(CUEWEB_OPEN_SHORTCUTS_EVENT));
191197
}, []);
@@ -657,6 +663,33 @@ export function AppSidebar() {
657663
<span className="sr-only">Attributes</span>
658664
</button>
659665
</li>
666+
<li>
667+
<button
668+
type="button"
669+
onClick={toggleImmersive}
670+
aria-pressed={immersive}
671+
title={`Other - Immersive (full-screen)${immersive ? " (on)" : ""}`}
672+
className={cn(
673+
"flex w-full items-center justify-center rounded-md px-3 py-2 text-sm font-medium transition-colors",
674+
immersive
675+
? "bg-foreground/10 text-foreground"
676+
: "text-foreground/70 hover:bg-foreground/5 hover:text-foreground",
677+
)}
678+
>
679+
<Maximize className="h-4 w-4 shrink-0" aria-hidden="true" />
680+
<span className="sr-only">Immersive (full-screen)</span>
681+
</button>
682+
</li>
683+
<li>
684+
<Link
685+
href={SPLIT_VIEW_HREF}
686+
title="Other - Split view"
687+
className="flex w-full items-center justify-center rounded-md px-3 py-2 text-sm font-medium text-foreground/70 transition-colors hover:bg-foreground/5 hover:text-foreground"
688+
>
689+
<Columns className="h-4 w-4 shrink-0" aria-hidden="true" />
690+
<span className="sr-only">Split view</span>
691+
</Link>
692+
</li>
660693
<li>
661694
<button
662695
type="button"
@@ -726,6 +759,38 @@ export function AppSidebar() {
726759
</span>
727760
</button>
728761
</li>
762+
<li>
763+
<button
764+
type="button"
765+
onClick={toggleImmersive}
766+
aria-pressed={immersive}
767+
className={cn(
768+
"flex w-full items-center gap-3 rounded-md px-3 py-1.5 text-sm font-medium transition-colors",
769+
immersive
770+
? "bg-foreground/10 text-foreground"
771+
: "text-foreground/70 hover:bg-foreground/5 hover:text-foreground",
772+
)}
773+
title="Hide the header, sidebar and status bar (also F / Cmd-Ctrl+Shift+F)"
774+
>
775+
<Maximize className="h-4 w-4 shrink-0" aria-hidden="true" />
776+
<span className="flex-1 truncate text-left">Immersive (full-screen)</span>
777+
<span className="ml-2 flex h-4 w-4 items-center justify-center">
778+
{immersive && (
779+
<Check className="h-4 w-4" aria-hidden="true" />
780+
)}
781+
</span>
782+
</button>
783+
</li>
784+
<li>
785+
<Link
786+
href={SPLIT_VIEW_HREF}
787+
className="flex w-full items-center gap-3 rounded-md px-3 py-1.5 text-sm font-medium text-foreground/70 transition-colors hover:bg-foreground/5 hover:text-foreground"
788+
title="Open two pages side-by-side in a resizable split workspace"
789+
>
790+
<Columns className="h-4 w-4 shrink-0" aria-hidden="true" />
791+
<span className="flex-1 truncate text-left">Split view</span>
792+
</Link>
793+
</li>
729794
<li>
730795
<button
731796
type="button"

cueweb/components/ui/attributes-panel.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ import { cn } from "@/lib/utils";
5151
/** Small copy-to-clipboard icon button used for attribute keys and values. */
5252
function CopyButton({ text, what }: { text: string; what: string }) {
5353
const [copied, setCopied] = React.useState(false);
54+
// Track the "copied" reset timer so it can be cancelled if the button
55+
// unmounts (e.g. the selection changes) before it fires, avoiding a state
56+
// update on an unmounted component.
57+
const timeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);
58+
React.useEffect(() => {
59+
return () => {
60+
if (timeoutRef.current) clearTimeout(timeoutRef.current);
61+
};
62+
}, []);
5463
return (
5564
<button
5665
type="button"
@@ -61,7 +70,8 @@ function CopyButton({ text, what }: { text: string; what: string }) {
6170
try {
6271
await navigator.clipboard.writeText(text);
6372
setCopied(true);
64-
setTimeout(() => setCopied(false), 1200);
73+
if (timeoutRef.current) clearTimeout(timeoutRef.current);
74+
timeoutRef.current = setTimeout(() => setCopied(false), 1200);
6575
} catch {
6676
toastWarning("Could not copy to clipboard.");
6777
}

cueweb/components/ui/job-details-inline.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,8 +356,9 @@ export function JobDetailsInline({ job, username }: JobDetailsInlineProps) {
356356
job={job}
357357
isFramesTable
358358
// Single-click loads the frame into the Attributes panel
359-
// (double-click still opens the log viewer).
360-
onRowClick={(row) => handleFrameClick(row as Frame)}
359+
// (double-click still opens the log viewer). SimpleDataTable
360+
// passes row.original (a Frame), so the handler takes it directly.
361+
onRowClick={handleFrameClick}
361362
selectedRowId={selectedFrame?.id ?? null}
362363
columnVisibilityStorageKey="cueweb.frames.columnVisibility"
363364
viewsPageKey="frames"

cueweb/components/ui/mobile-nav-sheet.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import * as React from "react";
2929
import Link from "next/link";
3030
import { usePathname } from "next/navigation";
31-
import { Check, Keyboard, LayoutDashboard } from "lucide-react";
31+
import { Check, Columns, Keyboard, LayoutDashboard } from "lucide-react";
3232

3333
import { Sheet, SheetContent, SheetTitle } from "@/components/ui/sheet";
3434
import { NAV_MENUS } from "@/app/utils/menus";
@@ -37,12 +37,16 @@ import { useAttributesPanel } from "@/app/utils/use_attributes_panel";
3737
import { useCuebotFacility } from "@/app/utils/use_cuebot_facility";
3838
import { useDisableJobInteraction } from "@/app/utils/use_disable_job_interaction";
3939
import { useShortcutNotifications } from "@/app/utils/use_shortcut_notifications";
40+
import { useImmersiveMode } from "@/app/utils/use_immersive_mode";
41+
import { buildSplitUrl, DEFAULT_LEFT, DEFAULT_RIGHT } from "@/app/utils/split_view_utils";
4042
import { CUEWEB_OPEN_SHORTCUTS_EVENT } from "@/components/ui/shortcuts-overlay";
4143
import { cn } from "@/lib/utils";
4244

4345
/** Dispatched by the hamburger button in AppHeader. */
4446
export const CUEWEB_OPEN_MOBILE_NAV_EVENT = "cueweb:open-mobile-nav";
4547

48+
const SPLIT_VIEW_HREF = buildSplitUrl(DEFAULT_LEFT, DEFAULT_RIGHT);
49+
4650
function isActive(pathname: string | null, href: string): boolean {
4751
if (!pathname) return false;
4852
if (href === "/") return pathname === "/";
@@ -58,6 +62,7 @@ export function MobileNavSheet() {
5862
const { isOpen: attributesOpen, toggle: toggleAttributes } = useAttributesPanel();
5963
const { enabled: shortcutNotificationsEnabled, toggle: toggleShortcutNotifications } =
6064
useShortcutNotifications();
65+
const { immersive, toggle: toggleImmersive } = useImmersiveMode();
6166

6267
React.useEffect(() => {
6368
const handler = () => setOpen(true);
@@ -144,6 +149,18 @@ export function MobileNavSheet() {
144149
checked={attributesOpen}
145150
onToggle={toggleAttributes}
146151
/>
152+
<MobileToggle
153+
label="Immersive (full-screen)"
154+
checked={immersive}
155+
onToggle={toggleImmersive}
156+
/>
157+
<MobileLink
158+
href={SPLIT_VIEW_HREF}
159+
label="Split view"
160+
icon={<Columns className="h-4 w-4 shrink-0" aria-hidden="true" />}
161+
active={isActive(pathname, "/split")}
162+
onSelect={close}
163+
/>
147164
<MobileAction
148165
label="Show Shortcuts"
149166
icon={<Keyboard className="h-4 w-4 shrink-0" aria-hidden="true" />}

docs/_docs/concepts/cueweb-rest-gateway.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ CueWeb is a web-based application that brings the core functionality of CueGUI t
3131

3232
### Key Features
3333

34-
- **Persistent Global Header**: OpenCue logo + **CueWeb** wordmark, plus the full CueGUI menu bar (**File**, **Cuebot Facility**, **Cuetopia**, **CueCommander**, **Other** [Attributes / Show Shortcuts / Notify on Shortcut], **Help** with a search box that finds commands across every menu), a theme toggle, and an always-visible Sign out button
34+
- **Persistent Global Header**: OpenCue logo + **CueWeb** wordmark, plus the full CueGUI menu bar (**File**, **Cuebot Facility**, **Cuetopia**, **CueCommander**, **Other** [Attributes / Immersive (full-screen) / Split view / Show Shortcuts / Notify on Shortcut], **Help** with a search box that finds commands across every menu), a theme toggle, and an always-visible Sign out button
3535
- **Collapsible Left Sidebar**: Same six groups as the header, organized as accordion sections; persists open/closed state and overall collapsed-vs-expanded width across reloads
3636
- **Disable Job Interaction**: Global read-only safety toggle (File ▸ Disable Job Interaction) that dims every destructive action and shows an amber banner under the header
3737
- **Attributes Panel**: Docked drawer (Other ▸ Attributes) with a position picker (right / bottom / left / top), filter input, and a collapsible key/value tree of the selected entity

0 commit comments

Comments
 (0)