@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.esm.js CHANGED
@@ -5976,9 +5976,29 @@ function Portal(_ref) {
5976
5976
  // Internal (not exported from the package). Shared focus management for the
5977
5977
  // overlay primitives (Drawer, Dialog, Popover, Tour, Sidebar, AppShell).
5978
5978
  var FOCUSABLE_SELECTOR = ["a[href]", "button:not([disabled])", "textarea:not([disabled])", "input:not([disabled])", "select:not([disabled])", '[tabindex]:not([tabindex="-1"])'].join(",");
5979
+ // A responsive drawer (Sidebar's `md:hidden`, AppShell's `lg:hidden`) can be
5980
+ // "open" while CSS hides it on wide viewports; there is nothing to trap then.
5981
+ // `stopAt` (exclusive) bounds the walk, so getFocusable checks only the
5982
+ // elements between a candidate and its root.
5983
+ var isDisplayNone = function isDisplayNone(el) {
5984
+ var stopAt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
5985
+ for (var node = el; node && node.nodeType === 1 && node !== stopAt; node = node.parentElement) {
5986
+ if (window.getComputedStyle(node).display === "none") return true;
5987
+ }
5988
+ return false;
5989
+ };
5990
+ // `.focus()` silently fails on an element that is not rendered (`display:none`
5991
+ // on it or an ancestor) or is `visibility:hidden` (inherited, so the element's
5992
+ // own computed value covers its ancestors). getClientRects() is not used:
5993
+ // jsdom reports empty rects for every element.
5994
+ var isRendered = function isRendered(el, root) {
5995
+ return window.getComputedStyle(el).visibility !== "hidden" && !isDisplayNone(el, root);
5996
+ };
5997
+ // Tabbable, rendered descendants of `root`, in DOM order. Used for the initial
5998
+ // focus and for the Tab trap's first/last items.
5979
5999
  var getFocusable = function getFocusable(root) {
5980
6000
  return root ? Array.from(root.querySelectorAll(FOCUSABLE_SELECTOR)).filter(function (el) {
5981
- return el.getAttribute("aria-hidden") !== "true";
6001
+ return el.getAttribute("aria-hidden") !== "true" && isRendered(el, root);
5982
6002
  }) : [];
5983
6003
  };
5984
6004
  // Only the most recently opened overlay reacts to Escape / Tab, so a Popover
@@ -5987,14 +6007,6 @@ var layerStack = [];
5987
6007
  var isTopLayer = function isTopLayer(token) {
5988
6008
  return layerStack[layerStack.length - 1] === token;
5989
6009
  };
5990
- // A responsive drawer (Sidebar's `md:hidden`, AppShell's `lg:hidden`) can be
5991
- // "open" while CSS hides it on wide viewports; there is nothing to trap then.
5992
- var isDisplayNone = function isDisplayNone(el) {
5993
- for (var node = el; node && node.nodeType === 1; node = node.parentElement) {
5994
- if (window.getComputedStyle(node).display === "none") return true;
5995
- }
5996
- return false;
5997
- };
5998
6010
  function cycleFocus(e, panel) {
5999
6011
  if (isDisplayNone(panel)) return;
6000
6012
  var focusables = getFocusable(panel);
@@ -6899,7 +6911,7 @@ var SheetCloseButton = function SheetCloseButton(_ref5) {
6899
6911
 
6900
6912
  var _excluded$Y = ["open", "isOpen", "placement", "title", "description", "showCloseButton", "haptics", "onSnapChange"],
6901
6913
  _excluded2$9 = ["className"],
6902
- _excluded3$4 = ["className"],
6914
+ _excluded3$5 = ["className"],
6903
6915
  _excluded4$3 = ["className"];
6904
6916
  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; }
6905
6917
  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; }
@@ -6987,7 +6999,7 @@ var SheetHeader = /*#__PURE__*/React__default.forwardRef(function (_ref3, ref) {
6987
6999
  });
6988
7000
  var SheetBody = /*#__PURE__*/React__default.forwardRef(function (_ref4, _ref5) {
6989
7001
  var className = _ref4.className,
6990
- props = _objectWithoutProperties$1(_ref4, _excluded3$4);
7002
+ props = _objectWithoutProperties$1(_ref4, _excluded3$5);
6991
7003
  var ctx = useContext(SheetContext);
6992
7004
  var dragProps = ctx ? mergeHandlers(ctx.bodyDragProps, props) : {};
6993
7005
  return jsx("div", _objectSpread$16(_objectSpread$16(_objectSpread$16({
@@ -7497,7 +7509,8 @@ var Select = /*#__PURE__*/React__default.forwardRef(function (_ref, forwardedRef
7497
7509
  return document.removeEventListener("mousedown", handleClickOutside);
7498
7510
  };
7499
7511
  }, []);
7500
- var showClearButton = allowClear && !disabled && selectedOptions.length > 0;
7512
+ var isEmpty = selectedOptions.length === 0;
7513
+ var showClearButton = allowClear && !disabled && !isEmpty;
7501
7514
  var displayValue = function displayValue() {
7502
7515
  var _selectedOptions$;
7503
7516
  if (multiSelect) {
@@ -7755,9 +7768,12 @@ var Select = /*#__PURE__*/React__default.forwardRef(function (_ref, forwardedRef
7755
7768
  "aria-invalid": error ? true : undefined,
7756
7769
  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, {
7757
7770
  "border-error-500 focus:ring-error-500": error,
7758
- "text-primary-500": !selectedOptions.length,
7771
+ // Empty: the placeholder reads muted, like Input's
7772
+ // ::placeholder (#159). `className` still merges last.
7773
+ "text-muted": isEmpty,
7759
7774
  "pr-14": showClearButton
7760
7775
  }, className),
7776
+ "data-empty": isEmpty ? "" : undefined,
7761
7777
  onClick: function onClick() {
7762
7778
  if (!disabled) {
7763
7779
  setIsOpen(function (prev) {
@@ -10646,7 +10662,7 @@ function FieldInput(_ref) {
10646
10662
  });
10647
10663
  }
10648
10664
 
10649
- 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"],
10665
+ 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"],
10650
10666
  _excluded2$8 = ["_key", "_isNew"];
10651
10667
  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; }
10652
10668
  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; }
@@ -10673,6 +10689,8 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
10673
10689
  selectable = _ref$selectable === void 0 ? false : _ref$selectable,
10674
10690
  _ref$pagination = _ref.pagination,
10675
10691
  pagination = _ref$pagination === void 0 ? false : _ref$pagination,
10692
+ _ref$paginationPositi = _ref.paginationPosition,
10693
+ paginationPosition = _ref$paginationPositi === void 0 ? "both" : _ref$paginationPositi,
10676
10694
  _ref$pageSize = _ref.pageSize,
10677
10695
  pageSize = _ref$pageSize === void 0 ? 25 : _ref$pageSize,
10678
10696
  onSort = _ref.onSort,
@@ -11810,6 +11828,12 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
11810
11828
  openSwipe: openSwipe,
11811
11829
  setOpenSwipe: setOpenSwipe
11812
11830
  };
11831
+ // Which pager(s) render when `pagination` is on: the toolbar's compact
11832
+ // PaginationHeader ("top"), the PaginationFooter ("bottom"), or both
11833
+ // (default). Unknown values fall back to "both" (#135).
11834
+ var pagerPosition = paginationPosition === "top" || paginationPosition === "bottom" ? paginationPosition : "both";
11835
+ var showHeaderPager = pagination && pagerPosition !== "bottom";
11836
+ var showFooterPager = pagination && pagerPosition !== "top";
11813
11837
  var showToolbarBar = showToolbar || interactive && (isDirty || !!renderAddRowButton || !!renderExternalAddRow);
11814
11838
  var renderAddRowClickableRow = useCallback(function () {
11815
11839
  return jsx("tr", {
@@ -11926,7 +11950,7 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
11926
11950
  }), showToolbar && jsxs("div", {
11927
11951
  className: "text-sm whitespace-nowrap",
11928
11952
  children: [resultRange.start, " - ", resultRange.end, " of ", resultRange.total, " ", "results"]
11929
- }), showToolbar && pagination && jsx(PaginationHeader, {
11953
+ }), showToolbar && showHeaderPager && jsx(PaginationHeader, {
11930
11954
  currentPage: pageIndex,
11931
11955
  totalPages: totalPages,
11932
11956
  onPageChange: handlePageChange,
@@ -12207,7 +12231,7 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
12207
12231
  }), TfootComponent && typeof TfootComponent === "function" ? jsx(TfootComponent, {
12208
12232
  columns: columnsState,
12209
12233
  data: filteredData
12210
- }) : TfootComponent, pagination && jsx(PaginationFooter, {
12234
+ }) : TfootComponent, showFooterPager && jsx(PaginationFooter, {
12211
12235
  currentPage: pageIndex,
12212
12236
  totalPages: totalPages,
12213
12237
  onPageChange: handlePageChange,
@@ -18193,10 +18217,13 @@ var DatePicker = /*#__PURE__*/React__default.forwardRef(function (_ref, forwarde
18193
18217
  "aria-invalid": error ? true : undefined,
18194
18218
  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", {
18195
18219
  "border-error-500 focus:ring-error-500": error,
18196
- "text-primary-500": !selected,
18220
+ // Empty: the placeholder reads muted, like Input's
18221
+ // ::placeholder (#159). `className` still merges last.
18222
+ "text-muted": !selected,
18197
18223
  // leave room for the sibling clear button overlaid on the field
18198
18224
  "pr-16": showClear && selected
18199
18225
  }, className),
18226
+ "data-empty": selected ? undefined : "",
18200
18227
  onClick: function onClick() {
18201
18228
  return setIsOpen(function (open) {
18202
18229
  return !open;
@@ -19164,7 +19191,7 @@ ColorPicker.displayName = "ColorPicker";
19164
19191
 
19165
19192
  var _excluded$P = ["fields", "onSubmit", "defaultValues", "validationSchema", "className", "submitText", "resetText", "submitButtonClass", "resetButtonClass", "showReset", "submitDisabled"],
19166
19193
  _excluded2$7 = ["type", "name", "label", "required", "options", "placeholder", "helperText"],
19167
- _excluded3$3 = ["onChange", "ref", "value"];
19194
+ _excluded3$4 = ["onChange", "ref", "value"];
19168
19195
  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; }
19169
19196
  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; }
19170
19197
  /**
@@ -19494,7 +19521,7 @@ var Form = /*#__PURE__*/forwardRef(function Form(_ref2, ref) {
19494
19521
  _onChange3 = _ref9$field.onChange,
19495
19522
  ref = _ref9$field.ref,
19496
19523
  value = _ref9$field.value,
19497
- field = _objectWithoutProperties$1(_ref9$field, _excluded3$3);
19524
+ field = _objectWithoutProperties$1(_ref9$field, _excluded3$4);
19498
19525
  return jsxs("div", {
19499
19526
  className: "w-full",
19500
19527
  children: [label && jsxs("label", {
@@ -20460,7 +20487,8 @@ var DateRangePicker = /*#__PURE__*/forwardRef(function DateRangePicker(_ref, ref
20460
20487
  }));
20461
20488
  };
20462
20489
  // Display placeholder until both start and end are committed (mandatory range).
20463
- var triggerText = committed.start && committed.end ? formatRange(committed.start, committed.end) : placeholder;
20490
+ var isEmpty = !committed.start || !committed.end;
20491
+ var triggerText = isEmpty ? placeholder : formatRange(committed.start, committed.end);
20464
20492
  var draftText = localStart && localEnd ? formatRange(localStart, localEnd) : placeholder;
20465
20493
  var presetList = Array.isArray(presets) && presets.length > 0 ? presets : null;
20466
20494
  var presetChips = presetList ? jsx("div", {
@@ -20540,9 +20568,12 @@ var DateRangePicker = /*#__PURE__*/forwardRef(function DateRangePicker(_ref, ref
20540
20568
  "aria-invalid": error ? true : undefined,
20541
20569
  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", {
20542
20570
  "border-error-500 focus:ring-error-500": error,
20543
- "text-primary-500": !committed.start || !committed.end,
20571
+ // Empty: the placeholder reads muted, like Input's
20572
+ // ::placeholder (#159). `className` still merges last.
20573
+ "text-muted": isEmpty,
20544
20574
  "pr-16": showClearButton
20545
20575
  }, className),
20576
+ "data-empty": isEmpty ? "" : undefined,
20546
20577
  onClick: function onClick() {
20547
20578
  // The trigger always toggles, even mid-pick (DTUI-35): closing
20548
20579
  // drops the uncommitted start, reopening starts from the last
@@ -25459,7 +25490,7 @@ var SearchField = /*#__PURE__*/React__default.forwardRef(function (_ref, ref) {
25459
25490
  });
25460
25491
  SearchField.displayName = "SearchField";
25461
25492
 
25462
- var _excluded$u = ["items", "collapsed", "onToggle", "className", "containerClassName", "stickyOffset", "logo", "footer", "user", "onUserClick", "drawerPosition", "isMobileOpen", "setIsMobileOpen", "showCollapsedTooltips", "tooltipOptions", "linkAs", "expandedIds", "defaultExpandedIds", "onExpandedChange", "swipeable"];
25493
+ var _excluded$u = ["items", "collapsed", "collapsible", "onToggle", "className", "containerClassName", "stickyOffset", "logo", "footer", "user", "onUserClick", "drawerPosition", "isMobileOpen", "setIsMobileOpen", "showCollapsedTooltips", "tooltipOptions", "linkAs", "expandedIds", "defaultExpandedIds", "onExpandedChange", "swipeable"];
25463
25494
  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; }
25464
25495
  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; }
25465
25496
  // From `md` up the sidebar is an in-flow sticky column; below it, the same
@@ -25628,6 +25659,8 @@ var hasBadge$1 = function hasBadge(item) {
25628
25659
  * - linkAs: element type used for items with `href` (default "a"; pass Next.js Link etc.)
25629
25660
  * - collapsed: boolean (desktop collapsed)
25630
25661
  * - onToggle: function to toggle collapse
25662
+ * - collapsible: boolean (default true) — false hides the md+ collapse/expand
25663
+ * toggle (the drawer keeps its "Close navigation" button)
25631
25664
  * - expandedIds / defaultExpandedIds / onExpandedChange: open groups (ids)
25632
25665
  * - className, containerClassName, stickyOffset, logo, footer, user, onUserClick
25633
25666
  * - drawerPosition: 'left' | 'right'
@@ -25644,6 +25677,8 @@ var Sidebar = /*#__PURE__*/React__default.forwardRef(function (_ref2, ref) {
25644
25677
  items = _ref2$items === void 0 ? [] : _ref2$items,
25645
25678
  _ref2$collapsed = _ref2.collapsed,
25646
25679
  collapsed = _ref2$collapsed === void 0 ? false : _ref2$collapsed,
25680
+ _ref2$collapsible = _ref2.collapsible,
25681
+ collapsible = _ref2$collapsible === void 0 ? true : _ref2$collapsible,
25647
25682
  onToggle = _ref2.onToggle,
25648
25683
  className = _ref2.className,
25649
25684
  containerClassName = _ref2.containerClassName,
@@ -25975,6 +26010,9 @@ var Sidebar = /*#__PURE__*/React__default.forwardRef(function (_ref2, ref) {
25975
26010
  if (drawerMode && mobileOpen && setIsMobileOpen) setIsMobileOpen(false);else onToggle === null || onToggle === void 0 || onToggle();
25976
26011
  };
25977
26012
  var toggleLabel = drawerMode ? "Close navigation" : effectiveCollapsed ? "Expand sidebar" : "Collapse sidebar";
26013
+ // `collapsible={false}`: no collapse/expand toggle on md+. The drawer keeps
26014
+ // its close button (44px touch target, the drawer's only visible close).
26015
+ var showToggle = drawerMode || collapsible;
25978
26016
  var CloseChevron = isRight ? ChevronRight : ChevronLeft;
25979
26017
  var toggleIcon = drawerMode ? jsx(CloseChevron, {
25980
26018
  className: "h-5 w-5",
@@ -26041,7 +26079,7 @@ var Sidebar = /*#__PURE__*/React__default.forwardRef(function (_ref2, ref) {
26041
26079
  children: [!effectiveCollapsed && logo && jsx("div", {
26042
26080
  className: "flex min-w-0 items-center",
26043
26081
  children: logo
26044
- }), jsx("button", {
26082
+ }), showToggle && jsx("button", {
26045
26083
  type: "button",
26046
26084
  onClick: handleToggleClick,
26047
26085
  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"),
@@ -26266,7 +26304,8 @@ var Avatar = /*#__PURE__*/React__default.forwardRef(function (_ref, ref) {
26266
26304
  Avatar.displayName = 'Avatar';
26267
26305
 
26268
26306
  var _excluded$r = ["emitter", "content", "notifications"],
26269
- _excluded2$5 = ["emitter", "logo", "center", "items", "user", "notifications", "searchable", "onSearch", "leftIcon", "rightMenuContent", "onLeftIconClick", "onLoginClick", "onLogoutClick", "className", "onFetch", "isMobileOpen", "setIsMobileOpen", "sticky", "largeTitle"];
26307
+ _excluded2$5 = ["emitter", "logo", "center", "items", "user", "notifications", "searchable", "onSearch", "leftIcon", "rightMenuContent", "onLeftIconClick", "leftIconLabel", "leftIconProps", "onLoginClick", "onLogoutClick", "className", "onFetch", "isMobileOpen", "setIsMobileOpen", "sticky", "largeTitle"],
26308
+ _excluded3$3 = ["className", "onClick"];
26270
26309
  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; }
26271
26310
  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; }
26272
26311
  var NO_NOTIFICATIONS = [];
@@ -26497,6 +26536,9 @@ var Navbar = /*#__PURE__*/React__default.forwardRef(function (_ref3, ref) {
26497
26536
  leftIcon = _ref3$leftIcon === void 0 ? jsx(ChevronLeft, {}) : _ref3$leftIcon,
26498
26537
  RightMenuContentProp = _ref3.rightMenuContent,
26499
26538
  onLeftIconClick = _ref3.onLeftIconClick,
26539
+ _ref3$leftIconLabel = _ref3.leftIconLabel,
26540
+ leftIconLabel = _ref3$leftIconLabel === void 0 ? "Go back" : _ref3$leftIconLabel,
26541
+ leftIconProps = _ref3.leftIconProps,
26500
26542
  _ref3$onLoginClick = _ref3.onLoginClick,
26501
26543
  onLoginClick = _ref3$onLoginClick === void 0 ? function () {
26502
26544
  return console.log("invoked onLoginClick");
@@ -26543,6 +26585,18 @@ var Navbar = /*#__PURE__*/React__default.forwardRef(function (_ref3, ref) {
26543
26585
  window.removeEventListener("resize", handleResize);
26544
26586
  };
26545
26587
  }, [handleResize]);
26588
+ // Left button: `leftIconLabel` names it ("Go back" by default; e.g. "Open
26589
+ // menu" when it opens a Sidebar drawer). `leftIconProps` lands on the
26590
+ // <button> (aria-expanded, aria-controls, data-*, …); its className merges
26591
+ // last and its onClick runs after `onLeftIconClick`.
26592
+ var _ref4 = leftIconProps || {},
26593
+ leftIconClassName = _ref4.className,
26594
+ leftIconOnClick = _ref4.onClick,
26595
+ leftIconRest = _objectWithoutProperties$1(_ref4, _excluded3$3);
26596
+ var handleLeftIconClick = function handleLeftIconClick(e) {
26597
+ onLeftIconClick === null || onLeftIconClick === void 0 || onLeftIconClick(e);
26598
+ leftIconOnClick === null || leftIconOnClick === void 0 || leftIconOnClick(e);
26599
+ };
26546
26600
  // Handle search submit
26547
26601
  var handleSearch = function handleSearch(e) {
26548
26602
  e.preventDefault();
@@ -26612,13 +26666,14 @@ var Navbar = /*#__PURE__*/React__default.forwardRef(function (_ref3, ref) {
26612
26666
  "aria-hidden": true
26613
26667
  }), jsxs("div", {
26614
26668
  className: "flex min-w-0 items-center",
26615
- children: [leftIcon !== false && jsx("button", {
26616
- onClick: onLeftIconClick,
26669
+ children: [leftIcon !== false && jsx("button", _objectSpread$w(_objectSpread$w({
26617
26670
  type: "button",
26618
- className: cn(ICON_BUTTON, "shrink-0 md:hidden"),
26619
- "aria-label": "Go back",
26671
+ "aria-label": leftIconLabel
26672
+ }, leftIconRest), {}, {
26673
+ onClick: handleLeftIconClick,
26674
+ className: cn(ICON_BUTTON, "shrink-0 md:hidden", leftIconClassName),
26620
26675
  children: leftIcon
26621
- }), logo && jsx("div", {
26676
+ })), logo && jsx("div", {
26622
26677
  className: "ml-2 min-w-0 truncate sm:ml-4 md:ml-0",
26623
26678
  children: logo
26624
26679
  })]
@@ -38858,6 +38913,10 @@ const {
38858
38913
  mergeConfig
38859
38914
  } = axios;
38860
38915
 
38916
+ var defaultIsUnauthorized = function defaultIsUnauthorized(error) {
38917
+ var _error$response;
38918
+ return (error === null || error === void 0 || (_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 401;
38919
+ };
38861
38920
  var useApi = function useApi() {
38862
38921
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
38863
38922
  var _props$BASE_URL = props.BASE_URL,
@@ -38892,7 +38951,10 @@ var useApi = function useApi() {
38892
38951
  headers: headers
38893
38952
  });
38894
38953
  }
38895
- } : _props$sendRequest;
38954
+ } : _props$sendRequest,
38955
+ onUnauthorized = props.onUnauthorized,
38956
+ _props$isUnauthorized = props.isUnauthorized,
38957
+ isUnauthorized = _props$isUnauthorized === void 0 ? defaultIsUnauthorized : _props$isUnauthorized;
38896
38958
  var _useState = useState(null),
38897
38959
  _useState2 = _slicedToArray(_useState, 2),
38898
38960
  data = _useState2[0],
@@ -38909,20 +38971,25 @@ var useApi = function useApi() {
38909
38971
  _useState8 = _slicedToArray(_useState7, 2),
38910
38972
  lastRequest = _useState8[0],
38911
38973
  setLastRequest = _useState8[1];
38912
- var fetchData = /*#__PURE__*/function () {
38913
- var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(url, method, data, headers) {
38914
- var options,
38915
- _options$needLoading,
38916
- needLoading,
38917
- requestInstance,
38918
- response,
38919
- _error,
38920
- _args = arguments,
38921
- _t;
38974
+ // Runs `onUnauthorized` for a failed request. Never throws: a failing
38975
+ // predicate or handler must not replace the request's own error.
38976
+ var notifyUnauthorized = function notifyUnauthorized(error, request) {
38977
+ if (!onUnauthorized) return;
38978
+ try {
38979
+ if (isUnauthorized(error)) onUnauthorized(error, request);
38980
+ } catch (handlerError) {
38981
+ // eslint-disable-next-line no-console
38982
+ console.error('useApi: onUnauthorized / isUnauthorized threw', handlerError);
38983
+ }
38984
+ };
38985
+ // Single send path for fetchData and callApi, so `onUnauthorized` fires
38986
+ // exactly once per failing request and sees the `apiKey` when there is one.
38987
+ var request = /*#__PURE__*/function () {
38988
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(url, method, data, headers, options, apiKey) {
38989
+ var _options$needLoading, needLoading, requestInstance, response, _error, _t;
38922
38990
  return _regeneratorRuntime.wrap(function (_context) {
38923
38991
  while (1) switch (_context.prev = _context.next) {
38924
38992
  case 0:
38925
- options = _args.length > 4 && _args[4] !== undefined ? _args[4] : {};
38926
38993
  _options$needLoading = options.needLoading, needLoading = _options$needLoading === void 0 ? true : _options$needLoading;
38927
38994
  requestInstance = createRequestInstance(BASE_URL, DEFAULT_HEADERS);
38928
38995
  if (needLoading) setLoading(true);
@@ -38938,6 +39005,11 @@ var useApi = function useApi() {
38938
39005
  _t = _context["catch"](1);
38939
39006
  _error = _t;
38940
39007
  setError(_error);
39008
+ notifyUnauthorized(_error, {
39009
+ apiKey: apiKey,
39010
+ url: url,
39011
+ method: String(method).toUpperCase()
39012
+ });
38941
39013
  throw _error;
38942
39014
  case 4:
38943
39015
  _context.prev = 4;
@@ -38949,10 +39021,14 @@ var useApi = function useApi() {
38949
39021
  }
38950
39022
  }, _callee, null, [[1, 3, 4, 5]]);
38951
39023
  }));
38952
- return function fetchData(_x, _x2, _x3, _x4) {
39024
+ return function request(_x, _x2, _x3, _x4, _x5, _x6) {
38953
39025
  return _ref.apply(this, arguments);
38954
39026
  };
38955
39027
  }();
39028
+ var fetchData = function fetchData(url, method, data, headers) {
39029
+ var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
39030
+ return request(url, method, data, headers, options);
39031
+ };
38956
39032
  var callApi = /*#__PURE__*/function () {
38957
39033
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(apiKey, args, needLoading) {
38958
39034
  var apiResolve, _apiResolve, url, method, headers, payload;
@@ -38969,9 +39045,9 @@ var useApi = function useApi() {
38969
39045
  _apiResolve = apiResolve.apply(void 0, _toConsumableArray$1(args)), url = _apiResolve.url, method = _apiResolve.method, headers = _apiResolve.headers, payload = _apiResolve.data;
38970
39046
  _context2.prev = 2;
38971
39047
  _context2.next = 3;
38972
- return fetchData(url, method, payload, headers, {
39048
+ return request(url, method, payload, headers, {
38973
39049
  needLoading: needLoading
38974
- });
39050
+ }, apiKey);
38975
39051
  case 3:
38976
39052
  return _context2.abrupt("return", _context2.sent);
38977
39053
  case 4:
@@ -38984,7 +39060,7 @@ var useApi = function useApi() {
38984
39060
  }
38985
39061
  }, _callee2, null, [[2,, 4, 5]]);
38986
39062
  }));
38987
- return function callApi(_x5, _x6, _x7) {
39063
+ return function callApi(_x7, _x8, _x9) {
38988
39064
  return _ref2.apply(this, arguments);
38989
39065
  };
38990
39066
  }();