@hyperframes/studio 0.8.104 → 0.8.105

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.
Files changed (169) hide show
  1. package/dist/assets/{hyperframes-player-DAoaajuM.js → hyperframes-player-tnfCiVdR.js} +1 -1
  2. package/dist/assets/{index-BDK4rTMb.js → index-Ca6LZlVb.js} +1 -1
  3. package/dist/assets/index-Cre9X4RS.css +1 -0
  4. package/dist/assets/{index-De2aO4XM.js → index-DEDhPmPD.js} +205 -205
  5. package/dist/assets/{index-WV9LroAD.js → index-zpe332hb.js} +1 -1
  6. package/dist/{chunk-62DDWOSH.js → chunk-EEXSYY5F.js} +19 -18
  7. package/dist/chunk-EEXSYY5F.js.map +1 -0
  8. package/dist/{chunk-6GAO75IU.js → chunk-NCUBAVGK.js} +10 -8
  9. package/dist/chunk-NCUBAVGK.js.map +1 -0
  10. package/dist/{chunk-HIGHVWYD.js → chunk-QADHJFDF.js} +2 -2
  11. package/dist/index.css +6 -1
  12. package/dist/index.css.map +1 -1
  13. package/dist/index.html +2 -2
  14. package/dist/index.js +614 -638
  15. package/dist/index.js.map +1 -1
  16. package/dist/player.js +2 -2
  17. package/dist/styles/tailwind-preset.js.map +1 -1
  18. package/dist/styles.css +1 -1
  19. package/dist/ui.js +2 -2
  20. package/package.json +8 -8
  21. package/src/captions/components/CaptionAnimationPanel.tsx +2 -2
  22. package/src/captions/components/CaptionPropertyPanel.tsx +2 -2
  23. package/src/captions/components/CaptionTimeline.tsx +3 -3
  24. package/src/components/AskAgentModal.tsx +1 -1
  25. package/src/components/LintModal.tsx +35 -35
  26. package/src/components/StudioErrorBoundary.tsx +1 -1
  27. package/src/components/StudioHeader.dom.test.tsx +4 -4
  28. package/src/components/StudioHeader.tsx +2 -1
  29. package/src/components/StudioToast.tsx +7 -16
  30. package/src/components/TimelineToolPicker.tsx +1 -1
  31. package/src/components/TimelineToolbar.tsx +11 -11
  32. package/src/components/dock/Dock.tsx +1 -1
  33. package/src/components/dock/dock.css +9 -1
  34. package/src/components/editor/AnimationCard.tsx +5 -5
  35. package/src/components/editor/AnimationCardParts.tsx +1 -1
  36. package/src/components/editor/BlockParamsPanel.tsx +3 -3
  37. package/src/components/editor/BorderRadiusEditor.tsx +8 -15
  38. package/src/components/editor/CanvasContextMenu.tsx +1 -1
  39. package/src/components/editor/ComputedTweenNotice.tsx +1 -1
  40. package/src/components/editor/DomEditRotateHandle.tsx +1 -1
  41. package/src/components/editor/EaseCurveSection.tsx +14 -19
  42. package/src/components/editor/EaseModeControls.tsx +2 -2
  43. package/src/components/editor/EaseParamFields.tsx +8 -8
  44. package/src/components/editor/FileTree.tsx +1 -1
  45. package/src/components/editor/FileTreeIcons.tsx +47 -26
  46. package/src/components/editor/FileTreeNodes.tsx +11 -8
  47. package/src/components/editor/GestureRecordControl.tsx +3 -3
  48. package/src/components/editor/GsapAddAnimationControl.tsx +1 -1
  49. package/src/components/editor/GsapAnimationSection.tsx +2 -2
  50. package/src/components/editor/InlineTextToolbar.tsx +4 -4
  51. package/src/components/editor/InspectorHeaderActions.tsx +1 -1
  52. package/src/components/editor/KeyframeDiamond.tsx +6 -4
  53. package/src/components/editor/KeyframeNavigation.tsx +4 -4
  54. package/src/components/editor/LayersPanel.tsx +3 -3
  55. package/src/components/editor/PromotableControl.tsx +2 -2
  56. package/src/components/editor/PropertyPanelEmptyState.tsx +4 -4
  57. package/src/components/editor/PropertyPanelFlatFooter.tsx +2 -2
  58. package/src/components/editor/PropertyPanelFlatHeader.test.tsx +1 -1
  59. package/src/components/editor/PropertyPanelFlatHeader.tsx +2 -2
  60. package/src/components/editor/SnapToolbar.tsx +5 -5
  61. package/src/components/editor/TimelineFxPopover.tsx +4 -4
  62. package/src/components/editor/Transform3DCube.tsx +1 -1
  63. package/src/components/editor/anchoredResizeReleaseShift.test.ts +0 -84
  64. package/src/components/editor/easeCurveSvg.tsx +1 -1
  65. package/src/components/editor/manualEditsDom.ts +3 -3
  66. package/src/components/editor/manualEditsDomPatches.test.ts +2 -86
  67. package/src/components/editor/manualEditsDomPatches.ts +0 -30
  68. package/src/components/editor/manualEditsSnapshot.ts +1 -0
  69. package/src/components/editor/persistSeam.integration.test.ts +0 -18
  70. package/src/components/editor/plainTranslate.ts +34 -3
  71. package/src/components/editor/propertyPanelColorCurveGraph.tsx +2 -2
  72. package/src/components/editor/propertyPanelColorGradingControls.tsx +1 -1
  73. package/src/components/editor/propertyPanelColorGradingSection.tsx +8 -8
  74. package/src/components/editor/propertyPanelColorGradingSlider.tsx +1 -1
  75. package/src/components/editor/propertyPanelColorSecondary.tsx +4 -4
  76. package/src/components/editor/propertyPanelFill.tsx +6 -6
  77. package/src/components/editor/propertyPanelFlatColorGradingAccessory.tsx +3 -3
  78. package/src/components/editor/propertyPanelFlatColorGradingSection.test.tsx +1 -1
  79. package/src/components/editor/propertyPanelFlatColorGradingSection.tsx +6 -9
  80. package/src/components/editor/propertyPanelFlatEffectsSection.tsx +4 -4
  81. package/src/components/editor/propertyPanelFlatMediaSection.tsx +2 -2
  82. package/src/components/editor/propertyPanelFlatMotionSection.tsx +2 -2
  83. package/src/components/editor/propertyPanelFlatOverlaysSection.tsx +2 -2
  84. package/src/components/editor/propertyPanelFlatPrimitives.test.tsx +4 -3
  85. package/src/components/editor/propertyPanelFlatPrimitives.tsx +1 -1
  86. package/src/components/editor/propertyPanelFlatSliderReadout.tsx +1 -1
  87. package/src/components/editor/propertyPanelFont.tsx +2 -2
  88. package/src/components/editor/propertyPanelFxCarveModule.tsx +1 -1
  89. package/src/components/editor/propertyPanelFxControls.tsx +2 -2
  90. package/src/components/editor/propertyPanelFxEqModule.tsx +2 -2
  91. package/src/components/editor/propertyPanelFxNodeRow.tsx +1 -1
  92. package/src/components/editor/propertyPanelFxPresetRun.tsx +1 -1
  93. package/src/components/editor/propertyPanelMediaSection.tsx +1 -1
  94. package/src/components/editor/propertyPanelPrimitives.tsx +1 -1
  95. package/src/components/editor/propertyPanelSections.tsx +2 -2
  96. package/src/components/editor/propertyPanelValueTier.test.ts +1 -1
  97. package/src/components/editor/propertyPanelValueTier.ts +1 -1
  98. package/src/components/feedback/StudioFeedbackCard.tsx +11 -23
  99. package/src/components/nle/AssetPreviewOverlay.tsx +1 -1
  100. package/src/components/nle/AudioMeterStrip.tsx +2 -2
  101. package/src/components/nle/NLEPreview.test.ts +8 -4
  102. package/src/components/nle/PreviewOverlays.tsx +1 -1
  103. package/src/components/nle/PreviewPane.tsx +3 -3
  104. package/src/components/nle/PreviewPoster.tsx +29 -1
  105. package/src/components/nle/PreviewZoomOverlay.tsx +1 -1
  106. package/src/components/panels/SlideshowPanel.tsx +4 -4
  107. package/src/components/panels/SlideshowSubPanels.tsx +19 -21
  108. package/src/components/panels/VariablesBindElement.tsx +1 -1
  109. package/src/components/panels/VariablesDeclarationForm.tsx +1 -1
  110. package/src/components/panels/VariablesPanel.tsx +4 -6
  111. package/src/components/panels/VariablesRowAction.tsx +1 -1
  112. package/src/components/renders/FfmpegRequiredNotice.tsx +4 -4
  113. package/src/components/renders/RenderQueue.tsx +2 -2
  114. package/src/components/renders/RenderQueueItem.tsx +3 -3
  115. package/src/components/sidebar/AssetCard.tsx +3 -3
  116. package/src/components/sidebar/AssetContextMenu.tsx +7 -7
  117. package/src/components/sidebar/AssetsTab.tsx +6 -6
  118. package/src/components/sidebar/AudioRow.tsx +5 -3
  119. package/src/components/sidebar/BlocksTab.tsx +6 -6
  120. package/src/components/sidebar/CompositionsTab.drag.test.tsx +3 -69
  121. package/src/components/sidebar/CompositionsTab.rootBadge.test.tsx +4 -50
  122. package/src/components/sidebar/CompositionsTab.thumbnails.test.tsx +256 -0
  123. package/src/components/sidebar/CompositionsTab.tsx +65 -12
  124. package/src/components/sidebar/PromptPreviewModal.tsx +3 -3
  125. package/src/components/sidebar/SidebarLintButton.tsx +3 -3
  126. package/src/components/sidebar/compositionsTabTestUtils.tsx +39 -0
  127. package/src/components/timelineToolbarStyles.ts +3 -3
  128. package/src/components/ui/Button.tsx +4 -4
  129. package/src/components/ui/HyperframesLogo.tsx +19 -18
  130. package/src/components/ui/Input.tsx +1 -1
  131. package/src/components/ui/Menu.tsx +4 -2
  132. package/src/hooks/elementOffsetStager.ts +8 -7
  133. package/src/hooks/useClipboard.source.test.ts +42 -4
  134. package/src/hooks/useClipboard.ts +13 -3
  135. package/src/hooks/useDomEditCommits.ts +0 -3
  136. package/src/hooks/useDomGeometryCommit.test.tsx +4 -1
  137. package/src/hooks/useDomGeometryCommit.ts +0 -1
  138. package/src/hooks/useDomGeometryCommits.test.tsx +177 -32
  139. package/src/hooks/useDomGeometryCommits.ts +4 -49
  140. package/src/player/components/ClipContextMenu.tsx +1 -1
  141. package/src/player/components/CompositionThumbnail.tsx +23 -11
  142. package/src/player/components/EditModal.tsx +6 -6
  143. package/src/player/components/KeyframeDiamondContextMenu.tsx +2 -2
  144. package/src/player/components/PlayerControls.tsx +3 -3
  145. package/src/player/components/ShortcutsPanel.tsx +8 -20
  146. package/src/player/components/TimelineCanvas.tsx +1 -1
  147. package/src/player/components/TimelineClip.tsx +2 -2
  148. package/src/player/components/TimelineEmptyState.tsx +2 -2
  149. package/src/player/components/TimelineLanes.tsx +0 -1
  150. package/src/player/components/TrackClipCount.tsx +1 -1
  151. package/src/player/components/VolumeControl.tsx +1 -1
  152. package/src/player/components/timelineClipChildren.tsx +1 -1
  153. package/src/player/components/timelineMotionStyles.test.ts +6 -22
  154. package/src/player/components/trackHeaderLabelRows.tsx +16 -16
  155. package/src/player/lib/thumbnailScheduler.ts +4 -5
  156. package/src/player/lib/timelineViewportBudgets.test.ts +1 -1
  157. package/src/player/lib/timelineViewportBudgets.ts +1 -1
  158. package/src/styles/hex-baseline.json +7 -19
  159. package/src/styles/studio.css +0 -9
  160. package/src/styles/tailwind-preset.shared.js +2 -1
  161. package/src/styles/theme.css +204 -147
  162. package/src/styles/theme.test.ts +13 -9
  163. package/src/utils/blockCategories.ts +41 -9
  164. package/src/utils/clipboardPayload.ts +2 -0
  165. package/dist/assets/index-CQN3M56N.css +0 -1
  166. package/dist/chunk-62DDWOSH.js.map +0 -1
  167. package/dist/chunk-6GAO75IU.js.map +0 -1
  168. package/src/hooks/gsapTargetCache.ts +0 -62
  169. /package/dist/{chunk-HIGHVWYD.js.map → chunk-QADHJFDF.js.map} +0 -0
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  HyperframesLogo
3
- } from "./chunk-62DDWOSH.js";
3
+ } from "./chunk-EEXSYY5F.js";
4
4
  import {
5
5
  DOCK_PANEL_COMPONENT,
6
6
  LAYER_REVEAL_PRIOR_POSITION_ATTR,
@@ -67,7 +67,7 @@ import {
67
67
  whenPreviewBooted,
68
68
  wrapTimeline,
69
69
  writeStudioUiPreferences
70
- } from "./chunk-HIGHVWYD.js";
70
+ } from "./chunk-QADHJFDF.js";
71
71
  import {
72
72
  Button,
73
73
  ContextMenu,
@@ -99,7 +99,7 @@ import {
99
99
  fieldBase,
100
100
  fieldText,
101
101
  popupSurface
102
- } from "./chunk-6GAO75IU.js";
102
+ } from "./chunk-NCUBAVGK.js";
103
103
  import {
104
104
  DOM_EDIT_LAYER_OBSERVER_INIT,
105
105
  buildDefaultDomEditTextField,
@@ -532,6 +532,12 @@ if (typeof window !== "undefined") {
532
532
  // src/player/components/ShortcutsPanel.tsx
533
533
  import { useState, useCallback as useCallback2, useEffect as useEffect2, useId, useRef as useRef2, memo } from "react";
534
534
 
535
+ // src/components/timelineToolbarStyles.ts
536
+ var flatBtn = "flex h-7 w-7 items-center justify-center rounded-md transition-colors";
537
+ var flatIdle = `${flatBtn} text-text-2 hover:bg-hover hover:text-text-0 active:bg-press active:scale-[0.98]`;
538
+ var flatActive = `${flatBtn} bg-on text-text-0 hover:bg-on-hover active:scale-[0.98]`;
539
+ var flatDisabled = `${flatBtn} text-text-off cursor-not-allowed`;
540
+
535
541
  // src/hooks/useContextMenuDismiss.ts
536
542
  import { useCallback, useEffect, useRef } from "react";
537
543
  function useContextMenuDismiss(onClose) {
@@ -709,7 +715,7 @@ var ShortcutsPanel = memo(function ShortcutsPanel2({
709
715
  ref: triggerRef,
710
716
  type: "button",
711
717
  onClick: () => setShowShortcuts((v) => !v),
712
- className: `flex h-7 w-7 items-center justify-center rounded-md transition-colors ${showShortcuts ? "text-neutral-200" : "text-neutral-600 hover:text-neutral-300"}`,
718
+ className: showShortcuts ? flatActive : flatIdle,
713
719
  "aria-label": "Shortcuts and tools",
714
720
  "aria-expanded": showShortcuts,
715
721
  "aria-controls": shortcutsPanelId,
@@ -741,10 +747,8 @@ var ShortcutsPanel = memo(function ShortcutsPanel2({
741
747
  tabIndex: -1,
742
748
  role: "dialog",
743
749
  "aria-label": "Keyboard shortcuts and tools",
744
- className: "absolute bottom-full right-0 mb-2 z-50 rounded-lg shadow-xl min-w-[220px] overflow-y-auto outline-hidden",
750
+ className: "absolute bottom-full right-0 mb-2 z-50 rounded-lg border border-border bg-raised shadow-popover min-w-[220px] overflow-y-auto outline-hidden",
745
751
  style: {
746
- background: "#161618",
747
- border: "1px solid rgba(255,255,255,0.08)",
748
752
  maxHeight: "min(280px, calc(100vh - 80px))"
749
753
  },
750
754
  children: [
@@ -777,20 +781,13 @@ var ShortcutsPanel = memo(function ShortcutsPanel2({
777
781
  ) })
778
782
  ] })
779
783
  ] }),
780
- /* @__PURE__ */ jsx("div", { style: { borderTop: "1px solid rgba(255,255,255,0.06)" } }),
784
+ /* @__PURE__ */ jsx("div", { className: "border-t border-border" }),
781
785
  /* @__PURE__ */ jsxs("div", { className: "px-3 pt-2.5 pb-2", children: [
782
786
  /* @__PURE__ */ jsx("p", { className: "text-[9px] font-medium text-neutral-500 uppercase tracking-wider mb-1.5", children: "Work area" }),
783
787
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
784
788
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
785
789
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
786
- /* @__PURE__ */ jsx(
787
- "span",
788
- {
789
- className: "font-mono text-[10px] rounded-sm border border-neutral-700 px-1.5 py-0.5 text-neutral-300 min-w-[20px] text-center",
790
- style: { background: "rgba(255,255,255,0.05)" },
791
- children: "I"
792
- }
793
- ),
790
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] rounded-sm border border-neutral-700 px-1.5 py-0.5 text-neutral-300 min-w-[20px] text-center bg-hover", children: "I" }),
794
791
  /* @__PURE__ */ jsx("span", { className: "text-[10px] text-neutral-400", children: "In-point" })
795
792
  ] }),
796
793
  /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5", children: inPoint !== null ? /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -820,14 +817,7 @@ var ShortcutsPanel = memo(function ShortcutsPanel2({
820
817
  ] }),
821
818
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
822
819
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
823
- /* @__PURE__ */ jsx(
824
- "span",
825
- {
826
- className: "font-mono text-[10px] rounded-sm border border-neutral-700 px-1.5 py-0.5 text-neutral-300 min-w-[20px] text-center",
827
- style: { background: "rgba(255,255,255,0.05)" },
828
- children: "O"
829
- }
830
- ),
820
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] rounded-sm border border-neutral-700 px-1.5 py-0.5 text-neutral-300 min-w-[20px] text-center bg-hover", children: "O" }),
831
821
  /* @__PURE__ */ jsx("span", { className: "text-[10px] text-neutral-400", children: "Out-point" })
832
822
  ] }),
833
823
  /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5", children: outPoint !== null ? /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -857,18 +847,11 @@ var ShortcutsPanel = memo(function ShortcutsPanel2({
857
847
  ] })
858
848
  ] })
859
849
  ] }),
860
- /* @__PURE__ */ jsx("div", { style: { borderTop: "1px solid rgba(255,255,255,0.06)" } }),
850
+ /* @__PURE__ */ jsx("div", { className: "border-t border-border" }),
861
851
  /* @__PURE__ */ jsx("div", { className: "px-3 pt-2.5 pb-3 flex flex-col gap-3", children: sections.map((section, sectionIndex) => /* @__PURE__ */ jsxs("div", { children: [
862
852
  /* @__PURE__ */ jsx("p", { className: "text-[9px] font-medium text-neutral-500 uppercase tracking-wider mb-1.5", children: section.title }),
863
853
  /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-1", children: section.hints.map((hint, hintIndex) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
864
- /* @__PURE__ */ jsx(
865
- "span",
866
- {
867
- className: "font-mono text-[10px] rounded-sm border border-neutral-700 px-1.5 py-0.5 text-neutral-300 min-w-[36px] text-center",
868
- style: { background: "rgba(255,255,255,0.05)" },
869
- children: hint.key
870
- }
871
- ),
854
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] rounded-sm border border-neutral-700 px-1.5 py-0.5 text-neutral-300 min-w-[36px] text-center bg-hover", children: hint.key }),
872
855
  /* @__PURE__ */ jsx("span", { className: "text-[10px] text-neutral-400", children: hint.label })
873
856
  ] }, hintIndex)) })
874
857
  ] }, sectionIndex)) })
@@ -1039,7 +1022,7 @@ var VolumeControl = memo3(function VolumeControl2({
1039
1022
  disabled,
1040
1023
  "aria-label": muteLabel,
1041
1024
  "aria-pressed": silent,
1042
- className: `flex h-7 w-7 shrink-0 items-center justify-center rounded-md transition-colors disabled:pointer-events-none disabled:opacity-30 ${silent ? "text-studio-accent" : "text-neutral-500 hover:text-neutral-200"}`,
1025
+ className: `flex h-7 w-7 shrink-0 items-center justify-center rounded-md transition-colors disabled:pointer-events-none disabled:opacity-30 ${silent ? "text-accent-ink" : "text-neutral-500 hover:text-neutral-200"}`,
1043
1026
  children: /* @__PURE__ */ jsx3(VolumeIcon, { muted: audioMuted, volume: audioVolume })
1044
1027
  }
1045
1028
  ) })
