@simplybusiness/mobius 10.4.1 → 10.4.3

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 (73) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/components/Popover/Arrow.js +43 -0
  3. package/dist/cjs/components/Popover/Arrow.js.map +7 -0
  4. package/dist/cjs/components/Popover/Popover.js +258 -83
  5. package/dist/cjs/components/Popover/Popover.js.map +4 -4
  6. package/dist/cjs/components/Popover/index.js +258 -83
  7. package/dist/cjs/components/Popover/index.js.map +4 -4
  8. package/dist/cjs/components/Popover/useAutoUpdate.js +53 -0
  9. package/dist/cjs/components/Popover/useAutoUpdate.js.map +7 -0
  10. package/dist/cjs/components/Popover/useFloatingPosition.js +128 -0
  11. package/dist/cjs/components/Popover/useFloatingPosition.js.map +7 -0
  12. package/dist/cjs/components/Popover/useOutsidePress.js +46 -0
  13. package/dist/cjs/components/Popover/useOutsidePress.js.map +7 -0
  14. package/dist/cjs/components/index.js +422 -245
  15. package/dist/cjs/components/index.js.map +4 -4
  16. package/dist/cjs/index.js +422 -245
  17. package/dist/cjs/index.js.map +4 -4
  18. package/dist/cjs/meta.json +316 -32
  19. package/dist/esm/chunk-26KZYRE6.js +108 -0
  20. package/dist/esm/chunk-26KZYRE6.js.map +7 -0
  21. package/dist/esm/chunk-CAL44W47.js +23 -0
  22. package/dist/esm/chunk-CAL44W47.js.map +7 -0
  23. package/dist/esm/{chunk-PEEQNAIN.js → chunk-DMYDWKKA.js} +4 -4
  24. package/dist/esm/chunk-K3ECDAUR.js +33 -0
  25. package/dist/esm/chunk-K3ECDAUR.js.map +7 -0
  26. package/dist/esm/{chunk-GJBH37DH.js → chunk-KFHPI67N.js} +4 -4
  27. package/dist/esm/{chunk-F5ELD54X.js → chunk-LGZWQZLS.js} +2 -2
  28. package/dist/esm/{chunk-OAG5T7NC.js → chunk-NEFRXIFY.js} +4 -4
  29. package/dist/esm/chunk-VZ3IWSK6.js +158 -0
  30. package/dist/esm/chunk-VZ3IWSK6.js.map +7 -0
  31. package/dist/esm/chunk-WYJP7HVL.js +26 -0
  32. package/dist/esm/chunk-WYJP7HVL.js.map +7 -0
  33. package/dist/esm/components/AddressLookup/AddressLookup.js +4 -4
  34. package/dist/esm/components/AddressLookup/index.js +6 -6
  35. package/dist/esm/components/Breadcrumbs/index.js +3 -3
  36. package/dist/esm/components/Checkbox/index.js +1 -1
  37. package/dist/esm/components/Combobox/Combobox.js +3 -3
  38. package/dist/esm/components/Combobox/index.js +3 -3
  39. package/dist/esm/components/Drawer/index.js +3 -3
  40. package/dist/esm/components/Modal/index.js +3 -3
  41. package/dist/esm/components/Popover/Arrow.js +8 -0
  42. package/dist/esm/components/Popover/Arrow.js.map +7 -0
  43. package/dist/esm/components/Popover/Popover.js +5 -1
  44. package/dist/esm/components/Popover/index.js +5 -1
  45. package/dist/esm/components/Popover/useAutoUpdate.js +8 -0
  46. package/dist/esm/components/Popover/useAutoUpdate.js.map +7 -0
  47. package/dist/esm/components/Popover/useFloatingPosition.js +8 -0
  48. package/dist/esm/components/Popover/useFloatingPosition.js.map +7 -0
  49. package/dist/esm/components/Popover/useOutsidePress.js +8 -0
  50. package/dist/esm/components/Popover/useOutsidePress.js.map +7 -0
  51. package/dist/esm/components/index.js +77 -73
  52. package/dist/esm/index.js +77 -73
  53. package/dist/esm/meta.json +3737 -3401
  54. package/dist/tsconfig.build.tsbuildinfo +1 -1
  55. package/dist/types/components/Popover/Arrow.d.ts +9 -0
  56. package/dist/types/components/Popover/useAutoUpdate.d.ts +9 -0
  57. package/dist/types/components/Popover/useFloatingPosition.d.ts +17 -0
  58. package/dist/types/components/Popover/useOutsidePress.d.ts +9 -0
  59. package/package.json +2 -3
  60. package/src/components/Popover/Arrow.tsx +25 -0
  61. package/src/components/Popover/Popover.characterization.test.tsx +269 -0
  62. package/src/components/Popover/Popover.stories.tsx +40 -3
  63. package/src/components/Popover/Popover.test.tsx +6 -2
  64. package/src/components/Popover/Popover.tsx +87 -81
  65. package/src/components/Popover/useAutoUpdate.ts +43 -0
  66. package/src/components/Popover/useFloatingPosition.ts +177 -0
  67. package/src/components/Popover/useOutsidePress.ts +31 -0
  68. package/dist/esm/chunk-O5YEU5TG.js +0 -155
  69. package/dist/esm/chunk-O5YEU5TG.js.map +0 -7
  70. /package/dist/esm/{chunk-PEEQNAIN.js.map → chunk-DMYDWKKA.js.map} +0 -0
  71. /package/dist/esm/{chunk-GJBH37DH.js.map → chunk-KFHPI67N.js.map} +0 -0
  72. /package/dist/esm/{chunk-F5ELD54X.js.map → chunk-LGZWQZLS.js.map} +0 -0
  73. /package/dist/esm/{chunk-OAG5T7NC.js.map → chunk-NEFRXIFY.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 10.4.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 3c9c9ba: Replace `@floating-ui/react` inside `Popover` with a local ~150-line positioning implementation (offset + shift + flip + arrow + autoUpdate + outside-press). Public API unchanged. The dependency is still declared for this release so the swap can be reverted in a single commit; removal follows in a subsequent patch.
8
+ - 3c9c9ba: Remove `@floating-ui/react` dependency. Popover's local implementation replaced it in the previous release; consumers saw the bundle benefit then via tree-shaking, and now the dep itself is gone from `package.json` and `yarn.lock`.
9
+
10
+ ## 10.4.2
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies [14c08d7]
15
+ - @simplybusiness/mobius-hooks@0.2.0
16
+
3
17
  ## 10.4.1
4
18
 
5
19
  ### Patch Changes
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/components/Popover/Arrow.tsx
21
+ var Arrow_exports = {};
22
+ __export(Arrow_exports, {
23
+ Arrow: () => Arrow
24
+ });
25
+ module.exports = __toCommonJS(Arrow_exports);
26
+ var import_jsx_runtime = require("react/jsx-runtime");
27
+ var Arrow = ({ ref, width = 20, className, style }) => {
28
+ const height = width / 2;
29
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
30
+ "svg",
31
+ {
32
+ ref,
33
+ className,
34
+ "aria-hidden": "true",
35
+ width,
36
+ height,
37
+ viewBox: `0 0 ${width} ${height}`,
38
+ style,
39
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: `M0,0 H${width} L${width / 2},${height} Z` })
40
+ }
41
+ );
42
+ };
43
+ //# sourceMappingURL=Arrow.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/components/Popover/Arrow.tsx"],
4
+ "sourcesContent": ["import type { CSSProperties, Ref } from \"react\";\n\ninterface ArrowProps {\n ref?: Ref<SVGSVGElement>;\n width?: number;\n className?: string;\n style?: CSSProperties;\n}\n\nexport const Arrow = ({ ref, width = 20, className, style }: ArrowProps) => {\n const height = width / 2;\n return (\n <svg\n ref={ref}\n className={className}\n aria-hidden=\"true\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n style={style}\n >\n <path d={`M0,0 H${width} L${width / 2},${height} Z`} />\n </svg>\n );\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBM;AAZC,IAAM,QAAQ,CAAC,EAAE,KAAK,QAAQ,IAAI,WAAW,MAAM,MAAkB;AAC1E,QAAM,SAAS,QAAQ;AACvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,eAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,SAAS,OAAO,KAAK,IAAI,MAAM;AAAA,MAC/B;AAAA,MAEA,sDAAC,UAAK,GAAG,SAAS,KAAK,KAAK,QAAQ,CAAC,IAAI,MAAM,MAAM;AAAA;AAAA,EACvD;AAEJ;",
6
+ "names": []
7
+ }
@@ -33,10 +33,10 @@ __export(Popover_exports, {
33
33
  Popover: () => Popover
34
34
  });
35
35
  module.exports = __toCommonJS(Popover_exports);
36
- var import_react2 = require("@floating-ui/react");
37
36
  var import_icons3 = require("@simplybusiness/icons");
