@twick/studio 0.14.5 → 0.14.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -471,20 +471,18 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
471
471
  const handleToolSelect = (toolId) => {
472
472
  setSelectedTool(toolId);
473
473
  };
474
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-16 bg-neutral/80 border-r border-gray-300/50 flex flex-col items-center py-4 space-y-3 justify-start backdrop-blur-md shadow-lg", children: toolCategories.map((tool) => {
474
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sidebar", children: toolCategories.map((tool) => {
475
475
  const Icon2 = getIcon$1(tool.icon);
476
476
  const isSelected = selectedTool === tool.id;
477
477
  return /* @__PURE__ */ jsxRuntime.jsxs(
478
- "button",
478
+ "div",
479
479
  {
480
480
  onClick: () => handleToolSelect(tool.id),
481
- className: `
482
- toolbar-btn group ${isSelected ? "active" : ""}
483
- `,
481
+ className: `toolbar-btn ${isSelected ? "active" : ""}`,
484
482
  title: `${tool.name}${tool.shortcut ? ` (${tool.shortcut})` : ""}`,
485
483
  children: [
486
- /* @__PURE__ */ jsxRuntime.jsx(Icon2, { className: "w-4 h-4" }),
487
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] mt-1 transition-opacity duration-200", children: tool.name })
484
+ /* @__PURE__ */ jsxRuntime.jsx(Icon2, { className: "icon-sm" }),
485
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "toolbar-label", children: tool.name })
488
486
  ]
489
487
  },
490
488
  tool.id
@@ -515,20 +513,20 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
515
513
  setVideoResolution({ width: 720, height: 1280 });
516
514
  }
517
515
  }, [orientation]);
518
- return /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "h-14 bg-neutral-800/90 border-b border-gray-600/50 flex items-center justify-between px-4 backdrop-blur-md shadow-lg", children: [
519
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
520
- /* @__PURE__ */ jsxRuntime.jsx(Clapperboard, { className: "w-8 h-8 text-purple-400" }),
521
- /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-lg font-bold text-gradient-purple", children: "Twick Studio" })
516
+ return /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "header", children: [
517
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-container", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-container", children: [
518
+ /* @__PURE__ */ jsxRuntime.jsx(Clapperboard, { className: "icon-lg accent-purple" }),
519
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-gradient", children: "Twick Studio" })
522
520
  ] }) }),
523
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
521
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-container", children: [
524
522
  /* @__PURE__ */ jsxRuntime.jsxs(
525
523
  "button",
526
524
  {
527
- className: "btn btn-ghost w-32",
525
+ className: "btn-ghost",
528
526
  title: "Load Project",
529
527
  onClick: onLoadProject,
530
528
  children: [
531
- /* @__PURE__ */ jsxRuntime.jsx(File, { className: "w-4 h-4 mr-2" }),
529
+ /* @__PURE__ */ jsxRuntime.jsx(File, { className: "icon-sm" }),
532
530
  "Load Project"
533
531
  ]
534
532
  }
@@ -536,11 +534,11 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
536
534
  /* @__PURE__ */ jsxRuntime.jsxs(
537
535
  "button",
538
536
  {
539
- className: "btn btn-ghost w-32",
537
+ className: "btn-ghost",
540
538
  title: "Save Draft",
541
539
  onClick: onSaveProject,
542
540
  children: [
543
- /* @__PURE__ */ jsxRuntime.jsx(Save, { className: "w-4 h-4 mr-2" }),
541
+ /* @__PURE__ */ jsxRuntime.jsx(Save, { className: "icon-sm" }),
544
542
  "Save Draft"
545
543
  ]
546
544
  }
@@ -548,11 +546,11 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
548
546
  /* @__PURE__ */ jsxRuntime.jsxs(
549
547
  "button",
550
548
  {
551
- className: "btn btn-primary w-32",
549
+ className: "btn-primary",
552
550
  title: "Export",
553
551
  onClick: onExportVideo,
554
552
  children: [
555
- /* @__PURE__ */ jsxRuntime.jsx(Download, { className: "w-4 h-4 mr-2" }),
553
+ /* @__PURE__ */ jsxRuntime.jsx(Download, { className: "icon-sm" }),
556
554
  "Export"
557
555
  ]
558
556
  }
@@ -629,14 +627,14 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
629
627
  (sub) => sub.id === id ? { ...sub, [field]: value } : sub
630
628
  ));
631
629
  };
632
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-72 h-full bg-neutral-800/80 border-l border-gray-600/50 p-3 overflow-y-auto overflow-x-hidden backdrop-blur-md shadow-lg", children: [
633
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl font-bold text-white mb-6", children: "Subtitles" }),
634
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-3 mb-6", children: [
630
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
631
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "panel-title", children: "Subtitles" }),
632
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-section", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-container", children: [
635
633
  /* @__PURE__ */ jsxRuntime.jsx(
636
634
  "button",
637
635
  {
638
636
  onClick: handleGenerate,
639
- className: "flex-1 bg-neutral-700 hover:bg-neutral-600 text-white font-medium py-2 px-4 rounded-lg transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-purple-500/20",
637
+ className: "btn-primary",
640
638
  children: "Generate"
641
639
  }
642
640
  ),
@@ -644,19 +642,19 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
644
642
  "button",
645
643
  {
646
644
  onClick: handleAdd,
647
- className: "flex-1 bg-neutral-700 hover:bg-neutral-600 text-white font-medium py-2 px-4 rounded-lg border-2 border-purple-500 transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-purple-500/20",
645
+ className: "btn-primary",
648
646
  children: "Add"
649
647
  }
650
648
  )
651
- ] }),
652
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-4", children: subtitles.map((subtitle) => /* @__PURE__ */ jsxRuntime.jsxs(
649
+ ] }) }),
650
+ subtitles.map((subtitle) => /* @__PURE__ */ jsxRuntime.jsxs(
653
651
  "div",
654
652
  {
655
- className: "bg-neutral-700/50 border border-gray-600 rounded-lg p-3",
653
+ className: "panel-section",
656
654
  children: [
657
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-3 mb-3", children: [
658
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1", children: [
659
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "Start" }),
655
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-container", children: [
656
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
657
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-small", children: "Start" }),
660
658
  /* @__PURE__ */ jsxRuntime.jsx(
661
659
  "input",
662
660
  {
@@ -665,12 +663,12 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
665
663
  step: "0.1",
666
664
  value: subtitle.start,
667
665
  onChange: (e) => handleUpdateSubtitle(subtitle.id, "start", Number(e.target.value)),
668
- className: "w-full bg-neutral-800/80 border border-gray-600 rounded-lg text-white text-sm px-3 py-2 focus:border-purple-500 focus:outline-none focus:ring-2 focus:ring-purple-500/20 transition-all duration-200 backdrop-blur-sm"
666
+ className: "input-dark"
669
667
  }
670
668
  )
671
669
  ] }),
672
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1", children: [
673
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "End" }),
670
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
671
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-small", children: "End" }),
674
672
  /* @__PURE__ */ jsxRuntime.jsx(
675
673
  "input",
676
674
  {
@@ -679,56 +677,61 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
679
677
  step: "0.1",
680
678
  value: subtitle.end,
681
679
  onChange: (e) => handleUpdateSubtitle(subtitle.id, "end", Number(e.target.value)),
682
- className: "w-full bg-neutral-800/80 border border-gray-600 rounded-lg text-white text-sm px-3 py-2 focus:border-purple-500 focus:outline-none focus:ring-2 focus:ring-purple-500/20 transition-all duration-200 backdrop-blur-sm"
680
+ className: "input-dark"
683
681
  }
684
682
  )
685
683
  ] })
686
684
  ] }),
687
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsxRuntime.jsx(
688
- "input",
689
- {
690
- type: "text",
691
- placeholder: "subtitle",
692
- value: subtitle.text,
693
- onChange: (e) => handleUpdateSubtitle(subtitle.id, "text", e.target.value),
694
- className: "w-full bg-neutral-800/80 border border-gray-600 rounded-lg text-white text-sm px-3 py-2 placeholder-gray-400 focus:border-purple-500 focus:outline-none focus:ring-2 focus:ring-purple-500/20 transition-all duration-200 backdrop-blur-sm"
695
- }
696
- ) }),
697
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between items-center", children: [
685
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
686
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Subtitle Text" }),
687
+ /* @__PURE__ */ jsxRuntime.jsx(
688
+ "input",
689
+ {
690
+ type: "text",
691
+ placeholder: "Enter subtitle text",
692
+ value: subtitle.text,
693
+ onChange: (e) => handleUpdateSubtitle(subtitle.id, "text", e.target.value),
694
+ className: "input-dark"
695
+ }
696
+ )
697
+ ] }),
698
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-container justify-between", children: [
698
699
  /* @__PURE__ */ jsxRuntime.jsx(
699
700
  "button",
700
701
  {
701
702
  onClick: () => handleDelete(subtitle.id),
702
- className: "p-2 text-red-400 hover:text-red-300 hover:bg-red-500/20 rounded-lg transition-all duration-200",
703
+ className: "btn-danger",
703
704
  title: "Delete subtitle",
704
- children: /* @__PURE__ */ jsxRuntime.jsx(Trash2, { className: "w-4 h-4" })
705
+ children: /* @__PURE__ */ jsxRuntime.jsx(Trash2, { className: "icon-sm" })
705
706
  }
706
707
  ),
707
708
  /* @__PURE__ */ jsxRuntime.jsx(
708
709
  "button",
709
710
  {
710
711
  onClick: () => handleSave(subtitle.id),
711
- className: "p-2 text-green-400 hover:text-green-300 hover:bg-green-500/20 rounded-lg transition-all duration-200",
712
+ className: "btn-primary",
712
713
  title: "Save subtitle",
713
- children: /* @__PURE__ */ jsxRuntime.jsx(Check, { className: "w-4 h-4" })
714
+ children: /* @__PURE__ */ jsxRuntime.jsx(Check, { className: "icon-sm" })
714
715
  }
715
716
  )
716
717
  ] })
717
718
  ]
718
719
  },
719
720
  subtitle.id
720
- )) }),
721
- subtitles.length === 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center py-8 text-gray-400", children: [
722
- /* @__PURE__ */ jsxRuntime.jsx("p", { children: "No subtitles yet" }),
723
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm mt-2", children: 'Click "Add" to create your first subtitle' })
724
- ] })
721
+ )),
722
+ subtitles.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-section", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "empty-state", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "empty-state-content", children: [
723
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "empty-state-text", children: "No subtitles yet" }),
724
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "empty-state-subtext", children: 'Click "Add" to create your first subtitle' })
725
+ ] }) }) })
725
726
  ] });
726
727
  }
727
728
  const FileInput = ({
728
729
  acceptFileTypes,
729
730
  onFileLoad,
730
731
  buttonText,
731
- id
732
+ id,
733
+ className,
734
+ icon
732
735
  }) => {
733
736
  const onFileChange = (e) => {
734
737
  var _a;
@@ -757,13 +760,13 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
757
760
  }
758
761
  }
759
762
  };
