@blerp/design 1.3.17 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/dist/cjs/Blerp/BlerpImageRow.js +176 -57
  2. package/dist/cjs/Blerp/BlerpSavePopup.js +44 -40
  3. package/dist/cjs/Blerp/BlerpTitleRow.js +36 -19
  4. package/dist/cjs/Blerp/BlerpTopRow.js +110 -44
  5. package/dist/cjs/Blerp.js +9 -16
  6. package/dist/cjs/BlerpAudioContextProvider.js +2 -2
  7. package/dist/cjs/BlerpListView.js +318 -168
  8. package/dist/cjs/BlerpListViewPremium.js +155 -130
  9. package/dist/cjs/BlerpListViewSkeleton.js +60 -13
  10. package/dist/cjs/BlerpSkeleton.js +32 -9
  11. package/dist/cjs/CollectionCard.js +139 -60
  12. package/dist/cjs/CollectionListViewPremium.js +368 -297
  13. package/dist/cjs/CollectionSkeleton.js +74 -13
  14. package/dist/cjs/Dropdown.js +272 -172
  15. package/dist/cjs/EllipsisLoader.js +66 -21
  16. package/dist/cjs/GroupCard.js +64 -57
  17. package/dist/cjs/Icons/Icons.js +288 -426
  18. package/dist/cjs/ImageEditor.js +247 -0
  19. package/dist/cjs/ImageUpload.js +226 -0
  20. package/dist/cjs/NewBlerp.js +354 -160
  21. package/dist/cjs/NewBlerpTest.js +10 -792
  22. package/dist/cjs/NewCollectionModal.js +294 -310
  23. package/dist/cjs/PremiumCollectionCard.js +191 -454
  24. package/dist/cjs/PurchaseModals/CheckoutModal.js +1 -1
  25. package/dist/cjs/PurchaseModals/PremiumBlerpCheckoutModal.js +1 -1
  26. package/dist/cjs/PurchaseModals/PremiumCollectionCheckoutModal.js +1 -1
  27. package/dist/cjs/PurchaseModals/PremiumSubscriptionCheckoutModal.js +1 -1
  28. package/dist/cjs/ReactionButtons.js +26 -13
  29. package/dist/cjs/SnackbarContextProvider.js +200 -116
  30. package/dist/cjs/Theme.js +217 -90
  31. package/dist/cjs/Toggle.js +86 -32
  32. package/dist/cjs/UserCard.js +13 -32
  33. package/dist/cjs/UserPage/LibraryControls.js +180 -93
  34. package/dist/cjs/UserPage/UserLibraryHeader.js +23 -14
  35. package/dist/cjs/UserPage/UserProfileHeader.js +120 -105
  36. package/dist/cjs/UsernameWithPopout.js +12 -8
  37. package/dist/cjs/colors.js +15 -8
  38. package/dist/cjs/helpers.js +131 -0
  39. package/dist/cjs/index.js +92 -58
  40. package/dist/cjs/neo-components/Autocomplete.js +280 -0
  41. package/dist/cjs/neo-components/BottomNavigation.js +120 -0
  42. package/dist/cjs/neo-components/Box.js +48 -0
  43. package/dist/cjs/neo-components/Button.js +206 -0
  44. package/dist/cjs/neo-components/CircularProgress.js +92 -0
  45. package/dist/cjs/neo-components/Container.js +75 -0
  46. package/dist/cjs/neo-components/Dialog.js +441 -0
  47. package/dist/cjs/neo-components/Fab.js +237 -0
  48. package/dist/cjs/neo-components/FormControls.js +1057 -0
  49. package/dist/cjs/neo-components/Grid.js +256 -0
  50. package/dist/cjs/neo-components/IconButton.js +111 -0
  51. package/dist/cjs/neo-components/Input.js +493 -0
  52. package/dist/cjs/neo-components/Layout.js +1213 -0
  53. package/dist/cjs/neo-components/Misc.js +858 -0
  54. package/dist/cjs/neo-components/Navigation.js +1578 -0
  55. package/dist/cjs/neo-components/Paper.js +256 -0
  56. package/dist/cjs/neo-components/Stack.js +194 -0
  57. package/dist/cjs/neo-components/Stepper.js +291 -0
  58. package/dist/cjs/neo-components/Text.js +290 -0
  59. package/dist/cjs/neo-components/ThemeProvider.js +731 -0
  60. package/dist/cjs/neo-components/ToggleButton.js +223 -0
  61. package/dist/cjs/neo-components/createTheme.js +306 -0
  62. package/dist/cjs/neo-components/withSx.js +164 -0
  63. package/dist/cjs/neo-utils/sxToStyle.js +508 -0
  64. package/dist/esm/Blerp/BlerpImageRow.js +166 -46
  65. package/dist/esm/Blerp/BlerpSavePopup.js +35 -27
  66. package/dist/esm/Blerp/BlerpTitleRow.js +32 -13
  67. package/dist/esm/Blerp/BlerpTopRow.js +85 -16
  68. package/dist/esm/Blerp.js +4 -12
  69. package/dist/esm/BlerpAudioContextProvider.js +1 -2
  70. package/dist/esm/BlerpListView.js +313 -160
  71. package/dist/esm/BlerpListViewPremium.js +135 -109
  72. package/dist/esm/BlerpListViewSkeleton.js +60 -11
  73. package/dist/esm/BlerpSkeleton.js +32 -7
  74. package/dist/esm/CollectionCard.js +118 -38
  75. package/dist/esm/CollectionListViewPremium.js +367 -294
  76. package/dist/esm/CollectionSkeleton.js +73 -11
  77. package/dist/esm/Dropdown.js +260 -161
  78. package/dist/esm/EllipsisLoader.js +63 -18
  79. package/dist/esm/GroupCard.js +54 -46
  80. package/dist/esm/Icons/Icons.js +226 -367
  81. package/dist/esm/ImageEditor.js +240 -0
  82. package/dist/esm/ImageUpload.js +217 -0
  83. package/dist/esm/NewBlerp.js +282 -79
  84. package/dist/esm/NewBlerpTest.js +11 -781
  85. package/dist/esm/NewCollectionModal.js +289 -304
  86. package/dist/esm/PremiumCollectionCard.js +192 -451
  87. package/dist/esm/PurchaseModals/CheckoutModal.js +1 -1
  88. package/dist/esm/PurchaseModals/PremiumBlerpCheckoutModal.js +1 -1
  89. package/dist/esm/PurchaseModals/PremiumCollectionCheckoutModal.js +1 -1
  90. package/dist/esm/PurchaseModals/PremiumSubscriptionCheckoutModal.js +1 -1
  91. package/dist/esm/ReactionButtons.js +23 -8
  92. package/dist/esm/SnackbarContextProvider.js +196 -110
  93. package/dist/esm/Theme.js +187 -66
  94. package/dist/esm/Toggle.js +84 -29
  95. package/dist/esm/UserCard.js +1 -20
  96. package/dist/esm/UserPage/LibraryControls.js +159 -65
  97. package/dist/esm/UserPage/UserLibraryHeader.js +18 -10
  98. package/dist/esm/UserPage/UserProfileHeader.js +100 -79
  99. package/dist/esm/UsernameWithPopout.js +7 -4
  100. package/dist/esm/colors.js +11 -9
  101. package/dist/esm/helpers.js +122 -0
  102. package/dist/esm/icons.js +1 -1
  103. package/dist/esm/index.js +32 -2
  104. package/dist/esm/neo-components/Autocomplete.js +269 -0
  105. package/dist/esm/neo-components/BottomNavigation.js +109 -0
  106. package/dist/esm/neo-components/Box.js +36 -0
  107. package/dist/esm/neo-components/Button.js +194 -0
  108. package/dist/esm/neo-components/CircularProgress.js +81 -0
  109. package/dist/esm/neo-components/Container.js +63 -0
  110. package/dist/esm/neo-components/Dialog.js +423 -0
  111. package/dist/esm/neo-components/Fab.js +225 -0
  112. package/dist/esm/neo-components/FormControls.js +1041 -0
  113. package/dist/esm/neo-components/Grid.js +244 -0
  114. package/dist/esm/neo-components/IconButton.js +99 -0
  115. package/dist/esm/neo-components/Input.js +478 -0
  116. package/dist/esm/neo-components/Layout.js +1179 -0
  117. package/dist/esm/neo-components/Misc.js +840 -0
  118. package/dist/esm/neo-components/Navigation.js +1556 -0
  119. package/dist/esm/neo-components/Paper.js +243 -0
  120. package/dist/esm/neo-components/Stack.js +182 -0
  121. package/dist/esm/neo-components/Stepper.js +278 -0
  122. package/dist/esm/neo-components/Text.js +277 -0
  123. package/dist/esm/neo-components/ThemeProvider.js +718 -0
  124. package/dist/esm/neo-components/ToggleButton.js +214 -0
  125. package/dist/esm/neo-components/createTheme.js +297 -0
  126. package/dist/esm/neo-components/withSx.js +153 -0
  127. package/dist/esm/neo-utils/sxToStyle.js +502 -0
  128. package/package.json +19 -15
