@vishu1301/script-writing 1.3.6 → 1.3.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 +61 -24
- package/dist/index.cjs +1851 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +128 -1
- package/dist/index.d.ts +128 -1
- package/dist/index.js +1841 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
package/dist/index.cjs
CHANGED
|
@@ -5,6 +5,8 @@ var lucideReact = require('lucide-react');
|
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
var pdfjs = require('pdfjs-dist');
|
|
7
7
|
var jsPDF = require('jspdf');
|
|
8
|
+
var Yup = require('yup');
|
|
9
|
+
var formik = require('formik');
|
|
8
10
|
|
|
9
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
12
|
|
|
@@ -28,6 +30,7 @@ function _interopNamespace(e) {
|
|
|
28
30
|
|
|
29
31
|
var pdfjs__namespace = /*#__PURE__*/_interopNamespace(pdfjs);
|
|
30
32
|
var jsPDF__default = /*#__PURE__*/_interopDefault(jsPDF);
|
|
33
|
+
var Yup__namespace = /*#__PURE__*/_interopNamespace(Yup);
|
|
31
34
|
|
|
32
35
|
var __defProp = Object.defineProperty;
|
|
33
36
|
var __defProps = Object.defineProperties;
|
|
@@ -48,6 +51,18 @@ var __spreadValues = (a, b) => {
|
|
|
48
51
|
return a;
|
|
49
52
|
};
|
|
50
53
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
54
|
+
var __objRest = (source, exclude) => {
|
|
55
|
+
var target = {};
|
|
56
|
+
for (var prop in source)
|
|
57
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
58
|
+
target[prop] = source[prop];
|
|
59
|
+
if (source != null && __getOwnPropSymbols)
|
|
60
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
61
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
62
|
+
target[prop] = source[prop];
|
|
63
|
+
}
|
|
64
|
+
return target;
|
|
65
|
+
};
|
|
51
66
|
var timeOfDayOptions = ["DAY", "NIGHT"];
|
|
52
67
|
var blockTypes = [
|
|
53
68
|
"SCENE_HEADING",
|
|
@@ -2834,19 +2849,1855 @@ function useScriptBreakdownScene(options) {
|
|
|
2834
2849
|
isSummarizing
|
|
2835
2850
|
};
|
|
2836
2851
|
}
|
|
2852
|
+
function ModalLayout({
|
|
2853
|
+
children,
|
|
2854
|
+
onClose,
|
|
2855
|
+
title,
|
|
2856
|
+
maxWidth = "max-w-4xl",
|
|
2857
|
+
menuRef
|
|
2858
|
+
}) {
|
|
2859
|
+
react.useEffect(() => {
|
|
2860
|
+
document.body.style.overflow = "hidden";
|
|
2861
|
+
return () => {
|
|
2862
|
+
document.body.style.overflow = "";
|
|
2863
|
+
};
|
|
2864
|
+
}, []);
|
|
2865
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2866
|
+
"div",
|
|
2867
|
+
{
|
|
2868
|
+
ref: menuRef,
|
|
2869
|
+
onClick: onClose,
|
|
2870
|
+
className: "fixed inset-0 z-50 overflow-y-auto bg-black/40 backdrop-blur-xs",
|
|
2871
|
+
"data-lenis-prevent": "true",
|
|
2872
|
+
children: [
|
|
2873
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-full items-center justify-center p-4 sm:p-6", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2874
|
+
"div",
|
|
2875
|
+
{
|
|
2876
|
+
onClick: (e) => e.stopPropagation(),
|
|
2877
|
+
className: `relative w-full ${maxWidth} bg-white rounded-3xl shadow-2xl transform transition-all duration-300 scale-100 opacity-100 animate-modal`,
|
|
2878
|
+
children: [
|
|
2879
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between border-b border-gray-200 pb-3 pt-6 px-6", children: [
|
|
2880
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl sm:text-2xl font-medium text-blumine-600 line-clamp-1", children: title }),
|
|
2881
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2882
|
+
"button",
|
|
2883
|
+
{
|
|
2884
|
+
onClick: onClose,
|
|
2885
|
+
className: "w-10 h-10 flex items-center justify-center rounded-full border border-blumine-600 text-blumine-600 hover:bg-blumine-600/10 hover:rotate-90 transition-all duration-300",
|
|
2886
|
+
"aria-label": "Close",
|
|
2887
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { size: 20 })
|
|
2888
|
+
}
|
|
2889
|
+
)
|
|
2890
|
+
] }),
|
|
2891
|
+
children
|
|
2892
|
+
]
|
|
2893
|
+
}
|
|
2894
|
+
) }),
|
|
2895
|
+
/* @__PURE__ */ jsxRuntime.jsx("style", { children: `
|
|
2896
|
+
@keyframes modal {
|
|
2897
|
+
0% {
|
|
2898
|
+
opacity: 0;
|
|
2899
|
+
transform: translateY(20px) scale(0.95);
|
|
2900
|
+
}
|
|
2901
|
+
100% {
|
|
2902
|
+
opacity: 1;
|
|
2903
|
+
transform: translateY(0) scale(1);
|
|
2904
|
+
}
|
|
2905
|
+
}
|
|
2906
|
+
.animate-modal {
|
|
2907
|
+
animation: modal 0.3s ease-out forwards;
|
|
2908
|
+
}
|
|
2909
|
+
` })
|
|
2910
|
+
]
|
|
2911
|
+
}
|
|
2912
|
+
);
|
|
2913
|
+
}
|
|
2914
|
+
var modal_layout_default = ModalLayout;
|
|
2915
|
+
var FormikSelect = ({
|
|
2916
|
+
label,
|
|
2917
|
+
name,
|
|
2918
|
+
selectedOption,
|
|
2919
|
+
optionData,
|
|
2920
|
+
value,
|
|
2921
|
+
disable,
|
|
2922
|
+
divClasses,
|
|
2923
|
+
valueProperty = "name",
|
|
2924
|
+
labelProperty = "name",
|
|
2925
|
+
label2propery,
|
|
2926
|
+
brackets,
|
|
2927
|
+
className,
|
|
2928
|
+
enableRedAsterick = false,
|
|
2929
|
+
disableOptionProperty = "disable",
|
|
2930
|
+
disabledOptionText = "",
|
|
2931
|
+
onChange
|
|
2932
|
+
}) => {
|
|
2933
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `w-full ${divClasses}`, children: [
|
|
2934
|
+
label && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `mb-1.5 text-sm font-medium text-slate-700 capitalize flex`, children: [
|
|
2935
|
+
label,
|
|
2936
|
+
enableRedAsterick && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AsteriskIcon, { className: "size-3 text-red-500" })
|
|
2937
|
+
] }),
|
|
2938
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2939
|
+
formik.Field,
|
|
2940
|
+
{
|
|
2941
|
+
name,
|
|
2942
|
+
as: "select",
|
|
2943
|
+
value,
|
|
2944
|
+
disabled: disable,
|
|
2945
|
+
onChange,
|
|
2946
|
+
className: `${className} rounded-[2.5rem] block w-full px-3 py-2.5 text-slate-700 placeholder-slate-400 placeholder:capitalize bg-white border border-slate-300/80 focus:border-blumine-500 focus:ring-2 focus:ring-blumine-500/50 focus:outline-none transition-all`,
|
|
2947
|
+
children: [
|
|
2948
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { selected: true, value: "", disabled: true, className: "capitalize", children: selectedOption }),
|
|
2949
|
+
optionData == null ? void 0 : optionData.map((option, index) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2950
|
+
"option",
|
|
2951
|
+
{
|
|
2952
|
+
value: option[valueProperty],
|
|
2953
|
+
disabled: option[disableOptionProperty],
|
|
2954
|
+
children: [
|
|
2955
|
+
option[labelProperty],
|
|
2956
|
+
label2propery ? brackets ? ` (${option[label2propery]})` : option[label2propery] : "",
|
|
2957
|
+
" ",
|
|
2958
|
+
option[disableOptionProperty] && `(${disabledOptionText})`
|
|
2959
|
+
]
|
|
2960
|
+
},
|
|
2961
|
+
index
|
|
2962
|
+
))
|
|
2963
|
+
]
|
|
2964
|
+
}
|
|
2965
|
+
),
|
|
2966
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2967
|
+
formik.ErrorMessage,
|
|
2968
|
+
{
|
|
2969
|
+
name,
|
|
2970
|
+
className: "text-red-500 text-sm mt-1",
|
|
2971
|
+
component: "div"
|
|
2972
|
+
}
|
|
2973
|
+
)
|
|
2974
|
+
] });
|
|
2975
|
+
};
|
|
2976
|
+
var FormikInput = (_a) => {
|
|
2977
|
+
var _b = _a, {
|
|
2978
|
+
label,
|
|
2979
|
+
name,
|
|
2980
|
+
type,
|
|
2981
|
+
placeholder,
|
|
2982
|
+
className,
|
|
2983
|
+
labelClassName,
|
|
2984
|
+
readOnly,
|
|
2985
|
+
divClasses,
|
|
2986
|
+
length,
|
|
2987
|
+
disable,
|
|
2988
|
+
min = 0,
|
|
2989
|
+
max,
|
|
2990
|
+
convertToText = false,
|
|
2991
|
+
enableRedAsterick = false,
|
|
2992
|
+
case_sensitivity = "normal"
|
|
2993
|
+
} = _b, props = __objRest(_b, [
|
|
2994
|
+
"label",
|
|
2995
|
+
"name",
|
|
2996
|
+
"type",
|
|
2997
|
+
"placeholder",
|
|
2998
|
+
"className",
|
|
2999
|
+
"labelClassName",
|
|
3000
|
+
"readOnly",
|
|
3001
|
+
"divClasses",
|
|
3002
|
+
"length",
|
|
3003
|
+
"disable",
|
|
3004
|
+
"min",
|
|
3005
|
+
"max",
|
|
3006
|
+
"convertToText",
|
|
3007
|
+
"enableRedAsterick",
|
|
3008
|
+
"case_sensitivity"
|
|
3009
|
+
]);
|
|
3010
|
+
const { setFieldValue } = formik.useFormikContext();
|
|
3011
|
+
const handleCaseChange = (e) => {
|
|
3012
|
+
let value = e.target.value;
|
|
3013
|
+
if (type === "number" && min !== void 0) {
|
|
3014
|
+
if (value !== "" && Number(value) < min) return;
|
|
3015
|
+
}
|
|
3016
|
+
switch (case_sensitivity) {
|
|
3017
|
+
case "lowercase":
|
|
3018
|
+
value = value.toLowerCase();
|
|
3019
|
+
break;
|
|
3020
|
+
case "uppercase":
|
|
3021
|
+
value = value.toUpperCase();
|
|
3022
|
+
break;
|
|
3023
|
+
}
|
|
3024
|
+
setFieldValue(name, value);
|
|
3025
|
+
};
|
|
3026
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `w-full ${divClasses}`, children: [
|
|
3027
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
3028
|
+
"label",
|
|
3029
|
+
{
|
|
3030
|
+
className: `${labelClassName} mb-1.5 text-sm font-medium text-slate-700 capitalize flex`,
|
|
3031
|
+
children: [
|
|
3032
|
+
label,
|
|
3033
|
+
enableRedAsterick && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AsteriskIcon, { className: "size-3 text-red-500" })
|
|
3034
|
+
]
|
|
3035
|
+
}
|
|
3036
|
+
),
|
|
3037
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3038
|
+
formik.Field,
|
|
3039
|
+
__spreadProps(__spreadValues({
|
|
3040
|
+
name,
|
|
3041
|
+
placeholder,
|
|
3042
|
+
readOnly,
|
|
3043
|
+
type,
|
|
3044
|
+
maxLength: length,
|
|
3045
|
+
disabled: disable,
|
|
3046
|
+
max,
|
|
3047
|
+
min,
|
|
3048
|
+
onChange: handleCaseChange
|
|
3049
|
+
}, props), {
|
|
3050
|
+
className: `${className} rounded-[2.5rem] block w-full px-3 py-2.5 text-slate-700 placeholder-slate-400 placeholder:capitalize bg-white border border-slate-300/80 focus:border-blumine-500 focus:ring-2 focus:ring-blumine-500/50 focus:outline-none transition-all disabled:opacity-70`
|
|
3051
|
+
})
|
|
3052
|
+
),
|
|
3053
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3054
|
+
formik.ErrorMessage,
|
|
3055
|
+
{
|
|
3056
|
+
name,
|
|
3057
|
+
className: "text-red-500 text-sm mt-1",
|
|
3058
|
+
component: "div"
|
|
3059
|
+
}
|
|
3060
|
+
)
|
|
3061
|
+
] });
|
|
3062
|
+
};
|
|
3063
|
+
var FormikTextarea = ({
|
|
3064
|
+
label,
|
|
3065
|
+
name,
|
|
3066
|
+
placeholder,
|
|
3067
|
+
readOnly,
|
|
3068
|
+
divClasses = "",
|
|
3069
|
+
className = "",
|
|
3070
|
+
length,
|
|
3071
|
+
disable,
|
|
3072
|
+
min,
|
|
3073
|
+
max,
|
|
3074
|
+
enableRedAsterick = false
|
|
3075
|
+
}) => {
|
|
3076
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `w-full ${divClasses}`, children: [
|
|
3077
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: `mb-1.5 text-sm font-medium text-slate-700 capitalize flex`, children: [
|
|
3078
|
+
label,
|
|
3079
|
+
enableRedAsterick && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AsteriskIcon, { className: "size-3 text-red-500" })
|
|
3080
|
+
] }),
|
|
3081
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3082
|
+
formik.Field,
|
|
3083
|
+
{
|
|
3084
|
+
as: "textarea",
|
|
3085
|
+
name,
|
|
3086
|
+
placeholder,
|
|
3087
|
+
readOnly,
|
|
3088
|
+
maxLength: length,
|
|
3089
|
+
disabled: disable,
|
|
3090
|
+
max,
|
|
3091
|
+
min,
|
|
3092
|
+
className: `${className} block w-full px-4 py-3 text-slate-700 placeholder-slate-400 placeholder:capitalize bg-white border border-slate-300/80 rounded-2xl focus:border-blumine-500 focus:ring-2 focus:ring-blumine-500/50 focus:outline-none transition-all disabled:opacity-70`
|
|
3093
|
+
}
|
|
3094
|
+
),
|
|
3095
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3096
|
+
formik.ErrorMessage,
|
|
3097
|
+
{
|
|
3098
|
+
name,
|
|
3099
|
+
className: "text-red-500 text-sm mt-1",
|
|
3100
|
+
component: "div"
|
|
3101
|
+
}
|
|
3102
|
+
)
|
|
3103
|
+
] });
|
|
3104
|
+
};
|
|
3105
|
+
|
|
3106
|
+
// data/shot-data.ts
|
|
3107
|
+
var shot_types = [
|
|
3108
|
+
{ name: "Extreme Close-Up (ECU)" },
|
|
3109
|
+
{ name: "Extreme Close-Up 2-Shot" },
|
|
3110
|
+
{ name: "Close-Up (CU)" },
|
|
3111
|
+
{ name: "Close-Up 2-Shot" },
|
|
3112
|
+
{ name: "Medium Close-Up (MCU)" },
|
|
3113
|
+
{ name: "Medium Close-Up 2-Shot" },
|
|
3114
|
+
{ name: "Medium Shot (MS)" },
|
|
3115
|
+
{ name: "Medium Shot 2-Shot" },
|
|
3116
|
+
{ name: "Medium Wide Shot (MWS)" },
|
|
3117
|
+
{ name: "Medium Wide 2-Shot" },
|
|
3118
|
+
{ name: "Wide Shot (WS)" },
|
|
3119
|
+
{ name: "Wide Shot 2-Shot" },
|
|
3120
|
+
{ name: "Extreme Wide Shot (EWS)" },
|
|
3121
|
+
{ name: "Establishing Shot" },
|
|
3122
|
+
{ name: "Over-the-Shoulder (OTS)" },
|
|
3123
|
+
{ name: "Over-the-Shoulder 2-Shot" },
|
|
3124
|
+
{ name: "Reverse Over-the-Shoulder" },
|
|
3125
|
+
{ name: "Point of View (POV)" },
|
|
3126
|
+
{ name: "Subjective POV" },
|
|
3127
|
+
{ name: "Objective Shot" },
|
|
3128
|
+
{ name: "Insert Shot" },
|
|
3129
|
+
{ name: "Cutaway Shot" },
|
|
3130
|
+
{ name: "Reaction Shot" },
|
|
3131
|
+
{ name: "Profile Shot" },
|
|
3132
|
+
{ name: "Profile 2-Shot" },
|
|
3133
|
+
{ name: "Silhouette Shot" }
|
|
3134
|
+
];
|
|
3135
|
+
var camera_angles = [
|
|
3136
|
+
{ name: "Eye Level" },
|
|
3137
|
+
{ name: "Low Angle" },
|
|
3138
|
+
{ name: "High Angle" },
|
|
3139
|
+
{ name: "Bird\u2019s Eye View (Top Shot)" },
|
|
3140
|
+
{ name: "Worm\u2019s Eye View (Ground Level)" },
|
|
3141
|
+
{ name: "Dutch Tilt (Canted Angle)" },
|
|
3142
|
+
{ name: "Overhead Shot" },
|
|
3143
|
+
{ name: "Underhead Shot" },
|
|
3144
|
+
{ name: "Shoulder Level" },
|
|
3145
|
+
{ name: "Hip Level" },
|
|
3146
|
+
{ name: "Knee Level" },
|
|
3147
|
+
{ name: "Ground Level Tracking Angle" },
|
|
3148
|
+
{ name: "Aerial Angle (Drone)" },
|
|
3149
|
+
{ name: "Subjective Angle (POV Angle)" }
|
|
3150
|
+
];
|
|
3151
|
+
var camera_movements = [
|
|
3152
|
+
{ name: "Static (Locked-Off)" },
|
|
3153
|
+
{ name: "Pan Left" },
|
|
3154
|
+
{ name: "Pan Right" },
|
|
3155
|
+
{ name: "Tilt Up" },
|
|
3156
|
+
{ name: "Tilt Down" },
|
|
3157
|
+
{ name: "Roll (Dutch Roll)" },
|
|
3158
|
+
{ name: "Dolly In" },
|
|
3159
|
+
{ name: "Dolly Out" },
|
|
3160
|
+
{ name: "Dolly Left" },
|
|
3161
|
+
{ name: "Dolly Right" },
|
|
3162
|
+
{ name: "Truck Left" },
|
|
3163
|
+
{ name: "Truck Right" },
|
|
3164
|
+
{ name: "Pedestal Up" },
|
|
3165
|
+
{ name: "Pedestal Down" },
|
|
3166
|
+
{ name: "Tracking Shot" },
|
|
3167
|
+
{ name: "Push-In" },
|
|
3168
|
+
{ name: "Pull-Out" },
|
|
3169
|
+
{ name: "Crane Up" },
|
|
3170
|
+
{ name: "Crane Down" },
|
|
3171
|
+
{ name: "Jib Shot" },
|
|
3172
|
+
{ name: "Steadicam" },
|
|
3173
|
+
{ name: "Handheld" },
|
|
3174
|
+
{ name: "Whip Pan" },
|
|
3175
|
+
{ name: "Arc Shot" },
|
|
3176
|
+
{ name: "360 Degree Shot" },
|
|
3177
|
+
{ name: "Orbit Shot" },
|
|
3178
|
+
{ name: "Zoom In" },
|
|
3179
|
+
{ name: "Zoom Out" },
|
|
3180
|
+
{ name: "Dolly Zoom (Vertigo Effect)" }
|
|
3181
|
+
];
|
|
3182
|
+
var camera_supports = [
|
|
3183
|
+
{ name: "Tripod" },
|
|
3184
|
+
{ name: "Monopod" },
|
|
3185
|
+
{ name: "Static Mount (Fixed Rig)" },
|
|
3186
|
+
{ name: "Handheld" },
|
|
3187
|
+
{ name: "Shoulder Rig" },
|
|
3188
|
+
{ name: "Steadicam" },
|
|
3189
|
+
{ name: "Gimbal" },
|
|
3190
|
+
{ name: "Dolly (On Track)" },
|
|
3191
|
+
{ name: "Dolly (Free / Floor)" },
|
|
3192
|
+
{ name: "Slider" },
|
|
3193
|
+
{ name: "Crane / Jib" },
|
|
3194
|
+
{ name: "Drone" },
|
|
3195
|
+
{ name: "Car Mount (Rig)" },
|
|
3196
|
+
{ name: "Body Mount" },
|
|
3197
|
+
{ name: "Cable Cam / Wire Cam" }
|
|
3198
|
+
];
|
|
3199
|
+
var lens_options = [
|
|
3200
|
+
{ name: "14mm", type: "Ultra Wide" },
|
|
3201
|
+
{ name: "18mm", type: "Ultra Wide" },
|
|
3202
|
+
{ name: "24mm", type: "Wide" },
|
|
3203
|
+
{ name: "28mm", type: "Wide" },
|
|
3204
|
+
{ name: "35mm", type: "Wide / Standard" },
|
|
3205
|
+
{ name: "50mm", type: "Standard" },
|
|
3206
|
+
{ name: "65mm", type: "Standard / Portrait" },
|
|
3207
|
+
{ name: "85mm", type: "Telephoto (Portrait)" },
|
|
3208
|
+
{ name: "100mm", type: "Telephoto" },
|
|
3209
|
+
{ name: "135mm", type: "Telephoto" },
|
|
3210
|
+
{ name: "200mm", type: "Long Telephoto" }
|
|
3211
|
+
];
|
|
3212
|
+
var aperture_options = [
|
|
3213
|
+
{ value: 1.3, label: "T1.3" },
|
|
3214
|
+
{ value: 1.4, label: "T1.4" },
|
|
3215
|
+
{ value: 1.5, label: "T1.5" },
|
|
3216
|
+
{ value: 1.8, label: "T1.8" },
|
|
3217
|
+
{ value: 2, label: "T2.0" },
|
|
3218
|
+
{ value: 2.2, label: "T2.2" },
|
|
3219
|
+
{ value: 2.8, label: "T2.8" },
|
|
3220
|
+
{ value: 3.1, label: "T3.1" },
|
|
3221
|
+
{ value: 4, label: "T4.0" },
|
|
3222
|
+
{ value: 4.5, label: "T4.5" },
|
|
3223
|
+
{ value: 5.6, label: "T5.6" },
|
|
3224
|
+
{ value: 6.3, label: "T6.3" },
|
|
3225
|
+
{ value: 8, label: "T8" },
|
|
3226
|
+
{ value: 9.5, label: "T9.5" },
|
|
3227
|
+
{ value: 11, label: "T11" },
|
|
3228
|
+
{ value: 13, label: "T13" },
|
|
3229
|
+
{ value: 16, label: "T16" },
|
|
3230
|
+
{ value: 22, label: "T22" }
|
|
3231
|
+
];
|
|
3232
|
+
var vfx_types = [
|
|
3233
|
+
{ name: "None" },
|
|
3234
|
+
{ name: "Green Screen (Chroma Key)" },
|
|
3235
|
+
{ name: "Blue Screen" },
|
|
3236
|
+
{ name: "Set Extension" },
|
|
3237
|
+
{ name: "Matte Painting" },
|
|
3238
|
+
{ name: "Full CGI Environment" },
|
|
3239
|
+
{ name: "CGI Character" },
|
|
3240
|
+
{ name: "CGI Props" },
|
|
3241
|
+
{ name: "Fire Simulation" },
|
|
3242
|
+
{ name: "Smoke / Fog Simulation" },
|
|
3243
|
+
{ name: "Water Simulation" },
|
|
3244
|
+
{ name: "Destruction Simulation" },
|
|
3245
|
+
{ name: "Digital Makeup / De-aging" },
|
|
3246
|
+
{ name: "Wire Removal" },
|
|
3247
|
+
{ name: "Object Removal" },
|
|
3248
|
+
{ name: "Crowd Duplication" },
|
|
3249
|
+
{ name: "Sky Replacement" },
|
|
3250
|
+
{ name: "Weather Enhancement" },
|
|
3251
|
+
{ name: "CG Lighting / Light Wrap" }
|
|
3252
|
+
];
|
|
3253
|
+
var fps_options = [
|
|
3254
|
+
{ value: "23.98", label: "23.98 fps" },
|
|
3255
|
+
{ value: "24", label: "24 fps" },
|
|
3256
|
+
{ value: "25", label: "25 fps" },
|
|
3257
|
+
{ value: "29.97", label: "29.97 fps" },
|
|
3258
|
+
{ value: "30", label: "30 fps" },
|
|
3259
|
+
{ value: "48", label: "48 fps" },
|
|
3260
|
+
{ value: "50", label: "50 fps" },
|
|
3261
|
+
{ value: "59.94", label: "59.94 fps" },
|
|
3262
|
+
{ value: "60", label: "60 fps" },
|
|
3263
|
+
{ value: "120", label: "120 fps (Slow Motion)" },
|
|
3264
|
+
{ value: "240", label: "240 fps (High Speed)" }
|
|
3265
|
+
];
|
|
3266
|
+
var scene_types = [
|
|
3267
|
+
{ name: "Action / Adventure" },
|
|
3268
|
+
{ name: "Comedy / Sitcom" },
|
|
3269
|
+
{ name: "Drama / Melodrama" },
|
|
3270
|
+
{ name: "Sci-Fi / Fantasy" },
|
|
3271
|
+
{ name: "Horror / Thriller" },
|
|
3272
|
+
{ name: "Suspense / Mystery" },
|
|
3273
|
+
{ name: "Sci-Fi Thriller / Suspense" },
|
|
3274
|
+
{ name: "Crime / Film Noir" },
|
|
3275
|
+
{ name: "Romance / Romantic Comedy" },
|
|
3276
|
+
{ name: "Musical / Dance" },
|
|
3277
|
+
{ name: "Documentary / Docudrama" },
|
|
3278
|
+
{ name: "Animation / Family" },
|
|
3279
|
+
{ name: "Western" },
|
|
3280
|
+
{ name: "War / Historical" },
|
|
3281
|
+
{ name: "Biographical (Biopic)" },
|
|
3282
|
+
{ name: "Psychological Thriller" },
|
|
3283
|
+
{ name: "Supernatural / Paranormal" },
|
|
3284
|
+
{ name: "Slasher / Gore" },
|
|
3285
|
+
{ name: "Dark Comedy / Satire" },
|
|
3286
|
+
{ name: "Parody / Spoof" },
|
|
3287
|
+
{ name: "Experimental / Avant-Garde" },
|
|
3288
|
+
{ name: "Music Video / Visual Arts" },
|
|
3289
|
+
{ name: "Instructional / Educational" }
|
|
3290
|
+
];
|
|
3291
|
+
var formSteps = [
|
|
3292
|
+
{
|
|
3293
|
+
id: 1,
|
|
3294
|
+
name: "Core Identification",
|
|
3295
|
+
icon: lucideReact.Info,
|
|
3296
|
+
fields: ["priority", "shot_type", "camera_name"]
|
|
3297
|
+
},
|
|
3298
|
+
{
|
|
3299
|
+
id: 2,
|
|
3300
|
+
name: "Optics & Mechanics",
|
|
3301
|
+
icon: lucideReact.Settings2,
|
|
3302
|
+
fields: [
|
|
3303
|
+
"camera_angle",
|
|
3304
|
+
"camera_movement",
|
|
3305
|
+
"camera_support",
|
|
3306
|
+
"lens_mm",
|
|
3307
|
+
"aperture",
|
|
3308
|
+
"fps"
|
|
3309
|
+
]
|
|
3310
|
+
},
|
|
3311
|
+
{
|
|
3312
|
+
id: 3,
|
|
3313
|
+
name: "Visual Composition",
|
|
3314
|
+
icon: lucideReact.Frame,
|
|
3315
|
+
fields: ["subject", "duration_seconds", "framing", "depth_of_field"]
|
|
3316
|
+
},
|
|
3317
|
+
{
|
|
3318
|
+
id: 4,
|
|
3319
|
+
name: "Narrative Context",
|
|
3320
|
+
icon: lucideReact.BookText,
|
|
3321
|
+
fields: [
|
|
3322
|
+
"action_blocking",
|
|
3323
|
+
"emotional_purpose",
|
|
3324
|
+
"edit_purpose",
|
|
3325
|
+
"reason",
|
|
3326
|
+
"lighting",
|
|
3327
|
+
"sound",
|
|
3328
|
+
"vfx"
|
|
3329
|
+
]
|
|
3330
|
+
}
|
|
3331
|
+
];
|
|
3332
|
+
var AddShotForm = ({
|
|
3333
|
+
userShotValue,
|
|
3334
|
+
onSubmit,
|
|
3335
|
+
cameras,
|
|
3336
|
+
shots,
|
|
3337
|
+
handleCloseModal,
|
|
3338
|
+
parts
|
|
3339
|
+
}) => {
|
|
3340
|
+
const initialShotValues = {
|
|
3341
|
+
priority: "Essential",
|
|
3342
|
+
shot_type: "",
|
|
3343
|
+
framing: "",
|
|
3344
|
+
camera_angle: "",
|
|
3345
|
+
camera_movement: "",
|
|
3346
|
+
camera_support: "",
|
|
3347
|
+
lens_mm: "",
|
|
3348
|
+
lens_feel: "",
|
|
3349
|
+
aperture: "T2.8",
|
|
3350
|
+
fps: "24",
|
|
3351
|
+
depth_of_field: "",
|
|
3352
|
+
subject: "",
|
|
3353
|
+
action_blocking: "",
|
|
3354
|
+
emotional_purpose: "",
|
|
3355
|
+
lighting: "",
|
|
3356
|
+
sound: "",
|
|
3357
|
+
duration_seconds: 5,
|
|
3358
|
+
edit_purpose: "",
|
|
3359
|
+
reason: "",
|
|
3360
|
+
vfx: "None",
|
|
3361
|
+
camera_name: cameras.length === 1 ? cameras[0].name : ""
|
|
3362
|
+
};
|
|
3363
|
+
const ShotSchema = Yup__namespace.object().shape({
|
|
3364
|
+
priority: Yup__namespace.string().required("Required"),
|
|
3365
|
+
shot_type: Yup__namespace.string().required("Required"),
|
|
3366
|
+
camera_angle: Yup__namespace.string().required("Required"),
|
|
3367
|
+
camera_movement: Yup__namespace.string().required("Required"),
|
|
3368
|
+
camera_support: Yup__namespace.string().required("Required"),
|
|
3369
|
+
lens_mm: Yup__namespace.string().required("Required"),
|
|
3370
|
+
aperture: Yup__namespace.string().required("Required"),
|
|
3371
|
+
subject: Yup__namespace.string().required("Required"),
|
|
3372
|
+
duration_seconds: Yup__namespace.number().min(0).required("Required"),
|
|
3373
|
+
camera_name: Yup__namespace.string().required("Required")
|
|
3374
|
+
});
|
|
3375
|
+
const [step, setStep] = react.useState(1);
|
|
3376
|
+
const [highestStep, setHighestStep] = react.useState(1);
|
|
3377
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3378
|
+
formik.Formik,
|
|
3379
|
+
{
|
|
3380
|
+
initialValues: userShotValue || initialShotValues,
|
|
3381
|
+
validationSchema: ShotSchema,
|
|
3382
|
+
onSubmit: (values, { setSubmitting }) => {
|
|
3383
|
+
onSubmit(values);
|
|
3384
|
+
setSubmitting(false);
|
|
3385
|
+
},
|
|
3386
|
+
children: ({
|
|
3387
|
+
setFieldValue,
|
|
3388
|
+
isSubmitting,
|
|
3389
|
+
setTouched,
|
|
3390
|
+
validateForm,
|
|
3391
|
+
values,
|
|
3392
|
+
submitForm
|
|
3393
|
+
}) => {
|
|
3394
|
+
const handleNext = async () => {
|
|
3395
|
+
const errors = await validateForm();
|
|
3396
|
+
const currentStepInfo = formSteps.find((s) => s.id === step);
|
|
3397
|
+
if (!currentStepInfo) return;
|
|
3398
|
+
const stepErrors = Object.keys(errors).filter(
|
|
3399
|
+
(key) => currentStepInfo.fields.includes(key)
|
|
3400
|
+
);
|
|
3401
|
+
if (stepErrors.length === 0) {
|
|
3402
|
+
setHighestStep((prev) => Math.max(prev, step + 1));
|
|
3403
|
+
if (step < formSteps.length) {
|
|
3404
|
+
setStep(step + 1);
|
|
3405
|
+
} else {
|
|
3406
|
+
await submitForm();
|
|
3407
|
+
}
|
|
3408
|
+
} else {
|
|
3409
|
+
const touchedFields = currentStepInfo.fields.reduce(
|
|
3410
|
+
(acc, field) => {
|
|
3411
|
+
acc[field] = true;
|
|
3412
|
+
return acc;
|
|
3413
|
+
},
|
|
3414
|
+
{}
|
|
3415
|
+
);
|
|
3416
|
+
setTouched(touchedFields, true);
|
|
3417
|
+
}
|
|
3418
|
+
};
|
|
3419
|
+
const handleBack = () => {
|
|
3420
|
+
setStep((s) => Math.max(s - 1, 1));
|
|
3421
|
+
};
|
|
3422
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(formik.Form, { className: "flex flex-col overflow-hidden h-[90vh] lg:h-[85vh] bg-white rounded-b-3xl shadow-[0_12px_40px_-12px_rgba(0,0,0,0.15),_0_0_0_1px_rgba(0,0,0,0.05)]", children: [
|
|
3423
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col lg:flex-row flex-1 overflow-hidden", children: [
|
|
3424
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full lg:w-72 flex-shrink-0 border-b lg:border-b-0 lg:border-r border-slate-200 bg-white p-4 lg:p-8 flex flex-col z-10 relative", children: [
|
|
3425
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "hidden lg:block text-[11px] font-semibold uppercase tracking-wider text-slate-400 mb-6 px-2", children: userShotValue ? "Update Shot" : "Create a Shot" }),
|
|
3426
|
+
/* @__PURE__ */ jsxRuntime.jsx("nav", { className: "flex flex-row lg:flex-col gap-2 overflow-x-auto lg:overflow-visible pb-2 lg:pb-0 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", children: formSteps.map((formStep) => {
|
|
3427
|
+
const isCurrent = step === formStep.id;
|
|
3428
|
+
const isAccessible = formStep.id <= highestStep;
|
|
3429
|
+
const isCompleted = formStep.id < highestStep;
|
|
3430
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3431
|
+
"button",
|
|
3432
|
+
{
|
|
3433
|
+
type: "button",
|
|
3434
|
+
disabled: !isAccessible,
|
|
3435
|
+
onClick: async () => {
|
|
3436
|
+
if (formStep.id !== step) {
|
|
3437
|
+
if (formStep.id < step) {
|
|
3438
|
+
setStep(formStep.id);
|
|
3439
|
+
} else {
|
|
3440
|
+
const errors = await validateForm();
|
|
3441
|
+
const currentStepInfo = formSteps.find(
|
|
3442
|
+
(s) => s.id === step
|
|
3443
|
+
);
|
|
3444
|
+
const stepErrors = currentStepInfo ? Object.keys(errors).filter(
|
|
3445
|
+
(key) => currentStepInfo.fields.includes(key)
|
|
3446
|
+
) : [];
|
|
3447
|
+
if (stepErrors.length === 0) {
|
|
3448
|
+
setHighestStep(
|
|
3449
|
+
(prev) => Math.max(prev, step + 1)
|
|
3450
|
+
);
|
|
3451
|
+
setStep(formStep.id);
|
|
3452
|
+
} else {
|
|
3453
|
+
const touchedFields = currentStepInfo == null ? void 0 : currentStepInfo.fields.reduce(
|
|
3454
|
+
(acc, field) => {
|
|
3455
|
+
acc[field] = true;
|
|
3456
|
+
return acc;
|
|
3457
|
+
},
|
|
3458
|
+
{}
|
|
3459
|
+
);
|
|
3460
|
+
setTouched(touchedFields || {}, true);
|
|
3461
|
+
}
|
|
3462
|
+
}
|
|
3463
|
+
}
|
|
3464
|
+
},
|
|
3465
|
+
className: `group relative flex flex-shrink-0 items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition-colors text-left w-auto lg:w-full
|
|
3466
|
+
${isCurrent ? "bg-slate-100 text-slate-900 font-semibold" : "text-slate-500"}
|
|
3467
|
+
${isAccessible && !isCurrent ? "hover:bg-slate-50 hover:text-slate-900 cursor-pointer" : ""}
|
|
3468
|
+
${!isAccessible ? "opacity-50 cursor-not-allowed" : ""}`,
|
|
3469
|
+
children: [
|
|
3470
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3471
|
+
"div",
|
|
3472
|
+
{
|
|
3473
|
+
className: `flex items-center justify-center w-6 h-6 rounded-md transition-colors
|
|
3474
|
+
${isCurrent ? "text-slate-900" : ""}
|
|
3475
|
+
${isCompleted && !isCurrent ? "text-slate-400" : ""}
|
|
3476
|
+
${!isCurrent && !isCompleted ? "text-slate-400 group-hover:text-slate-600" : ""}`,
|
|
3477
|
+
children: isCompleted && !isCurrent ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "w-4 h-4 stroke-[2.5] text-slate-900" }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
3478
|
+
formStep.icon,
|
|
3479
|
+
{
|
|
3480
|
+
className: `w-4 h-4 ${isCurrent ? "stroke-[2.5]" : "stroke-[2]"}`
|
|
3481
|
+
}
|
|
3482
|
+
)
|
|
3483
|
+
}
|
|
3484
|
+
),
|
|
3485
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3486
|
+
"span",
|
|
3487
|
+
{
|
|
3488
|
+
className: `whitespace-nowrap ${isCurrent ? "font-semibold" : ""}`,
|
|
3489
|
+
children: formStep.name
|
|
3490
|
+
}
|
|
3491
|
+
)
|
|
3492
|
+
]
|
|
3493
|
+
},
|
|
3494
|
+
formStep.id
|
|
3495
|
+
);
|
|
3496
|
+
}) }),
|
|
3497
|
+
parts && parts.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 lg:mt-6 pt-4 lg:pt-6 border-t border-slate-200 flex-1 flex flex-col min-h-0", children: [
|
|
3498
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "hidden lg:block text-[11px] font-semibold text-slate-400 mb-3 uppercase tracking-wider px-2", children: "Scene Context" }),
|
|
3499
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-y-auto custom-scrollbar pr-2 -mr-2 max-h-24 lg:max-h-full", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3500
|
+
"div",
|
|
3501
|
+
{
|
|
3502
|
+
className: "text-[13px] text-slate-600 bg-slate-50 p-4 rounded-lg font-mono whitespace-pre-wrap leading-relaxed border border-slate-100",
|
|
3503
|
+
style: {
|
|
3504
|
+
fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace'
|
|
3505
|
+
},
|
|
3506
|
+
children: parts.map((p) => p.text).join(" ")
|
|
3507
|
+
}
|
|
3508
|
+
) })
|
|
3509
|
+
] })
|
|
3510
|
+
] }),
|
|
3511
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 overflow-y-auto px-4 sm:px-8 md:px-12 lg:px-16 pt-6 lg:pt-10 pb-24 lg:pb-12 custom-scrollbar bg-white", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto", children: [
|
|
3512
|
+
(() => {
|
|
3513
|
+
const currentStepInfo = formSteps.find(
|
|
3514
|
+
(s) => s.id === step
|
|
3515
|
+
);
|
|
3516
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-8 lg:mb-10 text-left", children: [
|
|
3517
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-block text-[11px] font-mono text-slate-400 uppercase tracking-widest mb-2", children: [
|
|
3518
|
+
"STEP ",
|
|
3519
|
+
step,
|
|
3520
|
+
" OF ",
|
|
3521
|
+
formSteps.length
|
|
3522
|
+
] }),
|
|
3523
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl lg:text-3xl font-semibold text-slate-900 tracking-tight", children: currentStepInfo == null ? void 0 : currentStepInfo.name }),
|
|
3524
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-500 mt-2 text-sm leading-relaxed max-w-xl", children: "Configure the necessary parameters for this shot sequence." })
|
|
3525
|
+
] });
|
|
3526
|
+
})(),
|
|
3527
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-8 lg:space-y-10", children: [
|
|
3528
|
+
step === 1 && /* @__PURE__ */ jsxRuntime.jsx("section", { className: "animate-in fade-in slide-in-from-bottom-4 duration-500", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 md:gap-6 lg:gap-8", children: [
|
|
3529
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3530
|
+
FormikInput,
|
|
3531
|
+
{
|
|
3532
|
+
label: "Shot Number",
|
|
3533
|
+
name: "shot_number",
|
|
3534
|
+
type: "number",
|
|
3535
|
+
readOnly: true,
|
|
3536
|
+
value: shots.length + 1
|
|
3537
|
+
}
|
|
3538
|
+
),
|
|
3539
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
3540
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "mb-1.5 text-sm font-medium text-slate-700 capitalize flex", children: [
|
|
3541
|
+
"Priority",
|
|
3542
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AsteriskIcon, { className: "size-3 text-red-500" })
|
|
3543
|
+
] }),
|
|
3544
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center p-1 bg-slate-100 rounded-full ring-1 ring-inset ring-slate-200/50", children: [
|
|
3545
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3546
|
+
"button",
|
|
3547
|
+
{
|
|
3548
|
+
type: "button",
|
|
3549
|
+
onClick: () => setFieldValue("priority", "Essential"),
|
|
3550
|
+
className: `w-full rounded-full px-3 py-1.5 text-sm font-medium transition-colors ${values.priority === "Essential" ? "bg-white text-slate-900 shadow-sm ring-1 ring-slate-200/50" : "text-slate-500 hover:text-slate-900"}`,
|
|
3551
|
+
children: "Essential"
|
|
3552
|
+
}
|
|
3553
|
+
),
|
|
3554
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3555
|
+
"button",
|
|
3556
|
+
{
|
|
3557
|
+
type: "button",
|
|
3558
|
+
onClick: () => setFieldValue("priority", "Optional"),
|
|
3559
|
+
className: `w-full rounded-full px-3 py-1.5 text-sm font-medium transition-colors ${values.priority === "Optional" ? "bg-white text-slate-900 shadow-sm ring-1 ring-slate-200/50" : "text-slate-500 hover:text-slate-900"}`,
|
|
3560
|
+
children: "Optional"
|
|
3561
|
+
}
|
|
3562
|
+
)
|
|
3563
|
+
] }),
|
|
3564
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3565
|
+
formik.ErrorMessage,
|
|
3566
|
+
{
|
|
3567
|
+
name: "priority",
|
|
3568
|
+
className: "text-red-500 text-sm mt-1",
|
|
3569
|
+
component: "div"
|
|
3570
|
+
}
|
|
3571
|
+
)
|
|
3572
|
+
] }),
|
|
3573
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3574
|
+
FormikSelect,
|
|
3575
|
+
{
|
|
3576
|
+
label: "Camera",
|
|
3577
|
+
name: "camera_name",
|
|
3578
|
+
selectedOption: "Select Camera",
|
|
3579
|
+
optionData: cameras,
|
|
3580
|
+
enableRedAsterick: true,
|
|
3581
|
+
value: values.camera_name,
|
|
3582
|
+
onChange: (e) => setFieldValue("camera_name", e.target.value)
|
|
3583
|
+
}
|
|
3584
|
+
),
|
|
3585
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3586
|
+
FormikSelect,
|
|
3587
|
+
{
|
|
3588
|
+
label: "Shot Type",
|
|
3589
|
+
name: "shot_type",
|
|
3590
|
+
selectedOption: "Select Shot Type",
|
|
3591
|
+
optionData: shot_types,
|
|
3592
|
+
enableRedAsterick: true,
|
|
3593
|
+
value: values.shot_type,
|
|
3594
|
+
onChange: (e) => setFieldValue("shot_type", e.target.value)
|
|
3595
|
+
}
|
|
3596
|
+
)
|
|
3597
|
+
] }) }),
|
|
3598
|
+
step === 2 && /* @__PURE__ */ jsxRuntime.jsx("section", { className: "animate-in fade-in slide-in-from-bottom-4 duration-500", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6 lg:gap-8", children: [
|
|
3599
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3600
|
+
FormikSelect,
|
|
3601
|
+
{
|
|
3602
|
+
label: "Camera Angle",
|
|
3603
|
+
name: "camera_angle",
|
|
3604
|
+
selectedOption: "Select Angle",
|
|
3605
|
+
optionData: camera_angles,
|
|
3606
|
+
enableRedAsterick: true,
|
|
3607
|
+
value: values.camera_angle,
|
|
3608
|
+
onChange: (e) => setFieldValue("camera_angle", e.target.value)
|
|
3609
|
+
}
|
|
3610
|
+
),
|
|
3611
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3612
|
+
FormikSelect,
|
|
3613
|
+
{
|
|
3614
|
+
label: "Camera Movement",
|
|
3615
|
+
name: "camera_movement",
|
|
3616
|
+
selectedOption: "Select Movement",
|
|
3617
|
+
optionData: camera_movements,
|
|
3618
|
+
enableRedAsterick: true,
|
|
3619
|
+
value: values.camera_movement,
|
|
3620
|
+
onChange: (e) => setFieldValue("camera_movement", e.target.value)
|
|
3621
|
+
}
|
|
3622
|
+
),
|
|
3623
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3624
|
+
FormikSelect,
|
|
3625
|
+
{
|
|
3626
|
+
label: "Camera Support",
|
|
3627
|
+
name: "camera_support",
|
|
3628
|
+
selectedOption: "Select Support",
|
|
3629
|
+
optionData: camera_supports,
|
|
3630
|
+
enableRedAsterick: true,
|
|
3631
|
+
value: values.camera_support,
|
|
3632
|
+
onChange: (e) => setFieldValue("camera_support", e.target.value)
|
|
3633
|
+
}
|
|
3634
|
+
),
|
|
3635
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3636
|
+
FormikSelect,
|
|
3637
|
+
{
|
|
3638
|
+
label: "Lens (mm)",
|
|
3639
|
+
name: "lens_mm",
|
|
3640
|
+
selectedOption: "Select Lens",
|
|
3641
|
+
optionData: lens_options,
|
|
3642
|
+
valueProperty: "name",
|
|
3643
|
+
enableRedAsterick: true,
|
|
3644
|
+
value: values.lens_mm,
|
|
3645
|
+
onChange: (e) => {
|
|
3646
|
+
const lensName = e.target.value;
|
|
3647
|
+
setFieldValue("lens_mm", lensName);
|
|
3648
|
+
const selectedLens = lens_options.find(
|
|
3649
|
+
(l) => l.name === lensName
|
|
3650
|
+
);
|
|
3651
|
+
if (selectedLens) {
|
|
3652
|
+
setFieldValue("lens_feel", selectedLens.type);
|
|
3653
|
+
}
|
|
3654
|
+
}
|
|
3655
|
+
}
|
|
3656
|
+
),
|
|
3657
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3658
|
+
FormikInput,
|
|
3659
|
+
{
|
|
3660
|
+
label: "Lens Feel",
|
|
3661
|
+
name: "lens_feel",
|
|
3662
|
+
type: "text",
|
|
3663
|
+
readOnly: true,
|
|
3664
|
+
placeholder: "e.g. Wide, Normal, Telephoto"
|
|
3665
|
+
}
|
|
3666
|
+
),
|
|
3667
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3668
|
+
FormikSelect,
|
|
3669
|
+
{
|
|
3670
|
+
label: "Aperture (T-Stop)",
|
|
3671
|
+
name: "aperture",
|
|
3672
|
+
selectedOption: "Select Aperture",
|
|
3673
|
+
optionData: aperture_options,
|
|
3674
|
+
valueProperty: "label",
|
|
3675
|
+
labelProperty: "label",
|
|
3676
|
+
enableRedAsterick: true,
|
|
3677
|
+
value: values.aperture,
|
|
3678
|
+
onChange: (e) => setFieldValue("aperture", e.target.value)
|
|
3679
|
+
}
|
|
3680
|
+
),
|
|
3681
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3682
|
+
FormikSelect,
|
|
3683
|
+
{
|
|
3684
|
+
label: "Frame Rate (FPS)",
|
|
3685
|
+
name: "fps",
|
|
3686
|
+
selectedOption: "Select FPS",
|
|
3687
|
+
optionData: fps_options,
|
|
3688
|
+
valueProperty: "value",
|
|
3689
|
+
labelProperty: "label",
|
|
3690
|
+
enableRedAsterick: true,
|
|
3691
|
+
value: values.fps,
|
|
3692
|
+
onChange: (e) => setFieldValue("fps", e.target.value)
|
|
3693
|
+
}
|
|
3694
|
+
)
|
|
3695
|
+
] }) }),
|
|
3696
|
+
step === 3 && /* @__PURE__ */ jsxRuntime.jsx("section", { className: "animate-in fade-in slide-in-from-bottom-4 duration-500", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6 lg:gap-8", children: [
|
|
3697
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3698
|
+
FormikInput,
|
|
3699
|
+
{
|
|
3700
|
+
label: "Subject",
|
|
3701
|
+
name: "subject",
|
|
3702
|
+
type: "text",
|
|
3703
|
+
placeholder: "e.g. John, The Car",
|
|
3704
|
+
enableRedAsterick: true
|
|
3705
|
+
}
|
|
3706
|
+
),
|
|
3707
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3708
|
+
FormikInput,
|
|
3709
|
+
{
|
|
3710
|
+
label: "Framing",
|
|
3711
|
+
name: "framing",
|
|
3712
|
+
type: "text",
|
|
3713
|
+
placeholder: "e.g. Over-the-shoulder"
|
|
3714
|
+
}
|
|
3715
|
+
),
|
|
3716
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3717
|
+
FormikInput,
|
|
3718
|
+
{
|
|
3719
|
+
label: "Depth of Field",
|
|
3720
|
+
name: "depth_of_field",
|
|
3721
|
+
type: "text",
|
|
3722
|
+
placeholder: "e.g. Shallow, Deep"
|
|
3723
|
+
}
|
|
3724
|
+
),
|
|
3725
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3726
|
+
FormikInput,
|
|
3727
|
+
{
|
|
3728
|
+
label: "Duration (seconds)",
|
|
3729
|
+
name: "duration_seconds",
|
|
3730
|
+
type: "number",
|
|
3731
|
+
min: 0,
|
|
3732
|
+
enableRedAsterick: true
|
|
3733
|
+
}
|
|
3734
|
+
)
|
|
3735
|
+
] }) }),
|
|
3736
|
+
step === 4 && /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "animate-in fade-in slide-in-from-bottom-4 duration-500 space-y-6 lg:space-y-10", children: [
|
|
3737
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 md:gap-6 lg:gap-8", children: [
|
|
3738
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3739
|
+
FormikInput,
|
|
3740
|
+
{
|
|
3741
|
+
label: "Lighting",
|
|
3742
|
+
name: "lighting",
|
|
3743
|
+
type: "text",
|
|
3744
|
+
placeholder: "e.g. High-key"
|
|
3745
|
+
}
|
|
3746
|
+
),
|
|
3747
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3748
|
+
FormikInput,
|
|
3749
|
+
{
|
|
3750
|
+
label: "Sound",
|
|
3751
|
+
name: "sound",
|
|
3752
|
+
type: "text",
|
|
3753
|
+
placeholder: "e.g. Dialogue"
|
|
3754
|
+
}
|
|
3755
|
+
),
|
|
3756
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3757
|
+
FormikSelect,
|
|
3758
|
+
{
|
|
3759
|
+
label: "VFX",
|
|
3760
|
+
name: "vfx",
|
|
3761
|
+
selectedOption: "Select VFX",
|
|
3762
|
+
optionData: vfx_types,
|
|
3763
|
+
value: values.vfx,
|
|
3764
|
+
onChange: (e) => setFieldValue("vfx", e.target.value)
|
|
3765
|
+
}
|
|
3766
|
+
)
|
|
3767
|
+
] }),
|
|
3768
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6 lg:space-y-10", children: [
|
|
3769
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3770
|
+
FormikTextarea,
|
|
3771
|
+
{
|
|
3772
|
+
label: "Action / Blocking",
|
|
3773
|
+
name: "action_blocking",
|
|
3774
|
+
placeholder: "Key character movements and staging..."
|
|
3775
|
+
}
|
|
3776
|
+
),
|
|
3777
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3778
|
+
FormikTextarea,
|
|
3779
|
+
{
|
|
3780
|
+
label: "Emotional Purpose",
|
|
3781
|
+
name: "emotional_purpose",
|
|
3782
|
+
placeholder: "What is the intended emotional impact on the audience?"
|
|
3783
|
+
}
|
|
3784
|
+
),
|
|
3785
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6 lg:gap-8", children: [
|
|
3786
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3787
|
+
FormikTextarea,
|
|
3788
|
+
{
|
|
3789
|
+
label: "Edit Purpose",
|
|
3790
|
+
name: "edit_purpose",
|
|
3791
|
+
placeholder: "How does this shot fit into the edit?"
|
|
3792
|
+
}
|
|
3793
|
+
),
|
|
3794
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3795
|
+
FormikTextarea,
|
|
3796
|
+
{
|
|
3797
|
+
label: "Reason",
|
|
3798
|
+
name: "reason",
|
|
3799
|
+
placeholder: "Why is this shot necessary for the story?"
|
|
3800
|
+
}
|
|
3801
|
+
)
|
|
3802
|
+
] })
|
|
3803
|
+
] })
|
|
3804
|
+
] })
|
|
3805
|
+
] })
|
|
3806
|
+
] }) })
|
|
3807
|
+
] }),
|
|
3808
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sticky bottom-0 border-t border-slate-200 px-6 lg:px-12 py-4 lg:py-5 flex justify-between items-center z-10 rounded-b-xl lg:rounded-2xl", children: [
|
|
3809
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: step > 1 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3810
|
+
"button",
|
|
3811
|
+
{
|
|
3812
|
+
type: "button",
|
|
3813
|
+
onClick: handleBack,
|
|
3814
|
+
className: "flex items-center gap-2 px-3 py-2 text-sm font-medium text-slate-500 hover:text-slate-900 transition-colors rounded-md hover:bg-slate-50",
|
|
3815
|
+
children: [
|
|
3816
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u2190" }),
|
|
3817
|
+
" Back"
|
|
3818
|
+
]
|
|
3819
|
+
}
|
|
3820
|
+
) }),
|
|
3821
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
3822
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3823
|
+
"button",
|
|
3824
|
+
{
|
|
3825
|
+
type: "button",
|
|
3826
|
+
onClick: handleCloseModal,
|
|
3827
|
+
className: "px-4 py-2 text-sm font-medium text-slate-500 hover:text-slate-900 rounded-md hover:bg-slate-50 transition-colors",
|
|
3828
|
+
children: "Cancel"
|
|
3829
|
+
}
|
|
3830
|
+
),
|
|
3831
|
+
step !== 4 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
3832
|
+
"button",
|
|
3833
|
+
{
|
|
3834
|
+
type: "button",
|
|
3835
|
+
onClick: handleNext,
|
|
3836
|
+
className: `bg-blumine-600 rounded-full inline-flex items-center justify-center gap-1.5 px-4 py-2 text-sm md:text-lg font-medium text-white shadow-md transition-all duration-300 ease-in-out hover:bg-opacity-70 hover:shadow-lg hover:shadow-blumine-600/50 focus:outline-hidden focus:ring-2 focus:ring-blumine-600 focus:ring-opacity-50 disabled:opacity-60 disabled:cursor-not-allowed disabled:hover:scale-100 disabled:hover:bg-blumine-600 disabled:hover:shadow-md cursor-pointer!`,
|
|
3837
|
+
children: "Next Step"
|
|
3838
|
+
}
|
|
3839
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
3840
|
+
"button",
|
|
3841
|
+
{
|
|
3842
|
+
type: "button",
|
|
3843
|
+
onClick: handleNext,
|
|
3844
|
+
disabled: isSubmitting,
|
|
3845
|
+
className: `bg-blumine-600 rounded-full inline-flex items-center justify-center gap-1.5 px-4 py-2 text-sm md:text-lg font-medium text-white shadow-md transition-all duration-300 ease-in-out hover:bg-opacity-70 hover:shadow-lg hover:shadow-blumine-600/50 focus:outline-hidden focus:ring-2 focus:ring-blumine-600 focus:ring-opacity-50 disabled:opacity-60 disabled:cursor-not-allowed disabled:hover:scale-100 disabled:hover:bg-blumine-600 disabled:hover:shadow-md cursor-pointer!`,
|
|
3846
|
+
children: isSubmitting ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
3847
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-3.5 h-3.5 border-2 border-white/30 border-t-white rounded-full animate-spin" }),
|
|
3848
|
+
"Processing..."
|
|
3849
|
+
] }) : userShotValue ? "Save Changes" : "Create Shot"
|
|
3850
|
+
}
|
|
3851
|
+
)
|
|
3852
|
+
] })
|
|
3853
|
+
] })
|
|
3854
|
+
] });
|
|
3855
|
+
}
|
|
3856
|
+
}
|
|
3857
|
+
);
|
|
3858
|
+
};
|
|
3859
|
+
var add_shot_modal_default = AddShotForm;
|
|
3860
|
+
var ProductionSetupModal = ({
|
|
3861
|
+
initializeProduction,
|
|
3862
|
+
initialValues
|
|
3863
|
+
}) => {
|
|
3864
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-[80vh] flex items-center justify-center px-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full max-w-lg", children: [
|
|
3865
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-8 text-center", children: [
|
|
3866
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl md:text-3xl font-semibold text-slate-900 tracking-tight", children: "Production Setup for this Scene" }),
|
|
3867
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-500 mt-2", children: "Configure your scene and camera setup to get started" })
|
|
3868
|
+
] }),
|
|
3869
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-6 md:p-8", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3870
|
+
formik.Formik,
|
|
3871
|
+
{
|
|
3872
|
+
initialValues: initialValues || { numCameras: 1, scene_type: "" },
|
|
3873
|
+
validationSchema: Yup__namespace.object({
|
|
3874
|
+
numCameras: Yup__namespace.number().min(1, "Must be at least 1").max(20, "Cannot add more than 20 cameras").required("Number of cameras is required"),
|
|
3875
|
+
scene_type: Yup__namespace.string().required("Scene type is required")
|
|
3876
|
+
}),
|
|
3877
|
+
onSubmit: (values) => {
|
|
3878
|
+
initializeProduction(values.numCameras, values.scene_type);
|
|
3879
|
+
},
|
|
3880
|
+
children: ({ isSubmitting, setFieldValue }) => /* @__PURE__ */ jsxRuntime.jsxs(formik.Form, { className: "flex flex-col gap-6", children: [
|
|
3881
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-5", children: [
|
|
3882
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3883
|
+
FormikSelect,
|
|
3884
|
+
{
|
|
3885
|
+
label: "Scene Type",
|
|
3886
|
+
name: "scene_type",
|
|
3887
|
+
selectedOption: "Select scene type",
|
|
3888
|
+
optionData: scene_types,
|
|
3889
|
+
enableRedAsterick: true,
|
|
3890
|
+
onChange: (e) => setFieldValue("scene_type", e.target.value)
|
|
3891
|
+
}
|
|
3892
|
+
),
|
|
3893
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3894
|
+
FormikInput,
|
|
3895
|
+
{
|
|
3896
|
+
label: "Number of Cameras",
|
|
3897
|
+
name: "numCameras",
|
|
3898
|
+
type: "number",
|
|
3899
|
+
min: 1,
|
|
3900
|
+
max: 20,
|
|
3901
|
+
enableRedAsterick: true
|
|
3902
|
+
}
|
|
3903
|
+
)
|
|
3904
|
+
] }),
|
|
3905
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-3 bg-slate-50 border border-slate-100 p-4 rounded-xl", children: [
|
|
3906
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Info, { className: "w-5 h-5 text-slate-400 shrink-0 mt-0.5" }),
|
|
3907
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-[13px] text-slate-600 leading-relaxed", children: [
|
|
3908
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold text-slate-900", children: "Important:" }),
|
|
3909
|
+
" ",
|
|
3910
|
+
"These settings are permanent. Once the production is initialized for this scene, you won't be able to change the scene type or camera count."
|
|
3911
|
+
] })
|
|
3912
|
+
] }),
|
|
3913
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "pt-2", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3914
|
+
"button",
|
|
3915
|
+
{
|
|
3916
|
+
type: "submit",
|
|
3917
|
+
disabled: isSubmitting,
|
|
3918
|
+
className: "w-full h-11 rounded-3xl bg-blumine-600 text-white text-sm md:text-base font-medium shadow-sm transition-all duration-300 hover:bg-blumine-700 hover:shadow-md focus:outline-none focus:ring-2 focus:ring-blumine-600/40 disabled:opacity-60 disabled:cursor-not-allowed",
|
|
3919
|
+
children: isSubmitting ? "Initializing..." : "Complete Setup"
|
|
3920
|
+
}
|
|
3921
|
+
) })
|
|
3922
|
+
] })
|
|
3923
|
+
}
|
|
3924
|
+
) })
|
|
3925
|
+
] }) });
|
|
3926
|
+
};
|
|
3927
|
+
var production_setup_modal_default = ProductionSetupModal;
|
|
3928
|
+
function ViewShotModal({ shot }) {
|
|
3929
|
+
const PropertyRow = ({ icon: Icon, label, value }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 py-1.5 group", children: [
|
|
3930
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5 w-32 shrink-0 text-slate-500 mt-0.5", children: [
|
|
3931
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3932
|
+
Icon,
|
|
3933
|
+
{
|
|
3934
|
+
className: "w-4 h-4 text-slate-400 group-hover:text-slate-600 transition-colors",
|
|
3935
|
+
strokeWidth: 2
|
|
3936
|
+
}
|
|
3937
|
+
),
|
|
3938
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[13px] font-medium", children: label })
|
|
3939
|
+
] }),
|
|
3940
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[13px] font-medium text-slate-900 flex-1 break-words whitespace-pre-wrap leading-relaxed", children: value || /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-400 italic font-normal", children: "Unspecified" }) })
|
|
3941
|
+
] });
|
|
3942
|
+
const DescriptionBlock = ({ icon: Icon, label, value }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col sm:flex-row gap-4 md:gap-6 mb-12 sm:mb-10 w-full", children: [
|
|
3943
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 mt-1 hidden sm:block", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center w-8 h-8 rounded-full bg-slate-50 border border-slate-100", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "w-4 h-4 text-[#15607b]/70" }) }) }),
|
|
3944
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2.5 flex-1 w-full max-w-2xl", children: [
|
|
3945
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 sm:hidden mb-1", children: [
|
|
3946
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "w-4 h-4 text-[#15607b]/70" }),
|
|
3947
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-[13px] font-bold uppercase tracking-wider text-[#15607b]", children: label })
|
|
3948
|
+
] }),
|
|
3949
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "hidden sm:block text-[14px] font-semibold text-slate-900", children: label }),
|
|
3950
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[15px] leading-[1.8] text-slate-600 font-normal whitespace-pre-wrap", children: value || /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-400 italic", children: "No description provided." }) })
|
|
3951
|
+
] })
|
|
3952
|
+
] });
|
|
3953
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col lg:flex-row bg-white max-h-[85vh] rounded-b-[2.5rem] overflow-y-auto w-full custom-scrollbar relative items-start", children: [
|
|
3954
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 p-6 sm:p-8 md:p-12 w-full min-h-0", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-3xl mx-auto lg:mx-0", children: [
|
|
3955
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-12 flex flex-col gap-4", children: [
|
|
3956
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
3957
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center justify-center bg-slate-50 text-slate-400 font-mono text-[12px] font-semibold px-2 py-1 rounded-[2.5rem] border border-slate-200/60 shadow-sm", children: [
|
|
3958
|
+
"SH-",
|
|
3959
|
+
shot.shot_number.toString().padStart(3, "0")
|
|
3960
|
+
] }),
|
|
3961
|
+
shot.shot_type && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 bg-blumine-50 border border-blumine-400 px-3 py-1 rounded-[2.5rem] text-blumine-500 shadow-sm", children: [
|
|
3962
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[13px] font-bold uppercase tracking-widest opacity-90", children: "Shot Type:" }),
|
|
3963
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[13px] font-bold tracking-wide", children: shot.shot_type })
|
|
3964
|
+
] })
|
|
3965
|
+
] }),
|
|
3966
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col mt-2", children: [
|
|
3967
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[11px] font-bold uppercase tracking-widest text-blumine-700 mb-2", children: "Subject" }),
|
|
3968
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl md:text-3xl font-semibold text-slate-900 tracking-tight break-words", children: shot.subject || "No Subject Defined" })
|
|
3969
|
+
] })
|
|
3970
|
+
] }),
|
|
3971
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-10", children: [
|
|
3972
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3973
|
+
DescriptionBlock,
|
|
3974
|
+
{
|
|
3975
|
+
icon: lucideReact.AlignLeft,
|
|
3976
|
+
label: "Action & Blocking",
|
|
3977
|
+
value: shot.action_blocking
|
|
3978
|
+
}
|
|
3979
|
+
),
|
|
3980
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3981
|
+
DescriptionBlock,
|
|
3982
|
+
{
|
|
3983
|
+
icon: lucideReact.Target,
|
|
3984
|
+
label: "Reasoning & Importance",
|
|
3985
|
+
value: shot.reason
|
|
3986
|
+
}
|
|
3987
|
+
),
|
|
3988
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3989
|
+
DescriptionBlock,
|
|
3990
|
+
{
|
|
3991
|
+
icon: lucideReact.Activity,
|
|
3992
|
+
label: "Emotional Intent",
|
|
3993
|
+
value: shot.emotional_purpose
|
|
3994
|
+
}
|
|
3995
|
+
),
|
|
3996
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3997
|
+
DescriptionBlock,
|
|
3998
|
+
{
|
|
3999
|
+
icon: lucideReact.MonitorPlay,
|
|
4000
|
+
label: "Editorial Role",
|
|
4001
|
+
value: shot.edit_purpose
|
|
4002
|
+
}
|
|
4003
|
+
)
|
|
4004
|
+
] })
|
|
4005
|
+
] }) }),
|
|
4006
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full lg:w-[340px] xl:w-[380px] shrink-0 bg-[#fdfdfd] border-t lg:border-t-0 lg:border-l border-slate-200/60 p-6 sm:p-8 pb-12 lg:pb-8 h-full", children: [
|
|
4007
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 mb-8", children: [
|
|
4008
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-[11px] font-bold uppercase tracking-widest text-blumine-700 mb-4 ml-1", children: "Core Identity" }),
|
|
4009
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4010
|
+
PropertyRow,
|
|
4011
|
+
{
|
|
4012
|
+
icon: lucideReact.Clapperboard,
|
|
4013
|
+
label: "Shot Type",
|
|
4014
|
+
value: shot.shot_type
|
|
4015
|
+
}
|
|
4016
|
+
),
|
|
4017
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4018
|
+
PropertyRow,
|
|
4019
|
+
{
|
|
4020
|
+
icon: lucideReact.Target,
|
|
4021
|
+
label: "Priority",
|
|
4022
|
+
value: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4023
|
+
"span",
|
|
4024
|
+
{
|
|
4025
|
+
className: `inline-flex items-center rounded-[2.5rem] px-2 py-0.5 text-[11px] font-bold tracking-wide ${shot.priority === "Essential" ? "bg-green-50 text-green-700 border border-green-200/60" : "bg-orange-100 text-orange-600 border border-orange-200/60"}`,
|
|
4026
|
+
children: shot.priority
|
|
4027
|
+
}
|
|
4028
|
+
)
|
|
4029
|
+
}
|
|
4030
|
+
),
|
|
4031
|
+
/* @__PURE__ */ jsxRuntime.jsx(PropertyRow, { icon: lucideReact.Crosshair, label: "Subject", value: shot.subject }),
|
|
4032
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4033
|
+
PropertyRow,
|
|
4034
|
+
{
|
|
4035
|
+
icon: lucideReact.Clock,
|
|
4036
|
+
label: "Duration",
|
|
4037
|
+
value: shot.duration_seconds ? `${shot.duration_seconds}` : null
|
|
4038
|
+
}
|
|
4039
|
+
),
|
|
4040
|
+
/* @__PURE__ */ jsxRuntime.jsx(PropertyRow, { icon: lucideReact.Video, label: "Shot Type", value: shot.shot_type })
|
|
4041
|
+
] }),
|
|
4042
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-px bg-slate-100 mb-8 mt-4" }),
|
|
4043
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col sm:flex-row lg:flex-col gap-10 lg:gap-8 w-full", children: [
|
|
4044
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1", children: [
|
|
4045
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-[11px] font-bold uppercase tracking-widest text-[#15607b] mb-5 ml-1", children: "Optics & Gear" }),
|
|
4046
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
4047
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4048
|
+
PropertyRow,
|
|
4049
|
+
{
|
|
4050
|
+
icon: lucideReact.Camera,
|
|
4051
|
+
label: "Camera",
|
|
4052
|
+
value: shot.camera_name
|
|
4053
|
+
}
|
|
4054
|
+
),
|
|
4055
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4056
|
+
PropertyRow,
|
|
4057
|
+
{
|
|
4058
|
+
icon: lucideReact.Aperture,
|
|
4059
|
+
label: "Lens MM",
|
|
4060
|
+
value: shot.lens_mm
|
|
4061
|
+
}
|
|
4062
|
+
),
|
|
4063
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4064
|
+
PropertyRow,
|
|
4065
|
+
{
|
|
4066
|
+
icon: lucideReact.SlidersHorizontal,
|
|
4067
|
+
label: "Aperture",
|
|
4068
|
+
value: shot.aperture
|
|
4069
|
+
}
|
|
4070
|
+
),
|
|
4071
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4072
|
+
PropertyRow,
|
|
4073
|
+
{
|
|
4074
|
+
icon: lucideReact.Frame,
|
|
4075
|
+
label: "Support",
|
|
4076
|
+
value: shot.camera_support
|
|
4077
|
+
}
|
|
4078
|
+
),
|
|
4079
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4080
|
+
PropertyRow,
|
|
4081
|
+
{
|
|
4082
|
+
icon: lucideReact.Clock,
|
|
4083
|
+
label: "Frame Rate",
|
|
4084
|
+
value: shot.fps ? `${shot.fps} fps` : null
|
|
4085
|
+
}
|
|
4086
|
+
),
|
|
4087
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4088
|
+
PropertyRow,
|
|
4089
|
+
{
|
|
4090
|
+
icon: lucideReact.Frame,
|
|
4091
|
+
label: "Angle",
|
|
4092
|
+
value: shot.camera_angle
|
|
4093
|
+
}
|
|
4094
|
+
),
|
|
4095
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4096
|
+
PropertyRow,
|
|
4097
|
+
{
|
|
4098
|
+
icon: lucideReact.Frame,
|
|
4099
|
+
label: "Movement",
|
|
4100
|
+
value: shot.camera_movement
|
|
4101
|
+
}
|
|
4102
|
+
)
|
|
4103
|
+
] })
|
|
4104
|
+
] }),
|
|
4105
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1", children: [
|
|
4106
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-[11px] font-bold uppercase tracking-widest text-[#15607b] mb-5 ml-1", children: "Visual Profile" }),
|
|
4107
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
4108
|
+
/* @__PURE__ */ jsxRuntime.jsx(PropertyRow, { icon: lucideReact.Frame, label: "Framing", value: shot.framing }),
|
|
4109
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4110
|
+
PropertyRow,
|
|
4111
|
+
{
|
|
4112
|
+
icon: lucideReact.Aperture,
|
|
4113
|
+
label: "Depth Field",
|
|
4114
|
+
value: shot.depth_of_field
|
|
4115
|
+
}
|
|
4116
|
+
),
|
|
4117
|
+
/* @__PURE__ */ jsxRuntime.jsx(PropertyRow, { icon: lucideReact.Sun, label: "Lighting", value: shot.lighting }),
|
|
4118
|
+
/* @__PURE__ */ jsxRuntime.jsx(PropertyRow, { icon: lucideReact.Wand2, label: "VFX", value: shot.vfx }),
|
|
4119
|
+
/* @__PURE__ */ jsxRuntime.jsx(PropertyRow, { icon: lucideReact.Volume2, label: "Sound", value: shot.sound })
|
|
4120
|
+
] })
|
|
4121
|
+
] })
|
|
4122
|
+
] })
|
|
4123
|
+
] })
|
|
4124
|
+
] });
|
|
4125
|
+
}
|
|
4126
|
+
function ShotBreakdownView({
|
|
4127
|
+
blocks,
|
|
4128
|
+
isLoading,
|
|
4129
|
+
shots,
|
|
4130
|
+
selectionMenu,
|
|
4131
|
+
handleMouseUp,
|
|
4132
|
+
addShot,
|
|
4133
|
+
updateShot,
|
|
4134
|
+
clearSelection,
|
|
4135
|
+
menuRef,
|
|
4136
|
+
cameras,
|
|
4137
|
+
sceneType,
|
|
4138
|
+
initializeProduction
|
|
4139
|
+
}) {
|
|
4140
|
+
var _a, _b, _c;
|
|
4141
|
+
const COURIER_STACK = "'Courier Prime', 'Courier', monospace";
|
|
4142
|
+
const containerRef = react.useRef(null);
|
|
4143
|
+
const [isSidebarOpen, setIsSidebarOpen] = react.useState(false);
|
|
4144
|
+
const [toggledShotId, setToggledShotId] = react.useState(
|
|
4145
|
+
null
|
|
4146
|
+
);
|
|
4147
|
+
const [viewingShotId, setViewingShotId] = react.useState(
|
|
4148
|
+
null
|
|
4149
|
+
);
|
|
4150
|
+
const [updatingShotId, setUpdatingShotId] = react.useState(
|
|
4151
|
+
null
|
|
4152
|
+
);
|
|
4153
|
+
const [isInitModalOpen, setIsInitModalOpen] = react.useState(false);
|
|
4154
|
+
const handleCloseModal = () => {
|
|
4155
|
+
clearSelection();
|
|
4156
|
+
};
|
|
4157
|
+
const renderBlockText = (block) => {
|
|
4158
|
+
if (!toggledShotId) return block.text;
|
|
4159
|
+
const toggledShot = shots.find((s) => s.id === toggledShotId);
|
|
4160
|
+
if (!toggledShot) return block.text;
|
|
4161
|
+
const blockShotParts = toggledShot.parts.filter((p) => p.block_id === block.id).sort((a, b) => a.start_index - b.start_index);
|
|
4162
|
+
if (blockShotParts.length === 0) return block.text;
|
|
4163
|
+
const nodes = [];
|
|
4164
|
+
let currentIndex = 0;
|
|
4165
|
+
blockShotParts.forEach((part, index) => {
|
|
4166
|
+
const actualStart = Math.max(part.start_index, currentIndex);
|
|
4167
|
+
if (actualStart > currentIndex) {
|
|
4168
|
+
nodes.push(
|
|
4169
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: block.text.slice(currentIndex, actualStart) }, `text-${currentIndex}`)
|
|
4170
|
+
);
|
|
4171
|
+
}
|
|
4172
|
+
if (actualStart < part.end_index) {
|
|
4173
|
+
nodes.push(
|
|
4174
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4175
|
+
"span",
|
|
4176
|
+
{
|
|
4177
|
+
style: {
|
|
4178
|
+
// Balanced marker gradient using blumine-200 and blumine-300 tones
|
|
4179
|
+
backgroundImage: "linear-gradient(104deg, transparent 0.5%, rgba(176, 227, 241, 0.7) 2%, rgba(122, 206, 230, 0.8) 5%, rgba(176, 227, 241, 0.7) 95%, transparent 99%)",
|
|
4180
|
+
// Tidy but still slightly organic marker edges
|
|
4181
|
+
borderRadius: "6px 2px 5px 3px / 2px 6px 3px 5px",
|
|
4182
|
+
// Clone decoration across line breaks for multi-line seamlessness
|
|
4183
|
+
boxDecorationBreak: "clone",
|
|
4184
|
+
WebkitBoxDecorationBreak: "clone",
|
|
4185
|
+
// Tighter bleed so it looks "proper" and less messy
|
|
4186
|
+
padding: "0.15em 0.25em",
|
|
4187
|
+
margin: "0 -0.15em"
|
|
4188
|
+
},
|
|
4189
|
+
children: block.text.slice(actualStart, part.end_index)
|
|
4190
|
+
},
|
|
4191
|
+
`shot-${toggledShot.id}-${index}`
|
|
4192
|
+
)
|
|
4193
|
+
);
|
|
4194
|
+
}
|
|
4195
|
+
currentIndex = Math.max(currentIndex, part.end_index);
|
|
4196
|
+
});
|
|
4197
|
+
if (currentIndex < block.text.length) {
|
|
4198
|
+
nodes.push(
|
|
4199
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: block.text.slice(currentIndex) }, `text-${currentIndex}`)
|
|
4200
|
+
);
|
|
4201
|
+
}
|
|
4202
|
+
return nodes;
|
|
4203
|
+
};
|
|
4204
|
+
react.useEffect(() => {
|
|
4205
|
+
const fontId = "google-font-courier-prime";
|
|
4206
|
+
const styleId = "screenplay-editor-force-v4";
|
|
4207
|
+
if (!document.getElementById(fontId)) {
|
|
4208
|
+
const link = document.createElement("link");
|
|
4209
|
+
link.id = fontId;
|
|
4210
|
+
link.rel = "stylesheet";
|
|
4211
|
+
link.href = "https://fonts.googleapis.com/css2?family=Courier+Prime:ital,wght@0,400;0,700;1,400;1,700&display=swap";
|
|
4212
|
+
document.head.appendChild(link);
|
|
4213
|
+
}
|
|
4214
|
+
if (!document.getElementById(styleId)) {
|
|
4215
|
+
const style = document.createElement("style");
|
|
4216
|
+
style.id = styleId;
|
|
4217
|
+
style.textContent = `
|
|
4218
|
+
/* We target by the data-attribute to ensure the highest specificity possible */
|
|
4219
|
+
[data-screenplay-editor] *,
|
|
4220
|
+
[data-screenplay-editor] div,
|
|
4221
|
+
[data-screenplay-editor] span,
|
|
4222
|
+
[data-screenplay-editor] [contenteditable="true"] {
|
|
4223
|
+
font-family: ${COURIER_STACK} !important;
|
|
4224
|
+
-webkit-font-smoothing: antialiased;
|
|
4225
|
+
}
|
|
4226
|
+
`;
|
|
4227
|
+
document.head.appendChild(style);
|
|
4228
|
+
}
|
|
4229
|
+
}, [COURIER_STACK]);
|
|
4230
|
+
if (isLoading) {
|
|
4231
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center py-32 gap-4", children: [
|
|
4232
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "w-8 h-8 animate-spin text-zinc-400" }),
|
|
4233
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-zinc-500 animate-pulse", children: "Loading scene details..." })
|
|
4234
|
+
] });
|
|
4235
|
+
}
|
|
4236
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4237
|
+
"div",
|
|
4238
|
+
{
|
|
4239
|
+
className: "relative p-8 md:p-12 mx-auto w-full min-h-screen flex flex-col gap-8 xl:pr-[20rem]",
|
|
4240
|
+
ref: containerRef,
|
|
4241
|
+
children: [
|
|
4242
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center max-w-6xl xl:max-w-full", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-4 min-h-screen", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4243
|
+
"div",
|
|
4244
|
+
{
|
|
4245
|
+
className: "relative bg-[#fdfdfc] shadow-md shadow-zinc-300/60 border border-zinc-100 rounded-sm md:rounded-md pl-[1.5in] py-[1in] pr-[1in] flex flex-col w-[210mm] min-h-auto shrink-0",
|
|
4246
|
+
style: {
|
|
4247
|
+
fontFamily: COURIER_STACK,
|
|
4248
|
+
paddingLeft: "1.5in",
|
|
4249
|
+
paddingRight: "1in",
|
|
4250
|
+
paddingTop: "1in",
|
|
4251
|
+
paddingBottom: "1in",
|
|
4252
|
+
lineHeight: "1.2"
|
|
4253
|
+
},
|
|
4254
|
+
"data-screenplay-editor": "true",
|
|
4255
|
+
onMouseUp: handleMouseUp,
|
|
4256
|
+
children: blocks.map((block) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
4257
|
+
"div",
|
|
4258
|
+
{
|
|
4259
|
+
"data-block-id": block.id,
|
|
4260
|
+
className: `relative break-words w-full px-4 py-2 ${blockStyles[block.type].className}`,
|
|
4261
|
+
style: __spreadProps(__spreadValues({}, blockStyles[block.type].inputStyle), {
|
|
4262
|
+
minHeight: "2.5rem"
|
|
4263
|
+
}),
|
|
4264
|
+
children: renderBlockText(block)
|
|
4265
|
+
},
|
|
4266
|
+
block.id
|
|
4267
|
+
))
|
|
4268
|
+
}
|
|
4269
|
+
) }) }),
|
|
4270
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
4271
|
+
"button",
|
|
4272
|
+
{
|
|
4273
|
+
onClick: () => setIsSidebarOpen(true),
|
|
4274
|
+
className: "fixed bottom-6 right-6 z-40 flex h-14 w-14 items-center justify-center rounded-full bg-[#15607b] text-white shadow-[0_8px_30px_rgba(21,96,123,0.3)] transition-transform hover:scale-105 active:scale-95 xl:hidden",
|
|
4275
|
+
children: [
|
|
4276
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Video, { className: "h-6 w-6" }),
|
|
4277
|
+
shots.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-1 -right-1 flex h-5 w-5 items-center justify-center rounded-full bg-rose-500 text-[10px] font-bold text-white shadow-sm border-2 border-white", children: shots.length })
|
|
4278
|
+
]
|
|
4279
|
+
}
|
|
4280
|
+
),
|
|
4281
|
+
isSidebarOpen && /* @__PURE__ */ jsxRuntime.jsx(
|
|
4282
|
+
"div",
|
|
4283
|
+
{
|
|
4284
|
+
className: "fixed inset-0 z-40 bg-slate-900/20 backdrop-blur-sm transition-opacity xl:hidden",
|
|
4285
|
+
onClick: () => setIsSidebarOpen(false)
|
|
4286
|
+
}
|
|
4287
|
+
),
|
|
4288
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4289
|
+
"div",
|
|
4290
|
+
{
|
|
4291
|
+
className: `fixed xl:absolute top-0 right-0 z-50 h-full w-72 transform transition-transform duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] xl:translate-x-0 ${isSidebarOpen ? "translate-x-0 shadow-[0_0_40px_rgba(0,0,0,0.1)]" : "translate-x-full"}`,
|
|
4292
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sticky top-0 flex h-[100dvh] max-h-screen w-full flex-col border-l border-l-[#eefafd] bg-white p-3 py-5", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex flex-col gap-3 py-5 my-5 flex-1 overflow-hidden", children: [
|
|
4293
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center justify-between mb-2 shrink-0 px-1", children: [
|
|
4294
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5", children: [
|
|
4295
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-7 w-7 items-center justify-center rounded-md border border-slate-200 bg-slate-50 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Video, { className: "h-3.5 w-3.5 text-slate-700" }) }),
|
|
4296
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
|
|
4297
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-[11px] font-bold uppercase tracking-widest text-slate-800", children: "Shots" }),
|
|
4298
|
+
sceneType && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] font-bold text-[#15607b] uppercase tracking-tighter opacity-80 mt-0.5", children: sceneType })
|
|
4299
|
+
] })
|
|
4300
|
+
] }),
|
|
4301
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
4302
|
+
cameras.length === 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
4303
|
+
"button",
|
|
4304
|
+
{
|
|
4305
|
+
onClick: () => setIsInitModalOpen(true),
|
|
4306
|
+
className: "flex h-7 w-7 items-center justify-center rounded-md border border-slate-200 bg-white shadow-sm transition-colors hover:bg-slate-50",
|
|
4307
|
+
title: "Project Setup",
|
|
4308
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Settings2, { className: "h-3.5 w-3.5 text-slate-600" })
|
|
4309
|
+
}
|
|
4310
|
+
),
|
|
4311
|
+
shots.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded-md border border-slate-200 bg-white px-2 py-0.5 text-[10px] font-semibold text-slate-600 shadow-sm", children: shots.length })
|
|
4312
|
+
] })
|
|
4313
|
+
] }),
|
|
4314
|
+
cameras.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5 px-1 mb-6 mt-2", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1.5 text-[9px] font-bold uppercase tracking-widest bg-slate-100 text-slate-500 px-2 py-1 rounded-md border border-slate-200/50", children: [
|
|
4315
|
+
cameras.length,
|
|
4316
|
+
" Multi-Cam Setup"
|
|
4317
|
+
] }) }),
|
|
4318
|
+
shots.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center py-10 px-4 text-center", children: [
|
|
4319
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full bg-slate-50 border border-slate-100 mb-3", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Video, { className: "h-4 w-4 text-slate-300" }) }),
|
|
4320
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-semibold text-slate-700", children: "No shots created" }),
|
|
4321
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[11px] text-slate-500 mt-1 max-w-[160px] leading-relaxed", children: "Highlight text in the screenplay to add your first shot." })
|
|
4322
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-2.5 overflow-y-auto overflow-x-hidden pb-4 pr-2 custom-scrollbar", children: shots.map((shot) => {
|
|
4323
|
+
const isActive = toggledShotId === shot.id;
|
|
4324
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4325
|
+
"div",
|
|
4326
|
+
{
|
|
4327
|
+
onClick: () => {
|
|
4328
|
+
var _a2;
|
|
4329
|
+
return setToggledShotId(isActive ? null : (_a2 = shot.id) != null ? _a2 : null);
|
|
4330
|
+
},
|
|
4331
|
+
className: `group relative flex flex-col cursor-pointer gap-2 overflow-hidden rounded-lg border px-3.5 py-3 transition-colors duration-200 ${isActive ? "border-slate-800 bg-slate-50 shadow-[0_2px_8px_rgba(0,0,0,0.04)]" : "border-slate-200 bg-white hover:border-slate-300 hover:bg-slate-50/50"}`,
|
|
4332
|
+
children: [
|
|
4333
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
4334
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
4335
|
+
"span",
|
|
4336
|
+
{
|
|
4337
|
+
className: `text-xs font-semibold ${isActive ? "text-slate-900" : "text-slate-700"}`,
|
|
4338
|
+
children: [
|
|
4339
|
+
"Shot ",
|
|
4340
|
+
shot.shot_number
|
|
4341
|
+
]
|
|
4342
|
+
}
|
|
4343
|
+
),
|
|
4344
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4345
|
+
"span",
|
|
4346
|
+
{
|
|
4347
|
+
className: `rounded-md px-1.5 py-0.5 text-[9px] font-bold uppercase tracking-wider ${isActive ? "bg-slate-200 text-slate-800" : "bg-slate-100 text-slate-500"}`,
|
|
4348
|
+
children: shot.shot_type
|
|
4349
|
+
}
|
|
4350
|
+
)
|
|
4351
|
+
] }),
|
|
4352
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[11px] font-medium text-slate-500 truncate", children: [
|
|
4353
|
+
shot.camera_name,
|
|
4354
|
+
" \u2022 ",
|
|
4355
|
+
shot.lens_mm
|
|
4356
|
+
] }),
|
|
4357
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4358
|
+
"div",
|
|
4359
|
+
{
|
|
4360
|
+
className: `grid grid-rows-[0fr] transition-all duration-300 ease-in-out ${isActive ? "grid-rows-[1fr] mt-0.5" : ""}`,
|
|
4361
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 pt-2 border-t border-slate-200/60 mt-1", children: [
|
|
4362
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
4363
|
+
"button",
|
|
4364
|
+
{
|
|
4365
|
+
onClick: (e) => {
|
|
4366
|
+
var _a2;
|
|
4367
|
+
e.stopPropagation();
|
|
4368
|
+
setViewingShotId((_a2 = shot.id) != null ? _a2 : null);
|
|
4369
|
+
},
|
|
4370
|
+
className: "flex flex-1 items-center justify-center gap-1.5 rounded-md border border-slate-200 bg-white py-1.5 text-[10px] font-bold text-slate-700 shadow-sm transition-colors hover:bg-slate-50 hover:text-slate-900",
|
|
4371
|
+
children: [
|
|
4372
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Eye, { className: "h-3 w-3" }),
|
|
4373
|
+
"View"
|
|
4374
|
+
]
|
|
4375
|
+
}
|
|
4376
|
+
),
|
|
4377
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
4378
|
+
"button",
|
|
4379
|
+
{
|
|
4380
|
+
onClick: (e) => {
|
|
4381
|
+
var _a2;
|
|
4382
|
+
e.stopPropagation();
|
|
4383
|
+
setUpdatingShotId((_a2 = shot.id) != null ? _a2 : null);
|
|
4384
|
+
},
|
|
4385
|
+
className: "flex flex-1 items-center justify-center gap-1.5 rounded-md bg-slate-900 py-1.5 text-[10px] font-bold text-white shadow-sm transition-colors hover:bg-slate-800",
|
|
4386
|
+
children: [
|
|
4387
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pencil, { className: "h-3 w-3" }),
|
|
4388
|
+
"Edit"
|
|
4389
|
+
]
|
|
4390
|
+
}
|
|
4391
|
+
)
|
|
4392
|
+
] }) })
|
|
4393
|
+
}
|
|
4394
|
+
)
|
|
4395
|
+
]
|
|
4396
|
+
},
|
|
4397
|
+
shot.id
|
|
4398
|
+
);
|
|
4399
|
+
}) })
|
|
4400
|
+
] }) })
|
|
4401
|
+
}
|
|
4402
|
+
),
|
|
4403
|
+
selectionMenu && /* @__PURE__ */ jsxRuntime.jsx(
|
|
4404
|
+
modal_layout_default,
|
|
4405
|
+
{
|
|
4406
|
+
onClose: handleCloseModal,
|
|
4407
|
+
title: cameras.length === 0 ? "Production Setup" : "Add New Shot",
|
|
4408
|
+
menuRef,
|
|
4409
|
+
maxWidth: cameras.length === 0 ? "max-w-lg" : "max-w-7xl",
|
|
4410
|
+
children: cameras.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(production_setup_modal_default, { initializeProduction }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
4411
|
+
add_shot_modal_default,
|
|
4412
|
+
{
|
|
4413
|
+
onSubmit: (values) => {
|
|
4414
|
+
addShot(values);
|
|
4415
|
+
handleCloseModal();
|
|
4416
|
+
},
|
|
4417
|
+
cameras,
|
|
4418
|
+
shots,
|
|
4419
|
+
handleCloseModal,
|
|
4420
|
+
parts: selectionMenu.parts
|
|
4421
|
+
}
|
|
4422
|
+
)
|
|
4423
|
+
}
|
|
4424
|
+
),
|
|
4425
|
+
isInitModalOpen && /* @__PURE__ */ jsxRuntime.jsx(
|
|
4426
|
+
modal_layout_default,
|
|
4427
|
+
{
|
|
4428
|
+
onClose: () => setIsInitModalOpen(false),
|
|
4429
|
+
title: "Production Setup",
|
|
4430
|
+
maxWidth: "max-w-lg",
|
|
4431
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4432
|
+
production_setup_modal_default,
|
|
4433
|
+
{
|
|
4434
|
+
initializeProduction: (count, type) => {
|
|
4435
|
+
initializeProduction(count, type);
|
|
4436
|
+
setIsInitModalOpen(false);
|
|
4437
|
+
},
|
|
4438
|
+
initialValues: {
|
|
4439
|
+
numCameras: cameras.length || 1,
|
|
4440
|
+
scene_type: sceneType
|
|
4441
|
+
}
|
|
4442
|
+
}
|
|
4443
|
+
)
|
|
4444
|
+
}
|
|
4445
|
+
),
|
|
4446
|
+
viewingShotId && /* @__PURE__ */ jsxRuntime.jsx(
|
|
4447
|
+
modal_layout_default,
|
|
4448
|
+
{
|
|
4449
|
+
onClose: () => setViewingShotId(null),
|
|
4450
|
+
title: `Shot ${((_a = shots.find((s) => s.id === viewingShotId)) == null ? void 0 : _a.shot_number) || ""} Details`,
|
|
4451
|
+
maxWidth: "max-w-5xl",
|
|
4452
|
+
children: shots.find((s) => s.id === viewingShotId) && /* @__PURE__ */ jsxRuntime.jsx(ViewShotModal, { shot: shots.find((s) => s.id === viewingShotId) })
|
|
4453
|
+
}
|
|
4454
|
+
),
|
|
4455
|
+
updatingShotId && /* @__PURE__ */ jsxRuntime.jsx(
|
|
4456
|
+
modal_layout_default,
|
|
4457
|
+
{
|
|
4458
|
+
onClose: () => setUpdatingShotId(null),
|
|
4459
|
+
title: `Update Shot SH-${((_c = (_b = shots.find((s) => s.id === updatingShotId)) == null ? void 0 : _b.shot_number) == null ? void 0 : _c.toString().padStart(3, "0")) || ""}`,
|
|
4460
|
+
maxWidth: "max-w-7xl",
|
|
4461
|
+
children: shots.find((s) => s.id === updatingShotId) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
4462
|
+
add_shot_modal_default,
|
|
4463
|
+
{
|
|
4464
|
+
parts: shots.find((s) => s.id === updatingShotId).parts,
|
|
4465
|
+
cameras,
|
|
4466
|
+
shots,
|
|
4467
|
+
handleCloseModal: () => setUpdatingShotId(null),
|
|
4468
|
+
userShotValue: shots.find((s) => s.id === updatingShotId),
|
|
4469
|
+
onSubmit: (values) => {
|
|
4470
|
+
updateShot(updatingShotId, values);
|
|
4471
|
+
setUpdatingShotId(null);
|
|
4472
|
+
}
|
|
4473
|
+
}
|
|
4474
|
+
)
|
|
4475
|
+
}
|
|
4476
|
+
)
|
|
4477
|
+
]
|
|
4478
|
+
}
|
|
4479
|
+
);
|
|
4480
|
+
}
|
|
4481
|
+
function useShotBreakdownScene(options) {
|
|
4482
|
+
const [shots, setShots] = react.useState(options.preLoadedShots || []);
|
|
4483
|
+
const [cameras, setCameras] = react.useState(
|
|
4484
|
+
options.preloadedCameras || []
|
|
4485
|
+
);
|
|
4486
|
+
const [sceneType, setSceneType] = react.useState(
|
|
4487
|
+
options.preloadedSceneType || ""
|
|
4488
|
+
);
|
|
4489
|
+
const [scene, setScene] = react.useState(null);
|
|
4490
|
+
const [isLoading, setIsLoading] = react.useState(true);
|
|
4491
|
+
const [error, setError] = react.useState(false);
|
|
4492
|
+
const [selectionMenu, setSelectionMenu] = react.useState(null);
|
|
4493
|
+
const menuRef = react.useRef(null);
|
|
4494
|
+
react.useEffect(() => {
|
|
4495
|
+
setIsLoading(true);
|
|
4496
|
+
const fetchScene = async () => {
|
|
4497
|
+
try {
|
|
4498
|
+
const response = await fetch(options.scene_url, options.fetchOptions);
|
|
4499
|
+
if (response.ok) {
|
|
4500
|
+
const text = await response.text();
|
|
4501
|
+
setScene({ content: text });
|
|
4502
|
+
} else {
|
|
4503
|
+
console.error("Failed to fetch scene:", response);
|
|
4504
|
+
setError(true);
|
|
4505
|
+
}
|
|
4506
|
+
setIsLoading(false);
|
|
4507
|
+
} catch (error2) {
|
|
4508
|
+
setError(true);
|
|
4509
|
+
setIsLoading(false);
|
|
4510
|
+
console.error("Error fetching scene:", error2);
|
|
4511
|
+
}
|
|
4512
|
+
};
|
|
4513
|
+
fetchScene();
|
|
4514
|
+
}, []);
|
|
4515
|
+
const blocks = react.useMemo(() => {
|
|
4516
|
+
if (!scene || !scene.content) return [];
|
|
4517
|
+
const parser = new DOMParser();
|
|
4518
|
+
const doc = parser.parseFromString(scene.content, "text/html");
|
|
4519
|
+
const divs = Array.from(doc.querySelectorAll("div"));
|
|
4520
|
+
const parsedBlocks = [];
|
|
4521
|
+
const typeMap = {
|
|
4522
|
+
divtype0: "SCENE_HEADING",
|
|
4523
|
+
divtype2: "ACTION",
|
|
4524
|
+
divtype3: "CHARACTER",
|
|
4525
|
+
divtype4: "PARENTHETICAL",
|
|
4526
|
+
divtype5: "DIALOGUE",
|
|
4527
|
+
divtype6: "TRANSITION"
|
|
4528
|
+
};
|
|
4529
|
+
divs.forEach((div) => {
|
|
4530
|
+
var _a;
|
|
4531
|
+
const divText = ((_a = div.textContent) == null ? void 0 : _a.trim()) || "";
|
|
4532
|
+
if (!divText) return;
|
|
4533
|
+
let type = "ACTION";
|
|
4534
|
+
for (const className of Array.from(div.classList)) {
|
|
4535
|
+
if (typeMap[className]) {
|
|
4536
|
+
type = typeMap[className];
|
|
4537
|
+
break;
|
|
4538
|
+
}
|
|
4539
|
+
}
|
|
4540
|
+
const idAttr = div.getAttribute("id");
|
|
4541
|
+
const blockId = idAttr && idAttr.startsWith("par") ? idAttr.substring(3) : idAttr || uuid();
|
|
4542
|
+
parsedBlocks.push({ id: blockId, type, text: divText });
|
|
4543
|
+
});
|
|
4544
|
+
return parsedBlocks;
|
|
4545
|
+
}, [scene]);
|
|
4546
|
+
const clearSelection = () => {
|
|
4547
|
+
var _a;
|
|
4548
|
+
setSelectionMenu(null);
|
|
4549
|
+
(_a = window.getSelection()) == null ? void 0 : _a.removeAllRanges();
|
|
4550
|
+
};
|
|
4551
|
+
react.useEffect(() => {
|
|
4552
|
+
const handleClickOutside = (e) => {
|
|
4553
|
+
if (menuRef.current && !menuRef.current.contains(e.target)) {
|
|
4554
|
+
clearSelection();
|
|
4555
|
+
}
|
|
4556
|
+
};
|
|
4557
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
4558
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
4559
|
+
}, []);
|
|
4560
|
+
const getAbsoluteOffset = (blockEl, targetNode, targetOffset) => {
|
|
4561
|
+
var _a;
|
|
4562
|
+
let currentOffset = 0;
|
|
4563
|
+
const walker = document.createTreeWalker(
|
|
4564
|
+
blockEl,
|
|
4565
|
+
NodeFilter.SHOW_TEXT,
|
|
4566
|
+
null
|
|
4567
|
+
);
|
|
4568
|
+
let currentNode = walker.nextNode();
|
|
4569
|
+
while (currentNode) {
|
|
4570
|
+
if (currentNode === targetNode) {
|
|
4571
|
+
return currentOffset + targetOffset;
|
|
4572
|
+
}
|
|
4573
|
+
currentOffset += ((_a = currentNode.nodeValue) == null ? void 0 : _a.length) || 0;
|
|
4574
|
+
currentNode = walker.nextNode();
|
|
4575
|
+
}
|
|
4576
|
+
return targetOffset;
|
|
4577
|
+
};
|
|
4578
|
+
const handleMouseUp = () => {
|
|
4579
|
+
var _a, _b;
|
|
4580
|
+
const selection = window.getSelection();
|
|
4581
|
+
if (!selection || selection.isCollapsed) return;
|
|
4582
|
+
const range = selection.getRangeAt(0);
|
|
4583
|
+
const startNode = range.startContainer;
|
|
4584
|
+
const endNode = range.endContainer;
|
|
4585
|
+
const startBlockEl = startNode.nodeType === Node.TEXT_NODE ? (_a = startNode.parentElement) == null ? void 0 : _a.closest("[data-block-id]") : startNode.closest("[data-block-id]");
|
|
4586
|
+
const endBlockEl = endNode.nodeType === Node.TEXT_NODE ? (_b = endNode.parentElement) == null ? void 0 : _b.closest("[data-block-id]") : endNode.closest("[data-block-id]");
|
|
4587
|
+
if (!startBlockEl || !endBlockEl) return;
|
|
4588
|
+
const startBlockId = startBlockEl.getAttribute("data-block-id");
|
|
4589
|
+
const endBlockId = endBlockEl.getAttribute("data-block-id");
|
|
4590
|
+
const startIndexInArray = blocks.findIndex((b) => b.id === startBlockId);
|
|
4591
|
+
const endIndexInArray = blocks.findIndex((b) => b.id === endBlockId);
|
|
4592
|
+
if (startIndexInArray === -1 || endIndexInArray === -1) return;
|
|
4593
|
+
const startAbsOffset = getAbsoluteOffset(
|
|
4594
|
+
startBlockEl,
|
|
4595
|
+
startNode,
|
|
4596
|
+
range.startOffset
|
|
4597
|
+
);
|
|
4598
|
+
const endAbsOffset = getAbsoluteOffset(
|
|
4599
|
+
endBlockEl,
|
|
4600
|
+
endNode,
|
|
4601
|
+
range.endOffset
|
|
4602
|
+
);
|
|
4603
|
+
const selectedParts = [];
|
|
4604
|
+
for (let i = startIndexInArray; i <= endIndexInArray; i++) {
|
|
4605
|
+
const block = blocks[i];
|
|
4606
|
+
const start = i === startIndexInArray ? startAbsOffset : 0;
|
|
4607
|
+
const end = i === endIndexInArray ? endAbsOffset : block.text.length;
|
|
4608
|
+
if (start !== end) {
|
|
4609
|
+
selectedParts.push({
|
|
4610
|
+
block_id: block.id,
|
|
4611
|
+
start_index: start,
|
|
4612
|
+
end_index: end,
|
|
4613
|
+
text: block.text.slice(start, end)
|
|
4614
|
+
});
|
|
4615
|
+
}
|
|
4616
|
+
}
|
|
4617
|
+
if (selectedParts.length > 0) {
|
|
4618
|
+
const rect = range.getBoundingClientRect();
|
|
4619
|
+
setSelectionMenu({
|
|
4620
|
+
top: rect.top + window.scrollY,
|
|
4621
|
+
left: rect.left + rect.width / 2 + window.scrollX,
|
|
4622
|
+
parts: selectedParts
|
|
4623
|
+
});
|
|
4624
|
+
}
|
|
4625
|
+
};
|
|
4626
|
+
const initializeProduction = (count, type) => {
|
|
4627
|
+
var _a;
|
|
4628
|
+
const newCameras = [];
|
|
4629
|
+
for (let i = 1; i <= count; i++) {
|
|
4630
|
+
newCameras.push({ name: `Camera ${String.fromCharCode(64 + i)}` });
|
|
4631
|
+
}
|
|
4632
|
+
setCameras(newCameras);
|
|
4633
|
+
setSceneType(type);
|
|
4634
|
+
(_a = options.onProductionInitialized) == null ? void 0 : _a.call(options, newCameras, type);
|
|
4635
|
+
};
|
|
4636
|
+
const addShot = (shotDetails) => {
|
|
4637
|
+
var _a;
|
|
4638
|
+
if (!selectionMenu) return;
|
|
4639
|
+
const newShot = __spreadProps(__spreadValues({}, shotDetails), {
|
|
4640
|
+
id: uuid(),
|
|
4641
|
+
shot_number: shots.length + 1,
|
|
4642
|
+
parts: selectionMenu.parts
|
|
4643
|
+
});
|
|
4644
|
+
setShots((prev) => [...prev, newShot]);
|
|
4645
|
+
(_a = options.onShotAdded) == null ? void 0 : _a.call(options, newShot);
|
|
4646
|
+
clearSelection();
|
|
4647
|
+
};
|
|
4648
|
+
const updateShot = (shotId, updatedDetails) => {
|
|
4649
|
+
setShots(
|
|
4650
|
+
(prev) => prev.map((shot) => {
|
|
4651
|
+
var _a;
|
|
4652
|
+
if (shot.id === shotId) {
|
|
4653
|
+
const fullUpdated = __spreadValues(__spreadValues({}, shot), updatedDetails);
|
|
4654
|
+
(_a = options.onShotUpdated) == null ? void 0 : _a.call(options, shotId, fullUpdated);
|
|
4655
|
+
return fullUpdated;
|
|
4656
|
+
}
|
|
4657
|
+
return shot;
|
|
4658
|
+
})
|
|
4659
|
+
);
|
|
4660
|
+
};
|
|
4661
|
+
return {
|
|
4662
|
+
blocks,
|
|
4663
|
+
isLoading,
|
|
4664
|
+
error,
|
|
4665
|
+
shots,
|
|
4666
|
+
sceneType,
|
|
4667
|
+
selectionMenu,
|
|
4668
|
+
handleMouseUp,
|
|
4669
|
+
cameras,
|
|
4670
|
+
initializeProduction,
|
|
4671
|
+
addShot,
|
|
4672
|
+
updateShot,
|
|
4673
|
+
clearSelection,
|
|
4674
|
+
menuRef
|
|
4675
|
+
};
|
|
4676
|
+
}
|
|
2837
4677
|
|
|
2838
4678
|
exports.CATEGORIES = CATEGORIES;
|
|
2839
4679
|
exports.ScreenplayEditorView = ScreenplayEditorView;
|
|
2840
4680
|
exports.ScriptBreakdownSceneView = ScriptBreakdownSceneView;
|
|
4681
|
+
exports.ShotBreakdownView = ShotBreakdownView;
|
|
4682
|
+
exports.aperture_options = aperture_options;
|
|
2841
4683
|
exports.blockStyles = blockStyles;
|
|
2842
4684
|
exports.blockTypes = blockTypes;
|
|
4685
|
+
exports.camera_angles = camera_angles;
|
|
4686
|
+
exports.camera_movements = camera_movements;
|
|
4687
|
+
exports.camera_supports = camera_supports;
|
|
2843
4688
|
exports.convertBlocksToSbx = convertBlocksToSbx;
|
|
4689
|
+
exports.fps_options = fps_options;
|
|
2844
4690
|
exports.handleSaveAsPdf = handleSaveAsPdf;
|
|
2845
4691
|
exports.handleSyncWithCloud = handleSyncWithCloud;
|
|
2846
4692
|
exports.icons = icons;
|
|
4693
|
+
exports.lens_options = lens_options;
|
|
4694
|
+
exports.scene_types = scene_types;
|
|
4695
|
+
exports.shot_types = shot_types;
|
|
2847
4696
|
exports.timeOfDayOptions = timeOfDayOptions;
|
|
2848
4697
|
exports.useScreenplayEditor = useScreenplayEditor;
|
|
2849
4698
|
exports.useScriptBreakdownScene = useScriptBreakdownScene;
|
|
4699
|
+
exports.useShotBreakdownScene = useShotBreakdownScene;
|
|
2850
4700
|
exports.uuid = uuid;
|
|
4701
|
+
exports.vfx_types = vfx_types;
|
|
2851
4702
|
//# sourceMappingURL=index.cjs.map
|
|
2852
4703
|
//# sourceMappingURL=index.cjs.map
|