760
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-full", children: [
763
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "file-input-container", children: [
761
764
  /* @__PURE__ */ jsxRuntime.jsx(
762
765
  "input",
763
766
  {
764
767
  type: "file",
765
768
  accept: acceptFileTypes.join(","),
766
- className: "absolute w-0.1 h-0.1 opacity-0 overflow-hidden -z-10",
769
+ className: "file-input-hidden",
767
770
  id,
768
771
  onChange: onFileChange
769
772
  }
@@ -772,9 +775,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
772
775
  "label",
773
776
  {
774
777
  htmlFor: id,
775
- className: "w-full btn btn-primary flex items-center justify-center gap-2 py-2",
778
+ className: className || "btn-primary file-input-label",
776
779
  children: [
777
- /* @__PURE__ */ jsxRuntime.jsx(Upload, { className: "w-4 h-4" }),
780
+ icon || /* @__PURE__ */ jsxRuntime.jsx(Upload, { className: "icon-sm" }),
778
781
  buttonText ?? "Upload"
779
782
  ]
780
783
  }
@@ -794,6 +797,83 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
794
797
  __publicField(_MediaManagerSingleton, "instance", null);
795
798
  let MediaManagerSingleton = _MediaManagerSingleton;
796
799
  const getMediaManager = () => MediaManagerSingleton.getInstance();
800
+ const EXTENSIONS = {
801
+ video: ["mp4", "webm", "ogg", "mov", "mkv", "m3u8"],
802
+ audio: ["mp3", "wav", "ogg", "m4a", "aac", "flac"],
803
+ image: ["jpg", "jpeg", "png", "gif", "webp", "svg"]
804
+ };
805
+ function isValidUrl(url) {
806
+ try {
807
+ new URL(url);
808
+ return true;
809
+ } catch {
810
+ return false;
811
+ }
812
+ }
813
+ function matchesType(url, type) {
814
+ const pathname = (() => {
815
+ try {
816
+ return new URL(url).pathname.toLowerCase();
817
+ } catch {
818
+ return url.toLowerCase();
819
+ }
820
+ })();
821
+ const ext = pathname.split(".").pop() || "";
822
+ return EXTENSIONS[type].includes(ext);
823
+ }
824
+ function UrlInput({
825
+ type,
826
+ onSubmit
827
+ }) {
828
+ const [url, setUrl] = react.useState("");
829
+ const [error, setError] = react.useState("");
830
+ const tryAdd = async () => {
831
+ const trimmed = url.trim();
832
+ if (!trimmed) return;
833
+ if (!isValidUrl(trimmed)) {
834
+ setError("Enter a valid URL");
835
+ return;
836
+ }
837
+ if (!matchesType(trimmed, type)) {
838
+ setError(`URL must be a ${type} (${EXTENSIONS[type].join(", ")})`);
839
+ return;
840
+ }
841
+ setError("");
842
+ onSubmit(trimmed);
843
+ setUrl("");
844
+ };
845
+ const onKeyDown = (e) => {
846
+ if (e.key === "Enter") {
847
+ e.preventDefault();
848
+ void tryAdd();
849
+ }
850
+ };
851
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
852
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-container", children: [
853
+ /* @__PURE__ */ jsxRuntime.jsx(
854
+ "input",
855
+ {
856
+ type: "url",
857
+ placeholder: `Paste ${type} URL...`,
858
+ value: url,
859
+ onChange: (e) => setUrl(e.target.value),
860
+ onKeyDown,
861
+ className: "input w-full"
862
+ }
863
+ ),
864
+ /* @__PURE__ */ jsxRuntime.jsx(
865
+ "button",
866
+ {
867
+ className: "btn-ghost",
868
+ onClick: () => void tryAdd(),
869
+ "aria-label": `Add ${type} by URL`,
870
+ children: /* @__PURE__ */ jsxRuntime.jsx(Plus, { size: 16 })
871
+ }
872
+ )
873
+ ] }),
874
+ error ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-error", children: error }) : null
875
+ ] });
876
+ }
797
877
  const initialMediaState = {
798
878
  items: [],
799
879
  searchQuery: "",
@@ -961,72 +1041,6 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
961
1041
  acceptFileTypes: config.acceptFileTypes
962
1042
  };
963
1043
  };
964
- const SearchInput = ({
965
- searchQuery,
966
- setSearchQuery
967
- }) => {
968
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mb-3", children: [
969
- /* @__PURE__ */ jsxRuntime.jsx(
970
- "input",
971
- {
972
- type: "text",
973
- placeholder: "Search media...",
974
- value: searchQuery,
975
- onChange: (e) => setSearchQuery(e.target.value),
976
- className: "w-full pl-8 pr-3 py-2 bg-neutral-700/80 border border-gray-600 rounded-lg text-gray-100 text-sm placeholder-gray-400 focus:border-purple-500 focus:outline-none focus:ring-2 focus:ring-purple-500/20 transition-all duration-200 backdrop-blur-sm shadow-sm"
977
- }
978
- ),
979
- /* @__PURE__ */ jsxRuntime.jsx(Search, { className: "absolute left-2.5 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400 hover:text-gray-300 z-10 pointer-events-none" })
980
- ] });
981
- };
982
- const inputStyles = {
983
- // Base container styles for form groups
984
- container: "mb-6",
985
- // Label styles
986
- label: {
987
- base: "block text-sm font-semibold text-gray-300 mb-2",
988
- small: "block text-xs text-gray-400 mb-1"
989
- },
990
- // Text input and select styles
991
- input: {
992
- base: "w-full bg-neutral-700/50 border border-gray-600 rounded-lg text-white text-sm px-3 py-2 focus:border-purple-500 focus:outline-none focus:ring-2 focus:ring-purple-500/20 transition-all duration-200 backdrop-blur-sm",
993
- small: "bg-neutral-700/50 border border-gray-600 rounded-lg text-white text-xs px-2 py-1 focus:border-purple-500 focus:outline-none focus:ring-2 focus:ring-purple-500/20 transition-all duration-200 backdrop-blur-sm"
994
- },
995
- // Range input styles
996
- range: {
997
- base: "flex-1 h-2 bg-neutral-600 rounded-full appearance-none cursor-pointer slider-thumb",
998
- gradient: "flex-1 h-2 bg-gradient-to-r from-purple-500 to-neutral-600 rounded-full appearance-none cursor-pointer slider-thumb",
999
- container: "flex items-center gap-3",
1000
- value: "text-white text-sm font-medium min-w-[50px]"
1001
- },
1002
- // Color input styles
1003
- color: {
1004
- container: "flex items-center gap-2",
1005
- picker: "w-6 h-6 rounded border border-gray-600 cursor-pointer",
1006
- preview: "flex-1 h-8 rounded-lg border border-gray-600"
1007
- },
1008
- // Toggle button styles
1009
- toggle: {
1010
- base: "w-10 h-10 rounded-lg border-2 transition-all duration-200 hover:bg-purple-400 hover:text-white",
1011
- active: "bg-purple-600 border-purple-500 text-white",
1012
- inactive: "bg-transparent border-gray-600 text-gray-400 hover:border-gray-500"
1013
- },
1014
- // Radio button styles
1015
- radio: {
1016
- base: "w-4 h-4 text-purple-600 bg-neutral-700 border-gray-600 focus:ring-purple-500 focus:ring-2",
1017
- label: "text-sm text-gray-300",
1018
- container: "flex items-center gap-2"
1019
- },
1020
- // Action button styles
1021
- button: {
1022
- primary: "w-full bg-purple-600 hover:bg-purple-700 text-white font-medium py-3 px-4 rounded-lg transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-purple-500/20"
1023
- },
1024
- // Panel container styles
1025
- panel: {
1026
- container: "w-72 h-full bg-neutral-800/80 border-l border-gray-600/50 p-4 overflow-y-auto overflow-x-hidden backdrop-blur-md shadow-lg",
1027
- title: "text-xl font-bold text-white mb-6"
1028
- }
1029
- };
1030
1044
  const useAudioPreview = () => {
1031
1045
  const [playingAudio, setPlayingAudio] = react.useState(null);
1032
1046
  const audioRef = react.useRef(null);
@@ -1066,40 +1080,35 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1066
1080
  };
1067
1081
  const AudioPanel = ({
1068
1082
  items,
1069
- searchQuery,
1070
- onSearchChange,
1071
1083
  onItemSelect,
1072
1084
  onFileUpload,
1073
- acceptFileTypes
1085
+ acceptFileTypes,
1086
+ onUrlAdd
1074
1087
  }) => {
1075
1088
  const { playingAudio, togglePlayPause } = useAudioPreview();
1076
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.panel.container, children: [
1077
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: inputStyles.panel.title, children: "Audio Library" }),
1078
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: inputStyles.container, children: /* @__PURE__ */ jsxRuntime.jsx(
1079
- SearchInput,
1080
- {
1081
- searchQuery,
1082
- setSearchQuery: onSearchChange
1083
- }
1084
- ) }),
1085
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${inputStyles.container} mb-8`, children: /* @__PURE__ */ jsxRuntime.jsx(
1089
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
1090
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-title", children: "Audio Library" }),
1091
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-section", children: /* @__PURE__ */ jsxRuntime.jsx(UrlInput, { type: "audio", onSubmit: onUrlAdd }) }),
1092
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex panel-section", children: /* @__PURE__ */ jsxRuntime.jsx(
1086
1093
  FileInput,
1087
1094
  {
1088
1095
  id: "audio-upload",
1089
1096
  acceptFileTypes,
1090
1097
  onFileLoad: onFileUpload,
1091
- buttonText: "Upload"
1098
+ buttonText: "Import media",
1099
+ className: "btn-primary w-full",
1100
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Upload, { className: "icon-sm" })
1092
1101
  }
1093
1102
  ) }),
1094
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 overflow-y-auto", children: [
1095
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: (items || []).map((item) => {
1096
- var _a;
1103
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "media-content", children: [
1104
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "media-list", children: (items || []).map((item) => {
1105
+ var _a, _b;
1097
1106
  return /* @__PURE__ */ jsxRuntime.jsx(
1098
1107
  "div",
1099
1108
  {
1100
1109
  onDoubleClick: () => onItemSelect(item),
1101
- className: "audio-item group relative cursor-pointer p-3 bg-neutral-700/50 rounded-lg hover:bg-neutral-700/80 transition-all duration-200 border border-transparent hover:border-purple-500/30",
1102
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
1110
+ className: "media-list-item",
1111
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "media-list-content", children: [
1103
1112
  /* @__PURE__ */ jsxRuntime.jsx(
1104
1113
  "button",
1105
1114
  {
@@ -1107,12 +1116,12 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1107
1116
  e.stopPropagation();
1108
1117
  togglePlayPause(item);
1109
1118
  },
1110
- className: "w-8 h-8 rounded-full bg-purple-500/80 hover:bg-purple-500 flex items-center justify-center text-white transition-all duration-200 flex-shrink-0",
1111
- children: playingAudio === item.id ? /* @__PURE__ */ jsxRuntime.jsx(Pause, { className: "w-4 h-4" }) : /* @__PURE__ */ jsxRuntime.jsx(Play, { className: "w-4 h-4" })
1119
+ className: "media-action-btn",
1120
+ children: playingAudio === item.id ? /* @__PURE__ */ jsxRuntime.jsx(Pause, { className: "icon-sm" }) : /* @__PURE__ */ jsxRuntime.jsx(Play, { className: "icon-sm" })
1112
1121
  }
1113
1122
  ),
1114
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-10 h-10 rounded-lg ${playingAudio === item.id ? "bg-purple-500/40" : "bg-purple-500/20"} flex items-center justify-center flex-shrink-0 transition-colors duration-200`, children: /* @__PURE__ */ jsxRuntime.jsx(Volume2, { className: `w-5 h-5 ${playingAudio === item.id ? "text-purple-300" : "text-purple-400"}` }) }),
1115
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-sm font-medium text-gray-100 truncate", children: (_a = item.metadata) == null ? void 0 : _a.title }) }),
1123
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `media-list-icon ${playingAudio === item.id ? "active" : ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Volume2, { className: "icon-sm" }) }),
1124
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "media-list-title", children: ((_a = item.metadata) == null ? void 0 : _a.title) || ((_b = item.metadata) == null ? void 0 : _b.name) }),
1116
1125
  /* @__PURE__ */ jsxRuntime.jsx(
1117
1126
  "button",
1118
1127
  {
@@ -1120,8 +1129,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1120
1129
  e.stopPropagation();
1121
1130
  onItemSelect(item, true);
1122
1131
  },
1123
- className: "w-6 h-6 rounded-full bg-purple-500/60 hover:bg-purple-500 flex items-center justify-center text-white text-xs opacity-0 group-hover:opacity-100 transition-opacity duration-200 flex-shrink-0",
1124
- children: /* @__PURE__ */ jsxRuntime.jsx(Plus, { className: "w-3 h-3" })
1132
+ className: "media-action-btn",
1133
+ children: /* @__PURE__ */ jsxRuntime.jsx(Plus, { className: "icon-sm" })
1125
1134
  }
1126
1135
  )
1127
1136
  ] })
@@ -1129,15 +1138,16 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1129
1138
  item.id
1130
1139
  );
1131
1140
  }) }),
1132
- items.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${inputStyles.container} flex items-center justify-center h-24`, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
1133
- /* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "w-10 h-10 mx-auto mb-2 text-purple-500/50" }),
1134
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: inputStyles.label.base, children: "No audio files found" }),
1135
- searchQuery && /* @__PURE__ */ jsxRuntime.jsx("p", { className: inputStyles.label.small, children: "Try adjusting your search" })
1141
+ items.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "empty-state", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "empty-state-content", children: [
1142
+ /* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "empty-state-icon" }),
1143
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "empty-state-text", children: "No audio files found" })
1136
1144
  ] }) })
1137
1145
  ] })
1138
1146
  ] });
1139
1147
  };
1140
1148
  const AudioPanelContainer = (props) => {
1149
+ const { addItem } = useMedia("audio");
1150
+ const mediaManager = getMediaManager();
1141
1151
  const {
1142
1152
  items,
1143
1153
  searchQuery,
@@ -1155,6 +1165,24 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1155
1165
  },
1156
1166
  props.videoResolution
1157
1167
  );
1168
+ const onUrlAdd = async (url) => {
1169
+ const nameFromUrl = (() => {
1170
+ try {
1171
+ const u = new URL(url);
1172
+ const parts = u.pathname.split("/").filter(Boolean);
1173
+ return decodeURIComponent(parts[parts.length - 1] || url);
1174
+ } catch {
1175
+ return url;
1176
+ }
1177
+ })();
1178
+ const newItem = await mediaManager.addItem({
1179
+ name: nameFromUrl,
1180
+ url,
1181
+ type: "audio",
1182
+ metadata: { source: "url" }
1183
+ });
1184
+ addItem(newItem);
1185
+ };
1158
1186
  return /* @__PURE__ */ jsxRuntime.jsx(
1159
1187
  AudioPanel,
1160
1188
  {
@@ -1164,76 +1192,65 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1164
1192
  onItemSelect: handleSelection,
1165
1193
  onFileUpload: handleFileUpload,
1166
1194
  isLoading,
1167
- acceptFileTypes
1195
+ acceptFileTypes,
1196
+ onUrlAdd
1168
1197
  }
1169
1198
  );
1170
1199
  };
