@moving-walls/design-system 1.0.23 → 2.0.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.
Files changed (35) hide show
  1. package/dist/components/ui/AdvancedTable/index.d.ts +3 -0
  2. package/dist/components/ui/AdvancedTable/types.d.ts +51 -0
  3. package/dist/components/ui/AdvancedTable/useAdvancedTable.d.ts +27 -0
  4. package/dist/components/ui/AgGridTable/types.d.ts +2 -0
  5. package/dist/components/ui/Calendar/index.d.ts +3 -0
  6. package/dist/components/ui/Calendar/types.d.ts +14 -0
  7. package/dist/components/ui/Calendar/useCalendar.d.ts +26 -0
  8. package/dist/components/ui/CollapsibleInfoPanel.d.ts +12 -0
  9. package/dist/components/ui/DateRangePicker.d.ts +6 -1
  10. package/dist/components/ui/DesktopOnly.d.ts +8 -0
  11. package/dist/components/ui/DragDrop/DragDropZone.d.ts +14 -0
  12. package/dist/components/ui/DragDrop/FilePreview.d.ts +7 -0
  13. package/dist/components/ui/DragDrop/SortableList.d.ts +8 -0
  14. package/dist/components/ui/DragDrop/index.d.ts +9 -0
  15. package/dist/components/ui/DragDrop/types.d.ts +12 -0
  16. package/dist/components/ui/DragDrop/useDragDrop.d.ts +16 -0
  17. package/dist/components/ui/FocusScope.d.ts +14 -0
  18. package/dist/components/ui/MobileDataCard.d.ts +18 -0
  19. package/dist/components/ui/MobileOnly.d.ts +8 -0
  20. package/dist/components/ui/MobilePagination.d.ts +10 -0
  21. package/dist/components/ui/MobileToolbar.d.ts +12 -0
  22. package/dist/components/ui/ResponsiveStack.d.ts +14 -0
  23. package/dist/components/ui/ScheduleGrid.d.ts +6 -1
  24. package/dist/components/ui/TimeRangePicker.d.ts +8 -1
  25. package/dist/components/ui/VisuallyHidden.d.ts +10 -0
  26. package/dist/components/ui/index.d.ts +22 -0
  27. package/dist/hooks/index.d.ts +3 -0
  28. package/dist/hooks/useMediaQuery.d.ts +6 -0
  29. package/dist/hooks/useResponsiveSheet.d.ts +19 -0
  30. package/dist/index.esm.js +794 -32
  31. package/dist/index.esm.js.map +1 -1
  32. package/dist/index.js +803 -30
  33. package/dist/index.js.map +1 -1
  34. package/dist/tsconfig.build.tsbuildinfo +1 -1
  35. package/package.json +4 -2
