@forgedevstack/bear 1.2.8 → 1.3.0

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 (85) hide show
  1. package/dist/components/Backdrop/Backdrop.cjs +1 -1
  2. package/dist/components/Backdrop/Backdrop.const.cjs +1 -1
  3. package/dist/components/Backdrop/Backdrop.const.d.ts +4 -1
  4. package/dist/components/Backdrop/Backdrop.const.js +11 -8
  5. package/dist/components/Backdrop/Backdrop.js +39 -36
  6. package/dist/components/Backdrop/Backdrop.types.d.ts +1 -0
  7. package/dist/components/Backdrop/index.d.ts +1 -0
  8. package/dist/components/Drawer/Drawer.cjs +1 -1
  9. package/dist/components/Drawer/Drawer.const.cjs +1 -1
  10. package/dist/components/Drawer/Drawer.const.d.ts +3 -0
  11. package/dist/components/Drawer/Drawer.const.js +14 -11
  12. package/dist/components/Drawer/Drawer.js +95 -82
  13. package/dist/components/Modal/Modal.cjs +1 -1
  14. package/dist/components/Modal/Modal.const.cjs +1 -1
  15. package/dist/components/Modal/Modal.const.d.ts +3 -1
  16. package/dist/components/Modal/Modal.const.js +12 -9
  17. package/dist/components/Modal/Modal.js +45 -41
  18. package/dist/components/Modal/Modal.types.d.ts +1 -0
  19. package/dist/components/ModalsProvider/ModalsContext.cjs +1 -0
  20. package/dist/components/ModalsProvider/ModalsContext.d.ts +2 -0
  21. package/dist/components/ModalsProvider/ModalsContext.js +5 -0
  22. package/dist/components/ModalsProvider/ModalsProvider.cjs +1 -0
  23. package/dist/components/ModalsProvider/ModalsProvider.const.cjs +1 -0
  24. package/dist/components/ModalsProvider/ModalsProvider.const.d.ts +39 -0
  25. package/dist/components/ModalsProvider/ModalsProvider.const.js +40 -0
  26. package/dist/components/ModalsProvider/ModalsProvider.d.ts +3 -0
  27. package/dist/components/ModalsProvider/ModalsProvider.js +97 -0
  28. package/dist/components/ModalsProvider/ModalsProvider.types.d.ts +75 -0
  29. package/dist/components/ModalsProvider/ModalsProvider.utils.cjs +1 -0
  30. package/dist/components/ModalsProvider/ModalsProvider.utils.d.ts +8 -0
  31. package/dist/components/ModalsProvider/ModalsProvider.utils.js +24 -0
  32. package/dist/components/ModalsProvider/components/ModalsHost/ModalsHost.cjs +1 -0
  33. package/dist/components/ModalsProvider/components/ModalsHost/ModalsHost.d.ts +2 -0
  34. package/dist/components/ModalsProvider/components/ModalsHost/ModalsHost.js +24 -0
  35. package/dist/components/ModalsProvider/components/ModalsHost/index.d.ts +1 -0
  36. package/dist/components/ModalsProvider/components/StackedModal/StackedModal.cjs +1 -0
  37. package/dist/components/ModalsProvider/components/StackedModal/StackedModal.d.ts +2 -0
  38. package/dist/components/ModalsProvider/components/StackedModal/StackedModal.js +66 -0
  39. package/dist/components/ModalsProvider/components/StackedModal/index.d.ts +1 -0
  40. package/dist/components/ModalsProvider/components/index.d.ts +2 -0
  41. package/dist/components/ModalsProvider/hooks/index.d.ts +1 -0
  42. package/dist/components/ModalsProvider/hooks/useModals.cjs +1 -0
  43. package/dist/components/ModalsProvider/hooks/useModals.d.ts +2 -0
  44. package/dist/components/ModalsProvider/hooks/useModals.js +12 -0
  45. package/dist/components/ModalsProvider/index.d.ts +3 -0
  46. package/dist/components/SignPad/SignPad.cjs +1 -1
  47. package/dist/components/SignPad/SignPad.const.cjs +1 -1
  48. package/dist/components/SignPad/SignPad.const.d.ts +13 -2
  49. package/dist/components/SignPad/SignPad.const.js +22 -13
  50. package/dist/components/SignPad/SignPad.js +127 -121
  51. package/dist/components/SignPad/SignPad.types.d.ts +2 -1
  52. package/dist/components/SignPad/SignPad.utils.cjs +1 -0
  53. package/dist/components/SignPad/SignPad.utils.d.ts +34 -0
  54. package/dist/components/SignPad/SignPad.utils.js +42 -0
  55. package/dist/components/Snackbar/Snackbar.cjs +1 -1
  56. package/dist/components/Snackbar/Snackbar.const.cjs +1 -1
  57. package/dist/components/Snackbar/Snackbar.const.d.ts +7 -1
  58. package/dist/components/Snackbar/Snackbar.const.js +21 -11
  59. package/dist/components/Snackbar/Snackbar.js +60 -59
  60. package/dist/components/StatCard/StatCard.cjs +1 -1
  61. package/dist/components/StatCard/StatCard.const.cjs +1 -0
  62. package/dist/components/StatCard/StatCard.const.d.ts +11 -1
  63. package/dist/components/StatCard/StatCard.const.js +14 -0
  64. package/dist/components/StatCard/StatCard.d.ts +0 -4
  65. package/dist/components/StatCard/StatCard.js +44 -32
  66. package/dist/components/Stepper/Stepper.cjs +1 -1
  67. package/dist/components/Stepper/Stepper.const.cjs +1 -1
  68. package/dist/components/Stepper/Stepper.const.d.ts +23 -11
  69. package/dist/components/Stepper/Stepper.const.js +60 -48
  70. package/dist/components/Stepper/Stepper.js +126 -118
  71. package/dist/components/Toast/Toast.cjs +1 -1
  72. package/dist/components/Toast/Toast.const.cjs +1 -1
  73. package/dist/components/Toast/Toast.const.d.ts +4 -1
  74. package/dist/components/Toast/Toast.const.js +20 -5
  75. package/dist/components/Toast/Toast.js +97 -110
  76. package/dist/components/index.cjs +1 -1
  77. package/dist/components/index.d.ts +2 -0
  78. package/dist/components/index.js +389 -385
  79. package/dist/index.cjs +1 -1
  80. package/dist/index.js +504 -500
  81. package/dist/styles/_feedback.css +130 -0
  82. package/dist/styles/_overlays.css +24 -0
  83. package/dist/styles/main.css +2 -0
  84. package/dist/styles.css +193 -25
  85. package/package.json +1 -1