1171
1200
  function ImagePanel({
1172
1201
  items,
1173
- searchQuery,
1174
- onSearchChange,
1175
1202
  onItemSelect,
1176
1203
  onFileUpload,
1177
- acceptFileTypes
1204
+ acceptFileTypes,
1205
+ onUrlAdd
1178
1206
  }) {
1179
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.panel.container, children: [
1180
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: inputStyles.panel.title, children: "Image Library" }),
1181
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: inputStyles.container, children: /* @__PURE__ */ jsxRuntime.jsx(
1182
- SearchInput,
1183
- {
1184
- searchQuery,
1185
- setSearchQuery: onSearchChange
1186
- }
1187
- ) }),
1188
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${inputStyles.container} mb-8`, children: /* @__PURE__ */ jsxRuntime.jsx(
1207
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
1208
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-title", children: "Image Library" }),
1209
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-section", children: /* @__PURE__ */ jsxRuntime.jsx(UrlInput, { type: "image", onSubmit: onUrlAdd }) }),
1210
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex panel-section", children: /* @__PURE__ */ jsxRuntime.jsx(
1189
1211
  FileInput,
1190
1212
  {
1191
1213
  id: "image-upload",
1192
1214
  acceptFileTypes,
1193
1215
  onFileLoad: onFileUpload,
1194
- buttonText: "Upload"
1216
+ buttonText: "Import media",
1217
+ className: "btn-primary w-full",
1218
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Upload, { className: "icon-sm" })
1195
1219
  }
1196
1220
  ) }),
1197
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 overflow-y-auto", children: [
1198
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-3 auto-rows-fr", children: (items || []).map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
1221
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "media-content", children: [
1222
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "media-grid", children: (items || []).map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
1199
1223
  "div",
1200
1224
  {
1201
1225
  onDoubleClick: () => onItemSelect(item),
1202
- className: "media-item-compact group relative cursor-pointer overflow-hidden hover:shadow-lg hover:shadow-purple-500/20 transition-all duration-200",
1226
+ className: "media-item",
1203
1227
  children: [
1204
- /* @__PURE__ */ jsxRuntime.jsx(
1205
- "img",
1206
- {
1207
- src: item.url,
1208
- alt: "",
1209
- className: "h-full w-full object-cover transition-transform group-hover:scale-105"
1210
- }
1211
- ),
1212
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black bg-opacity-0 transition-opacity group-hover:bg-opacity-20" }),
1213
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-1 right-1 opacity-0 group-hover:opacity-100 transition-opacity duration-200", children: /* @__PURE__ */ jsxRuntime.jsx(
1228
+ /* @__PURE__ */ jsxRuntime.jsx("img", { src: item.url, alt: "", className: "media-item-content" }),
1229
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "media-actions", children: /* @__PURE__ */ jsxRuntime.jsx(
1214
1230
  "button",
1215
1231
  {
1216
1232
  onClick: (e) => {
1217
1233
  e.stopPropagation();
1218
1234
  onItemSelect(item, true);
1219
1235
  },
1220
- className: "w-5 h-5 rounded-full bg-purple-500/80 hover:bg-purple-500 flex items-center justify-center text-white text-xs",
1221
- children: /* @__PURE__ */ jsxRuntime.jsx(Plus, { className: "w-3 h-3" })
1236
+ className: "media-action-btn",
1237
+ children: /* @__PURE__ */ jsxRuntime.jsx(Plus, { className: "icon-sm" })
1222
1238
  }
1223
1239
  ) })
1224
1240
  ]
1225
1241
  },
1226
1242
  item.id
1227
1243
  )) }),
1228
- items.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${inputStyles.container} flex items-center justify-center h-24`, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
1229
- /* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "w-10 h-10 mx-auto mb-2 text-purple-500/50" }),
1230
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: inputStyles.label.base, children: "No images found" }),
1231
- searchQuery && /* @__PURE__ */ jsxRuntime.jsx("p", { className: inputStyles.label.small, children: "Try adjusting your search" })
1244
+ items.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "empty-state", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "empty-state-content", children: [
1245
+ /* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "empty-state-icon" }),
1246
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "empty-state-text", children: "No images found" })
1232
1247
  ] }) })
1233
1248
  ] })
1234
1249
  ] });
1235
1250
  }
1236
1251
  function ImagePanelContainer(props) {
1252
+ const { addItem } = useMedia("image");
1253
+ const mediaManager = getMediaManager();
1237
1254
  const {
1238
1255
  items,
1239
1256
  searchQuery,
@@ -1251,6 +1268,24 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1251
1268
  },
1252
1269
  props.videoResolution
1253
1270
  );
1271
+ const onUrlAdd = async (url) => {
1272
+ const nameFromUrl = (() => {
1273
+ try {
1274
+ const u = new URL(url);
1275
+ const parts = u.pathname.split("/").filter(Boolean);
1276
+ return decodeURIComponent(parts[parts.length - 1] || url);
1277
+ } catch {
1278
+ return url;
1279
+ }
1280
+ })();
1281
+ const newItem = await mediaManager.addItem({
1282
+ name: nameFromUrl,
1283
+ url,
1284
+ type: "image",
1285
+ metadata: { source: "url" }
1286
+ });
1287
+ addItem(newItem);
1288
+ };
1254
1289
  return /* @__PURE__ */ jsxRuntime.jsx(
1255
1290
  ImagePanel,
1256
1291
  {
@@ -1260,7 +1295,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1260
1295
  onItemSelect: handleSelection,
1261
1296
  onFileUpload: handleFileUpload,
1262
1297
  isLoading,
1263
- acceptFileTypes
1298
+ acceptFileTypes,
1299
+ onUrlAdd
1264
1300
  }
1265
1301
  );
1266
1302
  }
@@ -1304,44 +1340,39 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1304
1340
  };
1305
1341
  function VideoPanel({
1306
1342
  items,
1307
- searchQuery,
1308
- onSearchChange,
1309
1343
  onItemSelect,
1310
1344
  onFileUpload,
1311
- acceptFileTypes
1345
+ acceptFileTypes,
1346
+ onUrlAdd
1312
1347
  }) {
1313
1348
  const { playingVideo, togglePlayPause } = useVideoPreview();
1314
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.panel.container, children: [
1315
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: inputStyles.panel.title, children: "Video Library" }),
1316
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: inputStyles.container, children: /* @__PURE__ */ jsxRuntime.jsx(
1317
- SearchInput,
1318
- {
1319
- searchQuery,
1320
- setSearchQuery: onSearchChange
1321
- }
1322
- ) }),
1323
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${inputStyles.container} mb-8`, children: /* @__PURE__ */ jsxRuntime.jsx(
1349
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
1350
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-title", children: "Video Library" }),
1351
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex panel-section", children: /* @__PURE__ */ jsxRuntime.jsx(UrlInput, { type: "video", onSubmit: onUrlAdd }) }),
1352
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex panel-section", children: /* @__PURE__ */ jsxRuntime.jsx(
1324
1353
  FileInput,
1325
1354
  {
1326
1355
  id: "video-upload",
1327
1356
  acceptFileTypes,
1328
1357
  onFileLoad: onFileUpload,
1329
- buttonText: "Upload"
1358
+ buttonText: "Import media",
1359
+ className: "btn-primary w-full",
1360
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Upload, { className: "icon-sm" })
1330
1361
  }
1331
1362
  ) }),
1332
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 overflow-y-auto", children: [
1333
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-3 auto-rows-fr", children: (items || []).map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
1363
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "media-content", children: [
1364
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "media-grid", children: (items || []).map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
1334
1365
  "div",
1335
1366
  {
1336
1367
  onDoubleClick: () => onItemSelect(item),
1337
- className: "media-item-compact group relative cursor-pointer overflow-hidden hover:shadow-lg hover:shadow-purple-500/20 transition-all duration-200",
1368
+ className: "media-item",
1338
1369
  children: [
1339
1370
  /* @__PURE__ */ jsxRuntime.jsx(
1340
1371
  "video",
1341
1372
  {
1342
1373
  src: item.url,
1343
1374
  poster: item.thumbnail,
1344
- className: `h-full w-full object-cover transition-transform ${playingVideo === item.id ? "scale-105" : "group-hover:scale-105"}`,
1375
+ className: "media-item-content",
1345
1376
  ref: (el) => {
1346
1377
  if (el) {
1347
1378
  el.addEventListener("ended", () => {
@@ -1351,8 +1382,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1351
1382
  }
1352
1383
  }
1353
1384
  ),
1354
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: `absolute inset-0 bg-black transition-opacity ${playingVideo === item.id ? "bg-opacity-30" : "bg-opacity-0 group-hover:bg-opacity-20"}` }),
1355
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute top-1 right-1 flex gap-2", children: [
1385
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "media-actions", children: [
1356
1386
  /* @__PURE__ */ jsxRuntime.jsx(
1357
1387
  "button",
1358
1388
  {
@@ -1364,8 +1394,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1364
1394
  togglePlayPause(item, videoEl);
1365
1395
  }
1366
1396
  },
1367
- className: `w-6 h-6 rounded-full bg-purple-500/80 hover:bg-purple-500 flex items-center justify-center text-white text-xs ${playingVideo === item.id ? "opacity-100" : "opacity-0 group-hover:opacity-100"} transition-opacity duration-200`,
1368
- children: playingVideo === item.id ? /* @__PURE__ */ jsxRuntime.jsx(Pause, { className: "w-3 h-3" }) : /* @__PURE__ */ jsxRuntime.jsx(Play, { className: "w-3 h-3" })
1397
+ className: "media-action-btn",
1398
+ children: playingVideo === item.id ? /* @__PURE__ */ jsxRuntime.jsx(Pause, { className: "icon-sm" }) : /* @__PURE__ */ jsxRuntime.jsx(Play, { className: "icon-sm" })
1369
1399
  }
1370
1400
  ),
1371
1401
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -1375,8 +1405,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1375
1405
  e.stopPropagation();
1376
1406
  onItemSelect(item, true);
1377
1407
  },
1378
- className: "w-6 h-6 rounded-full bg-purple-500/80 hover:bg-purple-500 flex items-center justify-center text-white text-xs opacity-0 group-hover:opacity-100 transition-opacity duration-200",
1379
- children: /* @__PURE__ */ jsxRuntime.jsx(Plus, { className: "w-3 h-3" })
1408
+ className: "media-action-btn",
1409
+ children: /* @__PURE__ */ jsxRuntime.jsx(Plus, { className: "icon-sm" })
1380
1410
  }
1381
1411
  )
1382
1412
  ] })
@@ -1384,19 +1414,18 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1384
1414
  },
1385
1415
  item.id
1386
1416
  )) }),
1387
- items.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${inputStyles.container} flex items-center justify-center h-24`, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
1388
- /* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "w-10 h-10 mx-auto mb-2 text-purple-500/50" }),
1389
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: inputStyles.label.base, children: "No videos found" }),
1390
- searchQuery && /* @__PURE__ */ jsxRuntime.jsx("p", { className: inputStyles.label.small, children: "Try adjusting your search" })
1417
+ items.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "empty-state", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "empty-state-content", children: [
1418
+ /* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "empty-state-icon" }),
1419
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "empty-state-text", children: "No videos found" })
1391
1420
  ] }) })
1392
1421
  ] })
1393
1422
  ] });
1394
1423
  }
1395
1424
  function VideoPanelContainer(props) {
1425
+ const { addItem } = useMedia("video");
1426
+ const mediaManager = getMediaManager();
1396
1427
  const {
1397
1428
  items,
1398
- searchQuery,
1399
- setSearchQuery,
1400
1429
  handleSelection,
1401
1430
  handleFileUpload,
1402
1431
  isLoading,
@@ -1410,16 +1439,33 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1410
1439
  },
1411
1440
  props.videoResolution
1412
1441
  );
1442
+ const onUrlAdd = async (url) => {
1443
+ const nameFromUrl = (() => {
1444
+ try {
1445
+ const u = new URL(url);
1446
+ const parts = u.pathname.split("/").filter(Boolean);
1447
+ return decodeURIComponent(parts[parts.length - 1] || url);
1448
+ } catch {
1449
+ return url;
1450
+ }
1451
+ })();
1452
+ const newItem = await mediaManager.addItem({
1453
+ name: nameFromUrl,
1454
+ url,
1455
+ type: "video",
1456
+ metadata: { source: "url" }
1457
+ });
1458
+ addItem(newItem);
1459
+ };
1413
1460
  return /* @__PURE__ */ jsxRuntime.jsx(
1414
1461
  VideoPanel,
1415
1462
  {
1416
1463
  items,
1417
- searchQuery,
1418
- onSearchChange: setSearchQuery,
1419
1464
  onItemSelect: handleSelection,
1420
1465
  onFileUpload: handleFileUpload,
1421
1466
  isLoading,
1422
- acceptFileTypes
1467
+ acceptFileTypes,
1468
+ onUrlAdd
1423
1469
  }
1424
1470
  );
1425
1471
  }
