@cere/cere-design-system 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,3194 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ Accordion: () => Accordion,
34
+ Alert: () => Alert,
35
+ AppBar: () => AppBar,
36
+ AppLoading: () => AppLoading,
37
+ Avatar: () => Avatar4,
38
+ Background: () => import_reactflow2.Background,
39
+ BackgroundVariant: () => import_reactflow2.BackgroundVariant,
40
+ Badge: () => Badge,
41
+ Box: () => import_material19.Box,
42
+ Breadcrumbs: () => Breadcrumbs,
43
+ Button: () => Button,
44
+ ButtonGroup: () => ButtonGroup,
45
+ Card: () => Card,
46
+ CardActions: () => CardActions,
47
+ CardContent: () => CardContent,
48
+ CardHeader: () => CardHeader,
49
+ Checkbox: () => Checkbox,
50
+ Chip: () => Chip2,
51
+ CircularProgress: () => CircularProgress6,
52
+ CodeEditor: () => CodeEditor,
53
+ Collapse: () => Collapse,
54
+ ConnectionLineType: () => import_reactflow2.ConnectionLineType,
55
+ Container: () => import_material21.Container,
56
+ Controls: () => import_reactflow2.Controls,
57
+ Dialog: () => Dialog,
58
+ Divider: () => Divider3,
59
+ Drawer: () => Drawer2,
60
+ Dropdown: () => Dropdown,
61
+ EmptyState: () => EmptyState,
62
+ FlowEditor: () => FlowEditor,
63
+ FormControl: () => import_material2.FormControl,
64
+ FormControlLabel: () => import_material2.FormControlLabel,
65
+ FormHelperText: () => import_material2.FormHelperText,
66
+ FormLabel: () => import_material2.FormLabel,
67
+ Grid: () => import_material16.Grid,
68
+ IconButton: () => IconButton,
69
+ InputAdornment: () => import_material2.InputAdornment,
70
+ InputLabel: () => import_material2.InputLabel,
71
+ Link: () => Link3,
72
+ List: () => List5,
73
+ ListItem: () => ListItem3,
74
+ ListItemIcon: () => import_material14.ListItemIcon,
75
+ ListItemSecondaryAction: () => import_material14.ListItemSecondaryAction,
76
+ ListItemText: () => import_material14.ListItemText,
77
+ Loading: () => Loading,
78
+ LoadingButton: () => LoadingButton,
79
+ Menu: () => Menu3,
80
+ MenuItem: () => MenuItem2,
81
+ MiniMap: () => import_reactflow2.MiniMap,
82
+ Pagination: () => Pagination,
83
+ Panel: () => import_reactflow3.Panel,
84
+ Paper: () => Paper,
85
+ Progress: () => Progress,
86
+ Radio: () => Radio,
87
+ RadioGroup: () => import_RadioGroup.default,
88
+ SearchField: () => SearchField,
89
+ Selector: () => Selector,
90
+ ServiceSelectorButton: () => ServiceSelectorButton,
91
+ Sidebar: () => Sidebar,
92
+ SidebarItem: () => SidebarItem,
93
+ Snackbar: () => Snackbar,
94
+ Stack: () => import_material18.Stack,
95
+ Step: () => Step,
96
+ StepButton: () => StepButton,
97
+ StepContent: () => StepContent,
98
+ StepLabel: () => StepLabel,
99
+ Stepper: () => Stepper,
100
+ Switch: () => Switch,
101
+ Tab: () => Tab,
102
+ Table: () => Table,
103
+ TableHeader: () => TableHeader,
104
+ TextField: () => TextField,
105
+ ToggleButton: () => ToggleButton,
106
+ ToggleButtonGroup: () => ToggleButtonGroup,
107
+ Toolbar: () => import_material22.Toolbar,
108
+ Tooltip: () => Tooltip2,
109
+ Typography: () => import_material20.Typography,
110
+ WorkspaceSelectorButton: () => WorkspaceSelectorButton,
111
+ colors: () => colors,
112
+ theme: () => theme
113
+ });
114
+ module.exports = __toCommonJS(index_exports);
115
+
116
+ // src/theme/index.ts
117
+ var import_styles = require("@mui/material/styles");
118
+ var colors = {
119
+ primary: {
120
+ main: "#1976d2",
121
+ // ROB primary color
122
+ light: "#1976d2",
123
+ // Same as main for selected background
124
+ dark: "#1565c0",
125
+ contrastText: "#FFFFFF"
126
+ },
127
+ secondary: {
128
+ main: "#666666",
129
+ light: "#999999",
130
+ dark: "#333333",
131
+ contrastText: "#FFFFFF"
132
+ },
133
+ success: {
134
+ main: "#10B981",
135
+ light: "#34D399",
136
+ dark: "#059669",
137
+ contrastText: "#FFFFFF"
138
+ },
139
+ error: {
140
+ main: "#EF4444",
141
+ light: "#F87171",
142
+ dark: "#DC2626",
143
+ contrastText: "#FFFFFF"
144
+ },
145
+ warning: {
146
+ main: "#F59E0B",
147
+ light: "#FBBF24",
148
+ dark: "#D97706",
149
+ contrastText: "#FFFFFF"
150
+ },
151
+ tertiary: {
152
+ main: "#F59E0B",
153
+ light: "#FBBF24",
154
+ dark: "#D97706",
155
+ contrastText: "#1A1A1A"
156
+ },
157
+ grey: {
158
+ 50: "#FAFAFA",
159
+ 100: "#F5F5F5",
160
+ 200: "#EEEEEE",
161
+ 300: "#E0E0E0",
162
+ 400: "#BDBDBD",
163
+ 500: "#9E9E9E",
164
+ 600: "#757575",
165
+ 700: "#616161",
166
+ 800: "#424242",
167
+ 900: "#212121"
168
+ },
169
+ text: {
170
+ primary: "#1A1A1A",
171
+ secondary: "#666666",
172
+ disabled: "#999999"
173
+ },
174
+ background: {
175
+ default: "#FFFFFF",
176
+ paper: "#FFFFFF",
177
+ selected: "rgba(123, 44, 191, 0.1)"
178
+ }
179
+ };
180
+ var theme = (0, import_styles.createTheme)({
181
+ palette: {
182
+ mode: "light",
183
+ primary: colors.primary,
184
+ secondary: colors.secondary,
185
+ success: colors.success,
186
+ error: colors.error,
187
+ warning: colors.warning,
188
+ grey: colors.grey,
189
+ text: colors.text,
190
+ background: colors.background
191
+ },
192
+ typography: {
193
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Human Sans', 'Nohemi', sans-serif",
194
+ h1: {
195
+ fontWeight: 700,
196
+ fontSize: "96px",
197
+ lineHeight: 1.2
198
+ },
199
+ h2: {
200
+ fontWeight: 700,
201
+ fontSize: "60px",
202
+ lineHeight: 1.2
203
+ },
204
+ h3: {
205
+ fontWeight: 700,
206
+ fontSize: "48px",
207
+ lineHeight: 1.2
208
+ },
209
+ h4: {
210
+ fontWeight: 600,
211
+ fontSize: "34px",
212
+ lineHeight: 1.2
213
+ },
214
+ h5: {
215
+ fontWeight: 600,
216
+ fontSize: "24px",
217
+ lineHeight: 1.2
218
+ },
219
+ h6: {
220
+ fontWeight: 600,
221
+ fontSize: "20px",
222
+ lineHeight: 1.2
223
+ },
224
+ subtitle1: {
225
+ fontWeight: 700,
226
+ fontSize: "16px",
227
+ lineHeight: 1.5
228
+ },
229
+ subtitle2: {
230
+ fontWeight: 700,
231
+ fontSize: "14px",
232
+ lineHeight: 1.5
233
+ },
234
+ body1: {
235
+ fontWeight: 400,
236
+ fontSize: "16px",
237
+ lineHeight: 1.5
238
+ },
239
+ body2: {
240
+ fontWeight: 400,
241
+ fontSize: "14px",
242
+ lineHeight: 1.5
243
+ },
244
+ button: {
245
+ fontWeight: 700,
246
+ fontSize: "14px",
247
+ textTransform: "uppercase",
248
+ letterSpacing: "0.5px"
249
+ },
250
+ caption: {
251
+ fontWeight: 400,
252
+ fontSize: "12px",
253
+ lineHeight: 1.5
254
+ },
255
+ overline: {
256
+ fontWeight: 800,
257
+ fontSize: "10px",
258
+ textTransform: "uppercase",
259
+ letterSpacing: "1px"
260
+ }
261
+ },
262
+ shape: {
263
+ borderRadius: 16
264
+ },
265
+ components: {
266
+ MuiButton: {
267
+ styleOverrides: {
268
+ root: {
269
+ textTransform: "none",
270
+ borderRadius: 12,
271
+ fontWeight: 600,
272
+ padding: "8px 24px",
273
+ boxShadow: "none",
274
+ "&:hover": {
275
+ boxShadow: "none"
276
+ }
277
+ },
278
+ sizeSmall: {
279
+ padding: "4px 12px",
280
+ fontSize: "12px"
281
+ },
282
+ sizeMedium: {
283
+ padding: "8px 24px",
284
+ fontSize: "14px"
285
+ },
286
+ sizeLarge: {
287
+ padding: "12px 24px",
288
+ fontSize: "16px"
289
+ }
290
+ }
291
+ },
292
+ MuiTextField: {
293
+ styleOverrides: {
294
+ root: {
295
+ "& .MuiOutlinedInput-root": {
296
+ borderRadius: 12
297
+ }
298
+ }
299
+ }
300
+ },
301
+ MuiSelect: {
302
+ styleOverrides: {
303
+ root: {
304
+ borderRadius: 12
305
+ }
306
+ }
307
+ },
308
+ MuiChip: {
309
+ styleOverrides: {
310
+ root: {
311
+ borderRadius: 16,
312
+ fontWeight: 500
313
+ }
314
+ }
315
+ },
316
+ MuiPaper: {
317
+ styleOverrides: {
318
+ root: {
319
+ boxShadow: "0px 4px 20px rgba(0, 0, 0, 0.05)",
320
+ border: "1px solid rgba(0, 0, 0, 0.05)"
321
+ }
322
+ }
323
+ },
324
+ MuiDrawer: {
325
+ styleOverrides: {
326
+ paper: {
327
+ borderRight: "1px solid rgba(0, 0, 0, 0.05)"
328
+ }
329
+ }
330
+ },
331
+ MuiAlert: {
332
+ styleOverrides: {
333
+ root: {
334
+ borderRadius: 8
335
+ },
336
+ filled: {
337
+ borderRadius: 8
338
+ }
339
+ }
340
+ }
341
+ }
342
+ });
343
+
344
+ // src/components/buttons/Button.tsx
345
+ var import_Button = __toESM(require("@mui/material/Button"));
346
+ var import_styles2 = require("@mui/material/styles");
347
+ var import_jsx_runtime = require("react/jsx-runtime");
348
+ var StyledPrimaryButton = (0, import_styles2.styled)(import_Button.default)(() => ({
349
+ backgroundColor: colors.primary.main,
350
+ color: colors.primary.contrastText,
351
+ "&:hover": {
352
+ backgroundColor: colors.primary.light
353
+ },
354
+ "&:active": {
355
+ backgroundColor: colors.primary.dark
356
+ },
357
+ "&:disabled": {
358
+ backgroundColor: colors.grey[300],
359
+ color: colors.grey[500]
360
+ }
361
+ }));
362
+ var StyledSecondaryButton = (0, import_styles2.styled)(import_Button.default)(() => ({
363
+ backgroundColor: "transparent",
364
+ color: colors.primary.main,
365
+ border: `1px solid ${colors.primary.main}`,
366
+ "&:hover": {
367
+ backgroundColor: colors.background.selected,
368
+ borderColor: colors.primary.light
369
+ },
370
+ "&:active": {
371
+ backgroundColor: colors.background.selected,
372
+ borderColor: colors.primary.dark
373
+ },
374
+ "&:disabled": {
375
+ borderColor: colors.grey[300],
376
+ color: colors.grey[500]
377
+ }
378
+ }));
379
+ var StyledTertiaryButton = (0, import_styles2.styled)(import_Button.default)(() => ({
380
+ backgroundColor: "transparent",
381
+ color: colors.tertiary.main,
382
+ "&:hover": {
383
+ backgroundColor: "rgba(245, 158, 11, 0.1)"
384
+ },
385
+ "&:active": {
386
+ backgroundColor: "rgba(245, 158, 11, 0.2)"
387
+ },
388
+ "&:disabled": {
389
+ color: colors.grey[500]
390
+ }
391
+ }));
392
+ var Button = ({
393
+ variant = "primary",
394
+ children,
395
+ startIcon,
396
+ endIcon,
397
+ ...props
398
+ }) => {
399
+ const buttonProps = {
400
+ ...props,
401
+ startIcon,
402
+ endIcon
403
+ };
404
+ switch (variant) {
405
+ case "primary":
406
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StyledPrimaryButton, { ...buttonProps, children });
407
+ case "secondary":
408
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StyledSecondaryButton, { ...buttonProps, children });
409
+ case "tertiary":
410
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StyledTertiaryButton, { ...buttonProps, children });
411
+ default:
412
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StyledPrimaryButton, { ...buttonProps, children });
413
+ }
414
+ };
415
+
416
+ // src/components/buttons/IconButton.tsx
417
+ var import_IconButton = __toESM(require("@mui/material/IconButton"));
418
+ var import_styles3 = require("@mui/material/styles");
419
+ var import_jsx_runtime2 = require("react/jsx-runtime");
420
+ var StyledIconButton = (0, import_styles3.styled)(import_IconButton.default, {
421
+ shouldForwardProp: (prop) => prop !== "buttonVariant"
422
+ })(({ buttonVariant = "default" }) => {
423
+ const variants = {
424
+ primary: {
425
+ color: colors.primary.main,
426
+ "&:hover": {
427
+ backgroundColor: colors.background.selected
428
+ }
429
+ },
430
+ secondary: {
431
+ color: colors.text.secondary,
432
+ "&:hover": {
433
+ backgroundColor: colors.grey[50]
434
+ }
435
+ },
436
+ default: {
437
+ color: colors.text.primary,
438
+ "&:hover": {
439
+ backgroundColor: colors.grey[50]
440
+ }
441
+ }
442
+ };
443
+ return variants[buttonVariant] || variants.default;
444
+ });
445
+ var IconButton = ({
446
+ variant = "default",
447
+ ...props
448
+ }) => {
449
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(StyledIconButton, { buttonVariant: variant, ...props });
450
+ };
451
+
452
+ // src/components/buttons/LoadingButton.tsx
453
+ var import_lab = require("@mui/lab");
454
+ var import_jsx_runtime3 = require("react/jsx-runtime");
455
+ var LoadingButton = ({
456
+ loading = false,
457
+ loadingPosition = "center",
458
+ ...props
459
+ }) => {
460
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
461
+ import_lab.LoadingButton,
462
+ {
463
+ loading,
464
+ loadingPosition,
465
+ ...props
466
+ }
467
+ );
468
+ };
469
+
470
+ // src/components/buttons/ButtonGroup.tsx
471
+ var import_material = require("@mui/material");
472
+ var import_jsx_runtime4 = require("react/jsx-runtime");
473
+ var ButtonGroup = ({
474
+ orientation = "horizontal",
475
+ size = "medium",
476
+ variant = "outlined",
477
+ ...props
478
+ }) => {
479
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
480
+ import_material.ButtonGroup,
481
+ {
482
+ orientation,
483
+ size,
484
+ variant,
485
+ ...props
486
+ }
487
+ );
488
+ };
489
+
490
+ // src/components/inputs/TextField.tsx
491
+ var import_TextField = __toESM(require("@mui/material/TextField"));
492
+ var import_styles4 = require("@mui/material/styles");
493
+ var import_jsx_runtime5 = require("react/jsx-runtime");
494
+ var StyledTextField = (0, import_styles4.styled)(import_TextField.default)(({ error }) => ({
495
+ "& .MuiOutlinedInput-root": {
496
+ "&:hover fieldset": {
497
+ borderColor: error ? colors.error.main : colors.primary.main
498
+ },
499
+ "&.Mui-focused fieldset": {
500
+ borderColor: error ? colors.error.main : colors.primary.main
501
+ },
502
+ "&.Mui-error fieldset": {
503
+ borderColor: colors.error.main
504
+ }
505
+ },
506
+ "& .MuiInputLabel-root": {
507
+ "&.Mui-focused": {
508
+ color: error ? colors.error.main : colors.primary.main
509
+ }
510
+ }
511
+ }));
512
+ var TextField = ({
513
+ size = "medium",
514
+ ...props
515
+ }) => {
516
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StyledTextField, { size: size === "medium" ? "medium" : "small", ...props });
517
+ };
518
+
519
+ // src/components/inputs/SearchField.tsx
520
+ var import_Search = __toESM(require("@mui/icons-material/Search"));
521
+ var import_InputAdornment = __toESM(require("@mui/material/InputAdornment"));
522
+ var import_jsx_runtime6 = require("react/jsx-runtime");
523
+ var SearchField = ({
524
+ placeholder = "Search...",
525
+ onSearch,
526
+ onChange,
527
+ ...props
528
+ }) => {
529
+ const handleChange = (e) => {
530
+ if (onChange) {
531
+ onChange(e);
532
+ }
533
+ if (onSearch) {
534
+ onSearch(e.target.value);
535
+ }
536
+ };
537
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
538
+ TextField,
539
+ {
540
+ placeholder,
541
+ onChange: handleChange,
542
+ InputProps: {
543
+ startAdornment: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_InputAdornment.default, { position: "start", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_Search.default, { style: { fontSize: 18, color: "#999" } }) })
544
+ },
545
+ ...props
546
+ }
547
+ );
548
+ };
549
+
550
+ // src/components/inputs/FormControl.tsx
551
+ var import_material2 = require("@mui/material");
552
+
553
+ // src/components/inputs/Dropdown.tsx
554
+ var import_material3 = require("@mui/material");
555
+ var import_styles5 = require("@mui/material/styles");
556
+ var import_jsx_runtime7 = require("react/jsx-runtime");
557
+ var StyledFormControl = (0, import_styles5.styled)(import_material3.FormControl)({
558
+ minWidth: 120
559
+ });
560
+ var StyledSelect = (0, import_styles5.styled)(import_material3.Select)(({ error }) => ({
561
+ "&:hover .MuiOutlinedInput-notchedOutline": {
562
+ borderColor: error ? colors.error.main : colors.primary.main
563
+ },
564
+ "&.Mui-focused .MuiOutlinedInput-notchedOutline": {
565
+ borderColor: error ? colors.error.main : colors.primary.main
566
+ }
567
+ }));
568
+ var Dropdown = ({
569
+ label,
570
+ options,
571
+ size = "medium",
572
+ placeholder,
573
+ value,
574
+ ...props
575
+ }) => {
576
+ const selectSize = size === "large" ? "medium" : size;
577
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(StyledFormControl, { size: selectSize, error: props.error, fullWidth: props.fullWidth, children: [
578
+ label && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_material3.InputLabel, { children: label }),
579
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
580
+ StyledSelect,
581
+ {
582
+ value: value || "",
583
+ label,
584
+ size: selectSize,
585
+ ...props,
586
+ children: [
587
+ placeholder && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_material3.MenuItem, { value: "", disabled: true, children: placeholder }),
588
+ options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_material3.MenuItem, { value: option.value, disabled: option.disabled, children: option.label }, option.value))
589
+ ]
590
+ }
591
+ )
592
+ ] });
593
+ };
594
+
595
+ // src/components/inputs/ToggleButton.tsx
596
+ var import_material4 = require("@mui/material");
597
+ var import_styles6 = require("@mui/material/styles");
598
+ var import_jsx_runtime8 = require("react/jsx-runtime");
599
+ var ToggleButton = (props) => {
600
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_material4.ToggleButton, { ...props });
601
+ };
602
+ var StyledToggleButtonGroup = (0, import_styles6.styled)(import_material4.ToggleButtonGroup)({
603
+ "& .MuiToggleButton-root": {
604
+ border: `1px solid ${colors.grey[300]}`,
605
+ "&.Mui-selected": {
606
+ backgroundColor: colors.primary.main,
607
+ color: colors.primary.contrastText,
608
+ "&:hover": {
609
+ backgroundColor: colors.primary.light
610
+ }
611
+ },
612
+ "&:hover": {
613
+ backgroundColor: colors.grey[50]
614
+ }
615
+ }
616
+ });
617
+ var ToggleButtonGroup = (props) => {
618
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StyledToggleButtonGroup, { ...props });
619
+ };
620
+
621
+ // src/components/inputs/Switch.tsx
622
+ var import_Switch = __toESM(require("@mui/material/Switch"));
623
+ var import_styles7 = require("@mui/material/styles");
624
+ var import_jsx_runtime9 = require("react/jsx-runtime");
625
+ var StyledSwitch = (0, import_styles7.styled)(import_Switch.default)(({ theme: theme2 }) => ({
626
+ width: 44,
627
+ height: 24,
628
+ padding: 0,
629
+ "& .MuiSwitch-switchBase": {
630
+ padding: 0,
631
+ margin: 2,
632
+ transitionDuration: "300ms",
633
+ "&.Mui-checked": {
634
+ transform: "translateX(20px)",
635
+ color: "#fff",
636
+ "& + .MuiSwitch-track": {
637
+ backgroundColor: colors.success.main,
638
+ opacity: 1,
639
+ border: 0
640
+ },
641
+ "&.Mui-disabled + .MuiSwitch-track": {
642
+ opacity: 0.5
643
+ }
644
+ },
645
+ "&.Mui-focusVisible .MuiSwitch-thumb": {
646
+ color: colors.success.main,
647
+ border: `6px solid #fff`
648
+ },
649
+ "&.Mui-disabled .MuiSwitch-thumb": {
650
+ color: colors.grey[300]
651
+ },
652
+ "&.Mui-disabled + .MuiSwitch-track": {
653
+ opacity: 0.5,
654
+ backgroundColor: colors.grey[300]
655
+ }
656
+ },
657
+ "& .MuiSwitch-thumb": {
658
+ boxSizing: "border-box",
659
+ width: 20,
660
+ height: 20
661
+ },
662
+ "& .MuiSwitch-track": {
663
+ borderRadius: 24 / 2,
664
+ backgroundColor: colors.grey[300],
665
+ opacity: 1,
666
+ transition: theme2.transitions.create(["background-color"], {
667
+ duration: 500
668
+ })
669
+ }
670
+ }));
671
+ var Switch = ({
672
+ label,
673
+ labelPosition = "right",
674
+ ...props
675
+ }) => {
676
+ const switchComponent = /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(StyledSwitch, { ...props });
677
+ if (!label) {
678
+ return switchComponent;
679
+ }
680
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
681
+ labelPosition === "left" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: label }),
682
+ switchComponent,
683
+ labelPosition === "right" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: label })
684
+ ] });
685
+ };
686
+
687
+ // src/components/inputs/Checkbox.tsx
688
+ var import_Checkbox = __toESM(require("@mui/material/Checkbox"));
689
+ var import_styles8 = require("@mui/material/styles");
690
+ var import_FormControlLabel = __toESM(require("@mui/material/FormControlLabel"));
691
+ var import_jsx_runtime10 = require("react/jsx-runtime");
692
+ var StyledCheckbox = (0, import_styles8.styled)(import_Checkbox.default)(() => ({
693
+ color: colors.grey[400],
694
+ "&.Mui-checked": {
695
+ color: colors.primary.main
696
+ },
697
+ "&.MuiCheckbox-indeterminate": {
698
+ color: colors.primary.main
699
+ },
700
+ "&.Mui-disabled": {
701
+ color: colors.grey[300]
702
+ },
703
+ "&:hover": {
704
+ backgroundColor: colors.background.selected
705
+ },
706
+ "&.Mui-focusVisible": {
707
+ outline: `2px solid ${colors.primary.main}`,
708
+ outlineOffset: 2
709
+ }
710
+ }));
711
+ var Checkbox = ({
712
+ label,
713
+ labelPosition = "right",
714
+ ...props
715
+ }) => {
716
+ const checkboxComponent = /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(StyledCheckbox, { ...props });
717
+ if (!label) {
718
+ return checkboxComponent;
719
+ }
720
+ const labelPlacementMap = {
721
+ left: "start",
722
+ right: "end"
723
+ };
724
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
725
+ import_FormControlLabel.default,
726
+ {
727
+ control: checkboxComponent,
728
+ label,
729
+ labelPlacement: labelPlacementMap[labelPosition] || "end"
730
+ }
731
+ );
732
+ };
733
+
734
+ // src/components/inputs/Radio.tsx
735
+ var import_Radio = __toESM(require("@mui/material/Radio"));
736
+ var import_styles9 = require("@mui/material/styles");
737
+ var import_FormControlLabel2 = __toESM(require("@mui/material/FormControlLabel"));
738
+ var import_RadioGroup = __toESM(require("@mui/material/RadioGroup"));
739
+ var import_jsx_runtime11 = require("react/jsx-runtime");
740
+ var StyledRadio = (0, import_styles9.styled)(import_Radio.default)(() => ({
741
+ color: colors.grey[400],
742
+ "&.Mui-checked": {
743
+ color: colors.primary.main
744
+ },
745
+ "&.Mui-disabled": {
746
+ color: colors.grey[300]
747
+ },
748
+ "&:hover": {
749
+ backgroundColor: colors.background.selected
750
+ },
751
+ "&.Mui-focusVisible": {
752
+ outline: `2px solid ${colors.primary.main}`,
753
+ outlineOffset: 2
754
+ }
755
+ }));
756
+ var Radio = ({
757
+ label,
758
+ labelPosition = "right",
759
+ ...props
760
+ }) => {
761
+ const radioComponent = /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(StyledRadio, { ...props });
762
+ if (!label) {
763
+ return radioComponent;
764
+ }
765
+ const labelPlacementMap = {
766
+ left: "start",
767
+ right: "end"
768
+ };
769
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
770
+ import_FormControlLabel2.default,
771
+ {
772
+ control: radioComponent,
773
+ label,
774
+ labelPlacement: labelPlacementMap[labelPosition] || "end"
775
+ }
776
+ );
777
+ };
778
+
779
+ // src/components/navigation/Sidebar.tsx
780
+ var import_material6 = require("@mui/material");
781
+
782
+ // src/components/navigation/SidebarItem.tsx
783
+ var import_material5 = require("@mui/material");
784
+ var import_jsx_runtime12 = require("react/jsx-runtime");
785
+ var StyledListItemButton = (0, import_material5.styled)(import_material5.ListItemButton, {
786
+ shouldForwardProp: (prop) => prop !== "selected" && prop !== "size"
787
+ })(({ selected, size = "medium" }) => {
788
+ const heightMap = {
789
+ small: "40px",
790
+ medium: "56px",
791
+ large: "64px"
792
+ };
793
+ return {
794
+ height: heightMap[size],
795
+ paddingLeft: "16px",
796
+ paddingRight: "16px",
797
+ borderRadius: "8px",
798
+ margin: "4px 8px",
799
+ color: selected ? colors.primary.main : colors.text.primary,
800
+ backgroundColor: selected ? colors.background.selected : "transparent",
801
+ "&:hover": {
802
+ backgroundColor: selected ? colors.background.selected : colors.grey[50]
803
+ },
804
+ "& .MuiListItemIcon-root": {
805
+ color: selected ? colors.primary.main : colors.text.secondary,
806
+ minWidth: "40px"
807
+ },
808
+ "& .MuiListItemText-primary": {
809
+ fontWeight: selected ? 600 : 400,
810
+ color: selected ? colors.primary.main : colors.text.primary
811
+ }
812
+ };
813
+ });
814
+ var SidebarItem = ({
815
+ label,
816
+ icon,
817
+ selected = false,
818
+ onClick,
819
+ size = "medium",
820
+ endIcon,
821
+ children
822
+ }) => {
823
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(StyledListItemButton, { selected, size, onClick, children: [
824
+ icon && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_material5.ListItemIcon, { children: icon }),
825
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_material5.ListItemText, { primary: label }),
826
+ endIcon && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { marginLeft: "auto" }, children: endIcon }),
827
+ children
828
+ ] });
829
+ };
830
+
831
+ // src/components/navigation/Sidebar.tsx
832
+ var import_jsx_runtime13 = require("react/jsx-runtime");
833
+ var StyledDrawer = (0, import_material6.styled)(import_material6.Drawer)(() => ({
834
+ "& .MuiDrawer-paper": {
835
+ backgroundColor: colors.background.paper,
836
+ borderRight: `1px solid ${colors.grey[200]}`,
837
+ boxShadow: "none"
838
+ }
839
+ }));
840
+ var Sidebar = ({
841
+ open = true,
842
+ width = 280,
843
+ items,
844
+ onClose,
845
+ variant = "permanent"
846
+ }) => {
847
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
848
+ StyledDrawer,
849
+ {
850
+ variant,
851
+ open,
852
+ onClose,
853
+ sx: {
854
+ width,
855
+ flexShrink: 0,
856
+ "& .MuiDrawer-paper": {
857
+ width,
858
+ boxSizing: "border-box"
859
+ }
860
+ },
861
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_material6.Box, { sx: { overflow: "auto", padding: "8px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_material6.List, { children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SidebarItem, { ...item }, index)) }) })
862
+ }
863
+ );
864
+ };
865
+
866
+ // src/components/navigation/ServiceSelector.tsx
867
+ var import_react = require("react");
868
+ var import_material7 = require("@mui/material");
869
+ var import_KeyboardArrowDown = __toESM(require("@mui/icons-material/KeyboardArrowDown"));
870
+ var import_Archive = __toESM(require("@mui/icons-material/Archive"));
871
+ var import_Unarchive = __toESM(require("@mui/icons-material/Unarchive"));
872
+ var import_Search2 = __toESM(require("@mui/icons-material/Search"));
873
+ var import_Add = __toESM(require("@mui/icons-material/Add"));
874
+ var import_Check = __toESM(require("@mui/icons-material/Check"));
875
+ var import_jsx_runtime14 = require("react/jsx-runtime");
876
+ var ServiceSelectorButton = ({
877
+ services,
878
+ selectedServiceId,
879
+ loading = false,
880
+ compact = false,
881
+ onSelectService,
882
+ onServiceClick,
883
+ onCreateService,
884
+ onServiceCreated,
885
+ isManager = false,
886
+ sx = {},
887
+ panelWidth = 350
888
+ }) => {
889
+ const [anchorEl, setAnchorEl] = (0, import_react.useState)(null);
890
+ const [searchTerm, setSearchTerm] = (0, import_react.useState)("");
891
+ const [showArchived, setShowArchived] = (0, import_react.useState)(false);
892
+ const handleOpenSelector = (event) => {
893
+ event.stopPropagation();
894
+ setAnchorEl(event.currentTarget);
895
+ };
896
+ const handleClose = () => {
897
+ setAnchorEl(null);
898
+ setSearchTerm("");
899
+ setShowArchived(false);
900
+ };
901
+ const handleServiceClick = (e) => {
902
+ e.stopPropagation();
903
+ if (selectedServiceId && onServiceClick) {
904
+ onServiceClick(selectedServiceId);
905
+ }
906
+ };
907
+ const handleSelectService = (0, import_react.useCallback)(
908
+ (serviceId) => {
909
+ handleClose();
910
+ if (onSelectService) {
911
+ onSelectService(serviceId);
912
+ }
913
+ },
914
+ [onSelectService]
915
+ );
916
+ const handleCreateClick = () => {
917
+ handleClose();
918
+ if (onCreateService) {
919
+ onCreateService();
920
+ }
921
+ };
922
+ const selectedService = Array.isArray(services) ? services.find((s) => s.id === selectedServiceId) : null;
923
+ const filteredServices = services.filter((service) => {
924
+ const matchesSearch = searchTerm === "" || service.name.toLowerCase().includes(searchTerm.toLowerCase());
925
+ const isArchived = service.archived === true;
926
+ const matchesArchivedFilter = showArchived ? isArchived : !isArchived;
927
+ return matchesSearch && matchesArchivedFilter;
928
+ });
929
+ if (compact) {
930
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
931
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.Box, { sx: { position: "relative" }, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.Tooltip, { title: "Select service", placement: "right", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
932
+ import_material7.IconButton,
933
+ {
934
+ onClick: handleOpenSelector,
935
+ sx: {
936
+ p: 1,
937
+ "&:hover": {
938
+ bgcolor: "rgba(0, 0, 0, 0.04)"
939
+ },
940
+ ...sx
941
+ },
942
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
943
+ import_material7.Avatar,
944
+ {
945
+ sx: {
946
+ width: 32,
947
+ height: 32,
948
+ bgcolor: selectedServiceId ? "primary.main" : "grey.400",
949
+ fontSize: "0.9rem"
950
+ },
951
+ children: selectedService ? selectedService.name.charAt(0) : "D"
952
+ }
953
+ )
954
+ }
955
+ ) }) }),
956
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
957
+ ServiceSelectorPanel,
958
+ {
959
+ open: Boolean(anchorEl),
960
+ anchorEl,
961
+ onClose: handleClose,
962
+ services,
963
+ selectedServiceId,
964
+ onSelectService: handleSelectService,
965
+ onCreateService: handleCreateClick,
966
+ onServiceCreated,
967
+ loading,
968
+ width: panelWidth,
969
+ isManager,
970
+ selectedService,
971
+ searchTerm,
972
+ onSearchChange: setSearchTerm,
973
+ showArchived,
974
+ onToggleArchived: () => setShowArchived(!showArchived),
975
+ filteredServices
976
+ }
977
+ )
978
+ ] });
979
+ }
980
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
981
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_material7.Box, { sx: { display: "flex", alignItems: "center", ...sx }, children: [
982
+ selectedService ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
983
+ isManager ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
984
+ import_material7.Link,
985
+ {
986
+ underline: "hover",
987
+ color: "inherit",
988
+ onClick: handleServiceClick,
989
+ sx: {
990
+ display: "flex",
991
+ alignItems: "center",
992
+ fontSize: "0.875rem",
993
+ cursor: "pointer",
994
+ mr: 0.5
995
+ },
996
+ children: [
997
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
998
+ import_material7.Avatar,
999
+ {
1000
+ sx: {
1001
+ width: 20,
1002
+ height: 20,
1003
+ bgcolor: "primary.main",
1004
+ fontSize: "0.7rem",
1005
+ mr: 0.5
1006
+ },
1007
+ children: selectedService.name.charAt(0)
1008
+ }
1009
+ ),
1010
+ selectedService.name
1011
+ ]
1012
+ }
1013
+ ) : /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1014
+ import_material7.Box,
1015
+ {
1016
+ sx: {
1017
+ display: "flex",
1018
+ alignItems: "center",
1019
+ fontSize: "0.875rem",
1020
+ mr: 0.5,
1021
+ color: "text.primary"
1022
+ },
1023
+ children: [
1024
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1025
+ import_material7.Avatar,
1026
+ {
1027
+ sx: {
1028
+ width: 20,
1029
+ height: 20,
1030
+ bgcolor: "primary.main",
1031
+ fontSize: "0.7rem",
1032
+ mr: 0.5
1033
+ },
1034
+ children: selectedService.name.charAt(0)
1035
+ }
1036
+ ),
1037
+ selectedService.name
1038
+ ]
1039
+ }
1040
+ ),
1041
+ selectedService.archived && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1042
+ import_material7.Chip,
1043
+ {
1044
+ size: "small",
1045
+ label: "Archived",
1046
+ color: "error",
1047
+ variant: "outlined",
1048
+ sx: {
1049
+ ml: 0.5,
1050
+ height: 20,
1051
+ fontSize: "0.8rem",
1052
+ "& .MuiChip-label": { px: 1 },
1053
+ "& .MuiChip-icon": { fontSize: "0.7rem", ml: 0.5 }
1054
+ }
1055
+ }
1056
+ )
1057
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1058
+ import_material7.Typography,
1059
+ {
1060
+ variant: "body2",
1061
+ color: "text.secondary",
1062
+ sx: {
1063
+ fontSize: "0.875rem"
1064
+ },
1065
+ children: "Select Service"
1066
+ }
1067
+ ),
1068
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1069
+ import_material7.IconButton,
1070
+ {
1071
+ onClick: handleOpenSelector,
1072
+ size: "small",
1073
+ sx: {
1074
+ p: 0.2,
1075
+ ml: 0.5,
1076
+ color: "text.secondary"
1077
+ },
1078
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_KeyboardArrowDown.default, { fontSize: "small" })
1079
+ }
1080
+ )
1081
+ ] }),
1082
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1083
+ ServiceSelectorPanel,
1084
+ {
1085
+ open: Boolean(anchorEl),
1086
+ anchorEl,
1087
+ onClose: handleClose,
1088
+ services,
1089
+ selectedServiceId,
1090
+ onSelectService: handleSelectService,
1091
+ onCreateService: handleCreateClick,
1092
+ onServiceCreated,
1093
+ loading,
1094
+ width: panelWidth,
1095
+ isManager,
1096
+ selectedService,
1097
+ searchTerm,
1098
+ onSearchChange: setSearchTerm,
1099
+ showArchived,
1100
+ onToggleArchived: () => setShowArchived(!showArchived),
1101
+ filteredServices
1102
+ }
1103
+ )
1104
+ ] });
1105
+ };
1106
+ var ServiceSelectorPanel = ({
1107
+ open,
1108
+ anchorEl,
1109
+ onClose,
1110
+ services,
1111
+ selectedServiceId,
1112
+ onSelectService,
1113
+ onCreateService,
1114
+ onServiceCreated,
1115
+ loading = false,
1116
+ width = 350,
1117
+ isManager = false,
1118
+ selectedService,
1119
+ searchTerm: externalSearchTerm,
1120
+ onSearchChange: externalOnSearchChange,
1121
+ showArchived: externalShowArchived,
1122
+ onToggleArchived: externalOnToggleArchived,
1123
+ filteredServices: externalFilteredServices
1124
+ }) => {
1125
+ const [internalSearchTerm, setInternalSearchTerm] = (0, import_react.useState)("");
1126
+ const [internalShowArchived, setInternalShowArchived] = (0, import_react.useState)(false);
1127
+ const searchTerm = externalSearchTerm !== void 0 ? externalSearchTerm : internalSearchTerm;
1128
+ const setSearchTerm = externalOnSearchChange || setInternalSearchTerm;
1129
+ const showArchived = externalShowArchived !== void 0 ? externalShowArchived : internalShowArchived;
1130
+ const toggleArchived = externalOnToggleArchived || (() => setInternalShowArchived(!internalShowArchived));
1131
+ const filteredServices = externalFilteredServices || services.filter((service) => {
1132
+ const matchesSearch = searchTerm === "" || service.name.toLowerCase().includes(searchTerm.toLowerCase());
1133
+ const isArchived = service.archived === true;
1134
+ const matchesArchivedFilter = showArchived ? isArchived : !isArchived;
1135
+ return matchesSearch && matchesArchivedFilter;
1136
+ });
1137
+ const handleCreateClick = () => {
1138
+ if (onCreateService) {
1139
+ onCreateService();
1140
+ } else {
1141
+ onClose();
1142
+ if (onServiceCreated) {
1143
+ onServiceCreated();
1144
+ }
1145
+ }
1146
+ };
1147
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1148
+ import_material7.Menu,
1149
+ {
1150
+ anchorEl,
1151
+ open,
1152
+ onClose,
1153
+ anchorOrigin: {
1154
+ vertical: "bottom",
1155
+ horizontal: "left"
1156
+ },
1157
+ transformOrigin: {
1158
+ vertical: "top",
1159
+ horizontal: "left"
1160
+ },
1161
+ PaperProps: {
1162
+ sx: {
1163
+ width,
1164
+ maxHeight: "80vh",
1165
+ borderRadius: 1,
1166
+ boxShadow: "0 2px 10px rgba(0, 0, 0, 0.12)",
1167
+ overflow: "hidden",
1168
+ mt: 1
1169
+ }
1170
+ },
1171
+ children: [
1172
+ selectedService && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1173
+ import_material7.Box,
1174
+ {
1175
+ sx: {
1176
+ paddingLeft: 2,
1177
+ paddingRight: 2,
1178
+ paddingTop: 0.5,
1179
+ borderBottom: 1,
1180
+ borderColor: "divider"
1181
+ },
1182
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1183
+ import_material7.Box,
1184
+ {
1185
+ sx: {
1186
+ display: "flex",
1187
+ alignItems: "center",
1188
+ justifyContent: "space-between",
1189
+ mb: 1.5
1190
+ },
1191
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_material7.Box, { sx: { display: "flex", alignItems: "center" }, children: [
1192
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1193
+ import_material7.Avatar,
1194
+ {
1195
+ sx: {
1196
+ width: 32,
1197
+ height: 32,
1198
+ bgcolor: "primary.main",
1199
+ fontSize: "0.9rem",
1200
+ mr: 1.5
1201
+ },
1202
+ children: selectedService.name.charAt(0)
1203
+ }
1204
+ ),
1205
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.Box, { children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_material7.Box, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
1206
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.Typography, { variant: "subtitle1", sx: { fontWeight: 600, fontSize: "1rem" }, children: selectedService.name }),
1207
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1208
+ import_material7.Box,
1209
+ {
1210
+ sx: {
1211
+ display: "inline-block",
1212
+ bgcolor: "rgba(0, 0, 0, 0.04)",
1213
+ color: "text.secondary",
1214
+ px: 1,
1215
+ py: 0.3,
1216
+ borderRadius: "12px",
1217
+ fontSize: "0.7rem",
1218
+ fontWeight: 500,
1219
+ lineHeight: 1
1220
+ },
1221
+ children: isManager ? "Manager" : "Viewer"
1222
+ }
1223
+ )
1224
+ ] }) })
1225
+ ] })
1226
+ }
1227
+ )
1228
+ }
1229
+ ),
1230
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_material7.Box, { sx: { px: 2, pt: 2, pb: 1.5 }, children: [
1231
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_material7.Box, { sx: { display: "flex", alignItems: "center", mb: 1.5 }, children: [
1232
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1233
+ import_material7.TextField,
1234
+ {
1235
+ size: "small",
1236
+ placeholder: "Search services...",
1237
+ value: searchTerm,
1238
+ onChange: (e) => setSearchTerm(e.target.value),
1239
+ sx: { flex: 1 },
1240
+ InputProps: {
1241
+ startAdornment: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.InputAdornment, { position: "start", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_Search2.default, { fontSize: "small", color: "action" }) }),
1242
+ sx: {
1243
+ borderRadius: 1.5,
1244
+ backgroundColor: "rgba(0, 0, 0, 0.04)",
1245
+ "& fieldset": { border: "none" },
1246
+ py: 0.5
1247
+ }
1248
+ }
1249
+ }
1250
+ ),
1251
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.Tooltip, { title: showArchived ? "Show active" : "Show archived", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1252
+ import_material7.IconButton,
1253
+ {
1254
+ size: "small",
1255
+ onClick: toggleArchived,
1256
+ color: showArchived ? "primary" : "default",
1257
+ sx: { ml: 1 },
1258
+ children: showArchived ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_Unarchive.default, { fontSize: "small" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_Archive.default, { fontSize: "small" })
1259
+ }
1260
+ ) })
1261
+ ] }),
1262
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1263
+ import_material7.Box,
1264
+ {
1265
+ sx: {
1266
+ maxHeight: 400,
1267
+ overflow: "auto",
1268
+ py: 1
1269
+ },
1270
+ children: loading ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.Box, { sx: { p: 2, textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.Typography, { variant: "body2", color: "text.secondary", children: "Loading services..." }) }) : filteredServices.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.Box, { sx: { p: 2, textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.Typography, { variant: "body2", color: "text.secondary", children: searchTerm ? `No ${showArchived ? "archived " : ""}services matching "${searchTerm}"` : showArchived ? "No archived services found" : "No active services found" }) }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
1271
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1272
+ import_material7.Typography,
1273
+ {
1274
+ variant: "caption",
1275
+ sx: {
1276
+ display: "block",
1277
+ px: 2.5,
1278
+ py: 0.5,
1279
+ color: "text.secondary",
1280
+ fontWeight: 600,
1281
+ textTransform: "uppercase",
1282
+ fontSize: "0.65rem",
1283
+ letterSpacing: 0.5
1284
+ },
1285
+ children: [
1286
+ "Services",
1287
+ showArchived && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1288
+ import_material7.Chip,
1289
+ {
1290
+ size: "small",
1291
+ label: "Archived",
1292
+ color: "error",
1293
+ variant: "outlined",
1294
+ sx: {
1295
+ ml: 1,
1296
+ height: 20,
1297
+ fontSize: "0.6rem",
1298
+ "& .MuiChip-label": { px: 0.5 },
1299
+ "& .MuiChip-icon": { fontSize: "0.7rem", ml: 0.5 }
1300
+ }
1301
+ }
1302
+ )
1303
+ ]
1304
+ }
1305
+ ),
1306
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.List, { disablePadding: true, children: filteredServices.map((service) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1307
+ import_material7.ListItem,
1308
+ {
1309
+ sx: {
1310
+ py: 0.75,
1311
+ px: 2,
1312
+ cursor: "pointer",
1313
+ "&:hover": {
1314
+ backgroundColor: "rgba(0, 0, 0, 0.04)"
1315
+ },
1316
+ backgroundColor: service.id === selectedServiceId ? "rgba(25, 118, 210, 0.08)" : "transparent",
1317
+ position: "relative"
1318
+ },
1319
+ onClick: () => onSelectService(service.id),
1320
+ secondaryAction: service.id === selectedServiceId ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1321
+ import_Check.default,
1322
+ {
1323
+ sx: {
1324
+ color: "primary.main",
1325
+ fontSize: "1.2rem"
1326
+ }
1327
+ }
1328
+ ) : null,
1329
+ children: [
1330
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.ListItemAvatar, { sx: { minWidth: 40 }, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1331
+ import_material7.Avatar,
1332
+ {
1333
+ sx: {
1334
+ width: 26,
1335
+ height: 26,
1336
+ bgcolor: service.id === selectedServiceId ? "primary.main" : "grey.400",
1337
+ fontSize: "0.8rem"
1338
+ },
1339
+ src: service.avatar,
1340
+ children: service.name.charAt(0)
1341
+ }
1342
+ ) }),
1343
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1344
+ import_material7.ListItemText,
1345
+ {
1346
+ primary: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material7.Box, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1347
+ import_material7.Typography,
1348
+ {
1349
+ variant: "body2",
1350
+ sx: {
1351
+ fontWeight: service.id === selectedServiceId ? 600 : 400,
1352
+ color: service.id === selectedServiceId ? "primary.main" : "text.primary"
1353
+ },
1354
+ children: service.name
1355
+ }
1356
+ ) }),
1357
+ primaryTypographyProps: { sx: { fontWeight: 500 } },
1358
+ sx: { my: 0 }
1359
+ }
1360
+ )
1361
+ ]
1362
+ },
1363
+ service.id
1364
+ )) })
1365
+ ] })
1366
+ }
1367
+ ),
1368
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1369
+ import_material7.Box,
1370
+ {
1371
+ sx: {
1372
+ paddingTop: 2,
1373
+ paddingLeft: 2,
1374
+ paddingRight: 2,
1375
+ borderTop: 1,
1376
+ borderColor: "divider"
1377
+ },
1378
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1379
+ import_material7.Button,
1380
+ {
1381
+ fullWidth: true,
1382
+ variant: "text",
1383
+ startIcon: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_Add.default, {}),
1384
+ onClick: handleCreateClick,
1385
+ sx: {
1386
+ textTransform: "none",
1387
+ fontWeight: 500,
1388
+ justifyContent: "flex-start",
1389
+ color: "primary.main",
1390
+ py: 1,
1391
+ px: 1.5,
1392
+ "&:hover": {
1393
+ backgroundColor: "rgba(25, 118, 210, 0.08)"
1394
+ }
1395
+ },
1396
+ children: "New Service"
1397
+ }
1398
+ )
1399
+ }
1400
+ )
1401
+ ] })
1402
+ ]
1403
+ }
1404
+ );
1405
+ };
1406
+
1407
+ // src/components/navigation/WorkspaceSelector.tsx
1408
+ var import_react2 = __toESM(require("react"));
1409
+ var import_material8 = require("@mui/material");
1410
+ var import_KeyboardArrowDown2 = __toESM(require("@mui/icons-material/KeyboardArrowDown"));
1411
+ var import_Search3 = __toESM(require("@mui/icons-material/Search"));
1412
+ var import_Add2 = __toESM(require("@mui/icons-material/Add"));
1413
+ var import_Check2 = __toESM(require("@mui/icons-material/Check"));
1414
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1415
+ var WorkspaceSelectorButton = ({
1416
+ workspaces,
1417
+ selectedWorkspaceId,
1418
+ loading = false,
1419
+ onSelectWorkspace,
1420
+ onWorkspaceClick,
1421
+ onCreateWorkspace,
1422
+ sx = {},
1423
+ panelWidth = 350
1424
+ }) => {
1425
+ const [anchorEl, setAnchorEl] = (0, import_react2.useState)(null);
1426
+ const handleOpenSelector = (event) => {
1427
+ event.stopPropagation();
1428
+ setAnchorEl(event.currentTarget);
1429
+ };
1430
+ const handleClose = () => {
1431
+ setAnchorEl(null);
1432
+ };
1433
+ const handleSelectWorkspace = (0, import_react2.useCallback)(
1434
+ (workspaceId) => {
1435
+ handleClose();
1436
+ if (onSelectWorkspace) {
1437
+ onSelectWorkspace(workspaceId);
1438
+ }
1439
+ },
1440
+ [onSelectWorkspace]
1441
+ );
1442
+ const selectedWorkspace = Array.isArray(workspaces) ? workspaces.find((w) => w.id === selectedWorkspaceId) : null;
1443
+ if (!workspaces || workspaces.length === 0) {
1444
+ return null;
1445
+ }
1446
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
1447
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_material8.Box, { sx: { display: "flex", alignItems: "center", ...sx }, children: [
1448
+ selectedWorkspace ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
1449
+ import_material8.Link,
1450
+ {
1451
+ underline: "hover",
1452
+ color: "inherit",
1453
+ onClick: (e) => {
1454
+ e.stopPropagation();
1455
+ if (onWorkspaceClick) {
1456
+ onWorkspaceClick(selectedWorkspace.id);
1457
+ }
1458
+ },
1459
+ sx: {
1460
+ display: "flex",
1461
+ alignItems: "center",
1462
+ fontSize: "0.875rem",
1463
+ cursor: "pointer",
1464
+ mr: 0.5
1465
+ },
1466
+ children: [
1467
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1468
+ import_material8.Avatar,
1469
+ {
1470
+ sx: {
1471
+ width: 20,
1472
+ height: 20,
1473
+ bgcolor: "secondary.main",
1474
+ fontSize: "0.7rem",
1475
+ mr: 0.5
1476
+ },
1477
+ children: selectedWorkspace.name.charAt(0)
1478
+ }
1479
+ ),
1480
+ selectedWorkspace.name
1481
+ ]
1482
+ }
1483
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1484
+ import_material8.Typography,
1485
+ {
1486
+ variant: "body2",
1487
+ color: "text.secondary",
1488
+ sx: {
1489
+ fontSize: "0.875rem"
1490
+ },
1491
+ children: "Select Workspace"
1492
+ }
1493
+ ),
1494
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1495
+ import_material8.IconButton,
1496
+ {
1497
+ onClick: handleOpenSelector,
1498
+ size: "small",
1499
+ sx: {
1500
+ p: 0.2,
1501
+ ml: 0.5,
1502
+ color: "text.secondary"
1503
+ },
1504
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_KeyboardArrowDown2.default, { fontSize: "small" })
1505
+ }
1506
+ )
1507
+ ] }),
1508
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1509
+ WorkspaceSelectorPanel,
1510
+ {
1511
+ open: Boolean(anchorEl),
1512
+ anchorEl,
1513
+ onClose: handleClose,
1514
+ workspaces,
1515
+ selectedWorkspaceId,
1516
+ onSelectWorkspace: handleSelectWorkspace,
1517
+ onCreateWorkspace,
1518
+ loading,
1519
+ width: panelWidth
1520
+ }
1521
+ )
1522
+ ] });
1523
+ };
1524
+ var WorkspaceSelectorPanel = ({
1525
+ open,
1526
+ anchorEl,
1527
+ onClose,
1528
+ workspaces,
1529
+ selectedWorkspaceId,
1530
+ onSelectWorkspace,
1531
+ onCreateWorkspace,
1532
+ loading = false,
1533
+ width = 350
1534
+ }) => {
1535
+ const [searchTerm, setSearchTerm] = (0, import_react2.useState)("");
1536
+ import_react2.default.useEffect(() => {
1537
+ if (open) {
1538
+ setSearchTerm("");
1539
+ }
1540
+ }, [open]);
1541
+ const filteredWorkspaces = workspaces.filter(
1542
+ (w) => w.name.toLowerCase().includes(searchTerm.toLowerCase())
1543
+ );
1544
+ const handleCreateClick = () => {
1545
+ onClose();
1546
+ if (onCreateWorkspace) {
1547
+ onCreateWorkspace();
1548
+ }
1549
+ };
1550
+ const handleSelect = (workspaceId) => {
1551
+ onSelectWorkspace(workspaceId);
1552
+ onClose();
1553
+ };
1554
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1555
+ import_material8.Menu,
1556
+ {
1557
+ open,
1558
+ anchorEl,
1559
+ onClose,
1560
+ anchorOrigin: { vertical: "bottom", horizontal: "left" },
1561
+ transformOrigin: { vertical: "top", horizontal: "left" },
1562
+ PaperProps: {
1563
+ sx: {
1564
+ width,
1565
+ maxHeight: 600,
1566
+ mt: 1,
1567
+ borderRadius: 2
1568
+ }
1569
+ },
1570
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_material8.Box, { children: [
1571
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_material8.Box, { sx: { px: 2, pt: 2, pb: 1.5 }, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1572
+ import_material8.TextField,
1573
+ {
1574
+ fullWidth: true,
1575
+ size: "small",
1576
+ placeholder: "Search workspaces...",
1577
+ value: searchTerm,
1578
+ onChange: (e) => setSearchTerm(e.target.value),
1579
+ InputProps: {
1580
+ startAdornment: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_material8.InputAdornment, { position: "start", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_Search3.default, { fontSize: "small" }) })
1581
+ }
1582
+ }
1583
+ ) }),
1584
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_material8.Box, { sx: { maxHeight: 400, overflowY: "auto" }, children: loading ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_material8.Box, { sx: { p: 2, textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_material8.Typography, { variant: "body2", color: "text.secondary", children: "Loading..." }) }) : filteredWorkspaces.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_material8.Box, { sx: { p: 2, textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_material8.Typography, { variant: "body2", color: "text.secondary", children: "No workspaces found" }) }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_material8.List, { dense: true, children: filteredWorkspaces.map((workspace) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
1585
+ import_material8.ListItem,
1586
+ {
1587
+ onClick: () => handleSelect(workspace.id),
1588
+ sx: {
1589
+ py: 0.5,
1590
+ cursor: "pointer",
1591
+ bgcolor: workspace.id === selectedWorkspaceId ? "action.selected" : "transparent",
1592
+ "&:hover": {
1593
+ bgcolor: "action.hover"
1594
+ }
1595
+ },
1596
+ children: [
1597
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_material8.ListItemAvatar, { children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1598
+ import_material8.Avatar,
1599
+ {
1600
+ sx: { width: 32, height: 32, bgcolor: "secondary.main" },
1601
+ children: workspace.name.charAt(0)
1602
+ }
1603
+ ) }),
1604
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1605
+ import_material8.ListItemText,
1606
+ {
1607
+ primary: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_material8.Box, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
1608
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_material8.Typography, { variant: "body2", fontWeight: 500, children: workspace.name }),
1609
+ workspace.id === selectedWorkspaceId && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_Check2.default, { fontSize: "small", color: "primary" })
1610
+ ] }),
1611
+ secondary: workspace.description
1612
+ }
1613
+ )
1614
+ ]
1615
+ },
1616
+ workspace.id
1617
+ )) }) }),
1618
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1619
+ import_material8.Box,
1620
+ {
1621
+ sx: {
1622
+ paddingTop: 2,
1623
+ paddingLeft: 2,
1624
+ paddingRight: 2,
1625
+ borderTop: 1,
1626
+ borderColor: "divider"
1627
+ },
1628
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1629
+ import_material8.Button,
1630
+ {
1631
+ fullWidth: true,
1632
+ variant: "text",
1633
+ startIcon: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_Add2.default, {}),
1634
+ onClick: handleCreateClick,
1635
+ sx: {
1636
+ textTransform: "none",
1637
+ fontWeight: 500,
1638
+ justifyContent: "flex-start",
1639
+ color: "primary.main",
1640
+ py: 1,
1641
+ px: 1.5,
1642
+ "&:hover": {
1643
+ backgroundColor: "rgba(25, 118, 210, 0.08)"
1644
+ }
1645
+ },
1646
+ children: "New Workspace"
1647
+ }
1648
+ )
1649
+ }
1650
+ )
1651
+ ] })
1652
+ }
1653
+ );
1654
+ };
1655
+
1656
+ // src/components/navigation/Stepper.tsx
1657
+ var import_material9 = require("@mui/material");
1658
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1659
+ var Stepper = (props) => {
1660
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_material9.Stepper, { ...props });
1661
+ };
1662
+ var Step = (props) => {
1663
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_material9.Step, { ...props });
1664
+ };
1665
+ var StepLabel = (props) => {
1666
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_material9.StepLabel, { ...props });
1667
+ };
1668
+ var StepContent = (props) => {
1669
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_material9.StepContent, { ...props });
1670
+ };
1671
+ var StepButton = (props) => {
1672
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_material9.StepButton, { ...props });
1673
+ };
1674
+
1675
+ // src/components/feedback/Badge.tsx
1676
+ var import_Badge = __toESM(require("@mui/material/Badge"));
1677
+ var import_styles10 = require("@mui/material/styles");
1678
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1679
+ var getBadgeColor = (variant) => {
1680
+ switch (variant) {
1681
+ case "primary":
1682
+ return colors.primary.main;
1683
+ case "success":
1684
+ return colors.success.main;
1685
+ case "error":
1686
+ return colors.error.main;
1687
+ default:
1688
+ return colors.grey[400];
1689
+ }
1690
+ };
1691
+ var StyledBadge = (0, import_styles10.styled)(import_Badge.default, {
1692
+ shouldForwardProp: (prop) => prop !== "badgeVariant"
1693
+ })(({ badgeVariant = "default" }) => ({
1694
+ "& .MuiBadge-badge": {
1695
+ backgroundColor: getBadgeColor(badgeVariant),
1696
+ color: "#FFFFFF"
1697
+ }
1698
+ }));
1699
+ var Badge = ({
1700
+ variant = "default",
1701
+ children,
1702
+ badgeContent,
1703
+ ...props
1704
+ }) => {
1705
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(StyledBadge, { badgeVariant: variant, badgeContent, ...props, children });
1706
+ };
1707
+
1708
+ // src/components/feedback/Chip.tsx
1709
+ var import_Chip = __toESM(require("@mui/material/Chip"));
1710
+ var import_styles11 = require("@mui/material/styles");
1711
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1712
+ var StyledDefaultChip = (0, import_styles11.styled)(import_Chip.default)({
1713
+ backgroundColor: colors.grey[100],
1714
+ color: colors.text.primary,
1715
+ "&:hover": {
1716
+ backgroundColor: colors.grey[200]
1717
+ }
1718
+ });
1719
+ var StyledActiveChip = (0, import_styles11.styled)(import_Chip.default)({
1720
+ backgroundColor: colors.background.selected,
1721
+ color: colors.primary.main,
1722
+ "&:hover": {
1723
+ backgroundColor: colors.background.selected
1724
+ }
1725
+ });
1726
+ var Chip2 = ({
1727
+ variant = "default",
1728
+ ...props
1729
+ }) => {
1730
+ if (variant === "active") {
1731
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(StyledActiveChip, { ...props });
1732
+ }
1733
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(StyledDefaultChip, { ...props });
1734
+ };
1735
+
1736
+ // src/components/feedback/Tooltip.tsx
1737
+ var import_Tooltip = __toESM(require("@mui/material/Tooltip"));
1738
+ var import_styles12 = require("@mui/material/styles");
1739
+ var import_jsx_runtime19 = require("react/jsx-runtime");
1740
+ var StyledTooltip = (0, import_styles12.styled)(import_Tooltip.default)({
1741
+ "& .MuiTooltip-tooltip": {
1742
+ backgroundColor: colors.grey[800],
1743
+ color: "#FFFFFF",
1744
+ fontSize: "12px",
1745
+ padding: "8px 12px",
1746
+ borderRadius: "4px"
1747
+ },
1748
+ "& .MuiTooltip-arrow": {
1749
+ color: colors.grey[800]
1750
+ }
1751
+ });
1752
+ var Tooltip2 = (props) => {
1753
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(StyledTooltip, { ...props });
1754
+ };
1755
+
1756
+ // src/components/feedback/Progress.tsx
1757
+ var import_material10 = require("@mui/material");
1758
+ var import_jsx_runtime20 = require("react/jsx-runtime");
1759
+ var StyledLinearProgress = (0, import_material10.styled)(import_material10.LinearProgress)({
1760
+ height: 4,
1761
+ borderRadius: 2,
1762
+ backgroundColor: colors.grey[200],
1763
+ "& .MuiLinearProgress-bar": {
1764
+ backgroundColor: colors.primary.main,
1765
+ borderRadius: 2
1766
+ }
1767
+ });
1768
+ var StyledCircularProgress = (0, import_material10.styled)(import_material10.CircularProgress)({
1769
+ color: colors.primary.main
1770
+ });
1771
+ var Progress = ({
1772
+ variant = "linear",
1773
+ value,
1774
+ size = 40,
1775
+ thickness = 4
1776
+ }) => {
1777
+ if (variant === "circular") {
1778
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(StyledCircularProgress, { size, thickness });
1779
+ }
1780
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1781
+ StyledLinearProgress,
1782
+ {
1783
+ variant: value !== void 0 ? "determinate" : "indeterminate",
1784
+ value
1785
+ }
1786
+ );
1787
+ };
1788
+
1789
+ // src/components/navigation/Tab.tsx
1790
+ var import_Tab = __toESM(require("@mui/material/Tab"));
1791
+ var import_styles13 = require("@mui/material/styles");
1792
+ var import_jsx_runtime21 = require("react/jsx-runtime");
1793
+ var StyledTab = (0, import_styles13.styled)(import_Tab.default)({
1794
+ textTransform: "none",
1795
+ minHeight: "48px",
1796
+ fontWeight: 400,
1797
+ color: colors.text.primary,
1798
+ borderBottom: "2px solid transparent",
1799
+ "&:hover": {
1800
+ color: colors.primary.main
1801
+ },
1802
+ "&.Mui-selected": {
1803
+ fontWeight: 600,
1804
+ color: colors.primary.main,
1805
+ borderBottom: `2px solid ${colors.primary.main}`
1806
+ }
1807
+ });
1808
+ var Tab = ({
1809
+ badge,
1810
+ badgeVariant = "primary",
1811
+ label,
1812
+ ...props
1813
+ }) => {
1814
+ const tabLabel = badge !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Badge, { variant: badgeVariant, badgeContent: badge, children: label }) : label;
1815
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(StyledTab, { label: tabLabel, ...props });
1816
+ };
1817
+
1818
+ // src/components/navigation/Menu.tsx
1819
+ var import_material11 = require("@mui/material");
1820
+ var import_styles14 = require("@mui/material/styles");
1821
+ var import_jsx_runtime22 = require("react/jsx-runtime");
1822
+ var StyledMenu = (0, import_styles14.styled)(import_material11.Menu)({
1823
+ "& .MuiPaper-root": {
1824
+ borderRadius: 8,
1825
+ boxShadow: "0px 4px 12px rgba(0, 0, 0, 0.15)",
1826
+ minWidth: 200
1827
+ },
1828
+ "& .MuiMenuItem-root": {
1829
+ padding: "8px 16px",
1830
+ "&:hover": {
1831
+ backgroundColor: colors.background.selected
1832
+ }
1833
+ }
1834
+ });
1835
+ var Menu3 = ({ anchorEl, onClose, children, ...props }) => {
1836
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1837
+ StyledMenu,
1838
+ {
1839
+ anchorEl,
1840
+ open: Boolean(anchorEl),
1841
+ onClose,
1842
+ anchorOrigin: {
1843
+ vertical: "bottom",
1844
+ horizontal: "left"
1845
+ },
1846
+ transformOrigin: {
1847
+ vertical: "top",
1848
+ horizontal: "left"
1849
+ },
1850
+ ...props,
1851
+ children
1852
+ }
1853
+ );
1854
+ };
1855
+ var MenuItem2 = ({
1856
+ icon,
1857
+ label,
1858
+ onClick,
1859
+ disabled = false,
1860
+ divider = false
1861
+ }) => {
1862
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
1863
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_material11.MenuItem, { onClick, disabled, children: [
1864
+ icon && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_material11.ListItemIcon, { children: icon }),
1865
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_material11.ListItemText, { children: label })
1866
+ ] }),
1867
+ divider && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_material11.Divider, {})
1868
+ ] });
1869
+ };
1870
+
1871
+ // src/components/navigation/Pagination.tsx
1872
+ var import_Pagination = __toESM(require("@mui/material/Pagination"));
1873
+ var import_styles15 = require("@mui/material/styles");
1874
+ var import_jsx_runtime23 = require("react/jsx-runtime");
1875
+ var StyledPagination = (0, import_styles15.styled)(import_Pagination.default)({
1876
+ "& .MuiPaginationItem-root": {
1877
+ "&.Mui-selected": {
1878
+ backgroundColor: colors.primary.main,
1879
+ color: colors.primary.contrastText,
1880
+ "&:hover": {
1881
+ backgroundColor: colors.primary.light
1882
+ }
1883
+ },
1884
+ "&:hover": {
1885
+ backgroundColor: colors.background.selected
1886
+ }
1887
+ }
1888
+ });
1889
+ var Pagination = ({ color = "primary", ...props }) => {
1890
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StyledPagination, { color, ...props });
1891
+ };
1892
+
1893
+ // src/components/navigation/Selector.tsx
1894
+ var import_react3 = require("react");
1895
+ var import_material12 = require("@mui/material");
1896
+ var import_KeyboardArrowDown3 = __toESM(require("@mui/icons-material/KeyboardArrowDown"));
1897
+ var import_Search4 = __toESM(require("@mui/icons-material/Search"));
1898
+ var import_Add3 = __toESM(require("@mui/icons-material/Add"));
1899
+
1900
+ // src/components/layout/Link.tsx
1901
+ var import_Link = __toESM(require("@mui/material/Link"));
1902
+ var import_styles16 = require("@mui/material/styles");
1903
+ var import_jsx_runtime24 = require("react/jsx-runtime");
1904
+ var StyledLink = (0, import_styles16.styled)(import_Link.default)({
1905
+ color: colors.primary.main,
1906
+ "&:hover": {
1907
+ color: colors.primary.light
1908
+ }
1909
+ });
1910
+ var Link3 = ({ underline = "hover", ...props }) => {
1911
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(StyledLink, { underline, ...props });
1912
+ };
1913
+
1914
+ // src/components/navigation/Selector.tsx
1915
+ var import_jsx_runtime25 = require("react/jsx-runtime");
1916
+ var Selector = ({
1917
+ options,
1918
+ selectedId,
1919
+ onSelect,
1920
+ onCreate,
1921
+ loading = false,
1922
+ placeholder = "Select...",
1923
+ emptyMessage = "No items found",
1924
+ compact = false,
1925
+ renderSelected,
1926
+ width = 350
1927
+ }) => {
1928
+ const [anchorEl, setAnchorEl] = (0, import_react3.useState)(null);
1929
+ const [searchTerm, setSearchTerm] = (0, import_react3.useState)("");
1930
+ const open = Boolean(anchorEl);
1931
+ const selectedOption = options.find((opt) => opt.id === selectedId);
1932
+ const filteredOptions = options.filter(
1933
+ (opt) => opt.name.toLowerCase().includes(searchTerm.toLowerCase())
1934
+ );
1935
+ const handleOpen = (event) => {
1936
+ event.stopPropagation();
1937
+ setAnchorEl(event.currentTarget);
1938
+ };
1939
+ const handleClose = () => {
1940
+ setAnchorEl(null);
1941
+ setSearchTerm("");
1942
+ };
1943
+ const handleSelect = (id) => {
1944
+ onSelect(id);
1945
+ handleClose();
1946
+ };
1947
+ const defaultRenderSelected = (option) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_material12.Box, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
1948
+ option.avatar ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Avatar, { src: option.avatar, sx: { width: 20, height: 20 } }) : option.icon ? option.icon : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Avatar, { sx: { width: 20, height: 20, bgcolor: colors.primary.main, fontSize: "0.7rem" }, children: option.name.charAt(0) }),
1949
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Typography, { variant: "body2", children: option.name })
1950
+ ] });
1951
+ if (compact) {
1952
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
1953
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(IconButton, { onClick: handleOpen, size: "small", children: selectedOption ? selectedOption.avatar ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Avatar, { src: selectedOption.avatar, sx: { width: 32, height: 32 } }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Avatar, { sx: { width: 32, height: 32, bgcolor: colors.primary.main }, children: selectedOption.name.charAt(0) }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Avatar, { sx: { width: 32, height: 32, bgcolor: colors.grey[400] }, children: "?" }) }),
1954
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1955
+ import_material12.Menu,
1956
+ {
1957
+ anchorEl,
1958
+ open,
1959
+ onClose: handleClose,
1960
+ PaperProps: {
1961
+ sx: { width, maxHeight: 600, mt: 1 }
1962
+ },
1963
+ children: loading ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Box, { sx: { display: "flex", justifyContent: "center", p: 2 }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.CircularProgress, { size: 24 }) }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
1964
+ options.length > 5 && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Box, { sx: { p: 1, borderBottom: `1px solid ${colors.grey[200]}` }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1965
+ TextField,
1966
+ {
1967
+ size: "small",
1968
+ fullWidth: true,
1969
+ placeholder: "Search...",
1970
+ value: searchTerm,
1971
+ onChange: (e) => setSearchTerm(e.target.value),
1972
+ InputProps: {
1973
+ startAdornment: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.InputAdornment, { position: "start", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_Search4.default, { fontSize: "small" }) })
1974
+ }
1975
+ }
1976
+ ) }),
1977
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_material12.List, { sx: { maxHeight: 400, overflow: "auto" }, children: [
1978
+ filteredOptions.map((option) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1979
+ import_material12.ListItemButton,
1980
+ {
1981
+ selected: option.id === selectedId,
1982
+ onClick: () => handleSelect(option.id),
1983
+ disabled: option.disabled,
1984
+ children: [
1985
+ option.avatar ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.ListItemAvatar, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Avatar, { src: option.avatar }) }) : option.icon ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.ListItemAvatar, { children: option.icon }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.ListItemAvatar, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Avatar, { sx: { bgcolor: colors.primary.main }, children: option.name.charAt(0) }) }),
1986
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.ListItemText, { primary: option.name, secondary: option.description })
1987
+ ]
1988
+ },
1989
+ option.id
1990
+ )),
1991
+ filteredOptions.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Box, { sx: { p: 2, textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Typography, { variant: "body2", color: "text.secondary", children: emptyMessage }) })
1992
+ ] }),
1993
+ onCreate && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Box, { sx: { p: 1, borderTop: `1px solid ${colors.grey[200]}` }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1994
+ Button,
1995
+ {
1996
+ fullWidth: true,
1997
+ startIcon: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_Add3.default, {}),
1998
+ onClick: () => {
1999
+ onCreate();
2000
+ handleClose();
2001
+ },
2002
+ children: "Create New"
2003
+ }
2004
+ ) })
2005
+ ] })
2006
+ }
2007
+ )
2008
+ ] });
2009
+ }
2010
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
2011
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_material12.Box, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: [
2012
+ selectedOption ? renderSelected ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Link3, { onClick: handleOpen, underline: "hover", children: renderSelected(selectedOption) }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Link3, { onClick: handleOpen, underline: "hover", children: defaultRenderSelected(selectedOption) }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Typography, { variant: "body2", color: "text.secondary", children: placeholder }),
2013
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(IconButton, { onClick: handleOpen, size: "small", sx: { p: 0.2, ml: 0.5 }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_KeyboardArrowDown3.default, { fontSize: "small" }) })
2014
+ ] }),
2015
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2016
+ import_material12.Menu,
2017
+ {
2018
+ anchorEl,
2019
+ open,
2020
+ onClose: handleClose,
2021
+ PaperProps: {
2022
+ sx: { width, maxHeight: 600, mt: 1 }
2023
+ },
2024
+ children: loading ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Box, { sx: { display: "flex", justifyContent: "center", p: 2 }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.CircularProgress, { size: 24 }) }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
2025
+ options.length > 5 && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Box, { sx: { p: 1, borderBottom: `1px solid ${colors.grey[200]}` }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2026
+ TextField,
2027
+ {
2028
+ size: "small",
2029
+ fullWidth: true,
2030
+ placeholder: "Search...",
2031
+ value: searchTerm,
2032
+ onChange: (e) => setSearchTerm(e.target.value),
2033
+ InputProps: {
2034
+ startAdornment: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.InputAdornment, { position: "start", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_Search4.default, { fontSize: "small" }) })
2035
+ }
2036
+ }
2037
+ ) }),
2038
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_material12.List, { sx: { maxHeight: 400, overflow: "auto" }, children: [
2039
+ filteredOptions.map((option) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
2040
+ import_material12.ListItemButton,
2041
+ {
2042
+ selected: option.id === selectedId,
2043
+ onClick: () => handleSelect(option.id),
2044
+ disabled: option.disabled,
2045
+ children: [
2046
+ option.avatar ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.ListItemAvatar, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Avatar, { src: option.avatar }) }) : option.icon ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.ListItemAvatar, { children: option.icon }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.ListItemAvatar, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Avatar, { sx: { bgcolor: colors.primary.main }, children: option.name.charAt(0) }) }),
2047
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.ListItemText, { primary: option.name, secondary: option.description })
2048
+ ]
2049
+ },
2050
+ option.id
2051
+ )),
2052
+ filteredOptions.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Box, { sx: { p: 2, textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Typography, { variant: "body2", color: "text.secondary", children: emptyMessage }) })
2053
+ ] }),
2054
+ onCreate && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_material12.Box, { sx: { p: 1, borderTop: `1px solid ${colors.grey[200]}` }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2055
+ Button,
2056
+ {
2057
+ fullWidth: true,
2058
+ startIcon: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_Add3.default, {}),
2059
+ onClick: () => {
2060
+ onCreate();
2061
+ handleClose();
2062
+ },
2063
+ children: "Create New"
2064
+ }
2065
+ ) })
2066
+ ] })
2067
+ }
2068
+ )
2069
+ ] });
2070
+ };
2071
+
2072
+ // src/components/layout/Dialog.tsx
2073
+ var import_material13 = require("@mui/material");
2074
+ var import_Close = __toESM(require("@mui/icons-material/Close"));
2075
+ var import_jsx_runtime26 = require("react/jsx-runtime");
2076
+ var Dialog = ({
2077
+ open,
2078
+ title,
2079
+ onClose,
2080
+ onSubmit,
2081
+ submitLabel = "Save",
2082
+ cancelLabel = "Cancel",
2083
+ isLoading = false,
2084
+ disableSubmit = false,
2085
+ showActions = true,
2086
+ headerAction,
2087
+ fullWidth = true,
2088
+ maxWidth = "md",
2089
+ children,
2090
+ dividers = true,
2091
+ confirmBeforeClose = false,
2092
+ ...dialogProps
2093
+ }) => {
2094
+ const handleCloseAttempt = (e) => {
2095
+ if (e) e.stopPropagation();
2096
+ onClose();
2097
+ };
2098
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
2099
+ import_material13.Dialog,
2100
+ {
2101
+ open,
2102
+ onClose: (_, reason) => {
2103
+ if (reason === "backdropClick" || reason === "escapeKeyDown" && !confirmBeforeClose) {
2104
+ onClose();
2105
+ }
2106
+ },
2107
+ fullWidth,
2108
+ maxWidth,
2109
+ ...dialogProps,
2110
+ PaperProps: {
2111
+ sx: { minHeight: dialogProps.fullScreen ? void 0 : "auto" },
2112
+ ...dialogProps.PaperProps
2113
+ },
2114
+ children: [
2115
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_material13.DialogTitle, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", p: 2 }, children: [
2116
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_material13.Box, { sx: { display: "flex", alignItems: "center" }, children: typeof title === "string" ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_material13.Typography, { variant: "h6", children: title }) : title }),
2117
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_material13.Box, { sx: { display: "flex", alignItems: "center" }, children: [
2118
+ headerAction,
2119
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2120
+ import_material13.IconButton,
2121
+ {
2122
+ edge: "end",
2123
+ color: "inherit",
2124
+ onClick: handleCloseAttempt,
2125
+ "aria-label": "close",
2126
+ children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_Close.default, {})
2127
+ }
2128
+ )
2129
+ ] })
2130
+ ] }),
2131
+ dividers && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_material13.Divider, {}),
2132
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_material13.DialogContent, { dividers, children }),
2133
+ showActions && /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
2134
+ dividers && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_material13.Divider, {}),
2135
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_material13.DialogActions, { children: [
2136
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2137
+ import_material13.Button,
2138
+ {
2139
+ onClick: handleCloseAttempt,
2140
+ disabled: isLoading,
2141
+ children: cancelLabel
2142
+ }
2143
+ ),
2144
+ onSubmit && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2145
+ import_material13.Button,
2146
+ {
2147
+ variant: "contained",
2148
+ color: "primary",
2149
+ onClick: onSubmit,
2150
+ disabled: disableSubmit || isLoading,
2151
+ startIcon: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_material13.CircularProgress, { size: 20 }) : void 0,
2152
+ children: submitLabel
2153
+ }
2154
+ )
2155
+ ] })
2156
+ ] })
2157
+ ]
2158
+ }
2159
+ );
2160
+ };
2161
+
2162
+ // src/components/layout/Drawer.tsx
2163
+ var import_Drawer = __toESM(require("@mui/material/Drawer"));
2164
+ var import_styles17 = require("@mui/material/styles");
2165
+ var import_jsx_runtime27 = require("react/jsx-runtime");
2166
+ var StyledDrawer2 = (0, import_styles17.styled)(import_Drawer.default, {
2167
+ shouldForwardProp: (prop) => prop !== "width" && prop !== "miniWidth" && prop !== "collapsed"
2168
+ })(({ theme: theme2, width = 240, miniWidth = 72, collapsed }) => ({
2169
+ width: collapsed ? miniWidth : width,
2170
+ flexShrink: 0,
2171
+ "& .MuiDrawer-paper": {
2172
+ width: collapsed ? miniWidth : width,
2173
+ boxSizing: "border-box",
2174
+ boxShadow: "0px 2px 10px rgba(0, 0, 0, 0.05)",
2175
+ transition: theme2.transitions.create("width", {
2176
+ easing: theme2.transitions.easing.sharp,
2177
+ duration: theme2.transitions.duration.enteringScreen
2178
+ }),
2179
+ overflow: collapsed ? "hidden" : "auto"
2180
+ }
2181
+ }));
2182
+ var Drawer2 = ({
2183
+ width = 240,
2184
+ miniWidth = 72,
2185
+ collapsed = false,
2186
+ ...props
2187
+ }) => {
2188
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2189
+ StyledDrawer2,
2190
+ {
2191
+ width,
2192
+ miniWidth,
2193
+ collapsed,
2194
+ ...props
2195
+ }
2196
+ );
2197
+ };
2198
+
2199
+ // src/components/layout/Card.tsx
2200
+ var import_Card = __toESM(require("@mui/material/Card"));
2201
+ var import_CardContent = __toESM(require("@mui/material/CardContent"));
2202
+ var import_CardHeader = __toESM(require("@mui/material/CardHeader"));
2203
+ var import_CardActions = __toESM(require("@mui/material/CardActions"));
2204
+ var import_styles18 = require("@mui/material/styles");
2205
+ var import_jsx_runtime28 = require("react/jsx-runtime");
2206
+ var StyledCard = (0, import_styles18.styled)(import_Card.default, {
2207
+ shouldForwardProp: (prop) => prop !== "hoverable" && prop !== "clickable"
2208
+ })(({ hoverable, clickable }) => ({
2209
+ borderRadius: 8,
2210
+ boxShadow: "0px 1px 3px rgba(0, 0, 0, 0.12)",
2211
+ transition: "all 0.2s ease-in-out",
2212
+ ...clickable && {
2213
+ cursor: "pointer"
2214
+ },
2215
+ ...hoverable && {
2216
+ "&:hover": {
2217
+ boxShadow: "0px 4px 12px rgba(0, 0, 0, 0.15)",
2218
+ transform: "translateY(-2px)"
2219
+ }
2220
+ }
2221
+ }));
2222
+ var Card = ({ hoverable = false, clickable = false, children, ...props }) => {
2223
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(StyledCard, { hoverable, clickable, ...props, children });
2224
+ };
2225
+ var CardContent = (props) => {
2226
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_CardContent.default, { ...props });
2227
+ };
2228
+ var CardHeader = (props) => {
2229
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_CardHeader.default, { ...props });
2230
+ };
2231
+ var CardActions = (props) => {
2232
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_CardActions.default, { ...props });
2233
+ };
2234
+
2235
+ // src/components/layout/List.tsx
2236
+ var import_material14 = require("@mui/material");
2237
+ var import_styles19 = require("@mui/material/styles");
2238
+ var import_jsx_runtime29 = require("react/jsx-runtime");
2239
+ var List5 = (props) => {
2240
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_material14.List, { ...props });
2241
+ };
2242
+ var StyledListItem = (0, import_styles19.styled)(import_material14.ListItem, {
2243
+ shouldForwardProp: (prop) => prop !== "hoverable"
2244
+ })(({ hoverable = true }) => ({
2245
+ border: `1px solid ${colors.grey[200]}`,
2246
+ borderRadius: 8,
2247
+ marginBottom: 8,
2248
+ ...hoverable && {
2249
+ "&:hover": {
2250
+ backgroundColor: colors.grey[50]
2251
+ }
2252
+ }
2253
+ }));
2254
+ var ListItem3 = ({
2255
+ primary,
2256
+ secondary,
2257
+ icon,
2258
+ action,
2259
+ hoverable = true,
2260
+ children,
2261
+ ...props
2262
+ }) => {
2263
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(StyledListItem, { hoverable, ...props, children: [
2264
+ icon && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_material14.ListItemIcon, { children: icon }),
2265
+ (primary || secondary) && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2266
+ import_material14.ListItemText,
2267
+ {
2268
+ primary,
2269
+ secondary
2270
+ }
2271
+ ),
2272
+ children,
2273
+ action && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_material14.ListItemSecondaryAction, { children: action })
2274
+ ] });
2275
+ };
2276
+
2277
+ // src/components/layout/Avatar.tsx
2278
+ var import_Avatar = __toESM(require("@mui/material/Avatar"));
2279
+ var import_styles20 = require("@mui/material/styles");
2280
+ var import_jsx_runtime30 = require("react/jsx-runtime");
2281
+ var sizeMap = {
2282
+ small: 32,
2283
+ medium: 40,
2284
+ large: 56
2285
+ };
2286
+ var StyledAvatar = (0, import_styles20.styled)(import_Avatar.default, {
2287
+ shouldForwardProp: (prop) => prop !== "avatarSize"
2288
+ })(({ avatarSize = 40 }) => ({
2289
+ width: avatarSize,
2290
+ height: avatarSize,
2291
+ backgroundColor: colors.primary.main,
2292
+ color: colors.primary.contrastText,
2293
+ fontWeight: 600
2294
+ }));
2295
+ var Avatar4 = ({ size = "medium", ...props }) => {
2296
+ const avatarSize = typeof size === "number" ? size : sizeMap[size];
2297
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(StyledAvatar, { avatarSize, ...props });
2298
+ };
2299
+
2300
+ // src/components/layout/Table.tsx
2301
+ var import_material15 = require("@mui/material");
2302
+ var import_styles21 = require("@mui/material/styles");
2303
+ var import_jsx_runtime31 = require("react/jsx-runtime");
2304
+ var StyledTableContainer = (0, import_styles21.styled)(import_material15.TableContainer)({
2305
+ borderRadius: 8,
2306
+ border: `1px solid ${colors.grey[200]}`
2307
+ });
2308
+ var StyledTableHead = (0, import_styles21.styled)(import_material15.TableHead)({
2309
+ backgroundColor: colors.grey[50],
2310
+ "& .MuiTableCell-head": {
2311
+ fontWeight: 600,
2312
+ color: colors.text.primary
2313
+ }
2314
+ });
2315
+ var Table = ({ stickyHeader = false, children, ...props }) => {
2316
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(StyledTableContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_material15.Table, { stickyHeader, ...props, children }) });
2317
+ };
2318
+ var TableHeader = ({
2319
+ columns,
2320
+ orderBy,
2321
+ order = "asc",
2322
+ onSort
2323
+ }) => {
2324
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(StyledTableHead, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_material15.TableRow, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_material15.TableCell, { align: column.align || "left", children: column.sortable && onSort ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
2325
+ import_material15.TableSortLabel,
2326
+ {
2327
+ active: orderBy === column.id,
2328
+ direction: orderBy === column.id ? order : "asc",
2329
+ onClick: () => onSort(column.id),
2330
+ children: column.label
2331
+ }
2332
+ ) : column.label }, column.id)) }) });
2333
+ };
2334
+
2335
+ // src/components/layout/Grid.tsx
2336
+ var import_material16 = require("@mui/material");
2337
+
2338
+ // src/components/layout/Breadcrumbs.tsx
2339
+ var import_Breadcrumbs = __toESM(require("@mui/material/Breadcrumbs"));
2340
+ var import_Link3 = __toESM(require("@mui/material/Link"));
2341
+ var import_Typography = __toESM(require("@mui/material/Typography"));
2342
+ var import_styles22 = require("@mui/material/styles");
2343
+ var import_jsx_runtime32 = require("react/jsx-runtime");
2344
+ var StyledBreadcrumbs = (0, import_styles22.styled)(import_Breadcrumbs.default)({
2345
+ "& .MuiBreadcrumbs-ol": {
2346
+ flexWrap: "nowrap"
2347
+ },
2348
+ "& .MuiBreadcrumbs-separator": {
2349
+ color: colors.text.secondary
2350
+ }
2351
+ });
2352
+ var StyledLink2 = (0, import_styles22.styled)(import_Link3.default)({
2353
+ color: colors.primary.main,
2354
+ textDecoration: "none",
2355
+ "&:hover": {
2356
+ textDecoration: "underline"
2357
+ }
2358
+ });
2359
+ var Breadcrumbs = ({ items, ...props }) => {
2360
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(StyledBreadcrumbs, { ...props, children: items.map((item, index) => {
2361
+ const isLast = index === items.length - 1;
2362
+ if (isLast || !item.href && !item.onClick) {
2363
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_Typography.default, { color: "text.primary", children: item.label }, index);
2364
+ }
2365
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
2366
+ StyledLink2,
2367
+ {
2368
+ href: item.href,
2369
+ onClick: (e) => {
2370
+ if (item.onClick) {
2371
+ e.preventDefault();
2372
+ item.onClick();
2373
+ }
2374
+ },
2375
+ children: item.label
2376
+ },
2377
+ index
2378
+ );
2379
+ }) });
2380
+ };
2381
+
2382
+ // src/components/layout/Accordion.tsx
2383
+ var import_material17 = require("@mui/material");
2384
+ var import_ExpandMore = __toESM(require("@mui/icons-material/ExpandMore"));
2385
+ var import_styles23 = require("@mui/material/styles");
2386
+ var import_jsx_runtime33 = require("react/jsx-runtime");
2387
+ var StyledAccordion = (0, import_styles23.styled)(import_material17.Accordion)({
2388
+ borderRadius: 8,
2389
+ boxShadow: "none",
2390
+ border: `1px solid ${colors.grey[200]}`,
2391
+ "&:before": {
2392
+ display: "none"
2393
+ },
2394
+ "&.Mui-expanded": {
2395
+ margin: 0
2396
+ }
2397
+ });
2398
+ var StyledAccordionSummary = (0, import_styles23.styled)(import_material17.AccordionSummary)({
2399
+ backgroundColor: colors.grey[50],
2400
+ borderRadius: "8px 8px 0 0",
2401
+ "&.Mui-expanded": {
2402
+ borderRadius: "8px 8px 0 0"
2403
+ },
2404
+ "& .MuiAccordionSummary-content": {
2405
+ margin: "12px 0"
2406
+ }
2407
+ });
2408
+ var StyledAccordionDetails = (0, import_styles23.styled)(import_material17.AccordionDetails)({
2409
+ padding: "16px"
2410
+ });
2411
+ var Accordion = ({
2412
+ title,
2413
+ children,
2414
+ defaultExpanded = false,
2415
+ ...props
2416
+ }) => {
2417
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(StyledAccordion, { defaultExpanded, ...props, children: [
2418
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(StyledAccordionSummary, { expandIcon: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_ExpandMore.default, {}), children: title }),
2419
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(StyledAccordionDetails, { children })
2420
+ ] });
2421
+ };
2422
+
2423
+ // src/components/layout/Paper.tsx
2424
+ var import_Paper = __toESM(require("@mui/material/Paper"));
2425
+ var import_styles24 = require("@mui/material/styles");
2426
+ var import_jsx_runtime34 = require("react/jsx-runtime");
2427
+ var StyledPaper = (0, import_styles24.styled)(import_Paper.default)({
2428
+ borderRadius: 8,
2429
+ "&.MuiPaper-elevation": {
2430
+ boxShadow: "0px 2px 8px rgba(0, 0, 0, 0.08)"
2431
+ },
2432
+ "&.MuiPaper-outlined": {
2433
+ border: `1px solid ${colors.grey[200]}`,
2434
+ boxShadow: "none"
2435
+ }
2436
+ });
2437
+ var Paper = ({ variant = "elevation", ...props }) => {
2438
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(StyledPaper, { variant, elevation: variant === "elevation" ? 1 : 0, ...props });
2439
+ };
2440
+
2441
+ // src/components/layout/Divider.tsx
2442
+ var import_Divider = __toESM(require("@mui/material/Divider"));
2443
+ var import_styles25 = require("@mui/material/styles");
2444
+ var import_jsx_runtime35 = require("react/jsx-runtime");
2445
+ var StyledDivider = (0, import_styles25.styled)(import_Divider.default)({
2446
+ borderColor: colors.grey[200]
2447
+ });
2448
+ var Divider3 = ({ ...props }) => {
2449
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(StyledDivider, { ...props });
2450
+ };
2451
+
2452
+ // src/components/layout/Stack.tsx
2453
+ var import_material18 = require("@mui/material");
2454
+
2455
+ // src/components/layout/Box.tsx
2456
+ var import_material19 = require("@mui/material");
2457
+
2458
+ // src/components/layout/Typography.tsx
2459
+ var import_material20 = require("@mui/material");
2460
+
2461
+ // src/components/layout/Container.tsx
2462
+ var import_material21 = require("@mui/material");
2463
+
2464
+ // src/components/layout/AppBar.tsx
2465
+ var import_material22 = require("@mui/material");
2466
+ var import_styles26 = require("@mui/material/styles");
2467
+ var import_jsx_runtime36 = require("react/jsx-runtime");
2468
+ var StyledAppBar = (0, import_styles26.styled)(import_material22.AppBar, {
2469
+ shouldForwardProp: (prop) => prop !== "appBarHeight"
2470
+ })(({ appBarHeight = 64 }) => ({
2471
+ backgroundColor: colors.background.paper,
2472
+ borderBottom: `1px solid ${colors.grey[200]}`,
2473
+ boxShadow: "none",
2474
+ height: appBarHeight,
2475
+ zIndex: 1300
2476
+ }));
2477
+ var StyledToolbar = (0, import_styles26.styled)(import_material22.Toolbar)(({ theme: theme2 }) => ({
2478
+ height: "100%",
2479
+ paddingLeft: theme2.spacing(2),
2480
+ paddingRight: theme2.spacing(2),
2481
+ gap: theme2.spacing(2)
2482
+ }));
2483
+ var AppBar = ({ height = 64, children, ...props }) => {
2484
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(StyledAppBar, { position: "fixed", appBarHeight: height, ...props, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(StyledToolbar, { children }) });
2485
+ };
2486
+
2487
+ // src/components/layout/Collapse.tsx
2488
+ var import_material23 = require("@mui/material");
2489
+ var import_jsx_runtime37 = require("react/jsx-runtime");
2490
+ var Collapse = (props) => {
2491
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_material23.Collapse, { ...props });
2492
+ };
2493
+
2494
+ // src/components/feedback/Alert.tsx
2495
+ var import_Alert = __toESM(require("@mui/material/Alert"));
2496
+ var import_material24 = require("@mui/material");
2497
+ var import_Snackbar = __toESM(require("@mui/material/Snackbar"));
2498
+ var import_styles27 = require("@mui/material/styles");
2499
+ var import_jsx_runtime38 = require("react/jsx-runtime");
2500
+ var StyledAlert = (0, import_styles27.styled)(import_Alert.default)({
2501
+ borderRadius: 8,
2502
+ "&.MuiAlert-filled": {
2503
+ borderRadius: 8
2504
+ }
2505
+ });
2506
+ var Alert = ({
2507
+ severity = "info",
2508
+ title,
2509
+ children,
2510
+ ...props
2511
+ }) => {
2512
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(StyledAlert, { severity, ...props, children: [
2513
+ title && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material24.AlertTitle, { children: title }),
2514
+ children
2515
+ ] });
2516
+ };
2517
+ var StyledSnackbar = (0, import_styles27.styled)(import_Snackbar.default)({});
2518
+ var Snackbar = ({
2519
+ message,
2520
+ severity = "info",
2521
+ title,
2522
+ variant = "filled",
2523
+ onClose,
2524
+ children,
2525
+ anchorOrigin = { vertical: "bottom", horizontal: "center" },
2526
+ autoHideDuration = 6e3,
2527
+ ...props
2528
+ }) => {
2529
+ const content = children || (message ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2530
+ Alert,
2531
+ {
2532
+ onClose,
2533
+ severity,
2534
+ variant,
2535
+ title,
2536
+ sx: { width: "100%", borderRadius: 2 },
2537
+ children: message
2538
+ }
2539
+ ) : void 0);
2540
+ if (!content) {
2541
+ return null;
2542
+ }
2543
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2544
+ StyledSnackbar,
2545
+ {
2546
+ anchorOrigin,
2547
+ autoHideDuration,
2548
+ onClose,
2549
+ ...props,
2550
+ children: content
2551
+ }
2552
+ );
2553
+ };
2554
+
2555
+ // src/components/feedback/EmptyState.tsx
2556
+ var import_material25 = require("@mui/material");
2557
+ var import_jsx_runtime39 = require("react/jsx-runtime");
2558
+ var EmptyState = ({
2559
+ title = "No items found",
2560
+ description,
2561
+ icon,
2562
+ action
2563
+ }) => {
2564
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(
2565
+ import_material25.Box,
2566
+ {
2567
+ sx: {
2568
+ display: "flex",
2569
+ flexDirection: "column",
2570
+ alignItems: "center",
2571
+ justifyContent: "center",
2572
+ padding: 6,
2573
+ textAlign: "center",
2574
+ minHeight: 200
2575
+ },
2576
+ children: [
2577
+ icon && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
2578
+ import_material25.Box,
2579
+ {
2580
+ sx: {
2581
+ color: colors.text.secondary,
2582
+ marginBottom: 2,
2583
+ fontSize: 64
2584
+ },
2585
+ children: icon
2586
+ }
2587
+ ),
2588
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_material25.Typography, { variant: "h6", sx: { marginBottom: 1, color: colors.text.primary }, children: title }),
2589
+ description && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_material25.Typography, { variant: "body2", sx: { color: colors.text.secondary, marginBottom: 3 }, children: description }),
2590
+ action && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_material25.Box, { children: action })
2591
+ ]
2592
+ }
2593
+ );
2594
+ };
2595
+
2596
+ // src/components/feedback/Loading.tsx
2597
+ var import_material26 = require("@mui/material");
2598
+ var import_jsx_runtime40 = require("react/jsx-runtime");
2599
+ var Loading = ({
2600
+ message = "Loading...",
2601
+ size = 40,
2602
+ fullScreen = false
2603
+ }) => {
2604
+ const content = /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
2605
+ import_material26.Box,
2606
+ {
2607
+ sx: {
2608
+ display: "flex",
2609
+ flexDirection: "column",
2610
+ justifyContent: "center",
2611
+ alignItems: "center",
2612
+ gap: 2,
2613
+ ...fullScreen && {
2614
+ height: "100vh",
2615
+ width: "100vw",
2616
+ position: "fixed",
2617
+ top: 0,
2618
+ left: 0,
2619
+ backgroundColor: colors.background.default,
2620
+ zIndex: 9999
2621
+ },
2622
+ ...!fullScreen && {
2623
+ padding: 4
2624
+ }
2625
+ },
2626
+ children: [
2627
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_material26.CircularProgress, { size, thickness: 4 }),
2628
+ message && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_material26.Typography, { variant: "body2", color: "text.secondary", children: message })
2629
+ ]
2630
+ }
2631
+ );
2632
+ return content;
2633
+ };
2634
+
2635
+ // src/components/feedback/AppLoading.tsx
2636
+ var import_material27 = require("@mui/material");
2637
+ var import_jsx_runtime41 = require("react/jsx-runtime");
2638
+ var AppLoading = ({
2639
+ message = "Loading...",
2640
+ logo = "/icons/logo.png",
2641
+ sx = {}
2642
+ }) => {
2643
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
2644
+ import_material27.Box,
2645
+ {
2646
+ sx: {
2647
+ display: "flex",
2648
+ flexDirection: "column",
2649
+ justifyContent: "center",
2650
+ alignItems: "center",
2651
+ height: "100vh",
2652
+ width: "100vw",
2653
+ position: "fixed",
2654
+ top: 0,
2655
+ left: 0,
2656
+ backgroundColor: "#f8f9fa",
2657
+ // Light background
2658
+ zIndex: 9999,
2659
+ ...sx
2660
+ },
2661
+ children: [
2662
+ logo && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
2663
+ import_material27.Box,
2664
+ {
2665
+ component: "img",
2666
+ src: logo,
2667
+ alt: "Logo",
2668
+ sx: {
2669
+ height: 80,
2670
+ width: "auto",
2671
+ mb: 4
2672
+ }
2673
+ }
2674
+ ),
2675
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_material27.CircularProgress, { size: 40, thickness: 4, sx: { mb: 2 } }),
2676
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_material27.Typography, { variant: "body1", color: "text.secondary", children: message })
2677
+ ]
2678
+ }
2679
+ );
2680
+ };
2681
+
2682
+ // src/components/feedback/CircularProgress.tsx
2683
+ var import_material28 = require("@mui/material");
2684
+ var import_jsx_runtime42 = require("react/jsx-runtime");
2685
+ var CircularProgress6 = ({
2686
+ size = 40,
2687
+ thickness = 4,
2688
+ ...props
2689
+ }) => {
2690
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_material28.CircularProgress, { size, thickness, ...props });
2691
+ };
2692
+
2693
+ // src/components/third-party/FlowEditor.tsx
2694
+ var import_react4 = require("react");
2695
+ var import_reactflow = __toESM(require("reactflow"));
2696
+ var import_material29 = require("@mui/material");
2697
+ var import_styles28 = require("@mui/material/styles");
2698
+ var import_reactflow2 = require("reactflow");
2699
+ var import_jsx_runtime43 = require("react/jsx-runtime");
2700
+ var FlowEditor = ({
2701
+ nodes,
2702
+ edges,
2703
+ onNodesChange,
2704
+ onEdgesChange,
2705
+ nodeTypes,
2706
+ edgeTypes,
2707
+ height = "600px",
2708
+ showBackground = true,
2709
+ backgroundVariant = import_reactflow.BackgroundVariant.Dots,
2710
+ showControls = true,
2711
+ showMinimap = false,
2712
+ containerProps,
2713
+ onInit,
2714
+ ...reactFlowProps
2715
+ }) => {
2716
+ const theme2 = (0, import_styles28.useTheme)();
2717
+ const handleInit = (0, import_react4.useCallback)(
2718
+ (instance) => {
2719
+ if (onInit) {
2720
+ onInit(instance);
2721
+ }
2722
+ },
2723
+ [onInit]
2724
+ );
2725
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_reactflow.ReactFlowProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
2726
+ import_material29.Box,
2727
+ {
2728
+ sx: {
2729
+ width: "100%",
2730
+ height: typeof height === "number" ? `${height}px` : height,
2731
+ border: `1px solid ${theme2.palette.divider}`,
2732
+ borderRadius: theme2.shape.borderRadius,
2733
+ overflow: "hidden",
2734
+ backgroundColor: theme2.palette.background.paper,
2735
+ ...containerProps?.sx
2736
+ },
2737
+ ...containerProps,
2738
+ children: /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
2739
+ import_reactflow.default,
2740
+ {
2741
+ nodes,
2742
+ edges,
2743
+ onNodesChange,
2744
+ onEdgesChange,
2745
+ nodeTypes,
2746
+ edgeTypes,
2747
+ onInit: handleInit,
2748
+ connectionLineType: import_reactflow.ConnectionLineType.SmoothStep,
2749
+ defaultEdgeOptions: {
2750
+ style: {
2751
+ stroke: theme2.palette.primary.main,
2752
+ strokeWidth: 2
2753
+ }
2754
+ },
2755
+ style: {
2756
+ backgroundColor: "transparent"
2757
+ },
2758
+ ...reactFlowProps,
2759
+ children: [
2760
+ showBackground && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
2761
+ import_reactflow.Background,
2762
+ {
2763
+ variant: backgroundVariant,
2764
+ gap: 16,
2765
+ size: 1,
2766
+ color: theme2.palette.divider
2767
+ }
2768
+ ),
2769
+ showControls && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_reactflow.Controls, {}),
2770
+ showMinimap && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
2771
+ import_reactflow.MiniMap,
2772
+ {
2773
+ nodeColor: (node) => {
2774
+ const color = node.data?.color || theme2.palette.primary.main;
2775
+ return typeof color === "string" ? color : theme2.palette.primary.main;
2776
+ },
2777
+ nodeStrokeWidth: 3,
2778
+ nodeBorderRadius: 8,
2779
+ maskColor: `${theme2.palette.background.paper}80`,
2780
+ style: {
2781
+ backgroundColor: theme2.palette.background.paper
2782
+ }
2783
+ }
2784
+ )
2785
+ ]
2786
+ }
2787
+ )
2788
+ }
2789
+ ) });
2790
+ };
2791
+
2792
+ // src/components/third-party/CodeEditor.tsx
2793
+ var import_react5 = require("react");
2794
+ var import_react6 = __toESM(require("@monaco-editor/react"));
2795
+ var import_material30 = require("@mui/material");
2796
+ var import_Fullscreen = __toESM(require("@mui/icons-material/Fullscreen"));
2797
+ var import_FullscreenExit = __toESM(require("@mui/icons-material/FullscreenExit"));
2798
+ var import_jsx_runtime44 = require("react/jsx-runtime");
2799
+ var configureTypeScript = (monaco) => {
2800
+ monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
2801
+ target: monaco.languages.typescript.ScriptTarget.ES2020,
2802
+ allowNonTsExtensions: true,
2803
+ moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,
2804
+ module: monaco.languages.typescript.ModuleKind.CommonJS,
2805
+ noEmit: false,
2806
+ lib: ["es2020", "dom"],
2807
+ noUnusedLocals: false,
2808
+ noUnusedParameters: false,
2809
+ noImplicitAny: false,
2810
+ noImplicitReturns: false,
2811
+ noFallthroughCasesInSwitch: false
2812
+ });
2813
+ monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
2814
+ noSemanticValidation: false,
2815
+ noSyntaxValidation: false,
2816
+ noSuggestionDiagnostics: true,
2817
+ diagnosticCodesToIgnore: [
2818
+ 6133,
2819
+ // 'x' is declared but its value is never read
2820
+ 6196
2821
+ // 'x' is declared but its value is never read (different variant)
2822
+ ]
2823
+ });
2824
+ };
2825
+ var CodeEditor = ({
2826
+ value,
2827
+ onChange,
2828
+ language = "typescript",
2829
+ height = "400px",
2830
+ minHeight,
2831
+ theme: themeProp,
2832
+ lineNumbers = "on",
2833
+ options,
2834
+ onMount,
2835
+ onValidate,
2836
+ editorRef,
2837
+ monacoRef,
2838
+ onFullscreenChange,
2839
+ containerProps,
2840
+ typeDefinitions
2841
+ }) => {
2842
+ const [isEditorReady, setIsEditorReady] = (0, import_react5.useState)(false);
2843
+ const [validationErrors, setValidationErrors] = (0, import_react5.useState)([]);
2844
+ const [isFullscreen, setIsFullscreen] = (0, import_react5.useState)(false);
2845
+ const [tsCode, setTsCode] = (0, import_react5.useState)(value);
2846
+ const [actualHeight, setActualHeight] = (0, import_react5.useState)(
2847
+ typeof height === "number" ? `${height}px` : height
2848
+ );
2849
+ const internalEditorRef = (0, import_react5.useRef)(null);
2850
+ const internalMonacoRef = (0, import_react5.useRef)(null);
2851
+ const finalEditorRef = editorRef || internalEditorRef;
2852
+ const finalMonacoRef = monacoRef || internalMonacoRef;
2853
+ (0, import_react5.useEffect)(() => {
2854
+ if (isFullscreen) {
2855
+ setActualHeight("100vh");
2856
+ } else {
2857
+ setActualHeight(typeof height === "number" ? `${height}px` : height);
2858
+ }
2859
+ }, [height, isFullscreen]);
2860
+ const toggleFullscreen = (0, import_react5.useCallback)(() => {
2861
+ const newFullscreenState = !isFullscreen;
2862
+ setIsFullscreen(newFullscreenState);
2863
+ if (onFullscreenChange) {
2864
+ onFullscreenChange(newFullscreenState);
2865
+ }
2866
+ }, [isFullscreen, onFullscreenChange]);
2867
+ (0, import_react5.useEffect)(() => {
2868
+ if (!isFullscreen) return;
2869
+ function escapeHandler(event) {
2870
+ if (event.key === "Escape") {
2871
+ event.preventDefault();
2872
+ event.stopPropagation();
2873
+ setIsFullscreen(false);
2874
+ if (onFullscreenChange) {
2875
+ onFullscreenChange(false);
2876
+ }
2877
+ }
2878
+ }
2879
+ window.addEventListener("keydown", escapeHandler, { capture: true });
2880
+ return () => {
2881
+ window.removeEventListener("keydown", escapeHandler, { capture: true });
2882
+ };
2883
+ }, [isFullscreen, onFullscreenChange]);
2884
+ const handleEditorDidMount = (0, import_react5.useCallback)(
2885
+ (editor, monaco) => {
2886
+ console.log("CodeEditor: onMount called", { editor: !!editor, monaco: !!monaco });
2887
+ try {
2888
+ configureTypeScript(monaco);
2889
+ } catch (e) {
2890
+ console.error("CodeEditor: Failed to configure TypeScript", e);
2891
+ }
2892
+ if (finalEditorRef) {
2893
+ finalEditorRef.current = editor;
2894
+ }
2895
+ if (finalMonacoRef) {
2896
+ finalMonacoRef.current = monaco;
2897
+ }
2898
+ setIsEditorReady(true);
2899
+ console.log("CodeEditor: Editor ready");
2900
+ try {
2901
+ editor.addCommand(monaco.KeyCode.Escape, () => {
2902
+ if (isFullscreen) {
2903
+ setIsFullscreen(false);
2904
+ if (onFullscreenChange) {
2905
+ onFullscreenChange(false);
2906
+ }
2907
+ return true;
2908
+ }
2909
+ return false;
2910
+ });
2911
+ editor.onDidChangeModelDecorations(() => {
2912
+ const model2 = editor.getModel();
2913
+ if (model2 && onValidate) {
2914
+ const markers = monaco.editor.getModelMarkers({ resource: model2.uri });
2915
+ onValidate(markers);
2916
+ setValidationErrors(markers);
2917
+ }
2918
+ });
2919
+ const model = editor.getModel();
2920
+ if (model && onValidate) {
2921
+ const markers = monaco.editor.getModelMarkers({ resource: model.uri });
2922
+ onValidate(markers);
2923
+ setValidationErrors(markers);
2924
+ }
2925
+ } catch (e) {
2926
+ console.error("CodeEditor: Error setting up editor callbacks", e);
2927
+ }
2928
+ if (onMount) {
2929
+ try {
2930
+ onMount(editor, monaco);
2931
+ } catch (e) {
2932
+ console.error("CodeEditor: Error in custom onMount", e);
2933
+ }
2934
+ }
2935
+ },
2936
+ [isFullscreen, onFullscreenChange, onValidate, onMount, finalEditorRef, finalMonacoRef]
2937
+ );
2938
+ (0, import_react5.useEffect)(() => {
2939
+ if (!isEditorReady || !finalMonacoRef?.current || !typeDefinitions) return;
2940
+ const monaco = finalMonacoRef.current;
2941
+ const definitions = Array.isArray(typeDefinitions) ? typeDefinitions : [typeDefinitions];
2942
+ const uris = [];
2943
+ try {
2944
+ definitions.forEach((def, index) => {
2945
+ if (def && def.trim()) {
2946
+ const uri = `ts:filename/custom-types-${index}.d.ts`;
2947
+ uris.push(uri);
2948
+ monaco.languages.typescript.typescriptDefaults.addExtraLib(def, uri);
2949
+ }
2950
+ });
2951
+ } catch (error) {
2952
+ console.error("CodeEditor: Error adding type definitions:", error);
2953
+ }
2954
+ }, [isEditorReady, finalMonacoRef, typeDefinitions]);
2955
+ const handleCodeChange = (newValue) => {
2956
+ const valueStr = newValue || "";
2957
+ setTsCode(valueStr);
2958
+ onChange(valueStr);
2959
+ };
2960
+ (0, import_react5.useEffect)(() => {
2961
+ if (value !== tsCode) {
2962
+ setTsCode(value);
2963
+ if (isEditorReady && finalEditorRef?.current) {
2964
+ const editor = finalEditorRef.current;
2965
+ const currentValue = editor.getValue();
2966
+ if (currentValue !== value) {
2967
+ editor.setValue(value);
2968
+ }
2969
+ }
2970
+ }
2971
+ }, [value, tsCode, isEditorReady, finalEditorRef]);
2972
+ const editorMinHeight = minHeight ? typeof minHeight === "number" ? `${minHeight}px` : minHeight : "400px";
2973
+ const defaultOptions = {
2974
+ lineNumbers,
2975
+ minimap: { enabled: false },
2976
+ readOnly: false,
2977
+ wordWrap: "on",
2978
+ fontSize: 14,
2979
+ fontFamily: 'Monaco, Menlo, "Ubuntu Mono", Consolas, "source-code-pro", monospace',
2980
+ automaticLayout: true,
2981
+ scrollBeyondLastLine: false,
2982
+ theme: themeProp || "vs",
2983
+ ...options
2984
+ };
2985
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
2986
+ import_material30.Box,
2987
+ {
2988
+ sx: {
2989
+ display: "flex",
2990
+ flexDirection: "column",
2991
+ height: "100%",
2992
+ minHeight: isFullscreen ? "100vh" : editorMinHeight,
2993
+ position: isFullscreen ? "fixed" : "relative",
2994
+ top: isFullscreen ? 0 : "auto",
2995
+ left: isFullscreen ? 0 : "auto",
2996
+ right: isFullscreen ? 0 : "auto",
2997
+ bottom: isFullscreen ? 0 : "auto",
2998
+ zIndex: isFullscreen ? 9999 : "auto",
2999
+ bgcolor: "background.paper",
3000
+ p: isFullscreen ? 2 : 0
3001
+ },
3002
+ children: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
3003
+ import_material30.Box,
3004
+ {
3005
+ sx: {
3006
+ flex: 1,
3007
+ border: 1,
3008
+ borderColor: validationErrors.length > 0 ? "error.main" : "divider",
3009
+ borderRadius: 1,
3010
+ minHeight: editorMinHeight,
3011
+ overflow: "hidden",
3012
+ position: "relative",
3013
+ display: "flex",
3014
+ flexDirection: "column"
3015
+ },
3016
+ ...containerProps,
3017
+ children: [
3018
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_material30.Tooltip, { title: isFullscreen ? "Exit Fullscreen" : "Fullscreen", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
3019
+ import_material30.IconButton,
3020
+ {
3021
+ onClick: toggleFullscreen,
3022
+ size: "small",
3023
+ sx: {
3024
+ position: "absolute",
3025
+ top: 8,
3026
+ right: 8,
3027
+ zIndex: 10,
3028
+ bgcolor: "rgba(255, 255, 255, 0.7)",
3029
+ "&:hover": {
3030
+ bgcolor: "rgba(255, 255, 255, 0.9)"
3031
+ },
3032
+ boxShadow: 1
3033
+ },
3034
+ children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_FullscreenExit.default, { fontSize: "small" }) : /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_Fullscreen.default, { fontSize: "small" })
3035
+ }
3036
+ ) }),
3037
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
3038
+ import_material30.Box,
3039
+ {
3040
+ sx: {
3041
+ flex: 1,
3042
+ display: "flex",
3043
+ overflow: "hidden",
3044
+ minHeight: editorMinHeight,
3045
+ position: "relative"
3046
+ },
3047
+ children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
3048
+ import_react6.default,
3049
+ {
3050
+ height: actualHeight,
3051
+ defaultLanguage: language,
3052
+ defaultValue: value,
3053
+ value: tsCode,
3054
+ onChange: handleCodeChange,
3055
+ onMount: handleEditorDidMount,
3056
+ theme: themeProp || "vs",
3057
+ options: defaultOptions,
3058
+ loading: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_material30.Box, { sx: { p: 2, textAlign: "center" }, children: "Loading Monaco Editor..." }),
3059
+ beforeMount: (monaco) => {
3060
+ console.log("CodeEditor: beforeMount called", { monaco: !!monaco });
3061
+ }
3062
+ }
3063
+ )
3064
+ }
3065
+ ),
3066
+ validationErrors.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
3067
+ import_material30.Alert,
3068
+ {
3069
+ severity: "error",
3070
+ sx: {
3071
+ position: "absolute",
3072
+ bottom: 8,
3073
+ left: 8,
3074
+ right: 8,
3075
+ zIndex: 20,
3076
+ boxShadow: 3,
3077
+ border: "1px solid",
3078
+ borderColor: "error.main",
3079
+ borderRadius: 1,
3080
+ maxHeight: "150px",
3081
+ overflow: "auto"
3082
+ },
3083
+ children: [
3084
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_material30.Box, { sx: { mb: 1, fontWeight: 600 }, children: "Please fix the following errors:" }),
3085
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_material30.Box, { component: "ul", sx: { m: 0, pl: 2 }, children: [
3086
+ validationErrors.slice(0, 3).map((error, index) => /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_material30.Box, { component: "li", sx: { fontSize: "0.85rem" }, children: [
3087
+ "Line ",
3088
+ error.startLineNumber,
3089
+ ": ",
3090
+ error.message
3091
+ ] }, index)),
3092
+ validationErrors.length > 3 && /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_material30.Box, { component: "li", sx: { fontSize: "0.85rem" }, children: [
3093
+ validationErrors.length - 3,
3094
+ " more error",
3095
+ validationErrors.length - 3 > 1 ? "s" : "",
3096
+ "..."
3097
+ ] })
3098
+ ] })
3099
+ ]
3100
+ }
3101
+ )
3102
+ ]
3103
+ }
3104
+ )
3105
+ }
3106
+ );
3107
+ };
3108
+
3109
+ // src/index.ts
3110
+ var import_reactflow3 = require("reactflow");
3111
+ // Annotate the CommonJS export names for ESM import in node:
3112
+ 0 && (module.exports = {
3113
+ Accordion,
3114
+ Alert,
3115
+ AppBar,
3116
+ AppLoading,
3117
+ Avatar,
3118
+ Background,
3119
+ BackgroundVariant,
3120
+ Badge,
3121
+ Box,
3122
+ Breadcrumbs,
3123
+ Button,
3124
+ ButtonGroup,
3125
+ Card,
3126
+ CardActions,
3127
+ CardContent,
3128
+ CardHeader,
3129
+ Checkbox,
3130
+ Chip,
3131
+ CircularProgress,
3132
+ CodeEditor,
3133
+ Collapse,
3134
+ ConnectionLineType,
3135
+ Container,
3136
+ Controls,
3137
+ Dialog,
3138
+ Divider,
3139
+ Drawer,
3140
+ Dropdown,
3141
+ EmptyState,
3142
+ FlowEditor,
3143
+ FormControl,
3144
+ FormControlLabel,
3145
+ FormHelperText,
3146
+ FormLabel,
3147
+ Grid,
3148
+ IconButton,
3149
+ InputAdornment,
3150
+ InputLabel,
3151
+ Link,
3152
+ List,
3153
+ ListItem,
3154
+ ListItemIcon,
3155
+ ListItemSecondaryAction,
3156
+ ListItemText,
3157
+ Loading,
3158
+ LoadingButton,
3159
+ Menu,
3160
+ MenuItem,
3161
+ MiniMap,
3162
+ Pagination,
3163
+ Panel,
3164
+ Paper,
3165
+ Progress,
3166
+ Radio,
3167
+ RadioGroup,
3168
+ SearchField,
3169
+ Selector,
3170
+ ServiceSelectorButton,
3171
+ Sidebar,
3172
+ SidebarItem,
3173
+ Snackbar,
3174
+ Stack,
3175
+ Step,
3176
+ StepButton,
3177
+ StepContent,
3178
+ StepLabel,
3179
+ Stepper,
3180
+ Switch,
3181
+ Tab,
3182
+ Table,
3183
+ TableHeader,
3184
+ TextField,
3185
+ ToggleButton,
3186
+ ToggleButtonGroup,
3187
+ Toolbar,
3188
+ Tooltip,
3189
+ Typography,
3190
+ WorkspaceSelectorButton,
3191
+ colors,
3192
+ theme
3193
+ });
3194
+ //# sourceMappingURL=index.js.map