@hyperframes/studio 0.8.50 → 0.8.53-desktop.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{hyperframes-player-CxxDxHTW.js → hyperframes-player-PTEnAHhg.js} +3 -3
- package/dist/assets/{index-DUAIWxkI.js → index--myXp8ui.js} +1 -1
- package/dist/assets/{index-Dt3qBI-9.js → index-BjslOS9g.js} +1 -1
- package/dist/assets/index-BnXZuIJD.css +1 -0
- package/dist/assets/index-CNyviK_l.js +390 -0
- package/dist/index.css +29 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +825 -24
- package/dist/index.html +2 -2
- package/dist/index.js +8911 -9853
- package/dist/index.js.map +1 -1
- package/dist/styles/tailwind-preset.js.map +1 -1
- package/package.json +13 -12
- package/src/App.tsx +145 -163
- package/src/captions/components/CaptionAnimationPanel.tsx +4 -4
- package/src/captions/components/CaptionOverlay.sender.test.tsx +52 -0
- package/src/captions/components/CaptionOverlay.tsx +8 -4
- package/src/captions/components/CaptionOverlayUtils.ts +2 -3
- package/src/captions/components/CaptionPropertyPanel.tsx +3 -3
- package/src/captions/components/CaptionTimeline.tsx +1 -1
- package/src/captions/components/shared.tsx +2 -2
- package/src/components/AskAgentModal.tsx +5 -5
- package/src/components/EditorShell.selectionSync.test.tsx +9 -4
- package/src/components/EditorShell.tsx +59 -62
- package/src/components/ExternalFileConflictBanner.tsx +16 -16
- package/src/components/LintModal.tsx +6 -16
- package/src/components/MediaPreview.tsx +2 -2
- package/src/components/RightPanelTabs.test.tsx +151 -0
- package/src/components/RightPanelTabs.tsx +59 -0
- package/src/components/SaveQueuePausedBanner.tsx +2 -2
- package/src/components/StudioHeader.dom.test.tsx +181 -0
- package/src/components/StudioHeader.test.ts +0 -12
- package/src/components/StudioHeader.tsx +118 -221
- package/src/components/StudioLeftPanels.tsx +202 -0
- package/src/components/StudioOverlays.tsx +1 -1
- package/src/components/{StudioRightPanel.tsx → StudioRightPanels.tsx} +57 -194
- package/src/components/{StudioRightPanel.types.ts → StudioRightPanels.types.ts} +4 -3
- package/src/components/StudioToast.tsx +2 -2
- package/src/components/TimelineHistoryButtons.dom.test.tsx +117 -0
- package/src/components/TimelineHistoryButtons.tsx +54 -0
- package/src/components/TimelineToolbar.test.tsx +8 -0
- package/src/components/TimelineToolbar.tsx +8 -12
- package/src/components/dock/Dock.test.tsx +274 -0
- package/src/components/dock/Dock.tsx +291 -0
- package/src/components/dock/dock.css +28 -0
- package/src/components/dock/dockAccessibility.test.ts +166 -0
- package/src/components/dock/dockAccessibility.ts +98 -0
- package/src/components/dock/dockLayout.test.ts +134 -0
- package/src/components/dock/dockLayout.ts +105 -0
- package/src/components/dock/dockLayoutSchema.ts +66 -0
- package/src/components/dock/dockLayoutStore.test.ts +28 -0
- package/src/components/dock/dockLayoutStore.ts +108 -0
- package/src/components/dock/dockTestHarness.ts +11 -0
- package/src/components/dock/panelRegistry.ts +67 -0
- package/src/components/editor/AnimationCard.tsx +4 -4
- package/src/components/editor/AnimationCardParts.tsx +6 -6
- package/src/components/editor/BlockParamsPanel.tsx +4 -4
- package/src/components/editor/BorderRadiusEditor.tsx +1 -1
- package/src/components/editor/CanvasContextMenu.tsx +1 -1
- package/src/components/editor/ComputedTweenNotice.tsx +1 -1
- package/src/components/editor/DomEditOverlay.tsx +1 -1
- package/src/components/editor/EaseCurveSection.tsx +1 -1
- package/src/components/editor/EaseParamFields.tsx +5 -5
- package/src/components/editor/FileTree.tsx +4 -4
- package/src/components/editor/FileTreeIcons.tsx +1 -1
- package/src/components/editor/FileTreeNodes.tsx +13 -13
- package/src/components/editor/InlineTextToolbar.tsx +1 -1
- package/src/components/editor/InspectorHeaderActions.tsx +3 -3
- package/src/components/editor/KeyframeDiamond.tsx +1 -1
- package/src/components/editor/KeyframeEaseList.tsx +1 -1
- package/src/components/editor/LayersPanel.test.ts +97 -1
- package/src/components/editor/LayersPanel.tsx +7 -5
- package/src/components/editor/MarqueeOverlay.tsx +1 -1
- package/src/components/editor/OffCanvasIndicators.tsx +1 -1
- package/src/components/editor/PreviewGuides.tsx +1 -1
- package/src/components/editor/PromotableControl.tsx +2 -2
- package/src/components/editor/PropertyPanelEmptyState.tsx +7 -7
- package/src/components/editor/PropertyPanelFlatHeader.tsx +2 -2
- package/src/components/editor/SnapToolbar.test.tsx +0 -3
- package/src/components/editor/SnapToolbar.tsx +2 -2
- package/src/components/editor/TimelineFxPopover.tsx +1 -1
- package/src/components/editor/TopologyLens.test.tsx +28 -0
- package/src/components/editor/TopologyLens.tsx +7 -5
- package/src/components/editor/Transform3DCube.tsx +2 -2
- package/src/components/editor/audioFxRevealTarget.ts +1 -0
- package/src/components/editor/domEditing.test.ts +1 -1
- package/src/components/editor/domEditingAgentPrompt.test.ts +8 -6
- package/src/components/editor/domEditingAgentPrompt.ts +4 -3
- package/src/components/editor/propertyPanelColor.tsx +11 -11
- package/src/components/editor/propertyPanelColorCurveGraph.tsx +1 -1
- package/src/components/editor/propertyPanelColorGradingControls.tsx +7 -9
- package/src/components/editor/propertyPanelColorGradingSection.tsx +6 -6
- package/src/components/editor/propertyPanelColorGradingSlider.tsx +5 -5
- package/src/components/editor/propertyPanelColorWheels.tsx +1 -1
- package/src/components/editor/propertyPanelCommitField.tsx +1 -1
- package/src/components/editor/propertyPanelFill.tsx +4 -4
- package/src/components/editor/propertyPanelFlatColorGradingAccessory.tsx +3 -3
- package/src/components/editor/propertyPanelFlatColorGradingSection.tsx +7 -7
- package/src/components/editor/propertyPanelFlatEffectsSection.tsx +4 -4
- package/src/components/editor/propertyPanelFlatMediaSection.tsx +3 -3
- package/src/components/editor/propertyPanelFlatOverlaysSection.tsx +1 -1
- package/src/components/editor/propertyPanelFlatPrimitives.tsx +10 -10
- package/src/components/editor/propertyPanelFlatSelectRow.tsx +3 -3
- package/src/components/editor/propertyPanelFlatTextSection.test.tsx +8 -9
- package/src/components/editor/propertyPanelFlatTextSection.tsx +5 -5
- package/src/components/editor/propertyPanelFlatToggle.tsx +1 -1
- package/src/components/editor/propertyPanelFont.tsx +5 -5
- package/src/components/editor/propertyPanelFxCarveModule.tsx +1 -1
- package/src/components/editor/propertyPanelFxControls.test.tsx +1 -1
- package/src/components/editor/propertyPanelFxControls.tsx +6 -6
- package/src/components/editor/propertyPanelFxEqModule.tsx +2 -2
- package/src/components/editor/propertyPanelFxPresetStyle.ts +2 -2
- package/src/components/editor/propertyPanelGradingNumberField.tsx +1 -1
- package/src/components/editor/propertyPanelMediaSection.tsx +1 -1
- package/src/components/editor/propertyPanelPrimitives.tsx +7 -7
- package/src/components/editor/propertyPanelSections.tsx +8 -8
- package/src/components/editor/useColorGradingController.test.ts +38 -0
- package/src/components/editor/useColorGradingController.ts +9 -1
- package/src/components/editor/useColorGradingPreviews.test.ts +76 -0
- package/src/components/editor/useColorGradingPreviews.ts +11 -1
- package/src/components/editor/usePreviewCompositionRect.test.tsx +95 -0
- package/src/components/editor/usePreviewCompositionRect.ts +21 -0
- package/src/components/feedback/StudioFeedbackCard.tsx +7 -7
- package/src/components/feedback/feedbackTrigger.ts +0 -1
- package/src/components/nle/AssetPreviewOverlay.tsx +6 -2
- package/src/components/nle/CompositionBreadcrumb.tsx +3 -3
- package/src/components/nle/NLEContext.tsx +0 -43
- package/src/components/nle/NLEPreview.tsx +3 -3
- package/src/components/nle/PreviewOverlays.tsx +6 -6
- package/src/components/nle/PreviewPane.tsx +3 -3
- package/src/components/nle/TimelinePane.tsx +53 -67
- package/src/components/panels/SlideshowPanel.tsx +3 -3
- package/src/components/panels/SlideshowSubPanels.tsx +20 -17
- package/src/components/panels/VariablesBindElement.tsx +2 -2
- package/src/components/panels/VariablesDeclarationForm.tsx +2 -2
- package/src/components/panels/VariablesOtherCompositions.tsx +1 -1
- package/src/components/panels/VariablesPanel.tsx +4 -4
- package/src/components/panels/VariablesValueControls.tsx +2 -2
- package/src/components/pointerTargetSize.test.tsx +8 -0
- package/src/components/renders/FfmpegRequiredNotice.tsx +5 -5
- package/src/components/renders/RenderQueue.test.tsx +7 -0
- package/src/components/renders/RenderQueue.tsx +7 -7
- package/src/components/renders/RenderQueueItem.tsx +6 -6
- package/src/components/renders/RenderQueuePanel.tsx +1 -1
- package/src/components/sidebar/AssetCard.tsx +8 -8
- package/src/components/sidebar/AssetContextMenu.tsx +8 -8
- package/src/components/sidebar/AssetsTab.tsx +2 -2
- package/src/components/sidebar/AudioRow.tsx +6 -6
- package/src/components/sidebar/BlocksTab.tsx +6 -6
- package/src/components/sidebar/{LeftSidebar.masterComposition.test.tsx → CompositionsPanel.masterComposition.test.tsx} +6 -9
- package/src/components/sidebar/CompositionsPanel.tsx +15 -0
- package/src/components/sidebar/CompositionsTab.tsx +5 -5
- package/src/components/sidebar/GlobalAssetsView.tsx +1 -1
- package/src/components/sidebar/PromptPreviewModal.tsx +3 -3
- package/src/components/sidebar/SidebarLintButton.test.tsx +53 -0
- package/src/components/sidebar/SidebarLintButton.tsx +50 -0
- package/src/components/timelineToolbarStyles.ts +5 -0
- package/src/components/ui/Button.test.tsx +252 -0
- package/src/components/ui/Button.tsx +89 -126
- package/src/components/ui/IconButton.tsx +38 -0
- package/src/components/ui/Input.tsx +115 -0
- package/src/components/ui/Menu.test.tsx +374 -0
- package/src/components/ui/Menu.tsx +213 -0
- package/src/components/ui/NumberField.tsx +122 -0
- package/src/components/ui/Popover.tsx +74 -0
- package/src/components/ui/SearchInput.tsx +2 -2
- package/src/components/ui/Select.tsx +100 -0
- package/src/components/ui/Slider.tsx +153 -0
- package/src/components/ui/Tabs.test.tsx +98 -0
- package/src/components/ui/Tabs.tsx +71 -0
- package/src/components/ui/Toggle.tsx +63 -0
- package/src/components/ui/Tooltip.test.tsx +110 -0
- package/src/components/ui/Tooltip.tsx +38 -112
- package/src/components/ui/cn.test.ts +30 -0
- package/src/components/ui/cn.ts +25 -0
- package/src/components/ui/index.ts +29 -2
- package/src/components/ui/mountHost.testHelpers.ts +24 -0
- package/src/components/ui/valueControls.test.tsx +524 -0
- package/src/contexts/PanelLayoutContext.tsx +3 -57
- package/src/hooks/appHotkeysDispatch.ts +3 -4
- package/src/hooks/timelineEditPermission.ts +31 -0
- package/src/hooks/useAppHotkeys.previewForwarding.test.tsx +0 -2
- package/src/hooks/useAppHotkeys.test.ts +0 -1
- package/src/hooks/useAppHotkeys.textEditing.test.tsx +0 -3
- package/src/hooks/useAppHotkeys.ts +21 -84
- package/src/hooks/useCaptionDetection.sender.test.tsx +46 -0
- package/src/hooks/useCaptionDetection.ts +3 -1
- package/src/hooks/useDomEditPreviewSync.ts +4 -6
- package/src/hooks/useDomEditSession.ts +0 -7
- package/src/hooks/useDomEditWiring.ts +4 -9
- package/src/hooks/useEditHistoryActions.test.tsx +90 -0
- package/src/hooks/useEditHistoryActions.ts +106 -0
- package/src/hooks/useFileManager.ts +21 -123
- package/src/hooks/useLintModal.test.tsx +65 -0
- package/src/hooks/useLintModal.ts +3 -0
- package/src/hooks/usePanelLayout.test.ts +108 -296
- package/src/hooks/usePanelLayout.ts +50 -255
- package/src/hooks/usePersistentEditHistory.ts +1 -1
- package/src/hooks/useProjectFileWriter.ts +150 -0
- package/src/hooks/useRightPanelIntents.test.ts +181 -0
- package/src/hooks/useRightPanelIntents.ts +63 -0
- package/src/hooks/useSdkSession.lifecycle.test.tsx +49 -4
- package/src/hooks/useSdkSession.ts +43 -10
- package/src/hooks/useServerConnection.hashProject.test.tsx +94 -0
- package/src/hooks/useServerConnection.ts +43 -10
- package/src/hooks/useSlideshowTabState.test.ts +9 -31
- package/src/hooks/useSlideshowTabState.ts +6 -19
- package/src/hooks/useStudioContextValue.test.ts +6 -18
- package/src/hooks/useStudioContextValue.ts +5 -26
- package/src/hooks/useTimelineAssetDropOps.test.tsx +41 -1
- package/src/hooks/useTimelineAssetDropOps.ts +52 -11
- package/src/hooks/useTimelineDeleteOps.test.tsx +111 -0
- package/src/hooks/useTimelineEditing.test.tsx +322 -3
- package/src/hooks/useTimelineEditing.ts +103 -16
- package/src/hooks/useTimelineEditingTypes.ts +3 -0
- package/src/hooks/useTrackPendingTimelineEdit.test.tsx +62 -0
- package/src/hooks/useTrackPendingTimelineEdit.ts +22 -0
- package/src/hostMount.test.tsx +222 -0
- package/src/index.ts +87 -0
- package/src/main.tsx +9 -3
- package/src/player/components/AudioWaveform.tsx +1 -1
- package/src/player/components/AutomationSelectionMenu.tsx +3 -3
- package/src/player/components/ClipContextMenu.tsx +3 -3
- package/src/player/components/CompositionThumbnail.test.ts +0 -3
- package/src/player/components/CompositionThumbnail.tsx +3 -4
- package/src/player/components/EditModal.tsx +1 -1
- package/src/player/components/ImageThumbnail.tsx +1 -1
- package/src/player/components/KeyframeDiamondContextMenu.tsx +4 -4
- package/src/player/components/LayerDisclosureRow.tsx +2 -2
- package/src/player/components/PlayerControls.tsx +1 -1
- package/src/player/components/ShortcutsPanel.tsx +9 -9
- package/src/player/components/SpeedMenu.tsx +3 -5
- package/src/player/components/Timeline.tsx +3 -2
- package/src/player/components/TimelineCanvas.tsx +21 -14
- package/src/player/components/TimelineClip.tsx +0 -1
- package/src/player/components/TimelineDiamondConnectors.tsx +1 -1
- package/src/player/components/TimelineEmptyState.tsx +5 -5
- package/src/player/components/TimelineFxButton.tsx +6 -6
- package/src/player/components/TimelineGroupHeader.tsx +5 -5
- package/src/player/components/TimelineGroupLaneLabels.tsx +1 -1
- package/src/player/components/TimelineGroupRow.tsx +1 -1
- package/src/player/components/TimelineLanes.test.tsx +32 -0
- package/src/player/components/TimelineLanes.tsx +2 -5
- package/src/player/components/TimelineLayerGroupHeader.tsx +2 -2
- package/src/player/components/TimelineRuler.tsx +1 -1
- package/src/player/components/TimelineShortcutHint.tsx +1 -1
- package/src/player/components/TimelineTrackHeader.test.tsx +26 -5
- package/src/player/components/TimelineTrackHeader.tsx +2 -2
- package/src/player/components/TimelineTrackPlainHeader.tsx +3 -3
- package/src/player/components/TimelineTypes.ts +2 -1
- package/src/player/components/TrackGapContextMenu.tsx +1 -1
- package/src/player/components/VideoThumbnail.tsx +4 -2
- package/src/player/components/VolumeControl.tsx +2 -2
- package/src/player/components/timelineCallbacks.ts +8 -8
- package/src/player/components/timelineClipDragPreview.ts +51 -27
- package/src/player/components/timelineClipDragTypes.ts +3 -0
- package/src/player/components/timelineDragDrop.test.tsx +61 -1
- package/src/player/components/timelineDragDrop.ts +57 -15
- package/src/player/components/timelineLaneProps.ts +3 -0
- package/src/player/components/timelineSnapping.test.ts +27 -0
- package/src/player/components/timelineSnapping.ts +14 -1
- package/src/player/components/timelineTheme.test.ts +4 -4
- package/src/player/components/timelineTheme.ts +30 -30
- package/src/player/components/trackHeaderLabelRows.tsx +4 -4
- package/src/player/components/useTimelineClipDrag.resize.test.tsx +136 -2
- package/src/player/components/useTimelineClipDrag.ts +30 -3
- package/src/player/lib/describeClips.ts +3 -54
- package/src/player/lib/playbackShortcuts.ts +2 -0
- package/src/player/lib/timelinePerformanceDiagnostics.test.ts +3 -2
- package/src/player/lib/timelinePerformanceDiagnostics.ts +1 -1
- package/src/player/store/previewIframeStore.notify.test.tsx +75 -0
- package/src/player/store/previewIframeStore.test.tsx +29 -0
- package/src/player/store/previewIframeStore.ts +25 -0
- package/src/renderQueueExports.test.tsx +58 -0
- package/src/styles/classCandidates.test.ts +105 -0
- package/src/styles/classCandidates.ts +281 -0
- package/src/styles/hex-baseline.json +84 -0
- package/src/styles/hexRatchet.test.ts +201 -0
- package/src/styles/iconTokens.ts +20 -0
- package/src/styles/palette-reset.css +6 -0
- package/src/styles/studio.css +24 -21
- package/src/styles/styleSources.test.ts +20 -0
- package/src/styles/styleSources.ts +47 -0
- package/src/styles/tailwind-preset.shared.js +3 -0
- package/src/styles/theme.css +270 -0
- package/src/styles/theme.test.ts +183 -0
- package/src/styles/tokenGate.test.ts +109 -0
- package/src/utils/sourcePatcher.ts +1 -1
- package/src/utils/studioHelpers.test.ts +18 -0
- package/src/utils/studioHelpers.ts +11 -8
- package/src/utils/studioUiPreferences.test.ts +10 -16
- package/src/utils/studioUiPreferences.ts +7 -16
- package/src/utils/timelineDropTrackInsert.test.ts +134 -0
- package/src/utils/timelineDropTrackInsert.ts +83 -0
- package/src/utils/typingTarget.ts +4 -0
- package/dist/assets/index-n2ml4tUn.js +0 -442
- package/dist/assets/index-pO6p0H27.css +0 -1
- package/src/components/PanelTabButton.tsx +0 -31
- package/src/components/StudioLeftSidebar.tsx +0 -204
- package/src/components/nle/TimelineResizeDivider.tsx +0 -101
- package/src/components/sidebar/LeftSidebar.storage.test.ts +0 -28
- package/src/components/sidebar/LeftSidebar.tsx +0 -334
- package/src/components/storyboard/AgentChatMessageButton.test.tsx +0 -47
- package/src/components/storyboard/AgentChatMessageButton.tsx +0 -45
- package/src/components/storyboard/FramePoster.test.tsx +0 -61
- package/src/components/storyboard/FramePoster.tsx +0 -86
- package/src/components/storyboard/StoryboardDirection.tsx +0 -45
- package/src/components/storyboard/StoryboardFrameFocus.tsx +0 -412
- package/src/components/storyboard/StoryboardFrameTile.tsx +0 -117
- package/src/components/storyboard/StoryboardGrid.tsx +0 -55
- package/src/components/storyboard/StoryboardLoaded.tsx +0 -307
- package/src/components/storyboard/StoryboardReviewGuide.tsx +0 -300
- package/src/components/storyboard/StoryboardScriptPanel.tsx +0 -26
- package/src/components/storyboard/StoryboardSourceEditor.tsx +0 -231
- package/src/components/storyboard/StoryboardStatusLegend.tsx +0 -21
- package/src/components/storyboard/StoryboardView.tsx +0 -169
- package/src/components/storyboard/StoryboardViewModeGuard.test.tsx +0 -187
- package/src/components/storyboard/frameComments.test.ts +0 -95
- package/src/components/storyboard/frameComments.ts +0 -115
- package/src/components/storyboard/frameStatus.ts +0 -36
- package/src/components/storyboard/storyboardReviewStage.test.ts +0 -40
- package/src/components/storyboard/storyboardReviewStage.ts +0 -45
- package/src/components/storyboard/useFrameComments.ts +0 -98
- package/src/contexts/ViewModeContext.tsx +0 -142
- package/src/hooks/useInspectorSplitResize.ts +0 -51
- package/src/hooks/useProjectSignaturePoll.test.tsx +0 -135
- package/src/hooks/useProjectSignaturePoll.ts +0 -68
- package/src/hooks/useStoryboard.ts +0 -99
- package/src/utils/fitPanels.test.ts +0 -164
- package/src/utils/fitPanels.ts +0 -151
|
@@ -328,7 +328,7 @@ export function ColorGradingControls({
|
|
|
328
328
|
<select
|
|
329
329
|
value={String(grading.preset ?? "neutral")}
|
|
330
330
|
onChange={(event) => applyPreset(event.target.value)}
|
|
331
|
-
className="w-full min-w-0 rounded-md bg-panel-input px-3 py-2 text-[11px] font-medium text-panel-text-1 outline-
|
|
331
|
+
className="w-full min-w-0 rounded-md bg-panel-input px-3 py-2 text-[11px] font-medium text-panel-text-1 outline-hidden"
|
|
332
332
|
>
|
|
333
333
|
{HF_COLOR_GRADING_PRESETS.map((preset) => (
|
|
334
334
|
<option key={preset.id} value={preset.id}>
|
|
@@ -358,14 +358,12 @@ export function ColorGradingControls({
|
|
|
358
358
|
aria-expanded={lutOpen}
|
|
359
359
|
>
|
|
360
360
|
{lutOpen ? (
|
|
361
|
-
<ChevronDown size={11} className="
|
|
361
|
+
<ChevronDown size={11} className="shrink-0 text-panel-text-5" />
|
|
362
362
|
) : (
|
|
363
|
-
<ChevronRight size={11} className="
|
|
363
|
+
<ChevronRight size={11} className="shrink-0 text-panel-text-5" />
|
|
364
364
|
)}
|
|
365
365
|
<span className="min-w-0 flex-1 truncate">Custom LUT</span>
|
|
366
|
-
{grading.lut &&
|
|
367
|
-
<span className="h-1.5 w-1.5 flex-shrink-0 rounded-full bg-studio-accent" />
|
|
368
|
-
)}
|
|
366
|
+
{grading.lut && <span className="h-1.5 w-1.5 shrink-0 rounded-full bg-studio-accent" />}
|
|
369
367
|
</button>
|
|
370
368
|
{lutOpen && (
|
|
371
369
|
<div className="grid gap-1.5 border-t border-panel-border/60 p-1.5">
|
|
@@ -380,7 +378,7 @@ export function ColorGradingControls({
|
|
|
380
378
|
nextSrc && grading.lut?.src === nextSrc ? grading.lut.intensity : 1,
|
|
381
379
|
);
|
|
382
380
|
}}
|
|
383
|
-
className="w-full min-w-0 rounded-md bg-panel-input px-3 py-2 text-[11px] font-medium text-panel-text-1 outline-
|
|
381
|
+
className="w-full min-w-0 rounded-md bg-panel-input px-3 py-2 text-[11px] font-medium text-panel-text-1 outline-hidden"
|
|
384
382
|
title="Uploaded .cube LUT"
|
|
385
383
|
>
|
|
386
384
|
<option value="">None</option>
|
|
@@ -441,7 +439,7 @@ export function ColorGradingControls({
|
|
|
441
439
|
<div className="grid gap-2">
|
|
442
440
|
{selectedProjectLut && (
|
|
443
441
|
<div className="flex min-w-0 items-start gap-2 text-[10px] leading-4 text-panel-text-3">
|
|
444
|
-
<span className="mt-[5px] h-1.5 w-1.5
|
|
442
|
+
<span className="mt-[5px] h-1.5 w-1.5 shrink-0 rounded-full bg-studio-accent" />
|
|
445
443
|
<span className="min-w-0 flex-1 truncate" title={selectedProjectLut}>
|
|
446
444
|
<span className="font-medium text-panel-text-2">Uploaded LUT</span>
|
|
447
445
|
{` · ${selectedProjectLut}`}
|
|
@@ -527,7 +525,7 @@ export function ColorGradingControls({
|
|
|
527
525
|
aria-label="Close settings"
|
|
528
526
|
title="Close settings"
|
|
529
527
|
onClick={() => setDetailSettings(null)}
|
|
530
|
-
className="flex h-5 w-5
|
|
528
|
+
className="flex h-5 w-5 shrink-0 items-center justify-center rounded-sm text-panel-text-5 transition-colors hover:bg-panel-hover hover:text-panel-text-1"
|
|
531
529
|
>
|
|
532
530
|
<X size={11} />
|
|
533
531
|
</button>
|
|
@@ -22,10 +22,10 @@ function StatusPill({ status }: { status: RuntimeColorGradingStatus }) {
|
|
|
22
22
|
: "bg-panel-text-5";
|
|
23
23
|
return (
|
|
24
24
|
<div
|
|
25
|
-
className="flex min-w-0 items-center gap-1.5 rounded bg-panel-input px-2 py-1 text-[10px] font-medium text-panel-text-3"
|
|
25
|
+
className="flex min-w-0 items-center gap-1.5 rounded-sm bg-panel-input px-2 py-1 text-[10px] font-medium text-panel-text-3"
|
|
26
26
|
title={status.message}
|
|
27
27
|
>
|
|
28
|
-
<span className={`h-1.5 w-1.5
|
|
28
|
+
<span className={`h-1.5 w-1.5 shrink-0 rounded-full ${dotClass}`} />
|
|
29
29
|
<span className="truncate">{status.message}</span>
|
|
30
30
|
</div>
|
|
31
31
|
);
|
|
@@ -47,7 +47,7 @@ function HdrMediaWarning({ metadata }: { metadata: MediaMetadata | null }) {
|
|
|
47
47
|
<div className="mb-3 rounded-md border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] leading-4 text-amber-100">
|
|
48
48
|
<div className="mb-1 flex min-w-0 items-center justify-between gap-2">
|
|
49
49
|
<span className="font-semibold">{metadata.color.label} source</span>
|
|
50
|
-
<span className="rounded bg-amber-400/20 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-amber-100">
|
|
50
|
+
<span className="rounded-sm bg-amber-400/20 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-amber-100">
|
|
51
51
|
SDR preview
|
|
52
52
|
</span>
|
|
53
53
|
</div>
|
|
@@ -118,7 +118,7 @@ function HoldBeforeButton({
|
|
|
118
118
|
event.preventDefault();
|
|
119
119
|
onHoldChange(false);
|
|
120
120
|
}}
|
|
121
|
-
className={`flex h-6 w-6
|
|
121
|
+
className={`flex h-6 w-6 shrink-0 items-center justify-center rounded transition-colors ${
|
|
122
122
|
active
|
|
123
123
|
? "bg-studio-accent text-black"
|
|
124
124
|
: "text-panel-text-4 hover:bg-panel-hover hover:text-panel-text-1"
|
|
@@ -194,7 +194,7 @@ export function ColorGradingSection({
|
|
|
194
194
|
track("button", "Reset color grading");
|
|
195
195
|
resetGrading();
|
|
196
196
|
}}
|
|
197
|
-
className="flex h-6 w-6
|
|
197
|
+
className="flex h-6 w-6 shrink-0 items-center justify-center rounded-sm text-panel-text-4 transition-colors hover:bg-panel-hover hover:text-panel-text-1"
|
|
198
198
|
title="Reset color grading"
|
|
199
199
|
>
|
|
200
200
|
<RotateCcw size={12} />
|
|
@@ -218,7 +218,7 @@ export function ColorGradingSection({
|
|
|
218
218
|
setApplyScope(event.currentTarget.value as typeof applyScope);
|
|
219
219
|
}}
|
|
220
220
|
disabled={applyBusy}
|
|
221
|
-
className="w-full min-w-0 rounded-md bg-panel-input px-3 py-2 text-[11px] font-medium text-panel-text-1 outline-
|
|
221
|
+
className="w-full min-w-0 rounded-md bg-panel-input px-3 py-2 text-[11px] font-medium text-panel-text-1 outline-hidden disabled:cursor-not-allowed disabled:opacity-50"
|
|
222
222
|
title="Choose where to copy these color grading settings"
|
|
223
223
|
>
|
|
224
224
|
<option value="source-file">Current file media</option>
|
|
@@ -157,7 +157,7 @@ export function ColorGradingSliderControl({
|
|
|
157
157
|
event.stopPropagation();
|
|
158
158
|
settings.onClick();
|
|
159
159
|
}}
|
|
160
|
-
className={`relative flex h-5 w-5
|
|
160
|
+
className={`relative flex h-5 w-5 shrink-0 items-center justify-center rounded transition-colors hover:bg-panel-hover hover:text-panel-text-1 disabled:cursor-not-allowed disabled:opacity-40 ${
|
|
161
161
|
settings.active ? "text-studio-accent" : "text-panel-text-5"
|
|
162
162
|
}`}
|
|
163
163
|
title={settings.label}
|
|
@@ -178,7 +178,7 @@ export function ColorGradingSliderControl({
|
|
|
178
178
|
track("button", `Reset ${label}`);
|
|
179
179
|
onReset();
|
|
180
180
|
}}
|
|
181
|
-
className="flex h-5 w-5
|
|
181
|
+
className="flex h-5 w-5 shrink-0 items-center justify-center rounded-sm text-panel-text-5 transition-colors hover:bg-panel-hover hover:text-panel-text-1 disabled:cursor-not-allowed disabled:opacity-40"
|
|
182
182
|
title={`Reset ${label}`}
|
|
183
183
|
>
|
|
184
184
|
<RotateCcw size={11} />
|
|
@@ -228,7 +228,7 @@ export function ColorGradingSliderControl({
|
|
|
228
228
|
</div>
|
|
229
229
|
|
|
230
230
|
<div className="flex min-w-0 items-center justify-end gap-1">
|
|
231
|
-
<div className="flex
|
|
231
|
+
<div className="flex shrink-0 items-center rounded-md bg-panel-input px-1.5 py-px">
|
|
232
232
|
<input
|
|
233
233
|
type="number"
|
|
234
234
|
value={inputValue}
|
|
@@ -256,12 +256,12 @@ export function ColorGradingSliderControl({
|
|
|
256
256
|
nudge(-1);
|
|
257
257
|
}
|
|
258
258
|
}}
|
|
259
|
-
className="hf-color-grading-number h-4 w-[36px] bg-transparent text-right text-[10px] font-medium tabular-nums text-panel-text-1 outline-
|
|
259
|
+
className="hf-color-grading-number h-4 w-[36px] bg-transparent text-right text-[10px] font-medium tabular-nums text-panel-text-1 outline-hidden disabled:cursor-not-allowed"
|
|
260
260
|
title={displayValue}
|
|
261
261
|
/>
|
|
262
262
|
{suffix && <span className="ml-0.5 text-[10px] text-panel-text-5">{suffix}</span>}
|
|
263
263
|
</div>
|
|
264
|
-
<div className="flex
|
|
264
|
+
<div className="flex shrink-0 overflow-hidden rounded-md bg-panel-input">
|
|
265
265
|
<button
|
|
266
266
|
type="button"
|
|
267
267
|
disabled={disabled}
|
|
@@ -204,7 +204,7 @@ function TonalWheel({
|
|
|
204
204
|
}
|
|
205
205
|
}}
|
|
206
206
|
onBlur={onSettle}
|
|
207
|
-
className="relative mx-auto aspect-square w-full max-w-[112px] touch-none rounded-full border border-panel-border-input outline-
|
|
207
|
+
className="relative mx-auto aspect-square w-full max-w-[112px] touch-none rounded-full border border-panel-border-input outline-hidden focus:ring-1 focus:ring-panel-accent disabled:opacity-40"
|
|
208
208
|
style={{
|
|
209
209
|
background:
|
|
210
210
|
"radial-gradient(circle, rgb(128 128 128) 0%, transparent 72%), conic-gradient(from 90deg, #f33, #f3f, #33f, #3ff, #3f3, #ff3, #f33)",
|
|
@@ -213,7 +213,7 @@ export function CommitField({
|
|
|
213
213
|
}}
|
|
214
214
|
onKeyDown={handleKeyDown}
|
|
215
215
|
title={parseNumericToken(value) ? "Scroll or use Arrow keys to adjust" : undefined}
|
|
216
|
-
className={`min-w-0 w-full bg-transparent text-[11px] font-medium text-neutral-100 outline-
|
|
216
|
+
className={`min-w-0 w-full bg-transparent text-[11px] font-medium text-neutral-100 outline-hidden disabled:cursor-not-allowed disabled:text-neutral-600 ${
|
|
217
217
|
align === "right" ? "text-right" : "text-left"
|
|
218
218
|
}`}
|
|
219
219
|
/>
|
|
@@ -133,7 +133,7 @@ export function ImageFillField({
|
|
|
133
133
|
: "cursor-pointer hover:border-neutral-600 hover:text-white"
|
|
134
134
|
}`}
|
|
135
135
|
>
|
|
136
|
-
<Plus size={12} className="
|
|
136
|
+
<Plus size={12} className="shrink-0" />
|
|
137
137
|
<span className="truncate">{uploading ? "Uploading…" : "Upload image"}</span>
|
|
138
138
|
</button>
|
|
139
139
|
<input
|
|
@@ -178,7 +178,7 @@ export function ImageFillField({
|
|
|
178
178
|
}
|
|
179
179
|
onCommit(`url("${toProjectRootAssetPath(next)}")`);
|
|
180
180
|
}}
|
|
181
|
-
className="min-w-0 w-full appearance-none bg-transparent text-[11px] font-medium text-neutral-100 outline-
|
|
181
|
+
className="min-w-0 w-full appearance-none bg-transparent text-[11px] font-medium text-neutral-100 outline-hidden disabled:cursor-not-allowed disabled:text-neutral-600"
|
|
182
182
|
>
|
|
183
183
|
<option value="">None</option>
|
|
184
184
|
{imageAssets.map((asset) => (
|
|
@@ -288,7 +288,7 @@ export function GradientField({
|
|
|
288
288
|
position: Math.max(0, Math.min(100, Math.round(stop.position + delta))),
|
|
289
289
|
});
|
|
290
290
|
}}
|
|
291
|
-
className="absolute top-1/2 h-4 w-4 -translate-y-1/2 cursor-ew-resize rounded-full border-2 border-white/90 shadow-[0_0_0_1px_rgba(0,0,0,0.35)] outline-
|
|
291
|
+
className="absolute top-1/2 h-4 w-4 -translate-y-1/2 cursor-ew-resize rounded-full border-2 border-white/90 shadow-[0_0_0_1px_rgba(0,0,0,0.35)] outline-hidden focus-visible:ring-2 focus-visible:ring-studio-accent"
|
|
292
292
|
style={{
|
|
293
293
|
left: `calc(${stop.position}% - 8px)`,
|
|
294
294
|
backgroundColor: stop.color,
|
|
@@ -339,7 +339,7 @@ export function GradientField({
|
|
|
339
339
|
track("toggle", "Repeat gradient");
|
|
340
340
|
patch({ repeating: e.target.checked });
|
|
341
341
|
}}
|
|
342
|
-
className="h-4 w-4 rounded border-neutral-700 bg-neutral-950 text-panel-accent focus:ring-panel-accent"
|
|
342
|
+
className="h-4 w-4 rounded-sm border-neutral-700 bg-neutral-950 text-panel-accent focus:ring-panel-accent"
|
|
343
343
|
/>
|
|
344
344
|
Repeat
|
|
345
345
|
</label>
|
|
@@ -74,7 +74,7 @@ export function FlatColorGradingAccessory({
|
|
|
74
74
|
commitCompare(false);
|
|
75
75
|
}}
|
|
76
76
|
title="Hold to show original"
|
|
77
|
-
className="
|
|
77
|
+
className="shrink-0 text-panel-text-3 hover:text-panel-text-1 disabled:cursor-not-allowed disabled:opacity-40"
|
|
78
78
|
>
|
|
79
79
|
<Compare size={12} />
|
|
80
80
|
</button>
|
|
@@ -82,7 +82,7 @@ export function FlatColorGradingAccessory({
|
|
|
82
82
|
<span
|
|
83
83
|
data-flat-grade-status-dot="true"
|
|
84
84
|
title={runtimeStatus.message}
|
|
85
|
-
className={`h-[5px] w-[5px]
|
|
85
|
+
className={`h-[5px] w-[5px] shrink-0 rounded-full ${STATUS_DOT_CLASS[runtimeStatus.state]}`}
|
|
86
86
|
/>
|
|
87
87
|
<span
|
|
88
88
|
data-flat-grade-status-message="true"
|
|
@@ -100,7 +100,7 @@ export function FlatColorGradingAccessory({
|
|
|
100
100
|
track("button", "Reset color grading");
|
|
101
101
|
resetGrading();
|
|
102
102
|
}}
|
|
103
|
-
className="
|
|
103
|
+
className="shrink-0 text-panel-text-3 hover:text-panel-text-1"
|
|
104
104
|
>
|
|
105
105
|
<RotateCcw size={12} />
|
|
106
106
|
</button>
|
|
@@ -74,7 +74,7 @@ function HdrBanner({ metadata }: { metadata: MediaMetadata | null }) {
|
|
|
74
74
|
>
|
|
75
75
|
<div className="mb-0.5 flex items-center justify-between gap-2">
|
|
76
76
|
<span className="font-semibold">{metadata.color.label} source</span>
|
|
77
|
-
<span className="rounded bg-amber-400/20 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-amber-100">
|
|
77
|
+
<span className="rounded-sm bg-amber-400/20 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-amber-100">
|
|
78
78
|
SDR preview
|
|
79
79
|
</span>
|
|
80
80
|
</div>
|
|
@@ -389,7 +389,7 @@ export function FlatColorGradingSection({
|
|
|
389
389
|
height="10"
|
|
390
390
|
viewBox="0 0 10 10"
|
|
391
391
|
fill="currentColor"
|
|
392
|
-
className={`
|
|
392
|
+
className={`shrink-0 text-panel-text-5 transition-transform ${lutOpen ? "rotate-90" : ""}`}
|
|
393
393
|
>
|
|
394
394
|
<path d="M2 3l3 4 3-4z" />
|
|
395
395
|
</svg>
|
|
@@ -409,7 +409,7 @@ export function FlatColorGradingSection({
|
|
|
409
409
|
track("select", "Custom LUT");
|
|
410
410
|
actions.applyLut(src || null, src && lut?.src === src ? lut.intensity : 1);
|
|
411
411
|
}}
|
|
412
|
-
className="border-b border-panel-border-input/50 bg-transparent font-mono text-[10px] text-panel-text-3 outline-
|
|
412
|
+
className="border-b border-panel-border-input/50 bg-transparent font-mono text-[10px] text-panel-text-3 outline-hidden hover:border-panel-border-input"
|
|
413
413
|
>
|
|
414
414
|
<option value="">None</option>
|
|
415
415
|
{lutAssets.map((asset) => (
|
|
@@ -423,7 +423,7 @@ export function FlatColorGradingSection({
|
|
|
423
423
|
disabled={!onImportAssets}
|
|
424
424
|
onClick={() => lutInputRef.current?.click()}
|
|
425
425
|
title="Import .cube LUT"
|
|
426
|
-
className="
|
|
426
|
+
className="shrink-0 text-panel-text-4 hover:text-panel-text-1 disabled:cursor-not-allowed disabled:opacity-40"
|
|
427
427
|
>
|
|
428
428
|
<Plus size={12} />
|
|
429
429
|
</button>
|
|
@@ -467,7 +467,7 @@ export function FlatColorGradingSection({
|
|
|
467
467
|
data-flat-grade-settings="vignette"
|
|
468
468
|
title="Vignette settings"
|
|
469
469
|
onClick={() => setDetailSettingsOpen((c) => (c === "vignette" ? null : "vignette"))}
|
|
470
|
-
className="
|
|
470
|
+
className="shrink-0 text-panel-text-4 hover:text-panel-text-1"
|
|
471
471
|
>
|
|
472
472
|
<Settings size={12} />
|
|
473
473
|
</button>
|
|
@@ -479,7 +479,7 @@ export function FlatColorGradingSection({
|
|
|
479
479
|
data-flat-grade-settings="grain"
|
|
480
480
|
title="Grain settings"
|
|
481
481
|
onClick={() => setDetailSettingsOpen((c) => (c === "grain" ? null : "grain"))}
|
|
482
|
-
className="
|
|
482
|
+
className="shrink-0 text-panel-text-4 hover:text-panel-text-1"
|
|
483
483
|
>
|
|
484
484
|
<Settings size={12} />
|
|
485
485
|
</button>
|
|
@@ -505,7 +505,7 @@ export function FlatColorGradingSection({
|
|
|
505
505
|
onSetApplyScope(e.target.value as "source-file" | "project");
|
|
506
506
|
}}
|
|
507
507
|
disabled={applyBusy}
|
|
508
|
-
className="border-b border-panel-border-input/50 bg-transparent font-mono text-[11px] text-panel-text-0 outline-
|
|
508
|
+
className="border-b border-panel-border-input/50 bg-transparent font-mono text-[11px] text-panel-text-0 outline-hidden hover:border-panel-border-input disabled:opacity-50"
|
|
509
509
|
>
|
|
510
510
|
<option value="source-file">Current file media</option>
|
|
511
511
|
<option value="project">All project media</option>
|
|
@@ -48,7 +48,7 @@ export function FlatEffectsAccessory({
|
|
|
48
48
|
track("button", "Reset effects");
|
|
49
49
|
onCommitColorGrading({ ...grading, effects: { ...DEFAULT_EFFECTS }, palette: null });
|
|
50
50
|
}}
|
|
51
|
-
className="
|
|
51
|
+
className="shrink-0 text-panel-text-3 hover:text-panel-text-1"
|
|
52
52
|
>
|
|
53
53
|
<RotateCcw size={12} />
|
|
54
54
|
</button>
|
|
@@ -215,7 +215,7 @@ export function FlatEffectsSection({
|
|
|
215
215
|
nextPalette[index] = event.target.value;
|
|
216
216
|
onCommitColorGrading({ ...grading, palette: nextPalette });
|
|
217
217
|
}}
|
|
218
|
-
className="h-6 w-6 cursor-pointer rounded-
|
|
218
|
+
className="h-6 w-6 cursor-pointer rounded-xs border border-panel-border-input bg-transparent p-0"
|
|
219
219
|
/>
|
|
220
220
|
{palette.length > 2 && (
|
|
221
221
|
<button
|
|
@@ -227,7 +227,7 @@ export function FlatEffectsSection({
|
|
|
227
227
|
palette: palette.filter((_, colorIndex) => colorIndex !== index),
|
|
228
228
|
})
|
|
229
229
|
}
|
|
230
|
-
className="absolute -right-1 -top-1 hidden h-3.5 w-3.5 items-center justify-center rounded-full bg-panel-bg text-panel-text-2 shadow group-hover/swatch:flex"
|
|
230
|
+
className="absolute -right-1 -top-1 hidden h-3.5 w-3.5 items-center justify-center rounded-full bg-panel-bg text-panel-text-2 shadow-sm group-hover/swatch:flex"
|
|
231
231
|
>
|
|
232
232
|
<X size={8} />
|
|
233
233
|
</button>
|
|
@@ -244,7 +244,7 @@ export function FlatEffectsSection({
|
|
|
244
244
|
palette: [...palette, palette.at(-1) ?? "#ffffff"],
|
|
245
245
|
})
|
|
246
246
|
}
|
|
247
|
-
className="flex h-6 w-6 items-center justify-center rounded-
|
|
247
|
+
className="flex h-6 w-6 items-center justify-center rounded-xs border border-panel-border-input text-panel-text-4 hover:text-panel-text-1"
|
|
248
248
|
>
|
|
249
249
|
<Plus size={11} />
|
|
250
250
|
</button>
|
|
@@ -146,7 +146,7 @@ export function FlatMediaSection({
|
|
|
146
146
|
<div className="space-y-1.5">
|
|
147
147
|
<div className="flex min-h-8 items-center justify-between gap-2">
|
|
148
148
|
<span className="flex min-w-0 items-center gap-2">
|
|
149
|
-
<span className="h-5 w-8
|
|
149
|
+
<span className="h-5 w-8 shrink-0 rounded-[3px] bg-panel-surface" />
|
|
150
150
|
<span className="min-w-0 truncate font-mono text-[11px] text-panel-text-0">
|
|
151
151
|
{srcAttr}
|
|
152
152
|
</span>
|
|
@@ -161,14 +161,14 @@ export function FlatMediaSection({
|
|
|
161
161
|
setTimeout(() => setCopied(false), 1500);
|
|
162
162
|
});
|
|
163
163
|
}}
|
|
164
|
-
className="flex
|
|
164
|
+
className="flex shrink-0 items-center gap-1 text-[10px] text-panel-text-3 hover:text-panel-text-1"
|
|
165
165
|
>
|
|
166
166
|
{copied ? <Check size={11} /> : <ClipboardList size={11} />}
|
|
167
167
|
{copied ? "Copied" : "Copy"}
|
|
168
168
|
</button>
|
|
169
169
|
</div>
|
|
170
170
|
{isVisualMedia && (
|
|
171
|
-
<div className="ml-
|
|
171
|
+
<div className="ml-px border-l-2 border-panel-border-input py-1 pl-[10px]">
|
|
172
172
|
<div className="flex min-h-6 items-center justify-between">
|
|
173
173
|
<span className="flex items-baseline gap-[7px]">
|
|
174
174
|
<span className="text-[11px] font-semibold text-panel-text-1">Cutout</span>
|
|
@@ -95,7 +95,7 @@ export function FlatOverlaysSection({
|
|
|
95
95
|
)}
|
|
96
96
|
<Plus
|
|
97
97
|
size={12}
|
|
98
|
-
className="absolute right-1.5 top-1.5 text-white opacity-70 drop-shadow group-hover:text-panel-accent group-hover:opacity-100"
|
|
98
|
+
className="absolute right-1.5 top-1.5 text-white opacity-70 drop-shadow-sm group-hover:text-panel-accent group-hover:opacity-100"
|
|
99
99
|
/>
|
|
100
100
|
</span>
|
|
101
101
|
<span className="block truncate px-2 py-1.5 text-[10px] text-panel-text-2">
|
|
@@ -42,7 +42,7 @@ export function FlatRow({
|
|
|
42
42
|
return (
|
|
43
43
|
<div className="group flex min-h-[30px] items-center justify-between gap-3">
|
|
44
44
|
<span className={`text-[11px] ${VALUE_TIER_LABEL_CLASS[tier]}`}>{label}</span>
|
|
45
|
-
<span className="flex min-w-0
|
|
45
|
+
<span className="flex min-w-0 shrink-0 items-center gap-1.5">
|
|
46
46
|
<span
|
|
47
47
|
data-flat-row-value="true"
|
|
48
48
|
className={`min-w-0 border-b pb-px font-mono text-[11px] ${VALUE_TIER_VALUE_CLASS[tier]} ${
|
|
@@ -73,7 +73,7 @@ export function FlatRow({
|
|
|
73
73
|
track("button", `Reset ${label}`);
|
|
74
74
|
onReset();
|
|
75
75
|
}}
|
|
76
|
-
className="
|
|
76
|
+
className="shrink-0 text-panel-text-3 opacity-0 transition-opacity hover:text-panel-text-1 group-hover:opacity-100"
|
|
77
77
|
>
|
|
78
78
|
<RotateCcw size={11} />
|
|
79
79
|
</button>
|
|
@@ -84,7 +84,7 @@ export function FlatRow({
|
|
|
84
84
|
height="10"
|
|
85
85
|
viewBox="0 0 10 10"
|
|
86
86
|
fill="currentColor"
|
|
87
|
-
className="
|
|
87
|
+
className="shrink-0 text-panel-text-5"
|
|
88
88
|
>
|
|
89
89
|
<path d="M2 3l3 4 3-4z" />
|
|
90
90
|
</svg>
|
|
@@ -196,7 +196,7 @@ export function FlatGroupHeader({
|
|
|
196
196
|
type="button"
|
|
197
197
|
data-flat-group-collapsed="true"
|
|
198
198
|
onClick={onToggleOpen}
|
|
199
|
-
className={`${animateEntrance ? "hf-flat-group-enter " : ""}flex min-h-10 w-full
|
|
199
|
+
className={`${animateEntrance ? "hf-flat-group-enter " : ""}flex min-h-10 w-full shrink-0 items-center justify-between gap-2 border-b border-panel-hairline bg-panel-bg px-4 text-left`}
|
|
200
200
|
>
|
|
201
201
|
<span className="flex min-w-0 items-center gap-2">
|
|
202
202
|
<span className="text-[12px] font-medium text-panel-text-2">{title}</span>
|
|
@@ -211,7 +211,7 @@ export function FlatGroupHeader({
|
|
|
211
211
|
height="12"
|
|
212
212
|
viewBox="0 0 12 12"
|
|
213
213
|
fill="currentColor"
|
|
214
|
-
className="
|
|
214
|
+
className="shrink-0 text-panel-text-5"
|
|
215
215
|
>
|
|
216
216
|
<path d="M4 2l4 4-4 4z" />
|
|
217
217
|
</svg>
|
|
@@ -221,7 +221,7 @@ export function FlatGroupHeader({
|
|
|
221
221
|
|
|
222
222
|
return (
|
|
223
223
|
<div
|
|
224
|
-
className={`${animateEntrance ? "hf-flat-group-enter " : ""}flex min-h-10
|
|
224
|
+
className={`${animateEntrance ? "hf-flat-group-enter " : ""}flex min-h-10 shrink-0 items-center justify-between bg-panel-bg px-4`}
|
|
225
225
|
>
|
|
226
226
|
<span className="text-[12px] font-semibold text-panel-text-0">{title}</span>
|
|
227
227
|
<span className="flex items-center gap-2.5 text-panel-text-5">
|
|
@@ -415,7 +415,7 @@ export function FlatSlider({
|
|
|
415
415
|
|
|
416
416
|
return (
|
|
417
417
|
<div className="flex min-h-[28px] items-center gap-2.5">
|
|
418
|
-
<span className="w-[86px]
|
|
418
|
+
<span className="w-[86px] shrink-0 text-[11px] text-panel-text-3">{label}</span>
|
|
419
419
|
<div
|
|
420
420
|
data-flat-slider-track="true"
|
|
421
421
|
role="slider"
|
|
@@ -516,7 +516,7 @@ export function FlatSlider({
|
|
|
516
516
|
{centerTick && (
|
|
517
517
|
<div
|
|
518
518
|
data-flat-slider-center-tick="true"
|
|
519
|
-
className="absolute left-1/2 top-
|
|
519
|
+
className="absolute left-1/2 -top-px h-1 w-px -translate-x-1/2 bg-panel-text-5"
|
|
520
520
|
/>
|
|
521
521
|
)}
|
|
522
522
|
{tier === "explicitCustom" && (
|
|
@@ -537,14 +537,14 @@ export function FlatSlider({
|
|
|
537
537
|
</div>
|
|
538
538
|
<span
|
|
539
539
|
data-flat-slider-value="true"
|
|
540
|
-
className={`w-11
|
|
540
|
+
className={`w-11 shrink-0 text-right font-mono text-[10px] ${
|
|
541
541
|
tier === "explicitCustom" ? "text-panel-text-0" : "text-panel-text-3"
|
|
542
542
|
}`}
|
|
543
543
|
>
|
|
544
544
|
{displayValue}
|
|
545
545
|
</span>
|
|
546
546
|
{(centerTick || onReset) && (
|
|
547
|
-
<span data-flat-slider-reset-slot="true" className="w-3.5
|
|
547
|
+
<span data-flat-slider-reset-slot="true" className="w-3.5 shrink-0">
|
|
548
548
|
{tier === "explicitCustom" && onReset && (
|
|
549
549
|
<button
|
|
550
550
|
type="button"
|
|
@@ -68,7 +68,7 @@ export function FlatSelectRow({
|
|
|
68
68
|
track("select", trackName);
|
|
69
69
|
onChange(e.target.value);
|
|
70
70
|
}}
|
|
71
|
-
className={`appearance-none bg-transparent text-right font-mono text-[11px] outline-
|
|
71
|
+
className={`appearance-none bg-transparent text-right font-mono text-[11px] outline-hidden disabled:cursor-not-allowed ${VALUE_TIER_VALUE_CLASS[tier]}`}
|
|
72
72
|
>
|
|
73
73
|
{renderedOptions.map((option) => (
|
|
74
74
|
<option key={option.value} value={option.value}>
|
|
@@ -81,7 +81,7 @@ export function FlatSelectRow({
|
|
|
81
81
|
height="10"
|
|
82
82
|
viewBox="0 0 10 10"
|
|
83
83
|
fill="currentColor"
|
|
84
|
-
className="
|
|
84
|
+
className="shrink-0 text-panel-text-5"
|
|
85
85
|
>
|
|
86
86
|
<path d="M2 3l3 4 3-4z" />
|
|
87
87
|
</svg>
|
|
@@ -96,7 +96,7 @@ export function FlatSelectRow({
|
|
|
96
96
|
track("button", `Reset ${trackName}`);
|
|
97
97
|
onReset();
|
|
98
98
|
}}
|
|
99
|
-
className="
|
|
99
|
+
className="shrink-0 text-panel-text-3 opacity-0 transition-opacity hover:text-panel-text-1 group-hover:opacity-100 disabled:cursor-not-allowed disabled:opacity-40"
|
|
100
100
|
>
|
|
101
101
|
<RotateCcw size={11} />
|
|
102
102
|
</button>
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import React, { act, useState } from "react";
|
|
4
4
|
import { createRoot } from "react-dom/client";
|
|
5
|
-
import
|
|
6
|
-
import tailwindcss from "tailwindcss";
|
|
5
|
+
import { compile } from "tailwindcss";
|
|
7
6
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
8
7
|
import { FlatTextLayerList, FlatTextSection } from "./propertyPanelFlatTextSection";
|
|
9
8
|
import type { DomEditSelection, DomEditTextField } from "./domEditingTypes";
|
|
@@ -511,13 +510,13 @@ describe("FlatTextSection — multi-field", () => {
|
|
|
511
510
|
expect(contentTextarea?.classList).toContain("resize-y");
|
|
512
511
|
expect(contentTextarea?.classList).toContain("overflow-y-auto");
|
|
513
512
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
expect(compiled.
|
|
513
|
+
// Tailwind v4 has no PostCSS-plugin JS API; `compile` takes the stylesheet
|
|
514
|
+
// and is handed the candidates directly instead of scanning raw content.
|
|
515
|
+
const candidates = Array.from(host.querySelectorAll<HTMLElement>("*")).flatMap((el) =>
|
|
516
|
+
Array.from(el.classList),
|
|
517
|
+
);
|
|
518
|
+
const compiled = await compile("@tailwind utilities;");
|
|
519
|
+
expect(compiled.build(candidates)).toContain("field-sizing: content");
|
|
521
520
|
|
|
522
521
|
act(() => root.unmount());
|
|
523
522
|
});
|
|
@@ -121,7 +121,7 @@ function FlatTextFieldEditor({
|
|
|
121
121
|
track("select", "Weight");
|
|
122
122
|
onSetTextFieldStyle(field.key, "font-weight", e.target.value);
|
|
123
123
|
}}
|
|
124
|
-
className={`appearance-none bg-transparent text-right font-mono text-[11px] outline-
|
|
124
|
+
className={`appearance-none bg-transparent text-right font-mono text-[11px] outline-hidden ${
|
|
125
125
|
VALUE_TIER_VALUE_CLASS[resolveValueTier(field.inlineStyles["font-weight"], "400")]
|
|
126
126
|
}`}
|
|
127
127
|
>
|
|
@@ -138,7 +138,7 @@ function FlatTextFieldEditor({
|
|
|
138
138
|
height="10"
|
|
139
139
|
viewBox="0 0 10 10"
|
|
140
140
|
fill="currentColor"
|
|
141
|
-
className="
|
|
141
|
+
className="shrink-0 text-panel-text-5"
|
|
142
142
|
>
|
|
143
143
|
<path d="M2 3l3 4 3-4z" />
|
|
144
144
|
</svg>
|
|
@@ -387,13 +387,13 @@ export function FlatTextLayerList({
|
|
|
387
387
|
}`}
|
|
388
388
|
>
|
|
389
389
|
<span
|
|
390
|
-
className="h-3 w-3
|
|
390
|
+
className="h-3 w-3 shrink-0 rounded-xs"
|
|
391
391
|
style={{ backgroundColor: getTextFieldColor(field, styles) }}
|
|
392
392
|
/>
|
|
393
393
|
<span className="min-w-0 flex-1 truncate text-[11px] text-panel-text-1">
|
|
394
394
|
{formatTextFieldPreview(field.value) || `Text ${index + 1}`}
|
|
395
395
|
</span>
|
|
396
|
-
<span className="
|
|
396
|
+
<span className="shrink-0 font-mono text-[9px] text-panel-text-4">
|
|
397
397
|
{field.tagName}
|
|
398
398
|
</span>
|
|
399
399
|
{fields.length > 1 && (
|
|
@@ -406,7 +406,7 @@ export function FlatTextLayerList({
|
|
|
406
406
|
track("button", "Remove text field");
|
|
407
407
|
onRemove(field.key);
|
|
408
408
|
}}
|
|
409
|
-
className="
|
|
409
|
+
className="shrink-0 text-panel-text-4 hover:text-panel-text-1"
|
|
410
410
|
>
|
|
411
411
|
<X size={10} />
|
|
412
412
|
</button>
|
|
@@ -37,7 +37,7 @@ export function FlatToggle({
|
|
|
37
37
|
track("toggle", label);
|
|
38
38
|
onChange(!checked);
|
|
39
39
|
}}
|
|
40
|
-
className={`relative h-[14px] w-6
|
|
40
|
+
className={`relative h-[14px] w-6 shrink-0 rounded-full transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${
|
|
41
41
|
checked ? "bg-panel-accent/35" : "bg-panel-hover"
|
|
42
42
|
}`}
|
|
43
43
|
>
|
|
@@ -425,7 +425,7 @@ export function FontFamilyField({
|
|
|
425
425
|
role="combobox"
|
|
426
426
|
aria-expanded={open}
|
|
427
427
|
aria-autocomplete="list"
|
|
428
|
-
className="min-w-0 rounded-lg border border-neutral-800 bg-neutral-900 px-2.5 py-2 text-[11px] font-medium text-neutral-100 outline-
|
|
428
|
+
className="min-w-0 rounded-lg border border-neutral-800 bg-neutral-900 px-2.5 py-2 text-[11px] font-medium text-neutral-100 outline-hidden placeholder:text-neutral-600 focus:border-neutral-600"
|
|
429
429
|
/>
|
|
430
430
|
{canQueryLocalFonts && (
|
|
431
431
|
<button
|
|
@@ -487,12 +487,12 @@ export function FontFamilyField({
|
|
|
487
487
|
{option.family}
|
|
488
488
|
</span>
|
|
489
489
|
{renderAliasFor(option.family) && (
|
|
490
|
-
<span className="
|
|
490
|
+
<span className="shrink-0 text-[9px] text-neutral-500">
|
|
491
491
|
→ {renderAliasFor(option.family)}
|
|
492
492
|
</span>
|
|
493
493
|
)}
|
|
494
494
|
</span>
|
|
495
|
-
<span className="
|
|
495
|
+
<span className="shrink-0 text-[9px] uppercase tracking-[0.14em] text-neutral-600">
|
|
496
496
|
{option.source}
|
|
497
497
|
</span>
|
|
498
498
|
</button>
|
|
@@ -524,7 +524,7 @@ export function FontFamilyField({
|
|
|
524
524
|
height="10"
|
|
525
525
|
viewBox="0 0 10 10"
|
|
526
526
|
fill="currentColor"
|
|
527
|
-
className="
|
|
527
|
+
className="shrink-0 text-panel-text-5"
|
|
528
528
|
>
|
|
529
529
|
<path d="M2 3l3 4 3-4z" />
|
|
530
530
|
</svg>
|
|
@@ -549,7 +549,7 @@ export function FontFamilyField({
|
|
|
549
549
|
>
|
|
550
550
|
{currentFamily}
|
|
551
551
|
</span>
|
|
552
|
-
<span className="
|
|
552
|
+
<span className="shrink-0 text-[10px] uppercase tracking-[0.14em] text-neutral-600">
|
|
553
553
|
Font
|
|
554
554
|
</span>
|
|
555
555
|
</button>
|
|
@@ -338,7 +338,7 @@ function CarveSourceRow({
|
|
|
338
338
|
<div className="hf-fx-row flex min-h-6 items-center gap-2">
|
|
339
339
|
{/* Wraps like every other name in this column (see FxParamRow) — one
|
|
340
340
|
truncating row beside wrapping ones reads as a rendering bug. */}
|
|
341
|
-
<span className="hf-fx-label w-[86px]
|
|
341
|
+
<span className="hf-fx-label w-[86px] shrink-0 wrap-break-word text-[10px] leading-tight text-panel-text-2">
|
|
342
342
|
Listen to
|
|
343
343
|
</span>
|
|
344
344
|
{soleVoice ? (
|
|
@@ -141,7 +141,7 @@ describe("FxParamRow label tooltip", () => {
|
|
|
141
141
|
// The whole name is present and allowed to wrap. No `title`: a tooltip
|
|
142
142
|
// answers one row on hover, wrapping answers the column at rest.
|
|
143
143
|
expect(label?.textContent).toBe("Gap between repeats");
|
|
144
|
-
expect(label?.className).toContain("break-
|
|
144
|
+
expect(label?.className).toContain("wrap-break-word");
|
|
145
145
|
expect(label?.className).not.toContain("truncate");
|
|
146
146
|
expect(label?.getAttribute("title")).toBeNull();
|
|
147
147
|
// The hint stays where it was: the two are different questions, and the
|