@@ -1448,23 +1494,21 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1448
1494
  setStrokeWidth,
1449
1495
  handleApplyChanges
1450
1496
  }) {
1451
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.panel.container, children: [
1452
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: inputStyles.panel.title, children: "Text Element" }),
1453
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
1454
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Text Content" }),
1455
- /* @__PURE__ */ jsxRuntime.jsx(
1456
- "input",
1457
- {
1458
- type: "text",
1459
- value: textContent,
1460
- onChange: (e) => setTextContent(e.target.value),
1461
- className: inputStyles.input.base
1462
- }
1463
- )
1464
- ] }),
1465
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
1466
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Font Size" }),
1467
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.range.container, children: [
1497
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
1498
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-title", children: "Text" }),
1499
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex panel-section", children: /* @__PURE__ */ jsxRuntime.jsx(
1500
+ "input",
1501
+ {
1502
+ type: "text",
1503
+ value: textContent,
1504
+ placeholder: "Sample",
1505
+ onChange: (e) => setTextContent(e.target.value),
1506
+ className: "input-dark"
1507
+ }
1508
+ ) }),
1509
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
1510
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Font Size" }),
1511
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
1468
1512
  /* @__PURE__ */ jsxRuntime.jsx(
1469
1513
  "input",
1470
1514
  {
@@ -1473,24 +1517,24 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1473
1517
  max: "120",
1474
1518
  value: fontSize,
1475
1519
  onChange: (e) => setFontSize(Number(e.target.value)),
1476
- className: inputStyles.range.gradient
1520
+ className: "slider-purple"
1477
1521
  }
1478
1522
  ),
1479
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: inputStyles.range.value, children: [
1523
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "slider-value", children: [
1480
1524
  fontSize,
1481
1525
  "px"
1482
1526
  ] })
1483
1527
  ] })
1484
1528
  ] }),
1485
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
1486
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Font" }),
1487
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1529
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
1530
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Font" }),
1531
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "font-controls", children: [
1488
1532
  /* @__PURE__ */ jsxRuntime.jsx(
1489
1533
  "select",
1490
1534
  {
1491
1535
  value: selectedFont,
1492
1536
  onChange: (e) => setSelectedFont(e.target.value),
1493
- className: inputStyles.input.base,
1537
+ className: "select-dark",
1494
1538
  children: fonts.map((font) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: font, children: font }, font))
1495
1539
  }
1496
1540
  ),
@@ -1498,33 +1542,33 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1498
1542
  "button",
1499
1543
  {
1500
1544
  onClick: () => setIsBold(!isBold),
1501
- className: `${inputStyles.toggle.base} ${isBold ? inputStyles.toggle.active : inputStyles.toggle.inactive} min-w-6`,
1502
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-bold", children: "B" })
1545
+ className: `btn-icon ${isBold ? "btn-icon-active" : ""}`,
1546
+ children: "B"
1503
1547
  }
1504
1548
  ),
1505
1549
  /* @__PURE__ */ jsxRuntime.jsx(
1506
1550
  "button",
1507
1551
  {
1508
1552
  onClick: () => setIsItalic(!isItalic),
1509
- className: `${inputStyles.toggle.base} ${isItalic ? inputStyles.toggle.active : inputStyles.toggle.inactive} min-w-6`,
1510
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "italic", children: "I" })
1553
+ className: `btn-icon ${isItalic ? "btn-icon-active" : ""}`,
1554
+ children: "I"
1511
1555
  }
1512
1556
  )
1513
1557
  ] })
1514
1558
  ] }),
1515
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
1516
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Colors" }),
1517
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
1518
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1519
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.small, children: "Text Color" }),
1520
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.color.container, children: [
1559
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
1560
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Colors" }),
1561
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "color-section", children: [
1562
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "color-control", children: [
1563
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-small", children: "Text Color" }),
1564
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "color-inputs", children: [
1521
1565
  /* @__PURE__ */ jsxRuntime.jsx(
1522
1566
  "input",
1523
1567
  {
1524
1568
  type: "color",
1525
1569
  value: textColor,
1526
1570
  onChange: (e) => setTextColor(e.target.value),
1527
- className: inputStyles.color.picker
1571
+ className: "color-picker"
1528
1572
  }
1529
1573
  ),
1530
1574
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -1533,21 +1577,21 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1533
1577
  type: "text",
1534
1578
  value: textColor,
1535
1579
  onChange: (e) => setTextColor(e.target.value),
1536
- className: inputStyles.input.small
1580
+ className: "color-text"
1537
1581
  }
1538
1582
  )
1539
1583
  ] })
1540
1584
  ] }),
1541
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1542
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.small, children: "Stroke Color" }),
1543
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.color.container, children: [
1585
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "color-control", children: [
1586
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-small", children: "Stroke Color" }),
1587
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "color-inputs", children: [
1544
1588
  /* @__PURE__ */ jsxRuntime.jsx(
1545
1589
  "input",
1546
1590
  {
1547
1591
  type: "color",
1548
1592
  value: strokeColor,
1549
1593
  onChange: (e) => setStrokeColor(e.target.value),
1550
- className: inputStyles.color.picker
1594
+ className: "color-picker"
1551
1595
  }
1552
1596
  ),
1553
1597
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -1556,34 +1600,33 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1556
1600
  type: "text",
1557
1601
  value: strokeColor,
1558
1602
  onChange: (e) => setStrokeColor(e.target.value),
1559
- className: inputStyles.input.small
1603
+ className: "color-text"
1560
1604
  }
1561
1605
  )
1562
1606
  ] })
1563
1607
  ] }),
1564
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.radio.container, children: [
1608
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "checkbox-control", children: /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "checkbox-label", children: [
1565
1609
  /* @__PURE__ */ jsxRuntime.jsx(
1566
1610
  "input",
1567
1611
  {
1568
1612
  type: "checkbox",
1569
- id: "applyShadow",
1570
1613
  checked: applyShadow,
1571
1614
  onChange: (e) => setApplyShadow(e.target.checked),
1572
- className: inputStyles.radio.base
1615
+ className: "checkbox-purple"
1573
1616
  }
1574
1617
  ),
1575
- /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: "applyShadow", className: inputStyles.radio.label, children: "Apply Shadow" })
1576
- ] }),
1577
- applyShadow && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1578
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.small, children: "Shadow Color" }),
1579
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.color.container, children: [
1618
+ "Apply Shadow"
1619
+ ] }) }),
1620
+ applyShadow && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "color-control", children: [
1621
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-small", children: "Shadow Color" }),
1622
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "color-inputs", children: [
1580
1623
  /* @__PURE__ */ jsxRuntime.jsx(
1581
1624
  "input",
1582
1625
  {
1583
1626
  type: "color",
1584
1627
  value: shadowColor,
1585
1628
  onChange: (e) => setShadowColor(e.target.value),
1586
- className: inputStyles.color.picker
1629
+ className: "color-picker"
1587
1630
  }
1588
1631
  ),
1589
1632
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -1592,16 +1635,16 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1592
1635
  type: "text",
1593
1636
  value: shadowColor,
1594
1637
  onChange: (e) => setShadowColor(e.target.value),
1595
- className: inputStyles.input.small
1638
+ className: "color-text"
1596
1639
  }
1597
1640
  )
1598
1641
  ] })
1599
1642
  ] })
1600
1643
  ] })
1601
1644
  ] }),
1602
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
1603
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Stroke Width" }),
1604
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.range.container, children: [
1645
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
1646
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Stroke Width" }),
1647
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
1605
1648
  /* @__PURE__ */ jsxRuntime.jsx(
1606
1649
  "input",
1607
1650
  {
@@ -1611,13 +1654,13 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1611
1654
  step: 0.1,
1612
1655
  value: strokeWidth,
1613
1656
  onChange: (e) => setStrokeWidth(Number(e.target.value)),
1614
- className: inputStyles.range.base
1657
+ className: "slider-purple"
1615
1658
  }
1616
1659
  ),
1617
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: inputStyles.range.value, children: strokeWidth })
1660
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "slider-value", children: strokeWidth })
1618
1661
  ] })
1619
1662
  ] }),
1620
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8", children: /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: handleApplyChanges, className: inputStyles.button.primary, children: operation }) })
1663
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex panel-section", children: /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: handleApplyChanges, className: "btn-primary w-full", children: operation }) })
1621
1664
  ] });
1622
1665
  }
1623
1666
  const DEFAULT_TEXT_PROPS = {
@@ -1756,10 +1799,27 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1756
1799
  const textPanelProps = useTextPanel(props);
1757
1800
  return /* @__PURE__ */ jsxRuntime.jsx(TextPanel, { ...textPanelProps });
1758
1801
  }
1802
+ const SearchInput = ({
1803
+ searchQuery,
1804
+ setSearchQuery
1805
+ }) => {
1806
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "search-container", children: [
1807
+ /* @__PURE__ */ jsxRuntime.jsx(
1808
+ "input",
1809
+ {
1810
+ type: "text",
1811
+ placeholder: "Search media...",
1812
+ value: searchQuery,
1813
+ onChange: (e) => setSearchQuery(e.target.value),
1814
+ className: "input search-input w-full"
1815
+ }
1816
+ ),
1817
+ /* @__PURE__ */ jsxRuntime.jsx(Search, { className: "search-icon" })
1818
+ ] });
1819
+ };
1759
1820
  function IconPanel({
1760
1821
  icons,
1761
1822
  loading,
1762
- hasMore,
1763
1823
  totalIcons,
1764
1824
  searchQuery,
1765
1825
  handleSearch,
@@ -1767,44 +1827,30 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1767
1827
  handleDownloadIcon,
1768
1828
  handleLoadMore
1769
1829
  }) {
1770
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.panel.container, children: [
1771
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: inputStyles.panel.title, children: "Icon Library" }),
1772
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: inputStyles.container, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mb-3", children: [
1773
- /* @__PURE__ */ jsxRuntime.jsx(
1774
- Search,
1775
- {
1776
- className: "absolute left-2.5 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400 z-10 pointer-events-none"
1777
- }
1778
- ),
1779
- /* @__PURE__ */ jsxRuntime.jsx(
1780
- "input",
1781
- {
1782
- type: "text",
1783
- placeholder: "Search icons...",
1784
- value: searchQuery,
1785
- onChange: (e) => handleSearch(e.target.value),
1786
- className: `${inputStyles.input.base} pl-8`
1787
- }
1788
- )
1789
- ] }) }),
1790
- loading && icons.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntime.jsx(LoaderCircle, { className: "h-8 w-8 animate-spin text-purple-500" }) }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1791
- totalIcons > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4 text-sm text-gray-400", children: [
1830
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
1831
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-title", children: "Icon Library" }),
1832
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex panel-section", children: /* @__PURE__ */ jsxRuntime.jsx(SearchInput, { searchQuery, setSearchQuery: handleSearch }) }),
1833
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "media-content", children: [
1834
+ totalIcons > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "media-count", children: [
1792
1835
  "Showing ",
1793
1836
  icons.length,
1794
1837
  " of ",
1795
1838
  totalIcons,
1796
1839
  " icons"
1797
1840
  ] }),
