@camtomlabs/malix-design-system 0.1.7 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -0
- package/dist/index.cjs +472 -217
- package/dist/index.d.cts +148 -80
- package/dist/index.d.ts +148 -80
- package/dist/index.js +470 -218
- package/package.json +15 -9
- package/src/styles.css +225 -55
- package/src/tokens.css +80 -14
- package/src/tokens.registry.json +34 -0
- package/stylelint.config.cjs +56 -0
- package/tailwind.preset.js +173 -0
package/dist/index.js
CHANGED
|
@@ -5,15 +5,32 @@ var tokens_registry_default = {
|
|
|
5
5
|
"--malix-background-main",
|
|
6
6
|
"--malix-surface",
|
|
7
7
|
"--malix-surface-secondary",
|
|
8
|
+
"--malix-surface-elevated",
|
|
8
9
|
"--malix-surface-hover",
|
|
10
|
+
"--malix-surface-active",
|
|
11
|
+
"--malix-surface-disabled",
|
|
12
|
+
"--malix-input-bg",
|
|
13
|
+
"--malix-input-autofill-bg",
|
|
9
14
|
"--malix-foreground",
|
|
10
15
|
"--malix-foreground-secondary",
|
|
11
16
|
"--malix-foreground-tertiary",
|
|
12
17
|
"--malix-foreground-disabled",
|
|
18
|
+
"--malix-placeholder",
|
|
13
19
|
"--malix-border",
|
|
14
20
|
"--malix-border-strong",
|
|
15
21
|
"--malix-border-focus",
|
|
22
|
+
"--malix-border-disabled",
|
|
16
23
|
"--malix-overlay",
|
|
24
|
+
"--malix-overlay-backdrop",
|
|
25
|
+
"--malix-focus-ring",
|
|
26
|
+
"--malix-z-dropdown",
|
|
27
|
+
"--malix-z-sticky",
|
|
28
|
+
"--malix-z-overlay",
|
|
29
|
+
"--malix-z-modal",
|
|
30
|
+
"--malix-z-tooltip",
|
|
31
|
+
"--malix-z-notification",
|
|
32
|
+
"--malix-primary",
|
|
33
|
+
"--malix-primary-bg",
|
|
17
34
|
"--malix-cta-primary-bg",
|
|
18
35
|
"--malix-primary-hover",
|
|
19
36
|
"--malix-primary-active",
|
|
@@ -31,12 +48,25 @@ var tokens_registry_default = {
|
|
|
31
48
|
"--malix-info",
|
|
32
49
|
"--malix-info-light",
|
|
33
50
|
"--malix-info-foreground",
|
|
51
|
+
"--malix-table-header-bg",
|
|
52
|
+
"--malix-table-row-hover",
|
|
53
|
+
"--malix-table-border",
|
|
34
54
|
"--malix-glass-bg",
|
|
35
55
|
"--malix-glass-border",
|
|
36
56
|
"--malix-glass-blur",
|
|
37
57
|
"--malix-sidebar-bg",
|
|
38
58
|
"--malix-sidebar-hover-bg",
|
|
39
59
|
"--malix-sidebar-active-bg",
|
|
60
|
+
"--malix-card-bg",
|
|
61
|
+
"--malix-card-border",
|
|
62
|
+
"--malix-card-radius",
|
|
63
|
+
"--malix-input-border",
|
|
64
|
+
"--malix-nav-bg",
|
|
65
|
+
"--malix-nav-height",
|
|
66
|
+
"--malix-container-sm",
|
|
67
|
+
"--malix-container-md",
|
|
68
|
+
"--malix-container-lg",
|
|
69
|
+
"--malix-container-xl",
|
|
40
70
|
"--malix-space-xs",
|
|
41
71
|
"--malix-space-sm",
|
|
42
72
|
"--malix-space-md",
|
|
@@ -55,6 +85,10 @@ var tokens_registry_default = {
|
|
|
55
85
|
"--malix-text-lg",
|
|
56
86
|
"--malix-text-xl",
|
|
57
87
|
"--malix-text-2xl",
|
|
88
|
+
"--malix-text-3xl",
|
|
89
|
+
"--malix-text-4xl",
|
|
90
|
+
"--malix-text-5xl",
|
|
91
|
+
"--malix-text-display",
|
|
58
92
|
"--malix-font-body",
|
|
59
93
|
"--malix-font-heading",
|
|
60
94
|
"--malix-weight-normal",
|
|
@@ -120,6 +154,7 @@ import { jsx as jsx4, jsxs } from "react/jsx-runtime";
|
|
|
120
154
|
function Button({
|
|
121
155
|
hierarchy = "primary",
|
|
122
156
|
variant = "text",
|
|
157
|
+
size,
|
|
123
158
|
icon,
|
|
124
159
|
badge,
|
|
125
160
|
loading = false,
|
|
@@ -137,6 +172,7 @@ function Button({
|
|
|
137
172
|
className: "malix-button",
|
|
138
173
|
"data-hierarchy": hierarchy,
|
|
139
174
|
"data-variant": variant,
|
|
175
|
+
"data-size": size || void 0,
|
|
140
176
|
"data-loading": loading,
|
|
141
177
|
disabled: isDisabled,
|
|
142
178
|
"aria-busy": loading || void 0,
|
|
@@ -188,14 +224,64 @@ function InputGroup({
|
|
|
188
224
|
}
|
|
189
225
|
|
|
190
226
|
// src/components/Tooltip.tsx
|
|
191
|
-
import React2, { useId, useState } from "react";
|
|
227
|
+
import React2, { useId, useState, useRef, useEffect, useCallback } from "react";
|
|
228
|
+
import { createPortal } from "react-dom";
|
|
192
229
|
import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
193
|
-
function Tooltip({ content, children, placement = "top" }) {
|
|
230
|
+
function Tooltip({ content, children, placement = "top", usePortal = false }) {
|
|
194
231
|
const [open, setOpen] = useState(false);
|
|
195
232
|
const tooltipId = useId();
|
|
233
|
+
const triggerRef = useRef(null);
|
|
234
|
+
const tooltipRef = useRef(null);
|
|
235
|
+
const updatePortalPosition = useCallback(() => {
|
|
236
|
+
if (!usePortal || !open || !triggerRef.current || !tooltipRef.current) return;
|
|
237
|
+
const triggerRect = triggerRef.current.getBoundingClientRect();
|
|
238
|
+
const tooltipEl = tooltipRef.current;
|
|
239
|
+
const gap = 8;
|
|
240
|
+
tooltipEl.style.left = "0";
|
|
241
|
+
tooltipEl.style.top = "0";
|
|
242
|
+
const tooltipRect = tooltipEl.getBoundingClientRect();
|
|
243
|
+
let top = 0;
|
|
244
|
+
let left = 0;
|
|
245
|
+
switch (placement) {
|
|
246
|
+
case "top":
|
|
247
|
+
top = triggerRect.top - tooltipRect.height - gap;
|
|
248
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
|
249
|
+
break;
|
|
250
|
+
case "bottom":
|
|
251
|
+
top = triggerRect.bottom + gap;
|
|
252
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
|
253
|
+
break;
|
|
254
|
+
case "left":
|
|
255
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
|
|
256
|
+
left = triggerRect.left - tooltipRect.width - gap;
|
|
257
|
+
break;
|
|
258
|
+
case "right":
|
|
259
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
|
|
260
|
+
left = triggerRect.right + gap;
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
tooltipEl.style.top = `${top}px`;
|
|
264
|
+
tooltipEl.style.left = `${left}px`;
|
|
265
|
+
}, [usePortal, open, placement]);
|
|
266
|
+
useEffect(() => {
|
|
267
|
+
updatePortalPosition();
|
|
268
|
+
}, [updatePortalPosition]);
|
|
269
|
+
const tooltipContent = open ? /* @__PURE__ */ jsx7(
|
|
270
|
+
"span",
|
|
271
|
+
{
|
|
272
|
+
ref: tooltipRef,
|
|
273
|
+
role: "tooltip",
|
|
274
|
+
id: tooltipId,
|
|
275
|
+
className: "malix-tooltip",
|
|
276
|
+
"data-placement": placement,
|
|
277
|
+
...usePortal ? { "data-portal": "" } : {},
|
|
278
|
+
children: content
|
|
279
|
+
}
|
|
280
|
+
) : null;
|
|
196
281
|
return /* @__PURE__ */ jsxs4(
|
|
197
282
|
"span",
|
|
198
283
|
{
|
|
284
|
+
ref: triggerRef,
|
|
199
285
|
className: "malix-tooltip-wrap",
|
|
200
286
|
onMouseEnter: () => setOpen(true),
|
|
201
287
|
onMouseLeave: () => setOpen(false),
|
|
@@ -205,7 +291,7 @@ function Tooltip({ content, children, placement = "top" }) {
|
|
|
205
291
|
React2.cloneElement(children, {
|
|
206
292
|
"aria-describedby": open ? tooltipId : void 0
|
|
207
293
|
}),
|
|
208
|
-
|
|
294
|
+
usePortal ? tooltipContent && createPortal(tooltipContent, document.body) : tooltipContent
|
|
209
295
|
]
|
|
210
296
|
}
|
|
211
297
|
);
|
|
@@ -1006,12 +1092,12 @@ function SelectionCard({
|
|
|
1006
1092
|
}
|
|
1007
1093
|
|
|
1008
1094
|
// src/components/Overlay.tsx
|
|
1009
|
-
import { useEffect, useRef } from "react";
|
|
1095
|
+
import { useEffect as useEffect2, useRef as useRef2 } from "react";
|
|
1010
1096
|
import { jsx as jsx28, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
1011
1097
|
var FOCUSABLE_SELECTOR = 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';
|
|
1012
1098
|
function Overlay({ open, title, onClose, children }) {
|
|
1013
|
-
const panelRef =
|
|
1014
|
-
|
|
1099
|
+
const panelRef = useRef2(null);
|
|
1100
|
+
useEffect2(() => {
|
|
1015
1101
|
if (!open || !panelRef.current) return;
|
|
1016
1102
|
const panel = panelRef.current;
|
|
1017
1103
|
const focusables = Array.from(panel.querySelectorAll(FOCUSABLE_SELECTOR));
|
|
@@ -1056,7 +1142,7 @@ function Overlay({ open, title, onClose, children }) {
|
|
|
1056
1142
|
}
|
|
1057
1143
|
|
|
1058
1144
|
// src/components/Modal.tsx
|
|
1059
|
-
import { useEffect as
|
|
1145
|
+
import { useEffect as useEffect3, useRef as useRef3 } from "react";
|
|
1060
1146
|
import { jsx as jsx29, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
1061
1147
|
var FOCUSABLE_SELECTOR2 = 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';
|
|
1062
1148
|
function Modal({
|
|
@@ -1068,8 +1154,8 @@ function Modal({
|
|
|
1068
1154
|
cancelLabel = "Cancel",
|
|
1069
1155
|
children
|
|
1070
1156
|
}) {
|
|
1071
|
-
const panelRef =
|
|
1072
|
-
|
|
1157
|
+
const panelRef = useRef3(null);
|
|
1158
|
+
useEffect3(() => {
|
|
1073
1159
|
if (!open || !panelRef.current) return;
|
|
1074
1160
|
const panel = panelRef.current;
|
|
1075
1161
|
const focusables = Array.from(panel.querySelectorAll(FOCUSABLE_SELECTOR2));
|
|
@@ -1149,8 +1235,103 @@ function Modal({
|
|
|
1149
1235
|
) });
|
|
1150
1236
|
}
|
|
1151
1237
|
|
|
1152
|
-
// src/components/
|
|
1238
|
+
// src/components/ConfirmDialog.tsx
|
|
1239
|
+
import { useEffect as useEffect4, useRef as useRef4 } from "react";
|
|
1153
1240
|
import { jsx as jsx30, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
1241
|
+
var FOCUSABLE_SELECTOR3 = 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';
|
|
1242
|
+
function ConfirmDialog({
|
|
1243
|
+
open,
|
|
1244
|
+
title,
|
|
1245
|
+
description,
|
|
1246
|
+
onConfirm,
|
|
1247
|
+
onCancel,
|
|
1248
|
+
confirmLabel = "Confirm",
|
|
1249
|
+
cancelLabel = "Cancel",
|
|
1250
|
+
variant = "default",
|
|
1251
|
+
icon,
|
|
1252
|
+
children,
|
|
1253
|
+
loading = false
|
|
1254
|
+
}) {
|
|
1255
|
+
const panelRef = useRef4(null);
|
|
1256
|
+
useEffect4(() => {
|
|
1257
|
+
if (!open || !panelRef.current) return;
|
|
1258
|
+
const panel = panelRef.current;
|
|
1259
|
+
const focusables = Array.from(panel.querySelectorAll(FOCUSABLE_SELECTOR3));
|
|
1260
|
+
const first = focusables[0];
|
|
1261
|
+
const last = focusables[focusables.length - 1];
|
|
1262
|
+
first?.focus();
|
|
1263
|
+
function onKeyDown(event) {
|
|
1264
|
+
if (event.key === "Escape") {
|
|
1265
|
+
event.preventDefault();
|
|
1266
|
+
onCancel();
|
|
1267
|
+
}
|
|
1268
|
+
if (event.key === "Tab" && focusables.length > 0) {
|
|
1269
|
+
if (event.shiftKey && document.activeElement === first) {
|
|
1270
|
+
event.preventDefault();
|
|
1271
|
+
last?.focus();
|
|
1272
|
+
} else if (!event.shiftKey && document.activeElement === last) {
|
|
1273
|
+
event.preventDefault();
|
|
1274
|
+
first?.focus();
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
document.addEventListener("keydown", onKeyDown);
|
|
1279
|
+
return () => document.removeEventListener("keydown", onKeyDown);
|
|
1280
|
+
}, [open, onCancel]);
|
|
1281
|
+
if (!open) return null;
|
|
1282
|
+
return /* @__PURE__ */ jsx30("div", { className: "malix-overlay-backdrop", onMouseDown: onCancel, children: /* @__PURE__ */ jsxs26(
|
|
1283
|
+
"div",
|
|
1284
|
+
{
|
|
1285
|
+
ref: panelRef,
|
|
1286
|
+
className: "malix-confirm-dialog",
|
|
1287
|
+
role: "alertdialog",
|
|
1288
|
+
"aria-modal": "true",
|
|
1289
|
+
"aria-labelledby": "malix-confirm-title",
|
|
1290
|
+
"aria-describedby": description ? "malix-confirm-desc" : void 0,
|
|
1291
|
+
"data-variant": variant,
|
|
1292
|
+
onMouseDown: (event) => event.stopPropagation(),
|
|
1293
|
+
children: [
|
|
1294
|
+
/* @__PURE__ */ jsxs26("div", { className: "malix-confirm-dialog__content", children: [
|
|
1295
|
+
icon ? /* @__PURE__ */ jsx30("div", { className: "malix-confirm-dialog__icon", children: icon }) : null,
|
|
1296
|
+
/* @__PURE__ */ jsxs26("div", { className: "malix-confirm-dialog__text", children: [
|
|
1297
|
+
/* @__PURE__ */ jsx30("h3", { id: "malix-confirm-title", className: "malix-confirm-dialog__title", children: title }),
|
|
1298
|
+
description ? /* @__PURE__ */ jsx30("p", { id: "malix-confirm-desc", className: "malix-confirm-dialog__description", children: description }) : null,
|
|
1299
|
+
children
|
|
1300
|
+
] })
|
|
1301
|
+
] }),
|
|
1302
|
+
/* @__PURE__ */ jsxs26("div", { className: "malix-confirm-dialog__actions", children: [
|
|
1303
|
+
/* @__PURE__ */ jsx30(
|
|
1304
|
+
"button",
|
|
1305
|
+
{
|
|
1306
|
+
type: "button",
|
|
1307
|
+
className: "malix-button",
|
|
1308
|
+
"data-hierarchy": "secondary",
|
|
1309
|
+
onClick: onCancel,
|
|
1310
|
+
disabled: loading,
|
|
1311
|
+
children: /* @__PURE__ */ jsx30("span", { children: cancelLabel })
|
|
1312
|
+
}
|
|
1313
|
+
),
|
|
1314
|
+
/* @__PURE__ */ jsx30(
|
|
1315
|
+
"button",
|
|
1316
|
+
{
|
|
1317
|
+
type: "button",
|
|
1318
|
+
className: "malix-button malix-confirm-dialog__confirm-btn",
|
|
1319
|
+
"data-hierarchy": "primary",
|
|
1320
|
+
"data-variant": variant,
|
|
1321
|
+
onClick: onConfirm,
|
|
1322
|
+
disabled: loading,
|
|
1323
|
+
"data-loading": loading || void 0,
|
|
1324
|
+
children: /* @__PURE__ */ jsx30("span", { children: confirmLabel })
|
|
1325
|
+
}
|
|
1326
|
+
)
|
|
1327
|
+
] })
|
|
1328
|
+
]
|
|
1329
|
+
}
|
|
1330
|
+
) });
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1333
|
+
// src/components/GlassPopover.tsx
|
|
1334
|
+
import { jsx as jsx31, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
1154
1335
|
function GlassPopover({
|
|
1155
1336
|
title,
|
|
1156
1337
|
onClose,
|
|
@@ -1158,29 +1339,29 @@ function GlassPopover({
|
|
|
1158
1339
|
className,
|
|
1159
1340
|
...props
|
|
1160
1341
|
}) {
|
|
1161
|
-
return /* @__PURE__ */
|
|
1342
|
+
return /* @__PURE__ */ jsxs27(
|
|
1162
1343
|
"div",
|
|
1163
1344
|
{
|
|
1164
1345
|
className: `malix-glass-popover${className ? ` ${className}` : ""}`,
|
|
1165
1346
|
...props,
|
|
1166
1347
|
children: [
|
|
1167
|
-
title || onClose ? /* @__PURE__ */
|
|
1168
|
-
title ? /* @__PURE__ */
|
|
1169
|
-
onClose ? /* @__PURE__ */
|
|
1348
|
+
title || onClose ? /* @__PURE__ */ jsxs27("div", { className: "malix-glass-popover__header", children: [
|
|
1349
|
+
title ? /* @__PURE__ */ jsx31("span", { className: "malix-glass-popover__title", children: title }) : null,
|
|
1350
|
+
onClose ? /* @__PURE__ */ jsx31(
|
|
1170
1351
|
"button",
|
|
1171
1352
|
{
|
|
1172
1353
|
type: "button",
|
|
1173
1354
|
className: "malix-glass-popover__close",
|
|
1174
1355
|
onClick: onClose,
|
|
1175
1356
|
"aria-label": "Close",
|
|
1176
|
-
children: /* @__PURE__ */
|
|
1177
|
-
/* @__PURE__ */
|
|
1178
|
-
/* @__PURE__ */
|
|
1357
|
+
children: /* @__PURE__ */ jsxs27("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
1358
|
+
/* @__PURE__ */ jsx31("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
|
|
1359
|
+
/* @__PURE__ */ jsx31("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
|
|
1179
1360
|
] })
|
|
1180
1361
|
}
|
|
1181
1362
|
) : null
|
|
1182
1363
|
] }) : null,
|
|
1183
|
-
/* @__PURE__ */
|
|
1364
|
+
/* @__PURE__ */ jsx31("div", { className: "malix-glass-popover__body", children })
|
|
1184
1365
|
]
|
|
1185
1366
|
}
|
|
1186
1367
|
);
|
|
@@ -1188,7 +1369,7 @@ function GlassPopover({
|
|
|
1188
1369
|
|
|
1189
1370
|
// src/components/Accordion.tsx
|
|
1190
1371
|
import { useState as useState3 } from "react";
|
|
1191
|
-
import { jsx as
|
|
1372
|
+
import { jsx as jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
1192
1373
|
function Accordion({
|
|
1193
1374
|
title,
|
|
1194
1375
|
children,
|
|
@@ -1198,14 +1379,14 @@ function Accordion({
|
|
|
1198
1379
|
...props
|
|
1199
1380
|
}) {
|
|
1200
1381
|
const [open, setOpen] = useState3(defaultOpen);
|
|
1201
|
-
return /* @__PURE__ */
|
|
1382
|
+
return /* @__PURE__ */ jsxs28(
|
|
1202
1383
|
"div",
|
|
1203
1384
|
{
|
|
1204
1385
|
className: `malix-accordion${className ? ` ${className}` : ""}`,
|
|
1205
1386
|
"data-open": open,
|
|
1206
1387
|
...props,
|
|
1207
1388
|
children: [
|
|
1208
|
-
/* @__PURE__ */
|
|
1389
|
+
/* @__PURE__ */ jsxs28(
|
|
1209
1390
|
"button",
|
|
1210
1391
|
{
|
|
1211
1392
|
type: "button",
|
|
@@ -1213,9 +1394,9 @@ function Accordion({
|
|
|
1213
1394
|
onClick: () => setOpen((prev) => !prev),
|
|
1214
1395
|
"aria-expanded": open,
|
|
1215
1396
|
children: [
|
|
1216
|
-
icon ? /* @__PURE__ */
|
|
1217
|
-
/* @__PURE__ */
|
|
1218
|
-
/* @__PURE__ */
|
|
1397
|
+
icon ? /* @__PURE__ */ jsx32("span", { className: "malix-accordion__icon", children: icon }) : null,
|
|
1398
|
+
/* @__PURE__ */ jsx32("span", { className: "malix-accordion__title", children: title }),
|
|
1399
|
+
/* @__PURE__ */ jsx32(
|
|
1219
1400
|
"svg",
|
|
1220
1401
|
{
|
|
1221
1402
|
className: "malix-accordion__chevron",
|
|
@@ -1228,20 +1409,20 @@ function Accordion({
|
|
|
1228
1409
|
strokeLinecap: "round",
|
|
1229
1410
|
strokeLinejoin: "round",
|
|
1230
1411
|
"aria-hidden": "true",
|
|
1231
|
-
children: /* @__PURE__ */
|
|
1412
|
+
children: /* @__PURE__ */ jsx32("polyline", { points: "6 9 12 15 18 9" })
|
|
1232
1413
|
}
|
|
1233
1414
|
)
|
|
1234
1415
|
]
|
|
1235
1416
|
}
|
|
1236
1417
|
),
|
|
1237
|
-
/* @__PURE__ */
|
|
1418
|
+
/* @__PURE__ */ jsx32("div", { className: "malix-accordion__body", children })
|
|
1238
1419
|
]
|
|
1239
1420
|
}
|
|
1240
1421
|
);
|
|
1241
1422
|
}
|
|
1242
1423
|
|
|
1243
1424
|
// src/components/Badge.tsx
|
|
1244
|
-
import { jsx as
|
|
1425
|
+
import { jsx as jsx33, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
1245
1426
|
function Badge({
|
|
1246
1427
|
variant = "default",
|
|
1247
1428
|
dot = false,
|
|
@@ -1249,41 +1430,41 @@ function Badge({
|
|
|
1249
1430
|
className,
|
|
1250
1431
|
...props
|
|
1251
1432
|
}) {
|
|
1252
|
-
return /* @__PURE__ */
|
|
1433
|
+
return /* @__PURE__ */ jsxs29(
|
|
1253
1434
|
"span",
|
|
1254
1435
|
{
|
|
1255
1436
|
className: `malix-badge${className ? ` ${className}` : ""}`,
|
|
1256
1437
|
"data-variant": variant,
|
|
1257
1438
|
...props,
|
|
1258
1439
|
children: [
|
|
1259
|
-
dot ? /* @__PURE__ */
|
|
1260
|
-
/* @__PURE__ */
|
|
1440
|
+
dot ? /* @__PURE__ */ jsx33("span", { className: "malix-badge__dot" }) : null,
|
|
1441
|
+
/* @__PURE__ */ jsx33("span", { className: "malix-badge__label", children })
|
|
1261
1442
|
]
|
|
1262
1443
|
}
|
|
1263
1444
|
);
|
|
1264
1445
|
}
|
|
1265
1446
|
|
|
1266
1447
|
// src/components/Banner.tsx
|
|
1267
|
-
import { jsx as
|
|
1448
|
+
import { jsx as jsx34, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
1268
1449
|
var defaultIcons = {
|
|
1269
|
-
info: /* @__PURE__ */
|
|
1270
|
-
/* @__PURE__ */
|
|
1271
|
-
/* @__PURE__ */
|
|
1272
|
-
/* @__PURE__ */
|
|
1450
|
+
info: /* @__PURE__ */ jsxs30("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
1451
|
+
/* @__PURE__ */ jsx34("circle", { cx: "12", cy: "12", r: "10" }),
|
|
1452
|
+
/* @__PURE__ */ jsx34("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
|
|
1453
|
+
/* @__PURE__ */ jsx34("line", { x1: "12", y1: "8", x2: "12.01", y2: "8" })
|
|
1273
1454
|
] }),
|
|
1274
|
-
success: /* @__PURE__ */
|
|
1275
|
-
/* @__PURE__ */
|
|
1276
|
-
/* @__PURE__ */
|
|
1455
|
+
success: /* @__PURE__ */ jsxs30("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
1456
|
+
/* @__PURE__ */ jsx34("path", { d: "M22 11.08V12a10 10 0 1 1-5.93-9.14" }),
|
|
1457
|
+
/* @__PURE__ */ jsx34("polyline", { points: "22 4 12 14.01 9 11.01" })
|
|
1277
1458
|
] }),
|
|
1278
|
-
warning: /* @__PURE__ */
|
|
1279
|
-
/* @__PURE__ */
|
|
1280
|
-
/* @__PURE__ */
|
|
1281
|
-
/* @__PURE__ */
|
|
1459
|
+
warning: /* @__PURE__ */ jsxs30("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
1460
|
+
/* @__PURE__ */ jsx34("path", { d: "M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" }),
|
|
1461
|
+
/* @__PURE__ */ jsx34("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
|
|
1462
|
+
/* @__PURE__ */ jsx34("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
|
|
1282
1463
|
] }),
|
|
1283
|
-
error: /* @__PURE__ */
|
|
1284
|
-
/* @__PURE__ */
|
|
1285
|
-
/* @__PURE__ */
|
|
1286
|
-
/* @__PURE__ */
|
|
1464
|
+
error: /* @__PURE__ */ jsxs30("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
1465
|
+
/* @__PURE__ */ jsx34("circle", { cx: "12", cy: "12", r: "10" }),
|
|
1466
|
+
/* @__PURE__ */ jsx34("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
|
|
1467
|
+
/* @__PURE__ */ jsx34("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
|
|
1287
1468
|
] })
|
|
1288
1469
|
};
|
|
1289
1470
|
function Banner({
|
|
@@ -1294,7 +1475,7 @@ function Banner({
|
|
|
1294
1475
|
className,
|
|
1295
1476
|
...props
|
|
1296
1477
|
}) {
|
|
1297
|
-
return /* @__PURE__ */
|
|
1478
|
+
return /* @__PURE__ */ jsxs30(
|
|
1298
1479
|
"div",
|
|
1299
1480
|
{
|
|
1300
1481
|
className: `malix-banner${className ? ` ${className}` : ""}`,
|
|
@@ -1302,18 +1483,18 @@ function Banner({
|
|
|
1302
1483
|
role: "alert",
|
|
1303
1484
|
...props,
|
|
1304
1485
|
children: [
|
|
1305
|
-
/* @__PURE__ */
|
|
1306
|
-
/* @__PURE__ */
|
|
1307
|
-
onClose ? /* @__PURE__ */
|
|
1486
|
+
/* @__PURE__ */ jsx34("span", { className: "malix-banner__icon", children: icon ?? defaultIcons[variant] }),
|
|
1487
|
+
/* @__PURE__ */ jsx34("span", { className: "malix-banner__content", children }),
|
|
1488
|
+
onClose ? /* @__PURE__ */ jsx34(
|
|
1308
1489
|
"button",
|
|
1309
1490
|
{
|
|
1310
1491
|
type: "button",
|
|
1311
1492
|
className: "malix-banner__close",
|
|
1312
1493
|
onClick: onClose,
|
|
1313
1494
|
"aria-label": "Dismiss",
|
|
1314
|
-
children: /* @__PURE__ */
|
|
1315
|
-
/* @__PURE__ */
|
|
1316
|
-
/* @__PURE__ */
|
|
1495
|
+
children: /* @__PURE__ */ jsxs30("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
1496
|
+
/* @__PURE__ */ jsx34("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
|
|
1497
|
+
/* @__PURE__ */ jsx34("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
|
|
1317
1498
|
] })
|
|
1318
1499
|
}
|
|
1319
1500
|
) : null
|
|
@@ -1323,7 +1504,7 @@ function Banner({
|
|
|
1323
1504
|
}
|
|
1324
1505
|
|
|
1325
1506
|
// src/components/Checkbox.tsx
|
|
1326
|
-
import { jsx as
|
|
1507
|
+
import { jsx as jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
1327
1508
|
function Checkbox({
|
|
1328
1509
|
checked = false,
|
|
1329
1510
|
onChange,
|
|
@@ -1338,7 +1519,7 @@ function Checkbox({
|
|
|
1338
1519
|
onChange(!checked);
|
|
1339
1520
|
}
|
|
1340
1521
|
};
|
|
1341
|
-
const checkbox = /* @__PURE__ */
|
|
1522
|
+
const checkbox = /* @__PURE__ */ jsxs31(
|
|
1342
1523
|
"button",
|
|
1343
1524
|
{
|
|
1344
1525
|
type: "button",
|
|
@@ -1352,7 +1533,7 @@ function Checkbox({
|
|
|
1352
1533
|
onClick: handleClick,
|
|
1353
1534
|
...props,
|
|
1354
1535
|
children: [
|
|
1355
|
-
checked && !indeterminate ? /* @__PURE__ */
|
|
1536
|
+
checked && !indeterminate ? /* @__PURE__ */ jsx35(
|
|
1356
1537
|
"svg",
|
|
1357
1538
|
{
|
|
1358
1539
|
className: "malix-checkbox__icon",
|
|
@@ -1360,7 +1541,7 @@ function Checkbox({
|
|
|
1360
1541
|
fill: "none",
|
|
1361
1542
|
xmlns: "http://www.w3.org/2000/svg",
|
|
1362
1543
|
"aria-hidden": "true",
|
|
1363
|
-
children: /* @__PURE__ */
|
|
1544
|
+
children: /* @__PURE__ */ jsx35(
|
|
1364
1545
|
"path",
|
|
1365
1546
|
{
|
|
1366
1547
|
d: "M2 6l3 3 5-5",
|
|
@@ -1372,7 +1553,7 @@ function Checkbox({
|
|
|
1372
1553
|
)
|
|
1373
1554
|
}
|
|
1374
1555
|
) : null,
|
|
1375
|
-
indeterminate ? /* @__PURE__ */
|
|
1556
|
+
indeterminate ? /* @__PURE__ */ jsx35(
|
|
1376
1557
|
"svg",
|
|
1377
1558
|
{
|
|
1378
1559
|
className: "malix-checkbox__icon",
|
|
@@ -1380,7 +1561,7 @@ function Checkbox({
|
|
|
1380
1561
|
fill: "none",
|
|
1381
1562
|
xmlns: "http://www.w3.org/2000/svg",
|
|
1382
1563
|
"aria-hidden": "true",
|
|
1383
|
-
children: /* @__PURE__ */
|
|
1564
|
+
children: /* @__PURE__ */ jsx35(
|
|
1384
1565
|
"path",
|
|
1385
1566
|
{
|
|
1386
1567
|
d: "M2 6h8",
|
|
@@ -1395,16 +1576,16 @@ function Checkbox({
|
|
|
1395
1576
|
}
|
|
1396
1577
|
);
|
|
1397
1578
|
if (label) {
|
|
1398
|
-
return /* @__PURE__ */
|
|
1579
|
+
return /* @__PURE__ */ jsxs31("label", { className: "malix-checkbox-row", children: [
|
|
1399
1580
|
checkbox,
|
|
1400
|
-
/* @__PURE__ */
|
|
1581
|
+
/* @__PURE__ */ jsx35("span", { className: "malix-checkbox-row__label", children: label })
|
|
1401
1582
|
] });
|
|
1402
1583
|
}
|
|
1403
1584
|
return checkbox;
|
|
1404
1585
|
}
|
|
1405
1586
|
|
|
1406
1587
|
// src/components/Radio.tsx
|
|
1407
|
-
import { jsx as
|
|
1588
|
+
import { jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
1408
1589
|
function Radio({
|
|
1409
1590
|
checked = false,
|
|
1410
1591
|
onChange,
|
|
@@ -1420,7 +1601,7 @@ function Radio({
|
|
|
1420
1601
|
onChange(value);
|
|
1421
1602
|
}
|
|
1422
1603
|
};
|
|
1423
|
-
const radio = /* @__PURE__ */
|
|
1604
|
+
const radio = /* @__PURE__ */ jsx36(
|
|
1424
1605
|
"button",
|
|
1425
1606
|
{
|
|
1426
1607
|
type: "button",
|
|
@@ -1434,20 +1615,20 @@ function Radio({
|
|
|
1434
1615
|
"data-value": value,
|
|
1435
1616
|
onClick: handleClick,
|
|
1436
1617
|
...props,
|
|
1437
|
-
children: /* @__PURE__ */
|
|
1618
|
+
children: /* @__PURE__ */ jsx36("span", { className: "malix-radio__dot" })
|
|
1438
1619
|
}
|
|
1439
1620
|
);
|
|
1440
1621
|
if (label) {
|
|
1441
|
-
return /* @__PURE__ */
|
|
1622
|
+
return /* @__PURE__ */ jsxs32("label", { className: "malix-radio-row", children: [
|
|
1442
1623
|
radio,
|
|
1443
|
-
/* @__PURE__ */
|
|
1624
|
+
/* @__PURE__ */ jsx36("span", { className: "malix-radio-row__label", children: label })
|
|
1444
1625
|
] });
|
|
1445
1626
|
}
|
|
1446
1627
|
return radio;
|
|
1447
1628
|
}
|
|
1448
1629
|
|
|
1449
1630
|
// src/components/Toggle.tsx
|
|
1450
|
-
import { jsx as
|
|
1631
|
+
import { jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
1451
1632
|
function Toggle({
|
|
1452
1633
|
checked = false,
|
|
1453
1634
|
onChange,
|
|
@@ -1461,7 +1642,7 @@ function Toggle({
|
|
|
1461
1642
|
onChange(!checked);
|
|
1462
1643
|
}
|
|
1463
1644
|
};
|
|
1464
|
-
const toggle = /* @__PURE__ */
|
|
1645
|
+
const toggle = /* @__PURE__ */ jsx37(
|
|
1465
1646
|
"button",
|
|
1466
1647
|
{
|
|
1467
1648
|
type: "button",
|
|
@@ -1473,12 +1654,12 @@ function Toggle({
|
|
|
1473
1654
|
disabled,
|
|
1474
1655
|
onClick: handleClick,
|
|
1475
1656
|
...props,
|
|
1476
|
-
children: /* @__PURE__ */
|
|
1657
|
+
children: /* @__PURE__ */ jsx37("span", { className: "malix-toggle__knob" })
|
|
1477
1658
|
}
|
|
1478
1659
|
);
|
|
1479
1660
|
if (label) {
|
|
1480
|
-
return /* @__PURE__ */
|
|
1481
|
-
/* @__PURE__ */
|
|
1661
|
+
return /* @__PURE__ */ jsxs33("div", { className: "malix-toggle-row", children: [
|
|
1662
|
+
/* @__PURE__ */ jsx37("span", { className: "malix-toggle-row__label", children: label }),
|
|
1482
1663
|
toggle
|
|
1483
1664
|
] });
|
|
1484
1665
|
}
|
|
@@ -1486,7 +1667,7 @@ function Toggle({
|
|
|
1486
1667
|
}
|
|
1487
1668
|
|
|
1488
1669
|
// src/components/Select.tsx
|
|
1489
|
-
import { jsx as
|
|
1670
|
+
import { jsx as jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
1490
1671
|
function Select({
|
|
1491
1672
|
value,
|
|
1492
1673
|
placeholder,
|
|
@@ -1497,14 +1678,14 @@ function Select({
|
|
|
1497
1678
|
className,
|
|
1498
1679
|
...props
|
|
1499
1680
|
}) {
|
|
1500
|
-
return /* @__PURE__ */
|
|
1681
|
+
return /* @__PURE__ */ jsxs34(
|
|
1501
1682
|
"div",
|
|
1502
1683
|
{
|
|
1503
1684
|
className: `malix-select${className ? ` ${className}` : ""}`,
|
|
1504
1685
|
"data-filled": filled || void 0,
|
|
1505
1686
|
"data-disabled": disabled || void 0,
|
|
1506
1687
|
children: [
|
|
1507
|
-
/* @__PURE__ */
|
|
1688
|
+
/* @__PURE__ */ jsxs34(
|
|
1508
1689
|
"select",
|
|
1509
1690
|
{
|
|
1510
1691
|
className: "malix-select__native",
|
|
@@ -1513,12 +1694,12 @@ function Select({
|
|
|
1513
1694
|
onChange: (e) => onChange?.(e.target.value),
|
|
1514
1695
|
...props,
|
|
1515
1696
|
children: [
|
|
1516
|
-
placeholder ? /* @__PURE__ */
|
|
1517
|
-
options.map((opt) => /* @__PURE__ */
|
|
1697
|
+
placeholder ? /* @__PURE__ */ jsx38("option", { value: "", disabled: true, children: placeholder }) : null,
|
|
1698
|
+
options.map((opt) => /* @__PURE__ */ jsx38("option", { value: opt.value, children: opt.label }, opt.value))
|
|
1518
1699
|
]
|
|
1519
1700
|
}
|
|
1520
1701
|
),
|
|
1521
|
-
/* @__PURE__ */
|
|
1702
|
+
/* @__PURE__ */ jsx38("span", { className: "malix-select__icon", children: /* @__PURE__ */ jsx38("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx38(
|
|
1522
1703
|
"path",
|
|
1523
1704
|
{
|
|
1524
1705
|
d: "M4 6L8 10L12 6",
|
|
@@ -1534,7 +1715,7 @@ function Select({
|
|
|
1534
1715
|
}
|
|
1535
1716
|
|
|
1536
1717
|
// src/components/SelectGroup.tsx
|
|
1537
|
-
import { jsx as
|
|
1718
|
+
import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
1538
1719
|
function SelectGroup({
|
|
1539
1720
|
label,
|
|
1540
1721
|
helperText,
|
|
@@ -1543,23 +1724,23 @@ function SelectGroup({
|
|
|
1543
1724
|
className,
|
|
1544
1725
|
...props
|
|
1545
1726
|
}) {
|
|
1546
|
-
return /* @__PURE__ */
|
|
1727
|
+
return /* @__PURE__ */ jsxs35(
|
|
1547
1728
|
"div",
|
|
1548
1729
|
{
|
|
1549
1730
|
className: `malix-select-group${className ? ` ${className}` : ""}`,
|
|
1550
1731
|
"data-error": error || void 0,
|
|
1551
1732
|
...props,
|
|
1552
1733
|
children: [
|
|
1553
|
-
label ? /* @__PURE__ */
|
|
1734
|
+
label ? /* @__PURE__ */ jsx39("span", { className: "malix-select-group__label", children: label }) : null,
|
|
1554
1735
|
children,
|
|
1555
|
-
helperText ? /* @__PURE__ */
|
|
1736
|
+
helperText ? /* @__PURE__ */ jsx39("span", { className: "malix-select-group__helper", children: helperText }) : null
|
|
1556
1737
|
]
|
|
1557
1738
|
}
|
|
1558
1739
|
);
|
|
1559
1740
|
}
|
|
1560
1741
|
|
|
1561
1742
|
// src/components/SegmentedControl.tsx
|
|
1562
|
-
import { jsx as
|
|
1743
|
+
import { jsx as jsx40 } from "react/jsx-runtime";
|
|
1563
1744
|
function SegmentedControl({
|
|
1564
1745
|
items,
|
|
1565
1746
|
value,
|
|
@@ -1567,13 +1748,13 @@ function SegmentedControl({
|
|
|
1567
1748
|
className,
|
|
1568
1749
|
...props
|
|
1569
1750
|
}) {
|
|
1570
|
-
return /* @__PURE__ */
|
|
1751
|
+
return /* @__PURE__ */ jsx40(
|
|
1571
1752
|
"div",
|
|
1572
1753
|
{
|
|
1573
1754
|
className: `malix-segmented-control${className ? ` ${className}` : ""}`,
|
|
1574
1755
|
role: "radiogroup",
|
|
1575
1756
|
...props,
|
|
1576
|
-
children: items.map((item) => /* @__PURE__ */
|
|
1757
|
+
children: items.map((item) => /* @__PURE__ */ jsx40(
|
|
1577
1758
|
"button",
|
|
1578
1759
|
{
|
|
1579
1760
|
type: "button",
|
|
@@ -1591,7 +1772,7 @@ function SegmentedControl({
|
|
|
1591
1772
|
}
|
|
1592
1773
|
|
|
1593
1774
|
// src/components/DataTable.tsx
|
|
1594
|
-
import { jsx as
|
|
1775
|
+
import { jsx as jsx41, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
1595
1776
|
function DataTable({
|
|
1596
1777
|
columns,
|
|
1597
1778
|
data,
|
|
@@ -1600,13 +1781,13 @@ function DataTable({
|
|
|
1600
1781
|
className,
|
|
1601
1782
|
...props
|
|
1602
1783
|
}) {
|
|
1603
|
-
return /* @__PURE__ */
|
|
1784
|
+
return /* @__PURE__ */ jsxs36(
|
|
1604
1785
|
"table",
|
|
1605
1786
|
{
|
|
1606
1787
|
className: `malix-data-table${className ? ` ${className}` : ""}`,
|
|
1607
1788
|
...props,
|
|
1608
1789
|
children: [
|
|
1609
|
-
/* @__PURE__ */
|
|
1790
|
+
/* @__PURE__ */ jsx41("thead", { children: /* @__PURE__ */ jsx41("tr", { className: "malix-data-table__header-row", children: columns.map((col) => /* @__PURE__ */ jsx41(
|
|
1610
1791
|
"th",
|
|
1611
1792
|
{
|
|
1612
1793
|
className: "malix-data-table__header-cell",
|
|
@@ -1615,16 +1796,16 @@ function DataTable({
|
|
|
1615
1796
|
},
|
|
1616
1797
|
col.key
|
|
1617
1798
|
)) }) }),
|
|
1618
|
-
/* @__PURE__ */
|
|
1799
|
+
/* @__PURE__ */ jsx41("tbody", { className: "malix-data-table__body", children: data.length > 0 ? data.map((row, rowIndex) => /* @__PURE__ */ jsx41(
|
|
1619
1800
|
"tr",
|
|
1620
1801
|
{
|
|
1621
1802
|
className: "malix-data-table__data-row",
|
|
1622
1803
|
"data-clickable": onRowClick ? true : void 0,
|
|
1623
1804
|
onClick: onRowClick ? () => onRowClick(row) : void 0,
|
|
1624
|
-
children: columns.map((col) => /* @__PURE__ */
|
|
1805
|
+
children: columns.map((col) => /* @__PURE__ */ jsx41("td", { className: "malix-data-table__cell", children: col.render ? col.render(row[col.key], row) : row[col.key] }, col.key))
|
|
1625
1806
|
},
|
|
1626
1807
|
rowIndex
|
|
1627
|
-
)) : /* @__PURE__ */
|
|
1808
|
+
)) : /* @__PURE__ */ jsx41("tr", { className: "malix-data-table__data-row", children: /* @__PURE__ */ jsx41(
|
|
1628
1809
|
"td",
|
|
1629
1810
|
{
|
|
1630
1811
|
className: "malix-data-table__cell",
|
|
@@ -1638,12 +1819,12 @@ function DataTable({
|
|
|
1638
1819
|
}
|
|
1639
1820
|
|
|
1640
1821
|
// src/components/Pagination.tsx
|
|
1641
|
-
import { jsx as
|
|
1822
|
+
import { jsx as jsx42, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
1642
1823
|
function ChevronLeft() {
|
|
1643
|
-
return /* @__PURE__ */
|
|
1824
|
+
return /* @__PURE__ */ jsx42("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx42("path", { d: "M10 12L6 8L10 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
|
|
1644
1825
|
}
|
|
1645
1826
|
function ChevronRight() {
|
|
1646
|
-
return /* @__PURE__ */
|
|
1827
|
+
return /* @__PURE__ */ jsx42("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx42("path", { d: "M6 4L10 8L6 12", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
|
|
1647
1828
|
}
|
|
1648
1829
|
function Pagination({
|
|
1649
1830
|
currentPage,
|
|
@@ -1655,14 +1836,14 @@ function Pagination({
|
|
|
1655
1836
|
const isFirstPage = currentPage <= 1;
|
|
1656
1837
|
const isLastPage = currentPage >= totalPages;
|
|
1657
1838
|
const pages = Array.from({ length: totalPages }, (_, i) => i + 1);
|
|
1658
|
-
return /* @__PURE__ */
|
|
1839
|
+
return /* @__PURE__ */ jsxs37(
|
|
1659
1840
|
"nav",
|
|
1660
1841
|
{
|
|
1661
1842
|
className: `malix-pagination${className ? ` ${className}` : ""}`,
|
|
1662
1843
|
"data-variant": variant,
|
|
1663
1844
|
"aria-label": "Pagination",
|
|
1664
1845
|
children: [
|
|
1665
|
-
/* @__PURE__ */
|
|
1846
|
+
/* @__PURE__ */ jsx42(
|
|
1666
1847
|
"button",
|
|
1667
1848
|
{
|
|
1668
1849
|
type: "button",
|
|
@@ -1671,10 +1852,10 @@ function Pagination({
|
|
|
1671
1852
|
disabled: isFirstPage,
|
|
1672
1853
|
onClick: () => onPageChange(currentPage - 1),
|
|
1673
1854
|
"aria-label": "Previous page",
|
|
1674
|
-
children: /* @__PURE__ */
|
|
1855
|
+
children: /* @__PURE__ */ jsx42(ChevronLeft, {})
|
|
1675
1856
|
}
|
|
1676
1857
|
),
|
|
1677
|
-
variant === "full" ? pages.map((page) => /* @__PURE__ */
|
|
1858
|
+
variant === "full" ? pages.map((page) => /* @__PURE__ */ jsx42(
|
|
1678
1859
|
"button",
|
|
1679
1860
|
{
|
|
1680
1861
|
type: "button",
|
|
@@ -1685,12 +1866,12 @@ function Pagination({
|
|
|
1685
1866
|
children: page
|
|
1686
1867
|
},
|
|
1687
1868
|
page
|
|
1688
|
-
)) : /* @__PURE__ */
|
|
1869
|
+
)) : /* @__PURE__ */ jsxs37("span", { className: "malix-pagination__label", children: [
|
|
1689
1870
|
currentPage,
|
|
1690
1871
|
" of ",
|
|
1691
1872
|
totalPages
|
|
1692
1873
|
] }),
|
|
1693
|
-
/* @__PURE__ */
|
|
1874
|
+
/* @__PURE__ */ jsx42(
|
|
1694
1875
|
"button",
|
|
1695
1876
|
{
|
|
1696
1877
|
type: "button",
|
|
@@ -1699,7 +1880,7 @@ function Pagination({
|
|
|
1699
1880
|
disabled: isLastPage,
|
|
1700
1881
|
onClick: () => onPageChange(currentPage + 1),
|
|
1701
1882
|
"aria-label": "Next page",
|
|
1702
|
-
children: /* @__PURE__ */
|
|
1883
|
+
children: /* @__PURE__ */ jsx42(ChevronRight, {})
|
|
1703
1884
|
}
|
|
1704
1885
|
)
|
|
1705
1886
|
]
|
|
@@ -1708,30 +1889,30 @@ function Pagination({
|
|
|
1708
1889
|
}
|
|
1709
1890
|
|
|
1710
1891
|
// src/components/StatusDot.tsx
|
|
1711
|
-
import { jsx as
|
|
1892
|
+
import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
1712
1893
|
function StatusDot({
|
|
1713
1894
|
variant = "default",
|
|
1714
1895
|
label,
|
|
1715
1896
|
className,
|
|
1716
1897
|
...props
|
|
1717
1898
|
}) {
|
|
1718
|
-
return /* @__PURE__ */
|
|
1899
|
+
return /* @__PURE__ */ jsxs38(
|
|
1719
1900
|
"span",
|
|
1720
1901
|
{
|
|
1721
1902
|
className: `malix-status-dot${className ? ` ${className}` : ""}`,
|
|
1722
1903
|
"data-variant": variant,
|
|
1723
1904
|
...props,
|
|
1724
1905
|
children: [
|
|
1725
|
-
/* @__PURE__ */
|
|
1726
|
-
/* @__PURE__ */
|
|
1906
|
+
/* @__PURE__ */ jsx43("span", { className: "malix-status-dot__dot", "aria-hidden": "true" }),
|
|
1907
|
+
/* @__PURE__ */ jsx43("span", { className: "malix-status-dot__label", children: label })
|
|
1727
1908
|
]
|
|
1728
1909
|
}
|
|
1729
1910
|
);
|
|
1730
1911
|
}
|
|
1731
1912
|
|
|
1732
1913
|
// src/components/Dropzone.tsx
|
|
1733
|
-
import { useRef as
|
|
1734
|
-
import { jsx as
|
|
1914
|
+
import { useRef as useRef5, useState as useState4 } from "react";
|
|
1915
|
+
import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
1735
1916
|
function Dropzone({
|
|
1736
1917
|
onDrop,
|
|
1737
1918
|
accept,
|
|
@@ -1742,7 +1923,7 @@ function Dropzone({
|
|
|
1742
1923
|
...props
|
|
1743
1924
|
}) {
|
|
1744
1925
|
const [dragging, setDragging] = useState4(false);
|
|
1745
|
-
const inputRef =
|
|
1926
|
+
const inputRef = useRef5(null);
|
|
1746
1927
|
function handleDragOver(event) {
|
|
1747
1928
|
event.preventDefault();
|
|
1748
1929
|
if (!disabled) setDragging(true);
|
|
@@ -1766,7 +1947,7 @@ function Dropzone({
|
|
|
1766
1947
|
function handleClick() {
|
|
1767
1948
|
if (!disabled) inputRef.current?.click();
|
|
1768
1949
|
}
|
|
1769
|
-
return /* @__PURE__ */
|
|
1950
|
+
return /* @__PURE__ */ jsxs39(
|
|
1770
1951
|
"div",
|
|
1771
1952
|
{
|
|
1772
1953
|
className: `malix-dropzone${className ? ` ${className}` : ""}`,
|
|
@@ -1781,7 +1962,7 @@ function Dropzone({
|
|
|
1781
1962
|
"aria-disabled": disabled || void 0,
|
|
1782
1963
|
...props,
|
|
1783
1964
|
children: [
|
|
1784
|
-
/* @__PURE__ */
|
|
1965
|
+
/* @__PURE__ */ jsx44(
|
|
1785
1966
|
"input",
|
|
1786
1967
|
{
|
|
1787
1968
|
ref: inputRef,
|
|
@@ -1792,7 +1973,7 @@ function Dropzone({
|
|
|
1792
1973
|
"aria-hidden": "true"
|
|
1793
1974
|
}
|
|
1794
1975
|
),
|
|
1795
|
-
/* @__PURE__ */
|
|
1976
|
+
/* @__PURE__ */ jsxs39(
|
|
1796
1977
|
"svg",
|
|
1797
1978
|
{
|
|
1798
1979
|
className: "malix-dropzone__icon",
|
|
@@ -1806,23 +1987,23 @@ function Dropzone({
|
|
|
1806
1987
|
strokeLinejoin: "round",
|
|
1807
1988
|
"aria-hidden": "true",
|
|
1808
1989
|
children: [
|
|
1809
|
-
/* @__PURE__ */
|
|
1810
|
-
/* @__PURE__ */
|
|
1811
|
-
/* @__PURE__ */
|
|
1990
|
+
/* @__PURE__ */ jsx44("path", { d: "M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242" }),
|
|
1991
|
+
/* @__PURE__ */ jsx44("path", { d: "M12 12v9" }),
|
|
1992
|
+
/* @__PURE__ */ jsx44("path", { d: "m16 16-4-4-4 4" })
|
|
1812
1993
|
]
|
|
1813
1994
|
}
|
|
1814
1995
|
),
|
|
1815
|
-
/* @__PURE__ */
|
|
1816
|
-
/* @__PURE__ */
|
|
1817
|
-
/* @__PURE__ */
|
|
1996
|
+
/* @__PURE__ */ jsx44("span", { className: "malix-dropzone__title", children: title }),
|
|
1997
|
+
/* @__PURE__ */ jsx44("span", { className: "malix-dropzone__hint", children: hint }),
|
|
1998
|
+
/* @__PURE__ */ jsx44("span", { className: "malix-dropzone__browse-btn", children: "Browse files" })
|
|
1818
1999
|
]
|
|
1819
2000
|
}
|
|
1820
2001
|
);
|
|
1821
2002
|
}
|
|
1822
2003
|
|
|
1823
2004
|
// src/components/SplitPane.tsx
|
|
1824
|
-
import { useState as useState5, useCallback, useRef as
|
|
1825
|
-
import { jsx as
|
|
2005
|
+
import { useState as useState5, useCallback as useCallback2, useRef as useRef6, useEffect as useEffect5 } from "react";
|
|
2006
|
+
import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
1826
2007
|
function SplitPane({
|
|
1827
2008
|
leftPanel,
|
|
1828
2009
|
rightPanel,
|
|
@@ -1833,13 +2014,13 @@ function SplitPane({
|
|
|
1833
2014
|
...props
|
|
1834
2015
|
}) {
|
|
1835
2016
|
const [split, setSplit] = useState5(defaultSplit);
|
|
1836
|
-
const containerRef =
|
|
1837
|
-
const dragging =
|
|
1838
|
-
const onMouseDown =
|
|
2017
|
+
const containerRef = useRef6(null);
|
|
2018
|
+
const dragging = useRef6(false);
|
|
2019
|
+
const onMouseDown = useCallback2((e) => {
|
|
1839
2020
|
e.preventDefault();
|
|
1840
2021
|
dragging.current = true;
|
|
1841
2022
|
}, []);
|
|
1842
|
-
|
|
2023
|
+
useEffect5(() => {
|
|
1843
2024
|
function onMouseMove(e) {
|
|
1844
2025
|
if (!dragging.current || !containerRef.current) return;
|
|
1845
2026
|
const rect = containerRef.current.getBoundingClientRect();
|
|
@@ -1857,18 +2038,18 @@ function SplitPane({
|
|
|
1857
2038
|
document.removeEventListener("mouseup", onMouseUp);
|
|
1858
2039
|
};
|
|
1859
2040
|
}, []);
|
|
1860
|
-
return /* @__PURE__ */
|
|
2041
|
+
return /* @__PURE__ */ jsxs40(
|
|
1861
2042
|
"div",
|
|
1862
2043
|
{
|
|
1863
2044
|
ref: containerRef,
|
|
1864
2045
|
className: `malix-split-pane${className ? ` ${className}` : ""}`,
|
|
1865
2046
|
...props,
|
|
1866
2047
|
children: [
|
|
1867
|
-
/* @__PURE__ */
|
|
1868
|
-
leftTitle ? /* @__PURE__ */
|
|
2048
|
+
/* @__PURE__ */ jsxs40("div", { className: "malix-split-pane__left", style: { width: `${split}%` }, children: [
|
|
2049
|
+
leftTitle ? /* @__PURE__ */ jsx45("span", { className: "malix-split-pane__panel-title", children: leftTitle }) : null,
|
|
1869
2050
|
leftPanel
|
|
1870
2051
|
] }),
|
|
1871
|
-
/* @__PURE__ */
|
|
2052
|
+
/* @__PURE__ */ jsxs40(
|
|
1872
2053
|
"div",
|
|
1873
2054
|
{
|
|
1874
2055
|
className: "malix-split-pane__handle",
|
|
@@ -1879,14 +2060,14 @@ function SplitPane({
|
|
|
1879
2060
|
"aria-label": "Resize panels",
|
|
1880
2061
|
onMouseDown,
|
|
1881
2062
|
children: [
|
|
1882
|
-
/* @__PURE__ */
|
|
1883
|
-
/* @__PURE__ */
|
|
1884
|
-
/* @__PURE__ */
|
|
2063
|
+
/* @__PURE__ */ jsx45("span", { className: "malix-split-pane__handle-dot", "aria-hidden": "true" }),
|
|
2064
|
+
/* @__PURE__ */ jsx45("span", { className: "malix-split-pane__handle-dot", "aria-hidden": "true" }),
|
|
2065
|
+
/* @__PURE__ */ jsx45("span", { className: "malix-split-pane__handle-dot", "aria-hidden": "true" })
|
|
1885
2066
|
]
|
|
1886
2067
|
}
|
|
1887
2068
|
),
|
|
1888
|
-
/* @__PURE__ */
|
|
1889
|
-
rightTitle ? /* @__PURE__ */
|
|
2069
|
+
/* @__PURE__ */ jsxs40("div", { className: "malix-split-pane__right", style: { width: `${100 - split}%` }, children: [
|
|
2070
|
+
rightTitle ? /* @__PURE__ */ jsx45("span", { className: "malix-split-pane__panel-title", children: rightTitle }) : null,
|
|
1890
2071
|
rightPanel
|
|
1891
2072
|
] })
|
|
1892
2073
|
]
|
|
@@ -1895,7 +2076,7 @@ function SplitPane({
|
|
|
1895
2076
|
}
|
|
1896
2077
|
|
|
1897
2078
|
// src/components/PricingCard.tsx
|
|
1898
|
-
import { jsx as
|
|
2079
|
+
import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
1899
2080
|
function PricingCard({
|
|
1900
2081
|
planName,
|
|
1901
2082
|
price,
|
|
@@ -1908,21 +2089,21 @@ function PricingCard({
|
|
|
1908
2089
|
className,
|
|
1909
2090
|
...props
|
|
1910
2091
|
}) {
|
|
1911
|
-
return /* @__PURE__ */
|
|
2092
|
+
return /* @__PURE__ */ jsxs41(
|
|
1912
2093
|
"div",
|
|
1913
2094
|
{
|
|
1914
2095
|
className: `malix-pricing-card${className ? ` ${className}` : ""}`,
|
|
1915
2096
|
"data-highlighted": highlighted || void 0,
|
|
1916
2097
|
...props,
|
|
1917
2098
|
children: [
|
|
1918
|
-
/* @__PURE__ */
|
|
1919
|
-
/* @__PURE__ */
|
|
1920
|
-
/* @__PURE__ */
|
|
1921
|
-
/* @__PURE__ */
|
|
2099
|
+
/* @__PURE__ */ jsx46("span", { className: "malix-pricing-card__badge", children: planName }),
|
|
2100
|
+
/* @__PURE__ */ jsxs41("div", { className: "malix-pricing-card__price-row", children: [
|
|
2101
|
+
/* @__PURE__ */ jsx46("span", { className: "malix-pricing-card__price", children: price }),
|
|
2102
|
+
/* @__PURE__ */ jsx46("span", { className: "malix-pricing-card__period", children: period })
|
|
1922
2103
|
] }),
|
|
1923
|
-
description ? /* @__PURE__ */
|
|
1924
|
-
/* @__PURE__ */
|
|
1925
|
-
/* @__PURE__ */
|
|
2104
|
+
description ? /* @__PURE__ */ jsx46("p", { className: "malix-pricing-card__description", children: description }) : null,
|
|
2105
|
+
/* @__PURE__ */ jsx46("ul", { className: "malix-pricing-card__features", children: features.map((feature, i) => /* @__PURE__ */ jsxs41("li", { className: "malix-pricing-card__feature-item", children: [
|
|
2106
|
+
/* @__PURE__ */ jsx46(
|
|
1926
2107
|
"svg",
|
|
1927
2108
|
{
|
|
1928
2109
|
className: "malix-pricing-card__check-icon",
|
|
@@ -1935,12 +2116,12 @@ function PricingCard({
|
|
|
1935
2116
|
strokeLinecap: "round",
|
|
1936
2117
|
strokeLinejoin: "round",
|
|
1937
2118
|
"aria-hidden": "true",
|
|
1938
|
-
children: /* @__PURE__ */
|
|
2119
|
+
children: /* @__PURE__ */ jsx46("polyline", { points: "20 6 9 17 4 12" })
|
|
1939
2120
|
}
|
|
1940
2121
|
),
|
|
1941
|
-
/* @__PURE__ */
|
|
2122
|
+
/* @__PURE__ */ jsx46("span", { children: feature })
|
|
1942
2123
|
] }, i)) }),
|
|
1943
|
-
/* @__PURE__ */
|
|
2124
|
+
/* @__PURE__ */ jsx46(
|
|
1944
2125
|
"button",
|
|
1945
2126
|
{
|
|
1946
2127
|
type: "button",
|
|
@@ -1955,7 +2136,7 @@ function PricingCard({
|
|
|
1955
2136
|
}
|
|
1956
2137
|
|
|
1957
2138
|
// src/components/OnboardingPopover.tsx
|
|
1958
|
-
import { jsx as
|
|
2139
|
+
import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
1959
2140
|
function OnboardingPopover({
|
|
1960
2141
|
step,
|
|
1961
2142
|
totalSteps,
|
|
@@ -1967,7 +2148,7 @@ function OnboardingPopover({
|
|
|
1967
2148
|
className,
|
|
1968
2149
|
...props
|
|
1969
2150
|
}) {
|
|
1970
|
-
return /* @__PURE__ */
|
|
2151
|
+
return /* @__PURE__ */ jsxs42(
|
|
1971
2152
|
"div",
|
|
1972
2153
|
{
|
|
1973
2154
|
className: `malix-onboarding-popover${className ? ` ${className}` : ""}`,
|
|
@@ -1975,16 +2156,16 @@ function OnboardingPopover({
|
|
|
1975
2156
|
"aria-label": `Step ${step} of ${totalSteps}: ${title}`,
|
|
1976
2157
|
...props,
|
|
1977
2158
|
children: [
|
|
1978
|
-
/* @__PURE__ */
|
|
2159
|
+
/* @__PURE__ */ jsxs42("span", { className: "malix-onboarding-popover__step", children: [
|
|
1979
2160
|
"Step ",
|
|
1980
2161
|
step,
|
|
1981
2162
|
" of ",
|
|
1982
2163
|
totalSteps
|
|
1983
2164
|
] }),
|
|
1984
|
-
/* @__PURE__ */
|
|
1985
|
-
/* @__PURE__ */
|
|
1986
|
-
/* @__PURE__ */
|
|
1987
|
-
onSkip ? /* @__PURE__ */
|
|
2165
|
+
/* @__PURE__ */ jsx47("h3", { className: "malix-onboarding-popover__title", children: title }),
|
|
2166
|
+
/* @__PURE__ */ jsx47("p", { className: "malix-onboarding-popover__description", children: description }),
|
|
2167
|
+
/* @__PURE__ */ jsxs42("div", { className: "malix-onboarding-popover__actions", children: [
|
|
2168
|
+
onSkip ? /* @__PURE__ */ jsx47(
|
|
1988
2169
|
"button",
|
|
1989
2170
|
{
|
|
1990
2171
|
type: "button",
|
|
@@ -1993,7 +2174,7 @@ function OnboardingPopover({
|
|
|
1993
2174
|
children: "Skip"
|
|
1994
2175
|
}
|
|
1995
2176
|
) : null,
|
|
1996
|
-
onNext ? /* @__PURE__ */
|
|
2177
|
+
onNext ? /* @__PURE__ */ jsx47(
|
|
1997
2178
|
"button",
|
|
1998
2179
|
{
|
|
1999
2180
|
type: "button",
|
|
@@ -2009,20 +2190,20 @@ function OnboardingPopover({
|
|
|
2009
2190
|
}
|
|
2010
2191
|
|
|
2011
2192
|
// src/components/CreditsIndicator.tsx
|
|
2012
|
-
import { jsx as
|
|
2193
|
+
import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
2013
2194
|
function CreditsIndicator({
|
|
2014
2195
|
remaining,
|
|
2015
2196
|
label = "Credits Remaining",
|
|
2016
2197
|
className,
|
|
2017
2198
|
...props
|
|
2018
2199
|
}) {
|
|
2019
|
-
return /* @__PURE__ */
|
|
2200
|
+
return /* @__PURE__ */ jsxs43(
|
|
2020
2201
|
"div",
|
|
2021
2202
|
{
|
|
2022
2203
|
className: `malix-credits-indicator${className ? ` ${className}` : ""}`,
|
|
2023
2204
|
...props,
|
|
2024
2205
|
children: [
|
|
2025
|
-
/* @__PURE__ */
|
|
2206
|
+
/* @__PURE__ */ jsx48("span", { className: "malix-credits-indicator__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsxs43(
|
|
2026
2207
|
"svg",
|
|
2027
2208
|
{
|
|
2028
2209
|
width: "20",
|
|
@@ -2034,15 +2215,15 @@ function CreditsIndicator({
|
|
|
2034
2215
|
strokeLinecap: "round",
|
|
2035
2216
|
strokeLinejoin: "round",
|
|
2036
2217
|
children: [
|
|
2037
|
-
/* @__PURE__ */
|
|
2038
|
-
/* @__PURE__ */
|
|
2039
|
-
/* @__PURE__ */
|
|
2218
|
+
/* @__PURE__ */ jsx48("ellipse", { cx: "12", cy: "6", rx: "8", ry: "3" }),
|
|
2219
|
+
/* @__PURE__ */ jsx48("path", { d: "M4 6v6c0 1.66 3.58 3 8 3s8-1.34 8-3V6" }),
|
|
2220
|
+
/* @__PURE__ */ jsx48("path", { d: "M4 12v6c0 1.66 3.58 3 8 3s8-1.34 8-3v-6" })
|
|
2040
2221
|
]
|
|
2041
2222
|
}
|
|
2042
2223
|
) }),
|
|
2043
|
-
/* @__PURE__ */
|
|
2044
|
-
/* @__PURE__ */
|
|
2045
|
-
/* @__PURE__ */
|
|
2224
|
+
/* @__PURE__ */ jsxs43("div", { className: "malix-credits-indicator__info", children: [
|
|
2225
|
+
/* @__PURE__ */ jsx48("span", { className: "malix-credits-indicator__label", children: label }),
|
|
2226
|
+
/* @__PURE__ */ jsx48("span", { className: "malix-credits-indicator__value", children: remaining })
|
|
2046
2227
|
] })
|
|
2047
2228
|
]
|
|
2048
2229
|
}
|
|
@@ -2050,7 +2231,7 @@ function CreditsIndicator({
|
|
|
2050
2231
|
}
|
|
2051
2232
|
|
|
2052
2233
|
// src/components/LanguageSelector.tsx
|
|
2053
|
-
import { jsx as
|
|
2234
|
+
import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
2054
2235
|
function LanguageSelector({
|
|
2055
2236
|
value,
|
|
2056
2237
|
options,
|
|
@@ -2060,13 +2241,13 @@ function LanguageSelector({
|
|
|
2060
2241
|
}) {
|
|
2061
2242
|
const selectedOption = options?.find((opt) => opt.value === value);
|
|
2062
2243
|
const displayLabel = selectedOption?.label ?? value;
|
|
2063
|
-
return /* @__PURE__ */
|
|
2244
|
+
return /* @__PURE__ */ jsxs44(
|
|
2064
2245
|
"div",
|
|
2065
2246
|
{
|
|
2066
2247
|
className: `malix-language-selector${className ? ` ${className}` : ""}`,
|
|
2067
2248
|
...props,
|
|
2068
2249
|
children: [
|
|
2069
|
-
/* @__PURE__ */
|
|
2250
|
+
/* @__PURE__ */ jsx49("span", { className: "malix-language-selector__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsxs44(
|
|
2070
2251
|
"svg",
|
|
2071
2252
|
{
|
|
2072
2253
|
width: "16",
|
|
@@ -2078,24 +2259,24 @@ function LanguageSelector({
|
|
|
2078
2259
|
strokeLinecap: "round",
|
|
2079
2260
|
strokeLinejoin: "round",
|
|
2080
2261
|
children: [
|
|
2081
|
-
/* @__PURE__ */
|
|
2082
|
-
/* @__PURE__ */
|
|
2083
|
-
/* @__PURE__ */
|
|
2262
|
+
/* @__PURE__ */ jsx49("circle", { cx: "12", cy: "12", r: "10" }),
|
|
2263
|
+
/* @__PURE__ */ jsx49("line", { x1: "2", y1: "12", x2: "22", y2: "12" }),
|
|
2264
|
+
/* @__PURE__ */ jsx49("path", { d: "M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10A15.3 15.3 0 0 1 12 2z" })
|
|
2084
2265
|
]
|
|
2085
2266
|
}
|
|
2086
2267
|
) }),
|
|
2087
|
-
/* @__PURE__ */
|
|
2268
|
+
/* @__PURE__ */ jsx49(
|
|
2088
2269
|
"select",
|
|
2089
2270
|
{
|
|
2090
2271
|
className: "malix-language-selector__select",
|
|
2091
2272
|
value,
|
|
2092
2273
|
onChange: (e) => onChange?.(e.target.value),
|
|
2093
2274
|
"aria-label": "Select language",
|
|
2094
|
-
children: options ? options.map((opt) => /* @__PURE__ */
|
|
2275
|
+
children: options ? options.map((opt) => /* @__PURE__ */ jsx49("option", { value: opt.value, children: opt.label }, opt.value)) : /* @__PURE__ */ jsx49("option", { value, children: displayLabel })
|
|
2095
2276
|
}
|
|
2096
2277
|
),
|
|
2097
|
-
/* @__PURE__ */
|
|
2098
|
-
/* @__PURE__ */
|
|
2278
|
+
/* @__PURE__ */ jsx49("span", { className: "malix-language-selector__label", children: displayLabel }),
|
|
2279
|
+
/* @__PURE__ */ jsx49("span", { className: "malix-language-selector__chevron", "aria-hidden": "true", children: /* @__PURE__ */ jsx49(
|
|
2099
2280
|
"svg",
|
|
2100
2281
|
{
|
|
2101
2282
|
width: "14",
|
|
@@ -2106,7 +2287,7 @@ function LanguageSelector({
|
|
|
2106
2287
|
strokeWidth: "2",
|
|
2107
2288
|
strokeLinecap: "round",
|
|
2108
2289
|
strokeLinejoin: "round",
|
|
2109
|
-
children: /* @__PURE__ */
|
|
2290
|
+
children: /* @__PURE__ */ jsx49("polyline", { points: "6 9 12 15 18 9" })
|
|
2110
2291
|
}
|
|
2111
2292
|
) })
|
|
2112
2293
|
]
|
|
@@ -2115,7 +2296,7 @@ function LanguageSelector({
|
|
|
2115
2296
|
}
|
|
2116
2297
|
|
|
2117
2298
|
// src/components/UserProfilePopover.tsx
|
|
2118
|
-
import { Fragment as Fragment2, jsx as
|
|
2299
|
+
import { Fragment as Fragment2, jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
2119
2300
|
function UserProfilePopover({
|
|
2120
2301
|
name,
|
|
2121
2302
|
email,
|
|
@@ -2126,26 +2307,26 @@ function UserProfilePopover({
|
|
|
2126
2307
|
className,
|
|
2127
2308
|
...props
|
|
2128
2309
|
}) {
|
|
2129
|
-
return /* @__PURE__ */
|
|
2310
|
+
return /* @__PURE__ */ jsxs45(
|
|
2130
2311
|
"div",
|
|
2131
2312
|
{
|
|
2132
2313
|
className: `malix-user-profile${className ? ` ${className}` : ""}`,
|
|
2133
2314
|
...props,
|
|
2134
2315
|
children: [
|
|
2135
|
-
/* @__PURE__ */
|
|
2136
|
-
avatar ? /* @__PURE__ */
|
|
2137
|
-
/* @__PURE__ */
|
|
2138
|
-
/* @__PURE__ */
|
|
2139
|
-
/* @__PURE__ */
|
|
2316
|
+
/* @__PURE__ */ jsxs45("div", { className: "malix-user-profile__header", children: [
|
|
2317
|
+
avatar ? /* @__PURE__ */ jsx50("span", { className: "malix-user-profile__avatar", children: avatar }) : null,
|
|
2318
|
+
/* @__PURE__ */ jsxs45("div", { className: "malix-user-profile__info", children: [
|
|
2319
|
+
/* @__PURE__ */ jsx50("span", { className: "malix-user-profile__name", children: name }),
|
|
2320
|
+
/* @__PURE__ */ jsx50("span", { className: "malix-user-profile__email", children: email })
|
|
2140
2321
|
] })
|
|
2141
2322
|
] }),
|
|
2142
|
-
credits !== void 0 ? /* @__PURE__ */
|
|
2143
|
-
/* @__PURE__ */
|
|
2144
|
-
/* @__PURE__ */
|
|
2323
|
+
credits !== void 0 ? /* @__PURE__ */ jsxs45("div", { className: "malix-user-profile__credits", children: [
|
|
2324
|
+
/* @__PURE__ */ jsx50("span", { className: "malix-user-profile__credits-label", children: "Credits" }),
|
|
2325
|
+
/* @__PURE__ */ jsx50("span", { className: "malix-user-profile__credits-value", children: credits })
|
|
2145
2326
|
] }) : null,
|
|
2146
|
-
menuItems && menuItems.length > 0 ? /* @__PURE__ */
|
|
2147
|
-
/* @__PURE__ */
|
|
2148
|
-
/* @__PURE__ */
|
|
2327
|
+
menuItems && menuItems.length > 0 ? /* @__PURE__ */ jsxs45(Fragment2, { children: [
|
|
2328
|
+
/* @__PURE__ */ jsx50("hr", { className: "malix-user-profile__divider" }),
|
|
2329
|
+
/* @__PURE__ */ jsx50("nav", { className: "malix-user-profile__menu", role: "menu", children: menuItems.map((item, i) => /* @__PURE__ */ jsxs45(
|
|
2149
2330
|
"button",
|
|
2150
2331
|
{
|
|
2151
2332
|
type: "button",
|
|
@@ -2153,23 +2334,23 @@ function UserProfilePopover({
|
|
|
2153
2334
|
role: "menuitem",
|
|
2154
2335
|
onClick: item.onClick,
|
|
2155
2336
|
children: [
|
|
2156
|
-
item.icon ? /* @__PURE__ */
|
|
2157
|
-
/* @__PURE__ */
|
|
2337
|
+
item.icon ? /* @__PURE__ */ jsx50("span", { className: "malix-user-profile__menu-item-icon", children: item.icon }) : null,
|
|
2338
|
+
/* @__PURE__ */ jsx50("span", { className: "malix-user-profile__menu-item-label", children: item.label })
|
|
2158
2339
|
]
|
|
2159
2340
|
},
|
|
2160
2341
|
i
|
|
2161
2342
|
)) })
|
|
2162
2343
|
] }) : null,
|
|
2163
|
-
onLogout ? /* @__PURE__ */
|
|
2164
|
-
/* @__PURE__ */
|
|
2165
|
-
/* @__PURE__ */
|
|
2344
|
+
onLogout ? /* @__PURE__ */ jsxs45(Fragment2, { children: [
|
|
2345
|
+
/* @__PURE__ */ jsx50("hr", { className: "malix-user-profile__divider" }),
|
|
2346
|
+
/* @__PURE__ */ jsxs45(
|
|
2166
2347
|
"button",
|
|
2167
2348
|
{
|
|
2168
2349
|
type: "button",
|
|
2169
2350
|
className: "malix-user-profile__logout",
|
|
2170
2351
|
onClick: onLogout,
|
|
2171
2352
|
children: [
|
|
2172
|
-
/* @__PURE__ */
|
|
2353
|
+
/* @__PURE__ */ jsxs45(
|
|
2173
2354
|
"svg",
|
|
2174
2355
|
{
|
|
2175
2356
|
width: "16",
|
|
@@ -2181,13 +2362,13 @@ function UserProfilePopover({
|
|
|
2181
2362
|
strokeLinecap: "round",
|
|
2182
2363
|
strokeLinejoin: "round",
|
|
2183
2364
|
children: [
|
|
2184
|
-
/* @__PURE__ */
|
|
2185
|
-
/* @__PURE__ */
|
|
2186
|
-
/* @__PURE__ */
|
|
2365
|
+
/* @__PURE__ */ jsx50("path", { d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" }),
|
|
2366
|
+
/* @__PURE__ */ jsx50("polyline", { points: "16 17 21 12 16 7" }),
|
|
2367
|
+
/* @__PURE__ */ jsx50("line", { x1: "21", y1: "12", x2: "9", y2: "12" })
|
|
2187
2368
|
]
|
|
2188
2369
|
}
|
|
2189
2370
|
),
|
|
2190
|
-
/* @__PURE__ */
|
|
2371
|
+
/* @__PURE__ */ jsx50("span", { children: "Log out" })
|
|
2191
2372
|
]
|
|
2192
2373
|
}
|
|
2193
2374
|
)
|
|
@@ -2198,7 +2379,7 @@ function UserProfilePopover({
|
|
|
2198
2379
|
}
|
|
2199
2380
|
|
|
2200
2381
|
// src/components/ChatBubble.tsx
|
|
2201
|
-
import { jsx as
|
|
2382
|
+
import { jsx as jsx51, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
2202
2383
|
function ChatBubble({
|
|
2203
2384
|
variant,
|
|
2204
2385
|
message,
|
|
@@ -2207,22 +2388,22 @@ function ChatBubble({
|
|
|
2207
2388
|
className
|
|
2208
2389
|
}) {
|
|
2209
2390
|
const content = children ?? message;
|
|
2210
|
-
return /* @__PURE__ */
|
|
2391
|
+
return /* @__PURE__ */ jsxs46(
|
|
2211
2392
|
"div",
|
|
2212
2393
|
{
|
|
2213
2394
|
className: `malix-chat-bubble-row${className ? ` ${className}` : ""}`,
|
|
2214
2395
|
"data-variant": variant,
|
|
2215
2396
|
children: [
|
|
2216
|
-
/* @__PURE__ */
|
|
2217
|
-
variant === "user" && avatarInitials ? /* @__PURE__ */
|
|
2397
|
+
/* @__PURE__ */ jsx51("div", { className: "malix-chat-bubble", "data-variant": variant, children: /* @__PURE__ */ jsx51("span", { className: "malix-chat-bubble__text", children: content }) }),
|
|
2398
|
+
variant === "user" && avatarInitials ? /* @__PURE__ */ jsx51("span", { className: "malix-chat-bubble__avatar", children: avatarInitials }) : null
|
|
2218
2399
|
]
|
|
2219
2400
|
}
|
|
2220
2401
|
);
|
|
2221
2402
|
}
|
|
2222
2403
|
|
|
2223
2404
|
// src/components/AIAssistantPanel.tsx
|
|
2224
|
-
import { useState as useState6, useRef as
|
|
2225
|
-
import { jsx as
|
|
2405
|
+
import { useState as useState6, useRef as useRef7, useEffect as useEffect6 } from "react";
|
|
2406
|
+
import { jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
2226
2407
|
function AIAssistantPanel({
|
|
2227
2408
|
title = "AI Assistant",
|
|
2228
2409
|
messages,
|
|
@@ -2234,8 +2415,8 @@ function AIAssistantPanel({
|
|
|
2234
2415
|
className
|
|
2235
2416
|
}) {
|
|
2236
2417
|
const [draft, setDraft] = useState6("");
|
|
2237
|
-
const bodyRef =
|
|
2238
|
-
|
|
2418
|
+
const bodyRef = useRef7(null);
|
|
2419
|
+
useEffect6(() => {
|
|
2239
2420
|
if (bodyRef.current) {
|
|
2240
2421
|
bodyRef.current.scrollTop = bodyRef.current.scrollHeight;
|
|
2241
2422
|
}
|
|
@@ -2252,25 +2433,25 @@ function AIAssistantPanel({
|
|
|
2252
2433
|
handleSend();
|
|
2253
2434
|
}
|
|
2254
2435
|
};
|
|
2255
|
-
return /* @__PURE__ */
|
|
2256
|
-
/* @__PURE__ */
|
|
2257
|
-
/* @__PURE__ */
|
|
2258
|
-
/* @__PURE__ */
|
|
2259
|
-
onClose ? /* @__PURE__ */
|
|
2436
|
+
return /* @__PURE__ */ jsxs47("div", { className: `malix-ai-panel${className ? ` ${className}` : ""}`, children: [
|
|
2437
|
+
/* @__PURE__ */ jsxs47("div", { className: "malix-ai-panel__header", children: [
|
|
2438
|
+
/* @__PURE__ */ jsx52("span", { className: "malix-ai-panel__logo", children: /* @__PURE__ */ jsx52("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx52("path", { d: "M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z" }) }) }),
|
|
2439
|
+
/* @__PURE__ */ jsx52("span", { className: "malix-ai-panel__title", children: title }),
|
|
2440
|
+
onClose ? /* @__PURE__ */ jsx52(
|
|
2260
2441
|
"button",
|
|
2261
2442
|
{
|
|
2262
2443
|
type: "button",
|
|
2263
2444
|
className: "malix-ai-panel__close",
|
|
2264
2445
|
onClick: onClose,
|
|
2265
2446
|
"aria-label": "Close assistant",
|
|
2266
|
-
children: /* @__PURE__ */
|
|
2267
|
-
/* @__PURE__ */
|
|
2268
|
-
/* @__PURE__ */
|
|
2447
|
+
children: /* @__PURE__ */ jsxs47("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
2448
|
+
/* @__PURE__ */ jsx52("path", { d: "M18 6 6 18" }),
|
|
2449
|
+
/* @__PURE__ */ jsx52("path", { d: "m6 6 12 12" })
|
|
2269
2450
|
] })
|
|
2270
2451
|
}
|
|
2271
2452
|
) : null
|
|
2272
2453
|
] }),
|
|
2273
|
-
/* @__PURE__ */
|
|
2454
|
+
/* @__PURE__ */ jsx52("div", { className: "malix-ai-panel__body", ref: bodyRef, children: messages.map((msg) => /* @__PURE__ */ jsx52(
|
|
2274
2455
|
ChatBubble,
|
|
2275
2456
|
{
|
|
2276
2457
|
variant: msg.variant,
|
|
@@ -2279,8 +2460,8 @@ function AIAssistantPanel({
|
|
|
2279
2460
|
},
|
|
2280
2461
|
msg.id
|
|
2281
2462
|
)) }),
|
|
2282
|
-
/* @__PURE__ */
|
|
2283
|
-
/* @__PURE__ */
|
|
2463
|
+
/* @__PURE__ */ jsx52("div", { className: "malix-ai-panel__footer", children: /* @__PURE__ */ jsxs47("div", { className: "malix-ai-panel__input-row", children: [
|
|
2464
|
+
/* @__PURE__ */ jsx52(
|
|
2284
2465
|
"input",
|
|
2285
2466
|
{
|
|
2286
2467
|
type: "text",
|
|
@@ -2293,7 +2474,7 @@ function AIAssistantPanel({
|
|
|
2293
2474
|
"aria-label": placeholder
|
|
2294
2475
|
}
|
|
2295
2476
|
),
|
|
2296
|
-
/* @__PURE__ */
|
|
2477
|
+
/* @__PURE__ */ jsx52(
|
|
2297
2478
|
"button",
|
|
2298
2479
|
{
|
|
2299
2480
|
type: "button",
|
|
@@ -2301,15 +2482,83 @@ function AIAssistantPanel({
|
|
|
2301
2482
|
onClick: handleSend,
|
|
2302
2483
|
disabled: disabled || !draft.trim(),
|
|
2303
2484
|
"aria-label": "Send message",
|
|
2304
|
-
children: /* @__PURE__ */
|
|
2305
|
-
/* @__PURE__ */
|
|
2306
|
-
/* @__PURE__ */
|
|
2485
|
+
children: /* @__PURE__ */ jsxs47("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
2486
|
+
/* @__PURE__ */ jsx52("path", { d: "M12 19V5" }),
|
|
2487
|
+
/* @__PURE__ */ jsx52("path", { d: "m5 12 7-7 7 7" })
|
|
2307
2488
|
] })
|
|
2308
2489
|
}
|
|
2309
2490
|
)
|
|
2310
2491
|
] }) })
|
|
2311
2492
|
] });
|
|
2312
2493
|
}
|
|
2494
|
+
|
|
2495
|
+
// src/theme.ts
|
|
2496
|
+
import { createContext, createElement, useCallback as useCallback3, useContext, useEffect as useEffect7, useMemo, useState as useState7 } from "react";
|
|
2497
|
+
var STORAGE_KEY = "malix-theme";
|
|
2498
|
+
var MalixThemeContext = createContext(null);
|
|
2499
|
+
function getSystemTheme() {
|
|
2500
|
+
if (typeof window === "undefined") return "light";
|
|
2501
|
+
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
2502
|
+
}
|
|
2503
|
+
function getStoredTheme() {
|
|
2504
|
+
if (typeof window === "undefined") return null;
|
|
2505
|
+
try {
|
|
2506
|
+
const stored = localStorage.getItem(STORAGE_KEY);
|
|
2507
|
+
if (stored === "light" || stored === "dark" || stored === "system") return stored;
|
|
2508
|
+
} catch {
|
|
2509
|
+
}
|
|
2510
|
+
return null;
|
|
2511
|
+
}
|
|
2512
|
+
function resolveTheme(theme) {
|
|
2513
|
+
return theme === "system" ? getSystemTheme() : theme;
|
|
2514
|
+
}
|
|
2515
|
+
function applyTheme(resolved) {
|
|
2516
|
+
const root = document.documentElement;
|
|
2517
|
+
root.classList.toggle("dark", resolved === "dark");
|
|
2518
|
+
root.setAttribute("data-theme", resolved);
|
|
2519
|
+
}
|
|
2520
|
+
function MalixThemeProvider({ children, defaultTheme = "system" }) {
|
|
2521
|
+
const [theme, setThemeState] = useState7(() => getStoredTheme() ?? defaultTheme);
|
|
2522
|
+
const setTheme = useCallback3((next) => {
|
|
2523
|
+
setThemeState(next);
|
|
2524
|
+
try {
|
|
2525
|
+
localStorage.setItem(STORAGE_KEY, next);
|
|
2526
|
+
} catch {
|
|
2527
|
+
}
|
|
2528
|
+
applyTheme(resolveTheme(next));
|
|
2529
|
+
}, []);
|
|
2530
|
+
const toggleTheme = useCallback3(() => {
|
|
2531
|
+
setThemeState((prev) => {
|
|
2532
|
+
const resolved = resolveTheme(prev);
|
|
2533
|
+
const next = resolved === "dark" ? "light" : "dark";
|
|
2534
|
+
try {
|
|
2535
|
+
localStorage.setItem(STORAGE_KEY, next);
|
|
2536
|
+
} catch {
|
|
2537
|
+
}
|
|
2538
|
+
applyTheme(next);
|
|
2539
|
+
return next;
|
|
2540
|
+
});
|
|
2541
|
+
}, []);
|
|
2542
|
+
useEffect7(() => {
|
|
2543
|
+
applyTheme(resolveTheme(theme));
|
|
2544
|
+
}, [theme]);
|
|
2545
|
+
useEffect7(() => {
|
|
2546
|
+
if (theme !== "system") return;
|
|
2547
|
+
const mq = window.matchMedia("(prefers-color-scheme: dark)");
|
|
2548
|
+
const handler = () => applyTheme(getSystemTheme());
|
|
2549
|
+
mq.addEventListener("change", handler);
|
|
2550
|
+
return () => mq.removeEventListener("change", handler);
|
|
2551
|
+
}, [theme]);
|
|
2552
|
+
const value = useMemo(() => ({ theme, setTheme, toggleTheme }), [theme, setTheme, toggleTheme]);
|
|
2553
|
+
return createElement(MalixThemeContext.Provider, { value }, children);
|
|
2554
|
+
}
|
|
2555
|
+
function useMalixTheme() {
|
|
2556
|
+
const ctx = useContext(MalixThemeContext);
|
|
2557
|
+
if (!ctx) {
|
|
2558
|
+
throw new Error("useMalixTheme must be used within a MalixThemeProvider");
|
|
2559
|
+
}
|
|
2560
|
+
return ctx;
|
|
2561
|
+
}
|
|
2313
2562
|
export {
|
|
2314
2563
|
AIAssistantPanel,
|
|
2315
2564
|
Accordion,
|
|
@@ -2322,6 +2571,7 @@ export {
|
|
|
2322
2571
|
ChatBubble,
|
|
2323
2572
|
ChatInput,
|
|
2324
2573
|
Checkbox,
|
|
2574
|
+
ConfirmDialog,
|
|
2325
2575
|
CreditsIndicator,
|
|
2326
2576
|
DataTable,
|
|
2327
2577
|
DateInput,
|
|
@@ -2336,6 +2586,7 @@ export {
|
|
|
2336
2586
|
Input,
|
|
2337
2587
|
InputGroup,
|
|
2338
2588
|
LanguageSelector,
|
|
2589
|
+
MalixThemeProvider,
|
|
2339
2590
|
Modal,
|
|
2340
2591
|
OnboardingPopover,
|
|
2341
2592
|
OperationStatus,
|
|
@@ -2363,5 +2614,6 @@ export {
|
|
|
2363
2614
|
Tooltip,
|
|
2364
2615
|
UserProfilePopover,
|
|
2365
2616
|
ValidationAlert,
|
|
2366
|
-
tokens_registry_default as tokenRegistry
|
|
2617
|
+
tokens_registry_default as tokenRegistry,
|
|
2618
|
+
useMalixTheme
|
|
2367
2619
|
};
|