@moving-walls/design-system 1.0.24 → 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 (34) 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/Calendar/index.d.ts +3 -0
  5. package/dist/components/ui/Calendar/types.d.ts +14 -0
  6. package/dist/components/ui/Calendar/useCalendar.d.ts +26 -0
  7. package/dist/components/ui/CollapsibleInfoPanel.d.ts +12 -0
  8. package/dist/components/ui/DateRangePicker.d.ts +6 -1
  9. package/dist/components/ui/DesktopOnly.d.ts +8 -0
  10. package/dist/components/ui/DragDrop/DragDropZone.d.ts +14 -0
  11. package/dist/components/ui/DragDrop/FilePreview.d.ts +7 -0
  12. package/dist/components/ui/DragDrop/SortableList.d.ts +8 -0
  13. package/dist/components/ui/DragDrop/index.d.ts +9 -0
  14. package/dist/components/ui/DragDrop/types.d.ts +12 -0
  15. package/dist/components/ui/DragDrop/useDragDrop.d.ts +16 -0
  16. package/dist/components/ui/FocusScope.d.ts +14 -0
  17. package/dist/components/ui/MobileDataCard.d.ts +18 -0
  18. package/dist/components/ui/MobileOnly.d.ts +8 -0
  19. package/dist/components/ui/MobilePagination.d.ts +10 -0
  20. package/dist/components/ui/MobileToolbar.d.ts +12 -0
  21. package/dist/components/ui/ResponsiveStack.d.ts +14 -0
  22. package/dist/components/ui/ScheduleGrid.d.ts +6 -1
  23. package/dist/components/ui/TimeRangePicker.d.ts +8 -1
  24. package/dist/components/ui/VisuallyHidden.d.ts +10 -0
  25. package/dist/components/ui/index.d.ts +22 -0
  26. package/dist/hooks/index.d.ts +3 -0
  27. package/dist/hooks/useMediaQuery.d.ts +6 -0
  28. package/dist/hooks/useResponsiveSheet.d.ts +19 -0
  29. package/dist/index.esm.js +785 -28
  30. package/dist/index.esm.js.map +1 -1
  31. package/dist/index.js +794 -26
  32. package/dist/index.js.map +1 -1
  33. package/dist/tsconfig.build.tsbuildinfo +1 -1
  34. 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,
