@hyperframes/studio 0.8.50 → 0.8.51
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-Cn_PpHqP.js} +3 -3
- package/dist/assets/index-C05SNrvY.js +360 -0
- package/dist/assets/{index-DUAIWxkI.js → index-CPS3Cvj8.js} +1 -1
- package/dist/assets/{index-Dt3qBI-9.js → index-Clrb11lj.js} +1 -1
- package/dist/assets/index-DUR9qzQM.css +1 -0
- package/dist/index.d.ts +18 -13
- package/dist/index.html +2 -2
- package/dist/index.js +1867 -3335
- package/dist/index.js.map +1 -1
- package/dist/styles/tailwind-preset.js.map +1 -1
- package/package.json +11 -12
- package/src/App.tsx +128 -141
- package/src/captions/components/CaptionAnimationPanel.tsx +4 -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.tsx +4 -7
- package/src/components/ExternalFileConflictBanner.tsx +16 -16
- package/src/components/LintModal.tsx +6 -16
- package/src/components/MediaPreview.tsx +2 -2
- package/src/components/SaveQueuePausedBanner.tsx +2 -2
- package/src/components/StudioHeader.tsx +2 -62
- package/src/components/StudioLeftSidebar.tsx +7 -4
- package/src/components/StudioOverlays.tsx +1 -1
- package/src/components/StudioRightPanel.tsx +4 -4
- package/src/components/StudioToast.tsx +2 -2
- package/src/components/TimelineToolbar.tsx +7 -7
- package/src/components/dock/Dock.test.tsx +192 -0
- package/src/components/dock/Dock.tsx +264 -0
- package/src/components/dock/dock.css +23 -0
- package/src/components/dock/dockLayout.ts +58 -0
- package/src/components/dock/dockLayoutSchema.ts +66 -0
- package/src/components/dock/dockLayoutStore.ts +91 -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.tsx +3 -3
- package/src/components/editor/MarqueeOverlay.tsx +1 -1
- package/src/components/editor/OffCanvasIndicators.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.tsx +2 -2
- package/src/components/editor/TimelineFxPopover.tsx +1 -1
- package/src/components/editor/TopologyLens.tsx +4 -4
- 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/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/NLEPreview.tsx +3 -3
- package/src/components/nle/PreviewOverlays.tsx +6 -6
- package/src/components/nle/PreviewPane.tsx +2 -2
- package/src/components/nle/TimelinePane.tsx +3 -3
- package/src/components/nle/TimelineResizeDivider.tsx +2 -2
- package/src/components/panels/SlideshowPanel.tsx +2 -2
- 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 +3 -3
- package/src/components/panels/VariablesValueControls.tsx +2 -2
- package/src/components/renders/FfmpegRequiredNotice.tsx +5 -5
- package/src/components/renders/RenderQueue.test.tsx +7 -0
- package/src/components/renders/RenderQueue.tsx +6 -6
- package/src/components/renders/RenderQueueItem.tsx +6 -6
- 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/CompositionsTab.tsx +5 -5
- package/src/components/sidebar/GlobalAssetsView.tsx +1 -1
- package/src/components/sidebar/LeftSidebar.lintBadge.test.tsx +58 -0
- package/src/components/sidebar/LeftSidebar.tsx +19 -5
- package/src/components/sidebar/PromptPreviewModal.tsx +3 -3
- package/src/components/ui/Button.test.tsx +60 -0
- package/src/components/ui/Button.tsx +4 -4
- package/src/components/ui/SearchInput.tsx +2 -2
- package/src/components/ui/Tooltip.tsx +1 -1
- package/src/hooks/useAppHotkeys.ts +1 -1
- package/src/hooks/useLintModal.test.tsx +65 -0
- package/src/hooks/useLintModal.ts +3 -0
- package/src/hooks/useSdkSession.lifecycle.test.tsx +49 -4
- package/src/hooks/useSdkSession.ts +43 -10
- package/src/hooks/useTimelineAssetDropOps.test.tsx +41 -1
- package/src/hooks/useTimelineAssetDropOps.ts +52 -11
- package/src/main.tsx +9 -3
- package/src/player/components/AudioWaveform.tsx +1 -1
- package/src/player/components/AutomationSelectionMenu.tsx +2 -2
- 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 +2 -1
- package/src/player/components/TimelineCanvas.tsx +17 -10
- 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.tsx +1 -1
- 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/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/styles/iconTokens.ts +20 -0
- package/src/styles/palette-reset.css +6 -0
- package/src/styles/studio.css +24 -21
- package/src/styles/tailwind-preset.shared.js +3 -0
- package/src/styles/theme.css +213 -0
- package/src/styles/theme.test.ts +196 -0
- package/src/utils/studioUiPreferences.ts +7 -0
- package/src/utils/timelineDropTrackInsert.test.ts +134 -0
- package/src/utils/timelineDropTrackInsert.ts +83 -0
- package/dist/assets/index-n2ml4tUn.js +0 -442
- package/dist/assets/index-pO6p0H27.css +0 -1
- 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/useProjectSignaturePoll.test.tsx +0 -135
- package/src/hooks/useProjectSignaturePoll.ts +0 -68
- package/src/hooks/useStoryboard.ts +0 -99
|
@@ -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
|
|
@@ -88,7 +88,7 @@ export function AutomationToggle({
|
|
|
88
88
|
<Tooltip label={automated ? "Automated" : "Automate"}>
|
|
89
89
|
<button
|
|
90
90
|
type="button"
|
|
91
|
-
className={`hf-fx-automate w-[16px]
|
|
91
|
+
className={`hf-fx-automate w-[16px] shrink-0 rounded-[3px] border font-mono text-[9px] leading-none ${
|
|
92
92
|
automated
|
|
93
93
|
? "border-panel-accent text-panel-accent"
|
|
94
94
|
: "border-panel-border-input text-panel-text-2 hover:text-panel-text-0"
|
|
@@ -192,10 +192,10 @@ export function FxParamRow({
|
|
|
192
192
|
big the space is" — so 86px of truncation left "How big the sp…", and
|
|
193
193
|
three rows of that read as the same word four times. A title only
|
|
194
194
|
answers it on hover, one row at a time; wrapping answers it for the
|
|
195
|
-
whole column at rest. `break-
|
|
195
|
+
whole column at rest. `wrap-break-word` so a long single token breaks
|
|
196
196
|
instead of widening the column. The row keeps `title={param.hint}`:
|
|
197
197
|
the name and the explanation are different questions. */}
|
|
198
|
-
<span className="hf-fx-label w-[86px]
|
|
198
|
+
<span className="hf-fx-label w-[86px] shrink-0 wrap-break-word text-[10px] leading-tight text-panel-text-2">
|
|
199
199
|
{param.label}
|
|
200
200
|
</span>
|
|
201
201
|
<select
|
|
@@ -236,7 +236,7 @@ export function FxParamRow({
|
|
|
236
236
|
>
|
|
237
237
|
{/* See the enum row above for why the name wraps instead of truncating. */}
|
|
238
238
|
<span
|
|
239
|
-
className={`hf-fx-label w-[86px]
|
|
239
|
+
className={`hf-fx-label w-[86px] shrink-0 wrap-break-word text-[10px] leading-tight ${
|
|
240
240
|
automated ? "text-panel-accent" : "text-panel-text-2"
|
|
241
241
|
}`}
|
|
242
242
|
>
|
|
@@ -258,7 +258,7 @@ export function FxParamRow({
|
|
|
258
258
|
onBlur={commit}
|
|
259
259
|
/>
|
|
260
260
|
<input
|
|
261
|
-
className="hf-fx-number w-[54px]
|
|
261
|
+
className="hf-fx-number w-[54px] shrink-0 rounded-[3px] bg-panel-surface px-1 py-0.5 text-right font-mono text-[10px] text-panel-text-0"
|
|
262
262
|
type="number"
|
|
263
263
|
min={param.min}
|
|
264
264
|
max={param.max}
|
|
@@ -287,7 +287,7 @@ export function FxParamRow({
|
|
|
287
287
|
}}
|
|
288
288
|
/>
|
|
289
289
|
{param.unit ? (
|
|
290
|
-
<span className="hf-fx-unit w-[22px]
|
|
290
|
+
<span className="hf-fx-unit w-[22px] shrink-0 font-mono text-[9px] text-panel-text-2">
|
|
291
291
|
{param.unit}
|
|
292
292
|
</span>
|
|
293
293
|
) : null}
|
|
@@ -87,7 +87,7 @@ function Fader({
|
|
|
87
87
|
<div className="relative h-[74px] w-full">
|
|
88
88
|
<span className="pointer-events-none absolute inset-x-0 top-1/2 h-px bg-panel-border-input" />
|
|
89
89
|
<span
|
|
90
|
-
className="pointer-events-none absolute left-1/2 w-[3px] -translate-x-1/2 rounded-
|
|
90
|
+
className="pointer-events-none absolute left-1/2 w-[3px] -translate-x-1/2 rounded-xs bg-panel-accent"
|
|
91
91
|
style={
|
|
92
92
|
// `value`, not `band.gain`: mid-drag across zero the fill would
|
|
93
93
|
// otherwise keep pointing the way it started.
|
|
@@ -95,7 +95,7 @@ function Fader({
|
|
|
95
95
|
}
|
|
96
96
|
/>
|
|
97
97
|
<input
|
|
98
|
-
className="hf-fx-eq-fader absolute left-1/2 h-[19px] w-[74px] -translate-x-1/2 -translate-y-1/2 rotate-
|
|
98
|
+
className="hf-fx-eq-fader absolute left-1/2 h-[19px] w-[74px] -translate-x-1/2 -translate-y-1/2 -rotate-90 cursor-ns-resize appearance-none bg-transparent"
|
|
99
99
|
style={{ top: "50%" }}
|
|
100
100
|
type="range"
|
|
101
101
|
min={-HF_AUDIO_EQ_RANGE_DB}
|
|
@@ -146,7 +146,7 @@ export const FX_PRESET_STYLE: Record<string, FxPresetStyle> = {
|
|
|
146
146
|
},
|
|
147
147
|
// The name is a joke and the type is in on it.
|
|
148
148
|
"doofus-worble": {
|
|
149
|
-
type: "text-[16px] tracking-
|
|
149
|
+
type: "text-[16px] tracking-widest",
|
|
150
150
|
color: "hsl(288, 85%, 72%)",
|
|
151
151
|
family: FACE.theatrical,
|
|
152
152
|
},
|
|
@@ -164,7 +164,7 @@ export const FX_PRESET_STYLE: Record<string, FxPresetStyle> = {
|
|
|
164
164
|
},
|
|
165
165
|
// Rough and too close — heavy industrial caps, growled rather than shouted.
|
|
166
166
|
monster: {
|
|
167
|
-
type: "text-[15px] font-black uppercase tracking-
|
|
167
|
+
type: "text-[15px] font-black uppercase tracking-wider",
|
|
168
168
|
color: "hsl(350, 78%, 64%)",
|
|
169
169
|
family: FACE.condensed,
|
|
170
170
|
},
|
|
@@ -109,7 +109,7 @@ export function GradingNumberField({
|
|
|
109
109
|
event.currentTarget.blur();
|
|
110
110
|
}
|
|
111
111
|
}}
|
|
112
|
-
className={`border-b border-panel-border-input/50 bg-transparent py-0.5 text-right font-mono text-[9px] text-panel-text-2 outline-
|
|
112
|
+
className={`border-b border-panel-border-input/50 bg-transparent py-0.5 text-right font-mono text-[9px] text-panel-text-2 outline-hidden focus:border-panel-accent disabled:opacity-40 ${inputClassName}`}
|
|
113
113
|
/>
|
|
114
114
|
</label>
|
|
115
115
|
);
|
|
@@ -182,7 +182,7 @@ export function MediaSection({
|
|
|
182
182
|
event.stopPropagation();
|
|
183
183
|
void runBackgroundRemoval();
|
|
184
184
|
}}
|
|
185
|
-
className="flex h-8
|
|
185
|
+
className="flex h-8 shrink-0 items-center gap-1.5 rounded-md bg-panel-input px-2.5 text-[11px] font-medium text-panel-text-2 transition-colors hover:bg-panel-hover hover:text-panel-text-1 disabled:cursor-not-allowed disabled:opacity-50"
|
|
186
186
|
title={
|
|
187
187
|
canRemoveBackground
|
|
188
188
|
? "Remove background and save a transparent asset"
|
|
@@ -70,21 +70,21 @@ export function MetricField({
|
|
|
70
70
|
scrub && !disabled
|
|
71
71
|
? ({
|
|
72
72
|
className:
|
|
73
|
-
"
|
|
73
|
+
"shrink-0 text-[11px] font-medium text-neutral-500 cursor-ew-resize select-none",
|
|
74
74
|
onPointerDown: handleScrubPointerDown,
|
|
75
75
|
onPointerMove: handleScrubPointerMove,
|
|
76
76
|
onPointerUp: handleScrubPointerUp,
|
|
77
77
|
onPointerCancel: handleScrubPointerUp,
|
|
78
78
|
onLostPointerCapture: handleScrubPointerUp,
|
|
79
79
|
} as const)
|
|
80
|
-
: ({ className: "
|
|
80
|
+
: ({ className: "shrink-0 text-[11px] font-medium text-neutral-500" } as const);
|
|
81
81
|
|
|
82
82
|
return (
|
|
83
83
|
<div className={FIELD} title={tooltip}>
|
|
84
84
|
<div className="flex min-w-0 items-center gap-3">
|
|
85
85
|
<span {...scrubProps}>{label}</span>
|
|
86
86
|
<CommitField value={value} disabled={disabled} liveCommit={liveCommit} onCommit={commit} />
|
|
87
|
-
{suffix && <span className="
|
|
87
|
+
{suffix && <span className="shrink-0 text-[10px] text-neutral-600">{suffix}</span>}
|
|
88
88
|
</div>
|
|
89
89
|
</div>
|
|
90
90
|
);
|
|
@@ -262,7 +262,7 @@ export function SelectField({
|
|
|
262
262
|
const renderedOptions = value && !options.includes(value) ? [value, ...options] : options;
|
|
263
263
|
return (
|
|
264
264
|
<label className={`${FIELD} flex items-center gap-3`}>
|
|
265
|
-
<span className="
|
|
265
|
+
<span className="shrink-0 text-[11px] font-medium text-neutral-500">{label}</span>
|
|
266
266
|
<select
|
|
267
267
|
value={value}
|
|
268
268
|
disabled={disabled}
|
|
@@ -270,7 +270,7 @@ export function SelectField({
|
|
|
270
270
|
track("select", label);
|
|
271
271
|
onChange(e.target.value);
|
|
272
272
|
}}
|
|
273
|
-
className="min-w-0 w-full appearance-none bg-transparent text-[11px] font-medium text-neutral-100 outline-
|
|
273
|
+
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"
|
|
274
274
|
>
|
|
275
275
|
{renderedOptions.map((option) => (
|
|
276
276
|
<option key={option} value={option}>
|
|
@@ -302,7 +302,7 @@ export function Section({
|
|
|
302
302
|
height="10"
|
|
303
303
|
viewBox="0 0 10 10"
|
|
304
304
|
fill="currentColor"
|
|
305
|
-
className={`
|
|
305
|
+
className={`shrink-0 text-panel-text-5 transition-transform duration-150 ${
|
|
306
306
|
collapsed ? "-rotate-90" : ""
|
|
307
307
|
}`}
|
|
308
308
|
>
|
|
@@ -324,7 +324,7 @@ export function Section({
|
|
|
324
324
|
<h3 className="text-[12px] font-semibold text-panel-text-1">{title}</h3>
|
|
325
325
|
{collapseIcon}
|
|
326
326
|
</button>
|
|
327
|
-
{accessory && <div className="flex
|
|
327
|
+
{accessory && <div className="flex shrink-0 items-center">{accessory}</div>}
|
|
328
328
|
</div>
|
|
329
329
|
{!collapsed && <div className="px-4 pb-3">{children}</div>}
|
|
330
330
|
</section>
|
|
@@ -147,7 +147,7 @@ export function TextAreaField({
|
|
|
147
147
|
onFocus={handleFocus}
|
|
148
148
|
onChange={handleChange}
|
|
149
149
|
onBlur={handleBlur}
|
|
150
|
-
className="
|
|
150
|
+
className="field-sizing-content max-h-[40vh] min-h-12 w-full resize-y overflow-x-hidden overflow-y-auto bg-transparent font-mono text-[11px] leading-normal text-panel-text-0 outline-hidden disabled:cursor-not-allowed disabled:text-panel-text-4"
|
|
151
151
|
/>
|
|
152
152
|
</div>
|
|
153
153
|
);
|
|
@@ -165,7 +165,7 @@ export function TextAreaField({
|
|
|
165
165
|
onFocus={handleFocus}
|
|
166
166
|
onChange={handleChange}
|
|
167
167
|
onBlur={handleBlur}
|
|
168
|
-
className="
|
|
168
|
+
className="field-sizing-content max-h-[40vh] min-h-20 w-full resize-y overflow-x-hidden overflow-y-auto bg-transparent text-[11px] font-medium text-neutral-100 outline-hidden disabled:cursor-not-allowed disabled:text-neutral-600"
|
|
169
169
|
/>
|
|
170
170
|
</div>
|
|
171
171
|
</label>
|
|
@@ -189,7 +189,7 @@ function FontWeightField({
|
|
|
189
189
|
return (
|
|
190
190
|
<div className={FIELD}>
|
|
191
191
|
<div className="flex min-w-0 items-center gap-3">
|
|
192
|
-
<span className="
|
|
192
|
+
<span className="shrink-0 text-[11px] font-medium text-neutral-500">Weight</span>
|
|
193
193
|
<select
|
|
194
194
|
value={value}
|
|
195
195
|
disabled={disabled}
|
|
@@ -197,7 +197,7 @@ function FontWeightField({
|
|
|
197
197
|
track("select", "Weight");
|
|
198
198
|
onCommit(e.target.value);
|
|
199
199
|
}}
|
|
200
|
-
className="min-w-0 w-full appearance-none bg-transparent text-[11px] font-medium text-neutral-100 outline-
|
|
200
|
+
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"
|
|
201
201
|
>
|
|
202
202
|
{displayOptions.map((o) => (
|
|
203
203
|
<option key={o} value={o}>
|
|
@@ -323,7 +323,7 @@ function TextFieldEditor({
|
|
|
323
323
|
track("button", "Remove text field");
|
|
324
324
|
onRemoveTextField(field.key);
|
|
325
325
|
}}
|
|
326
|
-
className="inline-flex h-7
|
|
326
|
+
className="inline-flex h-7 shrink-0 items-center rounded-lg border border-neutral-700 bg-neutral-950 px-2.5 text-[11px] font-medium text-neutral-300 transition-colors hover:border-neutral-600 hover:text-white"
|
|
327
327
|
>
|
|
328
328
|
Remove
|
|
329
329
|
</button>
|
|
@@ -476,7 +476,7 @@ export function TextSection({
|
|
|
476
476
|
}}
|
|
477
477
|
className="inline-flex h-7 max-w-full items-center gap-1.5 rounded-lg border border-neutral-700 bg-neutral-950 px-2.5 text-[11px] font-medium text-neutral-300 transition-colors hover:border-neutral-600 hover:text-white"
|
|
478
478
|
>
|
|
479
|
-
<Plus size={12} className="
|
|
479
|
+
<Plus size={12} className="shrink-0" />
|
|
480
480
|
<span className="truncate">Add text</span>
|
|
481
481
|
</button>
|
|
482
482
|
</div>
|
|
@@ -497,14 +497,14 @@ export function TextSection({
|
|
|
497
497
|
<div className="flex min-w-0 items-center justify-between gap-2">
|
|
498
498
|
<div className="flex min-w-0 items-center gap-2">
|
|
499
499
|
<span
|
|
500
|
-
className="h-4 w-4
|
|
500
|
+
className="h-4 w-4 shrink-0 rounded-sm border border-neutral-700 bg-neutral-950"
|
|
501
501
|
style={{ backgroundColor: getTextFieldColor(field, styles) }}
|
|
502
502
|
/>
|
|
503
503
|
<span className="min-w-0 truncate text-[11px] font-medium text-neutral-100">
|
|
504
504
|
{formatTextFieldPreview(field.value) || `Text ${index + 1}`}
|
|
505
505
|
</span>
|
|
506
506
|
</div>
|
|
507
|
-
<span className="
|
|
507
|
+
<span className="shrink-0 rounded-md border border-neutral-700 bg-neutral-950 px-1.5 py-0.5 text-[10px] text-neutral-500">
|
|
508
508
|
{field.tagName}
|
|
509
509
|
</span>
|
|
510
510
|
</div>
|