@@ -0,0 +1,1578 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _extends = require('@babel/runtime/helpers/extends');
6
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
7
+ var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
8
+ var React = require('react');
9
+ var ReactDOM = require('react-dom');
10
+ var withSx = require('./withSx.js');
11
+ var ThemeProvider = require('./ThemeProvider.js');
12
+
13
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
14
+
15
+ var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
16
+ var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
17
+ var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties);
18
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
19
+
20
+ const _excluded = ["open", "onClose", "anchorEl", "anchorOrigin", "transformOrigin", "children", "MenuListProps", "PaperProps", "disablePortal", "keepMounted", "autoFocus", "style"],
21
+ _excluded2 = ["selected", "disabled", "dense", "divider", "onClick", "children", "style"],
22
+ _excluded3 = ["value", "onChange", "children", "variant", "orientation", "centered", "textColor", "indicatorColor", "scrollButtons", "TabIndicatorProps", "style"],
23
+ _excluded4 = ["label", "value", "icon", "iconPosition", "disabled", "selected", "onClick", "textColor", "fullWidth", "wrapped", "disableRipple", "style"],
24
+ _excluded5 = ["severity", "variant", "color", "icon", "action", "onClose", "children", "style"],
25
+ _excluded6 = ["children", "style"],
26
+ _excluded7 = ["open", "onClose", "autoHideDuration", "message", "action", "anchorOrigin", "resumeHideDuration", "disableWindowBlurListener", "TransitionComponent", "transitionDuration", "children", "style"],
27
+ _excluded8 = ["open", "onClose", "anchorEl", "anchorOrigin", "transformOrigin", "anchorPosition", "anchorReference", "marginThreshold", "children", "PaperProps", "TransitionComponent", "transitionDuration", "disablePortal", "keepMounted", "onClick", "style"],
28
+ _excluded9 = ["open", "onClose", "anchor", "variant", "elevation", "hideBackdrop", "ModalProps", "PaperProps", "SlideProps", "transitionDuration", "children", "style"],
29
+ _excluded10 = ["children", "title", "placement", "arrow", "enterDelay", "leaveDelay", "disableHoverListener", "disableFocusListener", "disableTouchListener", "open", "onOpen", "onClose", "componentsProps", "slotProps", "PopperProps"],
30
+ _excluded11 = ["orientation", "variant", "flexItem", "light", "textAlign", "children", "component", "style"];
31
+
32
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
33
+
34
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
35
+ /**
36
+ * Context to detect if we're inside a Popover
37
+ */
38
+
39
+ const PopoverContext = /*#__PURE__*/React.createContext(false);
40
+ /**
41
+ * Context to track nested overlay elements (modals opened from popovers, etc.)
42
+ * This allows click-outside detection to ignore clicks on nested overlays
43
+ */
44
+
45
+ const OverlayStackContext = /*#__PURE__*/React.createContext({
46
+ registerOverlay: () => () => {},
47
+ isClickInsideOverlay: () => false
48
+ });
49
+ /**
50
+ * Hook to register an overlay element with the stack
51
+ */
52
+
53
+ const useOverlayStack = () => React.useContext(OverlayStackContext);
54
+ /**
55
+ * Resolve a theme color path like "grey7.real" to actual hex value
56
+ */
57
+
58
+ function resolveThemeColor(value, colors) {
59
+ if (typeof value !== "string") return value;
60
+ if (!value.includes(".")) return value;
61
+ if (value.startsWith("#") || value.startsWith("rgb") || value.startsWith("hsl")) return value;
62
+ if (value.startsWith("url(") || value.startsWith("http")) return value;
63
+ if (value.includes("px") || value.includes("%") || value.includes("rem") || value.includes("em")) return value;
64
+ const parts = value.split(".");
65
+ let result = colors;
66
+
67
+ for (const part of parts) {
68
+ if (result && typeof result === "object" && part in result) {
69
+ result = result[part];
70
+ } else {
71
+ return value; // Path not found, return original
72
+ }
73
+ }
74
+
75
+ return typeof result === "string" ? result : value;
76
+ }
77
+ /**
78
+ * Recursively resolve all theme color references in a style/sx object
79
+ */
80
+
81
+
82
+ function resolveStyleColors(style, colors) {
83
+ if (!style || typeof style !== "object") return style;
84
+ if (Array.isArray(style)) return style.map(s => resolveStyleColors(s, colors));
85
+ const result = {};
86
+
87
+ for (const [key, value] of Object.entries(style)) {
88
+ if (typeof value === "function") {
89
+ result[key] = value;
90
+ } else if (typeof value === "object" && value !== null) {
91
+ result[key] = resolveStyleColors(value, colors);
92
+ } else if (typeof value === "string") {
93
+ result[key] = resolveThemeColor(value, colors);
94
+ } else {
95
+ result[key] = value;
96
+ }
97
+ }
98
+
99
+ return result;
100
+ }
101
+ /**
102
+ * Helper function to check if a click target is inside a NESTED overlay/portal
103
+ * (i.e., a modal opened from within a popover)
104
+ * This should NOT detect the popover itself, only higher-level overlays like modals
105
+ */
106
+
107
+
108
+ function isClickInsideAnyOverlay(target, excludeElement) {
109
+ let element = target;
110
+
111
+ while (element && element !== document.body) {
112
+ // Skip if this is the element we're checking from (the popover itself)
113
+ if (excludeElement && excludeElement.contains(element)) {
114
+ element = element.parentElement;
115
+ continue;
116
+ } // Check for role="dialog" or role="alertdialog" (modals - these are HIGHER than popovers)
117
+
118
+
119
+ const role = element.getAttribute("role");
120
+
121
+ if (role === "dialog" || role === "alertdialog") {
122
+ return true;
123
+ } // Check for data attributes commonly used for modals/overlays
124
+
125
+
126
+ if (element.hasAttribute("data-modal") || element.hasAttribute("data-overlay") || element.hasAttribute("data-radix-portal") || element.classList.contains("modal") || element.classList.contains("MuiModal-root") || element.classList.contains("MuiDialog-root")) {
127
+ return true;
128
+ } // Check for high z-index elements - but only ABOVE popover level (1400+)
129
+
130
+
131
+ const style = window.getComputedStyle(element);
132
+ const zIndex = parseInt(style.zIndex, 10);
133
+
134
+ if (zIndex >= 1400) {
135
+ return true;
136
+ }
137
+
138
+ element = element.parentElement;
139
+ }
140
+
141
+ return false;
142
+ }
143
+ /**
144
+ * Menu - Dropdown menu (replaces MUI Menu)
145
+ *
146
+ * When used standalone: creates its own portal and handles positioning
147
+ * When used inside Popover: just renders the menu list (no portal, no positioning)
148
+ */
149
+
150
+
151
+ const BaseMenu = /*#__PURE__*/React__default["default"].forwardRef((_ref2, ref) => {
152
+ let {
153
+ open,
154
+ onClose,
155
+ anchorEl,
156
+ anchorOrigin = {
157
+ vertical: "bottom",
158
+ horizontal: "left"
159
+ },
160
+ transformOrigin = {
161
+ vertical: "top",
162
+ horizontal: "left"
163
+ },
164
+ children,
165
+ MenuListProps = {},
166
+ PaperProps = {},
167
+ disablePortal = false,
168
+ keepMounted = false,
169
+ autoFocus = true,
170
+ style
171
+ } = _ref2,
172
+ props = _objectWithoutProperties__default["default"](_ref2, _excluded);
173
+
174
+ const isInsidePopover = React.useContext(PopoverContext);
175
+ const {
176
+ colors
177
+ } = ThemeProvider.useTheme();
178
+ const menuRef = React.useRef(null);
179
+ const [position, setPosition] = React.useState({
180
+ top: 0,
181
+ left: 0
182
+ });
183
+ const {
184
+ registerOverlay,
185
+ isClickInsideOverlay
186
+ } = useOverlayStack(); // Combine refs
187
+
188
+ const combinedRef = React.useCallback(node => {
189
+ menuRef.current = node;
190
+
191
+ if (typeof ref === "function") {
192
+ ref(node);
193
+ } else if (ref) {
194
+ ref.current = node;
195
+ }
196
+ }, [ref]); // Register this menu with the overlay stack
197
+
198
+ React.useEffect(() => {
199
+ if (open && menuRef.current) {
200
+ return registerOverlay(menuRef.current);
201
+ }
202
+ }, [open, registerOverlay]); // Resolve PaperProps.sx colors
203
+
204
+ const resolvedPaperStyle = React.useMemo(() => {
205
+ const sxStyles = PaperProps.sx ? resolveStyleColors(PaperProps.sx, colors) : {};
206
+ return _objectSpread(_objectSpread({}, sxStyles), PaperProps.style);
207
+ }, [PaperProps.sx, PaperProps.style, colors]); // Calculate position (only when standalone)
208
+
209
+ React.useLayoutEffect(() => {
210
+ if (isInsidePopover || !open || !anchorEl) return; // Safety check - make sure anchorEl is a valid DOM element
211
+
212
+ if (!(anchorEl instanceof Element)) return;
213
+ const rect = anchorEl.getBoundingClientRect();
214
+ const menuEl = menuRef.current;
215
+ let top = rect.bottom;
216
+ let left = rect.left; // Anchor origin
217
+
218
+ if (anchorOrigin.vertical === "top") top = rect.top;
219
+ if (anchorOrigin.vertical === "center") top = rect.top + rect.height / 2;
220
+ if (anchorOrigin.horizontal === "right") left = rect.right;
221
+ if (anchorOrigin.horizontal === "center") left = rect.left + rect.width / 2; // Transform origin adjustments
222
+
223
+ if (menuEl) {
224
+ const menuRect = menuEl.getBoundingClientRect();
225
+ if (transformOrigin.vertical === "bottom") top -= menuRect.height;
226
+ if (transformOrigin.vertical === "center") top -= menuRect.height / 2;
227
+ if (transformOrigin.horizontal === "right") left -= menuRect.width;
228
+ if (transformOrigin.horizontal === "center") left -= menuRect.width / 2; // Keep within viewport
229
+
230
+ const padding = 16;
231
+ const viewportWidth = window.innerWidth;
232
+ const viewportHeight = window.innerHeight;
233
+
234
+ if (left + menuRect.width > viewportWidth - padding) {
235
+ left = viewportWidth - menuRect.width - padding;
236
+ }
237
+
238
+ if (left < padding) left = padding;
239
+
240
+ if (top + menuRect.height > viewportHeight - padding) {
241
+ top = viewportHeight - menuRect.height - padding;
242
+ }
243
+
244
+ if (top < padding) top = padding;
245
+ } // Only update if position actually changed to prevent infinite loops
246
+
247
+
248
+ setPosition(prev => {
249
+ if (prev.top === top && prev.left === left) return prev;
250
+ return {
251
+ top,
252
+ left
253
+ };
254
+ });
255
+ }, [open, anchorEl, anchorOrigin, transformOrigin, isInsidePopover]); // Click outside and escape handling (only when standalone)
256
+
257
+ React.useEffect(() => {
258
+ if (isInsidePopover || !open) return;
259
+
260
+ const handleClickOutside = e => {
261
+ // Don't close if clicking inside the menu itself
262
+ if (menuRef.current && menuRef.current.contains(e.target)) {
263
+ return;
264
+ } // Don't close if clicking on the anchor element
265
+
266
+
267
+ if (anchorEl && anchorEl.contains(e.target)) {
268
+ return;
269
+ } // Don't close if clicking inside any registered overlay (like modals)
270
+
271
+
272
+ if (isClickInsideOverlay(e.target)) {
273
+ return;
274
+ } // Don't close if clicking inside any overlay/portal (fallback check)
275
+ // Pass the menu element to exclude it from the check
276
+
277
+
278
+ if (isClickInsideAnyOverlay(e.target, menuRef.current)) {
279
+ return;
280
+ }
281
+
282
+ onClose === null || onClose === void 0 ? void 0 : onClose(e, "backdropClick");
283
+ };
284
+
285
+ const handleEscape = e => {
286
+ if (e.key === "Escape") {
287
+ onClose === null || onClose === void 0 ? void 0 : onClose(e, "escapeKeyDown");
288
+ }
289
+ }; // Delay to prevent immediate close from the click that opened it
290
+
291
+
292
+ const timer = setTimeout(() => {
293
+ document.addEventListener("mousedown", handleClickOutside);
294
+ document.addEventListener("keydown", handleEscape);
295
+ }, 0);
296
+ return () => {
297
+ clearTimeout(timer);
298
+ document.removeEventListener("mousedown", handleClickOutside);
299
+ document.removeEventListener("keydown", handleEscape);
300
+ };
301
+ }, [open, onClose, anchorEl, isInsidePopover, isClickInsideOverlay]); // Focus first item on open
302
+
303
+ React.useEffect(() => {
304
+ if (open && autoFocus && menuRef.current) {
305
+ const firstItem = menuRef.current.querySelector('[role="menuitem"]:not([aria-disabled="true"])');
306
+ if (firstItem) firstItem.focus();
307
+ }
308
+ }, [open, autoFocus]);
309
+ if (!open && !keepMounted) return null;
310
+
311
+ const listStyle = _objectSpread({
312
+ listStyle: "none",
313
+ margin: 0
314
+ }, MenuListProps.style); // When inside a Popover, just render the menu list directly
315
+
316
+
317
+ if (isInsidePopover) {
318
+ return /*#__PURE__*/React__default["default"].createElement("div", _extends__default["default"]({
319
+ ref: combinedRef,
320
+ role: "menu",
321
+ style: resolvedPaperStyle
322
+ }, props), /*#__PURE__*/React__default["default"].createElement("ul", _extends__default["default"]({
323
+ style: listStyle
324
+ }, MenuListProps), children));
325
+ } // Standalone mode - create portal with positioning
326
+
327
+
328
+ const menuStyle = _objectSpread(_objectSpread(_objectSpread({
329
+ position: "fixed",
330
+ top: position.top,
331
+ left: position.left,
332
+ zIndex: 1300,
333
+ borderRadius: "4px",
334
+ boxShadow: "0px 5px 5px -3px rgba(0,0,0,0.2), 0px 8px 10px 1px rgba(0,0,0,0.14), 0px 3px 14px 2px rgba(0,0,0,0.12)",
335
+ minWidth: "120px",
336
+ maxHeight: "300px",
337
+ overflowY: "auto",
338
+ outline: 0,
339
+ opacity: open ? 1 : 0,
340
+ visibility: open ? "visible" : "hidden",
341
+ transform: open ? "scale(1)" : "scale(0.75)",
342
+ transformOrigin: "".concat(transformOrigin.horizontal, " ").concat(transformOrigin.vertical),
343
+ transition: "opacity 200ms, transform 200ms"
344
+ }, resolvedPaperStyle), style), {}, {
345
+ backgroundColor: "#2C3233" // Use dark theme color
346
+
347
+ });
348
+
349
+ const content = /*#__PURE__*/React__default["default"].createElement("div", _extends__default["default"]({
350
+ ref: combinedRef,
351
+ style: menuStyle,
352
+ role: "menu"
353
+ }, props), /*#__PURE__*/React__default["default"].createElement("ul", _extends__default["default"]({
354
+ style: listStyle
355
+ }, MenuListProps), children));
356
+ if (disablePortal) return content;
357
+ return /*#__PURE__*/ReactDOM.createPortal(content, document.body);
358
+ });
359
+ BaseMenu.displayName = "BaseMenu";
360
+ const Menu = withSx.withSx(BaseMenu);
361
+ /**
362
+ * MenuItem - Menu item (replaces MUI MenuItem)
363
+ */
364
+
365
+ const BaseMenuItem = /*#__PURE__*/React__default["default"].forwardRef((_ref3, ref) => {
366
+ var _colors$text, _colors$white;
367
+
368
+ let {
369
+ selected = false,
370
+ disabled = false,
371
+ dense = false,
372
+ divider = false,
373
+ onClick,
374
+ children,
375
+ style
376
+ } = _ref3,
377
+ props = _objectWithoutProperties__default["default"](_ref3, _excluded2);
378
+
379
+ const [isHovered, setIsHovered] = React.useState(false);
380
+ const {
381
+ colors
382
+ } = ThemeProvider.useTheme();
383
+
384
+ const itemStyle = _objectSpread(_objectSpread(_objectSpread({
385
+ display: "flex",
386
+ alignItems: "center",
387
+ padding: dense ? "4px 16px" : "6px 16px",
388
+ minHeight: dense ? "32px" : "48px",
389
+ cursor: disabled ? "default" : "pointer",
390
+ backgroundColor: selected ? (colors === null || colors === void 0 ? void 0 : colors.selectedBackground) || "rgba(255, 255, 255, 0.12)" // Light overlay for dark bg
391
+ : isHovered ? "rgba(255, 255, 255, 0.08)" // Light overlay for dark bg
392
+ : "transparent",
393
+ transition: "background-color 150ms",
394
+ outline: "none",
395
+ border: "none",
396
+ width: "100%",
397
+ textAlign: "left",
398
+ font: "inherit",
399
+ color: (colors === null || colors === void 0 ? void 0 : (_colors$text = colors.text) === null || _colors$text === void 0 ? void 0 : _colors$text.primary) || (colors === null || colors === void 0 ? void 0 : (_colors$white = colors.white) === null || _colors$white === void 0 ? void 0 : _colors$white.main) || "#fff",
400
+ // White text for dark bg
401
+ overflow: "hidden",
402
+ textOverflow: "ellipsis",
403
+ whiteSpace: "nowrap"
404
+ }, disabled && {
405
+ opacity: 0.5,
406
+ pointerEvents: "none"
407
+ }), divider && {
408
+ borderBottom: "1px solid ".concat((colors === null || colors === void 0 ? void 0 : colors.borderColor) || "rgba(255, 255, 255, 0.12)")
409
+ }), style);
410
+
411
+ return /*#__PURE__*/React__default["default"].createElement("li", _extends__default["default"]({
412
+ ref: ref,
413
+ role: "menuitem",
414
+ tabIndex: disabled ? -1 : 0,
415
+ style: itemStyle,
416
+ onClick: disabled ? undefined : onClick,
417
+ onMouseEnter: () => setIsHovered(true),
418
+ onMouseLeave: () => setIsHovered(false),
419
+ "aria-disabled": disabled
420
+ }, props), children);
421
+ });
422
+ BaseMenuItem.displayName = "BaseMenuItem";
423
+ const MenuItem = withSx.withSx(BaseMenuItem);
424
+ /**
425
+ * Tabs - Tab container (replaces MUI Tabs)
426
+ */
427
+
428
+ const BaseTabs = /*#__PURE__*/React__default["default"].forwardRef((_ref4, ref) => {
429
+ let {
430
+ value,
431
+ onChange,
432
+ children,
433
+ variant = "standard",
434
+ orientation = "horizontal",
435
+ centered = false,
436
+ textColor = "primary",
437
+ indicatorColor = "transparent",
438
+ scrollButtons = "auto",
439
+ TabIndicatorProps = {},
440
+ style
441
+ } = _ref4,
442
+ props = _objectWithoutProperties__default["default"](_ref4, _excluded3);
443
+
444
+ const {
445
+ colors
446
+ } = ThemeProvider.useTheme();
447
+ const tabsRef = React.useRef(null);
448
+ const [indicatorStyle, setIndicatorStyle] = React.useState({});
449
+ const colorValue = (colors === null || colors === void 0 ? void 0 : colors[indicatorColor]) || (colors === null || colors === void 0 ? void 0 : colors.ibisRed);
450
+ typeof colorValue === "object" ? colorValue.main : colorValue || "ibisRed.main"; // Update indicator position
451
+
452
+ React.useLayoutEffect(() => {
453
+ if (!tabsRef.current) return;
454
+ const tabs = tabsRef.current.querySelectorAll('[role="tab"]');
455
+ const selectedTab = Array.from(tabs).find((tab, index) => {
456
+ const tabValue = tab.dataset.value !== undefined ? tab.dataset.value : index;
457
+ return String(value) === String(tabValue);
458
+ });
459
+
460
+ if (selectedTab) {
461
+ const tabRect = selectedTab.getBoundingClientRect();
462
+ const containerRect = tabsRef.current.getBoundingClientRect();
463
+
464
+ if (orientation === "horizontal") {
465
+ setIndicatorStyle({
466
+ left: tabRect.left - containerRect.left,
467
+ width: tabRect.width,
468
+ height: 2,
469
+ bottom: 0
470
+ });
471
+ } else {
472
+ setIndicatorStyle({
473
+ top: tabRect.top - containerRect.top,
474
+ height: tabRect.height,
475
+ width: 2,
476
+ right: 0
477
+ });
478
+ }
479
+ }
480
+ }, [value, orientation, children]);
481
+
482
+ const containerStyle = _objectSpread({
483
+ display: "flex",
484
+ flexDirection: orientation === "horizontal" ? "column" : "row"
485
+ }, style);
486
+
487
+ const tabsListStyle = _objectSpread(_objectSpread(_objectSpread({
488
+ display: "flex",
489
+ flexDirection: orientation === "horizontal" ? "row" : "column",
490
+ position: "relative"
491
+ }, centered && {
492
+ justifyContent: "center"
493
+ }), variant === "fullWidth" && {
494
+ width: "100%"
495
+ }), {}, {
496
+ borderRight: orientation === "vertical" ? "1px solid ".concat((colors === null || colors === void 0 ? void 0 : colors.borderColor) || "rgba(0, 0, 0, 0.12)") : "none",
497
+ overflow: variant === "scrollable" ? "auto" : "visible"
498
+ });
499
+
500
+ const indicatorBaseStyle = _objectSpread(_objectSpread({
501
+ position: "absolute",
502
+ transition: "all 300ms cubic-bezier(0.4, 0, 0.2, 1)"
503
+ }, indicatorStyle), TabIndicatorProps.style); // Clone children to pass selected state
504
+
505
+
506
+ const childArray = React__default["default"].Children.toArray(children);
507
+ const tabs = childArray.map((child, index) => {
508
+ if (! /*#__PURE__*/React__default["default"].isValidElement(child)) return child;
509
+ const tabValue = child.props.value !== undefined ? child.props.value : index;
510
+ return /*#__PURE__*/React__default["default"].cloneElement(child, {
511
+ key: tabValue,
512
+ selected: value === tabValue,
513
+ "data-value": tabValue,
514
+ onClick: e => {
515
+ var _child$props$onClick, _child$props;
516
+
517
+ onChange === null || onChange === void 0 ? void 0 : onChange(e, tabValue);
518
+ (_child$props$onClick = (_child$props = child.props).onClick) === null || _child$props$onClick === void 0 ? void 0 : _child$props$onClick.call(_child$props, e);
519
+ },
520
+ textColor,
521
+ fullWidth: variant === "fullWidth"
522
+ });
523
+ });
524
+ return /*#__PURE__*/React__default["default"].createElement("div", _extends__default["default"]({
525
+ ref: ref,
526
+ style: containerStyle
527
+ }, props), /*#__PURE__*/React__default["default"].createElement("div", {
528
+ ref: tabsRef,
529
+ style: tabsListStyle,
530
+ role: "tablist"
531
+ }, tabs, /*#__PURE__*/React__default["default"].createElement("span", _extends__default["default"]({
532
+ style: indicatorBaseStyle
533
+ }, TabIndicatorProps))));
534
+ });
535
+ BaseTabs.displayName = "BaseTabs";
536
+ const Tabs = withSx.withSx(BaseTabs);
537
+ /**
538
+ * Tab - Individual tab (replaces MUI Tab)
539
+ */
540
+
541
+ const BaseTab = /*#__PURE__*/React__default["default"].forwardRef((_ref5, ref) => {
542
+ let {
543
+ label,
544
+ value,
545
+ icon,
546
+ iconPosition = "top",
547
+ disabled = false,
548
+ selected = false,
549
+ onClick,
550
+ textColor = "primary",
551
+ fullWidth = false,
552
+ wrapped = false,
553
+ disableRipple = false,
554
+ style
555
+ } = _ref5,
556
+ props = _objectWithoutProperties__default["default"](_ref5, _excluded4);
557
+
558
+ const {
559
+ colors
560
+ } = ThemeProvider.useTheme();
561
+ const [isHovered, setIsHovered] = React.useState(false);
562
+ const colorValue = (colors === null || colors === void 0 ? void 0 : colors[textColor]) || (colors === null || colors === void 0 ? void 0 : colors.primary);
563
+ const mainColor = typeof colorValue === "object" ? colorValue.main : colorValue || "#7C4DFF";
564
+
565
+ const tabStyle = _objectSpread(_objectSpread(_objectSpread({
566
+ display: "inline-flex",
567
+ alignItems: "center",
568
+ justifyContent: "center",
569
+ flexDirection: iconPosition === "top" || iconPosition === "bottom" ? "column" : "row",
570
+ gap: "8px",
571
+ padding: "12px 16px",
572
+ minWidth: "90px",
573
+ minHeight: "48px",
574
+ textTransform: "uppercase",
575
+ fontSize: "0.875rem",
576
+ fontWeight: 500,
577
+ fontFamily: "inherit",
578
+ letterSpacing: "0.02857em",
579
+ color: selected ? mainColor : (colors === null || colors === void 0 ? void 0 : colors.secondaryText) || "rgba(0, 0, 0, 0.6)",
580
+ backgroundColor: isHovered && !disabled ? "rgba(0, 0, 0, 0.04)" : "transparent",
581
+ border: "none",
582
+ cursor: disabled ? "default" : "pointer",
583
+ transition: "color 250ms, background-color 250ms",
584
+ whiteSpace: wrapped ? "normal" : "nowrap",
585
+ outline: "none"
586
+ }, fullWidth && {
587
+ flex: 1
588
+ }), disabled && {
589
+ opacity: 0.5,
590
+ pointerEvents: "none"
591
+ }), style);
592
+
593
+ return /*#__PURE__*/React__default["default"].createElement("button", _extends__default["default"]({
594
+ ref: ref,
595
+ role: "tab",
596
+ "aria-selected": selected,
597
+ "aria-disabled": disabled,
598
+ tabIndex: selected ? 0 : -1,
599
+ style: tabStyle,
600
+ onClick: disabled ? undefined : onClick,
601
+ onMouseEnter: () => setIsHovered(true),
602
+ onMouseLeave: () => setIsHovered(false)
603
+ }, props), (iconPosition === "top" || iconPosition === "start") && icon, label, (iconPosition === "bottom" || iconPosition === "end") && icon);
604
+ });
605
+ BaseTab.displayName = "BaseTab";
606
+ const Tab = withSx.withSx(BaseTab);
607
+ /**
608
+ * Alert - Alert message (replaces MUI Alert)
609
+ */
610
+
611
+ const BaseAlert = /*#__PURE__*/React__default["default"].forwardRef((_ref6, ref) => {
612
+ var _colors$error, _colors$warning, _colors$info, _colors$success;
613
+
614
+ let {
615
+ severity = "info",
616
+ variant = "standard",
617
+ color,
618
+ icon,
619
+ action,
620
+ onClose,
621
+ children,
622
+ style
623
+ } = _ref6,
624
+ props = _objectWithoutProperties__default["default"](_ref6, _excluded5);
625
+
626
+ const {
627
+ colors
628
+ } = ThemeProvider.useTheme();
629
+ const severityColors = {
630
+ error: {
631
+ main: (colors === null || colors === void 0 ? void 0 : (_colors$error = colors.error) === null || _colors$error === void 0 ? void 0 : _colors$error.main) || colors.ibisRed,
632
+ light: "#FFD7E0",
633
+ dark: colors.ibisRedDark
634
+ },
635
+ warning: {
636
+ main: (colors === null || colors === void 0 ? void 0 : (_colors$warning = colors.warning) === null || _colors$warning === void 0 ? void 0 : _colors$warning.main) || colors.popnYellow,
637
+ light: "#FFF8B0",
638
+ dark: "#B38F00"
639
+ },
640
+ info: {
641
+ main: (colors === null || colors === void 0 ? void 0 : (_colors$info = colors.info) === null || _colors$info === void 0 ? void 0 : _colors$info.main) || colors.buntingBlue,
642
+ light: "#B3E0FF",
643
+ dark: "#1A7CCC"
644
+ },
645
+ success: {
646
+ main: (colors === null || colors === void 0 ? void 0 : (_colors$success = colors.success) === null || _colors$success === void 0 ? void 0 : _colors$success.main) || colors.seafoam,
647
+ light: "#B3FFF5",
648
+ dark: colors.seafoamDark
649
+ }
650
+ };
651
+ const colorSet = severityColors[color] || severityColors[severity] || severityColors.info;
652
+ const severityIcons = {
653
+ error: "✕",
654
+ warning: "⚠",
655
+ info: "ℹ",
656
+ success: "✓"
657
+ };
658
+
659
+ const alertStyle = _objectSpread(_objectSpread(_objectSpread(_objectSpread({
660
+ display: "flex",
661
+ alignItems: "flex-start",
662
+ padding: "6px 16px",
663
+ borderRadius: "4px",
664
+ fontSize: "0.875rem"
665
+ }, variant === "standard" && {
666
+ backgroundColor: colorSet.light,
667
+ color: colorSet.dark
668
+ }), variant === "filled" && {
669
+ backgroundColor: colorSet.main,
670
+ color: "#fff"
671
+ }), variant === "outlined" && {
672
+ backgroundColor: "transparent",
673
+ border: "1px solid ".concat(colorSet.main),
674
+ color: colorSet.dark
675
+ }), style);
676
+
677
+ const iconStyle = {
678
+ marginRight: "12px",
679
+ paddingTop: "8px",
680
+ fontSize: "1.25rem",
681
+ display: "flex",
682
+ alignItems: "center",
683
+ color: variant === "standard" ? colorSet.main : "inherit"
684
+ };
685
+ const contentStyle = {
686
+ flex: 1,
687
+ padding: "8px 0",
688
+ minWidth: 0
689
+ };
690
+ const actionStyle = {
691
+ marginLeft: "auto",
692
+ paddingLeft: "16px",
693
+ marginRight: "-8px",
694
+ display: "flex",
695
+ alignItems: "flex-start",
696
+ paddingTop: "4px"
697
+ };
698
+ return /*#__PURE__*/React__default["default"].createElement("div", _extends__default["default"]({
699
+ ref: ref,
700
+ role: "alert",
701
+ style: alertStyle
702
+ }, props), icon !== false && /*#__PURE__*/React__default["default"].createElement("span", {
703
+ style: iconStyle
704
+ }, icon || severityIcons[severity]), /*#__PURE__*/React__default["default"].createElement("div", {
705
+ style: contentStyle
706
+ }, children), (action || onClose) && /*#__PURE__*/React__default["default"].createElement("div", {
707
+ style: actionStyle
708
+ }, action, onClose && /*#__PURE__*/React__default["default"].createElement("button", {
709
+ onClick: onClose,
710
+ "aria-label": "Close",
711
+ style: {
712
+ background: "none",
713
+ border: "none",
714
+ cursor: "pointer",
715
+ padding: "4px",
716
+ color: "inherit",
717
+ display: "flex",
718
+ alignItems: "center",
719
+ justifyContent: "center",
720
+ borderRadius: "50%"
721
+ }
722
+ }, "\u2715")));
723
+ });
724
+ BaseAlert.displayName = "BaseAlert";
725
+ const Alert = withSx.withSx(BaseAlert);
726
+ /**
727
+ * AlertTitle - Title for Alert (replaces MUI AlertTitle)
728
+ */
729
+
730
+ const AlertTitle = /*#__PURE__*/React__default["default"].forwardRef((_ref7, ref) => {
731
+ let {
732
+ children,
733
+ style
734
+ } = _ref7,
735
+ props = _objectWithoutProperties__default["default"](_ref7, _excluded6);
736
+
737
+ return /*#__PURE__*/React__default["default"].createElement("div", _extends__default["default"]({
738
+ ref: ref,
739
+ style: _objectSpread({
740
+ fontWeight: 500,
741
+ marginTop: "-2px",
742
+ marginBottom: "4px"
743
+ }, style)
744
+ }, props), children);
745
+ });
746
+ AlertTitle.displayName = "AlertTitle";
747
+ /**
748
+ * Snackbar - Toast notification (replaces MUI Snackbar)
749
+ */
750
+
751
+ const BaseSnackbar = /*#__PURE__*/React__default["default"].forwardRef((_ref8, ref) => {
752
+ var _colors$grey;
753
+
754
+ let {
755
+ open,
756
+ onClose,
757
+ autoHideDuration,
758
+ message,
759
+ action,
760
+ anchorOrigin = {
761
+ vertical: "bottom",
762
+ horizontal: "left"
763
+ },
764
+ resumeHideDuration,
765
+ disableWindowBlurListener = false,
766
+ TransitionComponent,
767
+ transitionDuration = 225,
768
+ children,
769
+ style
770
+ } = _ref8,
771
+ props = _objectWithoutProperties__default["default"](_ref8, _excluded7);
772
+
773
+ const timerRef = React.useRef(null);
774
+ const {
775
+ colors
776
+ } = ThemeProvider.useTheme();
777
+ const startTimer = React.useCallback(() => {
778
+ if (autoHideDuration != null) {
779
+ timerRef.current = setTimeout(() => {
780
+ onClose === null || onClose === void 0 ? void 0 : onClose({}, "timeout");
781
+ }, autoHideDuration);
782
+ }
783
+ }, [autoHideDuration, onClose]);
784
+ const stopTimer = React.useCallback(() => {
785
+ if (timerRef.current) {
786
+ clearTimeout(timerRef.current);
787
+ timerRef.current = null;
788
+ }
789
+ }, []);
790
+ React.useEffect(() => {
791
+ if (open) {
792
+ startTimer();
793
+ }
794
+
795
+ return stopTimer;
796
+ }, [open, startTimer, stopTimer]); // Pause timer on window blur
797
+
798
+ React.useEffect(() => {
799
+ if (disableWindowBlurListener || !open) return;
800
+
801
+ const handleBlur = () => stopTimer();
802
+
803
+ const handleFocus = () => {
804
+ stopTimer();
805
+ startTimer();
806
+ };
807
+
808
+ window.addEventListener("blur", handleBlur);
809
+ window.addEventListener("focus", handleFocus);
810
+ return () => {
811
+ window.removeEventListener("blur", handleBlur);
812
+ window.removeEventListener("focus", handleFocus);
813
+ };
814
+ }, [open, disableWindowBlurListener, startTimer, stopTimer]);
815
+ if (!open) return null;
816
+
817
+ const positionStyles = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
818
+ position: "fixed",
819
+ zIndex: 1400,
820
+ display: "flex"
821
+ }, anchorOrigin.vertical === "top" && {
822
+ top: "24px"
823
+ }), anchorOrigin.vertical === "bottom" && {
824
+ bottom: "24px"
825
+ }), anchorOrigin.horizontal === "left" && {
826
+ left: "24px",
827
+ justifyContent: "flex-start"
828
+ }), anchorOrigin.horizontal === "right" && {
829
+ right: "24px",
830
+ justifyContent: "flex-end"
831
+ }), anchorOrigin.horizontal === "center" && {
832
+ left: "50%",
833
+ transform: "translateX(-50%)"
834
+ });
835
+
836
+ const snackbarStyle = _objectSpread(_objectSpread({}, positionStyles), style);
837
+
838
+ const contentStyle = {
839
+ display: "flex",
840
+ alignItems: "center",
841
+ padding: "6px 16px",
842
+ backgroundColor: (colors === null || colors === void 0 ? void 0 : (_colors$grey = colors.grey8) === null || _colors$grey === void 0 ? void 0 : _colors$grey.main) || "#323232",
843
+ color: "#fff",
844
+ borderRadius: "4px",
845
+ boxShadow: "0px 3px 5px -1px rgba(0,0,0,0.2), 0px 6px 10px 0px rgba(0,0,0,0.14), 0px 1px 18px 0px rgba(0,0,0,0.12)",
846
+ minWidth: "288px",
847
+ maxWidth: "568px",
848
+ flexWrap: "wrap"
849
+ };
850
+ return /*#__PURE__*/ReactDOM.createPortal( /*#__PURE__*/React__default["default"].createElement("div", _extends__default["default"]({
851
+ ref: ref,
852
+ style: snackbarStyle,
853
+ onMouseEnter: stopTimer,
854
+ onMouseLeave: startTimer
855
+ }, props), children || /*#__PURE__*/React__default["default"].createElement("div", {
856
+ style: contentStyle
857
+ }, /*#__PURE__*/React__default["default"].createElement("span", {
858
+ style: {
859
+ flex: 1,
860
+ padding: "8px 0"
861
+ }
862
+ }, message), action && /*#__PURE__*/React__default["default"].createElement("div", {
863
+ style: {
864
+ marginLeft: "auto",
865
+ paddingLeft: "16px"
866
+ }
867
+ }, action))), document.body);
868
+ });
869
+ BaseSnackbar.displayName = "BaseSnackbar";
870
+ const Snackbar = withSx.withSx(BaseSnackbar);
871
+ /**
872
+ * Popover - Positioned popup (replaces MUI Popover)
873
+ * Provides PopoverContext so nested Menu components know not to create their own portal
874
+ */
875
+
876
+ const BasePopover = /*#__PURE__*/React__default["default"].forwardRef((_ref9, ref) => {
877
+ let {
878
+ open,
879
+ onClose,
880
+ anchorEl,
881
+ anchorOrigin = {
882
+ vertical: "bottom",
883
+ horizontal: "left"
884
+ },
885
+ transformOrigin = {
886
+ vertical: "top",
887
+ horizontal: "left"
888
+ },
889
+ anchorPosition,
890
+ anchorReference = "anchorEl",
891
+ marginThreshold = 16,
892
+ children,
893
+ PaperProps = {},
894
+ TransitionComponent,
895
+ transitionDuration = 225,
896
+ disablePortal = false,
897
+ keepMounted = false,
898
+ onClick,
899
+ style
900
+ } = _ref9,
901
+ props = _objectWithoutProperties__default["default"](_ref9, _excluded8);
902
+
903
+ const {
904
+ colors
905
+ } = ThemeProvider.useTheme();
906
+ const popoverRef = React.useRef(null);
907
+ const [position, setPosition] = React.useState({
908
+ top: 0,
909
+ left: 0
910
+ });
911
+ const {
912
+ registerOverlay,
913
+ isClickInsideOverlay
914
+ } = useOverlayStack();
915
+ const combinedRef = React.useCallback(node => {
916
+ popoverRef.current = node;
917
+
918
+ if (typeof ref === "function") {
919
+ ref(node);
920
+ } else if (ref) {
921
+ ref.current = node;
922
+ }
923
+ }, [ref]); // Register this popover with the overlay stack
924
+
925
+ React.useEffect(() => {
926
+ if (open && popoverRef.current) {
927
+ return registerOverlay(popoverRef.current);
928
+ }
929
+ }, [open, registerOverlay]); // Resolve PaperProps.sx colors
930
+
931
+ const resolvedPaperStyle = React.useMemo(() => {
932
+ const sxStyles = PaperProps.sx ? resolveStyleColors(PaperProps.sx, colors) : {};
933
+ return _objectSpread(_objectSpread({}, sxStyles), PaperProps.style);
934
+ }, [PaperProps.sx, PaperProps.style, colors]); // Calculate position
935
+
936
+ React.useLayoutEffect(() => {
937
+ if (!open) return;
938
+ let top = 0;
939
+ let left = 0;
940
+
941
+ if (anchorReference === "anchorPosition" && anchorPosition) {
942
+ top = anchorPosition.top;
943
+ left = anchorPosition.left;
944
+ } else if (anchorEl) {
945
+ // Safety check - make sure anchorEl is a valid DOM element
946
+ if (!(anchorEl instanceof Element)) return;
947
+ const rect = anchorEl.getBoundingClientRect(); // Anchor origin
948
+
949
+ if (anchorOrigin.vertical === "top") top = rect.top;else if (anchorOrigin.vertical === "center") top = rect.top + rect.height / 2;else top = rect.bottom;
950
+ if (anchorOrigin.horizontal === "left") left = rect.left;else if (anchorOrigin.horizontal === "center") left = rect.left + rect.width / 2;else left = rect.right;
951
+ } // Transform origin adjustments
952
+
953
+
954
+ if (popoverRef.current) {
955
+ const popoverRect = popoverRef.current.getBoundingClientRect();
956
+ if (transformOrigin.vertical === "bottom") top -= popoverRect.height;else if (transformOrigin.vertical === "center") top -= popoverRect.height / 2;
957
+ if (transformOrigin.horizontal === "right") left -= popoverRect.width;else if (transformOrigin.horizontal === "center") left -= popoverRect.width / 2; // Keep within viewport
958
+
959
+ const viewportWidth = window.innerWidth;
960
+ const viewportHeight = window.innerHeight;
961
+
962
+ if (left + popoverRect.width > viewportWidth - marginThreshold) {
963
+ left = viewportWidth - popoverRect.width - marginThreshold;
964
+ }
965
+
966
+ if (left < marginThreshold) left = marginThreshold;
967
+
968
+ if (top + popoverRect.height > viewportHeight - marginThreshold) {
969
+ top = viewportHeight - popoverRect.height - marginThreshold;
970
+ }
971
+
972
+ if (top < marginThreshold) top = marginThreshold;
973
+ } // Only update if position actually changed to prevent infinite loops
974
+
975
+
976
+ setPosition(prev => {
977
+ if (prev.top === top && prev.left === left) return prev;
978
+ return {
979
+ top,
980
+ left
981
+ };
982
+ });
983
+ }, [open, anchorEl, anchorOrigin, transformOrigin, anchorPosition, anchorReference, marginThreshold]); // Click outside handling
984
+
985
+ React.useEffect(() => {
986
+ if (!open) return;
987
+
988
+ const handleClickOutside = e => {
989
+ // Use a small delay to ensure ref is populated after portal render
990
+ const popoverElement = popoverRef.current; // Don't close if clicking inside the popover itself
991
+
992
+ if (popoverElement && popoverElement.contains(e.target)) {
993
+ return;
994
+ } // Don't close if clicking on the anchor element
995
+
996
+
997
+ if (anchorEl && anchorEl.contains(e.target)) {
998
+ return;
999
+ } // Don't close if clicking inside any registered overlay (like modals)
1000
+
1001
+
1002
+ if (isClickInsideOverlay(e.target)) {
1003
+ return;
1004
+ } // Don't close if clicking inside any overlay/portal (fallback check)
1005
+
1006
+
1007
+ if (isClickInsideAnyOverlay(e.target, popoverElement)) {
1008
+ return;
1009
+ }
1010
+
1011
+ onClose === null || onClose === void 0 ? void 0 : onClose(e, "backdropClick");
1012
+ };
1013
+
1014
+ const handleEscape = e => {
1015
+ if (e.key === "Escape") {
1016
+ onClose === null || onClose === void 0 ? void 0 : onClose(e, "escapeKeyDown");
1017
+ }
1018
+ }; // Use 'click' instead of 'mousedown' and add listener on next tick
1019
+ // This prevents the click that opened the popover from immediately closing it
1020
+
1021
+
1022
+ const timer = setTimeout(() => {
1023
+ document.addEventListener("click", handleClickOutside, true); // Use capture phase
1024
+
1025
+ document.addEventListener("keydown", handleEscape);
1026
+ }, 10); // Small delay to ensure portal is rendered and ref is set
1027
+
1028
+ return () => {
1029
+ clearTimeout(timer);
1030
+ document.removeEventListener("click", handleClickOutside, true);
1031
+ document.removeEventListener("keydown", handleEscape);
1032
+ };
1033
+ }, [open, onClose, anchorEl, isClickInsideOverlay]);
1034
+ if (!open && !keepMounted) return null;
1035
+
1036
+ const popoverStyle = _objectSpread(_objectSpread({
1037
+ position: "fixed",
1038
+ top: position.top,
1039
+ left: position.left,
1040
+ zIndex: 1300,
1041
+ backgroundColor: (colors === null || colors === void 0 ? void 0 : colors.flyoutBackground) || "#fff",
1042
+ borderRadius: "4px",
1043
+ boxShadow: "0px 5px 5px -3px rgba(0,0,0,0.2), 0px 8px 10px 1px rgba(0,0,0,0.14), 0px 3px 14px 2px rgba(0,0,0,0.12)",
1044
+ outline: 0,
1045
+ opacity: open ? 1 : 0,
1046
+ visibility: open ? "visible" : "hidden",
1047
+ transform: open ? "scale(1)" : "scale(0.75)",
1048
+ transformOrigin: "".concat(transformOrigin.horizontal, " ").concat(transformOrigin.vertical),
1049
+ transition: "opacity ".concat(transitionDuration, "ms, transform ").concat(transitionDuration, "ms")
1050
+ }, resolvedPaperStyle), style);
1051
+
1052
+ const content = /*#__PURE__*/React__default["default"].createElement(PopoverContext.Provider, {
1053
+ value: true
1054
+ }, /*#__PURE__*/React__default["default"].createElement("div", _extends__default["default"]({
1055
+ ref: combinedRef,
1056
+ style: popoverStyle,
1057
+ onClick: onClick
1058
+ }, props), children));
1059
+ if (disablePortal) return content;
1060
+ return /*#__PURE__*/ReactDOM.createPortal(content, document.body);
1061
+ });
1062
+ BasePopover.displayName = "BasePopover";
1063
+ const Popover = withSx.withSx(BasePopover);
1064
+ /**
1065
+ * Drawer - Slide-out panel (replaces MUI Drawer)
1066
+ */
1067
+
1068
+ const BaseDrawer = /*#__PURE__*/React__default["default"].forwardRef((_ref10, ref) => {
1069
+ var _PaperProps$style, _PaperProps$style2, _ModalProps$BackdropP;
1070
+
1071
+ let {
1072
+ open,
1073
+ onClose,
1074
+ anchor = "left",
1075
+ variant = "temporary",
1076
+ elevation = 16,
1077
+ hideBackdrop = false,
1078
+ ModalProps = {},
1079
+ PaperProps = {},
1080
+ SlideProps = {},
1081
+ transitionDuration = 225,
1082
+ children,
1083
+ style
1084
+ } = _ref10,
1085
+ props = _objectWithoutProperties__default["default"](_ref10, _excluded9);
1086
+
1087
+ const {
1088
+ colors
1089
+ } = ThemeProvider.useTheme();
1090
+ const [isVisible, setIsVisible] = React.useState(open);
1091
+ const {
1092
+ registerOverlay
1093
+ } = useOverlayStack();
1094
+ const drawerRef = React.useRef(null); // Resolve PaperProps.sx colors
1095
+
1096
+ const resolvedPaperStyle = React.useMemo(() => {
1097
+ const sxStyles = PaperProps.sx ? resolveStyleColors(PaperProps.sx, colors) : {};
1098
+ return _objectSpread(_objectSpread({}, sxStyles), PaperProps.style);
1099
+ }, [PaperProps.sx, PaperProps.style, colors]); // Register this drawer with the overlay stack
1100
+
1101
+ React.useEffect(() => {
1102
+ if (open && drawerRef.current) {
1103
+ return registerOverlay(drawerRef.current);
1104
+ }
1105
+ }, [open, registerOverlay]); // Handle visibility for transitions
1106
+
1107
+ React.useEffect(() => {
1108
+ if (open) {
1109
+ setIsVisible(true);
1110
+ } else {
1111
+ const timer = setTimeout(() => setIsVisible(false), transitionDuration);
1112
+ return () => clearTimeout(timer);
1113
+ }
1114
+ }, [open, transitionDuration]); // Lock body scroll for temporary drawers
1115
+
1116
+ React.useEffect(() => {
1117
+ if (open && variant === "temporary") {
1118
+ const originalOverflow = document.body.style.overflow;
1119
+ document.body.style.overflow = "hidden";
1120
+ return () => {
1121
+ document.body.style.overflow = originalOverflow;
1122
+ };
1123
+ }
1124
+ }, [open, variant]);
1125
+ const drawerWidth = (resolvedPaperStyle === null || resolvedPaperStyle === void 0 ? void 0 : resolvedPaperStyle.width) || ((_PaperProps$style = PaperProps.style) === null || _PaperProps$style === void 0 ? void 0 : _PaperProps$style.width) || "240px";
1126
+ const drawerHeight = (resolvedPaperStyle === null || resolvedPaperStyle === void 0 ? void 0 : resolvedPaperStyle.height) || ((_PaperProps$style2 = PaperProps.style) === null || _PaperProps$style2 === void 0 ? void 0 : _PaperProps$style2.height) || "auto";
1127
+
1128
+ const getTransform = isOpen => {
1129
+ if (isOpen) return "translate(0, 0)";
1130
+
1131
+ switch (anchor) {
1132
+ case "left":
1133
+ return "translateX(-100%)";
1134
+
1135
+ case "right":
1136
+ return "translateX(100%)";
1137
+
1138
+ case "top":
1139
+ return "translateY(-100%)";
1140
+
1141
+ case "bottom":
1142
+ return "translateY(100%)";
1143
+
1144
+ default:
1145
+ return "translateX(-100%)";
1146
+ }
1147
+ };
1148
+
1149
+ const paperStyle = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
1150
+ position: "fixed",
1151
+ zIndex: variant === "temporary" ? 1200 : 1100,
1152
+ backgroundColor: (colors === null || colors === void 0 ? void 0 : colors.flyoutBackground) || "#fff",
1153
+ boxShadow: variant === "temporary" ? "0px 8px 10px -5px rgba(0,0,0,0.2), 0px 16px 24px 2px rgba(0,0,0,0.14), 0px 6px 30px 5px rgba(0,0,0,0.12)" : "none",
1154
+ overflowY: "auto",
1155
+ display: "flex",
1156
+ flexDirection: "column",
1157
+ transform: getTransform(open),
1158
+ transition: "transform ".concat(transitionDuration, "ms cubic-bezier(0, 0, 0.2, 1)")
1159
+ }, anchor === "left" && {
1160
+ top: 0,
1161
+ left: 0,
1162
+ bottom: 0,
1163
+ width: drawerWidth
1164
+ }), anchor === "right" && {
1165
+ top: 0,
1166
+ right: 0,
1167
+ bottom: 0,
1168
+ width: drawerWidth
1169
+ }), anchor === "top" && {
1170
+ top: 0,
1171
+ left: 0,
1172
+ right: 0,
1173
+ height: drawerHeight
1174
+ }), anchor === "bottom" && {
1175
+ bottom: 0,
1176
+ left: 0,
1177
+ right: 0,
1178
+ height: drawerHeight
1179
+ }), resolvedPaperStyle); // Permanent drawer - always visible, no backdrop
1180
+
1181
+
1182
+ if (variant === "permanent") {
1183
+ return /*#__PURE__*/React__default["default"].createElement("div", _extends__default["default"]({
1184
+ ref: node => {
1185
+ drawerRef.current = node;
1186
+ if (typeof ref === "function") ref(node);else if (ref) ref.current = node;
1187
+ },
1188
+ style: _objectSpread(_objectSpread({}, paperStyle), {}, {
1189
+ position: "relative",
1190
+ transform: "none"
1191
+ })
1192
+ }, props), children);
1193
+ } // Persistent drawer - can be toggled, no backdrop
1194
+
1195
+
1196
+ if (variant === "persistent") {
1197
+ if (!isVisible && !open) return null;
1198
+ return /*#__PURE__*/React__default["default"].createElement("div", _extends__default["default"]({
1199
+ ref: node => {
1200
+ drawerRef.current = node;
1201
+ if (typeof ref === "function") ref(node);else if (ref) ref.current = node;
1202
+ },
1203
+ style: paperStyle
1204
+ }, props), children);
1205
+ } // Temporary drawer - with backdrop
1206
+
1207
+
1208
+ if (!isVisible && !open) return null;
1209
+
1210
+ const backdropStyle = _objectSpread({
1211
+ position: "fixed",
1212
+ inset: 0,
1213
+ backgroundColor: "rgba(0, 0, 0, 0.5)",
1214
+ zIndex: 1199,
1215
+ opacity: open ? 1 : 0,
1216
+ visibility: open ? "visible" : "hidden",
1217
+ transition: "opacity ".concat(transitionDuration, "ms")
1218
+ }, (_ModalProps$BackdropP = ModalProps.BackdropProps) === null || _ModalProps$BackdropP === void 0 ? void 0 : _ModalProps$BackdropP.style);
1219
+
1220
+ return /*#__PURE__*/ReactDOM.createPortal( /*#__PURE__*/React__default["default"].createElement("div", _extends__default["default"]({
1221
+ style: {
1222
+ position: "fixed",
1223
+ inset: 0,
1224
+ zIndex: 1200
1225
+ }
1226
+ }, props), !hideBackdrop && /*#__PURE__*/React__default["default"].createElement("div", {
1227
+ style: backdropStyle,
1228
+ onClick: onClose,
1229
+ "aria-hidden": "true"
1230
+ }), /*#__PURE__*/React__default["default"].createElement("div", {
1231
+ ref: node => {
1232
+ drawerRef.current = node;
1233
+ if (typeof ref === "function") ref(node);else if (ref) ref.current = node;
1234
+ },
1235
+ style: paperStyle
1236
+ }, children)), document.body);
1237
+ });
1238
+ BaseDrawer.displayName = "BaseDrawer";
1239
+ const Drawer = withSx.withSx(BaseDrawer);
1240
+ /**
1241
+ * Tooltip - Informative text on hover (replaces MUI Tooltip)
1242
+ */
1243
+
1244
+ const BaseTooltip = /*#__PURE__*/React__default["default"].forwardRef((_ref11, ref) => {
1245
+ let {
1246
+ children,
1247
+ title,
1248
+ placement = "bottom",
1249
+ arrow = false,
1250
+ enterDelay = 100,
1251
+ leaveDelay = 0,
1252
+ disableHoverListener = false,
1253
+ disableFocusListener = false,
1254
+ disableTouchListener = false,
1255
+ open: controlledOpen,
1256
+ onOpen,
1257
+ onClose,
1258
+ componentsProps = {},
1259
+ slotProps = {},
1260
+ PopperProps = {}
1261
+ } = _ref11;
1262
+ _objectWithoutProperties__default["default"](_ref11, _excluded10);
1263
+
1264
+ const {
1265
+ colors
1266
+ } = ThemeProvider.useTheme();
1267
+ const [isOpen, setIsOpen] = React.useState(false);
1268
+ const [position, setPosition] = React.useState({
1269
+ top: 0,
1270
+ left: 0
1271
+ });
1272
+ const anchorRef = React.useRef(null);
1273
+ const tooltipRef = React.useRef(null);
1274
+ const enterTimeoutRef = React.useRef(null);
1275
+ const leaveTimeoutRef = React.useRef(null);
1276
+ const open = controlledOpen !== undefined ? controlledOpen : isOpen; // Merge slotProps and componentsProps
1277
+
1278
+ const mergedSlotProps = _objectSpread(_objectSpread({}, componentsProps), slotProps); // Resolve tooltip styles
1279
+
1280
+
1281
+ const tooltipStyle = React.useMemo(() => {
1282
+ const baseStyle = {
1283
+ position: "fixed",
1284
+ zIndex: 1500,
1285
+ pointerEvents: "none",
1286
+ backgroundColor: "rgba(97, 97, 97, 0.92)",
1287
+ borderRadius: "4px",
1288
+ color: "#fff",
1289
+ fontFamily: "inherit",
1290
+ padding: "4px 8px",
1291
+ fontSize: "11px",
1292
+ maxWidth: "300px",
1293
+ wordWrap: "break-word",
1294
+ fontWeight: 500
1295
+ };
1296
+ const tooltipSlotProps = mergedSlotProps.tooltip || {};
1297
+ const resolvedSx = tooltipSlotProps.sx ? resolveStyleColors(tooltipSlotProps.sx, colors) : {};
1298
+ return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, baseStyle), resolvedSx), tooltipSlotProps.style), {}, {
1299
+ top: position.top,
1300
+ left: position.left,
1301
+ backgroundColor: "rgba(97, 97, 97, 0.92)"
1302
+ });
1303
+ }, [position, mergedSlotProps, colors]); // Resolve popper styles
1304
+
1305
+ const popperStyle = React.useMemo(() => {
1306
+ const popperSlotProps = mergedSlotProps.popper || {};
1307
+ const resolvedSx = popperSlotProps.sx ? resolveStyleColors(popperSlotProps.sx, colors) : {};
1308
+ const popperPropsSx = PopperProps.sx ? resolveStyleColors(PopperProps.sx, colors) : {};
1309
+ return _objectSpread(_objectSpread(_objectSpread({}, resolvedSx), popperSlotProps.style), popperPropsSx);
1310
+ }, [mergedSlotProps, PopperProps, colors]);
1311
+ const updatePosition = React.useCallback(() => {
1312
+ if (!anchorRef.current || !tooltipRef.current) return;
1313
+ const anchorRect = anchorRef.current.getBoundingClientRect();
1314
+ const tooltipRect = tooltipRef.current.getBoundingClientRect();
1315
+ const offset = 8;
1316
+ let top = 0;
1317
+ let left = 0;
1318
+
1319
+ switch (placement) {
1320
+ case "top":
1321
+ top = anchorRect.top - tooltipRect.height - offset;
1322
+ left = anchorRect.left + (anchorRect.width - tooltipRect.width) / 2;
1323
+ break;
1324
+
1325
+ case "top-start":
1326
+ top = anchorRect.top - tooltipRect.height - offset;
1327
+ left = anchorRect.left;
1328
+ break;
1329
+
1330
+ case "top-end":
1331
+ top = anchorRect.top - tooltipRect.height - offset;
1332
+ left = anchorRect.right - tooltipRect.width;
1333
+ break;
1334
+
1335
+ case "bottom":
1336
+ top = anchorRect.bottom + offset;
1337
+ left = anchorRect.left + (anchorRect.width - tooltipRect.width) / 2;
1338
+ break;
1339
+
1340
+ case "bottom-start":
1341
+ top = anchorRect.bottom + offset;
1342
+ left = anchorRect.left;
1343
+ break;
1344
+
1345
+ case "bottom-end":
1346
+ top = anchorRect.bottom + offset;
1347
+ left = anchorRect.right - tooltipRect.width;
1348
+ break;
1349
+
1350
+ case "left":
1351
+ top = anchorRect.top + (anchorRect.height - tooltipRect.height) / 2;
1352
+ left = anchorRect.left - tooltipRect.width - offset;
1353
+ break;
1354
+
1355
+ case "left-start":
1356
+ top = anchorRect.top;
1357
+ left = anchorRect.left - tooltipRect.width - offset;
1358
+ break;
1359
+
1360
+ case "left-end":
1361
+ top = anchorRect.bottom - tooltipRect.height;
1362
+ left = anchorRect.left - tooltipRect.width - offset;
1363
+ break;
1364
+
1365
+ case "right":
1366
+ top = anchorRect.top + (anchorRect.height - tooltipRect.height) / 2;
1367
+ left = anchorRect.right + offset;
1368
+ break;
1369
+
1370
+ case "right-start":
1371
+ top = anchorRect.top;
1372
+ left = anchorRect.right + offset;
1373
+ break;
1374
+
1375
+ case "right-end":
1376
+ top = anchorRect.bottom - tooltipRect.height;
1377
+ left = anchorRect.right + offset;
1378
+ break;
1379
+
1380
+ default:
1381
+ top = anchorRect.bottom + offset;
1382
+ left = anchorRect.left + (anchorRect.width - tooltipRect.width) / 2;
1383
+ }
1384
+
1385
+ setPosition({
1386
+ top,
1387
+ left
1388
+ });
1389
+ }, [placement]);
1390
+ React.useEffect(() => {
1391
+ if (open) {
1392
+ requestAnimationFrame(updatePosition);
1393
+ }
1394
+ }, [open, updatePosition]);
1395
+ const handleOpen = React.useCallback(event => {
1396
+ clearTimeout(leaveTimeoutRef.current);
1397
+ enterTimeoutRef.current = setTimeout(() => {
1398
+ setIsOpen(true);
1399
+ onOpen === null || onOpen === void 0 ? void 0 : onOpen(event);
1400
+ }, enterDelay);
1401
+ }, [enterDelay, onOpen]);
1402
+ const handleClose = React.useCallback(event => {
1403
+ clearTimeout(enterTimeoutRef.current);
1404
+ leaveTimeoutRef.current = setTimeout(() => {
1405
+ setIsOpen(false);
1406
+ onClose === null || onClose === void 0 ? void 0 : onClose(event);
1407
+ }, leaveDelay);
1408
+ }, [leaveDelay, onClose]);
1409
+ React.useEffect(() => {
1410
+ return () => {
1411
+ clearTimeout(enterTimeoutRef.current);
1412
+ clearTimeout(leaveTimeoutRef.current);
1413
+ };
1414
+ }, []); // Clone child and attach event handlers
1415
+
1416
+ const childElement = React__default["default"].Children.only(children);
1417
+ const childProps = {
1418
+ ref: node => {
1419
+ anchorRef.current = node;
1420
+ const childRef = childElement.ref;
1421
+ if (typeof childRef === "function") childRef(node);else if (childRef) childRef.current = node;
1422
+ }
1423
+ };
1424
+
1425
+ if (!disableHoverListener) {
1426
+ childProps.onMouseEnter = e => {
1427
+ var _childElement$props$o, _childElement$props;
1428
+
1429
+ handleOpen(e);
1430
+ (_childElement$props$o = (_childElement$props = childElement.props).onMouseEnter) === null || _childElement$props$o === void 0 ? void 0 : _childElement$props$o.call(_childElement$props, e);
1431
+ };
1432
+
1433
+ childProps.onMouseLeave = e => {
1434
+ var _childElement$props$o2, _childElement$props2;
1435
+
1436
+ handleClose(e);
1437
+ (_childElement$props$o2 = (_childElement$props2 = childElement.props).onMouseLeave) === null || _childElement$props$o2 === void 0 ? void 0 : _childElement$props$o2.call(_childElement$props2, e);
1438
+ };
1439
+ }
1440
+
1441
+ if (!disableFocusListener) {
1442
+ childProps.onFocus = e => {
1443
+ var _childElement$props$o3, _childElement$props3;
1444
+
1445
+ handleOpen(e);
1446
+ (_childElement$props$o3 = (_childElement$props3 = childElement.props).onFocus) === null || _childElement$props$o3 === void 0 ? void 0 : _childElement$props$o3.call(_childElement$props3, e);
1447
+ };
1448
+
1449
+ childProps.onBlur = e => {
1450
+ var _childElement$props$o4, _childElement$props4;
1451
+
1452
+ handleClose(e);
1453
+ (_childElement$props$o4 = (_childElement$props4 = childElement.props).onBlur) === null || _childElement$props$o4 === void 0 ? void 0 : _childElement$props$o4.call(_childElement$props4, e);
1454
+ };
1455
+ }
1456
+
1457
+ const clonedChild = /*#__PURE__*/React__default["default"].cloneElement(childElement, childProps);
1458
+ if (!title) return clonedChild;
1459
+ const tooltipContent = open ? /*#__PURE__*/ReactDOM.createPortal( /*#__PURE__*/React__default["default"].createElement("div", {
1460
+ ref: tooltipRef,
1461
+ role: "tooltip",
1462
+ style: _objectSpread(_objectSpread({}, tooltipStyle), popperStyle)
1463
+ }, title), document.body) : null;
1464
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, clonedChild, tooltipContent);
1465
+ });
1466
+ BaseTooltip.displayName = "BaseTooltip";
1467
+ withSx.withSx(BaseTooltip);
1468
+ /**
1469
+ * Divider - Visual separator (replaces MUI Divider)
1470
+ */
1471
+
1472
+ const BaseDivider = /*#__PURE__*/React__default["default"].forwardRef((_ref12, ref) => {
1473
+ let {
1474
+ orientation = "horizontal",
1475
+ variant = "fullWidth",
1476
+ flexItem = false,
1477
+ light = false,
1478
+ textAlign = "center",
1479
+ children,
1480
+ component,
1481
+ style
1482
+ } = _ref12,
1483
+ props = _objectWithoutProperties__default["default"](_ref12, _excluded11);
1484
+
1485
+ const {
1486
+ colors
1487
+ } = ThemeProvider.useTheme();
1488
+ const hasChildren = !!children;
1489
+ const Component = component || (hasChildren ? "div" : "hr");
1490
+ const borderColor = light ? "rgba(0, 0, 0, 0.08)" : (colors === null || colors === void 0 ? void 0 : colors.borderColor) || "rgba(0, 0, 0, 0.12)";
1491
+ const dividerStyle = React.useMemo(() => {
1492
+ const isHorizontal = orientation === "horizontal";
1493
+ const baseStyle = {
1494
+ margin: 0,
1495
+ flexShrink: 0,
1496
+ borderWidth: 0,
1497
+ borderStyle: "solid",
1498
+ borderColor: borderColor
1499
+ };
1500
+
1501
+ if (isHorizontal) {
1502
+ baseStyle.borderBottomWidth = "thin";
1503
+ baseStyle.width = "100%";
1504
+
1505
+ if (variant === "inset") {
1506
+ baseStyle.marginLeft = "72px";
1507
+ } else if (variant === "middle") {
1508
+ baseStyle.marginLeft = "16px";
1509
+ baseStyle.marginRight = "16px";
1510
+ }
1511
+ } else {
1512
+ baseStyle.height = "100%";
1513
+ baseStyle.borderRightWidth = "thin";
1514
+
1515
+ if (variant === "middle") {
1516
+ baseStyle.marginTop = "8px";
1517
+ baseStyle.marginBottom = "8px";
1518
+ }
1519
+ }
1520
+
1521
+ if (flexItem) {
1522
+ baseStyle.alignSelf = "stretch";
1523
+ baseStyle.height = "auto";
1524
+ }
1525
+
1526
+ if (hasChildren) {
1527
+ baseStyle.display = "flex";
1528
+ baseStyle.alignItems = "center";
1529
+ baseStyle.textAlign = textAlign;
1530
+ baseStyle.borderWidth = 0;
1531
+ }
1532
+
1533
+ return _objectSpread(_objectSpread({}, baseStyle), style);
1534
+ }, [orientation, variant, flexItem, light, hasChildren, textAlign, style, borderColor]);
1535
+
1536
+ if (hasChildren) {
1537
+ const lineStyle = {
1538
+ flex: 1,
1539
+ borderTop: "thin solid ".concat(borderColor)
1540
+ };
1541
+ return /*#__PURE__*/React__default["default"].createElement(Component, _extends__default["default"]({
1542
+ ref: ref,
1543
+ style: dividerStyle,
1544
+ role: "separator"
1545
+ }, props), textAlign !== "right" && /*#__PURE__*/React__default["default"].createElement("span", {
1546
+ style: lineStyle
1547
+ }), /*#__PURE__*/React__default["default"].createElement("span", {
1548
+ style: {
1549
+ padding: "0 8px",
1550
+ display: "inline-block"
1551
+ }
1552
+ }, children), textAlign !== "left" && /*#__PURE__*/React__default["default"].createElement("span", {
1553
+ style: lineStyle
1554
+ }));
1555
+ }
1556
+
1557
+ return /*#__PURE__*/React__default["default"].createElement(Component, _extends__default["default"]({
1558
+ ref: ref,
1559
+ style: dividerStyle,
1560
+ role: "separator",
1561
+ "aria-orientation": orientation
1562
+ }, props));
1563
+ });
1564
+ BaseDivider.displayName = "BaseDivider";
1565
+ withSx.withSx(BaseDivider); // Export the context for advanced use cases
1566
+
1567
+ exports.Alert = Alert;
1568
+ exports.AlertTitle = AlertTitle;
1569
+ exports.Drawer = Drawer;
1570
+ exports.Menu = Menu;
1571
+ exports.MenuItem = MenuItem;
1572
+ exports.OverlayStackContext = OverlayStackContext;
1573
+ exports.Popover = Popover;
1574
+ exports.PopoverContext = PopoverContext;
1575
+ exports.Snackbar = Snackbar;
1576
+ exports.Tab = Tab;
1577
+ exports.Tabs = Tabs;
1578
+ exports.useOverlayStack = useOverlayStack;