@forgedevstack/bear 1.3.3 → 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +145 -292
  2. package/dist/components/AlertDialog/AlertDialog.cjs +1 -1
  3. package/dist/components/AlertDialog/AlertDialog.js +67 -84
  4. package/dist/components/BottomSheet/BottomSheet.cjs +1 -1
  5. package/dist/components/BottomSheet/BottomSheet.js +72 -64
  6. package/dist/components/ChipGroup/ChipGroup.cjs +1 -1
  7. package/dist/components/ChipGroup/ChipGroup.const.cjs +1 -1
  8. package/dist/components/ChipGroup/ChipGroup.const.d.ts +2 -0
  9. package/dist/components/ChipGroup/ChipGroup.const.js +6 -4
  10. package/dist/components/ChipGroup/ChipGroup.js +52 -48
  11. package/dist/components/CommandPalette/CommandItem.cjs +1 -0
  12. package/dist/components/CommandPalette/CommandItem.d.ts +6 -0
  13. package/dist/components/CommandPalette/CommandItem.js +39 -0
  14. package/dist/components/CommandPalette/CommandPalette.cjs +1 -1
  15. package/dist/components/CommandPalette/CommandPalette.js +129 -144
  16. package/dist/components/Drawer/Drawer.cjs +1 -1
  17. package/dist/components/Drawer/Drawer.js +72 -66
  18. package/dist/components/EmptyState/EmptyState.cjs +1 -1
  19. package/dist/components/EmptyState/EmptyState.const.cjs +1 -1
  20. package/dist/components/EmptyState/EmptyState.const.d.ts +5 -0
  21. package/dist/components/EmptyState/EmptyState.const.js +30 -15
  22. package/dist/components/EmptyState/EmptyState.js +35 -35
  23. package/dist/components/EmptyState/EmptyState.types.d.ts +2 -2
  24. package/dist/components/HoverCard/HoverCard.cjs +4 -3
  25. package/dist/components/HoverCard/HoverCard.const.cjs +1 -0
  26. package/dist/components/HoverCard/HoverCard.const.d.ts +1 -0
  27. package/dist/components/HoverCard/HoverCard.const.js +10 -0
  28. package/dist/components/HoverCard/HoverCard.js +62 -56
  29. package/dist/components/HoverCard/HoverCard.types.d.ts +7 -0
  30. package/dist/components/Menu/Menu.cjs +1 -1
  31. package/dist/components/Menu/Menu.const.cjs +1 -0
  32. package/dist/components/Menu/Menu.const.d.ts +2 -0
  33. package/dist/components/Menu/Menu.const.js +12 -0
  34. package/dist/components/Menu/Menu.d.ts +3 -9
  35. package/dist/components/Menu/Menu.js +57 -89
  36. package/dist/components/Menu/Menu.types.d.ts +8 -1
  37. package/dist/components/Menu/MenuDivider.cjs +1 -0
  38. package/dist/components/Menu/MenuDivider.d.ts +6 -0
  39. package/dist/components/Menu/MenuDivider.js +7 -0
  40. package/dist/components/Menu/MenuItem.cjs +1 -0
  41. package/dist/components/Menu/MenuItem.d.ts +6 -0
  42. package/dist/components/Menu/MenuItem.js +46 -0
  43. package/dist/components/Modal/Modal.cjs +1 -1
  44. package/dist/components/Modal/Modal.const.cjs +1 -1
  45. package/dist/components/Modal/Modal.const.d.ts +1 -0
  46. package/dist/components/Modal/Modal.const.js +20 -12
  47. package/dist/components/Modal/Modal.js +62 -59
  48. package/dist/components/Modal/Modal.types.d.ts +7 -0
  49. package/dist/components/Popover/Popover.cjs +1 -1
  50. package/dist/components/Popover/Popover.const.cjs +1 -0
  51. package/dist/components/Popover/Popover.const.d.ts +15 -1
  52. package/dist/components/Popover/Popover.const.js +29 -0
  53. package/dist/components/Popover/Popover.js +77 -73
  54. package/dist/components/Popover/Popover.types.d.ts +7 -0
  55. package/dist/components/Select/Select.cjs +1 -1
  56. package/dist/components/Select/Select.const.cjs +1 -1
  57. package/dist/components/Select/Select.const.d.ts +1 -0
  58. package/dist/components/Select/Select.const.js +7 -6
  59. package/dist/components/Select/Select.js +101 -96
  60. package/dist/components/Toast/Toast.cjs +1 -1
  61. package/dist/components/Toast/Toast.const.cjs +1 -1
  62. package/dist/components/Toast/Toast.const.d.ts +2 -0
  63. package/dist/components/Toast/Toast.const.js +11 -8
  64. package/dist/components/Toast/Toast.context.cjs +1 -0
  65. package/dist/components/Toast/Toast.context.d.ts +3 -0
  66. package/dist/components/Toast/Toast.context.js +11 -0
  67. package/dist/components/Toast/Toast.d.ts +4 -3
  68. package/dist/components/Toast/Toast.icons.cjs +1 -0
  69. package/dist/components/Toast/Toast.icons.d.ts +4 -0
  70. package/dist/components/Toast/Toast.icons.js +29 -0
  71. package/dist/components/Toast/Toast.js +32 -160
  72. package/dist/components/Toast/ToastContainer.cjs +1 -0
  73. package/dist/components/Toast/ToastContainer.d.ts +3 -0
  74. package/dist/components/Toast/ToastContainer.js +39 -0
  75. package/dist/components/Toast/ToastItem.cjs +1 -0
  76. package/dist/components/Toast/ToastItem.d.ts +5 -0
  77. package/dist/components/Toast/ToastItem.js +86 -0
  78. package/dist/components/ToggleGroup/ToggleGroup.cjs +1 -0
  79. package/dist/components/ToggleGroup/ToggleGroup.const.cjs +1 -0
  80. package/dist/components/ToggleGroup/ToggleGroup.const.d.ts +15 -0
  81. package/dist/components/ToggleGroup/ToggleGroup.const.js +33 -0
  82. package/dist/components/ToggleGroup/ToggleGroup.context.cjs +1 -0
  83. package/dist/components/ToggleGroup/ToggleGroup.context.d.ts +2 -0
  84. package/dist/components/ToggleGroup/ToggleGroup.context.js +5 -0
  85. package/dist/components/ToggleGroup/ToggleGroup.d.ts +2 -0
  86. package/dist/components/ToggleGroup/ToggleGroup.js +86 -0
  87. package/dist/components/ToggleGroup/ToggleGroup.types.d.ts +48 -0
  88. package/dist/components/ToggleGroup/ToggleGroupItem.cjs +1 -0
  89. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts +2 -0
  90. package/dist/components/ToggleGroup/ToggleGroupItem.js +50 -0
  91. package/dist/components/ToggleGroup/hooks/useToggleGroupContext.cjs +1 -0
  92. package/dist/components/ToggleGroup/hooks/useToggleGroupContext.d.ts +1 -0
  93. package/dist/components/ToggleGroup/hooks/useToggleGroupContext.js +6 -0
  94. package/dist/components/ToggleGroup/index.d.ts +4 -0
  95. package/dist/components/Tooltip/Tooltip.cjs +1 -1
  96. package/dist/components/Tooltip/Tooltip.const.cjs +1 -0
  97. package/dist/components/Tooltip/Tooltip.const.d.ts +8 -0
  98. package/dist/components/Tooltip/Tooltip.const.js +18 -0
  99. package/dist/components/Tooltip/Tooltip.js +59 -61
  100. package/dist/components/Tooltip/Tooltip.types.d.ts +7 -0
  101. package/dist/components/index.cjs +1 -1
  102. package/dist/components/index.d.ts +2 -0
  103. package/dist/components/index.js +428 -418
  104. package/dist/constants/numbers.const.cjs +1 -1
  105. package/dist/constants/numbers.const.d.ts +3 -0
  106. package/dist/constants/numbers.const.js +37 -34
  107. package/dist/hooks/index.cjs +1 -1
  108. package/dist/hooks/index.d.ts +2 -0
  109. package/dist/hooks/index.js +6 -4
  110. package/dist/hooks/useFocusTrap/index.d.ts +2 -0
  111. package/dist/hooks/useFocusTrap/useFocusTrap.cjs +1 -0
  112. package/dist/hooks/useFocusTrap/useFocusTrap.d.ts +3 -0
  113. package/dist/hooks/useFocusTrap/useFocusTrap.js +41 -0
  114. package/dist/hooks/useFocusTrap/useFocusTrap.types.d.ts +8 -0
  115. package/dist/hooks/useFocusTrap/useFocusTrap.utils.cjs +1 -0
  116. package/dist/hooks/useFocusTrap/useFocusTrap.utils.d.ts +1 -0
  117. package/dist/hooks/useFocusTrap/useFocusTrap.utils.js +23 -0
  118. package/dist/index.cjs +1 -1
  119. package/dist/index.js +575 -563
  120. package/dist/styles.css +52 -0
  121. package/package.json +1 -1
