@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,1472 @@
1
+ import {
2
+ IDBlock,
3
+ RoleBadge
4
+ } from "./chunk-DRGMEIPT.mjs";
5
+ import {
6
+ CereIcon
7
+ } from "./chunk-UPGFBPFX.mjs";
8
+ import {
9
+ Button
10
+ } from "./chunk-BOQPWZIB.mjs";
11
+ import {
12
+ deploymentSurfaceTokens
13
+ } from "./chunk-D7D25O6E.mjs";
14
+ import {
15
+ robPaletteExtended,
16
+ robPrimaryPalette
17
+ } from "./chunk-WC2TCWXK.mjs";
18
+
19
+ // src/components/layout/Logo.tsx
20
+ import Stack from "@mui/material/Stack";
21
+ import { styled } from "@mui/material/styles";
22
+ import { svgIconClasses } from "@mui/material/SvgIcon";
23
+ import { jsx, jsxs } from "react/jsx-runtime";
24
+ var sizesMap = {
25
+ large: 38,
26
+ medium: 32,
27
+ small: 24
28
+ };
29
+ var Container = styled(Stack)({
30
+ [`& .${svgIconClasses.root}`]: {
31
+ fontSize: "inherit"
32
+ }
33
+ });
34
+ var Logo = ({ children, size = "medium", icon = /* @__PURE__ */ jsx(CereIcon, { color: "primary" }) }) => /* @__PURE__ */ jsxs(Container, { direction: "row", alignItems: "center", spacing: 2, fontSize: sizesMap[size], children: [
35
+ icon,
36
+ children && /* @__PURE__ */ jsx(Stack, { children })
37
+ ] });
38
+
39
+ // src/components/layout/Dialog.tsx
40
+ import MuiDialog from "@mui/material/Dialog";
41
+ import DialogTitle from "@mui/material/DialogTitle";
42
+ import DialogContent from "@mui/material/DialogContent";
43
+ import DialogActions from "@mui/material/DialogActions";
44
+ import Button2 from "@mui/material/Button";
45
+ import IconButton from "@mui/material/IconButton";
46
+ import Box from "@mui/material/Box";
47
+ import Typography from "@mui/material/Typography";
48
+ import Divider from "@mui/material/Divider";
49
+ import CircularProgress from "@mui/material/CircularProgress";
50
+ import CloseIcon from "@mui/icons-material/Close";
51
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
52
+ var Dialog = ({
53
+ open,
54
+ title,
55
+ onClose,
56
+ onSubmit,
57
+ submitLabel = "Save",
58
+ cancelLabel = "Cancel",
59
+ isLoading = false,
60
+ disableSubmit = false,
61
+ showActions = true,
62
+ headerAction,
63
+ fullWidth = true,
64
+ maxWidth = "md",
65
+ children,
66
+ dividers = true,
67
+ confirmBeforeClose = false,
68
+ customActions,
69
+ ...dialogProps
70
+ }) => {
71
+ const handleCloseAttempt = (e) => {
72
+ if (e) e.stopPropagation();
73
+ onClose();
74
+ };
75
+ return /* @__PURE__ */ jsxs2(
76
+ MuiDialog,
77
+ {
78
+ open,
79
+ onClose: (_, reason) => {
80
+ if (confirmBeforeClose) return;
81
+ if (reason === "backdropClick" || reason === "escapeKeyDown") {
82
+ onClose();
83
+ }
84
+ },
85
+ fullWidth,
86
+ maxWidth,
87
+ ...dialogProps,
88
+ PaperProps: {
89
+ sx: { minHeight: dialogProps.fullScreen ? void 0 : "auto" },
90
+ ...dialogProps.PaperProps
91
+ },
92
+ children: [
93
+ /* @__PURE__ */ jsxs2(DialogTitle, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", p: 2 }, children: [
94
+ /* @__PURE__ */ jsx2(Box, { sx: { display: "flex", alignItems: "center" }, children: typeof title === "string" ? /* @__PURE__ */ jsx2(Typography, { variant: "h6", children: title }) : title }),
95
+ /* @__PURE__ */ jsxs2(Box, { sx: { display: "flex", alignItems: "center" }, children: [
96
+ headerAction,
97
+ /* @__PURE__ */ jsx2(
98
+ IconButton,
99
+ {
100
+ edge: "end",
101
+ color: "inherit",
102
+ onClick: handleCloseAttempt,
103
+ "aria-label": "close",
104
+ children: /* @__PURE__ */ jsx2(CloseIcon, {})
105
+ }
106
+ )
107
+ ] })
108
+ ] }),
109
+ dividers && /* @__PURE__ */ jsx2(Divider, {}),
110
+ /* @__PURE__ */ jsx2(DialogContent, { dividers, children }),
111
+ (showActions || customActions) && /* @__PURE__ */ jsxs2(Fragment, { children: [
112
+ dividers && /* @__PURE__ */ jsx2(Divider, {}),
113
+ /* @__PURE__ */ jsx2(DialogActions, { children: customActions || /* @__PURE__ */ jsxs2(Fragment, { children: [
114
+ /* @__PURE__ */ jsx2(
115
+ Button2,
116
+ {
117
+ onClick: handleCloseAttempt,
118
+ disabled: isLoading,
119
+ children: cancelLabel
120
+ }
121
+ ),
122
+ onSubmit && /* @__PURE__ */ jsx2(
123
+ Button2,
124
+ {
125
+ variant: "contained",
126
+ color: "primary",
127
+ onClick: onSubmit,
128
+ disabled: disableSubmit || isLoading,
129
+ startIcon: isLoading ? /* @__PURE__ */ jsx2(CircularProgress, { size: 20 }) : void 0,
130
+ children: submitLabel
131
+ }
132
+ )
133
+ ] }) })
134
+ ] })
135
+ ]
136
+ }
137
+ );
138
+ };
139
+
140
+ // src/components/layout/KpiCard.tsx
141
+ import * as React from "react";
142
+ import Box2 from "@mui/material/Box";
143
+ import Typography2 from "@mui/material/Typography";
144
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
145
+ var toneColor = (tone, theme) => {
146
+ switch (tone) {
147
+ case "violet":
148
+ return theme.palette.primary.main;
149
+ case "blue":
150
+ return theme.palette.info.main;
151
+ case "green":
152
+ return theme.palette.success.main;
153
+ case "orange":
154
+ return theme.palette.warning.main;
155
+ case "pink":
156
+ return theme.palette.secondary?.main ?? theme.palette.primary.main;
157
+ case "neutral":
158
+ default:
159
+ return theme.palette.grey[300];
160
+ }
161
+ };
162
+ var KpiCard = React.forwardRef(
163
+ function KpiCard2({ icon, label, value, sub, tone = "neutral", ...rest }, ref) {
164
+ return /* @__PURE__ */ jsxs3(
165
+ Box2,
166
+ {
167
+ ref,
168
+ "data-tone": tone,
169
+ ...rest,
170
+ sx: (theme) => ({
171
+ position: "relative",
172
+ display: "flex",
173
+ flexDirection: "column",
174
+ gap: 0.5,
175
+ padding: 2,
176
+ paddingLeft: 2.5,
177
+ borderRadius: 1.5,
178
+ backgroundColor: theme.palette.background.paper,
179
+ border: `1px solid ${theme.palette.divider}`,
180
+ overflow: "hidden",
181
+ "&::before": {
182
+ content: '""',
183
+ position: "absolute",
184
+ left: 0,
185
+ top: 0,
186
+ bottom: 0,
187
+ width: 4,
188
+ backgroundColor: toneColor(tone, theme)
189
+ }
190
+ }),
191
+ children: [
192
+ /* @__PURE__ */ jsxs3(Box2, { sx: { display: "flex", alignItems: "center", gap: 0.75 }, children: [
193
+ icon && /* @__PURE__ */ jsx3(Box2, { sx: { display: "inline-flex", color: "text.secondary" }, children: icon }),
194
+ /* @__PURE__ */ jsx3(Typography2, { variant: "eyebrow", component: "span", children: label })
195
+ ] }),
196
+ /* @__PURE__ */ jsx3(Typography2, { variant: "panelTitle", component: "div", children: value }),
197
+ sub && /* @__PURE__ */ jsx3(Typography2, { variant: "body2", sx: { color: "text.secondary" }, children: sub })
198
+ ]
199
+ }
200
+ );
201
+ }
202
+ );
203
+
204
+ // src/components/layout/AgentAvatar.tsx
205
+ import * as React2 from "react";
206
+ import Box3 from "@mui/material/Box";
207
+ import { jsx as jsx4 } from "react/jsx-runtime";
208
+ var hashSeed = (seed) => {
209
+ let h = 5381;
210
+ for (let i = 0; i < seed.length; i += 1) {
211
+ h = (h << 5) + h + seed.charCodeAt(i) & 4294967295;
212
+ }
213
+ return Math.abs(h);
214
+ };
215
+ var palette = (theme) => [
216
+ theme.palette.primary.main,
217
+ theme.palette.primary.dark,
218
+ theme.palette.secondary?.main ?? theme.palette.primary.main
219
+ ];
220
+ var AgentAvatar = React2.forwardRef(
221
+ function AgentAvatar2({ seed, name, size = 40, shadow = false, iconUrl, ariaLabel, ...rest }, ref) {
222
+ const initial = (name?.trim()?.[0] ?? "?").toUpperCase();
223
+ const radius = Math.round(size * 0.28);
224
+ return /* @__PURE__ */ jsx4(
225
+ Box3,
226
+ {
227
+ ref,
228
+ role: "img",
229
+ "aria-label": ariaLabel ?? name,
230
+ ...rest,
231
+ sx: (theme) => {
232
+ const colors = palette(theme);
233
+ const paletteIndex = hashSeed(seed) % colors.length;
234
+ return {
235
+ width: size,
236
+ height: size,
237
+ borderRadius: `${radius}px`,
238
+ backgroundColor: colors[paletteIndex],
239
+ color: theme.palette.common.white,
240
+ display: "inline-flex",
241
+ alignItems: "center",
242
+ justifyContent: "center",
243
+ fontWeight: 700,
244
+ fontSize: Math.round(size * 0.42),
245
+ lineHeight: 1,
246
+ overflow: "hidden",
247
+ flexShrink: 0,
248
+ boxShadow: shadow ? theme.shadows[3] : "inset 0 1px 0 rgba(255,255,255,0.2)",
249
+ userSelect: "none"
250
+ };
251
+ },
252
+ children: iconUrl ? /* @__PURE__ */ jsx4(
253
+ Box3,
254
+ {
255
+ component: "img",
256
+ src: iconUrl,
257
+ alt: "",
258
+ sx: { width: "100%", height: "100%", objectFit: "cover" }
259
+ }
260
+ ) : /* @__PURE__ */ jsx4("span", { "aria-hidden": "true", children: initial })
261
+ }
262
+ );
263
+ }
264
+ );
265
+
266
+ // src/components/layout/NumberedList.tsx
267
+ import * as React3 from "react";
268
+ import Box4 from "@mui/material/Box";
269
+ import Typography3 from "@mui/material/Typography";
270
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
271
+ var toneColors = (tone, theme) => {
272
+ switch (tone) {
273
+ case "blue":
274
+ return { bg: theme.palette.info.light, fg: theme.palette.info.dark };
275
+ case "green":
276
+ return { bg: theme.palette.success.light, fg: theme.palette.success.dark };
277
+ case "orange":
278
+ return { bg: theme.palette.warning.light, fg: theme.palette.warning.dark };
279
+ case "pink":
280
+ return {
281
+ bg: theme.palette.secondary?.light ?? theme.palette.primary.light,
282
+ fg: theme.palette.secondary?.main ?? theme.palette.primary.main
283
+ };
284
+ case "neutral":
285
+ return { bg: theme.palette.grey[100], fg: theme.palette.text.primary };
286
+ case "violet":
287
+ default:
288
+ return { bg: theme.palette.primary.light, fg: theme.palette.primary.main };
289
+ }
290
+ };
291
+ var NumberedList = React3.forwardRef(
292
+ function NumberedList2({ items, tone = "violet", startAt = 1, ...rest }, ref) {
293
+ return /* @__PURE__ */ jsx5(
294
+ Box4,
295
+ {
296
+ ref,
297
+ component: "ol",
298
+ "data-tone": tone,
299
+ ...rest,
300
+ sx: (theme) => {
301
+ const { bg, fg } = toneColors(tone, theme);
302
+ return {
303
+ listStyle: "none",
304
+ margin: 0,
305
+ padding: 0,
306
+ display: "flex",
307
+ flexDirection: "column",
308
+ gap: 1.5,
309
+ "--numbered-list-bg": bg,
310
+ "--numbered-list-fg": fg
311
+ };
312
+ },
313
+ children: items.map((item, idx) => /* @__PURE__ */ jsxs4(
314
+ Box4,
315
+ {
316
+ component: "li",
317
+ sx: { display: "flex", alignItems: "flex-start", gap: 1.5 },
318
+ children: [
319
+ /* @__PURE__ */ jsx5(
320
+ Box4,
321
+ {
322
+ "aria-hidden": "true",
323
+ sx: {
324
+ flexShrink: 0,
325
+ width: 28,
326
+ height: 28,
327
+ borderRadius: "50%",
328
+ display: "inline-flex",
329
+ alignItems: "center",
330
+ justifyContent: "center",
331
+ fontWeight: 700,
332
+ fontSize: 13,
333
+ backgroundColor: "var(--numbered-list-bg)",
334
+ color: "var(--numbered-list-fg)"
335
+ },
336
+ children: startAt + idx
337
+ }
338
+ ),
339
+ /* @__PURE__ */ jsxs4(Box4, { sx: { flex: 1, minWidth: 0 }, children: [
340
+ /* @__PURE__ */ jsx5(Typography3, { variant: "subtitle1", component: "div", children: item.title }),
341
+ item.detail && /* @__PURE__ */ jsx5(
342
+ Typography3,
343
+ {
344
+ variant: "body2",
345
+ component: "div",
346
+ sx: { color: "text.secondary", mt: 0.25 },
347
+ children: item.detail
348
+ }
349
+ )
350
+ ] }),
351
+ item.cta && /* @__PURE__ */ jsx5(Box4, { sx: { flexShrink: 0 }, children: item.cta })
352
+ ]
353
+ },
354
+ `${idx}-${item.title}`
355
+ ))
356
+ }
357
+ );
358
+ }
359
+ );
360
+
361
+ // src/components/layout/Drawer.tsx
362
+ import React4 from "react";
363
+ import MuiDrawer from "@mui/material/Drawer";
364
+ import { styled as styled2 } from "@mui/material/styles";
365
+ import Box5 from "@mui/material/Box";
366
+ import IconButton2 from "@mui/material/IconButton";
367
+ import Typography4 from "@mui/material/Typography";
368
+ import Divider2 from "@mui/material/Divider";
369
+ import Tabs from "@mui/material/Tabs";
370
+ import Tab from "@mui/material/Tab";
371
+ import CloseIcon2 from "@mui/icons-material/Close";
372
+
373
+ // src/components/layout/drawerWidth.ts
374
+ function resolveDrawerWidth(width, theme, defaultWidth) {
375
+ if (width === void 0) {
376
+ return { width: defaultWidth };
377
+ }
378
+ if (typeof width === "number" || typeof width === "string") {
379
+ return { width };
380
+ }
381
+ const base = width.xs ?? defaultWidth;
382
+ const css = { width: base };
383
+ ["sm", "md", "lg", "xl"].forEach((bp) => {
384
+ const value = width[bp];
385
+ if (value !== void 0) {
386
+ css[theme.breakpoints.up(bp)] = { width: value };
387
+ }
388
+ });
389
+ return css;
390
+ }
391
+
392
+ // src/components/layout/Drawer.tsx
393
+ import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
394
+ var StyledDrawer = styled2(MuiDrawer, {
395
+ shouldForwardProp: (prop) => prop !== "width" && prop !== "miniWidth" && prop !== "collapsed" && prop !== "topOffset"
396
+ })(({ theme, width, miniWidth = 72, collapsed, topOffset = 0 }) => {
397
+ const widthCss = collapsed ? { width: miniWidth } : resolveDrawerWidth(width, theme, 240);
398
+ return {
399
+ ...widthCss,
400
+ flexShrink: 0,
401
+ "& .MuiDrawer-paper": {
402
+ ...widthCss,
403
+ boxSizing: "border-box",
404
+ boxShadow: "0px 2px 10px rgba(0, 0, 0, 0.05)",
405
+ transition: theme.transitions.create(["width", "top", "height"], {
406
+ easing: theme.transitions.easing.sharp,
407
+ duration: theme.transitions.duration.enteringScreen
408
+ }),
409
+ overflow: "visible",
410
+ // Let internal content handle scrolling
411
+ display: "flex",
412
+ flexDirection: "column",
413
+ top: `${topOffset}px !important`,
414
+ height: topOffset > 0 ? `calc(100% - ${topOffset}px) !important` : "100%",
415
+ zIndex: `${theme.zIndex.modal} !important`
416
+ // Use modal zIndex to be above everything except AppBar (which is modal + 1)
417
+ }
418
+ };
419
+ });
420
+ var Drawer = React4.forwardRef(function Drawer2({
421
+ width,
422
+ miniWidth = 72,
423
+ collapsed = false,
424
+ title,
425
+ header,
426
+ showCloseButton,
427
+ tabs,
428
+ activeTab = 0,
429
+ onTabChange,
430
+ footer,
431
+ contentProps,
432
+ anchor = "right",
433
+ variant = "temporary",
434
+ topOffset = 0,
435
+ children,
436
+ onClose,
437
+ ...props
438
+ }, ref) {
439
+ const defaultWidth = variant === "temporary" || variant === "persistent" ? 400 : 240;
440
+ const finalWidth = width ?? defaultWidth;
441
+ const shouldShowClose = showCloseButton ?? (variant === "temporary" || variant === "persistent");
442
+ const hasHeader = title || header || shouldShowClose || tabs;
443
+ return /* @__PURE__ */ jsxs5(
444
+ StyledDrawer,
445
+ {
446
+ ref,
447
+ width: finalWidth,
448
+ miniWidth,
449
+ collapsed,
450
+ anchor,
451
+ variant,
452
+ topOffset,
453
+ onClose,
454
+ ModalProps: {
455
+ ...props.ModalProps,
456
+ style: {
457
+ zIndex: topOffset > 0 ? void 0 : void 0
458
+ // Let styled component handle zIndex
459
+ }
460
+ },
461
+ BackdropProps: {
462
+ ...props.BackdropProps,
463
+ style: {
464
+ backgroundColor: "rgba(0, 0, 0, 0.5)"
465
+ }
466
+ },
467
+ ...props,
468
+ children: [
469
+ hasHeader && /* @__PURE__ */ jsxs5(Fragment2, { children: [
470
+ /* @__PURE__ */ jsx6(
471
+ Box5,
472
+ {
473
+ sx: {
474
+ display: "flex",
475
+ alignItems: "center",
476
+ justifyContent: "space-between",
477
+ p: 2,
478
+ minHeight: 64,
479
+ borderBottom: 1,
480
+ borderColor: "divider"
481
+ },
482
+ children: header || /* @__PURE__ */ jsxs5(Fragment2, { children: [
483
+ /* @__PURE__ */ jsx6(Box5, { sx: { flex: 1 }, children: typeof title === "string" ? /* @__PURE__ */ jsx6(Typography4, { variant: "h6", children: title }) : title }),
484
+ shouldShowClose && onClose && /* @__PURE__ */ jsx6(
485
+ IconButton2,
486
+ {
487
+ onClick: (e) => {
488
+ e.stopPropagation();
489
+ onClose(e, "backdropClick");
490
+ },
491
+ size: "small",
492
+ sx: { ml: 1 },
493
+ "aria-label": "close",
494
+ children: /* @__PURE__ */ jsx6(CloseIcon2, {})
495
+ }
496
+ )
497
+ ] })
498
+ }
499
+ ),
500
+ tabs && tabs.length > 0 && /* @__PURE__ */ jsx6(
501
+ Tabs,
502
+ {
503
+ value: activeTab,
504
+ onChange: (_, newValue) => onTabChange?.(newValue),
505
+ variant: tabs.length > 4 ? "scrollable" : "standard",
506
+ scrollButtons: tabs.length > 4 ? "auto" : false,
507
+ sx: {
508
+ borderBottom: 1,
509
+ borderColor: "divider",
510
+ px: 2,
511
+ "& .MuiTabs-scrollableContainer": {
512
+ overflow: "auto"
513
+ }
514
+ },
515
+ children: tabs.map((tab, index) => /* @__PURE__ */ jsx6(Tab, { label: tab }, index))
516
+ }
517
+ )
518
+ ] }),
519
+ /* @__PURE__ */ jsx6(
520
+ Box5,
521
+ {
522
+ sx: {
523
+ flex: 1,
524
+ overflow: "auto",
525
+ display: "flex",
526
+ flexDirection: "column"
527
+ },
528
+ ...contentProps,
529
+ children
530
+ }
531
+ ),
532
+ footer && /* @__PURE__ */ jsxs5(Fragment2, { children: [
533
+ /* @__PURE__ */ jsx6(Divider2, {}),
534
+ /* @__PURE__ */ jsx6(
535
+ Box5,
536
+ {
537
+ sx: {
538
+ p: 2,
539
+ borderTop: 1,
540
+ borderColor: "divider"
541
+ },
542
+ children: footer
543
+ }
544
+ )
545
+ ] })
546
+ ]
547
+ }
548
+ );
549
+ });
550
+
551
+ // src/components/layout/MetaField.tsx
552
+ import React5 from "react";
553
+ import Box6 from "@mui/material/Box";
554
+ import Typography5 from "@mui/material/Typography";
555
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
556
+ var MetaField = React5.forwardRef(function MetaField2({ label, value, mono = false, title }, ref) {
557
+ const resolvedTitle = title ?? (typeof value === "string" ? value : void 0);
558
+ return /* @__PURE__ */ jsxs6(Box6, { ref, sx: { display: "flex", flexDirection: "column", gap: 0.25, minWidth: 0 }, children: [
559
+ /* @__PURE__ */ jsx7(
560
+ Typography5,
561
+ {
562
+ variant: "caption",
563
+ sx: {
564
+ color: "text.secondary",
565
+ textTransform: "uppercase",
566
+ letterSpacing: 0.4,
567
+ fontSize: 10,
568
+ fontWeight: 600
569
+ },
570
+ children: label
571
+ }
572
+ ),
573
+ /* @__PURE__ */ jsx7(
574
+ Typography5,
575
+ {
576
+ variant: "body2",
577
+ sx: {
578
+ fontFamily: mono ? "monospace" : void 0,
579
+ fontSize: 13,
580
+ overflow: "hidden",
581
+ textOverflow: "ellipsis",
582
+ whiteSpace: "nowrap"
583
+ },
584
+ title: resolvedTitle,
585
+ children: value
586
+ }
587
+ )
588
+ ] });
589
+ });
590
+
591
+ // src/components/layout/ScrollableRow.tsx
592
+ import { useEffect, useRef, useState } from "react";
593
+ import Box7 from "@mui/material/Box";
594
+ import IconButton3 from "@mui/material/IconButton";
595
+ import ChevronLeftIcon from "@mui/icons-material/ChevronLeft";
596
+ import ChevronRightIcon from "@mui/icons-material/ChevronRight";
597
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
598
+ var EDGE_TOLERANCE_PX = 4;
599
+ var ScrollableRow = ({
600
+ children,
601
+ leftLabel = "Scroll left",
602
+ rightLabel = "Scroll right",
603
+ minNudge = 160,
604
+ nudgeFraction = 0.6
605
+ }) => {
606
+ const scrollerRef = useRef(null);
607
+ const [canLeft, setCanLeft] = useState(false);
608
+ const [canRight, setCanRight] = useState(false);
609
+ useEffect(() => {
610
+ const el = scrollerRef.current;
611
+ if (!el) return;
612
+ const update = () => {
613
+ setCanLeft(el.scrollLeft > EDGE_TOLERANCE_PX);
614
+ setCanRight(el.scrollLeft + el.clientWidth < el.scrollWidth - EDGE_TOLERANCE_PX);
615
+ };
616
+ update();
617
+ el.addEventListener("scroll", update, { passive: true });
618
+ const ro = typeof ResizeObserver !== "undefined" ? new ResizeObserver(update) : null;
619
+ ro?.observe(el);
620
+ for (const c of Array.from(el.children)) ro?.observe(c);
621
+ const mo = typeof MutationObserver !== "undefined" ? new MutationObserver(() => {
622
+ for (const c of Array.from(el.children)) ro?.observe(c);
623
+ update();
624
+ }) : null;
625
+ mo?.observe(el, { childList: true });
626
+ return () => {
627
+ el.removeEventListener("scroll", update);
628
+ ro?.disconnect();
629
+ mo?.disconnect();
630
+ };
631
+ }, []);
632
+ const nudge = (dir) => {
633
+ const el = scrollerRef.current;
634
+ if (!el) return;
635
+ el.scrollBy({ left: dir * Math.max(minNudge, el.clientWidth * nudgeFraction), behavior: "smooth" });
636
+ };
637
+ return /* @__PURE__ */ jsxs7(Box7, { sx: { position: "relative", flex: 1, minWidth: 0 }, children: [
638
+ /* @__PURE__ */ jsx8(
639
+ Box7,
640
+ {
641
+ ref: scrollerRef,
642
+ "data-scrollable-row-scroller": true,
643
+ sx: {
644
+ display: "flex",
645
+ gap: 1,
646
+ overflowX: "auto",
647
+ overflowY: "hidden",
648
+ scrollbarWidth: "thin",
649
+ py: 0.25
650
+ },
651
+ children
652
+ }
653
+ ),
654
+ canLeft && /* @__PURE__ */ jsx8(
655
+ IconButton3,
656
+ {
657
+ size: "small",
658
+ "aria-label": leftLabel,
659
+ onClick: () => nudge(-1),
660
+ sx: {
661
+ position: "absolute",
662
+ left: -6,
663
+ top: "50%",
664
+ transform: "translateY(-50%)",
665
+ bgcolor: "background.paper",
666
+ boxShadow: 1,
667
+ "&:hover": { bgcolor: "background.paper" }
668
+ },
669
+ children: /* @__PURE__ */ jsx8(ChevronLeftIcon, { fontSize: "small" })
670
+ }
671
+ ),
672
+ canRight && /* @__PURE__ */ jsx8(
673
+ IconButton3,
674
+ {
675
+ size: "small",
676
+ "aria-label": rightLabel,
677
+ onClick: () => nudge(1),
678
+ sx: {
679
+ position: "absolute",
680
+ right: -6,
681
+ top: "50%",
682
+ transform: "translateY(-50%)",
683
+ bgcolor: "background.paper",
684
+ boxShadow: 1,
685
+ "&:hover": { bgcolor: "background.paper" }
686
+ },
687
+ children: /* @__PURE__ */ jsx8(ChevronRightIcon, { fontSize: "small" })
688
+ }
689
+ )
690
+ ] });
691
+ };
692
+
693
+ // src/components/layout/SectionRow.tsx
694
+ import React7 from "react";
695
+ import Box8 from "@mui/material/Box";
696
+ import Typography6 from "@mui/material/Typography";
697
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
698
+ var SectionRow = React7.forwardRef(function SectionRow2({ title, subtitle, action, leftLabel, rightLabel, children }, ref) {
699
+ return /* @__PURE__ */ jsxs8(Box8, { ref, component: "section", sx: { mb: 4 }, children: [
700
+ /* @__PURE__ */ jsxs8(
701
+ Box8,
702
+ {
703
+ component: "header",
704
+ sx: {
705
+ display: "flex",
706
+ alignItems: "flex-end",
707
+ justifyContent: "space-between",
708
+ gap: 1.5,
709
+ mb: 1.5
710
+ },
711
+ children: [
712
+ /* @__PURE__ */ jsxs8(Box8, { sx: { minWidth: 0 }, children: [
713
+ /* @__PURE__ */ jsx9(Typography6, { component: "h2", variant: "h6", sx: { m: 0 }, children: title }),
714
+ subtitle && /* @__PURE__ */ jsx9(Typography6, { variant: "caption", sx: { color: "text.secondary" }, children: subtitle })
715
+ ] }),
716
+ action && /* @__PURE__ */ jsx9(Box8, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: action })
717
+ ]
718
+ }
719
+ ),
720
+ /* @__PURE__ */ jsx9(ScrollableRow, { leftLabel, rightLabel, children })
721
+ ] });
722
+ });
723
+
724
+ // src/components/layout/GradientSurface.tsx
725
+ import React8 from "react";
726
+ import Box9 from "@mui/material/Box";
727
+ import { jsx as jsx10 } from "react/jsx-runtime";
728
+ var GRADIENT_ANCHORS_0 = {
729
+ d1: robPaletteExtended.nearBlack2,
730
+ // #0d0627
731
+ d2: robPaletteExtended.nearBlack4,
732
+ // #23194b
733
+ ev: robPrimaryPalette.electricViolet,
734
+ // #8B00EC
735
+ fd: robPrimaryPalette.fandango
736
+ // #BD32A7
737
+ };
738
+ var PALETTES = [
739
+ {
740
+ base: `linear-gradient(115deg, ${GRADIENT_ANCHORS_0.d1} 0%, ${GRADIENT_ANCHORS_0.d2} 55%, ${GRADIENT_ANCHORS_0.ev} 130%)`,
741
+ blobA: GRADIENT_ANCHORS_0.fd,
742
+ blobB: GRADIENT_ANCHORS_0.ev
743
+ },
744
+ { base: "linear-gradient(115deg, #2a1635 0%, #5b2a55 55%, #c75a8a 130%)", blobA: "#ff7ea8", blobB: "#ffd1a8" },
745
+ { base: "linear-gradient(115deg, #0e2a2c 0%, #1d5d63 55%, #59c6c4 130%)", blobA: "#59c6c4", blobB: "#2bb0a0" },
746
+ { base: "linear-gradient(115deg, #131534 0%, #2c3a8c 55%, #6088e8 130%)", blobA: "#6088e8", blobB: "#3b5db8" },
747
+ { base: "linear-gradient(115deg, #1a0f30 0%, #3d2a78 55%, #8a5cf6 130%)", blobA: "#a892ff", blobB: "#6b4cf0" },
748
+ { base: "linear-gradient(115deg, #2b1124 0%, #6d2244 55%, #d44a7a 130%)", blobA: "#d44a7a", blobB: "#a8345e" }
749
+ ];
750
+ var GRADIENT_PALETTE_COUNT = PALETTES.length;
751
+ var GradientSurface = React8.forwardRef(
752
+ function GradientSurface2({ index, children, sx }, ref) {
753
+ const wrapped = (index % GRADIENT_PALETTE_COUNT + GRADIENT_PALETTE_COUNT) % GRADIENT_PALETTE_COUNT;
754
+ const palette2 = PALETTES[wrapped];
755
+ return /* @__PURE__ */ jsx10(
756
+ Box9,
757
+ {
758
+ ref,
759
+ "data-gradient-index": wrapped,
760
+ sx: [
761
+ {
762
+ position: "relative",
763
+ overflow: "hidden",
764
+ background: palette2.base,
765
+ color: "common.white",
766
+ "&::before, &::after": {
767
+ content: '""',
768
+ position: "absolute",
769
+ pointerEvents: "none",
770
+ borderRadius: "50%",
771
+ filter: "blur(6px)"
772
+ },
773
+ "&::before": {
774
+ width: 460,
775
+ height: 460,
776
+ top: -120,
777
+ right: -120,
778
+ opacity: 0.7,
779
+ background: `radial-gradient(circle, ${palette2.blobA} 0%, transparent 70%)`
780
+ },
781
+ "&::after": {
782
+ width: 520,
783
+ height: 520,
784
+ bottom: -180,
785
+ left: -160,
786
+ opacity: 0.55,
787
+ background: `radial-gradient(circle, ${palette2.blobB} 0%, transparent 70%)`
788
+ }
789
+ },
790
+ ...Array.isArray(sx) ? sx : [sx]
791
+ ],
792
+ children
793
+ }
794
+ );
795
+ }
796
+ );
797
+
798
+ // src/components/layout/DefinitionRow.tsx
799
+ import React9 from "react";
800
+ import Box10 from "@mui/material/Box";
801
+ import Typography7 from "@mui/material/Typography";
802
+ import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
803
+ var DefinitionRow = React9.forwardRef(
804
+ function DefinitionRow2({ icon, label, sublabel, value, hint, dense = false, divider = true }, ref) {
805
+ return /* @__PURE__ */ jsxs9(
806
+ Box10,
807
+ {
808
+ ref,
809
+ "data-density": dense ? "dense" : "normal",
810
+ sx: {
811
+ py: dense ? 0.75 : 1.25,
812
+ display: "flex",
813
+ alignItems: "center",
814
+ gap: 1.5,
815
+ ...divider && {
816
+ borderBottom: "1px solid",
817
+ borderColor: "divider",
818
+ "&:last-child": { borderBottom: "none" }
819
+ }
820
+ },
821
+ children: [
822
+ icon && /* @__PURE__ */ jsx11(Box10, { sx: { display: "flex", alignItems: "center", color: "text.secondary" }, children: icon }),
823
+ /* @__PURE__ */ jsxs9(Box10, { sx: { minWidth: 0, flex: 1 }, children: [
824
+ /* @__PURE__ */ jsx11(Typography7, { variant: "body2", sx: { fontWeight: 500, lineHeight: 1.2 }, children: label }),
825
+ sublabel && /* @__PURE__ */ jsx11(Typography7, { variant: "caption", sx: { color: "text.secondary" }, children: sublabel })
826
+ ] }),
827
+ (value || hint) && /* @__PURE__ */ jsxs9(
828
+ Box10,
829
+ {
830
+ sx: {
831
+ display: "flex",
832
+ flexDirection: "column",
833
+ alignItems: "flex-end",
834
+ textAlign: "right"
835
+ },
836
+ children: [
837
+ value && /* @__PURE__ */ jsx11(Typography7, { variant: "body2", sx: { color: "text.secondary" }, children: value }),
838
+ hint && /* @__PURE__ */ jsx11(Typography7, { variant: "caption", sx: { color: "text.disabled" }, children: hint })
839
+ ]
840
+ }
841
+ )
842
+ ]
843
+ }
844
+ );
845
+ }
846
+ );
847
+
848
+ // src/components/layout/PanelDialog.tsx
849
+ import { forwardRef as forwardRef4 } from "react";
850
+ import MuiDialog2 from "@mui/material/Dialog";
851
+ import IconButton4 from "@mui/material/IconButton";
852
+ import Box11 from "@mui/material/Box";
853
+ import Typography8 from "@mui/material/Typography";
854
+ import Slide from "@mui/material/Slide";
855
+ import CloseIcon3 from "@mui/icons-material/Close";
856
+ import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
857
+ var WIDTH_PX = {
858
+ sm: 420,
859
+ md: 640,
860
+ lg: 880,
861
+ xl: 1080
862
+ };
863
+ var SlideLeft = forwardRef4(
864
+ function SlideLeft2(props, ref) {
865
+ return /* @__PURE__ */ jsx12(Slide, { direction: "left", ref, ...props });
866
+ }
867
+ );
868
+ var SlideUp = forwardRef4(
869
+ function SlideUp2(props, ref) {
870
+ return /* @__PURE__ */ jsx12(Slide, { direction: "up", ref, ...props });
871
+ }
872
+ );
873
+ function PanelDialog({
874
+ open,
875
+ onClose,
876
+ title,
877
+ headerActions,
878
+ width = "md",
879
+ side = "right",
880
+ ariaLabel,
881
+ hideHeader = false,
882
+ paperSx,
883
+ backdropSx,
884
+ transition,
885
+ children
886
+ }) {
887
+ const accessibleName = ariaLabel ?? (typeof title === "string" ? title : void 0);
888
+ const isRight = side === "right";
889
+ const resolvedTransition = transition ?? (isRight ? "slide-left" : "fade");
890
+ const TransitionComponent = resolvedTransition === "slide-left" ? SlideLeft : resolvedTransition === "slide-up" ? SlideUp : void 0;
891
+ const paperBaseSx = {
892
+ width: WIDTH_PX[width],
893
+ maxWidth: "100%",
894
+ // Lay paper children out as a flex column so the body can `flex: 1` and
895
+ // own its own scroll region.
896
+ display: "flex",
897
+ flexDirection: "column",
898
+ ...isRight && {
899
+ position: "absolute",
900
+ right: 0,
901
+ top: 0,
902
+ bottom: 0,
903
+ margin: 0,
904
+ // Use dynamic viewport units so mobile browsers (esp. iOS Safari) don't
905
+ // pop the layout when the URL bar shows/hides.
906
+ maxHeight: "100dvh",
907
+ height: "100dvh",
908
+ borderRadius: 0
909
+ }
910
+ };
911
+ return /* @__PURE__ */ jsxs10(
912
+ MuiDialog2,
913
+ {
914
+ open,
915
+ onClose,
916
+ slots: TransitionComponent ? { transition: TransitionComponent } : void 0,
917
+ slotProps: {
918
+ paper: {
919
+ "aria-label": accessibleName,
920
+ sx: [paperBaseSx, ...Array.isArray(paperSx) ? paperSx : [paperSx]]
921
+ },
922
+ ...backdropSx ? { backdrop: { sx: backdropSx } } : {}
923
+ },
924
+ children: [
925
+ !hideHeader && /* @__PURE__ */ jsxs10(
926
+ Box11,
927
+ {
928
+ sx: {
929
+ display: "flex",
930
+ alignItems: "center",
931
+ justifyContent: "space-between",
932
+ gap: 1,
933
+ px: 2,
934
+ py: 1.5,
935
+ borderBottom: "1px solid",
936
+ borderColor: "divider"
937
+ },
938
+ children: [
939
+ /* @__PURE__ */ jsx12(Box11, { sx: { display: "flex", alignItems: "center", minWidth: 0 }, children: typeof title === "string" ? /* @__PURE__ */ jsx12(Typography8, { variant: "h6", noWrap: true, children: title }) : title }),
940
+ /* @__PURE__ */ jsxs10(Box11, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
941
+ headerActions,
942
+ /* @__PURE__ */ jsx12(IconButton4, { "aria-label": "Close", onClick: onClose, edge: "end", size: "small", children: /* @__PURE__ */ jsx12(CloseIcon3, { fontSize: "small" }) })
943
+ ] })
944
+ ]
945
+ }
946
+ ),
947
+ hideHeader && /* @__PURE__ */ jsx12(
948
+ IconButton4,
949
+ {
950
+ "aria-label": "Close",
951
+ onClick: onClose,
952
+ size: "small",
953
+ sx: {
954
+ position: "absolute",
955
+ top: 12,
956
+ right: 12,
957
+ zIndex: 2,
958
+ bgcolor: "background.paper",
959
+ boxShadow: 1,
960
+ "&:hover": { bgcolor: "background.paper" }
961
+ },
962
+ children: /* @__PURE__ */ jsx12(CloseIcon3, { fontSize: "small" })
963
+ }
964
+ ),
965
+ /* @__PURE__ */ jsx12(Box11, { sx: { flex: 1, overflow: "auto", minHeight: 0 }, children })
966
+ ]
967
+ }
968
+ );
969
+ }
970
+
971
+ // src/components/layout/SplitDialogContent.tsx
972
+ import React10 from "react";
973
+ import Box12 from "@mui/material/Box";
974
+ import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
975
+ var SplitDialogContent = React10.forwardRef(
976
+ function SplitDialogContent2({ left, right, rightWidth = 320, collapseBelow = 860, sx }, ref) {
977
+ return /* @__PURE__ */ jsxs11(
978
+ Box12,
979
+ {
980
+ ref,
981
+ sx: {
982
+ display: "grid",
983
+ gridTemplateColumns: `1fr ${rightWidth}px`,
984
+ gap: "28px",
985
+ // Right padding reserves room for the floating close button on PanelDialog.
986
+ padding: "28px 56px 36px 36px",
987
+ overflowY: "auto",
988
+ [`@media (max-width: ${collapseBelow}px)`]: {
989
+ gridTemplateColumns: "1fr",
990
+ padding: "22px 56px 28px 22px"
991
+ },
992
+ ...sx
993
+ },
994
+ children: [
995
+ /* @__PURE__ */ jsx13(Box12, { sx: { display: "flex", flexDirection: "column", gap: "22px", minWidth: 0 }, children: left }),
996
+ /* @__PURE__ */ jsx13(Box12, { component: "aside", sx: { display: "flex", flexDirection: "column", gap: "14px" }, children: right })
997
+ ]
998
+ }
999
+ );
1000
+ }
1001
+ );
1002
+
1003
+ // src/components/layout/List.tsx
1004
+ import React11 from "react";
1005
+ import MuiList from "@mui/material/List";
1006
+ import MuiListItem from "@mui/material/ListItem";
1007
+ import ListItemText from "@mui/material/ListItemText";
1008
+ import ListItemIcon from "@mui/material/ListItemIcon";
1009
+ import ListItemSecondaryAction from "@mui/material/ListItemSecondaryAction";
1010
+ import { styled as styled3 } from "@mui/material/styles";
1011
+ import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1012
+ var List = React11.forwardRef(function List2(props, ref) {
1013
+ return /* @__PURE__ */ jsx14(MuiList, { ref, ...props });
1014
+ });
1015
+ var StyledListItem = styled3(MuiListItem, {
1016
+ shouldForwardProp: (prop) => prop !== "hoverable"
1017
+ })(({ hoverable = true, theme }) => ({
1018
+ border: `1px solid ${theme.palette.grey[200]}`,
1019
+ borderRadius: 8,
1020
+ marginBottom: 8,
1021
+ ...hoverable && {
1022
+ "&:hover": {
1023
+ backgroundColor: theme.palette.grey[50]
1024
+ }
1025
+ }
1026
+ }));
1027
+ var ListItem = React11.forwardRef(function ListItem2({ primary, secondary, icon, action, hoverable = true, children, ...props }, ref) {
1028
+ return /* @__PURE__ */ jsxs12(StyledListItem, { ref, hoverable, ...props, children: [
1029
+ icon && /* @__PURE__ */ jsx14(ListItemIcon, { children: icon }),
1030
+ (primary || secondary) && /* @__PURE__ */ jsx14(
1031
+ ListItemText,
1032
+ {
1033
+ primary,
1034
+ secondary
1035
+ }
1036
+ ),
1037
+ children,
1038
+ action && action
1039
+ ] });
1040
+ });
1041
+
1042
+ // src/components/layout/Avatar.tsx
1043
+ import React12 from "react";
1044
+ import MuiAvatar from "@mui/material/Avatar";
1045
+ import { styled as styled4 } from "@mui/material/styles";
1046
+ import { jsx as jsx15 } from "react/jsx-runtime";
1047
+ var sizeMap = {
1048
+ small: 32,
1049
+ medium: 40,
1050
+ large: 56
1051
+ };
1052
+ var StyledAvatar = styled4(MuiAvatar, {
1053
+ shouldForwardProp: (prop) => prop !== "avatarSize"
1054
+ })(({ avatarSize = 40, theme }) => ({
1055
+ width: avatarSize,
1056
+ height: avatarSize,
1057
+ backgroundColor: theme.palette.primary.main,
1058
+ color: theme.palette.primary.contrastText,
1059
+ fontWeight: 600
1060
+ }));
1061
+ var Avatar = React12.forwardRef(function Avatar2({ size = "medium", ...props }, ref) {
1062
+ const avatarSize = typeof size === "number" ? size : sizeMap[size];
1063
+ return /* @__PURE__ */ jsx15(StyledAvatar, { ref, avatarSize, ...props });
1064
+ });
1065
+
1066
+ // src/components/layout/Table.tsx
1067
+ import React13 from "react";
1068
+ import MuiTable from "@mui/material/Table";
1069
+ import TableBody from "@mui/material/TableBody";
1070
+ import TableCell from "@mui/material/TableCell";
1071
+ import TableContainer from "@mui/material/TableContainer";
1072
+ import TableHead from "@mui/material/TableHead";
1073
+ import TableRow from "@mui/material/TableRow";
1074
+ import TableSortLabel from "@mui/material/TableSortLabel";
1075
+ import { styled as styled5 } from "@mui/material/styles";
1076
+ import { jsx as jsx16 } from "react/jsx-runtime";
1077
+ var StyledTableContainer = styled5(TableContainer)(({ theme }) => ({
1078
+ borderRadius: 8,
1079
+ border: `1px solid ${theme.palette.grey[200]}`
1080
+ }));
1081
+ var StyledTableHead = styled5(TableHead)(({ theme }) => ({
1082
+ backgroundColor: theme.palette.grey[50],
1083
+ "& .MuiTableCell-head": {
1084
+ fontWeight: 600,
1085
+ color: theme.palette.text.primary
1086
+ }
1087
+ }));
1088
+ var Table = React13.forwardRef(function Table2({ stickyHeader = false, children, ...props }, ref) {
1089
+ return /* @__PURE__ */ jsx16(StyledTableContainer, { children: /* @__PURE__ */ jsx16(MuiTable, { ref, stickyHeader, ...props, children }) });
1090
+ });
1091
+ var TableHeader = React13.forwardRef(
1092
+ function TableHeader2({ columns, orderBy, order = "asc", onSort }, ref) {
1093
+ return /* @__PURE__ */ jsx16(StyledTableHead, { ref, children: /* @__PURE__ */ jsx16(TableRow, { children: columns.map((column) => /* @__PURE__ */ jsx16(TableCell, { align: column.align || "left", children: column.sortable && onSort ? /* @__PURE__ */ jsx16(
1094
+ TableSortLabel,
1095
+ {
1096
+ active: orderBy === column.id,
1097
+ direction: orderBy === column.id ? order : "asc",
1098
+ onClick: () => onSort(column.id),
1099
+ children: column.label
1100
+ }
1101
+ ) : column.label }, column.id)) }) });
1102
+ }
1103
+ );
1104
+
1105
+ // src/components/layout/Grid.tsx
1106
+ import { default as default2 } from "@mui/material/Grid2";
1107
+
1108
+ // src/components/layout/Breadcrumbs.tsx
1109
+ import React14 from "react";
1110
+ import MuiBreadcrumbs from "@mui/material/Breadcrumbs";
1111
+ import Link from "@mui/material/Link";
1112
+ import Typography9 from "@mui/material/Typography";
1113
+ import { styled as styled6 } from "@mui/material/styles";
1114
+ import { jsx as jsx17 } from "react/jsx-runtime";
1115
+ var StyledBreadcrumbs = styled6(MuiBreadcrumbs)(({ theme }) => ({
1116
+ "& .MuiBreadcrumbs-ol": {
1117
+ flexWrap: "nowrap"
1118
+ },
1119
+ "& .MuiBreadcrumbs-separator": {
1120
+ color: theme.palette.text.secondary
1121
+ }
1122
+ }));
1123
+ var StyledLink = styled6(Link)(({ theme }) => ({
1124
+ color: theme.palette.primary.main,
1125
+ textDecoration: "none",
1126
+ "&:hover": {
1127
+ textDecoration: "underline"
1128
+ }
1129
+ }));
1130
+ var Breadcrumbs = React14.forwardRef(function Breadcrumbs2({ items, ...props }, ref) {
1131
+ return /* @__PURE__ */ jsx17(StyledBreadcrumbs, { ref, ...props, children: items.map((item, index) => {
1132
+ const isLast = index === items.length - 1;
1133
+ if (isLast || !item.href && !item.onClick) {
1134
+ return /* @__PURE__ */ jsx17(Typography9, { color: "text.primary", children: item.label }, index);
1135
+ }
1136
+ return /* @__PURE__ */ jsx17(
1137
+ StyledLink,
1138
+ {
1139
+ href: item.href,
1140
+ onClick: (e) => {
1141
+ if (item.onClick) {
1142
+ e.preventDefault();
1143
+ item.onClick();
1144
+ }
1145
+ },
1146
+ children: item.label
1147
+ },
1148
+ index
1149
+ );
1150
+ }) });
1151
+ });
1152
+
1153
+ // src/components/layout/Accordion.tsx
1154
+ import React15 from "react";
1155
+ import MuiAccordion from "@mui/material/Accordion";
1156
+ import AccordionSummary from "@mui/material/AccordionSummary";
1157
+ import AccordionDetails from "@mui/material/AccordionDetails";
1158
+ import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
1159
+ import { styled as styled7 } from "@mui/material/styles";
1160
+ import { jsx as jsx18, jsxs as jsxs13 } from "react/jsx-runtime";
1161
+ var StyledAccordion = styled7(MuiAccordion)(({ theme }) => ({
1162
+ borderRadius: 8,
1163
+ boxShadow: "none",
1164
+ border: `1px solid ${theme.palette.grey[200]}`,
1165
+ "&:before": {
1166
+ display: "none"
1167
+ },
1168
+ "&.Mui-expanded": {
1169
+ margin: 0
1170
+ }
1171
+ }));
1172
+ var StyledAccordionSummary = styled7(AccordionSummary)(({ theme }) => ({
1173
+ backgroundColor: theme.palette.grey[50],
1174
+ borderRadius: "8px 8px 0 0",
1175
+ "&.Mui-expanded": {
1176
+ borderRadius: "8px 8px 0 0"
1177
+ },
1178
+ "& .MuiAccordionSummary-content": {
1179
+ margin: "12px 0"
1180
+ }
1181
+ }));
1182
+ var StyledAccordionDetails = styled7(AccordionDetails)({
1183
+ padding: "16px"
1184
+ });
1185
+ var Accordion = React15.forwardRef(function Accordion2({ title, children, defaultExpanded = false, ...props }, ref) {
1186
+ return /* @__PURE__ */ jsxs13(StyledAccordion, { ref, defaultExpanded, ...props, children: [
1187
+ /* @__PURE__ */ jsx18(StyledAccordionSummary, { expandIcon: /* @__PURE__ */ jsx18(ExpandMoreIcon, {}), children: title }),
1188
+ /* @__PURE__ */ jsx18(StyledAccordionDetails, { children })
1189
+ ] });
1190
+ });
1191
+
1192
+ // src/components/layout/Paper.tsx
1193
+ import React16 from "react";
1194
+ import MuiPaper from "@mui/material/Paper";
1195
+ import { styled as styled8 } from "@mui/material/styles";
1196
+ import { jsx as jsx19 } from "react/jsx-runtime";
1197
+ var StyledPaper = styled8(MuiPaper)(({ theme }) => ({
1198
+ borderRadius: 8,
1199
+ "&.MuiPaper-elevation": {
1200
+ boxShadow: "0px 2px 8px rgba(0, 0, 0, 0.08)"
1201
+ },
1202
+ "&.MuiPaper-outlined": {
1203
+ border: `1px solid ${theme.palette.grey[200]}`,
1204
+ boxShadow: "none"
1205
+ }
1206
+ }));
1207
+ var Paper = React16.forwardRef(function Paper2({ variant = "elevation", ...props }, ref) {
1208
+ return /* @__PURE__ */ jsx19(
1209
+ StyledPaper,
1210
+ {
1211
+ ref,
1212
+ variant,
1213
+ elevation: variant === "elevation" ? 1 : 0,
1214
+ ...props
1215
+ }
1216
+ );
1217
+ });
1218
+
1219
+ // src/components/layout/Divider.tsx
1220
+ import React17 from "react";
1221
+ import MuiDivider from "@mui/material/Divider";
1222
+ import { styled as styled9 } from "@mui/material/styles";
1223
+ import { jsx as jsx20 } from "react/jsx-runtime";
1224
+ var StyledDivider = styled9(MuiDivider)(({ theme }) => ({
1225
+ borderColor: theme.palette.grey[200]
1226
+ }));
1227
+ var Divider3 = React17.forwardRef(function Divider4(props, ref) {
1228
+ return /* @__PURE__ */ jsx20(StyledDivider, { ref, ...props });
1229
+ });
1230
+
1231
+ // src/components/layout/Stack.tsx
1232
+ import { default as default3 } from "@mui/material/Stack";
1233
+
1234
+ // src/components/layout/Box.tsx
1235
+ import { default as default4 } from "@mui/material/Box";
1236
+
1237
+ // src/components/layout/Container.tsx
1238
+ import { default as default5 } from "@mui/material/Container";
1239
+
1240
+ // src/components/layout/AppBar.tsx
1241
+ import MuiAppBar from "@mui/material/AppBar";
1242
+ import Toolbar from "@mui/material/Toolbar";
1243
+ import { styled as styled10 } from "@mui/material/styles";
1244
+ import { jsx as jsx21 } from "react/jsx-runtime";
1245
+ var StyledAppBar = styled10(MuiAppBar, {
1246
+ shouldForwardProp: (prop) => prop !== "appBarHeight"
1247
+ })(({ appBarHeight = 64, theme }) => ({
1248
+ backgroundColor: theme.palette.background.paper,
1249
+ borderBottom: `1px solid ${theme.palette.grey[200]}`,
1250
+ boxShadow: "none",
1251
+ height: appBarHeight,
1252
+ zIndex: 1300
1253
+ }));
1254
+ var StyledToolbar = styled10(Toolbar)(({ theme }) => ({
1255
+ height: "100%",
1256
+ paddingLeft: theme.spacing(2),
1257
+ paddingRight: theme.spacing(2),
1258
+ gap: theme.spacing(2)
1259
+ }));
1260
+ var AppBar = ({ height = 64, children, ...props }) => {
1261
+ return /* @__PURE__ */ jsx21(StyledAppBar, { position: "fixed", appBarHeight: height, ...props, children: /* @__PURE__ */ jsx21(StyledToolbar, { children }) });
1262
+ };
1263
+
1264
+ // src/components/layout/Collapse.tsx
1265
+ import React18 from "react";
1266
+ import MuiCollapse from "@mui/material/Collapse";
1267
+ import { jsx as jsx22 } from "react/jsx-runtime";
1268
+ var Collapse = React18.forwardRef(function Collapse2(props, ref) {
1269
+ return /* @__PURE__ */ jsx22(MuiCollapse, { ref, ...props });
1270
+ });
1271
+
1272
+ // src/components/layout/EntityHeader/EntityHeader.tsx
1273
+ import React19 from "react";
1274
+ import Box13 from "@mui/material/Box";
1275
+ import Typography10 from "@mui/material/Typography";
1276
+ import IconButton5 from "@mui/material/IconButton";
1277
+ import Divider5 from "@mui/material/Divider";
1278
+ import MoreHorizIcon from "@mui/icons-material/MoreHoriz";
1279
+ import { jsx as jsx23, jsxs as jsxs14 } from "react/jsx-runtime";
1280
+ var EntityHeader = React19.forwardRef(
1281
+ function EntityHeader2({
1282
+ title,
1283
+ subtitle,
1284
+ role,
1285
+ id,
1286
+ primaryAction,
1287
+ startActions,
1288
+ endActions,
1289
+ onCopyId,
1290
+ onMoreOptions,
1291
+ headingLevel = "h2",
1292
+ divider = true
1293
+ }, ref) {
1294
+ const getPrimaryActionLabel = () => {
1295
+ if (!primaryAction) return "";
1296
+ const { label, count } = primaryAction;
1297
+ return count !== void 0 ? `${label} (${count})` : label;
1298
+ };
1299
+ return /* @__PURE__ */ jsxs14(Box13, { ref, children: [
1300
+ /* @__PURE__ */ jsxs14(
1301
+ Box13,
1302
+ {
1303
+ sx: {
1304
+ display: "flex",
1305
+ alignItems: "center",
1306
+ justifyContent: "space-between",
1307
+ px: 3,
1308
+ py: 2,
1309
+ gap: 1
1310
+ },
1311
+ children: [
1312
+ /* @__PURE__ */ jsxs14(
1313
+ Box13,
1314
+ {
1315
+ sx: {
1316
+ display: "flex",
1317
+ alignItems: "center",
1318
+ gap: 1,
1319
+ flexWrap: "wrap"
1320
+ },
1321
+ children: [
1322
+ /* @__PURE__ */ jsxs14(
1323
+ Box13,
1324
+ {
1325
+ sx: {
1326
+ display: "flex",
1327
+ flexDirection: "column",
1328
+ gap: 0.5
1329
+ },
1330
+ children: [
1331
+ /* @__PURE__ */ jsx23(
1332
+ Typography10,
1333
+ {
1334
+ component: headingLevel,
1335
+ sx: {
1336
+ fontSize: "16px",
1337
+ fontWeight: 500,
1338
+ lineHeight: "24px",
1339
+ letterSpacing: "0.15px",
1340
+ color: deploymentSurfaceTokens.textPrimary
1341
+ },
1342
+ children: title
1343
+ }
1344
+ ),
1345
+ subtitle && /* @__PURE__ */ jsx23(
1346
+ Typography10,
1347
+ {
1348
+ variant: "body2",
1349
+ sx: {
1350
+ fontSize: "11px",
1351
+ fontWeight: 500,
1352
+ lineHeight: "16px",
1353
+ letterSpacing: "0.5px",
1354
+ color: deploymentSurfaceTokens.textSecondary
1355
+ },
1356
+ children: subtitle
1357
+ }
1358
+ )
1359
+ ]
1360
+ }
1361
+ ),
1362
+ role && /* @__PURE__ */ jsx23(RoleBadge, { label: role, color: "primary", size: "small" }),
1363
+ id && /* @__PURE__ */ jsx23(IDBlock, { id, label: "ID", entityType: "entity", onCopy: onCopyId })
1364
+ ]
1365
+ }
1366
+ ),
1367
+ /* @__PURE__ */ jsxs14(
1368
+ Box13,
1369
+ {
1370
+ sx: {
1371
+ display: "flex",
1372
+ alignItems: "center",
1373
+ gap: 1,
1374
+ flexShrink: 0
1375
+ },
1376
+ children: [
1377
+ startActions,
1378
+ primaryAction && /* @__PURE__ */ jsx23(
1379
+ Button,
1380
+ {
1381
+ variant: "primary",
1382
+ startIcon: primaryAction.icon,
1383
+ onClick: primaryAction.onClick,
1384
+ sx: {
1385
+ textTransform: "capitalize"
1386
+ },
1387
+ children: getPrimaryActionLabel()
1388
+ }
1389
+ ),
1390
+ endActions,
1391
+ onMoreOptions && /* @__PURE__ */ jsx23(
1392
+ IconButton5,
1393
+ {
1394
+ onClick: onMoreOptions,
1395
+ size: "small",
1396
+ "aria-label": "More options",
1397
+ sx: {
1398
+ padding: "8px",
1399
+ border: `1px solid ${deploymentSurfaceTokens.strokeOutside}`,
1400
+ borderRadius: "8px",
1401
+ "&:hover": {
1402
+ backgroundColor: deploymentSurfaceTokens.hoverOverlay,
1403
+ borderColor: deploymentSurfaceTokens.borderDefault
1404
+ }
1405
+ },
1406
+ children: /* @__PURE__ */ jsx23(
1407
+ MoreHorizIcon,
1408
+ {
1409
+ sx: {
1410
+ fontSize: "20px",
1411
+ color: deploymentSurfaceTokens.textSecondary
1412
+ }
1413
+ }
1414
+ )
1415
+ }
1416
+ )
1417
+ ]
1418
+ }
1419
+ )
1420
+ ]
1421
+ }
1422
+ ),
1423
+ divider && /* @__PURE__ */ jsx23(
1424
+ Divider5,
1425
+ {
1426
+ sx: {
1427
+ borderColor: deploymentSurfaceTokens.strokeOutside
1428
+ }
1429
+ }
1430
+ )
1431
+ ] });
1432
+ }
1433
+ );
1434
+
1435
+ export {
1436
+ Logo,
1437
+ Dialog,
1438
+ KpiCard,
1439
+ AgentAvatar,
1440
+ NumberedList,
1441
+ resolveDrawerWidth,
1442
+ Drawer,
1443
+ MetaField,
1444
+ ScrollableRow,
1445
+ SectionRow,
1446
+ GRADIENT_PALETTE_COUNT,
1447
+ GradientSurface,
1448
+ DefinitionRow,
1449
+ PanelDialog,
1450
+ SplitDialogContent,
1451
+ ListItemText,
1452
+ ListItemIcon,
1453
+ ListItemSecondaryAction,
1454
+ List,
1455
+ ListItem,
1456
+ Avatar,
1457
+ Table,
1458
+ TableHeader,
1459
+ default2 as default,
1460
+ Breadcrumbs,
1461
+ Accordion,
1462
+ Paper,
1463
+ Divider3 as Divider,
1464
+ default3 as default2,
1465
+ default4 as default3,
1466
+ default5 as default4,
1467
+ Toolbar,
1468
+ AppBar,
1469
+ Collapse,
1470
+ EntityHeader
1471
+ };
1472
+ //# sourceMappingURL=chunk-BH4FNZKK.mjs.map