1798
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-3 gap-3 mb-2 p-2", children: (icons || []).map((icon, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group relative cursor-pointer", children: [
1841
+ loading && icons.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "empty-state", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "empty-state-content", children: [
1842
+ /* @__PURE__ */ jsxRuntime.jsx(LoaderCircle, { className: "empty-state-icon animate-spin" }),
1843
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "empty-state-text", children: "Loading icons..." })
1844
+ ] }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "icon-grid", children: (icons || []).map((icon, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "icon-item", children: [
1799
1845
  /* @__PURE__ */ jsxRuntime.jsx(
1800
1846
  "div",
1801
1847
  {
1802
1848
  onClick: () => handleSelection(icon),
1803
- className: "w-16 h-16 flex items-center justify-center bg-neutral-700/50 border border-gray-600 rounded-lg hover:border-purple-500 hover:bg-neutral-700/70 transition-all duration-200 p-2",
1849
+ className: "icon-content",
1804
1850
  dangerouslySetInnerHTML: { __html: icon.svg }
1805
1851
  }
1806
1852
  ),
1807
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-100 transition-opacity duration-200 rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
1853
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "icon-actions", children: [
1808
1854
  /* @__PURE__ */ jsxRuntime.jsx(
1809
1855
  "button",
1810
1856
  {
@@ -1812,9 +1858,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1812
1858
  e.stopPropagation();
1813
1859
  handleSelection(icon);
1814
1860
  },
1815
- className: "p-1.5 bg-purple-600 hover:bg-purple-700 rounded transition-colors duration-200",
1861
+ className: "icon-action-btn",
1816
1862
  title: "Add to timeline",
1817
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-white text-xs", children: "+" })
1863
+ children: /* @__PURE__ */ jsxRuntime.jsx(Plus, { className: "icon-sm" })
1818
1864
  }
1819
1865
  ),
1820
1866
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -1824,30 +1870,27 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1824
1870
  e.stopPropagation();
1825
1871
  handleDownloadIcon(icon);
1826
1872
  },
1827
- className: "p-1.5 bg-purple-600 hover:bg-purple-700 rounded transition-colors duration-200",
1873
+ className: "icon-action-btn",
1828
1874
  title: "Download SVG",
1829
- children: /* @__PURE__ */ jsxRuntime.jsx(Download, { className: "w-3 h-3 text-white" })
1875
+ children: /* @__PURE__ */ jsxRuntime.jsx(Download, { className: "icon-sm" })
1830
1876
  }
1831
1877
  )
1832
- ] }) }),
1833
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -bottom-8 left-1/2 transform -translate-x-1/2 bg-black/80 text-white text-xs px-2 py-1 rounded opacity-0 group-hover:opacity-100 transition-opacity duration-200 whitespace-nowrap z-10", children: icon.name })
1878
+ ] }),
1879
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "icon-name", children: icon.name })
1834
1880
  ] }, index)) }),
1835
- hasMore && /* @__PURE__ */ jsxRuntime.jsx(
1881
+ !loading && icons.length === 0 && searchQuery && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "empty-state", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "empty-state-content", children: [
1882
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "empty-state-text", children: "No icons found" }),
1883
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "empty-state-subtext", children: "Try a different search term" })
1884
+ ] }) }),
1885
+ !loading && totalIcons && icons.length < totalIcons && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex panel-section", children: /* @__PURE__ */ jsxRuntime.jsx(
1836
1886
  "button",
1837
1887
  {
1838
1888
  onClick: handleLoadMore,
1839
1889
  disabled: loading,
1840
- className: `${inputStyles.button.primary} disabled:opacity-50 disabled:cursor-not-allowed`,
1841
- children: loading ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2", children: [
1842
- /* @__PURE__ */ jsxRuntime.jsx(LoaderCircle, { className: "h-4 w-4 animate-spin" }),
1843
- "Loading..."
1844
- ] }) : "Load More"
1890
+ className: "btn-primary",
1891
+ children: "Load More Icons"
1845
1892
  }
1846
- ),
1847
- !loading && icons.length === 0 && searchQuery && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center py-8 text-gray-400", children: [
1848
- /* @__PURE__ */ jsxRuntime.jsx("p", { children: "No icons found" }),
1849
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm mt-2", children: "Try a different search term" })
1850
- ] })
1893
+ ) })
1851
1894
  ] })
1852
1895
  ] });
1853
1896
  }
@@ -1973,6 +2016,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1973
2016
  opacity,
1974
2017
  strokeColor,
1975
2018
  lineWidth,
2019
+ operation,
1976
2020
  setCornerRadius,
1977
2021
  setFillColor,
1978
2022
  setOpacity,
@@ -1980,11 +2024,11 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1980
2024
  setLineWidth,
1981
2025
  handleApplyChanges
1982
2026
  }) {
1983
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.panel.container, children: [
1984
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: inputStyles.panel.title, children: "Rectangle" }),
1985
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
1986
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Corner Radius" }),
1987
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.range.container, children: [
2027
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
2028
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-title", children: "Rectangle" }),
2029
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2030
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Corner Radius" }),
2031
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
1988
2032
  /* @__PURE__ */ jsxRuntime.jsx(
1989
2033
  "input",
1990
2034
  {
@@ -1993,39 +2037,41 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1993
2037
  max: "100",
1994
2038
  value: cornerRadius,
1995
2039
  onChange: (e) => setCornerRadius(Number(e.target.value)),
1996
- className: inputStyles.range.base
2040
+ className: "slider-purple"
1997
2041
  }
1998
2042
  ),
1999
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: inputStyles.range.value, children: [
2043
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "slider-value", children: [
2000
2044
  cornerRadius,
2001
2045
  "px"
2002
2046
  ] })
2003
2047
  ] })
2004
2048
  ] }),
2005
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
2006
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Fill Color" }),
2007
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.color.container, children: [
2049
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2050
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Fill Color" }),
2051
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "color-inputs", children: [
2008
2052
  /* @__PURE__ */ jsxRuntime.jsx(
2009
2053
  "input",
2010
2054
  {
2011
2055
  type: "color",
2012
2056
  value: fillColor,
2013
2057
  onChange: (e) => setFillColor(e.target.value),
2014
- className: inputStyles.color.picker
2058
+ className: "color-picker"
2015
2059
  }
2016
2060
  ),
2017
2061
  /* @__PURE__ */ jsxRuntime.jsx(
2018
- "div",
2062
+ "input",
2019
2063
  {
2020
- className: inputStyles.color.preview,
2021
- style: { backgroundColor: fillColor }
2064
+ type: "text",
2065
+ value: fillColor,
2066
+ onChange: (e) => setFillColor(e.target.value),
2067
+ className: "color-text"
2022
2068
  }
2023
2069
  )
2024
2070
  ] })
2025
2071
  ] }),
2026
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
2027
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Opacity" }),
2028
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.range.container, children: [
2072
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2073
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Opacity" }),
2074
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
2029
2075
  /* @__PURE__ */ jsxRuntime.jsx(
2030
2076
  "input",
2031
2077
  {
@@ -2034,39 +2080,41 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2034
2080
  max: "100",
2035
2081
  value: opacity,
2036
2082
  onChange: (e) => setOpacity(Number(e.target.value)),
2037
- className: inputStyles.range.gradient
2083
+ className: "slider-purple"
2038
2084
  }
2039
2085
  ),
2040
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: inputStyles.range.value, children: [
2086
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "slider-value", children: [
2041
2087
  opacity,
2042
2088
  "%"
2043
2089
  ] })
2044
2090
  ] })
2045
2091
  ] }),
2046
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
2047
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Stroke Color" }),
2048
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.color.container, children: [
2092
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2093
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Stroke Color" }),
2094
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "color-inputs", children: [
2049
2095
  /* @__PURE__ */ jsxRuntime.jsx(
2050
2096
  "input",
2051
2097
  {
2052
2098
  type: "color",
2053
2099
  value: strokeColor,
2054
2100
  onChange: (e) => setStrokeColor(e.target.value),
2055
- className: inputStyles.color.picker
2101
+ className: "color-picker"
2056
2102
  }
2057
2103
  ),
2058
2104
  /* @__PURE__ */ jsxRuntime.jsx(
2059
- "div",
2105
+ "input",
2060
2106
  {
2061
- className: inputStyles.color.preview,
2062
- style: { backgroundColor: strokeColor }
2107
+ type: "text",
2108
+ value: strokeColor,
2109
+ onChange: (e) => setStrokeColor(e.target.value),
2110
+ className: "color-text"
2063
2111
  }
2064
2112
  )
2065
2113
  ] })
2066
2114
  ] }),
2067
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
2068
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Line Width" }),
2069
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.range.container, children: [
2115
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2116
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Line Width" }),
2117
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
2070
2118
  /* @__PURE__ */ jsxRuntime.jsx(
2071
2119
  "input",
2072
2120
  {
@@ -2075,21 +2123,21 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2075
2123
  max: "20",
2076
2124
  value: lineWidth,
2077
2125
  onChange: (e) => setLineWidth(Number(e.target.value)),
2078
- className: inputStyles.range.base
2126
+ className: "slider-purple"
2079
2127
  }
2080
2128
  ),
2081
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: inputStyles.range.value, children: [
2129
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "slider-value", children: [
2082
2130
  lineWidth,
2083
2131
  "px"
2084
2132
  ] })
2085
2133
  ] })
2086
2134
  ] }),
2087
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8", children: /* @__PURE__ */ jsxRuntime.jsx(
2135
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex panel-section", children: /* @__PURE__ */ jsxRuntime.jsx(
2088
2136
  "button",
2089
2137
  {
2090
2138
  onClick: handleApplyChanges,
2091
- className: inputStyles.button.primary,
2092
- children: "Apply Changes"
2139
+ className: "btn-primary w-full",
2140
+ children: operation
2093
2141
  }
2094
2142
  ) })
2095
2143
  ] });
@@ -2140,6 +2188,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2140
2188
  opacity,
2141
2189
  strokeColor,
2142
2190
  lineWidth,
2191
+ operation: selectedElement instanceof timeline.RectElement ? "Apply Changes" : "Add Rectangle",
2143
2192
  setCornerRadius,
2144
2193
  setFillColor,
2145
2194
  setOpacity,
@@ -2162,6 +2211,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2162
2211
  opacity,
2163
2212
  strokeColor,
2164
2213
  lineWidth,
2214
+ operation,
2165
2215
  setRadius,
2166
2216
  setFillColor,
2167
2217
  setOpacity,
@@ -2169,11 +2219,11 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2169
2219
  setLineWidth,
2170
2220
  handleApplyChanges
2171
2221
  }) {
2172
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.panel.container, children: [
2173
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: inputStyles.panel.title, children: "Circle" }),
2174
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
2175
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Radius" }),
2176
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.range.container, children: [
2222
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
2223
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-title", children: "Circle" }),
2224
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2225
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Radius" }),
2226
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
2177
2227
  /* @__PURE__ */ jsxRuntime.jsx(
2178
2228
  "input",
2179
2229
  {
@@ -2182,39 +2232,41 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2182
2232
  max: "300",
2183
2233
  value: radius,
2184
2234
  onChange: (e) => setRadius(Number(e.target.value)),
2185
- className: inputStyles.range.base
2235
+ className: "slider-purple"
2186
2236
  }
2187
2237
  ),
2188
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: inputStyles.range.value, children: [
2238
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "slider-value", children: [
2189
2239
  radius,
2190
2240
  "px"
2191
2241
  ] })