38
37
  var import_dedupe3 = __toESM(require("classnames/dedupe"));
39
- var import_react3 = require("react");
38
+ var import_react5 = require("react");
39
+ var import_react_dom = require("react-dom");
40
40
  var import_mobius_hooks = require("@simplybusiness/mobius-hooks");
41
41
 
42
42
  // src/components/Button/Button.tsx
@@ -241,54 +241,224 @@ var Button = ({ ref, ...props }) => {
241
241
  };
242
242
  Button.displayName = "Button";
243
243
 
244
+ // src/components/Popover/Arrow.tsx
245
+ var import_jsx_runtime6 = require("react/jsx-runtime");
246
+ var Arrow = ({ ref, width = 20, className, style }) => {
247
+ const height = width / 2;
248
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
249
+ "svg",
250
+ {
251
+ ref,
252
+ className,
253
+ "aria-hidden": "true",
254
+ width,
255
+ height,
256
+ viewBox: `0 0 ${width} ${height}`,
257
+ style,
258
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("path", { d: `M0,0 H${width} L${width / 2},${height} Z` })
259
+ }
260
+ );
261
+ };
262
+
263
+ // src/components/Popover/useAutoUpdate.ts
264
+ var import_react2 = require("react");
265
+ var useAutoUpdate = ({
266
+ referenceRef,
267
+ floatingRef,
268
+ onUpdate,
269
+ enabled
270
+ }) => {
271
+ (0, import_react2.useEffect)(() => {
272
+ if (!enabled) return;
273
+ const reference = referenceRef.current;
274
+ const floating = floatingRef.current;
275
+ const scrollOpts = {
276
+ capture: true,
277
+ passive: true
278
+ };
279
+ window.addEventListener("scroll", onUpdate, scrollOpts);
280
+ window.addEventListener("resize", onUpdate, { passive: true });
281
+ const observer = typeof ResizeObserver === "function" ? new ResizeObserver(onUpdate) : null;
282
+ if (observer && reference) observer.observe(reference);
283
+ if (observer && floating) observer.observe(floating);
284
+ return () => {
285
+ window.removeEventListener("scroll", onUpdate, scrollOpts);
286
+ window.removeEventListener("resize", onUpdate);
287
+ observer?.disconnect();
288
+ };
289
+ }, [enabled, onUpdate, referenceRef, floatingRef]);
290
+ };
291
+
292
+ // src/components/Popover/useFloatingPosition.ts
293
+ var import_react3 = require("react");
294
+ var ABSOLUTE_FLOATING_STYLES = {
295
+ position: "absolute",
296
+ top: 0,
297
+ left: 0,
298
+ width: "max-content"
299
+ };
300
+ var FIXED_FLOATING_STYLES = {
301
+ position: "fixed",
302
+ top: 0,
303
+ left: 0,
304
+ width: "max-content"
305
+ };
306
+ var INITIAL_ARROW_STYLES = {
307
+ position: "absolute"
308
+ };
309
+ var VIEWPORT_PADDING = 0;
310
+ var createsFixedContainingBlock = (el) => {
311
+ const style = window.getComputedStyle(el);
312
+ return style.transform !== "none" || style.filter !== "none" || style.backdropFilter !== "none" || style.perspective !== "none" || /\b(transform|filter|perspective)\b/.test(style.willChange);
313
+ };
314
+ var useFloatingPosition = ({
315
+ referenceRef,
316
+ floatingRef,
317
+ arrowRef,
318
+ isOpen,
319
+ offsetPx,
320
+ arrowWidth,
321
+ useFixedStrategy
322
+ }) => {
323
+ const update = (0, import_react3.useCallback)(() => {
324
+ const reference = referenceRef.current;
325
+ const floating = floatingRef.current;
326
+ if (!reference || !floating) return;
327
+ const refRect = reference.getBoundingClientRect();
328
+ const floatingWidth = floating.offsetWidth;
329
+ const floatingHeight = floating.offsetHeight;
330
+ const scrollX = useFixedStrategy ? 0 : window.scrollX;
331
+ const scrollY = useFixedStrategy ? 0 : window.scrollY;
332
+ const parent = floating.parentElement;
333
+ const parentIsCb = useFixedStrategy && !!parent && createsFixedContainingBlock(parent);
334
+ const boundsRect = parentIsCb ? parent.getBoundingClientRect() : {
335
+ left: 0,
336
+ top: 0,
337
+ right: window.innerWidth,
338
+ bottom: window.innerHeight
339
+ };
340
+ const bottomTopViewport = refRect.bottom + offsetPx;
341
+ const topTopViewport = refRect.top - floatingHeight - offsetPx;
342
+ const overflowsBottom = bottomTopViewport + floatingHeight > boundsRect.bottom;
343
+ const fitsTop = topTopViewport >= boundsRect.top;
344
+ const nextPlacement = overflowsBottom && fitsTop ? "top" : "bottom";
345
+ const topViewport = nextPlacement === "bottom" ? bottomTopViewport : topTopViewport;
346
+ const rawLeftViewport = refRect.left + refRect.width / 2 - floatingWidth / 2;
347
+ const minLeftViewport = boundsRect.left + VIEWPORT_PADDING;
348
+ const maxLeftViewport = Math.max(
349
+ minLeftViewport,
350
+ boundsRect.right - floatingWidth - VIEWPORT_PADDING
351
+ );
352
+ const leftViewport = Math.min(
353
+ Math.max(minLeftViewport, rawLeftViewport),
354
+ maxLeftViewport
355
+ );
356
+ const cbOffsetLeft = parentIsCb ? boundsRect.left : 0;
357
+ const cbOffsetTop = parentIsCb ? boundsRect.top : 0;
358
+ floating.style.top = `${topViewport + scrollY - cbOffsetTop}px`;
359
+ floating.style.left = `${leftViewport + scrollX - cbOffsetLeft}px`;
360
+ const arrow = arrowRef.current;
361
+ if (!arrow) return;
362
+ const arrowHalf = arrowWidth / 2;
363
+ const refCenterX = refRect.left + refRect.width / 2;
364
+ const rawArrowLeft = refCenterX - leftViewport - arrowHalf;
365
+ const maxArrowLeft = Math.max(0, floatingWidth - arrowWidth);
366
+ const arrowLeft = Math.min(Math.max(0, rawArrowLeft), maxArrowLeft);
367
+ arrow.style.left = `${arrowLeft}px`;
368
+ if (nextPlacement === "bottom") {
369
+ arrow.style.bottom = "100%";
370
+ arrow.style.top = "";
371
+ arrow.style.transform = "rotate(180deg)";
372
+ } else {
373
+ arrow.style.top = "100%";
374
+ arrow.style.bottom = "";
375
+ arrow.style.transform = "";
376
+ }
377
+ }, [
378
+ referenceRef,
379
+ floatingRef,
380
+ arrowRef,
381
+ offsetPx,
382
+ arrowWidth,
383
+ useFixedStrategy
384
+ ]);
385
+ (0, import_react3.useLayoutEffect)(() => {
386
+ if (!isOpen) return;
387
+ update();
388
+ }, [isOpen, update]);
389
+ return {
390
+ initialFloatingStyles: useFixedStrategy ? FIXED_FLOATING_STYLES : ABSOLUTE_FLOATING_STYLES,
391
+ initialArrowStyles: INITIAL_ARROW_STYLES,
392
+ update
393
+ };
394
+ };
395
+
396
+ // src/components/Popover/useOutsidePress.ts
397
+ var import_react4 = require("react");
398
+ var useOutsidePress = ({
399
+ referenceRef,
400
+ floatingRef,
401
+ enabled,
402
+ onOutsidePress
403
+ }) => {
404
+ (0, import_react4.useEffect)(() => {
405
+ if (!enabled) return;
406
+ const handler = (event) => {
407
+ const target = event.target;
408
+ if (!target) return;
409
+ if (referenceRef.current?.contains(target)) return;
410
+ if (floatingRef.current?.contains(target)) return;
411
+ onOutsidePress(event);
412
+ };
413
+ document.addEventListener("pointerdown", handler);
414
+ return () => document.removeEventListener("pointerdown", handler);
415
+ }, [enabled, onOutsidePress, referenceRef, floatingRef]);
416
+ };
417
+
244
418
  // src/components/Popover/Popover.tsx
245
419
  var import_Popover = require("@simplybusiness/mobius/src/components/Popover/Popover.css");
246
- var import_jsx_runtime6 = require("react/jsx-runtime");
420
+ var import_jsx_runtime7 = require("react/jsx-runtime");
247
421
  var OFFSET_FROM_CONTENT_DEFAULT = 10;
