@cere/cere-design-system 0.0.45 → 0.2.0

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.
Files changed (164) hide show
  1. package/README.md +76 -0
  2. package/dist/buttons.d.mts +119 -0
  3. package/dist/buttons.d.ts +119 -0
  4. package/dist/buttons.js +19 -0
  5. package/dist/buttons.js.map +1 -0
  6. package/dist/buttons.mjs +19 -0
  7. package/dist/buttons.mjs.map +1 -0
  8. package/dist/carousel.d.mts +51 -0
  9. package/dist/carousel.d.ts +51 -0
  10. package/dist/carousel.js +185 -0
  11. package/dist/carousel.js.map +1 -0
  12. package/dist/carousel.mjs +185 -0
  13. package/dist/carousel.mjs.map +1 -0
  14. package/dist/charts.d.mts +187 -0
  15. package/dist/charts.d.ts +187 -0
  16. package/dist/charts.js +13 -0
  17. package/dist/charts.js.map +1 -0
  18. package/dist/charts.mjs +13 -0
  19. package/dist/charts.mjs.map +1 -0
  20. package/dist/chunk-2EBCST6X.js +25 -0
  21. package/dist/chunk-2EBCST6X.js.map +1 -0
  22. package/dist/chunk-2KDN37PQ.js +486 -0
  23. package/dist/chunk-2KDN37PQ.js.map +1 -0
  24. package/dist/chunk-34LFXT6C.mjs +486 -0
  25. package/dist/chunk-34LFXT6C.mjs.map +1 -0
  26. package/dist/chunk-3KCXCVOX.mjs +411 -0
  27. package/dist/chunk-3KCXCVOX.mjs.map +1 -0
  28. package/dist/chunk-4OKTICU5.js +374 -0
  29. package/dist/chunk-4OKTICU5.js.map +1 -0
  30. package/dist/chunk-5ASG6G6U.mjs +40 -0
  31. package/dist/chunk-5ASG6G6U.mjs.map +1 -0
  32. package/dist/chunk-72TQ56EP.js +280 -0
  33. package/dist/chunk-72TQ56EP.js.map +1 -0
  34. package/dist/chunk-7KXKK2RE.js +43 -0
  35. package/dist/chunk-7KXKK2RE.js.map +1 -0
  36. package/dist/chunk-ARSCL4ZZ.js +111 -0
  37. package/dist/chunk-ARSCL4ZZ.js.map +1 -0
  38. package/dist/chunk-AWVNEU6R.mjs +1478 -0
  39. package/dist/chunk-AWVNEU6R.mjs.map +1 -0
  40. package/dist/chunk-BH4FNZKK.mjs +1472 -0
  41. package/dist/chunk-BH4FNZKK.mjs.map +1 -0
  42. package/dist/chunk-BIZK6FUD.js +37 -0
  43. package/dist/chunk-BIZK6FUD.js.map +1 -0
  44. package/dist/chunk-BOQPWZIB.mjs +147 -0
  45. package/dist/chunk-BOQPWZIB.mjs.map +1 -0
  46. package/dist/chunk-BT7XUTT5.mjs +392 -0
  47. package/dist/chunk-BT7XUTT5.mjs.map +1 -0
  48. package/dist/chunk-D7D25O6E.mjs +280 -0
  49. package/dist/chunk-D7D25O6E.mjs.map +1 -0
  50. package/dist/chunk-DRGMEIPT.mjs +162 -0
  51. package/dist/chunk-DRGMEIPT.mjs.map +1 -0
  52. package/dist/chunk-DZXNYLVG.js +392 -0
  53. package/dist/chunk-DZXNYLVG.js.map +1 -0
  54. package/dist/chunk-GR52ENYI.mjs +527 -0
  55. package/dist/chunk-GR52ENYI.mjs.map +1 -0
  56. package/dist/chunk-GTBKQXXI.js +1472 -0
  57. package/dist/chunk-GTBKQXXI.js.map +1 -0
  58. package/dist/chunk-HJ24WKU4.js +120 -0
  59. package/dist/chunk-HJ24WKU4.js.map +1 -0
  60. package/dist/chunk-JBHRAAN3.js +31 -0
  61. package/dist/chunk-JBHRAAN3.js.map +1 -0
  62. package/dist/chunk-KKIKOIMP.js +1478 -0
  63. package/dist/chunk-KKIKOIMP.js.map +1 -0
  64. package/dist/chunk-LVJSKRX3.js +147 -0
  65. package/dist/chunk-LVJSKRX3.js.map +1 -0
  66. package/dist/chunk-OWWDNDF4.js +40 -0
  67. package/dist/chunk-OWWDNDF4.js.map +1 -0
  68. package/dist/chunk-PFZZJZ64.js +162 -0
  69. package/dist/chunk-PFZZJZ64.js.map +1 -0
  70. package/dist/chunk-PHMNZK2R.mjs +18 -0
  71. package/dist/chunk-PHMNZK2R.mjs.map +1 -0
  72. package/dist/chunk-POCAW2G4.mjs +111 -0
  73. package/dist/chunk-POCAW2G4.mjs.map +1 -0
  74. package/dist/chunk-QBCRH7YF.mjs +37 -0
  75. package/dist/chunk-QBCRH7YF.mjs.map +1 -0
  76. package/dist/chunk-QCFLZ7X3.js +527 -0
  77. package/dist/chunk-QCFLZ7X3.js.map +1 -0
  78. package/dist/chunk-SG2TD7FQ.mjs +374 -0
  79. package/dist/chunk-SG2TD7FQ.mjs.map +1 -0
  80. package/dist/chunk-SSFALO6S.mjs +120 -0
  81. package/dist/chunk-SSFALO6S.mjs.map +1 -0
  82. package/dist/chunk-U2QHFISG.js +18 -0
  83. package/dist/chunk-U2QHFISG.js.map +1 -0
  84. package/dist/chunk-UPGFBPFX.mjs +25 -0
  85. package/dist/chunk-UPGFBPFX.mjs.map +1 -0
  86. package/dist/chunk-WC2TCWXK.mjs +445 -0
  87. package/dist/chunk-WC2TCWXK.mjs.map +1 -0
  88. package/dist/chunk-XZZZ4MZV.js +445 -0
  89. package/dist/chunk-XZZZ4MZV.js.map +1 -0
  90. package/dist/chunk-YCDCQSYH.js +411 -0
  91. package/dist/chunk-YCDCQSYH.js.map +1 -0
  92. package/dist/chunk-ZDAZYIXB.mjs +43 -0
  93. package/dist/chunk-ZDAZYIXB.mjs.map +1 -0
  94. package/dist/chunk-ZP26PGMS.mjs +31 -0
  95. package/dist/chunk-ZP26PGMS.mjs.map +1 -0
  96. package/dist/feedback.d.mts +368 -0
  97. package/dist/feedback.d.ts +368 -0
  98. package/dist/feedback.js +43 -0
  99. package/dist/feedback.js.map +1 -0
  100. package/dist/feedback.mjs +43 -0
  101. package/dist/feedback.mjs.map +1 -0
  102. package/dist/fonts/HumanSans-BlackOblique.otf +0 -0
  103. package/dist/fonts/HumanSans-Thin.otf +0 -0
  104. package/dist/fonts/HumanSans-ThinOblique.otf +0 -0
  105. package/dist/fonts/human-sans-font.css +88 -0
  106. package/dist/fonts/human-sans.css +3 -0
  107. package/dist/fonts/inter.css +3 -0
  108. package/dist/icons.d.mts +21 -0
  109. package/dist/icons.d.ts +21 -0
  110. package/dist/icons.js +23 -0
  111. package/dist/icons.js.map +1 -0
  112. package/dist/icons.mjs +23 -0
  113. package/dist/icons.mjs.map +1 -0
  114. package/dist/index.d.mts +196 -3082
  115. package/dist/index.d.ts +196 -3082
  116. package/dist/index.js +253 -10082
  117. package/dist/index.js.map +1 -1
  118. package/dist/index.mjs +229 -10017
  119. package/dist/index.mjs.map +1 -1
  120. package/dist/inputs.d.mts +129 -0
  121. package/dist/inputs.d.ts +129 -0
  122. package/dist/inputs.js +43 -0
  123. package/dist/inputs.js.map +1 -0
  124. package/dist/inputs.mjs +43 -0
  125. package/dist/inputs.mjs.map +1 -0
  126. package/dist/layout.d.mts +681 -0
  127. package/dist/layout.d.ts +681 -0
  128. package/dist/layout.js +98 -0
  129. package/dist/layout.js.map +1 -0
  130. package/dist/layout.mjs +98 -0
  131. package/dist/layout.mjs.map +1 -0
  132. package/dist/navigation.d.mts +611 -0
  133. package/dist/navigation.d.ts +611 -0
  134. package/dist/navigation.js +54 -0
  135. package/dist/navigation.js.map +1 -0
  136. package/dist/navigation.mjs +54 -0
  137. package/dist/navigation.mjs.map +1 -0
  138. package/dist/third-party.d.mts +113 -0
  139. package/dist/third-party.d.ts +113 -0
  140. package/dist/third-party.js +7 -0
  141. package/dist/third-party.js.map +1 -0
  142. package/dist/third-party.mjs +7 -0
  143. package/dist/third-party.mjs.map +1 -0
  144. package/dist/tokens.css +45 -71
  145. package/dist/utilities.d.mts +39 -0
  146. package/dist/utilities.d.ts +39 -0
  147. package/dist/utilities.js +17 -0
  148. package/dist/utilities.js.map +1 -0
  149. package/dist/utilities.mjs +17 -0
  150. package/dist/utilities.mjs.map +1 -0
  151. package/package.json +76 -8
  152. package/dist/index.css +0 -79
  153. package/dist/index.css.map +0 -1
  154. /package/dist/{HumanSans-Black-C4YJONK7.otf → fonts/HumanSans-Black.otf} +0 -0
  155. /package/dist/{HumanSans-Bold-4EAJ3L3T.otf → fonts/HumanSans-Bold.otf} +0 -0
  156. /package/dist/{HumanSans-BoldOblique-4D325T4F.otf → fonts/HumanSans-BoldOblique.otf} +0 -0
  157. /package/dist/{HumanSans-ExtraLight-VL7DEKQ4.otf → fonts/HumanSans-ExtraLight.otf} +0 -0
  158. /package/dist/{HumanSans-ExtraLightOblique-VK2JTUXF.otf → fonts/HumanSans-ExtraLightOblique.otf} +0 -0
  159. /package/dist/{HumanSans-Light-YV7AFKRB.otf → fonts/HumanSans-Light.otf} +0 -0
  160. /package/dist/{HumanSans-LightOblique-VIXV7QA6.otf → fonts/HumanSans-LightOblique.otf} +0 -0
  161. /package/dist/{HumanSans-Medium-UULJ3PIR.otf → fonts/HumanSans-Medium.otf} +0 -0
  162. /package/dist/{HumanSans-MediumOblique-M7FHDZRS.otf → fonts/HumanSans-MediumOblique.otf} +0 -0
  163. /package/dist/{HumanSans-Regular-QMFEP3F6.otf → fonts/HumanSans-Regular.otf} +0 -0
  164. /package/dist/{HumanSans-RegularOblique-YPKQJAAM.otf → fonts/HumanSans-RegularOblique.otf} +0 -0