2192
2242
  ] })
2193
2243
  ] }),
2194
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
2195
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Fill Color" }),
2196
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.color.container, children: [
2244
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2245
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Fill Color" }),
2246
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "color-inputs", children: [
2197
2247
  /* @__PURE__ */ jsxRuntime.jsx(
2198
2248
  "input",
2199
2249
  {
2200
2250
  type: "color",
2201
2251
  value: fillColor,
2202
2252
  onChange: (e) => setFillColor(e.target.value),
2203
- className: inputStyles.color.picker
2253
+ className: "color-picker"
2204
2254
  }
2205
2255
  ),
2206
2256
  /* @__PURE__ */ jsxRuntime.jsx(
2207
- "div",
2257
+ "input",
2208
2258
  {
2209
- className: inputStyles.color.preview,
2210
- style: { backgroundColor: fillColor }
2259
+ type: "text",
2260
+ value: fillColor,
2261
+ onChange: (e) => setFillColor(e.target.value),
2262
+ className: "color-text"
2211
2263
  }
2212
2264
  )
2213
2265
  ] })
2214
2266
  ] }),
2215
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
2216
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Opacity" }),
2217
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.range.container, children: [
2267
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2268
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Opacity" }),
2269
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
2218
2270
  /* @__PURE__ */ jsxRuntime.jsx(
2219
2271
  "input",
2220
2272
  {
@@ -2223,39 +2275,41 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2223
2275
  max: "100",
2224
2276
  value: opacity,
2225
2277
  onChange: (e) => setOpacity(Number(e.target.value)),
2226
- className: inputStyles.range.gradient
2278
+ className: "slider-purple"
2227
2279
  }
2228
2280
  ),
2229
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: inputStyles.range.value, children: [
2281
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "slider-value", children: [
2230
2282
  opacity,
2231
2283
  "%"
2232
2284
  ] })
2233
2285
  ] })
2234
2286
  ] }),
2235
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
2236
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Stroke Color" }),
2237
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.color.container, children: [
2287
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2288
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Stroke Color" }),
2289
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "color-inputs", children: [
2238
2290
  /* @__PURE__ */ jsxRuntime.jsx(
2239
2291
  "input",
2240
2292
  {
2241
2293
  type: "color",
2242
2294
  value: strokeColor,
2243
2295
  onChange: (e) => setStrokeColor(e.target.value),
2244
- className: inputStyles.color.picker
2296
+ className: "color-picker"
2245
2297
  }
2246
2298
  ),
2247
2299
  /* @__PURE__ */ jsxRuntime.jsx(
2248
- "div",
2300
+ "input",
2249
2301
  {
2250
- className: inputStyles.color.preview,
2251
- style: { backgroundColor: strokeColor }
2302
+ type: "text",
2303
+ value: strokeColor,
2304
+ onChange: (e) => setStrokeColor(e.target.value),
2305
+ className: "color-text"
2252
2306
  }
2253
2307
  )
2254
2308
  ] })
2255
2309
  ] }),
2256
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.container, children: [
2257
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: inputStyles.label.base, children: "Line Width" }),
2258
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inputStyles.range.container, children: [
2310
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2311
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Line Width" }),
2312
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
2259
2313
  /* @__PURE__ */ jsxRuntime.jsx(
2260
2314
  "input",
2261
2315
  {
@@ -2264,23 +2318,16 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2264
2318
  max: "20",
2265
2319
  value: lineWidth,
2266
2320
  onChange: (e) => setLineWidth(Number(e.target.value)),
2267
- className: inputStyles.range.base
2321
+ className: "slider-purple"
2268
2322
  }
2269
2323
  ),
2270
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: inputStyles.range.value, children: [
2324
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "slider-value", children: [
2271
2325
  lineWidth,
2272
2326
  "px"
2273
2327
  ] })
2274
2328
  ] })
2275
2329
  ] }),
2276
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8", children: /* @__PURE__ */ jsxRuntime.jsx(
2277
- "button",
2278
- {
2279
- onClick: handleApplyChanges,
2280
- className: inputStyles.button.primary,
2281
- children: "Apply Changes"
2282
- }
2283
- ) })
2330
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex panel-section", children: /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: handleApplyChanges, className: "btn-primary w-full", children: operation }) })
2284
2331
  ] });
2285
2332
  }
2286
2333
  const DEFAULT_CIRCLE_PROPS = {
@@ -2330,6 +2377,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2330
2377
  opacity,
2331
2378
  strokeColor,
2332
2379
  lineWidth,
2380
+ operation: selectedElement instanceof timeline.CircleElement ? "Apply Changes" : "Add Circle",
2333
2381
  setRadius,
2334
2382
  setFillColor,
2335
2383
  setOpacity,
@@ -2434,9 +2482,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2434
2482
  case "subtitle":
2435
2483
  return /* @__PURE__ */ jsxRuntime.jsx(SubtitlesPanel, {});
2436
2484
  default:
2437
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: inputStyles.panel.container, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 flex h-full items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
2438
- /* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "w-12 h-12 mx-auto mb-4 text-purple-500/50" }),
2439
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: inputStyles.label.base, children: "Select a Tool to Begin" })
2485
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-container", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "empty-state", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "empty-state-content", children: [
2486
+ /* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "empty-state-icon" }),
2487
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "empty-state-text", children: "Select a Tool to Begin" })
2440
2488
  ] }) }) });
2441
2489
  }
2442
2490
  };
@@ -2559,23 +2607,25 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2559
2607
  }
2560
2608
  return sections;
2561
2609
  }, [selectedElement]);
2562
- if (!selectedElement) {
2563
- return null;
2564
- }
2565
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-16 bg-neutral/80 border-l border-gray-300/50 flex flex-col items-center py-4 space-y-3 justify-start backdrop-blur-md shadow-lg", children: availableSections.map((tool) => {
2610
+ react.useEffect(() => {
2611
+ if (availableSections == null ? void 0 : availableSections.length) {
2612
+ if (availableSections.map((section) => section.id).indexOf(selectedProp) === -1) {
2613
+ setSelectedProp(availableSections[0].id);
2614
+ }
2615
+ }
2616
+ }, [availableSections]);
2617
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sidebar", children: availableSections.map((tool) => {
2566
2618
  const Icon2 = getIcon(tool.icon);
2567
2619
  const isSelected = selectedProp === tool.id;
2568
2620
  return /* @__PURE__ */ jsxRuntime.jsxs(
2569
- "button",
2621
+ "div",
2570
2622
  {
2571
2623
  onClick: () => setSelectedProp(tool.id),
2572
- className: `
2573
- props-toolbar-btn group ${isSelected ? "active" : ""}
2574
- `,
2624
+ className: `toolbar-btn ${isSelected ? "active" : ""}`,
2575
2625
  title: `${tool.name}${tool.shortcut ? ` (${tool.shortcut})` : ""}`,
2576
2626
  children: [
2577
- /* @__PURE__ */ jsxRuntime.jsx(Icon2, { className: "w-4 h-4" }),
2578
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] mt-1 transition-opacity duration-200", children: tool.name })
2627
+ /* @__PURE__ */ jsxRuntime.jsx(Icon2, { className: "icon-sm" }),
2628
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "props-toolbar-label", children: tool.name })
2579
2629
  ]
2580
2630
  },
2581
2631
  tool.id
@@ -2590,79 +2640,75 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2590
2640
  updateElement == null ? void 0 : updateElement(selectedElement == null ? void 0 : selectedElement.setProps({ ...elementProps, ...props }));
2591
2641
  }
2592
2642
  };
2593
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
2594
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-neutral-800/40 rounded-lg p-2.5 border border-gray-600/20", children: [
2595
- /* @__PURE__ */ jsxRuntime.jsxs("h5", { className: "text-xs font-semibold text-gray-200 mb-2 flex items-center gap-1.5", children: [
2596
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-1.5 h-1.5 bg-purple-400 rounded-full" }),
2597
- "Position & Size"
2598
- ] }),
2599
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
2643
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
2644
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-title", children: "All Properties" }),
2645
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2646
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Position" }),
2647
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-container", children: [
2600
2648
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2601
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "X" }),
2649
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-small", children: "X" }),
2602
2650
  /* @__PURE__ */ jsxRuntime.jsx(
2603
2651
  "input",
2604
2652
  {
2605
2653
  type: "number",
2606
2654
  value: x ?? 0,
2607
2655
  onChange: (e) => handleUpdateElement({ x: Number(e.target.value) }),
2608
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200"
2656
+ className: "input-dark"
2609
2657
  }
2610
2658
  )
2611
2659
  ] }),
2612
2660
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2613
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "Y" }),
2661
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-small", children: "Y" }),
2614
2662
  /* @__PURE__ */ jsxRuntime.jsx(
2615
2663
  "input",
2616
2664
  {
2617
2665
  type: "number",
2618
2666
  value: y ?? 0,
2619
2667
  onChange: (e) => handleUpdateElement({ y: Number(e.target.value) }),
2620
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200"
2668
+ className: "input-dark"
2621
2669
  }
2622
2670
  )
2623
2671
  ] })
2624
2672
  ] })
2625
2673
  ] }),
2626
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-neutral-800/40 rounded-lg p-2.5 border border-gray-600/20", children: [
2627
- /* @__PURE__ */ jsxRuntime.jsxs("h5", { className: "text-xs font-semibold text-gray-200 mb-2 flex items-center gap-1.5", children: [
2628
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-1.5 h-1.5 bg-purple-400 rounded-full" }),
2629
- "Opacity"
2630
- ] }),
2631
- /* @__PURE__ */ jsxRuntime.jsx(
2632
- "input",
2633
- {
2634
- type: "range",
2635
- min: "0",
2636
- max: "100",
2637
- value: (opacity ?? 1) * 100,
2638
- onChange: (e) => handleUpdateElement({ opacity: Number(e.target.value) / 100 }),
2639
- className: "w-full h-1.5 bg-gradient-to-r from-purple-500/30 to-neutral-600/50 rounded-full appearance-none cursor-pointer slider-thumb"
2640
- }
2641
- ),
2642
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between text-xs text-gray-400 mt-1", children: [
2643
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "0%" }),
2644
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "100%" })
2674
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2675
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Opacity" }),
2676
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
2677
+ /* @__PURE__ */ jsxRuntime.jsx(
2678
+ "input",
2679
+ {
2680
+ type: "range",
2681
+ min: "0",
2682
+ max: "100",
2683
+ value: (opacity ?? 1) * 100,
2684
+ onChange: (e) => handleUpdateElement({ opacity: Number(e.target.value) / 100 }),
2685
+ className: "slider-purple"
2686
+ }
2687
+ ),
2688
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "slider-value", children: [
2689
+ Math.round((opacity ?? 1) * 100),
2690
+ "%"
2691
+ ] })
2645
2692
  ] })
2646
2693
  ] }),
2647
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-neutral-800/40 rounded-lg p-2.5 border border-gray-600/20", children: [
2648
- /* @__PURE__ */ jsxRuntime.jsxs("h5", { className: "text-xs font-semibold text-gray-200 mb-2 flex items-center gap-1.5", children: [
2649
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-1.5 h-1.5 bg-purple-400 rounded-full" }),
2650
- "Rotation"
2651
- ] }),
2652
- /* @__PURE__ */ jsxRuntime.jsx(
2653
- "input",
2654
- {
2655
- type: "range",
2656
- min: "0",
2657
- max: "360",
2658
- value: rotation ?? 0,
2659
- onChange: (e) => handleUpdateElement({ rotation: Number(e.target.value) }),
2660
- className: "w-full h-1.5 bg-gradient-to-r from-purple-500/30 to-neutral-600/50 rounded-full appearance-none cursor-pointer slider-thumb"
2661
- }
2662
- ),
2663
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between text-xs text-gray-400 mt-1", children: [
2664
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "0°" }),
2665
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "360°" })
2694
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2695
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Rotation" }),
2696
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
2697
+ /* @__PURE__ */ jsxRuntime.jsx(
2698
+ "input",
2699
+ {
2700
+ type: "range",
2701
+ min: "0",
2702
+ max: "360",
2703
+ value: rotation ?? 0,
2704
+ onChange: (e) => handleUpdateElement({ rotation: Number(e.target.value) }),
2705
+ className: "slider-purple"
2706
+ }
2707
+ ),
2708
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "slider-value", children: [
2709
+ rotation ?? 0,
2710
+ "°"
2711
+ ] })
2666
2712
  ] })