422
+ var ARROW_WIDTH = 20;
248
423
  var Popover = (props) => {
249
424
  const { trigger, children, onOpen, onClose, className } = props;
250
- const arrowRef = (0, import_react3.useRef)(null);
251
- const floatingContainerRef = (0, import_react3.useRef)(null);
252
- const [isOpen, setIsOpen] = (0, import_react3.useState)(false);
253
- const { refs, floatingStyles, context } = (0, import_react2.useFloating)({
254
- open: isOpen,
255
- onOpenChange: setIsOpen,
256
- whileElementsMounted: import_react2.autoUpdate,
257
- middleware: [
258
- (0, import_react2.arrow)({
259
- element: arrowRef
260
- }),
261
- (0, import_react2.offset)(OFFSET_FROM_CONTENT_DEFAULT),
262
- (0, import_react2.shift)(),
263
- (0, import_react2.flip)()
264
- ]
425
+ const referenceRef = (0, import_react5.useRef)(null);
426
+ const floatingRef = (0, import_react5.useRef)(null);
427
+ const arrowRef = (0, import_react5.useRef)(null);
428
+ const [isOpen, setIsOpen] = (0, import_react5.useState)(false);
429
+ const [portalTarget, setPortalTarget] = (0, import_react5.useState)(null);
430
+ const isInsideDialog = portalTarget !== null && portalTarget.tagName === "DIALOG";
431
+ const { initialFloatingStyles, initialArrowStyles, update } = useFloatingPosition({
432
+ referenceRef,
433
+ floatingRef,
434
+ arrowRef,
435
+ isOpen,
436
+ offsetPx: OFFSET_FROM_CONTENT_DEFAULT,
437
+ arrowWidth: ARROW_WIDTH,
438
+ useFixedStrategy: isInsideDialog
265
439
  });
266
- const dismiss = (0, import_react2.useDismiss)(context, {
267
- bubbles: true,
268
- outsidePress: (event) => {
269
- const toggle = refs.reference.current;
270
- const isToggleClick = !toggle?.contains(event.target);
271
- if (isToggleClick) {
272
- onClose?.();
273
- }
274
- return true;
440
+ useAutoUpdate({
441
+ referenceRef,
442
+ floatingRef,
443
+ onUpdate: update,
444
+ enabled: isOpen
445
+ });
446
+ useOutsidePress({
447
+ referenceRef,
448
+ floatingRef,
449
+ enabled: isOpen,
450
+ onOutsidePress: () => {
451
+ onClose?.();
452
+ setIsOpen(false);
275
453
  }
276
454
  });
277
- const { getReferenceProps, getFloatingProps } = (0, import_react2.useInteractions)([dismiss]);
278
455
  const containerClasses = (0, import_dedupe3.default)(
279
456
  "mobius",
280
457
  "mobius-popover__container",
281
458
  className
282
459
  );
283
- const setFloatingRef = (0, import_react3.useCallback)(
284
- (node) => {
285
- refs.setFloating(node);
286
- floatingContainerRef.current = node;
287
- },
288
- [refs]
289
- );
290
- (0, import_react3.useEffect)(() => {
291
- const el = floatingContainerRef.current;
460
+ (0, import_react5.useEffect)(() => {
461
+ const el = floatingRef.current;
292
462
  if (!el) return;
293
463
  const preventLabelActivation = (e) => {
294
464
  const target = e.target;
@@ -305,68 +475,73 @@ var Popover = (props) => {
305
475
  onClose?.();
306
476
  return;
307
477
  }
478
+ const dialog = referenceRef.current?.closest("dialog");
479
+ setPortalTarget(dialog ?? document.body);
308
480
  setIsOpen(true);
309
481
  onOpen?.();
310
482
  };
311
- const triggerComponent = (0, import_react3.cloneElement)(trigger, {
312
- ref: refs.setReference,
483
+ const setReferenceRef = (0, import_react5.useCallback)((node) => {
484
+ referenceRef.current = node;
485
+ }, []);
486
+ const triggerComponent = (0, import_react5.cloneElement)(trigger, {
487
+ ref: setReferenceRef,
313
488
  className: (0, import_dedupe3.default)(
314
489
  trigger.props.className,
315
490
  "mobius-popover__toggle"
316
491
  ),
317
- onClick: toggleVisibility,
318
- ...getReferenceProps()
492
+ onClick: toggleVisibility
319
493
  });
320
494
  (0, import_mobius_hooks.useWindowEvent)("keydown", (e) => {
321
- if (e.key === "Escape") {
495
+ if (e.key === "Escape" && isOpen) {
496
+ setIsOpen(false);
322
497
  onClose?.();
323
498
  e.preventDefault();
324
499
  e.stopPropagation();
325
500
  }
326
501
  });
327
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
328
- triggerComponent,
329
- isOpen && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
330
- "div",
331
- {
332
- className: containerClasses,
333
- ref: setFloatingRef,
334
- style: floatingStyles,
335
- ...getFloatingProps(),
336
- children: [
337
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mobius-popover", children: [
338
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("header", { className: "mobius-popover__header", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
339
- Button,
340
- {
341
- type: "button",
342
- className: "mobius-popover__close-button",
343
- onClick: toggleVisibility,
344
- "aria-label": "Close",
345
- variant: "ghost",
346
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
347
- Icon,
348
- {
349
- icon: import_icons3.cross,
350
- size: "md",
351
- className: "mobius-popover__close-icon"
352
- }
353
- )
354
- }
355
- ) }),
356
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mobius-popover__body", children })
357
- ] }),
358
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
359
- import_react2.FloatingArrow,
502
+ const floatingElement = isOpen ? /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
503
+ "div",
504
+ {
505
+ className: containerClasses,
506
+ ref: floatingRef,
507
+ style: initialFloatingStyles,
508
+ children: [
509
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "mobius-popover", children: [
510
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("header", { className: "mobius-popover__header", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
511
+ Button,
360
512
  {
361
- ref: arrowRef,
362
- context,
363
- width: 20,
364
- className: "mobius-popover__arrow-icon"
513
+ type: "button",
514
+ className: "mobius-popover__close-button",
515
+ onClick: toggleVisibility,
516
+ "aria-label": "Close",
517
+ variant: "ghost",
518
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
519
+ Icon,
520
+ {
521
+ icon: import_icons3.cross,
522
+ size: "md",
523
+ className: "mobius-popover__close-icon"
524
+ }
525
+ )
365
526
  }
366
- )
367
- ]
368
- }
369
- )
527
+ ) }),
528
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "mobius-popover__body", children })
529
+ ] }),
530
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
531
+ Arrow,
532
+ {
533
+ ref: arrowRef,
534
+ style: initialArrowStyles,
535
+ className: "mobius-popover__arrow-icon",
536
+ width: ARROW_WIDTH
537
+ }
538
+ )
539
+ ]
540
+ }
541
+ ) : null;
542
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
543
+ triggerComponent,
544
+ floatingElement && portalTarget ? (0, import_react_dom.createPortal)(floatingElement, portalTarget) : null
370
545
  ] });
371
546
  };
372
547
  //# sourceMappingURL=Popover.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../src/components/Popover/Popover.tsx", "../../../../src/components/Button/Button.tsx", "../../../../src/components/Button/Loading.tsx", "../../../../src/components/Icon/Icon.tsx", "../../../../src/components/VisuallyHidden/VisuallyHidden.tsx", "../../../../src/hooks/useButton/useButton.tsx", "../../../../src/components/Button/Success.tsx"],
