@dreamtree-org/twreact-ui 2.0.2 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -5996,9 +5996,29 @@ function Portal(_ref) {
5996
5996
  // Internal (not exported from the package). Shared focus management for the
5997
5997
  // overlay primitives (Drawer, Dialog, Popover, Tour, Sidebar, AppShell).
5998
5998
  var FOCUSABLE_SELECTOR = ["a[href]", "button:not([disabled])", "textarea:not([disabled])", "input:not([disabled])", "select:not([disabled])", '[tabindex]:not([tabindex="-1"])'].join(",");
5999
+ // A responsive drawer (Sidebar's `md:hidden`, AppShell's `lg:hidden`) can be
6000
+ // "open" while CSS hides it on wide viewports; there is nothing to trap then.
6001
+ // `stopAt` (exclusive) bounds the walk, so getFocusable checks only the
6002
+ // elements between a candidate and its root.
6003
+ var isDisplayNone = function isDisplayNone(el) {
6004
+ var stopAt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
6005
+ for (var node = el; node && node.nodeType === 1 && node !== stopAt; node = node.parentElement) {
6006
+ if (window.getComputedStyle(node).display === "none") return true;
6007
+ }
6008
+ return false;
6009
+ };
6010
+ // `.focus()` silently fails on an element that is not rendered (`display:none`
6011
+ // on it or an ancestor) or is `visibility:hidden` (inherited, so the element's
6012
+ // own computed value covers its ancestors). getClientRects() is not used:
6013
+ // jsdom reports empty rects for every element.
6014
+ var isRendered = function isRendered(el, root) {
6015
+ return window.getComputedStyle(el).visibility !== "hidden" && !isDisplayNone(el, root);
6016
+ };
6017
+ // Tabbable, rendered descendants of `root`, in DOM order. Used for the initial
6018
+ // focus and for the Tab trap's first/last items.
5999
6019
  var getFocusable = function getFocusable(root) {
6000
6020
  return root ? Array.from(root.querySelectorAll(FOCUSABLE_SELECTOR)).filter(function (el) {
6001
- return el.getAttribute("aria-hidden") !== "true";
6021
+ return el.getAttribute("aria-hidden") !== "true" && isRendered(el, root);
6002
6022
  }) : [];
6003
6023
  };
6004
6024
  // Only the most recently opened overlay reacts to Escape / Tab, so a Popover
@@ -6007,14 +6027,6 @@ var layerStack = [];
6007
6027
  var isTopLayer = function isTopLayer(token) {
6008
6028
  return layerStack[layerStack.length - 1] === token;
6009
6029
  };
6010
- // A responsive drawer (Sidebar's `md:hidden`, AppShell's `lg:hidden`) can be
6011
- // "open" while CSS hides it on wide viewports; there is nothing to trap then.
6012
- var isDisplayNone = function isDisplayNone(el) {
6013
- for (var node = el; node && node.nodeType === 1; node = node.parentElement) {
6014
- if (window.getComputedStyle(node).display === "none") return true;
6015
- }
6016
- return false;
6017
- };
6018
6030
  function cycleFocus(e, panel) {
6019
6031
  if (isDisplayNone(panel)) return;
6020
6032
  var focusables = getFocusable(panel);
@@ -6919,7 +6931,7 @@ var SheetCloseButton = function SheetCloseButton(_ref5) {
6919
6931
 
6920
6932
  var _excluded$Y = ["open", "isOpen", "placement", "title", "description", "showCloseButton", "haptics", "onSnapChange"],
6921
6933
  _excluded2$9 = ["className"],
6922
- _excluded3$4 = ["className"],
6934
+ _excluded3$5 = ["className"],
6923
6935
  _excluded4$3 = ["className"];
6924
6936
  function ownKeys$16(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6925
6937
  function _objectSpread$16(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$16(Object(t), true).forEach(function (r) { _defineProperty$4(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$16(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -7007,7 +7019,7 @@ var SheetHeader = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
7007
7019
  });
7008
7020
  var SheetBody = /*#__PURE__*/React.forwardRef(function (_ref4, _ref5) {
7009
7021
  var className = _ref4.className,
7010
- props = _objectWithoutProperties$1(_ref4, _excluded3$4);
7022
+ props = _objectWithoutProperties$1(_ref4, _excluded3$5);
7011
7023
  var ctx = React.useContext(SheetContext);
7012
7024
  var dragProps = ctx ? mergeHandlers(ctx.bodyDragProps, props) : {};
7013
7025
  return jsxRuntime.jsx("div", _objectSpread$16(_objectSpread$16(_objectSpread$16({
@@ -7517,7 +7529,8 @@ var Select = /*#__PURE__*/React.forwardRef(function (_ref, forwardedRef) {
7517
7529
  return document.removeEventListener("mousedown", handleClickOutside);
7518
7530
  };
7519
7531
  }, []);
7520
- var showClearButton = allowClear && !disabled && selectedOptions.length > 0;
7532
+ var isEmpty = selectedOptions.length === 0;
7533
+ var showClearButton = allowClear && !disabled && !isEmpty;
7521
7534
  var displayValue = function displayValue() {
7522
7535
  var _selectedOptions$;
7523
7536
  if (multiSelect) {
@@ -7775,9 +7788,12 @@ var Select = /*#__PURE__*/React.forwardRef(function (_ref, forwardedRef) {
7775
7788
  "aria-invalid": error ? true : undefined,
7776
7789
  className: cn("flex w-full items-center justify-between rounded-md border border-gray-300 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent disabled:cursor-not-allowed disabled:opacity-50", SIZE_CLASSES$3[size] || SIZE_CLASSES$3.md, {
7777
7790
  "border-error-500 focus:ring-error-500": error,
7778
- "text-primary-500": !selectedOptions.length,
7791
+ // Empty: the placeholder reads muted, like Input's
7792
+ // ::placeholder (#159). `className` still merges last.
7793
+ "text-muted": isEmpty,
7779
7794
  "pr-14": showClearButton
7780
7795
  }, className),
7796
+ "data-empty": isEmpty ? "" : undefined,
7781
7797
  onClick: function onClick() {
7782
7798
  if (!disabled) {
7783
7799
  setIsOpen(function (prev) {
@@ -10666,7 +10682,7 @@ function FieldInput(_ref) {
10666
10682
  });
10667
10683
  }
10668
10684
 
10669
- var _excluded$U = ["data", "columns", "sortable", "filterable", "selectable", "pagination", "pageSize", "onSort", "onFilter", "onFetch", "onFilterChange", "onSelectionChange", "onRowClick", "hasDetails", "DetailsComponent", "className", "withAction", "onAction", "actions", "replaceDefaultActions", "showSerial", "cellClass", "rowClass", "globalSearch", "limitOptions", "showLimitSelector", "onLimitChange", "showReloadButton", "renderReloadButton", "onReload", "stripedRows", "theme", "responsiveBreakpoint", "showToolbar", "showColumnPicker", "wrapCells", "mobileMaxFields", "serverSide", "totalRecords", "pageNumber", "onPageChange", "TheadComponent", "TfootComponent", "interactive", "onSave", "onEdit", "onRowAdd", "onRowDelete", "editKeyBinding", "newRowPosition", "addRowRef", "onInitAddRow", "renderAddRowButton", "renderExternalAddRow", "actionMenuPresentation", "defaultMobileView", "mobileFiltersPresentation", "swipeActions", "stickyHeader"],
10685
+ var _excluded$U = ["data", "columns", "sortable", "filterable", "selectable", "pagination", "paginationPosition", "pageSize", "onSort", "onFilter", "onFetch", "onFilterChange", "onSelectionChange", "onRowClick", "hasDetails", "DetailsComponent", "className", "withAction", "onAction", "actions", "replaceDefaultActions", "showSerial", "cellClass", "rowClass", "globalSearch", "limitOptions", "showLimitSelector", "onLimitChange", "showReloadButton", "renderReloadButton", "onReload", "stripedRows", "theme", "responsiveBreakpoint", "showToolbar", "showColumnPicker", "wrapCells", "mobileMaxFields", "serverSide", "totalRecords", "pageNumber", "onPageChange", "TheadComponent", "TfootComponent", "interactive", "onSave", "onEdit", "onRowAdd", "onRowDelete", "editKeyBinding", "newRowPosition", "addRowRef", "onInitAddRow", "renderAddRowButton", "renderExternalAddRow", "actionMenuPresentation", "defaultMobileView", "mobileFiltersPresentation", "swipeActions", "stickyHeader"],
10670
10686
  _excluded2$8 = ["_key", "_isNew"];
10671
10687
  function ownKeys$_(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10672
10688
  function _objectSpread$_(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$_(Object(t), true).forEach(function (r) { _defineProperty$4(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$_(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -10693,6 +10709,8 @@ var Table = /*#__PURE__*/React.forwardRef(function Table(_ref, ref) {
10693
10709
  selectable = _ref$selectable === void 0 ? false : _ref$selectable,
10694
10710
  _ref$pagination = _ref.pagination,
10695
10711
  pagination = _ref$pagination === void 0 ? false : _ref$pagination,
10712
+ _ref$paginationPositi = _ref.paginationPosition,
10713
+ paginationPosition = _ref$paginationPositi === void 0 ? "both" : _ref$paginationPositi,
10696
10714
  _ref$pageSize = _ref.pageSize,
10697
10715
  pageSize = _ref$pageSize === void 0 ? 25 : _ref$pageSize,
10698
10716
  onSort = _ref.onSort,
@@ -11830,6 +11848,12 @@ var Table = /*#__PURE__*/React.forwardRef(function Table(_ref, ref) {
11830
11848
  openSwipe: openSwipe,
11831
11849
  setOpenSwipe: setOpenSwipe
11832
11850
  };
11851
+ // Which pager(s) render when `pagination` is on: the toolbar's compact
11852
+ // PaginationHeader ("top"), the PaginationFooter ("bottom"), or both
11853
+ // (default). Unknown values fall back to "both" (#135).
11854
+ var pagerPosition = paginationPosition === "top" || paginationPosition === "bottom" ? paginationPosition : "both";
11855
+ var showHeaderPager = pagination && pagerPosition !== "bottom";
11856
+ var showFooterPager = pagination && pagerPosition !== "top";
11833
11857
  var showToolbarBar = showToolbar || interactive && (isDirty || !!renderAddRowButton || !!renderExternalAddRow);
11834
11858
  var renderAddRowClickableRow = React.useCallback(function () {
11835
11859
  return jsxRuntime.jsx("tr", {
@@ -11946,7 +11970,7 @@ var Table = /*#__PURE__*/React.forwardRef(function Table(_ref, ref) {
11946
11970
  }), showToolbar && jsxRuntime.jsxs("div", {
11947
11971
  className: "text-sm whitespace-nowrap",
11948
11972
  children: [resultRange.start, " - ", resultRange.end, " of ", resultRange.total, " ", "results"]
11949
- }), showToolbar && pagination && jsxRuntime.jsx(PaginationHeader, {
11973
+ }), showToolbar && showHeaderPager && jsxRuntime.jsx(PaginationHeader, {
11950
11974
  currentPage: pageIndex,
11951
11975
  totalPages: totalPages,
11952
11976
  onPageChange: handlePageChange,
@@ -12227,7 +12251,7 @@ var Table = /*#__PURE__*/React.forwardRef(function Table(_ref, ref) {
12227
12251
  }), TfootComponent && typeof TfootComponent === "function" ? jsxRuntime.jsx(TfootComponent, {
12228
12252
  columns: columnsState,
12229
12253
  data: filteredData
12230
- }) : TfootComponent, pagination && jsxRuntime.jsx(PaginationFooter, {
12254
+ }) : TfootComponent, showFooterPager && jsxRuntime.jsx(PaginationFooter, {
12231
12255
  currentPage: pageIndex,
12232
12256
  totalPages: totalPages,
12233
12257
  onPageChange: handlePageChange,
@@ -18213,10 +18237,13 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, forwardedRef) {
18213
18237
  "aria-invalid": error ? true : undefined,
18214
18238
  className: cn("flex w-full items-center justify-between rounded-md border border-gray-300 bg-white px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent disabled:cursor-not-allowed disabled:opacity-50", {
18215
18239
  "border-error-500 focus:ring-error-500": error,
18216
- "text-primary-500": !selected,
18240
+ // Empty: the placeholder reads muted, like Input's
18241
+ // ::placeholder (#159). `className` still merges last.
18242
+ "text-muted": !selected,
18217
18243
  // leave room for the sibling clear button overlaid on the field
18218
18244
  "pr-16": showClear && selected
18219
18245
  }, className),
18246
+ "data-empty": selected ? undefined : "",
18220
18247
  onClick: function onClick() {
18221
18248
  return setIsOpen(function (open) {
18222
18249
  return !open;
@@ -19184,7 +19211,7 @@ ColorPicker.displayName = "ColorPicker";
19184
19211
 
19185
19212
  var _excluded$P = ["fields", "onSubmit", "defaultValues", "validationSchema", "className", "submitText", "resetText", "submitButtonClass", "resetButtonClass", "showReset", "submitDisabled"],
19186
19213
  _excluded2$7 = ["type", "name", "label", "required", "options", "placeholder", "helperText"],
19187
- _excluded3$3 = ["onChange", "ref", "value"];
19214
+ _excluded3$4 = ["onChange", "ref", "value"];
19188
19215
  function ownKeys$U(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
19189
19216
  function _objectSpread$U(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$U(Object(t), true).forEach(function (r) { _defineProperty$4(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$U(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
19190
19217
  /**
@@ -19514,7 +19541,7 @@ var Form = /*#__PURE__*/React.forwardRef(function Form(_ref2, ref) {
19514
19541
  _onChange3 = _ref9$field.onChange,
19515
19542
  ref = _ref9$field.ref,
19516
19543
  value = _ref9$field.value,
19517
- field = _objectWithoutProperties$1(_ref9$field, _excluded3$3);
19544
+ field = _objectWithoutProperties$1(_ref9$field, _excluded3$4);
19518
19545
  return jsxRuntime.jsxs("div", {
19519
19546
  className: "w-full",
19520
19547
  children: [label && jsxRuntime.jsxs("label", {
@@ -20480,7 +20507,8 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function DateRangePicker(_re
20480
20507
  }));
20481
20508
  };
20482
20509
  // Display placeholder until both start and end are committed (mandatory range).
20483
- var triggerText = committed.start && committed.end ? formatRange(committed.start, committed.end) : placeholder;
20510
+ var isEmpty = !committed.start || !committed.end;
20511
+ var triggerText = isEmpty ? placeholder : formatRange(committed.start, committed.end);
20484
20512
  var draftText = localStart && localEnd ? formatRange(localStart, localEnd) : placeholder;
20485
20513
  var presetList = Array.isArray(presets) && presets.length > 0 ? presets : null;
20486
20514
  var presetChips = presetList ? jsxRuntime.jsx("div", {
@@ -20560,9 +20588,12 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function DateRangePicker(_re
20560
20588
  "aria-invalid": error ? true : undefined,
20561
20589
  className: cn("flex w-full items-center justify-between rounded-md border border-gray-300 bg-white px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent disabled:cursor-not-allowed disabled:opacity-50", {
20562
20590
  "border-error-500 focus:ring-error-500": error,
20563
- "text-primary-500": !committed.start || !committed.end,
20591
+ // Empty: the placeholder reads muted, like Input's
20592
+ // ::placeholder (#159). `className` still merges last.
20593
+ "text-muted": isEmpty,
20564
20594
  "pr-16": showClearButton
20565
20595
  }, className),
20596
+ "data-empty": isEmpty ? "" : undefined,
20566
20597
  onClick: function onClick() {
20567
20598
  // The trigger always toggles, even mid-pick (DTUI-35): closing
20568
20599
  // drops the uncommitted start, reopening starts from the last
@@ -25479,7 +25510,7 @@ var SearchField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
25479
25510
  });
25480
25511
  SearchField.displayName = "SearchField";
25481
25512
 
25482
- var _excluded$u = ["items", "collapsed", "onToggle", "className", "containerClassName", "stickyOffset", "logo", "footer", "user", "onUserClick", "drawerPosition", "isMobileOpen", "setIsMobileOpen", "showCollapsedTooltips", "tooltipOptions", "linkAs", "expandedIds", "defaultExpandedIds", "onExpandedChange", "swipeable"];
25513
+ var _excluded$u = ["items", "collapsed", "collapsible", "onToggle", "className", "containerClassName", "stickyOffset", "logo", "footer", "user", "onUserClick", "drawerPosition", "isMobileOpen", "setIsMobileOpen", "showCollapsedTooltips", "tooltipOptions", "linkAs", "expandedIds", "defaultExpandedIds", "onExpandedChange", "swipeable"];
25483
25514
  function ownKeys$z(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
25484
25515
  function _objectSpread$z(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$z(Object(t), true).forEach(function (r) { _defineProperty$4(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$z(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
25485
25516
  // From `md` up the sidebar is an in-flow sticky column; below it, the same
@@ -25648,6 +25679,8 @@ var hasBadge$1 = function hasBadge(item) {
25648
25679
  * - linkAs: element type used for items with `href` (default "a"; pass Next.js Link etc.)
25649
25680
  * - collapsed: boolean (desktop collapsed)
25650
25681
  * - onToggle: function to toggle collapse
25682
+ * - collapsible: boolean (default true) — false hides the md+ collapse/expand
25683
+ * toggle (the drawer keeps its "Close navigation" button)
25651
25684
  * - expandedIds / defaultExpandedIds / onExpandedChange: open groups (ids)
25652
25685
  * - className, containerClassName, stickyOffset, logo, footer, user, onUserClick
25653
25686
  * - drawerPosition: 'left' | 'right'
@@ -25664,6 +25697,8 @@ var Sidebar = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
25664
25697
  items = _ref2$items === void 0 ? [] : _ref2$items,
25665
25698
  _ref2$collapsed = _ref2.collapsed,
25666
25699
  collapsed = _ref2$collapsed === void 0 ? false : _ref2$collapsed,
25700
+ _ref2$collapsible = _ref2.collapsible,
25701
+ collapsible = _ref2$collapsible === void 0 ? true : _ref2$collapsible,
25667
25702
  onToggle = _ref2.onToggle,
25668
25703
  className = _ref2.className,
25669
25704
  containerClassName = _ref2.containerClassName,
@@ -25995,6 +26030,9 @@ var Sidebar = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
25995
26030
  if (drawerMode && mobileOpen && setIsMobileOpen) setIsMobileOpen(false);else onToggle === null || onToggle === void 0 || onToggle();
25996
26031
  };
25997
26032
  var toggleLabel = drawerMode ? "Close navigation" : effectiveCollapsed ? "Expand sidebar" : "Collapse sidebar";
26033
+ // `collapsible={false}`: no collapse/expand toggle on md+. The drawer keeps
26034
+ // its close button (44px touch target, the drawer's only visible close).
26035
+ var showToggle = drawerMode || collapsible;
25998
26036
  var CloseChevron = isRight ? ChevronRight : ChevronLeft;
25999
26037
  var toggleIcon = drawerMode ? jsxRuntime.jsx(CloseChevron, {
26000
26038
  className: "h-5 w-5",
@@ -26061,7 +26099,7 @@ var Sidebar = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
26061
26099
  children: [!effectiveCollapsed && logo && jsxRuntime.jsx("div", {
26062
26100
  className: "flex min-w-0 items-center",
26063
26101
  children: logo
26064
- }), jsxRuntime.jsx("button", {
26102
+ }), showToggle && jsxRuntime.jsx("button", {
26065
26103
  type: "button",
26066
26104
  onClick: handleToggleClick,
26067
26105
  className: cn("inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-md", "hover:bg-gray-100 dark:hover:bg-gray-800", "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500"),
@@ -26286,7 +26324,8 @@ var Avatar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
26286
26324
  Avatar.displayName = 'Avatar';
26287
26325
 
26288
26326
  var _excluded$r = ["emitter", "content", "notifications"],
26289
- _excluded2$5 = ["emitter", "logo", "center", "items", "user", "notifications", "searchable", "onSearch", "leftIcon", "rightMenuContent", "onLeftIconClick", "onLoginClick", "onLogoutClick", "className", "onFetch", "isMobileOpen", "setIsMobileOpen", "sticky", "largeTitle"];
26327
+ _excluded2$5 = ["emitter", "logo", "center", "items", "user", "notifications", "searchable", "onSearch", "leftIcon", "rightMenuContent", "onLeftIconClick", "leftIconLabel", "leftIconProps", "onLoginClick", "onLogoutClick", "className", "onFetch", "isMobileOpen", "setIsMobileOpen", "sticky", "largeTitle"],
26328
+ _excluded3$3 = ["className", "onClick"];
26290
26329
  function ownKeys$w(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
26291
26330
  function _objectSpread$w(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$w(Object(t), true).forEach(function (r) { _defineProperty$4(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$w(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
26292
26331
  var NO_NOTIFICATIONS = [];
@@ -26517,6 +26556,9 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
26517
26556
  leftIcon = _ref3$leftIcon === void 0 ? jsxRuntime.jsx(ChevronLeft, {}) : _ref3$leftIcon,
26518
26557
  RightMenuContentProp = _ref3.rightMenuContent,
26519
26558
  onLeftIconClick = _ref3.onLeftIconClick,
26559
+ _ref3$leftIconLabel = _ref3.leftIconLabel,
26560
+ leftIconLabel = _ref3$leftIconLabel === void 0 ? "Go back" : _ref3$leftIconLabel,
26561
+ leftIconProps = _ref3.leftIconProps,
26520
26562
  _ref3$onLoginClick = _ref3.onLoginClick,
26521
26563
  onLoginClick = _ref3$onLoginClick === void 0 ? function () {
26522
26564
  return console.log("invoked onLoginClick");
@@ -26563,6 +26605,18 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
26563
26605
  window.removeEventListener("resize", handleResize);
26564
26606
  };
26565
26607
  }, [handleResize]);
26608
+ // Left button: `leftIconLabel` names it ("Go back" by default; e.g. "Open
26609
+ // menu" when it opens a Sidebar drawer). `leftIconProps` lands on the
26610
+ // <button> (aria-expanded, aria-controls, data-*, …); its className merges
26611
+ // last and its onClick runs after `onLeftIconClick`.
26612
+ var _ref4 = leftIconProps || {},
26613
+ leftIconClassName = _ref4.className,
26614
+ leftIconOnClick = _ref4.onClick,
26615
+ leftIconRest = _objectWithoutProperties$1(_ref4, _excluded3$3);
26616
+ var handleLeftIconClick = function handleLeftIconClick(e) {
26617
+ onLeftIconClick === null || onLeftIconClick === void 0 || onLeftIconClick(e);
26618
+ leftIconOnClick === null || leftIconOnClick === void 0 || leftIconOnClick(e);
26619
+ };
26566
26620
  // Handle search submit
26567
26621
  var handleSearch = function handleSearch(e) {
26568
26622
  e.preventDefault();
@@ -26632,13 +26686,14 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
26632
26686
  "aria-hidden": true
26633
26687
  }), jsxRuntime.jsxs("div", {
26634
26688
  className: "flex min-w-0 items-center",
26635
- children: [leftIcon !== false && jsxRuntime.jsx("button", {
26636
- onClick: onLeftIconClick,
26689
+ children: [leftIcon !== false && jsxRuntime.jsx("button", _objectSpread$w(_objectSpread$w({
26637
26690
  type: "button",
26638
- className: cn(ICON_BUTTON, "shrink-0 md:hidden"),
26639
- "aria-label": "Go back",
26691
+ "aria-label": leftIconLabel
26692
+ }, leftIconRest), {}, {
26693
+ onClick: handleLeftIconClick,
26694
+ className: cn(ICON_BUTTON, "shrink-0 md:hidden", leftIconClassName),
26640
26695
  children: leftIcon
26641
- }), logo && jsxRuntime.jsx("div", {
26696
+ })), logo && jsxRuntime.jsx("div", {
26642
26697
  className: "ml-2 min-w-0 truncate sm:ml-4 md:ml-0",
26643
26698
  children: logo
26644
26699
  })]
@@ -38878,6 +38933,10 @@ const {
38878
38933
  mergeConfig
38879
38934
  } = axios;
38880
38935
 
38936
+ var defaultIsUnauthorized = function defaultIsUnauthorized(error) {
38937
+ var _error$response;
38938
+ return (error === null || error === void 0 || (_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 401;
38939
+ };
38881
38940
  var useApi = function useApi() {
38882
38941
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
38883
38942
  var _props$BASE_URL = props.BASE_URL,
@@ -38912,7 +38971,10 @@ var useApi = function useApi() {
38912
38971
  headers: headers
38913
38972
  });
38914
38973
  }
38915
- } : _props$sendRequest;
38974
+ } : _props$sendRequest,
38975
+ onUnauthorized = props.onUnauthorized,
38976
+ _props$isUnauthorized = props.isUnauthorized,
38977
+ isUnauthorized = _props$isUnauthorized === void 0 ? defaultIsUnauthorized : _props$isUnauthorized;
38916
38978
  var _useState = React.useState(null),
38917
38979
  _useState2 = _slicedToArray(_useState, 2),
38918
38980
  data = _useState2[0],
@@ -38929,20 +38991,25 @@ var useApi = function useApi() {
38929
38991
  _useState8 = _slicedToArray(_useState7, 2),
38930
38992
  lastRequest = _useState8[0],
38931
38993
  setLastRequest = _useState8[1];
38932
- var fetchData = /*#__PURE__*/function () {
38933
- var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(url, method, data, headers) {
38934
- var options,
38935
- _options$needLoading,
38936
- needLoading,
38937
- requestInstance,
38938
- response,
38939
- _error,
38940
- _args = arguments,
38941
- _t;
38994
+ // Runs `onUnauthorized` for a failed request. Never throws: a failing
38995
+ // predicate or handler must not replace the request's own error.
38996
+ var notifyUnauthorized = function notifyUnauthorized(error, request) {
38997
+ if (!onUnauthorized) return;
38998
+ try {
38999
+ if (isUnauthorized(error)) onUnauthorized(error, request);
39000
+ } catch (handlerError) {
39001
+ // eslint-disable-next-line no-console
39002
+ console.error('useApi: onUnauthorized / isUnauthorized threw', handlerError);
39003
+ }
39004
+ };
39005
+ // Single send path for fetchData and callApi, so `onUnauthorized` fires
39006
+ // exactly once per failing request and sees the `apiKey` when there is one.
39007
+ var request = /*#__PURE__*/function () {
39008
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(url, method, data, headers, options, apiKey) {
39009
+ var _options$needLoading, needLoading, requestInstance, response, _error, _t;
38942
39010
  return _regeneratorRuntime.wrap(function (_context) {
38943
39011
  while (1) switch (_context.prev = _context.next) {
38944
39012
  case 0:
38945
- options = _args.length > 4 && _args[4] !== undefined ? _args[4] : {};
38946
39013
  _options$needLoading = options.needLoading, needLoading = _options$needLoading === void 0 ? true : _options$needLoading;
38947
39014
  requestInstance = createRequestInstance(BASE_URL, DEFAULT_HEADERS);
38948
39015
  if (needLoading) setLoading(true);
@@ -38958,6 +39025,11 @@ var useApi = function useApi() {
38958
39025
  _t = _context["catch"](1);
38959
39026
  _error = _t;
38960
39027
  setError(_error);
39028
+ notifyUnauthorized(_error, {
39029
+ apiKey: apiKey,
39030
+ url: url,
39031
+ method: String(method).toUpperCase()
39032
+ });
38961
39033
  throw _error;
38962
39034
  case 4:
38963
39035
  _context.prev = 4;
@@ -38969,10 +39041,14 @@ var useApi = function useApi() {
38969
39041
  }
38970
39042
  }, _callee, null, [[1, 3, 4, 5]]);
38971
39043
  }));
38972
- return function fetchData(_x, _x2, _x3, _x4) {
39044
+ return function request(_x, _x2, _x3, _x4, _x5, _x6) {
38973
39045
  return _ref.apply(this, arguments);
38974
39046
  };
38975
39047
  }();
39048
+ var fetchData = function fetchData(url, method, data, headers) {
39049
+ var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
39050
+ return request(url, method, data, headers, options);
39051
+ };
38976
39052
  var callApi = /*#__PURE__*/function () {
38977
39053
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(apiKey, args, needLoading) {
38978
39054
  var apiResolve, _apiResolve, url, method, headers, payload;
@@ -38989,9 +39065,9 @@ var useApi = function useApi() {
38989
39065
  _apiResolve = apiResolve.apply(void 0, _toConsumableArray$1(args)), url = _apiResolve.url, method = _apiResolve.method, headers = _apiResolve.headers, payload = _apiResolve.data;
38990
39066
  _context2.prev = 2;
38991
39067
  _context2.next = 3;
38992
- return fetchData(url, method, payload, headers, {
39068
+ return request(url, method, payload, headers, {
38993
39069
  needLoading: needLoading
38994
- });
39070
+ }, apiKey);
38995
39071
  case 3:
38996
39072
  return _context2.abrupt("return", _context2.sent);
38997
39073
  case 4:
@@ -39004,7 +39080,7 @@ var useApi = function useApi() {
39004
39080
  }
39005
39081
  }, _callee2, null, [[2,, 4, 5]]);
39006
39082
  }));
39007
- return function callApi(_x5, _x6, _x7) {
39083
+ return function callApi(_x7, _x8, _x9) {
39008
39084
  return _ref2.apply(this, arguments);
39009
39085
  };
39010
39086
  }();
@@ -366,6 +366,7 @@ export interface TableProps<T = any> extends BaseComponentProps {
366
366
  filterable?: boolean;
367
367
  selectable?: boolean;
368
368
  pagination?: boolean;
369
+ paginationPosition?: 'top' | 'bottom' | 'both';
369
370
  pageSize?: number;
370
371
  onSort?: (key: string, direction: 'asc' | 'desc') => void;
371
372
  onFilter?: (filters: Record<string, any>) => void;
@@ -591,7 +592,11 @@ export interface NavbarProps extends BaseComponentProps {
591
592
  searchable?: boolean;
592
593
  onSearch?: (term: string) => void;
593
594
  leftIcon?: ReactNode | false;
594
- onLeftIconClick?: () => void;
595
+ onLeftIconClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
596
+ /** Accessible name of the left button. Default `"Go back"`; e.g. `"Open navigation"` when it opens a Sidebar drawer. */
597
+ leftIconLabel?: string;
598
+ /** Extra props spread onto the left `<button>` (e.g. `aria-expanded`, `aria-controls`). `className` merges last; `onClick` runs after `onLeftIconClick`. */
599
+ leftIconProps?: ButtonHTMLAttributes<HTMLButtonElement> & Record<`data-${string}`, string | undefined>;
595
600
  onLoginClick?: () => void;
596
601
  onLogoutClick?: () => void;
597
602
  rightMenuContent?: ReactNode | ((props: {
@@ -605,6 +610,8 @@ export interface NavbarProps extends BaseComponentProps {
605
610
  export interface SidebarProps extends BaseComponentProps {
606
611
  items: SidebarItem[];
607
612
  collapsed?: boolean;
613
+ /** `false` hides the md+ collapse/expand toggle (the phone drawer keeps its 44px "Close navigation" button). Default `true`. */
614
+ collapsible?: boolean;
608
615
  onToggle?: () => void;
609
616
  logo?: ReactNode;
610
617
  user?: UserInfo;