2667
2713
  ] })
2668
2714
  ] });
@@ -2695,18 +2741,16 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2695
2741
  selectedElement.setTextEffect(effect);
2696
2742
  updateElement == null ? void 0 : updateElement(selectedElement);
2697
2743
  };
2698
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
2699
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-neutral-800/40 rounded-lg p-2.5 border border-gray-600/20", children: [
2700
- /* @__PURE__ */ jsxRuntime.jsxs("h5", { className: "text-xs font-semibold text-gray-200 mb-2 flex items-center gap-1.5", children: [
2701
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-1.5 h-1.5 bg-purple-400 rounded-full" }),
2702
- "Text Effect Type"
2703
- ] }),
2744
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
2745
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-title", children: "Text Effects" }),
2746
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2747
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Text Effect Type" }),
2704
2748
  /* @__PURE__ */ jsxRuntime.jsxs(
2705
2749
  "select",
2706
2750
  {
2707
2751
  value: (currentEffect == null ? void 0 : currentEffect.getName()) || "",
2708
2752
  onChange: (e) => handleUpdateEffect({ name: e.target.value }),
2709
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200",
2753
+ className: "select-dark w-full",
2710
2754
  children: [
2711
2755
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: "No Effect" }),
2712
2756
  VideoEditor.TEXT_EFFECTS.map((effect) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: effect.name, children: effect.name.charAt(0).toUpperCase() + effect.name.slice(1) }, effect.name))
@@ -2714,57 +2758,51 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2714
2758
  }
2715
2759
  )
2716
2760
  ] }),
2717
- currentEffect && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-neutral-800/40 rounded-lg p-2.5 border border-gray-600/20", children: [
2718
- /* @__PURE__ */ jsxRuntime.jsxs("h5", { className: "text-xs font-semibold text-gray-200 mb-2 flex items-center gap-1.5", children: [
2719
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-1.5 h-1.5 bg-purple-400 rounded-full" }),
2720
- "Effect Options"
2761
+ currentEffect && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2762
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2763
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Delay (seconds)" }),
2764
+ /* @__PURE__ */ jsxRuntime.jsx(
2765
+ "input",
2766
+ {
2767
+ type: "number",
2768
+ min: "0",
2769
+ max: "5",
2770
+ step: "0.1",
2771
+ value: currentEffect.getDelay() ?? 0,
2772
+ onChange: (e) => handleUpdateEffect({ delay: Number(e.target.value) }),
2773
+ className: "input-dark"
2774
+ }
2775
+ )
2721
2776
  ] }),
2722
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
2723
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2724
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "Delay (seconds)" }),
2725
- /* @__PURE__ */ jsxRuntime.jsx(
2726
- "input",
2727
- {
2728
- type: "number",
2729
- min: "0",
2730
- max: "5",
2731
- step: "0.1",
2732
- value: currentEffect.getDelay() ?? 0,
2733
- onChange: (e) => handleUpdateEffect({ delay: Number(e.target.value) }),
2734
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200"
2735
- }
2736
- )
2737
- ] }),
2738
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2739
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "Duration (seconds)" }),
2740
- /* @__PURE__ */ jsxRuntime.jsx(
2741
- "input",
2742
- {
2743
- type: "number",
2744
- min: "0.1",
2745
- max: "10",
2746
- step: "0.1",
2747
- value: currentEffect.getDuration() ?? 1,
2748
- onChange: (e) => handleUpdateEffect({ duration: Number(e.target.value) }),
2749
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200"
2750
- }
2751
- )
2752
- ] }),
2753
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2754
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "Buffer Time (seconds)" }),
2755
- /* @__PURE__ */ jsxRuntime.jsx(
2756
- "input",
2757
- {
2758
- type: "number",
2759
- min: "0.05",
2760
- max: "1",
2761
- step: "0.05",
2762
- value: currentEffect.getBufferTime() ?? 0.1,
2763
- onChange: (e) => handleUpdateEffect({ bufferTime: Number(e.target.value) }),
2764
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200"
2765
- }
2766
- )
2767
- ] })
2777
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2778
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Duration (seconds)" }),
2779
+ /* @__PURE__ */ jsxRuntime.jsx(
2780
+ "input",
2781
+ {
2782
+ type: "number",
2783
+ min: "0.1",
2784
+ max: "10",
2785
+ step: "0.1",
2786
+ value: currentEffect.getDuration() ?? 1,
2787
+ onChange: (e) => handleUpdateEffect({ duration: Number(e.target.value) }),
2788
+ className: "input-dark"
2789
+ }
2790
+ )
2791
+ ] }),
2792
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2793
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Buffer Time (seconds)" }),
2794
+ /* @__PURE__ */ jsxRuntime.jsx(
2795
+ "input",
2796
+ {
2797
+ type: "number",
2798
+ min: "0.05",
2799
+ max: "1",
2800
+ step: "0.05",
2801
+ value: currentEffect.getBufferTime() ?? 0.1,
2802
+ onChange: (e) => handleUpdateEffect({ bufferTime: Number(e.target.value) }),
2803
+ className: "input-dark"
2804
+ }
2805
+ )
2768
2806
  ] })
2769
2807
  ] })
2770
2808
  ] });
@@ -2824,18 +2862,16 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2824
2862
  selectedElement.setAnimation(animation);
2825
2863
  updateElement == null ? void 0 : updateElement(selectedElement);
2826
2864
  };
2827
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
2828
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-neutral-800/40 rounded-lg p-2.5 border border-gray-600/20", children: [
2829
- /* @__PURE__ */ jsxRuntime.jsxs("h5", { className: "text-xs font-semibold text-gray-200 mb-2 flex items-center gap-1.5", children: [
2830
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-1.5 h-1.5 bg-purple-400 rounded-full" }),
2831
- "Animation Type"
2832
- ] }),
2865
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
2866
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-title", children: "Animations" }),
2867
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2868
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Type" }),
2833
2869
  /* @__PURE__ */ jsxRuntime.jsxs(
2834
2870
  "select",
2835
2871
  {
2836
2872
  value: (currentAnimation == null ? void 0 : currentAnimation.getName()) || "",
2837
2873
  onChange: (e) => handleUpdateAnimation({ name: e.target.value }),
2838
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200",
2874
+ className: "select-dark w-full",
2839
2875
  children: [
2840
2876
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: "No Animation" }),
2841
2877
  VideoEditor.ANIMATIONS.map((animation) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: animation.name, children: animation.name.charAt(0).toUpperCase() + animation.name.slice(1) }, animation.name))
@@ -2843,66 +2879,62 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2843
2879
  }
2844
2880
  )
2845
2881
  ] }),
2846
- currentAnimation && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-neutral-800/40 rounded-lg p-2.5 border border-gray-600/20", children: [
2847
- /* @__PURE__ */ jsxRuntime.jsxs("h5", { className: "text-xs font-semibold text-gray-200 mb-2 flex items-center gap-1.5", children: [
2848
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-1.5 h-1.5 bg-purple-400 rounded-full" }),
2849
- "Animation Options"
2850
- ] }),
2851
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: (() => {
2852
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
2853
- const animationDef = VideoEditor.ANIMATIONS.find(
2854
- (a) => a.name === currentAnimation.getName()
2855
- );
2856
- if (!animationDef || !animationDef.options) return null;
2857
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2858
- ((_a = animationDef.options) == null ? void 0 : _a.animate) && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2859
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "When to Animate" }),
2860
- /* @__PURE__ */ jsxRuntime.jsx(
2861
- "select",
2862
- {
2863
- value: currentAnimation.getAnimate(),
2864
- onChange: (e) => handleUpdateAnimation({
2865
- animate: e.target.value
2866
- }),
2867
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200",
2868
- children: (_b = animationDef.options) == null ? void 0 : _b.animate.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option, children: option.charAt(0).toUpperCase() + option.slice(1) }, option))
2869
- }
2870
- )
2871
- ] }),
2872
- ((_c = animationDef.options) == null ? void 0 : _c.direction) && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2873
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "Direction" }),
2874
- /* @__PURE__ */ jsxRuntime.jsx(
2875
- "select",
2876
- {
2877
- value: currentAnimation.getDirection(),
2878
- onChange: (e) => handleUpdateAnimation({
2879
- direction: e.target.value
2880
- }),
2881
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200",
2882
- children: (_d = animationDef.options) == null ? void 0 : _d.direction.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option, children: option.charAt(0).toUpperCase() + option.slice(1) }, option))
2883
- }
2884
- )
2885
- ] }),
2886
- ((_e = animationDef.options) == null ? void 0 : _e.mode) && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2887
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "Mode" }),
2888
- /* @__PURE__ */ jsxRuntime.jsx(
2889
- "select",
2890
- {
2891
- value: currentAnimation.getMode(),
2892
- onChange: (e) => handleUpdateAnimation({
2893
- mode: e.target.value
2894
- }),
2895
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200",
2896
- children: (_f = animationDef.options) == null ? void 0 : _f.mode.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option, children: option.charAt(0).toUpperCase() + option.slice(1) }, option))
2897
- }
2898
- )
2899
- ] }),
2900
- ((_g = animationDef.options) == null ? void 0 : _g.duration) && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2901
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "Duration (seconds)" }),
2882
+ currentAnimation && /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: (() => {
2883
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
2884
+ const animationDef = VideoEditor.ANIMATIONS.find(
2885
+ (a) => a.name === currentAnimation.getName()
2886
+ );
2887
+ if (!animationDef || !animationDef.options) return null;
2888
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2889
+ ((_a = animationDef.options) == null ? void 0 : _a.animate) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2890
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "When to Animate" }),
2891
+ /* @__PURE__ */ jsxRuntime.jsx(
2892
+ "select",
2893
+ {
2894
+ value: currentAnimation.getAnimate(),
2895
+ onChange: (e) => handleUpdateAnimation({
2896
+ animate: e.target.value
2897
+ }),
2898
+ className: "select-dark w-full",
2899
+ children: (_b = animationDef.options) == null ? void 0 : _b.animate.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option, children: option.charAt(0).toUpperCase() + option.slice(1) }, option))
2900
+ }
2901
+ )
2902
+ ] }),
2903
+ ((_c = animationDef.options) == null ? void 0 : _c.direction) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2904
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Direction" }),
2905
+ /* @__PURE__ */ jsxRuntime.jsx(
2906
+ "select",
2907
+ {
2908
+ value: currentAnimation.getDirection(),
2909
+ onChange: (e) => handleUpdateAnimation({
2910
+ direction: e.target.value
2911
+ }),
2912
+ className: "select-dark w-full",
2913
+ children: (_d = animationDef.options) == null ? void 0 : _d.direction.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option, children: option.charAt(0).toUpperCase() + option.slice(1) }, option))
2914
+ }
2915
+ )
2916
+ ] }),
2917
+ ((_e = animationDef.options) == null ? void 0 : _e.mode) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2918
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Mode" }),
2919
+ /* @__PURE__ */ jsxRuntime.jsx(
2920
+ "select",
2921
+ {
2922
+ value: currentAnimation.getMode(),
2923
+ onChange: (e) => handleUpdateAnimation({
2924
+ mode: e.target.value
2925
+ }),
2926
+ className: "select-dark w-full",
2927
+ children: (_f = animationDef.options) == null ? void 0 : _f.mode.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option, children: option.charAt(0).toUpperCase() + option.slice(1) }, option))
2928
+ }
2929
+ )
2930
+ ] }),
2931
+ ((_g = animationDef.options) == null ? void 0 : _g.duration) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2932
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Duration (seconds)" }),
2933
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
2902
2934
  /* @__PURE__ */ jsxRuntime.jsx(
2903
2935
  "input",
2904
2936
  {
2905
- type: "number",
2937
+ type: "range",
2906
2938
  min: (_h = animationDef.options) == null ? void 0 : _h.duration[0],
2907
2939
  max: (_i = animationDef.options) == null ? void 0 : _i.duration[1],
2908
2940
  step: "0.1",
@@ -2910,16 +2942,19 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2910
2942
  onChange: (e) => handleUpdateAnimation({
2911
2943
  duration: Number(e.target.value)
2912
2944
  }),
2913
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200"
2945
+ className: "slider-purple"
2914
2946
  }
2915
- )
2916
- ] }),
2917
- ((_j = animationDef.options) == null ? void 0 : _j.interval) && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2918
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "Interval (seconds)" }),
2947
+ ),
2948
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "slider-value", children: currentAnimation.getDuration() })
2949
+ ] })
2950
+ ] }),
2951
+ ((_j = animationDef.options) == null ? void 0 : _j.interval) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2952
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Interval (seconds)" }),
2953
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
2919
2954
  /* @__PURE__ */ jsxRuntime.jsx(
2920
2955
  "input",
2921
2956
  {
2922
- type: "number",
2957
+ type: "range",
2923
2958
  min: (_k = animationDef.options) == null ? void 0 : _k.interval[0],
2924
2959
  max: (_l = animationDef.options) == null ? void 0 : _l.interval[1],
2925
2960
  step: "0.1",
@@ -2927,16 +2962,19 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2927
2962
  onChange: (e) => handleUpdateAnimation({
2928
2963
  interval: Number(e.target.value)
2929
2964
  }),
2930
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200"
2965
+ className: "slider-purple"
2931
2966
  }
2932
- )
2933
- ] }),
2934
- ((_m = animationDef.options) == null ? void 0 : _m.intensity) && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2935
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "block text-xs text-gray-400 mb-1", children: "Intensity" }),
2967
+ ),
2968
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "slider-value", children: currentAnimation.getInterval() })
2969
+ ] })
2970
+ ] }),
2971
+ ((_m = animationDef.options) == null ? void 0 : _m.intensity) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
2972
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Intensity" }),
2973
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
2936
2974
  /* @__PURE__ */ jsxRuntime.jsx(
2937
2975
  "input",
2938
2976
  {
2939
- type: "number",
2977
+ type: "range",
2940
2978
  min: (_n = animationDef.options) == null ? void 0 : _n.intensity[0],
2941
2979
  max: (_o = animationDef.options) == null ? void 0 : _o.intensity[1],
2942
2980
  step: "0.1",
@@ -2944,13 +2982,14 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2944
2982
  onChange: (e) => handleUpdateAnimation({
2945
2983
  intensity: Number(e.target.value)
2946
2984
  }),
2947
- className: "w-full bg-neutral-700/60 border border-gray-600/40 rounded-md text-white text-xs px-2 py-1.5 focus:border-purple-500 focus:outline-none focus:ring-1 focus:ring-purple-500/30 transition-all duration-200"
2985
+ className: "slider-purple"
2948
2986
  }
2949
- )
2987
+ ),
2988
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "slider-value", children: currentAnimation.getIntensity() })
2950
2989
  ] })
