@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/README.md +214 -122
- package/dist/components/panel/audio-panel.d.ts +1 -1
- package/dist/components/panel/circle-panel.d.ts +1 -1
- package/dist/components/panel/icon-panel.d.ts +1 -1
- package/dist/components/panel/image-panel.d.ts +1 -1
- package/dist/components/panel/rect-panel.d.ts +1 -1
- package/dist/components/panel/video-panel.d.ts +1 -1
- package/dist/components/props-toolbar.d.ts +1 -1
- package/dist/components/shared/file-input.d.ts +3 -1
- package/dist/components/shared/index.d.ts +1 -0
- package/dist/components/shared/url-input.d.ts +6 -0
- package/dist/hooks/use-circle-panel.d.ts +1 -0
- package/dist/hooks/use-rect-panel.d.ts +1 -0
- package/dist/index.js +671 -669
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +671 -669
- package/dist/index.mjs.map +1 -1
- package/dist/studio.css +2176 -284
- package/dist/twick.svg +3 -3
- package/dist/types/media-panel.d.ts +11 -6
- package/package.json +48 -50
- package/dist/components/shared/prop-container.d.ts +0 -7
- package/dist/styles/input-styles.d.ts +0 -39
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: "
|
|
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
|
-
"
|
|
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: "
|
|
487
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "
|
|
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: "
|
|
519
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex
|
|
520
|
-
/* @__PURE__ */ jsxRuntime.jsx(Clapperboard, { className: "
|
|
521
|
-
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-
|
|
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
|
|
521
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-container", children: [
|
|
524
522
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
525
523
|
"button",
|
|
526
524
|
{
|
|
527
|
-
className: "btn
|
|
525
|
+
className: "btn-ghost",
|
|
528
526
|
title: "Load Project",
|
|
529
527
|
onClick: onLoadProject,
|
|
530
528
|
children: [
|
|
531
|
-
/* @__PURE__ */ jsxRuntime.jsx(File, { className: "
|
|
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
|
|
537
|
+
className: "btn-ghost",
|
|
540
538
|
title: "Save Draft",
|
|
541
539
|
onClick: onSaveProject,
|
|
542
540
|
children: [
|
|
543
|
-
/* @__PURE__ */ jsxRuntime.jsx(Save, { className: "
|
|
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
|
|
549
|
+
className: "btn-primary",
|
|
552
550
|
title: "Export",
|
|
553
551
|
onClick: onExportVideo,
|
|
554
552
|
children: [
|
|
555
|
-
/* @__PURE__ */ jsxRuntime.jsx(Download, { className: "
|
|
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: "
|
|
633
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "
|
|
634
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex
|
|
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: "
|
|
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: "
|
|
645
|
+
className: "btn-primary",
|
|
648
646
|
children: "Add"
|
|
649
647
|
}
|
|
650
648
|
)
|
|
651
|
-
] }),
|
|
652
|
-
|
|
649
|
+
] }) }),
|
|
650
|
+
subtitles.map((subtitle) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
653
651
|
"div",
|
|
654
652
|
{
|
|
655
|
-
className: "
|
|
653
|
+
className: "panel-section",
|
|
656
654
|
children: [
|
|
657
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex
|
|
658
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
659
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className: "
|
|
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: "
|
|
666
|
+
className: "input-dark"
|
|
669
667
|
}
|
|
670
668
|
)
|
|
671
669
|
] }),
|
|
672
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
673
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className: "
|
|
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: "
|
|
680
|
+
className: "input-dark"
|
|
683
681
|
}
|
|
684
682
|
)
|
|
685
683
|
] })
|
|
686
684
|
] }),
|
|
687
|
-
/* @__PURE__ */ jsxRuntime.
|
|
688
|
-
"
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
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: "
|
|
703
|
+
className: "btn-danger",
|
|
703
704
|
title: "Delete subtitle",
|
|
704
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Trash2, { className: "
|
|
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: "
|
|
712
|
+
className: "btn-primary",
|
|
712
713
|
title: "Save subtitle",
|
|
713
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Check, { className: "
|
|
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.
|
|
722
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { children: "No subtitles yet" }),
|
|
723
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "
|
|
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: "
|
|
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: "
|
|
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:
|
|
778
|
+
className: className || "btn-primary file-input-label",
|
|
776
779
|
children: [
|
|
777
|
-
/* @__PURE__ */ jsxRuntime.jsx(Upload, { className: "
|
|
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:
|
|
1077
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
1078
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className:
|
|
1079
|
-
|
|
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: "
|
|
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: "
|
|
1095
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "
|
|
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: "
|
|
1102
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
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: "
|
|
1111
|
-
children: playingAudio === item.id ? /* @__PURE__ */ jsxRuntime.jsx(Pause, { className: "
|
|
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: `
|
|
1115
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "
|
|
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: "
|
|
1124
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Plus, { className: "
|
|
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:
|
|
1133
|
-
/* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "
|
|
1134
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className:
|
|
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:
|
|
1180
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
1181
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className:
|
|
1182
|
-
|
|
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: "
|
|
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: "
|
|
1198
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid
|
|
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
|
|
1226
|
+
className: "media-item",
|
|
1203
1227
|
children: [
|
|
1204
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1205
|
-
|
|
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: "
|
|
1221
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Plus, { className: "
|
|
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:
|
|
1229
|
-
/* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "
|
|
1230
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className:
|
|
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:
|
|
1315
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
1316
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className:
|
|
1317
|
-
|
|
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: "
|
|
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: "
|
|
1333
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid
|
|
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
|
|
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:
|
|
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.
|
|
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:
|
|
1368
|
-
children: playingVideo === item.id ? /* @__PURE__ */ jsxRuntime.jsx(Pause, { className: "
|
|
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: "
|
|
1379
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Plus, { className: "
|
|
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:
|
|
1388
|
-
/* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "
|
|
1389
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className:
|
|
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:
|
|
1452
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
1453
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
"
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
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:
|
|
1520
|
+
className: "slider-purple"
|
|
1477
1521
|
}
|
|
1478
1522
|
),
|
|
1479
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className:
|
|
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:
|
|
1486
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
1487
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
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:
|
|
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:
|
|
1502
|
-
children:
|
|
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:
|
|
1510
|
-
children:
|
|
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:
|
|
1516
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
1517
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
1518
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1519
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
1520
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
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:
|
|
1580
|
+
className: "color-text"
|
|
1537
1581
|
}
|
|
1538
1582
|
)
|
|
1539
1583
|
] })
|
|
1540
1584
|
] }),
|
|
1541
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1542
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
1543
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
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:
|
|
1603
|
+
className: "color-text"
|
|
1560
1604
|
}
|
|
1561
1605
|
)
|
|
1562
1606
|
] })
|
|
1563
1607
|
] }),
|
|
1564
|
-
/* @__PURE__ */ jsxRuntime.
|
|
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:
|
|
1615
|
+
className: "checkbox-purple"
|
|
1573
1616
|
}
|
|
1574
1617
|
),
|
|
1575
|
-
|
|
1576
|
-
] }),
|
|
1577
|
-
applyShadow && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1578
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
1579
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
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:
|
|
1638
|
+
className: "color-text"
|
|
1596
1639
|
}
|
|
1597
1640
|
)
|
|
1598
1641
|
] })
|
|
1599
1642
|
] })
|
|
1600
1643
|
] })
|
|
1601
1644
|
] }),
|
|
1602
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
1603
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
1604
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
1657
|
+
className: "slider-purple"
|
|
1615
1658
|
}
|
|
1616
1659
|
),
|
|
1617
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className:
|
|
1660
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "slider-value", children: strokeWidth })
|
|
1618
1661
|
] })
|
|
1619
1662
|
] }),
|
|
1620
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "
|
|
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:
|
|
1771
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
1772
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className:
|
|
1773
|
-
|
|
1774
|
-
|
|
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: "
|
|
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: "
|
|
1849
|
+
className: "icon-content",
|
|
1804
1850
|
dangerouslySetInnerHTML: { __html: icon.svg }
|
|
1805
1851
|
}
|
|
1806
1852
|
),
|
|
1807
|
-
/* @__PURE__ */ jsxRuntime.
|
|
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: "
|
|
1861
|
+
className: "icon-action-btn",
|
|
1816
1862
|
title: "Add to timeline",
|
|
1817
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
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: "
|
|
1873
|
+
className: "icon-action-btn",
|
|
1828
1874
|
title: "Download SVG",
|
|
1829
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Download, { className: "
|
|
1875
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Download, { className: "icon-sm" })
|
|
1830
1876
|
}
|
|
1831
1877
|
)
|
|
1832
|
-
] })
|
|
1833
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "
|
|
1878
|
+
] }),
|
|
1879
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "icon-name", children: icon.name })
|
|
1834
1880
|
] }, index)) }),
|
|
1835
|
-
|
|
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:
|
|
1841
|
-
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:
|
|
1984
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
1985
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
1986
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
1987
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
2040
|
+
className: "slider-purple"
|
|
1997
2041
|
}
|
|
1998
2042
|
),
|
|
1999
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className:
|
|
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:
|
|
2006
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
2007
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
2058
|
+
className: "color-picker"
|
|
2015
2059
|
}
|
|
2016
2060
|
),
|
|
2017
2061
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2018
|
-
"
|
|
2062
|
+
"input",
|
|
2019
2063
|
{
|
|
2020
|
-
|
|
2021
|
-
|
|
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:
|
|
2027
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
2028
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
2083
|
+
className: "slider-purple"
|
|
2038
2084
|
}
|
|
2039
2085
|
),
|
|
2040
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className:
|
|
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:
|
|
2047
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
2048
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
2101
|
+
className: "color-picker"
|
|
2056
2102
|
}
|
|
2057
2103
|
),
|
|
2058
2104
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2059
|
-
"
|
|
2105
|
+
"input",
|
|
2060
2106
|
{
|
|
2061
|
-
|
|
2062
|
-
|
|
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:
|
|
2068
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
2069
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
2126
|
+
className: "slider-purple"
|
|
2079
2127
|
}
|
|
2080
2128
|
),
|
|
2081
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className:
|
|
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: "
|
|
2135
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex panel-section", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2088
2136
|
"button",
|
|
2089
2137
|
{
|
|
2090
2138
|
onClick: handleApplyChanges,
|
|
2091
|
-
className:
|
|
2092
|
-
children:
|
|
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:
|
|
2173
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
2174
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
2175
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
2176
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
2235
|
+
className: "slider-purple"
|
|
2186
2236
|
}
|
|
2187
2237
|
),
|
|
2188
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className:
|
|
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:
|
|
2195
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
2196
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
2253
|
+
className: "color-picker"
|
|
2204
2254
|
}
|
|
2205
2255
|
),
|
|
2206
2256
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2207
|
-
"
|
|
2257
|
+
"input",
|
|
2208
2258
|
{
|
|
2209
|
-
|
|
2210
|
-
|
|
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:
|
|
2216
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
2217
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
2278
|
+
className: "slider-purple"
|
|
2227
2279
|
}
|
|
2228
2280
|
),
|
|
2229
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className:
|
|
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:
|
|
2236
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
2237
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
2296
|
+
className: "color-picker"
|
|
2245
2297
|
}
|
|
2246
2298
|
),
|
|
2247
2299
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2248
|
-
"
|
|
2300
|
+
"input",
|
|
2249
2301
|
{
|
|
2250
|
-
|
|
2251
|
-
|
|
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:
|
|
2257
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
2258
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
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:
|
|
2321
|
+
className: "slider-purple"
|
|
2268
2322
|
}
|
|
2269
2323
|
),
|
|
2270
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className:
|
|
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: "
|
|
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:
|
|
2438
|
-
/* @__PURE__ */ jsxRuntime.jsx(WandSparkles, { className: "
|
|
2439
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className:
|
|
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
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
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
|
-
"
|
|
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: "
|
|
2578
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "
|
|
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: "
|
|
2594
|
-
/* @__PURE__ */ jsxRuntime.
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
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: "
|
|
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: "
|
|
2656
|
+
className: "input-dark"
|
|
2609
2657
|
}
|
|
2610
2658
|
)
|
|
2611
2659
|
] }),
|
|
2612
2660
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2613
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className: "
|
|
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: "
|
|
2668
|
+
className: "input-dark"
|
|
2621
2669
|
}
|
|
2622
2670
|
)
|
|
2623
2671
|
] })
|
|
2624
2672
|
] })
|
|
2625
2673
|
] }),
|
|
2626
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
2627
|
-
/* @__PURE__ */ jsxRuntime.
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
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: "
|
|
2648
|
-
/* @__PURE__ */ jsxRuntime.
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
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: "
|
|
2699
|
-
/* @__PURE__ */ jsxRuntime.
|
|
2700
|
-
|
|
2701
|
-
|
|
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
|
|
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(
|
|
2718
|
-
/* @__PURE__ */ jsxRuntime.jsxs("
|
|
2719
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
2720
|
-
|
|
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: "
|
|
2723
|
-
/* @__PURE__ */ jsxRuntime.
|
|
2724
|
-
|
|
2725
|
-
|
|
2726
|
-
|
|
2727
|
-
|
|
2728
|
-
|
|
2729
|
-
|
|
2730
|
-
|
|
2731
|
-
|
|
2732
|
-
|
|
2733
|
-
|
|
2734
|
-
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
/* @__PURE__ */ jsxRuntime.
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
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: "
|
|
2828
|
-
/* @__PURE__ */ jsxRuntime.
|
|
2829
|
-
|
|
2830
|
-
|
|
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
|
|
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.
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
|
|
2870
|
-
|
|
2871
|
-
|
|
2872
|
-
|
|
2873
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
2879
|
-
|
|
2880
|
-
|
|
2881
|
-
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2885
|
-
|
|
2886
|
-
|
|
2887
|
-
|
|
2888
|
-
|
|
2889
|
-
|
|
2890
|
-
|
|
2891
|
-
|
|
2892
|
-
|
|
2893
|
-
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
|
|
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: "
|
|
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: "
|
|
2945
|
+
className: "slider-purple"
|
|
2914
2946
|
}
|
|
2915
|
-
)
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
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: "
|
|
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: "
|
|
2965
|
+
className: "slider-purple"
|
|
2931
2966
|
}
|
|
2932
|
-
)
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
|
|
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: "
|
|
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: "
|
|
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.
|
|
2968
|
-
/* @__PURE__ */ jsxRuntime.
|
|
2969
|
-
|
|
2970
|
-
"Volume"
|
|
2971
|
-
|
|
2972
|
-
|
|
2973
|
-
|
|
2974
|
-
|
|
2975
|
-
|
|
2976
|
-
|
|
2977
|
-
|
|
2978
|
-
|
|
2979
|
-
|
|
2980
|
-
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
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: "
|
|
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(
|
|
3036
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
3014
3037
|
selectedProp === "element-props" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
3015
|
-
|
|
3038
|
+
ElementProps,
|
|
3016
3039
|
{
|
|
3017
|
-
|
|
3018
|
-
|
|
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
|
-
|
|
3045
|
+
PlaybackPropsPanel,
|
|
3030
3046
|
{
|
|
3031
|
-
|
|
3032
|
-
|
|
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
|
-
|
|
3052
|
+
TextEffects,
|
|
3044
3053
|
{
|
|
3045
|
-
|
|
3046
|
-
|
|
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(
|
|
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: "
|
|
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: "
|
|
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(
|
|
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: "
|
|
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(
|
|
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
|
{
|