From cef3b86c95cb257be7c61ac3bdc4dd6dc9692e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Thu, 30 Jul 2026 02:00:05 +0200 Subject: [PATCH] chore(studio): remove fully rolled-out studio feature flags (#2889) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What Removes six Studio feature flags that have been default-`true` for 7+ weeks. Each is reachable under two env names, so this deletes **12 `VITE_STUDIO_*` env vars**: | Flag constant | Env names removed | Default-on since | |---|---|---| | `STUDIO_PREVIEW_MANUAL_EDITING_ENABLED` | `VITE_STUDIO_ENABLE_PREVIEW_MANUAL_DRAGGING`, `VITE_STUDIO_PREVIEW_MANUAL_EDITING_ENABLED` | 2026-05-12 | | `STUDIO_INSPECTOR_PANELS_ENABLED` (+ its `STUDIO_PREVIEW_SELECTION_ENABLED` alias) | `VITE_STUDIO_ENABLE_INSPECTOR_PANELS`, `VITE_STUDIO_INSPECTOR_PANELS_ENABLED` | 2026-05-12 | | `STUDIO_BLOCKS_PANEL_ENABLED` | `VITE_STUDIO_ENABLE_BLOCKS_PANEL`, `VITE_STUDIO_BLOCKS_PANEL_ENABLED` | 2026-05-18 | | `STUDIO_GSAP_PANEL_ENABLED` | `VITE_STUDIO_ENABLE_GSAP_PANEL`, `VITE_STUDIO_GSAP_PANEL_ENABLED` | 2026-05-28 | | `STUDIO_KEYFRAMES_ENABLED` | `VITE_STUDIO_ENABLE_KEYFRAMES`, `VITE_STUDIO_KEYFRAMES_ENABLED` | 2026-06-05 | | `STUDIO_RAZOR_TOOL_ENABLED` | `VITE_STUDIO_ENABLE_RAZOR_TOOL`, `VITE_STUDIO_RAZOR_TOOL_ENABLED` | 2026-06-10 | ## Why Every one of these shipped as a rollout gate, went to `true`, and then stayed. Because none of them was ever flipped back, the `false` branch was unreachable in practice while still costing a real import, a real conditional, and a real "what happens if this is off?" question at ~90 call sites across 25 files. The bigger cost is what the dead branch kept alive. Removing the flags also removes the disabled-Studio code paths that only existed to serve them: - the greyed-out, `disabled`, "Manual editing is temporarily disabled" Inspector button in `StudioHeader` (and the `STUDIO_MANUAL_EDITING_DISABLED_TITLE` constant behind it) - the inspector-off reset `useEffect` in `useDomSelection`, which force-cleared selection and redirected the right panel to Renders - three selection kill-switch early-returns in `useDomSelection` (`applyDomSelection`, `handleTimelineElementSelect`, `applyMarqueeSelection`) - the tab-redirect branch in `normalizeStudioUrlPanelTab`, whose `options.inspectorPanelsEnabled` parameter had no production caller at all (only tests passed it) ## How No behavior change: every flag was removed by keeping its default-`true` side. The call-site edits are three mechanical boolean shapes (`X && rest` → `rest`, `rest && X` → `rest`, `!X || rest` → `rest`), applied by script for uniformity. Everything else (ternaries, `if` guards, unreachable blocks, JSX wrappers that had no other condition) was done by hand and the whole diff was read line by line afterwards. `resolveStudioBooleanEnvFlag` and the `import.meta.env` / `window.__HF_STUDIO_ENV__` plumbing stay: three flags still use them (`STUDIO_FLAT_INSPECTOR_ENABLED`, `STUDIO_SDK_CUTOVER_ENABLED`, `STUDIO_SDK_RESOLVER_SHADOW_ENABLED`). Its unit tests kept their coverage but now exercise a live flag pair instead of retired env names, so no dead `VITE_STUDIO_*` string is left in the repo. Net **-191 lines** (236 insertions, 427 deletions across 25 files); most insertions are reindentation of JSX that lost a wrapper. ### Deliberately not in scope Flags authored by other people are untouched, even where they look similarly settled: - `VITE_STUDIO_ENABLE_FLAT_INSPECTOR` / `VITE_STUDIO_FLAT_INSPECTOR_ENABLED` (default true, but not mine) - `VITE_STUDIO_SDK_CUTOVER_ENABLED`, `VITE_STUDIO_SDK_CUTOVER_FAMILIES`, `VITE_STUDIO_SDK_RESOLVER_SHADOW_ENABLED` (SDK cutover canary, still soaking) - `VITE_HYPERFRAMES_NO_TELEMETRY` Mine but genuinely long-lived configuration rather than rollout gates, so they stay: `VITE_STUDIO_DISCOVERY_PORTS`, `VITE_HYPERFRAMES_FEEDBACK_INTERVAL`, `VITE_HYPERFRAMES_NO_FEEDBACK` (a documented user opt-out), plus the `HYPERFRAMES_*` binary paths, API URLs, cache sizes, and timeouts. `VITE_STUDIO_ENABLE_MOTION_PANEL` / `VITE_STUDIO_MOTION_PANEL_ENABLED` were already retired from production code before this PR; they only survived as placeholder names inside the resolver's unit tests, and this PR swaps those out. ## Test plan - [x] Unit tests added/updated - dropped the two tests asserting removed flag defaults; retargeted the `resolveStudioBooleanEnvFlag` cases at a live flag pair; updated `studioUrlState` tests for the narrowed `normalizeStudioUrlPanelTab` signature (now also asserts an unknown tab returns `null`). - [x] Manual testing performed - see below. - [ ] Documentation updated (if applicable) - not needed; no removed name appears in `docs/`, `skills/`, or `registry/`. (`docs/changelog.mdx` has one historical entry naming `STUDIO_KEYFRAMES_ENABLED`; changelog history is left as written.) ``` packages/studio: bunx vitest run # 280 files, 3116 tests pass, 1 skipped packages/studio: bunx tsc --noEmit # clean bun run build # green (all packages) bunx oxlint <25 changed files> # 0 warnings, 0 errors bunx oxfmt --check <25 changed files> # clean ``` Two extra checks, because part of this diff was script-generated: 1. Zero references to any removed flag constant or env name remain anywhere outside `docs/changelog.mdx`. 2. Diffed every string literal in each changed non-test file against `origin/main`. The only differences are the intended removals: the 12 env names, `"Manual editing is temporarily disabled"`, the `"cursor-not-allowed …"` disabled class, the 3-column `"1fr 1fr 1fr"` grid, and the `"renders"` redirect literals. No user-facing label, tooltip, or class string changed by accident. --- packages/studio/src/App.tsx | 7 +- .../studio/src/components/StudioHeader.tsx | 21 +- .../src/components/StudioRightPanel.tsx | 36 +-- .../studio/src/components/TimelineToolbar.tsx | 252 +++++++++--------- .../components/editor/PropertyPanel.test.tsx | 5 +- .../src/components/editor/PropertyPanel.tsx | 19 +- .../components/editor/PropertyPanelFlat.tsx | 2 - .../editor/manualEditingAvailability.test.ts | 53 +--- .../editor/manualEditingAvailability.ts | 41 --- .../editor/propertyPanel3dTransform.tsx | 3 +- .../editor/propertyPanelFlatLayoutSection.tsx | 3 +- .../src/components/nle/PreviewOverlays.tsx | 28 +- .../src/components/sidebar/LeftSidebar.tsx | 37 ++- packages/studio/src/hooks/useAppHotkeys.ts | 3 +- .../studio/src/hooks/useDomEditPreviewSync.ts | 3 +- packages/studio/src/hooks/useDomEditWiring.ts | 5 +- packages/studio/src/hooks/useDomSelection.ts | 27 -- .../studio/src/hooks/usePreviewInteraction.ts | 5 +- .../studio/src/hooks/useStudioContextValue.ts | 10 +- .../studio/src/player/components/Timeline.tsx | 3 +- .../src/player/components/TimelineLanes.tsx | 68 +++-- .../components/useAutoExpandKeyframedClips.ts | 2 - .../components/useTimelineTrackLayout.ts | 6 +- .../studio/src/utils/studioUrlState.test.ts | 13 +- packages/studio/src/utils/studioUrlState.ts | 11 +- 25 files changed, 236 insertions(+), 427 deletions(-) diff --git a/packages/studio/src/App.tsx b/packages/studio/src/App.tsx index 7921f28e9..24b69e88d 100644 --- a/packages/studio/src/App.tsx +++ b/packages/studio/src/App.tsx @@ -43,7 +43,6 @@ import { import type { DomEditSelection } from "./components/editor/domEditing"; import { StudioHeader } from "./components/StudioHeader"; import { useGestureCommit } from "./hooks/useGestureCommit"; -import { STUDIO_KEYFRAMES_ENABLED } from "./components/editor/manualEditingAvailability"; import { GestureTrailOverlay } from "./components/editor/GestureTrailOverlay"; import { StudioLeftSidebar } from "./components/StudioLeftSidebar"; import { EditorShell } from "./components/EditorShell"; @@ -263,9 +262,7 @@ export function StudioApp() { onUngroupSelection: () => domEditSessionRef.current.handleUngroupSelection(), activeCompPath, forceReloadSdkSession: sdkHandle.forceReload, - onToggleRecording: STUDIO_KEYFRAMES_ENABLED - ? () => handleToggleRecordingRef.current() - : undefined, + onToggleRecording: () => handleToggleRecordingRef.current(), }); const sidebarTabRef = useRef({ select: (t: SidebarTab) => leftSidebarRef.current?.selectTab(t), @@ -367,7 +364,7 @@ export function StudioApp() { isGestureRecordingRef, }); handleToggleRecordingRef.current = handleToggleRecording; - const recordingToggle = STUDIO_KEYFRAMES_ENABLED ? handleToggleRecording : undefined; + const recordingToggle = handleToggleRecording; const canvasRectRef = useRef(null); useLayoutEffect(() => { if (gestureState !== "recording" || !previewIframe) { diff --git a/packages/studio/src/components/StudioHeader.tsx b/packages/studio/src/components/StudioHeader.tsx index f6110cd9f..6154a4d33 100644 --- a/packages/studio/src/components/StudioHeader.tsx +++ b/packages/studio/src/components/StudioHeader.tsx @@ -1,9 +1,5 @@ import { useRef, type MouseEvent } from "react"; import { RotateCcw, RotateCw, Camera } from "../icons/SystemIcons"; -import { - STUDIO_INSPECTOR_PANELS_ENABLED, - STUDIO_MANUAL_EDITING_DISABLED_TITLE, -} from "./editor/manualEditingAvailability"; import { getHistoryShortcutLabel } from "../utils/studioHelpers"; import { useStudioShellContext } from "../contexts/StudioContext"; import { usePanelLayoutContext } from "../contexts/PanelLayoutContext"; @@ -328,16 +324,10 @@ export function StudioHeader({ {capturing ? "Capturing…" : "Capture"} - + - - - - - {/* Divider: tool-mode | editing-actions */} - - {STUDIO_KEYFRAMES_ENABLED && gsapAnimId && ( + {gsapAnimId && ( commitManualSize("width", next)} /> - {STUDIO_KEYFRAMES_ENABLED && gsapAnimId && ( + {gsapAnimId && ( commitManualSize("height", next)} /> - {STUDIO_KEYFRAMES_ENABLED && gsapAnimId && ( + {gsapAnimId && ( commitManualRotation(next.replace("°", ""))} /> - {STUDIO_KEYFRAMES_ENABLED && gsapAnimId && ( + {gsapAnimId && ( )} - {STUDIO_GSAP_PANEL_ENABLED && - onUpdateGsapProperty && + {onUpdateGsapProperty && onUpdateGsapMeta && onDeleteGsapAnimation && onAddGsapProperty && diff --git a/packages/studio/src/components/editor/PropertyPanelFlat.tsx b/packages/studio/src/components/editor/PropertyPanelFlat.tsx index 7b9447949..278dceafa 100644 --- a/packages/studio/src/components/editor/PropertyPanelFlat.tsx +++ b/packages/studio/src/components/editor/PropertyPanelFlat.tsx @@ -16,7 +16,6 @@ import { FlatMediaSection } from "./propertyPanelFlatMediaSection"; import { deriveElementTiming } from "./propertyPanelFlatTimingDerivation"; import { createGsapLivePreview } from "./gsapLivePreview"; import { formatTextFieldPreview } from "./propertyPanelSections"; -import { STUDIO_GSAP_PANEL_ENABLED } from "./manualEditingAvailability"; import { useColorGradingController } from "./useColorGradingController"; import { usePlayerStore } from "../../player"; import { @@ -224,7 +223,6 @@ export function PropertyPanelFlat({ // Match the legacy Motion gate while preserving TypeScript narrowing. const showMotionTiming = Boolean(sections.timing); const gsapEffectHandlers = - STUDIO_GSAP_PANEL_ENABLED && onUpdateGsapProperty && onUpdateGsapMeta && onDeleteGsapAnimation && diff --git a/packages/studio/src/components/editor/manualEditingAvailability.test.ts b/packages/studio/src/components/editor/manualEditingAvailability.test.ts index 5bc29cc43..b661d1f2f 100644 --- a/packages/studio/src/components/editor/manualEditingAvailability.test.ts +++ b/packages/studio/src/components/editor/manualEditingAvailability.test.ts @@ -16,35 +16,18 @@ describe("manual editing availability", () => { vi.resetModules(); }); - it("enables inspector selection and manual dragging by default", async () => { - const availability = await loadAvailabilityWithEnv({}); - - expect(availability.STUDIO_PREVIEW_MANUAL_EDITING_ENABLED).toBe(true); - expect(availability.STUDIO_PREVIEW_SELECTION_ENABLED).toBe(true); - expect(availability.STUDIO_INSPECTOR_PANELS_ENABLED).toBe(true); - }); - - it("disables preview selection when the inspector panel flag is explicitly off", async () => { - const availability = await loadAvailabilityWithEnv({ - VITE_STUDIO_ENABLE_INSPECTOR_PANELS: "0", - }); - - expect(availability.STUDIO_INSPECTOR_PANELS_ENABLED).toBe(false); - expect(availability.STUDIO_PREVIEW_SELECTION_ENABLED).toBe(false); - }); - it("enables feature flags with explicit truthy env values", () => { expect( resolveStudioBooleanEnvFlag( - { VITE_STUDIO_ENABLE_PREVIEW_MANUAL_DRAGGING: "true" }, - ["VITE_STUDIO_ENABLE_PREVIEW_MANUAL_DRAGGING"], + { VITE_STUDIO_ENABLE_FLAT_INSPECTOR: "true" }, + ["VITE_STUDIO_ENABLE_FLAT_INSPECTOR"], false, ), ).toBe(true); expect( resolveStudioBooleanEnvFlag( - { VITE_STUDIO_ENABLE_MOTION_PANEL: "1" }, - ["VITE_STUDIO_ENABLE_MOTION_PANEL"], + { VITE_STUDIO_SDK_CUTOVER_ENABLED: "1" }, + ["VITE_STUDIO_SDK_CUTOVER_ENABLED"], false, ), ).toBe(true); @@ -53,15 +36,15 @@ describe("manual editing availability", () => { it("disables feature flags with explicit falsy env values", () => { expect( resolveStudioBooleanEnvFlag( - { VITE_STUDIO_ENABLE_PREVIEW_MANUAL_DRAGGING: "off" }, - ["VITE_STUDIO_ENABLE_PREVIEW_MANUAL_DRAGGING"], + { VITE_STUDIO_ENABLE_FLAT_INSPECTOR: "off" }, + ["VITE_STUDIO_ENABLE_FLAT_INSPECTOR"], true, ), ).toBe(false); expect( resolveStudioBooleanEnvFlag( - { VITE_STUDIO_ENABLE_MOTION_PANEL: "0" }, - ["VITE_STUDIO_ENABLE_MOTION_PANEL"], + { VITE_STUDIO_SDK_CUTOVER_ENABLED: "0" }, + ["VITE_STUDIO_SDK_CUTOVER_ENABLED"], true, ), ).toBe(false); @@ -70,18 +53,8 @@ describe("manual editing availability", () => { it("supports legacy flag aliases after the preferred name", () => { expect( resolveStudioBooleanEnvFlag( - { VITE_STUDIO_PREVIEW_MANUAL_EDITING_ENABLED: "yes" }, - [ - "VITE_STUDIO_ENABLE_PREVIEW_MANUAL_DRAGGING", - "VITE_STUDIO_PREVIEW_MANUAL_EDITING_ENABLED", - ], - false, - ), - ).toBe(true); - expect( - resolveStudioBooleanEnvFlag( - { VITE_STUDIO_MOTION_PANEL_ENABLED: "enabled" }, - ["VITE_STUDIO_ENABLE_MOTION_PANEL", "VITE_STUDIO_MOTION_PANEL_ENABLED"], + { VITE_STUDIO_FLAT_INSPECTOR_ENABLED: "yes" }, + ["VITE_STUDIO_ENABLE_FLAT_INSPECTOR", "VITE_STUDIO_FLAT_INSPECTOR_ENABLED"], false, ), ).toBe(true); @@ -91,10 +64,10 @@ describe("manual editing availability", () => { expect( resolveStudioBooleanEnvFlag( { - VITE_STUDIO_ENABLE_INSPECTOR_PANELS: "off", - VITE_STUDIO_INSPECTOR_PANELS_ENABLED: "on", + VITE_STUDIO_ENABLE_FLAT_INSPECTOR: "off", + VITE_STUDIO_FLAT_INSPECTOR_ENABLED: "on", }, - ["VITE_STUDIO_ENABLE_INSPECTOR_PANELS", "VITE_STUDIO_INSPECTOR_PANELS_ENABLED"], + ["VITE_STUDIO_ENABLE_FLAT_INSPECTOR", "VITE_STUDIO_FLAT_INSPECTOR_ENABLED"], true, ), ).toBe(false); diff --git a/packages/studio/src/components/editor/manualEditingAvailability.ts b/packages/studio/src/components/editor/manualEditingAvailability.ts index 04eea93b6..d156bf694 100644 --- a/packages/studio/src/components/editor/manualEditingAvailability.ts +++ b/packages/studio/src/components/editor/manualEditingAvailability.ts @@ -1,7 +1,5 @@ export type StudioFeatureFlagEnv = Record; -const STUDIO_PREVIEW_MANUAL_DRAGGING_ENV = "VITE_STUDIO_ENABLE_PREVIEW_MANUAL_DRAGGING"; -const STUDIO_INSPECTOR_PANELS_ENV = "VITE_STUDIO_ENABLE_INSPECTOR_PANELS"; const TRUTHY_ENV_VALUES = new Set(["1", "true", "yes", "on", "enabled"]); const FALSY_ENV_VALUES = new Set(["0", "false", "no", "off", "disabled"]); @@ -40,44 +38,6 @@ const runtimeEnv = : {}; const env = { ...(import.meta.env ?? {}), ...runtimeEnv } as StudioFeatureFlagEnv; -export const STUDIO_PREVIEW_MANUAL_EDITING_ENABLED = resolveStudioBooleanEnvFlag( - env, - [STUDIO_PREVIEW_MANUAL_DRAGGING_ENV, "VITE_STUDIO_PREVIEW_MANUAL_EDITING_ENABLED"], - true, -); - -export const STUDIO_INSPECTOR_PANELS_ENABLED = resolveStudioBooleanEnvFlag( - env, - [STUDIO_INSPECTOR_PANELS_ENV, "VITE_STUDIO_INSPECTOR_PANELS_ENABLED"], - true, -); - -export const STUDIO_BLOCKS_PANEL_ENABLED = resolveStudioBooleanEnvFlag( - env, - ["VITE_STUDIO_ENABLE_BLOCKS_PANEL", "VITE_STUDIO_BLOCKS_PANEL_ENABLED"], - true, -); - -export const STUDIO_GSAP_PANEL_ENABLED = resolveStudioBooleanEnvFlag( - env, - ["VITE_STUDIO_ENABLE_GSAP_PANEL", "VITE_STUDIO_GSAP_PANEL_ENABLED"], - true, -); - -export const STUDIO_KEYFRAMES_ENABLED = resolveStudioBooleanEnvFlag( - env, - ["VITE_STUDIO_ENABLE_KEYFRAMES", "VITE_STUDIO_KEYFRAMES_ENABLED"], - true, -); - -export const STUDIO_RAZOR_TOOL_ENABLED = resolveStudioBooleanEnvFlag( - env, - ["VITE_STUDIO_ENABLE_RAZOR_TOOL", "VITE_STUDIO_RAZOR_TOOL_ENABLED"], - true, -); - -export const STUDIO_PREVIEW_SELECTION_ENABLED = STUDIO_INSPECTOR_PANELS_ENABLED; - // Stage 7 Step 3c: SDK cutover — routes inline-style ops through SDK dispatch // instead of the server patch-element API. Default false; enable via // VITE_STUDIO_SDK_CUTOVER_ENABLED=true. Requires SDK session to be open. @@ -114,5 +74,4 @@ export const STUDIO_FLAT_INSPECTOR_ENABLED = resolveStudioBooleanEnvFlag( true, ); -export const STUDIO_MANUAL_EDITING_DISABLED_TITLE = "Manual editing is temporarily disabled"; import { resolveEnabledSdkFamilies } from "../../utils/sdkCutoverPolicy"; diff --git a/packages/studio/src/components/editor/propertyPanel3dTransform.tsx b/packages/studio/src/components/editor/propertyPanel3dTransform.tsx index a74ebc9bc..e38cc58ee 100644 --- a/packages/studio/src/components/editor/propertyPanel3dTransform.tsx +++ b/packages/studio/src/components/editor/propertyPanel3dTransform.tsx @@ -1,6 +1,5 @@ import { useState } from "react"; import type { DomEditSelection } from "./domEditingTypes"; -import { STUDIO_KEYFRAMES_ENABLED } from "./manualEditingAvailability"; import { MetricField } from "./propertyPanelPrimitives"; import { KeyframeNavigation } from "./KeyframeNavigation"; import { formatPxMetricValue, parsePxMetricValue, RESPONSIVE_GRID } from "./propertyPanelHelpers"; @@ -259,7 +258,7 @@ function Transform3dField({ }} /> - {STUDIO_KEYFRAMES_ENABLED && (gsapAnimId || onCommitAnimatedProperty) && ( + {(gsapAnimId || onCommitAnimatedProperty) && ( ) { const track = useTrackDesignInput(); - if (!STUDIO_KEYFRAMES_ENABLED || !gsapAnimId) return null; + if (!gsapAnimId) return null; const hasKeyframesOnProp = Boolean(navKeyframes?.some((kf) => property in kf.properties)); return ( diff --git a/packages/studio/src/components/nle/PreviewOverlays.tsx b/packages/studio/src/components/nle/PreviewOverlays.tsx index 77781d993..d16a98f5d 100644 --- a/packages/studio/src/components/nle/PreviewOverlays.tsx +++ b/packages/studio/src/components/nle/PreviewOverlays.tsx @@ -4,12 +4,6 @@ import { DomEditOverlay } from "../editor/DomEditOverlay"; import { MotionPathOverlay } from "../editor/MotionPathOverlay"; import { SnapToolbar } from "../editor/SnapToolbar"; import { useCompositionDimensions } from "../../hooks/useCompositionDimensions"; -import { - STUDIO_INSPECTOR_PANELS_ENABLED, - STUDIO_KEYFRAMES_ENABLED, - STUDIO_PREVIEW_MANUAL_EDITING_ENABLED, - STUDIO_PREVIEW_SELECTION_ENABLED, -} from "../editor/manualEditingAvailability"; import { useStudioPlaybackContext, useStudioShellContext } from "../../contexts/StudioContext"; import { useDomEditActionsContext, @@ -203,21 +197,17 @@ export function PreviewOverlays({ return ; } - if (!STUDIO_INSPECTOR_PANELS_ENABLED) return null; - return ( <> - {STUDIO_KEYFRAMES_ENABLED && ( - - )} + {gestureOverlay} ); diff --git a/packages/studio/src/components/sidebar/LeftSidebar.tsx b/packages/studio/src/components/sidebar/LeftSidebar.tsx index 1b3d20824..b27edfb20 100644 --- a/packages/studio/src/components/sidebar/LeftSidebar.tsx +++ b/packages/studio/src/components/sidebar/LeftSidebar.tsx @@ -12,7 +12,6 @@ import { AssetsTab } from "./AssetsTab"; import { trackStudioEvent } from "../../utils/studioTelemetry"; import { BlocksTab, type BlockPreviewInfo } from "./BlocksTab"; import { FileTree } from "../editor/FileTree"; -import { STUDIO_BLOCKS_PANEL_ENABLED } from "../editor/manualEditingAvailability"; import { Tooltip } from "../ui"; export type SidebarTab = "compositions" | "assets" | "code" | "blocks"; @@ -127,11 +126,7 @@ export const LeftSidebar = memo(
- - )} + + +
{onToggleCollapse && (