@@ -1,59 +1,62 @@
1
1
  import { jsxs as s, jsx as e } from "react/jsx-runtime";
2
- import { useCallback as D, useEffect as I } from "react";
3
- import { createPortal as w } from "react-dom";
2
+ import { useCallback as I, useEffect as w } from "react";
3
+ import { createPortal as x } from "react-dom";
4
4
  import { cn as o } from "../../utils/cn.js";
5
- import { resolveBearId as x } from "../../utils/generateBearId.utils.js";
6
- import { useBearId as T } from "../../utils/useBearId.js";
5
+ import { resolveBearId as T } from "../../utils/generateBearId.utils.js";
6
+ import { useBearId as R } from "../../utils/useBearId.js";
7
7
  import { CloseIcon as g } from "../Icon/icons/navigation.js";
8
- import { Backdrop as j } from "../Backdrop/Backdrop.js";
9
- import { MODAL_TITLE_CLASSES as R, MODAL_CLOSE_CLASSES as z, MODAL_HEADER_CLASSES as P, MODAL_BODY_CLASSES as $, MODAL_FOOTER_CLASSES as F, MODAL_SIZE_CLASSES as H, MODAL_CONTAINER_CLASSES as K } from "./Modal.const.js";
10
- const X = (u) => {
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) => {
11
11
  const {
12
12
  isOpen: a,
13
- onClose: r,
14
- title: l,
15
- children: S,
16
- size: p = "md",
13
+ onClose: l,
14
+ title: r,
15
+ children: E,
16
+ size: L = "md",
17
17
  showCloseButton: c = !0,
18
- closeOnEscape: b = !0,
19
- disableEscapeKeyDown: E = !1,
20
- lockBodyScroll: C = !0,
21
- cancelPreventScroll: B = !1,
22
- closeOnBackdrop: L = !0,
23
- hideBackdrop: M = !1,
18
+ closeOnEscape: f = !0,
19
+ disableEscapeKeyDown: p = !1,
20
+ lockBodyScroll: A = !0,
21
+ cancelPreventScroll: C = !1,
22
+ closeOnBackdrop: M = !0,
23
+ hideBackdrop: O = !1,
24
24
  keepMounted: n = !1,
25
25
  isCancelBackgroundClick: i,
26
+ zIndex: B = P,
26
27
  className: k,
27
28
  footer: m,
28
- testId: A,
29
+ testId: b,
29
30
  id: h
30
- } = u, v = T("Modal"), d = x(h, v), _ = C && !B, O = i !== void 0 ? i : L, f = b && !E, t = D(
31
+ } = u, v = R("Modal"), d = T(h, v), _ = A && !C, y = i !== void 0 ? i : M, S = f && !p, t = I(
31
32
  (N) => {
32
- f && N.key === "Escape" && r();
33
+ S && N.key === "Escape" && l();
33
34
  },
34
- [f, r]
35
+ [S, l]
35
36
  );
36
- if (I(() => {
37
+ if (w(() => {
37
38
  if (a)
38
39
  return document.addEventListener("keydown", t), _ && (document.body.style.overflow = "hidden"), () => {
39
40
  document.removeEventListener("keydown", t), document.body.style.overflow = "";
40
41
  };
41
42
  }, [a, t, _]), !a && !n) return null;
42
- const y = /* @__PURE__ */ s(
43
+ const D = /* @__PURE__ */ s(
43
44
  "div",
44
45
  {
45
- className: "Bear-Modal bear-fixed bear-inset-0 bear-z-[11000] bear-flex bear-items-center bear-justify-center bear-p-4",
46
- "data-testid": A,
46
+ className: Z,
47
+ "data-testid": b,
47
48
  id: d,
49
+ style: { zIndex: B },
48
50
  children: [
49
- !M && /* @__PURE__ */ e(
50
- j,
51
+ !O && /* @__PURE__ */ e(
52
+ z,
51
53
  {
52
54
  open: a,
53
55
  keepMounted: n,
54
56
  blur: !0,
57
+ nested: !0,
55
58
  className: "Bear-Modal__backdrop",
56
- onClick: O ? () => r() : void 0
59
+ onClick: y ? () => l() : void 0
57
60
  }
58
61
  ),
59
62
  /* @__PURE__ */ s(
@@ -61,43 +64,44 @@ const X = (u) => {
61
64
  {
62
65
  role: "dialog",
63
66
  "aria-modal": "true",
64
- "aria-labelledby": l ? `${d}-title` : void 0,
67
+ "aria-labelledby": r ? `${d}-title` : void 0,
65
68
  className: o(
66
69
  "Bear-Modal__container",
67
- K,
68
- H[p],
70
+ q,
71
+ Y[L],
69
72
  k
70
73
  ),
74
+ style: { zIndex: j },
71
75
  children: [
72
- (l || c) && /* @__PURE__ */ s("div", { className: o("Bear-Modal__header", P), children: [
73
- l && /* @__PURE__ */ e(
76
+ (r || c) && /* @__PURE__ */ s("div", { className: o("Bear-Modal__header", F), children: [
77
+ r && /* @__PURE__ */ e(
74
78
  "h2",
75
79
  {
76
80
  id: `${d}-title`,
77
- className: o("Bear-Modal__title", R),
78
- children: l
81
+ className: o("Bear-Modal__title", X),
82
+ children: r
79
83
  }
80
84
  ),
81
85
  c && /* @__PURE__ */ e(
82
86
  "button",
83
87
  {
84
- onClick: r,
85
- className: o("Bear-Modal__close", z),
88
+ onClick: l,
89
+ className: o("Bear-Modal__close", $),
86
90
  "aria-label": "Close modal",
87
91
  children: /* @__PURE__ */ e(g, { className: "bear-w-5 bear-h-5" })
88
92
  }
89
93
  )
90
94
  ] }),
91
- /* @__PURE__ */ e("div", { className: o("Bear-Modal__body", $), children: S }),
92
- m && /* @__PURE__ */ e("div", { className: o("Bear-Modal__footer", F), children: m })
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 })
93
97
  ]
94
98
  }
95
99
  )
96
100
  ]
97
101
  }
98
102
  );
99
- return w(y, document.body);
103
+ return x(D, document.body);
100
104
  };
101
105
  export {
102
- X as Modal
106
+ le as Modal
103
107
  };
@@ -21,6 +21,7 @@ export interface ModalProps {
21
21
  hideBackdrop?: boolean;
22
22
  keepMounted?: boolean;
23
23
  lockBodyScroll?: boolean;
24
+ zIndex?: number;
24
25
  /** When true, the page behind the modal stays scrollable (same as lockBodyScroll: false) */
25
26
  cancelPreventScroll?: boolean;
26
27
  /** When provided, sets whether clicking the backdrop closes the modal (overrides closeOnBackdrop) */
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),e=t.createContext(null);exports.ModalsContext=e;
@@ -0,0 +1,2 @@
1
+ import { ModalsContextValue } from './ModalsProvider.types';
2
+ export declare const ModalsContext: import('react').Context<ModalsContextValue | null>;
@@ -0,0 +1,5 @@
1
+ import { createContext as t } from "react";
2
+ const e = t(null);
3
+ export {
4
+ e as ModalsContext
5
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const A=require("react/jsx-runtime"),l=require("react"),L=require("../../utils/generateBearId.utils.cjs"),Y=require("../../utils/useBearId.cjs"),b=require("./components/ModalsHost/ModalsHost.cjs"),U=require("./ModalsContext.cjs"),n=require("./ModalsProvider.const.cjs"),i=require("./ModalsProvider.utils.cjs"),w=m=>{const{children:I,translations:N,id:T,testId:g}=m,v=Y.useBearId(n.MODALS_ID_COMPONENT),R=L.resolveBearId(T,v),[O,P]=l.useState([]),[h,_]=l.useState(n.MODALS_NULL_LOADING_ID),o=l.useRef([]),u=l.useRef(new Map),M=l.useRef(null),F={...n.MODALS_DEFAULT_TRANSLATIONS,...N},a=e=>{o.current=e,P(e)},D=()=>{if(o.current.length!==n.MODALS_STACK_EMPTY)return;const e=document.activeElement;M.current=e instanceof HTMLElement?e:null},f=()=>{var e;(e=M.current)==null||e.focus(),M.current=null},E=e=>{var s,c,d,S,C;const t=o.current.find(K=>K.id===e);if(!t)return;i.isConfirmEntry(t)?((c=(s=t.options).onCancel)==null||c.call(s),(d=u.current.get(e))==null||d(n.MODALS_CONFIRM_REJECTED)):(C=(S=t.options).onClose)==null||C.call(S),u.current.delete(e);const r=i.removeStackEntry(o.current,e);a(r),r.length===n.MODALS_STACK_EMPTY&&f()},y=e=>{const t=o.current.find(s=>s.id===e);if(!t||!i.isConfirmEntry(t))return;const r=()=>{var c;(c=u.current.get(e))==null||c(n.MODALS_CONFIRM_ACCEPTED),u.current.delete(e);const s=i.removeStackEntry(o.current,e);a(s),s.length===n.MODALS_STACK_EMPTY&&f()};if(!t.options.onConfirm){r();return}_(e),Promise.resolve(t.options.onConfirm()).then(()=>{_(n.MODALS_NULL_LOADING_ID),r()}).catch(()=>{_(n.MODALS_NULL_LOADING_ID)})},B=e=>{D();const t=e.id??L.generateBearId(n.MODALS_OPEN_ID_COMPONENT);return a([...o.current,i.createModalEntry(t,e)]),t},p=e=>new Promise(t=>{D();const r=e.id??L.generateBearId(n.MODALS_CONFIRM_ID_COMPONENT);u.current.set(r,t),a([...o.current,i.createConfirmEntry(r,e)])}),q=e=>{const t=i.resolveStackTargetId(o.current,e);t&&E(t)},k=()=>{o.current.forEach(e=>{var t,r,s,c,d;i.isConfirmEntry(e)?((r=(t=e.options).onCancel)==null||r.call(t),(s=u.current.get(e.id))==null||s(n.MODALS_CONFIRM_REJECTED)):(d=(c=e.options).onClose)==null||d.call(c),u.current.delete(e.id)}),a([]),f()};l.useEffect(()=>{if(O.length===n.MODALS_STACK_EMPTY){document.body.style.overflow=n.MODALS_UNLOCK_BODY_OVERFLOW;return}return document.body.style.overflow=n.MODALS_LOCK_BODY_OVERFLOW,()=>{document.body.style.overflow=n.MODALS_UNLOCK_BODY_OVERFLOW}},[O.length]);const x={open:B,confirm:p,close:q,closeAll:k};return A.jsxs(U.ModalsContext.Provider,{value:x,children:[I,A.jsx(b.ModalsHost,{id:R,testId:g,stack:O,loadingId:h,labels:F,onDismiss:E,onConfirm:y})]})};exports.ModalsProvider=w;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _="Bear-ModalsProvider",O="Bear-ModalsProvider__host",S=`${_} ${O}`,A="Bear-ModalsProvider__item",L="Bear-ModalsProvider__confirm-body",D="Bear-ModalsProvider__confirm-footer",M="end",E=3,C="body2",N="ghost",o=!0,T=!1,I=!1,R="modal",s="confirm",t="ModalsProvider",n="Modal",c="Modal",F=0,e=1,P=11e3,r=10,d="md",a=!0,l=!0,i=!0,K="danger",U=!0,B=!1,Y="hidden",u="",V={confirm:"Confirm",cancel:"Cancel"},f="useModals must be used within a ModalsProvider",m=null;exports.MODALS_ALWAYS_OPEN=o;exports.MODALS_BASE_Z_INDEX=P;exports.MODALS_CANCEL_VARIANT=N;exports.MODALS_CONFIRM_ACCEPTED=U;exports.MODALS_CONFIRM_BODY_CLASS=L;exports.MODALS_CONFIRM_FOOTER_CLASS=D;exports.MODALS_CONFIRM_ID_COMPONENT=c;exports.MODALS_CONFIRM_REJECTED=B;exports.MODALS_DEFAULT_CLOSE_ON_BACKDROP=l;exports.MODALS_DEFAULT_CLOSE_ON_ESCAPE=i;exports.MODALS_DEFAULT_CONFIRM_VARIANT=K;exports.MODALS_DEFAULT_SHOW_CLOSE=a;exports.MODALS_DEFAULT_SIZE=d;exports.MODALS_DEFAULT_TRANSLATIONS=V;exports.MODALS_DESCRIPTION_VARIANT=C;exports.MODALS_FOOTER_GAP=E;exports.MODALS_FOOTER_JUSTIFY=M;exports.MODALS_HOST_CLASS=O;exports.MODALS_HOST_CLASSNAME=S;exports.MODALS_ID_COMPONENT=t;exports.MODALS_KIND_CONFIRM=s;exports.MODALS_KIND_MODAL=R;exports.MODALS_LOCK_BODY_OVERFLOW=Y;exports.MODALS_MISSING_PROVIDER_ERROR=f;exports.MODALS_NESTED_LOCK_BODY_SCROLL=T;exports.MODALS_NULL_LOADING_ID=m;exports.MODALS_OPEN_ID_COMPONENT=n;exports.MODALS_ROOT_CLASS=_;exports.MODALS_STACKED_LAYER_CAN_CLOSE=I;exports.MODALS_STACK_EMPTY=F;exports.MODALS_STACK_ITEM_CLASS=A;exports.MODALS_TOP_OFFSET=e;exports.MODALS_UNLOCK_BODY_OVERFLOW=u;exports.MODALS_Z_INDEX_STEP=r;
@@ -0,0 +1,39 @@
1
+ import { BearVariant } from '../../types';
2
+ import { FlexGap, FlexJustify } from '../Flex/Flex.types';
3
+ import { ModalSize } from '../Modal/Modal.types';
4
+ import { TypographyVariant } from '../Typography/Typography.types';
5
+ import { ModalsTranslations } from './ModalsProvider.types';
6
+ export declare const MODALS_ROOT_CLASS = "Bear-ModalsProvider";
7
+ export declare const MODALS_HOST_CLASS = "Bear-ModalsProvider__host";
8
+ export declare const MODALS_HOST_CLASSNAME = "Bear-ModalsProvider Bear-ModalsProvider__host";
9
+ export declare const MODALS_STACK_ITEM_CLASS = "Bear-ModalsProvider__item";
10
+ export declare const MODALS_CONFIRM_BODY_CLASS = "Bear-ModalsProvider__confirm-body";
11
+ export declare const MODALS_CONFIRM_FOOTER_CLASS = "Bear-ModalsProvider__confirm-footer";
12
+ export declare const MODALS_FOOTER_JUSTIFY: FlexJustify;
13
+ export declare const MODALS_FOOTER_GAP: FlexGap;
14
+ export declare const MODALS_DESCRIPTION_VARIANT: TypographyVariant;
15
+ export declare const MODALS_CANCEL_VARIANT: BearVariant;
16
+ export declare const MODALS_ALWAYS_OPEN = true;
17
+ export declare const MODALS_NESTED_LOCK_BODY_SCROLL = false;
18
+ export declare const MODALS_STACKED_LAYER_CAN_CLOSE = false;
19
+ export declare const MODALS_KIND_MODAL: "modal";
20
+ export declare const MODALS_KIND_CONFIRM: "confirm";
21
+ export declare const MODALS_ID_COMPONENT = "ModalsProvider";
22
+ export declare const MODALS_OPEN_ID_COMPONENT = "Modal";
23
+ export declare const MODALS_CONFIRM_ID_COMPONENT = "Modal";
24
+ export declare const MODALS_STACK_EMPTY = 0;
25
+ export declare const MODALS_TOP_OFFSET = 1;
26
+ export declare const MODALS_BASE_Z_INDEX = 11000;
27
+ export declare const MODALS_Z_INDEX_STEP = 10;
28
+ export declare const MODALS_DEFAULT_SIZE: ModalSize;
29
+ export declare const MODALS_DEFAULT_SHOW_CLOSE = true;
30
+ export declare const MODALS_DEFAULT_CLOSE_ON_BACKDROP = true;
31
+ export declare const MODALS_DEFAULT_CLOSE_ON_ESCAPE = true;
32
+ export declare const MODALS_DEFAULT_CONFIRM_VARIANT: BearVariant;
33
+ export declare const MODALS_CONFIRM_ACCEPTED = true;
34
+ export declare const MODALS_CONFIRM_REJECTED = false;
35
+ export declare const MODALS_LOCK_BODY_OVERFLOW = "hidden";
36
+ export declare const MODALS_UNLOCK_BODY_OVERFLOW = "";
37
+ export declare const MODALS_DEFAULT_TRANSLATIONS: ModalsTranslations;
38
+ export declare const MODALS_MISSING_PROVIDER_ERROR = "useModals must be used within a ModalsProvider";
39
+ export declare const MODALS_NULL_LOADING_ID: null;
@@ -0,0 +1,40 @@
1
+ const _ = "Bear-ModalsProvider", O = "Bear-ModalsProvider__host", A = `${_} ${O}`, S = "Bear-ModalsProvider__item", L = "Bear-ModalsProvider__confirm-body", o = "Bear-ModalsProvider__confirm-footer", D = "end", M = 3, s = "body2", n = "ghost", t = !0, E = !1, c = !1, C = "modal", N = "confirm", T = "ModalsProvider", e = "Modal", r = "Modal", I = 0, R = 1, d = 11e3, a = 10, F = "md", P = !0, l = !0, i = !0, B = "danger", f = !0, m = !1, u = "hidden", K = "", U = {
2
+ confirm: "Confirm",
3
+ cancel: "Cancel"
4
+ }, Y = "useModals must be used within a ModalsProvider", v = null;
5
+ export {
6
+ t as MODALS_ALWAYS_OPEN,
7
+ d as MODALS_BASE_Z_INDEX,
8
+ n as MODALS_CANCEL_VARIANT,
9
+ f as MODALS_CONFIRM_ACCEPTED,
10
+ L as MODALS_CONFIRM_BODY_CLASS,
11
+ o as MODALS_CONFIRM_FOOTER_CLASS,
12
+ r as MODALS_CONFIRM_ID_COMPONENT,
13
+ m as MODALS_CONFIRM_REJECTED,
14
+ l as MODALS_DEFAULT_CLOSE_ON_BACKDROP,
15
+ i as MODALS_DEFAULT_CLOSE_ON_ESCAPE,
16
+ B as MODALS_DEFAULT_CONFIRM_VARIANT,
17
+ P as MODALS_DEFAULT_SHOW_CLOSE,
18
+ F as MODALS_DEFAULT_SIZE,
19
+ U as MODALS_DEFAULT_TRANSLATIONS,
20
+ s as MODALS_DESCRIPTION_VARIANT,
21
+ M as MODALS_FOOTER_GAP,
22
+ D as MODALS_FOOTER_JUSTIFY,
23
+ O as MODALS_HOST_CLASS,
24
+ A as MODALS_HOST_CLASSNAME,
25
+ T as MODALS_ID_COMPONENT,
26
+ N as MODALS_KIND_CONFIRM,
27
+ C as MODALS_KIND_MODAL,
28
+ u as MODALS_LOCK_BODY_OVERFLOW,
29
+ Y as MODALS_MISSING_PROVIDER_ERROR,
30
+ E as MODALS_NESTED_LOCK_BODY_SCROLL,
31
+ v as MODALS_NULL_LOADING_ID,
32
+ e as MODALS_OPEN_ID_COMPONENT,
33
+ _ as MODALS_ROOT_CLASS,
34
+ c as MODALS_STACKED_LAYER_CAN_CLOSE,
35
+ I as MODALS_STACK_EMPTY,
36
+ S as MODALS_STACK_ITEM_CLASS,
37
+ R as MODALS_TOP_OFFSET,
38
+ K as MODALS_UNLOCK_BODY_OVERFLOW,
39
+ a as MODALS_Z_INDEX_STEP
40
+ };
@@ -0,0 +1,3 @@
1
+ import { FC } from 'react';
2
+ import { ModalsProviderProps } from './ModalsProvider.types';
3
+ export declare const ModalsProvider: FC<ModalsProviderProps>;
@@ -0,0 +1,97 @@
1
+ import { jsxs as j, jsx as H } from "react/jsx-runtime";
2
+ import { useState as S, useRef as O, useEffect as W } from "react";
3
+ import { generateBearId as A, resolveBearId as G } from "../../utils/generateBearId.utils.js";
4
+ import { useBearId as J } from "../../utils/useBearId.js";
5
+ import { ModalsHost as q } from "./components/ModalsHost/ModalsHost.js";
6
+ import { ModalsContext as z } from "./ModalsContext.js";
7
+ import { MODALS_ID_COMPONENT as Q, MODALS_NULL_LOADING_ID as _, MODALS_STACK_EMPTY as u, MODALS_UNLOCK_BODY_OVERFLOW as p, MODALS_LOCK_BODY_OVERFLOW as X, MODALS_DEFAULT_TRANSLATIONS as Z, MODALS_CONFIRM_REJECTED as N, MODALS_CONFIRM_ID_COMPONENT as $, MODALS_OPEN_ID_COMPONENT as tt, MODALS_CONFIRM_ACCEPTED as et } from "./ModalsProvider.const.js";
8
+ import { isConfirmEntry as M, resolveStackTargetId as ot, createConfirmEntry as nt, createModalEntry as rt, removeStackEntry as g } from "./ModalsProvider.utils.js";
9
+ const mt = (I) => {
10
+ const { children: v, translations: T, id: h, testId: R } = I, P = J(Q), F = G(h, P), [f, k] = S([]), [x, d] = S(_), n = O([]), c = O(/* @__PURE__ */ new Map()), a = O(null), w = { ...Z, ...T }, i = (t) => {
11
+ n.current = t, k(t);
12
+ }, C = () => {
13
+ if (n.current.length !== u)
14
+ return;
15
+ const t = document.activeElement;
16
+ a.current = t instanceof HTMLElement ? t : null;
17
+ }, m = () => {
18
+ var t;
19
+ (t = a.current) == null || t.focus(), a.current = null;
20
+ }, E = (t) => {
21
+ var r, s, l, D, L;
22
+ const e = n.current.find((Y) => Y.id === t);
23
+ if (!e)
24
+ return;
25
+ M(e) ? ((s = (r = e.options).onCancel) == null || s.call(r), (l = c.current.get(t)) == null || l(N)) : (L = (D = e.options).onClose) == null || L.call(D), c.current.delete(t);
26
+ const o = g(n.current, t);
27
+ i(o), o.length === u && m();
28
+ }, B = (t) => {
29
+ const e = n.current.find((r) => r.id === t);
30
+ if (!e || !M(e))
31
+ return;
32
+ const o = () => {
33
+ var s;
34
+ (s = c.current.get(t)) == null || s(et), c.current.delete(t);
35
+ const r = g(n.current, t);
36
+ i(r), r.length === u && m();
37
+ };
38
+ if (!e.options.onConfirm) {
39
+ o();
40
+ return;
41
+ }
42
+ d(t), Promise.resolve(e.options.onConfirm()).then(() => {
43
+ d(_), o();
44
+ }).catch(() => {
45
+ d(_);
46
+ });
47
+ }, b = (t) => {
48
+ C();
49
+ const e = t.id ?? A(tt);
50
+ return i([...n.current, rt(e, t)]), e;
51
+ }, y = (t) => new Promise((e) => {
52
+ C();
53
+ const o = t.id ?? A($);
54
+ c.current.set(o, e), i([...n.current, nt(o, t)]);
55
+ }), K = (t) => {
56
+ const e = ot(n.current, t);
57
+ e && E(e);
58
+ }, U = () => {
59
+ n.current.forEach((t) => {
60
+ var e, o, r, s, l;
61
+ M(t) ? ((o = (e = t.options).onCancel) == null || o.call(e), (r = c.current.get(t.id)) == null || r(N)) : (l = (s = t.options).onClose) == null || l.call(s), c.current.delete(t.id);
62
+ }), i([]), m();
63
+ };
64
+ W(() => {
65
+ if (f.length === u) {
66
+ document.body.style.overflow = p;
67
+ return;
68
+ }
69
+ return document.body.style.overflow = X, () => {
70
+ document.body.style.overflow = p;
71
+ };
72
+ }, [f.length]);
73
+ const V = {
74
+ open: b,
75
+ confirm: y,
76
+ close: K,
77
+ closeAll: U
78
+ };
79
+ return /* @__PURE__ */ j(z.Provider, { value: V, children: [
80
+ v,
81
+ /* @__PURE__ */ H(
82
+ q,
83
+ {
84
+ id: F,
85
+ testId: R,
86
+ stack: f,
87
+ loadingId: x,
88
+ labels: w,
89
+ onDismiss: E,
90
+ onConfirm: B
91
+ }
92
+ )
93
+ ] });
94
+ };
95
+ export {
96
+ mt as ModalsProvider
97
+ };
@@ -0,0 +1,75 @@
1
+ import { ReactNode } from 'react';
2
+ import { BearVariant } from '../../types';
3
+ import { ModalSize } from '../Modal/Modal.types';
4
+ export interface ModalsTranslations {
5
+ confirm: string;
6
+ cancel: string;
7
+ }
8
+ export interface OpenModalOptions {
9
+ id?: string;
10
+ title?: string;
11
+ children: ReactNode;
12
+ size?: ModalSize;
13
+ footer?: ReactNode;
14
+ showCloseButton?: boolean;
15
+ closeOnBackdrop?: boolean;
16
+ closeOnEscape?: boolean;
17
+ onClose?: () => void;
18
+ className?: string;
19
+ testId?: string;
20
+ }
21
+ export interface ConfirmModalOptions {
22
+ id?: string;
23
+ title: string;
24
+ description?: ReactNode;
25
+ confirmText?: string;
26
+ cancelText?: string;
27
+ confirmVariant?: BearVariant;
28
+ closeOnBackdrop?: boolean;
29
+ closeOnEscape?: boolean;
30
+ onConfirm?: () => void | Promise<void>;
31
+ onCancel?: () => void;
32
+ className?: string;
33
+ testId?: string;
34
+ }
35
+ export interface ModalsContextValue {
36
+ open: (options: OpenModalOptions) => string;
37
+ confirm: (options: ConfirmModalOptions) => Promise<boolean>;
38
+ close: (id?: string) => void;
39
+ closeAll: () => void;
40
+ }
41
+ export interface ModalsProviderProps {
42
+ children: ReactNode;
43
+ translations?: Partial<ModalsTranslations>;
44
+ id?: string;
45
+ testId?: string;
46
+ }
47
+ export interface ModalStackModalEntry {
48
+ kind: 'modal';
49
+ id: string;
50
+ options: OpenModalOptions;
51
+ }
52
+ export interface ModalStackConfirmEntry {
53
+ kind: 'confirm';
54
+ id: string;
55
+ options: ConfirmModalOptions;
56
+ }
57
+ export type ModalStackEntry = ModalStackModalEntry | ModalStackConfirmEntry;
58
+ export interface ModalsHostProps {
59
+ stack: ModalStackEntry[];
60
+ loadingId: string | null;
61
+ labels: ModalsTranslations;
62
+ onDismiss: (id: string) => void;
63
+ onConfirm: (id: string) => void;
64
+ id?: string;
65
+ testId?: string;
66
+ }
67
+ export interface StackedModalProps {
68
+ entry: ModalStackEntry;
69
+ index: number;
70
+ isTop: boolean;
71
+ loading: boolean;
72
+ labels: ModalsTranslations;
73
+ onDismiss: (id: string) => void;
74
+ onConfirm: (id: string) => void;
75
+ }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./ModalsProvider.const.cjs"),o=(e,t)=>({kind:r.MODALS_KIND_MODAL,id:e,options:t}),S=(e,t)=>({kind:r.MODALS_KIND_CONFIRM,id:e,options:t}),c=e=>e.kind===r.MODALS_KIND_CONFIRM,i=(e,t)=>{if(t)return t;if(e.length!==r.MODALS_STACK_EMPTY)return e[e.length-r.MODALS_TOP_OFFSET].id},d=(e,t)=>e.filter(n=>n.id!==t),_=e=>r.MODALS_BASE_Z_INDEX+e*r.MODALS_Z_INDEX_STEP,s=(e,t)=>e===t-r.MODALS_TOP_OFFSET;exports.createConfirmEntry=S;exports.createModalEntry=o;exports.isConfirmEntry=c;exports.isTopStackIndex=s;exports.removeStackEntry=d;exports.resolveStackTargetId=i;exports.resolveStackedZIndex=_;
@@ -0,0 +1,8 @@
1
+ import { ConfirmModalOptions, ModalStackConfirmEntry, ModalStackEntry, ModalStackModalEntry, OpenModalOptions } from './ModalsProvider.types';
2
+ export declare const createModalEntry: (id: string, options: OpenModalOptions) => ModalStackModalEntry;
3
+ export declare const createConfirmEntry: (id: string, options: ConfirmModalOptions) => ModalStackConfirmEntry;
4
+ export declare const isConfirmEntry: (entry: ModalStackEntry) => entry is ModalStackConfirmEntry;
5
+ export declare const resolveStackTargetId: (stack: ModalStackEntry[], id?: string) => string | undefined;
6
+ export declare const removeStackEntry: (stack: ModalStackEntry[], id: string) => ModalStackEntry[];
7
+ export declare const resolveStackedZIndex: (index: number) => number;
8
+ export declare const isTopStackIndex: (index: number, stackLength: number) => boolean;
@@ -0,0 +1,24 @@
1
+ import { MODALS_KIND_CONFIRM as r, MODALS_STACK_EMPTY as S, MODALS_TOP_OFFSET as e, MODALS_KIND_MODAL as _, MODALS_BASE_Z_INDEX as i, MODALS_Z_INDEX_STEP as c } from "./ModalsProvider.const.js";
2
+ const d = (t, n) => ({
3
+ kind: _,
4
+ id: t,
5
+ options: n
6
+ }), E = (t, n) => ({
7
+ kind: r,
8
+ id: t,
9
+ options: n
10
+ }), M = (t) => t.kind === r, O = (t, n) => {
11
+ if (n)
12
+ return n;
13
+ if (t.length !== S)
14
+ return t[t.length - e].id;
15
+ }, s = (t, n) => t.filter((o) => o.id !== n), A = (t) => i + t * c, I = (t, n) => t === n - e;
16
+ export {
17
+ E as createConfirmEntry,
18
+ d as createModalEntry,
19
+ M as isConfirmEntry,
20
+ I as isTopStackIndex,
21
+ s as removeStackEntry,
22
+ O as resolveStackTargetId,
23
+ A as resolveStackedZIndex
24
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),u=require("../../../Box/Box.cjs"),M=require("../../ModalsProvider.const.cjs"),S=require("../../ModalsProvider.utils.cjs"),m=require("../StackedModal/StackedModal.cjs"),g=i=>{const{stack:s,loadingId:d,labels:a,onDismiss:r,onConfirm:l,id:n,testId:c}=i;return t.jsx(u.Box,{className:M.MODALS_HOST_CLASSNAME,id:n,"data-testid":c,children:s.map((o,e)=>t.jsx(m.StackedModal,{entry:o,index:e,isTop:S.isTopStackIndex(e,s.length),loading:d===o.id,labels:a,onDismiss:r,onConfirm:l},o.id))})};exports.ModalsHost=g;
@@ -0,0 +1,2 @@
1
+ import { ModalsHostProps } from '../../ModalsProvider.types';
2
+ export declare const ModalsHost: (props: ModalsHostProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import { jsx as s } from "react/jsx-runtime";
2
+ import { Box as c } from "../../../Box/Box.js";
3
+ import { MODALS_HOST_CLASSNAME as e } from "../../ModalsProvider.const.js";
4
+ import { isTopStackIndex as f } from "../../ModalsProvider.utils.js";
5
+ import { StackedModal as S } from "../StackedModal/StackedModal.js";
6
+ const I = (m) => {
7
+ const { stack: t, loadingId: a, labels: d, onDismiss: r, onConfirm: l, id: p, testId: n } = m;
8
+ return /* @__PURE__ */ s(c, { className: e, id: p, "data-testid": n, children: t.map((o, i) => /* @__PURE__ */ s(
9
+ S,
10
+ {
11
+ entry: o,
12
+ index: i,
13
+ isTop: f(i, t.length),
14
+ loading: a === o.id,
15
+ labels: d,
16
+ onDismiss: r,
17
+ onConfirm: l
18
+ },
19
+ o.id
20
+ )) });
21
+ };
22
+ export {
23
+ I as ModalsHost
24
+ };
@@ -0,0 +1 @@
1
+ export { ModalsHost } from './ModalsHost';
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),C=require("../../../Box/Box.cjs"),S=require("../../../Button/Button.cjs"),p=require("../../../Flex/Flex.cjs"),a=require("../../../Modal/Modal.cjs"),M=require("../../../Typography/Typography.cjs"),e=require("../../ModalsProvider.const.cjs"),t=require("../../ModalsProvider.utils.cjs"),T=A=>{const{entry:o,index:i,isTop:c,loading:r,labels:l,onDismiss:n,onConfirm:d}=A,_=c?o.options.closeOnBackdrop??e.MODALS_DEFAULT_CLOSE_ON_BACKDROP:e.MODALS_STACKED_LAYER_CAN_CLOSE,O=c?o.options.closeOnEscape??e.MODALS_DEFAULT_CLOSE_ON_ESCAPE:e.MODALS_STACKED_LAYER_CAN_CLOSE;if(t.isConfirmEntry(o)){const L=o.options.confirmText??l.confirm,D=o.options.cancelText??l.cancel,E=o.options.confirmVariant??e.MODALS_DEFAULT_CONFIRM_VARIANT;return s.jsx(a.Modal,{isOpen:e.MODALS_ALWAYS_OPEN,id:o.id,testId:o.options.testId,title:o.options.title,size:e.MODALS_DEFAULT_SIZE,className:o.options.className,showCloseButton:e.MODALS_DEFAULT_SHOW_CLOSE,closeOnBackdrop:_,closeOnEscape:O,lockBodyScroll:e.MODALS_NESTED_LOCK_BODY_SCROLL,zIndex:t.resolveStackedZIndex(i),onClose:()=>n(o.id),footer:s.jsxs(p.Flex,{className:e.MODALS_CONFIRM_FOOTER_CLASS,justify:e.MODALS_FOOTER_JUSTIFY,gap:e.MODALS_FOOTER_GAP,children:[s.jsx(S.Button,{variant:e.MODALS_CANCEL_VARIANT,onClick:()=>n(o.id),disabled:r,children:D}),s.jsx(S.Button,{variant:E,onClick:()=>d(o.id),loading:r,children:L})]}),children:o.options.description?s.jsx(M.Typography,{variant:e.MODALS_DESCRIPTION_VARIANT,className:e.MODALS_CONFIRM_BODY_CLASS,children:o.options.description}):null})}return s.jsx(a.Modal,{isOpen:e.MODALS_ALWAYS_OPEN,id:o.id,testId:o.options.testId,title:o.options.title,size:o.options.size??e.MODALS_DEFAULT_SIZE,footer:o.options.footer,className:o.options.className,showCloseButton:o.options.showCloseButton??e.MODALS_DEFAULT_SHOW_CLOSE,closeOnBackdrop:_,closeOnEscape:O,lockBodyScroll:e.MODALS_NESTED_LOCK_BODY_SCROLL,zIndex:t.resolveStackedZIndex(i),onClose:()=>n(o.id),children:s.jsx(C.Box,{className:e.MODALS_STACK_ITEM_CLASS,children:o.options.children})})};exports.StackedModal=T;
@@ -0,0 +1,2 @@
1
+ import { StackedModalProps } from '../../ModalsProvider.types';
2
+ export declare const StackedModal: (props: StackedModalProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,66 @@
1
+ import { jsx as i, jsxs as T } from "react/jsx-runtime";
2
+ import { Box as f } from "../../../Box/Box.js";
3
+ import { Button as O } from "../../../Button/Button.js";
4
+ import { Flex as N } from "../../../Flex/Flex.js";
5
+ import { Modal as _ } from "../../../Modal/Modal.js";
6
+ import { Typography as I } from "../../../Typography/Typography.js";
7
+ import { MODALS_DEFAULT_CLOSE_ON_BACKDROP as F, MODALS_STACKED_LAYER_CAN_CLOSE as a, MODALS_DEFAULT_CLOSE_ON_ESCAPE as R, MODALS_DEFAULT_CONFIRM_VARIANT as h, MODALS_NESTED_LOCK_BODY_SCROLL as A, MODALS_DEFAULT_SHOW_CLOSE as S, MODALS_DEFAULT_SIZE as p, MODALS_ALWAYS_OPEN as d, MODALS_CONFIRM_BODY_CLASS as B, MODALS_DESCRIPTION_VARIANT as x, MODALS_FOOTER_GAP as k, MODALS_FOOTER_JUSTIFY as u, MODALS_CONFIRM_FOOTER_CLASS as y, MODALS_CANCEL_VARIANT as U, MODALS_STACK_ITEM_CLASS as z } from "../../ModalsProvider.const.js";
8
+ import { isConfirmEntry as P, resolveStackedZIndex as L } from "../../ModalsProvider.utils.js";
9
+ const W = (m) => {
10
+ const { entry: o, index: n, isTop: s, loading: e, labels: r, onDismiss: t, onConfirm: C } = m, c = s ? o.options.closeOnBackdrop ?? F : a, l = s ? o.options.closeOnEscape ?? R : a;
11
+ if (P(o)) {
12
+ const D = o.options.confirmText ?? r.confirm, E = o.options.cancelText ?? r.cancel, M = o.options.confirmVariant ?? h;
13
+ return /* @__PURE__ */ i(
14
+ _,
15
+ {
16
+ isOpen: d,
17
+ id: o.id,
18
+ testId: o.options.testId,
19
+ title: o.options.title,
20
+ size: p,
21
+ className: o.options.className,
22
+ showCloseButton: S,
23
+ closeOnBackdrop: c,
24
+ closeOnEscape: l,
25
+ lockBodyScroll: A,
26
+ zIndex: L(n),
27
+ onClose: () => t(o.id),
28
+ footer: /* @__PURE__ */ T(N, { className: y, justify: u, gap: k, children: [
29
+ /* @__PURE__ */ i(O, { variant: U, onClick: () => t(o.id), disabled: e, children: E }),
30
+ /* @__PURE__ */ i(
31
+ O,
32
+ {
33
+ variant: M,
34
+ onClick: () => C(o.id),
35
+ loading: e,
36
+ children: D
37
+ }
38
+ )
39
+ ] }),
40
+ children: o.options.description ? /* @__PURE__ */ i(I, { variant: x, className: B, children: o.options.description }) : null
41
+ }
42
+ );
43
+ }
44
+ return /* @__PURE__ */ i(
45
+ _,
46
+ {
47
+ isOpen: d,
48
+ id: o.id,
49
+ testId: o.options.testId,
50
+ title: o.options.title,
51
+ size: o.options.size ?? p,
52
+ footer: o.options.footer,
53
+ className: o.options.className,
54
+ showCloseButton: o.options.showCloseButton ?? S,
55
+ closeOnBackdrop: c,
56
+ closeOnEscape: l,
57
+ lockBodyScroll: A,
58
+ zIndex: L(n),
59
+ onClose: () => t(o.id),
60
+ children: /* @__PURE__ */ i(f, { className: z, children: o.options.children })
61
+ }
62
+ );
63
+ };
64
+ export {
65
+ W as StackedModal
66
+ };
@@ -0,0 +1 @@
1
+ export { StackedModal } from './StackedModal';
@@ -0,0 +1,2 @@
1
+ export { ModalsHost } from './ModalsHost';
2
+ export { StackedModal } from './StackedModal';
@@ -0,0 +1 @@
1
+ export { useModals } from './useModals';
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),o=require("../ModalsContext.cjs"),r=require("../ModalsProvider.const.cjs"),s=()=>{const e=t.useContext(o.ModalsContext);if(!e)throw new Error(r.MODALS_MISSING_PROVIDER_ERROR);return e};exports.useModals=s;
@@ -0,0 +1,2 @@
1
+ import { ModalsContextValue } from '../ModalsProvider.types';
2
+ export declare const useModals: () => ModalsContextValue;
@@ -0,0 +1,12 @@
1
+ import { useContext as t } from "react";
2
+ import { ModalsContext as r } from "../ModalsContext.js";
3
+ import { MODALS_MISSING_PROVIDER_ERROR as e } from "../ModalsProvider.const.js";
4
+ const R = () => {
5
+ const o = t(r);
6
+ if (!o)
7
+ throw new Error(e);
8
+ return o;
9
+ };
10
+ export {
11
+ R as useModals
12
+ };
@@ -0,0 +1,3 @@
1
+ export { ModalsProvider } from './ModalsProvider';
2
+ export { useModals } from './hooks';
3
+ export type { ConfirmModalOptions, ModalsContextValue, ModalsProviderProps, ModalsTranslations, OpenModalOptions, } from './ModalsProvider.types';