@@ -1085,7 +1068,7 @@ var LoopButton = memo4(function LoopButton2({
1085
1068
  setLoopEnabled(!loopEnabled);
1086
1069
  },
1087
1070
  disabled,
1088
- className: `flex h-7 w-7 items-center justify-center rounded-md transition-colors disabled:opacity-30 ${loopEnabled ? "text-studio-accent" : "text-neutral-500 hover:text-neutral-200"}`,
1071
+ className: `flex h-7 w-7 items-center justify-center rounded-md transition-colors disabled:opacity-30 ${loopEnabled ? "text-accent-ink" : "text-neutral-500 hover:text-neutral-200"}`,
1089
1072
  "aria-label": loopEnabled ? "Disable loop playback" : "Enable loop playback",
1090
1073
  "aria-pressed": loopEnabled,
1091
1074
  children: /* @__PURE__ */ jsxs4(
@@ -1123,7 +1106,7 @@ var FullscreenButton = memo4(function FullscreenButton2({
1123
1106
  trackStudioEvent("playback", { action: "fullscreen_toggle", active: !isFullscreen });
1124
1107
  onToggleFullscreen();
1125
1108
  },
1126
- className: `flex h-7 w-7 shrink-0 items-center justify-center rounded-md transition-colors ${isFullscreen ? "text-studio-accent" : "text-neutral-500 hover:text-neutral-200"}`,
1109
+ className: `flex h-7 w-7 shrink-0 items-center justify-center rounded-md transition-colors ${isFullscreen ? "text-accent-ink" : "text-neutral-500 hover:text-neutral-200"}`,
1127
1110
  "aria-label": isFullscreen ? "Exit fullscreen" : "Enter fullscreen",
1128
1111
  children: /* @__PURE__ */ jsx4(
1129
1112
  "svg",
@@ -1221,7 +1204,7 @@ var PlayerControls = memo4(function PlayerControls2({
1221
1204
  children: [
1222
1205
  /* @__PURE__ */ jsx4("span", { ref: timeDisplayRef, children: formatTime(0) }),
1223
1206
  timeDisplayMode === "time" ? /* @__PURE__ */ jsxs4(Fragment3, { children: [
1224
- /* @__PURE__ */ jsx4("span", { className: "mx-0.5 text-neutral-700", children: "/" }),
1207
+ /* @__PURE__ */ jsx4("span", { className: "mx-0.5 text-text-off", children: "/" }),
1225
1208
  /* @__PURE__ */ jsx4("span", { className: "text-neutral-600", children: formatTime(duration) })
1226
1209
  ] }) : null
1227
1210
  ]
@@ -6590,7 +6573,7 @@ function MiniCurveSvg({
6590
6573
  {
6591
6574
  d,
6592
6575
  fill: "none",
6593
- stroke: active ? "#3CE6AC" : "#737373",
6576
+ className: active ? "stroke-accent-ink" : "stroke-text-muted",
6594
6577
  strokeWidth: "1.5",
6595
6578
  strokeLinecap: "round"
6596
6579
  }
@@ -6630,7 +6613,7 @@ var EasePresetGrid = function EasePresetGrid2({
6630
6613
  /* @__PURE__ */ jsx11(
6631
6614
  "span",
6632
6615
  {
6633
- className: `text-center text-[8px] leading-none ${isActive ? "text-panel-accent" : "text-neutral-500"}`,
6616
+ className: `text-center text-[8px] leading-none ${isActive ? "text-accent-ink" : "text-neutral-500"}`,
6634
6617
  children: preset.label
6635
6618
  }
6636
6619
  )
@@ -6647,7 +6630,7 @@ function EaseModeToggle({
6647
6630
  return /* @__PURE__ */ jsx11(
6648
6631
  "div",
6649
6632
  {
6650
- className: "mb-2 grid grid-cols-3 rounded-md bg-black/20 p-0.5",
6633
+ className: "mb-2 grid grid-cols-3 rounded-md bg-press p-0.5",
6651
6634
  role: "radiogroup",
6652
6635
  "aria-label": "Ease editor mode",
6653
6636
  children: EASE_MODES.map((candidateMode) => {
@@ -6753,7 +6736,7 @@ function EaseBezierField({
6753
6736
  }
6754
6737
  },
6755
6738
  onBlur: (event) => commit(event.currentTarget.value),
6756
- className: `w-full rounded border bg-black/20 px-1.5 py-1 font-mono text-[10px] text-neutral-300 outline-hidden ${error ? "border-red-500/70 focus:border-red-400" : "border-white/10 focus:border-panel-accent/50"}`
6739
+ className: `w-full rounded border bg-input px-1.5 py-1 font-mono text-[10px] text-neutral-300 outline-hidden ${error ? "border-danger-ink/70 focus:border-danger-ink" : "border-border focus:border-panel-accent/50"}`
6757
6740
  }
6758
6741
  )
6759
6742
  ] }),
@@ -6762,7 +6745,7 @@ function EaseBezierField({
6762
6745
  {
6763
6746
  id: errorId,
6764
6747
  "aria-live": "polite",
6765
- className: `mt-1 text-[9px] text-red-400 ${error ? "" : "sr-only"}`,
6748
+ className: `mt-1 text-[9px] text-danger-ink ${error ? "" : "sr-only"}`,
6766
6749
  children: error ?? "Valid bezier values"
6767
6750
  }
6768
6751
  )
@@ -6830,7 +6813,7 @@ function SpringBounceField({
6830
6813
  const bounce = parseSpringBounce2(`spring(${value})`);
6831
6814
  if (bounce !== null) onCommit(`spring(${round2(bounce)})`);
6832
6815
  },
6833
- className: "w-16 rounded-sm border border-white/10 bg-black/20 px-1.5 py-1 font-mono text-[10px] text-neutral-300 outline-hidden focus:border-panel-accent/50"
6816
+ className: "w-16 rounded-sm border border-border bg-input px-1.5 py-1 font-mono text-[10px] text-neutral-300 outline-hidden focus:border-panel-accent/50"
6834
6817
  }
6835
6818
  )
6836
6819
  ] });
@@ -6851,7 +6834,7 @@ function WiggleField({
6851
6834
  min: 1,
6852
6835
  step: 1,
6853
6836
  onCommit: (value) => commitWiggle(onCommit, value, config.type, amplitude),
6854
- className: "w-14 rounded-sm border border-white/10 bg-black/20 px-1.5 py-1 font-mono text-[10px] text-neutral-300 outline-hidden focus:border-panel-accent/50"
6837
+ className: "w-14 rounded-sm border border-border bg-input px-1.5 py-1 font-mono text-[10px] text-neutral-300 outline-hidden focus:border-panel-accent/50"
6855
6838
  }
6856
6839
  )
6857
6840
  ] }),
@@ -6867,7 +6850,7 @@ function WiggleField({
6867
6850
  commitWiggle(onCommit, config.wiggles, event.currentTarget.value, amplitude);
6868
6851
  }
6869
6852
  },
6870
- className: "rounded-sm border border-white/10 bg-black/20 px-1.5 py-1 text-[10px] text-neutral-300 outline-hidden focus:border-panel-accent/50",
6853
+ className: "rounded-sm border border-border bg-input px-1.5 py-1 text-[10px] text-neutral-300 outline-hidden focus:border-panel-accent/50",
6871
6854
  children: WIGGLE_TYPES.map((type) => /* @__PURE__ */ jsx12("option", { value: type, children: type }, type))
6872
6855
  }
6873
6856
  )
@@ -6883,7 +6866,7 @@ function WiggleField({
6883
6866
  max: 1,
6884
6867
  step: 0.01,
6885
6868
  onCommit: (value) => commitWiggle(onCommit, config.wiggles, config.type, value),
6886
- className: "w-16 rounded-sm border border-white/10 bg-black/20 px-1.5 py-1 font-mono text-[10px] text-neutral-300 outline-hidden focus:border-panel-accent/50"
6869
+ className: "w-16 rounded-sm border border-border bg-input px-1.5 py-1 font-mono text-[10px] text-neutral-300 outline-hidden focus:border-panel-accent/50"
6887
6870
  }
6888
6871
  )
6889
6872
  ] })
@@ -6902,7 +6885,6 @@ var VMAX = 1 + HR / S;
6902
6885
  var VMIN = -HR / S;
6903
6886
  var DRAG_VMAX = 2;
6904
6887
  var DRAG_VMIN = -1;
6905
- var ACCENT = "#3CE6AC";
6906
6888
  function EaseTypeDropdown({
6907
6889
  kind,
6908
6890
  ease,
@@ -6971,7 +6953,7 @@ function EaseTypeDropdown({
6971
6953
  "aria-expanded": open,
6972
6954
  "aria-controls": open ? menuId : void 0,
6973
6955
  onClick: () => setOpen((prev) => !prev),
6974
- className: "flex w-full items-center gap-2 rounded-md border border-white/10 bg-black/20 px-2 py-1.5 text-left transition-colors hover:border-white/20",
6956
+ className: "flex w-full items-center gap-2 rounded-md border border-border bg-input px-2 py-1.5 text-left transition-colors hover:border-border-strong",
6975
6957
  children: [
6976
6958
  /* @__PURE__ */ jsx13(MiniCurveSvg, { ease, active: true, size: 16 }),
6977
6959
  /* @__PURE__ */ jsx13("span", { className: "text-[11px] text-neutral-200", children: label }),
@@ -6997,7 +6979,7 @@ function EaseTypeDropdown({
6997
6979
  role: "menu",
6998
6980
  "aria-label": `${MODE_LABELS[kind]} ease presets`,
6999
6981
  onKeyDown: handleMenuKeyDown,
7000
- className: "absolute inset-x-0 top-full z-20 mt-1 rounded-md border border-white/10 bg-neutral-900 p-2 shadow-xl",
6982
+ className: "absolute inset-x-0 top-full z-20 mt-1 rounded-md border border-border bg-raised p-2 shadow-xl",
7001
6983
  children: /* @__PURE__ */ jsx13(
7002
6984
  EasePresetGrid,
7003
6985
  {
@@ -7184,7 +7166,7 @@ function EaseCurveSection({
7184
7166
  /* @__PURE__ */ jsx13(
7185
7167
  "div",
7186
7168
  {
7187
- className: "mx-auto overflow-hidden rounded-md border border-white/5 bg-black/20",
7169
+ className: "mx-auto overflow-hidden rounded-md border border-border bg-input",
7188
7170
  style: { aspectRatio: `${SVGW} / ${SVGH}`, width: "100%", maxWidth: 230 },
7189
7171
  children: /* @__PURE__ */ jsxs9(
7190
7172
  "svg",
@@ -7206,7 +7188,7 @@ function EaseCurveSection({
7206
7188
  y1: top,
7207
7189
  x2: xToSvg(q),
7208
7190
  y2: bottom,
7209
- stroke: "white",
7191
+ className: "stroke-text-0",
7210
7192
  strokeOpacity: "0.05",
7211
7193
  strokeWidth: "1"
7212
7194
  },
@@ -7219,7 +7201,7 @@ function EaseCurveSection({
7219
7201
  y1: yToSvg(q),
7220
7202
  x2: right,
7221
7203
  y2: yToSvg(q),
7222
- stroke: "white",
7204
+ className: "stroke-text-0",
7223
7205
  strokeOpacity: "0.05",
7224
7206
  strokeWidth: "1"
7225
7207
  },
@@ -7233,7 +7215,7 @@ function EaseCurveSection({
7233
7215
  width: S,
7234
7216
  height: bottom - top,
7235
7217
  fill: "none",
7236
- stroke: "white",
7218
+ className: "stroke-text-0",
7237
7219
  strokeOpacity: "0.1",
7238
7220
  strokeWidth: "1"
7239
7221
  }
@@ -7245,7 +7227,7 @@ function EaseCurveSection({
7245
7227
  y1: a0.y,
7246
7228
  x2: a1.x,
7247
7229
  y2: a1.y,
7248
- stroke: "white",
7230
+ className: "stroke-text-0",
7249
7231
  strokeOpacity: "0.08",
7250
7232
  strokeWidth: "1",
7251
7233
  strokeDasharray: "3 4"
@@ -7259,8 +7241,7 @@ function EaseCurveSection({
7259
7241
  y1: a0.y,
7260
7242
  x2: p1.x,
7261
7243
  y2: p1.y,
7262
- stroke: ACCENT,
7263
- strokeOpacity: "0.5",
7244
+ className: "stroke-accent-ink",
7264
7245
  strokeWidth: "1.5"
7265
7246
  }
7266
7247
  ),
@@ -7271,8 +7252,7 @@ function EaseCurveSection({
7271
7252
  y1: a1.y,
7272
7253
  x2: p2.x,
7273
7254
  y2: p2.y,
7274
- stroke: ACCENT,
7275
- strokeOpacity: "0.5",
7255
+ className: "stroke-accent-ink",
7276
7256
  strokeWidth: "1.5"
7277
7257
  }
7278
7258
  )
@@ -7282,13 +7262,13 @@ function EaseCurveSection({
7282
7262
  {
7283
7263
  d: curvePath2,
7284
7264
  fill: "none",
7285
- stroke: ACCENT,
7265
+ className: "stroke-accent-ink",
7286
7266
  strokeWidth: "2.5",
7287
7267
  strokeLinecap: "round"
7288
7268
  }
7289
7269
  ),
7290
- /* @__PURE__ */ jsx13("circle", { cx: a0.x, cy: a0.y, r: "3", fill: ACCENT }),
7291
- /* @__PURE__ */ jsx13("circle", { cx: a1.x, cy: a1.y, r: "3", fill: ACCENT }),
7270
+ /* @__PURE__ */ jsx13("circle", { cx: a0.x, cy: a0.y, r: "3", className: "fill-accent-ink" }),
7271
+ /* @__PURE__ */ jsx13("circle", { cx: a1.x, cy: a1.y, r: "3", className: "fill-accent-ink" }),
7292
7272
  showHandles && [["p1", p1], ["p2", p2]].map(([key2, pt]) => /* @__PURE__ */ jsxs9("g", { children: [
7293
7273
  /* @__PURE__ */ jsx13(
7294
7274
  "circle",
@@ -7304,7 +7284,7 @@ function EaseCurveSection({
7304
7284
  "aria-valuemax": 1,
7305
7285
  "aria-valuenow": key2 === "p1" ? x1 : x2,
7306
7286
  "aria-valuetext": `x ${key2 === "p1" ? x1 : x2}, y ${key2 === "p1" ? y1 : y2}`,
7307
- className: "cursor-grab stroke-transparent outline-hidden active:cursor-grabbing focus-visible:stroke-white focus-visible:stroke-[2px]",
7287
+ className: "cursor-grab stroke-transparent outline-hidden active:cursor-grabbing focus-visible:stroke-text-0 focus-visible:stroke-[2px]",
7308
7288
  onPointerDown: (e) => handlePointerDown(key2, e),
7309
7289
  onKeyDown: (event) => handleKeyDown(key2, event),
7310
7290
  onPointerEnter: () => setHover(key2),
@@ -7317,10 +7297,8 @@ function EaseCurveSection({
7317
7297
  cx: pt.x,
7318
7298
  cy: pt.y,
7319
7299
  r: hover === key2 || draggingRef.current === key2 ? 7 : 5.5,
7320
- fill: "#0a0a1a",
7321
- stroke: ACCENT,
7322
7300
  strokeWidth: "2.5",
7323
- className: "pointer-events-none transition-[r]"
7301
+ className: "pointer-events-none fill-input stroke-accent-ink transition-[r]"
7324
7302
  }
7325
7303
  )
7326
7304
  ] }, key2))
@@ -7591,8 +7569,11 @@ var KeyframeDiamond = memo6(function KeyframeDiamond2({
7591
7569
  isHold = false
7592
7570
  }) {
7593
7571
  const isFilled = state === "active";
7594
- const opacity = state === "ghost" ? 0.25 : state === "inactive" ? 0.6 : 1;
7595
- const color = state === "active" ? "#3CE6AC" : "#a3a3a3";
7572
+ const color = {
7573
+ active: "text-accent",
7574
+ inactive: "text-text-2 hover:text-text-0",
7575
+ ghost: "text-text-off hover:text-text-0"
7576
+ }[state];
7596
7577
  return /* @__PURE__ */ jsx15(
7597
7578
  "button",
7598
7579
  {
@@ -7601,8 +7582,7 @@ var KeyframeDiamond = memo6(function KeyframeDiamond2({
7601
7582
  e.stopPropagation();
7602
7583
  onClick();
7603
7584
  },
7604
- className: "relative shrink-0 p-0.5 transition-opacity hover:opacity-100 before:absolute before:-inset-1.5 before:content-['']",
7605
- style: { color, opacity },
7585
+ className: `relative shrink-0 p-0.5 transition-colors before:absolute before:-inset-1.5 before:content-[''] ${color}`,
7606
7586
  title,
7607
7587
  "aria-label": title,
7608
7588
  "aria-pressed": state === "active",
@@ -7667,12 +7647,12 @@ function ArrowLeft({ disabled }) {
7667
7647
  height: "10",
7668
7648
  viewBox: "0 0 6 10",
7669
7649
  fill: "none",
7670
- style: { opacity: disabled ? 0.25 : 1 },
7650
+ className: disabled ? "text-text-off" : "text-text-2",
7671
7651
  children: /* @__PURE__ */ jsx16(
7672
7652
  "path",
7673
7653
  {
7674
7654
  d: "M5 1L1 5L5 9",
7675
- stroke: "#a3a3a3",
7655
+ stroke: "currentColor",
7676
7656
  strokeWidth: "1.4",
7677
7657
  strokeLinecap: "round",
7678
7658
  strokeLinejoin: "round"
@@ -7689,12 +7669,12 @@ function ArrowRight({ disabled }) {
7689
7669
  height: "10",
7690
7670
  viewBox: "0 0 6 10",
7691
7671
  fill: "none",
7692
- style: { opacity: disabled ? 0.25 : 1 },
7672
+ className: disabled ? "text-text-off" : "text-text-2",
7693
7673
  children: /* @__PURE__ */ jsx16(
7694
7674
  "path",
7695
7675
  {
7696
7676
  d: "M1 1L5 5L1 9",
7697
- stroke: "#a3a3a3",
7677
+ stroke: "currentColor",
7698
7678
  strokeWidth: "1.4",
7699
7679
  strokeLinecap: "round",
7700
7680
  strokeLinejoin: "round"
@@ -10970,7 +10950,7 @@ function ClipLintDot({ element }) {
10970
10950
  return /* @__PURE__ */ jsx21(
10971
10951
  "span",
10972
10952
  {
10973
- className: "absolute w-1.5 h-1.5 rounded-full bg-amber-400",
10953
+ className: "absolute w-1.5 h-1.5 rounded-full bg-warning-ink",
10974
10954
  style: { top: 7, right: 7 },
10975
10955
  title: lint.messages.join("\n")
10976
10956
  }
@@ -11888,7 +11868,7 @@ var TIMELINE_VIEWPORT_BUDGETS = Object.freeze({
11888
11868
  richPreviewP95Ms: 750,
11889
11869
  constrainedRichPreviewP95Ms: 1200,
11890
11870
  supportedFixtureFallbackRatio: 0.02,
11891
- scrollSamplesPerRun: 21,
11871
+ scrollSamplesPerRun: 63,
11892
11872
  warmupRuns: 3,
11893
11873
  measuredRuns: 5,
11894
11874
  requiredPassingRuns: 4
@@ -14184,7 +14164,7 @@ var TimelineClip = memo10(function TimelineClip2({
14184
14164
  width: 2,
14185
14165
  borderRadius: 1,
14186
14166
  background: "var(--clip-handle)",
14187
- opacity: handleOpacity * 0.6
14167
+ opacity: handleOpacity
14188
14168
  }
14189
14169
  }
14190
14170
  )
@@ -14216,7 +14196,7 @@ var TimelineClip = memo10(function TimelineClip2({
14216
14196
  width: 2,
14217
14197
  borderRadius: 1,
14218
14198
  background: "var(--clip-handle)",
14219
- opacity: handleOpacity * 0.6
14199
+ opacity: handleOpacity
14220
14200
  }
14221
14201
  }
14222
14202
  )
@@ -16614,7 +16594,7 @@ function TrackClipCount({ clipCount }) {
16614
16594
  {
16615
16595
  "aria-label": `${clipCount} clips`,
16616
16596
  title: `${clipCount} clips`,
16617
- className: "shrink-0 rounded-full bg-white/10 px-1 text-[9px] leading-[14px] tabular-nums text-white/55",
16597
+ className: "shrink-0 rounded-full bg-hover px-1 text-[9px] leading-[14px] tabular-nums text-text-muted",
16618
16598
  children: clipCount
16619
16599
  }
16620
16600
  );
@@ -17123,7 +17103,7 @@ function TimelineFxPopover({
17123
17103
  ref: rootRef,
17124
17104
  role: "dialog",
17125
17105
  "aria-label": "Effects",
17126
- className: "z-200 flex flex-col overflow-hidden rounded-md border border-white/10 bg-[#1b1b1f] p-2 shadow-xl",
17106
+ className: "z-200 flex flex-col overflow-hidden rounded-md border border-border bg-raised p-2 shadow-xl",
17127
17107
  style: clampedStyle(anchorRect),
17128
17108
  onKeyDown,
17129
17109
  onPointerDown: (event) => event.stopPropagation(),
@@ -17137,12 +17117,12 @@ function TimelineFxPopover({
17137
17117
  onAuditionTracked: (id) => trackPresetAuditioned(id, { trackKind })
17138
17118
  }
17139
17119
  ) }),
17140
- /* @__PURE__ */ jsxs23("div", { className: "mt-2 flex shrink-0 items-center justify-between border-t border-white/10 pt-2 text-[10px] text-white/55", children: [
17120
+ /* @__PURE__ */ jsxs23("div", { className: "mt-2 flex shrink-0 items-center justify-between border-t border-border pt-2 text-[10px] text-text-muted", children: [
17141
17121
  /* @__PURE__ */ jsx41(
17142
17122
  "button",
17143
17123
  {
17144
17124
  type: "button",
17145
- className: "hover:text-white",
17125
+ className: "hover:text-text-0",
17146
17126
  onClick: () => {
17147
17127
  onClose();
17148
17128
  onOpenRack();
@@ -17154,7 +17134,7 @@ function TimelineFxPopover({
17154
17134
  "button",
17155
17135
  {
17156
17136
  type: "button",
17157
- className: "hover:text-white",
17137
+ className: "hover:text-text-0",
17158
17138
  onClick: () => {
17159
17139
  onClose();
17160
17140
  onOpenRack();
@@ -17644,7 +17624,7 @@ function PropertyGroupNavigation({
17644
17624
  onSeek,
17645
17625
  children
17646
17626
  }) {
17647
- const CHEVRON_BUTTON_CLASS = "relative h-5 w-3 border-0 bg-transparent p-0 text-white/55 hover:text-white disabled:text-white/15 focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-[#3CE6AC] before:absolute before:left-1/2 before:top-1/2 before:h-6 before:w-6 before:-translate-x-1/2 before:-translate-y-1/2 before:content-['']";
17627
+ const CHEVRON_BUTTON_CLASS = "relative h-5 w-3 border-0 bg-transparent p-0 text-text-2 hover:text-text-0 disabled:text-text-off focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-ring before:absolute before:left-1/2 before:top-1/2 before:h-6 before:w-6 before:-translate-x-1/2 before:-translate-y-1/2 before:content-['']";
17648
17628
  const seekTo = (keyframe) => {
17649
17629
  if (keyframe) {
17650
17630
  onSeek?.(expandedElement.start + keyframe.percentage / 100 * expandedElement.duration);
@@ -17711,7 +17691,7 @@ function PropertyGroupHeaderRow({
17711
17691
  tabIndex: rovingTargetId === timelinePropertyRowId(elementId2, lane.group) ? 0 : -1,
17712
17692
  "data-property-group": lane.group,
17713
17693
  "data-timeline-lane-top": getTimelineLaneTop(laneIndex),
17714
- className: "absolute left-0 flex items-center gap-1 overflow-hidden px-1.5 text-[10px] text-white/65",
17694
+ className: "absolute left-0 flex items-center gap-1 overflow-hidden px-1.5 text-[10px] text-text-2",
17715
17695
  style: {
17716
17696
  top: getTimelineLaneTop(laneIndex),
17717
17697
  // The header column narrows to contentOrigin whenever that is under
@@ -17726,13 +17706,13 @@ function PropertyGroupHeaderRow({
17726
17706
  /* @__PURE__ */ jsx44(
17727
17707
  "span",
17728
17708
  {
17729
- className: "absolute left-1.5 top-0 w-px bg-white/15",
17709
+ className: "absolute left-1.5 top-0 w-px bg-text-0/15",
17730
17710
  style: { height: isLastLane ? "50%" : "100%" }
17731
17711
  }
17732
17712
  ),
17733
- /* @__PURE__ */ jsx44("span", { className: "absolute left-1.5 top-1/2 h-px w-1.5 bg-white/15" })
17713
+ /* @__PURE__ */ jsx44("span", { className: "absolute left-1.5 top-1/2 h-px w-1.5 bg-text-0/15" })
17734
17714
  ] }),
17735
- /* @__PURE__ */ jsx44("span", { className: "w-[46px] shrink-0 truncate text-white", title: label, children: label }),
17715
+ /* @__PURE__ */ jsx44("span", { className: "w-[46px] shrink-0 truncate text-text-0", title: label, children: label }),
17736
17716
  /* @__PURE__ */ jsx44(
17737
17717
  PropertyGroupNavigation,
17738
17718
  {
@@ -17747,7 +17727,7 @@ function PropertyGroupHeaderRow({
17747
17727
  "aria-pressed": !!navigation.currentKeyframe,
17748
17728
  "aria-label": `${navigation.currentKeyframe ? "Remove" : "Add"} ${label} keyframe`,
17749
17729
  title: `${navigation.currentKeyframe ? "Remove" : "Add"} ${label} keyframe`,
17750
- className: "flex h-6 w-6 shrink-0 items-center justify-center border-0 bg-transparent p-0 text-[11px] text-[#3CE6AC] focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-[#3CE6AC]",
17730
+ className: "flex h-6 w-6 shrink-0 items-center justify-center border-0 bg-transparent p-0 text-[11px] text-accent-ink focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-ring",
17751
17731
  onClick: (event) => {
17752
17732
  event.stopPropagation();
17753
17733
  if (toggleTarget) {
@@ -17762,7 +17742,7 @@ function PropertyGroupHeaderRow({
17762
17742
  /* @__PURE__ */ jsx44(
17763
17743
  "span",
17764
17744
  {
17765
- className: "min-w-0 flex-1 truncate text-right tabular-nums text-white/45",
17745
+ className: "min-w-0 flex-1 truncate text-right tabular-nums text-text-muted",
17766
17746
  title: valueReadout(lane.group, values),
17767
17747
  children: valueReadout(lane.group, values)
17768
17748
  }
@@ -17790,7 +17770,7 @@ function AutomationLaneHeaderRow({
17790
17770
  {
17791
17771
  "data-automation-lane-label": label,
17792
17772
  "data-timeline-lane-top": top,
17793
- className: "absolute left-0 flex items-center gap-1 overflow-hidden px-1.5 text-[10px] text-white/65",
17773
+ className: "absolute left-0 flex items-center gap-1 overflow-hidden px-1.5 text-[10px] text-text-2",
17794
17774
  style: {
17795
17775
  top,
17796
17776
  width: columnWidth,
@@ -17802,11 +17782,11 @@ function AutomationLaneHeaderRow({
17802
17782
  /* @__PURE__ */ jsx44(
17803
17783
  "span",
17804
17784
  {
17805
- className: "absolute left-1.5 top-0 w-px bg-white/15",
17785
+ className: "absolute left-1.5 top-0 w-px bg-text-0/15",
17806
17786
  style: { height: isLastLane ? "50%" : "100%" }
17807
17787
  }
17808
17788
  ),
17809
- /* @__PURE__ */ jsx44("span", { className: "absolute left-1.5 top-1/2 h-px w-1.5 bg-white/15" })
17789
+ /* @__PURE__ */ jsx44("span", { className: "absolute left-1.5 top-1/2 h-px w-1.5 bg-text-0/15" })
17810
17790
  ] }),
17811
17791
  /* @__PURE__ */ jsxs26(
17812
17792
  "button",
@@ -17816,19 +17796,19 @@ function AutomationLaneHeaderRow({
17816
17796
  "aria-label": onReveal ? `Show ${label} in the effect rack` : void 0,
17817
17797
  title: onReveal ? `Show ${label} in the effect rack` : label,
17818
17798
  disabled: !onReveal,
17819
- className: "flex min-w-0 flex-1 flex-col justify-center rounded-sm border-0 bg-transparent p-0 text-left leading-tight enabled:hover:text-white focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-[#3CE6AC]",
17799
+ className: "flex min-w-0 flex-1 flex-col justify-center rounded-sm border-0 bg-transparent p-0 text-left leading-tight enabled:hover:text-text-0 focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-ring",
17820
17800
  onPointerDown: (event) => event.stopPropagation(),
17821
17801
  onClick: (event) => {
17822
17802
  event.stopPropagation();
17823
17803
  onReveal?.();
17824
17804
  },
17825
17805
  children: [
17826
- /* @__PURE__ */ jsx44("span", { "data-automation-lane-name": "", className: "truncate font-mono text-[9px] text-white/70", children: name }),
17806
+ /* @__PURE__ */ jsx44("span", { "data-automation-lane-name": "", className: "truncate font-mono text-[9px] text-text-2", children: name }),
17827
17807
  param ? /* @__PURE__ */ jsx44(
17828
17808
  "span",
17829
17809
  {
17830
17810
  "data-automation-lane-param": "",
17831
- className: "truncate font-mono text-[9px] text-white/40",
17811
+ className: "truncate font-mono text-[9px] text-text-muted",
17832
17812
  children: param
17833
17813
  }
17834
17814
  ) : null,
@@ -17836,7 +17816,7 @@ function AutomationLaneHeaderRow({
17836
17816
  "span",
17837
17817
  {
17838
17818
  "data-automation-lane-also": "",
17839
- className: "truncate text-[9px] text-[#F5C542]/80",
17819
+ className: "truncate text-[9px] text-warning-ink",
17840
17820
  title: `${alsoAutomatedBy} is also fading this \u2014 the two multiply.`,
17841
17821
  children: [
17842
17822
  alsoAutomatedBy,
@@ -17853,7 +17833,7 @@ function AutomationLaneHeaderRow({
17853
17833
  type: "button",
17854
17834
  "aria-label": `Remove ${label} automation`,
17855
17835
  title: `Remove ${label} automation`,
17856
- className: "flex h-6 w-6 shrink-0 items-center justify-center border-0 bg-transparent p-0 text-[11px] text-white/35 hover:text-white focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-[#3CE6AC]",
17836
+ className: "flex h-6 w-6 shrink-0 items-center justify-center border-0 bg-transparent p-0 text-[11px] text-text-muted hover:text-text-0 focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-ring",
17857
17837
  onPointerDown: (event) => event.stopPropagation(),
17858
17838
  onClick: (event) => {
17859
17839
  event.stopPropagation();
@@ -21121,8 +21101,7 @@ function TimelineLanes({
21121
21101
  color: ts.label,
21122
21102
  fontSize: 11,
21123
21103
  letterSpacing: "0.06em",
21124
- textTransform: "uppercase",
21125
- opacity: 0.5
21104
+ textTransform: "uppercase"
21126
21105
  },
21127
21106
  children: "New track"
21128
21107
  }
@@ -21457,7 +21436,7 @@ var TimelineCanvas = memo13(function TimelineCanvas2() {
21457
21436
  "aria-hidden": "true",
21458
21437
  "data-testid": "timeline-ghost-lane",
21459
21438
  "data-active": ghostLaneActive || void 0,
21460
- className: `pointer-events-none absolute flex items-center justify-center rounded-lg border border-dashed text-[11px] transition-colors duration-150 ${ghostLaneActive ? "border-studio-accent/60 bg-studio-accent/6 text-studio-accent" : "border-neutral-700/50 text-neutral-500"}`,
21439
+ className: `pointer-events-none absolute flex items-center justify-center rounded-lg border border-dashed text-[11px] transition-colors duration-150 ${ghostLaneActive ? "border-studio-accent/60 bg-studio-accent/6 text-accent-ink" : "border-neutral-700/50 text-neutral-500"}`,
21461
21440
  style: {
21462
21441
  top: props.rowGeometry.getRowTop(ghostLaneRow) + CLIP_Y,
21463
21442
  left: props.contentOrigin,
@@ -21798,7 +21777,7 @@ function EditPopover({ rangeStart, rangeEnd, anchorX, anchorY, onClose }) {
21798
21777
  ] })
21799
21778
  ] }),
21800
21779
  elementsInRange.length > 0 && /* @__PURE__ */ jsx56("div", { className: "px-4 py-2 border-b border-neutral-800/40 max-h-24 overflow-y-auto", children: elementsInRange.map((el) => /* @__PURE__ */ jsxs36("div", { className: "flex items-center justify-between py-0.5", children: [
21801
- /* @__PURE__ */ jsxs36("span", { className: "text-[10px] font-mono text-studio-accent/80", children: [
21780
+ /* @__PURE__ */ jsxs36("span", { className: "text-[10px] font-mono text-accent-ink/80", children: [
21802
21781
  "#",
21803
21782
  el.id
21804
21783
  ] }),
@@ -21821,14 +21800,14 @@ function EditPopover({ rangeStart, rangeEnd, anchorX, anchorY, onClose }) {
21821
21800
  className: "w-full px-3 py-2 text-xs bg-neutral-800/60 border border-neutral-700/40 rounded-lg text-neutral-200 placeholder:text-neutral-600 resize-none focus:outline-hidden focus:border-studio-accent/40 transition-colors"
21822
21801
  }
21823
21802
  ) }),
21824
- copyError && /* @__PURE__ */ jsx56("p", { className: "px-3 pb-2 text-[10px] text-red-400", role: "alert", children: "Copy failed \u2014 check clipboard permissions and try again." }),
21803
+ copyError && /* @__PURE__ */ jsx56("p", { className: "px-3 pb-2 text-[10px] text-danger-ink", role: "alert", children: "Copy failed \u2014 check clipboard permissions and try again." }),
21825
21804
  /* @__PURE__ */ jsxs36("div", { className: "grid grid-cols-2 gap-2 px-3 pb-3", children: [
21826
21805
  /* @__PURE__ */ jsx56(
21827
21806
  "button",
21828
21807
  {
21829
21808
  onClick: handleCopyPrompt,
21830
21809
  disabled: !buildPromptCopyText(prompt),
21831
- className: `py-1.5 text-[11px] font-medium rounded-lg transition-all border ${copiedPromptOnly ? "bg-green-500/20 text-green-400 border-green-500/30" : "bg-neutral-800/70 text-neutral-200 border-neutral-700/50 hover:bg-neutral-800"} disabled:opacity-50 disabled:cursor-not-allowed`,
21810
+ className: `py-1.5 text-[11px] font-medium rounded-lg transition-all border ${copiedPromptOnly ? "bg-accent/15 text-accent-ink border-accent/30" : "bg-neutral-800/70 text-neutral-200 border-neutral-700/50 hover:bg-neutral-800"} disabled:opacity-50 disabled:cursor-not-allowed`,
21832
21811
  children: copiedPromptOnly ? "Prompt Copied!" : "Copy Prompt"
21833
21812
  }
21834
21813
  ),
@@ -21836,10 +21815,10 @@ function EditPopover({ rangeStart, rangeEnd, anchorX, anchorY, onClose }) {
21836
21815
  "button",
21837
21816
  {
21838
21817
  onClick: handleCopy2,
21839
- className: `py-1.5 text-[11px] font-medium rounded-lg transition-all ${copiedAgentPrompt ? "bg-green-500/20 text-green-400 border border-green-500/30" : "bg-studio-accent/15 text-studio-accent border border-studio-accent/25 hover:bg-studio-accent/25"}`,
21818
+ className: `py-1.5 text-[11px] font-medium rounded-lg transition-all ${copiedAgentPrompt ? "bg-accent/15 text-accent-ink border border-accent/30" : "bg-studio-accent/15 text-accent-ink border border-studio-accent/25 hover:bg-studio-accent/25"}`,
21840
21819
  children: [
21841
21820
  copiedAgentPrompt ? "Copied!" : "Copy to Agent",
21842
- !copiedAgentPrompt && /* @__PURE__ */ jsx56("span", { className: "text-[9px] text-studio-accent/50 ml-1.5", children: "Cmd+Enter" })
21821
+ !copiedAgentPrompt && /* @__PURE__ */ jsx56("span", { className: "text-[9px] text-text-muted ml-1.5", children: "Cmd+Enter" })
21843
21822
  ]
21844
21823
  }
21845
21824
  )
@@ -21893,7 +21872,7 @@ function useMenuKeyboardNav(menuRef) {
21893
21872
  // src/player/components/KeyframeDiamondContextMenu.tsx
21894
21873
  import { jsx as jsx57, jsxs as jsxs37 } from "react/jsx-runtime";
21895
21874
  var ITEM_CLS = "w-full flex items-center gap-2 px-3 py-1.5 text-xs text-neutral-200 hover:bg-neutral-800 focus-visible:bg-neutral-800 outline-hidden cursor-pointer text-left";
21896
- var DESTRUCTIVE_ITEM_CLS = "w-full flex items-center gap-2 px-3 py-1.5 text-xs text-red-400 hover:bg-neutral-800 focus-visible:bg-neutral-800 outline-hidden cursor-pointer text-left";
21875
+ var DESTRUCTIVE_ITEM_CLS = "w-full flex items-center gap-2 px-3 py-1.5 text-xs text-danger-ink hover:bg-neutral-800 focus-visible:bg-neutral-800 outline-hidden cursor-pointer text-left";
21897
21876
  function KeyframeDiamondContextMenu({
21898
21877
  state,
21899
21878
  onClose,
@@ -22000,7 +21979,7 @@ function KeyframeDiamondContextMenu({
22000
21979
  {
22001
21980
  type: "button",
22002
21981
  role: "menuitem",
22003
- className: "w-full flex items-center gap-2 px-3 py-1.5 text-xs text-red-400 hover:bg-red-950/40 focus-visible:bg-red-950/40 outline-hidden cursor-pointer text-left",
21982
+ className: "w-full flex items-center gap-2 px-3 py-1.5 text-xs text-danger-ink hover:bg-danger/25 focus-visible:bg-danger/25 outline-hidden cursor-pointer text-left",
22004
21983
  onClick: () => {
22005
21984
  onDeleteAll(state.element, state.animationId);
22006
21985
  onClose();
@@ -22172,7 +22151,7 @@ var ClipContextMenu = memo14(function ClipContextMenu2({
22172
22151
  {
22173
22152
  type: "button",
22174
22153
  role: "menuitem",
22175
- className: "w-full flex items-center justify-between px-3 py-1.5 text-xs text-red-400 hover:bg-neutral-800 focus-visible:bg-neutral-800 outline-hidden cursor-pointer text-left",
22154
+ className: "w-full flex items-center justify-between px-3 py-1.5 text-xs text-danger-ink hover:bg-neutral-800 focus-visible:bg-neutral-800 outline-hidden cursor-pointer text-left",
22176
22155
  onClick: () => {
22177
22156
  onDelete(element);
22178
22157
  onClose();
@@ -22537,7 +22516,7 @@ function TimelineEmptyState({
22537
22516
  strokeWidth: "1.5",
22538
22517
  strokeLinecap: "round",
22539
22518
  strokeLinejoin: "round",
22540
- className: "text-studio-accent shrink-0",
22519
+ className: "text-accent-ink shrink-0",
22541
22520
  children: [
22542
22521
  /* @__PURE__ */ jsx62("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }),
22543
22522
  /* @__PURE__ */ jsx62("polyline", { points: "7 10 12 15 17 10" }),
@@ -22545,7 +22524,7 @@ function TimelineEmptyState({
22545
22524
  ]
22546
22525
  }
22547
22526
  ),
22548
- /* @__PURE__ */ jsx62("span", { className: "text-[13px] text-studio-accent", children: "Drop media files to import" })
22527
+ /* @__PURE__ */ jsx62("span", { className: "text-[13px] text-accent-ink", children: "Drop media files to import" })
22549
22528
  ] }) : /* @__PURE__ */ jsxs42(Fragment20, { children: [
22550
22529
  /* @__PURE__ */ jsxs42(
22551
22530
  "svg",
@@ -22782,10 +22761,7 @@ var ThumbnailScheduler = class {
22782
22761
  this.scrolling = scrolling;
22783
22762
  if (!scrolling) this.pump();
22784
22763
  }
22785
- /**
22786
- * Hold server-rendered composition thumbnails while the preview loads a new document: both
22787
- * are served by the same Studio server, and the preview is what the person is waiting for.
22788
- */
22764
+ /** Holds composition renders while the preview loads: same server, and the preview is what the person awaits. */
22789
22765
  setPreviewReloading(reloading) {
22790
22766
  if (this.previewReloading === reloading) return;
22791
22767
  this.previewReloading = reloading;
@@ -22909,7 +22885,7 @@ var ThumbnailScheduler = class {
22909
22885
  cacheResult(entry2) {
22910
22886
  const isWaveform = entry2.request.kind === "waveform";
22911
22887
  const byteBudget = isWaveform ? this.budgets.waveformCacheBytes : this.budgets.thumbnailCacheBytes;
22912
- entry2.cached = entry2.weight <= byteBudget;
22888
+ entry2.cached = !entry2.request.discardWhenReleased && entry2.weight <= byteBudget;
22913
22889
  if (!entry2.cached) return;
22914
22890
  if (isWaveform) this.waveformCacheBytes += entry2.weight;
22915
22891
  else this.cacheBytes += entry2.weight;
@@ -23468,6 +23444,17 @@ function compositionPathOfPreviewUrl(previewUrl) {
23468
23444
  const match = /\/preview\/comp\/([^?#]+)/.exec(previewUrl);
23469
23445
  return match?.[1] ? decodeURIComponent(match[1]) : "index.html";
23470
23446
  }
23447
+ function compositionThumbnailRequest(url, projectId, { sessionEpoch = 0, priority = "visible", rich = false } = {}) {
23448
+ return {
23449
+ key: createThumbnailKey({ kind: "composition", url }),
23450
+ projectId,
23451
+ sessionEpoch,
23452
+ kind: "composition",
23453
+ priority,
23454
+ rich,
23455
+ load: (signal) => loadCompositionImage(url, signal)
23456
+ };
23457
+ }
23471
23458
  async function loadCompositionImage(url, signal) {
23472
23459
  const response = await fetch(url, { signal });
23473
23460
  if (!response.ok) throw new Error(`Composition thumbnail failed (${response.status})`);
@@ -23510,15 +23497,7 @@ var CompositionThumbnail = memo18(function CompositionThumbnail2({
23510
23497
  contentRevision
23511
23498
  });
23512
23499
  const request = useMemo34(
23513
- () => ({
23514
- key: createThumbnailKey({ kind: "composition", url }),
23515
- projectId,
23516
- sessionEpoch,
23517
- kind: "composition",
23518
- priority,
23519
- rich: true,
23520
- load: (signal) => loadCompositionImage(url, signal)
23521
- }),
23500
+ () => compositionThumbnailRequest(url, projectId, { sessionEpoch, priority, rich: true }),
23522
23501
  [priority, projectId, sessionEpoch, url]
23523
23502
  );
23524
23503
  const snapshot3 = useThumbnailLease(request);
@@ -23558,7 +23537,7 @@ var CompositionThumbnail = memo18(function CompositionThumbnail2({
23558
23537
  ))
23559
23538
  }
23560
23539
  ),
23561
- snapshot3.status === "loading" && /* @__PURE__ */ jsx66("div", { className: "absolute inset-0 animate-pulse bg-white/[0.035]" }),
23540
+ snapshot3.status === "loading" && /* @__PURE__ */ jsx66("div", { className: "absolute inset-0 animate-pulse bg-text-0/[0.035]" }),
23562
23541
  label && /* @__PURE__ */ jsx66("div", { className: "absolute inset-y-0 left-3 z-10 flex items-center", children: /* @__PURE__ */ jsx66(
23563
23542
  "span",
23564
23543
  {
@@ -27115,7 +27094,7 @@ function PreviewZoomOverlay({
27115
27094
  "button",
27116
27095
  {
27117
27096
  type: "button",
27118
- className: "rounded px-1.5 py-0.5 font-medium text-studio-accent hover:bg-white/10 transition-colors",
27097
+ className: "rounded px-1.5 py-0.5 font-medium text-accent-ink hover:bg-white/10 transition-colors",
27119
27098
  onClick: onFit,
27120
27099
  "aria-label": "Fit the whole frame in view",
27121
27100
  "data-testid": "preview-zoom-fit",
@@ -27233,8 +27212,7 @@ function usePreviewPoster(projectId, activeKey, directUrl) {
27233
27212
  const renderMissingPoster = useCallback46(() => {
27234
27213
  if (missingForRef.current !== visit || liveReadyForRef.current !== visit) return;
27235
27214
  missingForRef.current = null;
27236
- void fetch(previewPosterUrl(projectId, false)).catch(() => {
27237
- });
27215
+ renderPosterForNextOpen(projectId);
27238
27216
  }, [visit, projectId]);
27239
27217
  const onLiveReadyToShowChange = useCallback46(
27240
27218
  (ready) => {
@@ -27259,6 +27237,27 @@ function usePreviewPoster(projectId, activeKey, directUrl) {
27259
27237
  }
27260
27238
  };
27261
27239
  }
27240
+ function renderPosterForNextOpen(projectId) {
27241
+ const url = previewPosterUrl(projectId, false);
27242
+ const request = {
27243
+ key: createThumbnailKey({ kind: "poster-render", url }),
27244
+ projectId,
27245
+ sessionEpoch: 0,
27246
+ kind: "composition",
27247
+ priority: "overscan",
27248
+ discardWhenReleased: true,
27249
+ load: async (signal) => {
27250
+ await (await fetch(url, { signal })).arrayBuffer();
27251
+ return { value: { kind: "image", url, aspect: 16 / 9 }, weight: 0 };
27252
+ }
27253
+ };
27254
+ const settled = () => ["ready", "error"].includes(thumbnailScheduler.getSnapshot(request).status);
27255
+ let lease = null;
27256
+ lease = thumbnailScheduler.acquire(request, () => {
27257
+ if (settled()) lease?.release();
27258
+ });
27259
+ if (settled()) lease.release();
27260
+ }
27262
27261
  function useVisitNumber(key2) {
27263
27262
  const [seen, setSeen] = useState30({ key: key2, visit: 0 });
27264
27263
  if (seen.key === key2) return seen.visit;
@@ -28019,7 +28018,7 @@ function AssetPreviewOverlay() {
28019
28018
  /* @__PURE__ */ jsx73(
28020
28019
  "button",
28021
28020
  {
28022
- className: "absolute top-2 right-2 w-6 h-6 rounded-full bg-neutral-800 hover:bg-neutral-700 text-neutral-300 hover:text-white flex items-center justify-center transition-colors z-10",
28021
+ className: "absolute top-2 right-2 w-6 h-6 rounded-full bg-raised hover:bg-press text-text-2 hover:text-text-0 flex items-center justify-center transition-colors z-10",
28023
28022
  onClick: (e) => {
28024
28023
  e.stopPropagation();
28025
28024
  clearPreviewAsset();
@@ -28480,7 +28479,7 @@ function PreviewPane({
28480
28479
  "div",
28481
28480
  {
28482
28481
  ref: containerRef,
28483
- className: `flex-1 min-h-0 flex flex-col overflow-hidden bg-[var(--studio-preview-bg,var(--color-neutral-950))] ${isFullscreen ? "" : "m-3 rounded-md border border-neutral-800/50"}`,
28482
+ className: `scheme-dark flex-1 min-h-0 flex flex-col overflow-hidden bg-[var(--studio-preview-bg,var(--color-neutral-950))] ${isFullscreen ? "" : "m-3 rounded-md border border-border"}`,
28484
28483
  "data-studio-fullscreen-target": "",
28485
28484
  children: [
28486
28485
  /* @__PURE__ */ jsxs51(
@@ -28736,7 +28735,7 @@ function useMeterLoop(strips, bars, iframeRef) {
28736
28735
  }, [previewIframeRef, bars]);
28737
28736
  }
28738
28737
  function Bar({ maskRef, peakRef }) {
28739
- return /* @__PURE__ */ jsxs52("div", { className: "relative h-full w-[18px] overflow-hidden rounded-[2px] bg-neutral-900", children: [
28738
+ return /* @__PURE__ */ jsxs52("div", { className: "scheme-dark relative h-full w-[18px] overflow-hidden rounded-[2px] bg-neutral-900", children: [
28740
28739
  /* @__PURE__ */ jsx77(
28741
28740
  "div",
28742
28741
  {
@@ -28772,7 +28771,7 @@ function Bar({ maskRef, peakRef }) {
28772
28771
  {
28773
28772
  ref: peakRef,
28774
28773
  "data-testid": "meter-peak",
28775
- className: "absolute inset-x-0 bottom-0 h-px bg-white"
28774
+ className: "absolute inset-x-0 bottom-0 h-px bg-text-0"
28776
28775
  }
28777
28776
  )
28778
28777
  ] });
@@ -32114,7 +32113,7 @@ function restoreOriginalTranslateProperty(element) {
32114
32113
  element.removeAttribute(STUDIO_ORIGINAL_TRANSLATE_ATTR);
32115
32114
  }
32116
32115
  function clearStudioPathOffset(element) {
32117
- if (element.hasAttribute(STUDIO_PATH_OFFSET_ATTR) || styleUsesStudioOffset(element.style.getPropertyValue("translate"))) {
32116
+ if (element.hasAttribute(STUDIO_PATH_OFFSET_ATTR) || element.hasAttribute(STUDIO_ORIGINAL_INLINE_TRANSLATE_ATTR) || styleUsesStudioOffset(element.style.getPropertyValue("translate"))) {
32118
32117
  restoreOriginalTranslateProperty(element);
32119
32118
  }
32120
32119
  restoreInlineDisplay(element);
@@ -32444,25 +32443,6 @@ function appendTransformDisplayOps(element, ops) {
32444
32443
  ops.push({ type: "attribute", property: STUDIO_ORIGINAL_TRANSFORM_DISPLAY_ATTR, value: null });
32445
32444
  }
32446
32445
  }
32447
- function buildPathOffsetPatches(element) {
32448
- const ops = [];
32449
- collectInlineStyleOps(element, [STUDIO_OFFSET_X_PROP, STUDIO_OFFSET_Y_PROP], ops);
32450
- const inlineTranslate = element.style.getPropertyValue("translate");
32451
- const hasOffsetVars = element.style.getPropertyValue(STUDIO_OFFSET_X_PROP) || element.style.getPropertyValue(STUDIO_OFFSET_Y_PROP);
32452
- const translateValue = inlineTranslate && inlineTranslate !== "none" ? inlineTranslate : hasOffsetVars ? `var(${STUDIO_OFFSET_X_PROP}, 0px) var(${STUDIO_OFFSET_Y_PROP}, 0px)` : null;
32453
- if (translateValue) {
32454
- ops.push({ type: "inline-style", property: "translate", value: translateValue });
32455
- }
32456
- ops.push({ type: "attribute", property: STUDIO_PATH_OFFSET_ATTR, value: "true" });
32457
- collectAttributeOps(
32458
- element,
32459
- [STUDIO_ORIGINAL_TRANSLATE_ATTR, STUDIO_ORIGINAL_INLINE_TRANSLATE_ATTR],
32460
- ops
32461
- );
32462
- collectInlineStyleOps(element, ["display"], ops);
32463
- collectAttributeOps(element, [STUDIO_ORIGINAL_TRANSFORM_DISPLAY_ATTR], ops);
32464
- return ops;
32465
- }
32466
32446
  function buildClearPathOffsetPatches(element) {
32467
32447
  const originalInlineTranslate = element.getAttribute(STUDIO_ORIGINAL_INLINE_TRANSLATE_ATTR);
32468
32448
  const ops = [
@@ -32931,10 +32911,32 @@ var UNREADABLE_TRANSLATE = "Studio can't read this layer's translate. Move it in
32931
32911
  function formatTranslatePx(p) {
32932
32912
  return `${roundTo3(p.x)}px ${roundTo3(p.y)}px`;
32933
32913
  }
32934
- function translatePatch(p) {
32935
- return { type: "inline-style", property: "translate", value: formatTranslatePx(p) };
32914
+ var LEGACY_OFFSET_VARS = [STUDIO_OFFSET_X_PROP, STUDIO_OFFSET_Y_PROP];
32915
+ function writePlainMove(el, p) {
32916
+ writeTranslatePx(el, p);
32917
+ const patches = [
32918
+ { type: "inline-style", property: "translate", value: formatTranslatePx(p) },
32919
+ {
32920
+ type: "attribute",
32921
+ property: STUDIO_ORIGINAL_INLINE_TRANSLATE_ATTR,
32922
+ value: el.getAttribute(STUDIO_ORIGINAL_INLINE_TRANSLATE_ATTR)
32923
+ }
32924
+ ];
32925
+ for (const prop of LEGACY_OFFSET_VARS.filter((v) => el.style.getPropertyValue(v))) {
32926
+ el.style.removeProperty(prop);
32927
+ patches.push({ type: "inline-style", property: prop, value: null });
32928
+ }
32929
+ if (el.hasAttribute(STUDIO_PATH_OFFSET_ATTR)) {
32930
+ el.removeAttribute(STUDIO_PATH_OFFSET_ATTR);
32931
+ patches.push({ type: "attribute", property: STUDIO_PATH_OFFSET_ATTR, value: null });
32932
+ }
32933
+ return patches;
32936
32934
  }
32937
32935
  function writeTranslatePx(el, p) {
32936
+ if (!el.hasAttribute(STUDIO_ORIGINAL_INLINE_TRANSLATE_ATTR)) {
32937
+ const own = el.style.getPropertyValue("translate");
32938
+ el.setAttribute(STUDIO_ORIGINAL_INLINE_TRANSLATE_ATTR, styleUsesStudioOffset(own) ? "" : own);
32939
+ }
32938
32940
  el.style.setProperty("translate", formatTranslatePx(p));
32939
32941
  }
32940
32942
  function readMoveOffset(el, plainTranslate = !gsapWritesPosition(el)) {
@@ -35371,7 +35373,7 @@ function DomEditRotateHandle({
35371
35373
  title: "Rotate",
35372
35374
  "aria-label": "Rotate selection",
35373
35375
  onPointerDown: onStartRotate,
35374
- children: /* @__PURE__ */ jsx85("span", { className: "pointer-events-none flex h-[18px] w-[18px] items-center justify-center rounded-full border border-studio-accent/70 bg-studio-surface text-studio-accent shadow-[0_0_3px_rgba(0,0,0,0.45)]", children: /* @__PURE__ */ jsxs58(
35376
+ children: /* @__PURE__ */ jsx85("span", { className: "pointer-events-none flex h-[18px] w-[18px] items-center justify-center rounded-full border border-studio-accent/70 bg-studio-surface text-accent-ink shadow-[0_0_3px_rgba(0,0,0,0.45)]", children: /* @__PURE__ */ jsxs58(
35375
35377
  "svg",
35376
35378
  {
35377
35379
  width: "11",
@@ -35767,7 +35769,7 @@ var CanvasContextMenu = memo24(function CanvasContextMenu2({
35767
35769
  "button",
35768
35770
  {
35769
35771
  type: "button",
35770
- className: "w-full flex items-center justify-between px-3 py-1.5 text-xs text-red-400 hover:bg-neutral-800 cursor-pointer text-left",
35772
+ className: "w-full flex items-center justify-between px-3 py-1.5 text-xs text-danger-ink hover:bg-neutral-800 cursor-pointer text-left",
35771
35773
  onPointerDown: (e) => {
35772
35774
  if (e.button !== 0) return;
35773
35775
  e.preventDefault();
@@ -36324,7 +36326,7 @@ function InlineTextToolbar({
36324
36326
  "data-inline-text-toolbar": "true",
36325
36327
  role: "toolbar",
36326
36328
  "aria-label": "Text formatting",
36327
- className: "pointer-events-auto fixed z-200 flex items-center gap-1 rounded-lg border border-white/10 bg-[#15171c] p-1 shadow-[0_8px_24px_rgba(0,0,0,0.55)]",
36329
+ className: "pointer-events-auto fixed z-200 flex items-center gap-1 rounded-lg border border-border bg-raised p-1 shadow-[0_8px_24px_rgba(0,0,0,0.55)]",
36328
36330
  style: {
36329
36331
  left: placement.left,
36330
36332
  top: placement.top,
@@ -36337,14 +36339,14 @@ function InlineTextToolbar({
36337
36339
  /* @__PURE__ */ jsxs61(
36338
36340
  "label",
36339
36341
  {
36340
- className: "group relative flex h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-white/10",
36342
+ className: "group relative flex h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-hover",
36341
36343
  title: "Text colour",
36342
36344
  children: [
36343
36345
  /* @__PURE__ */ jsx88(
36344
36346
  "span",
36345
36347
  {
36346
36348
  "aria-hidden": "true",
36347
- className: "h-4 w-4 rounded-full border-2 border-white/25 transition-transform duration-150 group-hover:scale-110 group-active:scale-95",
36349
+ className: "h-4 w-4 rounded-full border-2 border-border-strong transition-transform duration-150 group-hover:scale-110 group-active:scale-95",
36348
36350
  style: {
36349
36351
  background: swatchBackground(placement.colours, styles.color),
36350
36352
  backgroundOrigin: "border-box"
@@ -36426,7 +36428,7 @@ function ToolbarToggle({
36426
36428
  title: label,
36427
36429
  "aria-label": label,
36428
36430
  "aria-pressed": on,
36429
- className: `flex h-6 w-6 items-center justify-center rounded-md text-xs ${on ? "bg-studio-accent/20 text-studio-accent" : "text-white/70 hover:bg-white/10"}`,
36431
+ className: `flex h-6 w-6 items-center justify-center rounded-md text-xs ${on ? "bg-studio-accent/20 text-accent-ink" : "text-text-2 hover:bg-hover"}`,
36430
36432
  style: {
36431
36433
  fontWeight: bold ? 700 : 400,
36432
36434
  fontStyle: italic ? "italic" : "normal",
@@ -41103,7 +41105,7 @@ function editableAnimationId(animations, kind, sel) {
41103
41105
 
41104
41106
  // src/components/editor/MotionPathNode.tsx
41105
41107
  import { jsx as jsx93, jsxs as jsxs64 } from "react/jsx-runtime";
41106
- var ACCENT2 = "var(--hf-accent, #3CE6AC)";
41108
+ var ACCENT = "var(--hf-accent, #3CE6AC)";
41107
41109
  function MotionPathNode(props) {
41108
41110
  const { cx, cy, r, interactive, removable, grabbing, selected } = props;
41109
41111
  const bx = cx + r * 1.8;
@@ -41123,7 +41125,7 @@ function MotionPathNode(props) {
41123
41125
  stroke: "#0b0f1a",
41124
41126
  strokeWidth: 1.5,
41125
41127
  vectorEffect: "non-scaling-stroke",
41126
- style: { fill: ACCENT2 }
41128
+ style: { fill: ACCENT }
41127
41129
  }
41128
41130
  ),
41129
41131
  interactive && /* @__PURE__ */ jsx93(
@@ -41158,7 +41160,7 @@ function MotionPathNode(props) {
41158
41160
  stroke: "#0b0f1a",
41159
41161
  strokeWidth: 1,
41160
41162
  vectorEffect: "non-scaling-stroke",
41161
- style: { fill: ACCENT2 }
41163
+ style: { fill: ACCENT }
41162
41164
  }
41163
41165
  ),
41164
41166
  /* @__PURE__ */ jsx93(
@@ -41484,7 +41486,7 @@ var MotionPathOverlay = memo26(function MotionPathOverlay2({
41484
41486
  strokeWidth: 1.5,
41485
41487
  strokeDasharray: "3 3",
41486
41488
  vectorEffect: "non-scaling-stroke",
41487
- style: { stroke: ACCENT2 },
41489
+ style: { stroke: ACCENT },
41488
41490
  opacity: 0.85
41489
41491
  }
41490
41492
  )
@@ -41680,7 +41682,7 @@ var MotionPathOverlay = memo26(function MotionPathOverlay2({
41680
41682
  {
41681
41683
  points,
41682
41684
  fill: "none",
41683
- style: { stroke: ACCENT2 },
41685
+ style: { stroke: ACCENT },
41684
41686
  strokeWidth: 1.5,
41685
41687
  strokeDasharray: "5 5",
41686
41688
  strokeLinejoin: "round",
@@ -41703,7 +41705,7 @@ var MotionPathOverlay = memo26(function MotionPathOverlay2({
41703
41705
  strokeDasharray: "2 2",
41704
41706
  vectorEffect: "non-scaling-stroke",
41705
41707
  className: "pointer-events-none",
41706
- style: { stroke: ACCENT2 }
41708
+ style: { stroke: ACCENT }
41707
41709
  }
41708
41710
  ),
41709
41711
  abs.map((p, i) => /* @__PURE__ */ jsx94(
@@ -41806,7 +41808,7 @@ var SnapToolbar = memo27(function SnapToolbar2() {
41806
41808
  "button",
41807
41809
  {
41808
41810
  type: "button",
41809
- className: `rounded-md p-1.5 transition-colors active:scale-[0.95] ${motionPathArmed ? "bg-studio-accent/20 text-studio-accent" : "bg-black/40 text-white/60 hover:bg-black/60 hover:text-white/80"}`,
41811
+ className: `rounded-md p-1.5 transition-colors active:scale-[0.95] ${motionPathArmed ? "bg-studio-accent/20 text-accent-ink" : "bg-black/40 text-white/60 hover:bg-black/60 hover:text-white/80"}`,
41810
41812
  onClick: () => setMotionPathArmed(!motionPathArmed),
41811
41813
  title: motionPathArmed ? "Click the canvas to set the destination" : "Set motion destination",
41812
41814
  "aria-label": "Set motion destination",
@@ -41823,7 +41825,7 @@ var SnapToolbar = memo27(function SnapToolbar2() {
41823
41825
  "button",
41824
41826
  {
41825
41827
  type: "button",
41826
- className: `rounded-md p-1.5 transition-colors active:scale-[0.95] ${visible ? "bg-studio-accent/20 text-studio-accent" : "bg-black/40 text-white/60 hover:bg-black/60 hover:text-white/80"}`,
41828
+ className: `rounded-md p-1.5 transition-colors active:scale-[0.95] ${visible ? "bg-studio-accent/20 text-accent-ink" : "bg-black/40 text-white/60 hover:bg-black/60 hover:text-white/80"}`,
41827
41829
  onClick: toggle,
41828
41830
  title: `${label} ${visible ? "on" : "off"}`,
41829
41831
  "aria-label": `Toggle ${label.toLowerCase()}`,
@@ -41837,7 +41839,7 @@ var SnapToolbar = memo27(function SnapToolbar2() {
41837
41839
  "button",
41838
41840
  {
41839
41841
  type: "button",
41840
- className: `rounded-md p-1.5 transition-colors active:scale-[0.95] ${prefs.snapEnabled ? "bg-studio-accent/20 text-studio-accent" : "bg-black/40 text-white/60 hover:bg-black/60 hover:text-white/80"}`,
41842
+ className: `rounded-md p-1.5 transition-colors active:scale-[0.95] ${prefs.snapEnabled ? "bg-studio-accent/20 text-accent-ink" : "bg-black/40 text-white/60 hover:bg-black/60 hover:text-white/80"}`,
41841
41843
  onClick: toggleSnap,
41842
41844
  title: prefs.snapEnabled ? "Snap enabled (S)" : "Snap disabled (S)",
41843
41845
  "aria-label": "Toggle snap",
@@ -41850,7 +41852,7 @@ var SnapToolbar = memo27(function SnapToolbar2() {
41850
41852
  {
41851
41853
  ref: gridButtonRef,
41852
41854
  type: "button",
41853
- className: `rounded-md p-1.5 transition-colors active:scale-[0.95] ${prefs.gridVisible ? "bg-studio-accent/20 text-studio-accent" : "bg-black/40 text-white/60 hover:bg-black/60 hover:text-white/80"}`,
41855
+ className: `rounded-md p-1.5 transition-colors active:scale-[0.95] ${prefs.gridVisible ? "bg-studio-accent/20 text-accent-ink" : "bg-black/40 text-white/60 hover:bg-black/60 hover:text-white/80"}`,
41854
41856
  onClick: toggleGrid,
41855
41857
  onContextMenu: (e) => {
41856
41858
  e.preventDefault();
@@ -41877,7 +41879,7 @@ var SnapToolbar = memo27(function SnapToolbar2() {
41877
41879
  "div",
41878
41880
  {
41879
41881
  ref: popoverRef,
41880
- className: "absolute right-0 top-full mt-1 rounded-lg bg-neutral-800 border border-neutral-700 p-3 shadow-xl min-w-[180px]",
41882
+ className: "absolute right-0 top-full mt-1 rounded-lg bg-raised border border-border p-3 shadow-xl min-w-[180px]",
41881
41883
  children: [
41882
41884
  /* @__PURE__ */ jsxs66("label", { className: "flex items-center justify-between text-xs text-white/80 mb-2", children: [
41883
41885
  /* @__PURE__ */ jsx95("span", { children: "Grid spacing" }),
@@ -42137,7 +42139,7 @@ function PreviewOverlays({
42137
42139
  {
42138
42140
  type: "button",
42139
42141
  onClick: enterCaptionMode,
42140
- className: "pointer-events-auto absolute top-2 left-1/2 -translate-x-1/2 z-60 rounded-full border border-neutral-700 bg-black/60 px-2.5 py-1 text-2xs text-neutral-300 transition-colors hover:border-studio-accent/50 hover:text-studio-accent focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-studio-accent",
42142
+ className: "pointer-events-auto absolute top-2 left-1/2 -translate-x-1/2 z-60 rounded-full border border-neutral-700 bg-black/60 px-2.5 py-1 text-2xs text-neutral-300 transition-colors hover:border-studio-accent/50 hover:text-accent-ink focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-studio-accent",
42141
42143
  children: "Edit captions"
42142
42144
  }
42143
42145
  )
@@ -43771,7 +43773,7 @@ var CaptionTimeline = memo29(function CaptionTimeline2({
43771
43773
  tabIndex: 0,
43772
43774
  "aria-label": `Caption word "${seg.text}"`,
43773
43775
  "aria-pressed": isSelected,
43774
- className: `absolute top-1 bottom-1 rounded flex items-center overflow-hidden cursor-pointer focus-visible:ring-1 focus-visible:ring-white outline-hidden${isSelected ? " ring-1 ring-white/50 z-10" : ""}`,
43776
+ className: `absolute top-1 bottom-1 rounded flex items-center overflow-hidden cursor-pointer focus-visible:ring-1 focus-visible:ring-text-0 outline-hidden${isSelected ? " ring-1 ring-text-0/50 z-10" : ""}`,
43775
43777
  style: {
43776
43778
  left,
43777
43779
  width,
@@ -43796,7 +43798,7 @@ var CaptionTimeline = memo29(function CaptionTimeline2({
43796
43798
  /* @__PURE__ */ jsx98(
43797
43799
  "div",
43798
43800
  {
43799
- className: "absolute top-0 bottom-0 w-px bg-white/70 pointer-events-none z-20",
43801
+ className: "absolute top-0 bottom-0 w-px bg-text-0/70 pointer-events-none z-20",
43800
43802
  style: { left: playheadLeft },
43801
43803
  "aria-hidden": "true"
43802
43804
  }
@@ -46035,7 +46037,7 @@ function WindowMenu() {
46035
46037
  onClick: () => togglePanel(id),
46036
46038
  className: "flex w-full items-center gap-2 px-3 py-1.5 text-left text-[11px] text-neutral-300 hover:bg-neutral-800",
46037
46039
  children: [
46038
- /* @__PURE__ */ jsx101("span", { className: "w-3 text-panel-accent", children: openPanels.has(id) ? "\u2713" : "" }),
46040
+ /* @__PURE__ */ jsx101("span", { className: "w-3 text-accent-ink", children: openPanels.has(id) ? "\u2713" : "" }),
46039
46041
  PANEL_DEFINITIONS[id].title
46040
46042
  ]
46041
46043
  },
@@ -47103,7 +47105,7 @@ function InspectorHeaderActions({
47103
47105
  track2("button", "Copy element info");
47104
47106
  onCopy();
47105
47107
  },
47106
- className: `flex h-6 w-6 items-center justify-center rounded transition-colors ${copied ? "text-studio-accent" : "text-neutral-500 hover:bg-neutral-800 hover:text-neutral-300"}`,
47108
+ className: `flex h-6 w-6 items-center justify-center rounded transition-colors ${copied ? "text-accent-ink" : "text-neutral-500 hover:bg-neutral-800 hover:text-neutral-300"}`,
47107
47109
  title: copied ? "Copied!" : "Copy element info to clipboard",
47108
47110
  children: /* @__PURE__ */ jsxs75(
47109
47111
  "svg",
@@ -48138,7 +48140,7 @@ function SegmentedControl({
48138
48140
  onChange(option.value);
48139
48141
  },
48140
48142
  "aria-pressed": option.value === value,
48141
- className: `min-w-0 truncate rounded px-2 py-[5px] text-[11px] font-medium transition-colors disabled:cursor-not-allowed ${option.value === value ? "bg-panel-hover text-white" : "text-panel-text-4 hover:text-panel-text-2"}`,
48143
+ className: `min-w-0 truncate rounded px-2 py-[5px] text-[11px] font-medium transition-colors disabled:cursor-not-allowed ${option.value === value ? "bg-panel-hover text-text-0" : "text-panel-text-4 hover:text-panel-text-2"}`,
48142
48144
  children: option.label
48143
48145
  },
48144
48146
  option.value
@@ -48489,7 +48491,7 @@ function MediaSection({
48489
48491
  /* @__PURE__ */ jsx110("div", { className: "h-1 overflow-hidden rounded-full bg-panel-border", children: /* @__PURE__ */ jsx110(
48490
48492
  "div",
48491
48493
  {
48492
- className: `h-full rounded-full ${removeProgress.status === "failed" ? "bg-red-400" : "bg-studio-accent"}`,
48494
+ className: `h-full rounded-full ${removeProgress.status === "failed" ? "bg-danger-ink" : "bg-studio-accent"}`,
48493
48495
  style: { width: `${Math.max(0, Math.min(100, removeProgress.progress))}%` }
48494
48496
  }
48495
48497
  ) })
@@ -48791,7 +48793,7 @@ function ColorGradingSliderControl({
48791
48793
  event.stopPropagation();
48792
48794
  settings.onClick();
48793
48795
  },
48794
- 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 ${settings.active ? "text-studio-accent" : "text-panel-text-5"}`,
48796
+ 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 ${settings.active ? "text-accent-ink" : "text-panel-text-5"}`,
48795
48797
  title: settings.label,
48796
48798
  children: [
48797
48799
  /* @__PURE__ */ jsx111(Settings, { size: 11 }),
@@ -49256,7 +49258,7 @@ function ColorGradingControls({
49256
49258
  }
49257
49259
  )
49258
49260
  ] }),
49259
- lutImportError && /* @__PURE__ */ jsx112("div", { className: "text-[10px] text-red-400", role: "alert", children: lutImportError }),
49261
+ lutImportError && /* @__PURE__ */ jsx112("div", { className: "text-[10px] text-danger-ink", role: "alert", children: lutImportError }),
49260
49262
  grading.lut && /* @__PURE__ */ jsxs79("div", { className: "grid gap-2", children: [
49261
49263
  selectedProjectLut && /* @__PURE__ */ jsxs79("div", { className: "flex min-w-0 items-start gap-2 text-[10px] leading-4 text-panel-text-3", children: [
49262
49264
  /* @__PURE__ */ jsx112("span", { className: "mt-[5px] h-1.5 w-1.5 shrink-0 rounded-full bg-studio-accent" }),
@@ -50127,7 +50129,7 @@ function useColorGradingController({
50127
50129
  // src/components/editor/propertyPanelColorGradingSection.tsx
50128
50130
  import { jsx as jsx113, jsxs as jsxs80 } from "react/jsx-runtime";
50129
50131
  function StatusPill({ status }) {
50130
- const dotClass = status.state === "active" ? "bg-emerald-400" : status.state === "pending" ? "bg-amber-300" : status.state === "unavailable" ? "bg-red-400" : "bg-panel-text-5";
50132
+ const dotClass = status.state === "active" ? "bg-accent" : status.state === "pending" ? "bg-warning-ink" : status.state === "unavailable" ? "bg-danger-ink" : "bg-panel-text-5";
50131
50133
  return /* @__PURE__ */ jsxs80(
50132
50134
  "div",
50133
50135
  {
@@ -50149,16 +50151,16 @@ function HdrMediaWarning({ metadata }) {
50149
50151
  metadata.color.colorPrimaries,
50150
50152
  metadata.color.colorTransfer
50151
50153
  ].filter(Boolean).join(" \xB7 ");
50152
- return /* @__PURE__ */ jsxs80("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", children: [
50154
+ return /* @__PURE__ */ jsxs80("div", { className: "mb-3 rounded-md border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] leading-4 text-warning-ink", children: [
50153
50155
  /* @__PURE__ */ jsxs80("div", { className: "mb-1 flex min-w-0 items-center justify-between gap-2", children: [
50154
50156
  /* @__PURE__ */ jsxs80("span", { className: "font-semibold", children: [
50155
50157
  metadata.color.label,
50156
50158
  " source"
50157
50159
  ] }),
50158
- /* @__PURE__ */ jsx113("span", { className: "rounded-sm bg-amber-400/20 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-amber-100", children: "SDR preview" })
50160
+ /* @__PURE__ */ jsx113("span", { className: "rounded-sm bg-amber-500/15 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-warning-ink", children: "SDR preview" })
50159
50161
  ] }),
50160
- /* @__PURE__ */ jsx113("p", { className: "text-amber-100/80", children: "These controls use the current SDR shader preview path. Render may stay HDR-tagged, but this is not true HDR color grading yet." }),
50161
- details && /* @__PURE__ */ jsx113("p", { className: "mt-1 truncate text-[10px] text-amber-100/55", children: details })
50162
+ /* @__PURE__ */ jsx113("p", { className: "text-text-2", children: "These controls use the current SDR shader preview path. Render may stay HDR-tagged, but this is not true HDR color grading yet." }),
50163
+ details && /* @__PURE__ */ jsx113("p", { className: "mt-1 truncate text-[10px] text-text-muted", children: details })
50162
50164
  ] });
50163
50165
  }
50164
50166
  function HoldBeforeButton({
@@ -50215,7 +50217,7 @@ function HoldBeforeButton({
50215
50217
  event.preventDefault();
50216
50218
  onHoldChange(false);
50217
50219
  },
50218
- className: `flex h-6 w-6 shrink-0 items-center justify-center rounded transition-colors ${active ? "bg-studio-accent text-black" : "text-panel-text-4 hover:bg-panel-hover hover:text-panel-text-1"} disabled:cursor-not-allowed disabled:opacity-40`,
50220
+ className: `flex h-6 w-6 shrink-0 items-center justify-center rounded transition-colors ${active ? "bg-studio-accent text-on-accent" : "text-panel-text-4 hover:bg-panel-hover hover:text-panel-text-1"} disabled:cursor-not-allowed disabled:opacity-40`,
50219
50221
  title: "Hold to show original",
50220
50222
  children: /* @__PURE__ */ jsx113(Compare, { size: 13 })
50221
50223
  }
@@ -51208,7 +51210,7 @@ function FontFamilyField({
51208
51210
  type: "button",
51209
51211
  disabled: disabled || loadingLocalFonts,
51210
51212
  onClick: loadBrowserLocalFonts,
51211
- className: "rounded-lg border border-neutral-700 bg-neutral-900 px-2.5 text-[10px] font-medium text-neutral-400 transition-colors hover:border-neutral-600 hover:text-neutral-100 disabled:cursor-not-allowed disabled:text-neutral-700",
51213
+ className: "rounded-lg border border-neutral-700 bg-neutral-900 px-2.5 text-[10px] font-medium text-neutral-400 transition-colors hover:border-neutral-600 hover:text-neutral-100 disabled:cursor-not-allowed disabled:text-text-off",
51212
51214
  children: loadingLocalFonts ? "..." : "Local"
51213
51215
  }
51214
51216
  ),
@@ -51218,7 +51220,7 @@ function FontFamilyField({
51218
51220
  type: "button",
51219
51221
  disabled: disabled || importingFonts || !onImportFonts,
51220
51222
  onClick: () => fontInputRef.current?.click(),
51221
- className: "rounded-lg border border-neutral-700 bg-neutral-900 px-2.5 text-[10px] font-medium text-neutral-400 transition-colors hover:border-neutral-600 hover:text-neutral-100 disabled:cursor-not-allowed disabled:text-neutral-700",
51223
+ className: "rounded-lg border border-neutral-700 bg-neutral-900 px-2.5 text-[10px] font-medium text-neutral-400 transition-colors hover:border-neutral-600 hover:text-neutral-100 disabled:cursor-not-allowed disabled:text-text-off",
51222
51224
  children: importingFonts ? "..." : "Import"
51223
51225
  }
51224
51226
  ),
@@ -51636,7 +51638,7 @@ function VariablesBindElement({
51636
51638
  className: `${VARIABLES_INPUT_CLASS} font-mono`
51637
51639
  }
51638
51640
  ),
51639
- existingDecl && /* @__PURE__ */ jsxs84("p", { className: "text-[9px] leading-snug text-amber-400/90", children: [
51641
+ existingDecl && /* @__PURE__ */ jsxs84("p", { className: "text-[9px] leading-snug text-warning-ink", children: [
51640
51642
  '"',
51641
51643
  trimmedId,
51642
51644
  '" already exists. This element will use its current value',
@@ -51827,7 +51829,7 @@ function PromotableControl({
51827
51829
  bound && /* @__PURE__ */ jsxs85(
51828
51830
  "span",
51829
51831
  {
51830
- className: "pointer-events-none absolute -top-2 right-1.5 z-10 inline-flex max-w-[60%] items-center gap-1 truncate rounded-sm bg-studio-accent/20 px-1 py-px font-mono text-[8px] font-medium text-studio-accent",
51832
+ className: "pointer-events-none absolute -top-2 right-1.5 z-10 inline-flex max-w-[60%] items-center gap-1 truncate rounded-sm bg-studio-accent/20 px-1 py-px font-mono text-[8px] font-medium text-accent-ink",
51831
51833
  title: `Bound to variable "${promote.boundId}"`,
51832
51834
  children: [
51833
51835
  "\u25C6 ",
@@ -51844,7 +51846,7 @@ function PromotableControl({
51844
51846
  e.stopPropagation();
51845
51847
  promote.promote();
51846
51848
  },
51847
- className: "absolute -top-2 right-1.5 z-10 inline-flex items-center gap-1 rounded-sm bg-neutral-800/80 px-1 py-px font-mono text-[8px] font-medium text-neutral-400 opacity-70 transition-colors hover:bg-studio-accent/20 hover:text-studio-accent hover:opacity-100",
51849
+ className: "absolute -top-2 right-1.5 z-10 inline-flex items-center gap-1 rounded-sm bg-raised/80 px-1 py-px font-mono text-[8px] font-medium text-neutral-400 opacity-70 transition-colors hover:bg-studio-accent/20 hover:text-accent-ink hover:opacity-100",
51848
51850
  children: "\u25C7 var"
51849
51851
  }
51850
51852
  )
@@ -52304,7 +52306,7 @@ function ImageFillField({
52304
52306
  type: "button",
52305
52307
  disabled: disabled || uploading,
52306
52308
  onClick: () => fileInputRef.current?.click(),
52307
- 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 ${disabled || uploading ? "cursor-not-allowed text-neutral-600" : "cursor-pointer hover:border-neutral-600 hover:text-white"}`,
52309
+ 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 ${disabled || uploading ? "cursor-not-allowed text-neutral-600" : "cursor-pointer hover:border-neutral-600 hover:text-text-0"}`,
52308
52310
  children: [
52309
52311
  /* @__PURE__ */ jsx121(Plus, { size: 12, className: "shrink-0" }),
52310
52312
  /* @__PURE__ */ jsx121("span", { className: "truncate", children: uploading ? "Uploading\u2026" : "Upload image" })
@@ -52327,7 +52329,7 @@ function ImageFillField({
52327
52329
  }
52328
52330
  )
52329
52331
  ] }),
52330
- uploadError && /* @__PURE__ */ jsx121("div", { className: "text-[10px] text-red-400", role: "alert", children: uploadError }),
52332
+ uploadError && /* @__PURE__ */ jsx121("div", { className: "text-[10px] text-danger-ink", role: "alert", children: uploadError }),
52331
52333
  imageAssets.length > 0 ? /* @__PURE__ */ jsxs87("div", { className: "space-y-3", children: [
52332
52334
  selectedAsset && /* @__PURE__ */ jsx121("div", { className: "overflow-hidden rounded-xl border border-neutral-800 bg-neutral-900/80", children: /* @__PURE__ */ jsx121(
52333
52335
  "img",
@@ -52491,7 +52493,7 @@ function GradientField({
52491
52493
  track2("toggle", "Repeat gradient");
52492
52494
  patch({ repeating: e.target.checked });
52493
52495
  },
52494
- className: "h-4 w-4 rounded-sm border-neutral-700 bg-neutral-950 text-panel-accent focus:ring-panel-accent"
52496
+ className: "h-4 w-4 rounded-sm border-neutral-700 bg-neutral-950 text-accent-ink focus:ring-panel-accent"
52495
52497
  }
52496
52498
  ),
52497
52499
  "Repeat"
@@ -52511,7 +52513,7 @@ function GradientField({
52511
52513
  }))
52512
52514
  });
52513
52515
  },
52514
- className: "inline-flex h-7 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 disabled:cursor-not-allowed disabled:text-neutral-600",
52516
+ className: "inline-flex h-7 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-text-0 disabled:cursor-not-allowed disabled:text-neutral-600",
52515
52517
  children: [
52516
52518
  /* @__PURE__ */ jsx121(ReverseGradientIcon, { size: 16 }),
52517
52519
  "Reverse"
@@ -52605,7 +52607,7 @@ function GradientField({
52605
52607
  disabled: disabled || parsed.stops.length >= 6,
52606
52608
  onClick: () => addStop(),
52607
52609
  title: parsed.stops.length >= 6 ? "Maximum 6 stops" : "Add a gradient stop",
52608
- className: "inline-flex h-7 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 active:scale-[0.98] disabled:cursor-not-allowed disabled:text-neutral-600",
52610
+ className: "inline-flex h-7 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-text-0 active:scale-[0.98] disabled:cursor-not-allowed disabled:text-neutral-600",
52609
52611
  children: [
52610
52612
  /* @__PURE__ */ jsx121(Plus, { size: 12 }),
52611
52613
  "Add stop"
@@ -52644,7 +52646,7 @@ function GradientField({
52644
52646
  type: "button",
52645
52647
  disabled: disabled || parsed.stops.length <= 2,
52646
52648
  onClick: () => removeStop(index),
52647
- className: "mt-[22px] flex h-10 items-center justify-center rounded-lg border border-neutral-700 bg-neutral-950 text-neutral-400 transition-colors hover:border-neutral-600 hover:text-white disabled:cursor-not-allowed disabled:text-neutral-700",
52649
+ className: "mt-[22px] flex h-10 items-center justify-center rounded-lg border border-neutral-700 bg-neutral-950 text-neutral-400 transition-colors hover:border-neutral-600 hover:text-text-0 disabled:cursor-not-allowed disabled:text-text-off",
52648
52650
  "aria-label": `Remove stop ${index + 1}`,
52649
52651
  children: /* @__PURE__ */ jsx121(X, { size: 12 })
52650
52652
  }
@@ -52703,6 +52705,7 @@ function BorderRadiusEditor({
52703
52705
  setLinked((l) => !l);
52704
52706
  }, [linked, uniform, tl, onCommit]);
52705
52707
  const path = buildRoundedRectPath(PREVIEW_W, PREVIEW_H, sTL, sTR, sBR, sBL);
52708
+ const dotFill = linked ? "fill-[light-dark(oklch(0.5_0.2_260),#3b82f6)]" : "fill-[light-dark(oklch(0.55_0.2_294),#a78bfa)]";
52706
52709
  return /* @__PURE__ */ jsxs88("div", { className: "space-y-3", children: [
52707
52710
  /* @__PURE__ */ jsxs88("div", { className: "flex items-center gap-3", children: [
52708
52711
  /* @__PURE__ */ jsxs88(
@@ -52713,27 +52716,11 @@ function BorderRadiusEditor({
52713
52716
  viewBox: `0 0 ${PREVIEW_W} ${PREVIEW_H}`,
52714
52717
  className: "shrink-0",
52715
52718
  children: [
52716
- /* @__PURE__ */ jsx122(
52717
- "path",
52718
- {
52719
- d: path,
52720
- fill: "rgba(255,255,255,0.06)",
52721
- stroke: "rgba(255,255,255,0.24)",
52722
- strokeWidth: 1.5
52723
- }
52724
- ),
52725
- /* @__PURE__ */ jsx122("circle", { cx: sTL, cy: sTL, r: 3, fill: linked ? "#3b82f6" : "#a78bfa" }),
52726
- /* @__PURE__ */ jsx122("circle", { cx: PREVIEW_W - sTR, cy: sTR, r: 3, fill: linked ? "#3b82f6" : "#a78bfa" }),
52727
- /* @__PURE__ */ jsx122(
52728
- "circle",
52729
- {
52730
- cx: PREVIEW_W - sBR,
52731
- cy: PREVIEW_H - sBR,
52732
- r: 3,
52733
- fill: linked ? "#3b82f6" : "#a78bfa"
52734
- }
52735
- ),
52736
- /* @__PURE__ */ jsx122("circle", { cx: sBL, cy: PREVIEW_H - sBL, r: 3, fill: linked ? "#3b82f6" : "#a78bfa" })
52719
+ /* @__PURE__ */ jsx122("path", { d: path, className: "fill-text-0/[0.06] stroke-text-0/25", strokeWidth: 1.5 }),
52720
+ /* @__PURE__ */ jsx122("circle", { cx: sTL, cy: sTL, r: 3, className: dotFill }),
52721
+ /* @__PURE__ */ jsx122("circle", { cx: PREVIEW_W - sTR, cy: sTR, r: 3, className: dotFill }),
52722
+ /* @__PURE__ */ jsx122("circle", { cx: PREVIEW_W - sBR, cy: PREVIEW_H - sBR, r: 3, className: dotFill }),
52723
+ /* @__PURE__ */ jsx122("circle", { cx: sBL, cy: PREVIEW_H - sBL, r: 3, className: dotFill })
52737
52724
  ]
52738
52725
  }
52739
52726
  ),
@@ -53555,7 +53542,7 @@ function TextFieldEditor({
53555
53542
  track2("button", "Remove text field");
53556
53543
  onRemoveTextField(field.key);
53557
53544
  },
53558
- 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",
53545
+ 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-text-0",
53559
53546
  children: "Remove"
53560
53547
  }
53561
53548
  )
@@ -53694,7 +53681,7 @@ function TextSection({
53694
53681
  if (nextKey) setActiveTextFieldKey(nextKey);
53695
53682
  });
53696
53683
  },
53697
- 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",
53684
+ 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-text-0",
53698
53685
  children: [
53699
53686
  /* @__PURE__ */ jsx124(Plus, { size: 12, className: "shrink-0" }),
53700
53687
  /* @__PURE__ */ jsx124("span", { className: "truncate", children: "Add text" })
@@ -53942,7 +53929,7 @@ function ComputedTweenNotice({
53942
53929
  {
53943
53930
  type: "button",
53944
53931
  onClick: onUnroll,
53945
- className: "shrink-0 rounded-sm px-1.5 py-0.5 text-[9px] font-medium text-panel-accent hover:bg-neutral-800",
53932
+ className: "shrink-0 rounded-sm px-1.5 py-0.5 text-[9px] font-medium text-accent-ink hover:bg-neutral-800",
53946
53933
  title: "Rewrite the helper/loop into explicit tweens so this keyframe edits directly",
53947
53934
  children: "Unroll to edit"
53948
53935
  }
@@ -54103,7 +54090,7 @@ function RemoveButton({ onClick, title }) {
54103
54090
  {
54104
54091
  type: "button",
54105
54092
  onClick,
54106
- className: "relative shrink-0 rounded-sm p-1.5 text-neutral-600 transition-colors hover:bg-neutral-800 hover:text-red-400 active:scale-[0.95]",
54093
+ className: "relative shrink-0 rounded-sm p-1.5 text-neutral-600 transition-colors hover:bg-neutral-800 hover:text-danger-ink active:scale-[0.95]",
54107
54094
  title,
54108
54095
  "aria-label": title,
54109
54096
  children: /* @__PURE__ */ jsx128(
@@ -54390,7 +54377,7 @@ var AnimationCard = memo34(function AnimationCard2({
54390
54377
  /* @__PURE__ */ jsx129(
54391
54378
  "span",
54392
54379
  {
54393
- className: "rounded-sm bg-panel-accent/10 px-1.5 py-0.5 text-[10px] font-semibold text-panel-accent",
54380
+ className: "rounded-sm bg-panel-accent/10 px-1.5 py-0.5 text-[10px] font-semibold text-accent-ink",
54394
54381
  title: METHOD_TOOLTIPS[animation.method],
54395
54382
  children: methodLabel
54396
54383
  }
@@ -54546,7 +54533,7 @@ var AnimationCard = memo34(function AnimationCard2({
54546
54533
  )
54547
54534
  ] }) }),
54548
54535
  animation.method === "fromTo" && /* @__PURE__ */ jsxs95("div", { className: "space-y-1", children: [
54549
- /* @__PURE__ */ jsx129("p", { className: "text-[9px] font-semibold uppercase tracking-wider text-orange-400/70", children: "From" }),
54536
+ /* @__PURE__ */ jsx129("p", { className: "text-[9px] font-semibold uppercase tracking-wider text-warning-ink", children: "From" }),
54550
54537
  /* @__PURE__ */ jsx129("div", { className: "space-y-1.5", children: Object.entries(animation.fromProperties ?? {}).map(([prop, val]) => /* @__PURE__ */ jsx129(
54551
54538
  PropertyRow,
54552
54539
  {
@@ -54568,11 +54555,11 @@ var AnimationCard = memo34(function AnimationCard2({
54568
54555
  onAdd: (prop) => onAddFromProperty?.(animation.id, prop),
54569
54556
  onOpen: () => setAddingFromProp(true),
54570
54557
  onClose: () => setAddingFromProp(false),
54571
- buttonClassName: "text-[11px] font-medium text-orange-400/70 transition-colors hover:text-orange-300"
54558
+ buttonClassName: "text-[11px] font-medium text-warning-ink transition-colors hover:text-text-0"
54572
54559
  }
54573
54560
  ) })
54574
54561
  ] }),
54575
- animation.method === "fromTo" && Object.keys(animation.properties).length > 0 && /* @__PURE__ */ jsx129("p", { className: "text-[9px] font-semibold uppercase tracking-wider text-panel-accent/70", children: "To" }),
54562
+ animation.method === "fromTo" && Object.keys(animation.properties).length > 0 && /* @__PURE__ */ jsx129("p", { className: "text-[9px] font-semibold uppercase tracking-wider text-accent-ink", children: "To" }),
54576
54563
  Object.keys(animation.properties).length > 0 && /* @__PURE__ */ jsx129("div", { className: "space-y-1.5", children: Object.entries(animation.properties).map(([prop, val]) => /* @__PURE__ */ jsx129(
54577
54564
  PropertyRow,
54578
54565
  {
@@ -54626,7 +54613,7 @@ var AnimationCard = memo34(function AnimationCard2({
54626
54613
  {
54627
54614
  type: "button",
54628
54615
  onClick: () => onDeleteAnimation(animation.id),
54629
- className: "ml-auto text-[11px] font-medium text-red-400 transition-colors hover:text-red-300",
54616
+ className: "ml-auto text-[11px] font-medium rounded-sm text-danger-ink transition-colors hover:bg-danger/15",
54630
54617
  title: "Remove this animation",
54631
54618
  children: "Remove"
54632
54619
  }
@@ -54642,7 +54629,7 @@ var AnimationCard = memo34(function AnimationCard2({
54642
54629
  import { jsx as jsx130, jsxs as jsxs96 } from "react/jsx-runtime";
54643
54630
  var STYLES = {
54644
54631
  classic: {
54645
- method: "rounded-lg border border-neutral-700 bg-neutral-900 px-2.5 py-1.5 text-[11px] font-medium text-neutral-300 transition-colors hover:border-neutral-600 hover:text-white",
54632
+ method: "rounded-lg border border-neutral-700 bg-neutral-900 px-2.5 py-1.5 text-[11px] font-medium text-neutral-300 transition-colors hover:border-neutral-600 hover:text-text-0",
54646
54633
  cancel: "px-1.5 text-[11px] text-neutral-500 hover:text-neutral-300",
54647
54634
  trigger: "text-[11px] font-medium text-neutral-400 transition-colors hover:text-neutral-200"
54648
54635
  },
@@ -54841,8 +54828,8 @@ var GsapAnimationSection = memo35(function GsapAnimationSection2({
54841
54828
  ...callbacks
54842
54829
  }) {
54843
54830
  return /* @__PURE__ */ jsxs98(Section, { title: "Animation", icon: /* @__PURE__ */ jsx132(Film, { size: 15 }), children: [
54844
- multipleTimelines && /* @__PURE__ */ jsx132("p", { className: "mb-2 rounded-lg bg-amber-500/10 px-3 py-2 text-[11px] leading-relaxed text-amber-400", children: "This file has multiple GSAP timelines. Animation editing is disabled to prevent data loss \u2014 consolidate into a single timeline to enable editing." }),
54845
- unsupportedTimelinePattern && /* @__PURE__ */ jsx132("p", { className: "mb-2 rounded-lg bg-amber-500/10 px-3 py-2 text-[11px] leading-relaxed text-amber-400", children: `This timeline uses a computed key (window.__timelines[variable]) the editor can't resolve statically. Use a string-literal key (window.__timelines["id"]) or a variable declaration (const tl = gsap.timeline()) to enable editing.` }),
54831
+ multipleTimelines && /* @__PURE__ */ jsx132("p", { className: "mb-2 rounded-lg bg-amber-500/10 px-3 py-2 text-[11px] leading-relaxed text-warning-ink", children: "This file has multiple GSAP timelines. Animation editing is disabled to prevent data loss \u2014 consolidate into a single timeline to enable editing." }),
54832
+ unsupportedTimelinePattern && /* @__PURE__ */ jsx132("p", { className: "mb-2 rounded-lg bg-amber-500/10 px-3 py-2 text-[11px] leading-relaxed text-warning-ink", children: `This timeline uses a computed key (window.__timelines[variable]) the editor can't resolve statically. Use a string-literal key (window.__timelines["id"]) or a variable declaration (const tl = gsap.timeline()) to enable editing.` }),
54846
54833
  multipleTimelines || unsupportedTimelinePattern ? null : /* @__PURE__ */ jsx132(
54847
54834
  GsapAnimationList,
54848
54835
  {
@@ -55184,7 +55171,7 @@ function Transform3DCube({
55184
55171
  title: keyframed ? "3D transform is keyframed \u2014 click a field diamond to add keyframes" : "Keyframe the 3D transform (animate it over time)",
55185
55172
  "aria-label": "Keyframe 3D transform",
55186
55173
  "aria-pressed": keyframed,
55187
- className: `absolute left-1.5 top-1.5 rounded p-0.5 hover:bg-neutral-800 ${keyframed ? "text-[#5ff0bf]" : "text-neutral-500 hover:text-neutral-200"}`,
55174
+ className: `absolute left-1.5 top-1.5 rounded p-0.5 hover:bg-neutral-800 ${keyframed ? "text-accent-ink" : "text-neutral-500 hover:text-neutral-200"}`,
55188
55175
  children: /* @__PURE__ */ jsx133(
55189
55176
  "svg",
55190
55177
  {
@@ -55544,7 +55531,7 @@ import { Eye as Eye4, EyeSlash as EyeSlash3 } from "@phosphor-icons/react";
55544
55531
  import { jsx as jsx135, jsxs as jsxs101 } from "react/jsx-runtime";
55545
55532
  var ICON_BY_KIND = { text: Type, media: Film, other: Square };
55546
55533
  var ICON_COLOR_BY_KIND = {
55547
- text: "text-panel-accent",
55534
+ text: "text-accent-ink",
55548
55535
  media: "text-panel-media",
55549
55536
  other: "text-panel-container"
55550
55537
  };
@@ -55627,7 +55614,7 @@ function PropertyPanelFlatHeader({
55627
55614
  track2("button", "Copy element info");
55628
55615
  onCopy();
55629
55616
  },
55630
- className: copied ? "text-panel-accent" : void 0,
55617
+ className: copied ? "text-accent-ink" : void 0,
55631
55618
  children: /* @__PURE__ */ jsx135(ClipboardList, { size: 13 })
55632
55619
  }
55633
55620
  ),
@@ -55685,7 +55672,7 @@ function PropertyPanelFlatFooter({
55685
55672
  height: "13",
55686
55673
  viewBox: "0 0 16 16",
55687
55674
  fill: "currentColor",
55688
- className: "text-panel-accent",
55675
+ className: "text-accent-ink",
55689
55676
  children: /* @__PURE__ */ jsx136("path", { d: "M8 1l1.4 4.6L14 7l-4.6 1.4L8 13l-1.4-4.6L2 7l4.6-1.4z" })
55690
55677
  }
55691
55678
  ),
@@ -55705,7 +55692,7 @@ function PropertyPanelFlatFooter({
55705
55692
  track2("button", "Gesture recording");
55706
55693
  onToggleRecording();
55707
55694
  },
55708
- className: recording ? "text-panel-danger animate-pulse" : "text-panel-danger",
55695
+ className: recording ? "text-danger-ink animate-pulse" : "text-danger-ink",
55709
55696
  children: /* @__PURE__ */ jsx136("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "currentColor", children: recording ? /* @__PURE__ */ jsx136("rect", { x: "2", y: "2", width: "10", height: "10", rx: "1.5" }) : /* @__PURE__ */ jsx136("circle", { cx: "7", cy: "7", r: "6" }) })
55710
55697
  }
55711
55698
  )
@@ -55778,7 +55765,7 @@ function FlatSliderReadout({
55778
55765
  e.stopPropagation();
55779
55766
  },
55780
55767
  onBlur: () => commit(false),
55781
- className: `w-11 shrink-0 rounded-[3px] border bg-panel-surface px-1 text-right font-mono text-[10px] text-panel-text-0 outline-none ${invalid ? "border-red-400" : "border-panel-accent"}`
55768
+ className: `w-11 shrink-0 rounded-[3px] border bg-panel-surface px-1 text-right font-mono text-[10px] text-panel-text-0 outline-none ${invalid ? "border-dashed border-danger-ink" : "border-panel-accent"}`
55782
55769
  }
55783
55770
  );
55784
55771
  }
@@ -55816,7 +55803,7 @@ var VALUE_TIER_LABEL_CLASS = {
55816
55803
  var VALUE_TIER_VALUE_CLASS = {
55817
55804
  default: "text-panel-text-3",
55818
55805
  explicitDefault: "text-panel-text-0",
55819
- explicitCustom: "text-panel-accent"
55806
+ explicitCustom: "text-accent-ink"
55820
55807
  };
55821
55808
 
55822
55809
  // src/components/editor/propertyPanelFlatSelectRow.tsx
@@ -56243,7 +56230,7 @@ function FlatSlider({
56243
56230
  "div",
56244
56231
  {
56245
56232
  "data-flat-slider-knob": "true",
56246
- className: `absolute top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full ${tier === "explicitCustom" ? "h-2 w-2 bg-white" : "h-[7px] w-[7px] bg-panel-text-4"}`,
56233
+ className: `absolute top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full ${tier === "explicitCustom" ? "h-2 w-2 bg-text-0" : "h-[7px] w-[7px] bg-panel-text-4"}`,
56247
56234
  style: { left: `${clampedPct}%` }
56248
56235
  }
56249
56236
  )
@@ -57645,8 +57632,8 @@ function FlatMotionSection({
57645
57632
  }
57646
57633
  ),
57647
57634
  showEffects && /* @__PURE__ */ jsxs110(Fragment41, { children: [
57648
- multipleTimelines && /* @__PURE__ */ jsx146("p", { className: "rounded-lg bg-amber-500/10 px-3 py-2 text-[11px] leading-relaxed text-amber-400", children: "This file has multiple GSAP timelines. Animation editing is disabled to prevent data loss \u2014 consolidate into a single timeline to enable editing." }),
57649
- unsupportedTimelinePattern && /* @__PURE__ */ jsx146("p", { className: "rounded-lg bg-amber-500/10 px-3 py-2 text-[11px] leading-relaxed text-amber-400", children: "This timeline uses a computed key the editor can't resolve statically." }),
57635
+ multipleTimelines && /* @__PURE__ */ jsx146("p", { className: "rounded-lg bg-amber-500/10 px-3 py-2 text-[11px] leading-relaxed text-warning-ink", children: "This file has multiple GSAP timelines. Animation editing is disabled to prevent data loss \u2014 consolidate into a single timeline to enable editing." }),
57636
+ unsupportedTimelinePattern && /* @__PURE__ */ jsx146("p", { className: "rounded-lg bg-amber-500/10 px-3 py-2 text-[11px] leading-relaxed text-warning-ink", children: "This timeline uses a computed key the editor can't resolve statically." }),
57650
57637
  !multipleTimelines && !unsupportedTimelinePattern && /* @__PURE__ */ jsx146(
57651
57638
  GsapAnimationList,
57652
57639
  {
@@ -57802,7 +57789,7 @@ function AutomationToggle({
57802
57789
  "button",
57803
57790
  {
57804
57791
  type: "button",
57805
- className: `hf-fx-automate w-[16px] shrink-0 rounded-[3px] border font-mono text-[9px] leading-none ${automated ? "border-panel-accent text-panel-accent" : "border-panel-border-input text-panel-text-2 hover:text-panel-text-0"}`,
57792
+ className: `hf-fx-automate w-[16px] shrink-0 rounded-[3px] border font-mono text-[9px] leading-none ${automated ? "border-panel-accent text-accent-ink" : "border-panel-border-input text-panel-text-2 hover:text-panel-text-0"}`,
57806
57793
  "aria-pressed": automated,
57807
57794
  "aria-label": automated ? `Remove ${label} automation` : `Automate ${label}`,
57808
57795
  onClick: () => automated ? onRemoveAutomation?.(paramKey) : onAutomate?.(paramKey),
@@ -57883,7 +57870,7 @@ function FxParamRow({
57883
57870
  /* @__PURE__ */ jsx147(
57884
57871
  "span",
57885
57872
  {
57886
- className: `hf-fx-label w-[86px] shrink-0 wrap-break-word text-[10px] leading-tight ${automated ? "text-panel-accent" : "text-panel-text-2"}`,
57873
+ className: `hf-fx-label w-[86px] shrink-0 wrap-break-word text-[10px] leading-tight ${automated ? "text-accent-ink" : "text-panel-text-2"}`,
57887
57874
  children: param.label
57888
57875
  }
57889
57876
  ),
@@ -58243,7 +58230,7 @@ function FxCarveMember({
58243
58230
  children: value
58244
58231
  }
58245
58232
  ),
58246
- automated ? /* @__PURE__ */ jsx148("span", { className: "text-[#3CE6AC]", children: "A" }) : null
58233
+ automated ? /* @__PURE__ */ jsx148("span", { className: "text-accent-ink", children: "A" }) : null
58247
58234
  ]
58248
58235
  },
58249
58236
  param.key
@@ -58558,7 +58545,7 @@ function Fader2({
58558
58545
  /* @__PURE__ */ jsx149(
58559
58546
  "span",
58560
58547
  {
58561
- className: `hf-fx-eq-value font-mono text-[9px] tabular-nums ${moved ? "text-panel-accent" : "text-panel-text-2"}`,
58548
+ className: `hf-fx-eq-value font-mono text-[9px] tabular-nums ${moved ? "text-accent-ink" : "text-panel-text-2"}`,
58562
58549
  children: moved ? shown(value) : "0"
58563
58550
  }
58564
58551
  )
@@ -58604,7 +58591,7 @@ function FxEqModule({
58604
58591
  "button",
58605
58592
  {
58606
58593
  type: "button",
58607
- className: "hf-fx-remove px-1 text-[11px] text-panel-text-2 hover:text-panel-danger",
58594
+ className: "hf-fx-remove px-1 text-[11px] text-panel-text-2 hover:text-danger-ink",
58608
58595
  "aria-label": "Remove Tone",
58609
58596
  disabled,
58610
58597
  onClick: onRemove,
@@ -59039,7 +59026,7 @@ function FxNodeHeader({
59039
59026
  "button",
59040
59027
  {
59041
59028
  type: "button",
59042
- className: "hf-fx-remove px-1 font-mono text-[11px] text-panel-text-2 hover:text-red-400 disabled:opacity-40",
59029
+ className: "hf-fx-remove px-1 font-mono text-[11px] text-panel-text-2 hover:text-danger-ink disabled:opacity-40",
59043
59030
  title: "Remove",
59044
59031
  disabled,
59045
59032
  onClick: onRemove,
@@ -59263,7 +59250,7 @@ function FxPresetRun({
59263
59250
  "button",
59264
59251
  {
59265
59252
  type: "button",
59266
- className: "hf-fx-preset-run-remove px-1 font-mono text-[11px] text-panel-text-2 hover:text-red-400 disabled:opacity-40",
59253
+ className: "hf-fx-preset-run-remove px-1 font-mono text-[11px] text-panel-text-2 hover:text-danger-ink disabled:opacity-40",
59267
59254
  title: `Remove ${preset.label}`,
59268
59255
  disabled,
59269
59256
  onClick: onRemoveRun,
@@ -60922,7 +60909,7 @@ function FlatMediaSection({
60922
60909
  "data-flat-media-remove-bg": "true",
60923
60910
  disabled: !canRemoveBackground || removeBusy,
60924
60911
  onClick: () => void runBackgroundRemoval(),
60925
- className: "flex items-center gap-1 text-[10px] font-medium text-panel-accent disabled:cursor-not-allowed disabled:opacity-50",
60912
+ className: "flex items-center gap-1 text-[10px] font-medium text-accent-ink disabled:cursor-not-allowed disabled:opacity-50",
60926
60913
  title: canRemoveBackground ? "Remove background and save a transparent asset" : "Select a project-local image or video asset",
60927
60914
  children: removeBusy ? "Working" : "Remove BG"
60928
60915
  }
@@ -60950,7 +60937,7 @@ function FlatMediaSection({
60950
60937
  /* @__PURE__ */ jsx160("div", { className: "h-1 overflow-hidden rounded-full bg-panel-hover", children: /* @__PURE__ */ jsx160(
60951
60938
  "div",
60952
60939
  {
60953
- className: `h-full rounded-full ${removeProgress.status === "failed" ? "bg-red-400" : "bg-panel-accent"}`,
60940
+ className: `h-full rounded-full ${removeProgress.status === "failed" ? "bg-danger-ink" : "bg-panel-accent"}`,
60954
60941
  style: { width: `${Math.max(0, Math.min(100, removeProgress.progress))}%` }
60955
60942
  }
60956
60943
  ) })
@@ -61574,7 +61561,7 @@ function CurveGraph({
61574
61561
  onSettle();
61575
61562
  }
61576
61563
  },
61577
- className: "mx-auto aspect-square w-full max-w-[200px] touch-none rounded-sm border border-panel-border-input bg-black/20 outline-hidden focus:ring-1 focus:ring-panel-accent",
61564
+ className: "mx-auto aspect-square w-full max-w-[200px] touch-none rounded-sm scheme-dark border border-panel-border-input bg-bg-0 outline-hidden focus:ring-1 focus:ring-inset focus:ring-panel-accent",
61578
61565
  children: [
61579
61566
  /* @__PURE__ */ jsx161("defs", { children: /* @__PURE__ */ jsxs123("linearGradient", { id: `hf-hue-axis-${tab.key}`, children: [
61580
61567
  /* @__PURE__ */ jsx161("stop", { offset: "0%", stopColor: "#f33" }),
@@ -61585,7 +61572,7 @@ function CurveGraph({
61585
61572
  /* @__PURE__ */ jsx161("stop", { offset: "83.3%", stopColor: "#f3f" }),
61586
61573
  /* @__PURE__ */ jsx161("stop", { offset: "100%", stopColor: "#f33" })
61587
61574
  ] }) }),
61588
- [0.25, 0.5, 0.75].map((ratio) => /* @__PURE__ */ jsxs123("g", { stroke: "rgba(255,255,255,0.08)", strokeWidth: "0.5", children: [
61575
+ [0.25, 0.5, 0.75].map((ratio) => /* @__PURE__ */ jsxs123("g", { className: "stroke-text-0/10", strokeWidth: "0.5", children: [
61589
61576
  /* @__PURE__ */ jsx161(
61590
61577
  "line",
61591
61578
  {
@@ -62490,14 +62477,14 @@ function PropertyPanelColorSecondary({
62490
62477
  setSampling(false);
62491
62478
  }
62492
62479
  },
62493
- className: "flex min-h-7 items-center gap-1.5 text-[10px] font-medium text-panel-accent hover:text-panel-accent/80 disabled:opacity-50",
62480
+ className: "flex min-h-7 items-center gap-1.5 text-[10px] font-medium text-accent-ink hover:text-accent-ink/80 disabled:opacity-50",
62494
62481
  children: [
62495
62482
  /* @__PURE__ */ jsx165(Eyedropper, { size: 12 }),
62496
62483
  sampling ? "Capturing frame" : "Sample color from frame"
62497
62484
  ]
62498
62485
  }
62499
62486
  ),
62500
- captureError && /* @__PURE__ */ jsx165("p", { role: "alert", className: "text-[9px] leading-4 text-red-300", children: captureError }),
62487
+ captureError && /* @__PURE__ */ jsx165("p", { role: "alert", className: "text-[9px] leading-4 text-danger-ink", children: captureError }),
62501
62488
  sampleFrame && samplePixels && /* @__PURE__ */ jsxs127("div", { className: "space-y-1", children: [
62502
62489
  /* @__PURE__ */ jsxs127("div", { className: "flex gap-2 text-[9px]", children: [
62503
62490
  /* @__PURE__ */ jsx165(
@@ -62506,7 +62493,7 @@ function PropertyPanelColorSecondary({
62506
62493
  type: "button",
62507
62494
  "aria-pressed": !showMatte,
62508
62495
  onClick: () => setShowMatte(false),
62509
- className: !showMatte ? "text-panel-accent" : "text-panel-text-4",
62496
+ className: !showMatte ? "text-accent-ink" : "text-panel-text-4",
62510
62497
  children: "Source"
62511
62498
  }
62512
62499
  ),
@@ -62516,7 +62503,7 @@ function PropertyPanelColorSecondary({
62516
62503
  type: "button",
62517
62504
  "aria-pressed": showMatte,
62518
62505
  onClick: () => setShowMatte(true),
62519
- className: showMatte ? "text-panel-accent" : "text-panel-text-4",
62506
+ className: showMatte ? "text-accent-ink" : "text-panel-text-4",
62520
62507
  children: "Selection matte"
62521
62508
  }
62522
62509
  )
@@ -63039,9 +63026,9 @@ import { useEffect as useEffect93, useRef as useRef109 } from "react";
63039
63026
  import { isHfColorGradingActive as isHfColorGradingActive3 } from "@hyperframes/core/color-grading";
63040
63027
  import { jsx as jsx167, jsxs as jsxs129 } from "react/jsx-runtime";
63041
63028
  var STATUS_DOT_CLASS = {
63042
- active: "bg-emerald-400",
63043
- pending: "bg-amber-300",
63044
- unavailable: "bg-red-400",
63029
+ active: "bg-accent",
63030
+ pending: "bg-warning-ink",
63031
+ unavailable: "bg-danger-ink",
63045
63032
  missing: "bg-panel-text-5",
63046
63033
  inactive: "bg-panel-text-5"
63047
63034
  };
@@ -63174,24 +63161,17 @@ function HdrBanner({ metadata }) {
63174
63161
  "div",
63175
63162
  {
63176
63163
  "data-flat-grade-hdr-banner": "true",
63177
- className: "rounded-md border border-amber-500/30 bg-amber-500/10 px-2.5 py-1.5 text-[10px] leading-4 text-amber-100",
63164
+ className: "rounded-md border border-amber-500/30 bg-amber-500/10 px-2.5 py-1.5 text-[10px] leading-4 text-warning-ink",
63178
63165
  children: [
63179
63166
  /* @__PURE__ */ jsxs130("div", { className: "mb-0.5 flex items-center justify-between gap-2", children: [
63180
63167
  /* @__PURE__ */ jsxs130("span", { className: "font-semibold", children: [
63181
63168
  metadata.color.label,
63182
63169
  " source"
63183
63170
  ] }),
63184
- /* @__PURE__ */ jsx168("span", { className: "rounded-sm bg-amber-400/20 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-amber-100", children: "SDR preview" })
63171
+ /* @__PURE__ */ jsx168("span", { className: "rounded-sm bg-amber-500/15 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-warning-ink", children: "SDR preview" })
63185
63172
  ] }),
63186
- /* @__PURE__ */ jsx168("p", { className: "text-amber-100/80", children: "These controls use the current SDR shader preview path. Render may stay HDR-tagged, but this is not true HDR color grading yet." }),
63187
- details && /* @__PURE__ */ jsx168(
63188
- "p",
63189
- {
63190
- "data-flat-grade-hdr-detail": "true",
63191
- className: "mt-0.5 truncate text-[9px] text-amber-100/55",
63192
- children: details
63193
- }
63194
- )
63173
+ /* @__PURE__ */ jsx168("p", { className: "text-text-2", children: "These controls use the current SDR shader preview path. Render may stay HDR-tagged, but this is not true HDR color grading yet." }),
63174
+ details && /* @__PURE__ */ jsx168("p", { "data-flat-grade-hdr-detail": "true", className: "mt-0.5 truncate text-[9px] text-text-muted", children: details })
63195
63175
  ]
63196
63176
  }
63197
63177
  );
@@ -63291,7 +63271,7 @@ function FlatColorGradingSection({
63291
63271
  {
63292
63272
  type: "button",
63293
63273
  onClick: onRequestPresetPreviews,
63294
- className: "text-[10px] font-medium text-panel-accent hover:text-panel-accent/80",
63274
+ className: "text-[10px] font-medium text-accent-ink hover:text-accent-ink/80",
63295
63275
  children: "Retry look previews"
63296
63276
  }
63297
63277
  ),
@@ -63592,7 +63572,7 @@ function FlatColorGradingSection({
63592
63572
  track2("button", "Apply grade to scope");
63593
63573
  onApplyToScope();
63594
63574
  },
63595
- className: "text-[11px] font-medium text-panel-accent hover:text-panel-accent/80 disabled:cursor-not-allowed disabled:opacity-50",
63575
+ className: "text-[11px] font-medium text-accent-ink hover:text-accent-ink/80 disabled:cursor-not-allowed disabled:opacity-50",
63596
63576
  children: applyBusy ? "Applying" : "Apply"
63597
63577
  }
63598
63578
  )
@@ -64068,7 +64048,7 @@ function FlatEffectsSection({
64068
64048
  track2("button", "Customize effect palette");
64069
64049
  onCommitColorGrading({ ...grading, palette: fallback });
64070
64050
  },
64071
- className: "flex min-h-[28px] items-center gap-1 text-[10px] font-medium text-panel-accent hover:text-panel-accent/80",
64051
+ className: "flex min-h-[28px] items-center gap-1 text-[10px] font-medium text-accent-ink hover:text-accent-ink/80",
64072
64052
  children: [
64073
64053
  /* @__PURE__ */ jsx170(Plus, { size: 11 }),
64074
64054
  " Custom palette"
@@ -64179,7 +64159,7 @@ function FlatEffectsSection({
64179
64159
  type: "button",
64180
64160
  title: `Remove ${selectedEffect.label}`,
64181
64161
  onClick: () => removeEffect(selectedEffect),
64182
- className: "text-panel-text-4 hover:text-red-300",
64162
+ className: "text-panel-text-4 hover:text-danger-ink",
64183
64163
  children: /* @__PURE__ */ jsx170(X, { size: 11 })
64184
64164
  }
64185
64165
  )
@@ -64222,7 +64202,7 @@ function FlatEffectsSection({
64222
64202
  "data-flat-effects-add-toggle": "true",
64223
64203
  "aria-expanded": catalogOpen,
64224
64204
  onClick: () => setCatalogOpen((open) => !open),
64225
- className: "flex min-h-[30px] items-center gap-1 text-[10px] font-medium text-panel-accent hover:text-panel-accent/80",
64205
+ className: "flex min-h-[30px] items-center gap-1 text-[10px] font-medium text-accent-ink hover:text-accent-ink/80",
64226
64206
  children: [
64227
64207
  /* @__PURE__ */ jsx170(Plus, { size: 11 }),
64228
64208
  " Add effect"
@@ -64244,7 +64224,7 @@ function FlatEffectsSection({
64244
64224
  "aria-selected": catalogGroup === group.label,
64245
64225
  "data-flat-effect-group": group.label,
64246
64226
  onClick: () => setCatalogGroup(group.label),
64247
- className: `min-h-[25px] min-w-0 truncate bg-panel-bg px-2 text-[9px] ${catalogGroup === group.label ? "font-medium text-panel-accent" : "text-panel-text-4 hover:text-panel-text-1"}`,
64227
+ className: `min-h-[25px] min-w-0 truncate bg-panel-bg px-2 text-[9px] ${catalogGroup === group.label ? "font-medium text-accent-ink" : "text-panel-text-4 hover:text-panel-text-1"}`,
64248
64228
  children: group.label
64249
64229
  },
64250
64230
  group.label
@@ -64379,15 +64359,47 @@ import {
64379
64359
  resolveBlockCategory
64380
64360
  } from "@hyperframes/core/registry";
64381
64361
  var COLOR_MAP = {
64382
- transitions: { bg: "bg-blue-500/15", text: "text-blue-400", dot: "bg-blue-400" },
64383
- vfx: { bg: "bg-purple-500/15", text: "text-purple-400", dot: "bg-purple-400" },
64384
- social: { bg: "bg-pink-500/15", text: "text-pink-400", dot: "bg-pink-400" },
64385
- data: { bg: "bg-green-500/15", text: "text-green-400", dot: "bg-green-400" },
64386
- scenes: { bg: "bg-amber-500/15", text: "text-amber-400", dot: "bg-amber-400" },
64387
- captions: { bg: "bg-cyan-500/15", text: "text-cyan-400", dot: "bg-cyan-400" },
64388
- effects: { bg: "bg-rose-500/15", text: "text-rose-400", dot: "bg-rose-400" },
64389
- "text-effects": { bg: "bg-violet-500/15", text: "text-violet-400", dot: "bg-violet-400" },
64390
- "code-animation": { bg: "bg-emerald-500/15", text: "text-emerald-400", dot: "bg-emerald-400" }
64362
+ transitions: {
64363
+ bg: "bg-blue-500/15",
64364
+ text: "text-[light-dark(oklch(0.48_0.12_255),var(--color-blue-400))]",
64365
+ dot: "bg-[light-dark(oklch(0.48_0.12_255),var(--color-blue-400))]"
64366
+ },
64367
+ vfx: {
64368
+ bg: "bg-purple-500/15",
64369
+ text: "text-[light-dark(oklch(0.48_0.12_305),var(--color-purple-400))]",
64370
+ dot: "bg-[light-dark(oklch(0.48_0.12_305),var(--color-purple-400))]"
64371
+ },
64372
+ social: {
64373
+ bg: "bg-pink-500/15",
64374
+ text: "text-[light-dark(oklch(0.48_0.12_350),var(--color-pink-400))]",
64375
+ dot: "bg-[light-dark(oklch(0.48_0.12_350),var(--color-pink-400))]"
64376
+ },
64377
+ data: {
64378
+ bg: "bg-green-500/15",
64379
+ text: "text-[light-dark(oklch(0.48_0.12_152),var(--color-green-400))]",
64380
+ dot: "bg-[light-dark(oklch(0.48_0.12_152),var(--color-green-400))]"
64381
+ },
64382
+ scenes: { bg: "bg-amber-500/15", text: "text-warning-ink", dot: "bg-warning-ink" },
64383
+ captions: {
64384
+ bg: "bg-cyan-500/15",
64385
+ text: "text-[light-dark(oklch(0.48_0.12_212),var(--color-cyan-400))]",
64386
+ dot: "bg-[light-dark(oklch(0.48_0.12_212),var(--color-cyan-400))]"
64387
+ },
64388
+ effects: {
64389
+ bg: "bg-rose-500/15",
64390
+ text: "text-[light-dark(oklch(0.48_0.12_13),var(--color-rose-400))]",
64391
+ dot: "bg-[light-dark(oklch(0.48_0.12_13),var(--color-rose-400))]"
64392
+ },
64393
+ "text-effects": {
64394
+ bg: "bg-violet-500/15",
64395
+ text: "text-[light-dark(oklch(0.48_0.12_294),var(--color-violet-400))]",
64396
+ dot: "bg-[light-dark(oklch(0.48_0.12_294),var(--color-violet-400))]"
64397
+ },
64398
+ "code-animation": {
64399
+ bg: "bg-emerald-500/15",
64400
+ text: "text-[light-dark(oklch(0.48_0.12_163),var(--color-emerald-400))]",
64401
+ dot: "bg-[light-dark(oklch(0.48_0.12_163),var(--color-emerald-400))]"
64402
+ }
64391
64403
  };
64392
64404
  function getCategoryColors(category) {
64393
64405
  return COLOR_MAP[category];
@@ -64492,7 +64504,7 @@ function FlatOverlaysSection({
64492
64504
  return /* @__PURE__ */ jsx171("div", { className: "py-4 text-center text-[10px] text-panel-text-4", children: "Loading overlays\u2026" });
64493
64505
  }
64494
64506
  if (error) {
64495
- return /* @__PURE__ */ jsx171("div", { className: "py-4 text-center text-[10px] text-red-300", children: error });
64507
+ return /* @__PURE__ */ jsx171("div", { className: "py-4 text-center text-[10px] text-danger-ink", children: error });
64496
64508
  }
64497
64509
  const busy = adding !== null;
64498
64510
  return /* @__PURE__ */ jsx171("div", { "data-flat-overlays": "true", className: FLAT_PREVIEW_GRID, children: overlays.map((overlay) => /* @__PURE__ */ jsxs132(
@@ -64541,7 +64553,7 @@ function FlatOverlaysSection({
64541
64553
  Plus,
64542
64554
  {
64543
64555
  size: 12,
64544
- className: "absolute right-1.5 top-1.5 text-white opacity-70 drop-shadow-sm group-hover:text-panel-accent group-hover:opacity-100"
64556
+ className: "absolute right-1.5 top-1.5 text-white opacity-70 drop-shadow-sm group-hover:text-accent-ink group-hover:opacity-100"
64545
64557
  }
64546
64558
  )
64547
64559
  ] }),
@@ -65058,7 +65070,7 @@ function GestureRecordPanelButton({
65058
65070
  track2("button", "Gesture recording");
65059
65071
  onToggleRecording();
65060
65072
  },
65061
- className: `w-full flex items-center justify-center gap-2 rounded-lg py-2 text-[11px] font-medium transition-colors ${recording ? "bg-red-500/15 text-red-400 border border-red-500/30 animate-pulse" : "bg-panel-input text-panel-text-2 hover:bg-panel-hover border border-panel-border"}`,
65073
+ className: `w-full flex items-center justify-center gap-2 rounded-lg py-2 text-[11px] font-medium transition-colors ${recording ? "bg-red-500/15 text-danger-ink border border-red-500/30 animate-pulse" : "bg-panel-input text-panel-text-2 hover:bg-panel-hover border border-panel-border"}`,
65062
65074
  children: [
65063
65075
  /* @__PURE__ */ jsx173(GestureRecordIcon, { recording }),
65064
65076
  recording ? `Stop recording ${(recordingDuration ?? 0).toFixed(1)}s -- press R` : "Record gesture (R) -- move pointer to capture motion"
@@ -65088,14 +65100,14 @@ function FlatEmptyState() {
65088
65100
  /* @__PURE__ */ jsxs135("div", { className: "mt-2 flex w-full flex-col gap-1.5", children: [
65089
65101
  /* @__PURE__ */ jsxs135("span", { className: "flex items-center justify-between rounded-lg border border-panel-border bg-panel-bg px-3 py-2", children: [
65090
65102
  /* @__PURE__ */ jsxs135("span", { className: "flex items-center gap-2 text-[11px] text-panel-text-2", children: [
65091
- /* @__PURE__ */ jsx174("span", { className: "text-panel-danger", children: "\u25CF" }),
65103
+ /* @__PURE__ */ jsx174("span", { className: "text-danger-ink", children: "\u25CF" }),
65092
65104
  "Record a gesture"
65093
65105
  ] }),
65094
65106
  /* @__PURE__ */ jsx174("span", { className: "rounded-sm border border-panel-border-input px-[5px] py-px font-mono text-[9px] text-panel-text-5", children: "R" })
65095
65107
  ] }),
65096
65108
  /* @__PURE__ */ jsxs135("span", { className: "flex items-center justify-between rounded-lg border border-panel-border bg-panel-bg px-3 py-2", children: [
65097
65109
  /* @__PURE__ */ jsxs135("span", { className: "flex items-center gap-2 text-[11px] text-panel-text-2", children: [
65098
- /* @__PURE__ */ jsx174("span", { className: "text-panel-accent", children: "\u2726" }),
65110
+ /* @__PURE__ */ jsx174("span", { className: "text-accent-ink", children: "\u2726" }),
65099
65111
  "Describe a change to the agent"
65100
65112
  ] }),
65101
65113
  /* @__PURE__ */ jsx174("span", { className: "rounded-sm border border-panel-border-input px-[5px] py-px font-mono text-[9px] text-panel-text-5", children: "\u2318K" })
@@ -65108,7 +65120,7 @@ function elementKindGlyph(element) {
65108
65120
  return { glyph: "\u25C6", className: "bg-panel-media/10 text-panel-media" };
65109
65121
  }
65110
65122
  if (element.textFields?.length > 0) {
65111
- return { glyph: "T", className: "bg-panel-accent/10 text-panel-accent" };
65123
+ return { glyph: "T", className: "bg-panel-accent/10 text-accent-ink" };
65112
65124
  }
65113
65125
  return { glyph: "\u25A6", className: "bg-panel-container/10 text-panel-container" };
65114
65126
  }
@@ -65122,7 +65134,7 @@ function FlatMultiSelectState({
65122
65134
  const hasAudio = !canHideSelections(multiSelectedElements);
65123
65135
  return /* @__PURE__ */ jsxs135("div", { className: "flex flex-col gap-3 px-4 py-3", children: [
65124
65136
  /* @__PURE__ */ jsxs135("div", { className: "flex items-center gap-3 rounded-xl border border-panel-border bg-panel-surface p-3", children: [
65125
- /* @__PURE__ */ jsx174("span", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-panel-accent/10 text-panel-accent", children: /* @__PURE__ */ jsx174(Layers, { size: 16 }) }),
65137
+ /* @__PURE__ */ jsx174("span", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-panel-accent/10 text-accent-ink", children: /* @__PURE__ */ jsx174(Layers, { size: 16 }) }),
65126
65138
  /* @__PURE__ */ jsxs135("div", { className: "min-w-0 flex-1", children: [
65127
65139
  /* @__PURE__ */ jsxs135("div", { className: "text-[13px] font-semibold text-panel-text-0", children: [
65128
65140
  multiSelectCount,
@@ -65745,34 +65757,52 @@ import {
65745
65757
  import { jsx as jsx176 } from "react/jsx-runtime";
65746
65758
  var SZ = 14;
65747
65759
  var W = "duotone";
65760
+ var RED = "text-[light-dark(oklch(0.59_0.194_35),oklch(0.71_0.194_35))]";
65761
+ var BLUE = "text-[light-dark(oklch(0.56_0.14_253),oklch(0.69_0.14_253))]";
65762
+ var GREEN = "text-[light-dark(oklch(0.53_0.192_150),#22C55E)]";
65763
+ var GRAY = "text-[light-dark(oklch(0.56_0.019_261),#9CA3AF)]";
65764
+ var DIM = "text-[light-dark(oklch(0.55_0.023_264),oklch(0.69_0.023_264))]";
65765
+ var ICONS = /* @__PURE__ */ new Map([
65766
+ ["html", [FileHtml, RED]],
65767
+ ["css", [FileCss, "text-[light-dark(oklch(0.5_0.2_266),oklch(0.71_0.2_266))]"]],
65768
+ ["js", [FileJs, "text-[light-dark(oklch(0.56_0.156_101),#F0DB4F)]"]],
65769
+ ["jsx", [FileJsx, "text-[light-dark(oklch(0.55_0.117_219),#61DAFB)]"]],
65770
+ ["ts", [FileTs, BLUE]],
65771
+ ["tsx", [FileTsx, BLUE]],
65772
+ ["json", [FileCode, "text-[light-dark(oklch(0.54_0.182_152),#4ADE80)]"]],
65773
+ ["svg", [FileSvg, "text-[light-dark(oklch(0.58_0.187_48),#F97316)]"]],
65774
+ ["md", [FileMd, GRAY]],
65775
+ ["txt", [FileTxt, GRAY]],
65776
+ ["png", [FilePng, GREEN]],
65777
+ ["jpg", [FileJpg, GREEN]],
65778
+ ["webp", [PhImage, GREEN]],
65779
+ ["mp4", [FileVideo, "text-[light-dark(oklch(0.59_0.2_304),oklch(0.71_0.2_304))]"]],
65780
+ ["mp3", [Waveform, "text-[light-dark(oklch(0.53_0.159_165),#3CE6AC)]"]],
65781
+ ["woff", [TextAa, DIM]]
65782
+ ]);
65783
+ var ALIAS = new Map(
65784
+ Object.entries({
65785
+ mjs: "js",
65786
+ cjs: "js",
65787
+ mts: "ts",
65788
+ mdx: "md",
65789
+ jpeg: "jpg",
65790
+ gif: "webp",
65791
+ ico: "webp",
65792
+ webm: "mp4",
65793
+ mov: "mp4",
65794
+ wav: "mp3",
65795
+ ogg: "mp3",
65796
+ m4a: "mp3",
65797
+ woff2: "woff",
65798
+ ttf: "woff",
65799
+ otf: "woff"
65800
+ })
65801
+ );
65748
65802
  function FileIcon({ path }) {
65749
65803
  const ext2 = path.split(".").pop()?.toLowerCase() ?? "";
65750
- const c = "shrink-0";
65751
- if (ext2 === "html") return /* @__PURE__ */ jsx176(FileHtml, { size: SZ, weight: W, color: "#E44D26", className: c });
65752
- if (ext2 === "css") return /* @__PURE__ */ jsx176(FileCss, { size: SZ, weight: W, color: "#264DE4", className: c });
65753
- if (ext2 === "js" || ext2 === "mjs" || ext2 === "cjs")
65754
- return /* @__PURE__ */ jsx176(FileJs, { size: SZ, weight: W, color: "#F0DB4F", className: c });
65755
- if (ext2 === "jsx") return /* @__PURE__ */ jsx176(FileJsx, { size: SZ, weight: W, color: "#61DAFB", className: c });
65756
- if (ext2 === "ts" || ext2 === "mts")
65757
- return /* @__PURE__ */ jsx176(FileTs, { size: SZ, weight: W, color: "#3178C6", className: c });
65758
- if (ext2 === "tsx") return /* @__PURE__ */ jsx176(FileTsx, { size: SZ, weight: W, color: "#3178C6", className: c });
65759
- if (ext2 === "json") return /* @__PURE__ */ jsx176(FileCode, { size: SZ, weight: W, color: "#4ADE80", className: c });
65760
- if (ext2 === "svg") return /* @__PURE__ */ jsx176(FileSvg, { size: SZ, weight: W, color: "#F97316", className: c });
65761
- if (ext2 === "md" || ext2 === "mdx")
65762
- return /* @__PURE__ */ jsx176(FileMd, { size: SZ, weight: W, color: "#9CA3AF", className: c });
65763
- if (ext2 === "txt") return /* @__PURE__ */ jsx176(FileTxt, { size: SZ, weight: W, color: "#9CA3AF", className: c });
65764
- if (ext2 === "png") return /* @__PURE__ */ jsx176(FilePng, { size: SZ, weight: W, color: "#22C55E", className: c });
65765
- if (ext2 === "jpg" || ext2 === "jpeg")
65766
- return /* @__PURE__ */ jsx176(FileJpg, { size: SZ, weight: W, color: "#22C55E", className: c });
65767
- if (ext2 === "webp" || ext2 === "gif" || ext2 === "ico")
65768
- return /* @__PURE__ */ jsx176(PhImage, { size: SZ, weight: W, color: "#22C55E", className: c });
65769
- if (ext2 === "mp4" || ext2 === "webm" || ext2 === "mov")
65770
- return /* @__PURE__ */ jsx176(FileVideo, { size: SZ, weight: W, color: "#A855F7", className: c });
65771
- if (ext2 === "mp3" || ext2 === "wav" || ext2 === "ogg" || ext2 === "m4a")
65772
- return /* @__PURE__ */ jsx176(Waveform, { size: SZ, weight: W, color: "#3CE6AC", className: c });
65773
- if (ext2 === "woff" || ext2 === "woff2" || ext2 === "ttf" || ext2 === "otf")
65774
- return /* @__PURE__ */ jsx176(TextAa, { size: SZ, weight: W, color: "#6B7280", className: c });
65775
- return /* @__PURE__ */ jsx176(File2, { size: SZ, weight: W, color: "#6B7280", className: c });
65804
+ const [Glyph, color] = ICONS.get(ALIAS.get(ext2) ?? ext2) ?? [File2, DIM];
65805
+ return /* @__PURE__ */ jsx176(Glyph, { size: SZ, weight: W, className: `shrink-0 ${color}` });
65776
65806
  }
65777
65807
  function buildTree(files) {
65778
65808
  const root = { name: "", fullPath: "", children: /* @__PURE__ */ new Map(), isFile: false };
@@ -65964,7 +65994,7 @@ function ContextMenu2({
65964
65994
  "button",
65965
65995
  {
65966
65996
  role: "menuitem",
65967
- className: "w-full flex items-center gap-2 px-3 py-1.5 text-xs text-red-400 hover:bg-red-900/30 focus-visible:bg-red-900/30 active:bg-red-900/50 outline-hidden cursor-pointer text-left",
65997
+ className: "w-full flex items-center gap-2 px-3 py-1.5 text-xs text-danger-ink hover:bg-danger/25 focus-visible:bg-danger/25 active:bg-danger/25 outline-hidden cursor-pointer text-left",
65968
65998
  onClick: () => {
65969
65999
  onDelete(state.targetPath);
65970
66000
  onClose();
@@ -66041,7 +66071,7 @@ function InlineInput({
66041
66071
  className: "flex items-center gap-2 py-0.5 min-h-7",
66042
66072
  style: { paddingLeft: `${8 + depth * 12 + (isFolder ? 0 : 14)}px` },
66043
66073
  children: [
66044
- isFolder ? /* @__PURE__ */ jsx177(FolderSimple, { size: SZ_ICON, weight: "duotone", color: "#6B7280", className: "shrink-0" }) : /* @__PURE__ */ jsx177(FileIcon, { path: value }),
66074
+ isFolder ? /* @__PURE__ */ jsx177(FolderSimple, { size: SZ_ICON, weight: "duotone", className: `shrink-0 ${DIM}` }) : /* @__PURE__ */ jsx177(FileIcon, { path: value }),
66045
66075
  /* @__PURE__ */ jsxs137("div", { className: "flex-1 min-w-0", children: [
66046
66076
  /* @__PURE__ */ jsx177(
66047
66077
  "input",
@@ -66055,11 +66085,11 @@ function InlineInput({
66055
66085
  onKeyDown: handleKeyDown,
66056
66086
  onBlur: handleBlur,
66057
66087
  "aria-invalid": error ? true : void 0,
66058
- className: `w-full min-w-0 bg-neutral-800 text-neutral-200 text-xs px-1.5 py-0.5 rounded border outline-hidden ${error ? "border-red-500/70" : "border-neutral-600 focus:border-[#3CE6AC]"}`,
66088
+ className: `w-full min-w-0 bg-neutral-800 text-neutral-200 text-xs px-1.5 py-0.5 rounded border outline-hidden ${error ? "border-danger-ink" : "border-neutral-600 focus:border-accent-ink"}`,
66059
66089
  spellCheck: false
66060
66090
  }
66061
66091
  ),
66062
- error && /* @__PURE__ */ jsx177("div", { className: "mt-0.5 text-[10px] text-red-400", role: "alert", children: error })
66092
+ error && /* @__PURE__ */ jsx177("div", { className: "mt-0.5 text-[10px] text-danger-ink", role: "alert", children: error })
66063
66093
  ] })
66064
66094
  ]
66065
66095
  }
@@ -66106,7 +66136,7 @@ function DeleteConfirm({
66106
66136
  "button",
66107
66137
  {
66108
66138
  onClick: onCancel,
66109
- className: "flex-1 px-2 py-1 rounded-sm bg-neutral-700 text-neutral-300 hover:bg-neutral-600 transition-colors",
66139
+ className: "flex-1 px-2 py-1 rounded-sm bg-hover text-neutral-300 hover:bg-press transition-colors",
66110
66140
  children: "Cancel"
66111
66141
  }
66112
66142
  ),
@@ -66114,7 +66144,7 @@ function DeleteConfirm({
66114
66144
  "button",
66115
66145
  {
66116
66146
  onClick: onConfirm,
66117
- className: "flex-1 px-2 py-1 rounded-sm bg-red-900/60 text-red-300 hover:bg-red-800/60 transition-colors",
66147
+ className: "flex-1 px-2 py-1 rounded-sm bg-danger/15 text-danger-ink hover:bg-danger/25 transition-colors",
66118
66148
  children: "Delete"
66119
66149
  }
66120
66150
  )
@@ -66169,7 +66199,7 @@ var TreeFile = memo37(function TreeFile2({
66169
66199
  lintInfo && lintInfo.count > 0 && /* @__PURE__ */ jsx177(
66170
66200
  "span",
66171
66201
  {
66172
- className: "shrink-0 min-w-[16px] rounded-full bg-amber-500/20 px-1 text-[8px] font-bold text-amber-400 text-center mr-1",
66202
+ className: "shrink-0 min-w-[16px] rounded-full bg-amber-500/20 px-1 text-[8px] font-bold text-warning-ink text-center mr-1",
66173
66203
  title: lintInfo.messages.join("\n"),
66174
66204
  children: lintInfo.count
66175
66205
  }
@@ -66237,7 +66267,7 @@ var TreeFolder = memo37(function TreeFolder2({
66237
66267
  onDrop(e, node.fullPath);
66238
66268
  },
66239
66269
  onDragLeave,
66240
- className: `w-full flex items-center gap-1.5 px-2.5 py-1 min-h-7 text-left text-xs text-neutral-400 hover:bg-neutral-800/30 hover:text-neutral-300 transition-colors ${isDragOver ? "bg-[#3CE6AC]/10 outline-solid outline-1 outline-[#3CE6AC]/40" : ""}`,
66270
+ className: `w-full flex items-center gap-1.5 px-2.5 py-1 min-h-7 text-left text-xs text-neutral-400 hover:bg-neutral-800/30 hover:text-neutral-300 transition-colors ${isDragOver ? "bg-accent/10 outline-solid outline-1 outline-accent-ink -outline-offset-1" : ""}`,
66241
66271
  style: { paddingLeft: `${8 + depth * 12}px` },
66242
66272
  children: [
66243
66273
  /* @__PURE__ */ jsx177(Chevron, { size: 10, className: "shrink-0 text-neutral-600" }),
@@ -66493,7 +66523,7 @@ var FileTree = memo38(function FileTree2({
66493
66523
  /* @__PURE__ */ jsxs138(
66494
66524
  "div",
66495
66525
  {
66496
- className: `flex-1 overflow-y-auto py-1 transition-colors ${dragOverFolder === "" ? "bg-[#3CE6AC]/5 outline-solid outline-1 outline-[#3CE6AC]/30 -outline-offset-1" : ""}`,
66526
+ className: `flex-1 overflow-y-auto py-1 transition-colors ${dragOverFolder === "" ? "bg-accent/5 outline-solid outline-1 outline-accent-ink -outline-offset-1" : ""}`,
66497
66527
  onContextMenu: handleRootContextMenu,
66498
66528
  onDragOver: (e) => {
66499
66529
  e.preventDefault();
@@ -66594,7 +66624,7 @@ var FileTree = memo38(function FileTree2({
66594
66624
  });
66595
66625
 
66596
66626
  // src/App.tsx
66597
- import { useState as useState149, useCallback as useCallback186, useRef as useRef181, useMemo as useMemo82, useLayoutEffect as useLayoutEffect13 } from "react";
66627
+ import { useState as useState149, useCallback as useCallback186, useRef as useRef181, useMemo as useMemo83, useLayoutEffect as useLayoutEffect14 } from "react";
66598
66628
 
66599
66629
  // src/hooks/useRightPanelIntents.ts
66600
66630
  import { useCallback as useCallback92, useEffect as useEffect99, useRef as useRef115 } from "react";
@@ -67328,7 +67358,7 @@ ${pathLine}${lines.join("\n\n")}`;
67328
67358
  children: [
67329
67359
  /* @__PURE__ */ jsxs139("div", { className: "flex items-center justify-between px-5 py-4 border-b border-neutral-800", children: [
67330
67360
  /* @__PURE__ */ jsxs139("div", { className: "flex items-center gap-3", children: [
67331
- hasIssues ? /* @__PURE__ */ jsx179("div", { className: "w-8 h-8 rounded-full bg-red-500/10 flex items-center justify-center", children: /* @__PURE__ */ jsx179(WarningIcon, { size: 18, className: "text-red-400", weight: "fill" }) }) : /* @__PURE__ */ jsx179("div", { className: "w-8 h-8 rounded-full bg-studio-accent/10 flex items-center justify-center", children: /* @__PURE__ */ jsx179(CheckCircleIcon, { size: 18, className: "text-studio-accent", weight: "fill" }) }),
67361
+ hasIssues ? /* @__PURE__ */ jsx179("div", { className: "w-8 h-8 rounded-full bg-red-500/10 flex items-center justify-center", children: /* @__PURE__ */ jsx179(WarningIcon, { size: 18, className: "text-danger-ink", weight: "fill" }) }) : /* @__PURE__ */ jsx179("div", { className: "w-8 h-8 rounded-full bg-studio-accent/10 flex items-center justify-center", children: /* @__PURE__ */ jsx179(CheckCircleIcon, { size: 18, className: "text-accent-ink", weight: "fill" }) }),
67332
67362
  /* @__PURE__ */ jsxs139("div", { children: [
67333
67363
  /* @__PURE__ */ jsx179("h2", { className: "text-sm font-semibold text-neutral-200", children: hasIssues ? `${errors.length} error${errors.length !== 1 ? "s" : ""}, ${warnings.length} warning${warnings.length !== 1 ? "s" : ""}` : "All checks passed" }),
67334
67364
  /* @__PURE__ */ jsx179("p", { className: "text-xs text-neutral-500", children: title })
@@ -67348,34 +67378,14 @@ ${pathLine}${lines.join("\n\n")}`;
67348
67378
  "button",
67349
67379
  {
67350
67380
  onClick: handleCopyToAgent,
67351
- className: `px-3 py-1 text-xs font-medium rounded-lg transition-colors active:scale-[0.98] ${copied ? "bg-green-600 text-white" : copyFailed ? "bg-red-600 text-white" : "bg-studio-accent hover:bg-studio-accent/80 text-white"}`,
67381
+ className: `px-3 py-1 text-xs font-medium rounded-lg transition-colors active:scale-[0.98] ${copied ? "bg-accent text-on-accent" : copyFailed ? "bg-danger text-on-danger" : "bg-accent hover:bg-accent-hover text-on-accent"}`,
67352
67382
  children: copied ? "Copied!" : copyFailed ? "Copy failed \u2014 check permissions" : "Copy to Agent"
67353
67383
  }
67354
67384
  ) }),
67355
67385
  /* @__PURE__ */ jsxs139("div", { className: "flex-1 overflow-y-auto px-5 py-3", children: [
67356
67386
  !hasIssues && /* @__PURE__ */ jsx179("div", { className: "py-8 text-center text-neutral-500 text-sm", children: "No errors or warnings found. Your composition looks good!" }),
67357
- errors.map((f, i) => /* @__PURE__ */ jsx179("div", { className: "py-3 border-b border-neutral-800/50 last:border-0", children: /* @__PURE__ */ jsxs139("div", { className: "flex items-start gap-2", children: [
67358
- /* @__PURE__ */ jsx179(WarningIcon, { size: 14, className: "text-red-400 shrink-0 mt-0.5", weight: "fill" }),
67359
- /* @__PURE__ */ jsxs139("div", { className: "min-w-0", children: [
67360
- /* @__PURE__ */ jsx179("p", { className: "text-sm text-neutral-200", children: f.message }),
67361
- f.file && /* @__PURE__ */ jsx179("p", { className: "text-xs text-neutral-600 font-mono mt-0.5", children: f.file }),
67362
- f.fixHint && /* @__PURE__ */ jsxs139("div", { className: "flex items-start gap-1 mt-1.5", children: [
67363
- /* @__PURE__ */ jsx179(CaretRightIcon, { size: 10, className: "text-studio-accent shrink-0 mt-0.5" }),
67364
- /* @__PURE__ */ jsx179("p", { className: "text-xs text-studio-accent", children: f.fixHint })
67365
- ] })
67366
- ] })
67367
- ] }) }, `e-${i}`)),
67368
- warnings.map((f, i) => /* @__PURE__ */ jsx179("div", { className: "py-3 border-b border-neutral-800/50 last:border-0", children: /* @__PURE__ */ jsxs139("div", { className: "flex items-start gap-2", children: [
67369
- /* @__PURE__ */ jsx179(WarningIcon, { size: 14, className: "text-amber-400 shrink-0 mt-0.5" }),
67370
- /* @__PURE__ */ jsxs139("div", { className: "min-w-0", children: [
67371
- /* @__PURE__ */ jsx179("p", { className: "text-sm text-neutral-300", children: f.message }),
67372
- f.file && /* @__PURE__ */ jsx179("p", { className: "text-xs text-neutral-600 font-mono mt-0.5", children: f.file }),
67373
- f.fixHint && /* @__PURE__ */ jsxs139("div", { className: "flex items-start gap-1 mt-1.5", children: [
67374
- /* @__PURE__ */ jsx179(CaretRightIcon, { size: 10, className: "text-studio-accent shrink-0 mt-0.5" }),
67375
- /* @__PURE__ */ jsx179("p", { className: "text-xs text-studio-accent", children: f.fixHint })
67376
- ] })
67377
- ] })
67378
- ] }) }, `w-${i}`))
67387
+ errors.map((f, i) => /* @__PURE__ */ jsx179(LintFindingRow, { finding: f, tone: "error" }, `e-${i}`)),
67388
+ warnings.map((f, i) => /* @__PURE__ */ jsx179(LintFindingRow, { finding: f, tone: "warning" }, `w-${i}`))
67379
67389
  ] })
67380
67390
  ]
67381
67391
  }
@@ -67383,6 +67393,26 @@ ${pathLine}${lines.join("\n\n")}`;
67383
67393
  }
67384
67394
  );
67385
67395
  }
67396
+ function LintFindingRow({ finding, tone }) {
67397
+ return /* @__PURE__ */ jsx179("div", { className: "py-3 border-b border-border last:border-0", children: /* @__PURE__ */ jsxs139("div", { className: "flex items-start gap-2", children: [
67398
+ /* @__PURE__ */ jsx179(
67399
+ WarningIcon,
67400
+ {
67401
+ size: 14,
67402
+ className: `${tone === "error" ? "text-danger-ink" : "text-warning-ink"} shrink-0 mt-0.5`,
67403
+ weight: tone === "error" ? "fill" : void 0
67404
+ }
67405
+ ),
67406
+ /* @__PURE__ */ jsxs139("div", { className: "min-w-0", children: [
67407
+ /* @__PURE__ */ jsx179("p", { className: `text-sm ${tone === "error" ? "text-text-0" : "text-text-2"}`, children: finding.message }),
67408
+ finding.file && /* @__PURE__ */ jsx179("p", { className: "text-xs text-text-muted font-mono mt-0.5", children: finding.file }),
67409
+ finding.fixHint && /* @__PURE__ */ jsxs139("div", { className: "flex items-start gap-1 mt-1.5", children: [
67410
+ /* @__PURE__ */ jsx179(CaretRightIcon, { size: 10, className: "text-accent-ink shrink-0 mt-0.5" }),
67411
+ /* @__PURE__ */ jsx179("p", { className: "text-xs text-accent-ink", children: finding.fixHint })
67412
+ ] })
67413
+ ] })
67414
+ ] }) });
67415
+ }
67386
67416
 
67387
67417
  // src/components/AskAgentModal.tsx
67388
67418
  import { useState as useState100, useRef as useRef120 } from "react";
@@ -67502,7 +67532,7 @@ function AskAgentModal({
67502
67532
  /* @__PURE__ */ jsx180(
67503
67533
  "button",
67504
67534
  {
67505
- className: "px-4 py-1.5 rounded-lg bg-studio-accent/90 text-xs font-medium text-neutral-950 hover:bg-studio-accent disabled:opacity-40 disabled:cursor-not-allowed",
67535
+ className: "px-4 py-1.5 rounded-lg bg-accent text-xs font-medium text-on-accent hover:bg-accent-hover disabled:opacity-40 disabled:cursor-not-allowed",
67506
67536
  disabled: !value.trim(),
67507
67537
  onClick: handleSubmit,
67508
67538
  children: "Copy prompt"
@@ -67528,23 +67558,12 @@ function StudioToast({ message, tone, leaving, onDismiss }) {
67528
67558
  children: /* @__PURE__ */ jsxs141(
67529
67559
  "div",
67530
67560
  {
67531
- className: "relative flex max-w-[min(420px,calc(100vw-48px))] items-center gap-3 overflow-hidden rounded-2xl py-3 pl-4 pr-2 text-[12px]",
67532
- style: {
67533
- background: isError ? "linear-gradient(135deg, rgba(127,29,29,0.55), rgba(80,10,10,0.45))" : "linear-gradient(135deg, rgba(38,38,38,0.55), rgba(23,23,23,0.45))",
67534
- backdropFilter: "blur(16px) saturate(1.6)",
67535
- WebkitBackdropFilter: "blur(16px) saturate(1.6)",
67536
- border: `1px solid ${isError ? "rgba(239,68,68,0.18)" : "rgba(255,255,255,0.08)"}`,
67537
- boxShadow: [
67538
- "0 8px 32px rgba(0,0,0,0.35)",
67539
- `inset 0 1px 0 ${isError ? "rgba(239,68,68,0.12)" : "rgba(255,255,255,0.06)"}`,
67540
- `inset 0 -1px 0 rgba(0,0,0,0.15)`
67541
- ].join(", ")
67542
- },
67561
+ className: `relative flex max-w-[min(420px,calc(100vw-48px))] items-center gap-3 overflow-hidden rounded-2xl py-3 pl-4 pr-2 text-[12px] ${toastSurface(isError)}`,
67543
67562
  children: [
67544
67563
  /* @__PURE__ */ jsx181(
67545
67564
  "span",
67546
67565
  {
67547
- className: `min-w-0 wrap-break-word leading-5 ${isError ? "text-red-200" : "text-neutral-200"}`,
67566
+ className: `min-w-0 wrap-break-word leading-5 ${isError ? "text-danger-ink" : "text-text-0"}`,
67548
67567
  children: message
67549
67568
  }
67550
67569
  ),
@@ -67553,7 +67572,7 @@ function StudioToast({ message, tone, leaving, onDismiss }) {
67553
67572
  {
67554
67573
  type: "button",
67555
67574
  onClick: onDismiss,
67556
- className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-md text-neutral-500 transition-colors hover:bg-white/10 hover:text-neutral-300",
67575
+ className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-md text-neutral-500 transition-colors hover:bg-hover hover:text-neutral-300",
67557
67576
  "aria-label": "Dismiss",
67558
67577
  children: /* @__PURE__ */ jsx181(
67559
67578
  "svg",
@@ -67575,6 +67594,9 @@ function StudioToast({ message, tone, leaving, onDismiss }) {
67575
67594
  }
67576
67595
  );
67577
67596
  }
67597
+ function toastSurface(isError) {
67598
+ return `border shadow-popover backdrop-blur-md ${isError ? "border-danger/40 bg-raised" : "border-border bg-raised/95"}`;
67599
+ }
67578
67600
 
67579
67601
  // src/components/feedback/StudioFeedbackCard.tsx
67580
67602
  import { memo as memo39, useState as useState101, useCallback as useCallback96, useRef as useRef121, useEffect as useEffect103 } from "react";
@@ -67764,24 +67786,13 @@ var StudioFeedbackCard = memo39(function StudioFeedbackCard2() {
67764
67786
  children: /* @__PURE__ */ jsxs142(
67765
67787
  "div",
67766
67788
  {
67767
- className: "flex w-[min(340px,calc(100vw-48px))] flex-col gap-2.5 overflow-hidden rounded-2xl px-3.5 py-3",
67768
- style: {
67769
- background: failed2 ? "linear-gradient(135deg, rgba(127,29,29,0.55), rgba(80,10,10,0.45))" : "linear-gradient(135deg, rgba(38,38,38,0.55), rgba(23,23,23,0.45))",
67770
- backdropFilter: "blur(16px) saturate(1.6)",
67771
- WebkitBackdropFilter: "blur(16px) saturate(1.6)",
67772
- border: `1px solid ${failed2 ? "rgba(239,68,68,0.18)" : "rgba(255,255,255,0.08)"}`,
67773
- boxShadow: [
67774
- "0 8px 32px rgba(0,0,0,0.35)",
67775
- `inset 0 1px 0 ${failed2 ? "rgba(239,68,68,0.12)" : "rgba(255,255,255,0.06)"}`,
67776
- "inset 0 -1px 0 rgba(0,0,0,0.15)"
67777
- ].join(", ")
67778
- },
67789
+ className: `flex w-[min(340px,calc(100vw-48px))] flex-col gap-2.5 overflow-hidden rounded-2xl px-3.5 py-3 ${toastSurface(failed2)}`,
67779
67790
  children: [
67780
67791
  /* @__PURE__ */ jsxs142("div", { className: "flex items-start gap-3", children: [
67781
67792
  /* @__PURE__ */ jsx182(
67782
67793
  "p",
67783
67794
  {
67784
- className: `min-w-0 flex-1 text-[12px] leading-5 ${failed2 ? "text-red-100" : "text-neutral-100"}`,
67795
+ className: `min-w-0 flex-1 text-[12px] leading-5 ${failed2 ? "text-danger-ink" : "text-text-0"}`,
67785
67796
  children: step === "thanks" ? "Thanks, that helps." : title
67786
67797
  }
67787
67798
  ),
@@ -67796,7 +67807,7 @@ var StudioFeedbackCard = memo39(function StudioFeedbackCard2() {
67796
67807
  if (req) trackStudioFeedbackInterviewClick({ reason: req.reason });
67797
67808
  close("sent");
67798
67809
  },
67799
- className: "h-6 shrink-0 whitespace-nowrap rounded-full border border-white/20 bg-white/8 px-2.5 text-[11px] leading-6 text-neutral-100 transition-[background-color,border-color,transform] duration-150 ease-out hover:border-white/35 hover:bg-white/16 active:scale-[0.97] motion-reduce:transition-none",
67810
+ className: "h-6 shrink-0 whitespace-nowrap rounded-full border border-border-strong bg-hover px-2.5 text-[11px] leading-6 text-neutral-100 transition-[background-color,border-color,transform] duration-150 ease-out hover:border-text-muted hover:bg-press active:scale-[0.97] motion-reduce:transition-none",
67800
67811
  children: "Talk to us, 30 min"
67801
67812
  }
67802
67813
  ),
@@ -67805,7 +67816,7 @@ var StudioFeedbackCard = memo39(function StudioFeedbackCard2() {
67805
67816
  {
67806
67817
  type: "button",
67807
67818
  onClick: () => close("close"),
67808
- className: "-mr-1 -mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-md text-neutral-500 transition-colors duration-150 hover:bg-white/10 hover:text-neutral-200",
67819
+ className: "-mr-1 -mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-md text-neutral-500 transition-colors duration-150 hover:bg-press hover:text-neutral-200",
67809
67820
  "aria-label": "Dismiss",
67810
67821
  children: /* @__PURE__ */ jsx182(
67811
67822
  "svg",
@@ -67822,14 +67833,14 @@ var StudioFeedbackCard = memo39(function StudioFeedbackCard2() {
67822
67833
  }
67823
67834
  )
67824
67835
  ] }),
67825
- failed2 && request.detail && step !== "thanks" && /* @__PURE__ */ jsx182("p", { className: "line-clamp-2 text-[11px] leading-4 text-red-200/70", children: request.detail }),
67836
+ failed2 && request.detail && step !== "thanks" && /* @__PURE__ */ jsx182("p", { className: "line-clamp-2 text-[11px] leading-4 text-danger-ink", children: request.detail }),
67826
67837
  step === "rating" && /* @__PURE__ */ jsxs142(Fragment49, { children: [
67827
67838
  /* @__PURE__ */ jsxs142("fieldset", { className: "grid grid-cols-11 gap-[3px]", children: [
67828
67839
  /* @__PURE__ */ jsx182("legend", { className: "sr-only", children: "Rate this export from 0 to 10" }),
67829
67840
  RATINGS.map((n) => /* @__PURE__ */ jsxs142(
67830
67841
  "label",
67831
67842
  {
67832
- className: "flex h-7 cursor-pointer items-center justify-center rounded-md bg-white/4 text-[11px] tabular-nums text-neutral-400 transition-[background-color,color,transform] duration-150 ease-out hover:bg-white/[0.14] hover:text-neutral-100 active:scale-[0.97] has-checked:bg-white/90 has-checked:text-neutral-900 has-focus-visible:ring-1 has-focus-visible:ring-white/50 motion-reduce:transition-none",
67843
+ className: "flex h-7 cursor-pointer items-center justify-center rounded-md bg-hover text-[11px] tabular-nums text-neutral-400 transition-[background-color,color,transform] duration-150 ease-out hover:bg-press hover:text-neutral-100 active:scale-[0.97] has-checked:bg-text-0 has-checked:text-bg-0 has-focus-visible:ring-1 has-focus-visible:ring-ring motion-reduce:transition-none",
67833
67844
  children: [
67834
67845
  /* @__PURE__ */ jsx182(
67835
67846
  "input",
@@ -67864,7 +67875,7 @@ var StudioFeedbackCard = memo39(function StudioFeedbackCard2() {
67864
67875
  onFocus: () => setHint(preset.hint),
67865
67876
  onBlur: () => setHint(null),
67866
67877
  "aria-label": `${preset.label}. ${preset.hint}`,
67867
- className: `h-6 rounded-full border px-2.5 text-[11px] transition-[background-color,border-color,color,transform] duration-150 ease-out active:scale-[0.97] motion-reduce:transition-none ${failed2 ? "border-red-300/20 bg-red-100/6 text-red-100/80 hover:border-red-200/70 hover:bg-red-100/25 hover:text-white" : "border-white/10 bg-white/4 text-neutral-300 hover:border-white/60 hover:bg-white/25 hover:text-white"}`,
67878
+ className: `h-6 rounded-full border px-2.5 text-[11px] transition-[background-color,border-color,color,transform] duration-150 ease-out active:scale-[0.97] motion-reduce:transition-none ${failed2 ? "border-danger/30 bg-danger/10 text-danger-ink hover:border-danger/60 hover:bg-danger/20" : "border-border bg-hover text-neutral-300 hover:border-text-muted hover:bg-press hover:text-text-0"}`,
67868
67879
  children: preset.label
67869
67880
  },
67870
67881
  preset.label
@@ -67884,7 +67895,7 @@ var StudioFeedbackCard = memo39(function StudioFeedbackCard2() {
67884
67895
  placeholder: followUp.placeholder,
67885
67896
  "aria-label": followUp.prompt,
67886
67897
  maxLength: 500,
67887
- className: "h-7 min-w-0 flex-1 rounded-md border border-white/10 bg-black/20 px-2 text-[11px] text-neutral-100 outline-hidden transition-colors duration-150 placeholder:text-neutral-500 focus:border-white/25"
67898
+ className: "h-7 min-w-0 flex-1 rounded-md border border-border bg-input px-2 text-[11px] text-neutral-100 outline-hidden transition-colors duration-150 placeholder:text-neutral-500 focus:border-ring"
67888
67899
  }
67889
67900
  ),
67890
67901
  /* @__PURE__ */ jsx182(
@@ -67892,7 +67903,7 @@ var StudioFeedbackCard = memo39(function StudioFeedbackCard2() {
67892
67903
  {
67893
67904
  type: "button",
67894
67905
  onClick: () => submit(),
67895
- className: "h-7 shrink-0 rounded-md bg-white/10 px-2.5 text-[11px] text-neutral-100 transition-[background-color,transform] duration-150 ease-out hover:bg-white/16 active:scale-[0.97] motion-reduce:transition-none",
67906
+ className: "h-7 shrink-0 rounded-md bg-press px-2.5 text-[11px] text-neutral-100 transition-[background-color,transform] duration-150 ease-out hover:bg-on active:scale-[0.97] motion-reduce:transition-none",
67896
67907
  children: "Send"
67897
67908
  }
67898
67909
  )
@@ -74705,16 +74716,16 @@ function refuseGsapTakeover(el, showToast) {
74705
74716
  }
74706
74717
  var plainMoveCounter = 0;
74707
74718
  function stagePlainTranslate(commitPositionPatchToHtml, selection, next, coalesceKey) {
74708
- const style = selection.element.style;
74709
- const before = style.getPropertyValue("translate");
74710
- const patch = translatePatch(next);
74711
- style.setProperty("translate", patch.value);
74719
+ const el = selection.element;
74720
+ const before = captureStudioPathOffset(el);
74721
+ const patches = writePlainMove(el, next);
74722
+ const written = el.style.getPropertyValue("translate");
74712
74723
  const rollback = () => {
74713
- if (style.getPropertyValue("translate") === patch.value) style.setProperty("translate", before);
74724
+ if (el.style.getPropertyValue("translate") === written) restoreStudioPathOffset(el, before);
74714
74725
  };
74715
74726
  const key2 = coalesceKey ?? `move:${++plainMoveCounter}`;
74716
74727
  const options = { label: "Move layer", coalesceKey: key2, coalesceMs: Number.POSITIVE_INFINITY };
74717
- const save = () => commitPositionPatchToHtml(selection, [patch], options).catch((error) => {
74728
+ const save = () => commitPositionPatchToHtml(selection, patches, options).catch((error) => {
74718
74729
  rollback();
74719
74730
  throw error;
74720
74731
  });
@@ -74773,64 +74784,8 @@ function savePlainRotation({ commitPositionPatchToHtml, readOnlyPreview }, selec
74773
74784
  });
74774
74785
  }
74775
74786
 
74776
- // src/hooks/gsapTargetCache.ts
74777
- var _gsapCachedTimelines;
74778
- var _gsapTargetIds;
74779
- var _gsapTargetNodes;
74780
- function addTargetsFromTimeline(tl, ids, nodes) {
74781
- const children = tl.getChildren?.(true);
74782
- if (!children) return;
74783
- for (const child of children) {
74784
- const targets = child.targets?.();
74785
- if (!targets) continue;
74786
- for (const t of targets) {
74787
- nodes.add(t);
74788
- if (t.id) ids.add(t.id);
74789
- }
74790
- }
74791
- }
74792
- function collectGsapTargets(timelines) {
74793
- const ids = /* @__PURE__ */ new Set();
74794
- const nodes = /* @__PURE__ */ new WeakSet();
74795
- for (const tl of Object.values(timelines)) {
74796
- if (!tl) continue;
74797
- try {
74798
- addTargetsFromTimeline(tl, ids, nodes);
74799
- } catch {
74800
- }
74801
- }
74802
- return { ids, nodes };
74803
- }
74804
- function readTimelines(iframe) {
74805
- if (!iframe?.contentWindow) return void 0;
74806
- try {
74807
- return iframe.contentWindow.__timelines;
74808
- } catch {
74809
- return void 0;
74810
- }
74811
- }
74812
- function isElementGsapTargeted(iframe, element) {
74813
- const timelines = readTimelines(iframe);
74814
- if (!timelines) return false;
74815
- if (timelines !== _gsapCachedTimelines) {
74816
- const cache2 = collectGsapTargets(timelines);
74817
- _gsapTargetIds = cache2.ids;
74818
- _gsapTargetNodes = cache2.nodes;
74819
- _gsapCachedTimelines = timelines;
74820
- }
74821
- return _gsapTargetNodes.has(element) || !!(element.id && _gsapTargetIds.has(element.id));
74822
- }
74823
-
74824
74787
  // src/hooks/useDomGeometryCommits.ts
74825
- var GSAP_CSS_FALLBACK_BLOCKED_MESSAGE = "This element is GSAP-animated \u2014 dragging via CSS would corrupt keyframes";
74826
- function rejectGsapCssFallback(selection, previewIframeRef, showToast) {
74827
- if (!isElementGsapTargeted(previewIframeRef.current, selection.element)) return null;
74828
- const error = new Error(GSAP_CSS_FALLBACK_BLOCKED_MESSAGE);
74829
- showToast(error.message, "error");
74830
- return Promise.reject(error);
74831
- }
74832
74788
  function useDomGeometryCommits({
74833
- previewIframeRef,
74834
74789
  showToast,
74835
74790
  commitPositionPatchToHtml,
74836
74791
  readOnlyPreview
@@ -74845,44 +74800,24 @@ function useDomGeometryCommits({
74845
74800
  ),
74846
74801
  [commitPositionPatchToHtml, readOnlyPreview, showToast]
74847
74802
  );
74848
- const handleDomPathOffsetCommit = useCallback125(
74849
- (selection, next) => {
74850
- if (readOnlyPreview) return Promise.resolve();
74851
- const gsapFallback = rejectGsapCssFallback(selection, previewIframeRef, showToast);
74852
- if (gsapFallback) return gsapFallback;
74853
- const before = captureStudioPathOffset(selection.element);
74854
- applyStudioPathOffset(selection.element, next);
74855
- return commitPositionPatchToHtml(selection, buildPathOffsetPatches(selection.element), {
74856
- label: "Move layer",
74857
- coalesceKey: `path-offset:${getDomEditTargetKey(selection)}`
74858
- }).catch((error) => {
74859
- restoreStudioPathOffset(selection.element, before);
74860
- throw error;
74861
- });
74862
- },
74863
- [commitPositionPatchToHtml, previewIframeRef, showToast, readOnlyPreview]
74864
- );
74865
74803
  const handleDomBoxSizeCommit = useCallback125(
74866
74804
  (selection, next, offset, restore) => {
74867
74805
  if (readOnlyPreview) return Promise.resolve();
74868
74806
  const element = selection.element;
74869
74807
  const beforeSize = captureStudioBoxSize(element);
74870
- const beforeTranslate = element.style.getPropertyValue("translate");
74808
+ const beforeOffset = captureStudioPathOffset(element);
74871
74809
  const stageCrop = prepareCropResize(element);
74872
74810
  applyStudioBoxSize(element, next);
74873
74811
  const crop = stageCrop();
74874
74812
  const patches = buildBoxSizePatches(element);
74875
74813
  if (crop) patches.push(crop.patch);
74876
- if (offset) {
74877
- writeTranslatePx(element, offset);
74878
- patches.push(translatePatch(offset));
74879
- }
74814
+ if (offset) patches.push(...writePlainMove(element, offset));
74880
74815
  return commitPositionPatchToHtml(selection, patches, {
74881
74816
  label: "Resize layer box",
74882
74817
  coalesceKey: `box-size:${getDomEditTargetKey(selection)}`
74883
74818
  }).catch((error) => {
74884
74819
  restoreStudioBoxSize(element, beforeSize);
74885
- if (offset) element.style.setProperty("translate", beforeTranslate);
74820
+ if (offset) restoreStudioPathOffset(element, beforeOffset);
74886
74821
  crop?.revert();
74887
74822
  restore?.();
74888
74823
  throw error;
@@ -74923,7 +74858,6 @@ function useDomGeometryCommits({
74923
74858
  );
74924
74859
  return {
74925
74860
  stageElementPositionOffset,
74926
- handleDomPathOffsetCommit,
74927
74861
  handleDomBoxSizeCommit,
74928
74862
  handleDomRotationCommit,
74929
74863
  handleDomManualEditsReset
@@ -75102,12 +75036,10 @@ function useDomEditCommits({
75102
75036
  });
75103
75037
  const {
75104
75038
  stageElementPositionOffset,
75105
- handleDomPathOffsetCommit,
75106
75039
  handleDomBoxSizeCommit,
75107
75040
  handleDomRotationCommit,
75108
75041
  handleDomManualEditsReset
75109
75042
  } = useDomGeometryCommits({
75110
- previewIframeRef,
75111
75043
  showToast,
75112
75044
  commitPositionPatchToHtml,
75113
75045
  readOnlyPreview
@@ -75143,7 +75075,6 @@ function useDomEditCommits({
75143
75075
  handleDomRemoveTextField,
75144
75076
  stageElementPositionOffset,
75145
75077
  commitPositionPatchToHtml,
75146
- handleDomPathOffsetCommit,
75147
75078
  handleDomBoxSizeCommit,
75148
75079
  handleDomRotationCommit,
75149
75080
  handleDomManualEditsReset,
@@ -81022,10 +80953,16 @@ function remintHfIds(html2, parser, taken) {
81022
80953
  }
81023
80954
  var HF_ID_ATTR_RE = /\bdata-hf-id\s*=\s*["']?([^"'\s>]+)/gi;
81024
80955
  var hfIdsInFile = (content) => new Set(Array.from(content.matchAll(HF_ID_ATTR_RE), (match) => match[1]));
81025
- function pasteElementHtml(content, payload) {
80956
+ function pasteElementHtml(content, payload, fromThisFile = false) {
81026
80957
  const reminted = remintHfIds(payload.html, new DOMParser(), hfIdsInFile(content));
81027
80958
  const deduped = deduplicateIds(reminted, collectHtmlIds(content));
81028
- return insertAsSibling(content, deduped, payload.originSelector, payload.originSelectorIndex);
80959
+ const result = insertAsSibling(
80960
+ content,
80961
+ deduped,
80962
+ payload.originSelector,
80963
+ payload.originSelectorIndex
80964
+ );
80965
+ return fromThisFile ? carryLook(result, renamedIds(reminted, deduped), 0) : result;
81029
80966
  }
81030
80967
  function pasteTimelineClips(content, clips, anchorTime, liveElements, fromThisFile = false) {
81031
80968
  const groupMinStart = Math.min(...clips.map((c) => c.start));
@@ -81154,6 +81091,7 @@ function useClipboard({
81154
81091
  kind: "dom-element",
81155
81092
  html: savedMarkupElseLive(parseSavedSource(content), live, sourceFile),
81156
81093
  sourceFile,
81094
+ projectId: projectIdRef.current ?? void 0,
81157
81095
  originSelector: domSelection.selector,
81158
81096
  originSelectorIndex: domSelection.selectorIndex
81159
81097
  };
@@ -81195,15 +81133,17 @@ function useClipboard({
81195
81133
  const targetPath = activeCompPath || "index.html";
81196
81134
  try {
81197
81135
  let pastedIds = [];
81136
+ const fromThisFile = payload.sourceFile === targetPath && payload.projectId === pid;
81198
81137
  const paste = (originalContent) => {
81199
- if (payload.kind !== "timeline-clip") return pasteElementHtml(originalContent, payload);
81138
+ if (payload.kind !== "timeline-clip")
81139
+ return pasteElementHtml(originalContent, payload, fromThisFile);
81200
81140
  const { currentTime, elements } = usePlayerStore.getState();
81201
81141
  const pasted = pasteTimelineClips(
81202
81142
  originalContent,
81203
81143
  payload.clips,
81204
81144
  currentTime,
81205
81145
  elements,
81206
- payload.sourceFile === targetPath && payload.projectId === pid
81146
+ fromThisFile
81207
81147
  );
81208
81148
  pastedIds = pasted.ids;
81209
81149
  return extendRootDurationInSource(pasted.content, pasted.requiredEnd);
@@ -82588,7 +82528,7 @@ function StudioHeader({
82588
82528
  "aria-pressed": inspectorButtonActive,
82589
82529
  className: cn(
82590
82530
  "h-full rounded-none",
82591
- inspectorButtonActive && "bg-hover text-accent enabled:hover:text-accent"
82531
+ inspectorButtonActive && "bg-on text-accent-ink enabled:hover:bg-on-hover enabled:hover:text-accent-ink"
82592
82532
  ),
82593
82533
  icon: /* @__PURE__ */ jsx190(InspectorIcon, { size: 16 }),
82594
82534
  onClick: () => {
@@ -83878,7 +83818,7 @@ function ContextMenu3({
83878
83818
  {
83879
83819
  role: "menuitem",
83880
83820
  onClick: () => setMode("confirm-delete"),
83881
- className: `${itemCls} text-red-400`,
83821
+ className: `${itemCls} text-danger-ink`,
83882
83822
  children: "Delete"
83883
83823
  }
83884
83824
  )
@@ -83912,10 +83852,10 @@ function ContextMenu3({
83912
83852
  }
83913
83853
  },
83914
83854
  "aria-label": `Rename ${filename(asset)}`,
83915
- className: "w-full bg-neutral-800 border border-neutral-600 rounded-sm px-1.5 py-1 text-[11px] text-white focus:border-studio-accent/60 focus:outline-hidden"
83855
+ className: "w-full bg-neutral-800 border border-neutral-600 rounded-sm px-1.5 py-1 text-[11px] text-text-0 focus:border-studio-accent/60 focus:outline-hidden"
83916
83856
  }
83917
83857
  ),
83918
- renameError && /* @__PURE__ */ jsx194("span", { className: "text-[10px] text-red-400", children: renameError }),
83858
+ renameError && /* @__PURE__ */ jsx194("span", { className: "text-[10px] text-danger-ink", children: renameError }),
83919
83859
  /* @__PURE__ */ jsxs153("div", { className: "flex items-center justify-end gap-1", children: [
83920
83860
  /* @__PURE__ */ jsx194(
83921
83861
  "button",
@@ -83929,7 +83869,7 @@ function ContextMenu3({
83929
83869
  "button",
83930
83870
  {
83931
83871
  onClick: commitRename,
83932
- className: "px-2 py-0.5 text-[10px] rounded-sm bg-studio-accent/80 hover:bg-studio-accent text-white transition-colors",
83872
+ className: "px-2 py-0.5 text-[10px] rounded-sm bg-accent hover:bg-accent-hover text-on-accent transition-colors",
83933
83873
  children: "Rename"
83934
83874
  }
83935
83875
  )
@@ -83946,8 +83886,8 @@ function DeleteConfirm2({
83946
83886
  onConfirm,
83947
83887
  onCancel
83948
83888
  }) {
83949
- return /* @__PURE__ */ jsxs153("div", { className: "px-2 py-1.5 bg-red-950/30 border-l-2 border-red-500 flex items-center justify-between gap-2", children: [
83950
- /* @__PURE__ */ jsxs153("span", { className: "text-[10px] text-red-400 truncate", children: [
83889
+ return /* @__PURE__ */ jsxs153("div", { className: "px-2 py-1.5 bg-danger/15 border-l-2 border-red-500 flex items-center justify-between gap-2", children: [
83890
+ /* @__PURE__ */ jsxs153("span", { className: "text-[10px] text-danger-ink truncate", children: [
83951
83891
  "Delete ",
83952
83892
  name,
83953
83893
  "?"
@@ -83957,7 +83897,7 @@ function DeleteConfirm2({
83957
83897
  "button",
83958
83898
  {
83959
83899
  onClick: onConfirm,
83960
- className: "px-2 py-0.5 text-[10px] rounded-sm bg-red-600 text-white hover:bg-red-500 active:bg-red-700 transition-colors",
83900
+ className: "px-2 py-0.5 text-[10px] rounded-sm bg-danger text-on-danger hover:brightness-95 active:brightness-90 transition-colors",
83961
83901
  children: "Delete"
83962
83902
  }
83963
83903
  ),
@@ -84183,7 +84123,7 @@ function AudioRow({
84183
84123
  {
84184
84124
  "aria-label": playing ? `Pause preview of ${name}` : `Play preview of ${name}`,
84185
84125
  "aria-pressed": playing,
84186
- className: `w-7 h-7 rounded-md shrink-0 flex items-center justify-center transition-colors active:scale-[0.95] ${playing ? "bg-panel-accent/15 text-panel-accent" : "text-panel-text-5 group-hover:text-panel-text-3"}`,
84126
+ className: `w-7 h-7 rounded-md shrink-0 flex items-center justify-center transition-colors active:scale-[0.95] ${playing ? "bg-panel-accent/15 text-accent-ink" : "text-panel-text-5 group-hover:text-panel-text-3"}`,
84187
84127
  onClick: (e) => {
84188
84128
  e.stopPropagation();
84189
84129
  togglePlay();
@@ -84207,12 +84147,12 @@ function AudioRow({
84207
84147
  meta?.duration ? `${meta.duration}s \xB7 ` : "",
84208
84148
  subtype
84209
84149
  ] }),
84210
- used && /* @__PURE__ */ jsx195("span", { className: "text-[9px] font-medium text-panel-accent bg-panel-accent/10 px-1.5 py-px rounded-sm shrink-0", children: "in use" }),
84150
+ used && /* @__PURE__ */ jsx195("span", { className: "text-[9px] font-medium text-accent-ink bg-panel-accent/10 px-1.5 py-px rounded-sm shrink-0", children: "in use" }),
84211
84151
  (isCopied || copyFailed) && /* @__PURE__ */ jsx195(
84212
84152
  "span",
84213
84153
  {
84214
84154
  role: "status",
84215
- className: `shrink-0 text-[9px] font-medium px-1.5 py-px rounded ${copyFailed ? "text-red-400 bg-red-500/10" : "text-panel-accent bg-panel-accent/10"}`,
84155
+ className: `shrink-0 text-[9px] font-medium px-1.5 py-px rounded ${copyFailed ? "text-danger-ink bg-red-500/10" : "text-accent-ink bg-panel-accent/10"}`,
84216
84156
  children: copyFailed ? "Copy failed" : "Copied"
84217
84157
  }
84218
84158
  )
@@ -84376,7 +84316,7 @@ function CopyChip({ feedback, asset }) {
84376
84316
  "span",
84377
84317
  {
84378
84318
  role: "status",
84379
- className: `shrink-0 text-[9px] font-medium px-1.5 py-px rounded ${feedback.ok ? "text-panel-accent bg-panel-accent/10" : "text-red-400 bg-red-500/10"}`,
84319
+ className: `shrink-0 text-[9px] font-medium px-1.5 py-px rounded ${feedback.ok ? "text-accent-ink bg-panel-accent/10" : "text-danger-ink bg-red-500/10"}`,
84380
84320
  children: feedback.ok ? "Copied" : "Copy failed"
84381
84321
  }
84382
84322
  );
@@ -84605,7 +84545,7 @@ function FontRow({
84605
84545
  onContextMenu: (e) => openAssetContextMenu(e, setContextMenu),
84606
84546
  className: `px-2.5 py-1.5 flex items-center gap-2.5 cursor-pointer transition-colors outline-hidden focus-visible:bg-neutral-800/60 ${isCopied ? "bg-studio-accent/10 border-l-2 border-studio-accent" : "border-l-2 border-transparent hover:bg-neutral-800/50"}`,
84607
84547
  children: [
84608
- /* @__PURE__ */ jsx198("div", { className: "w-[50px] h-[32px] rounded-sm overflow-hidden bg-neutral-900 shrink-0 flex items-center justify-center", children: /* @__PURE__ */ jsx198("span", { className: "text-[9px] font-medium text-neutral-700", children: extension }) }),
84548
+ /* @__PURE__ */ jsx198("div", { className: "w-[50px] h-[32px] rounded-sm overflow-hidden bg-neutral-900 shrink-0 flex items-center justify-center", children: /* @__PURE__ */ jsx198("span", { className: "text-[9px] font-medium text-text-muted", children: extension }) }),
84609
84549
  /* @__PURE__ */ jsxs156("div", { className: "min-w-0 flex-1", children: [
84610
84550
  /* @__PURE__ */ jsx198(
84611
84551
  "span",
@@ -84616,7 +84556,7 @@ function FontRow({
84616
84556
  ),
84617
84557
  /* @__PURE__ */ jsxs156("div", { className: "flex items-center gap-1.5", children: [
84618
84558
  /* @__PURE__ */ jsx198("span", { className: "text-[10px] text-neutral-600 truncate", children: extension }),
84619
- used && /* @__PURE__ */ jsx198("span", { className: "text-[9px] font-medium text-panel-accent bg-panel-accent/10 px-1.5 py-px rounded-sm", children: "in use" }),
84559
+ used && /* @__PURE__ */ jsx198("span", { className: "text-[9px] font-medium text-accent-ink bg-panel-accent/10 px-1.5 py-px rounded-sm", children: "in use" }),
84620
84560
  /* @__PURE__ */ jsx198(CopyChip, { feedback: copyFeedback, asset })
84621
84561
  ] })
84622
84562
  ] })
@@ -84749,7 +84689,7 @@ function EmptyState({
84749
84689
  fill: "none",
84750
84690
  stroke: "currentColor",
84751
84691
  strokeWidth: "1.5",
84752
- className: "text-neutral-700",
84692
+ className: "text-text-off",
84753
84693
  children: [
84754
84694
  /* @__PURE__ */ jsx199(
84755
84695
  "path",
@@ -84898,7 +84838,7 @@ var AssetsTab = memo41(function AssetsTab2({
84898
84838
  "button",
84899
84839
  {
84900
84840
  onClick: () => setViewMode(m),
84901
- className: `flex-1 px-2 py-1 text-[11px] font-medium rounded transition-colors ${viewMode === m ? "bg-panel-accent/15 text-panel-accent" : "text-panel-text-3 hover:text-panel-text-1"}`,
84841
+ className: `flex-1 px-2 py-1 text-[11px] font-medium rounded transition-colors ${viewMode === m ? "bg-panel-accent/15 text-accent-ink" : "text-panel-text-3 hover:text-panel-text-1"}`,
84902
84842
  children: m === "local" ? "This project" : "All projects"
84903
84843
  },
84904
84844
  m
@@ -84938,7 +84878,7 @@ var AssetsTab = memo41(function AssetsTab2({
84938
84878
  {
84939
84879
  onClick: () => setActiveFilter("all"),
84940
84880
  "aria-pressed": activeFilter === "all",
84941
- className: `px-2.5 py-1 text-[11px] font-medium rounded-md transition-colors active:scale-[0.98] ${activeFilter === "all" ? "bg-panel-accent/15 text-panel-accent" : "bg-panel-input text-panel-text-3 hover:text-panel-text-1"}`,
84881
+ className: `px-2.5 py-1 text-[11px] font-medium rounded-md transition-colors active:scale-[0.98] ${activeFilter === "all" ? "bg-panel-accent/15 text-accent-ink" : "bg-panel-input text-panel-text-3 hover:text-panel-text-1"}`,
84942
84882
  children: [
84943
84883
  "All ",
84944
84884
  counts.all
@@ -84951,7 +84891,7 @@ var AssetsTab = memo41(function AssetsTab2({
84951
84891
  {
84952
84892
  onClick: () => setActiveFilter(activeFilter === cat ? "all" : cat),
84953
84893
  "aria-pressed": activeFilter === cat,
84954
- className: `px-2.5 py-1 text-[11px] font-medium rounded-md transition-colors active:scale-[0.98] ${activeFilter === cat ? "bg-panel-accent/15 text-panel-accent" : "bg-panel-input text-panel-text-3 hover:text-panel-text-1"}`,
84894
+ className: `px-2.5 py-1 text-[11px] font-medium rounded-md transition-colors active:scale-[0.98] ${activeFilter === cat ? "bg-panel-accent/15 text-accent-ink" : "bg-panel-input text-panel-text-3 hover:text-panel-text-1"}`,
84955
84895
  children: [
84956
84896
  CATEGORY_LABELS[cat],
84957
84897
  " ",
@@ -84967,7 +84907,7 @@ var AssetsTab = memo41(function AssetsTab2({
84967
84907
  "button",
84968
84908
  {
84969
84909
  onClick: () => setUsageFilter(usageFilter === "used" ? "all" : "used"),
84970
- className: `px-2.5 py-1 text-[11px] font-medium rounded-md transition-colors ${usageFilter === "used" ? "bg-panel-accent/15 text-panel-accent" : "bg-panel-input text-panel-text-3 hover:text-panel-text-1"}`,
84910
+ className: `px-2.5 py-1 text-[11px] font-medium rounded-md transition-colors ${usageFilter === "used" ? "bg-panel-accent/15 text-accent-ink" : "bg-panel-input text-panel-text-3 hover:text-panel-text-1"}`,
84971
84911
  children: [
84972
84912
  "In use ",
84973
84913
  usageCounts.used
@@ -84978,7 +84918,7 @@ var AssetsTab = memo41(function AssetsTab2({
84978
84918
  "button",
84979
84919
  {
84980
84920
  onClick: () => setUsageFilter(usageFilter === "unused" ? "all" : "unused"),
84981
- className: `px-2.5 py-1 text-[11px] font-medium rounded-md transition-colors ${usageFilter === "unused" ? "bg-panel-accent/15 text-panel-accent" : "bg-panel-input text-panel-text-3 hover:text-panel-text-1"}`,
84921
+ className: `px-2.5 py-1 text-[11px] font-medium rounded-md transition-colors ${usageFilter === "unused" ? "bg-panel-accent/15 text-accent-ink" : "bg-panel-input text-panel-text-3 hover:text-panel-text-1"}`,
84982
84922
  children: [
84983
84923
  "Unused ",
84984
84924
  usageCounts.unused
@@ -85152,7 +85092,7 @@ function PromptPreviewModal({
85152
85092
  /* @__PURE__ */ jsx200(
85153
85093
  "button",
85154
85094
  {
85155
- className: `px-4 py-1.5 rounded-lg text-xs font-medium transition-colors active:scale-[0.97] ${copyState === "copied" ? "bg-emerald-500 text-white" : copyState === "failed" ? "bg-red-500 text-white" : "bg-studio-accent/90 text-neutral-950 hover:bg-studio-accent"}`,
85095
+ className: `px-4 py-1.5 rounded-lg text-xs font-medium transition-colors active:scale-[0.97] ${copyState === "copied" ? "bg-accent text-on-accent" : copyState === "failed" ? "bg-danger text-on-danger" : "bg-accent text-on-accent hover:bg-accent-hover"}`,
85156
85096
  onClick: handleCopy2,
85157
85097
  children: copyState === "copied" ? "Copied!" : copyState === "failed" ? "Copy failed" : "Copy prompt"
85158
85098
  }
@@ -85174,7 +85114,7 @@ var BlocksTab = memo42(function BlocksTab2({ onAddBlock, onPreviewBlock }) {
85174
85114
  return /* @__PURE__ */ jsx201("div", { className: "flex flex-1 items-center justify-center text-neutral-600 text-xs", children: "Loading blocks\u2026" });
85175
85115
  }
85176
85116
  if (error) {
85177
- return /* @__PURE__ */ jsx201("div", { className: "flex flex-1 items-center justify-center text-red-400 text-xs px-4 text-center", children: error });
85117
+ return /* @__PURE__ */ jsx201("div", { className: "flex flex-1 items-center justify-center text-danger-ink text-xs px-4 text-center", children: error });
85178
85118
  }
85179
85119
  return /* @__PURE__ */ jsxs159("div", { className: "flex flex-col flex-1 min-h-0", children: [
85180
85120
  /* @__PURE__ */ jsx201("div", { className: "px-3 pt-2 pb-1 shrink-0", children: /* @__PURE__ */ jsx201(
@@ -85200,10 +85140,10 @@ var BlocksTab = memo42(function BlocksTab2({ onAddBlock, onPreviewBlock }) {
85200
85140
  ))
85201
85141
  ] }) }),
85202
85142
  /* @__PURE__ */ jsxs159("div", { className: "flex-1 overflow-y-auto min-h-0 px-2 pb-2", children: [
85203
- category === "vfx" && /* @__PURE__ */ jsxs159("div", { className: "mb-2 px-2 py-1.5 rounded-md bg-purple-500/10 border border-purple-500/20 text-[9px] text-purple-300 leading-relaxed", children: [
85143
+ category === "vfx" && /* @__PURE__ */ jsxs159("div", { className: "mb-2 px-2 py-1.5 rounded-md bg-purple-500/10 border border-purple-500/20 text-[9px] text-text-2 leading-relaxed", children: [
85204
85144
  "VFX blocks use WebGL via HTML-in-Canvas. Enable",
85205
85145
  " ",
85206
- /* @__PURE__ */ jsx201("span", { className: "font-mono text-purple-200", children: "chrome://flags/#html-in-canvas" }),
85146
+ /* @__PURE__ */ jsx201("span", { className: "font-mono text-text-0", children: "chrome://flags/#html-in-canvas" }),
85207
85147
  " for preview."
85208
85148
  ] }),
85209
85149
  filteredBlocks.length === 0 ? /* @__PURE__ */ jsx201("div", { className: "flex items-center justify-center h-32 text-neutral-600 text-xs", children: "No blocks match your search" }) : /* @__PURE__ */ jsx201(
@@ -85467,7 +85407,7 @@ function BlockCard({
85467
85407
  type: "button",
85468
85408
  onClick: handleAdd,
85469
85409
  title: "Add to composition at current time",
85470
- className: `flex items-center gap-1 px-3 py-1.5 rounded-md text-[10px] font-semibold transition-colors active:scale-[0.97] ${addState === "failed" ? "bg-red-500 text-white" : "bg-white text-black hover:bg-neutral-200"}`,
85410
+ className: `flex items-center gap-1 px-3 py-1.5 rounded-md text-[10px] font-semibold transition-colors active:scale-[0.97] ${addState === "failed" ? "bg-danger text-on-danger" : "bg-white text-black hover:bg-white/85"}`,
85471
85411
  children: [
85472
85412
  /* @__PURE__ */ jsx201(
85473
85413
  "svg",
@@ -85491,7 +85431,7 @@ function BlockCard({
85491
85431
  type: "button",
85492
85432
  onClick: handleShowPrompt,
85493
85433
  title: "Generate a prompt to paste into your AI agent",
85494
- className: `flex items-center gap-1.5 px-3 ${onAdd ? "py-1" : "py-1.5"} rounded-md transition-colors active:scale-[0.97] ${onAdd ? "bg-white/15 text-white/90 hover:bg-white/25 text-[9px]" : "bg-white text-black hover:bg-neutral-200 text-[10px] font-semibold"}`,
85434
+ className: `flex items-center gap-1.5 px-3 ${onAdd ? "py-1" : "py-1.5"} rounded-md transition-colors active:scale-[0.97] ${onAdd ? "bg-white/15 text-white/90 hover:bg-white/25 text-[9px]" : "bg-text-0 text-bg-0 hover:bg-text-2 text-[10px] font-semibold"}`,
85495
85435
  children: [
85496
85436
  /* @__PURE__ */ jsxs159(
85497
85437
  "svg",
@@ -85534,7 +85474,7 @@ function BlockCard({
85534
85474
  }
85535
85475
 
85536
85476
  // src/components/sidebar/CompositionsTab.tsx
85537
- import { memo as memo43, useCallback as useCallback163, useEffect as useEffect136, useRef as useRef169, useState as useState132 } from "react";
85477
+ import { memo as memo43, useCallback as useCallback163, useEffect as useEffect136, useLayoutEffect as useLayoutEffect12, useMemo as useMemo80, useRef as useRef169, useState as useState132 } from "react";
85538
85478
  import { jsx as jsx202, jsxs as jsxs160 } from "react/jsx-runtime";
85539
85479
  var DEFAULT_PREVIEW_STAGE = { width: 1920, height: 1080 };
85540
85480
  var CARD_W = 80;
@@ -85597,6 +85537,34 @@ function syncIframePlayback(iframe, shouldPlay) {
85597
85537
  return false;
85598
85538
  }
85599
85539
  }
85540
+ var imageUrlOf = (snapshot3) => snapshot3.status === "ready" && snapshot3.value.kind === "image" ? snapshot3.value.url : null;
85541
+ function useLastFrame(request, snapshot3) {
85542
+ const current = imageUrlOf(snapshot3);
85543
+ const [kept, setKept] = useState132(null);
85544
+ if (request && current && kept?.request !== request) setKept({ request, url: current });
85545
+ useLayoutEffect12(() => {
85546
+ if (!kept || kept.request === request) return;
85547
+ const lease = thumbnailScheduler.acquire(kept.request, () => {
85548
+ });
85549
+ return () => lease.release();
85550
+ }, [kept, request]);
85551
+ return current ?? kept?.url ?? null;
85552
+ }
85553
+ function useNearViewport() {
85554
+ const [element, setElement] = useState132(null);
85555
+ const [near2, setNear] = useState132(false);
85556
+ useEffect136(() => {
85557
+ if (!element || near2) return;
85558
+ if (typeof IntersectionObserver === "undefined") return setNear(true);
85559
+ const observer = new IntersectionObserver(
85560
+ (entries) => entries.some((entry2) => entry2.isIntersecting) && setNear(true),
85561
+ { root: element.closest("[data-composition-list]"), rootMargin: "200px" }
85562
+ );
85563
+ observer.observe(element);
85564
+ return () => observer.disconnect();
85565
+ }, [element, near2]);
85566
+ return [setElement, near2];
85567
+ }
85600
85568
  function CompCard({
85601
85569
  projectId,
85602
85570
  comp,
@@ -85613,7 +85581,6 @@ function CompCard({
85613
85581
  const [hovered, setHovered] = useState132(false);
85614
85582
  const [stageSize, setStageSize] = useState132(DEFAULT_PREVIEW_STAGE);
85615
85583
  const [livePreviewLoaded, setLivePreviewLoaded] = useState132(false);
85616
- const [failedThumbnailUrl, setFailedThumbnailUrl] = useState132(null);
85617
85584
  const iframeRef = useRef169(null);
85618
85585
  const hoverTimer = useRef169(null);
85619
85586
  const syncTimer = useRef169(null);
@@ -85647,7 +85614,18 @@ function CompCard({
85647
85614
  const name = comp.replace(/^compositions\//, "").replace(/\.html$/, "");
85648
85615
  const previewUrl = compositionPreviewUrl(projectId, comp);
85649
85616
  const thumbnailUrl2 = compositionCardThumbnailUrl(projectId, comp, contentRevision);
85650
- const thumbnailFailed = failedThumbnailUrl === thumbnailUrl2;
85617
+ const [thumbnailBox, nearViewport] = useNearViewport();
85618
+ const timelineSessionEpoch = usePlayerStore((state) => state.timelineSessionEpoch);
85619
+ const thumbnailRequest = useMemo80(
85620
+ () => previewBooted && nearViewport ? compositionThumbnailRequest(thumbnailUrl2, projectId, {
85621
+ sessionEpoch: timelineSessionEpoch,
85622
+ rich: true
85623
+ }) : null,
85624
+ [previewBooted, nearViewport, thumbnailUrl2, projectId, timelineSessionEpoch]
85625
+ );
85626
+ const thumbnail = useThumbnailLease(thumbnailRequest);
85627
+ const frameUrl = useLastFrame(thumbnailRequest, thumbnail);
85628
+ const thumbnailFailed = thumbnail.status === "error";
85651
85629
  const previewScale = resolveCompositionPreviewScale({
85652
85630
  cardWidth: CARD_W,
85653
85631
  cardHeight: CARD_H,
@@ -85697,52 +85675,57 @@ function CompCard({
85697
85675
  onPointerLeave: handleLeave,
85698
85676
  className: `group/card w-full select-none text-left px-2 py-1.5 flex items-center gap-2.5 transition-colors cursor-grab active:cursor-grabbing outline-hidden focus-visible:bg-neutral-800/60 ${isActive ? "bg-studio-accent/10 border-l-2 border-studio-accent" : "border-l-2 border-transparent hover:bg-neutral-800/50"}`,
85699
85677
  children: [
85700
- /* @__PURE__ */ jsxs160("div", { className: "w-20 h-[45px] rounded-sm overflow-hidden bg-neutral-900 shrink-0 relative", children: [
85701
- thumbnailFailed ? /* @__PURE__ */ jsx202("div", { className: "absolute inset-0 flex items-center justify-center px-1 text-center text-[8px] leading-tight text-neutral-600", children: "Preview unavailable" }) : !previewBooted ? null : /* @__PURE__ */ jsx202(
85702
- "img",
85703
- {
85704
- src: thumbnailUrl2,
85705
- alt: "",
85706
- draggable: false,
85707
- loading: "lazy",
85708
- decoding: "async",
85709
- onError: () => setFailedThumbnailUrl(thumbnailUrl2),
85710
- className: `absolute inset-0 h-full w-full object-contain transition-opacity ${livePreviewLoaded ? "opacity-0" : "opacity-100"}`
85711
- }
85712
- ),
85713
- hovered && /* @__PURE__ */ jsx202(
85714
- "iframe",
85715
- {
85716
- ref: iframeRef,
85717
- src: previewUrl,
85718
- sandbox: "allow-scripts allow-same-origin",
85719
- className: "absolute border-none pointer-events-none",
85720
- style: {
85721
- transformOrigin: "0 0",
85722
- width: stageSize.width,
85723
- height: stageSize.height,
85724
- left: thumbnailOffsetX,
85725
- top: thumbnailOffsetY,
85726
- transform: `scale(${previewScale})`
85727
- },
85728
- onLoad: (e) => {
85729
- try {
85730
- const iframe = e.currentTarget;
85731
- const root = iframe.contentDocument?.querySelector("[data-composition-id]");
85732
- const width = Number(root?.getAttribute("data-width")) || DEFAULT_PREVIEW_STAGE.width;
85733
- const height = Number(root?.getAttribute("data-height")) || DEFAULT_PREVIEW_STAGE.height;
85734
- setStageSize({ width, height });
85735
- setLivePreviewLoaded(true);
85736
- requestIframePlaybackSync(true);
85737
- } catch {
85738
- setStageSize(DEFAULT_PREVIEW_STAGE);
85678
+ /* @__PURE__ */ jsxs160(
85679
+ "div",
85680
+ {
85681
+ ref: thumbnailBox,
85682
+ className: "w-20 h-[45px] rounded-sm overflow-hidden bg-neutral-900 shrink-0 relative",
85683
+ children: [
85684
+ thumbnailFailed ? /* @__PURE__ */ jsx202("div", { className: "absolute inset-0 flex items-center justify-center px-1 text-center text-[8px] leading-tight text-neutral-600", children: "Preview unavailable" }) : !frameUrl ? null : /* @__PURE__ */ jsx202(
85685
+ "img",
85686
+ {
85687
+ src: frameUrl,
85688
+ alt: "",
85689
+ draggable: false,
85690
+ decoding: "async",
85691
+ className: `absolute inset-0 h-full w-full object-contain transition-opacity ${livePreviewLoaded ? "opacity-0" : "opacity-100"}`
85739
85692
  }
85740
- },
85741
- title: `${name} preview`,
85742
- tabIndex: -1
85743
- }
85744
- )
85745
- ] }),
85693
+ ),
85694
+ hovered && /* @__PURE__ */ jsx202(
85695
+ "iframe",
85696
+ {
85697
+ ref: iframeRef,
85698
+ src: previewUrl,
85699
+ sandbox: "allow-scripts allow-same-origin",
85700
+ className: "absolute border-none pointer-events-none",
85701
+ style: {
85702
+ transformOrigin: "0 0",
85703
+ width: stageSize.width,
85704
+ height: stageSize.height,
85705
+ left: thumbnailOffsetX,
85706
+ top: thumbnailOffsetY,
85707
+ transform: `scale(${previewScale})`
85708
+ },
85709
+ onLoad: (e) => {
85710
+ try {
85711
+ const iframe = e.currentTarget;
85712
+ const root = iframe.contentDocument?.querySelector("[data-composition-id]");
85713
+ const width = Number(root?.getAttribute("data-width")) || DEFAULT_PREVIEW_STAGE.width;
85714
+ const height = Number(root?.getAttribute("data-height")) || DEFAULT_PREVIEW_STAGE.height;
85715
+ setStageSize({ width, height });
85716
+ setLivePreviewLoaded(true);
85717
+ requestIframePlaybackSync(true);
85718
+ } catch {
85719
+ setStageSize(DEFAULT_PREVIEW_STAGE);
85720
+ }
85721
+ },
85722
+ title: `${name} preview`,
85723
+ tabIndex: -1
85724
+ }
85725
+ )
85726
+ ]
85727
+ }
85728
+ ),
85746
85729
  /* @__PURE__ */ jsxs160(
85747
85730
  "div",
85748
85731
  {
@@ -85764,7 +85747,7 @@ function CompCard({
85764
85747
  "span",
85765
85748
  {
85766
85749
  "aria-label": `${lintInfo.count} lint finding${lintInfo.count === 1 ? "" : "s"}`,
85767
- className: "shrink-0 min-w-[16px] text-center rounded-full bg-amber-500/20 px-1 text-[8px] font-bold text-amber-400",
85750
+ className: "shrink-0 min-w-[16px] text-center rounded-full bg-amber-500/20 px-1 text-[8px] font-bold text-warning-ink",
85768
85751
  children: lintInfo.count
85769
85752
  }
85770
85753
  )
@@ -85783,7 +85766,7 @@ function CompCard({
85783
85766
  event.stopPropagation();
85784
85767
  onAddToTimeline();
85785
85768
  },
85786
- className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-sm text-neutral-600 opacity-0 transition-[color,background-color,opacity] hover:bg-neutral-800 hover:text-studio-accent group-hover/card:opacity-100 group-focus-within/card:opacity-100 focus:opacity-100",
85769
+ className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-sm text-neutral-600 opacity-0 transition-[color,background-color,opacity] hover:bg-neutral-800 hover:text-accent-ink group-hover/card:opacity-100 group-focus-within/card:opacity-100 focus:opacity-100",
85787
85770
  children: /* @__PURE__ */ jsx202("span", { "aria-hidden": "true", children: "+" })
85788
85771
  }
85789
85772
  ),
@@ -85797,7 +85780,7 @@ function CompCard({
85797
85780
  e.stopPropagation();
85798
85781
  onRender();
85799
85782
  },
85800
- className: `flex h-6 w-6 shrink-0 items-center justify-center rounded transition-colors ${isRendering ? "text-neutral-600 cursor-not-allowed" : "text-neutral-600 hover:text-studio-accent hover:bg-neutral-800"}`,
85783
+ className: `flex h-6 w-6 shrink-0 items-center justify-center rounded transition-colors ${isRendering ? "text-neutral-600 cursor-not-allowed" : "text-neutral-600 hover:text-accent-ink hover:bg-neutral-800"}`,
85801
85784
  children: /* @__PURE__ */ jsxs160(
85802
85785
  "svg",
85803
85786
  {
@@ -85839,7 +85822,7 @@ var CompositionsTab = memo43(function CompositionsTab2({
85839
85822
  if (compositions.length === 0) {
85840
85823
  return /* @__PURE__ */ jsx202("div", { className: "flex-1 flex items-center justify-center px-4", children: /* @__PURE__ */ jsx202("p", { className: "text-xs text-neutral-600 text-center", children: "No compositions found" }) });
85841
85824
  }
85842
- return /* @__PURE__ */ jsx202("div", { className: "flex-1 overflow-y-auto", children: compositions.map((comp) => /* @__PURE__ */ jsx202(
85825
+ return /* @__PURE__ */ jsx202("div", { className: "flex-1 overflow-y-auto", "data-composition-list": true, children: compositions.map((comp) => /* @__PURE__ */ jsx202(
85843
85826
  CompCard,
85844
85827
  {
85845
85828
  projectId,
@@ -85885,7 +85868,7 @@ function SidebarLintButton({
85885
85868
  type: "button",
85886
85869
  onClick: onLint,
85887
85870
  disabled: linting,
85888
- className: "w-full flex items-center justify-center gap-1.5 px-2 py-1.5 rounded-md text-[11px] font-medium text-neutral-500 enabled:hover:text-amber-300 enabled:hover:bg-neutral-800 enabled:active:scale-[0.98] transition-colors disabled:opacity-40",
85871
+ className: "w-full flex items-center justify-center gap-1.5 px-2 py-1.5 rounded-md text-[11px] font-medium text-neutral-500 enabled:hover:text-warning-ink enabled:hover:bg-neutral-800 enabled:active:scale-[0.98] transition-colors disabled:opacity-40",
85889
85872
  children: [
85890
85873
  /* @__PURE__ */ jsxs161(
85891
85874
  "svg",
@@ -85908,7 +85891,7 @@ function SidebarLintButton({
85908
85891
  {
85909
85892
  "data-lint-badge": hasError ? "error" : "warning",
85910
85893
  style: hasError ? { animationIterationCount: ERROR_PULSES_BEFORE_IDLE } : void 0,
85911
- className: hasError ? "ml-1 min-w-[16px] rounded-full bg-panel-danger/25 px-1 text-[9px] font-bold text-panel-danger animate-pulse motion-reduce:animate-none" : "ml-1 min-w-[16px] rounded-full bg-amber-500/20 px-1 text-[9px] font-bold text-amber-400",
85894
+ className: hasError ? "ml-1 min-w-[16px] rounded-full bg-danger px-1 text-[9px] font-bold text-on-danger animate-pulse motion-reduce:animate-none" : "ml-1 min-w-[16px] rounded-full bg-amber-500/20 px-1 text-[9px] font-bold text-warning-ink",
85912
85895
  children: [
85913
85896
  findingCount,
85914
85897
  /* @__PURE__ */ jsx204("span", { className: "sr-only", children: hasError ? " lint findings, including errors" : " lint findings, warnings only" })
@@ -86646,7 +86629,7 @@ var LayersPanel = memo44(function LayersPanel2() {
86646
86629
  handleSelectLayer(layer);
86647
86630
  }
86648
86631
  },
86649
- className: `group flex w-full items-center gap-1.5 px-2 py-1 text-left transition-colors ${isDragged ? "opacity-40" : selected ? "bg-panel-accent/14 text-panel-accent" : "text-panel-text-2 hover:bg-panel-hover/40 hover:text-panel-text-1"} ${dragKey ? "cursor-grabbing" : "cursor-pointer"}`,
86632
+ className: `group flex w-full items-center gap-1.5 px-2 py-1 text-left transition-colors ${isDragged ? "opacity-40" : selected ? "bg-panel-accent/14 text-accent-ink" : "text-panel-text-2 hover:bg-panel-hover/40 hover:text-panel-text-1"} ${dragKey ? "cursor-grabbing" : "cursor-pointer"}`,
86650
86633
  style: { paddingLeft: 8 + layer.depth * 16 },
86651
86634
  title: draggable ? layer.element.hasAttribute("data-hf-group") ? "Double-click to enter group" : void 0 : "This layer can't be reordered",
86652
86635
  children: [
@@ -86674,7 +86657,7 @@ var LayersPanel = memo44(function LayersPanel2() {
86674
86657
  /* @__PURE__ */ jsx206(
86675
86658
  "span",
86676
86659
  {
86677
- className: `flex h-5 w-5 shrink-0 items-center justify-center rounded text-[8px] font-bold uppercase ${selected ? "bg-panel-accent/18 text-panel-accent" : isCompHost ? "bg-panel-accent/40 text-panel-accent" : "bg-panel-hover text-panel-text-4"}`,
86660
+ className: `flex h-5 w-5 shrink-0 items-center justify-center rounded text-[8px] font-bold uppercase ${selected ? "bg-panel-accent/18 text-accent-ink" : isCompHost ? "bg-on text-accent-ink" : "bg-panel-hover text-panel-text-4"}`,
86678
86661
  children: getTagBadge(layer.tagName)
86679
86662
  }
86680
86663
  ),
@@ -86955,7 +86938,7 @@ var CaptionAnimationPanel = memo45(function CaptionAnimationPanel2() {
86955
86938
  }
86956
86939
  const gated = !ANIMATION_PIPELINE_WIRED;
86957
86940
  return /* @__PURE__ */ jsxs165("div", { className: "flex flex-col h-full min-h-0", children: [
86958
- gated && /* @__PURE__ */ jsx208("div", { className: "shrink-0 mx-3 mt-2 px-2 py-1.5 rounded-sm border border-amber-500/30 bg-amber-500/10", children: /* @__PURE__ */ jsx208("p", { className: "text-2xs text-amber-300/90 leading-snug", children: "Animation editing isn't applied to playback or saved yet, so these controls are disabled." }) }),
86941
+ gated && /* @__PURE__ */ jsx208("div", { className: "shrink-0 mx-3 mt-2 px-2 py-1.5 rounded-sm border border-amber-500/30 bg-amber-500/10", children: /* @__PURE__ */ jsx208("p", { className: "text-2xs text-warning-ink leading-snug", children: "Animation editing isn't applied to playback or saved yet, so these controls are disabled." }) }),
86959
86942
  /* @__PURE__ */ jsxs165("div", { className: "flex-1 overflow-y-auto px-3 py-2", children: [
86960
86943
  /* @__PURE__ */ jsx208(
86961
86944
  AnimationPhase,
@@ -86996,7 +86979,7 @@ var CaptionAnimationPanel = memo45(function CaptionAnimationPanel2() {
86996
86979
  onClick: handleApplyToAll,
86997
86980
  disabled: gated,
86998
86981
  title: gated ? "Disabled until animation editing is applied to playback" : void 0,
86999
- className: "w-full py-1.5 rounded-sm border border-neutral-700 text-2xs text-neutral-300 hover:border-studio-accent/50 hover:text-studio-accent transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:border-neutral-700 disabled:hover:text-neutral-300",
86982
+ className: "w-full py-1.5 rounded-sm border border-neutral-700 text-2xs text-neutral-300 hover:border-studio-accent/50 hover:text-accent-ink transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:border-neutral-700 disabled:hover:text-neutral-300",
87000
86983
  children: "Apply to all groups"
87001
86984
  }
87002
86985
  ) })
@@ -87157,7 +87140,7 @@ var CaptionPropertyPanel = memo46(function CaptionPropertyPanel2({
87157
87140
  onClick: () => setActiveTab("style"),
87158
87141
  className: [
87159
87142
  "flex-1 py-0.5 rounded-sm text-2xs font-medium transition-colors",
87160
- activeTab === "style" ? "bg-studio-accent/20 text-studio-accent border border-studio-accent/50" : "text-neutral-500 border border-neutral-800 hover:text-neutral-300 hover:border-neutral-600"
87143
+ activeTab === "style" ? "bg-studio-accent/20 text-accent-ink border border-studio-accent/50" : "text-neutral-500 border border-neutral-800 hover:text-neutral-300 hover:border-neutral-600"
87161
87144
  ].join(" "),
87162
87145
  children: "Style"
87163
87146
  }
@@ -87171,7 +87154,7 @@ var CaptionPropertyPanel = memo46(function CaptionPropertyPanel2({
87171
87154
  onClick: () => setActiveTab("animation"),
87172
87155
  className: [
87173
87156
  "flex-1 py-0.5 rounded-sm text-2xs font-medium transition-colors",
87174
- activeTab === "animation" ? "bg-studio-accent/20 text-studio-accent border border-studio-accent/50" : "text-neutral-500 border border-neutral-800 hover:text-neutral-300 hover:border-neutral-600"
87157
+ activeTab === "animation" ? "bg-studio-accent/20 text-accent-ink border border-studio-accent/50" : "text-neutral-500 border border-neutral-800 hover:text-neutral-300 hover:border-neutral-600"
87175
87158
  ].join(" "),
87176
87159
  children: "Animation"
87177
87160
  }
@@ -87362,7 +87345,7 @@ var BlockParamsPanel = memo47(function BlockParamsPanel2({
87362
87345
  /* @__PURE__ */ jsxs167("div", { className: "flex-1 overflow-y-auto p-3 space-y-3", children: [
87363
87346
  /* @__PURE__ */ jsx210("div", { className: "text-[9px] font-medium text-neutral-500 uppercase tracking-wider", children: "Parameters" }),
87364
87347
  params.length === 0 && /* @__PURE__ */ jsx210("div", { className: "text-[10px] text-neutral-500", children: "This block has no editable parameters." }),
87365
- !fileManager && params.length > 0 && /* @__PURE__ */ jsx210("div", { className: "text-[10px] text-amber-400/90", children: "Block params can't be edited here \u2014 no project file access." }),
87348
+ !fileManager && params.length > 0 && /* @__PURE__ */ jsx210("div", { className: "text-[10px] text-warning-ink", children: "Block params can't be edited here \u2014 no project file access." }),
87366
87349
  params.map((param) => /* @__PURE__ */ jsx210(
87367
87350
  ParamControl,
87368
87351
  {
@@ -87374,11 +87357,11 @@ var BlockParamsPanel = memo47(function BlockParamsPanel2({
87374
87357
  param.key
87375
87358
  )),
87376
87359
  commitState.tone === "saving" && /* @__PURE__ */ jsx210("div", { className: "text-[10px] text-neutral-500", role: "status", children: "Saving\u2026" }),
87377
- commitState.tone === "saved" && /* @__PURE__ */ jsxs167("div", { className: "text-[10px] text-emerald-500/90", role: "status", children: [
87360
+ commitState.tone === "saved" && /* @__PURE__ */ jsxs167("div", { className: "text-[10px] text-accent-ink", role: "status", children: [
87378
87361
  "Saved to ",
87379
87362
  compositionPath
87380
87363
  ] }),
87381
- commitState.tone === "error" && /* @__PURE__ */ jsx210("div", { className: "text-[10px] text-red-400", role: "alert", children: commitState.message })
87364
+ commitState.tone === "error" && /* @__PURE__ */ jsx210("div", { className: "text-[10px] text-danger-ink", role: "alert", children: commitState.message })
87382
87365
  ] })
87383
87366
  ] });
87384
87367
  });
@@ -87460,7 +87443,7 @@ function ParamControl({
87460
87443
  import { memo as memo51 } from "react";
87461
87444
 
87462
87445
  // src/components/renders/RenderQueue.tsx
87463
- import { memo as memo50, useState as useState140, useRef as useRef175, useEffect as useEffect141, useLayoutEffect as useLayoutEffect12, useId as useId5 } from "react";
87446
+ import { memo as memo50, useState as useState140, useRef as useRef175, useEffect as useEffect141, useLayoutEffect as useLayoutEffect13, useId as useId5 } from "react";
87464
87447
  import { createPortal as createPortal10 } from "react-dom";
87465
87448
  import { CANVAS_DIMENSIONS } from "@hyperframes/parsers";
87466
87449
 
@@ -87552,7 +87535,7 @@ var RenderQueueItem = memo48(function RenderQueueItem2({
87552
87535
  )
87553
87536
  ] }),
87554
87537
  isRendering && /* @__PURE__ */ jsx211("div", { className: "w-full h-full flex items-center justify-center", children: /* @__PURE__ */ jsx211("div", { className: "w-2 h-2 rounded-full bg-accent animate-pulse motion-reduce:animate-none" }) }),
87555
- job.status === "failed" && /* @__PURE__ */ jsx211("div", { className: "w-full h-full flex items-center justify-center", children: /* @__PURE__ */ jsx211("div", { className: "w-2 h-2 rounded-full bg-danger" }) }),
87538
+ job.status === "failed" && /* @__PURE__ */ jsx211("div", { className: "w-full h-full flex items-center justify-center", children: /* @__PURE__ */ jsx211("div", { className: "w-2 h-2 rounded-full bg-danger-ink" }) }),
87556
87539
  job.status === "cancelled" && /* @__PURE__ */ jsx211("div", { className: "w-full h-full flex items-center justify-center", children: /* @__PURE__ */ jsx211("div", { className: "w-2 h-2 rounded-full bg-text-5" }) })
87557
87540
  ]
87558
87541
  }
@@ -87565,7 +87548,7 @@ var RenderQueueItem = memo48(function RenderQueueItem2({
87565
87548
  isRendering && /* @__PURE__ */ jsxs168("div", { className: "mt-1", children: [
87566
87549
  /* @__PURE__ */ jsxs168("div", { className: "flex items-center justify-between mb-0.5", children: [
87567
87550
  /* @__PURE__ */ jsx211("span", { className: "text-step-9 text-text-4", children: job.stage || "Rendering" }),
87568
- /* @__PURE__ */ jsxs168("span", { className: "text-step-9 font-mono text-accent", children: [
87551
+ /* @__PURE__ */ jsxs168("span", { className: "text-step-9 font-mono text-accent-ink", children: [
87569
87552
  job.progress,
87570
87553
  "%"
87571
87554
  ] })
@@ -87589,7 +87572,7 @@ var RenderQueueItem = memo48(function RenderQueueItem2({
87589
87572
  }
87590
87573
  )
87591
87574
  ] }),
87592
- job.status === "failed" && job.error && /* @__PURE__ */ jsx211("span", { className: "text-step-9 text-danger mt-0.5 block", children: job.error }),
87575
+ job.status === "failed" && job.error && /* @__PURE__ */ jsx211("span", { className: "text-step-9 text-danger-ink mt-0.5 block", children: job.error }),
87593
87576
  job.status === "cancelled" && /* @__PURE__ */ jsx211("span", { className: "text-step-9 text-text-4 mt-0.5 block", children: "Cancelled" }),
87594
87577
  !isRendering && /* @__PURE__ */ jsx211("span", { className: "text-step-9 text-text-5", children: formatTimeAgo(job.createdAt) })
87595
87578
  ] }),
@@ -87728,17 +87711,17 @@ var FfmpegRequiredNotice = memo49(function FfmpegRequiredNotice2({
87728
87711
  className: "flex flex-col gap-2 rounded-xl border border-amber-500/30 bg-amber-500/10 p-2.5",
87729
87712
  children: [
87730
87713
  /* @__PURE__ */ jsxs169("div", { className: "flex flex-col gap-0.5", children: [
87731
- /* @__PURE__ */ jsx212("span", { className: "text-[11px] font-semibold text-amber-300", children: status.title ?? "FFmpeg not found" }),
87714
+ /* @__PURE__ */ jsx212("span", { className: "text-[11px] font-semibold text-warning-ink", children: status.title ?? "FFmpeg not found" }),
87732
87715
  /* @__PURE__ */ jsx212("span", { className: "text-[10px] leading-snug text-pretty text-panel-text-2", children: status.detail ?? "FFmpeg is required to encode video." })
87733
87716
  ] }),
87734
87717
  status.command ? /* @__PURE__ */ jsxs169("div", { className: "flex items-center gap-1.5", children: [
87735
- /* @__PURE__ */ jsx212("code", { className: "flex-1 overflow-x-auto whitespace-nowrap rounded-xs bg-black/40 px-2 py-1 text-[10px] text-panel-text-2", children: status.command }),
87718
+ /* @__PURE__ */ jsx212("code", { className: "flex-1 overflow-x-auto whitespace-nowrap rounded-xs bg-input px-2 py-1 text-[10px] text-panel-text-2", children: status.command }),
87736
87719
  /* @__PURE__ */ jsx212(
87737
87720
  "button",
87738
87721
  {
87739
87722
  type: "button",
87740
87723
  onClick: () => void copy(status.command ?? ""),
87741
- className: `h-6 w-14 shrink-0 rounded-xs border border-amber-500/30 text-[10px] font-medium text-amber-200 transition-colors hover:bg-amber-500/20 active:scale-[0.98] ${FOCUS_RING}`,
87724
+ className: `h-6 w-14 shrink-0 rounded-xs border border-amber-500/30 text-[10px] font-medium text-warning-ink transition-colors hover:bg-amber-500/20 active:scale-[0.98] ${FOCUS_RING}`,
87742
87725
  children: copied ? "Copied" : "Copy"
87743
87726
  }
87744
87727
  )
@@ -87750,7 +87733,7 @@ var FfmpegRequiredNotice = memo49(function FfmpegRequiredNotice2({
87750
87733
  type: "button",
87751
87734
  onClick: onRecheck,
87752
87735
  disabled: checking,
87753
- className: `rounded-xs py-0.5 text-[10px] font-medium text-amber-200 underline-offset-2 transition-colors hover:underline disabled:opacity-50 ${FOCUS_RING}`,
87736
+ className: `rounded-xs py-0.5 text-[10px] font-medium text-warning-ink underline-offset-2 transition-colors hover:underline disabled:opacity-50 ${FOCUS_RING}`,
87754
87737
  children: checking ? "Checking\u2026" : "Recheck"
87755
87738
  }
87756
87739
  ),
@@ -87845,7 +87828,7 @@ function FormatInfoTooltip({ format }) {
87845
87828
  timeoutRef.current = setTimeout(() => setOpen(false), 120);
87846
87829
  };
87847
87830
  useEffect141(() => () => clearTimeout(timeoutRef.current), []);
87848
- useLayoutEffect12(() => {
87831
+ useLayoutEffect13(() => {
87849
87832
  if (!open) return;
87850
87833
  const el = triggerRef.current;
87851
87834
  if (!el) return;
@@ -88111,7 +88094,7 @@ var RenderQueue = memo50(function RenderQueue2({
88111
88094
  role: "alert",
88112
88095
  className: "flex items-start justify-between gap-2 px-3 py-2 border-b border-border bg-danger/10",
88113
88096
  children: [
88114
- /* @__PURE__ */ jsx213("span", { className: "text-step-10 text-danger", children: actionError }),
88097
+ /* @__PURE__ */ jsx213("span", { className: "text-step-10 text-danger-ink", children: actionError }),
88115
88098
  onDismissActionError && /* @__PURE__ */ jsx213(
88116
88099
  IconButton,
88117
88100
  {
@@ -88139,7 +88122,7 @@ var RenderQueue = memo50(function RenderQueue2({
88139
88122
  }
88140
88123
  ),
88141
88124
  /* @__PURE__ */ jsx213("div", { ref: listRef, className: "flex-1 overflow-y-auto", children: loadError && jobs.length === 0 ? /* @__PURE__ */ jsxs170("div", { className: "flex flex-col items-center justify-center h-full px-4 gap-2", role: "alert", children: [
88142
- /* @__PURE__ */ jsx213("p", { className: "text-step-10 text-danger text-center", children: loadError }),
88125
+ /* @__PURE__ */ jsx213("p", { className: "text-step-10 text-danger-ink text-center", children: loadError }),
88143
88126
  onRetryLoad && /* @__PURE__ */ jsx213(Button, { size: "sm", variant: "secondary", onClick: onRetryLoad, children: "Retry" })
88144
88127
  ] }) : jobs.length === 0 ? /* @__PURE__ */ jsxs170("div", { className: "flex flex-col items-center justify-center h-full px-4 gap-2", children: [
88145
88128
  /* @__PURE__ */ jsxs170(
@@ -88288,7 +88271,7 @@ function SlideList({
88288
88271
  role: "button",
88289
88272
  tabIndex: 0,
88290
88273
  "aria-pressed": isSelected,
88291
- className: `flex items-center gap-2 px-3 py-1.5 rounded cursor-pointer text-[11px] transition-colors ${isSelected ? "bg-studio-accent/20 text-white" : "hover:bg-neutral-800/60 text-neutral-300"}`,
88274
+ className: `flex items-center gap-2 px-3 py-1.5 rounded cursor-pointer text-[11px] transition-colors ${isSelected ? "bg-on text-text-0" : "hover:bg-neutral-800/60 text-neutral-300"}`,
88292
88275
  onClick: () => onSelect(scene.id),
88293
88276
  onKeyDown: (e) => {
88294
88277
  if (e.key === "Enter" || e.key === " ") {
@@ -88317,7 +88300,7 @@ function SlideList({
88317
88300
  "aria-label": "Move slide up",
88318
88301
  title: "Move up",
88319
88302
  disabled: slideIndex <= 0,
88320
- className: "px-1 py-0.5 text-[10px] text-neutral-400 enabled:hover:text-white enabled:active:scale-[0.95] disabled:opacity-30 disabled:cursor-not-allowed",
88303
+ className: "px-1 py-0.5 text-[10px] text-neutral-400 enabled:hover:text-text-0 enabled:active:scale-[0.95] disabled:opacity-30 disabled:cursor-not-allowed",
88321
88304
  onClick: (e) => {
88322
88305
  e.stopPropagation();
88323
88306
  onReorder(scene.id, "up");
@@ -88332,7 +88315,7 @@ function SlideList({
88332
88315
  "aria-label": "Move slide down",
88333
88316
  title: "Move down",
88334
88317
  disabled: slideIndex === slides.length - 1,
88335
- className: "px-1 py-0.5 text-[10px] text-neutral-400 enabled:hover:text-white enabled:active:scale-[0.95] disabled:opacity-30 disabled:cursor-not-allowed",
88318
+ className: "px-1 py-0.5 text-[10px] text-neutral-400 enabled:hover:text-text-0 enabled:active:scale-[0.95] disabled:opacity-30 disabled:cursor-not-allowed",
88336
88319
  onClick: (e) => {
88337
88320
  e.stopPropagation();
88338
88321
  onReorder(scene.id, "down");
@@ -88368,7 +88351,7 @@ function SlideInspector({
88368
88351
  /* @__PURE__ */ jsx215(
88369
88352
  "textarea",
88370
88353
  {
88371
- className: "bg-neutral-800 border border-neutral-700 rounded-sm px-2 py-1.5 text-[11px] text-white resize-none placeholder-neutral-600 focus:border-studio-accent/60 focus:outline-hidden",
88354
+ className: "bg-neutral-800 border border-neutral-700 rounded-sm px-2 py-1.5 text-[11px] text-text-0 resize-none placeholder-neutral-600 focus:border-studio-accent/60 focus:outline-hidden",
88372
88355
  rows: 3,
88373
88356
  placeholder: "Speaker notes or script...",
88374
88357
  value: slide?.notes ?? "",
@@ -88383,7 +88366,7 @@ function SlideInspector({
88383
88366
  "button",
88384
88367
  {
88385
88368
  type: "button",
88386
- className: "text-[10px] px-2 py-0.5 rounded-sm bg-neutral-700 hover:bg-neutral-600 text-neutral-200 transition-colors",
88369
+ className: "text-[10px] px-2 py-0.5 rounded-sm bg-hover hover:bg-press text-neutral-200 transition-colors",
88387
88370
  onClick: onMarkFragment,
88388
88371
  title: `Mark ${currentTime.toFixed(2)}s as hold-point`,
88389
88372
  children: [
@@ -88406,7 +88389,7 @@ function SlideInspector({
88406
88389
  {
88407
88390
  type: "button",
88408
88391
  "aria-label": `Remove fragment at ${t.toFixed(2)}s`,
88409
- className: "text-neutral-400 hover:text-red-400 transition-colors",
88392
+ className: "text-neutral-400 hover:text-danger-ink transition-colors",
88410
88393
  onClick: () => onRemoveFragment(t),
88411
88394
  children: "\xD7"
88412
88395
  }
@@ -88444,7 +88427,7 @@ function BranchTree({
88444
88427
  {
88445
88428
  id: inputId,
88446
88429
  type: "text",
88447
- className: "flex-1 bg-neutral-800 border border-neutral-700 rounded-sm px-2 py-1 text-[11px] text-white placeholder-neutral-600 focus:border-studio-accent/60 focus:outline-hidden",
88430
+ className: "flex-1 bg-neutral-800 border border-neutral-700 rounded-sm px-2 py-1 text-[11px] text-text-0 placeholder-neutral-600 focus:border-studio-accent/60 focus:outline-hidden",
88448
88431
  placeholder: "New branch name...",
88449
88432
  value: newLabel,
88450
88433
  onChange: (e) => setNewLabel(e.target.value),
@@ -88458,7 +88441,7 @@ function BranchTree({
88458
88441
  "button",
88459
88442
  {
88460
88443
  type: "button",
88461
- className: "px-2 py-1 rounded-sm bg-neutral-700 hover:bg-neutral-600 text-[11px] text-neutral-200 transition-colors shrink-0",
88444
+ className: "px-2 py-1 rounded-sm bg-hover hover:bg-press text-[11px] text-neutral-200 transition-colors shrink-0",
88462
88445
  onClick: handleCreate,
88463
88446
  children: "Add"
88464
88447
  }
@@ -88503,7 +88486,7 @@ function BranchItem({
88503
88486
  editing ? /* @__PURE__ */ jsx215(
88504
88487
  "input",
88505
88488
  {
88506
- className: "flex-1 bg-neutral-800 border border-neutral-600 rounded-sm px-1.5 py-0.5 text-[11px] text-white focus:border-studio-accent/60 focus:outline-hidden",
88489
+ className: "flex-1 bg-neutral-800 border border-neutral-600 rounded-sm px-1.5 py-0.5 text-[11px] text-text-0 focus:border-studio-accent/60 focus:outline-hidden",
88507
88490
  value: draft,
88508
88491
  autoFocus: true,
88509
88492
  onChange: (e) => setDraft(e.target.value),
@@ -88519,7 +88502,7 @@ function BranchItem({
88519
88502
  {
88520
88503
  role: "button",
88521
88504
  tabIndex: 0,
88522
- className: "flex-1 text-[11px] text-white font-medium truncate cursor-pointer hover:text-neutral-300",
88505
+ className: "flex-1 text-[11px] text-text-0 font-medium truncate cursor-pointer hover:text-neutral-300",
88523
88506
  title: "Click to rename",
88524
88507
  onClick: () => setEditing(true),
88525
88508
  onKeyDown: (e) => {
@@ -88536,14 +88519,14 @@ function BranchItem({
88536
88519
  {
88537
88520
  type: "button",
88538
88521
  "aria-label": `Delete branch ${seq.label}`,
88539
- className: "text-[10px] text-neutral-500 hover:text-red-400 active:scale-[0.95] transition-colors px-1",
88522
+ className: "text-[10px] text-neutral-500 hover:text-danger-ink active:scale-[0.95] transition-colors px-1",
88540
88523
  onClick: () => setConfirmingDelete(true),
88541
88524
  children: "\u2715"
88542
88525
  }
88543
88526
  )
88544
88527
  ] }),
88545
- confirmingDelete && /* @__PURE__ */ jsxs171("div", { className: "px-2 py-1.5 bg-red-950/30 border-l-2 border-red-500 flex flex-col gap-1 rounded-xs", children: [
88546
- /* @__PURE__ */ jsxs171("span", { className: "text-[10px] text-red-400", children: [
88528
+ confirmingDelete && /* @__PURE__ */ jsxs171("div", { className: "px-2 py-1.5 bg-danger/15 border-l-2 border-red-500 flex flex-col gap-1 rounded-xs", children: [
88529
+ /* @__PURE__ */ jsxs171("span", { className: "text-[10px] text-danger-ink", children: [
88547
88530
  "Delete branch \u201C",
88548
88531
  seq.label,
88549
88532
  "\u201D",
@@ -88559,7 +88542,7 @@ function BranchItem({
88559
88542
  setConfirmingDelete(false);
88560
88543
  onDelete(seq.id);
88561
88544
  },
88562
- className: "px-2 py-0.5 text-[10px] rounded-sm bg-red-600 text-white hover:bg-red-500 active:bg-red-700 transition-colors",
88545
+ className: "px-2 py-0.5 text-[10px] rounded-sm bg-danger text-on-danger hover:brightness-95 active:brightness-90 transition-colors",
88563
88546
  children: "Delete"
88564
88547
  }
88565
88548
  ),
@@ -88598,7 +88581,7 @@ function BranchItem({
88598
88581
  {
88599
88582
  type: "button",
88600
88583
  "aria-pressed": isSelected,
88601
- className: `flex-1 text-left truncate transition-colors hover:text-neutral-200 ${isSelected ? "text-white" : "text-neutral-400"}`,
88584
+ className: `flex-1 text-left truncate transition-colors hover:text-neutral-200 ${isSelected ? "text-text-0" : "text-neutral-400"}`,
88602
88585
  onClick: () => onSelectBranchSlide(seq.id, scene.id),
88603
88586
  children: scene.label || scene.id
88604
88587
  }
@@ -88650,7 +88633,7 @@ function HotspotTool({
88650
88633
  "input",
88651
88634
  {
88652
88635
  type: "text",
88653
- className: "bg-neutral-800 border border-neutral-700 rounded-sm px-2 py-1 text-[11px] text-white placeholder-neutral-600 focus:border-studio-accent/60 focus:outline-hidden",
88636
+ className: "bg-neutral-800 border border-neutral-700 rounded-sm px-2 py-1 text-[11px] text-text-0 placeholder-neutral-600 focus:border-studio-accent/60 focus:outline-hidden",
88654
88637
  placeholder: "Button label...",
88655
88638
  value: hotspotLabel,
88656
88639
  onChange: (e) => setHotspotLabel(e.target.value),
@@ -88661,7 +88644,7 @@ function HotspotTool({
88661
88644
  /* @__PURE__ */ jsxs171(
88662
88645
  "select",
88663
88646
  {
88664
- className: "bg-neutral-800 border border-neutral-700 rounded-sm px-2 py-1 text-[11px] text-white focus:border-studio-accent/60 focus:outline-hidden",
88647
+ className: "bg-neutral-800 border border-neutral-700 rounded-sm px-2 py-1 text-[11px] text-text-0 focus:border-studio-accent/60 focus:outline-hidden",
88665
88648
  value: targetSequenceId,
88666
88649
  onChange: (e) => setTargetSequenceId(e.target.value),
88667
88650
  "aria-label": "Target branch sequence",
@@ -88677,7 +88660,7 @@ function HotspotTool({
88677
88660
  type: "button",
88678
88661
  disabled: !elementKey3 || !targetSequenceId,
88679
88662
  title: !elementKey3 ? "Select an element on the canvas first" : !targetSequenceId ? "Choose a target branch first" : void 0,
88680
- className: "px-3 py-1.5 rounded-sm bg-studio-accent/80 enabled:hover:bg-studio-accent enabled:active:scale-[0.98] text-white text-[11px] font-medium transition-colors disabled:opacity-40 disabled:cursor-not-allowed",
88663
+ className: "px-3 py-1.5 rounded-sm bg-accent enabled:hover:bg-accent-hover enabled:active:scale-[0.98] text-on-accent text-[11px] font-medium transition-colors disabled:opacity-40 disabled:cursor-not-allowed",
88681
88664
  onClick: handleMakeHotspot,
88682
88665
  children: "Make hotspot"
88683
88666
  }
@@ -88702,7 +88685,7 @@ function HotspotTool({
88702
88685
  {
88703
88686
  type: "button",
88704
88687
  "aria-label": `Remove hotspot ${h.label}`,
88705
- className: "text-[10px] text-neutral-500 hover:text-red-400 transition-colors",
88688
+ className: "text-[10px] text-neutral-500 hover:text-danger-ink transition-colors",
88706
88689
  onClick: () => onRemoveHotspot(selectedSceneId, h.id),
88707
88690
  children: "\u2715"
88708
88691
  }
@@ -89114,7 +89097,7 @@ function SlideshowPanel({ scenes, onPersist, onPersistNotes }) {
89114
89097
  return /* @__PURE__ */ jsxs172(
89115
89098
  "div",
89116
89099
  {
89117
- className: "flex flex-col h-full overflow-y-auto text-white",
89100
+ className: "flex flex-col h-full overflow-y-auto text-text-0",
89118
89101
  onKeyDown: (e) => {
89119
89102
  if ((e.metaKey || e.ctrlKey) && !e.shiftKey && e.key.toLowerCase() === "z") {
89120
89103
  const target = e.target instanceof HTMLElement ? e.target.tagName : "";
@@ -89129,16 +89112,16 @@ function SlideshowPanel({ scenes, onPersist, onPersistNotes }) {
89129
89112
  "div",
89130
89113
  {
89131
89114
  role: "alert",
89132
- className: "flex items-center justify-between gap-2 px-3 py-2 bg-red-950/40 border-b border-red-500/40",
89115
+ className: "flex items-center justify-between gap-2 px-3 py-2 bg-danger/15 border-b border-red-500/40",
89133
89116
  children: [
89134
- /* @__PURE__ */ jsx216("span", { className: "text-[11px] text-red-300", children: "Changes not saved" }),
89117
+ /* @__PURE__ */ jsx216("span", { className: "text-[11px] text-danger-ink", children: "Changes not saved" }),
89135
89118
  /* @__PURE__ */ jsx216(
89136
89119
  "button",
89137
89120
  {
89138
89121
  type: "button",
89139
89122
  disabled: retrying,
89140
89123
  onClick: handleRetryPersist,
89141
- className: "px-2 py-0.5 text-[10px] rounded-sm bg-red-600 text-white enabled:hover:bg-red-500 enabled:active:scale-[0.97] disabled:opacity-50 transition-colors",
89124
+ className: "px-2 py-0.5 text-[10px] rounded-sm bg-danger text-on-danger enabled:hover:brightness-95 enabled:active:scale-[0.97] disabled:opacity-50 transition-colors",
89142
89125
  children: retrying ? "Retrying\u2026" : "Retry"
89143
89126
  }
89144
89127
  )
@@ -89255,7 +89238,7 @@ function SlideshowPanel({ scenes, onPersist, onPersistNotes }) {
89255
89238
  }
89256
89239
 
89257
89240
  // src/components/panels/VariablesPanel.tsx
89258
- import { memo as memo52, useCallback as useCallback176, useEffect as useEffect144, useMemo as useMemo80, useState as useState146 } from "react";
89241
+ import { memo as memo52, useCallback as useCallback176, useEffect as useEffect144, useMemo as useMemo81, useState as useState146 } from "react";
89259
89242
 
89260
89243
  // src/hooks/useVariablesPersist.ts
89261
89244
  import { useCallback as useCallback173 } from "react";
@@ -89600,7 +89583,7 @@ function DeclarationForm({
89600
89583
  className: VARIABLES_INPUT_CLASS
89601
89584
  }
89602
89585
  ) }),
89603
- error && /* @__PURE__ */ jsx217("p", { className: "text-[10px] text-red-400", children: error }),
89586
+ error && /* @__PURE__ */ jsx217("p", { className: "text-[10px] text-danger-ink", children: error }),
89604
89587
  /* @__PURE__ */ jsxs173("div", { className: "flex items-center justify-end gap-2 pt-1", children: [
89605
89588
  /* @__PURE__ */ jsx217(
89606
89589
  "button",
@@ -89638,7 +89621,7 @@ function RowAction({
89638
89621
  type: "button",
89639
89622
  onClick,
89640
89623
  title,
89641
- className: `h-5 rounded px-1.5 text-[9px] text-neutral-500 hover:bg-neutral-800 ${danger ? "hover:text-red-400" : "hover:text-neutral-200"}`,
89624
+ className: `h-5 rounded px-1.5 text-[9px] text-neutral-500 hover:bg-neutral-800 ${danger ? "hover:text-danger-ink" : "hover:text-neutral-200"}`,
89642
89625
  children: label
89643
89626
  }
89644
89627
  );
@@ -89782,7 +89765,7 @@ function formatIssue(issue) {
89782
89765
  }
89783
89766
  function ValidationStrip({ issues }) {
89784
89767
  if (issues.length === 0) return null;
89785
- return /* @__PURE__ */ jsx220("div", { className: "space-y-1 rounded-lg border border-red-900/60 bg-red-950/30 p-2", children: issues.map((issue) => /* @__PURE__ */ jsx220("p", { className: "text-[10px] text-red-300", children: formatIssue(issue) }, `${issue.kind}:${issue.variableId}`)) });
89768
+ return /* @__PURE__ */ jsx220("div", { className: "space-y-1 rounded-lg border border-danger/40 bg-danger/15 p-2", children: issues.map((issue) => /* @__PURE__ */ jsx220("p", { className: "text-[10px] text-danger-ink", children: formatIssue(issue) }, `${issue.kind}:${issue.variableId}`)) });
89786
89769
  }
89787
89770
  function VariableRow({
89788
89771
  decl,
@@ -89803,7 +89786,7 @@ function VariableRow({
89803
89786
  unused && /* @__PURE__ */ jsx220(
89804
89787
  "span",
89805
89788
  {
89806
- className: "rounded-sm bg-amber-900/40 px-1 py-px text-[8px] text-amber-400",
89789
+ className: "rounded-sm bg-amber-500/15 px-1 py-px text-[8px] text-warning-ink",
89807
89790
  title: "No script reads this variable",
89808
89791
  children: "unused"
89809
89792
  }
@@ -89865,7 +89848,7 @@ function PreviewModeHeader({
89865
89848
  /* @__PURE__ */ jsx220(
89866
89849
  "span",
89867
89850
  {
89868
- className: `rounded-full px-2 py-0.5 text-[9px] font-medium ${hasOverrides ? "bg-studio-accent/20 text-studio-accent" : "bg-neutral-800 text-neutral-500"}`,
89851
+ className: `rounded-full px-2 py-0.5 text-[9px] font-medium ${hasOverrides ? "bg-studio-accent/20 text-accent-ink" : "bg-neutral-800 text-neutral-500"}`,
89869
89852
  children: hasOverrides ? `Previewing ${overrideCount} custom` : "Previewing defaults"
89870
89853
  }
89871
89854
  )
@@ -89951,22 +89934,22 @@ var VariablesPanel = memo52(function VariablesPanel2({
89951
89934
  reloadPreview,
89952
89935
  publishSdkSession
89953
89936
  });
89954
- const declarations = useMemo80(
89937
+ const declarations = useMemo81(
89955
89938
  () => sdkSession?.getVariableDeclarations() ?? [],
89956
89939
  // eslint-disable-next-line react-hooks/exhaustive-deps
89957
89940
  [sdkSession, refreshKey, revision]
89958
89941
  );
89959
- const usage = useMemo80(
89942
+ const usage = useMemo81(
89960
89943
  () => sdkSession?.getVariableUsage() ?? null,
89961
89944
  // eslint-disable-next-line react-hooks/exhaustive-deps
89962
89945
  [sdkSession, refreshKey, revision]
89963
89946
  );
89964
- const issues = useMemo80(
89947
+ const issues = useMemo81(
89965
89948
  () => previewValues && sdkSession ? sdkSession.validateVariableValues(previewValues) : [],
89966
89949
  // eslint-disable-next-line react-hooks/exhaustive-deps
89967
89950
  [sdkSession, previewValues, refreshKey, revision]
89968
89951
  );
89969
- const effectiveValues = useMemo80(
89952
+ const effectiveValues = useMemo81(
89970
89953
  () => sdkSession?.getVariableValues(previewValues ?? void 0) ?? {},
89971
89954
  // eslint-disable-next-line react-hooks/exhaustive-deps
89972
89955
  [sdkSession, previewValues, refreshKey, revision]
@@ -90281,15 +90264,15 @@ function useSlideshowPersist({
90281
90264
  }
90282
90265
 
90283
90266
  // src/hooks/useSlideshowTabState.ts
90284
- import { useMemo as useMemo81 } from "react";
90267
+ import { useMemo as useMemo82 } from "react";
90285
90268
  import { SLIDESHOW_ISLAND_TYPE as SLIDESHOW_ISLAND_TYPE2, slideshowIslandRegex as slideshowIslandRegex2 } from "@hyperframes/core/slideshow";
90286
90269
  function useSlideshowTabState(params) {
90287
90270
  const { editingFileContent, previewIframeRef, refreshKey, slideshowVisible } = params;
90288
- const isSlideshowComposition = useMemo81(() => {
90271
+ const isSlideshowComposition = useMemo82(() => {
90289
90272
  if (!editingFileContent || !editingFileContent.includes(SLIDESHOW_ISLAND_TYPE2)) return false;
90290
90273
  return slideshowIslandRegex2("i").test(editingFileContent);
90291
90274
  }, [editingFileContent]);
90292
- const slideshowScenes = useMemo81(() => {
90275
+ const slideshowScenes = useMemo82(() => {
90293
90276
  try {
90294
90277
  const win = previewIframeRef.current?.contentWindow;
90295
90278
  return (win?.__clipManifest?.scenes ?? []).map((s) => ({
@@ -91308,12 +91291,6 @@ function RippleEditIcon({ size = 16 }) {
91308
91291
  );
91309
91292
  }
91310
91293
 
91311
- // src/components/timelineToolbarStyles.ts
91312
- var flatBtn = "flex h-7 w-7 items-center justify-center rounded-md transition-colors";
91313
- var flatIdle = `${flatBtn} text-neutral-400 hover:bg-white/6 hover:text-neutral-200 active:scale-[0.98]`;
91314
- var flatActive = `${flatBtn} bg-white/8 text-neutral-100 active:scale-[0.98]`;
91315
- var flatDisabled = `${flatBtn} text-neutral-700 cursor-not-allowed`;
91316
-
91317
91294
  // src/components/TimelineHistoryButtons.tsx
91318
91295
  import { Fragment as Fragment62, jsx as jsx225, jsxs as jsxs178 } from "react/jsx-runtime";
91319
91296
  function HistoryButton({ action, can, label, onClick }) {
@@ -91426,7 +91403,7 @@ function TimelineToolPicker({ showSelectAroundPlayhead = true }) {
91426
91403
  shortcut: row.shortcut,
91427
91404
  onClick: row.run,
91428
91405
  "data-active": row.active || void 0,
91429
- className: row.active ? "bg-neutral-800 text-white" : void 0,
91406
+ className: row.active ? "bg-press text-text-0" : void 0,
91430
91407
  children: /* @__PURE__ */ jsxs179("span", { className: "flex items-center gap-2", children: [
91431
91408
  row.icon,
91432
91409
  row.label
@@ -91613,7 +91590,7 @@ function TimelineToolbar({
91613
91590
  disabled: !onToggleKeyframe,
91614
91591
  onClick: onToggleKeyframe,
91615
91592
  "aria-label": keyframePathEndpoint ? "Motion path endpoint" : keyframeIsMotionPath ? keyframeState === "active" ? "Remove motion path waypoint" : keyframeWillExtend ? "Extend motion path to playhead" : "Add motion path waypoint" : keyframeState === "active" ? "Remove keyframe at playhead" : "Add keyframe at playhead",
91616
- className: !onToggleKeyframe ? flatDisabled : `${flatBtn} active:scale-[0.98] hover:bg-white/6 ${keyframeState === "active" ? "text-studio-accent" : keyframeState === "inactive" ? "text-neutral-400 hover:text-studio-accent" : "text-neutral-600 hover:text-neutral-400"}`,
91593
+ className: !onToggleKeyframe ? flatDisabled : `${flatBtn} active:scale-[0.98] hover:bg-hover ${keyframeState === "active" ? "text-accent-ink" : keyframeState === "inactive" ? "text-neutral-400 hover:text-accent-ink" : "text-neutral-600 hover:text-neutral-400"}`,
91617
91594
  children: /* @__PURE__ */ jsx227("svg", { width: "16", height: "16", viewBox: "0 0 10 10", fill: "currentColor", children: keyframeState === "active" ? /* @__PURE__ */ jsx227("path", { d: "M5 0.5L9.5 5L5 9.5L0.5 5Z" }) : /* @__PURE__ */ jsx227(
91618
91595
  "path",
91619
91596
  {
@@ -91638,7 +91615,7 @@ function TimelineToolbar({
91638
91615
  onClick: () => setAutoKeyframeEnabled(!autoKeyframeEnabled),
91639
91616
  "aria-label": "Auto-record manual edits as keyframes",
91640
91617
  "aria-pressed": autoKeyframeEnabled,
91641
- className: `${flatBtn} active:scale-[0.98] hover:bg-white/6 ${autoKeyframeEnabled ? "text-red-400 hover:text-red-300" : "text-neutral-600 hover:text-neutral-400"}`,
91618
+ className: `${flatBtn} active:scale-[0.98] hover:bg-hover ${autoKeyframeEnabled ? "text-danger-ink" : "text-neutral-600 hover:text-neutral-400"}`,
91642
91619
  children: /* @__PURE__ */ jsxs180("svg", { width: "16", height: "16", viewBox: "0 0 10 10", fill: "none", children: [
91643
91620
  /* @__PURE__ */ jsx227("path", { d: "M5 0.7L9.3 5L5 9.3L0.7 5Z", stroke: "currentColor", strokeWidth: "1" }),
91644
91621
  /* @__PURE__ */ jsx227(
@@ -91715,7 +91692,7 @@ function TimelineToolbar({
91715
91692
  onClick: () => {
91716
91693
  if (canAdd) addBeatAtCompositionTime(currentTime);
91717
91694
  },
91718
- className: canAdd ? `${flatBtn} text-neutral-400 hover:bg-white/6 hover:text-[#22c55e] active:scale-[0.98]` : flatDisabled,
91695
+ className: canAdd ? `${flatBtn} text-text-2 hover:bg-hover hover:text-accent-ink active:scale-[0.98]` : flatDisabled,
91719
91696
  children: /* @__PURE__ */ jsx227("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx227(
91720
91697
  "path",
91721
91698
  {
@@ -91744,7 +91721,7 @@ function TimelineToolbar({
91744
91721
  "aria-label": thumbnailsVisible ? "Hide thumbnails \u2014 labels only" : "Show thumbnails \u2014 posters stay visible; richer previews appear on interaction",
91745
91722
  "aria-pressed": thumbnailsVisible,
91746
91723
  onClick: () => setThumbnailMode(thumbnailsVisible ? "hidden" : "adaptive"),
91747
- className: `h-7 px-2 rounded-md text-[11px] font-medium transition-colors ${thumbnailsVisible ? "bg-studio-accent/10 text-studio-accent" : "text-neutral-400 hover:bg-white/6 hover:text-neutral-200"}`,
91724
+ className: `h-7 px-2 rounded-md text-[11px] font-medium transition-colors ${thumbnailsVisible ? "bg-studio-accent/10 text-accent-ink" : "text-neutral-400 hover:bg-hover hover:text-neutral-200"}`,
91748
91725
  children: /* @__PURE__ */ jsx227(Image3, { size: 16, "aria-hidden": "true" })
91749
91726
  }
91750
91727
  )
@@ -91757,7 +91734,7 @@ function TimelineToolbar({
91757
91734
  onClick: () => setZoomMode("fit"),
91758
91735
  "aria-label": "Fit timeline to width",
91759
91736
  "aria-pressed": zoomMode === "fit",
91760
- className: `h-7 px-2 rounded-md text-[11px] font-medium transition-colors ${zoomMode === "fit" ? "bg-studio-accent/10 text-studio-accent" : "text-neutral-400 hover:bg-white/6 hover:text-neutral-200"}`,
91737
+ className: `h-7 px-2 rounded-md text-[11px] font-medium transition-colors ${zoomMode === "fit" ? "bg-studio-accent/10 text-accent-ink" : "text-neutral-400 hover:bg-hover hover:text-neutral-200"}`,
91761
91738
  children: /* @__PURE__ */ jsx227(ArrowsOutLineHorizontal, { size: 16, "aria-hidden": "true" })
91762
91739
  }
91763
91740
  ) }),
@@ -91791,7 +91768,7 @@ function TimelineToolbar({
91791
91768
  timelineSliderToZoomPercent(Number(e.target.value), timelineFitPps)
91792
91769
  );
91793
91770
  },
91794
- className: "mx-1 h-6 w-[96px] cursor-pointer appearance-none bg-transparent [&::-webkit-slider-runnable-track]:h-[2px] [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-neutral-700 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-[10px] [&::-webkit-slider-thumb]:h-[10px] [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:-mt-1 [&::-webkit-slider-thumb]:shadow-[0_0_0_2px_#0a0a0a,0_1px_3px_rgba(0,0,0,0.5)] [&::-webkit-slider-thumb]:cursor-grab [&::-webkit-slider-thumb:active]:cursor-grabbing"
91771
+ className: "mx-1 h-6 w-[96px] cursor-pointer appearance-none bg-transparent [&::-webkit-slider-runnable-track]:h-[2px] [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-neutral-700 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-[10px] [&::-webkit-slider-thumb]:h-[10px] [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-text-0 [&::-webkit-slider-thumb]:-mt-1 [&::-webkit-slider-thumb]:shadow-[0_0_0_2px_#0a0a0a,0_1px_3px_rgba(0,0,0,0.5)] [&::-webkit-slider-thumb]:cursor-grab [&::-webkit-slider-thumb:active]:cursor-grabbing"
91795
91772
  }
91796
91773
  ),
91797
91774
  /* @__PURE__ */ jsx227(Tooltip, { label: "Zoom in", children: /* @__PURE__ */ jsx227(
@@ -92142,7 +92119,7 @@ function StudioApp({ readOnlyPreview = false, readOnlyPreviewReason } = {}) {
92142
92119
  recordEdit: editHistory.recordEdit,
92143
92120
  setRefreshKey
92144
92121
  });
92145
- const masterCompPath = useMemo82(
92122
+ const masterCompPath = useMemo83(
92146
92123
  () => resolveMasterCompositionPath(fileManager.compositions),
92147
92124
  [fileManager.compositions]
92148
92125
  );
@@ -92247,7 +92224,7 @@ function StudioApp({ readOnlyPreview = false, readOnlyPreviewReason } = {}) {
92247
92224
  });
92248
92225
  const dismissBlockParams = useCallback186(() => setActiveBlockParams(null), [setActiveBlockParams]);
92249
92226
  const setRightPanelTab = useDismissingTabSetter(panelLayout.setRightPanelTab, dismissBlockParams);
92250
- const layout = useMemo82(
92227
+ const layout = useMemo83(
92251
92228
  () => ({ ...panelLayout, setRightPanelTab }),
92252
92229
  [panelLayout, setRightPanelTab]
92253
92230
  );
@@ -92399,7 +92376,7 @@ function StudioApp({ readOnlyPreview = false, readOnlyPreviewReason } = {}) {
92399
92376
  });
92400
92377
  handleToggleRecordingRef.current = handleToggleRecording;
92401
92378
  const canvasRectRef = useRef181(null);
92402
- useLayoutEffect13(() => {
92379
+ useLayoutEffect14(() => {
92403
92380
  if (gestureState !== "recording" || !previewIframe) {
92404
92381
  canvasRectRef.current = null;
92405
92382
  return;
@@ -92466,7 +92443,7 @@ function StudioApp({ readOnlyPreview = false, readOnlyPreviewReason } = {}) {
92466
92443
  handlePreviewIframeRef,
92467
92444
  refreshPreviewDocumentVersion
92468
92445
  });
92469
- const timelineToolbar = useMemo82(
92446
+ const timelineToolbar = useMemo83(
92470
92447
  () => /* @__PURE__ */ jsx229(
92471
92448
  TimelineToolbar,
92472
92449
  {
@@ -92983,7 +92960,7 @@ function findElementBlock(html2, elementId2) {
92983
92960
  }
92984
92961
 
92985
92962
  // src/hooks/useDomStyleCommit.ts
92986
- import { useCallback as useCallback188, useMemo as useMemo83, useRef as useRef183, useState as useState151 } from "react";
92963
+ import { useCallback as useCallback188, useMemo as useMemo84, useRef as useRef183, useState as useState151 } from "react";
92987
92964
  var noop = () => {
92988
92965
  };
92989
92966
  function useDomStyleCommit({
@@ -92999,7 +92976,7 @@ function useDomStyleCommit({
92999
92976
  const [queue2] = useState151(createDomEditSaveQueue);
93000
92977
  useMountEffect(() => () => queue2.destroy());
93001
92978
  const versions = useRef183(/* @__PURE__ */ new Map()).current;
93002
- const editHistory = useMemo83(() => ({ recordEdit }), [recordEdit]);
92979
+ const editHistory = useMemo84(() => ({ recordEdit }), [recordEdit]);
93003
92980
  const persistDomEditOperations = useDomEditPersist({
93004
92981
  activeCompPath,
93005
92982
  previewIframeRef: iframeRef,
@@ -93031,7 +93008,7 @@ function useDomStyleCommit({
93031
93008
  }
93032
93009
 
93033
93010
  // src/hooks/useDomGeometryCommit.ts
93034
- import { useCallback as useCallback189, useMemo as useMemo84, useRef as useRef184, useState as useState152 } from "react";
93011
+ import { useCallback as useCallback189, useMemo as useMemo85, useRef as useRef184, useState as useState152 } from "react";
93035
93012
  var noop2 = () => {
93036
93013
  };
93037
93014
  var NO_SELECTED_ANIMATIONS = [];
@@ -93047,7 +93024,7 @@ function useDomGeometryCommit({
93047
93024
  const projectIdRef = useRef184(projectId);
93048
93025
  projectIdRef.current = projectId;
93049
93026
  const pending2 = useRef184(/* @__PURE__ */ new Set()).current;
93050
- const editHistory = useMemo84(() => ({ recordEdit }), [recordEdit]);
93027
+ const editHistory = useMemo85(() => ({ recordEdit }), [recordEdit]);
93051
93028
  const reload = useCallback189(
93052
93029
  () => reloadPreview ? reloadPreview() : iframeRef.current?.contentWindow?.location.reload(),
93053
93030
  [reloadPreview, iframeRef]
@@ -93088,7 +93065,6 @@ function useDomGeometryCommit({
93088
93065
  [commitPositionPatchToHtml, queue2]
93089
93066
  );
93090
93067
  const { stageElementPositionOffset, handleDomBoxSizeCommit, handleDomRotationCommit } = useDomGeometryCommits({
93091
- previewIframeRef: iframeRef,
93092
93068
  showToast,
93093
93069
  commitPositionPatchToHtml: commitWithFreshQueue,
93094
93070
  readOnlyPreview: false
@@ -93138,7 +93114,7 @@ function useDomGeometryCommit({
93138
93114
  },
93139
93115
  [pending2, showToast]
93140
93116
  );
93141
- return useMemo84(
93117
+ return useMemo85(
93142
93118
  () => ({
93143
93119
  commitPathOffset: (selection, next, modifiers) => saved2(() => handleGsapAwarePathOffsetCommit(selection, next, modifiers)),
93144
93120
  commitGroupPathOffset: (updates) => saved2(() => handleGsapAwareGroupPathOffsetCommit(updates)),