@cere/cere-design-system 0.0.45 → 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 +165 -3080
- package/dist/index.d.ts +165 -3080
- package/dist/index.js +320 -10082
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +262 -9983
- 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/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,490 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Card,
|
|
3
|
+
Typography
|
|
4
|
+
} from "./chunk-KVBMZNWT.mjs";
|
|
5
|
+
import {
|
|
6
|
+
TextField
|
|
7
|
+
} from "./chunk-ZP26PGMS.mjs";
|
|
8
|
+
import {
|
|
9
|
+
fontFamilyMono,
|
|
10
|
+
motion,
|
|
11
|
+
webSurfaceTokens
|
|
12
|
+
} from "./chunk-PWF2NJDB.mjs";
|
|
13
|
+
|
|
14
|
+
// src/components/inputs/CopyableField.tsx
|
|
15
|
+
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
16
|
+
import Box from "@mui/material/Box";
|
|
17
|
+
import { styled } from "@mui/material/styles";
|
|
18
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
19
|
+
var ValueButton = styled("button")({
|
|
20
|
+
fontFamily: fontFamilyMono,
|
|
21
|
+
fontSize: "11.5px",
|
|
22
|
+
fontWeight: 400,
|
|
23
|
+
lineHeight: 1.45,
|
|
24
|
+
padding: "8px 10px",
|
|
25
|
+
borderRadius: "8px",
|
|
26
|
+
backgroundColor: webSurfaceTokens.surfaceMid,
|
|
27
|
+
border: `1px solid ${webSurfaceTokens.strokeOnLow}`,
|
|
28
|
+
color: webSurfaceTokens.textSecondary,
|
|
29
|
+
wordBreak: "break-all",
|
|
30
|
+
display: "block",
|
|
31
|
+
width: "100%",
|
|
32
|
+
textAlign: "left",
|
|
33
|
+
cursor: "pointer",
|
|
34
|
+
appearance: "none",
|
|
35
|
+
transition: `background ${motion.dur.fast} ${motion.ease.standard},
|
|
36
|
+
border-color ${motion.dur.fast} ${motion.ease.standard},
|
|
37
|
+
color ${motion.dur.fast} ${motion.ease.standard}`,
|
|
38
|
+
"&:hover": {
|
|
39
|
+
backgroundColor: webSurfaceTokens.surfaceContrast,
|
|
40
|
+
borderColor: webSurfaceTokens.strokeOnMed,
|
|
41
|
+
color: webSurfaceTokens.textPrimary
|
|
42
|
+
},
|
|
43
|
+
"&:active": {
|
|
44
|
+
transform: "translateY(1px)"
|
|
45
|
+
},
|
|
46
|
+
"&:focus-visible": {
|
|
47
|
+
outline: "none",
|
|
48
|
+
boxShadow: webSurfaceTokens.shadowFocus
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
var FlashLabel = styled("span")({
|
|
52
|
+
fontSize: "11px",
|
|
53
|
+
fontWeight: 600,
|
|
54
|
+
color: webSurfaceTokens.cVioletDark,
|
|
55
|
+
letterSpacing: "0.04em",
|
|
56
|
+
"@media (prefers-reduced-motion: no-preference)": {
|
|
57
|
+
animation: "cere-copyable-flash 180ms ease-out"
|
|
58
|
+
},
|
|
59
|
+
"@keyframes cere-copyable-flash": {
|
|
60
|
+
from: { opacity: 0, transform: "translateY(-2px)" },
|
|
61
|
+
to: { opacity: 1, transform: "translateY(0)" }
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
var CopyableField = React.forwardRef(
|
|
65
|
+
function CopyableField2({ value, label, ariaLabel, flashDurationMs = 1400, flashLabel = "Copied", onCopy }, ref) {
|
|
66
|
+
const [copied, setCopied] = useState(false);
|
|
67
|
+
const timerRef = useRef(null);
|
|
68
|
+
useEffect(
|
|
69
|
+
() => () => {
|
|
70
|
+
if (timerRef.current) clearTimeout(timerRef.current);
|
|
71
|
+
},
|
|
72
|
+
[]
|
|
73
|
+
);
|
|
74
|
+
const handleCopy = useCallback(async () => {
|
|
75
|
+
try {
|
|
76
|
+
await navigator.clipboard.writeText(value);
|
|
77
|
+
setCopied(true);
|
|
78
|
+
onCopy?.(value);
|
|
79
|
+
if (timerRef.current) clearTimeout(timerRef.current);
|
|
80
|
+
timerRef.current = setTimeout(() => setCopied(false), flashDurationMs);
|
|
81
|
+
} catch {
|
|
82
|
+
}
|
|
83
|
+
}, [value, onCopy, flashDurationMs]);
|
|
84
|
+
return /* @__PURE__ */ jsxs(Card, { ref, variant: "tinted", sx: { p: 1.75 }, children: [
|
|
85
|
+
/* @__PURE__ */ jsxs(
|
|
86
|
+
Box,
|
|
87
|
+
{
|
|
88
|
+
sx: {
|
|
89
|
+
display: "flex",
|
|
90
|
+
alignItems: "center",
|
|
91
|
+
justifyContent: "space-between",
|
|
92
|
+
gap: 1,
|
|
93
|
+
mb: label || copied ? "6px" : 0,
|
|
94
|
+
minHeight: label || copied ? void 0 : 0
|
|
95
|
+
},
|
|
96
|
+
children: [
|
|
97
|
+
label ? /* @__PURE__ */ jsx(Typography, { variant: "overline", children: label }) : /* @__PURE__ */ jsx("span", {}),
|
|
98
|
+
/* @__PURE__ */ jsx(FlashLabel, { role: "status", "aria-live": "polite", "aria-atomic": "true", children: copied ? flashLabel : "" })
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
),
|
|
102
|
+
/* @__PURE__ */ jsx(
|
|
103
|
+
ValueButton,
|
|
104
|
+
{
|
|
105
|
+
type: "button",
|
|
106
|
+
onClick: handleCopy,
|
|
107
|
+
"aria-label": ariaLabel ?? `Copy ${value}`,
|
|
108
|
+
children: value
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
] });
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
// src/components/inputs/SearchField.tsx
|
|
116
|
+
import React2, { useEffect as useEffect3, useState as useState2 } from "react";
|
|
117
|
+
import SearchIcon from "@mui/icons-material/Search";
|
|
118
|
+
import InputAdornment from "@mui/material/InputAdornment";
|
|
119
|
+
import Box2 from "@mui/material/Box";
|
|
120
|
+
import { useTheme } from "@mui/material/styles";
|
|
121
|
+
|
|
122
|
+
// src/components/inputs/useSearchHotkeys.ts
|
|
123
|
+
import { useEffect as useEffect2 } from "react";
|
|
124
|
+
function isMacPlatform() {
|
|
125
|
+
if (typeof navigator === "undefined") return false;
|
|
126
|
+
const uaDataPlatform = navigator.userAgentData?.platform;
|
|
127
|
+
if (typeof uaDataPlatform === "string") return /mac/i.test(uaDataPlatform);
|
|
128
|
+
return /Mac|iPhone|iPad|iPod/i.test(navigator.platform);
|
|
129
|
+
}
|
|
130
|
+
function useSearchHotkeys(inputRef, options = {}) {
|
|
131
|
+
const { k: enableK = true, slash: enableSlash = true } = options;
|
|
132
|
+
useEffect2(() => {
|
|
133
|
+
if (!enableK && !enableSlash) return;
|
|
134
|
+
const mac = isMacPlatform();
|
|
135
|
+
function onKeyDown(event) {
|
|
136
|
+
if (enableK && event.key.toLowerCase() === "k") {
|
|
137
|
+
const correctMod = mac ? event.metaKey && !event.ctrlKey : event.ctrlKey && !event.metaKey;
|
|
138
|
+
if (correctMod && !event.shiftKey && !event.altKey) {
|
|
139
|
+
event.preventDefault();
|
|
140
|
+
inputRef.current?.focus();
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (enableSlash && event.key === "/") {
|
|
145
|
+
const target = event.target;
|
|
146
|
+
const typingInField = target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || (target?.isContentEditable ?? false);
|
|
147
|
+
if (!typingInField) {
|
|
148
|
+
event.preventDefault();
|
|
149
|
+
inputRef.current?.focus();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
window.addEventListener("keydown", onKeyDown);
|
|
154
|
+
return () => window.removeEventListener("keydown", onKeyDown);
|
|
155
|
+
}, [inputRef, enableK, enableSlash]);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// src/components/inputs/SearchField.tsx
|
|
159
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
160
|
+
var ShortcutHint = () => {
|
|
161
|
+
const [mounted, setMounted] = useState2(false);
|
|
162
|
+
useEffect3(() => {
|
|
163
|
+
setMounted(true);
|
|
164
|
+
}, []);
|
|
165
|
+
if (!mounted) return null;
|
|
166
|
+
const isMac = isMacPlatform();
|
|
167
|
+
const label = isMac ? "\u2318\u2009K" : "Ctrl + K";
|
|
168
|
+
return /* @__PURE__ */ jsx2(
|
|
169
|
+
Box2,
|
|
170
|
+
{
|
|
171
|
+
component: "span",
|
|
172
|
+
"aria-hidden": true,
|
|
173
|
+
sx: {
|
|
174
|
+
fontFamily: "monospace",
|
|
175
|
+
fontSize: 11,
|
|
176
|
+
letterSpacing: 0.4,
|
|
177
|
+
px: 0.75,
|
|
178
|
+
py: 0.25,
|
|
179
|
+
borderRadius: 1,
|
|
180
|
+
border: "1px solid",
|
|
181
|
+
borderColor: "divider",
|
|
182
|
+
color: "text.secondary",
|
|
183
|
+
lineHeight: 1
|
|
184
|
+
},
|
|
185
|
+
children: label
|
|
186
|
+
}
|
|
187
|
+
);
|
|
188
|
+
};
|
|
189
|
+
var SearchField = React2.forwardRef(
|
|
190
|
+
function SearchField2({
|
|
191
|
+
placeholder = "Search...",
|
|
192
|
+
onSearch,
|
|
193
|
+
onChange,
|
|
194
|
+
variant = "standard",
|
|
195
|
+
shortcutHint = false,
|
|
196
|
+
sx,
|
|
197
|
+
...props
|
|
198
|
+
}, ref) {
|
|
199
|
+
const theme = useTheme();
|
|
200
|
+
const handleChange = (e) => {
|
|
201
|
+
onChange?.(e);
|
|
202
|
+
onSearch?.(e.target.value);
|
|
203
|
+
};
|
|
204
|
+
const pillInputSx = variant === "pill" ? { borderRadius: "999px", paddingRight: "6px" } : void 0;
|
|
205
|
+
return /* @__PURE__ */ jsx2(
|
|
206
|
+
TextField,
|
|
207
|
+
{
|
|
208
|
+
ref,
|
|
209
|
+
placeholder,
|
|
210
|
+
onChange: handleChange,
|
|
211
|
+
sx,
|
|
212
|
+
slotProps: {
|
|
213
|
+
input: {
|
|
214
|
+
...pillInputSx ? { sx: pillInputSx } : {},
|
|
215
|
+
startAdornment: /* @__PURE__ */ jsx2(InputAdornment, { position: "start", children: /* @__PURE__ */ jsx2(SearchIcon, { style: { fontSize: 18, color: theme.palette.text.disabled } }) }),
|
|
216
|
+
endAdornment: shortcutHint ? /* @__PURE__ */ jsx2(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx2(ShortcutHint, {}) }) : void 0
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
...props
|
|
220
|
+
}
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
// src/components/inputs/FormControl.tsx
|
|
226
|
+
import {
|
|
227
|
+
FormControl,
|
|
228
|
+
FormLabel,
|
|
229
|
+
FormHelperText,
|
|
230
|
+
FormControlLabel,
|
|
231
|
+
InputLabel,
|
|
232
|
+
InputAdornment as InputAdornment2
|
|
233
|
+
} from "@mui/material";
|
|
234
|
+
|
|
235
|
+
// src/components/inputs/ToggleButton.tsx
|
|
236
|
+
import {
|
|
237
|
+
ToggleButton as MuiToggleButton,
|
|
238
|
+
ToggleButtonGroup as MuiToggleButtonGroup
|
|
239
|
+
} from "@mui/material";
|
|
240
|
+
import { styled as styled2 } from "@mui/material/styles";
|
|
241
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
242
|
+
var ToggleButton = (props) => {
|
|
243
|
+
return /* @__PURE__ */ jsx3(MuiToggleButton, { ...props });
|
|
244
|
+
};
|
|
245
|
+
var StyledToggleButtonGroup = styled2(MuiToggleButtonGroup)(({ theme }) => ({
|
|
246
|
+
"& .MuiToggleButton-root": {
|
|
247
|
+
border: `1px solid ${theme.palette.grey[300]}`,
|
|
248
|
+
"&.Mui-selected": {
|
|
249
|
+
backgroundColor: theme.palette.primary.main,
|
|
250
|
+
color: theme.palette.primary.contrastText,
|
|
251
|
+
"&:hover": {
|
|
252
|
+
backgroundColor: theme.palette.primary.light
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
"&:hover": {
|
|
256
|
+
backgroundColor: theme.palette.grey[50]
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}));
|
|
260
|
+
var ToggleButtonGroup = (props) => {
|
|
261
|
+
return /* @__PURE__ */ jsx3(StyledToggleButtonGroup, { ...props });
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
// src/components/inputs/Switch.tsx
|
|
265
|
+
import MuiSwitch from "@mui/material/Switch";
|
|
266
|
+
import { styled as styled3 } from "@mui/material/styles";
|
|
267
|
+
import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
268
|
+
var StyledSwitch = styled3(MuiSwitch)(({ theme }) => ({
|
|
269
|
+
width: 44,
|
|
270
|
+
height: 24,
|
|
271
|
+
padding: 0,
|
|
272
|
+
"& .MuiSwitch-switchBase": {
|
|
273
|
+
padding: 0,
|
|
274
|
+
margin: 2,
|
|
275
|
+
transitionDuration: "300ms",
|
|
276
|
+
"&.Mui-checked": {
|
|
277
|
+
transform: "translateX(20px)",
|
|
278
|
+
color: theme.palette.common.white,
|
|
279
|
+
"& + .MuiSwitch-track": {
|
|
280
|
+
backgroundColor: theme.palette.success.main,
|
|
281
|
+
opacity: 1,
|
|
282
|
+
border: 0
|
|
283
|
+
},
|
|
284
|
+
"&.Mui-disabled + .MuiSwitch-track": {
|
|
285
|
+
opacity: 0.5
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
"&.Mui-focusVisible .MuiSwitch-thumb": {
|
|
289
|
+
color: theme.palette.success.main,
|
|
290
|
+
border: `6px solid ${theme.palette.common.white}`
|
|
291
|
+
},
|
|
292
|
+
"&.Mui-disabled .MuiSwitch-thumb": {
|
|
293
|
+
color: theme.palette.grey[300]
|
|
294
|
+
},
|
|
295
|
+
"&.Mui-disabled + .MuiSwitch-track": {
|
|
296
|
+
opacity: 0.5,
|
|
297
|
+
backgroundColor: theme.palette.grey[300]
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
"& .MuiSwitch-thumb": {
|
|
301
|
+
boxSizing: "border-box",
|
|
302
|
+
width: 20,
|
|
303
|
+
height: 20
|
|
304
|
+
},
|
|
305
|
+
"& .MuiSwitch-track": {
|
|
306
|
+
borderRadius: 24 / 2,
|
|
307
|
+
backgroundColor: theme.palette.grey[300],
|
|
308
|
+
opacity: 1,
|
|
309
|
+
transition: theme.transitions.create(["background-color"], {
|
|
310
|
+
duration: 500
|
|
311
|
+
})
|
|
312
|
+
}
|
|
313
|
+
}));
|
|
314
|
+
var Switch = ({
|
|
315
|
+
label,
|
|
316
|
+
labelPosition = "right",
|
|
317
|
+
...props
|
|
318
|
+
}) => {
|
|
319
|
+
const switchComponent = /* @__PURE__ */ jsx4(StyledSwitch, { ...props });
|
|
320
|
+
if (!label) {
|
|
321
|
+
return switchComponent;
|
|
322
|
+
}
|
|
323
|
+
return /* @__PURE__ */ jsxs2("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
|
|
324
|
+
labelPosition === "left" && /* @__PURE__ */ jsx4("span", { children: label }),
|
|
325
|
+
switchComponent,
|
|
326
|
+
labelPosition === "right" && /* @__PURE__ */ jsx4("span", { children: label })
|
|
327
|
+
] });
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
// src/components/inputs/Checkbox.tsx
|
|
331
|
+
import MuiCheckbox from "@mui/material/Checkbox";
|
|
332
|
+
import { styled as styled4 } from "@mui/material/styles";
|
|
333
|
+
import FormControlLabel2 from "@mui/material/FormControlLabel";
|
|
334
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
335
|
+
var StyledCheckbox = styled4(MuiCheckbox)(({ theme }) => ({
|
|
336
|
+
color: theme.palette.grey[400],
|
|
337
|
+
"&.Mui-checked": {
|
|
338
|
+
color: theme.palette.primary.main
|
|
339
|
+
},
|
|
340
|
+
"&.MuiCheckbox-indeterminate": {
|
|
341
|
+
color: theme.palette.primary.main
|
|
342
|
+
},
|
|
343
|
+
"&.Mui-disabled": {
|
|
344
|
+
color: theme.palette.grey[300]
|
|
345
|
+
},
|
|
346
|
+
"&:hover": {
|
|
347
|
+
backgroundColor: theme.palette.background.selected
|
|
348
|
+
},
|
|
349
|
+
"&.Mui-focusVisible": {
|
|
350
|
+
outline: `2px solid ${theme.palette.primary.main}`,
|
|
351
|
+
outlineOffset: 2
|
|
352
|
+
}
|
|
353
|
+
}));
|
|
354
|
+
var Checkbox = ({
|
|
355
|
+
label,
|
|
356
|
+
labelPosition = "right",
|
|
357
|
+
...props
|
|
358
|
+
}) => {
|
|
359
|
+
const checkboxComponent = /* @__PURE__ */ jsx5(StyledCheckbox, { ...props });
|
|
360
|
+
if (!label) {
|
|
361
|
+
return checkboxComponent;
|
|
362
|
+
}
|
|
363
|
+
const labelPlacementMap = {
|
|
364
|
+
left: "start",
|
|
365
|
+
right: "end"
|
|
366
|
+
};
|
|
367
|
+
return /* @__PURE__ */ jsx5(
|
|
368
|
+
FormControlLabel2,
|
|
369
|
+
{
|
|
370
|
+
control: checkboxComponent,
|
|
371
|
+
label,
|
|
372
|
+
labelPlacement: labelPlacementMap[labelPosition] || "end"
|
|
373
|
+
}
|
|
374
|
+
);
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
// src/components/inputs/Radio.tsx
|
|
378
|
+
import MuiRadio from "@mui/material/Radio";
|
|
379
|
+
import { styled as styled5 } from "@mui/material/styles";
|
|
380
|
+
import FormControlLabel3 from "@mui/material/FormControlLabel";
|
|
381
|
+
import RadioGroup from "@mui/material/RadioGroup";
|
|
382
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
383
|
+
var StyledRadio = styled5(MuiRadio)(({ theme }) => ({
|
|
384
|
+
color: theme.palette.grey[400],
|
|
385
|
+
"&.Mui-checked": {
|
|
386
|
+
color: theme.palette.primary.main
|
|
387
|
+
},
|
|
388
|
+
"&.Mui-disabled": {
|
|
389
|
+
color: theme.palette.grey[300]
|
|
390
|
+
},
|
|
391
|
+
"&:hover": {
|
|
392
|
+
backgroundColor: theme.palette.background.selected
|
|
393
|
+
},
|
|
394
|
+
"&.Mui-focusVisible": {
|
|
395
|
+
outline: `2px solid ${theme.palette.primary.main}`,
|
|
396
|
+
outlineOffset: 2
|
|
397
|
+
}
|
|
398
|
+
}));
|
|
399
|
+
var Radio = ({
|
|
400
|
+
label,
|
|
401
|
+
labelPosition = "right",
|
|
402
|
+
...props
|
|
403
|
+
}) => {
|
|
404
|
+
const radioComponent = /* @__PURE__ */ jsx6(StyledRadio, { ...props });
|
|
405
|
+
if (!label) {
|
|
406
|
+
return radioComponent;
|
|
407
|
+
}
|
|
408
|
+
const labelPlacementMap = {
|
|
409
|
+
left: "start",
|
|
410
|
+
right: "end"
|
|
411
|
+
};
|
|
412
|
+
return /* @__PURE__ */ jsx6(
|
|
413
|
+
FormControlLabel3,
|
|
414
|
+
{
|
|
415
|
+
control: radioComponent,
|
|
416
|
+
label,
|
|
417
|
+
labelPlacement: labelPlacementMap[labelPosition] || "end"
|
|
418
|
+
}
|
|
419
|
+
);
|
|
420
|
+
};
|
|
421
|
+
|
|
422
|
+
// src/components/inputs/DateRangePicker/DateRangePicker.tsx
|
|
423
|
+
import Stack from "@mui/material/Stack";
|
|
424
|
+
import Typography2 from "@mui/material/Typography";
|
|
425
|
+
import { DatePicker } from "@mui/x-date-pickers/DatePicker";
|
|
426
|
+
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
|
|
427
|
+
import { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFnsV3";
|
|
428
|
+
import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
429
|
+
var DateRangePicker = ({
|
|
430
|
+
startDate,
|
|
431
|
+
endDate,
|
|
432
|
+
onStartDateChange,
|
|
433
|
+
onEndDateChange,
|
|
434
|
+
minDate,
|
|
435
|
+
maxDate,
|
|
436
|
+
disabled = false,
|
|
437
|
+
size = "small"
|
|
438
|
+
}) => {
|
|
439
|
+
return /* @__PURE__ */ jsx7(LocalizationProvider, { dateAdapter: AdapterDateFns, children: /* @__PURE__ */ jsxs3(Stack, { direction: "row", spacing: 1, alignItems: "center", children: [
|
|
440
|
+
/* @__PURE__ */ jsx7(
|
|
441
|
+
DatePicker,
|
|
442
|
+
{
|
|
443
|
+
label: "Start date",
|
|
444
|
+
value: startDate,
|
|
445
|
+
onChange: onStartDateChange,
|
|
446
|
+
minDate,
|
|
447
|
+
maxDate: endDate ?? maxDate,
|
|
448
|
+
disabled,
|
|
449
|
+
slotProps: {
|
|
450
|
+
textField: { size }
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
),
|
|
454
|
+
/* @__PURE__ */ jsx7(Typography2, { variant: "body2", color: "text.secondary", children: "\u2013" }),
|
|
455
|
+
/* @__PURE__ */ jsx7(
|
|
456
|
+
DatePicker,
|
|
457
|
+
{
|
|
458
|
+
label: "End date",
|
|
459
|
+
value: endDate,
|
|
460
|
+
onChange: onEndDateChange,
|
|
461
|
+
minDate: startDate ?? minDate,
|
|
462
|
+
maxDate,
|
|
463
|
+
disabled,
|
|
464
|
+
slotProps: {
|
|
465
|
+
textField: { size }
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
)
|
|
469
|
+
] }) });
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
export {
|
|
473
|
+
CopyableField,
|
|
474
|
+
useSearchHotkeys,
|
|
475
|
+
SearchField,
|
|
476
|
+
FormControl,
|
|
477
|
+
FormLabel,
|
|
478
|
+
FormHelperText,
|
|
479
|
+
FormControlLabel,
|
|
480
|
+
InputLabel,
|
|
481
|
+
InputAdornment2 as InputAdornment,
|
|
482
|
+
ToggleButton,
|
|
483
|
+
ToggleButtonGroup,
|
|
484
|
+
Switch,
|
|
485
|
+
Checkbox,
|
|
486
|
+
RadioGroup,
|
|
487
|
+
Radio,
|
|
488
|
+
DateRangePicker
|
|
489
|
+
};
|
|
490
|
+
//# sourceMappingURL=chunk-3WCMINE5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/inputs/CopyableField.tsx","../src/components/inputs/SearchField.tsx","../src/components/inputs/useSearchHotkeys.ts","../src/components/inputs/FormControl.tsx","../src/components/inputs/ToggleButton.tsx","../src/components/inputs/Switch.tsx","../src/components/inputs/Checkbox.tsx","../src/components/inputs/Radio.tsx","../src/components/inputs/DateRangePicker/DateRangePicker.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport Box from '@mui/material/Box';\nimport { styled } from '@mui/material/styles';\nimport { Card } from '../layout/Card';\nimport { Typography } from '../layout/Typography';\nimport {\n fontFamilyMono,\n} from '../../theme/typography';\nimport { motion } from '../../theme/motion';\nimport { webSurfaceTokens } from '../../theme/webSurfaceTokens';\n\nexport interface CopyableFieldProps {\n /** The string copied to the clipboard. Also rendered as the button label. */\n value: string;\n /** Small label rendered above the value (overline-styled). */\n label?: React.ReactNode;\n /** Custom aria-label; defaults to \"Copy {value}\". */\n ariaLabel?: string;\n /** How long the \"Copied\" flash stays visible, in ms. @default 1400 */\n flashDurationMs?: number;\n /** Text shown during the flash. @default \"Copied\" */\n flashLabel?: string;\n /** Optional callback invoked after a successful copy. */\n onCopy?: (value: string) => void;\n}\n\nconst ValueButton = styled('button')({\n fontFamily: fontFamilyMono,\n fontSize: '11.5px',\n fontWeight: 400,\n lineHeight: 1.45,\n padding: '8px 10px',\n borderRadius: '8px',\n backgroundColor: webSurfaceTokens.surfaceMid,\n border: `1px solid ${webSurfaceTokens.strokeOnLow}`,\n color: webSurfaceTokens.textSecondary,\n wordBreak: 'break-all',\n display: 'block',\n width: '100%',\n textAlign: 'left',\n cursor: 'pointer',\n appearance: 'none',\n transition: `background ${motion.dur.fast} ${motion.ease.standard},\n border-color ${motion.dur.fast} ${motion.ease.standard},\n color ${motion.dur.fast} ${motion.ease.standard}`,\n '&:hover': {\n backgroundColor: webSurfaceTokens.surfaceContrast,\n borderColor: webSurfaceTokens.strokeOnMed,\n color: webSurfaceTokens.textPrimary,\n },\n '&:active': {\n transform: 'translateY(1px)',\n },\n '&:focus-visible': {\n outline: 'none',\n boxShadow: webSurfaceTokens.shadowFocus,\n },\n});\n\nconst FlashLabel = styled('span')({\n fontSize: '11px',\n fontWeight: 600,\n color: webSurfaceTokens.cVioletDark,\n letterSpacing: '0.04em',\n '@media (prefers-reduced-motion: no-preference)': {\n animation: 'cere-copyable-flash 180ms ease-out',\n },\n '@keyframes cere-copyable-flash': {\n from: { opacity: 0, transform: 'translateY(-2px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n },\n});\n\n/**\n * Tinted card with a label row and a monospace, click-to-copy value button.\n * Replaces ad-hoc `.share-card / .url / .share-card__flash` markup.\n */\nexport const CopyableField = React.forwardRef<HTMLElement, CopyableFieldProps>(\n function CopyableField(\n { value, label, ariaLabel, flashDurationMs = 1400, flashLabel = 'Copied', onCopy },\n ref,\n ) {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n [],\n );\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopy?.(value);\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), flashDurationMs);\n } catch {\n // Clipboard blocked (insecure context / permissions). The value is\n // still visible as plain text — silently no-op.\n }\n }, [value, onCopy, flashDurationMs]);\n\n return (\n <Card ref={ref} variant=\"tinted\" sx={{ p: 1.75 }}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n mb: label || copied ? '6px' : 0,\n minHeight: label || copied ? undefined : 0,\n }}\n >\n {label ? <Typography variant=\"overline\">{label}</Typography> : <span />}\n {/*\n * Live region stays mounted (even when empty) so SRs reliably\n * announce the swap to flashLabel after a copy. The visual flash\n * uses the same node, so we don't double-render the text.\n */}\n <FlashLabel role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {copied ? flashLabel : ''}\n </FlashLabel>\n </Box>\n <ValueButton\n type=\"button\"\n onClick={handleCopy}\n aria-label={ariaLabel ?? `Copy ${value}`}\n >\n {value}\n </ValueButton>\n </Card>\n );\n },\n);\n","import React, { useEffect, useState } from 'react';\nimport { TextField, TextFieldProps } from './TextField';\nimport SearchIcon from '@mui/icons-material/Search';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Box from '@mui/material/Box';\nimport { useTheme } from '@mui/material/styles';\nimport { isMacPlatform } from './useSearchHotkeys';\n\nexport type SearchFieldVariant = 'standard' | 'pill';\n\nexport interface SearchFieldProps extends Omit<TextFieldProps, 'InputProps' | 'variant'> {\n placeholder?: string;\n /** Fires with the next input value on every change. */\n onSearch?: (value: string) => void;\n /** Visual treatment. `pill` renders a fully-rounded input. @default 'standard' */\n variant?: SearchFieldVariant;\n /**\n * Show a keyboard-shortcut hint adornment (⌘ K on Mac, Ctrl + K elsewhere) at\n * the right edge. Pair with `useSearchHotkeys` to wire the key handler.\n */\n shortcutHint?: boolean;\n}\n\nconst ShortcutHint = () => {\n // We render nothing on the server (and on the first client render) because\n // we have no reliable SSR signal for platform — `navigator.platform` is only\n // available after hydration. Rendering either default (⌘ or Ctrl) would be\n // wrong roughly half the time, so we accept a one-frame flash and swap to\n // the correct glyph in a post-mount effect. The hint is decorative.\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n setMounted(true);\n }, []);\n if (!mounted) return null;\n const isMac = isMacPlatform();\n // Mac convention is the cmd glyph + a thin gap before the letter; on other\n // platforms the explicit \"Ctrl + K\" form reads better than \"CtrlK\".\n const label = isMac ? '⌘ K' : 'Ctrl + K';\n return (\n <Box\n component=\"span\"\n aria-hidden\n sx={{\n fontFamily: 'monospace',\n fontSize: 11,\n letterSpacing: 0.4,\n px: 0.75,\n py: 0.25,\n borderRadius: 1,\n border: '1px solid',\n borderColor: 'divider',\n color: 'text.secondary',\n lineHeight: 1,\n }}\n >\n {label}\n </Box>\n );\n};\n\nexport const SearchField = React.forwardRef<HTMLDivElement, SearchFieldProps>(\n function SearchField(\n {\n placeholder = 'Search...',\n onSearch,\n onChange,\n variant = 'standard',\n shortcutHint = false,\n sx,\n ...props\n },\n ref,\n ) {\n const theme = useTheme();\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e);\n onSearch?.(e.target.value);\n };\n\n const pillInputSx =\n variant === 'pill'\n ? { borderRadius: '999px', paddingRight: '6px' }\n : undefined;\n\n return (\n <TextField\n ref={ref}\n placeholder={placeholder}\n onChange={handleChange}\n sx={sx}\n slotProps={{\n input: {\n ...(pillInputSx ? { sx: pillInputSx } : {}),\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon style={{ fontSize: 18, color: theme.palette.text.disabled }} />\n </InputAdornment>\n ),\n endAdornment: shortcutHint ? (\n <InputAdornment position=\"end\">\n <ShortcutHint />\n </InputAdornment>\n ) : undefined,\n },\n }}\n {...props}\n />\n );\n },\n);\n","import { RefObject, useEffect } from 'react';\n\nexport interface UseSearchHotkeysOptions {\n /** Cmd/Ctrl + K focuses the ref. @default true */\n k?: boolean;\n /** `/` (when not already typing in another field) focuses the ref. @default true */\n slash?: boolean;\n}\n\n/** Detect Mac via the modern `userAgentData.platform`, falling back to `navigator.platform`. */\nexport function isMacPlatform(): boolean {\n if (typeof navigator === 'undefined') return false;\n const uaDataPlatform = (navigator as Navigator & { userAgentData?: { platform?: string } })\n .userAgentData?.platform;\n if (typeof uaDataPlatform === 'string') return /mac/i.test(uaDataPlatform);\n return /Mac|iPhone|iPad|iPod/i.test(navigator.platform);\n}\n\n/**\n * Wire global Cmd+K (Mac) / Ctrl+K (everywhere else) and `/` hotkeys to focus\n * the input pointed to by `inputRef`. The `/` hotkey is suppressed while the\n * user is typing in another input, textarea or contentEditable element so it\n * doesn't hijack normal typing. Either hotkey can be disabled via options.\n */\nexport function useSearchHotkeys(\n inputRef: RefObject<HTMLInputElement | null>,\n options: UseSearchHotkeysOptions = {},\n) {\n const { k: enableK = true, slash: enableSlash = true } = options;\n\n useEffect(() => {\n if (!enableK && !enableSlash) return;\n const mac = isMacPlatform();\n function onKeyDown(event: KeyboardEvent) {\n if (enableK && event.key.toLowerCase() === 'k') {\n // Mac users press Cmd-K (metaKey); Ctrl-K is reserved for kill-to-end-of-line.\n // Everyone else uses Ctrl-K. Exclude Shift/Alt so we don't hijack browser\n // shortcuts like Cmd+Shift+K (Chrome dev tools tab).\n const correctMod = mac ? event.metaKey && !event.ctrlKey : event.ctrlKey && !event.metaKey;\n if (correctMod && !event.shiftKey && !event.altKey) {\n event.preventDefault();\n inputRef.current?.focus();\n return;\n }\n }\n if (enableSlash && event.key === '/') {\n const target = event.target as HTMLElement | null;\n const typingInField =\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n (target?.isContentEditable ?? false);\n if (!typingInField) {\n event.preventDefault();\n inputRef.current?.focus();\n }\n }\n }\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [inputRef, enableK, enableSlash]);\n}\n","export {\n FormControl,\n FormLabel,\n FormHelperText,\n FormControlLabel,\n InputLabel,\n InputAdornment,\n} from '@mui/material';\nexport type {\n FormControlProps,\n FormLabelProps,\n FormHelperTextProps,\n FormControlLabelProps,\n InputLabelProps,\n InputAdornmentProps,\n} from '@mui/material';\n\n","import React from 'react';\nimport {\n ToggleButton as MuiToggleButton,\n ToggleButtonGroup as MuiToggleButtonGroup,\n ToggleButtonProps as MuiToggleButtonProps,\n ToggleButtonGroupProps as MuiToggleButtonGroupProps,\n} from '@mui/material';\nimport { styled } from '@mui/material/styles';\n\nexport type ToggleButtonProps = MuiToggleButtonProps\n\nexport const ToggleButton: React.FC<ToggleButtonProps> = (props) => {\n return <MuiToggleButton {...props} />;\n};\n\nexport type ToggleButtonGroupProps = MuiToggleButtonGroupProps\n\nconst StyledToggleButtonGroup = styled(MuiToggleButtonGroup)(({ theme }) => ({\n '& .MuiToggleButton-root': {\n border: `1px solid ${theme.palette.grey[300]}`,\n '&.Mui-selected': {\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n '&:hover': {\n backgroundColor: theme.palette.primary.light,\n },\n },\n '&:hover': {\n backgroundColor: theme.palette.grey[50],\n },\n },\n}));\n\nexport const ToggleButtonGroup: React.FC<ToggleButtonGroupProps> = (props) => {\n return <StyledToggleButtonGroup {...props} />;\n};\n\n","import React from 'react';\nimport MuiSwitch, { SwitchProps as MuiSwitchProps } from '@mui/material/Switch';\nimport { styled } from '@mui/material/styles';\n\nexport interface SwitchProps extends MuiSwitchProps {\n label?: string;\n labelPosition?: 'left' | 'right';\n}\n\nconst StyledSwitch = styled(MuiSwitch)(({ theme }) => ({\n width: 44,\n height: 24,\n padding: 0,\n '& .MuiSwitch-switchBase': {\n padding: 0,\n margin: 2,\n transitionDuration: '300ms',\n '&.Mui-checked': {\n transform: 'translateX(20px)',\n color: theme.palette.common.white,\n '& + .MuiSwitch-track': {\n backgroundColor: theme.palette.success.main,\n opacity: 1,\n border: 0,\n },\n '&.Mui-disabled + .MuiSwitch-track': {\n opacity: 0.5,\n },\n },\n '&.Mui-focusVisible .MuiSwitch-thumb': {\n color: theme.palette.success.main,\n border: `6px solid ${theme.palette.common.white}`,\n },\n '&.Mui-disabled .MuiSwitch-thumb': {\n color: theme.palette.grey[300],\n },\n '&.Mui-disabled + .MuiSwitch-track': {\n opacity: 0.5,\n backgroundColor: theme.palette.grey[300],\n },\n },\n '& .MuiSwitch-thumb': {\n boxSizing: 'border-box',\n width: 20,\n height: 20,\n },\n '& .MuiSwitch-track': {\n borderRadius: 24 / 2,\n backgroundColor: theme.palette.grey[300],\n opacity: 1,\n transition: theme.transitions.create(['background-color'], {\n duration: 500,\n }),\n },\n}));\n\nexport const Switch: React.FC<SwitchProps> = ({\n label,\n labelPosition = 'right',\n ...props\n}) => {\n const switchComponent = <StyledSwitch {...props} />;\n\n if (!label) {\n return switchComponent;\n }\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n {labelPosition === 'left' && <span>{label}</span>}\n {switchComponent}\n {labelPosition === 'right' && <span>{label}</span>}\n </div>\n );\n};\n\n","import React from 'react';\nimport MuiCheckbox, { CheckboxProps as MuiCheckboxProps } from '@mui/material/Checkbox';\nimport { styled } from '@mui/material/styles';\nimport FormControlLabel from '@mui/material/FormControlLabel';\n\nexport interface CheckboxProps extends Omit<MuiCheckboxProps, 'color'> {\n label?: string;\n labelPosition?: 'left' | 'right';\n}\n\nconst StyledCheckbox = styled(MuiCheckbox)(({ theme }) => ({\n color: theme.palette.grey[400],\n '&.Mui-checked': {\n color: theme.palette.primary.main,\n },\n '&.MuiCheckbox-indeterminate': {\n color: theme.palette.primary.main,\n },\n '&.Mui-disabled': {\n color: theme.palette.grey[300],\n },\n '&:hover': {\n backgroundColor: theme.palette.background.selected,\n },\n '&.Mui-focusVisible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n}));\n\nexport const Checkbox: React.FC<CheckboxProps> = ({\n label,\n labelPosition = 'right',\n ...props\n}) => {\n const checkboxComponent = <StyledCheckbox {...props} />;\n\n if (!label) {\n return checkboxComponent;\n }\n\n const labelPlacementMap: Record<string, 'start' | 'end' | 'top' | 'bottom'> = {\n left: 'start',\n right: 'end',\n };\n\n return (\n <FormControlLabel\n control={checkboxComponent}\n label={label}\n labelPlacement={labelPlacementMap[labelPosition] || 'end'}\n />\n );\n};\n\n","import React from 'react';\nimport MuiRadio, { RadioProps as MuiRadioProps } from '@mui/material/Radio';\nimport { styled } from '@mui/material/styles';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport RadioGroup from '@mui/material/RadioGroup';\n\nexport interface RadioProps extends Omit<MuiRadioProps, 'color'> {\n label?: string;\n labelPosition?: 'left' | 'right';\n}\n\nconst StyledRadio = styled(MuiRadio)(({ theme }) => ({\n color: theme.palette.grey[400],\n '&.Mui-checked': {\n color: theme.palette.primary.main,\n },\n '&.Mui-disabled': {\n color: theme.palette.grey[300],\n },\n '&:hover': {\n backgroundColor: theme.palette.background.selected,\n },\n '&.Mui-focusVisible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n}));\n\nexport const Radio: React.FC<RadioProps> = ({\n label,\n labelPosition = 'right',\n ...props\n}) => {\n const radioComponent = <StyledRadio {...props} />;\n\n if (!label) {\n return radioComponent;\n }\n\n const labelPlacementMap: Record<string, 'start' | 'end' | 'top' | 'bottom'> = {\n left: 'start',\n right: 'end',\n };\n\n return (\n <FormControlLabel\n control={radioComponent}\n label={label}\n labelPlacement={labelPlacementMap[labelPosition] || 'end'}\n />\n );\n};\n\nexport { RadioGroup };\n\n","import React from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3';\n\n/** Props for the DateRangePicker component. */\nexport interface DateRangePickerProps {\n /** The selected start date, or null if unset. */\n startDate: Date | null;\n /** The selected end date, or null if unset. */\n endDate: Date | null;\n /** Callback fired when the start date changes. */\n onStartDateChange: (date: Date | null) => void;\n /** Callback fired when the end date changes. */\n onEndDateChange: (date: Date | null) => void;\n /** Earliest selectable date for both pickers. */\n minDate?: Date;\n /** Latest selectable date for both pickers. */\n maxDate?: Date;\n /** If true, both date pickers are disabled. @default false */\n disabled?: boolean;\n /** Size of the text field inputs. @default 'small' */\n size?: 'small' | 'medium';\n}\n\nexport const DateRangePicker: React.FC<DateRangePickerProps> = ({\n startDate,\n endDate,\n onStartDateChange,\n onEndDateChange,\n minDate,\n maxDate,\n disabled = false,\n size = 'small',\n}) => {\n return (\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <DatePicker\n label=\"Start date\"\n value={startDate}\n onChange={onStartDateChange}\n minDate={minDate}\n maxDate={endDate ?? maxDate}\n disabled={disabled}\n slotProps={{\n textField: { size },\n }}\n />\n <Typography variant=\"body2\" color=\"text.secondary\">\n –\n </Typography>\n <DatePicker\n label=\"End date\"\n value={endDate}\n onChange={onEndDateChange}\n minDate={startDate ?? minDate}\n maxDate={maxDate}\n disabled={disabled}\n slotProps={{\n textField: { size },\n }}\n />\n </Stack>\n </LocalizationProvider>\n );\n};\n"],"mappings":"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","names":["CopyableField","React","useEffect","useState","Box","useEffect","jsx","useState","useEffect","Box","React","SearchField","InputAdornment","styled","jsx","styled","jsx","jsxs","styled","FormControlLabel","jsx","styled","FormControlLabel","jsx","Typography","jsx","jsxs"]}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/components/utilities/Markdown/Markdown.tsx
|
|
2
|
+
var _material = require('@mui/material');
|
|
3
|
+
require('highlight.js/styles/github.css');
|
|
4
|
+
require('github-markdown-css/github-markdown-light.css');
|
|
5
|
+
var _reactmarkdown = require('react-markdown'); var _reactmarkdown2 = _interopRequireDefault(_reactmarkdown);
|
|
6
|
+
var _rehypehighlight = require('rehype-highlight'); var _rehypehighlight2 = _interopRequireDefault(_rehypehighlight);
|
|
7
|
+
var _rehyperaw = require('rehype-raw'); var _rehyperaw2 = _interopRequireDefault(_rehyperaw);
|
|
8
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
9
|
+
var Content = _material.styled.call(void 0, (0, _material.Box))(({ theme }) => ({
|
|
10
|
+
backgroundColor: "transparent",
|
|
11
|
+
...theme.typography.body1,
|
|
12
|
+
color: theme.palette.text.primary,
|
|
13
|
+
["& a"]: {
|
|
14
|
+
color: theme.palette.primary.main
|
|
15
|
+
},
|
|
16
|
+
["& pre"]: {
|
|
17
|
+
padding: theme.spacing(2),
|
|
18
|
+
borderRadius: theme.shape.borderRadius,
|
|
19
|
+
backgroundColor: theme.palette.background.paper
|
|
20
|
+
},
|
|
21
|
+
["& code"]: {
|
|
22
|
+
borderRadius: 2,
|
|
23
|
+
backgroundColor: theme.palette.background.paper
|
|
24
|
+
}
|
|
25
|
+
}));
|
|
26
|
+
var Markdown = ({ content, children }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Content, { className: "markdown-body", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactmarkdown2.default, { rehypePlugins: [_rehypehighlight2.default, _rehyperaw2.default], children: content || children }) });
|
|
27
|
+
|
|
28
|
+
// src/components/utilities/OnboardingProvider/OnboardingProvider.tsx
|
|
29
|
+
var _react = require('react');
|
|
30
|
+
|
|
31
|
+
var OnboardingContext = _react.createContext.call(void 0, void 0);
|
|
32
|
+
var useOnboarding = () => {
|
|
33
|
+
const context = _react.useContext.call(void 0, OnboardingContext);
|
|
34
|
+
if (!context) {
|
|
35
|
+
throw new Error("useOnboarding should be used inside OnboardingProvider");
|
|
36
|
+
}
|
|
37
|
+
return context;
|
|
38
|
+
};
|
|
39
|
+
var OnboardingProvider = ({ children }) => {
|
|
40
|
+
const [isOnboardingActive, setIsOnboardingActive] = _react.useState.call(void 0, () => {
|
|
41
|
+
const savedState = localStorage.getItem("isOnboardingActive");
|
|
42
|
+
return savedState !== null ? JSON.parse(savedState) : true;
|
|
43
|
+
});
|
|
44
|
+
_react.useEffect.call(void 0, () => {
|
|
45
|
+
localStorage.setItem("isOnboardingActive", JSON.stringify(isOnboardingActive));
|
|
46
|
+
}, [isOnboardingActive]);
|
|
47
|
+
const startOnboarding = _react.useCallback.call(void 0, () => setIsOnboardingActive(true), []);
|
|
48
|
+
const stopOnboarding = _react.useCallback.call(void 0, () => {
|
|
49
|
+
setIsOnboardingActive(false);
|
|
50
|
+
}, []);
|
|
51
|
+
const restartOnboarding = _react.useCallback.call(void 0, () => {
|
|
52
|
+
setIsOnboardingActive(false);
|
|
53
|
+
setTimeout(() => setIsOnboardingActive(true), 0);
|
|
54
|
+
}, []);
|
|
55
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
56
|
+
OnboardingContext.Provider,
|
|
57
|
+
{
|
|
58
|
+
value: {
|
|
59
|
+
isOnboardingActive,
|
|
60
|
+
startOnboarding,
|
|
61
|
+
stopOnboarding,
|
|
62
|
+
restartOnboarding
|
|
63
|
+
},
|
|
64
|
+
children
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// src/components/utilities/Truncate/Truncate.tsx
|
|
70
|
+
|
|
71
|
+
var getDefaultEndingLength = ({ text, variant, maxLength = text.length }) => {
|
|
72
|
+
if (variant === "hex") {
|
|
73
|
+
return 4;
|
|
74
|
+
}
|
|
75
|
+
if (variant === "email") {
|
|
76
|
+
const [, domain] = text.split("@");
|
|
77
|
+
return domain.length + 1;
|
|
78
|
+
}
|
|
79
|
+
return Math.round(maxLength / 2);
|
|
80
|
+
};
|
|
81
|
+
var Truncate = ({
|
|
82
|
+
text,
|
|
83
|
+
variant = "text",
|
|
84
|
+
maxLength = text.length,
|
|
85
|
+
endingLength = getDefaultEndingLength({ text, variant, maxLength }),
|
|
86
|
+
...props
|
|
87
|
+
}) => {
|
|
88
|
+
let truncatedText = text;
|
|
89
|
+
if (maxLength < text.length) {
|
|
90
|
+
const ending = text.slice(-endingLength);
|
|
91
|
+
const truncated = text.slice(0, maxLength - endingLength);
|
|
92
|
+
truncatedText = [truncated, ending].filter(Boolean).join("...");
|
|
93
|
+
}
|
|
94
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { ...props, "data-full": text, children: truncatedText });
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// src/components/utilities/QRCode/QRCode.tsx
|
|
98
|
+
|
|
99
|
+
var _reactqrcode = require('react-qr-code'); var _reactqrcode2 = _interopRequireDefault(_reactqrcode);
|
|
100
|
+
|
|
101
|
+
var QRCode = _react.forwardRef.call(void 0, ({ size = 168, ...props }, ref) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactqrcode2.default, { ref, size, ...props }));
|
|
102
|
+
QRCode.displayName = "QRCode";
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
exports.Markdown = Markdown; exports.useOnboarding = useOnboarding; exports.OnboardingProvider = OnboardingProvider; exports.Truncate = Truncate; exports.QRCode = QRCode;
|
|
111
|
+
//# sourceMappingURL=chunk-463SRKKD.js.map
|