@@ -1,122 +1,90 @@
1
- import { jsx as c, jsxs as h, Fragment as L } from "react/jsx-runtime";
2
- import { useRef as M, useState as N, useLayoutEffect as z, useEffect as R } from "react";
3
- import { cn as v } from "../../utils/cn.js";
4
- import { Portal as I } from "../Portal/Portal.js";
5
- const D = 12e3, H = ({
6
- icon: t,
7
- disabled: r = !1,
8
- selected: n = !1,
9
- divider: g = !1,
10
- children: m,
11
- onClick: a,
12
- className: u,
13
- testId: l,
14
- ...y
15
- }) => /* @__PURE__ */ h(L, { children: [
16
- /* @__PURE__ */ h(
17
- "div",
18
- {
19
- role: "menuitem",
20
- tabIndex: r ? -1 : 0,
21
- className: v(
22
- "bear-flex bear-items-center bear-gap-3 bear-px-4 bear-py-2 bear-cursor-pointer bear-transition-colors",
23
- "hover:bear-bg-gray-100 dark:hover:bear-bg-gray-700",
24
- "focus:bear-outline-none focus:bear-bg-gray-100 dark:focus:bear-bg-gray-700",
25
- n && "bear-bg-primary-50 dark:bear-bg-primary-900/20 bear-text-primary-600",
26
- r && "bear-opacity-50 bear-cursor-not-allowed hover:bear-bg-transparent",
27
- u
28
- ),
29
- onClick: r ? void 0 : a,
30
- onKeyDown: (f) => {
31
- (f.key === "Enter" || f.key === " ") && !r && (a == null || a());
32
- },
33
- "data-testid": l,
34
- ...y,
35
- children: [
36
- t && /* @__PURE__ */ c("span", { className: "bear-flex-shrink-0 bear-text-gray-500", children: t }),
37
- /* @__PURE__ */ c("span", { className: "bear-flex-1 bear-text-sm", children: m })
38
- ]
39
- }
40
- ),
41
- g && /* @__PURE__ */ c(O, {})
42
- ] }), O = ({ className: t }) => /* @__PURE__ */ c("div", { className: v("bear-h-px bear-bg-gray-200 dark:bear-bg-gray-700 bear-my-1", t) }), K = ({
43
- open: t = !1,
44
- anchorEl: r,
45
- onClose: n,
1
+ import { jsx as w } from "react/jsx-runtime";
2
+ import { useRef as M, useState as _, useLayoutEffect as h, useEffect as N } from "react";
3
+ import { cn as z } from "../../utils/cn.js";
4
+ import { resolveOverlayEffects as R } from "../../hooks/useFixedAnchorPosition/useFixedAnchorPosition.utils.js";
5
+ import { Portal as S } from "../Portal/Portal.js";
6
+ import { MENU_Z_INDEX as x, MENU_EFFECT_CLASS_MAP as p } from "./Menu.const.js";
7
+ const j = ({
8
+ open: d = !1,
9
+ anchorEl: f,
10
+ onClose: o,
46
11
  children: g,
47
- position: m = "bottom-start",
48
- minWidth: a = 180,
49
- maxHeight: u = 300,
12
+ position: u = "bottom-start",
13
+ minWidth: n = 180,
14
+ maxHeight: i = 300,
50
15
  className: l,
51
- testId: y,
52
- ...f
16
+ testId: k,
17
+ ...b
53
18
  }) => {
54
- const b = M(null), [w, k] = N({ top: 0, left: 0 });
55
- return z(() => {
56
- if (!t || !r) return;
57
- const s = () => {
58
- const e = r.getBoundingClientRect(), x = b.current, p = x ? x.offsetHeight : Math.min(u, 200);
59
- let d = 0, i = 0;
60
- switch (m) {
19
+ const c = M(null), [m, y] = _({ top: 0, left: 0 });
20
+ h(() => {
21
+ if (!d || !f) return;
22
+ const r = () => {
23
+ const t = f.getBoundingClientRect(), e = c.current, v = e ? e.offsetHeight : Math.min(i, 200);
24
+ let a = 0, s = 0;
25
+ switch (u) {
61
26
  case "bottom-start":
62
- d = e.bottom + 4, i = e.left;
27
+ a = t.bottom + 4, s = t.left;
63
28
  break;
64
29
  case "bottom-end":
65
- d = e.bottom + 4, i = e.right - a;
30
+ a = t.bottom + 4, s = t.right - ((e == null ? void 0 : e.offsetWidth) ?? n);
66
31
  break;
67
32
  case "top-start":
68
- d = e.top - p - 4, i = e.left;
33
+ a = t.top - v - 4, s = t.left;
69
34
  break;
70
35
  case "top-end":
71
- d = e.top - p - 4, i = e.right - a;
36
+ a = t.top - v - 4, s = t.right - ((e == null ? void 0 : e.offsetWidth) ?? n);
37
+ break;
38
+ case "right-start":
39
+ a = t.top, s = t.right + 4;
40
+ break;
41
+ case "left-start":
42
+ a = t.top, s = t.left - ((e == null ? void 0 : e.offsetWidth) ?? n) - 4;
72
43
  break;
73
44
  }
74
- i = Math.max(8, Math.min(i, window.innerWidth - a - 8));
75
- const E = window.innerHeight - p - 8;
76
- d = Math.max(8, Math.min(d, E)), k({ top: d, left: i });
45
+ y({ top: a, left: s });
77
46
  };
78
- s();
79
- const o = b.current && typeof ResizeObserver < "u" ? new ResizeObserver(s) : null;
80
- return b.current && o && o.observe(b.current), window.addEventListener("resize", s), window.addEventListener("scroll", s, !0), () => {
81
- o == null || o.disconnect(), window.removeEventListener("resize", s), window.removeEventListener("scroll", s, !0);
47
+ return r(), window.addEventListener("resize", r), window.addEventListener("scroll", r, !0), () => {
48
+ window.removeEventListener("resize", r), window.removeEventListener("scroll", r, !0);
82
49
  };
83
- }, [t, r, m, a, u]), R(() => {
84
- if (!t) return;
85
- const s = (e) => {
86
- b.current && !b.current.contains(e.target) && r && !r.contains(e.target) && (n == null || n());
87
- }, o = (e) => {
88
- e.key === "Escape" && (n == null || n());
50
+ }, [d, f, u, n, i]), N(() => {
51
+ if (!d) return;
52
+ const r = (e) => {
53
+ c.current && !c.current.contains(e.target) && f && !f.contains(e.target) && (o == null || o());
54
+ }, t = (e) => {
55
+ e.key === "Escape" && (o == null || o());
89
56
  };
90
- return document.addEventListener("mousedown", s), document.addEventListener("keydown", o), () => {
91
- document.removeEventListener("mousedown", s), document.removeEventListener("keydown", o);
57
+ return document.addEventListener("mousedown", r), document.addEventListener("keydown", t), () => {
58
+ document.removeEventListener("mousedown", r), document.removeEventListener("keydown", t);
92
59
  };
93
- }, [t, r, n]), t ? /* @__PURE__ */ c(I, { children: /* @__PURE__ */ c(
60
+ }, [d, f, o]);
61
+ const { openEffect: L } = R(b, "fade"), E = p[L] ?? p.fade;
62
+ return d ? /* @__PURE__ */ w(S, { children: /* @__PURE__ */ w(
94
63
  "div",
95
64
  {
96
- ref: b,
65
+ ref: c,
97
66
  role: "menu",
98
- className: v(
67
+ className: z(
99
68
  "bear-fixed bear-bg-white dark:bear-bg-gray-800",
100
69
  "bear-border bear-border-gray-200 dark:bear-border-gray-700",
101
70
  "bear-rounded-lg bear-shadow-lg bear-py-1",
102
71
  "bear-overflow-y-auto",
72
+ E,
103
73
  l
104
74
  ),
105
75
  style: {
106
- top: w.top,
107
- left: w.left,
108
- minWidth: a,
109
- maxHeight: u,
110
- zIndex: D
76
+ top: m.top,
77
+ left: m.left,
78
+ minWidth: n,
79
+ maxHeight: i,
80
+ zIndex: x
111
81
  },
112
- "data-testid": y,
113
- ...f,
82
+ "data-testid": k,
83
+ ...b,
114
84
  children: g
115
85
  }
116
86
  ) }) : null;
117
87
  };
118
88
  export {
119
- K as Menu,
120
- O as MenuDivider,
121
- H as MenuItem
89
+ j as Menu
122
90
  };
@@ -1,4 +1,5 @@
1
1
  import { HTMLAttributes, ReactNode } from 'react';
2
+ import { OverlayMotionEffect, OverlayEffectConfig } from '../../hooks/useFixedAnchorPosition';
2
3
  export interface MenuItemProps extends HTMLAttributes<HTMLDivElement> {
3
4
  id?: string;
4
5
  /** Icon to show before the label */
@@ -26,11 +27,17 @@ export interface MenuProps extends HTMLAttributes<HTMLDivElement> {
26
27
  /** Menu items */
27
28
  children?: ReactNode;
28
29
  /** Position relative to anchor */
29
- position?: 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';
30
+ position?: 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end' | 'right-start' | 'left-start';
30
31
  /** Min width of the menu */
31
32
  minWidth?: number;
32
33
  /** Max height before scrolling */
33
34
  maxHeight?: number;
35
+ /** Transition effect when opening */
36
+ openEffect?: OverlayMotionEffect;
37
+ /** Transition effect when closing */
38
+ closeEffect?: OverlayMotionEffect;
39
+ /** Config for open and close transition effects */
40
+ effect?: OverlayEffectConfig;
34
41
  /** Test ID */
35
42
  testId?: string;
36
43
  }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),i=require("../../utils/cn.cjs");require("react");const a=({className:e})=>r.jsx("div",{className:i.cn("bear-h-px bear-bg-gray-200 dark:bear-bg-gray-700 bear-my-1",e)});exports.MenuDivider=a;
@@ -0,0 +1,6 @@
1
+ import { FC } from 'react';
2
+ import { MenuDividerProps } from './Menu.types';
3
+ /**
4
+ * MenuDivider component for separating menu sections
5
+ */
6
+ export declare const MenuDivider: FC<MenuDividerProps>;
@@ -0,0 +1,7 @@
1
+ import { jsx as a } from "react/jsx-runtime";
2
+ import { cn as e } from "../../utils/cn.js";
3
+ import "react";
4
+ const i = ({ className: r }) => /* @__PURE__ */ a("div", { className: e("bear-h-px bear-bg-gray-200 dark:bear-bg-gray-700 bear-my-1", r) });
5
+ export {
6
+ i as MenuDivider
7
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),m=require("../../utils/cn.cjs");require("react");const n=require("../../constants/numbers.const.cjs"),y=require("./MenuDivider.cjs"),x=({icon:t,disabled:r=!1,selected:b=!1,divider:o=!1,children:i,onClick:a,className:u,testId:c,...g})=>e.jsxs(e.Fragment,{children:[e.jsxs("div",{role:"menuitem",tabIndex:r?n.NEGATIVE_ONE:n.ZERO,className:m.cn("bear-flex bear-items-center bear-gap-3 bear-px-4 bear-py-2 bear-cursor-pointer bear-transition-colors","hover:bear-bg-gray-100 dark:hover:bear-bg-gray-700","focus:bear-outline-none focus:bear-bg-gray-100 dark:focus:bear-bg-gray-700",b&&"bear-bg-primary-50 dark:bear-bg-primary-900/20 bear-text-primary-600",r&&"bear-opacity-50 bear-cursor-not-allowed hover:bear-bg-transparent",u),onClick:r?void 0:a,onKeyDown:s=>{(s.key==="Enter"||s.key===" ")&&!r&&(a==null||a())},"data-testid":c,...g,children:[t&&e.jsx("span",{className:"bear-flex-shrink-0 bear-text-gray-500",children:t}),e.jsx("span",{className:"bear-flex-1 bear-text-sm",children:i})]}),o&&e.jsx(y.MenuDivider,{})]});exports.MenuItem=x;
@@ -0,0 +1,6 @@
1
+ import { FC } from 'react';
2
+ import { MenuItemProps } from './Menu.types';
3
+ /**
4
+ * MenuItem component for menu items
5
+ */
6
+ export declare const MenuItem: FC<MenuItemProps>;
@@ -0,0 +1,46 @@
1
+ import { jsxs as o, Fragment as g, jsx as a } from "react/jsx-runtime";
2
+ import { cn as y } from "../../utils/cn.js";
3
+ import "react";
4
+ import { NEGATIVE_ONE as c, ZERO as x } from "../../constants/numbers.const.js";
5
+ import { MenuDivider as l } from "./MenuDivider.js";
6
+ const N = ({
7
+ icon: t,
8
+ disabled: r = !1,
9
+ selected: s = !1,
10
+ divider: n = !1,
11
+ children: m,
12
+ onClick: e,
13
+ className: i,
14
+ testId: p,
15
+ ...f
16
+ }) => /* @__PURE__ */ o(g, { children: [
17
+ /* @__PURE__ */ o(
18
+ "div",
19
+ {
20
+ role: "menuitem",
21
+ tabIndex: r ? c : x,
22
+ className: y(
23
+ "bear-flex bear-items-center bear-gap-3 bear-px-4 bear-py-2 bear-cursor-pointer bear-transition-colors",
24
+ "hover:bear-bg-gray-100 dark:hover:bear-bg-gray-700",
25
+ "focus:bear-outline-none focus:bear-bg-gray-100 dark:focus:bear-bg-gray-700",
26
+ s && "bear-bg-primary-50 dark:bear-bg-primary-900/20 bear-text-primary-600",
27
+ r && "bear-opacity-50 bear-cursor-not-allowed hover:bear-bg-transparent",
28
+ i
29
+ ),
30
+ onClick: r ? void 0 : e,
31
+ onKeyDown: (b) => {
32
+ (b.key === "Enter" || b.key === " ") && !r && (e == null || e());
33
+ },
34
+ "data-testid": p,
35
+ ...f,
36
+ children: [
37
+ t && /* @__PURE__ */ a("span", { className: "bear-flex-shrink-0 bear-text-gray-500", children: t }),
38
+ /* @__PURE__ */ a("span", { className: "bear-flex-1 bear-text-sm", children: m })
39
+ ]
40
+ }
41
+ ),
42
+ n && /* @__PURE__ */ a(l, {})
43
+ ] });
44
+ export {
45
+ N as MenuItem
46
+ };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),E=require("react"),x=require("react-dom"),a=require("../../utils/cn.cjs"),j=require("../../utils/generateBearId.utils.cjs"),q=require("../../utils/useBearId.cjs"),g=require("@forgedevstack/bear-icons/navigation"),w=require("../Backdrop/Backdrop.cjs"),e=require("./Modal.const.cjs"),R=m=>{const{isOpen:s,onClose:l,title:r,children:L,size:M="md",showCloseButton:d=!0,closeOnEscape:A=!0,disableEscapeKeyDown:B=!1,lockBodyScroll:C=!0,cancelPreventScroll:O=!1,closeOnBackdrop:k=!0,hideBackdrop:b=!1,keepMounted:n=!1,isCancelBackgroundClick:i,zIndex:v=e.MODAL_Z_INDEX,className:y,footer:u,testId:D,id:f}=m,h=q.useBearId("Modal"),c=j.resolveBearId(f,h),_=C&&!O,p=i!==void 0?i:k,S=A&&!B,t=E.useCallback(N=>{S&&N.key==="Escape"&&l()},[S,l]);if(E.useEffect(()=>{if(s)return document.addEventListener("keydown",t),_&&(document.body.style.overflow="hidden"),()=>{document.removeEventListener("keydown",t),document.body.style.overflow=""}},[s,t,_]),!s&&!n)return null;const I=o.jsxs("div",{className:e.MODAL_ROOT_CLASSES,"data-testid":D,id:c,style:{zIndex:v},children:[!b&&o.jsx(w.Backdrop,{open:s,keepMounted:n,blur:!0,nested:!0,className:"Bear-Modal__backdrop",onClick:p?()=>l():void 0}),o.jsxs("div",{role:"dialog","aria-modal":"true","aria-labelledby":r?`${c}-title`:void 0,className:a.cn("Bear-Modal__container",e.MODAL_CONTAINER_CLASSES,e.MODAL_SIZE_CLASSES[M],y),style:{zIndex:e.MODAL_PANEL_Z_INDEX},children:[(r||d)&&o.jsxs("div",{className:a.cn("Bear-Modal__header",e.MODAL_HEADER_CLASSES),children:[r&&o.jsx("h2",{id:`${c}-title`,className:a.cn("Bear-Modal__title",e.MODAL_TITLE_CLASSES),children:r}),d&&o.jsx("button",{onClick:l,className:a.cn("Bear-Modal__close",e.MODAL_CLOSE_CLASSES),"aria-label":"Close modal",children:o.jsx(g.CloseIcon,{className:"bear-w-5 bear-h-5"})})]}),o.jsx("div",{className:a.cn("Bear-Modal__body",e.MODAL_BODY_CLASSES),children:L}),u&&o.jsx("div",{className:a.cn("Bear-Modal__footer",e.MODAL_FOOTER_CLASSES),children:u})]})]});return x.createPortal(I,document.body)};exports.Modal=R;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),E=require("react"),j=require("react-dom"),a=require("../../utils/cn.cjs"),q=require("../../utils/generateBearId.utils.cjs"),T=require("../../utils/useBearId.cjs"),g=require("../../hooks/useFocusTrap/useFocusTrap.cjs"),F=require("../../hooks/useFixedAnchorPosition/useFixedAnchorPosition.utils.cjs"),R=require("@forgedevstack/bear-icons/navigation"),P=require("../Backdrop/Backdrop.cjs"),e=require("./Modal.const.cjs"),w=t=>{const{isOpen:s,onClose:r,title:l,children:A,size:M="md",showCloseButton:n=!0,closeOnEscape:L=!0,disableEscapeKeyDown:C=!1,lockBodyScroll:O=!0,cancelPreventScroll:f=!1,closeOnBackdrop:m=!0,hideBackdrop:B=!1,keepMounted:d=!1,isCancelBackgroundClick:i,zIndex:b=e.MODAL_Z_INDEX,className:D,footer:u,testId:v,id:p}=t,y=T.useBearId("Modal"),c=q.resolveBearId(p,y),_=E.useRef(null),S=O&&!f,h=i!==void 0?i:m,I=L&&!C,{openEffect:N}=F.resolveOverlayEffects(t,"scale"),k=e.MODAL_EFFECT_CLASS_MAP[N]??e.MODAL_EFFECT_CLASS_MAP.scale;if(g.useFocusTrap(_,{enabled:s,onEscape:I?r:void 0}),E.useEffect(()=>{if(s)return S&&(document.body.style.overflow="hidden"),()=>{document.body.style.overflow=""}},[s,S]),!s&&!d)return null;const x=o.jsxs("div",{className:e.MODAL_ROOT_CLASSES,"data-testid":v,id:c,style:{zIndex:b},children:[!B&&o.jsx(P.Backdrop,{open:s,keepMounted:d,blur:!0,nested:!0,className:"Bear-Modal__backdrop",onClick:h?()=>r():void 0}),o.jsxs("div",{ref:_,role:"dialog","aria-modal":"true","aria-labelledby":l?`${c}-title`:void 0,className:a.cn("Bear-Modal__container",e.MODAL_CONTAINER_CLASSES,e.MODAL_SIZE_CLASSES[M],s&&k,D),style:{zIndex:e.MODAL_PANEL_Z_INDEX},children:[(l||n)&&o.jsxs("div",{className:a.cn("Bear-Modal__header",e.MODAL_HEADER_CLASSES),children:[l&&o.jsx("h2",{id:`${c}-title`,className:a.cn("Bear-Modal__title",e.MODAL_TITLE_CLASSES),children:l}),n&&o.jsx("button",{type:"button",onClick:r,className:a.cn("Bear-Modal__close",e.MODAL_CLOSE_CLASSES),"aria-label":"Close modal",children:o.jsx(R.CloseIcon,{className:"bear-w-5 bear-h-5"})})]}),o.jsx("div",{className:a.cn("Bear-Modal__body",e.MODAL_BODY_CLASSES),children:A}),u&&o.jsx("div",{className:a.cn("Bear-Modal__footer",e.MODAL_FOOTER_CLASSES),children:u})]})]});return j.createPortal(x,document.body)};exports.Modal=w;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=11e3,r=1,a="Bear-Modal bear-fixed bear-inset-0 bear-flex bear-items-center bear-justify-center bear-p-4",b={sm:"bear-max-w-sm",md:"bear-max-w-md",lg:"bear-max-w-lg",xl:"bear-max-w-xl",full:"bear-max-w-full bear-mx-4"},t="bear-relative bear-w-full bear-max-h-[calc(100vh-2rem)] bear-overflow-y-auto bear-bg-white dark:bear-bg-zinc-900 bear-rounded-xl bear-shadow-2xl bear-border bear-border-gray-200 dark:bear-border-zinc-700 bear-transform bear-transition-all bear-animate-in bear-fade-in bear-zoom-in-95",S="bear-flex bear-items-center bear-justify-between bear-px-6 bear-py-4 bear-border-b bear-border-gray-200 dark:bear-border-zinc-700",o="bear-text-lg bear-font-semibold bear-text-gray-900 dark:bear-text-white",A="bear-p-1 bear-rounded-lg bear-text-gray-400 dark:bear-text-zinc-500 hover:bear-text-gray-600 dark:hover:bear-text-white hover:bear-bg-gray-100 dark:hover:bear-bg-zinc-700 bear-transition-colors",L="bear-px-6 bear-py-4 bear-text-gray-600 dark:bear-text-gray-300",_="bear-flex bear-items-center bear-justify-end bear-gap-3 bear-px-6 bear-py-4 bear-border-t bear-border-gray-200 dark:bear-border-zinc-700";exports.MODAL_BODY_CLASSES=L;exports.MODAL_CLOSE_CLASSES=A;exports.MODAL_CONTAINER_CLASSES=t;exports.MODAL_FOOTER_CLASSES=_;exports.MODAL_HEADER_CLASSES=S;exports.MODAL_PANEL_Z_INDEX=r;exports.MODAL_ROOT_CLASSES=a;exports.MODAL_SIZE_CLASSES=b;exports.MODAL_TITLE_CLASSES=o;exports.MODAL_Z_INDEX=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../constants/numbers.const.cjs"),r=e.ELEVEN_THOUSAND,a=e.ONE,b="Bear-Modal bear-fixed bear-inset-0 bear-flex bear-items-center bear-justify-center bear-p-4",t={sm:"bear-max-w-sm",md:"bear-max-w-md",lg:"bear-max-w-lg",xl:"bear-max-w-xl",full:"bear-max-w-full bear-mx-4"},S="bear-relative bear-w-full bear-max-h-[calc(100vh-2rem)] bear-overflow-y-auto bear-bg-white dark:bear-bg-zinc-900 bear-rounded-xl bear-shadow-2xl bear-border bear-border-gray-200 dark:bear-border-zinc-700 bear-transform bear-transition-all bear-animate-in bear-fade-in bear-zoom-in-95",n="bear-flex bear-items-center bear-justify-between bear-px-6 bear-py-4 bear-border-b bear-border-gray-200 dark:bear-border-zinc-700",o="bear-text-lg bear-font-semibold bear-text-gray-900 dark:bear-text-white",_="bear-p-1 bear-rounded-lg bear-text-gray-400 dark:bear-text-zinc-500 hover:bear-text-gray-600 dark:hover:bear-text-white hover:bear-bg-gray-100 dark:hover:bear-bg-zinc-700 bear-transition-colors",A="bear-px-6 bear-py-4 bear-text-gray-600 dark:bear-text-gray-300",L="bear-flex bear-items-center bear-justify-end bear-gap-3 bear-px-6 bear-py-4 bear-border-t bear-border-gray-200 dark:bear-border-zinc-700",E={scale:"animate-scale-in",fade:"animate-fade-in","slide-down":"animate-grow-up",fold:"animate-alert-dialog-in",none:""};exports.MODAL_BODY_CLASSES=A;exports.MODAL_CLOSE_CLASSES=_;exports.MODAL_CONTAINER_CLASSES=S;exports.MODAL_EFFECT_CLASS_MAP=E;exports.MODAL_FOOTER_CLASSES=L;exports.MODAL_HEADER_CLASSES=n;exports.MODAL_PANEL_Z_INDEX=a;exports.MODAL_ROOT_CLASSES=b;exports.MODAL_SIZE_CLASSES=t;exports.MODAL_TITLE_CLASSES=o;exports.MODAL_Z_INDEX=r;
@@ -10,3 +10,4 @@ export declare const MODAL_TITLE_CLASSES = "bear-text-lg bear-font-semibold bear
10
10
  export declare const MODAL_CLOSE_CLASSES = "bear-p-1 bear-rounded-lg bear-text-gray-400 dark:bear-text-zinc-500 hover:bear-text-gray-600 dark:hover:bear-text-white hover:bear-bg-gray-100 dark:hover:bear-bg-zinc-700 bear-transition-colors";
11
11
  export declare const MODAL_BODY_CLASSES = "bear-px-6 bear-py-4 bear-text-gray-600 dark:bear-text-gray-300";
12
12
  export declare const MODAL_FOOTER_CLASSES = "bear-flex bear-items-center bear-justify-end bear-gap-3 bear-px-6 bear-py-4 bear-border-t bear-border-gray-200 dark:bear-border-zinc-700";
13
+ export declare const MODAL_EFFECT_CLASS_MAP: Record<string, string>;
@@ -1,19 +1,27 @@
1
- const e = 11e3, r = 1, a = "Bear-Modal bear-fixed bear-inset-0 bear-flex bear-items-center bear-justify-center bear-p-4", b = {
1
+ import { ELEVEN_THOUSAND as e, ONE as r } from "../../constants/numbers.const.js";
2
+ const b = e, t = r, o = "Bear-Modal bear-fixed bear-inset-0 bear-flex bear-items-center bear-justify-center bear-p-4", n = {
2
3
  sm: "bear-max-w-sm",
3
4
  md: "bear-max-w-md",
4
5
  lg: "bear-max-w-lg",
5
6
  xl: "bear-max-w-xl",
6
7
  full: "bear-max-w-full bear-mx-4"
7
- }, t = "bear-relative bear-w-full bear-max-h-[calc(100vh-2rem)] bear-overflow-y-auto bear-bg-white dark:bear-bg-zinc-900 bear-rounded-xl bear-shadow-2xl bear-border bear-border-gray-200 dark:bear-border-zinc-700 bear-transform bear-transition-all bear-animate-in bear-fade-in bear-zoom-in-95", o = "bear-flex bear-items-center bear-justify-between bear-px-6 bear-py-4 bear-border-b bear-border-gray-200 dark:bear-border-zinc-700", n = "bear-text-lg bear-font-semibold bear-text-gray-900 dark:bear-text-white", d = "bear-p-1 bear-rounded-lg bear-text-gray-400 dark:bear-text-zinc-500 hover:bear-text-gray-600 dark:hover:bear-text-white hover:bear-bg-gray-100 dark:hover:bear-bg-zinc-700 bear-transition-colors", x = "bear-px-6 bear-py-4 bear-text-gray-600 dark:bear-text-gray-300", i = "bear-flex bear-items-center bear-justify-end bear-gap-3 bear-px-6 bear-py-4 bear-border-t bear-border-gray-200 dark:bear-border-zinc-700";
8
+ }, i = "bear-relative bear-w-full bear-max-h-[calc(100vh-2rem)] bear-overflow-y-auto bear-bg-white dark:bear-bg-zinc-900 bear-rounded-xl bear-shadow-2xl bear-border bear-border-gray-200 dark:bear-border-zinc-700 bear-transform bear-transition-all bear-animate-in bear-fade-in bear-zoom-in-95", d = "bear-flex bear-items-center bear-justify-between bear-px-6 bear-py-4 bear-border-b bear-border-gray-200 dark:bear-border-zinc-700", l = "bear-text-lg bear-font-semibold bear-text-gray-900 dark:bear-text-white", s = "bear-p-1 bear-rounded-lg bear-text-gray-400 dark:bear-text-zinc-500 hover:bear-text-gray-600 dark:hover:bear-text-white hover:bear-bg-gray-100 dark:hover:bear-bg-zinc-700 bear-transition-colors", S = "bear-px-6 bear-py-4 bear-text-gray-600 dark:bear-text-gray-300", x = "bear-flex bear-items-center bear-justify-end bear-gap-3 bear-px-6 bear-py-4 bear-border-t bear-border-gray-200 dark:bear-border-zinc-700", c = {
9
+ scale: "animate-scale-in",
10
+ fade: "animate-fade-in",
11
+ "slide-down": "animate-grow-up",
12
+ fold: "animate-alert-dialog-in",
13
+ none: ""
14
+ };
8
15
  export {
9
- x as MODAL_BODY_CLASSES,
10
- d as MODAL_CLOSE_CLASSES,
11
- t as MODAL_CONTAINER_CLASSES,
12
- i as MODAL_FOOTER_CLASSES,
13
- o as MODAL_HEADER_CLASSES,
14
- r as MODAL_PANEL_Z_INDEX,
15
- a as MODAL_ROOT_CLASSES,
16
- b as MODAL_SIZE_CLASSES,
17
- n as MODAL_TITLE_CLASSES,
18
- e as MODAL_Z_INDEX
16
+ S as MODAL_BODY_CLASSES,
17
+ s as MODAL_CLOSE_CLASSES,
18
+ i as MODAL_CONTAINER_CLASSES,
19
+ c as MODAL_EFFECT_CLASS_MAP,
20
+ x as MODAL_FOOTER_CLASSES,
21
+ d as MODAL_HEADER_CLASSES,
22
+ t as MODAL_PANEL_Z_INDEX,
23
+ o as MODAL_ROOT_CLASSES,
24
+ n as MODAL_SIZE_CLASSES,
25
+ l as MODAL_TITLE_CLASSES,
26
+ b as MODAL_Z_INDEX
19
27
  };
@@ -1,107 +1,110 @@
1
- import { jsxs as s, jsx as e } from "react/jsx-runtime";
2
- import { useCallback as I, useEffect as w } from "react";
1
+ import { jsxs as s, jsx as o } from "react/jsx-runtime";
2
+ import { useRef as R, useEffect as w } from "react";
3
3
  import { createPortal as x } from "react-dom";
4
- import { cn as o } from "../../utils/cn.js";
5
- import { resolveBearId as T } from "../../utils/generateBearId.utils.js";
6
- import { useBearId as R } from "../../utils/useBearId.js";
7
- import { CloseIcon as g } from "@forgedevstack/bear-icons/navigation";
8
- import { Backdrop as z } from "../Backdrop/Backdrop.js";
9
- import { MODAL_Z_INDEX as P, MODAL_ROOT_CLASSES as Z, MODAL_PANEL_Z_INDEX as j, MODAL_TITLE_CLASSES as X, MODAL_CLOSE_CLASSES as $, MODAL_HEADER_CLASSES as F, MODAL_BODY_CLASSES as H, MODAL_FOOTER_CLASSES as K, MODAL_SIZE_CLASSES as Y, MODAL_CONTAINER_CLASSES as q } from "./Modal.const.js";
10
- const le = (u) => {
4
+ import { cn as l } from "../../utils/cn.js";
5
+ import { resolveBearId as g } from "../../utils/generateBearId.utils.js";
6
+ import { useBearId as F } from "../../utils/useBearId.js";
7
+ import { useFocusTrap as P } from "../../hooks/useFocusTrap/useFocusTrap.js";
8
+ import { resolveOverlayEffects as z } from "../../hooks/useFixedAnchorPosition/useFixedAnchorPosition.utils.js";
9
+ import { CloseIcon as Z } from "@forgedevstack/bear-icons/navigation";
10
+ import { Backdrop as j } from "../Backdrop/Backdrop.js";
11
+ import { MODAL_Z_INDEX as X, MODAL_ROOT_CLASSES as $, MODAL_PANEL_Z_INDEX as H, MODAL_TITLE_CLASSES as K, MODAL_CLOSE_CLASSES as Y, MODAL_HEADER_CLASSES as q, MODAL_BODY_CLASSES as G, MODAL_FOOTER_CLASSES as J, MODAL_EFFECT_CLASS_MAP as S, MODAL_SIZE_CLASSES as Q, MODAL_CONTAINER_CLASSES as U } from "./Modal.const.js";
12
+ const ne = (d) => {
11
13
  const {
12
- isOpen: a,
13
- onClose: l,
14
- title: r,
15
- children: E,
16
- size: L = "md",
14
+ isOpen: e,
15
+ onClose: r,
16
+ title: a,
17
+ children: u,
18
+ size: E = "md",
17
19
  showCloseButton: c = !0,
18
- closeOnEscape: f = !0,
19
- disableEscapeKeyDown: p = !1,
20
- lockBodyScroll: A = !0,
20
+ closeOnEscape: p = !0,
21
+ disableEscapeKeyDown: A = !1,
22
+ lockBodyScroll: L = !0,
21
23
  cancelPreventScroll: C = !1,
22
24
  closeOnBackdrop: M = !0,
23
25
  hideBackdrop: O = !1,
24
26
  keepMounted: n = !1,
25
27
  isCancelBackgroundClick: i,
26
- zIndex: B = P,
27
- className: k,
28
+ zIndex: B = X,
29
+ className: b,
28
30
  footer: m,
29
- testId: b,
30
- id: h
31
- } = u, v = R("Modal"), d = T(h, v), _ = A && !C, y = i !== void 0 ? i : M, S = f && !p, t = I(
32
- (N) => {
33
- S && N.key === "Escape" && l();
34
- },
35
- [S, l]
36
- );
37
- if (w(() => {
38
- if (a)
39
- return document.addEventListener("keydown", t), _ && (document.body.style.overflow = "hidden"), () => {
40
- document.removeEventListener("keydown", t), document.body.style.overflow = "";
31
+ testId: D,
32
+ id: v
33
+ } = d, N = F("Modal"), t = g(v, N), _ = R(null), f = L && !C, h = i !== void 0 ? i : M, y = p && !A, { openEffect: k } = z(d, "scale"), I = S[k] ?? S.scale;
34
+ if (P(_, {
35
+ enabled: e,
36
+ onEscape: y ? r : void 0
37
+ }), w(() => {
38
+ if (e)
39
+ return f && (document.body.style.overflow = "hidden"), () => {
40
+ document.body.style.overflow = "";
41
41
  };
42
- }, [a, t, _]), !a && !n) return null;
43
- const D = /* @__PURE__ */ s(
42
+ }, [e, f]), !e && !n) return null;
43
+ const T = /* @__PURE__ */ s(
44
44
  "div",
45
45
  {
46
- className: Z,
47
- "data-testid": b,
48
- id: d,
46
+ className: $,
47
+ "data-testid": D,
48
+ id: t,
49
49
  style: { zIndex: B },
50
50
  children: [
51
- !O && /* @__PURE__ */ e(
52
- z,
51
+ !O && /* @__PURE__ */ o(
52
+ j,
53
53
  {
54
- open: a,
54
+ open: e,
55
55
  keepMounted: n,
56
56
  blur: !0,
57
57
  nested: !0,
58
58
  className: "Bear-Modal__backdrop",
59
- onClick: y ? () => l() : void 0
59
+ onClick: h ? () => r() : void 0
60
60
  }
61
61
  ),
62
62
  /* @__PURE__ */ s(
63
63
  "div",
64
64
  {
65
+ ref: _,
65
66
  role: "dialog",
66
67
  "aria-modal": "true",
67
- "aria-labelledby": r ? `${d}-title` : void 0,
68
- className: o(
68
+ "aria-labelledby": a ? `${t}-title` : void 0,
69
+ className: l(
69
70
  "Bear-Modal__container",
70
- q,
71
- Y[L],
72
- k
71
+ U,
72
+ Q[E],
73
+ e && I,
74
+ b
73
75
  ),
74
- style: { zIndex: j },
76
+ style: { zIndex: H },
75
77
  children: [
76
- (r || c) && /* @__PURE__ */ s("div", { className: o("Bear-Modal__header", F), children: [
77
- r && /* @__PURE__ */ e(
78
+ (a || c) && /* @__PURE__ */ s("div", { className: l("Bear-Modal__header", q), children: [
79
+ a && /* @__PURE__ */ o(
78
80
  "h2",
79
81
  {
80
- id: `${d}-title`,
81
- className: o("Bear-Modal__title", X),
82
- children: r
82
+ id: `${t}-title`,
83
+ className: l("Bear-Modal__title", K),
84
+ children: a
83
85
  }
84
86
  ),
85
- c && /* @__PURE__ */ e(
87
+ c && /* @__PURE__ */ o(
86
88
  "button",
87
89
  {
88
- onClick: l,
89
- className: o("Bear-Modal__close", $),
90
+ type: "button",
91
+ onClick: r,
92
+ className: l("Bear-Modal__close", Y),
90
93
  "aria-label": "Close modal",
91
- children: /* @__PURE__ */ e(g, { className: "bear-w-5 bear-h-5" })
94
+ children: /* @__PURE__ */ o(Z, { className: "bear-w-5 bear-h-5" })
92
95
  }
93
96
  )
94
97
  ] }),
95
- /* @__PURE__ */ e("div", { className: o("Bear-Modal__body", H), children: E }),
96
- m && /* @__PURE__ */ e("div", { className: o("Bear-Modal__footer", K), children: m })
98
+ /* @__PURE__ */ o("div", { className: l("Bear-Modal__body", G), children: u }),
99
+ m && /* @__PURE__ */ o("div", { className: l("Bear-Modal__footer", J), children: m })
97
100
  ]
98
101
  }
99
102
  )
100
103
  ]
101
104
  }
102
105
  );
103
- return x(D, document.body);
106
+ return x(T, document.body);
104
107
  };
105
108
  export {
106
- le as Modal
109
+ ne as Modal
107
110
  };
@@ -1,4 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
+ import { OverlayMotionEffect, OverlayEffectConfig } from '../../hooks/useFixedAnchorPosition';
2
3
  export type ModalSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
3
4
  export interface ModalProps {
4
5
  /** Whether the modal is open */
@@ -26,6 +27,12 @@ export interface ModalProps {
26
27
  cancelPreventScroll?: boolean;
27
28
  /** When provided, sets whether clicking the backdrop closes the modal (overrides closeOnBackdrop) */
28
29
  isCancelBackgroundClick?: boolean;
30
+ /** Transition effect when opening */
31
+ openEffect?: OverlayMotionEffect;
32
+ /** Transition effect when closing */
33
+ closeEffect?: OverlayMotionEffect;
34
+ /** Config for open and close transition effects */
35
+ effect?: OverlayEffectConfig;
29
36
  /** Additional class names for content */
30
37
  className?: string;
31
38
  /** Footer content */
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),l=require("react"),D=require("react-dom"),p=require("../../utils/cn.cjs"),H=11e3;function X(d,t,s){const e={position:"fixed",zIndex:H},a=d.split("-")[0],n=d.includes("start"),o=d.includes("end");return a==="bottom"?(e.top=t.bottom+s,n?e.left=t.left:o?e.left=t.right:e.left=t.left+t.width/2):a==="top"?(e.bottom=window.innerHeight-t.top+s,n?e.left=t.left:o?e.left=t.right:e.left=t.left+t.width/2):a==="left"?(e.right=window.innerWidth-t.left+s,n?e.top=t.top:o?e.bottom=window.innerHeight-t.bottom:e.top=t.top+t.height/2):(e.left=t.right+s,n?e.top=t.top:o?e.bottom=window.innerHeight-t.bottom:e.top=t.top+t.height/2),a==="bottom"||a==="top"?!n&&!o?e.transform="translateX(-50%)":o&&(e.transform="translateX(-100%)"):!n&&!o?e.transform="translateY(-50%)":o&&(e.transform="translateY(-100%)"),e}const T=({children:d,content:t,placement:s="bottom",trigger:e="click",open:a,onOpenChange:n,className:o,contentClassName:x,arrow:L=!0,closeOnClickOutside:m=!0,closeOnEscape:v=!0,offset:w=8})=>{const[k,z]=l.useState(!1),[R,S]=l.useState({}),f=l.useRef(null),h=l.useRef(null),i=a!==void 0?a:k,b=l.useCallback(r=>{z(r),n==null||n(r)},[n]);l.useEffect(()=>{if(!i||!f.current)return;const r=()=>{if(!f.current)return;const u=f.current.getBoundingClientRect();S(X(s,u,w))};return r(),window.addEventListener("resize",r),window.addEventListener("scroll",r,!0),()=>{window.removeEventListener("resize",r),window.removeEventListener("scroll",r,!0)}},[i,s,w]),l.useEffect(()=>{if(!m)return;const r=u=>{var y,g;const E=u.target;(y=f.current)!=null&&y.contains(E)||(g=h.current)!=null&&g.contains(E)||b(!1)};return i&&document.addEventListener("mousedown",r),()=>document.removeEventListener("mousedown",r)},[i,m,b]),l.useEffect(()=>{if(!v)return;const r=u=>{u.key==="Escape"&&b(!1)};return i&&document.addEventListener("keydown",r),()=>document.removeEventListener("keydown",r)},[i,v,b]);const j=()=>{e==="click"&&b(!i)},P=()=>{e==="hover"&&b(!0)},M=()=>{e==="hover"&&b(!1)},N={top:"bear-top-full bear-left-1/2 -bear-translate-x-1/2 bear-border-t-zinc-700 bear-border-x-transparent bear-border-b-transparent",bottom:"bear-bottom-full bear-left-1/2 -bear-translate-x-1/2 bear-border-b-zinc-700 bear-border-x-transparent bear-border-t-transparent",left:"bear-left-full bear-top-1/2 -bear-translate-y-1/2 bear-border-l-zinc-700 bear-border-y-transparent bear-border-r-transparent",right:"bear-right-full bear-top-1/2 -bear-translate-y-1/2 bear-border-r-zinc-700 bear-border-y-transparent bear-border-l-transparent"},q=s.split("-")[0],I=i&&typeof document<"u"&&D.createPortal(c.jsxs("div",{ref:h,"data-bear-popover":!0,className:p.cn("bear-bg-zinc-800 bear-border bear-border-zinc-700 bear-rounded-lg bear-shadow-xl bear-p-3",x),style:R,children:[t,L&&c.jsx("div",{className:p.cn("bear-absolute bear-w-0 bear-h-0 bear-border-8",N[q])})]}),document.body);return c.jsxs("div",{ref:f,className:p.cn("bear-relative bear-inline-block",o),onMouseEnter:P,onMouseLeave:M,children:[c.jsx("div",{onClick:j,className:"bear-cursor-pointer",children:d}),I]})};exports.Popover=T;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("react/jsx-runtime"),c=require("react"),V=require("react-dom"),R=require("../../utils/cn.cjs"),m=require("../../constants/numbers.const.cjs"),j=require("../../hooks/useFixedAnchorPosition/useFixedAnchorPosition.utils.cjs"),e=require("./Popover.const.cjs");function z(E,t,d){const n={position:"fixed",zIndex:e.POPOVER_Z_INDEX},[r]=E.split("-"),s=E.includes(e.ALIGN_START),i=E.includes(e.ALIGN_END);return r===e.PLACEMENT_BOTTOM||r===e.PLACEMENT_TOP?(n.top=r===e.PLACEMENT_BOTTOM?t.bottom+d:void 0,n.bottom=r===e.PLACEMENT_TOP?window.innerHeight-t.top+d:void 0,n.left=s?t.left:i?t.right:t.left+t.width/m.TWO,n.transform=!s&&!i?e.TRANSFORM_TRANSLATE_X_CENTER:i?e.TRANSFORM_TRANSLATE_X_END:void 0):(n.left=r===e.PLACEMENT_RIGHT?t.right+d:void 0,n.right=r===e.PLACEMENT_LEFT?window.innerWidth-t.left+d:void 0,n.bottom=i?window.innerHeight-t.bottom:void 0,n.top=i?void 0:s?t.top:t.top+t.height/m.TWO,n.transform=!s&&!i?e.TRANSFORM_TRANSLATE_Y_CENTER:i?e.TRANSFORM_TRANSLATE_Y_END:void 0),n}const B=({children:E,content:t,placement:d=e.PLACEMENT_BOTTOM,trigger:n="click",open:r,onOpenChange:s,className:i,contentClassName:b,arrow:O=!0,closeOnClickOutside:P=!0,closeOnEscape:A=!0,offset:L=e.POPOVER_DEFAULT_OFFSET,openEffect:w,closeEffect:S,effect:h})=>{const[M,p]=c.useState(!1),[C,F]=c.useState({}),f=c.useRef(null),T=c.useRef(null),a=r!==void 0?r:M,l=c.useCallback(o=>{p(o),s==null||s(o)},[s]),v=c.useCallback(()=>{if(!f.current||!T.current)return;const o=f.current.firstElementChild;if(!o)return;const u=o.getBoundingClientRect();F(z(d,u,L))},[d,L]);c.useEffect(()=>{if(a){v();const o=()=>v(),u=()=>v();return window.addEventListener("resize",o),window.addEventListener("scroll",u,!0),()=>{window.removeEventListener("resize",o),window.removeEventListener("scroll",u,!0)}}},[a,v]),c.useEffect(()=>{if(!a||!P)return;const o=u=>{const N=u.target;f.current&&!f.current.contains(N)&&T.current&&!T.current.contains(N)&&l(!1)};return document.addEventListener("mousedown",o),()=>document.removeEventListener("mousedown",o)},[a,P,l]),c.useEffect(()=>{if(!a||!A)return;const o=u=>{u.key==="Escape"&&l(!1)};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[a,A,l]);const g=()=>{n==="click"&&l(!a)},y=()=>{n==="hover"&&l(!0)},k=()=>{n==="hover"&&l(!1)},x=d.split("-")[0],{openEffect:D}=j.resolveOverlayEffects({openEffect:w,closeEffect:S,effect:h},"fade"),q=e.POPOVER_EFFECT_CLASS_MAP[D]??e.POPOVER_EFFECT_CLASS_MAP.fade,I=a&&typeof document<"u"&&V.createPortal(_.jsxs("div",{ref:T,"data-bear-popover":!0,className:R.cn("bear-bg-zinc-800 bear-border bear-border-zinc-700 bear-rounded-lg bear-shadow-xl bear-p-3",q,b),style:C,children:[t,O&&_.jsx("div",{className:R.cn("bear-absolute bear-w-0 bear-h-0 bear-border-8",e.POPOVER_ARROW_STYLES[x])})]}),document.body);return _.jsxs("div",{ref:f,className:R.cn("bear-relative bear-inline-block",i),onMouseEnter:y,onMouseLeave:k,children:[_.jsx("div",{onClick:g,className:"bear-cursor-pointer",children:E}),I]})};exports.Popover=B;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../../constants/numbers.const.cjs"),t=r.ELEVEN_THOUSAND,e=r.EIGHT,a={scale:"animate-scale-in",fade:"animate-fade-in","slide-down":"animate-grow-up",fold:"animate-alert-dialog-in",none:""},E="bottom",T="top",n="left",_="right",o="start",A="end",b="translateX(-50%)",R="translateX(-100%)",N="translateY(-50%)",s="translateY(-100%)",O={top:"bear-top-full bear-left-1/2 -bear-translate-x-1/2 bear-border-t-zinc-700 bear-border-x-transparent bear-border-b-transparent",bottom:"bear-bottom-full bear-left-1/2 -bear-translate-x-1/2 bear-border-b-zinc-700 bear-border-x-transparent bear-border-t-transparent",left:"bear-left-full bear-top-1/2 -bear-translate-y-1/2 bear-border-l-zinc-700 bear-border-y-transparent bear-border-r-transparent",right:"bear-right-full bear-top-1/2 -bear-translate-y-1/2 bear-border-r-zinc-700 bear-border-y-transparent bear-border-l-transparent"};exports.ALIGN_END=A;exports.ALIGN_START=o;exports.PLACEMENT_BOTTOM=E;exports.PLACEMENT_LEFT=n;exports.PLACEMENT_RIGHT=_;exports.PLACEMENT_TOP=T;exports.POPOVER_ARROW_STYLES=O;exports.POPOVER_DEFAULT_OFFSET=e;exports.POPOVER_EFFECT_CLASS_MAP=a;exports.POPOVER_Z_INDEX=t;exports.TRANSFORM_TRANSLATE_X_CENTER=b;exports.TRANSFORM_TRANSLATE_X_END=R;exports.TRANSFORM_TRANSLATE_Y_CENTER=N;exports.TRANSFORM_TRANSLATE_Y_END=s;
@@ -1 +1,15 @@
1
- export declare const P_O_P_O_V_E_R_ROOT_CLASS = "Bear-Popover";
1
+ export declare const POPOVER_ROOT_CLASS = "Bear-Popover";
2
+ export declare const POPOVER_Z_INDEX = 11000;
3
+ export declare const POPOVER_DEFAULT_OFFSET = 8;
4
+ export declare const POPOVER_EFFECT_CLASS_MAP: Record<string, string>;
5
+ export declare const PLACEMENT_BOTTOM = "bottom";
6
+ export declare const PLACEMENT_TOP = "top";
7
+ export declare const PLACEMENT_LEFT = "left";
8
+ export declare const PLACEMENT_RIGHT = "right";
9
+ export declare const ALIGN_START = "start";
10
+ export declare const ALIGN_END = "end";
11
+ export declare const TRANSFORM_TRANSLATE_X_CENTER = "translateX(-50%)";
12
+ export declare const TRANSFORM_TRANSLATE_X_END = "translateX(-100%)";
13
+ export declare const TRANSFORM_TRANSLATE_Y_CENTER = "translateY(-50%)";
14
+ export declare const TRANSFORM_TRANSLATE_Y_END = "translateY(-100%)";
15
+ export declare const POPOVER_ARROW_STYLES: Record<string, string>;