4
- "sourcesContent": ["import {\n FloatingArrow,\n arrow,\n autoUpdate,\n flip,\n offset,\n shift,\n useDismiss,\n useFloating,\n useInteractions,\n} from \"@floating-ui/react\";\nimport { cross } from \"@simplybusiness/icons\";\nimport classNames from \"classnames/dedupe\";\nimport type { ReactElement, ReactNode, RefAttributes } from \"react\";\nimport { cloneElement, useCallback, useEffect, useRef, useState } from \"react\";\nimport { useWindowEvent } from \"@simplybusiness/mobius-hooks\";\nimport type { DOMProps } from \"../../types\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport \"./Popover.css\";\n\nexport type PopoverElementType = HTMLDivElement;\n\nexport interface PopoverProps\n extends DOMProps, RefAttributes<PopoverElementType> {\n children?: ReactNode;\n trigger: ReactElement;\n /** Callback that fires each time the accordion is opened */\n onOpen?: () => void;\n /** Callback that fires each time the accordion is closed */\n onClose?: () => void;\n /** Custom class name for setting specific CSS */\n className?: string;\n}\n\nconst OFFSET_FROM_CONTENT_DEFAULT = 10;\n\nexport const Popover = (props: PopoverProps) => {\n const { trigger, children, onOpen, onClose, className } = props;\n const arrowRef = useRef(null);\n const floatingContainerRef = useRef<HTMLDivElement | null>(null);\n const [isOpen, setIsOpen] = useState(false);\n const { refs, floatingStyles, context } = useFloating({\n open: isOpen,\n onOpenChange: setIsOpen,\n whileElementsMounted: autoUpdate,\n middleware: [\n arrow({\n element: arrowRef,\n }),\n offset(OFFSET_FROM_CONTENT_DEFAULT),\n shift(),\n flip(),\n ],\n });\n const dismiss = useDismiss(context, {\n bubbles: true,\n outsidePress: (event: MouseEvent) => {\n // Prevent 'onClose' from firing when clicking the toggle to close\n const toggle = refs.reference.current as HTMLElement;\n const isToggleClick = !toggle?.contains(event.target as HTMLElement);\n if (isToggleClick) {\n onClose?.();\n }\n return true;\n },\n });\n const { getReferenceProps, getFloatingProps } = useInteractions([dismiss]);\n\n const containerClasses = classNames(\n \"mobius\",\n \"mobius-popover__container\",\n className,\n );\n\n const setFloatingRef = useCallback(\n (node: HTMLDivElement | null) => {\n refs.setFloating(node);\n floatingContainerRef.current = node;\n },\n [refs],\n );\n\n // Native listener to prevent clicks inside the popover from activating\n // interactive ancestors. Must be native because React's onClick fires\n // too late via delegation.\n useEffect(() => {\n const el = floatingContainerRef.current;\n if (!el) return;\n\n const preventLabelActivation = (e: Event) => {\n const target = e.target as HTMLElement;\n // Allow default behavior for interactive elements (links, inputs, etc.)\n // so they remain functional inside the popover.\n if (!target.closest(\"a[href], input, select, textarea\")) {\n e.preventDefault();\n }\n };\n el.addEventListener(\"click\", preventLabelActivation);\n return () => el.removeEventListener(\"click\", preventLabelActivation);\n }, [isOpen]);\n\n const toggleVisibility = () => {\n if (isOpen) {\n setIsOpen(false);\n onClose?.();\n return;\n }\n\n setIsOpen(true);\n onOpen?.();\n };\n\n const triggerComponent = cloneElement(trigger, {\n ref: refs.setReference,\n className: classNames(\n (trigger.props as { className?: string }).className,\n \"mobius-popover__toggle\",\n ),\n onClick: toggleVisibility,\n ...getReferenceProps(),\n } as Record<string, unknown>);\n\n useWindowEvent(\"keydown\", e => {\n if (e.key === \"Escape\") {\n onClose?.();\n e.preventDefault();\n e.stopPropagation();\n }\n });\n\n return (\n <>\n {triggerComponent}\n {isOpen && (\n <div\n className={containerClasses}\n ref={setFloatingRef}\n style={floatingStyles}\n {...getFloatingProps()}\n >\n <div className=\"mobius-popover\">\n <header className=\"mobius-popover__header\">\n <Button\n type=\"button\"\n className=\"mobius-popover__close-button\"\n onClick={toggleVisibility}\n aria-label=\"Close\"\n variant=\"ghost\"\n >\n <Icon\n icon={cross}\n size=\"md\"\n className=\"mobius-popover__close-icon\"\n />\n </Button>\n </header>\n <div className=\"mobius-popover__body\">{children}</div>\n </div>\n <FloatingArrow\n ref={arrowRef}\n context={context}\n width={20}\n className=\"mobius-popover__arrow-icon\"\n />\n </div>\n )}\n </>\n );\n};\n", "\"use client\";\n\nimport type { MouseEvent, ReactNode, RefAttributes } from \"react\";\nimport classNames from \"classnames/dedupe\";\nimport type { DOMProps } from \"../../types/dom\";\nimport { Loading } from \"./Loading\";\nimport type { UseButtonProps } from \"../../hooks/useButton\";\nimport { useButton } from \"../../hooks/useButton\";\nimport { Success } from \"./Success\";\nimport \"./Button.css\";\n\nexport type ButtonElementType = HTMLButtonElement;\n\nexport type Variant = \"primary\" | \"secondary\" | \"ghost\" | \"basic\" | \"link\";\n\nexport type Size = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps\n extends UseButtonProps, DOMProps, RefAttributes<ButtonElementType> {\n /** The name of the button when submitted in a form */\n name?: string | undefined;\n /** The value of the button when submitted in a form */\n value?: string | undefined;\n /** Custom class name for setting specific CSS */\n className?: string;\n /** Shortlist of styles */\n variant?: Variant;\n size?: Size;\n /** Display loading spinner */\n isLoading?: boolean;\n /** Display success style */\n isSuccess?: boolean;\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n children?: ReactNode;\n}\n\nconst Button = ({ ref, ...props }: ButtonProps) => {\n const {\n children,\n elementType: Component = \"button\" as React.ElementType,\n isDisabled,\n isLoading,\n isSuccess,\n variant = \"primary\",\n size = \"md\",\n\n onPress,\n\n onClick,\n ...otherProps\n } = props;\n const { buttonProps } = useButton(props);\n\n // Reshape class name and apply to outer element\n otherProps.className = classNames(\n \"mobius\",\n \"mobius-button\",\n `--variant-${variant}`,\n `--size-${size}`,\n {\n \"--is-disabled\": isDisabled,\n \"--is-loading\": isLoading,\n \"--is-success\": isSuccess && !isLoading,\n },\n otherProps.className,\n );\n\n return (\n <Component ref={ref} {...buttonProps} {...otherProps}>\n {isLoading ? <Loading>{children}</Loading> : children}\n {isSuccess && !isLoading && <Success />}\n </Component>\n );\n};\n\nButton.displayName = \"Button\";\nexport { Button };\n", "import type { ReactNode } from \"react\";\nimport { loading } from \"@simplybusiness/icons\";\nimport { Icon } from \"../Icon\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\n\ntype LoadingProps = {\n children: ReactNode;\n};\n\nconst Loading = (props: LoadingProps) => {\n const { children } = props;\n\n return (\n <>\n <div className=\"mobius-button__icon-wrapper\">\n <Icon icon={loading} spin size=\"md\" />\n </div>\n <VisuallyHidden className=\"mobius-button__loading-text\">\n Loading\n </VisuallyHidden>\n {children}\n </>\n );\n};\n\nexport { Loading };\n", "import classNames from \"classnames/dedupe\";\nimport type { IconProps } from \"./types\";\nimport \"./Icon.css\";\n\nconst ICON_PREFIX = \"mobius-icon\";\n\nconst capitaliseFirstLetter = (str: string) =>\n str.charAt(0).toUpperCase() + str.slice(1);\n\nexport function Icon({\n ref,\n icon,\n className,\n size = \"xs\",\n color,\n fixedWidth,\n spin,\n spinReverse,\n title,\n ...otherProps\n}: IconProps) {\n if (!icon) {\n throw new Error(\"Must specify icon object\");\n }\n\n const classes = classNames(\n \"mobius\",\n \"mobius-icon\",\n `svg-inline--${ICON_PREFIX}`,\n `--size-${size}`,\n className,\n {\n [`${ICON_PREFIX}-fw`]: fixedWidth,\n [`${ICON_PREFIX}-spin`]: spin || spinReverse,\n [`${ICON_PREFIX}-spin-reverse`]: spinReverse,\n },\n );\n\n const { iconName, width, height, svgPathData } = icon;\n const formattedIconName = iconName.split(\"-\").join(\" \");\n\n const defaultTitle = `${capitaliseFirstLetter(formattedIconName)} icon`;\n const titleText = title || defaultTitle;\n\n return (\n <svg\n ref={ref}\n focusable=\"false\"\n data-icon={iconName}\n className={classes}\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${width} ${height}`}\n style={{ color }}\n {...otherProps}\n >\n <title>{titleText}</title>\n <path fill=\"currentColor\" d={svgPathData} />\n </svg>\n );\n}\n", "import type { AriaRole, JSXElementConstructor, ReactNode } from \"react\";\n\nexport interface VisuallyHiddenProps {\n /** The content to visually hide. */\n children?: ReactNode;\n id?: string;\n role?: AriaRole;\n\n className?: string;\n\n /**\n * The element type for the container. Defaults to 'div'\n */\n elementType?: string | JSXElementConstructor<any>;\n}\n\nexport function VisuallyHidden(props: VisuallyHiddenProps) {\n const {\n className,\n children,\n elementType: Component = \"div\",\n ...otherProps\n } = props;\n\n return (\n <Component\n className={className}\n style={{\n border: 0,\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: 0,\n position: \"absolute\",\n width: \"1px\",\n whiteSpace: \"nowrap\",\n }}\n {...otherProps}\n >\n {children}\n </Component>\n );\n}\n", "import type { JSXElementConstructor } from \"react\";\nimport { useCallback } from \"react\";\n\nexport interface UseButtonProps {\n elementType?:\n | \"button\"\n | \"a\"\n | \"span\"\n | \"input\"\n | JSXElementConstructor<unknown>\n | undefined;\n type?: \"button\" | \"submit\" | \"reset\";\n isDisabled?: boolean;\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n onPress?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n href?: string;\n target?: string;\n rel?: string;\n role?: string;\n name?: string | undefined;\n value?: string | undefined;\n}\n\nexport function useButton({\n elementType = \"button\",\n type = \"button\",\n isDisabled = false,\n href,\n target,\n rel,\n role,\n name,\n value,\n onClick,\n onPress,\n}: UseButtonProps) {\n const realOnClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n if (isDisabled) {\n return;\n }\n\n onClick?.(event);\n onPress?.(event);\n },\n [isDisabled, onClick, onPress],\n );\n\n function getRole() {\n if (role) {\n return role;\n }\n\n if (elementType === \"a\") {\n return undefined;\n }\n\n return \"button\";\n }\n\n const extraProps =\n elementType === \"button\"\n ? { type }\n : {\n role: getRole(),\n };\n\n return {\n buttonProps: {\n href: elementType === \"a\" ? href : undefined,\n target: elementType === \"a\" ? target : undefined,\n rel: elementType === \"a\" ? rel : undefined,\n tabIndex: isDisabled ? -1 : 0,\n disabled: isDisabled || undefined,\n \"aria-disabled\": isDisabled || undefined,\n name:\n elementType === \"input\" || elementType === \"button\" ? name : undefined,\n value:\n elementType === \"input\" || elementType === \"button\" ? value : undefined,\n ...extraProps,\n onClick: realOnClick,\n },\n };\n}\n", "import { tick } from \"@simplybusiness/icons\";\nimport { Icon } from \"../Icon\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\n\nconst Success = () => (\n <>\n <div className=\"mobius-button__icon-wrapper\">\n <Icon icon={tick} size=\"md\" />\n </div>\n <VisuallyHidden className=\"mobius-button__success-text\">\n Success\n </VisuallyHidden>\n </>\n);\n\nexport { Success };\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,gBAUO;AACP,IAAAC,gBAAsB;AACtB,IAAAC,iBAAuB;AAEvB,IAAAF,gBAAuE;AACvE,0BAA+B;;;ACZ/B,IAAAG,iBAAuB;;;ACFvB,mBAAwB;;;ACDxB,oBAAuB;AAEvB,kBAAO;AA2CH;AAzCJ,IAAM,cAAc;AAEpB,IAAM,wBAAwB,CAAC,QAC7B,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAEpC,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAc;AACZ,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,QAAM,cAAU,cAAAC;AAAA,IACd;AAAA,IACA;AAAA,IACA,eAAe,WAAW;AAAA,IAC1B,UAAU,IAAI;AAAA,IACd;AAAA,IACA;AAAA,MACE,CAAC,GAAG,WAAW,KAAK,GAAG;AAAA,MACvB,CAAC,GAAG,WAAW,OAAO,GAAG,QAAQ;AAAA,MACjC,CAAC,GAAG,WAAW,eAAe,GAAG;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,EAAE,UAAU,OAAO,QAAQ,YAAY,IAAI;AACjD,QAAM,oBAAoB,SAAS,MAAM,GAAG,EAAE,KAAK,GAAG;AAEtD,QAAM,eAAe,GAAG,sBAAsB,iBAAiB,CAAC;AAChE,QAAM,YAAY,SAAS;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MACV,aAAW;AAAA,MACX,WAAW;AAAA,MACX,MAAK;AAAA,MACL,OAAM;AAAA,MACN,SAAS,OAAO,KAAK,IAAI,MAAM;AAAA,MAC/B,OAAO,EAAE,MAAM;AAAA,MACd,GAAG;AAAA,MAEJ;AAAA,oDAAC,WAAO,qBAAU;AAAA,QAClB,4CAAC,UAAK,MAAK,gBAAe,GAAG,aAAa;AAAA;AAAA;AAAA,EAC5C;AAEJ;;;ACnCI,IAAAC,sBAAA;AATG,SAAS,eAAe,OAA4B;AACzD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,aAAa,YAAY;AAAA,IACzB,GAAG;AAAA,EACL,IAAI;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;AF/BI,IAAAC,sBAAA;AAJJ,IAAM,UAAU,CAAC,UAAwB;AACvC,QAAM,EAAE,SAAS,IAAI;AAErB,SACE,8EACE;AAAA,iDAAC,SAAI,WAAU,+BACb,uDAAC,QAAK,MAAM,sBAAS,MAAI,MAAC,MAAK,MAAK,GACtC;AAAA,IACA,6CAAC,kBAAe,WAAU,+BAA8B,qBAExD;AAAA,IACC;AAAA,KACH;AAEJ;;;AGtBA,mBAA4B;AAsBrB,SAAS,UAAU;AAAA,EACxB,cAAc;AAAA,EACd,OAAO;AAAA,EACP,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,kBAAc;AAAA,IAClB,CAAC,UAA+C;AAC9C,UAAI,YAAY;AACd;AAAA,MACF;AAEA,gBAAU,KAAK;AACf,gBAAU,KAAK;AAAA,IACjB;AAAA,IACA,CAAC,YAAY,SAAS,OAAO;AAAA,EAC/B;AAEA,WAAS,UAAU;AACjB,QAAI,MAAM;AACR,aAAO;AAAA,IACT;AAEA,QAAI,gBAAgB,KAAK;AACvB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,aACJ,gBAAgB,WACZ,EAAE,KAAK,IACP;AAAA,IACE,MAAM,QAAQ;AAAA,EAChB;AAEN,SAAO;AAAA,IACL,aAAa;AAAA,MACX,MAAM,gBAAgB,MAAM,OAAO;AAAA,MACnC,QAAQ,gBAAgB,MAAM,SAAS;AAAA,MACvC,KAAK,gBAAgB,MAAM,MAAM;AAAA,MACjC,UAAU,aAAa,KAAK;AAAA,MAC5B,UAAU,cAAc;AAAA,MACxB,iBAAiB,cAAc;AAAA,MAC/B,MACE,gBAAgB,WAAW,gBAAgB,WAAW,OAAO;AAAA,MAC/D,OACE,gBAAgB,WAAW,gBAAgB,WAAW,QAAQ;AAAA,MAChE,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AAAA,EACF;AACF;;;ACnFA,IAAAC,gBAAqB;AAKnB,IAAAC,sBAAA;AADF,IAAM,UAAU,MACd,8EACE;AAAA,+CAAC,SAAI,WAAU,+BACb,uDAAC,QAAK,MAAM,oBAAM,MAAK,MAAK,GAC9B;AAAA,EACA,6CAAC,kBAAe,WAAU,+BAA8B,qBAExD;AAAA,GACF;;;ALHF,oBAAO;AA2DH,IAAAC,sBAAA;AAhCJ,IAAM,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,MAAmB;AACjD,QAAM;AAAA,IACJ;AAAA,IACA,aAAa,YAAY;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IAEP;AAAA,IAEA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,EAAE,YAAY,IAAI,UAAU,KAAK;AAGvC,aAAW,gBAAY,eAAAC;AAAA,IACrB;AAAA,IACA;AAAA,IACA,aAAa,OAAO;AAAA,IACpB,UAAU,IAAI;AAAA,IACd;AAAA,MACE,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,gBAAgB,aAAa,CAAC;AAAA,IAChC;AAAA,IACA,WAAW;AAAA,EACb;AAEA,SACE,8CAAC,aAAU,KAAW,GAAG,aAAc,GAAG,YACvC;AAAA,gBAAY,6CAAC,WAAS,UAAS,IAAa;AAAA,IAC5C,aAAa,CAAC,aAAa,6CAAC,WAAQ;AAAA,KACvC;AAEJ;AAEA,OAAO,cAAc;;;ADxDrB,qBAAO;AAiHH,IAAAC,sBAAA;AAjGJ,IAAM,8BAA8B;AAE7B,IAAM,UAAU,CAAC,UAAwB;AAC9C,QAAM,EAAE,SAAS,UAAU,QAAQ,SAAS,UAAU,IAAI;AAC1D,QAAM,eAAW,sBAAO,IAAI;AAC5B,QAAM,2BAAuB,sBAA8B,IAAI;AAC/D,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAC1C,QAAM,EAAE,MAAM,gBAAgB,QAAQ,QAAI,2BAAY;AAAA,IACpD,MAAM;AAAA,IACN,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,YAAY;AAAA,UACV,qBAAM;AAAA,QACJ,SAAS;AAAA,MACX,CAAC;AAAA,UACD,sBAAO,2BAA2B;AAAA,UAClC,qBAAM;AAAA,UACN,oBAAK;AAAA,IACP;AAAA,EACF,CAAC;AACD,QAAM,cAAU,0BAAW,SAAS;AAAA,IAClC,SAAS;AAAA,IACT,cAAc,CAAC,UAAsB;AAEnC,YAAM,SAAS,KAAK,UAAU;AAC9B,YAAM,gBAAgB,CAAC,QAAQ,SAAS,MAAM,MAAqB;AACnE,UAAI,eAAe;AACjB,kBAAU;AAAA,MACZ;AACA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACD,QAAM,EAAE,mBAAmB,iBAAiB,QAAI,+BAAgB,CAAC,OAAO,CAAC;AAEzE,QAAM,uBAAmB,eAAAC;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,qBAAiB;AAAA,IACrB,CAAC,SAAgC;AAC/B,WAAK,YAAY,IAAI;AACrB,2BAAqB,UAAU;AAAA,IACjC;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAKA,+BAAU,MAAM;AACd,UAAM,KAAK,qBAAqB;AAChC,QAAI,CAAC,GAAI;AAET,UAAM,yBAAyB,CAAC,MAAa;AAC3C,YAAM,SAAS,EAAE;AAGjB,UAAI,CAAC,OAAO,QAAQ,kCAAkC,GAAG;AACvD,UAAE,eAAe;AAAA,MACnB;AAAA,IACF;AACA,OAAG,iBAAiB,SAAS,sBAAsB;AACnD,WAAO,MAAM,GAAG,oBAAoB,SAAS,sBAAsB;AAAA,EACrE,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,mBAAmB,MAAM;AAC7B,QAAI,QAAQ;AACV,gBAAU,KAAK;AACf,gBAAU;AACV;AAAA,IACF;AAEA,cAAU,IAAI;AACd,aAAS;AAAA,EACX;AAEA,QAAM,uBAAmB,4BAAa,SAAS;AAAA,IAC7C,KAAK,KAAK;AAAA,IACV,eAAW,eAAAA;AAAA,MACR,QAAQ,MAAiC;AAAA,MAC1C;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,GAAG,kBAAkB;AAAA,EACvB,CAA4B;AAE5B,0CAAe,WAAW,OAAK;AAC7B,QAAI,EAAE,QAAQ,UAAU;AACtB,gBAAU;AACV,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAAA,IACpB;AAAA,EACF,CAAC;AAED,SACE,8EACG;AAAA;AAAA,IACA,UACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,KAAK;AAAA,QACL,OAAO;AAAA,QACN,GAAG,iBAAiB;AAAA,QAErB;AAAA,wDAAC,SAAI,WAAU,kBACb;AAAA,yDAAC,YAAO,WAAU,0BAChB;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS;AAAA,gBACT,cAAW;AAAA,gBACX,SAAQ;AAAA,gBAER;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM;AAAA,oBACN,MAAK;AAAA,oBACL,WAAU;AAAA;AAAA,gBACZ;AAAA;AAAA,YACF,GACF;AAAA,YACA,6CAAC,SAAI,WAAU,wBAAwB,UAAS;AAAA,aAClD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL;AAAA,cACA,OAAO;AAAA,cACP,WAAU;AAAA;AAAA,UACZ;AAAA;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;",
6
- "names": ["import_react", "import_icons", "import_dedupe", "import_dedupe", "classNames", "import_jsx_runtime", "import_jsx_runtime", "import_icons", "import_jsx_runtime", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames"]
3
+ "sources": ["../../../../src/components/Popover/Popover.tsx", "../../../../src/components/Button/Button.tsx", "../../../../src/components/Button/Loading.tsx", "../../../../src/components/Icon/Icon.tsx", "../../../../src/components/VisuallyHidden/VisuallyHidden.tsx", "../../../../src/hooks/useButton/useButton.tsx", "../../../../src/components/Button/Success.tsx", "../../../../src/components/Popover/Arrow.tsx", "../../../../src/components/Popover/useAutoUpdate.ts", "../../../../src/components/Popover/useFloatingPosition.ts", "../../../../src/components/Popover/useOutsidePress.ts"],
4
+ "sourcesContent": ["import { cross } from \"@simplybusiness/icons\";\nimport classNames from \"classnames/dedupe\";\nimport type { ReactElement, ReactNode, RefAttributes } from \"react\";\nimport { cloneElement, useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useWindowEvent } from \"@simplybusiness/mobius-hooks\";\nimport type { DOMProps } from \"../../types\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport { Arrow } from \"./Arrow\";\nimport { useAutoUpdate } from \"./useAutoUpdate\";\nimport { useFloatingPosition } from \"./useFloatingPosition\";\nimport { useOutsidePress } from \"./useOutsidePress\";\nimport \"./Popover.css\";\n\nexport type PopoverElementType = HTMLDivElement;\n\nexport interface PopoverProps\n extends DOMProps, RefAttributes<PopoverElementType> {\n children?: ReactNode;\n trigger: ReactElement;\n /** Callback that fires each time the accordion is opened */\n onOpen?: () => void;\n /** Callback that fires each time the accordion is closed */\n onClose?: () => void;\n /** Custom class name for setting specific CSS */\n className?: string;\n}\n\nconst OFFSET_FROM_CONTENT_DEFAULT = 10;\nconst ARROW_WIDTH = 20;\n\nexport const Popover = (props: PopoverProps) => {\n const { trigger, children, onOpen, onClose, className } = props;\n const referenceRef = useRef<HTMLElement | null>(null);\n const floatingRef = useRef<HTMLDivElement | null>(null);\n const arrowRef = useRef<SVGSVGElement | null>(null);\n const [isOpen, setIsOpen] = useState(false);\n const [portalTarget, setPortalTarget] = useState<HTMLElement | null>(null);\n\n const isInsideDialog =\n portalTarget !== null && portalTarget.tagName === \"DIALOG\";\n\n const { initialFloatingStyles, initialArrowStyles, update } =\n useFloatingPosition({\n referenceRef,\n floatingRef,\n arrowRef,\n isOpen,\n offsetPx: OFFSET_FROM_CONTENT_DEFAULT,\n arrowWidth: ARROW_WIDTH,\n useFixedStrategy: isInsideDialog,\n });\n\n useAutoUpdate({\n referenceRef,\n floatingRef,\n onUpdate: update,\n enabled: isOpen,\n });\n\n useOutsidePress({\n referenceRef,\n floatingRef,\n enabled: isOpen,\n onOutsidePress: () => {\n onClose?.();\n setIsOpen(false);\n },\n });\n\n const containerClasses = classNames(\n \"mobius\",\n \"mobius-popover__container\",\n className,\n );\n\n // Native listener to prevent clicks inside the popover from activating\n // interactive ancestors. Must be native because React's onClick fires\n // too late via delegation.\n useEffect(() => {\n const el = floatingRef.current;\n if (!el) return;\n\n const preventLabelActivation = (e: Event) => {\n const target = e.target as HTMLElement;\n // Allow default behavior for interactive elements (links, inputs, etc.)\n // so they remain functional inside the popover.\n if (!target.closest(\"a[href], input, select, textarea\")) {\n e.preventDefault();\n }\n };\n el.addEventListener(\"click\", preventLabelActivation);\n return () => el.removeEventListener(\"click\", preventLabelActivation);\n }, [isOpen]);\n\n const toggleVisibility = () => {\n if (isOpen) {\n setIsOpen(false);\n onClose?.();\n return;\n }\n\n // Portal into the nearest open <dialog> ancestor so the popover renders\n // in the same top-layer as the dialog. document.body falls outside that\n // top-layer and paints beneath the modal backdrop.\n const dialog = referenceRef.current?.closest(\"dialog\");\n setPortalTarget(dialog ?? document.body);\n setIsOpen(true);\n onOpen?.();\n };\n\n const setReferenceRef = useCallback((node: HTMLElement | null) => {\n referenceRef.current = node;\n }, []);\n\n const triggerComponent = cloneElement(trigger, {\n ref: setReferenceRef,\n className: classNames(\n (trigger.props as { className?: string }).className,\n \"mobius-popover__toggle\",\n ),\n onClick: toggleVisibility,\n } as Record<string, unknown>);\n\n useWindowEvent(\"keydown\", e => {\n if (e.key === \"Escape\" && isOpen) {\n setIsOpen(false);\n onClose?.();\n e.preventDefault();\n e.stopPropagation();\n }\n });\n\n const floatingElement = isOpen ? (\n <div\n className={containerClasses}\n ref={floatingRef}\n style={initialFloatingStyles}\n >\n <div className=\"mobius-popover\">\n <header className=\"mobius-popover__header\">\n <Button\n type=\"button\"\n className=\"mobius-popover__close-button\"\n onClick={toggleVisibility}\n aria-label=\"Close\"\n variant=\"ghost\"\n >\n <Icon\n icon={cross}\n size=\"md\"\n className=\"mobius-popover__close-icon\"\n />\n </Button>\n </header>\n <div className=\"mobius-popover__body\">{children}</div>\n </div>\n <Arrow\n ref={arrowRef}\n style={initialArrowStyles}\n className=\"mobius-popover__arrow-icon\"\n width={ARROW_WIDTH}\n />\n </div>\n ) : null;\n\n return (\n <>\n {triggerComponent}\n {floatingElement && portalTarget\n ? createPortal(floatingElement, portalTarget)\n : null}\n </>\n );\n};\n", "\"use client\";\n\nimport type { MouseEvent, ReactNode, RefAttributes } from \"react\";\nimport classNames from \"classnames/dedupe\";\nimport type { DOMProps } from \"../../types/dom\";\nimport { Loading } from \"./Loading\";\nimport type { UseButtonProps } from \"../../hooks/useButton\";\nimport { useButton } from \"../../hooks/useButton\";\nimport { Success } from \"./Success\";\nimport \"./Button.css\";\n\nexport type ButtonElementType = HTMLButtonElement;\n\nexport type Variant = \"primary\" | \"secondary\" | \"ghost\" | \"basic\" | \"link\";\n\nexport type Size = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps\n extends UseButtonProps, DOMProps, RefAttributes<ButtonElementType> {\n /** The name of the button when submitted in a form */\n name?: string | undefined;\n /** The value of the button when submitted in a form */\n value?: string | undefined;\n /** Custom class name for setting specific CSS */\n className?: string;\n /** Shortlist of styles */\n variant?: Variant;\n size?: Size;\n /** Display loading spinner */\n isLoading?: boolean;\n /** Display success style */\n isSuccess?: boolean;\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n children?: ReactNode;\n}\n\nconst Button = ({ ref, ...props }: ButtonProps) => {\n const {\n children,\n elementType: Component = \"button\" as React.ElementType,\n isDisabled,\n isLoading,\n isSuccess,\n variant = \"primary\",\n size = \"md\",\n\n onPress,\n\n onClick,\n ...otherProps\n } = props;\n const { buttonProps } = useButton(props);\n\n // Reshape class name and apply to outer element\n otherProps.className = classNames(\n \"mobius\",\n \"mobius-button\",\n `--variant-${variant}`,\n `--size-${size}`,\n {\n \"--is-disabled\": isDisabled,\n \"--is-loading\": isLoading,\n \"--is-success\": isSuccess && !isLoading,\n },\n otherProps.className,\n );\n\n return (\n <Component ref={ref} {...buttonProps} {...otherProps}>\n {isLoading ? <Loading>{children}</Loading> : children}\n {isSuccess && !isLoading && <Success />}\n </Component>\n );\n};\n\nButton.displayName = \"Button\";\nexport { Button };\n", "import type { ReactNode } from \"react\";\nimport { loading } from \"@simplybusiness/icons\";\nimport { Icon } from \"../Icon\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\n\ntype LoadingProps = {\n children: ReactNode;\n};\n\nconst Loading = (props: LoadingProps) => {\n const { children } = props;\n\n return (\n <>\n <div className=\"mobius-button__icon-wrapper\">\n <Icon icon={loading} spin size=\"md\" />\n </div>\n <VisuallyHidden className=\"mobius-button__loading-text\">\n Loading\n </VisuallyHidden>\n {children}\n </>\n );\n};\n\nexport { Loading };\n", "import classNames from \"classnames/dedupe\";\nimport type { IconProps } from \"./types\";\nimport \"./Icon.css\";\n\nconst ICON_PREFIX = \"mobius-icon\";\n\nconst capitaliseFirstLetter = (str: string) =>\n str.charAt(0).toUpperCase() + str.slice(1);\n\nexport function Icon({\n ref,\n icon,\n className,\n size = \"xs\",\n color,\n fixedWidth,\n spin,\n spinReverse,\n title,\n ...otherProps\n}: IconProps) {\n if (!icon) {\n throw new Error(\"Must specify icon object\");\n }\n\n const classes = classNames(\n \"mobius\",\n \"mobius-icon\",\n `svg-inline--${ICON_PREFIX}`,\n `--size-${size}`,\n className,\n {\n [`${ICON_PREFIX}-fw`]: fixedWidth,\n [`${ICON_PREFIX}-spin`]: spin || spinReverse,\n [`${ICON_PREFIX}-spin-reverse`]: spinReverse,\n },\n );\n\n const { iconName, width, height, svgPathData } = icon;\n const formattedIconName = iconName.split(\"-\").join(\" \");\n\n const defaultTitle = `${capitaliseFirstLetter(formattedIconName)} icon`;\n const titleText = title || defaultTitle;\n\n return (\n <svg\n ref={ref}\n focusable=\"false\"\n data-icon={iconName}\n className={classes}\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${width} ${height}`}\n style={{ color }}\n {...otherProps}\n >\n <title>{titleText}</title>\n <path fill=\"currentColor\" d={svgPathData} />\n </svg>\n );\n}\n", "import type { AriaRole, JSXElementConstructor, ReactNode } from \"react\";\n\nexport interface VisuallyHiddenProps {\n /** The content to visually hide. */\n children?: ReactNode;\n id?: string;\n role?: AriaRole;\n\n className?: string;\n\n /**\n * The element type for the container. Defaults to 'div'\n */\n elementType?: string | JSXElementConstructor<any>;\n}\n\nexport function VisuallyHidden(props: VisuallyHiddenProps) {\n const {\n className,\n children,\n elementType: Component = \"div\",\n ...otherProps\n } = props;\n\n return (\n <Component\n className={className}\n style={{\n border: 0,\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: 0,\n position: \"absolute\",\n width: \"1px\",\n whiteSpace: \"nowrap\",\n }}\n {...otherProps}\n >\n {children}\n </Component>\n );\n}\n", "import type { JSXElementConstructor } from \"react\";\nimport { useCallback } from \"react\";\n\nexport interface UseButtonProps {\n elementType?:\n | \"button\"\n | \"a\"\n | \"span\"\n | \"input\"\n | JSXElementConstructor<unknown>\n | undefined;\n type?: \"button\" | \"submit\" | \"reset\";\n isDisabled?: boolean;\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n onPress?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n href?: string;\n target?: string;\n rel?: string;\n role?: string;\n name?: string | undefined;\n value?: string | undefined;\n}\n\nexport function useButton({\n elementType = \"button\",\n type = \"button\",\n isDisabled = false,\n href,\n target,\n rel,\n role,\n name,\n value,\n onClick,\n onPress,\n}: UseButtonProps) {\n const realOnClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n if (isDisabled) {\n return;\n }\n\n onClick?.(event);\n onPress?.(event);\n },\n [isDisabled, onClick, onPress],\n );\n\n function getRole() {\n if (role) {\n return role;\n }\n\n if (elementType === \"a\") {\n return undefined;\n }\n\n return \"button\";\n }\n\n const extraProps =\n elementType === \"button\"\n ? { type }\n : {\n role: getRole(),\n };\n\n return {\n buttonProps: {\n href: elementType === \"a\" ? href : undefined,\n target: elementType === \"a\" ? target : undefined,\n rel: elementType === \"a\" ? rel : undefined,\n tabIndex: isDisabled ? -1 : 0,\n disabled: isDisabled || undefined,\n \"aria-disabled\": isDisabled || undefined,\n name:\n elementType === \"input\" || elementType === \"button\" ? name : undefined,\n value:\n elementType === \"input\" || elementType === \"button\" ? value : undefined,\n ...extraProps,\n onClick: realOnClick,\n },\n };\n}\n", "import { tick } from \"@simplybusiness/icons\";\nimport { Icon } from \"../Icon\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\n\nconst Success = () => (\n <>\n <div className=\"mobius-button__icon-wrapper\">\n <Icon icon={tick} size=\"md\" />\n </div>\n <VisuallyHidden className=\"mobius-button__success-text\">\n Success\n </VisuallyHidden>\n </>\n);\n\nexport { Success };\n", "import type { CSSProperties, Ref } from \"react\";\n\ninterface ArrowProps {\n ref?: Ref<SVGSVGElement>;\n width?: number;\n className?: string;\n style?: CSSProperties;\n}\n\nexport const Arrow = ({ ref, width = 20, className, style }: ArrowProps) => {\n const height = width / 2;\n return (\n <svg\n ref={ref}\n className={className}\n aria-hidden=\"true\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n style={style}\n >\n <path d={`M0,0 H${width} L${width / 2},${height} Z`} />\n </svg>\n );\n};\n", "import type { RefObject } from \"react\";\nimport { useEffect } from \"react\";\n\ninterface UseAutoUpdateArgs {\n referenceRef: RefObject<HTMLElement | null>;\n floatingRef: RefObject<HTMLDivElement | null>;\n onUpdate: () => void;\n enabled: boolean;\n}\n\nexport const useAutoUpdate = ({\n referenceRef,\n floatingRef,\n onUpdate,\n enabled,\n}: UseAutoUpdateArgs): void => {\n useEffect(() => {\n if (!enabled) return;\n\n const reference = referenceRef.current;\n const floating = floatingRef.current;\n\n const scrollOpts: AddEventListenerOptions = {\n capture: true,\n passive: true,\n };\n window.addEventListener(\"scroll\", onUpdate, scrollOpts);\n window.addEventListener(\"resize\", onUpdate, { passive: true });\n\n const observer =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(onUpdate)\n : null;\n if (observer && reference) observer.observe(reference);\n if (observer && floating) observer.observe(floating);\n\n return () => {\n window.removeEventListener(\"scroll\", onUpdate, scrollOpts);\n window.removeEventListener(\"resize\", onUpdate);\n observer?.disconnect();\n };\n }, [enabled, onUpdate, referenceRef, floatingRef]);\n};\n", "import type { CSSProperties, RefObject } from \"react\";\nimport { useCallback, useLayoutEffect } from \"react\";\n\ntype Placement = \"bottom\" | \"top\";\n\ninterface UseFloatingPositionArgs {\n referenceRef: RefObject<HTMLElement | null>;\n floatingRef: RefObject<HTMLDivElement | null>;\n arrowRef: RefObject<SVGSVGElement | null>;\n isOpen: boolean;\n offsetPx: number;\n arrowWidth: number;\n useFixedStrategy: boolean;\n}\n\ninterface UseFloatingPositionResult {\n initialFloatingStyles: CSSProperties;\n initialArrowStyles: CSSProperties;\n update: () => void;\n}\n\n// Two positioning strategies:\n// - `absolute` + document-relative coords (viewport rect + window.scrollY/X)\n// when portalled to document.body. The initial containing block is the\n// document, so absolute coords pin to the trigger and scroll natively.\n// - `fixed` + viewport coords when portalled inside a <dialog> (top-layer).\n// The dialog's own box would otherwise become the containing block for an\n// `absolute` child, throwing off coordinates and triggering `overflow: hidden`\n// clipping. `fixed` keeps the containing block as the viewport.\nconst ABSOLUTE_FLOATING_STYLES: CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"max-content\",\n};\n\nconst FIXED_FLOATING_STYLES: CSSProperties = {\n position: \"fixed\",\n top: 0,\n left: 0,\n width: \"max-content\",\n};\n\nconst INITIAL_ARROW_STYLES: CSSProperties = {\n position: \"absolute\",\n};\n\nconst VIEWPORT_PADDING = 0;\n\n// Properties that make an ancestor the containing block for a `position: fixed`\n// descendant, overriding the initial viewport containing block. When the portal\n// target (dialog) has any of these, `position: fixed` coords are interpreted\n// relative to the dialog's box, not the viewport \u2014 we compensate by subtracting\n// the dialog's viewport offset.\nconst createsFixedContainingBlock = (el: HTMLElement): boolean => {\n const style = window.getComputedStyle(el);\n return (\n style.transform !== \"none\" ||\n style.filter !== \"none\" ||\n style.backdropFilter !== \"none\" ||\n style.perspective !== \"none\" ||\n /\\b(transform|filter|perspective)\\b/.test(style.willChange)\n );\n};\n\nexport const useFloatingPosition = ({\n referenceRef,\n floatingRef,\n arrowRef,\n isOpen,\n offsetPx,\n arrowWidth,\n useFixedStrategy,\n}: UseFloatingPositionArgs): UseFloatingPositionResult => {\n // Writes styles directly to the DOM (bypassing React state) so scroll/resize\n // handlers can update position in the same event-frame the browser uses to\n // paint the scroll, eliminating the re-render lag that shows up as a\n // trigger-vs-popover parallax on fast scroll.\n const update = useCallback(() => {\n const reference = referenceRef.current;\n const floating = floatingRef.current;\n if (!reference || !floating) return;\n\n const refRect = reference.getBoundingClientRect();\n const floatingWidth = floating.offsetWidth;\n const floatingHeight = floating.offsetHeight;\n const scrollX = useFixedStrategy ? 0 : window.scrollX;\n const scrollY = useFixedStrategy ? 0 : window.scrollY;\n\n // Clamp to the portal target's bounds when the dialog is a containing\n // block (its own `overflow: hidden` would clip the popover). Otherwise\n // clamp to the viewport.\n const parent = floating.parentElement;\n const parentIsCb =\n useFixedStrategy && !!parent && createsFixedContainingBlock(parent);\n const boundsRect = parentIsCb\n ? parent.getBoundingClientRect()\n : {\n left: 0,\n top: 0,\n right: window.innerWidth,\n bottom: window.innerHeight,\n };\n\n const bottomTopViewport = refRect.bottom + offsetPx;\n const topTopViewport = refRect.top - floatingHeight - offsetPx;\n const overflowsBottom =\n bottomTopViewport + floatingHeight > boundsRect.bottom;\n const fitsTop = topTopViewport >= boundsRect.top;\n const nextPlacement: Placement =\n overflowsBottom && fitsTop ? \"top\" : \"bottom\";\n\n const topViewport =\n nextPlacement === \"bottom\" ? bottomTopViewport : topTopViewport;\n\n const rawLeftViewport =\n refRect.left + refRect.width / 2 - floatingWidth / 2;\n const minLeftViewport = boundsRect.left + VIEWPORT_PADDING;\n const maxLeftViewport = Math.max(\n minLeftViewport,\n boundsRect.right - floatingWidth - VIEWPORT_PADDING,\n );\n const leftViewport = Math.min(\n Math.max(minLeftViewport, rawLeftViewport),\n maxLeftViewport,\n );\n\n // Subtract containing-block offset when the dialog is the CB, so\n // `position: fixed` coords land at the intended viewport position.\n const cbOffsetLeft = parentIsCb ? boundsRect.left : 0;\n const cbOffsetTop = parentIsCb ? boundsRect.top : 0;\n\n floating.style.top = `${topViewport + scrollY - cbOffsetTop}px`;\n floating.style.left = `${leftViewport + scrollX - cbOffsetLeft}px`;\n\n const arrow = arrowRef.current;\n if (!arrow) return;\n\n // Arrow coords are relative to the floating element, so scroll cancels out.\n const arrowHalf = arrowWidth / 2;\n const refCenterX = refRect.left + refRect.width / 2;\n const rawArrowLeft = refCenterX - leftViewport - arrowHalf;\n const maxArrowLeft = Math.max(0, floatingWidth - arrowWidth);\n const arrowLeft = Math.min(Math.max(0, rawArrowLeft), maxArrowLeft);\n\n arrow.style.left = `${arrowLeft}px`;\n if (nextPlacement === \"bottom\") {\n arrow.style.bottom = \"100%\";\n arrow.style.top = \"\";\n arrow.style.transform = \"rotate(180deg)\";\n } else {\n arrow.style.top = \"100%\";\n arrow.style.bottom = \"\";\n arrow.style.transform = \"\";\n }\n }, [\n referenceRef,\n floatingRef,\n arrowRef,\n offsetPx,\n arrowWidth,\n useFixedStrategy,\n ]);\n\n useLayoutEffect(() => {\n if (!isOpen) return;\n update();\n }, [isOpen, update]);\n\n return {\n initialFloatingStyles: useFixedStrategy\n ? FIXED_FLOATING_STYLES\n : ABSOLUTE_FLOATING_STYLES,\n initialArrowStyles: INITIAL_ARROW_STYLES,\n update,\n };\n};\n", "import type { RefObject } from \"react\";\nimport { useEffect } from \"react\";\n\ninterface UseOutsidePressArgs {\n referenceRef: RefObject<HTMLElement | null>;\n floatingRef: RefObject<HTMLDivElement | null>;\n enabled: boolean;\n onOutsidePress: (event: PointerEvent) => void;\n}\n\nexport const useOutsidePress = ({\n referenceRef,\n floatingRef,\n enabled,\n onOutsidePress,\n}: UseOutsidePressArgs): void => {\n useEffect(() => {\n if (!enabled) return;\n\n const handler = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n if (referenceRef.current?.contains(target)) return;\n if (floatingRef.current?.contains(target)) return;\n onOutsidePress(event);\n };\n\n document.addEventListener(\"pointerdown\", handler);\n return () => document.removeEventListener(\"pointerdown\", handler);\n }, [enabled, onOutsidePress, referenceRef, floatingRef]);\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["import_icons", "import_dedupe", "import_react", "import_dedupe", "classNames", "import_jsx_runtime", "import_jsx_runtime", "import_icons", "import_jsx_runtime", "import_jsx_runtime", "classNames", "import_jsx_runtime", "import_react", "import_react", "import_react", "import_jsx_runtime", "classNames"]
7
7
  }