2951
- ] });
2952
- })() })
2953
- ] })
2990
+ ] })
2991
+ ] });
2992
+ })() })
2954
2993
  ] });
2955
2994
  }
2956
2995
  function PlaybackPropsPanel({
@@ -2964,42 +3003,26 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2964
3003
  updateElement == null ? void 0 : updateElement(selectedElement == null ? void 0 : selectedElement.setProps({ ...elementProps, ...props }));
2965
3004
  }
2966
3005
  };
2967
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-neutral-800/40 rounded-lg p-2.5 border border-gray-600/20", children: [
2968
- /* @__PURE__ */ jsxRuntime.jsxs("h5", { className: "text-xs font-semibold text-gray-200 mb-2 flex items-center gap-1.5", children: [
2969
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-1.5 h-1.5 bg-purple-400 rounded-full" }),
2970
- "Volume"
2971
- ] }),
2972
- /* @__PURE__ */ jsxRuntime.jsx(
2973
- "input",
2974
- {
2975
- type: "range",
2976
- min: "0",
2977
- max: "3",
2978
- step: 0.1,
2979
- value: volume ?? 0,
2980
- onChange: (e) => handleUpdateElement({ volume: Number(e.target.value) }),
2981
- className: "w-full h-1.5 bg-gradient-to-r from-purple-500/30 to-neutral-600/50 rounded-full appearance-none cursor-pointer slider-thumb"
2982
- }
2983
- ),
2984
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between text-xs text-gray-400 mt-1", children: [
2985
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "0" }),
2986
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "3" })
3006
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-container", children: [
3007
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-title", children: "Playback Properties" }),
3008
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "panel-section", children: [
3009
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "label-dark", children: "Volume" }),
3010
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-container", children: [
3011
+ /* @__PURE__ */ jsxRuntime.jsx(
3012
+ "input",
3013
+ {
3014
+ type: "range",
3015
+ min: "0",
3016
+ max: "3",
3017
+ step: 0.1,
3018
+ value: volume ?? 0,
3019
+ onChange: (e) => handleUpdateElement({ volume: Number(e.target.value) }),
3020
+ className: "slider-purple"
3021
+ }
3022
+ ),
3023
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "slider-value", children: volume ?? 0 })
3024
+ ] })
2987
3025
  ] })
2988
- ] }) });
2989
- }
2990
- function PropContainer({ title, icon, children }) {
2991
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-gray-600/30 last:border-b-0 bg-gradient-to-b from-neutral-800/40 to-neutral-800/20 backdrop-blur-sm", children: [
2992
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex items-center justify-between px-3 py-2.5 text-left text-gray-200 hover:text-white hover:bg-gradient-to-r hover:from-purple-600/20 hover:to-purple-500/10 transition-all duration-200 rounded-none border-l-2 border-transparent hover:border-purple-500/50", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5", children: [
2993
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-purple-400/80", children: icon }),
2994
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-sm", children: title })
2995
- ] }) }),
2996
- /* @__PURE__ */ jsxRuntime.jsx(
2997
- "div",
2998
- {
2999
- className: `overflow-x-hidden overflow-y-auto p-1 transition-all duration-300 ease-in-out`,
3000
- children
3001
- }
3002
- )
3003
3026
  ] });
3004
3027
  }
3005
3028
  function PropertiesPanelContainer({
@@ -3008,58 +3031,37 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3008
3031
  updateElement
3009
3032
  }) {
3010
3033
  if (!selectedElement) {
3011
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-72 h-full bg-gradient-to-b from-neutral-800/90 to-neutral-900/80 border-l border-gray-600/40 overflow-y-auto overflow-x-hidden backdrop-blur-xl shadow-2xl", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-3 py-3 border-b border-gray-600/30 bg-gradient-to-r from-purple-600/10 to-transparent", children: /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-bold text-white", children: "Select Element to see properties" }) }) });
3034
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "panel-container", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "properties-header", children: /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "properties-title", children: "Select Element to see properties" }) }) });
3012
3035
  }
3013
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-72 h-full bg-gradient-to-b from-neutral-800/90 to-neutral-900/80 border-l border-gray-600/40 overflow-y-hidden overflow-x-hidden backdrop-blur-xl shadow-2xl", children: [
3036
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3014
3037
  selectedProp === "element-props" && /* @__PURE__ */ jsxRuntime.jsx(
3015
- PropContainer,
3038
+ ElementProps,
3016
3039
  {
3017
- title: "All Properties",
3018
- icon: /* @__PURE__ */ jsxRuntime.jsx(Settings, { className: "w-4 h-4" }),
3019
- children: /* @__PURE__ */ jsxRuntime.jsx(
3020
- ElementProps,
3021
- {
3022
- selectedElement,
3023
- updateElement
3024
- }
3025
- )
3040
+ selectedElement,
3041
+ updateElement
3026
3042
  }
3027
3043
  ),
3028
3044
  selectedProp === "playback-props" && /* @__PURE__ */ jsxRuntime.jsx(
3029
- PropContainer,
3045
+ PlaybackPropsPanel,
3030
3046
  {
3031
- title: "Playback Properties",
3032
- icon: /* @__PURE__ */ jsxRuntime.jsx(Music, { className: "w-4 h-4" }),
3033
- children: /* @__PURE__ */ jsxRuntime.jsx(
3034
- PlaybackPropsPanel,
3035
- {
3036
- selectedElement,
3037
- updateElement
3038
- }
3039
- )
3047
+ selectedElement,
3048
+ updateElement
3040
3049
  }
3041
3050
  ),
3042
3051
  selectedProp === "text-effects" && /* @__PURE__ */ jsxRuntime.jsx(
3043
- PropContainer,
3052
+ TextEffects,
3044
3053
  {
3045
- title: "Text Effects",
3046
- icon: /* @__PURE__ */ jsxRuntime.jsx(Sparkles, { className: "w-4 h-4" }),
3047
- children: /* @__PURE__ */ jsxRuntime.jsx(
3048
- TextEffects,
3049
- {
3050
- selectedElement,
3051
- updateElement
3052
- }
3053
- )
3054
+ selectedElement,
3055
+ updateElement
3054
3056
  }
3055
3057
  ),
3056
- selectedProp === "animations" && /* @__PURE__ */ jsxRuntime.jsx(PropContainer, { title: "Animations", icon: /* @__PURE__ */ jsxRuntime.jsx(Zap, { className: "w-4 h-4" }), children: /* @__PURE__ */ jsxRuntime.jsx(
3058
+ selectedProp === "animations" && /* @__PURE__ */ jsxRuntime.jsx(
3057
3059
  Animation,
3058
3060
  {
3059
3061
  selectedElement,
3060
3062
  updateElement
3061
3063
  }
3062
- ) })
3064
+ )
3063
3065
  ] });
3064
3066
  }
3065
3067
  const loadFile = (accept) => {
@@ -3178,7 +3180,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3178
3180
  }),
3179
3181
  [videoResolution, studioConfig]
3180
3182
  );
3181
- return /* @__PURE__ */ jsxRuntime.jsx(MediaProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "h-screen w-screen overflow-hidden bg-neutral-900 text-gray-100", children: [
3183
+ return /* @__PURE__ */ jsxRuntime.jsx(MediaProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "studio-container", children: [
3182
3184
  /* @__PURE__ */ jsxRuntime.jsx(
3183
3185
  StudioHeader,
3184
3186
  {
@@ -3188,7 +3190,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3188
3190
  onExportVideo
3189
3191
  }
3190
3192
  ),
3191
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-[calc(100vh-56px)]", children: [
3193
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "studio-content", children: [
3192
3194
  /* @__PURE__ */ jsxRuntime.jsx(
3193
3195
  Toolbar,
3194
3196
  {
@@ -3196,7 +3198,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3196
3198
  setSelectedTool
3197
3199
  }
3198
3200
  ),
3199
- /* @__PURE__ */ jsxRuntime.jsx("aside", { className: "border-r border-gray-600/50 backdrop-blur-md shadow-lg", children: /* @__PURE__ */ jsxRuntime.jsx(
3201
+ /* @__PURE__ */ jsxRuntime.jsx(
3200
3202
  ElementPanelContainer,
3201
3203
  {
3202
3204
  videoResolution,
@@ -3206,8 +3208,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3206
3208
  addElement,
3207
3209
  updateElement
3208
3210
  }
3209
- ) }),
3210
- /* @__PURE__ */ jsxRuntime.jsx("main", { className: "flex-1 flex flex-col bg-neutral-700 main-container", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 overflow-y-auto p-1", children: /* @__PURE__ */ jsxRuntime.jsx(
3211
+ ),
3212
+ /* @__PURE__ */ jsxRuntime.jsx("main", { className: "main-container", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "canvas-wrapper", children: /* @__PURE__ */ jsxRuntime.jsx(
3211
3213
  "div",
3212
3214
  {
3213
3215
  className: "canvas-container",
@@ -3217,14 +3219,14 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3217
3219
  children: /* @__PURE__ */ jsxRuntime.jsx(VideoEditor, { editorConfig: twickStudiConfig })
3218
3220
  }
3219
3221
  ) }) }),
3220
- /* @__PURE__ */ jsxRuntime.jsx("aside", { className: "border-r border-gray-600/50 backdrop-blur-md shadow-lg", children: /* @__PURE__ */ jsxRuntime.jsx(
3222
+ /* @__PURE__ */ jsxRuntime.jsx(
3221
3223
  PropertiesPanelContainer,
3222
3224
  {
3223
3225
  selectedProp,
3224
3226
  selectedElement,
3225
3227
  updateElement
3226
3228
  }
3227
- ) }),
3229
+ ),
3228
3230
  /* @__PURE__ */ jsxRuntime.jsx(
3229
3231
  PropsToolbar,
3230
3232
  {