@indusaction/cms-design-system 0.1.0 → 0.2.1

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
@@ -1,22 +1,20 @@
1
- import React from 'react';
2
- import { Button as Button$1, ConfigProvider } from 'antd';
3
- import { jsx } from 'react/jsx-runtime';
1
+ import React, { createContext, useMemo, useState, useRef, useEffect, useCallback, useContext } from 'react';
2
+ import { Button as Button$1, theme as theme$1, Skeleton as Skeleton$1, Tag as Tag$1, Typography, Card as Card$1, Statistic, Modal as Modal$1, Breadcrumb, Avatar, Layout, Alert, ConfigProvider, Dropdown as Dropdown$1, message, notification, Tabs as Tabs$1, Input, Pagination, Table as Table$1, Drawer, Result, Grid, Menu, Popconfirm } from 'antd';
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+ import { createPortal } from 'react-dom';
4
5
 
5
6
  // src/components/Button/Button.tsx
6
- var Button = React.forwardRef(
7
- function Button2({ variant = "default", size = "middle", children, ...rest }, ref) {
8
- return /* @__PURE__ */ jsx(Button$1, { ref, type: variant, size, ...rest, children });
9
- }
10
- );
7
+ var Button = React.forwardRef(function Button2({ variant = "default", size = "middle", children, ...rest }, ref) {
8
+ return /* @__PURE__ */ jsx(Button$1, { ref, type: variant, size, ...rest, children });
9
+ });
11
10
  Button.displayName = "Button";
