@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/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
- open ? /* @__PURE__ */ jsx7("span", { role: "tooltip", id: tooltipId, className: "malix-tooltip", "data-placement": placement, children: content }) : null
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 = useRef(null);
1014
- useEffect(() => {
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 useEffect2, useRef as useRef2 } from "react";
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 = useRef2(null);
1072
- useEffect2(() => {
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/GlassPopover.tsx
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__ */ jsxs26(
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__ */ jsxs26("div", { className: "malix-glass-popover__header", children: [
1168
- title ? /* @__PURE__ */ jsx30("span", { className: "malix-glass-popover__title", children: title }) : null,
1169
- onClose ? /* @__PURE__ */ jsx30(
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__ */ jsxs26("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1177
- /* @__PURE__ */ jsx30("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1178
- /* @__PURE__ */ jsx30("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
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__ */ jsx30("div", { className: "malix-glass-popover__body", children })
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 jsx31, jsxs as jsxs27 } from "react/jsx-runtime";
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__ */ jsxs27(
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__ */ jsxs27(
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__ */ jsx31("span", { className: "malix-accordion__icon", children: icon }) : null,
1217
- /* @__PURE__ */ jsx31("span", { className: "malix-accordion__title", children: title }),
1218
- /* @__PURE__ */ jsx31(
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__ */ jsx31("polyline", { points: "6 9 12 15 18 9" })
1412
+ children: /* @__PURE__ */ jsx32("polyline", { points: "6 9 12 15 18 9" })
1232
1413
  }
1233
1414
  )
1234
1415
  ]
1235
1416
  }
1236
1417
  ),
1237
- /* @__PURE__ */ jsx31("div", { className: "malix-accordion__body", children })
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 jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
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__ */ jsxs28(
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__ */ jsx32("span", { className: "malix-badge__dot" }) : null,
1260
- /* @__PURE__ */ jsx32("span", { className: "malix-badge__label", children })
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 jsx33, jsxs as jsxs29 } from "react/jsx-runtime";
1448
+ import { jsx as jsx34, jsxs as jsxs30 } from "react/jsx-runtime";
1268
1449
  var defaultIcons = {
1269
- info: /* @__PURE__ */ jsxs29("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1270
- /* @__PURE__ */ jsx33("circle", { cx: "12", cy: "12", r: "10" }),
1271
- /* @__PURE__ */ jsx33("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
1272
- /* @__PURE__ */ jsx33("line", { x1: "12", y1: "8", x2: "12.01", y2: "8" })
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__ */ jsxs29("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1275
- /* @__PURE__ */ jsx33("path", { d: "M22 11.08V12a10 10 0 1 1-5.93-9.14" }),
1276
- /* @__PURE__ */ jsx33("polyline", { points: "22 4 12 14.01 9 11.01" })
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__ */ jsxs29("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1279
- /* @__PURE__ */ jsx33("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" }),
1280
- /* @__PURE__ */ jsx33("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
1281
- /* @__PURE__ */ jsx33("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
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__ */ jsxs29("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1284
- /* @__PURE__ */ jsx33("circle", { cx: "12", cy: "12", r: "10" }),
1285
- /* @__PURE__ */ jsx33("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
1286
- /* @__PURE__ */ jsx33("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
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__ */ jsxs29(
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__ */ jsx33("span", { className: "malix-banner__icon", children: icon ?? defaultIcons[variant] }),
1306
- /* @__PURE__ */ jsx33("span", { className: "malix-banner__content", children }),
1307
- onClose ? /* @__PURE__ */ jsx33(
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__ */ jsxs29("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1315
- /* @__PURE__ */ jsx33("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1316
- /* @__PURE__ */ jsx33("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
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 jsx34, jsxs as jsxs30 } from "react/jsx-runtime";
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__ */ jsxs30(
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__ */ jsx34(
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__ */ jsx34(
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__ */ jsx34(
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__ */ jsx34(
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__ */ jsxs30("label", { className: "malix-checkbox-row", children: [
1579
+ return /* @__PURE__ */ jsxs31("label", { className: "malix-checkbox-row", children: [
1399
1580
  checkbox,
1400
- /* @__PURE__ */ jsx34("span", { className: "malix-checkbox-row__label", children: label })
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 jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
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__ */ jsx35(
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__ */ jsx35("span", { className: "malix-radio__dot" })
1618
+ children: /* @__PURE__ */ jsx36("span", { className: "malix-radio__dot" })
1438
1619
  }
1439
1620
  );
1440
1621
  if (label) {
1441
- return /* @__PURE__ */ jsxs31("label", { className: "malix-radio-row", children: [
1622
+ return /* @__PURE__ */ jsxs32("label", { className: "malix-radio-row", children: [
1442
1623
  radio,
1443
- /* @__PURE__ */ jsx35("span", { className: "malix-radio-row__label", children: label })
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 jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
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__ */ jsx36(
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__ */ jsx36("span", { className: "malix-toggle__knob" })
1657
+ children: /* @__PURE__ */ jsx37("span", { className: "malix-toggle__knob" })
1477
1658
  }
1478
1659
  );
1479
1660
  if (label) {
1480
- return /* @__PURE__ */ jsxs32("div", { className: "malix-toggle-row", children: [
1481
- /* @__PURE__ */ jsx36("span", { className: "malix-toggle-row__label", children: label }),
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 jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
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__ */ jsxs33(
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__ */ jsxs33(
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__ */ jsx37("option", { value: "", disabled: true, children: placeholder }) : null,
1517
- options.map((opt) => /* @__PURE__ */ jsx37("option", { value: opt.value, children: opt.label }, opt.value))
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__ */ jsx37("span", { className: "malix-select__icon", children: /* @__PURE__ */ jsx37("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx37(
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 jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
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__ */ jsxs34(
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__ */ jsx38("span", { className: "malix-select-group__label", children: label }) : null,
1734
+ label ? /* @__PURE__ */ jsx39("span", { className: "malix-select-group__label", children: label }) : null,
1554
1735
  children,
1555
- helperText ? /* @__PURE__ */ jsx38("span", { className: "malix-select-group__helper", children: helperText }) : null
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 jsx39 } from "react/jsx-runtime";
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__ */ jsx39(
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__ */ jsx39(
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 jsx40, jsxs as jsxs35 } from "react/jsx-runtime";
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__ */ jsxs35(
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__ */ jsx40("thead", { children: /* @__PURE__ */ jsx40("tr", { className: "malix-data-table__header-row", children: columns.map((col) => /* @__PURE__ */ jsx40(
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__ */ jsx40("tbody", { className: "malix-data-table__body", children: data.length > 0 ? data.map((row, rowIndex) => /* @__PURE__ */ jsx40(
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__ */ jsx40("td", { className: "malix-data-table__cell", children: col.render ? col.render(row[col.key], row) : row[col.key] }, col.key))
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__ */ jsx40("tr", { className: "malix-data-table__data-row", children: /* @__PURE__ */ jsx40(
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 jsx41, jsxs as jsxs36 } from "react/jsx-runtime";
1822
+ import { jsx as jsx42, jsxs as jsxs37 } from "react/jsx-runtime";
1642
1823
  function ChevronLeft() {
1643
- return /* @__PURE__ */ jsx41("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx41("path", { d: "M10 12L6 8L10 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
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__ */ jsx41("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx41("path", { d: "M6 4L10 8L6 12", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
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__ */ jsxs36(
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__ */ jsx41(
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__ */ jsx41(ChevronLeft, {})
1855
+ children: /* @__PURE__ */ jsx42(ChevronLeft, {})
1675
1856
  }
1676
1857
  ),
1677
- variant === "full" ? pages.map((page) => /* @__PURE__ */ jsx41(
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__ */ jsxs36("span", { className: "malix-pagination__label", children: [
1869
+ )) : /* @__PURE__ */ jsxs37("span", { className: "malix-pagination__label", children: [
1689
1870
  currentPage,
1690
1871
  " of ",
1691
1872
  totalPages
1692
1873
  ] }),
1693
- /* @__PURE__ */ jsx41(
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__ */ jsx41(ChevronRight, {})
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 jsx42, jsxs as jsxs37 } from "react/jsx-runtime";
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__ */ jsxs37(
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__ */ jsx42("span", { className: "malix-status-dot__dot", "aria-hidden": "true" }),
1726
- /* @__PURE__ */ jsx42("span", { className: "malix-status-dot__label", children: label })
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 useRef3, useState as useState4 } from "react";
1734
- import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
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 = useRef3(null);
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__ */ jsxs38(
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__ */ jsx43(
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__ */ jsxs38(
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__ */ jsx43("path", { d: "M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242" }),
1810
- /* @__PURE__ */ jsx43("path", { d: "M12 12v9" }),
1811
- /* @__PURE__ */ jsx43("path", { d: "m16 16-4-4-4 4" })
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__ */ jsx43("span", { className: "malix-dropzone__title", children: title }),
1816
- /* @__PURE__ */ jsx43("span", { className: "malix-dropzone__hint", children: hint }),
1817
- /* @__PURE__ */ jsx43("span", { className: "malix-dropzone__browse-btn", children: "Browse files" })
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 useRef4, useEffect as useEffect3 } from "react";
1825
- import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
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 = useRef4(null);
1837
- const dragging = useRef4(false);
1838
- const onMouseDown = useCallback((e) => {
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
- useEffect3(() => {
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__ */ jsxs39(
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__ */ jsxs39("div", { className: "malix-split-pane__left", style: { width: `${split}%` }, children: [
1868
- leftTitle ? /* @__PURE__ */ jsx44("span", { className: "malix-split-pane__panel-title", children: leftTitle }) : null,
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__ */ jsxs39(
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__ */ jsx44("span", { className: "malix-split-pane__handle-dot", "aria-hidden": "true" }),
1883
- /* @__PURE__ */ jsx44("span", { className: "malix-split-pane__handle-dot", "aria-hidden": "true" }),
1884
- /* @__PURE__ */ jsx44("span", { className: "malix-split-pane__handle-dot", "aria-hidden": "true" })
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__ */ jsxs39("div", { className: "malix-split-pane__right", style: { width: `${100 - split}%` }, children: [
1889
- rightTitle ? /* @__PURE__ */ jsx44("span", { className: "malix-split-pane__panel-title", children: rightTitle }) : null,
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 jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
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__ */ jsxs40(
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__ */ jsx45("span", { className: "malix-pricing-card__badge", children: planName }),
1919
- /* @__PURE__ */ jsxs40("div", { className: "malix-pricing-card__price-row", children: [
1920
- /* @__PURE__ */ jsx45("span", { className: "malix-pricing-card__price", children: price }),
1921
- /* @__PURE__ */ jsx45("span", { className: "malix-pricing-card__period", children: period })
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__ */ jsx45("p", { className: "malix-pricing-card__description", children: description }) : null,
1924
- /* @__PURE__ */ jsx45("ul", { className: "malix-pricing-card__features", children: features.map((feature, i) => /* @__PURE__ */ jsxs40("li", { className: "malix-pricing-card__feature-item", children: [
1925
- /* @__PURE__ */ jsx45(
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__ */ jsx45("polyline", { points: "20 6 9 17 4 12" })
2119
+ children: /* @__PURE__ */ jsx46("polyline", { points: "20 6 9 17 4 12" })
1939
2120
  }
1940
2121
  ),
1941
- /* @__PURE__ */ jsx45("span", { children: feature })
2122
+ /* @__PURE__ */ jsx46("span", { children: feature })
1942
2123
  ] }, i)) }),
1943
- /* @__PURE__ */ jsx45(
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 jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
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__ */ jsxs41(
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__ */ jsxs41("span", { className: "malix-onboarding-popover__step", children: [
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__ */ jsx46("h3", { className: "malix-onboarding-popover__title", children: title }),
1985
- /* @__PURE__ */ jsx46("p", { className: "malix-onboarding-popover__description", children: description }),
1986
- /* @__PURE__ */ jsxs41("div", { className: "malix-onboarding-popover__actions", children: [
1987
- onSkip ? /* @__PURE__ */ jsx46(
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__ */ jsx46(
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 jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
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__ */ jsxs42(
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__ */ jsx47("span", { className: "malix-credits-indicator__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsxs42(
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__ */ jsx47("ellipse", { cx: "12", cy: "6", rx: "8", ry: "3" }),
2038
- /* @__PURE__ */ jsx47("path", { d: "M4 6v6c0 1.66 3.58 3 8 3s8-1.34 8-3V6" }),
2039
- /* @__PURE__ */ jsx47("path", { d: "M4 12v6c0 1.66 3.58 3 8 3s8-1.34 8-3v-6" })
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__ */ jsxs42("div", { className: "malix-credits-indicator__info", children: [
2044
- /* @__PURE__ */ jsx47("span", { className: "malix-credits-indicator__label", children: label }),
2045
- /* @__PURE__ */ jsx47("span", { className: "malix-credits-indicator__value", children: remaining })
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 jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
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__ */ jsxs43(
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__ */ jsx48("span", { className: "malix-language-selector__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsxs43(
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__ */ jsx48("circle", { cx: "12", cy: "12", r: "10" }),
2082
- /* @__PURE__ */ jsx48("line", { x1: "2", y1: "12", x2: "22", y2: "12" }),
2083
- /* @__PURE__ */ jsx48("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" })
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__ */ jsx48(
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__ */ jsx48("option", { value: opt.value, children: opt.label }, opt.value)) : /* @__PURE__ */ jsx48("option", { value, children: displayLabel })
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__ */ jsx48("span", { className: "malix-language-selector__label", children: displayLabel }),
2098
- /* @__PURE__ */ jsx48("span", { className: "malix-language-selector__chevron", "aria-hidden": "true", children: /* @__PURE__ */ jsx48(
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__ */ jsx48("polyline", { points: "6 9 12 15 18 9" })
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 jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
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__ */ jsxs44(
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__ */ jsxs44("div", { className: "malix-user-profile__header", children: [
2136
- avatar ? /* @__PURE__ */ jsx49("span", { className: "malix-user-profile__avatar", children: avatar }) : null,
2137
- /* @__PURE__ */ jsxs44("div", { className: "malix-user-profile__info", children: [
2138
- /* @__PURE__ */ jsx49("span", { className: "malix-user-profile__name", children: name }),
2139
- /* @__PURE__ */ jsx49("span", { className: "malix-user-profile__email", children: email })
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__ */ jsxs44("div", { className: "malix-user-profile__credits", children: [
2143
- /* @__PURE__ */ jsx49("span", { className: "malix-user-profile__credits-label", children: "Credits" }),
2144
- /* @__PURE__ */ jsx49("span", { className: "malix-user-profile__credits-value", children: credits })
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__ */ jsxs44(Fragment2, { children: [
2147
- /* @__PURE__ */ jsx49("hr", { className: "malix-user-profile__divider" }),
2148
- /* @__PURE__ */ jsx49("nav", { className: "malix-user-profile__menu", role: "menu", children: menuItems.map((item, i) => /* @__PURE__ */ jsxs44(
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__ */ jsx49("span", { className: "malix-user-profile__menu-item-icon", children: item.icon }) : null,
2157
- /* @__PURE__ */ jsx49("span", { className: "malix-user-profile__menu-item-label", children: item.label })
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__ */ jsxs44(Fragment2, { children: [
2164
- /* @__PURE__ */ jsx49("hr", { className: "malix-user-profile__divider" }),
2165
- /* @__PURE__ */ jsxs44(
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__ */ jsxs44(
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__ */ jsx49("path", { d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" }),
2185
- /* @__PURE__ */ jsx49("polyline", { points: "16 17 21 12 16 7" }),
2186
- /* @__PURE__ */ jsx49("line", { x1: "21", y1: "12", x2: "9", y2: "12" })
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__ */ jsx49("span", { children: "Log out" })
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 jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
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__ */ jsxs45(
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__ */ jsx50("div", { className: "malix-chat-bubble", "data-variant": variant, children: /* @__PURE__ */ jsx50("span", { className: "malix-chat-bubble__text", children: content }) }),
2217
- variant === "user" && avatarInitials ? /* @__PURE__ */ jsx50("span", { className: "malix-chat-bubble__avatar", children: avatarInitials }) : null
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 useRef5, useEffect as useEffect4 } from "react";
2225
- import { jsx as jsx51, jsxs as jsxs46 } from "react/jsx-runtime";
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 = useRef5(null);
2238
- useEffect4(() => {
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__ */ jsxs46("div", { className: `malix-ai-panel${className ? ` ${className}` : ""}`, children: [
2256
- /* @__PURE__ */ jsxs46("div", { className: "malix-ai-panel__header", children: [
2257
- /* @__PURE__ */ jsx51("span", { className: "malix-ai-panel__logo", children: /* @__PURE__ */ jsx51("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx51("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" }) }) }),
2258
- /* @__PURE__ */ jsx51("span", { className: "malix-ai-panel__title", children: title }),
2259
- onClose ? /* @__PURE__ */ jsx51(
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__ */ jsxs46("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2267
- /* @__PURE__ */ jsx51("path", { d: "M18 6 6 18" }),
2268
- /* @__PURE__ */ jsx51("path", { d: "m6 6 12 12" })
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__ */ jsx51("div", { className: "malix-ai-panel__body", ref: bodyRef, children: messages.map((msg) => /* @__PURE__ */ jsx51(
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__ */ jsx51("div", { className: "malix-ai-panel__footer", children: /* @__PURE__ */ jsxs46("div", { className: "malix-ai-panel__input-row", children: [
2283
- /* @__PURE__ */ jsx51(
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__ */ jsx51(
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__ */ jsxs46("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2305
- /* @__PURE__ */ jsx51("path", { d: "M12 19V5" }),
2306
- /* @__PURE__ */ jsx51("path", { d: "m5 12 7-7 7 7" })
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
  };