@@ -0,0 +1,411 @@
1
+ // src/components/third-party/CodeEditor.tsx
2
+ import { useCallback, useEffect, useState, useRef } from "react";
3
+ import Editor from "@monaco-editor/react";
4
+ import Box from "@mui/material/Box";
5
+ import IconButton from "@mui/material/IconButton";
6
+ import Tooltip from "@mui/material/Tooltip";
7
+ import FullscreenIcon from "@mui/icons-material/Fullscreen";
8
+ import FullscreenExitIcon from "@mui/icons-material/FullscreenExit";
9
+ import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline";
10
+ import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
11
+ import ExpandLessIcon from "@mui/icons-material/ExpandLess";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
13
+ var configureTypeScript = (monaco) => {
14
+ monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
15
+ target: monaco.languages.typescript.ScriptTarget.ES2020,
16
+ allowNonTsExtensions: true,
17
+ moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,
18
+ module: monaco.languages.typescript.ModuleKind.ESNext,
19
+ noEmit: false,
20
+ lib: ["es2020", "dom"],
21
+ noUnusedLocals: false,
22
+ noUnusedParameters: false,
23
+ noImplicitAny: false,
24
+ noImplicitReturns: false,
25
+ noFallthroughCasesInSwitch: false,
26
+ // Treat every file as a module so top-level declarations don't clash
27
+ // across files in the workspace (prevents false "Cannot redeclare" errors).
28
+ moduleDetection: 3
29
+ // ts.ModuleDetectionKind.Force
30
+ });
31
+ monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
32
+ noSemanticValidation: false,
33
+ noSyntaxValidation: false,
34
+ noSuggestionDiagnostics: true,
35
+ diagnosticCodesToIgnore: [
36
+ 6133,
37
+ // 'x' is declared but its value is never read
38
+ 6196
39
+ // 'x' is declared but its value is never read (different variant)
40
+ ]
41
+ });
42
+ };
43
+ var CodeEditor = ({
44
+ value,
45
+ onChange,
46
+ language = "typescript",
47
+ height = "400px",
48
+ minHeight,
49
+ theme: themeProp,
50
+ lineNumbers = "on",
51
+ options,
52
+ onMount,
53
+ onValidate,
54
+ editorRef,
55
+ monacoRef,
56
+ onFullscreenChange,
57
+ containerProps,
58
+ typeDefinitions,
59
+ externalModelManagement = false
60
+ }) => {
61
+ const [isEditorReady, setIsEditorReady] = useState(false);
62
+ const [validationErrors, setValidationErrors] = useState([]);
63
+ const [isFullscreen, setIsFullscreen] = useState(false);
64
+ const [tsCode, setTsCode] = useState(value);
65
+ const [actualHeight, setActualHeight] = useState(
66
+ typeof height === "number" ? `${height}px` : height
67
+ );
68
+ const [showProblems, setShowProblems] = useState(false);
69
+ const [hasUserToggledProblems, setHasUserToggledProblems] = useState(false);
70
+ useEffect(() => {
71
+ if (hasUserToggledProblems) return;
72
+ if (validationErrors.length > 0) {
73
+ setShowProblems(true);
74
+ } else {
75
+ setShowProblems(false);
76
+ }
77
+ }, [validationErrors, hasUserToggledProblems]);
78
+ const internalEditorRef = useRef(null);
79
+ const internalMonacoRef = useRef(null);
80
+ const finalEditorRef = editorRef || internalEditorRef;
81
+ const finalMonacoRef = monacoRef || internalMonacoRef;
82
+ useEffect(() => {
83
+ if (isFullscreen) {
84
+ setActualHeight("calc(100vh - 80px)");
85
+ } else {
86
+ setActualHeight(typeof height === "number" ? `${height}px` : height);
87
+ }
88
+ }, [height, isFullscreen]);
89
+ const toggleFullscreen = useCallback(() => {
90
+ const newFullscreenState = !isFullscreen;
91
+ setIsFullscreen(newFullscreenState);
92
+ if (onFullscreenChange) {
93
+ onFullscreenChange(newFullscreenState);
94
+ }
95
+ }, [isFullscreen, onFullscreenChange]);
96
+ const gotoMarker = useCallback(
97
+ (marker) => {
98
+ const ed = finalEditorRef?.current;
99
+ if (!ed) return;
100
+ const position = { lineNumber: marker.startLineNumber, column: marker.startColumn || 1 };
101
+ try {
102
+ ed.revealPositionInCenter(position);
103
+ ed.setPosition(position);
104
+ ed.focus();
105
+ } catch (e) {
106
+ console.error("CodeEditor: Failed to navigate to marker", e);
107
+ }
108
+ },
109
+ [finalEditorRef]
110
+ );
111
+ useEffect(() => {
112
+ if (!isFullscreen) return;
113
+ function escapeHandler(event) {
114
+ if (event.key === "Escape") {
115
+ event.preventDefault();
116
+ event.stopPropagation();
117
+ setIsFullscreen(false);
118
+ if (onFullscreenChange) {
119
+ onFullscreenChange(false);
120
+ }
121
+ }
122
+ }
123
+ window.addEventListener("keydown", escapeHandler, { capture: true });
124
+ return () => {
125
+ window.removeEventListener("keydown", escapeHandler, { capture: true });
126
+ };
127
+ }, [isFullscreen, onFullscreenChange]);
128
+ const handleEditorDidMount = useCallback(
129
+ (editor, monaco) => {
130
+ console.log("CodeEditor: onMount called", { editor: !!editor, monaco: !!monaco });
131
+ try {
132
+ configureTypeScript(monaco);
133
+ } catch (e) {
134
+ console.error("CodeEditor: Failed to configure TypeScript", e);
135
+ }
136
+ if (finalEditorRef) {
137
+ finalEditorRef.current = editor;
138
+ }
139
+ if (finalMonacoRef) {
140
+ finalMonacoRef.current = monaco;
141
+ }
142
+ setIsEditorReady(true);
143
+ console.log("CodeEditor: Editor ready");
144
+ try {
145
+ editor.addCommand(monaco.KeyCode.Escape, () => {
146
+ if (isFullscreen) {
147
+ setIsFullscreen(false);
148
+ if (onFullscreenChange) {
149
+ onFullscreenChange(false);
150
+ }
151
+ return true;
152
+ }
153
+ return false;
154
+ });
155
+ editor.onDidChangeModelDecorations(() => {
156
+ const model2 = editor.getModel();
157
+ if (model2 && onValidate) {
158
+ const markers = monaco.editor.getModelMarkers({ resource: model2.uri });
159
+ onValidate(markers);
160
+ setValidationErrors(markers);
161
+ }
162
+ });
163
+ const model = editor.getModel();
164
+ if (model && onValidate) {
165
+ const markers = monaco.editor.getModelMarkers({ resource: model.uri });
166
+ onValidate(markers);
167
+ setValidationErrors(markers);
168
+ }
169
+ } catch (e) {
170
+ console.error("CodeEditor: Error setting up editor callbacks", e);
171
+ }
172
+ if (onMount) {
173
+ try {
174
+ onMount(editor, monaco);
175
+ } catch (e) {
176
+ console.error("CodeEditor: Error in custom onMount", e);
177
+ }
178
+ }
179
+ },
180
+ [isFullscreen, onFullscreenChange, onValidate, onMount, finalEditorRef, finalMonacoRef]
181
+ );
182
+ useEffect(() => {
183
+ if (!isEditorReady || !finalMonacoRef?.current || !typeDefinitions) return;
184
+ const monaco = finalMonacoRef.current;
185
+ const definitions = Array.isArray(typeDefinitions) ? typeDefinitions : [typeDefinitions];
186
+ const uris = [];
187
+ try {
188
+ definitions.forEach((def, index) => {
189
+ if (def && def.trim()) {
190
+ const uri = `ts:filename/custom-types-${index}.d.ts`;
191
+ uris.push(uri);
192
+ monaco.languages.typescript.typescriptDefaults.addExtraLib(def, uri);
193
+ }
194
+ });
195
+ } catch (error) {
196
+ console.error("CodeEditor: Error adding type definitions:", error);
197
+ }
198
+ }, [isEditorReady, finalMonacoRef, typeDefinitions]);
199
+ const handleCodeChange = (newValue) => {
200
+ const valueStr = newValue || "";
201
+ setTsCode(valueStr);
202
+ onChange(valueStr);
203
+ };
204
+ useEffect(() => {
205
+ if (externalModelManagement) return;
206
+ if (value !== tsCode) {
207
+ setTsCode(value);
208
+ if (isEditorReady && finalEditorRef?.current) {
209
+ const editor = finalEditorRef.current;
210
+ const currentValue = editor.getValue();
211
+ if (currentValue !== value) {
212
+ editor.setValue(value);
213
+ }
214
+ }
215
+ }
216
+ }, [value, tsCode, isEditorReady, finalEditorRef, externalModelManagement]);
217
+ const editorMinHeight = minHeight ? typeof minHeight === "number" ? `${minHeight}px` : minHeight : "400px";
218
+ const defaultOptions = {
219
+ lineNumbers,
220
+ minimap: { enabled: false },
221
+ readOnly: false,
222
+ wordWrap: "on",
223
+ fontSize: 14,
224
+ fontFamily: 'Monaco, Menlo, "Ubuntu Mono", Consolas, "source-code-pro", monospace',
225
+ automaticLayout: true,
226
+ scrollBeyondLastLine: false,
227
+ theme: themeProp || "vs",
228
+ ...options
229
+ };
230
+ return /* @__PURE__ */ jsx(
231
+ Box,
232
+ {
233
+ sx: {
234
+ display: "flex",
235
+ flexDirection: "column",
236
+ height: isFullscreen ? "100vh" : "100%",
237
+ minHeight: isFullscreen ? "100vh" : editorMinHeight,
238
+ position: isFullscreen ? "fixed" : "relative",
239
+ top: isFullscreen ? 0 : "auto",
240
+ left: isFullscreen ? 0 : "auto",
241
+ right: isFullscreen ? 0 : "auto",
242
+ bottom: isFullscreen ? 0 : "auto",
243
+ zIndex: isFullscreen ? 9999 : "auto",
244
+ bgcolor: "background.paper",
245
+ pt: isFullscreen ? "80px" : 0,
246
+ // Add padding top in fullscreen to account for header (64px) + spacing (16px)
247
+ px: isFullscreen ? 2 : 0,
248
+ pb: isFullscreen ? 2 : 0,
249
+ overflow: isFullscreen ? "hidden" : "visible"
250
+ },
251
+ children: /* @__PURE__ */ jsxs(
252
+ Box,
253
+ {
254
+ sx: {
255
+ flex: 1,
256
+ border: 1,
257
+ borderColor: validationErrors.length > 0 ? "error.main" : "divider",
258
+ borderRadius: 1,
259
+ minHeight: editorMinHeight,
260
+ overflow: "hidden",
261
+ position: "relative",
262
+ display: "flex",
263
+ flexDirection: "column"
264
+ },
265
+ ...containerProps,
266
+ children: [
267
+ /* @__PURE__ */ jsx(Tooltip, { title: isFullscreen ? "Exit Fullscreen" : "Fullscreen", children: /* @__PURE__ */ jsx(
268
+ IconButton,
269
+ {
270
+ onClick: toggleFullscreen,
271
+ size: "small",
272
+ sx: {
273
+ position: isFullscreen ? "fixed" : "absolute",
274
+ top: isFullscreen ? 72 : 8,
275
+ // Position below header in fullscreen mode (header is ~64px)
276
+ right: isFullscreen ? 16 : 8,
277
+ zIndex: 1e4,
278
+ // Ensure it's above other elements
279
+ bgcolor: "rgba(255, 255, 255, 0.7)",
280
+ "&:hover": {
281
+ bgcolor: "rgba(255, 255, 255, 0.9)"
282
+ },
283
+ boxShadow: 1
284
+ },
285
+ children: isFullscreen ? /* @__PURE__ */ jsx(FullscreenExitIcon, { fontSize: "small" }) : /* @__PURE__ */ jsx(FullscreenIcon, { fontSize: "small" })
286
+ }
287
+ ) }),
288
+ /* @__PURE__ */ jsx(
289
+ Box,
290
+ {
291
+ sx: {
292
+ flex: 1,
293
+ display: "flex",
294
+ flexDirection: "column",
295
+ overflow: "hidden",
296
+ minHeight: editorMinHeight,
297
+ position: "relative",
298
+ height: isFullscreen ? "100%" : actualHeight
299
+ },
300
+ children: /* @__PURE__ */ jsx(
301
+ Editor,
302
+ {
303
+ height: "100%",
304
+ defaultLanguage: language,
305
+ defaultValue: value,
306
+ value: tsCode,
307
+ onChange: handleCodeChange,
308
+ onMount: handleEditorDidMount,
309
+ theme: themeProp || "vs",
310
+ options: defaultOptions,
311
+ loading: /* @__PURE__ */ jsx(Box, { sx: { p: 2, textAlign: "center" }, children: "Loading Monaco Editor..." }),
312
+ beforeMount: (monaco) => {
313
+ console.log("CodeEditor: beforeMount called", { monaco: !!monaco });
314
+ }
315
+ }
316
+ )
317
+ }
318
+ ),
319
+ validationErrors.length > 0 && /* @__PURE__ */ jsxs(
320
+ Box,
321
+ {
322
+ sx: {
323
+ borderTop: 1,
324
+ borderColor: "divider",
325
+ bgcolor: "background.default",
326
+ display: "flex",
327
+ flexDirection: "column",
328
+ maxHeight: showProblems ? 180 : 40,
329
+ minHeight: 40,
330
+ transition: "max-height 0.2s ease"
331
+ },
332
+ children: [
333
+ /* @__PURE__ */ jsxs(
334
+ Box,
335
+ {
336
+ sx: {
337
+ display: "flex",
338
+ alignItems: "center",
339
+ px: 1,
340
+ py: 0.5,
341
+ gap: 1,
342
+ borderBottom: showProblems ? "1px solid" : "none",
343
+ borderColor: "divider",
344
+ fontSize: "0.875rem",
345
+ color: "text.secondary"
346
+ },
347
+ children: [
348
+ /* @__PURE__ */ jsx(ErrorOutlineIcon, { color: "error", fontSize: "small" }),
349
+ /* @__PURE__ */ jsx(Box, { sx: { fontWeight: 600, color: "text.primary" }, children: "Problems" }),
350
+ /* @__PURE__ */ jsxs(Box, { sx: { ml: 1 }, children: [
351
+ validationErrors.length,
352
+ " error",
353
+ validationErrors.length > 1 ? "s" : ""
354
+ ] }),
355
+ /* @__PURE__ */ jsx(Box, { sx: { flex: 1 } }),
356
+ /* @__PURE__ */ jsx(
357
+ IconButton,
358
+ {
359
+ size: "small",
360
+ "aria-label": "Toggle problems panel",
361
+ onClick: () => {
362
+ setHasUserToggledProblems(true);
363
+ setShowProblems((s) => !s);
364
+ },
365
+ children: showProblems ? /* @__PURE__ */ jsx(ExpandMoreIcon, { fontSize: "small" }) : /* @__PURE__ */ jsx(ExpandLessIcon, { fontSize: "small" })
366
+ }
367
+ )
368
+ ]
369
+ }
370
+ ),
371
+ showProblems && /* @__PURE__ */ jsx(Box, { sx: { overflow: "auto" }, children: validationErrors.map((error, index) => /* @__PURE__ */ jsxs(
372
+ Box,
373
+ {
374
+ onClick: () => gotoMarker(error),
375
+ sx: {
376
+ display: "flex",
377
+ alignItems: "center",
378
+ px: 1.5,
379
+ py: 0.75,
380
+ gap: 1,
381
+ cursor: "pointer",
382
+ "&:hover": { bgcolor: "action.hover" },
383
+ borderBottom: "1px dashed",
384
+ borderColor: "divider",
385
+ fontSize: "0.85rem"
386
+ },
387
+ children: [
388
+ /* @__PURE__ */ jsx(ErrorOutlineIcon, { color: "error", sx: { fontSize: 18 } }),
389
+ /* @__PURE__ */ jsxs(Box, { sx: { color: "text.secondary", width: 64 }, children: [
390
+ "Line ",
391
+ error.startLineNumber
392
+ ] }),
393
+ /* @__PURE__ */ jsx(Box, { sx: { color: "text.primary", flex: 1, minWidth: 0 }, children: error.message })
394
+ ]
395
+ },
396
+ `${error.startLineNumber}-${error.startColumn}-${index}`
397
+ )) })
398
+ ]
399
+ }
400
+ )
401
+ ]
402
+ }
403
+ )
404
+ }
405
+ );
406
+ };
407
+
408
+ export {
409
+ CodeEditor
410
+ };
411
+ //# sourceMappingURL=chunk-3KCXCVOX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/third-party/CodeEditor.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState, useRef } from 'react';\nimport Editor, { Monaco } from '@monaco-editor/react';\nimport Box from '@mui/material/Box';\nimport type { BoxProps } from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport FullscreenIcon from '@mui/icons-material/Fullscreen';\nimport FullscreenExitIcon from '@mui/icons-material/FullscreenExit';\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport ExpandLessIcon from '@mui/icons-material/ExpandLess';\nimport type { editor } from 'monaco-editor';\n\nexport type CodeEditorLanguage =\n | 'typescript'\n | 'javascript'\n | 'json'\n | 'html'\n | 'css'\n | 'python'\n | 'yaml'\n | 'markdown'\n | 'sql'\n | 'xml'\n | 'plaintext';\n\nexport interface CodeEditorProps {\n /**\n * Current value of the editor\n */\n value: string;\n /**\n * Callback when value changes\n */\n onChange: (value: string) => void;\n /**\n * Programming language\n * @default 'typescript'\n */\n language?: CodeEditorLanguage;\n /**\n * Height of the editor\n * @default '400px'\n */\n height?: string | number;\n /**\n * Minimum height\n */\n minHeight?: string | number;\n /**\n * Theme ('light' | 'dark' | 'vs-dark' | 'hc-black')\n * If not provided, will use theme from design system\n */\n theme?: string;\n /**\n * Show line numbers\n * @default 'on'\n */\n lineNumbers?: 'on' | 'off' | 'relative' | 'interval';\n /**\n * Editor options (monaco editor options)\n */\n options?: editor.IStandaloneEditorConstructionOptions;\n /**\n * Callback when editor is mounted\n */\n onMount?: (editor: editor.IStandaloneCodeEditor, monaco: Monaco) => void;\n /**\n * Callback for validation errors\n */\n onValidate?: (markers: editor.IMarker[]) => void;\n /**\n * Ref to editor instance\n */\n editorRef?: React.MutableRefObject<editor.IStandaloneCodeEditor | null>;\n /**\n * Ref to Monaco instance\n */\n monacoRef?: React.MutableRefObject<Monaco | null>;\n /**\n * Callback when fullscreen state changes\n */\n onFullscreenChange?: (isFullscreen: boolean) => void;\n /**\n * Props for the container Box.\n */\n containerProps?: BoxProps;\n /**\n * Additional TypeScript type definitions to add to the editor context.\n * Can be a string with type definitions or an array of type definition strings.\n * Each string will be added as a separate extra lib to Monaco.\n *\n * @example\n * ```tsx\n * <CodeEditor\n * value={code}\n * onChange={setCode}\n * typeDefinitions={`\n * declare interface MyCustomType {\n * id: string;\n * name: string;\n * }\n * `}\n * />\n * ```\n */\n typeDefinitions?: string | string[];\n /**\n * When true, the editor skips internal value syncing and lets an external\n * source (e.g. useCodeEditorWorkspace) manage Monaco models directly.\n * The `value` prop is still used as the initial/display value but won't\n * be force-synced to the editor.\n * @default false\n */\n externalModelManagement?: boolean;\n}\n\n// Monaco Editor will use the local version from node_modules automatically\n// No need to configure loader.config() - @monaco-editor/react handles it\n\n// Configure TypeScript settings when Monaco is loaded\nexport const configureTypeScript = (monaco: Monaco) => {\n // Configure TypeScript settings\n monaco.languages.typescript.typescriptDefaults.setCompilerOptions({\n target: monaco.languages.typescript.ScriptTarget.ES2020,\n allowNonTsExtensions: true,\n moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,\n module: monaco.languages.typescript.ModuleKind.ESNext,\n noEmit: false,\n lib: ['es2020', 'dom'],\n noUnusedLocals: false,\n noUnusedParameters: false,\n noImplicitAny: false,\n noImplicitReturns: false,\n noFallthroughCasesInSwitch: false,\n // Treat every file as a module so top-level declarations don't clash\n // across files in the workspace (prevents false \"Cannot redeclare\" errors).\n moduleDetection: 3, // ts.ModuleDetectionKind.Force\n });\n\n monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({\n noSemanticValidation: false,\n noSyntaxValidation: false,\n noSuggestionDiagnostics: true,\n diagnosticCodesToIgnore: [\n 6133, // 'x' is declared but its value is never read\n 6196, // 'x' is declared but its value is never read (different variant)\n ],\n });\n};\n\n/**\n * CodeEditor component - wrapper around Monaco Editor matching dynamic-indexer-client implementation\n *\n * @example\n * ```tsx\n * <CodeEditor\n * value={code}\n * onChange={setCode}\n * language=\"typescript\"\n * height=\"500px\"\n * onValidate={(markers) => console.log('Errors:', markers)}\n * />\n * ```\n */\nexport const CodeEditor: React.FC<CodeEditorProps> = ({\n value,\n onChange,\n language = 'typescript',\n height = '400px',\n minHeight,\n theme: themeProp,\n lineNumbers = 'on',\n options,\n onMount,\n onValidate,\n editorRef,\n monacoRef,\n onFullscreenChange,\n containerProps,\n typeDefinitions,\n externalModelManagement = false,\n}) => {\n const [isEditorReady, setIsEditorReady] = useState(false);\n const [validationErrors, setValidationErrors] = useState<editor.IMarker[]>([]);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [tsCode, setTsCode] = useState<string>(value);\n const [actualHeight, setActualHeight] = useState<string>(\n typeof height === 'number' ? `${height}px` : height\n );\n const [showProblems, setShowProblems] = useState(false);\n const [hasUserToggledProblems, setHasUserToggledProblems] = useState(false);\n\n // Auto-open the Problems panel only until the user manually toggles it.\n useEffect(() => {\n if (hasUserToggledProblems) return; // respect user's choice after first toggle\n if (validationErrors.length > 0) {\n setShowProblems(true);\n } else {\n setShowProblems(false);\n }\n }, [validationErrors, hasUserToggledProblems]);\n\n const internalEditorRef = useRef<editor.IStandaloneCodeEditor | null>(null);\n const internalMonacoRef = useRef<Monaco | null>(null);\n\n // Use provided refs or internal refs\n const finalEditorRef = editorRef || internalEditorRef;\n const finalMonacoRef = monacoRef || internalMonacoRef;\n\n useEffect(() => {\n if (isFullscreen) {\n // Account for header height (64px) + padding (16px) = 80px\n setActualHeight('calc(100vh - 80px)');\n } else {\n setActualHeight(typeof height === 'number' ? `${height}px` : height);\n }\n }, [height, isFullscreen]);\n\n // Toggle fullscreen\n const toggleFullscreen = useCallback(() => {\n const newFullscreenState = !isFullscreen;\n setIsFullscreen(newFullscreenState);\n if (onFullscreenChange) {\n onFullscreenChange(newFullscreenState);\n }\n }, [isFullscreen, onFullscreenChange]);\n\n // Jump to a marker position in the editor\n const gotoMarker = useCallback(\n (marker: editor.IMarker) => {\n const ed = finalEditorRef?.current;\n if (!ed) return;\n const position = { lineNumber: marker.startLineNumber, column: marker.startColumn || 1 };\n try {\n ed.revealPositionInCenter(position);\n ed.setPosition(position);\n ed.focus();\n } catch (e) {\n console.error('CodeEditor: Failed to navigate to marker', e);\n }\n },\n [finalEditorRef]\n );\n\n // Handle ESC key for fullscreen exit\n useEffect(() => {\n if (!isFullscreen) return;\n\n function escapeHandler(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n\n setIsFullscreen(false);\n if (onFullscreenChange) {\n onFullscreenChange(false);\n }\n }\n }\n\n window.addEventListener('keydown', escapeHandler, { capture: true });\n\n return () => {\n window.removeEventListener('keydown', escapeHandler, { capture: true });\n };\n }, [isFullscreen, onFullscreenChange]);\n\n const handleEditorDidMount = useCallback(\n (editor: editor.IStandaloneCodeEditor, monaco: Monaco) => {\n console.log('CodeEditor: onMount called', { editor: !!editor, monaco: !!monaco });\n\n try {\n // Configure TypeScript settings when Monaco is loaded\n configureTypeScript(monaco);\n } catch (e) {\n console.error('CodeEditor: Failed to configure TypeScript', e);\n }\n\n if (finalEditorRef) {\n finalEditorRef.current = editor;\n }\n if (finalMonacoRef) {\n finalMonacoRef.current = monaco;\n }\n\n setIsEditorReady(true);\n console.log('CodeEditor: Editor ready');\n\n try {\n // Add ESC key binding directly in editor\n editor.addCommand(monaco.KeyCode.Escape, () => {\n if (isFullscreen) {\n setIsFullscreen(false);\n if (onFullscreenChange) {\n onFullscreenChange(false);\n }\n return true; // Command handled\n }\n return false; // Let default behavior work when not fullscreen\n });\n\n // Add validation callback\n editor.onDidChangeModelDecorations(() => {\n const model = editor.getModel();\n if (model && onValidate) {\n const markers = monaco.editor.getModelMarkers({ resource: model.uri });\n onValidate(markers);\n setValidationErrors(markers);\n }\n });\n\n // Also check initial markers\n const model = editor.getModel();\n if (model && onValidate) {\n const markers = monaco.editor.getModelMarkers({ resource: model.uri });\n onValidate(markers);\n setValidationErrors(markers);\n }\n } catch (e) {\n console.error('CodeEditor: Error setting up editor callbacks', e);\n }\n\n // Call custom onMount if provided\n if (onMount) {\n try {\n onMount(editor, monaco);\n } catch (e) {\n console.error('CodeEditor: Error in custom onMount', e);\n }\n }\n },\n [isFullscreen, onFullscreenChange, onValidate, onMount, finalEditorRef, finalMonacoRef]\n );\n\n // Add custom type definitions when Monaco is ready and typeDefinitions change\n useEffect(() => {\n if (!isEditorReady || !finalMonacoRef?.current || !typeDefinitions) return;\n\n const monaco = finalMonacoRef.current;\n const definitions = Array.isArray(typeDefinitions) ? typeDefinitions : [typeDefinitions];\n const uris: string[] = [];\n\n try {\n // Add each type definition as a separate extra lib\n definitions.forEach((def: string, index: number) => {\n if (def && def.trim()) {\n const uri = `ts:filename/custom-types-${index}.d.ts`;\n uris.push(uri);\n monaco.languages.typescript.typescriptDefaults.addExtraLib(def, uri);\n }\n });\n } catch (error) {\n console.error('CodeEditor: Error adding type definitions:', error);\n }\n\n // Note: Monaco doesn't have a direct removeExtraLib method\n // The definitions will be replaced when the component updates with new definitions\n // This is acceptable as extra libs are additive and don't cause conflicts\n }, [isEditorReady, finalMonacoRef, typeDefinitions]);\n\n const handleCodeChange = (newValue: string | undefined) => {\n const valueStr = newValue || '';\n setTsCode(valueStr);\n onChange(valueStr);\n };\n\n // Sync external value prop with internal state\n // Skip when externalModelManagement is true (workspace hook manages models)\n useEffect(() => {\n if (externalModelManagement) return;\n if (value !== tsCode) {\n setTsCode(value);\n if (isEditorReady && finalEditorRef?.current) {\n const editor = finalEditorRef.current;\n const currentValue = editor.getValue();\n if (currentValue !== value) {\n editor.setValue(value);\n }\n }\n }\n }, [value, tsCode, isEditorReady, finalEditorRef, externalModelManagement]);\n\n const editorMinHeight = minHeight\n ? typeof minHeight === 'number'\n ? `${minHeight}px`\n : minHeight\n : '400px';\n\n const defaultOptions: editor.IStandaloneEditorConstructionOptions = {\n lineNumbers,\n minimap: { enabled: false },\n readOnly: false,\n wordWrap: 'on',\n fontSize: 14,\n fontFamily: 'Monaco, Menlo, \"Ubuntu Mono\", Consolas, \"source-code-pro\", monospace',\n automaticLayout: true,\n scrollBeyondLastLine: false,\n theme: themeProp || 'vs',\n ...options,\n };\n\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: isFullscreen ? '100vh' : '100%',\n minHeight: isFullscreen ? '100vh' : editorMinHeight,\n position: isFullscreen ? 'fixed' : 'relative',\n top: isFullscreen ? 0 : 'auto',\n left: isFullscreen ? 0 : 'auto',\n right: isFullscreen ? 0 : 'auto',\n bottom: isFullscreen ? 0 : 'auto',\n zIndex: isFullscreen ? 9999 : 'auto',\n bgcolor: 'background.paper',\n pt: isFullscreen ? '80px' : 0, // Add padding top in fullscreen to account for header (64px) + spacing (16px)\n px: isFullscreen ? 2 : 0,\n pb: isFullscreen ? 2 : 0,\n overflow: isFullscreen ? 'hidden' : 'visible',\n }}\n >\n <Box\n sx={{\n flex: 1,\n border: 1,\n borderColor: validationErrors.length > 0 ? 'error.main' : 'divider',\n borderRadius: 1,\n minHeight: editorMinHeight,\n overflow: 'hidden',\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n }}\n {...containerProps}\n >\n <Tooltip title={isFullscreen ? 'Exit Fullscreen' : 'Fullscreen'}>\n <IconButton\n onClick={toggleFullscreen}\n size=\"small\"\n sx={{\n position: isFullscreen ? 'fixed' : 'absolute',\n top: isFullscreen ? 72 : 8, // Position below header in fullscreen mode (header is ~64px)\n right: isFullscreen ? 16 : 8,\n zIndex: 10000, // Ensure it's above other elements\n bgcolor: 'rgba(255, 255, 255, 0.7)',\n '&:hover': {\n bgcolor: 'rgba(255, 255, 255, 0.9)',\n },\n boxShadow: 1,\n }}\n >\n {isFullscreen ? (\n <FullscreenExitIcon fontSize=\"small\" />\n ) : (\n <FullscreenIcon fontSize=\"small\" />\n )}\n </IconButton>\n </Tooltip>\n\n <Box\n sx={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n minHeight: editorMinHeight,\n position: 'relative',\n height: isFullscreen ? '100%' : actualHeight,\n }}\n >\n <Editor\n height=\"100%\"\n defaultLanguage={language}\n defaultValue={value}\n value={tsCode}\n onChange={handleCodeChange}\n onMount={handleEditorDidMount}\n theme={themeProp || 'vs'}\n options={defaultOptions}\n loading={\n <Box sx={{ p: 2, textAlign: 'center' }}>\n Loading Monaco Editor...\n </Box>\n }\n beforeMount={(monaco) => {\n console.log('CodeEditor: beforeMount called', { monaco: !!monaco });\n }}\n />\n </Box>\n\n {/* Problems panel at the bottom (Monaco-style) */}\n {validationErrors.length > 0 && (\n <Box\n sx={{\n borderTop: 1,\n borderColor: 'divider',\n bgcolor: 'background.default',\n display: 'flex',\n flexDirection: 'column',\n maxHeight: showProblems ? 180 : 40,\n minHeight: 40,\n transition: 'max-height 0.2s ease',\n }}\n >\n {/* Panel header */}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n px: 1,\n py: 0.5,\n gap: 1,\n borderBottom: showProblems ? '1px solid' : 'none',\n borderColor: 'divider',\n fontSize: '0.875rem',\n color: 'text.secondary',\n }}\n >\n <ErrorOutlineIcon color=\"error\" fontSize=\"small\" />\n <Box sx={{ fontWeight: 600, color: 'text.primary' }}>Problems</Box>\n <Box sx={{ ml: 1 }}>\n {validationErrors.length} error{validationErrors.length > 1 ? 's' : ''}\n </Box>\n <Box sx={{ flex: 1 }} />\n <IconButton\n size=\"small\"\n aria-label=\"Toggle problems panel\"\n onClick={() => {\n setHasUserToggledProblems(true);\n setShowProblems((s) => !s);\n }}\n >\n {showProblems ? <ExpandMoreIcon fontSize=\"small\" /> : <ExpandLessIcon fontSize=\"small\" />}\n </IconButton>\n </Box>\n {/* Problems list */}\n {showProblems && (\n <Box sx={{ overflow: 'auto' }}>\n {validationErrors.map((error, index) => (\n <Box\n key={`${error.startLineNumber}-${error.startColumn}-${index}`}\n onClick={() => gotoMarker(error)}\n sx={{\n display: 'flex',\n alignItems: 'center',\n px: 1.5,\n py: 0.75,\n gap: 1,\n cursor: 'pointer',\n '&:hover': { bgcolor: 'action.hover' },\n borderBottom: '1px dashed',\n borderColor: 'divider',\n fontSize: '0.85rem',\n }}\n >\n <ErrorOutlineIcon color=\"error\" sx={{ fontSize: 18 }} />\n <Box sx={{ color: 'text.secondary', width: 64 }}>Line {error.startLineNumber}</Box>\n <Box sx={{ color: 'text.primary', flex: 1, minWidth: 0 }}>\n {error.message}\n </Box>\n </Box>\n ))}\n </Box>\n )}\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n\nexport default CodeEditor;\n"],"mappings":"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","names":["model"]}