12
-
13
- // src/theme/colors.ts
14
11
  var colors = {
15
12
  brand: {
16
13
  primary: "#596993",
17
14
  primaryHover: "#6B7BA5",
18
15
  primaryActive: "#4A587C",
19
- primaryLight: "#E8EBF2"
16
+ primaryLight: "#E8EBF2",
17
+ accent: "#F69120"
20
18
  },
21
19
  neutral: {
22
20
  white: "#FFFFFF",
@@ -39,29 +37,2397 @@ var colors = {
39
37
  info: "#596993"
40
38
  }
41
39
  };
42
-
43
- // src/theme/theme.ts
40
+ var spacing = {
41
+ none: 0,
42
+ xxs: 4,
43
+ xs: 8,
44
+ sm: 12,
45
+ md: 16,
46
+ lg: 24,
47
+ xl: 32,
48
+ xxl: 48
49
+ };
50
+ var fontSize = {
51
+ xxs: 11,
52
+ xs: 12,
53
+ sm: 14,
54
+ md: 16,
55
+ lg: 20,
56
+ xl: 24,
57
+ xxl: 30
58
+ };
59
+ var breakpoints = {
60
+ xs: 480,
61
+ sm: 576,
62
+ md: 768,
63
+ lg: 992,
64
+ xl: 1200,
65
+ xxl: 1600
66
+ };
44
67
  var theme = {
68
+ algorithm: theme$1.defaultAlgorithm,
45
69
  token: {
46
70
  colorPrimary: colors.brand.primary,
71
+ colorPrimaryHover: colors.brand.primaryHover,
72
+ colorPrimaryActive: colors.brand.primaryActive,
73
+ colorPrimaryBg: colors.brand.primaryLight,
74
+ colorLink: colors.brand.primary,
47
75
  colorInfo: colors.semantic.info,
48
76
  colorSuccess: colors.semantic.success,
49
77
  colorWarning: colors.semantic.warning,
50
78
  colorError: colors.semantic.error,
51
- colorLink: colors.brand.primary
79
+ paddingXXS: spacing.xxs,
80
+ paddingXS: spacing.xs,
81
+ paddingSM: spacing.sm,
82
+ padding: spacing.md,
83
+ paddingMD: spacing.md,
84
+ paddingLG: spacing.lg,
85
+ paddingXL: spacing.xl,
86
+ marginXXS: spacing.xxs,
87
+ marginXS: spacing.xs,
88
+ marginSM: spacing.sm,
89
+ margin: spacing.md,
90
+ marginMD: spacing.md,
91
+ marginLG: spacing.lg,
92
+ marginXL: spacing.xl,
93
+ marginXXL: spacing.xxl,
94
+ fontSizeSM: fontSize.xs,
95
+ fontSize: fontSize.sm,
96
+ fontSizeLG: fontSize.md,
97
+ fontSizeXL: fontSize.lg,
98
+ fontSizeHeading5: fontSize.md,
99
+ fontSizeHeading4: fontSize.lg,
100
+ fontSizeHeading3: fontSize.xl,
101
+ fontSizeHeading2: fontSize.xxl,
102
+ screenXS: breakpoints.xs,
103
+ screenSM: breakpoints.sm,
104
+ screenMD: breakpoints.md,
105
+ screenLG: breakpoints.lg,
106
+ screenXL: breakpoints.xl,
107
+ screenXXL: breakpoints.xxl
108
+ }
109
+ };
110
+ function ThemeProvider({ children }) {
111
+ return React.createElement(ConfigProvider, { theme }, children);
112
+ }
113
+ var Tabs = ({ type = "line", ...rest }) => {
114
+ return /* @__PURE__ */ jsx(
115
+ ConfigProvider,
116
+ {
117
+ theme: {
118
+ components: {
119
+ Tabs: {
120
+ titleFontSizeSM: fontSize.sm,
121
+ titleFontSize: fontSize.md,
122
+ titleFontSizeLG: fontSize.lg
123
+ }
124
+ }
125
+ },
126
+ children: /* @__PURE__ */ jsx(Tabs$1, { type, ...rest })
127
+ }
128
+ );
129
+ };
130
+ Tabs.displayName = "Tabs";
131
+ var DropdownButton = ({
132
+ children,
133
+ ...rest
134
+ }) => {
135
+ return /* @__PURE__ */ jsx(
136
+ ConfigProvider,
137
+ {
138
+ theme: {
139
+ components: {
140
+ Dropdown: {
141
+ paddingXXS: spacing.xxs,
142
+ paddingXS: spacing.xs
143
+ }
144
+ }
145
+ },
146
+ children: /* @__PURE__ */ jsx(Dropdown$1.Button, { ...rest, children })
147
+ }
148
+ );
149
+ };
150
+ DropdownButton.displayName = "Dropdown.Button";
151
+ var Dropdown = ({ children, ...rest }) => {
152
+ return /* @__PURE__ */ jsx(
153
+ ConfigProvider,
154
+ {
155
+ theme: {
156
+ components: {
157
+ Dropdown: {
158
+ paddingXXS: spacing.xxs,
159
+ paddingXS: spacing.xs
160
+ }
161
+ }
162
+ },
163
+ children: /* @__PURE__ */ jsx(Dropdown$1, { ...rest, children })
164
+ }
165
+ );
166
+ };
167
+ Dropdown.Button = DropdownButton;
168
+ Dropdown.displayName = "Dropdown";
169
+ function DetailsSkeleton({ rows = 5, avatar = false }) {
170
+ return /* @__PURE__ */ jsxs("div", { "aria-busy": "true", "aria-live": "polite", children: [
171
+ avatar ? /* @__PURE__ */ jsxs(
172
+ "div",
173
+ {
174
+ style: {
175
+ display: "flex",
176
+ alignItems: "center",
177
+ gap: spacing.md,
178
+ marginBottom: spacing.lg
179
+ },
180
+ children: [
181
+ /* @__PURE__ */ jsx(Skeleton$1.Avatar, { active: true, size: 48 }),
182
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
183
+ /* @__PURE__ */ jsx(
184
+ Skeleton$1.Input,
185
+ {
186
+ active: true,
187
+ size: "small",
188
+ style: { width: 180, maxWidth: "70%", height: 16, marginBottom: spacing.xs }
189
+ }
190
+ ),
191
+ /* @__PURE__ */ jsx(
192
+ Skeleton$1.Input,
193
+ {
194
+ active: true,
195
+ size: "small",
196
+ style: { width: 120, maxWidth: "50%", height: 12 }
197
+ }
198
+ )
199
+ ] })
200
+ ]
201
+ }
202
+ ) : null,
203
+ Array.from({ length: rows }, (_, index) => /* @__PURE__ */ jsxs(
204
+ "div",
205
+ {
206
+ style: {
207
+ display: "flex",
208
+ alignItems: "center",
209
+ gap: spacing.lg,
210
+ marginBottom: spacing.md
211
+ },
212
+ children: [
213
+ /* @__PURE__ */ jsx(
214
+ Skeleton$1.Input,
215
+ {
216
+ active: true,
217
+ size: "small",
218
+ style: { width: 88, height: 12, flex: "0 0 88px" }
219
+ }
220
+ ),
221
+ /* @__PURE__ */ jsx(
222
+ Skeleton$1.Input,
223
+ {
224
+ active: true,
225
+ size: "small",
226
+ style: {
227
+ width: `${58 + index % 3 * 14}%`,
228
+ maxWidth: 280,
229
+ height: 14,
230
+ minWidth: 0,
231
+ flex: 1
232
+ }
233
+ }
234
+ )
235
+ ]
236
+ },
237
+ index
238
+ ))
239
+ ] });
240
+ }
241
+ DetailsSkeleton.displayName = "Skeleton.Details";
242
+ var Skeleton = ({ active = true, ...rest }) => {
243
+ return /* @__PURE__ */ jsx(Skeleton$1, { active, ...rest });
244
+ };
245
+ Skeleton.Button = Skeleton$1.Button;
246
+ Skeleton.Avatar = Skeleton$1.Avatar;
247
+ Skeleton.Input = Skeleton$1.Input;
248
+ Skeleton.Image = Skeleton$1.Image;
249
+ Skeleton.Node = Skeleton$1.Node;
250
+ Skeleton.Details = DetailsSkeleton;
251
+ Skeleton.displayName = "Skeleton";
252
+ var DEFAULT_PAGE_SIZE = 10;
253
+ function isColumnGroup(column) {
254
+ return "children" in column && Array.isArray(column.children);
255
+ }
256
+ function getByDataIndex(record, dataIndex) {
257
+ if (dataIndex == null) return void 0;
258
+ const path = Array.isArray(dataIndex) ? dataIndex : [dataIndex];
259
+ let current = record;
260
+ for (const key of path) {
261
+ if (current == null || typeof current !== "object") return void 0;
262
+ current = current[key];
263
+ }
264
+ return current;
265
+ }
266
+ function compareValues(a, b) {
267
+ if (a == null && b == null) return 0;
268
+ if (a == null) return -1;
269
+ if (b == null) return 1;
270
+ if (typeof a === "number" && typeof b === "number") return a - b;
271
+ return String(a).localeCompare(String(b), void 0, {
272
+ numeric: true,
273
+ sensitivity: "base"
274
+ });
275
+ }
276
+ function flattenColumns(columns) {
277
+ const result = [];
278
+ for (const column of columns) {
279
+ if (isColumnGroup(column)) {
280
+ result.push(...flattenColumns(column.children));
281
+ } else {
282
+ result.push(column);
283
+ }
284
+ }
285
+ return result;
286
+ }
287
+ function matchesSearch(record, search, columns) {
288
+ const query = search.trim().toLowerCase();
289
+ if (!query) return true;
290
+ const leaves = flattenColumns(columns);
291
+ const optedIn = leaves.filter((column) => column.searchable === true);
292
+ const pool = optedIn.length > 0 ? optedIn : leaves.filter((column) => column.searchable !== false);
293
+ return pool.some((column) => {
294
+ const value = getByDataIndex(record, column.dataIndex);
295
+ if (value == null) return false;
296
+ return String(value).toLowerCase().includes(query);
297
+ });
298
+ }
299
+ function defaultCompare(dataIndex) {
300
+ return (a, b) => compareValues(getByDataIndex(a, dataIndex), getByDataIndex(b, dataIndex));
301
+ }
302
+ function enhanceColumnsForClient(columns) {
303
+ return columns.map((column) => {
304
+ if (isColumnGroup(column)) {
305
+ return { ...column, children: enhanceColumnsForClient(column.children) };
306
+ }
307
+ const next = { ...column };
308
+ if (next.sorter === true && next.dataIndex != null) {
309
+ next.sorter = defaultCompare(next.dataIndex);
310
+ }
311
+ if (next.filters && !next.onFilter && next.dataIndex != null) {
312
+ next.onFilter = (value, record) => String(getByDataIndex(record, next.dataIndex)) === String(value);
313
+ }
314
+ return next;
315
+ });
316
+ }
317
+ function adaptColumnsForServer(columns) {
318
+ return columns.map((column) => {
319
+ if (isColumnGroup(column)) {
320
+ return { ...column, children: adaptColumnsForServer(column.children) };
321
+ }
322
+ const next = { ...column };
323
+ if (typeof next.sorter === "function") {
324
+ next.sorter = true;
325
+ } else if (next.sorter && typeof next.sorter === "object" && "compare" in next.sorter) {
326
+ const { compare: _compare, ...rest } = next.sorter;
327
+ next.sorter = Object.keys(rest).length > 0 ? rest : true;
328
+ }
329
+ if (next.onFilter) {
330
+ delete next.onFilter;
331
+ }
332
+ return next;
333
+ });
334
+ }
335
+ var SKELETON_WIDTHS = [72, 88, 64, 80, 56];
336
+ function skeletonizeColumns(columns) {
337
+ return columns.map((column, index) => {
338
+ if (isColumnGroup(column)) {
339
+ return { ...column, children: skeletonizeColumns(column.children) };
340
+ }
341
+ const widthPct = SKELETON_WIDTHS[index % SKELETON_WIDTHS.length];
342
+ return {
343
+ ...column,
344
+ sorter: false,
345
+ filters: void 0,
346
+ onFilter: void 0,
347
+ filterDropdown: void 0,
348
+ render: () => /* @__PURE__ */ jsx(
349
+ Skeleton.Input,
350
+ {
351
+ active: true,
352
+ size: "small",
353
+ style: { width: `${widthPct}%`, height: 14, minWidth: 40 }
354
+ }
355
+ )
356
+ };
357
+ });
358
+ }
359
+ function isTableLoading(loading) {
360
+ if (loading == null) return false;
361
+ if (typeof loading === "boolean") return loading;
362
+ return loading.spinning !== false;
363
+ }
364
+ function firstSorter(sorter) {
365
+ return Array.isArray(sorter) ? sorter[0] : sorter;
366
+ }
367
+ function getTableLayout() {
368
+ if (typeof window === "undefined") {
369
+ return { isPhone: false, isTablet: false };
370
+ }
371
+ const width = window.innerWidth;
372
+ return {
373
+ isPhone: width < breakpoints.md,
374
+ isTablet: width >= breakpoints.md && width < breakpoints.lg
375
+ };
376
+ }
377
+ function useTableLayout() {
378
+ const [layout, setLayout] = useState(getTableLayout);
379
+ useEffect(() => {
380
+ const phoneQuery = window.matchMedia(`(max-width: ${breakpoints.md - 1}px)`);
381
+ const tabletQuery = window.matchMedia(
382
+ `(min-width: ${breakpoints.md}px) and (max-width: ${breakpoints.lg - 1}px)`
383
+ );
384
+ const update = () => setLayout(getTableLayout());
385
+ update();
386
+ phoneQuery.addEventListener("change", update);
387
+ tabletQuery.addEventListener("change", update);
388
+ return () => {
389
+ phoneQuery.removeEventListener("change", update);
390
+ tabletQuery.removeEventListener("change", update);
391
+ };
392
+ }, []);
393
+ return layout;
394
+ }
395
+ function resolveSearchConfig(search, mode) {
396
+ if (search === false) return { enabled: false };
397
+ const config = search === true || search == null ? {} : search;
398
+ return {
399
+ enabled: true,
400
+ placeholder: "Search",
401
+ debounceMs: mode === "server" ? 300 : 0,
402
+ ...config
403
+ };
404
+ }
405
+ function Table({
406
+ columns = [],
407
+ dataSource,
408
+ mode = "client",
409
+ search = true,
410
+ pagination,
411
+ onChange,
412
+ onQueryChange,
413
+ scroll,
414
+ size,
415
+ loading = false,
416
+ rowKey,
417
+ ...rest
418
+ }) {
419
+ const { isPhone, isTablet } = useTableLayout();
420
+ const paginationObj = pagination === false ? void 0 : pagination;
421
+ const searchConfig = resolveSearchConfig(search, mode);
422
+ const [query, setQuery] = useState(() => ({
423
+ search: searchConfig.enabled && (searchConfig.value ?? searchConfig.defaultValue) || "",
424
+ page: paginationObj?.current ?? 1,
425
+ pageSize: paginationObj?.pageSize ?? DEFAULT_PAGE_SIZE,
426
+ filters: {},
427
+ sortOrder: null
428
+ }));
429
+ const [inputSearch, setInputSearch] = useState(query.search);
430
+ const [clientFilteredCount, setClientFilteredCount] = useState(null);
431
+ const queryRef = useRef(query);
432
+ queryRef.current = query;
433
+ const onQueryChangeRef = useRef(onQueryChange);
434
+ onQueryChangeRef.current = onQueryChange;
435
+ const searchOnChangeRef = useRef(
436
+ searchConfig.enabled ? searchConfig.onChange : void 0
437
+ );
438
+ searchOnChangeRef.current = searchConfig.enabled ? searchConfig.onChange : void 0;
439
+ const debounceMs = searchConfig.enabled ? searchConfig.debounceMs ?? 0 : 0;
440
+ const debounceTimer = useRef(null);
441
+ const controlledSearch = searchConfig.enabled ? searchConfig.value : void 0;
442
+ useEffect(() => {
443
+ if (controlledSearch === void 0) return;
444
+ setInputSearch(controlledSearch);
445
+ setQuery(
446
+ (prev) => prev.search === controlledSearch ? prev : { ...prev, search: controlledSearch }
447
+ );
448
+ }, [controlledSearch]);
449
+ useEffect(() => {
450
+ if (paginationObj?.current != null) {
451
+ setQuery(
452
+ (prev) => prev.page === paginationObj.current ? prev : { ...prev, page: paginationObj.current }
453
+ );
454
+ }
455
+ }, [paginationObj?.current]);
456
+ useEffect(() => {
457
+ if (paginationObj?.pageSize != null) {
458
+ setQuery(
459
+ (prev) => prev.pageSize === paginationObj.pageSize ? prev : { ...prev, pageSize: paginationObj.pageSize }
460
+ );
461
+ }
462
+ }, [paginationObj?.pageSize]);
463
+ useEffect(() => {
464
+ return () => {
465
+ if (debounceTimer.current) clearTimeout(debounceTimer.current);
466
+ };
467
+ }, []);
468
+ const resolvedQuery = {
469
+ ...query,
470
+ search: controlledSearch ?? query.search,
471
+ page: paginationObj?.current ?? query.page,
472
+ pageSize: paginationObj?.pageSize ?? query.pageSize
473
+ };
474
+ const emitQuery = useCallback((next) => {
475
+ setQuery(next);
476
+ queryRef.current = next;
477
+ onQueryChangeRef.current?.(next);
478
+ }, []);
479
+ const commitSearch = useCallback(
480
+ (value, immediate = false) => {
481
+ const run = () => {
482
+ searchOnChangeRef.current?.(value);
483
+ emitQuery({ ...queryRef.current, search: value, page: 1 });
484
+ };
485
+ if (debounceTimer.current) {
486
+ clearTimeout(debounceTimer.current);
487
+ debounceTimer.current = null;
488
+ }
489
+ if (immediate || debounceMs <= 0) {
490
+ run();
491
+ return;
492
+ }
493
+ debounceTimer.current = setTimeout(run, debounceMs);
494
+ },
495
+ [debounceMs, emitQuery]
496
+ );
497
+ const rows = useMemo(() => {
498
+ const source = dataSource ?? [];
499
+ if (mode === "server" || !searchConfig.enabled) return source;
500
+ return source.filter((record) => matchesSearch(record, resolvedQuery.search, columns));
501
+ }, [columns, dataSource, mode, resolvedQuery.search, searchConfig.enabled]);
502
+ useEffect(() => {
503
+ setClientFilteredCount(null);
504
+ }, [resolvedQuery.search, dataSource]);
505
+ const resolvedColumns = useMemo(
506
+ () => mode === "server" ? adaptColumnsForServer(columns) : enhanceColumnsForClient(columns),
507
+ [columns, mode]
508
+ );
509
+ const tableLoading = isTableLoading(loading);
510
+ const skeletonRowCount = resolvedQuery.pageSize || DEFAULT_PAGE_SIZE;
511
+ const displayColumns = useMemo(
512
+ () => tableLoading ? skeletonizeColumns(resolvedColumns) : resolvedColumns,
513
+ [resolvedColumns, tableLoading]
514
+ );
515
+ const displayRows = useMemo(() => {
516
+ if (!tableLoading) return rows;
517
+ return Array.from({ length: skeletonRowCount }, (_, index) => ({
518
+ __skeletonKey: `skeleton-${index}`
519
+ }));
520
+ }, [rows, skeletonRowCount, tableLoading]);
521
+ const displayRowKey = tableLoading ? (record) => String(record.__skeletonKey) : rowKey;
522
+ const paginationTotal = mode === "server" ? paginationObj?.total ?? rows.length : clientFilteredCount ?? rows.length;
523
+ const resolvedPagination = useMemo(() => {
524
+ if (pagination === false) return false;
525
+ const merged = {
526
+ showSizeChanger: true,
527
+ showQuickJumper: true,
528
+ pageSizeOptions: ["10", "20", "50"],
529
+ showTotal: (total, range) => `${range[0]}\u2013${range[1]} of ${total}`,
530
+ ...paginationObj,
531
+ current: resolvedQuery.page,
532
+ pageSize: resolvedQuery.pageSize,
533
+ style: { display: "none" }
534
+ };
535
+ if (mode === "server") {
536
+ merged.total = paginationTotal;
537
+ }
538
+ return merged;
539
+ }, [
540
+ mode,
541
+ pagination,
542
+ paginationObj,
543
+ paginationTotal,
544
+ resolvedQuery.page,
545
+ resolvedQuery.pageSize
546
+ ]);
547
+ const handleTableChange = (nextPagination, filters, sorter, extra) => {
548
+ const active = firstSorter(sorter);
549
+ const next = {
550
+ ...queryRef.current,
551
+ page: extra.action === "paginate" ? nextPagination.current ?? 1 : 1,
552
+ pageSize: nextPagination.pageSize ?? queryRef.current.pageSize,
553
+ filters,
554
+ sortField: active?.field,
555
+ sortOrder: active?.order ?? null
556
+ };
557
+ if (mode === "client") {
558
+ setClientFilteredCount(extra.currentDataSource.length);
559
+ }
560
+ emitQuery(next);
561
+ onChange?.(nextPagination, filters, sorter, extra);
562
+ };
563
+ const handlePaginationChange = (page, pageSize) => {
564
+ const next = {
565
+ ...queryRef.current,
566
+ page,
567
+ pageSize
568
+ };
569
+ emitQuery(next);
570
+ onChange?.(
571
+ { current: page, pageSize, total: paginationTotal },
572
+ next.filters,
573
+ {
574
+ field: next.sortField,
575
+ order: next.sortOrder
576
+ },
577
+ { currentDataSource: rows, action: "paginate" }
578
+ );
579
+ };
580
+ const bothControls = searchConfig.enabled && pagination !== false;
581
+ const compactPager = isPhone || isTablet;
582
+ return /* @__PURE__ */ jsx(
583
+ ConfigProvider,
584
+ {
585
+ theme: {
586
+ components: {
587
+ Table: {
588
+ headerBg: colors.neutral.gray50
589
+ }
590
+ }
591
+ },
592
+ children: /* @__PURE__ */ jsxs("div", { style: { minWidth: 0, width: "100%" }, children: [
593
+ searchConfig.enabled || pagination !== false ? /* @__PURE__ */ jsxs(
594
+ "div",
595
+ {
596
+ style: isPhone ? {
597
+ display: "flex",
598
+ flexDirection: "column",
599
+ alignItems: "stretch",
600
+ gap: spacing.sm,
601
+ marginBottom: spacing.md
602
+ } : {
603
+ display: "flex",
604
+ alignItems: "center",
605
+ justifyContent: bothControls ? "space-between" : searchConfig.enabled ? "flex-start" : "flex-end",
606
+ gap: spacing.md,
607
+ flexWrap: isTablet ? "wrap" : "nowrap",
608
+ marginBottom: spacing.md
609
+ },
610
+ children: [
611
+ searchConfig.enabled ? /* @__PURE__ */ jsx(
612
+ Input.Search,
613
+ {
614
+ allowClear: true,
615
+ disabled: tableLoading,
616
+ placeholder: searchConfig.placeholder,
617
+ value: inputSearch,
618
+ onChange: (event) => {
619
+ const value = event.target.value;
620
+ setInputSearch(value);
621
+ commitSearch(value);
622
+ },
623
+ onSearch: (value) => {
624
+ setInputSearch(value);
625
+ commitSearch(value, true);
626
+ },
627
+ style: isPhone ? { width: "100%" } : isTablet ? {
628
+ width: 240,
629
+ maxWidth: "100%",
630
+ flex: "0 1 240px",
631
+ minWidth: 160
632
+ } : { width: 320, flex: "0 0 320px", maxWidth: "100%" }
633
+ }
634
+ ) : null,
635
+ pagination !== false ? /* @__PURE__ */ jsx(
636
+ "div",
637
+ {
638
+ style: {
639
+ display: "flex",
640
+ justifyContent: isPhone ? "center" : "flex-end",
641
+ maxWidth: "100%",
642
+ minWidth: 0,
643
+ overflowX: "auto",
644
+ flex: isPhone ? void 0 : "1 1 auto"
645
+ },
646
+ children: /* @__PURE__ */ jsx(
647
+ Pagination,
648
+ {
649
+ current: resolvedQuery.page,
650
+ pageSize: resolvedQuery.pageSize,
651
+ total: paginationTotal,
652
+ size: compactPager ? "small" : void 0,
653
+ simple: isPhone,
654
+ showLessItems: compactPager,
655
+ responsive: true,
656
+ showSizeChanger: paginationObj?.showSizeChanger ?? !isPhone,
657
+ showQuickJumper: paginationObj?.showQuickJumper ?? !compactPager,
658
+ pageSizeOptions: paginationObj?.pageSizeOptions ?? ["10", "20", "50"],
659
+ showTotal: paginationObj?.showTotal ?? (isPhone ? (total, range) => `${range[0]}\u2013${range[1]} of ${total}` : compactPager ? void 0 : (total, range) => `${range[0]}\u2013${range[1]} of ${total}`),
660
+ disabled: paginationObj?.disabled || tableLoading,
661
+ onChange: handlePaginationChange,
662
+ style: { margin: 0, flexShrink: 0 }
663
+ }
664
+ )
665
+ }
666
+ ) : null
667
+ ]
668
+ }
669
+ ) : null,
670
+ /* @__PURE__ */ jsx(
671
+ Table$1,
672
+ {
673
+ ...rest,
674
+ size: size ?? (isPhone ? "small" : "middle"),
675
+ scroll: { x: "max-content", ...scroll },
676
+ columns: displayColumns,
677
+ dataSource: displayRows,
678
+ rowKey: displayRowKey,
679
+ pagination: resolvedPagination,
680
+ onChange: handleTableChange
681
+ }
682
+ )
683
+ ] })
684
+ }
685
+ );
686
+ }
687
+ Table.displayName = "Table";
688
+ var Tag = React.forwardRef(function Tag2({ children, ...rest }, ref) {
689
+ return /* @__PURE__ */ jsx(Tag$1, { ref, ...rest, children });
690
+ });
691
+ var { Link: AntLink } = Typography;
692
+ var Link = React.forwardRef(function Link2({ children, ...rest }, ref) {
693
+ return /* @__PURE__ */ jsx(AntLink, { ref, ...rest, children });
694
+ });
695
+ var Card = React.forwardRef(
696
+ ({
697
+ title,
698
+ description,
699
+ tags,
700
+ extraInfo,
701
+ ctas,
702
+ layout = "inline",
703
+ children,
704
+ className = "",
705
+ loading = false,
706
+ loadingRows = 5,
707
+ ...rest
708
+ }, ref) => {
709
+ return /* @__PURE__ */ jsx(
710
+ Card$1,
711
+ {
712
+ ref,
713
+ className: `cms-card cms-card-${layout} ${className}`,
714
+ ...rest,
715
+ children: /* @__PURE__ */ jsxs("div", { className: "cms-card-content", children: [
716
+ /* @__PURE__ */ jsxs("div", { className: "cms-card-main", children: [
717
+ title && /* @__PURE__ */ jsx("div", { className: "cms-card-title", children: title }),
718
+ description && /* @__PURE__ */ jsx("div", { className: "cms-card-description", children: description }),
719
+ tags && /* @__PURE__ */ jsx("div", { className: "cms-card-tags", children: tags }),
720
+ extraInfo && /* @__PURE__ */ jsx("div", { className: "cms-card-extra-info", children: extraInfo }),
721
+ loading ? /* @__PURE__ */ jsx(Skeleton.Details, { rows: loadingRows }) : children
722
+ ] }),
723
+ ctas && /* @__PURE__ */ jsx("div", { className: "cms-card-ctas", children: ctas })
724
+ ] })
725
+ }
726
+ );
727
+ }
728
+ );
729
+ Card.displayName = "Card";
730
+ var statusColors = {
731
+ primary: colors.brand.primary,
732
+ success: colors.semantic.success,
733
+ warning: colors.semantic.warning,
734
+ error: colors.semantic.error,
735
+ info: colors.semantic.info,
736
+ neutral: colors.neutral.gray600
737
+ };
738
+ var sizeStyles = {
739
+ small: {
740
+ padding: spacing.sm,
741
+ titleSize: fontSize.xs,
742
+ valueSize: fontSize.md,
743
+ iconSize: spacing.xl
52
744
  },
53
- components: {
54
- Button: {
55
- colorPrimary: colors.brand.primary,
56
- colorPrimaryHover: colors.brand.primaryHover,
57
- colorPrimaryActive: colors.brand.primaryActive
745
+ default: {
746
+ minHeight: 120,
747
+ padding: spacing.md,
748
+ titleSize: fontSize.sm,
749
+ valueSize: fontSize.xl,
750
+ iconSize: 40
751
+ },
752
+ large: {
753
+ minHeight: 160,
754
+ padding: spacing.md,
755
+ titleSize: fontSize.md,
756
+ valueSize: fontSize.xxl,
757
+ iconSize: spacing.xxl
758
+ }
759
+ };
760
+ var MetricCard = React.forwardRef(
761
+ ({
762
+ title,
763
+ value,
764
+ description,
765
+ variant = "outlined",
766
+ layout = "vertical",
767
+ size = "default",
768
+ status = "primary",
769
+ color,
770
+ textColor,
771
+ icon,
772
+ prefix,
773
+ suffix,
774
+ precision,
775
+ formatter,
776
+ groupSeparator = ",",
777
+ decimalSeparator = ".",
778
+ loading = false,
779
+ className,
780
+ style
781
+ }, ref) => {
782
+ const isMissingValue = value == null || typeof value === "number" && !Number.isFinite(value);
783
+ const displayValue = isMissingValue ? "\u2014" : value;
784
+ const accent = color ?? statusColors[status];
785
+ const dimensions = sizeStyles[size];
786
+ const isSolid = variant === "solid";
787
+ const isTinted = variant === "tinted";
788
+ const lightPreset = color == null && ["success", "warning", "error"].includes(status);
789
+ const foreground = textColor ?? (isSolid && !lightPreset ? colors.neutral.white : colors.neutral.gray800);
790
+ const tintedBackground = `color-mix(in srgb, ${accent} 12%, ${colors.neutral.white})`;
791
+ const cardBackground = isSolid ? accent : isTinted ? tintedBackground : colors.neutral.white;
792
+ const cardBorder = isTinted ? "none" : `1px solid ${variant === "outlined" ? colors.neutral.gray200 : accent}`;
793
+ const iconBadge = icon ? /* @__PURE__ */ jsx(
794
+ "span",
795
+ {
796
+ "aria-hidden": "true",
797
+ style: {
798
+ display: "inline-flex",
799
+ alignItems: "center",
800
+ justifyContent: "center",
801
+ flexShrink: 0,
802
+ width: dimensions.iconSize,
803
+ height: dimensions.iconSize,
804
+ borderRadius: "50%",
805
+ fontSize: fontSize.lg,
806
+ color: foreground,
807
+ background: isSolid ? "rgba(255, 255, 255, 0.18)" : isTinted ? `color-mix(in srgb, ${accent} 22%, ${colors.neutral.white})` : colors.brand.primaryLight
808
+ },
809
+ children: icon
810
+ }
811
+ ) : null;
812
+ const hasDescription = description != null && description !== false && description !== "";
813
+ return /* @__PURE__ */ jsx(
814
+ Card,
815
+ {
816
+ ref,
817
+ className,
818
+ loading,
819
+ loadingRows: 2,
820
+ "aria-busy": loading,
821
+ styles: {
822
+ body: {
823
+ boxSizing: "border-box",
824
+ padding: dimensions.padding
825
+ }
826
+ },
827
+ style: {
828
+ background: cardBackground,
829
+ border: cardBorder,
830
+ color: foreground,
831
+ minHeight: dimensions.minHeight,
832
+ minWidth: 0,
833
+ ...style
834
+ },
835
+ children: /* @__PURE__ */ jsxs(
836
+ "div",
837
+ {
838
+ style: {
839
+ display: "flex",
840
+ flexDirection: layout === "horizontal" ? "row" : "column",
841
+ gap: spacing.sm,
842
+ minWidth: 0
843
+ },
844
+ children: [
845
+ layout === "horizontal" ? iconBadge : null,
846
+ /* @__PURE__ */ jsxs(
847
+ "div",
848
+ {
849
+ style: {
850
+ display: "flex",
851
+ flexDirection: "column",
852
+ flex: 1,
853
+ minWidth: 0
854
+ },
855
+ children: [
856
+ /* @__PURE__ */ jsx(
857
+ "div",
858
+ {
859
+ style: {
860
+ color: foreground,
861
+ fontSize: dimensions.titleSize,
862
+ fontWeight: 500,
863
+ lineHeight: 1.4,
864
+ overflowWrap: "anywhere"
865
+ },
866
+ children: title
867
+ }
868
+ ),
869
+ /* @__PURE__ */ jsxs(
870
+ "div",
871
+ {
872
+ style: {
873
+ display: "flex",
874
+ alignItems: "flex-end",
875
+ justifyContent: "space-between",
876
+ gap: spacing.sm,
877
+ paddingTop: spacing.xs,
878
+ flexWrap: "wrap"
879
+ },
880
+ children: [
881
+ /* @__PURE__ */ jsx(
882
+ Statistic,
883
+ {
884
+ value: displayValue,
885
+ prefix: isMissingValue ? void 0 : prefix,
886
+ suffix: isMissingValue ? void 0 : suffix,
887
+ precision,
888
+ formatter: isMissingValue ? void 0 : formatter,
889
+ groupSeparator,
890
+ decimalSeparator,
891
+ style: { flex: 1, minWidth: 0 },
892
+ valueStyle: {
893
+ color: foreground,
894
+ fontSize: dimensions.valueSize,
895
+ fontWeight: 600,
896
+ lineHeight: 1.5,
897
+ overflowWrap: "anywhere"
898
+ }
899
+ }
900
+ ),
901
+ layout === "vertical" ? iconBadge : null
902
+ ]
903
+ }
904
+ ),
905
+ hasDescription ? /* @__PURE__ */ jsx(
906
+ "div",
907
+ {
908
+ style: {
909
+ color: foreground,
910
+ marginTop: spacing.xs,
911
+ overflowWrap: "anywhere"
912
+ },
913
+ children: description
914
+ }
915
+ ) : null
916
+ ]
917
+ }
918
+ )
919
+ ]
920
+ }
921
+ )
922
+ }
923
+ );
924
+ }
925
+ );
926
+ MetricCard.displayName = "MetricCard";
927
+ var defaultPalette = [
928
+ colors.brand.primary,
929
+ colors.brand.accent,
930
+ colors.semantic.success,
931
+ colors.semantic.warning,
932
+ colors.semantic.error,
933
+ colors.neutral.gray500
934
+ ];
935
+ var defaultFormatter = (value) => value.toLocaleString("en-IN");
936
+ var truncateLabel = (label, max) => label.length > max ? `${label.slice(0, max - 1)}\u2026` : label;
937
+ function isGroupedData(data) {
938
+ return data.length > 0 && "values" in data[0];
939
+ }
940
+ function ChartLegend({ items }) {
941
+ return /* @__PURE__ */ jsx(
942
+ "div",
943
+ {
944
+ "aria-label": "Chart legend",
945
+ style: { display: "flex", flexWrap: "wrap", gap: spacing.md, marginBottom: spacing.xs },
946
+ children: items.map(({ label, color }) => /* @__PURE__ */ jsxs(
947
+ "span",
948
+ {
949
+ style: { alignItems: "center", color: colors.neutral.gray700, display: "inline-flex", fontSize: fontSize.xs, gap: spacing.xs },
950
+ children: [
951
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", style: { background: color, borderRadius: "50%", height: 8, width: 8 } }),
952
+ label
953
+ ]
954
+ },
955
+ label
956
+ ))
957
+ }
958
+ );
959
+ }
960
+ function ChartGrid({
961
+ padding,
962
+ width,
963
+ chartHeight,
964
+ maxValue,
965
+ formatValue
966
+ }) {
967
+ return /* @__PURE__ */ jsx(Fragment, { children: [0, 0.5, 1].map((ratio) => {
968
+ const y = padding.top + chartHeight * (1 - ratio);
969
+ return /* @__PURE__ */ jsxs("g", { children: [
970
+ /* @__PURE__ */ jsx("line", { x1: padding.left, x2: width - padding.right, y1: y, y2: y, stroke: colors.neutral.gray200 }),
971
+ /* @__PURE__ */ jsx("text", { x: padding.left - 8, y: y + 4, textAnchor: "end", fill: colors.neutral.gray500, fontSize: 11, children: formatValue(Math.round(maxValue * ratio)) })
972
+ ] }, ratio);
973
+ }) });
974
+ }
975
+ function ChartEmptyState({ height }) {
976
+ return /* @__PURE__ */ jsx(
977
+ "div",
978
+ {
979
+ style: { alignItems: "center", color: colors.neutral.gray500, display: "flex", height, justifyContent: "center" },
980
+ children: "No data available"
58
981
  }
982
+ );
983
+ }
984
+ function ColumnChart({
985
+ data,
986
+ mode = "basic",
987
+ seriesColors = defaultPalette,
988
+ showLegend = true,
989
+ height = 280,
990
+ color = colors.brand.primary,
991
+ ariaLabel = "Column chart",
992
+ formatValue = defaultFormatter,
993
+ style
994
+ }) {
995
+ if (!data.length) return /* @__PURE__ */ jsx(ChartEmptyState, { height });
996
+ const grouped = isGroupedData(data);
997
+ const activeMode = grouped && mode === "basic" ? "stacked" : mode;
998
+ const W = 640;
999
+ const pad = { top: 28, right: 20, bottom: 48, left: 48 };
1000
+ const cH = height - pad.top - pad.bottom;
1001
+ const cW = W - pad.left - pad.right;
1002
+ let maxVal = 1;
1003
+ let legendKeys = [];
1004
+ let barContent;
1005
+ if (activeMode === "stacked" && grouped) {
1006
+ const gd = data;
1007
+ legendKeys = [...new Set(gd.flatMap((d) => Object.keys(d.values)))];
1008
+ const totals = gd.map((d) => Object.values(d.values).reduce((s, v) => s + v, 0));
1009
+ maxVal = Math.max(...totals, 1);
1010
+ const slotW = cW / gd.length;
1011
+ const bw = Math.min(56, slotW * 0.58);
1012
+ barContent = gd.map((datum, i) => {
1013
+ const x = pad.left + slotW * i + (slotW - bw) / 2;
1014
+ let curY = pad.top + cH;
1015
+ return /* @__PURE__ */ jsxs("g", { children: [
1016
+ /* @__PURE__ */ jsx("title", { children: `${datum.label}: ${formatValue(totals[i])}` }),
1017
+ legendKeys.map((series, sIdx) => {
1018
+ const val = datum.values[series] ?? 0;
1019
+ if (val <= 0) return null;
1020
+ const h = val / maxVal * cH;
1021
+ curY -= h;
1022
+ return /* @__PURE__ */ jsx("rect", { x, y: curY, width: bw, height: h, fill: seriesColors[sIdx % seriesColors.length], children: /* @__PURE__ */ jsx("title", { children: `${datum.label} - ${series}: ${formatValue(val)}` }) }, series);
1023
+ }),
1024
+ /* @__PURE__ */ jsx("text", { x: x + bw / 2, y: curY - 8, textAnchor: "middle", fill: colors.neutral.gray700, fontSize: 11, children: formatValue(totals[i]) }),
1025
+ /* @__PURE__ */ jsx("text", { x: x + bw / 2, y: height - 18, textAnchor: "middle", fill: colors.neutral.gray700, fontSize: 11, children: truncateLabel(datum.label, 16) })
1026
+ ] }, datum.id ?? datum.label);
1027
+ });
1028
+ } else if (activeMode === "grouped" && grouped) {
1029
+ const gd = data;
1030
+ legendKeys = [...new Set(gd.flatMap((d) => Object.keys(d.values)))];
1031
+ maxVal = Math.max(...gd.flatMap((d) => Object.values(d.values)), 1);
1032
+ const slotW = cW / gd.length;
1033
+ const n = legendKeys.length;
1034
+ const gap = 2;
1035
+ const subW = Math.min(28, (slotW * 0.75 - (n - 1) * gap) / Math.max(n, 1));
1036
+ const grpW = n * subW + (n - 1) * gap;
1037
+ barContent = gd.map((datum, i) => {
1038
+ const gx = pad.left + slotW * i + (slotW - grpW) / 2;
1039
+ return /* @__PURE__ */ jsxs("g", { children: [
1040
+ legendKeys.map((series, sIdx) => {
1041
+ const val = datum.values[series] ?? 0;
1042
+ const h = Math.max(0, val / maxVal * cH);
1043
+ return /* @__PURE__ */ jsxs("g", { children: [
1044
+ /* @__PURE__ */ jsx("title", { children: `${datum.label} - ${series}: ${formatValue(val)}` }),
1045
+ /* @__PURE__ */ jsx("rect", { x: gx + sIdx * (subW + gap), y: pad.top + cH - h, width: subW, height: h, rx: 3, fill: seriesColors[sIdx % seriesColors.length] })
1046
+ ] }, series);
1047
+ }),
1048
+ /* @__PURE__ */ jsx("text", { x: pad.left + slotW * i + slotW / 2, y: height - 18, textAnchor: "middle", fill: colors.neutral.gray700, fontSize: 11, children: truncateLabel(datum.label, 16) })
1049
+ ] }, datum.id ?? datum.label);
1050
+ });
1051
+ } else {
1052
+ const sd = data;
1053
+ maxVal = Math.max(...sd.map((d) => d.value), 1);
1054
+ const slotW = cW / sd.length;
1055
+ const bw = Math.min(56, slotW * 0.58);
1056
+ barContent = sd.map((datum, i) => {
1057
+ const h = Math.max(0, datum.value / maxVal * cH);
1058
+ const x = pad.left + slotW * i + (slotW - bw) / 2;
1059
+ const y = pad.top + cH - h;
1060
+ return /* @__PURE__ */ jsxs("g", { children: [
1061
+ /* @__PURE__ */ jsx("title", { children: `${datum.label}: ${formatValue(datum.value)}` }),
1062
+ /* @__PURE__ */ jsx("rect", { x, y, width: bw, height: h, rx: 4, fill: datum.color ?? color }),
1063
+ /* @__PURE__ */ jsx("text", { x: x + bw / 2, y: y - 8, textAnchor: "middle", fill: colors.neutral.gray700, fontSize: 11, children: formatValue(datum.value) }),
1064
+ /* @__PURE__ */ jsx("text", { x: x + bw / 2, y: height - 18, textAnchor: "middle", fill: colors.neutral.gray700, fontSize: 11, children: truncateLabel(datum.label, 16) })
1065
+ ] }, datum.id ?? datum.label);
1066
+ });
1067
+ }
1068
+ const hasLegend = showLegend && legendKeys.length > 1;
1069
+ const legendH = hasLegend ? 28 : 0;
1070
+ const svgH = height - legendH;
1071
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", height, justifyContent: "flex-end", ...style }, children: [
1072
+ hasLegend && /* @__PURE__ */ jsx(ChartLegend, { items: legendKeys.map((k, i) => ({ label: k, color: seriesColors[i % seriesColors.length] })) }),
1073
+ /* @__PURE__ */ jsxs("svg", { "aria-label": ariaLabel, role: "img", viewBox: `0 0 ${W} ${height}`, style: { display: "block", height: svgH, maxWidth: "100%", width: "100%" }, children: [
1074
+ /* @__PURE__ */ jsx("title", { children: ariaLabel }),
1075
+ /* @__PURE__ */ jsx(ChartGrid, { padding: pad, width: W, chartHeight: cH, maxValue: maxVal, formatValue }),
1076
+ barContent
1077
+ ] })
1078
+ ] });
1079
+ }
1080
+ var defaultPalette2 = [
1081
+ colors.brand.primary,
1082
+ colors.brand.accent,
1083
+ colors.semantic.success,
1084
+ colors.semantic.warning,
1085
+ colors.semantic.error,
1086
+ colors.neutral.gray500
1087
+ ];
1088
+ function BarChart({
1089
+ data,
1090
+ mode = "basic",
1091
+ seriesColors = defaultPalette2,
1092
+ showLegend = true,
1093
+ height = 280,
1094
+ color = colors.brand.primary,
1095
+ ariaLabel = "Bar chart",
1096
+ formatValue = defaultFormatter,
1097
+ style
1098
+ }) {
1099
+ if (!data.length) return /* @__PURE__ */ jsx(ChartEmptyState, { height });
1100
+ const grouped = isGroupedData(data);
1101
+ const activeMode = grouped && mode === "basic" ? "stacked" : mode;
1102
+ const W = 640;
1103
+ const pad = { top: 18, right: 70, bottom: 16, left: 145 };
1104
+ const cH = height - pad.top - pad.bottom;
1105
+ const cW = W - pad.left - pad.right;
1106
+ let maxVal = 1;
1107
+ let legendKeys = [];
1108
+ let rowContent;
1109
+ if (activeMode === "stacked" && grouped) {
1110
+ const gd = data;
1111
+ legendKeys = [...new Set(gd.flatMap((d) => Object.keys(d.values)))];
1112
+ const totals = gd.map((d) => Object.values(d.values).reduce((s, v) => s + v, 0));
1113
+ const maxVal2 = Math.max(...totals, 1);
1114
+ const rowH = cH / gd.length;
1115
+ const bh = Math.min(28, rowH * 0.62);
1116
+ rowContent = gd.map((datum, i) => {
1117
+ const y = pad.top + i * rowH + (rowH - bh) / 2;
1118
+ let curX = pad.left;
1119
+ return /* @__PURE__ */ jsxs("g", { children: [
1120
+ /* @__PURE__ */ jsx("title", { children: `${datum.label}: ${formatValue(totals[i])}` }),
1121
+ /* @__PURE__ */ jsx("text", { x: pad.left - 10, y: y + bh / 2 + 4, textAnchor: "end", fill: colors.neutral.gray700, fontSize: 11, children: truncateLabel(datum.label, 22) }),
1122
+ /* @__PURE__ */ jsx("rect", { x: pad.left, y, width: cW, height: bh, fill: colors.neutral.gray200, rx: 4 }),
1123
+ legendKeys.map((series, sIdx) => {
1124
+ const val = datum.values[series] ?? 0;
1125
+ if (val <= 0) return null;
1126
+ const w = val / maxVal2 * cW;
1127
+ const segX = curX;
1128
+ curX += w;
1129
+ return /* @__PURE__ */ jsx("rect", { x: segX, y, width: w, height: bh, fill: seriesColors[sIdx % seriesColors.length], children: /* @__PURE__ */ jsx("title", { children: `${datum.label} - ${series}: ${formatValue(val)}` }) }, series);
1130
+ }),
1131
+ /* @__PURE__ */ jsx("text", { x: curX + 8, y: y + bh / 2 + 4, fill: colors.neutral.gray700, fontSize: 11, children: formatValue(totals[i]) })
1132
+ ] }, datum.id ?? datum.label);
1133
+ });
1134
+ } else if (activeMode === "grouped" && grouped) {
1135
+ const gd = data;
1136
+ legendKeys = [...new Set(gd.flatMap((d) => Object.keys(d.values)))];
1137
+ const maxVal2 = Math.max(...gd.flatMap((d) => Object.values(d.values)), 1);
1138
+ const rowH = cH / gd.length;
1139
+ const n = legendKeys.length;
1140
+ const gap = 2;
1141
+ const subH = Math.min(18, (rowH * 0.75 - (n - 1) * gap) / Math.max(n, 1));
1142
+ const grpH = n * subH + (n - 1) * gap;
1143
+ rowContent = gd.map((datum, i) => {
1144
+ const gy = pad.top + i * rowH + (rowH - grpH) / 2;
1145
+ return /* @__PURE__ */ jsxs("g", { children: [
1146
+ /* @__PURE__ */ jsx("text", { x: pad.left - 10, y: gy + grpH / 2 + 4, textAnchor: "end", fill: colors.neutral.gray700, fontSize: 11, children: truncateLabel(datum.label, 22) }),
1147
+ legendKeys.map((series, sIdx) => {
1148
+ const val = datum.values[series] ?? 0;
1149
+ const bw = val / maxVal2 * cW;
1150
+ const sy = gy + sIdx * (subH + gap);
1151
+ return /* @__PURE__ */ jsxs("g", { children: [
1152
+ /* @__PURE__ */ jsx("title", { children: `${datum.label} - ${series}: ${formatValue(val)}` }),
1153
+ /* @__PURE__ */ jsx("rect", { x: pad.left, y: sy, width: cW, height: subH, fill: colors.neutral.gray200, rx: 2 }),
1154
+ /* @__PURE__ */ jsx("rect", { x: pad.left, y: sy, width: bw, height: subH, fill: seriesColors[sIdx % seriesColors.length], rx: 2 }),
1155
+ /* @__PURE__ */ jsx("text", { x: pad.left + bw + 6, y: sy + subH / 2 + 4, fill: colors.neutral.gray700, fontSize: 10, children: formatValue(val) })
1156
+ ] }, series);
1157
+ })
1158
+ ] }, datum.id ?? datum.label);
1159
+ });
1160
+ } else {
1161
+ const sd = data;
1162
+ maxVal = Math.max(...sd.map((d) => d.value), 1);
1163
+ const rowH = cH / sd.length;
1164
+ const bh = Math.min(28, rowH * 0.62);
1165
+ rowContent = sd.map((datum, i) => {
1166
+ const y = pad.top + i * rowH + (rowH - bh) / 2;
1167
+ const bw = datum.value / maxVal * cW;
1168
+ return /* @__PURE__ */ jsxs("g", { children: [
1169
+ /* @__PURE__ */ jsx("title", { children: `${datum.label}: ${formatValue(datum.value)}` }),
1170
+ /* @__PURE__ */ jsx("text", { x: pad.left - 10, y: y + bh / 2 + 4, textAnchor: "end", fill: colors.neutral.gray700, fontSize: 11, children: truncateLabel(datum.label, 22) }),
1171
+ /* @__PURE__ */ jsx("rect", { x: pad.left, y, width: cW, height: bh, fill: colors.neutral.gray200, rx: 4 }),
1172
+ /* @__PURE__ */ jsx("rect", { x: pad.left, y, width: bw, height: bh, fill: datum.color ?? color, rx: 4 }),
1173
+ /* @__PURE__ */ jsx("text", { x: pad.left + bw + 8, y: y + bh / 2 + 4, fill: colors.neutral.gray700, fontSize: 11, children: formatValue(datum.value) })
1174
+ ] }, datum.id ?? datum.label);
1175
+ });
59
1176
  }
1177
+ const hasLegend = showLegend && legendKeys.length > 1;
1178
+ const legendH = hasLegend ? 28 : 0;
1179
+ const svgH = height - legendH;
1180
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", height, justifyContent: "flex-end", ...style }, children: [
1181
+ hasLegend && /* @__PURE__ */ jsx("div", { style: { paddingLeft: pad.left }, children: /* @__PURE__ */ jsx(ChartLegend, { items: legendKeys.map((k, i) => ({ label: k, color: seriesColors[i % seriesColors.length] })) }) }),
1182
+ /* @__PURE__ */ jsxs("svg", { "aria-label": ariaLabel, role: "img", viewBox: `0 0 ${W} ${height}`, style: { display: "block", height: svgH, maxWidth: "100%", width: "100%" }, children: [
1183
+ /* @__PURE__ */ jsx("title", { children: ariaLabel }),
1184
+ rowContent
1185
+ ] })
1186
+ ] });
1187
+ }
1188
+ var defaultPalette3 = [
1189
+ colors.brand.primary,
1190
+ colors.brand.accent,
1191
+ colors.semantic.success,
1192
+ colors.semantic.warning,
1193
+ colors.semantic.error,
1194
+ colors.neutral.gray500
1195
+ ];
1196
+ function DonutChart({
1197
+ data,
1198
+ height = 280,
1199
+ centerLabel = "Total",
1200
+ ariaLabel = "Donut chart",
1201
+ showLegend = true,
1202
+ formatValue = defaultFormatter,
1203
+ style
1204
+ }) {
1205
+ const usableData = data.filter(({ value }) => value > 0);
1206
+ const total = usableData.reduce((sum, { value }) => sum + value, 0);
1207
+ if (!total) return /* @__PURE__ */ jsx(ChartEmptyState, { height });
1208
+ const radius = 76;
1209
+ const circumference = 2 * Math.PI * radius;
1210
+ let consumed = 0;
1211
+ return /* @__PURE__ */ jsxs("div", { style: { alignItems: "center", display: "flex", flexWrap: "wrap", gap: spacing.lg, justifyContent: "center", height, minHeight: height, ...style }, children: [
1212
+ /* @__PURE__ */ jsxs("svg", { "aria-label": ariaLabel, role: "img", viewBox: "0 0 220 220", style: { height: Math.min(height, 220), width: Math.min(height, 220) }, children: [
1213
+ /* @__PURE__ */ jsx("title", { children: ariaLabel }),
1214
+ /* @__PURE__ */ jsx("circle", { cx: "110", cy: "110", fill: "none", r: radius, stroke: colors.neutral.gray200, strokeWidth: "30" }),
1215
+ usableData.map((datum, index) => {
1216
+ const segment = datum.value / total * circumference;
1217
+ const offset = -consumed;
1218
+ consumed += segment;
1219
+ return /* @__PURE__ */ jsx(
1220
+ "circle",
1221
+ {
1222
+ cx: "110",
1223
+ cy: "110",
1224
+ fill: "none",
1225
+ r: radius,
1226
+ stroke: datum.color ?? defaultPalette3[index % defaultPalette3.length],
1227
+ strokeDasharray: `${segment} ${circumference - segment}`,
1228
+ strokeDashoffset: offset,
1229
+ strokeWidth: "30",
1230
+ transform: "rotate(-90 110 110)",
1231
+ children: /* @__PURE__ */ jsx("title", { children: `${datum.label}: ${formatValue(datum.value)}` })
1232
+ },
1233
+ datum.id ?? datum.label
1234
+ );
1235
+ }),
1236
+ /* @__PURE__ */ jsx("text", { x: "110", y: "102", textAnchor: "middle", fill: colors.neutral.gray500, fontSize: "13", children: centerLabel }),
1237
+ /* @__PURE__ */ jsx("text", { x: "110", y: "128", textAnchor: "middle", fill: colors.neutral.gray700, fontSize: "22", fontWeight: "600", children: formatValue(total) })
1238
+ ] }),
1239
+ showLegend ? /* @__PURE__ */ jsx("div", { "aria-label": "Chart legend", style: { display: "grid", gap: spacing.xs }, children: usableData.map((datum, index) => /* @__PURE__ */ jsxs("div", { style: { alignItems: "center", display: "flex", gap: spacing.xs }, children: [
1240
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", style: { background: datum.color ?? defaultPalette3[index % defaultPalette3.length], borderRadius: "50%", height: 10, width: 10 } }),
1241
+ /* @__PURE__ */ jsxs("span", { style: { color: colors.neutral.gray700, fontSize: fontSize.xs }, children: [
1242
+ datum.label,
1243
+ ": ",
1244
+ formatValue(datum.value)
1245
+ ] })
1246
+ ] }, datum.id ?? datum.label)) }) : null
1247
+ ] });
1248
+ }
1249
+ var defaultPalette4 = [
1250
+ colors.brand.primary,
1251
+ colors.brand.accent,
1252
+ colors.semantic.success,
1253
+ colors.semantic.warning,
1254
+ colors.semantic.error,
1255
+ colors.neutral.gray500
1256
+ ];
1257
+ function createSmoothSplinePath(points) {
1258
+ if (points.length === 0) return "";
1259
+ if (points.length === 1) return `M ${points[0].x} ${points[0].y}`;
1260
+ if (points.length === 2)
1261
+ return `M ${points[0].x} ${points[0].y} L ${points[1].x} ${points[1].y}`;
1262
+ let path = `M ${points[0].x} ${points[0].y}`;
1263
+ const tension = 0.2;
1264
+ for (let i = 0; i < points.length - 1; i++) {
1265
+ const p0 = points[i > 0 ? i - 1 : i];
1266
+ const p1 = points[i];
1267
+ const p2 = points[i + 1];
1268
+ const p3 = points[i + 2 < points.length ? i + 2 : i + 1];
1269
+ const cp1x = p1.x + (p2.x - p0.x) * tension;
1270
+ const cp1y = p1.y + (p2.y - p0.y) * tension;
1271
+ const cp2x = p2.x - (p3.x - p1.x) * tension;
1272
+ const cp2y = p2.y - (p3.y - p1.y) * tension;
1273
+ path += ` C ${cp1x.toFixed(2)} ${cp1y.toFixed(2)}, ${cp2x.toFixed(2)} ${cp2y.toFixed(2)}, ${p2.x.toFixed(2)} ${p2.y.toFixed(2)}`;
1274
+ }
1275
+ return path;
1276
+ }
1277
+ function TimeSeriesChart({
1278
+ data,
1279
+ type = "line",
1280
+ smooth = false,
1281
+ height = 280,
1282
+ colors: seriesColors = defaultPalette4,
1283
+ ariaLabel = "Time series chart",
1284
+ showLegend = true,
1285
+ formatValue = defaultFormatter,
1286
+ formatDate = (date) => date,
1287
+ threshold,
1288
+ thresholdLabel,
1289
+ style
1290
+ }) {
1291
+ if (!data.length) return /* @__PURE__ */ jsx(ChartEmptyState, { height });
1292
+ const W = 640;
1293
+ const pad = { top: 28, right: 20, bottom: 48, left: 48 };
1294
+ const cH = height - pad.top - pad.bottom;
1295
+ const cW = W - pad.left - pad.right;
1296
+ const maxVal = Math.max(...data.map(({ value }) => value), threshold ?? 0, 1);
1297
+ const dates = [...new Set(data.map(({ date }) => date))];
1298
+ const seriesGroups = [...new Map(data.map((d) => [d.series ?? "Value", true])).keys()].map((s) => ({
1299
+ series: s,
1300
+ data: data.filter((d) => (d.series ?? "Value") === s)
1301
+ }));
1302
+ const xFor = (date) => pad.left + (dates.length > 1 ? dates.indexOf(date) / (dates.length - 1) * cW : cW / 2);
1303
+ const yFor = (v) => pad.top + cH - v / maxVal * cH;
1304
+ const bottom = pad.top + cH;
1305
+ const dateIdxs = dates.length <= 6 ? dates.map((_, i) => i) : [0, Math.round((dates.length - 1) / 2), dates.length - 1];
1306
+ const hasLegend = showLegend && seriesGroups.length > 1;
1307
+ const legendH = hasLegend ? 28 : 0;
1308
+ const svgH = height - legendH;
1309
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", height, justifyContent: "flex-end", ...style }, children: [
1310
+ hasLegend && /* @__PURE__ */ jsx(ChartLegend, { items: seriesGroups.map(({ series: s }, i) => ({ label: s, color: seriesColors[i % seriesColors.length] })) }),
1311
+ /* @__PURE__ */ jsxs("svg", { "aria-label": ariaLabel, role: "img", viewBox: `0 0 ${W} ${height}`, style: { display: "block", height: svgH, maxWidth: "100%", width: "100%" }, children: [
1312
+ /* @__PURE__ */ jsx("title", { children: ariaLabel }),
1313
+ /* @__PURE__ */ jsx(ChartGrid, { padding: pad, width: W, chartHeight: cH, maxValue: maxVal, formatValue }),
1314
+ dateIdxs.map((i) => /* @__PURE__ */ jsx("text", { x: xFor(dates[i]), y: height - 18, textAnchor: "middle", fill: colors.neutral.gray700, fontSize: 11, children: formatDate(dates[i]) }, dates[i])),
1315
+ threshold != null && /* @__PURE__ */ jsxs("g", { children: [
1316
+ /* @__PURE__ */ jsx("line", { x1: pad.left, x2: W - pad.right, y1: yFor(threshold), y2: yFor(threshold), stroke: colors.semantic.error, strokeDasharray: "5 4" }),
1317
+ /* @__PURE__ */ jsx("text", { x: W - pad.right, y: yFor(threshold) - 6, textAnchor: "end", fill: colors.semantic.error, fontSize: 11, children: thresholdLabel ?? formatValue(threshold) })
1318
+ ] }),
1319
+ seriesGroups.map(({ series: sName, data: sd }, idx) => {
1320
+ const clr = seriesColors[idx % seriesColors.length];
1321
+ const coords = sd.map((d) => ({ x: xFor(d.date), y: yFor(d.value) }));
1322
+ const first = coords[0];
1323
+ const last = coords[coords.length - 1];
1324
+ let pathD;
1325
+ if (type === "step") {
1326
+ pathD = sd.reduce((p, d, i) => {
1327
+ const x = xFor(d.date), y = yFor(d.value);
1328
+ return i === 0 ? `M ${x} ${y}` : `${p} H ${x} V ${y}`;
1329
+ }, "");
1330
+ } else if (smooth) {
1331
+ pathD = createSmoothSplinePath(coords);
1332
+ } else {
1333
+ pathD = coords.map((c, i) => `${i === 0 ? "M" : "L"} ${c.x} ${c.y}`).join(" ");
1334
+ }
1335
+ return /* @__PURE__ */ jsxs("g", { children: [
1336
+ type === "area" && first && last && /* @__PURE__ */ jsx("path", { d: `${pathD} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`, fill: clr, fillOpacity: 0.14 }),
1337
+ /* @__PURE__ */ jsx("path", { d: pathD, fill: "none", stroke: clr, strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2.5" }),
1338
+ sd.map((d) => /* @__PURE__ */ jsx("circle", { cx: xFor(d.date), cy: yFor(d.value), fill: clr, r: "3", children: /* @__PURE__ */ jsx("title", { children: `${sName}, ${formatDate(d.date)}: ${formatValue(d.value)}` }) }, d.id ?? `${sName}-${d.date}`))
1339
+ ] }, sName);
1340
+ })
1341
+ ] })
1342
+ ] });
1343
+ }
1344
+ var LineChart = TimeSeriesChart;
1345
+ function BulletChart({
1346
+ data,
1347
+ height = 280,
1348
+ ariaLabel = "Bullet chart",
1349
+ formatValue = defaultFormatter,
1350
+ style
1351
+ }) {
1352
+ if (!data.length) return /* @__PURE__ */ jsx(ChartEmptyState, { height });
1353
+ return /* @__PURE__ */ jsx("div", { "aria-label": ariaLabel, role: "img", style: { display: "flex", flexDirection: "column", justifyContent: "center", gap: spacing.md, height, minHeight: height, ...style }, children: data.map((datum) => {
1354
+ const max = datum.max ?? Math.max(datum.value, datum.target, ...datum.ranges ?? [], 1);
1355
+ const ranges = datum.ranges ?? [max * 0.6, max * 0.8, max];
1356
+ return /* @__PURE__ */ jsxs("div", { children: [
1357
+ /* @__PURE__ */ jsxs("div", { style: { color: colors.neutral.gray700, display: "flex", fontSize: fontSize.xs, justifyContent: "space-between", marginBottom: spacing.xxs }, children: [
1358
+ /* @__PURE__ */ jsx("span", { children: datum.label }),
1359
+ /* @__PURE__ */ jsxs("span", { children: [
1360
+ formatValue(datum.value),
1361
+ " / ",
1362
+ formatValue(datum.target)
1363
+ ] })
1364
+ ] }),
1365
+ /* @__PURE__ */ jsxs("div", { style: { background: colors.neutral.gray200, height: 20, overflow: "hidden", position: "relative" }, children: [
1366
+ ranges.map((range, index) => /* @__PURE__ */ jsx("span", { style: { background: ["#F5F5F5", "#E8EBF2", "#D9DFF0"][Math.min(index, 2)], height: "100%", left: index === 0 ? 0 : `${ranges[index - 1] / max * 100}%`, position: "absolute", width: `${(range - (ranges[index - 1] ?? 0)) / max * 100}%` } }, range)),
1367
+ /* @__PURE__ */ jsx("span", { style: { background: colors.brand.primary, height: 8, left: 0, position: "absolute", top: 6, width: `${Math.min(100, datum.value / max * 100)}%` } }),
1368
+ /* @__PURE__ */ jsx("span", { "aria-label": `Target ${formatValue(datum.target)}`, style: { background: colors.neutral.gray700, height: "100%", left: `${Math.min(100, datum.target / max * 100)}%`, position: "absolute", top: 0, width: 2 } })
1369
+ ] })
1370
+ ] }, datum.id ?? datum.label);
1371
+ }) });
1372
+ }
1373
+ function HistogramChart({
1374
+ data,
1375
+ bins = "auto",
1376
+ height = 280,
1377
+ color,
1378
+ ariaLabel = "Histogram",
1379
+ style
1380
+ }) {
1381
+ if (!data.length) return /* @__PURE__ */ jsx(ChartEmptyState, { height });
1382
+ const min = Math.min(...data);
1383
+ const max = Math.max(...data);
1384
+ const binCount = typeof bins === "number" ? Math.max(1, Math.floor(bins)) : Math.max(1, Math.ceil(Math.sqrt(data.length)));
1385
+ const size = max === min ? 1 : (max - min) / binCount;
1386
+ const bucketData = Array.from({ length: binCount }, (_, index) => {
1387
+ const start = min + index * size;
1388
+ const end = index === binCount - 1 ? max : start + size;
1389
+ const count = data.filter(
1390
+ (value) => index === binCount - 1 ? value >= start && value <= end : value >= start && value < end
1391
+ ).length;
1392
+ return { label: `${start.toFixed(0)}\u2013${end.toFixed(0)}`, value: count };
1393
+ });
1394
+ return /* @__PURE__ */ jsx(
1395
+ ColumnChart,
1396
+ {
1397
+ ariaLabel,
1398
+ color,
1399
+ data: bucketData,
1400
+ formatValue: defaultFormatter,
1401
+ height,
1402
+ style
1403
+ }
1404
+ );
1405
+ }
1406
+ var Modal = ({ children, ...rest }) => {
1407
+ return /* @__PURE__ */ jsx(Modal$1, { ...rest, children });
60
1408
  };
