@vishu1301/script-writing 1.3.5 → 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/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",
@@ -2354,7 +2369,7 @@ function ScriptBreakdownSceneView({
2354
2369
  onClick: (e) => {
2355
2370
  e.stopPropagation();
2356
2371
  if (editingTagData.tag.id) {
2357
- updateTag == null ? void 0 : updateTag(editingTagData.tag.id, null, __spreadValues(__spreadValues({}, editingTagData.catId === "PROP" || editingTagData.catId === "SET_PROP" ? { quantity: tagForm.quantity } : {}), editingTagData.catId === "CAST" ? { look: tagForm.look, age: tagForm.age } : {}));
2372
+ updateTag == null ? void 0 : updateTag(editingTagData.tag.id, editingTagData.catId, __spreadValues(__spreadValues({}, editingTagData.catId === "PROP" || editingTagData.catId === "SET_PROP" ? { quantity: tagForm.quantity } : {}), editingTagData.catId === "CAST" ? { look: tagForm.look, age: tagForm.age } : {}));
2358
2373
  }
2359
2374
  setEditingTagData(null);
2360
2375
  },
@@ -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