package/dist/index.js CHANGED
@@ -289,14 +289,17 @@ var Input = /*#__PURE__*/React.forwardRef(function (_a, ref) {
289
289
  label = _a.label,
290
290
  error = _a.error,
291
291
  helpText = _a.helpText,
292
- props = __rest$1(_a, ["className", "label", "error", "helpText"]);
292
+ id = _a.id,
293
+ props = __rest$1(_a, ["className", "label", "error", "helpText", "id"]);
293
294
  return require$$1.jsxs("div", {
294
295
  className: "space-y-2",
295
296
  children: [label && require$$1.jsx("label", {
297
+ htmlFor: id,
296
298
  className: "block text-sm font-normal leading-none text-mw-neutral-700 dark:text-mw-neutral-300",
297
299
  children: label
298
300
  }), require$$1.jsx("input", Object.assign({
299
301
  ref: ref,
302
+ id: id,
300
303
  className: clsx('block w-full h-10 min-h-10 px-3 py-2 border rounded-md text-sm font-normal', 'focus:outline-none focus:ring-1 focus:ring-mw-primary-500 focus:border-transparent', 'disabled:opacity-50 disabled:cursor-not-allowed', error ? 'border-mw-error-300 text-mw-error-900 placeholder-mw-error-300 focus:ring-mw-error-500' : 'border-mw-neutral-100 dark:border-mw-neutral-600 text-mw-neutral-500 dark:text-white placeholder-mw-neutral-400', 'dark:bg-mw-neutral-800', className)
301
304
  }, props)), error && require$$1.jsx("p", {
302
305
  className: "text-sm text-mw-error-600 dark:text-mw-error-400",
@@ -316,7 +319,8 @@ var Textarea = /*#__PURE__*/React.forwardRef(function (_a, ref) {
316
319
  helpText = _a.helpText,
317
320
  _a$resize = _a.resize,
318
321
  resize = _a$resize === void 0 ? 'vertical' : _a$resize,
319
- props = __rest$1(_a, ["className", "label", "error", "helpText", "resize"]);
322
+ id = _a.id,
323
+ props = __rest$1(_a, ["className", "label", "error", "helpText", "resize", "id"]);
320
324
  var resizeClasses = {
321
325
  none: 'resize-none',
322
326
  vertical: 'resize-y',
@@ -326,10 +330,12 @@ var Textarea = /*#__PURE__*/React.forwardRef(function (_a, ref) {
326
330
  return require$$1.jsxs("div", {
327
331
  className: "space-y-2",
328
332
  children: [label && require$$1.jsx("label", {
333
+ htmlFor: id,
329
334
  className: "block text-sm font-medium text-mw-neutral-700 dark:text-mw-neutral-300",
330
335
  children: label
331
336
  }), require$$1.jsx("textarea", Object.assign({
332
337
  ref: ref,
338
+ id: id,
333
339
  className: clsx('block w-full px-3 py-2 border rounded-md shadow-sm min-h-[80px]', 'focus:outline-none focus:ring-2 focus:ring-mw-primary-500 focus:border-transparent', 'disabled:opacity-50 disabled:cursor-not-allowed', error ? 'border-mw-error-300 text-mw-error-900 placeholder-mw-error-300 focus:ring-mw-error-500' : 'border-mw-neutral-300 dark:border-mw-neutral-600 text-mw-neutral-900 dark:text-white placeholder-mw-neutral-400', 'dark:bg-mw-neutral-800', resizeClasses[resize], className)
334
340
  }, props)), error && require$$1.jsx("p", {
335
341
  className: "text-sm text-mw-error-600 dark:text-mw-error-400",
@@ -347,7 +353,8 @@ var Checkbox = /*#__PURE__*/React.forwardRef(function (_a, ref) {
347
353
  label = _a.label,
348
354
  description = _a.description,
349
355
  error = _a.error,
350
- props = __rest$1(_a, ["className", "label", "description", "error"]);
356
+ id = _a.id,
357
+ props = __rest$1(_a, ["className", "label", "description", "error", "id"]);
351
358
  return require$$1.jsxs("div", {
352
359
  className: "space-y-2",
353
360
  children: [require$$1.jsxs("div", {
@@ -355,10 +362,12 @@ var Checkbox = /*#__PURE__*/React.forwardRef(function (_a, ref) {
355
362
  children: [require$$1.jsx("input", Object.assign({
356
363
  type: "checkbox",
357
364
  ref: ref,
365
+ id: id,
358
366
  className: clsx('mt-0.5 h-4 w-4 rounded border-mw-neutral-100 dark:border-mw-neutral-600', 'accent-mw-primary-500 focus:ring-mw-primary-600 focus:ring-offset-2', 'disabled:opacity-50 disabled:cursor-not-allowed', error && 'border-mw-error-300 accent-mw-error-500 focus:ring-mw-error-500', className)
359
367
  }, props)), (label || description) && require$$1.jsxs("div", {
360
368
  className: "flex-1 min-w-0",
361
369
  children: [label && require$$1.jsx("label", {
370
+ htmlFor: id,
362
371
  className: "text-sm font-medium text-mw-neutral-500 dark:text-mw-neutral-300",
363
372
  children: label
364
373
  }), description && require$$1.jsx("p", {
@@ -378,7 +387,8 @@ var Radio$1 = /*#__PURE__*/React.forwardRef(function (_a, ref) {
378
387
  label = _a.label,
379
388
  description = _a.description,
380
389
  error = _a.error,
381
- props = __rest$1(_a, ["className", "label", "description", "error"]);
390
+ id = _a.id,
391
+ props = __rest$1(_a, ["className", "label", "description", "error", "id"]);
382
392
  return require$$1.jsxs("div", {
383
393
  className: "space-y-2",
384
394
  children: [require$$1.jsxs("div", {
@@ -386,10 +396,12 @@ var Radio$1 = /*#__PURE__*/React.forwardRef(function (_a, ref) {
386
396
  children: [require$$1.jsx("input", Object.assign({
387
397
  type: "radio",
388
398
  ref: ref,
399
+ id: id,
389
400
  className: clsx('mt-0.5 h-4 w-4 border-mw-neutral-100 dark:border-mw-neutral-600', 'accent-mw-primary-500 focus:ring-mw-primary-600 focus:ring-offset-2', 'disabled:opacity-50 disabled:cursor-not-allowed', error && 'border-mw-error-300 accent-mw-error-500 focus:ring-mw-error-500', className)
390
401
  }, props)), (label || description) && require$$1.jsxs("div", {
391
402
  className: "flex-1 min-w-0",
392
403
  children: [label && require$$1.jsx("label", {
404
+ htmlFor: id,
393
405
  className: "text-sm font-medium text-mw-neutral-500 dark:text-mw-neutral-300",
394
406
  children: label
395
407
  }), description && require$$1.jsx("p", {
@@ -31454,7 +31466,7 @@ var AUTOFOCUS_ON_MOUNT = "focusScope.autoFocusOnMount";
31454
31466
  var AUTOFOCUS_ON_UNMOUNT = "focusScope.autoFocusOnUnmount";
31455
31467
  var EVENT_OPTIONS = { bubbles: false, cancelable: true };
31456
31468
  var FOCUS_SCOPE_NAME = "FocusScope";
31457
- var FocusScope = React__namespace.forwardRef((props, forwardedRef) => {
31469
+ var FocusScope$1 = React__namespace.forwardRef((props, forwardedRef) => {
31458
31470
  const { loop = false, trapped = false, onMountAutoFocus: onMountAutoFocusProp, onUnmountAutoFocus: onUnmountAutoFocusProp } = props, scopeProps = __rest$1(props, ["loop", "trapped", "onMountAutoFocus", "onUnmountAutoFocus"]);
31459
31471
  const [container, setContainer] = React__namespace.useState(null);
31460
31472
  const onMountAutoFocus = useCallbackRef$1(onMountAutoFocusProp);
@@ -31574,7 +31586,7 @@ var FocusScope = React__namespace.forwardRef((props, forwardedRef) => {
31574
31586
  }, [loop, trapped, focusScope.paused]);
31575
31587
  return /* @__PURE__ */ require$$1.jsx(Primitive.div, Object.assign(Object.assign({ tabIndex: -1 }, scopeProps), { ref: composedRefs, onKeyDown: handleKeyDown }));
31576
31588
  });
31577
- FocusScope.displayName = FOCUS_SCOPE_NAME;
31589
+ FocusScope$1.displayName = FOCUS_SCOPE_NAME;
31578
31590
  function focusFirst(candidates, { select = false } = {}) {
31579
31591
  const previouslyFocusedElement = document.activeElement;
31580
31592
  for (const candidate of candidates) {
@@ -33926,10 +33938,10 @@ var VISUALLY_HIDDEN_STYLES = Object.freeze({
33926
33938
  wordWrap: "normal"
33927
33939
  });
33928
33940
  var NAME = "VisuallyHidden";
33929
- var VisuallyHidden = React__namespace.forwardRef((props, forwardedRef) => {
33941
+ var VisuallyHidden$1 = React__namespace.forwardRef((props, forwardedRef) => {
33930
33942
  return /* @__PURE__ */ require$$1.jsx(Primitive.span, Object.assign(Object.assign({}, props), { ref: forwardedRef, style: Object.assign(Object.assign({}, VISUALLY_HIDDEN_STYLES), props.style) }));
33931
33943
  });
33932
- VisuallyHidden.displayName = NAME;
33944
+ VisuallyHidden$1.displayName = NAME;
33933
33945
 
33934
33946
  var getDefaultParent = function (originalTarget) {
33935
33947
  if (typeof document === 'undefined') {
@@ -35102,7 +35114,7 @@ var SelectContentImpl = React__namespace.forwardRef((props, forwardedRef) => {
35102
35114
  position,
35103
35115
  isPositioned,
35104
35116
  searchRef,
35105
- children: /* @__PURE__ */ require$$1.jsx(ReactRemoveScroll, { as: Slot, allowPinchZoom: true, children: /* @__PURE__ */ require$$1.jsx(FocusScope, {
35117
+ children: /* @__PURE__ */ require$$1.jsx(ReactRemoveScroll, { as: Slot, allowPinchZoom: true, children: /* @__PURE__ */ require$$1.jsx(FocusScope$1, {
35106
35118
  asChild: true,
35107
35119
  trapped: context.open,
35108
35120
  onMountAutoFocus: (event) => {
@@ -36144,8 +36156,7 @@ var daysOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
36144
36156
  function DatePicker(_ref) {
36145
36157
  var value = _ref.value,
36146
36158
  onChange = _ref.onChange,
36147
- _ref$placeholder = _ref.placeholder,
36148
- placeholder = _ref$placeholder === void 0 ? 'Select date' : _ref$placeholder,
36159
+ placeholder = _ref.placeholder,
36149
36160
  _ref$disabled = _ref.disabled,
36150
36161
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
36151
36162
  className = _ref.className,
@@ -36382,9 +36393,10 @@ function CalendarMonth(_ref) {
36382
36393
  }
36383
36394
  // Next month's leading days
36384
36395
  var totalCells = Math.ceil(days.length / 7) * 7;
36385
- for (var _i = days.length; _i < totalCells; _i++) {
36386
- var _date2 = new Date(lastDayOfMonth);
36387
- _date2.setDate(_date2.getDate() + (_i - days.length + 1));
36396
+ var nextMonthStart = days.length;
36397
+ for (var _i = nextMonthStart; _i < totalCells; _i++) {
36398
+ var nextDay = _i - nextMonthStart + 1;
36399
+ var _date2 = new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, nextDay);
36388
36400
  days.push({
36389
36401
  date: _date2,
36390
36402
  isCurrentMonth: false
@@ -36487,8 +36499,8 @@ function CalendarMonth(_ref) {
36487
36499
  function DateRangePicker(_ref3) {
36488
36500
  var value = _ref3.value,
36489
36501
  onChange = _ref3.onChange,
36490
- _ref3$placeholder = _ref3.placeholder,
36491
- placeholder = _ref3$placeholder === void 0 ? 'Select date range' : _ref3$placeholder,
36502
+ placeholder = _ref3.placeholder,
36503
+ labels = _ref3.labels,
36492
36504
  _ref3$disabled = _ref3.disabled,
36493
36505
  disabled = _ref3$disabled === void 0 ? false : _ref3$disabled;
36494
36506
  _ref3.required;
@@ -36505,6 +36517,7 @@ function DateRangePicker(_ref3) {
36505
36517
  presets = _ref3$presets === void 0 ? defaultPresets$1 : _ref3$presets,
36506
36518
  _ref3$align = _ref3.align,
36507
36519
  align = _ref3$align === void 0 ? 'left' : _ref3$align;
36520
+ var _a, _b;
36508
36521
  var _useState = React.useState(false),
36509
36522
  _useState2 = _slicedToArray(_useState, 2),
36510
36523
  isOpen = _useState2[0],
@@ -36670,7 +36683,7 @@ function DateRangePicker(_ref3) {
36670
36683
  className: "flex items-center justify-between px-3 py-2 border-t border-mw-neutral-200 dark:border-mw-neutral-700",
36671
36684
  children: [require$$1.jsx("div", {
36672
36685
  className: "text-[11px] text-mw-neutral-500 dark:text-mw-neutral-400",
36673
- children: selectingStart ? 'Select start date' : 'Select end date'
36686
+ children: selectingStart ? (_a = labels === null || labels === void 0 ? void 0 : labels.selectStart) !== null && _a !== void 0 ? _a : 'Select start date' : (_b = labels === null || labels === void 0 ? void 0 : labels.selectEnd) !== null && _b !== void 0 ? _b : 'Select end date'
36674
36687
  }), require$$1.jsxs("div", {
36675
36688
  className: "flex gap-2 items-center",
36676
36689
  children: [require$$1.jsx("button", {
@@ -36831,8 +36844,7 @@ function TimePicker(_ref2) {
36831
36844
  label = _ref2.label,
36832
36845
  error = _ref2.error,
36833
36846
  helpText = _ref2.helpText,
36834
- _ref2$placeholder = _ref2.placeholder,
36835
- placeholder = _ref2$placeholder === void 0 ? 'Select time' : _ref2$placeholder,
36847
+ placeholder = _ref2.placeholder,
36836
36848
  className = _ref2.className,
36837
36849
  _ref2$size = _ref2.size,
36838
36850
  size = _ref2$size === void 0 ? 'md' : _ref2$size,
@@ -37198,8 +37210,7 @@ function TimeSelect(_ref) {
37198
37210
  function TimeRangePicker(_ref2) {
37199
37211
  var value = _ref2.value,
37200
37212
  onChange = _ref2.onChange,
37201
- _ref2$placeholder = _ref2.placeholder,
37202
- placeholder = _ref2$placeholder === void 0 ? 'Select time range' : _ref2$placeholder,
37213
+ placeholder = _ref2.placeholder,
37203
37214
  _ref2$disabled = _ref2.disabled,
37204
37215
  disabled = _ref2$disabled === void 0 ? false : _ref2$disabled;
37205
37216
  _ref2.required;
@@ -37212,8 +37223,10 @@ function TimeRangePicker(_ref2) {
37212
37223
  minTime = _ref2.minTime,
37213
37224
  maxTime = _ref2.maxTime,
37214
37225
  className = _ref2.className,
37226
+ labels = _ref2.labels,
37215
37227
  _ref2$presets = _ref2.presets,
37216
37228
  presets = _ref2$presets === void 0 ? defaultPresets : _ref2$presets;
37229
+ var _a, _b;
37217
37230
  var _useState5 = React.useState(value || {
37218
37231
  from: null,
37219
37232
  to: null
@@ -37350,13 +37363,13 @@ function TimeRangePicker(_ref2) {
37350
37363
  children: [require$$1.jsxs("div", {
37351
37364
  children: [require$$1.jsx("label", {
37352
37365
  className: "block text-sm font-medium mb-2 text-mw-neutral-900 dark:text-white",
37353
- children: "From Time"
37366
+ children: (_a = labels === null || labels === void 0 ? void 0 : labels.fromTime) !== null && _a !== void 0 ? _a : 'From Time'
37354
37367
  }), require$$1.jsx(TimeSelect, {
37355
37368
  value: selectedRange.from,
37356
37369
  onChange: handleFromTimeChange,
37357
37370
  options: timeOptions,
37358
37371
  format: format,
37359
- placeholder: "Select start time",
37372
+ placeholder: labels === null || labels === void 0 ? void 0 : labels.selectStart,
37360
37373
  disabled: disabled,
37361
37374
  minTime: minTime,
37362
37375
  maxTime: selectedRange.to ? format === '12' ? convertTo24Hour(selectedRange.to) : selectedRange.to : maxTime
@@ -37364,13 +37377,13 @@ function TimeRangePicker(_ref2) {
37364
37377
  }), require$$1.jsxs("div", {
37365
37378
  children: [require$$1.jsx("label", {
37366
37379
  className: "block text-sm font-medium mb-2 text-mw-neutral-900 dark:text-white",
37367
- children: "To Time"
37380
+ children: (_b = labels === null || labels === void 0 ? void 0 : labels.toTime) !== null && _b !== void 0 ? _b : 'To Time'
37368
37381
  }), require$$1.jsx(TimeSelect, {
37369
37382
  value: selectedRange.to,
37370
37383
  onChange: handleToTimeChange,
37371
37384
  options: timeOptions,
37372
37385
  format: format,
37373
- placeholder: "Select end time",
37386
+ placeholder: labels === null || labels === void 0 ? void 0 : labels.selectEnd,
37374
37387
  disabled: disabled || !selectedRange.from,
37375
37388
  minTime: selectedRange.from ? format === '12' ? convertTo24Hour(selectedRange.from) : selectedRange.from : minTime,
37376
37389
  maxTime: maxTime
@@ -38699,8 +38712,7 @@ function MultiSelect(_ref) {
38699
38712
  _ref$value = _ref.value,
38700
38713
  value = _ref$value === void 0 ? [] : _ref$value,
38701
38714
  onChange = _ref.onChange,
38702
- _ref$placeholder = _ref.placeholder,
38703
- placeholder = _ref$placeholder === void 0 ? 'Select...' : _ref$placeholder,
38715
+ placeholder = _ref.placeholder,
38704
38716
  label = _ref.label,
38705
38717
  _ref$disabled = _ref.disabled,
38706
38718
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
@@ -39157,7 +39169,8 @@ function ScheduleGrid(_ref) {
39157
39169
  _ref$presets = _ref.presets,
39158
39170
  presets = _ref$presets === void 0 ? DEFAULT_PRESETS : _ref$presets,
39159
39171
  _ref$showPresets = _ref.showPresets,
39160
- showPresets = _ref$showPresets === void 0 ? true : _ref$showPresets;
39172
+ showPresets = _ref$showPresets === void 0 ? true : _ref$showPresets,
39173
+ labels = _ref.labels;
39161
39174
  var _useState = React.useState('custom'),
39162
39175
  _useState2 = _slicedToArray(_useState, 2),
39163
39176
  selectedPreset = _useState2[0],
@@ -39280,6 +39293,7 @@ function ScheduleGrid(_ref) {
39280
39293
  onChange(newRules);
39281
39294
  };
39282
39295
  var renderHourGrid = function renderHourGrid(type, selectedHours) {
39296
+ var _a, _b;
39283
39297
  var allSelected = selectedHours.size === 24;
39284
39298
  var label = type === 'DEFAULT' ? 'Default Hours' : type === 'WEEKDAY' ? 'Weekday Hours (Mon-Fri)' : 'Weekend Hours (Sat-Sun)';
39285
39299
  var isExpanded = expandedSection === type.toLowerCase();
@@ -39314,7 +39328,7 @@ function ScheduleGrid(_ref) {
39314
39328
  return handleSelectAll(type);
39315
39329
  },
39316
39330
  className: "text-xs text-mw-primary-500 hover:text-mw-primary-600 font-medium",
39317
- children: allSelected ? 'Deselect All' : 'Select All 24 Hours'
39331
+ children: allSelected ? (_a = labels === null || labels === void 0 ? void 0 : labels.deselectAll) !== null && _a !== void 0 ? _a : 'Deselect All' : (_b = labels === null || labels === void 0 ? void 0 : labels.selectAll) !== null && _b !== void 0 ? _b : 'Select All 24 Hours'
39318
39332
  })
39319
39333
  }), require$$1.jsx("div", {
39320
39334
  className: "grid grid-cols-6 gap-1.5",
@@ -42924,6 +42938,221 @@ function AdvancedTable(_ref3) {
42924
42938
  });
42925
42939
  }
42926
42940
 
42941
+ function getCellValue(row, column) {
42942
+ if (column.accessorFn) return column.accessorFn(row);
42943
+ if (column.accessorKey) return row[column.accessorKey];
42944
+ return undefined;
42945
+ }
42946
+ function useAdvancedTable(_ref) {
42947
+ var data = _ref.data,
42948
+ columns = _ref.columns,
42949
+ _ref$initialState = _ref.initialState,
42950
+ initialState = _ref$initialState === void 0 ? {} : _ref$initialState,
42951
+ _ref$getRowId = _ref.getRowId,
42952
+ getRowId = _ref$getRowId === void 0 ? function (_row, index) {
42953
+ return index;
42954
+ } : _ref$getRowId;
42955
+ var _useState = React.useState(initialState.sorting || []),
42956
+ _useState2 = _slicedToArray(_useState, 2),
42957
+ sorting = _useState2[0],
42958
+ setSorting = _useState2[1];
42959
+ var _useState3 = React.useState(initialState.filters || []),
42960
+ _useState4 = _slicedToArray(_useState3, 2),
42961
+ filters = _useState4[0],
42962
+ setFilters = _useState4[1];
42963
+ var _useState5 = React.useState(initialState.globalFilter || ''),
42964
+ _useState6 = _slicedToArray(_useState5, 2),
42965
+ globalFilter = _useState6[0],
42966
+ setGlobalFilter = _useState6[1];
42967
+ var _useState7 = React.useState(initialState.columnVisibility || {}),
42968
+ _useState8 = _slicedToArray(_useState7, 2),
42969
+ columnVisibility = _useState8[0],
42970
+ setColumnVisibility = _useState8[1];
42971
+ var _useState9 = React.useState(initialState.density || 'normal'),
42972
+ _useState0 = _slicedToArray(_useState9, 2),
42973
+ density = _useState0[0],
42974
+ setDensity = _useState0[1];
42975
+ var _useState1 = React.useState(new Set()),
42976
+ _useState10 = _slicedToArray(_useState1, 2),
42977
+ selectedRows = _useState10[0],
42978
+ setSelectedRows = _useState10[1];
42979
+ var visibleColumns = React.useMemo(function () {
42980
+ return columns.filter(function (col) {
42981
+ return columnVisibility[col.id] !== false && !col.hidden;
42982
+ });
42983
+ }, [columns, columnVisibility]);
42984
+ var toggleSort = React.useCallback(function (columnId) {
42985
+ setSorting(function (prev) {
42986
+ var existing = prev.find(function (s) {
42987
+ return s.columnId === columnId;
42988
+ });
42989
+ if (!existing) return [{
42990
+ columnId: columnId,
42991
+ direction: 'asc'
42992
+ }];
42993
+ if (existing.direction === 'asc') return [{
42994
+ columnId: columnId,
42995
+ direction: 'desc'
42996
+ }];
42997
+ return [];
42998
+ });
42999
+ }, []);
43000
+ var addFilter = React.useCallback(function (filter) {
43001
+ setFilters(function (prev) {
43002
+ var idx = prev.findIndex(function (f) {
43003
+ return f.columnId === filter.columnId;
43004
+ });
43005
+ if (idx >= 0) {
43006
+ var next = _toConsumableArray(prev);
43007
+ next[idx] = filter;
43008
+ return next;
43009
+ }
43010
+ return [].concat(_toConsumableArray(prev), [filter]);
43011
+ });
43012
+ }, []);
43013
+ var removeFilter = React.useCallback(function (columnId) {
43014
+ setFilters(function (prev) {
43015
+ return prev.filter(function (f) {
43016
+ return f.columnId !== columnId;
43017
+ });
43018
+ });
43019
+ }, []);
43020
+ var clearFilters = React.useCallback(function () {
43021
+ setFilters([]);
43022
+ setGlobalFilter('');
43023
+ }, []);
43024
+ var toggleColumnVisibility = React.useCallback(function (columnId) {
43025
+ setColumnVisibility(function (prev) {
43026
+ return Object.assign(Object.assign({}, prev), _defineProperty({}, columnId, prev[columnId] === false ? true : false));
43027
+ });
43028
+ }, []);
43029
+ var toggleRowSelection = React.useCallback(function (rowId) {
43030
+ setSelectedRows(function (prev) {
43031
+ var next = new Set(prev);
43032
+ if (next.has(rowId)) next["delete"](rowId);else next.add(rowId);
43033
+ return next;
43034
+ });
43035
+ }, []);
43036
+ var selectAllRows = React.useCallback(function () {
43037
+ setSelectedRows(new Set(data.map(function (row, i) {
43038
+ return getRowId(row, i);
43039
+ })));
43040
+ }, [data, getRowId]);
43041
+ var clearSelection = React.useCallback(function () {
43042
+ setSelectedRows(new Set());
43043
+ }, []);
43044
+ var processedData = React.useMemo(function () {
43045
+ var result = _toConsumableArray(data);
43046
+ // Apply global filter
43047
+ if (globalFilter) {
43048
+ var searchLower = globalFilter.toLowerCase();
43049
+ result = result.filter(function (row) {
43050
+ return columns.some(function (col) {
43051
+ if (!col.searchable && col.searchable !== undefined) return false;
43052
+ var value = getCellValue(row, col);
43053
+ return value != null && String(value).toLowerCase().includes(searchLower);
43054
+ });
43055
+ });
43056
+ }
43057
+ // Apply column filters
43058
+ var _iterator = _createForOfIteratorHelper(filters),
43059
+ _step;
43060
+ try {
43061
+ var _loop = function _loop() {
43062
+ var filter = _step.value;
43063
+ var column = columns.find(function (c) {
43064
+ return c.id === filter.columnId;
43065
+ });
43066
+ if (!column) return 1; // continue
43067
+ result = result.filter(function (row) {
43068
+ var value = getCellValue(row, column);
43069
+ if (value == null) return false;
43070
+ var strValue = String(value).toLowerCase();
43071
+ var filterValue = String(filter.value).toLowerCase();
43072
+ switch (filter.operator || 'contains') {
43073
+ case 'equals':
43074
+ return strValue === filterValue;
43075
+ case 'contains':
43076
+ return strValue.includes(filterValue);
43077
+ case 'startsWith':
43078
+ return strValue.startsWith(filterValue);
43079
+ case 'endsWith':
43080
+ return strValue.endsWith(filterValue);
43081
+ default:
43082
+ return strValue.includes(filterValue);
43083
+ }
43084
+ });
43085
+ };
43086
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
43087
+ if (_loop()) continue;
43088
+ }
43089
+ // Apply sorting
43090
+ } catch (err) {
43091
+ _iterator.e(err);
43092
+ } finally {
43093
+ _iterator.f();
43094
+ }
43095
+ if (sorting.length > 0) {
43096
+ var sort = sorting[0];
43097
+ var column = columns.find(function (c) {
43098
+ return c.id === sort.columnId;
43099
+ });
43100
+ if (column) {
43101
+ result.sort(function (a, b) {
43102
+ var aVal = getCellValue(a, column);
43103
+ var bVal = getCellValue(b, column);
43104
+ if (aVal == null && bVal == null) return 0;
43105
+ if (aVal == null) return 1;
43106
+ if (bVal == null) return -1;
43107
+ var cmp = String(aVal).localeCompare(String(bVal), undefined, {
43108
+ numeric: true
43109
+ });
43110
+ return sort.direction === 'desc' ? -cmp : cmp;
43111
+ });
43112
+ }
43113
+ }
43114
+ return result;
43115
+ }, [data, columns, sorting, filters, globalFilter]);
43116
+ var state = {
43117
+ sorting: sorting,
43118
+ filters: filters,
43119
+ globalFilter: globalFilter,
43120
+ columnVisibility: columnVisibility,
43121
+ columnOrder: columns.map(function (c) {
43122
+ return c.id;
43123
+ }),
43124
+ columnSizing: {},
43125
+ density: density,
43126
+ frozenColumns: {
43127
+ left: [],
43128
+ right: []
43129
+ }
43130
+ };
43131
+ return {
43132
+ // Data
43133
+ processedData: processedData,
43134
+ visibleColumns: visibleColumns,
43135
+ // State
43136
+ state: state,
43137
+ sorting: sorting,
43138
+ filters: filters,
43139
+ globalFilter: globalFilter,
43140
+ density: density,
43141
+ selectedRows: selectedRows,
43142
+ // Actions
43143
+ toggleSort: toggleSort,
43144
+ addFilter: addFilter,
43145
+ removeFilter: removeFilter,
43146
+ clearFilters: clearFilters,
43147
+ setGlobalFilter: setGlobalFilter,
43148
+ setDensity: setDensity,
43149
+ toggleColumnVisibility: toggleColumnVisibility,
43150
+ toggleRowSelection: toggleRowSelection,
43151
+ selectAllRows: selectAllRows,
43152
+ clearSelection: clearSelection
43153
+ };
43154
+ }
43155
+
42927
43156
  var emptyStateIcons = {
42928
43157
  noData: require$$1.jsx(Database, {
42929
43158
  className: "w-12 h-12 text-mw-neutral-400"
@@ -47118,6 +47347,121 @@ function DayView(_ref4) {
47118
47347
  });
47119
47348
  }
47120
47349
 
47350
+ function useCalendar(_ref) {
47351
+ var value = _ref.value,
47352
+ _ref$events = _ref.events,
47353
+ events = _ref$events === void 0 ? [] : _ref$events,
47354
+ _ref$view = _ref.view,
47355
+ view = _ref$view === void 0 ? 'month' : _ref$view,
47356
+ onViewChange = _ref.onViewChange,
47357
+ onChange = _ref.onChange,
47358
+ _ref$hourFormat = _ref.hourFormat,
47359
+ hourFormat = _ref$hourFormat === void 0 ? 24 : _ref$hourFormat;
47360
+ var _useState = React.useState(value || new Date()),
47361
+ _useState2 = _slicedToArray(_useState, 2),
47362
+ currentDate = _useState2[0],
47363
+ setCurrentDate = _useState2[1];
47364
+ var _useState3 = React.useState(view),
47365
+ _useState4 = _slicedToArray(_useState3, 2),
47366
+ currentView = _useState4[0],
47367
+ setCurrentView = _useState4[1];
47368
+ var today = new Date();
47369
+ var _useMemo = React.useMemo(function () {
47370
+ return {
47371
+ year: currentDate.getFullYear(),
47372
+ month: currentDate.getMonth()
47373
+ };
47374
+ }, [currentDate]),
47375
+ year = _useMemo.year,
47376
+ month = _useMemo.month;
47377
+ var handleViewChange = React.useCallback(function (newView) {
47378
+ setCurrentView(newView);
47379
+ onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newView);
47380
+ }, [onViewChange]);
47381
+ var handleDateSelect = React.useCallback(function (date) {
47382
+ setCurrentDate(date);
47383
+ onChange === null || onChange === void 0 ? void 0 : onChange(date);
47384
+ }, [onChange]);
47385
+ var navigateMonth = React.useCallback(function (delta) {
47386
+ setCurrentDate(function (prev) {
47387
+ return new Date(prev.getFullYear(), prev.getMonth() + delta, 1);
47388
+ });
47389
+ }, []);
47390
+ var navigateWeek = React.useCallback(function (delta) {
47391
+ setCurrentDate(function (prev) {
47392
+ var d = new Date(prev);
47393
+ d.setDate(d.getDate() + delta * 7);
47394
+ return d;
47395
+ });
47396
+ }, []);
47397
+ var navigateDay = React.useCallback(function (delta) {
47398
+ setCurrentDate(function (prev) {
47399
+ var d = new Date(prev);
47400
+ d.setDate(d.getDate() + delta);
47401
+ return d;
47402
+ });
47403
+ }, []);
47404
+ var goToToday = React.useCallback(function () {
47405
+ setCurrentDate(new Date());
47406
+ }, []);
47407
+ var getEventsForDate = React.useCallback(function (date) {
47408
+ return events.filter(function (event) {
47409
+ return event.date.toDateString() === date.toDateString();
47410
+ });
47411
+ }, [events]);
47412
+ var getEventsForTimeSlot = React.useCallback(function (date, timeSlot) {
47413
+ var dateEvents = getEventsForDate(date);
47414
+ return dateEvents.filter(function (event) {
47415
+ if (event.allDay) return false;
47416
+ if (!event.startTime) return false;
47417
+ var eventStart = event.startTime;
47418
+ return eventStart === timeSlot;
47419
+ });
47420
+ }, [getEventsForDate]);
47421
+ var formatTime = React.useCallback(function (time) {
47422
+ if (hourFormat === 12) {
47423
+ var _time$split$map = time.split(':').map(Number),
47424
+ _time$split$map2 = _slicedToArray(_time$split$map, 2),
47425
+ hours = _time$split$map2[0],
47426
+ minutes = _time$split$map2[1];
47427
+ var ampm = hours >= 12 ? 'PM' : 'AM';
47428
+ var displayHours = hours % 12 || 12;
47429
+ return "".concat(displayHours, ":").concat(minutes.toString().padStart(2, '0'), " ").concat(ampm);
47430
+ }
47431
+ return time;
47432
+ }, [hourFormat]);
47433
+ var getWeekDates = React.useCallback(function (date) {
47434
+ var startOfWeek = new Date(date);
47435
+ var day = startOfWeek.getDay();
47436
+ var diff = startOfWeek.getDate() - day + (day === 0 ? -6 : 1);
47437
+ startOfWeek.setDate(diff);
47438
+ var weekDates = [];
47439
+ for (var i = 0; i < 7; i++) {
47440
+ var weekDate = new Date(startOfWeek);
47441
+ weekDate.setDate(startOfWeek.getDate() + i);
47442
+ weekDates.push(weekDate);
47443
+ }
47444
+ return weekDates;
47445
+ }, []);
47446
+ return {
47447
+ currentDate: currentDate,
47448
+ currentView: currentView,
47449
+ today: today,
47450
+ year: year,
47451
+ month: month,
47452
+ handleViewChange: handleViewChange,
47453
+ handleDateSelect: handleDateSelect,
47454
+ navigateMonth: navigateMonth,
47455
+ navigateWeek: navigateWeek,
47456
+ navigateDay: navigateDay,
47457
+ goToToday: goToToday,
47458
+ getEventsForDate: getEventsForDate,
47459
+ getEventsForTimeSlot: getEventsForTimeSlot,
47460
+ formatTime: formatTime,
47461
+ getWeekDates: getWeekDates
47462
+ };
47463
+ }
47464
+
47121
47465
  function cn$8() {
47122
47466
  for (var _len = arguments.length, classes = new Array(_len), _key = 0; _key < _len; _key++) {
47123
47467
  classes[_key] = arguments[_key];
@@ -49571,7 +49915,8 @@ function AgGridTableInner(props) {
49571
49915
  cacheBlockSize = props.cacheBlockSize,
49572
49916
  footerData = props.footerData,
49573
49917
  _props$pagination = props.pagination,
49574
- pagination = _props$pagination === void 0 ? true : _props$pagination;
49918
+ pagination = _props$pagination === void 0 ? true : _props$pagination,
49919
+ onBodyScrollEnd = props.onBodyScrollEnd;
49575
49920
  var gridRef = React.useRef(null);
49576
49921
  var apiRef = React.useRef(null);
49577
49922
  var isSortFromExternalRef = React.useRef(false);
@@ -49739,6 +50084,9 @@ function AgGridTableInner(props) {
49739
50084
  paginationPageSize: useGridPagination ? (_a = serverSideConfig === null || serverSideConfig === void 0 ? void 0 : serverSideConfig.pageSize) !== null && _a !== void 0 ? _a : 10 : undefined,
49740
50085
  paginationPageSizeSelector: useGridPagination ? (_b = serverSideConfig === null || serverSideConfig === void 0 ? void 0 : serverSideConfig.pageSizeSelector) !== null && _b !== void 0 ? _b : DEFAULT_PAGE_SIZE_SELECTOR : undefined,
49741
50086
  cacheBlockSize: cacheBlockSize,
50087
+ onBodyScrollEnd: onBodyScrollEnd ? function () {
50088
+ return onBodyScrollEnd();
50089
+ } : undefined,
49742
50090
  pinnedBottomRowData: footerData === null || footerData === void 0 ? void 0 : footerData.map(function (row, i) {
49743
50091
  return _typeof(row) === "object" && row !== null && !("id" in row) ? Object.assign(Object.assign({}, row), {
49744
50092
  id: "pinned-bottom-".concat(i)
@@ -49757,6 +50105,420 @@ function AgGridTableInner(props) {
49757
50105
  }
49758
50106
  var AgGridTable = AgGridTableInner;
49759
50107
 
50108
+ /**
50109
+ * A mobile-optimized card for displaying a single data row.
50110
+ * Replaces AG Grid table rows on mobile viewports.
50111
+ * Minimum 44px touch target when clickable.
50112
+ */
50113
+ var MobileDataCard = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (_a, ref) {
50114
+ var title = _a.title,
50115
+ subtitle = _a.subtitle,
50116
+ statusBadge = _a.statusBadge,
50117
+ fields = _a.fields,
50118
+ actions = _a.actions,
50119
+ onClick = _a.onClick,
50120
+ className = _a.className,
50121
+ props = __rest$1(_a, ["title", "subtitle", "statusBadge", "fields", "actions", "onClick", "className"]);
50122
+ return require$$1.jsxs("div", Object.assign({
50123
+ ref: ref,
50124
+ role: onClick ? 'button' : undefined,
50125
+ tabIndex: onClick ? 0 : undefined,
50126
+ onClick: onClick,
50127
+ onKeyDown: onClick ? function (e) {
50128
+ if (e.key === 'Enter') onClick();
50129
+ } : undefined,
50130
+ className: clsx('rounded-lg border border-mw-neutral-200 bg-white p-4', 'dark:border-mw-neutral-700 dark:bg-mw-neutral-800', onClick && 'cursor-pointer hover:border-mw-primary-300 dark:hover:border-mw-primary-600 min-h-[44px]', className)
50131
+ }, props, {
50132
+ children: [require$$1.jsxs("div", {
50133
+ className: "flex items-start justify-between gap-2",
50134
+ children: [require$$1.jsxs("div", {
50135
+ className: "flex-1 min-w-0",
50136
+ children: [require$$1.jsx("p", {
50137
+ className: "text-sm font-medium text-mw-neutral-900 dark:text-mw-neutral-100 truncate",
50138
+ children: title
50139
+ }), subtitle && require$$1.jsx("p", {
50140
+ className: "text-xs text-mw-neutral-500 dark:text-mw-neutral-400 mt-0.5",
50141
+ children: subtitle
50142
+ })]
50143
+ }), require$$1.jsxs("div", {
50144
+ className: "flex items-center gap-2 flex-shrink-0",
50145
+ children: [statusBadge, actions]
50146
+ })]
50147
+ }), fields.length > 0 && require$$1.jsx("div", {
50148
+ className: "grid grid-cols-2 gap-x-4 gap-y-2 mt-3",
50149
+ children: fields.map(function (_ref) {
50150
+ var label = _ref.label,
50151
+ value = _ref.value;
50152
+ return require$$1.jsxs("div", {
50153
+ children: [require$$1.jsx("p", {
50154
+ className: "text-xs text-mw-neutral-500 dark:text-mw-neutral-400",
50155
+ children: label
50156
+ }), require$$1.jsx("p", {
50157
+ className: "text-sm text-mw-neutral-900 dark:text-mw-neutral-100",
50158
+ children: value
50159
+ })]
50160
+ }, label);
50161
+ })
50162
+ })]
50163
+ }));
50164
+ }));
50165
+ MobileDataCard.displayName = 'MobileDataCard';
50166
+
50167
+ /**
50168
+ * Prev/Next pagination for mobile card lists.
50169
+ * Shows "Page X of Y" with disabled states at boundaries.
50170
+ */
50171
+ var MobilePagination = /*#__PURE__*/React.forwardRef(function (_a, ref) {
50172
+ var page = _a.page,
50173
+ totalPages = _a.totalPages,
50174
+ onPageChange = _a.onPageChange,
50175
+ className = _a.className,
50176
+ props = __rest$1(_a, ["page", "totalPages", "onPageChange", "className"]);
50177
+ return require$$1.jsxs("div", Object.assign({
50178
+ ref: ref,
50179
+ className: clsx('flex items-center justify-between px-2 py-3', className)
50180
+ }, props, {
50181
+ children: [require$$1.jsx("button", {
50182
+ type: "button",
50183
+ "aria-label": "Previous page",
50184
+ disabled: page <= 1,
50185
+ onClick: function onClick() {
50186
+ return onPageChange(page - 1);
50187
+ },
50188
+ className: clsx('px-3 py-2 text-sm font-medium rounded-md min-h-[44px] min-w-[44px]', 'border border-mw-neutral-200 dark:border-mw-neutral-700', 'text-mw-neutral-700 dark:text-mw-neutral-300', 'enabled:hover:bg-mw-neutral-50 enabled:dark:hover:bg-mw-neutral-800', 'disabled:opacity-50 disabled:cursor-not-allowed'),
50189
+ children: "\u2190"
50190
+ }), require$$1.jsxs("span", {
50191
+ className: "text-sm text-mw-neutral-600 dark:text-mw-neutral-400",
50192
+ children: [page, " / ", totalPages]
50193
+ }), require$$1.jsx("button", {
50194
+ type: "button",
50195
+ "aria-label": "Next page",
50196
+ disabled: page >= totalPages,
50197
+ onClick: function onClick() {
50198
+ return onPageChange(page + 1);
50199
+ },
50200
+ className: clsx('px-3 py-2 text-sm font-medium rounded-md min-h-[44px] min-w-[44px]', 'border border-mw-neutral-200 dark:border-mw-neutral-700', 'text-mw-neutral-700 dark:text-mw-neutral-300', 'enabled:hover:bg-mw-neutral-50 enabled:dark:hover:bg-mw-neutral-800', 'disabled:opacity-50 disabled:cursor-not-allowed'),
50201
+ children: "\u2192"
50202
+ })]
50203
+ }));
50204
+ });
50205
+ MobilePagination.displayName = 'MobilePagination';
50206
+
50207
+ /**
50208
+ * A mobile-optimized toolbar with search input and optional filter button.
50209
+ * Filter button shows an active count badge when filters are applied.
50210
+ */
50211
+ var MobileToolbar = /*#__PURE__*/React.forwardRef(function (_a, ref) {
50212
+ var searchValue = _a.searchValue,
50213
+ onSearchChange = _a.onSearchChange,
50214
+ _a$searchPlaceholder = _a.searchPlaceholder,
50215
+ searchPlaceholder = _a$searchPlaceholder === void 0 ? 'Search...' : _a$searchPlaceholder,
50216
+ onFilterClick = _a.onFilterClick,
50217
+ activeFilterCount = _a.activeFilterCount,
50218
+ className = _a.className,
50219
+ props = __rest$1(_a, ["searchValue", "onSearchChange", "searchPlaceholder", "onFilterClick", "activeFilterCount", "className"]);
50220
+ return require$$1.jsxs("div", Object.assign({
50221
+ ref: ref,
50222
+ className: clsx('flex items-center gap-2', className)
50223
+ }, props, {
50224
+ children: [require$$1.jsxs("div", {
50225
+ className: "relative flex-1",
50226
+ children: [require$$1.jsxs("svg", {
50227
+ className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-mw-neutral-400",
50228
+ xmlns: "http://www.w3.org/2000/svg",
50229
+ viewBox: "0 0 24 24",
50230
+ fill: "none",
50231
+ stroke: "currentColor",
50232
+ strokeWidth: "2",
50233
+ strokeLinecap: "round",
50234
+ strokeLinejoin: "round",
50235
+ "aria-hidden": "true",
50236
+ children: [require$$1.jsx("circle", {
50237
+ cx: "11",
50238
+ cy: "11",
50239
+ r: "8"
50240
+ }), require$$1.jsx("path", {
50241
+ d: "m21 21-4.3-4.3"
50242
+ })]
50243
+ }), require$$1.jsx("input", {
50244
+ type: "search",
50245
+ role: "searchbox",
50246
+ value: searchValue,
50247
+ onChange: function onChange(e) {
50248
+ return onSearchChange(e.target.value);
50249
+ },
50250
+ placeholder: searchPlaceholder,
50251
+ className: clsx('w-full h-11 pl-10 pr-4 text-sm rounded-lg', 'border border-mw-neutral-200 bg-white', 'dark:border-mw-neutral-700 dark:bg-mw-neutral-800', 'text-mw-neutral-900 dark:text-mw-neutral-100', 'placeholder:text-mw-neutral-400 dark:placeholder:text-mw-neutral-500', 'focus:outline-none focus:ring-2 focus:ring-mw-primary-500 focus:border-mw-primary-500')
50252
+ })]
50253
+ }), onFilterClick && require$$1.jsxs("button", {
50254
+ type: "button",
50255
+ "aria-label": "Filters",
50256
+ onClick: onFilterClick,
50257
+ className: clsx('relative flex items-center justify-center h-11 w-11 rounded-lg', 'border border-mw-neutral-200 bg-white', 'dark:border-mw-neutral-700 dark:bg-mw-neutral-800', 'text-mw-neutral-700 dark:text-mw-neutral-300', 'hover:bg-mw-neutral-50 dark:hover:bg-mw-neutral-700'),
50258
+ children: [require$$1.jsxs("svg", {
50259
+ className: "h-5 w-5",
50260
+ xmlns: "http://www.w3.org/2000/svg",
50261
+ viewBox: "0 0 24 24",
50262
+ fill: "none",
50263
+ stroke: "currentColor",
50264
+ strokeWidth: "2",
50265
+ strokeLinecap: "round",
50266
+ strokeLinejoin: "round",
50267
+ "aria-hidden": "true",
50268
+ children: [require$$1.jsx("line", {
50269
+ x1: "4",
50270
+ x2: "4",
50271
+ y1: "21",
50272
+ y2: "14"
50273
+ }), require$$1.jsx("line", {
50274
+ x1: "4",
50275
+ x2: "4",
50276
+ y1: "10",
50277
+ y2: "3"
50278
+ }), require$$1.jsx("line", {
50279
+ x1: "12",
50280
+ x2: "12",
50281
+ y1: "21",
50282
+ y2: "12"
50283
+ }), require$$1.jsx("line", {
50284
+ x1: "12",
50285
+ x2: "12",
50286
+ y1: "8",
50287
+ y2: "3"
50288
+ }), require$$1.jsx("line", {
50289
+ x1: "20",
50290
+ x2: "20",
50291
+ y1: "21",
50292
+ y2: "16"
50293
+ }), require$$1.jsx("line", {
50294
+ x1: "20",
50295
+ x2: "20",
50296
+ y1: "12",
50297
+ y2: "3"
50298
+ }), require$$1.jsx("line", {
50299
+ x1: "2",
50300
+ x2: "6",
50301
+ y1: "14",
50302
+ y2: "14"
50303
+ }), require$$1.jsx("line", {
50304
+ x1: "10",
50305
+ x2: "14",
50306
+ y1: "8",
50307
+ y2: "8"
50308
+ }), require$$1.jsx("line", {
50309
+ x1: "18",
50310
+ x2: "22",
50311
+ y1: "16",
50312
+ y2: "16"
50313
+ })]
50314
+ }), activeFilterCount != null && activeFilterCount > 0 && require$$1.jsx("span", {
50315
+ className: "absolute -top-1 -right-1 flex h-5 w-5 items-center justify-center rounded-full bg-mw-primary-500 text-[10px] font-bold text-white",
50316
+ children: activeFilterCount
50317
+ })]
50318
+ })]
50319
+ }));
50320
+ });
50321
+ MobileToolbar.displayName = 'MobileToolbar';
50322
+
50323
+ /**
50324
+ * Renders children only on mobile (hidden on md+ screens).
50325
+ * Uses CSS-based visibility — both layouts are in the DOM.
50326
+ */
50327
+ var MobileOnly = /*#__PURE__*/React.forwardRef(function (_a, ref) {
50328
+ var children = _a.children,
50329
+ className = _a.className,
50330
+ props = __rest$1(_a, ["children", "className"]);
50331
+ return require$$1.jsx("div", Object.assign({
50332
+ ref: ref,
50333
+ className: clsx('md:hidden', className)
50334
+ }, props, {
50335
+ children: children
50336
+ }));
50337
+ });
50338
+ MobileOnly.displayName = 'MobileOnly';
50339
+
50340
+ /**
50341
+ * Renders children only on desktop (hidden below md breakpoint).
50342
+ * Uses CSS-based visibility — both layouts are in the DOM.
50343
+ */
50344
+ var DesktopOnly = /*#__PURE__*/React.forwardRef(function (_a, ref) {
50345
+ var children = _a.children,
50346
+ className = _a.className,
50347
+ props = __rest$1(_a, ["children", "className"]);
50348
+ return require$$1.jsx("div", Object.assign({
50349
+ ref: ref,
50350
+ className: clsx('hidden md:block', className)
50351
+ }, props, {
50352
+ children: children
50353
+ }));
50354
+ });
50355
+ DesktopOnly.displayName = 'DesktopOnly';
50356
+
50357
+ var breakpointRowClass = {
50358
+ sm: 'sm:flex-row',
50359
+ md: 'md:flex-row',
50360
+ lg: 'lg:flex-row',
50361
+ xl: 'xl:flex-row'
50362
+ };
50363
+ /**
50364
+ * Stacks children vertically on mobile, horizontally on desktop.
50365
+ * Replaces the common `flex flex-col md:flex-row` pattern.
50366
+ */
50367
+ var ResponsiveStack = /*#__PURE__*/React.forwardRef(function (_a, ref) {
50368
+ var _a$breakpoint = _a.breakpoint,
50369
+ breakpoint = _a$breakpoint === void 0 ? 'md' : _a$breakpoint,
50370
+ gap = _a.gap,
50371
+ _a$reverse = _a.reverse,
50372
+ reverse = _a$reverse === void 0 ? false : _a$reverse,
50373
+ children = _a.children,
50374
+ className = _a.className,
50375
+ props = __rest$1(_a, ["breakpoint", "gap", "reverse", "children", "className"]);
50376
+ return require$$1.jsx("div", Object.assign({
50377
+ ref: ref,
50378
+ className: clsx('flex', reverse ? 'flex-col-reverse' : 'flex-col', breakpointRowClass[breakpoint], gap != null && "gap-".concat(gap), className)
50379
+ }, props, {
50380
+ children: children
50381
+ }));
50382
+ });
50383
+ ResponsiveStack.displayName = 'ResponsiveStack';
50384
+
50385
+ /**
50386
+ * A collapsible panel for secondary information on mobile.
50387
+ * Wraps the design system Accordion for converting sidebar panels
50388
+ * (tips, insights, help text) into expandable sections.
50389
+ */
50390
+ var CollapsibleInfoPanel = /*#__PURE__*/React.forwardRef(function (_a, ref) {
50391
+ var title = _a.title,
50392
+ icon = _a.icon,
50393
+ _a$defaultOpen = _a.defaultOpen,
50394
+ defaultOpen = _a$defaultOpen === void 0 ? false : _a$defaultOpen,
50395
+ children = _a.children,
50396
+ className = _a.className,
50397
+ props = __rest$1(_a, ["title", "icon", "defaultOpen", "children", "className"]);
50398
+ return require$$1.jsx("div", Object.assign({
50399
+ ref: ref,
50400
+ className: clsx(className)
50401
+ }, props, {
50402
+ children: require$$1.jsx(Accordion, {
50403
+ type: "single",
50404
+ defaultValue: defaultOpen ? 'panel' : undefined,
50405
+ children: require$$1.jsxs(AccordionItem, {
50406
+ value: "panel",
50407
+ children: [require$$1.jsxs(AccordionTrigger, {
50408
+ className: clsx('flex items-center gap-2 text-sm font-medium', 'text-mw-neutral-900 dark:text-mw-neutral-100'),
50409
+ children: [icon && require$$1.jsx("span", {
50410
+ className: "flex-shrink-0",
50411
+ children: icon
50412
+ }), title]
50413
+ }), require$$1.jsx(AccordionContent, {
50414
+ children: require$$1.jsx("div", {
50415
+ className: "pt-2",
50416
+ children: children
50417
+ })
50418
+ })]
50419
+ })
50420
+ })
50421
+ }));
50422
+ });
50423
+ CollapsibleInfoPanel.displayName = 'CollapsibleInfoPanel';
50424
+
50425
+ /**
50426
+ * Renders content that is visually hidden but accessible to screen readers.
50427
+ * Use this instead of ad-hoc `sr-only` classes for consistent accessibility.
50428
+ */
50429
+ var VisuallyHidden = /*#__PURE__*/React.forwardRef(function (_a, ref) {
50430
+ var _a$as = _a.as,
50431
+ Component = _a$as === void 0 ? 'span' : _a$as,
50432
+ children = _a.children,
50433
+ style = _a.style,
50434
+ props = __rest$1(_a, ["as", "children", "style"]);
50435
+ return require$$1.jsx(Component, Object.assign({
50436
+ ref: ref,
50437
+ style: Object.assign({
50438
+ position: 'absolute',
50439
+ width: '1px',
50440
+ height: '1px',
50441
+ padding: 0,
50442
+ margin: '-1px',
50443
+ overflow: 'hidden',
50444
+ clip: 'rect(0, 0, 0, 0)',
50445
+ whiteSpace: 'nowrap',
50446
+ borderWidth: 0
50447
+ }, style)
50448
+ }, props, {
50449
+ children: children
50450
+ }));
50451
+ });
50452
+ VisuallyHidden.displayName = 'VisuallyHidden';
50453
+
50454
+ var FOCUSABLE_SELECTOR = 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"]):not([disabled])';
50455
+ /**
50456
+ * Traps keyboard focus within its children.
50457
+ * Use in modals, dialogs, and sheets to prevent focus from escaping.
50458
+ */
50459
+ var FocusScope = /*#__PURE__*/React.forwardRef(function (_a, _ref) {
50460
+ var _a$trapped = _a.trapped,
50461
+ trapped = _a$trapped === void 0 ? false : _a$trapped,
50462
+ _a$autoFocus = _a.autoFocus,
50463
+ autoFocus = _a$autoFocus === void 0 ? false : _a$autoFocus,
50464
+ onEscape = _a.onEscape,
50465
+ children = _a.children,
50466
+ className = _a.className,
50467
+ props = __rest$1(_a, ["trapped", "autoFocus", "onEscape", "children", "className"]);
50468
+ var containerRef = React.useRef(null);
50469
+ var getFocusableElements = React.useCallback(function () {
50470
+ if (!containerRef.current) return [];
50471
+ return Array.from(containerRef.current.querySelectorAll(FOCUSABLE_SELECTOR));
50472
+ }, []);
50473
+ React.useEffect(function () {
50474
+ if (!autoFocus || !containerRef.current) return;
50475
+ var focusable = getFocusableElements();
50476
+ if (focusable.length > 0) {
50477
+ focusable[0].focus();
50478
+ }
50479
+ }, [autoFocus, getFocusableElements]);
50480
+ React.useEffect(function () {
50481
+ if (!trapped || !containerRef.current) return;
50482
+ var handleKeyDown = function handleKeyDown(e) {
50483
+ if (e.key === 'Escape' && onEscape) {
50484
+ onEscape();
50485
+ return;
50486
+ }
50487
+ if (e.key !== 'Tab') return;
50488
+ var focusable = getFocusableElements();
50489
+ if (focusable.length === 0) return;
50490
+ var first = focusable[0];
50491
+ var last = focusable[focusable.length - 1];
50492
+ if (e.shiftKey) {
50493
+ if (document.activeElement === first) {
50494
+ e.preventDefault();
50495
+ last.focus();
50496
+ }
50497
+ } else {
50498
+ if (document.activeElement === last) {
50499
+ e.preventDefault();
50500
+ first.focus();
50501
+ }
50502
+ }
50503
+ };
50504
+ var container = containerRef.current;
50505
+ container.addEventListener('keydown', handleKeyDown);
50506
+ return function () {
50507
+ return container.removeEventListener('keydown', handleKeyDown);
50508
+ };
50509
+ }, [trapped, onEscape, getFocusableElements]);
50510
+ return require$$1.jsx("div", Object.assign({
50511
+ ref: function ref(node) {
50512
+ containerRef.current = node;
50513
+ if (typeof _ref === 'function') _ref(node);else if (_ref) _ref.current = node;
50514
+ },
50515
+ className: clsx(className)
50516
+ }, props, {
50517
+ children: children
50518
+ }));
50519
+ });
50520
+ FocusScope.displayName = 'FocusScope';
50521
+
49760
50522
  function PageHeader(_a) {
49761
50523
  var title = _a.title,
49762
50524
  description = _a.description,
@@ -57640,6 +58402,7 @@ exports.CodeSnippet = CodeSnippet;
57640
58402
  exports.Collapsible = Collapsible;
57641
58403
  exports.CollapsibleCode = CollapsibleCode;
57642
58404
  exports.CollapsibleContent = CollapsibleContent;
58405
+ exports.CollapsibleInfoPanel = CollapsibleInfoPanel;
57643
58406
  exports.CollapsibleTrigger = CollapsibleTrigger;
57644
58407
  exports.ColumnCustomizationDrawer = ColumnCustomizationDrawer;
57645
58408
  exports.Command = Command;
@@ -57653,6 +58416,7 @@ exports.DataGrid = DataGrid;
57653
58416
  exports.DatePicker = DatePicker;
57654
58417
  exports.DateRangePicker = DateRangePicker;
57655
58418
  exports.DescriptionList = DescriptionList;
58419
+ exports.DesktopOnly = DesktopOnly;
57656
58420
  exports.Dialog = Dialog;
57657
58421
  exports.DialogContent = DialogContent;
57658
58422
  exports.DialogDescription = DialogDescription;
@@ -57681,6 +58445,7 @@ exports.FileUpload = FileUpload;
57681
58445
  exports.Filter = Filter;
57682
58446
  exports.FlexContainer = FlexContainer;
57683
58447
  exports.FloatingElement = FloatingElement;
58448
+ exports.FocusScope = FocusScope;
57684
58449
  exports.Footer = Footer;
57685
58450
  exports.Form = Form;
57686
58451
  exports.FormActions = FormActions;
@@ -57722,6 +58487,10 @@ exports.MenuRadioItem = MenuRadioItem;
57722
58487
  exports.MenuSeparator = MenuSeparator;
57723
58488
  exports.MetricCard = MetricCard;
57724
58489
  exports.MinusIcon = MinusIcon;
58490
+ exports.MobileDataCard = MobileDataCard;
58491
+ exports.MobileOnly = MobileOnly;
58492
+ exports.MobilePagination = MobilePagination;
58493
+ exports.MobileToolbar = MobileToolbar;
57725
58494
  exports.Modal = Modal;
57726
58495
  exports.ModalBody = ModalBody;
57727
58496
  exports.ModalFooter = ModalFooter;
@@ -57754,6 +58523,7 @@ exports.RadioGroup = RadioGroup;
57754
58523
  exports.RadioGroupItem = RadioGroupItem;
57755
58524
  exports.Rating = Rating;
57756
58525
  exports.ResponsiveContainer = ResponsiveContainer;
58526
+ exports.ResponsiveStack = ResponsiveStack;
57757
58527
  exports.RichTextEditor = RichTextEditor;
57758
58528
  exports.ScheduleGrid = ScheduleGrid;
57759
58529
  exports.ScrollArea = ScrollArea;
@@ -57830,6 +58600,7 @@ exports.ToggleGroupItem = ToggleGroupItem;
57830
58600
  exports.Tooltip = Tooltip;
57831
58601
  exports.TreeView = TreeView;
57832
58602
  exports.VideoThumbnail = VideoThumbnail;
58603
+ exports.VisuallyHidden = VisuallyHidden;
57833
58604
  exports.borderRadius = borderRadius;
57834
58605
  exports.borderWidth = borderWidth;
57835
58606
  exports.breakpoints = breakpoints;
@@ -57849,6 +58620,8 @@ exports.shadows = shadows;
57849
58620
  exports.spacing = spacing;
57850
58621
  exports.tokens = tokens;
57851
58622
  exports.typography = typography;
58623
+ exports.useAdvancedTable = useAdvancedTable;
58624
+ exports.useCalendar = useCalendar;
57852
58625
  exports.useDragDrop = useDragDrop;
57853
58626
  exports.useFormContext = useFormContext;
57854
58627
  exports.useIconSearch = useIconSearch;