@@ -36488,8 +36499,8 @@ function CalendarMonth(_ref) {
36488
36499
  function DateRangePicker(_ref3) {
36489
36500
  var value = _ref3.value,
36490
36501
  onChange = _ref3.onChange,
36491
- _ref3$placeholder = _ref3.placeholder,
36492
- placeholder = _ref3$placeholder === void 0 ? 'Select date range' : _ref3$placeholder,
36502
+ placeholder = _ref3.placeholder,
36503
+ labels = _ref3.labels,
36493
36504
  _ref3$disabled = _ref3.disabled,
36494
36505
  disabled = _ref3$disabled === void 0 ? false : _ref3$disabled;
36495
36506
  _ref3.required;
@@ -36506,6 +36517,7 @@ function DateRangePicker(_ref3) {
36506
36517
  presets = _ref3$presets === void 0 ? defaultPresets$1 : _ref3$presets,
36507
36518
  _ref3$align = _ref3.align,
36508
36519
  align = _ref3$align === void 0 ? 'left' : _ref3$align;
36520
+ var _a, _b;
36509
36521
  var _useState = React.useState(false),
36510
36522
  _useState2 = _slicedToArray(_useState, 2),
36511
36523
  isOpen = _useState2[0],
@@ -36671,7 +36683,7 @@ function DateRangePicker(_ref3) {
36671
36683
  className: "flex items-center justify-between px-3 py-2 border-t border-mw-neutral-200 dark:border-mw-neutral-700",
36672
36684
  children: [require$$1.jsx("div", {
36673
36685
  className: "text-[11px] text-mw-neutral-500 dark:text-mw-neutral-400",
36674
- 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'
36675
36687
  }), require$$1.jsxs("div", {
36676
36688
  className: "flex gap-2 items-center",
36677
36689
  children: [require$$1.jsx("button", {
@@ -36832,8 +36844,7 @@ function TimePicker(_ref2) {
36832
36844
  label = _ref2.label,
36833
36845
  error = _ref2.error,
36834
36846
  helpText = _ref2.helpText,
36835
- _ref2$placeholder = _ref2.placeholder,
36836
- placeholder = _ref2$placeholder === void 0 ? 'Select time' : _ref2$placeholder,
36847
+ placeholder = _ref2.placeholder,
36837
36848
  className = _ref2.className,
36838
36849
  _ref2$size = _ref2.size,
36839
36850
  size = _ref2$size === void 0 ? 'md' : _ref2$size,
@@ -37199,8 +37210,7 @@ function TimeSelect(_ref) {
37199
37210
  function TimeRangePicker(_ref2) {
37200
37211
  var value = _ref2.value,
37201
37212
  onChange = _ref2.onChange,
37202
- _ref2$placeholder = _ref2.placeholder,
37203
- placeholder = _ref2$placeholder === void 0 ? 'Select time range' : _ref2$placeholder,
37213
+ placeholder = _ref2.placeholder,
37204
37214
  _ref2$disabled = _ref2.disabled,
37205
37215
  disabled = _ref2$disabled === void 0 ? false : _ref2$disabled;
37206
37216
  _ref2.required;
@@ -37213,8 +37223,10 @@ function TimeRangePicker(_ref2) {
37213
37223
  minTime = _ref2.minTime,
37214
37224
  maxTime = _ref2.maxTime,
37215
37225
  className = _ref2.className,
37226
+ labels = _ref2.labels,
37216
37227
  _ref2$presets = _ref2.presets,
37217
37228
  presets = _ref2$presets === void 0 ? defaultPresets : _ref2$presets;
37229
+ var _a, _b;
37218
37230
  var _useState5 = React.useState(value || {
37219
37231
  from: null,
37220
37232
  to: null
@@ -37351,13 +37363,13 @@ function TimeRangePicker(_ref2) {
37351
37363
  children: [require$$1.jsxs("div", {
37352
37364
  children: [require$$1.jsx("label", {
37353
37365
  className: "block text-sm font-medium mb-2 text-mw-neutral-900 dark:text-white",
37354
- children: "From Time"
37366
+ children: (_a = labels === null || labels === void 0 ? void 0 : labels.fromTime) !== null && _a !== void 0 ? _a : 'From Time'
37355
37367
  }), require$$1.jsx(TimeSelect, {
37356
37368
  value: selectedRange.from,
37357
37369
  onChange: handleFromTimeChange,
37358
37370
  options: timeOptions,
37359
37371
  format: format,
37360
- placeholder: "Select start time",
37372
+ placeholder: labels === null || labels === void 0 ? void 0 : labels.selectStart,
37361
37373
  disabled: disabled,
37362
37374
  minTime: minTime,
37363
37375
  maxTime: selectedRange.to ? format === '12' ? convertTo24Hour(selectedRange.to) : selectedRange.to : maxTime
@@ -37365,13 +37377,13 @@ function TimeRangePicker(_ref2) {
37365
37377
  }), require$$1.jsxs("div", {
37366
37378
  children: [require$$1.jsx("label", {
37367
37379
  className: "block text-sm font-medium mb-2 text-mw-neutral-900 dark:text-white",
37368
- children: "To Time"
37380
+ children: (_b = labels === null || labels === void 0 ? void 0 : labels.toTime) !== null && _b !== void 0 ? _b : 'To Time'
37369
37381
  }), require$$1.jsx(TimeSelect, {
37370
37382
  value: selectedRange.to,
37371
37383
  onChange: handleToTimeChange,
37372
37384
  options: timeOptions,
37373
37385
  format: format,
37374
- placeholder: "Select end time",
37386
+ placeholder: labels === null || labels === void 0 ? void 0 : labels.selectEnd,
37375
37387
  disabled: disabled || !selectedRange.from,
37376
37388
  minTime: selectedRange.from ? format === '12' ? convertTo24Hour(selectedRange.from) : selectedRange.from : minTime,
37377
37389
  maxTime: maxTime
@@ -38700,8 +38712,7 @@ function MultiSelect(_ref) {
38700
38712
  _ref$value = _ref.value,
38701
38713
  value = _ref$value === void 0 ? [] : _ref$value,
38702
38714
  onChange = _ref.onChange,
38703
- _ref$placeholder = _ref.placeholder,
38704
- placeholder = _ref$placeholder === void 0 ? 'Select...' : _ref$placeholder,
38715
+ placeholder = _ref.placeholder,
38705
38716
  label = _ref.label,
38706
38717
  _ref$disabled = _ref.disabled,
38707
38718
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
@@ -39158,7 +39169,8 @@ function ScheduleGrid(_ref) {
39158
39169
  _ref$presets = _ref.presets,
39159
39170
  presets = _ref$presets === void 0 ? DEFAULT_PRESETS : _ref$presets,
39160
39171
  _ref$showPresets = _ref.showPresets,
39161
- showPresets = _ref$showPresets === void 0 ? true : _ref$showPresets;
39172
+ showPresets = _ref$showPresets === void 0 ? true : _ref$showPresets,
39173
+ labels = _ref.labels;
39162
39174
  var _useState = React.useState('custom'),
39163
39175
  _useState2 = _slicedToArray(_useState, 2),
39164
39176
  selectedPreset = _useState2[0],
@@ -39281,6 +39293,7 @@ function ScheduleGrid(_ref) {
39281
39293
  onChange(newRules);
39282
39294
  };
39283
39295
  var renderHourGrid = function renderHourGrid(type, selectedHours) {
39296
+ var _a, _b;
39284
39297
  var allSelected = selectedHours.size === 24;
39285
39298
  var label = type === 'DEFAULT' ? 'Default Hours' : type === 'WEEKDAY' ? 'Weekday Hours (Mon-Fri)' : 'Weekend Hours (Sat-Sun)';
39286
39299
  var isExpanded = expandedSection === type.toLowerCase();
@@ -39315,7 +39328,7 @@ function ScheduleGrid(_ref) {
39315
39328
  return handleSelectAll(type);
39316
39329
  },
39317
39330
  className: "text-xs text-mw-primary-500 hover:text-mw-primary-600 font-medium",
39318
- 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'
39319
39332
  })
39320
39333
  }), require$$1.jsx("div", {
39321
39334
  className: "grid grid-cols-6 gap-1.5",
@@ -42925,6 +42938,221 @@ function AdvancedTable(_ref3) {
42925
42938
  });
42926
42939
  }
42927
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
+
42928
43156
  var emptyStateIcons = {
42929
43157
  noData: require$$1.jsx(Database, {
42930
43158
  className: "w-12 h-12 text-mw-neutral-400"
@@ -47119,6 +47347,121 @@ function DayView(_ref4) {
47119
47347
  });
47120
47348
  }
47121
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
+
47122
47465
  function cn$8() {
47123
47466
  for (var _len = arguments.length, classes = new Array(_len), _key = 0; _key < _len; _key++) {
47124
47467
  classes[_key] = arguments[_key];
@@ -49762,6 +50105,420 @@ function AgGridTableInner(props) {
49762
50105
  }
49763
50106
  var AgGridTable = AgGridTableInner;
49764
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
+
49765
50522
  function PageHeader(_a) {
49766
50523
  var title = _a.title,
49767
50524
  description = _a.description,
@@ -57645,6 +58402,7 @@ exports.CodeSnippet = CodeSnippet;
57645
58402
  exports.Collapsible = Collapsible;
57646
58403
  exports.CollapsibleCode = CollapsibleCode;
57647
58404
  exports.CollapsibleContent = CollapsibleContent;
58405
+ exports.CollapsibleInfoPanel = CollapsibleInfoPanel;
57648
58406
  exports.CollapsibleTrigger = CollapsibleTrigger;
57649
58407
  exports.ColumnCustomizationDrawer = ColumnCustomizationDrawer;
57650
58408
  exports.Command = Command;
@@ -57658,6 +58416,7 @@ exports.DataGrid = DataGrid;
57658
58416
  exports.DatePicker = DatePicker;
57659
58417
  exports.DateRangePicker = DateRangePicker;
57660
58418
  exports.DescriptionList = DescriptionList;
58419
+ exports.DesktopOnly = DesktopOnly;
57661
58420
  exports.Dialog = Dialog;
57662
58421
  exports.DialogContent = DialogContent;
57663
58422
  exports.DialogDescription = DialogDescription;
@@ -57686,6 +58445,7 @@ exports.FileUpload = FileUpload;
57686
58445
  exports.Filter = Filter;
57687
58446
  exports.FlexContainer = FlexContainer;
57688
58447
  exports.FloatingElement = FloatingElement;
58448
+ exports.FocusScope = FocusScope;
57689
58449
  exports.Footer = Footer;
57690
58450
  exports.Form = Form;
57691
58451
  exports.FormActions = FormActions;
@@ -57727,6 +58487,10 @@ exports.MenuRadioItem = MenuRadioItem;
57727
58487
  exports.MenuSeparator = MenuSeparator;
57728
58488
  exports.MetricCard = MetricCard;
57729
58489
  exports.MinusIcon = MinusIcon;
58490
+ exports.MobileDataCard = MobileDataCard;
58491
+ exports.MobileOnly = MobileOnly;
58492
+ exports.MobilePagination = MobilePagination;
58493
+ exports.MobileToolbar = MobileToolbar;
57730
58494
  exports.Modal = Modal;
57731
58495
  exports.ModalBody = ModalBody;
57732
58496
  exports.ModalFooter = ModalFooter;
@@ -57759,6 +58523,7 @@ exports.RadioGroup = RadioGroup;
57759
58523
  exports.RadioGroupItem = RadioGroupItem;
57760
58524
  exports.Rating = Rating;
57761
58525
  exports.ResponsiveContainer = ResponsiveContainer;
58526
+ exports.ResponsiveStack = ResponsiveStack;
57762
58527
  exports.RichTextEditor = RichTextEditor;
57763
58528
  exports.ScheduleGrid = ScheduleGrid;
57764
58529
  exports.ScrollArea = ScrollArea;
@@ -57835,6 +58600,7 @@ exports.ToggleGroupItem = ToggleGroupItem;
57835
58600
  exports.Tooltip = Tooltip;
57836
58601
  exports.TreeView = TreeView;
57837
58602
  exports.VideoThumbnail = VideoThumbnail;
58603
+ exports.VisuallyHidden = VisuallyHidden;
57838
58604
  exports.borderRadius = borderRadius;
57839
58605
  exports.borderWidth = borderWidth;
57840
58606
  exports.breakpoints = breakpoints;
@@ -57854,6 +58620,8 @@ exports.shadows = shadows;
57854
58620
  exports.spacing = spacing;
57855
58621
  exports.tokens = tokens;
57856
58622
  exports.typography = typography;
58623
+ exports.useAdvancedTable = useAdvancedTable;
58624
+ exports.useCalendar = useCalendar;
57857
58625
  exports.useDragDrop = useDragDrop;
57858
58626
  exports.useFormContext = useFormContext;
57859
58627
  exports.useIconSearch = useIconSearch;