61
- function ThemeProvider({ children }) {
62
- return /* @__PURE__ */ jsx(ConfigProvider, { theme, children });
1409
+ Modal.info = Modal$1.info;
1410
+ Modal.success = Modal$1.success;
1411
+ Modal.error = Modal$1.error;
1412
+ Modal.warning = Modal$1.warning;
1413
+ Modal.warn = Modal$1.warn;
1414
+ Modal.confirm = Modal$1.confirm;
1415
+ Modal.destroyAll = Modal$1.destroyAll;
1416
+ Modal.config = Modal$1.config;
1417
+ Modal.useModal = Modal$1.useModal;
1418
+ Modal.displayName = "Modal";
1419
+ var { Text, Title } = Typography;
1420
+ function getInitials(name) {
1421
+ const parts = name.trim().split(/\s+/).filter(Boolean);
1422
+ if (parts.length === 0) return "";
1423
+ if (parts.length === 1) return parts[0].charAt(0).toUpperCase();
1424
+ return `${parts[0].charAt(0)}${parts[parts.length - 1].charAt(0)}`.toUpperCase();
1425
+ }
1426
+ var Header = React.forwardRef(
1427
+ ({
1428
+ title,
1429
+ description,
1430
+ subtitle,
1431
+ breadcrumbs,
1432
+ actions,
1433
+ extra,
1434
+ leading,
1435
+ user,
1436
+ userMenu,
1437
+ onLogout,
1438
+ sticky = true,
1439
+ className,
1440
+ style
1441
+ }, ref) => {
1442
+ const descriptionText = description ?? subtitle;
1443
+ const hasActions = Boolean(actions?.length || extra || user);
1444
+ const defaultUserItems = [
1445
+ {
1446
+ key: "profile",
1447
+ label: user?.name,
1448
+ disabled: true
1449
+ },
1450
+ ...user?.role ? [{ key: "role", label: user.role, disabled: true }] : [],
1451
+ ...onLogout ? [{ type: "divider" }, { key: "logout", label: "Logout", danger: true }] : []
1452
+ ];
1453
+ const menu = user ? userMenu ?? {
1454
+ items: defaultUserItems,
1455
+ onClick: ({ key }) => {
1456
+ if (key === "logout") onLogout?.();
1457
+ }
1458
+ } : void 0;
1459
+ const breadcrumbItems = breadcrumbs?.map((item) => ({
1460
+ title: item.href || item.onClick ? /* @__PURE__ */ jsx(
1461
+ "a",
1462
+ {
1463
+ href: item.href ?? "#",
1464
+ onClick: (event) => {
1465
+ if (!item.href) event.preventDefault();
1466
+ item.onClick?.();
1467
+ },
1468
+ children: item.title
1469
+ }
1470
+ ) : item.title
1471
+ }));
1472
+ return /* @__PURE__ */ jsxs(
1473
+ "header",
1474
+ {
1475
+ ref,
1476
+ className: ["cms-ds-header", className].filter(Boolean).join(" "),
1477
+ style: {
1478
+ display: "flex",
1479
+ alignItems: "flex-start",
1480
+ justifyContent: "space-between",
1481
+ gap: spacing.lg,
1482
+ flexWrap: "nowrap",
1483
+ padding: `${spacing.lg}px ${spacing.xl}px`,
1484
+ background: "transparent",
1485
+ border: "none",
1486
+ borderBottom: `1px solid ${colors.neutral.gray200}`,
1487
+ boxShadow: "none",
1488
+ position: sticky ? "sticky" : void 0,
1489
+ top: sticky ? 0 : void 0,
1490
+ zIndex: sticky ? 20 : void 0,
1491
+ ...style
1492
+ },
1493
+ children: [
1494
+ /* @__PURE__ */ jsxs(
1495
+ "div",
1496
+ {
1497
+ style: {
1498
+ display: "flex",
1499
+ alignItems: "flex-start",
1500
+ gap: spacing.sm,
1501
+ flex: "1 1 auto",
1502
+ minWidth: 0
1503
+ },
1504
+ children: [
1505
+ leading ? /* @__PURE__ */ jsx(
1506
+ "div",
1507
+ {
1508
+ style: {
1509
+ flexShrink: 0,
1510
+ display: "flex",
1511
+ alignItems: "center",
1512
+ paddingTop: 2
1513
+ },
1514
+ children: leading
1515
+ }
1516
+ ) : null,
1517
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
1518
+ breadcrumbItems && breadcrumbItems.length > 0 ? /* @__PURE__ */ jsx(
1519
+ Breadcrumb,
1520
+ {
1521
+ items: breadcrumbItems,
1522
+ style: {
1523
+ fontSize: fontSize.xs,
1524
+ marginBottom: spacing.xs
1525
+ }
1526
+ }
1527
+ ) : null,
1528
+ title ? /* @__PURE__ */ jsx(
1529
+ Title,
1530
+ {
1531
+ level: 3,
1532
+ ellipsis: { tooltip: typeof title === "string" ? title : void 0 },
1533
+ style: {
1534
+ margin: 0,
1535
+ color: colors.neutral.gray900,
1536
+ fontSize: fontSize.xl,
1537
+ lineHeight: "32px",
1538
+ fontWeight: 600
1539
+ },
1540
+ children: title
1541
+ }
1542
+ ) : null,
1543
+ descriptionText ? /* @__PURE__ */ jsx(
1544
+ Text,
1545
+ {
1546
+ style: {
1547
+ display: "block",
1548
+ marginTop: spacing.xxs,
1549
+ color: colors.neutral.gray600,
1550
+ fontSize: fontSize.sm,
1551
+ lineHeight: "22px",
1552
+ maxWidth: 720
1553
+ },
1554
+ children: descriptionText
1555
+ }
1556
+ ) : null
1557
+ ] })
1558
+ ]
1559
+ }
1560
+ ),
1561
+ hasActions ? /* @__PURE__ */ jsxs(
1562
+ "div",
1563
+ {
1564
+ className: "cms-ds-header-actions",
1565
+ style: {
1566
+ display: "flex",
1567
+ alignItems: "center",
1568
+ justifyContent: "flex-end",
1569
+ gap: spacing.sm,
1570
+ flex: "0 0 auto",
1571
+ flexWrap: "wrap",
1572
+ paddingTop: title ? 2 : 0
1573
+ },
1574
+ children: [
1575
+ extra,
1576
+ actions?.map((action) => /* @__PURE__ */ jsx(
1577
+ Button,
1578
+ {
1579
+ variant: action.variant ?? "default",
1580
+ icon: action.icon,
1581
+ onClick: action.onClick,
1582
+ href: action.href,
1583
+ disabled: action.disabled,
1584
+ danger: action.danger,
1585
+ children: action.label
1586
+ },
1587
+ action.key
1588
+ )),
1589
+ user && menu ? /* @__PURE__ */ jsx(Dropdown, { menu, trigger: ["click"], placement: "bottomRight", children: /* @__PURE__ */ jsx(
1590
+ "button",
1591
+ {
1592
+ type: "button",
1593
+ "aria-label": user.name,
1594
+ style: {
1595
+ display: "flex",
1596
+ alignItems: "center",
1597
+ gap: spacing.xs,
1598
+ border: "none",
1599
+ background: "transparent",
1600
+ cursor: "pointer",
1601
+ padding: spacing.xxs,
1602
+ borderRadius: 999,
1603
+ flexShrink: 0
1604
+ },
1605
+ children: /* @__PURE__ */ jsx(
1606
+ Avatar,
1607
+ {
1608
+ size: 36,
1609
+ src: user.avatarSrc,
1610
+ alt: user.name,
1611
+ style: {
1612
+ backgroundColor: colors.brand.primary,
1613
+ color: colors.neutral.white,
1614
+ fontWeight: 600,
1615
+ fontSize: fontSize.xs
1616
+ },
1617
+ children: getInitials(user.name)
1618
+ }
1619
+ )
1620
+ }
1621
+ ) }) : null
1622
+ ]
1623
+ }
1624
+ ) : null,
1625
+ /* @__PURE__ */ jsx("style", { children: `@media (max-width: ${breakpoints.md - 1}px) {
1626
+ .cms-ds-header { flex-wrap: wrap; }
1627
+ .cms-ds-header-actions { width: 100%; justify-content: flex-start; }
1628
+ }` })
1629
+ ]
1630
+ }
1631
+ );
1632
+ }
1633
+ );
1634
+ Header.displayName = "Header";
1635
+
1636
+ // src/assets/indusActionLogo.ts
1637
+ var indusActionLogo = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAACWCAYAAABkW7XSAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEu2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4KPHg6eG1wbWV0YSB4bWxuczp4PSdhZG9iZTpuczptZXRhLyc+CjxyZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICB4bWxuczpBdHRyaWI9J2h0dHA6Ly9ucy5hdHRyaWJ1dGlvbi5jb20vYWRzLzEuMC8nPgogIDxBdHRyaWI6QWRzPgogICA8cmRmOlNlcT4KICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0nUmVzb3VyY2UnPgogICAgIDxBdHRyaWI6Q3JlYXRlZD4yMDI1LTA0LTIzPC9BdHRyaWI6Q3JlYXRlZD4KICAgICA8QXR0cmliOkV4dElkPjYwYThkMzVlLTM2NDMtNDg2Ni05NjYxLWY4NTI2N2ZjNGEyNTwvQXR0cmliOkV4dElkPgogICAgIDxBdHRyaWI6RmJJZD41MjUyNjU5MTQxNzk1ODA8L0F0dHJpYjpGYklkPgogICAgIDxBdHRyaWI6VG91Y2hUeXBlPjI8L0F0dHJpYjpUb3VjaFR5cGU+CiAgICA8L3JkZjpsaT4KICAgPC9yZGY6U2VxPgogIDwvQXR0cmliOkFkcz4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PScnCiAgeG1sbnM6ZGM9J2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJz4KICA8ZGM6dGl0bGU+CiAgIDxyZGY6QWx0PgogICAgPHJkZjpsaSB4bWw6bGFuZz0neC1kZWZhdWx0Jz5Mb2dvX1VwZGF0ZWQgLSAxPC9yZGY6bGk+CiAgIDwvcmRmOkFsdD4KICA8L2RjOnRpdGxlPgogPC9yZGY6RGVzY3JpcHRpb24+CgogPHJkZjpEZXNjcmlwdGlvbiBy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";
1638
+ function LogoutIcon({ size = 14, className, style }) {
1639
+ return /* @__PURE__ */ jsxs(
1640
+ "svg",
1641
+ {
1642
+ width: size,
1643
+ height: size,
1644
+ viewBox: "0 0 24 24",
1645
+ fill: "none",
1646
+ stroke: "currentColor",
1647
+ strokeWidth: "2",
1648
+ strokeLinecap: "round",
1649
+ strokeLinejoin: "round",
1650
+ "aria-hidden": "true",
1651
+ className,
1652
+ style,
1653
+ children: [
1654
+ /* @__PURE__ */ jsx("path", { d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" }),
1655
+ /* @__PURE__ */ jsx("polyline", { points: "16 17 21 12 16 7" }),
1656
+ /* @__PURE__ */ jsx("line", { x1: "21", y1: "12", x2: "9", y2: "12" })
1657
+ ]
1658
+ }
1659
+ );
1660
+ }
1661
+ function CollapseIcon({
1662
+ collapsed,
1663
+ size = 14,
1664
+ className,
1665
+ style
1666
+ }) {
1667
+ return /* @__PURE__ */ jsx(
1668
+ "svg",
1669
+ {
1670
+ width: size,
1671
+ height: size,
1672
+ viewBox: "0 0 24 24",
1673
+ fill: "none",
1674
+ stroke: "currentColor",
1675
+ strokeWidth: "2",
1676
+ strokeLinecap: "round",
1677
+ strokeLinejoin: "round",
1678
+ "aria-hidden": "true",
1679
+ className,
1680
+ style: {
1681
+ transform: collapsed ? "rotate(180deg)" : void 0,
1682
+ ...style
1683
+ },
1684
+ children: /* @__PURE__ */ jsx("polyline", { points: "15 18 9 12 15 6" })
1685
+ }
1686
+ );
1687
+ }
1688
+ function MenuIcon({ size = 18, className, style }) {
1689
+ return /* @__PURE__ */ jsxs(
1690
+ "svg",
1691
+ {
1692
+ width: size,
1693
+ height: size,
1694
+ viewBox: "0 0 24 24",
1695
+ fill: "none",
1696
+ stroke: "currentColor",
1697
+ strokeWidth: "2",
1698
+ strokeLinecap: "round",
1699
+ "aria-hidden": "true",
1700
+ className,
1701
+ style,
1702
+ children: [
1703
+ /* @__PURE__ */ jsx("line", { x1: "3", y1: "6", x2: "21", y2: "6" }),
1704
+ /* @__PURE__ */ jsx("line", { x1: "3", y1: "12", x2: "21", y2: "12" }),
1705
+ /* @__PURE__ */ jsx("line", { x1: "3", y1: "18", x2: "21", y2: "18" })
1706
+ ]
1707
+ }
1708
+ );
1709
+ }
1710
+ function CloseIcon({ size = 14, className, style }) {
1711
+ return /* @__PURE__ */ jsxs(
1712
+ "svg",
1713
+ {
1714
+ width: size,
1715
+ height: size,
1716
+ viewBox: "0 0 24 24",
1717
+ fill: "none",
1718
+ stroke: "currentColor",
1719
+ strokeWidth: "2",
1720
+ strokeLinecap: "round",
1721
+ "aria-hidden": "true",
1722
+ className,
1723
+ style,
1724
+ children: [
1725
+ /* @__PURE__ */ jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1726
+ /* @__PURE__ */ jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1727
+ ]
1728
+ }
1729
+ );
1730
+ }
1731
+ function DownloadIcon({ size = 14, className, style }) {
1732
+ return /* @__PURE__ */ jsx(
1733
+ "svg",
1734
+ {
1735
+ width: size,
1736
+ height: size,
1737
+ viewBox: "64 64 896 896",
1738
+ fill: "currentColor",
1739
+ "aria-hidden": "true",
1740
+ className,
1741
+ style,
1742
+ children: /* @__PURE__ */ jsx("path", { d: "M505.7 661a8 8 0 0012.6 0l112-122c4.6-5 1-13-5.7-13H544V224c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v302h-80.6c-6.7 0-10.4 8-5.7 13l112 122zM832 768H192c-17.7 0-32 14.3-32 32v48c0 4.4 3.6 8 8 8h688c4.4 0 8-3.6 8-8v-48c0-17.7-14.3-32-32-32z" })
1743
+ }
1744
+ );
63
1745
  }
1746
+ var { Sider } = Layout;
1747
+ var MOBILE_HEADER = spacing.xxl;
1748
+ var LOGO_HEIGHT = spacing.xxl + spacing.md;
1749
+ var LOGO_HEIGHT_COMPACT = spacing.lg;
1750
+ function useBelowBreakpoint(breakpoint) {
1751
+ const screens = Grid.useBreakpoint();
1752
+ if (!breakpoint) return false;
1753
+ if (Object.keys(screens).length === 0) {
1754
+ if (typeof window === "undefined") return false;
1755
+ return window.matchMedia(
1756
+ `(max-width: ${breakpoints[breakpoint] - 1}px)`
1757
+ ).matches;
1758
+ }
1759
+ return !screens[breakpoint];
1760
+ }
1761
+ function getInitials2(name) {
1762
+ const parts = name.trim().split(/\s+/).filter(Boolean);
1763
+ if (parts.length === 0) return "";
1764
+ if (parts.length === 1) return parts[0].charAt(0).toUpperCase();
1765
+ return `${parts[0].charAt(0)}${parts[parts.length - 1].charAt(0)}`.toUpperCase();
1766
+ }
1767
+ function SideNavFooter({
1768
+ user,
1769
+ collapsed = false,
1770
+ onLogout,
1771
+ logoutLabel = "Logout"
1772
+ }) {
1773
+ if (!user && !onLogout) return null;
1774
+ const initials = user ? getInitials2(user.name) : "";
1775
+ const logoutButton = /* @__PURE__ */ jsx(
1776
+ Button$1,
1777
+ {
1778
+ type: "text",
1779
+ size: "small",
1780
+ icon: /* @__PURE__ */ jsx(LogoutIcon, {}),
1781
+ "aria-label": logoutLabel,
1782
+ style: {
1783
+ color: colors.brand.primary,
1784
+ width: 28,
1785
+ height: 28,
1786
+ padding: spacing.none,
1787
+ flexShrink: 0
1788
+ }
1789
+ }
1790
+ );
1791
+ return /* @__PURE__ */ jsxs(
1792
+ "div",
1793
+ {
1794
+ style: {
1795
+ flexShrink: 0,
1796
+ padding: collapsed ? spacing.sm : spacing.md,
1797
+ display: "flex",
1798
+ flexDirection: collapsed ? "column" : "row",
1799
+ alignItems: "center",
1800
+ gap: spacing.xs,
1801
+ background: colors.neutral.white
1802
+ },
1803
+ children: [
1804
+ user ? /* @__PURE__ */ jsxs(
1805
+ "div",
1806
+ {
1807
+ style: {
1808
+ display: "flex",
1809
+ alignItems: "center",
1810
+ gap: spacing.xs,
1811
+ justifyContent: collapsed ? "center" : "flex-start",
1812
+ minWidth: 0,
1813
+ flex: 1
1814
+ },
1815
+ children: [
1816
+ /* @__PURE__ */ jsx(
1817
+ Avatar,
1818
+ {
1819
+ size: 28,
1820
+ src: user.avatarSrc,
1821
+ alt: user.name,
1822
+ style: {
1823
+ backgroundColor: colors.brand.primary,
1824
+ color: colors.neutral.white,
1825
+ fontWeight: 600,
1826
+ fontSize: fontSize.xs,
1827
+ flexShrink: 0
1828
+ },
1829
+ children: initials
1830
+ }
1831
+ ),
1832
+ collapsed ? null : /* @__PURE__ */ jsxs("div", { style: { minWidth: 0, flex: 1 }, children: [
1833
+ /* @__PURE__ */ jsx(
1834
+ Typography.Text,
1835
+ {
1836
+ strong: true,
1837
+ ellipsis: true,
1838
+ style: {
1839
+ display: "block",
1840
+ color: colors.neutral.gray800,
1841
+ fontSize: fontSize.sm,
1842
+ lineHeight: "18px"
1843
+ },
1844
+ children: user.name
1845
+ }
1846
+ ),
1847
+ user.role ? /* @__PURE__ */ jsx(
1848
+ Typography.Text,
1849
+ {
1850
+ ellipsis: true,
1851
+ style: {
1852
+ display: "block",
1853
+ color: colors.neutral.gray500,
1854
+ fontSize: fontSize.xxs,
1855
+ lineHeight: "16px"
1856
+ },
1857
+ children: user.role
1858
+ }
1859
+ ) : null
1860
+ ] })
1861
+ ]
1862
+ }
1863
+ ) : null,
1864
+ onLogout ? /* @__PURE__ */ jsx(
1865
+ Popconfirm,
1866
+ {
1867
+ title: logoutLabel,
1868
+ description: "Are you sure you want to logout?",
1869
+ okText: "Yes",
1870
+ cancelText: "No",
1871
+ onConfirm: onLogout,
1872
+ placement: "top",
1873
+ children: logoutButton
1874
+ }
1875
+ ) : null
1876
+ ]
1877
+ }
1878
+ );
1879
+ }
1880
+ function SideNavPanel({
1881
+ collapsed,
1882
+ items,
1883
+ menuStyle,
1884
+ menuTheme,
1885
+ menuRest,
1886
+ user,
1887
+ onLogout,
1888
+ logoutLabel,
1889
+ logoSrc,
1890
+ logoAlt,
1891
+ logo,
1892
+ headerButton
1893
+ }) {
1894
+ return /* @__PURE__ */ jsxs(
1895
+ "div",
1896
+ {
1897
+ style: {
1898
+ display: "flex",
1899
+ flexDirection: "column",
1900
+ height: "100%",
1901
+ minHeight: 0,
1902
+ background: colors.neutral.white,
1903
+ overflow: "hidden"
1904
+ },
1905
+ children: [
1906
+ /* @__PURE__ */ jsxs(
1907
+ "div",
1908
+ {
1909
+ style: {
1910
+ flexShrink: 0,
1911
+ background: colors.neutral.white,
1912
+ display: "flex",
1913
+ flexDirection: collapsed ? "column" : "row",
1914
+ alignItems: "center",
1915
+ gap: spacing.xs,
1916
+ padding: collapsed ? spacing.sm : spacing.md
1917
+ },
1918
+ children: [
1919
+ /* @__PURE__ */ jsx(
1920
+ "div",
1921
+ {
1922
+ style: {
1923
+ flex: 1,
1924
+ display: "flex",
1925
+ alignItems: "center",
1926
+ justifyContent: collapsed ? "center" : "flex-start",
1927
+ minWidth: 0
1928
+ },
1929
+ children: logo ?? /* @__PURE__ */ jsx(
1930
+ "img",
1931
+ {
1932
+ src: logoSrc,
1933
+ alt: logoAlt,
1934
+ style: {
1935
+ display: "block",
1936
+ width: "auto",
1937
+ maxWidth: "100%",
1938
+ height: collapsed ? LOGO_HEIGHT_COMPACT : LOGO_HEIGHT,
1939
+ maxHeight: collapsed ? LOGO_HEIGHT_COMPACT : LOGO_HEIGHT,
1940
+ objectFit: "contain",
1941
+ objectPosition: collapsed ? "center" : "left center"
1942
+ }
1943
+ }
1944
+ )
1945
+ }
1946
+ ),
1947
+ headerButton
1948
+ ]
1949
+ }
1950
+ ),
1951
+ /* @__PURE__ */ jsx(
1952
+ "div",
1953
+ {
1954
+ style: {
1955
+ flex: "1 1 0%",
1956
+ minHeight: 0,
1957
+ overflow: "auto"
1958
+ },
1959
+ children: /* @__PURE__ */ jsx(
1960
+ ConfigProvider,
1961
+ {
1962
+ theme: {
1963
+ components: {
1964
+ Menu: {
1965
+ itemMarginInline: spacing.xxs,
1966
+ itemPaddingInline: spacing.md
1967
+ }
1968
+ }
1969
+ },
1970
+ children: /* @__PURE__ */ jsx(
1971
+ Menu,
1972
+ {
1973
+ mode: "inline",
1974
+ inlineIndent: spacing.sm,
1975
+ theme: menuTheme,
1976
+ items,
1977
+ style: {
1978
+ borderInlineEnd: "none",
1979
+ paddingBlock: spacing.sm,
1980
+ ...menuStyle
1981
+ },
1982
+ ...menuRest
1983
+ }
1984
+ )
1985
+ }
1986
+ )
1987
+ }
1988
+ ),
1989
+ /* @__PURE__ */ jsx(
1990
+ SideNavFooter,
1991
+ {
1992
+ user,
1993
+ collapsed,
1994
+ onLogout,
1995
+ logoutLabel
1996
+ }
1997
+ )
1998
+ ]
1999
+ }
2000
+ );
2001
+ }
2002
+ function SideNav({
2003
+ items,
2004
+ menu,
2005
+ user,
2006
+ onLogout,
2007
+ logoutLabel,
2008
+ logoSrc = indusActionLogo,
2009
+ logoAlt = "Indus Action",
2010
+ logo,
2011
+ width = 256,
2012
+ theme: theme2 = "light",
2013
+ collapsed: collapsedProp,
2014
+ defaultCollapsed,
2015
+ onCollapse,
2016
+ collapsible,
2017
+ trigger,
2018
+ style,
2019
+ breakpoint = "md",
2020
+ showMobileBar = true,
2021
+ mobileTrigger,
2022
+ mobileOpen: mobileOpenProp,
2023
+ onMobileOpenChange,
2024
+ ...siderProps
2025
+ }) {
2026
+ const isMobile = useBelowBreakpoint(breakpoint);
2027
+ const [uncontrolledCollapsed, setUncontrolledCollapsed] = useState(
2028
+ defaultCollapsed ?? false
2029
+ );
2030
+ const [uncontrolledMobileOpen, setUncontrolledMobileOpen] = useState(false);
2031
+ const isCollapsedControlled = collapsedProp !== void 0;
2032
+ const collapsed = isCollapsedControlled ? collapsedProp : uncontrolledCollapsed;
2033
+ const isMobileOpenControlled = mobileOpenProp !== void 0;
2034
+ const mobileOpen = isMobileOpenControlled ? mobileOpenProp : uncontrolledMobileOpen;
2035
+ const setMobileOpen = (open) => {
2036
+ if (!isMobileOpenControlled) setUncontrolledMobileOpen(open);
2037
+ onMobileOpenChange?.(open);
2038
+ };
2039
+ const handleCollapse = (value, type) => {
2040
+ if (!isCollapsedControlled) setUncontrolledCollapsed(value);
2041
+ onCollapse?.(value, type);
2042
+ };
2043
+ useEffect(() => {
2044
+ if (!isMobile) setMobileOpen(false);
2045
+ }, [isMobile]);
2046
+ useEffect(() => {
2047
+ if (!isMobile || !showMobileBar) return;
2048
+ const previous = document.body.style.paddingTop;
2049
+ document.body.style.paddingTop = `${MOBILE_HEADER}px`;
2050
+ return () => {
2051
+ document.body.style.paddingTop = previous;
2052
+ };
2053
+ }, [isMobile, showMobileBar]);
2054
+ const {
2055
+ style: menuStyle,
2056
+ theme: menuTheme,
2057
+ onClick: menuOnClick,
2058
+ ...menuRest
2059
+ } = menu ?? {};
2060
+ const handleMenuClick = (info) => {
2061
+ menuOnClick?.(info);
2062
+ if (isMobile) setMobileOpen(false);
2063
+ };
2064
+ const useHeaderToggle = Boolean(collapsible) && trigger === void 0;
2065
+ const panelTheme = menuTheme ?? theme2;
2066
+ const iconButtonStyle = {
2067
+ color: colors.brand.primary,
2068
+ width: 28,
2069
+ height: 28,
2070
+ padding: spacing.none,
2071
+ flexShrink: 0
2072
+ };
2073
+ const panel = (headerButton, panelCollapsed) => /* @__PURE__ */ jsx(
2074
+ SideNavPanel,
2075
+ {
2076
+ collapsed: panelCollapsed,
2077
+ items,
2078
+ menuStyle,
2079
+ menuTheme: panelTheme,
2080
+ menuRest: { ...menuRest, onClick: handleMenuClick },
2081
+ user,
2082
+ onLogout,
2083
+ logoutLabel,
2084
+ logoSrc,
2085
+ logoAlt,
2086
+ logo,
2087
+ headerButton
2088
+ }
2089
+ );
2090
+ if (isMobile) {
2091
+ const hamburger = showMobileBar && mobileTrigger !== null ? mobileTrigger ?? /* @__PURE__ */ jsx(
2092
+ Button$1,
2093
+ {
2094
+ type: "text",
2095
+ "aria-label": "Open navigation",
2096
+ icon: /* @__PURE__ */ jsx(MenuIcon, {}),
2097
+ onClick: () => setMobileOpen(true),
2098
+ style: iconButtonStyle
2099
+ }
2100
+ ) : null;
2101
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
2102
+ showMobileBar ? createPortal(
2103
+ /* @__PURE__ */ jsxs(
2104
+ "header",
2105
+ {
2106
+ style: {
2107
+ position: "fixed",
2108
+ top: 0,
2109
+ left: 0,
2110
+ right: 0,
2111
+ height: MOBILE_HEADER,
2112
+ zIndex: 1e3,
2113
+ display: "flex",
2114
+ alignItems: "center",
2115
+ justifyContent: "space-between",
2116
+ gap: spacing.xs,
2117
+ paddingInline: spacing.md,
2118
+ background: colors.neutral.white
2119
+ },
2120
+ children: [
2121
+ /* @__PURE__ */ jsx(
2122
+ "div",
2123
+ {
2124
+ style: {
2125
+ display: "flex",
2126
+ alignItems: "center",
2127
+ minWidth: 0,
2128
+ flex: 1
2129
+ },
2130
+ children: logo ?? /* @__PURE__ */ jsx(
2131
+ "img",
2132
+ {
2133
+ src: logoSrc,
2134
+ alt: logoAlt,
2135
+ style: {
2136
+ display: "block",
2137
+ height: LOGO_HEIGHT_COMPACT,
2138
+ width: "auto",
2139
+ maxWidth: "100%",
2140
+ objectFit: "contain",
2141
+ objectPosition: "left center"
2142
+ }
2143
+ }
2144
+ )
2145
+ }
2146
+ ),
2147
+ hamburger
2148
+ ]
2149
+ }
2150
+ ),
2151
+ document.body
2152
+ ) : null,
2153
+ /* @__PURE__ */ jsx(
2154
+ Drawer,
2155
+ {
2156
+ placement: "left",
2157
+ open: mobileOpen,
2158
+ onClose: () => setMobileOpen(false),
2159
+ width,
2160
+ closable: false,
2161
+ zIndex: 1100,
2162
+ styles: {
2163
+ body: {
2164
+ padding: 0,
2165
+ height: "100%",
2166
+ display: "flex",
2167
+ flexDirection: "column"
2168
+ }
2169
+ },
2170
+ children: panel(
2171
+ /* @__PURE__ */ jsx(
2172
+ Button$1,
2173
+ {
2174
+ type: "text",
2175
+ size: "small",
2176
+ "aria-label": "Close navigation",
2177
+ icon: /* @__PURE__ */ jsx(CloseIcon, {}),
2178
+ onClick: () => setMobileOpen(false),
2179
+ style: iconButtonStyle
2180
+ }
2181
+ ),
2182
+ false
2183
+ )
2184
+ }
2185
+ )
2186
+ ] });
2187
+ }
2188
+ return /* @__PURE__ */ jsx(
2189
+ Sider,
2190
+ {
2191
+ theme: theme2,
2192
+ width,
2193
+ collapsed,
2194
+ collapsible,
2195
+ trigger: useHeaderToggle ? null : trigger,
2196
+ onCollapse: handleCollapse,
2197
+ style: {
2198
+ height: "100vh",
2199
+ position: "sticky",
2200
+ top: 0,
2201
+ overflow: "hidden",
2202
+ borderRight: `1px solid ${colors.neutral.gray200}`,
2203
+ background: colors.neutral.white,
2204
+ ...style
2205
+ },
2206
+ ...siderProps,
2207
+ children: panel(
2208
+ useHeaderToggle ? /* @__PURE__ */ jsx(
2209
+ Button$1,
2210
+ {
2211
+ type: "text",
2212
+ size: "small",
2213
+ "aria-label": collapsed ? "Expand navigation" : "Collapse navigation",
2214
+ icon: /* @__PURE__ */ jsx(CollapseIcon, { collapsed }),
2215
+ onClick: () => handleCollapse(!collapsed, "clickTrigger"),
2216
+ style: iconButtonStyle
2217
+ }
2218
+ ) : null,
2219
+ collapsed
2220
+ )
2221
+ }
2222
+ );
2223
+ }
2224
+ SideNav.displayName = "SideNav";
2225
+ function StatusPage({
2226
+ status,
2227
+ title,
2228
+ subTitle,
2229
+ actionLabel,
2230
+ onAction,
2231
+ actionHref,
2232
+ extra,
2233
+ fullPage = true,
2234
+ className,
2235
+ style
2236
+ }) {
2237
+ const action = extra ?? (actionLabel ? /* @__PURE__ */ jsx(
2238
+ Button,
2239
+ {
2240
+ variant: "primary",
2241
+ size: "large",
2242
+ ...actionHref ? { href: actionHref } : {},
2243
+ onClick: onAction,
2244
+ children: actionLabel
2245
+ }
2246
+ ) : void 0);
2247
+ const result = /* @__PURE__ */ jsx(
2248
+ Result,
2249
+ {
2250
+ status,
2251
+ title,
2252
+ subTitle,
2253
+ extra: action
2254
+ }
2255
+ );
2256
+ if (!fullPage) {
2257
+ return /* @__PURE__ */ jsx("div", { className, style, children: result });
2258
+ }
2259
+ return /* @__PURE__ */ jsx(
2260
+ "div",
2261
+ {
2262
+ className,
2263
+ style: {
2264
+ minHeight: "100vh",
2265
+ display: "flex",
2266
+ alignItems: "center",
2267
+ justifyContent: "center",
2268
+ background: colors.neutral.gray50,
2269
+ ...style
2270
+ },
2271
+ children: result
2272
+ }
2273
+ );
2274
+ }
2275
+ StatusPage.displayName = "StatusPage";
2276
+ function NotFoundPage({
2277
+ title = "404",
2278
+ subTitle = "Sorry, the page you visited does not exist.",
2279
+ actionLabel = "Home Page",
2280
+ actionHref,
2281
+ onAction,
2282
+ extra,
2283
+ ...rest
2284
+ }) {
2285
+ const href = actionHref ?? (onAction || extra ? void 0 : "/");
2286
+ return /* @__PURE__ */ jsx(
2287
+ StatusPage,
2288
+ {
2289
+ status: "404",
2290
+ title,
2291
+ subTitle,
2292
+ actionLabel,
2293
+ actionHref: href,
2294
+ onAction,
2295
+ extra,
2296
+ ...rest
2297
+ }
2298
+ );
2299
+ }
2300
+ NotFoundPage.displayName = "NotFoundPage";
2301
+ function UnauthorizedPage({
2302
+ title = "Unauthorized Access",
2303
+ subTitle = "You don't have permission to access this. Please ask the site admin for access.",
2304
+ actionLabel = "Back",
2305
+ actionHref,
2306
+ onAction,
2307
+ extra,
2308
+ ...rest
2309
+ }) {
2310
+ const href = actionHref ?? (onAction || extra ? void 0 : "/");
2311
+ return /* @__PURE__ */ jsx(
2312
+ StatusPage,
2313
+ {
2314
+ status: "403",
2315
+ title,
2316
+ subTitle,
2317
+ actionLabel,
2318
+ actionHref: href,
2319
+ onAction,
2320
+ extra,
2321
+ ...rest
2322
+ }
2323
+ );
2324
+ }
2325
+ UnauthorizedPage.displayName = "UnauthorizedPage";
2326
+ var FILLED_BG = {
2327
+ success: colors.semantic.success,
2328
+ error: colors.semantic.error,
2329
+ warning: colors.semantic.warning,
2330
+ info: colors.brand.primary
2331
+ };
2332
+ var InlineAlert = React.forwardRef(function InlineAlert2({
2333
+ type = "info",
2334
+ showIcon = true,
2335
+ variant = "outlined",
2336
+ style,
2337
+ className,
2338
+ ...rest
2339
+ }, ref) {
2340
+ const isFilled = variant === "filled";
2341
+ const alertStyle = {
2342
+ ...isFilled ? {
2343
+ backgroundColor: FILLED_BG[type],
2344
+ borderColor: FILLED_BG[type],
2345
+ color: colors.neutral.white
2346
+ } : void 0,
2347
+ ...style
2348
+ };
2349
+ const alertElement = /* @__PURE__ */ jsx(
2350
+ Alert,
2351
+ {
2352
+ ref,
2353
+ type,
2354
+ showIcon,
2355
+ style: alertStyle,
2356
+ className: [
2357
+ isFilled ? "cms-alert-filled" : "cms-alert-outlined",
2358
+ className
2359
+ ].filter(Boolean).join(" "),
2360
+ ...rest
2361
+ }
2362
+ );
2363
+ if (isFilled) {
2364
+ return /* @__PURE__ */ jsx(
2365
+ ConfigProvider,
2366
+ {
2367
+ theme: {
2368
+ components: {
2369
+ Alert: {
2370
+ colorText: colors.neutral.white,
2371
+ colorTextHeading: colors.neutral.white,
2372
+ colorIcon: colors.neutral.white,
2373
+ colorIconHover: colors.neutral.gray200
2374
+ }
2375
+ }
2376
+ },
2377
+ children: alertElement
2378
+ }
2379
+ );
2380
+ }
2381
+ return alertElement;
2382
+ });
2383
+ InlineAlert.displayName = "InlineAlert";
2384
+ var NotificationContext = createContext(null);
2385
+ var useNotification = () => {
2386
+ const context = useContext(NotificationContext);
2387
+ if (!context) {
2388
+ throw new Error(
2389
+ "useNotification must be used within a <NotificationProvider>. Wrap your component tree with <NotificationProvider>."
2390
+ );
2391
+ }
2392
+ return context;
2393
+ };
2394
+ var useNotifications = useNotification;
2395
+ var toAntNotifyArgs = (config) => ({
2396
+ ...config,
2397
+ btn: config.actions ?? config.btn
2398
+ });
2399
+ var InternalNotificationProvider = ({
2400
+ children
2401
+ }) => {
2402
+ const [messageApi, messageContextHolder] = message.useMessage();
2403
+ const [notificationApi, notificationContextHolder] = notification.useNotification();
2404
+ const value = useMemo(
2405
+ () => ({
2406
+ toast: messageApi,
2407
+ notify: {
2408
+ ...notificationApi,
2409
+ open: (config) => notificationApi.open(toAntNotifyArgs(config)),
2410
+ success: (config) => notificationApi.success(toAntNotifyArgs(config)),
2411
+ error: (config) => notificationApi.error(toAntNotifyArgs(config)),
2412
+ info: (config) => notificationApi.info(toAntNotifyArgs(config)),
2413
+ warning: (config) => notificationApi.warning(toAntNotifyArgs(config))
2414
+ }
2415
+ }),
2416
+ [messageApi, notificationApi]
2417
+ );
2418
+ return /* @__PURE__ */ jsxs(NotificationContext.Provider, { value, children: [
2419
+ messageContextHolder,
2420
+ notificationContextHolder,
2421
+ children
2422
+ ] });
2423
+ };
2424
+ var NotificationProvider = Object.assign(
2425
+ InternalNotificationProvider,
2426
+ {
2427
+ Alert: InlineAlert
2428
+ }
2429
+ );
64
2430
 
65
- export { Button, ThemeProvider, colors, theme };
2431
+ export { BarChart, BulletChart, Button, Card, CloseIcon, CollapseIcon, ColumnChart, DonutChart, DownloadIcon, Dropdown, Header, HistogramChart, InlineAlert, LineChart, Link, LogoutIcon, MenuIcon, MetricCard, Modal, NotFoundPage, NotificationProvider, SideNav, Skeleton, StatusPage, Table, Tabs, Tag, ThemeProvider, TimeSeriesChart, UnauthorizedPage, breakpoints, colors, fontSize, indusActionLogo, spacing, theme, useNotification, useNotifications };
66
2432
  //# sourceMappingURL=index.js.map
67
2433
  //# sourceMappingURL=index.js.map