@cere/cere-design-system 0.0.44 → 0.1.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.
- package/dist/WorkflowNode-BnxXO6t_.d.mts +46 -0
- package/dist/WorkflowNode-BnxXO6t_.d.ts +46 -0
- package/dist/buttons.d.mts +114 -0
- package/dist/buttons.d.ts +114 -0
- package/dist/buttons.js +19 -0
- package/dist/buttons.js.map +1 -0
- package/dist/buttons.mjs +19 -0
- package/dist/buttons.mjs.map +1 -0
- package/dist/carousel.d.mts +51 -0
- package/dist/carousel.d.ts +51 -0
- package/dist/carousel.js +185 -0
- package/dist/carousel.js.map +1 -0
- package/dist/carousel.mjs +185 -0
- package/dist/carousel.mjs.map +1 -0
- package/dist/charts.d.mts +209 -0
- package/dist/charts.d.ts +209 -0
- package/dist/charts.js +20 -0
- package/dist/charts.js.map +1 -0
- package/dist/charts.mjs +20 -0
- package/dist/charts.mjs.map +1 -0
- package/dist/chunk-27JEWSWA.mjs +233 -0
- package/dist/chunk-27JEWSWA.mjs.map +1 -0
- package/dist/chunk-2EBCST6X.js +25 -0
- package/dist/chunk-2EBCST6X.js.map +1 -0
- package/dist/chunk-3WCMINE5.mjs +490 -0
- package/dist/chunk-3WCMINE5.mjs.map +1 -0
- package/dist/chunk-463SRKKD.js +111 -0
- package/dist/chunk-463SRKKD.js.map +1 -0
- package/dist/chunk-5ASG6G6U.mjs +40 -0
- package/dist/chunk-5ASG6G6U.mjs.map +1 -0
- package/dist/chunk-6EUAU67C.mjs +374 -0
- package/dist/chunk-6EUAU67C.mjs.map +1 -0
- package/dist/chunk-AIY6222Q.js +11 -0
- package/dist/chunk-AIY6222Q.js.map +1 -0
- package/dist/chunk-AJBM7IE6.mjs +2366 -0
- package/dist/chunk-AJBM7IE6.mjs.map +1 -0
- package/dist/chunk-ATIFLPH6.mjs +278 -0
- package/dist/chunk-ATIFLPH6.mjs.map +1 -0
- package/dist/chunk-BIZK6FUD.js +37 -0
- package/dist/chunk-BIZK6FUD.js.map +1 -0
- package/dist/chunk-CCN6M4LI.js +103 -0
- package/dist/chunk-CCN6M4LI.js.map +1 -0
- package/dist/chunk-CUCKULYC.mjs +2658 -0
- package/dist/chunk-CUCKULYC.mjs.map +1 -0
- package/dist/chunk-CWJ4OU6W.mjs +45 -0
- package/dist/chunk-CWJ4OU6W.mjs.map +1 -0
- package/dist/chunk-EOF3QNPF.js +2366 -0
- package/dist/chunk-EOF3QNPF.js.map +1 -0
- package/dist/chunk-FFZ5S7PQ.mjs +146 -0
- package/dist/chunk-FFZ5S7PQ.mjs.map +1 -0
- package/dist/chunk-FN5YL4BK.js +278 -0
- package/dist/chunk-FN5YL4BK.js.map +1 -0
- package/dist/chunk-HLH2VWXL.js +2658 -0
- package/dist/chunk-HLH2VWXL.js.map +1 -0
- package/dist/chunk-IE6GCHDI.mjs +530 -0
- package/dist/chunk-IE6GCHDI.mjs.map +1 -0
- package/dist/chunk-JBHRAAN3.js +31 -0
- package/dist/chunk-JBHRAAN3.js.map +1 -0
- package/dist/chunk-JS4IB5IU.mjs +162 -0
- package/dist/chunk-JS4IB5IU.mjs.map +1 -0
- package/dist/chunk-KF2Y7HO3.js +595 -0
- package/dist/chunk-KF2Y7HO3.js.map +1 -0
- package/dist/chunk-KPDYKK3V.js +162 -0
- package/dist/chunk-KPDYKK3V.js.map +1 -0
- package/dist/chunk-KVBMZNWT.mjs +103 -0
- package/dist/chunk-KVBMZNWT.mjs.map +1 -0
- package/dist/chunk-L2TIGA7I.js +530 -0
- package/dist/chunk-L2TIGA7I.js.map +1 -0
- package/dist/chunk-MNM6HE72.js +146 -0
- package/dist/chunk-MNM6HE72.js.map +1 -0
- package/dist/chunk-NXTVJ6PY.js +374 -0
- package/dist/chunk-NXTVJ6PY.js.map +1 -0
- package/dist/chunk-OWWDNDF4.js +40 -0
- package/dist/chunk-OWWDNDF4.js.map +1 -0
- package/dist/chunk-PHMNZK2R.mjs +18 -0
- package/dist/chunk-PHMNZK2R.mjs.map +1 -0
- package/dist/chunk-PWF2NJDB.mjs +377 -0
- package/dist/chunk-PWF2NJDB.mjs.map +1 -0
- package/dist/chunk-QBCRH7YF.mjs +37 -0
- package/dist/chunk-QBCRH7YF.mjs.map +1 -0
- package/dist/chunk-QD6RLAO2.mjs +11 -0
- package/dist/chunk-QD6RLAO2.mjs.map +1 -0
- package/dist/chunk-QY65OUAC.mjs +111 -0
- package/dist/chunk-QY65OUAC.mjs.map +1 -0
- package/dist/chunk-QYYQYZHV.js +45 -0
- package/dist/chunk-QYYQYZHV.js.map +1 -0
- package/dist/chunk-T7LPABOL.mjs +595 -0
- package/dist/chunk-T7LPABOL.mjs.map +1 -0
- package/dist/chunk-THQKYTQE.js +490 -0
- package/dist/chunk-THQKYTQE.js.map +1 -0
- package/dist/chunk-U2QHFISG.js +18 -0
- package/dist/chunk-U2QHFISG.js.map +1 -0
- package/dist/chunk-UPGFBPFX.mjs +25 -0
- package/dist/chunk-UPGFBPFX.mjs.map +1 -0
- package/dist/chunk-X7E6GMFL.js +233 -0
- package/dist/chunk-X7E6GMFL.js.map +1 -0
- package/dist/chunk-XF66WQZE.mjs +1535 -0
- package/dist/chunk-XF66WQZE.mjs.map +1 -0
- package/dist/chunk-YQOZPLTY.js +1535 -0
- package/dist/chunk-YQOZPLTY.js.map +1 -0
- package/dist/chunk-ZGCN5WCG.js +377 -0
- package/dist/chunk-ZGCN5WCG.js.map +1 -0
- package/dist/chunk-ZP26PGMS.mjs +31 -0
- package/dist/chunk-ZP26PGMS.mjs.map +1 -0
- package/dist/feedback.d.mts +356 -0
- package/dist/feedback.d.ts +356 -0
- package/dist/feedback.js +43 -0
- package/dist/feedback.js.map +1 -0
- package/dist/feedback.mjs +43 -0
- package/dist/feedback.mjs.map +1 -0
- package/dist/icons.d.mts +22 -0
- package/dist/icons.d.ts +22 -0
- package/dist/icons.js +23 -0
- package/dist/icons.js.map +1 -0
- package/dist/icons.mjs +23 -0
- package/dist/icons.mjs.map +1 -0
- package/dist/index.d.mts +171 -3069
- package/dist/index.d.ts +171 -3069
- package/dist/index.js +320 -10077
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +262 -9978
- package/dist/index.mjs.map +1 -1
- package/dist/inputs.d.mts +109 -0
- package/dist/inputs.d.ts +109 -0
- package/dist/inputs.js +43 -0
- package/dist/inputs.js.map +1 -0
- package/dist/inputs.mjs +43 -0
- package/dist/inputs.mjs.map +1 -0
- package/dist/layout.d.mts +927 -0
- package/dist/layout.d.ts +927 -0
- package/dist/layout.js +122 -0
- package/dist/layout.js.map +1 -0
- package/dist/layout.mjs +122 -0
- package/dist/layout.mjs.map +1 -0
- package/dist/navigation.d.mts +716 -0
- package/dist/navigation.d.ts +716 -0
- package/dist/navigation.js +58 -0
- package/dist/navigation.js.map +1 -0
- package/dist/navigation.mjs +58 -0
- package/dist/navigation.mjs.map +1 -0
- package/dist/third-party.d.mts +637 -0
- package/dist/third-party.d.ts +637 -0
- package/dist/third-party.js +45 -0
- package/dist/third-party.js.map +1 -0
- package/dist/third-party.mjs +45 -0
- package/dist/third-party.mjs.map +1 -0
- package/dist/tokens.css +2 -1
- package/dist/utilities.d.mts +39 -0
- package/dist/utilities.d.ts +39 -0
- package/dist/utilities.js +19 -0
- package/dist/utilities.js.map +1 -0
- package/dist/utilities.mjs +19 -0
- package/dist/utilities.mjs.map +1 -0
- package/package.json +55 -1
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
var _chunkZGCN5WCGjs = require('./chunk-ZGCN5WCG.js');
|
|
4
|
+
|
|
5
|
+
// src/components/feedback/Chip.tsx
|
|
6
|
+
var _react = require('react'); var React3 = _interopRequireWildcard(_react);
|
|
7
|
+
var _Chip = require('@mui/material/Chip'); var _Chip2 = _interopRequireDefault(_Chip);
|
|
8
|
+
var _styles = require('@mui/material/styles');
|
|
9
|
+
|
|
10
|
+
// src/components/feedback/chipVariantStyles.ts
|
|
11
|
+
function getChipVariantStyles(variant, theme) {
|
|
12
|
+
switch (variant) {
|
|
13
|
+
case "active":
|
|
14
|
+
return {
|
|
15
|
+
backgroundColor: theme.palette.background.selected,
|
|
16
|
+
color: theme.palette.primary.main,
|
|
17
|
+
hoverBackgroundColor: theme.palette.background.selected
|
|
18
|
+
};
|
|
19
|
+
case "success":
|
|
20
|
+
return {
|
|
21
|
+
backgroundColor: theme.palette.success.main,
|
|
22
|
+
color: theme.palette.success.contrastText,
|
|
23
|
+
hoverBackgroundColor: theme.palette.success.dark
|
|
24
|
+
};
|
|
25
|
+
case "error":
|
|
26
|
+
return {
|
|
27
|
+
backgroundColor: theme.palette.error.main,
|
|
28
|
+
color: theme.palette.error.contrastText,
|
|
29
|
+
hoverBackgroundColor: theme.palette.error.dark
|
|
30
|
+
};
|
|
31
|
+
case "warning":
|
|
32
|
+
return {
|
|
33
|
+
backgroundColor: theme.palette.warning.main,
|
|
34
|
+
color: theme.palette.warning.contrastText,
|
|
35
|
+
hoverBackgroundColor: theme.palette.warning.dark
|
|
36
|
+
};
|
|
37
|
+
case "info":
|
|
38
|
+
return {
|
|
39
|
+
backgroundColor: theme.palette.info.main,
|
|
40
|
+
color: theme.palette.info.contrastText,
|
|
41
|
+
hoverBackgroundColor: theme.palette.info.dark
|
|
42
|
+
};
|
|
43
|
+
case "default":
|
|
44
|
+
default:
|
|
45
|
+
return {
|
|
46
|
+
backgroundColor: theme.palette.grey[100],
|
|
47
|
+
color: theme.palette.text.primary,
|
|
48
|
+
hoverBackgroundColor: theme.palette.grey[200]
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/components/feedback/Chip.tsx
|
|
54
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
55
|
+
var StyledChip = _styles.styled.call(void 0, _Chip2.default, {
|
|
56
|
+
shouldForwardProp: (prop) => prop !== "dsVariant" && prop !== "dsTone"
|
|
57
|
+
})(({ theme, dsVariant, dsTone }) => {
|
|
58
|
+
if (dsTone === "onGradient") {
|
|
59
|
+
return {
|
|
60
|
+
height: 22,
|
|
61
|
+
color: "white",
|
|
62
|
+
backgroundColor: "rgba(0,0,0,0.25)",
|
|
63
|
+
border: "1px solid rgba(255,255,255,0.22)",
|
|
64
|
+
fontFamily: _chunkZGCN5WCGjs.fontFamilyMono,
|
|
65
|
+
fontSize: 10,
|
|
66
|
+
textTransform: "uppercase",
|
|
67
|
+
letterSpacing: "0.05em",
|
|
68
|
+
"& .MuiChip-label": {
|
|
69
|
+
paddingLeft: 8,
|
|
70
|
+
paddingRight: 8
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const { backgroundColor, color, hoverBackgroundColor } = getChipVariantStyles(dsVariant, theme);
|
|
75
|
+
return {
|
|
76
|
+
backgroundColor,
|
|
77
|
+
color,
|
|
78
|
+
"&:hover": { backgroundColor: hoverBackgroundColor }
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
var Chip = React3.default.forwardRef(function Chip2({ variant = "default", tone = "default", ...props }, ref) {
|
|
82
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, StyledChip, { ref, dsVariant: variant, dsTone: tone, ...props });
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// src/components/feedback/StatusDot.tsx
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
function statusColor(status, theme) {
|
|
90
|
+
switch (status) {
|
|
91
|
+
case "success":
|
|
92
|
+
return theme.palette.success.main;
|
|
93
|
+
case "error":
|
|
94
|
+
return theme.palette.error.main;
|
|
95
|
+
case "warning":
|
|
96
|
+
return theme.palette.warning.main;
|
|
97
|
+
case "info":
|
|
98
|
+
return theme.palette.info.main;
|
|
99
|
+
case "primary":
|
|
100
|
+
return theme.palette.primary.main;
|
|
101
|
+
case "neutral":
|
|
102
|
+
default:
|
|
103
|
+
return theme.palette.grey[400];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
var pulseKeyframes = _styles.keyframes`
|
|
107
|
+
0%, 100% { opacity: 1; transform: scale(1); }
|
|
108
|
+
50% { opacity: 0.55; transform: scale(1.35); }
|
|
109
|
+
`;
|
|
110
|
+
var Dot = _styles.styled.call(void 0, "span", {
|
|
111
|
+
shouldForwardProp: (prop) => prop !== "status" && prop !== "size" && prop !== "pulse"
|
|
112
|
+
})(({ theme, status, size, pulse }) => ({
|
|
113
|
+
display: "inline-block",
|
|
114
|
+
flexShrink: 0,
|
|
115
|
+
width: size,
|
|
116
|
+
height: size,
|
|
117
|
+
borderRadius: "50%",
|
|
118
|
+
backgroundColor: statusColor(status, theme),
|
|
119
|
+
animation: pulse ? `${pulseKeyframes} 1.6s ease-in-out infinite` : void 0,
|
|
120
|
+
"@media (prefers-reduced-motion: reduce)": {
|
|
121
|
+
animation: "none"
|
|
122
|
+
}
|
|
123
|
+
}));
|
|
124
|
+
var StatusDot = React3.default.forwardRef(function StatusDot2({ status, size = 8, pulse = false, "aria-label": ariaLabel, ...rest }, ref) {
|
|
125
|
+
const a11yProps = ariaLabel ? { role: "img", "aria-label": ariaLabel } : { "aria-hidden": true };
|
|
126
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Dot, { ref, status, size, pulse, ...rest, ...a11yProps });
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// src/components/feedback/StatusLabel.tsx
|
|
130
|
+
|
|
131
|
+
var _Box = require('@mui/material/Box'); var _Box2 = _interopRequireDefault(_Box);
|
|
132
|
+
var _Typography = require('@mui/material/Typography'); var _Typography2 = _interopRequireDefault(_Typography);
|
|
133
|
+
|
|
134
|
+
var SIZES = {
|
|
135
|
+
small: { dot: 6, typography: "caption" },
|
|
136
|
+
medium: { dot: 8, typography: "body2" }
|
|
137
|
+
};
|
|
138
|
+
var StatusLabel = React3.forwardRef(
|
|
139
|
+
function StatusLabel2({ status, label, size = "medium", pulse = false, ...rest }, ref) {
|
|
140
|
+
const { dot, typography } = SIZES[size];
|
|
141
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
142
|
+
_Box2.default,
|
|
143
|
+
{
|
|
144
|
+
ref,
|
|
145
|
+
...pulse ? { "aria-live": "polite" } : {},
|
|
146
|
+
...rest,
|
|
147
|
+
sx: (theme) => ({
|
|
148
|
+
display: "inline-flex",
|
|
149
|
+
alignItems: "center",
|
|
150
|
+
gap: theme.spacing(0.75)
|
|
151
|
+
}),
|
|
152
|
+
children: [
|
|
153
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, StatusDot, { status, size: dot, pulse }),
|
|
154
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Typography2.default, { variant: typography, component: "span", sx: { lineHeight: 1.2 }, children: label })
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
// src/components/feedback/CopyChip.tsx
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
var _Tooltip = require('@mui/material/Tooltip'); var _Tooltip2 = _interopRequireDefault(_Tooltip);
|
|
165
|
+
var _Check = require('@mui/icons-material/Check'); var _Check2 = _interopRequireDefault(_Check);
|
|
166
|
+
var _ContentCopy = require('@mui/icons-material/ContentCopy'); var _ContentCopy2 = _interopRequireDefault(_ContentCopy);
|
|
167
|
+
|
|
168
|
+
var COPY_FEEDBACK_MS = 1200;
|
|
169
|
+
var CopyChip = ({
|
|
170
|
+
text,
|
|
171
|
+
maxWidth = 260,
|
|
172
|
+
"aria-label": ariaLabel,
|
|
173
|
+
tooltipLabel = "Copy",
|
|
174
|
+
tooltipCopiedLabel = "Copied",
|
|
175
|
+
onCopy
|
|
176
|
+
}) => {
|
|
177
|
+
const [copied, setCopied] = _react.useState.call(void 0, false);
|
|
178
|
+
const timerRef = _react.useRef.call(void 0, null);
|
|
179
|
+
_react.useEffect.call(void 0, () => {
|
|
180
|
+
return () => {
|
|
181
|
+
if (timerRef.current != null) clearTimeout(timerRef.current);
|
|
182
|
+
};
|
|
183
|
+
}, []);
|
|
184
|
+
const handleCopy = async () => {
|
|
185
|
+
try {
|
|
186
|
+
await navigator.clipboard.writeText(text);
|
|
187
|
+
} catch (e) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
setCopied(true);
|
|
191
|
+
_optionalChain([onCopy, 'optionalCall', _ => _()]);
|
|
192
|
+
if (timerRef.current != null) clearTimeout(timerRef.current);
|
|
193
|
+
timerRef.current = setTimeout(() => setCopied(false), COPY_FEEDBACK_MS);
|
|
194
|
+
};
|
|
195
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Tooltip2.default, { title: copied ? tooltipCopiedLabel : tooltipLabel, placement: "top", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
196
|
+
_Box2.default,
|
|
197
|
+
{
|
|
198
|
+
component: "button",
|
|
199
|
+
type: "button",
|
|
200
|
+
onClick: handleCopy,
|
|
201
|
+
"aria-label": _nullishCoalesce(ariaLabel, () => ( `Copy ${text}`)),
|
|
202
|
+
sx: {
|
|
203
|
+
display: "inline-flex",
|
|
204
|
+
alignItems: "center",
|
|
205
|
+
gap: 0.75,
|
|
206
|
+
bgcolor: "action.hover",
|
|
207
|
+
color: "text.primary",
|
|
208
|
+
border: "none",
|
|
209
|
+
borderRadius: 1,
|
|
210
|
+
px: 1,
|
|
211
|
+
py: 0.5,
|
|
212
|
+
fontFamily: "monospace",
|
|
213
|
+
fontSize: 12,
|
|
214
|
+
cursor: "pointer",
|
|
215
|
+
transition: "background-color 0.12s",
|
|
216
|
+
maxWidth: "100%",
|
|
217
|
+
"&:hover": { bgcolor: "action.selected" }
|
|
218
|
+
},
|
|
219
|
+
children: [
|
|
220
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
221
|
+
_Box2.default,
|
|
222
|
+
{
|
|
223
|
+
component: "span",
|
|
224
|
+
sx: {
|
|
225
|
+
overflow: "hidden",
|
|
226
|
+
textOverflow: "ellipsis",
|
|
227
|
+
whiteSpace: "nowrap",
|
|
228
|
+
maxWidth
|
|
229
|
+
},
|
|
230
|
+
children: text
|
|
231
|
+
}
|
|
232
|
+
),
|
|
233
|
+
copied ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Check2.default, { sx: { fontSize: 14 } }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _ContentCopy2.default, { sx: { fontSize: 14 } })
|
|
234
|
+
]
|
|
235
|
+
}
|
|
236
|
+
) });
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
// src/components/feedback/Tooltip.tsx
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
var StyledTooltip = _styles.styled.call(void 0, (0, _Tooltip2.default))(({ theme }) => ({
|
|
245
|
+
"& .MuiTooltip-tooltip": {
|
|
246
|
+
backgroundColor: theme.palette.grey[800],
|
|
247
|
+
color: theme.palette.common.white,
|
|
248
|
+
fontSize: "12px",
|
|
249
|
+
padding: "8px 12px",
|
|
250
|
+
borderRadius: "4px"
|
|
251
|
+
},
|
|
252
|
+
"& .MuiTooltip-arrow": {
|
|
253
|
+
color: theme.palette.grey[800]
|
|
254
|
+
}
|
|
255
|
+
}));
|
|
256
|
+
var Tooltip2 = React3.default.forwardRef(function Tooltip3(props, ref) {
|
|
257
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, StyledTooltip, { ref, ...props });
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// src/components/feedback/Progress.tsx
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
var _material = require('@mui/material');
|
|
266
|
+
|
|
267
|
+
var StyledLinearProgress = _material.styled.call(void 0, (0, _material.LinearProgress))(({ theme }) => ({
|
|
268
|
+
height: 4,
|
|
269
|
+
borderRadius: 2,
|
|
270
|
+
backgroundColor: theme.palette.grey[200],
|
|
271
|
+
"& .MuiLinearProgress-bar": {
|
|
272
|
+
backgroundColor: theme.palette.primary.main,
|
|
273
|
+
borderRadius: 2
|
|
274
|
+
}
|
|
275
|
+
}));
|
|
276
|
+
var StyledCircularProgress = _material.styled.call(void 0, (0, _material.CircularProgress))(({ theme }) => ({
|
|
277
|
+
color: theme.palette.primary.main
|
|
278
|
+
}));
|
|
279
|
+
var Progress = ({
|
|
280
|
+
variant = "linear",
|
|
281
|
+
value,
|
|
282
|
+
size = 40,
|
|
283
|
+
thickness = 4
|
|
284
|
+
}) => {
|
|
285
|
+
if (variant === "circular") {
|
|
286
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, StyledCircularProgress, { size, thickness });
|
|
287
|
+
}
|
|
288
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
289
|
+
StyledLinearProgress,
|
|
290
|
+
{
|
|
291
|
+
variant: value !== void 0 ? "determinate" : "indeterminate",
|
|
292
|
+
value
|
|
293
|
+
}
|
|
294
|
+
);
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
// src/components/feedback/Alert.tsx
|
|
298
|
+
|
|
299
|
+
var _Alert = require('@mui/material/Alert'); var _Alert2 = _interopRequireDefault(_Alert);
|
|
300
|
+
|
|
301
|
+
var _Snackbar = require('@mui/material/Snackbar'); var _Snackbar2 = _interopRequireDefault(_Snackbar);
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
var StyledAlert = _styles.styled.call(void 0, (0, _Alert2.default))({
|
|
305
|
+
borderRadius: 8,
|
|
306
|
+
"&.MuiAlert-filled": {
|
|
307
|
+
borderRadius: 8
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
var Alert = React3.default.forwardRef(function Alert2({ severity = "info", title, children, ...props }, ref) {
|
|
311
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, StyledAlert, { ref, severity, ...props, children: [
|
|
312
|
+
title && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.AlertTitle, { children: title }),
|
|
313
|
+
children
|
|
314
|
+
] });
|
|
315
|
+
});
|
|
316
|
+
var StyledSnackbar = _styles.styled.call(void 0, (0, _Snackbar2.default))({});
|
|
317
|
+
var StableFadeTransition = React3.default.forwardRef(
|
|
318
|
+
(props, ref) => {
|
|
319
|
+
return React3.default.cloneElement(props.children, {
|
|
320
|
+
ref,
|
|
321
|
+
style: {
|
|
322
|
+
...props.children.props.style,
|
|
323
|
+
transition: "opacity 0.3s ease-in-out"
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
);
|
|
328
|
+
StableFadeTransition.displayName = "StableFadeTransition";
|
|
329
|
+
var Snackbar = React3.default.forwardRef(function Snackbar2({
|
|
330
|
+
message,
|
|
331
|
+
severity = "info",
|
|
332
|
+
title,
|
|
333
|
+
variant = "filled",
|
|
334
|
+
onClose,
|
|
335
|
+
children,
|
|
336
|
+
anchorOrigin = { vertical: "bottom", horizontal: "center" },
|
|
337
|
+
autoHideDuration = 6e3,
|
|
338
|
+
...props
|
|
339
|
+
}, ref) {
|
|
340
|
+
const handleClose = (_event, reason) => {
|
|
341
|
+
if (reason === "clickaway" && onClose) {
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
_optionalChain([onClose, 'optionalCall', _2 => _2()]);
|
|
345
|
+
};
|
|
346
|
+
const content = children || (message ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
347
|
+
Alert,
|
|
348
|
+
{
|
|
349
|
+
onClose: onClose ? handleClose : void 0,
|
|
350
|
+
severity,
|
|
351
|
+
variant,
|
|
352
|
+
title,
|
|
353
|
+
sx: { width: "100%", borderRadius: 2 },
|
|
354
|
+
children: message
|
|
355
|
+
}
|
|
356
|
+
) : void 0);
|
|
357
|
+
if (!content) {
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
361
|
+
StyledSnackbar,
|
|
362
|
+
{
|
|
363
|
+
ref,
|
|
364
|
+
anchorOrigin,
|
|
365
|
+
autoHideDuration,
|
|
366
|
+
onClose: handleClose,
|
|
367
|
+
disableWindowBlurListener: true,
|
|
368
|
+
ClickAwayListenerProps: {
|
|
369
|
+
onClickAway: () => {
|
|
370
|
+
}
|
|
371
|
+
// Prevent scroll issues
|
|
372
|
+
},
|
|
373
|
+
TransitionComponent: StableFadeTransition,
|
|
374
|
+
...props,
|
|
375
|
+
children: content
|
|
376
|
+
}
|
|
377
|
+
);
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
// src/components/feedback/EmptyState.tsx
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
var EmptyState = React3.default.forwardRef(function EmptyState2({ title = "No items found", description, icon, action }, ref) {
|
|
385
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
386
|
+
_material.Box,
|
|
387
|
+
{
|
|
388
|
+
ref,
|
|
389
|
+
sx: {
|
|
390
|
+
display: "flex",
|
|
391
|
+
flexDirection: "column",
|
|
392
|
+
alignItems: "center",
|
|
393
|
+
justifyContent: "center",
|
|
394
|
+
padding: 6,
|
|
395
|
+
textAlign: "center",
|
|
396
|
+
minHeight: 200
|
|
397
|
+
},
|
|
398
|
+
children: [
|
|
399
|
+
icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
400
|
+
_material.Box,
|
|
401
|
+
{
|
|
402
|
+
sx: {
|
|
403
|
+
color: "text.secondary",
|
|
404
|
+
marginBottom: 2,
|
|
405
|
+
fontSize: 64
|
|
406
|
+
},
|
|
407
|
+
children: icon
|
|
408
|
+
}
|
|
409
|
+
),
|
|
410
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "h6", sx: { marginBottom: 1, color: "text.primary" }, children: title }),
|
|
411
|
+
description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "body2", sx: { color: "text.secondary", marginBottom: 3 }, children: description }),
|
|
412
|
+
action && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Box, { children: action })
|
|
413
|
+
]
|
|
414
|
+
}
|
|
415
|
+
);
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
// src/components/feedback/Loading.tsx
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
var Loading = React3.default.forwardRef(function Loading2({ message = "Loading...", size = 40, fullScreen = false }, ref) {
|
|
423
|
+
const content = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
424
|
+
_material.Box,
|
|
425
|
+
{
|
|
426
|
+
ref,
|
|
427
|
+
sx: {
|
|
428
|
+
display: "flex",
|
|
429
|
+
flexDirection: "column",
|
|
430
|
+
justifyContent: "center",
|
|
431
|
+
alignItems: "center",
|
|
432
|
+
gap: 2,
|
|
433
|
+
...fullScreen && {
|
|
434
|
+
height: "100vh",
|
|
435
|
+
width: "100vw",
|
|
436
|
+
position: "fixed",
|
|
437
|
+
top: 0,
|
|
438
|
+
left: 0,
|
|
439
|
+
backgroundColor: "background.default",
|
|
440
|
+
zIndex: 9999
|
|
441
|
+
},
|
|
442
|
+
...!fullScreen && {
|
|
443
|
+
padding: 4
|
|
444
|
+
}
|
|
445
|
+
},
|
|
446
|
+
children: [
|
|
447
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CircularProgress, { size, thickness: 4 }),
|
|
448
|
+
message && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "body2", color: "text.secondary", children: message })
|
|
449
|
+
]
|
|
450
|
+
}
|
|
451
|
+
);
|
|
452
|
+
return content;
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
// src/components/feedback/AppLoading.tsx
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
var AppLoading = ({
|
|
459
|
+
message = "Loading...",
|
|
460
|
+
logo = "/icons/logo.png",
|
|
461
|
+
sx = {}
|
|
462
|
+
}) => {
|
|
463
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
464
|
+
_material.Box,
|
|
465
|
+
{
|
|
466
|
+
sx: [
|
|
467
|
+
{
|
|
468
|
+
display: "flex",
|
|
469
|
+
flexDirection: "column",
|
|
470
|
+
justifyContent: "center",
|
|
471
|
+
alignItems: "center",
|
|
472
|
+
height: "100vh",
|
|
473
|
+
width: "100vw",
|
|
474
|
+
position: "fixed",
|
|
475
|
+
top: 0,
|
|
476
|
+
left: 0,
|
|
477
|
+
backgroundColor: "grey.50",
|
|
478
|
+
zIndex: 9999
|
|
479
|
+
},
|
|
480
|
+
...Array.isArray(sx) ? sx : [sx]
|
|
481
|
+
],
|
|
482
|
+
children: [
|
|
483
|
+
logo && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
484
|
+
_material.Box,
|
|
485
|
+
{
|
|
486
|
+
component: "img",
|
|
487
|
+
src: logo,
|
|
488
|
+
alt: "Logo",
|
|
489
|
+
sx: {
|
|
490
|
+
height: 80,
|
|
491
|
+
width: "auto",
|
|
492
|
+
mb: 4
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
),
|
|
496
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CircularProgress, { size: 40, thickness: 4, sx: { mb: 2 } }),
|
|
497
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "body1", color: "text.secondary", children: message })
|
|
498
|
+
]
|
|
499
|
+
}
|
|
500
|
+
);
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
// src/components/feedback/CircularProgress.tsx
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
var CircularProgress4 = React3.default.forwardRef(
|
|
510
|
+
function CircularProgress5({ size = 40, thickness = 4, ...props }, ref) {
|
|
511
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CircularProgress, { ref, size, thickness, ...props });
|
|
512
|
+
}
|
|
513
|
+
);
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
exports.getChipVariantStyles = getChipVariantStyles; exports.Chip = Chip; exports.StatusDot = StatusDot; exports.StatusLabel = StatusLabel; exports.CopyChip = CopyChip; exports.Tooltip = Tooltip2; exports.Progress = Progress; exports.Alert = Alert; exports.Snackbar = Snackbar; exports.EmptyState = EmptyState; exports.Loading = Loading; exports.AppLoading = AppLoading; exports.CircularProgress = CircularProgress4;
|
|
530
|
+
//# sourceMappingURL=chunk-L2TIGA7I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/cere-design-system/cere-design-system/dist/chunk-L2TIGA7I.js","../src/components/feedback/Chip.tsx","../src/components/feedback/chipVariantStyles.ts","../src/components/feedback/StatusDot.tsx","../src/components/feedback/StatusLabel.tsx","../src/components/feedback/CopyChip.tsx","../src/components/feedback/Tooltip.tsx","../src/components/feedback/Progress.tsx","../src/components/feedback/Alert.tsx","../src/components/feedback/EmptyState.tsx","../src/components/feedback/Loading.tsx","../src/components/feedback/AppLoading.tsx","../src/components/feedback/CircularProgress.tsx"],"names":["Chip","styled","React","StatusLabel","Box","jsx","CircularProgress"],"mappings":"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","file":"/home/runner/work/cere-design-system/cere-design-system/dist/chunk-L2TIGA7I.js","sourcesContent":[null,"import React from 'react';\nimport MuiChip, { ChipProps as MuiChipProps } from '@mui/material/Chip';\nimport { styled } from '@mui/material/styles';\nimport { getChipVariantStyles, type ChipVariant } from './chipVariantStyles';\nimport { fontFamilyMono } from '../../theme/typography';\n\nexport type { ChipVariant };\n\nexport type ChipTone = 'default' | 'onGradient';\n\nexport interface ChipProps extends Omit<MuiChipProps, 'color' | 'variant'> {\n variant?: ChipVariant;\n /**\n * Visual tone overlay. `onGradient` styles the chip to read on a dark\n * gradient surface (white text, mono caps, translucent border + bg).\n * Positioning is the consumer's job.\n * @default 'default'\n */\n tone?: ChipTone;\n}\n\nconst StyledChip = styled(MuiChip, {\n shouldForwardProp: (prop) => prop !== 'dsVariant' && prop !== 'dsTone',\n})<{ dsVariant: ChipVariant; dsTone: ChipTone }>(({ theme, dsVariant, dsTone }) => {\n if (dsTone === 'onGradient') {\n return {\n height: 22,\n color: 'white',\n backgroundColor: 'rgba(0,0,0,0.25)',\n border: '1px solid rgba(255,255,255,0.22)',\n fontFamily: fontFamilyMono,\n fontSize: 10,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n '& .MuiChip-label': {\n paddingLeft: 8,\n paddingRight: 8,\n },\n };\n }\n const { backgroundColor, color, hoverBackgroundColor } = getChipVariantStyles(dsVariant, theme);\n return {\n backgroundColor,\n color,\n '&:hover': { backgroundColor: hoverBackgroundColor },\n };\n});\n\nexport const Chip = React.forwardRef<HTMLDivElement, ChipProps>(function Chip(\n { variant = 'default', tone = 'default', ...props },\n ref,\n) {\n return <StyledChip ref={ref} dsVariant={variant} dsTone={tone} {...props} />;\n});\n","import type { Theme } from '@mui/material/styles';\n\nexport type ChipVariant = 'default' | 'active' | 'success' | 'error' | 'warning' | 'info';\n\nexport interface ChipVariantStyles {\n backgroundColor: string;\n color: string;\n hoverBackgroundColor: string;\n}\n\n/**\n * Resolve a Chip variant to its themed background/foreground/hover colors.\n *\n * Status variants (success/error/warning/info) use the `main` surface with\n * `contrastText` (typically white) so chips read as loud solid pills.\n * `default` is neutral grey; `active` uses the brand-selected background.\n */\nexport function getChipVariantStyles(variant: ChipVariant, theme: Theme): ChipVariantStyles {\n switch (variant) {\n case 'active':\n return {\n backgroundColor: theme.palette.background.selected,\n color: theme.palette.primary.main,\n hoverBackgroundColor: theme.palette.background.selected,\n };\n case 'success':\n return {\n backgroundColor: theme.palette.success.main,\n color: theme.palette.success.contrastText,\n hoverBackgroundColor: theme.palette.success.dark,\n };\n case 'error':\n return {\n backgroundColor: theme.palette.error.main,\n color: theme.palette.error.contrastText,\n hoverBackgroundColor: theme.palette.error.dark,\n };\n case 'warning':\n return {\n backgroundColor: theme.palette.warning.main,\n color: theme.palette.warning.contrastText,\n hoverBackgroundColor: theme.palette.warning.dark,\n };\n case 'info':\n return {\n backgroundColor: theme.palette.info.main,\n color: theme.palette.info.contrastText,\n hoverBackgroundColor: theme.palette.info.dark,\n };\n case 'default':\n default:\n return {\n backgroundColor: theme.palette.grey[100],\n color: theme.palette.text.primary,\n hoverBackgroundColor: theme.palette.grey[200],\n };\n }\n}\n","import React from 'react';\nimport { styled, keyframes, type Theme } from '@mui/material/styles';\n\nexport type StatusDotStatus = 'success' | 'error' | 'warning' | 'info' | 'primary' | 'neutral';\n\nexport interface StatusDotProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'role'> {\n /** Which themed color to render. `neutral` uses a grey for idle/queued states. */\n status: StatusDotStatus;\n /** Diameter in pixels. @default 8 */\n size?: number;\n /**\n * Pulse animation for in-progress states (e.g., a running run). Respects\n * `prefers-reduced-motion` and falls back to a static dot.\n */\n pulse?: boolean;\n /**\n * When provided, the dot becomes an accessible image with this label. When\n * omitted, the dot is marked `aria-hidden` — assume an adjacent element\n * carries the status semantics.\n */\n 'aria-label'?: string;\n}\n\nfunction statusColor(status: StatusDotStatus, theme: Theme): string {\n switch (status) {\n case 'success': return theme.palette.success.main;\n case 'error': return theme.palette.error.main;\n case 'warning': return theme.palette.warning.main;\n case 'info': return theme.palette.info.main;\n case 'primary': return theme.palette.primary.main;\n case 'neutral':\n default:\n return theme.palette.grey[400];\n }\n}\n\nconst pulseKeyframes = keyframes`\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.55; transform: scale(1.35); }\n`;\n\nconst Dot = styled('span', {\n shouldForwardProp: (prop) => prop !== 'status' && prop !== 'size' && prop !== 'pulse',\n})<{ status: StatusDotStatus; size: number; pulse: boolean }>(({ theme, status, size, pulse }) => ({\n display: 'inline-block',\n flexShrink: 0,\n width: size,\n height: size,\n borderRadius: '50%',\n backgroundColor: statusColor(status, theme),\n animation: pulse ? `${pulseKeyframes} 1.6s ease-in-out infinite` : undefined,\n '@media (prefers-reduced-motion: reduce)': {\n animation: 'none',\n },\n}));\n\n/**\n * StatusDot — a small colored circle indicating entity status.\n *\n * Use alongside a text label for a labeled status; use with `aria-label` to\n * make the dot itself a standalone accessible indicator.\n *\n * @example\n * ```tsx\n * // Labeled context — the dot is decorative\n * <>\n * <StatusDot status=\"success\" />\n * <span>Succeeded</span>\n * </>\n *\n * // Standalone — dot carries the status meaning\n * <StatusDot status=\"info\" pulse aria-label=\"Running\" />\n * ```\n */\nexport const StatusDot = React.forwardRef<HTMLSpanElement, StatusDotProps>(function StatusDot(\n { status, size = 8, pulse = false, 'aria-label': ariaLabel, ...rest },\n ref,\n) {\n const a11yProps = ariaLabel\n ? { role: 'img' as const, 'aria-label': ariaLabel }\n : { 'aria-hidden': true as const };\n // a11y props spread last so consumer cannot silently override role / aria-hidden.\n // Invariant guarded by StatusDot.test.tsx > 'ignores consumer attempts to override the a11y contract'.\n return <Dot ref={ref} status={status} size={size} pulse={pulse} {...rest} {...a11yProps} />;\n});\n","import * as React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { StatusDot, type StatusDotStatus } from './StatusDot';\n\nexport type StatusLabelSize = 'small' | 'medium';\n\nexport interface StatusLabelProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Themed status; forwarded to StatusDot. */\n status: StatusDotStatus;\n /** Text rendered next to the dot. */\n label: string;\n /** Sizes the dot + text pair. @default 'medium' */\n size?: StatusLabelSize;\n /**\n * Adds a pulsing animation on the dot for in-progress states. When true,\n * the row also exposes an `aria-live=\"polite\"` region so SR users hear\n * updates.\n */\n pulse?: boolean;\n}\n\nconst SIZES: Record<StatusLabelSize, { dot: number; typography: 'caption' | 'body2' }> = {\n small: { dot: 6, typography: 'caption' },\n medium: { dot: 8, typography: 'body2' },\n};\n\n/**\n * StatusLabel — a flex row pairing `StatusDot` with a text label.\n *\n * Use this when a status indicator needs an accompanying label; the row\n * keeps the dot baseline-aligned with the text at all sizes.\n */\nexport const StatusLabel = React.forwardRef<HTMLDivElement, StatusLabelProps>(\n function StatusLabel({ status, label, size = 'medium', pulse = false, ...rest }, ref) {\n const { dot, typography } = SIZES[size];\n return (\n <Box\n ref={ref}\n {...(pulse ? { 'aria-live': 'polite' as const } : {})}\n {...rest}\n sx={(theme) => ({\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(0.75),\n })}\n >\n <StatusDot status={status} size={dot} pulse={pulse} />\n <Typography variant={typography} component=\"span\" sx={{ lineHeight: 1.2 }}>\n {label}\n </Typography>\n </Box>\n );\n },\n);\n","import React, { useEffect, useRef, useState } from 'react';\nimport Box from '@mui/material/Box';\nimport Tooltip from '@mui/material/Tooltip';\nimport CheckIcon from '@mui/icons-material/Check';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\n\nconst COPY_FEEDBACK_MS = 1200;\n\nexport interface CopyChipProps {\n /** The text to display and copy to the clipboard. */\n text: string;\n /** Max width in pixels for the (ellipsized) text label. @default 260 */\n maxWidth?: number;\n /**\n * Accessible label for the button. Defaults to `Copy <text>`. Override when\n * the raw text would be unclear to a screen-reader user (e.g., long hex IDs).\n */\n 'aria-label'?: string;\n /** Tooltip copy shown before clicking. @default 'Copy' */\n tooltipLabel?: string;\n /** Tooltip copy shown after a successful copy. @default 'Copied' */\n tooltipCopiedLabel?: string;\n /** Fires after the clipboard write succeeds. */\n onCopy?: () => void;\n}\n\n/**\n * CopyChip — compact inline copy-to-clipboard control.\n *\n * Shows a monospace text label with an adjacent copy icon that toggles to a\n * check mark for a moment after a successful copy. Use in dense metadata\n * rows where an `IDBlock` would be visually too heavy; use `IDBlock` when\n * the identifier is the primary affordance on the surface and deserves a\n * full boxed treatment with snackbar feedback.\n *\n * @example\n * ```tsx\n * <CopyChip text=\"run_abc123\" />\n * <CopyChip text={longHexId} aria-label=\"Copy workspace ID\" onCopy={track} />\n * ```\n */\nexport const CopyChip: React.FC<CopyChipProps> = ({\n text,\n maxWidth = 260,\n 'aria-label': ariaLabel,\n tooltipLabel = 'Copy',\n tooltipCopiedLabel = 'Copied',\n onCopy,\n}) => {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current != null) clearTimeout(timerRef.current);\n };\n }, []);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n // Clipboard unavailable (no permission, non-secure context, older UA).\n // Leave the button in its idle state and skip the onCopy callback.\n return;\n }\n setCopied(true);\n onCopy?.();\n if (timerRef.current != null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), COPY_FEEDBACK_MS);\n };\n\n return (\n <Tooltip title={copied ? tooltipCopiedLabel : tooltipLabel} placement=\"top\">\n <Box\n component=\"button\"\n type=\"button\"\n onClick={handleCopy}\n aria-label={ariaLabel ?? `Copy ${text}`}\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.75,\n bgcolor: 'action.hover',\n color: 'text.primary',\n border: 'none',\n borderRadius: 1,\n px: 1,\n py: 0.5,\n fontFamily: 'monospace',\n fontSize: 12,\n cursor: 'pointer',\n transition: 'background-color 0.12s',\n maxWidth: '100%',\n '&:hover': { bgcolor: 'action.selected' },\n }}\n >\n <Box\n component=\"span\"\n sx={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth,\n }}\n >\n {text}\n </Box>\n {copied ? <CheckIcon sx={{ fontSize: 14 }} /> : <ContentCopyIcon sx={{ fontSize: 14 }} />}\n </Box>\n </Tooltip>\n );\n};\n","import React from 'react';\nimport MuiTooltip, { TooltipProps as MuiTooltipProps } from '@mui/material/Tooltip';\nimport { styled } from '@mui/material/styles';\n\nexport type TooltipProps = MuiTooltipProps\n\nconst StyledTooltip = styled(MuiTooltip)(({ theme }) => ({\n '& .MuiTooltip-tooltip': {\n backgroundColor: theme.palette.grey[800],\n color: theme.palette.common.white,\n fontSize: '12px',\n padding: '8px 12px',\n borderRadius: '4px',\n },\n '& .MuiTooltip-arrow': {\n color: theme.palette.grey[800],\n },\n}));\n\nexport const Tooltip = React.forwardRef<HTMLElement, TooltipProps>(function Tooltip(props, ref) {\n // MUI Tooltip forwards the ref to its child trigger element. Since the child\n // is consumer-provided, we type the ref as a generic HTMLElement.\n return <StyledTooltip ref={ref as React.Ref<HTMLElement>} {...props} />;\n});\n\n","import React from 'react';\nimport {\n LinearProgress,\n CircularProgress,\n styled,\n} from '@mui/material';\n\nexport type ProgressVariant = 'linear' | 'circular';\n\nexport interface ProgressProps {\n variant?: ProgressVariant;\n value?: number;\n size?: number;\n thickness?: number;\n}\n\nconst StyledLinearProgress = styled(LinearProgress)(({ theme }) => ({\n height: 4,\n borderRadius: 2,\n backgroundColor: theme.palette.grey[200],\n '& .MuiLinearProgress-bar': {\n backgroundColor: theme.palette.primary.main,\n borderRadius: 2,\n },\n}));\n\nconst StyledCircularProgress = styled(CircularProgress)(({ theme }) => ({\n color: theme.palette.primary.main,\n}));\n\nexport const Progress: React.FC<ProgressProps> = ({\n variant = 'linear',\n value,\n size = 40,\n thickness = 4,\n}) => {\n if (variant === 'circular') {\n return <StyledCircularProgress size={size} thickness={thickness} />;\n }\n\n return (\n <StyledLinearProgress\n variant={value !== undefined ? 'determinate' : 'indeterminate'}\n value={value}\n />\n );\n};\n\n","import React from 'react';\nimport MuiAlert, { AlertProps as MuiAlertProps } from '@mui/material/Alert';\nimport { AlertTitle as MuiAlertTitle } from '@mui/material';\nimport MuiSnackbar, { SnackbarProps as MuiSnackbarProps } from '@mui/material/Snackbar';\nimport { styled } from '@mui/material/styles';\n\nexport type AlertSeverity = 'success' | 'error' | 'warning' | 'info';\n\nexport interface AlertProps extends Omit<MuiAlertProps, 'severity'> {\n severity?: AlertSeverity;\n /**\n * Title to display above the alert message\n */\n title?: string;\n}\n\nconst StyledAlert = styled(MuiAlert)({\n borderRadius: 8,\n '&.MuiAlert-filled': {\n borderRadius: 8,\n },\n});\n\nexport const Alert = React.forwardRef<HTMLDivElement, AlertProps>(function Alert(\n { severity = 'info', title, children, ...props },\n ref,\n) {\n return (\n <StyledAlert ref={ref} severity={severity} {...props}>\n {title && <MuiAlertTitle>{title}</MuiAlertTitle>}\n {children}\n </StyledAlert>\n );\n});\n\nexport { MuiAlertTitle as AlertTitle };\n\nexport interface SnackbarProps extends Omit<MuiSnackbarProps, 'children'> {\n /**\n * Message to display in the snackbar\n */\n message?: string;\n /**\n * Severity of the alert inside snackbar\n */\n severity?: AlertSeverity;\n /**\n * Title to display in the alert (optional)\n */\n title?: string;\n /**\n * Alert variant\n * @default 'filled'\n */\n variant?: 'filled' | 'standard' | 'outlined';\n /**\n * Callback when snackbar is closed\n */\n onClose?: () => void;\n /**\n * Children to render instead of message (allows custom content)\n * Must be a ReactElement to match MuiSnackbar requirements\n */\n children?: React.ReactElement;\n}\n\nconst StyledSnackbar = styled(MuiSnackbar)({});\n\n// Module-scoped TransitionComponent. Bypasses MUI's enter/exit Transition\n// (which re-mounts the inner Alert on every parent re-render, killing\n// autoHide timers and re-firing aria-live) and instead lets the inner Alert\n// fade via a plain CSS opacity transition. Defined once so MUI keeps the\n// same component identity across Snackbar re-renders.\nconst StableFadeTransition = React.forwardRef<HTMLDivElement, { children: React.ReactElement }>(\n (props, ref) => {\n return React.cloneElement(props.children, {\n ref,\n style: {\n ...props.children.props.style,\n transition: 'opacity 0.3s ease-in-out',\n },\n });\n },\n);\nStableFadeTransition.displayName = 'StableFadeTransition';\n\nexport const Snackbar = React.forwardRef<HTMLDivElement, SnackbarProps>(function Snackbar(\n {\n message,\n severity = 'info',\n title,\n variant = 'filled',\n onClose,\n children,\n anchorOrigin = { vertical: 'bottom', horizontal: 'center' },\n autoHideDuration = 6000,\n ...props\n },\n ref,\n) {\n const handleClose = (_event?: React.SyntheticEvent | Event, reason?: string) => {\n // Prevent closing on clickaway if we have a custom onClose handler\n if (reason === 'clickaway' && onClose) {\n return;\n }\n onClose?.();\n };\n\n const content = children || (message ? (\n <Alert\n onClose={onClose ? handleClose : undefined}\n severity={severity}\n variant={variant}\n title={title}\n sx={{ width: '100%', borderRadius: 2 }}\n >\n {message}\n </Alert>\n ) : undefined);\n\n if (!content) {\n return null;\n }\n\n return (\n <StyledSnackbar\n ref={ref}\n anchorOrigin={anchorOrigin}\n autoHideDuration={autoHideDuration}\n onClose={handleClose}\n disableWindowBlurListener\n ClickAwayListenerProps={{\n onClickAway: () => {} // Prevent scroll issues\n }}\n TransitionComponent={StableFadeTransition}\n {...props}\n >\n {content}\n </StyledSnackbar>\n );\n});\n\n","import React from 'react';\nimport { Box, Typography } from '@mui/material';\n\nexport interface EmptyStateProps {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n action?: React.ReactNode;\n}\n\nexport const EmptyState = React.forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n { title = 'No items found', description, icon, action },\n ref,\n) {\n return (\n <Box\n ref={ref}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 6,\n textAlign: 'center',\n minHeight: 200,\n }}\n >\n {icon && (\n <Box\n sx={{\n color: 'text.secondary',\n marginBottom: 2,\n fontSize: 64,\n }}\n >\n {icon}\n </Box>\n )}\n <Typography variant=\"h6\" sx={{ marginBottom: 1, color: 'text.primary' }}>\n {title}\n </Typography>\n {description && (\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', marginBottom: 3 }}>\n {description}\n </Typography>\n )}\n {action && <Box>{action}</Box>}\n </Box>\n );\n});\n\n","import React from 'react';\nimport { Box, CircularProgress, Typography } from '@mui/material';\n\nexport interface LoadingProps {\n message?: string;\n size?: number;\n fullScreen?: boolean;\n}\n\nexport const Loading = React.forwardRef<HTMLDivElement, LoadingProps>(function Loading(\n { message = 'Loading...', size = 40, fullScreen = false },\n ref,\n) {\n const content = (\n <Box\n ref={ref}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 2,\n ...(fullScreen && {\n height: '100vh',\n width: '100vw',\n position: 'fixed',\n top: 0,\n left: 0,\n backgroundColor: 'background.default',\n zIndex: 9999,\n }),\n ...(!fullScreen && {\n padding: 4,\n }),\n }}\n >\n <CircularProgress size={size} thickness={4} />\n {message && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {message}\n </Typography>\n )}\n </Box>\n );\n\n return content;\n});\n\n","import React from 'react';\nimport { Box, CircularProgress, Typography } from '@mui/material';\n\nexport interface AppLoadingProps {\n /**\n * Loading message to display\n * @default \"Loading...\"\n */\n message?: string;\n /**\n * Logo source URL or path\n * @default \"/icons/logo.png\"\n */\n logo?: string;\n /**\n * Custom styles\n */\n sx?: any;\n}\n\n/**\n * AppLoading component - Full-screen loading indicator with logo\n * \n * @example\n * ```tsx\n * <AppLoading message=\"Initializing application...\" />\n * ```\n */\nexport const AppLoading: React.FC<AppLoadingProps> = ({\n message = 'Loading...',\n logo = '/icons/logo.png',\n sx = {},\n}) => {\n return (\n <Box\n sx={[\n {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100vh',\n width: '100vw',\n position: 'fixed',\n top: 0,\n left: 0,\n backgroundColor: 'grey.50',\n zIndex: 9999,\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n {logo && (\n <Box\n component=\"img\"\n src={logo}\n alt=\"Logo\"\n sx={{\n height: 80,\n width: 'auto',\n mb: 4,\n }}\n />\n )}\n\n <CircularProgress size={40} thickness={4} sx={{ mb: 2 }} />\n\n <Typography variant=\"body1\" color=\"text.secondary\">\n {message}\n </Typography>\n </Box>\n );\n};\n\nexport default AppLoading;\n\n","import React from 'react';\nimport {\n CircularProgress as MuiCircularProgress,\n CircularProgressProps as MuiCircularProgressProps,\n} from '@mui/material';\n\nexport interface CircularProgressProps extends MuiCircularProgressProps {\n /**\n * Size of the progress indicator\n * @default 40\n */\n size?: number | string;\n /**\n * Thickness of the progress indicator\n * @default 4\n */\n thickness?: number;\n}\n\n/**\n * CircularProgress component - wrapper around MUI CircularProgress\n * \n * @example\n * ```tsx\n * <CircularProgress size={40} thickness={4} />\n * ```\n */\nexport const CircularProgress = React.forwardRef<HTMLSpanElement, CircularProgressProps>(\n function CircularProgress({ size = 40, thickness = 4, ...props }, ref) {\n return <MuiCircularProgress ref={ref} size={size} thickness={thickness} {...props} />;\n },\n);\n\nexport default CircularProgress;\n\n"]}
|