@fullkekw/popup 2.0.9 → 2.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Interfaces.d.ts +14 -15
- package/dist/Package.d.ts +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.es.js +104 -98
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/useMixedState.d.ts +4 -0
- package/package.json +1 -1
package/dist/Interfaces.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { default as React, ReactNode } from 'react';
|
|
2
|
+
export type StateSetter<S = any> = React.Dispatch<React.SetStateAction<S>>;
|
|
2
3
|
export type PopupWindowAnimationType = 'fade' | 'scale' | null;
|
|
3
|
-
export interface
|
|
4
|
+
export interface IPopupSettings {
|
|
4
5
|
/** Prevent state change due to user interactions (only synthetic) */
|
|
5
6
|
preventStateChange?: boolean;
|
|
6
7
|
/**
|
|
@@ -22,35 +23,33 @@ export interface PopupSettings {
|
|
|
22
23
|
*/
|
|
23
24
|
disableScroll?: boolean;
|
|
24
25
|
}
|
|
25
|
-
export interface
|
|
26
|
+
export interface IPopupNode {
|
|
26
27
|
id: string;
|
|
27
28
|
open: boolean;
|
|
28
29
|
zIndex: number;
|
|
29
|
-
settings:
|
|
30
|
+
settings: IPopupSettings;
|
|
30
31
|
}
|
|
31
|
-
export interface
|
|
32
|
-
nodes:
|
|
33
|
-
toggleNode(node: string |
|
|
34
|
-
registerNode(node:
|
|
32
|
+
export interface IPopupContextProps {
|
|
33
|
+
nodes: IPopupNode[];
|
|
34
|
+
toggleNode(node: string | IPopupNode, state?: boolean): void;
|
|
35
|
+
registerNode(node: IPopupNode): void;
|
|
35
36
|
toggleDocument(id: string, e: React.MouseEvent): void;
|
|
36
37
|
}
|
|
37
|
-
export interface
|
|
38
|
+
export interface IPopupLayerProps extends React.HTMLAttributes<HTMLElement> {
|
|
38
39
|
children: ReactNode | ReactNode[];
|
|
39
|
-
settings?:
|
|
40
|
+
settings?: IPopupSettings;
|
|
40
41
|
}
|
|
41
|
-
export interface
|
|
42
|
+
export interface IPopupWindowProps extends React.HTMLAttributes<HTMLElement> {
|
|
42
43
|
id: string;
|
|
43
44
|
children?: ReactNode | ReactNode[];
|
|
44
45
|
layerClassName?: string;
|
|
45
|
-
settings?:
|
|
46
|
+
settings?: IPopupSettings;
|
|
46
47
|
onOpen?(): void;
|
|
47
48
|
onExit?(): void;
|
|
48
|
-
/** Render popup in DOM only when user requested it */
|
|
49
|
-
renderOnDemand?: boolean;
|
|
50
49
|
/** Passed useState value */
|
|
51
50
|
isOpen?: boolean;
|
|
52
51
|
/** Passed useState setter */
|
|
53
|
-
setIsOpen
|
|
52
|
+
setIsOpen?: StateSetter<boolean>;
|
|
54
53
|
/**
|
|
55
54
|
* Popup animation
|
|
56
55
|
*
|
|
@@ -58,7 +57,7 @@ export interface PopupWindowProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
58
57
|
*/
|
|
59
58
|
animation?: PopupWindowAnimationType;
|
|
60
59
|
}
|
|
61
|
-
export interface
|
|
60
|
+
export interface IPopupButtonProps extends React.HTMLAttributes<HTMLElement> {
|
|
62
61
|
popupId: string;
|
|
63
62
|
children?: ReactNode | ReactNode[];
|
|
64
63
|
onClick?(e: React.MouseEvent): void;
|
package/dist/Package.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { IPopupButtonProps, IPopupLayerProps, IPopupWindowProps } from './Interfaces';
|
|
3
3
|
/**
|
|
4
4
|
* Popup context provider. Must be inside body tag and in client environment (NextJS)
|
|
5
5
|
*/
|
|
6
|
-
export declare const PopupLayer: FC<
|
|
6
|
+
export declare const PopupLayer: FC<IPopupLayerProps>;
|
|
7
7
|
/**
|
|
8
8
|
* Popup window
|
|
9
9
|
*/
|
|
10
|
-
export declare const PopupWindow: FC<
|
|
10
|
+
export declare const PopupWindow: FC<IPopupWindowProps>;
|
|
11
11
|
/**
|
|
12
12
|
* Popup trigger button
|
|
13
13
|
*/
|
|
14
|
-
export declare const PopupButton: FC<
|
|
14
|
+
export declare const PopupButton: FC<IPopupButtonProps>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * from './Package';
|
|
2
2
|
export * as default from './Package';
|
|
3
|
-
export type { PopupSettings, PopupWindowAnimationType, PopupLayerProps, PopupButtonProps, PopupWindowProps } from './Interfaces';
|
|
3
|
+
export type { IPopupSettings as PopupSettings, PopupWindowAnimationType, IPopupLayerProps as PopupLayerProps, IPopupButtonProps as PopupButtonProps, IPopupWindowProps as PopupWindowProps } from './Interfaces';
|
package/dist/index.es.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { createPortal as
|
|
4
|
-
function
|
|
5
|
-
return
|
|
1
|
+
import { jsx as k, jsxs as _ } from "react/jsx-runtime";
|
|
2
|
+
import { useState as x, createContext as L, useEffect as S, Suspense as M, useContext as P, useMemo as T } from "react";
|
|
3
|
+
import { createPortal as A } from "react-dom";
|
|
4
|
+
function q(o) {
|
|
5
|
+
return o && o.__esModule && Object.prototype.hasOwnProperty.call(o, "default") ? o.default : o;
|
|
6
6
|
}
|
|
7
7
|
var b = { exports: {} };
|
|
8
8
|
/*!
|
|
@@ -10,15 +10,15 @@ var b = { exports: {} };
|
|
|
10
10
|
Licensed under the MIT License (MIT), see
|
|
11
11
|
http://jedwatson.github.io/classnames
|
|
12
12
|
*/
|
|
13
|
-
var
|
|
14
|
-
function
|
|
15
|
-
return
|
|
13
|
+
var C;
|
|
14
|
+
function F() {
|
|
15
|
+
return C || (C = 1, function(o) {
|
|
16
16
|
(function() {
|
|
17
|
-
var
|
|
18
|
-
function
|
|
19
|
-
for (var e = "",
|
|
20
|
-
var
|
|
21
|
-
|
|
17
|
+
var d = {}.hasOwnProperty;
|
|
18
|
+
function p() {
|
|
19
|
+
for (var e = "", n = 0; n < arguments.length; n++) {
|
|
20
|
+
var u = arguments[n];
|
|
21
|
+
u && (e = r(e, c(u)));
|
|
22
22
|
}
|
|
23
23
|
return e;
|
|
24
24
|
}
|
|
@@ -28,133 +28,139 @@ function K() {
|
|
|
28
28
|
if (typeof e != "object")
|
|
29
29
|
return "";
|
|
30
30
|
if (Array.isArray(e))
|
|
31
|
-
return
|
|
31
|
+
return p.apply(null, e);
|
|
32
32
|
if (e.toString !== Object.prototype.toString && !e.toString.toString().includes("[native code]"))
|
|
33
33
|
return e.toString();
|
|
34
|
-
var
|
|
35
|
-
for (var
|
|
36
|
-
|
|
37
|
-
return
|
|
34
|
+
var n = "";
|
|
35
|
+
for (var u in e)
|
|
36
|
+
d.call(e, u) && e[u] && (n = r(n, u));
|
|
37
|
+
return n;
|
|
38
38
|
}
|
|
39
|
-
function r(e,
|
|
40
|
-
return
|
|
39
|
+
function r(e, n) {
|
|
40
|
+
return n ? e ? e + " " + n : e + n : e;
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
o.exports ? (p.default = p, o.exports = p) : window.classNames = p;
|
|
43
43
|
})();
|
|
44
44
|
}(b)), b.exports;
|
|
45
45
|
}
|
|
46
|
-
var
|
|
47
|
-
const
|
|
46
|
+
var Z = F();
|
|
47
|
+
const O = /* @__PURE__ */ q(Z);
|
|
48
|
+
function B(o, d) {
|
|
49
|
+
const p = arguments.length === 2 && d !== void 0, [c, r] = x(o);
|
|
50
|
+
return p ? [
|
|
51
|
+
o,
|
|
52
|
+
d
|
|
53
|
+
] : [c, r];
|
|
54
|
+
}
|
|
55
|
+
const N = {
|
|
48
56
|
disableScroll: !0,
|
|
49
57
|
exitOnDocument: !0,
|
|
50
58
|
exitOnEscape: !0,
|
|
51
59
|
preventStateChange: !1
|
|
52
|
-
}, h =
|
|
53
|
-
const [r] =
|
|
60
|
+
}, h = L({}), G = ({ className: o, settings: d, children: p, ...c }) => {
|
|
61
|
+
const [r] = x(z(d ?? {}, N)), [e, n] = x([]), u = {
|
|
54
62
|
nodes: e,
|
|
55
|
-
toggleNode:
|
|
56
|
-
registerNode:
|
|
57
|
-
toggleDocument:
|
|
63
|
+
toggleNode: m,
|
|
64
|
+
registerNode: w,
|
|
65
|
+
toggleDocument: y
|
|
58
66
|
};
|
|
59
|
-
|
|
67
|
+
S(() => {
|
|
60
68
|
if (typeof window > "u") return;
|
|
61
|
-
window.addEventListener("keydown",
|
|
62
|
-
function
|
|
63
|
-
if (
|
|
64
|
-
const
|
|
65
|
-
if (!
|
|
66
|
-
|
|
69
|
+
window.addEventListener("keydown", a);
|
|
70
|
+
function a(s) {
|
|
71
|
+
if (s.key === "Escape") {
|
|
72
|
+
const f = Math.max(...e.filter((l) => l.open).map((l) => l.zIndex)), i = e.find((l) => l.open && l.zIndex === f);
|
|
73
|
+
if (!i || !i.settings.exitOnEscape || !(r != null && r.exitOnEscape)) return;
|
|
74
|
+
m(i.id);
|
|
67
75
|
}
|
|
68
76
|
}
|
|
69
77
|
return () => {
|
|
70
|
-
window.removeEventListener("keydown",
|
|
78
|
+
window.removeEventListener("keydown", a);
|
|
71
79
|
};
|
|
72
80
|
}, [e]);
|
|
73
|
-
function
|
|
74
|
-
let
|
|
75
|
-
if (typeof
|
|
76
|
-
if ((r.preventStateChange ||
|
|
77
|
-
const
|
|
78
|
-
|
|
81
|
+
function m(a, s) {
|
|
82
|
+
let t;
|
|
83
|
+
if (typeof a == "string" ? t = { ...e.find((i) => i.id === a) } : t = { ...a }, !t.id) return;
|
|
84
|
+
if ((r.preventStateChange || t.settings.preventStateChange) && s === void 0) return console.warn("Popup action prevented");
|
|
85
|
+
const f = s ?? !(t != null && t.open);
|
|
86
|
+
t.open = f, t.zIndex = f ? Math.max(...e.map((i) => i.zIndex), 0) + 1 : 0, n((i) => [...i.filter((l) => l.id !== t.id), t]), r.disableScroll && t.settings.disableScroll && f && document.body.classList.add("fkw-popup--noScroll"), !f && !e.filter((i) => i.id !== t.id).some((i) => i.open) && document.body.classList.remove("fkw-popup--noScroll");
|
|
79
87
|
}
|
|
80
|
-
function
|
|
81
|
-
|
|
88
|
+
function w(a) {
|
|
89
|
+
n((s) => [...s, a]), a.open && m(a, !0);
|
|
82
90
|
}
|
|
83
|
-
function
|
|
84
|
-
const
|
|
85
|
-
!
|
|
91
|
+
function y(a, s) {
|
|
92
|
+
const t = { ...e.find((i) => i.id === a) };
|
|
93
|
+
!t.id || !t.settings.exitOnDocument || s.target.closest(".fkw-popup") || !t.settings.exitOnDocument || !r.exitOnDocument || m(t.id);
|
|
86
94
|
}
|
|
87
|
-
return /* @__PURE__ */
|
|
88
|
-
|
|
89
|
-
/* @__PURE__ */ k("section", { className:
|
|
90
|
-
] });
|
|
91
|
-
},
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
return /* @__PURE__ */ k(M, { children: /* @__PURE__ */ _(h.Provider, { value: u, children: [
|
|
96
|
+
p,
|
|
97
|
+
/* @__PURE__ */ k("section", { className: O("fkw-popup-container", o), id: "fkw-popup-container", ...c })
|
|
98
|
+
] }) });
|
|
99
|
+
}, K = ({ children: o, className: d, layerClassName: p, style: c, id: r, settings: e, isOpen: n, setIsOpen: u, animation: m, onExit: w, onOpen: y, ...a }) => {
|
|
100
|
+
const s = P(h);
|
|
101
|
+
n = T(() => n ?? !1, []);
|
|
102
|
+
const [t] = x(m ?? "scale"), [f] = x(z(e ?? {}, N)), [i, l] = x(null), [v, D] = B(n, u), [E, I] = x(0);
|
|
103
|
+
return S(() => {
|
|
104
|
+
l(document.querySelector("#fkw-popup-container")), s.registerNode({
|
|
97
105
|
id: r,
|
|
98
|
-
open:
|
|
106
|
+
open: n,
|
|
99
107
|
zIndex: 0,
|
|
100
|
-
settings:
|
|
108
|
+
settings: f
|
|
101
109
|
});
|
|
102
|
-
}, []),
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
110
|
+
}, []), S(() => {
|
|
111
|
+
v && y && y(), !v && w && w();
|
|
112
|
+
}, [v]), S(() => {
|
|
113
|
+
const g = s.nodes.find((j) => j.id === r);
|
|
114
|
+
g && (D(g.open), g.zIndex !== 0 ? I(g.zIndex) : setTimeout(() => {
|
|
115
|
+
I(g.zIndex);
|
|
106
116
|
}, 200));
|
|
107
|
-
}, [
|
|
108
|
-
a === void 0 || t === f || a(f);
|
|
109
|
-
}, [f]), O(() => {
|
|
110
|
-
t === void 0 || t === f || n.toggleNode(r, t);
|
|
111
|
-
}, [t]), !l || !C ? null : B(/* @__PURE__ */ k(F, { children: /* @__PURE__ */ k(
|
|
117
|
+
}, [s]), i ? A(/* @__PURE__ */ k(
|
|
112
118
|
"section",
|
|
113
119
|
{
|
|
114
120
|
id: r,
|
|
115
|
-
className:
|
|
116
|
-
style: { zIndex: 1e4 +
|
|
117
|
-
onClick:
|
|
121
|
+
className: O("fkw-popup-layer", v && "fkw-popup-layer--open", p),
|
|
122
|
+
style: { zIndex: 1e4 + E, cursor: f.exitOnDocument && !f.preventStateChange ? "pointer" : "auto", ...c },
|
|
123
|
+
onClick: f.exitOnDocument && !f.preventStateChange ? (g) => s.toggleDocument(r, g) : void 0,
|
|
118
124
|
children: /* @__PURE__ */ k(
|
|
119
125
|
"article",
|
|
120
126
|
{
|
|
121
|
-
className:
|
|
127
|
+
className: O("fkw-popup", v && "fkw-popup--open", t && `fkw-popup-animation--${t}`, d),
|
|
122
128
|
role: "dialog",
|
|
123
129
|
"aria-modal": !0,
|
|
124
|
-
"aria-hidden": !
|
|
125
|
-
...
|
|
126
|
-
children:
|
|
130
|
+
"aria-hidden": !v,
|
|
131
|
+
...a,
|
|
132
|
+
children: o
|
|
127
133
|
}
|
|
128
134
|
)
|
|
129
135
|
}
|
|
130
|
-
)
|
|
131
|
-
},
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
}, [
|
|
137
|
-
function
|
|
138
|
-
|
|
136
|
+
), i) : null;
|
|
137
|
+
}, R = ({ children: o, as: d, className: p, onClick: c, disabled: r, popupId: e, ...n }) => {
|
|
138
|
+
const u = P(h), [m, w] = x(!1), y = d ?? "button";
|
|
139
|
+
S(() => {
|
|
140
|
+
const s = u.nodes.find((t) => t.id === e);
|
|
141
|
+
s && w(s.open);
|
|
142
|
+
}, [u]);
|
|
143
|
+
function a(s) {
|
|
144
|
+
u.toggleNode(e), c && c(s);
|
|
139
145
|
}
|
|
140
|
-
return /* @__PURE__ */ k(
|
|
146
|
+
return /* @__PURE__ */ k(y, { className: O("fkw-popup-button", m && "fkw-popup-button--active", p), role: "button", onClick: a, "aria-haspopup": "dialog", tabIndex: 0, disabled: r, "aria-disabled": r, "data-fkw-popup-operator": e, "aria-label": m ? "Close Popup" : "Open Popup", ...n, children: o });
|
|
141
147
|
};
|
|
142
|
-
function
|
|
143
|
-
const
|
|
144
|
-
for (const c in
|
|
145
|
-
|
|
146
|
-
return
|
|
148
|
+
function z(o, d) {
|
|
149
|
+
const p = { ...d };
|
|
150
|
+
for (const c in o)
|
|
151
|
+
p[c] = o[c];
|
|
152
|
+
return p;
|
|
147
153
|
}
|
|
148
|
-
const
|
|
154
|
+
const H = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
149
155
|
__proto__: null,
|
|
150
|
-
PopupButton:
|
|
151
|
-
PopupLayer:
|
|
152
|
-
PopupWindow:
|
|
156
|
+
PopupButton: R,
|
|
157
|
+
PopupLayer: G,
|
|
158
|
+
PopupWindow: K
|
|
153
159
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
154
160
|
export {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
161
|
+
R as PopupButton,
|
|
162
|
+
G as PopupLayer,
|
|
163
|
+
K as PopupWindow,
|
|
164
|
+
H as default
|
|
159
165
|
};
|
|
160
166
|
//# sourceMappingURL=index.es.js.map
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../node_modules/classnames/index.js","../src/_package/Package.tsx"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import './styles.scss';\r\n\r\nimport React, { createContext, FC, JSX, useContext, useEffect, useMemo, useState } from \"react\";\r\nimport cn from 'classnames';\r\nimport { PopupButtonProps, PopupContextProps, PopupLayerProps, PopupNode, PopupSettings, PopupWindowAnimationType, PopupWindowProps } from './Interfaces';\r\nimport { createPortal } from 'react-dom';\r\n\r\n\r\n\r\nconst DEFAULT_SETTINGS: Required<PopupSettings> = {\r\n disableScroll: true,\r\n exitOnDocument: true,\r\n exitOnEscape: true,\r\n preventStateChange: false\r\n};\r\n\r\n// @ts-expect-error Need empty object\r\nconst PopupContext = createContext<PopupContextProps>({});\r\n\r\n\r\n\r\n/** \r\n * Popup context provider. Must be inside body tag and in client environment (NextJS)\r\n */\r\nexport const PopupLayer: FC<PopupLayerProps> = ({ className, settings: initialSettings, children, ...props }) => {\r\n const [settings] = useState<PopupSettings>(reassingObject(initialSettings ?? {}, DEFAULT_SETTINGS));\r\n const [nodes, setNodes] = useState<PopupNode[]>([]);\r\n\r\n const context: PopupContextProps = {\r\n nodes,\r\n toggleNode,\r\n registerNode,\r\n toggleDocument\r\n };\r\n\r\n\r\n\r\n // Handle exitOnEscape\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n\r\n window.addEventListener('keydown', handleKeydown);\r\n\r\n function handleKeydown(e: KeyboardEvent) {\r\n const key = e.key;\r\n\r\n if (key === 'Escape') {\r\n const maxZIndex = Math.max(...nodes.filter(el => el.open).map(el => el.zIndex));\r\n const node = nodes.find(el => el.open && el.zIndex === maxZIndex);\r\n if (!node || !node.settings.exitOnEscape || !settings?.exitOnEscape) return;\r\n\r\n toggleNode(node.id);\r\n }\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleKeydown);\r\n };\r\n }, [nodes]);\r\n\r\n\r\n /** \r\n * @param state Forced state\r\n */\r\n function toggleNode(nod: string | PopupNode, force?: boolean) {\r\n let node: PopupNode;\r\n\r\n if (typeof nod === 'string') {\r\n node = { ...nodes.find(el => el.id === nod) } as PopupNode;\r\n } else {\r\n node = { ...nod };\r\n }\r\n\r\n if (!node.id) return;\r\n if ((settings.preventStateChange || node.settings.preventStateChange) && force === undefined) return console.warn(`Popup action prevented`);\r\n\r\n const open = force ?? !node?.open;\r\n\r\n node.open = open;\r\n node.zIndex = open ? Math.max(...nodes.map(el => el.zIndex), 0) + 1 : 0;\r\n\r\n setNodes(prev => [...prev.filter(el => el.id !== node.id), node]);\r\n\r\n // Hide scroll on open\r\n if (settings.disableScroll && node.settings.disableScroll && open) {\r\n document.body.classList.add('fkw-popup--noScroll');\r\n }\r\n\r\n // Show scroll if no popup open\r\n if (!open && !nodes.filter(el => el.id !== node.id).some(el => el.open)) {\r\n document.body.classList.remove('fkw-popup--noScroll');\r\n }\r\n }\r\n\r\n /** Register new node */\r\n function registerNode(node: PopupNode) {\r\n setNodes(prev => [...prev, node]);\r\n\r\n if (node.open) toggleNode(node, true);\r\n }\r\n\r\n function toggleDocument(id: string, e: React.MouseEvent) {\r\n const node: PopupNode = { ...nodes.find(el => el.id === id) } as PopupNode;\r\n if (!node.id) return;\r\n if (!node.settings.exitOnDocument) return;\r\n\r\n const popup = (e.target as HTMLElement).closest('.fkw-popup');\r\n if (popup || !node.settings.exitOnDocument || !settings.exitOnDocument) return;\r\n\r\n toggleNode(node.id);\r\n }\r\n\r\n\r\n\r\n return <PopupContext.Provider value={context}>\r\n {children}\r\n\r\n <section className={cn(`fkw-popup-container`, className)} id='fkw-popup-container' {...props}></section>\r\n </PopupContext.Provider>;\r\n};\r\n\r\n\r\n\r\n/** \r\n * Popup window\r\n */\r\nexport const PopupWindow: FC<PopupWindowProps> = ({ children, className, layerClassName, style, id, settings: initialSettings, isOpen: state, setIsOpen: stateSetter, animation: initialAnimation, renderOnDemand, onExit, onOpen, ...props }) => {\r\n const ctx = useContext(PopupContext) as PopupContextProps;\r\n\r\n const [animation] = useState<PopupWindowAnimationType>(initialAnimation ?? 'scale');\r\n const [settings] = useState<PopupSettings>(reassingObject(initialSettings ?? {}, DEFAULT_SETTINGS));\r\n const [isMounted, setIsMounted] = useState<boolean>(false);\r\n const [isRendered, setIsRendered] = useState<boolean>(false);\r\n const [container, setContainer] = useState<Element | null>(null);\r\n\r\n const [isOpen, setIsOpen] = useState<boolean>(false);\r\n const [zIndex, setZIndex] = useState<number>(0);\r\n\r\n\r\n\r\n // Handle isRendered & onOpen, onExit\r\n useMemo(() => {\r\n if (renderOnDemand) {\r\n if (isOpen) setIsRendered(true); // Render content only if window is open\r\n } else setIsRendered(true);\r\n\r\n if (isOpen && onOpen) onOpen();\r\n if (!isOpen && onExit) onExit();\r\n }, [isOpen]);\r\n\r\n // Mount\r\n useEffect(() => {\r\n setContainer(document.querySelector('#fkw-popup-container'));\r\n setIsMounted(true);\r\n\r\n ctx.registerNode({\r\n id,\r\n open: false,\r\n zIndex: 0,\r\n settings\r\n });\r\n }, []);\r\n\r\n // Listen context\r\n useEffect(() => {\r\n const node = ctx.nodes.find(el => el.id === id);\r\n if (!node) return;\r\n\r\n setIsOpen(node.open);\r\n\r\n if (node.zIndex !== 0) {\r\n // Instantly update zIndex\r\n setZIndex(node.zIndex);\r\n } else {\r\n // Timeout zIndex update\r\n setTimeout(() => {\r\n setZIndex(node.zIndex);\r\n }, 200);\r\n }\r\n }, [ctx]);\r\n\r\n // Sync out state on current change\r\n useEffect(() => {\r\n if (stateSetter === undefined || state === isOpen) return;\r\n\r\n stateSetter(isOpen);\r\n }, [isOpen]);\r\n\r\n // Sync current state on out change\r\n useEffect(() => {\r\n if (state === undefined || state === isOpen) return;\r\n\r\n ctx.toggleNode(id, state);\r\n }, [state]);\r\n\r\n\r\n\r\n if (!isMounted || !container) return null;\r\n\r\n return createPortal(<>\r\n <section\r\n id={id}\r\n className={cn(`fkw-popup-layer`, isOpen && 'fkw-popup-layer--open', layerClassName)}\r\n style={{ zIndex: 10000 + zIndex, cursor: settings.exitOnDocument && !settings.preventStateChange ? 'pointer' : 'auto', ...style }}\r\n onClick={settings.exitOnDocument && !settings.preventStateChange ? e => ctx.toggleDocument(id, e) : undefined}\r\n >\r\n <article\r\n className={cn(`fkw-popup`, isOpen && 'fkw-popup--open', animation && `fkw-popup-animation--${animation}`, className)}\r\n role='dialog'\r\n aria-modal\r\n aria-hidden={!isOpen}\r\n {...props}\r\n >\r\n {isRendered && children}\r\n </article>\r\n </section>\r\n </>, container);\r\n};\r\n\r\n\r\n\r\n/** \r\n * Popup trigger button\r\n */\r\nexport const PopupButton: FC<PopupButtonProps> = ({ children, as, className, onClick, disabled, popupId, ...props }) => {\r\n const ctx = useContext(PopupContext) as PopupContextProps;\r\n\r\n const Tag: keyof JSX.IntrinsicElements = as ?? 'button';\r\n\r\n const [isActive, setIsActive] = useState<boolean>(false);\r\n\r\n\r\n\r\n // Listen context\r\n useEffect(() => {\r\n const node = ctx.nodes.find(el => el.id === popupId);\r\n if (!node) return;\r\n\r\n setIsActive(node.open);\r\n }, [ctx]);\r\n\r\n\r\n\r\n function toggle(e: React.MouseEvent) {\r\n ctx.toggleNode(popupId);\r\n onClick && onClick(e);\r\n }\r\n\r\n\r\n\r\n return <Tag className={cn('fkw-popup-button', isActive && 'fkw-popup-button--active', className)} role='button' onClick={toggle} aria-haspopup=\"dialog\" tabIndex={0} disabled={disabled} aria-disabled={disabled} data-fkw-popup-operator={popupId} aria-label={isActive ? 'Close Popup' : 'Open Popup'} {...props}>\r\n {children}\r\n </Tag>;\r\n};\r\n\r\n\r\n\r\nfunction reassingObject(target: object, refference: object) {\r\n const payload = { ...refference };\r\n\r\n for (const key in target) {\r\n payload[key] = target[key];\r\n }\r\n\r\n return payload;\r\n}"],"names":["hasOwn","classNames","classes","i","arg","appendClass","parseValue","key","value","newClass","module","DEFAULT_SETTINGS","PopupContext","createContext","PopupLayer","className","initialSettings","children","props","settings","useState","reassingObject","nodes","setNodes","context","toggleNode","registerNode","toggleDocument","useEffect","handleKeydown","e","maxZIndex","el","node","nod","force","open","prev","id","jsxs","jsx","cn","PopupWindow","layerClassName","style","state","stateSetter","initialAnimation","renderOnDemand","onExit","onOpen","ctx","useContext","animation","isMounted","setIsMounted","isRendered","setIsRendered","container","setContainer","isOpen","setIsOpen","zIndex","setZIndex","useMemo","createPortal","Fragment","PopupButton","as","onClick","disabled","popupId","Tag","isActive","setIsActive","toggle","target","refference","payload"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../node_modules/classnames/index.js","../src/_package/useMixedState.ts","../src/_package/Package.tsx"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","'use client';\r\n\r\nimport { useState } from 'react';\r\nimport { StateSetter } from './Interfaces';\r\n\r\n\r\n\r\nexport default function useMixedState<S = undefined>(): [S | undefined, StateSetter<S | undefined>];\r\nexport default function useMixedState<S>(initialState: S | (() => S)): [S, StateSetter<S>];\r\nexport default function useMixedState<S>(state: S, setter?: StateSetter<S>): [S, StateSetter<S>];\r\n\r\n\r\n\r\n/** \r\n * Use mixed state hook\r\n * \r\n * @param initialStateOrValue Initial state, can be undefined, value or function. If externalSetter not specified, will return default state\r\n * @param externalSetter External state setter. If specified will return external state\r\n */\r\nexport default function useMixedState<S>(initialStateOrValue?: S | (() => S), externalSetter?: StateSetter<S>) {\r\n const isControlled = arguments.length === 2 && externalSetter !== undefined;\r\n\r\n const [defaultState, defaultSetter] = useState<S | undefined>(initialStateOrValue);\r\n\r\n\r\n\r\n if (isControlled) {\r\n return [\r\n initialStateOrValue as S,\r\n externalSetter as StateSetter<S>\r\n ];\r\n }\r\n\r\n return [defaultState, defaultSetter];\r\n}","import './styles.scss';\r\n\r\nimport React, { createContext, FC, JSX, Suspense, useContext, useEffect, useMemo, useState } from \"react\";\r\nimport cn from 'classnames';\r\nimport { IPopupButtonProps, IPopupContextProps, IPopupLayerProps, IPopupNode, IPopupSettings, PopupWindowAnimationType, IPopupWindowProps } from './Interfaces';\r\nimport { createPortal } from 'react-dom';\r\nimport useMixedState from './useMixedState';\r\n\r\n\r\n\r\nconst DEFAULT_SETTINGS: Required<IPopupSettings> = {\r\n disableScroll: true,\r\n exitOnDocument: true,\r\n exitOnEscape: true,\r\n preventStateChange: false\r\n};\r\n\r\nconst PopupContext = createContext<IPopupContextProps>({} as IPopupContextProps);\r\n\r\n\r\n\r\n/** \r\n * Popup context provider. Must be inside body tag and in client environment (NextJS)\r\n */\r\nexport const PopupLayer: FC<IPopupLayerProps> = ({ className, settings: initialSettings, children, ...props }) => {\r\n const [settings] = useState<IPopupSettings>(reassingObject(initialSettings ?? {}, DEFAULT_SETTINGS));\r\n const [nodes, setNodes] = useState<IPopupNode[]>([]);\r\n\r\n const context: IPopupContextProps = {\r\n nodes,\r\n toggleNode,\r\n registerNode,\r\n toggleDocument\r\n };\r\n\r\n\r\n\r\n // Handle exitOnEscape\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n\r\n window.addEventListener('keydown', handleKeydown);\r\n\r\n function handleKeydown(e: KeyboardEvent) {\r\n const key = e.key;\r\n\r\n if (key === 'Escape') {\r\n const maxZIndex = Math.max(...nodes.filter(el => el.open).map(el => el.zIndex));\r\n const node = nodes.find(el => el.open && el.zIndex === maxZIndex);\r\n if (!node || !node.settings.exitOnEscape || !settings?.exitOnEscape) return;\r\n\r\n toggleNode(node.id);\r\n }\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleKeydown);\r\n };\r\n }, [nodes]);\r\n\r\n\r\n /** \r\n * @param state Forced state\r\n */\r\n function toggleNode(nod: string | IPopupNode, force?: boolean) {\r\n let node: IPopupNode;\r\n\r\n if (typeof nod === 'string') {\r\n node = { ...nodes.find(el => el.id === nod) } as IPopupNode;\r\n } else {\r\n node = { ...nod };\r\n }\r\n\r\n if (!node.id) return;\r\n if ((settings.preventStateChange || node.settings.preventStateChange) && force === undefined) return console.warn(`Popup action prevented`);\r\n\r\n const open = force ?? !node?.open;\r\n\r\n node.open = open;\r\n node.zIndex = open ? Math.max(...nodes.map(el => el.zIndex), 0) + 1 : 0;\r\n\r\n setNodes(prev => [...prev.filter(el => el.id !== node.id), node]);\r\n\r\n // Hide scroll on open\r\n if (settings.disableScroll && node.settings.disableScroll && open) {\r\n document.body.classList.add('fkw-popup--noScroll');\r\n }\r\n\r\n // Show scroll if no popup open\r\n if (!open && !nodes.filter(el => el.id !== node.id).some(el => el.open)) {\r\n document.body.classList.remove('fkw-popup--noScroll');\r\n }\r\n }\r\n\r\n /** Register new node */\r\n function registerNode(node: IPopupNode) {\r\n setNodes(prev => [...prev, node]);\r\n\r\n if (node.open) toggleNode(node, true);\r\n }\r\n\r\n function toggleDocument(id: string, e: React.MouseEvent) {\r\n const node: IPopupNode = { ...nodes.find(el => el.id === id) } as IPopupNode;\r\n if (!node.id) return;\r\n if (!node.settings.exitOnDocument) return;\r\n\r\n const popup = (e.target as HTMLElement).closest('.fkw-popup');\r\n if (popup || !node.settings.exitOnDocument || !settings.exitOnDocument) return;\r\n\r\n toggleNode(node.id);\r\n }\r\n\r\n\r\n\r\n return <Suspense>\r\n <PopupContext.Provider value={context}>\r\n {children}\r\n\r\n <section className={cn(`fkw-popup-container`, className)} id='fkw-popup-container' {...props}></section>\r\n </PopupContext.Provider>\r\n </Suspense>;\r\n};\r\n\r\n\r\n\r\n/** \r\n * Popup window\r\n */\r\nexport const PopupWindow: FC<IPopupWindowProps> = ({ children, className, layerClassName, style, id, settings: initialSettings, isOpen: state, setIsOpen: stateSetter, animation: initialAnimation, onExit, onOpen, ...props }) => {\r\n const ctx = useContext(PopupContext) as IPopupContextProps;\r\n\r\n state = useMemo(() => state ?? false, []);\r\n\r\n const [animation] = useState<PopupWindowAnimationType>(initialAnimation ?? 'scale');\r\n const [settings] = useState<IPopupSettings>(reassingObject(initialSettings ?? {}, DEFAULT_SETTINGS));\r\n const [container, setContainer] = useState<Element | null>(null);\r\n\r\n const [isOpen, setIsOpen] = useMixedState(state, stateSetter);\r\n const [zIndex, setZIndex] = useState<number>(0);\r\n\r\n\r\n\r\n // Mount\r\n useEffect(() => {\r\n setContainer(document.querySelector('#fkw-popup-container'));\r\n\r\n ctx.registerNode({\r\n id,\r\n open: state,\r\n zIndex: 0,\r\n settings\r\n });\r\n }, []);\r\n\r\n // Handle onOpen, onExit\r\n useEffect(() => {\r\n if (isOpen && onOpen) onOpen();\r\n if (!isOpen && onExit) onExit();\r\n }, [isOpen]);\r\n\r\n // Listen context\r\n useEffect(() => {\r\n const node = ctx.nodes.find(el => el.id === id);\r\n if (!node) return;\r\n\r\n setIsOpen(node.open);\r\n\r\n if (node.zIndex !== 0) {\r\n // Instantly update zIndex\r\n setZIndex(node.zIndex);\r\n } else {\r\n // Timeout zIndex update\r\n setTimeout(() => {\r\n setZIndex(node.zIndex);\r\n }, 200); // TODO: fix constant animation delay timeout\r\n }\r\n }, [ctx]);\r\n\r\n\r\n\r\n if (!container) return null;\r\n\r\n return createPortal(<section\r\n id={id}\r\n className={cn(`fkw-popup-layer`, isOpen && 'fkw-popup-layer--open', layerClassName)}\r\n style={{ zIndex: 10000 + zIndex, cursor: settings.exitOnDocument && !settings.preventStateChange ? 'pointer' : 'auto', ...style }}\r\n onClick={settings.exitOnDocument && !settings.preventStateChange ? e => ctx.toggleDocument(id, e) : undefined}\r\n >\r\n <article\r\n className={cn(`fkw-popup`, isOpen && 'fkw-popup--open', animation && `fkw-popup-animation--${animation}`, className)}\r\n role='dialog'\r\n aria-modal\r\n aria-hidden={!isOpen}\r\n {...props}\r\n >\r\n {children}\r\n </article>\r\n </section>, container);\r\n};\r\n\r\n\r\n\r\n/** \r\n * Popup trigger button\r\n */\r\nexport const PopupButton: FC<IPopupButtonProps> = ({ children, as, className, onClick, disabled, popupId, ...props }) => {\r\n const ctx = useContext(PopupContext) as IPopupContextProps;\r\n\r\n const [isActive, setIsActive] = useState<boolean>(false);\r\n\r\n const Tag: keyof JSX.IntrinsicElements = as ?? 'button';\r\n\r\n\r\n\r\n // Listen context\r\n useEffect(() => {\r\n const node = ctx.nodes.find(el => el.id === popupId);\r\n if (!node) return;\r\n\r\n setIsActive(node.open);\r\n }, [ctx]);\r\n\r\n\r\n\r\n function toggle(e: React.MouseEvent) {\r\n ctx.toggleNode(popupId);\r\n onClick && onClick(e);\r\n }\r\n\r\n\r\n\r\n return <Tag className={cn('fkw-popup-button', isActive && 'fkw-popup-button--active', className)} role='button' onClick={toggle} aria-haspopup=\"dialog\" tabIndex={0} disabled={disabled} aria-disabled={disabled} data-fkw-popup-operator={popupId} aria-label={isActive ? 'Close Popup' : 'Open Popup'} {...props}>\r\n {children}\r\n </Tag>;\r\n};\r\n\r\n\r\n\r\nfunction reassingObject(target: object, refference: object) {\r\n const payload = { ...refference };\r\n\r\n for (const key in target) {\r\n payload[key] = target[key];\r\n }\r\n\r\n return payload;\r\n}"],"names":["hasOwn","classNames","classes","i","arg","appendClass","parseValue","key","value","newClass","module","useMixedState","initialStateOrValue","externalSetter","isControlled","defaultState","defaultSetter","useState","DEFAULT_SETTINGS","PopupContext","createContext","PopupLayer","className","initialSettings","children","props","settings","reassingObject","nodes","setNodes","context","toggleNode","registerNode","toggleDocument","useEffect","handleKeydown","e","maxZIndex","el","node","nod","force","open","prev","id","Suspense","jsxs","jsx","cn","PopupWindow","layerClassName","style","state","stateSetter","initialAnimation","onExit","onOpen","ctx","useContext","useMemo","animation","container","setContainer","isOpen","setIsOpen","zIndex","setZIndex","createPortal","PopupButton","as","onClick","disabled","popupId","isActive","setIsActive","Tag","toggle","target","refference","payload"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(l,x){typeof exports=="object"&&typeof module<"u"?x(exports,require("react/jsx-runtime"),require("react"),require("react-dom")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","react-dom"],x):(l=typeof globalThis<"u"?globalThis:l||self,x(l["@fullkekw/fkw-popup"]={},l.ReactJsxRuntime,l.React,l.ReactDOM))})(this,function(l,x,i,D){"use strict";function M(o){return o&&o.__esModule&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o}var O={exports:{}};/*!
|
|
2
2
|
Copyright (c) 2018 Jed Watson.
|
|
3
3
|
Licensed under the MIT License (MIT), see
|
|
4
4
|
http://jedwatson.github.io/classnames
|
|
5
|
-
*/var
|
|
5
|
+
*/var P;function T(){return P||(P=1,function(o){(function(){var m={}.hasOwnProperty;function p(){for(var e="",n=0;n<arguments.length;n++){var c=arguments[n];c&&(e=s(e,f(c)))}return e}function f(e){if(typeof e=="string"||typeof e=="number")return e;if(typeof e!="object")return"";if(Array.isArray(e))return p.apply(null,e);if(e.toString!==Object.prototype.toString&&!e.toString.toString().includes("[native code]"))return e.toString();var n="";for(var c in e)m.call(e,c)&&e[c]&&(n=s(n,c));return n}function s(e,n){return n?e?e+" "+n:e+n:e}o.exports?(p.default=p,o.exports=p):window.classNames=p})()}(O)),O.exports}var _=T();const h=M(_);function L(o,m){const p=arguments.length===2&&m!==void 0,[f,s]=i.useState(o);return p?[o,m]:[f,s]}const C={disableScroll:!0,exitOnDocument:!0,exitOnEscape:!0,preventStateChange:!1},b=i.createContext({}),I=({className:o,settings:m,children:p,...f})=>{const[s]=i.useState(N(m??{},C)),[e,n]=i.useState([]),c={nodes:e,toggleNode:g,registerNode:y,toggleDocument:v};i.useEffect(()=>{if(typeof window>"u")return;window.addEventListener("keydown",a);function a(r){if(r.key==="Escape"){const d=Math.max(...e.filter(S=>S.open).map(S=>S.zIndex)),u=e.find(S=>S.open&&S.zIndex===d);if(!u||!u.settings.exitOnEscape||!(s!=null&&s.exitOnEscape))return;g(u.id)}}return()=>{window.removeEventListener("keydown",a)}},[e]);function g(a,r){let t;if(typeof a=="string"?t={...e.find(u=>u.id===a)}:t={...a},!t.id)return;if((s.preventStateChange||t.settings.preventStateChange)&&r===void 0)return console.warn("Popup action prevented");const d=r??!(t!=null&&t.open);t.open=d,t.zIndex=d?Math.max(...e.map(u=>u.zIndex),0)+1:0,n(u=>[...u.filter(S=>S.id!==t.id),t]),s.disableScroll&&t.settings.disableScroll&&d&&document.body.classList.add("fkw-popup--noScroll"),!d&&!e.filter(u=>u.id!==t.id).some(u=>u.open)&&document.body.classList.remove("fkw-popup--noScroll")}function y(a){n(r=>[...r,a]),a.open&&g(a,!0)}function v(a,r){const t={...e.find(u=>u.id===a)};!t.id||!t.settings.exitOnDocument||r.target.closest(".fkw-popup")||!t.settings.exitOnDocument||!s.exitOnDocument||g(t.id)}return x.jsx(i.Suspense,{children:x.jsxs(b.Provider,{value:c,children:[p,x.jsx("section",{className:h("fkw-popup-container",o),id:"fkw-popup-container",...f})]})})},E=({children:o,className:m,layerClassName:p,style:f,id:s,settings:e,isOpen:n,setIsOpen:c,animation:g,onExit:y,onOpen:v,...a})=>{const r=i.useContext(b);n=i.useMemo(()=>n??!1,[]);const[t]=i.useState(g??"scale"),[d]=i.useState(N(e??{},C)),[u,S]=i.useState(null),[k,A]=L(n,c),[B,z]=i.useState(0);return i.useEffect(()=>{S(document.querySelector("#fkw-popup-container")),r.registerNode({id:s,open:n,zIndex:0,settings:d})},[]),i.useEffect(()=>{k&&v&&v(),!k&&y&&y()},[k]),i.useEffect(()=>{const w=r.nodes.find(F=>F.id===s);w&&(A(w.open),w.zIndex!==0?z(w.zIndex):setTimeout(()=>{z(w.zIndex)},200))},[r]),u?D.createPortal(x.jsx("section",{id:s,className:h("fkw-popup-layer",k&&"fkw-popup-layer--open",p),style:{zIndex:1e4+B,cursor:d.exitOnDocument&&!d.preventStateChange?"pointer":"auto",...f},onClick:d.exitOnDocument&&!d.preventStateChange?w=>r.toggleDocument(s,w):void 0,children:x.jsx("article",{className:h("fkw-popup",k&&"fkw-popup--open",t&&`fkw-popup-animation--${t}`,m),role:"dialog","aria-modal":!0,"aria-hidden":!k,...a,children:o})}),u):null},j=({children:o,as:m,className:p,onClick:f,disabled:s,popupId:e,...n})=>{const c=i.useContext(b),[g,y]=i.useState(!1),v=m??"button";i.useEffect(()=>{const r=c.nodes.find(t=>t.id===e);r&&y(r.open)},[c]);function a(r){c.toggleNode(e),f&&f(r)}return x.jsx(v,{className:h("fkw-popup-button",g&&"fkw-popup-button--active",p),role:"button",onClick:a,"aria-haspopup":"dialog",tabIndex:0,disabled:s,"aria-disabled":s,"data-fkw-popup-operator":e,"aria-label":g?"Close Popup":"Open Popup",...n,children:o})};function N(o,m){const p={...m};for(const f in o)p[f]=o[f];return p}const q=Object.freeze(Object.defineProperty({__proto__:null,PopupButton:j,PopupLayer:I,PopupWindow:E},Symbol.toStringTag,{value:"Module"}));l.PopupButton=j,l.PopupLayer=I,l.PopupWindow=E,l.default=q,Object.defineProperties(l,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
6
6
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../node_modules/classnames/index.js","../src/_package/Package.tsx"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import './styles.scss';\r\n\r\nimport React, { createContext, FC, JSX, useContext, useEffect, useMemo, useState } from \"react\";\r\nimport cn from 'classnames';\r\nimport { PopupButtonProps, PopupContextProps, PopupLayerProps, PopupNode, PopupSettings, PopupWindowAnimationType, PopupWindowProps } from './Interfaces';\r\nimport { createPortal } from 'react-dom';\r\n\r\n\r\n\r\nconst DEFAULT_SETTINGS: Required<PopupSettings> = {\r\n disableScroll: true,\r\n exitOnDocument: true,\r\n exitOnEscape: true,\r\n preventStateChange: false\r\n};\r\n\r\n// @ts-expect-error Need empty object\r\nconst PopupContext = createContext<PopupContextProps>({});\r\n\r\n\r\n\r\n/** \r\n * Popup context provider. Must be inside body tag and in client environment (NextJS)\r\n */\r\nexport const PopupLayer: FC<PopupLayerProps> = ({ className, settings: initialSettings, children, ...props }) => {\r\n const [settings] = useState<PopupSettings>(reassingObject(initialSettings ?? {}, DEFAULT_SETTINGS));\r\n const [nodes, setNodes] = useState<PopupNode[]>([]);\r\n\r\n const context: PopupContextProps = {\r\n nodes,\r\n toggleNode,\r\n registerNode,\r\n toggleDocument\r\n };\r\n\r\n\r\n\r\n // Handle exitOnEscape\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n\r\n window.addEventListener('keydown', handleKeydown);\r\n\r\n function handleKeydown(e: KeyboardEvent) {\r\n const key = e.key;\r\n\r\n if (key === 'Escape') {\r\n const maxZIndex = Math.max(...nodes.filter(el => el.open).map(el => el.zIndex));\r\n const node = nodes.find(el => el.open && el.zIndex === maxZIndex);\r\n if (!node || !node.settings.exitOnEscape || !settings?.exitOnEscape) return;\r\n\r\n toggleNode(node.id);\r\n }\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleKeydown);\r\n };\r\n }, [nodes]);\r\n\r\n\r\n /** \r\n * @param state Forced state\r\n */\r\n function toggleNode(nod: string | PopupNode, force?: boolean) {\r\n let node: PopupNode;\r\n\r\n if (typeof nod === 'string') {\r\n node = { ...nodes.find(el => el.id === nod) } as PopupNode;\r\n } else {\r\n node = { ...nod };\r\n }\r\n\r\n if (!node.id) return;\r\n if ((settings.preventStateChange || node.settings.preventStateChange) && force === undefined) return console.warn(`Popup action prevented`);\r\n\r\n const open = force ?? !node?.open;\r\n\r\n node.open = open;\r\n node.zIndex = open ? Math.max(...nodes.map(el => el.zIndex), 0) + 1 : 0;\r\n\r\n setNodes(prev => [...prev.filter(el => el.id !== node.id), node]);\r\n\r\n // Hide scroll on open\r\n if (settings.disableScroll && node.settings.disableScroll && open) {\r\n document.body.classList.add('fkw-popup--noScroll');\r\n }\r\n\r\n // Show scroll if no popup open\r\n if (!open && !nodes.filter(el => el.id !== node.id).some(el => el.open)) {\r\n document.body.classList.remove('fkw-popup--noScroll');\r\n }\r\n }\r\n\r\n /** Register new node */\r\n function registerNode(node: PopupNode) {\r\n setNodes(prev => [...prev, node]);\r\n\r\n if (node.open) toggleNode(node, true);\r\n }\r\n\r\n function toggleDocument(id: string, e: React.MouseEvent) {\r\n const node: PopupNode = { ...nodes.find(el => el.id === id) } as PopupNode;\r\n if (!node.id) return;\r\n if (!node.settings.exitOnDocument) return;\r\n\r\n const popup = (e.target as HTMLElement).closest('.fkw-popup');\r\n if (popup || !node.settings.exitOnDocument || !settings.exitOnDocument) return;\r\n\r\n toggleNode(node.id);\r\n }\r\n\r\n\r\n\r\n return <PopupContext.Provider value={context}>\r\n {children}\r\n\r\n <section className={cn(`fkw-popup-container`, className)} id='fkw-popup-container' {...props}></section>\r\n </PopupContext.Provider>;\r\n};\r\n\r\n\r\n\r\n/** \r\n * Popup window\r\n */\r\nexport const PopupWindow: FC<PopupWindowProps> = ({ children, className, layerClassName, style, id, settings: initialSettings, isOpen: state, setIsOpen: stateSetter, animation: initialAnimation, renderOnDemand, onExit, onOpen, ...props }) => {\r\n const ctx = useContext(PopupContext) as PopupContextProps;\r\n\r\n const [animation] = useState<PopupWindowAnimationType>(initialAnimation ?? 'scale');\r\n const [settings] = useState<PopupSettings>(reassingObject(initialSettings ?? {}, DEFAULT_SETTINGS));\r\n const [isMounted, setIsMounted] = useState<boolean>(false);\r\n const [isRendered, setIsRendered] = useState<boolean>(false);\r\n const [container, setContainer] = useState<Element | null>(null);\r\n\r\n const [isOpen, setIsOpen] = useState<boolean>(false);\r\n const [zIndex, setZIndex] = useState<number>(0);\r\n\r\n\r\n\r\n // Handle isRendered & onOpen, onExit\r\n useMemo(() => {\r\n if (renderOnDemand) {\r\n if (isOpen) setIsRendered(true); // Render content only if window is open\r\n } else setIsRendered(true);\r\n\r\n if (isOpen && onOpen) onOpen();\r\n if (!isOpen && onExit) onExit();\r\n }, [isOpen]);\r\n\r\n // Mount\r\n useEffect(() => {\r\n setContainer(document.querySelector('#fkw-popup-container'));\r\n setIsMounted(true);\r\n\r\n ctx.registerNode({\r\n id,\r\n open: false,\r\n zIndex: 0,\r\n settings\r\n });\r\n }, []);\r\n\r\n // Listen context\r\n useEffect(() => {\r\n const node = ctx.nodes.find(el => el.id === id);\r\n if (!node) return;\r\n\r\n setIsOpen(node.open);\r\n\r\n if (node.zIndex !== 0) {\r\n // Instantly update zIndex\r\n setZIndex(node.zIndex);\r\n } else {\r\n // Timeout zIndex update\r\n setTimeout(() => {\r\n setZIndex(node.zIndex);\r\n }, 200);\r\n }\r\n }, [ctx]);\r\n\r\n // Sync out state on current change\r\n useEffect(() => {\r\n if (stateSetter === undefined || state === isOpen) return;\r\n\r\n stateSetter(isOpen);\r\n }, [isOpen]);\r\n\r\n // Sync current state on out change\r\n useEffect(() => {\r\n if (state === undefined || state === isOpen) return;\r\n\r\n ctx.toggleNode(id, state);\r\n }, [state]);\r\n\r\n\r\n\r\n if (!isMounted || !container) return null;\r\n\r\n return createPortal(<>\r\n <section\r\n id={id}\r\n className={cn(`fkw-popup-layer`, isOpen && 'fkw-popup-layer--open', layerClassName)}\r\n style={{ zIndex: 10000 + zIndex, cursor: settings.exitOnDocument && !settings.preventStateChange ? 'pointer' : 'auto', ...style }}\r\n onClick={settings.exitOnDocument && !settings.preventStateChange ? e => ctx.toggleDocument(id, e) : undefined}\r\n >\r\n <article\r\n className={cn(`fkw-popup`, isOpen && 'fkw-popup--open', animation && `fkw-popup-animation--${animation}`, className)}\r\n role='dialog'\r\n aria-modal\r\n aria-hidden={!isOpen}\r\n {...props}\r\n >\r\n {isRendered && children}\r\n </article>\r\n </section>\r\n </>, container);\r\n};\r\n\r\n\r\n\r\n/** \r\n * Popup trigger button\r\n */\r\nexport const PopupButton: FC<PopupButtonProps> = ({ children, as, className, onClick, disabled, popupId, ...props }) => {\r\n const ctx = useContext(PopupContext) as PopupContextProps;\r\n\r\n const Tag: keyof JSX.IntrinsicElements = as ?? 'button';\r\n\r\n const [isActive, setIsActive] = useState<boolean>(false);\r\n\r\n\r\n\r\n // Listen context\r\n useEffect(() => {\r\n const node = ctx.nodes.find(el => el.id === popupId);\r\n if (!node) return;\r\n\r\n setIsActive(node.open);\r\n }, [ctx]);\r\n\r\n\r\n\r\n function toggle(e: React.MouseEvent) {\r\n ctx.toggleNode(popupId);\r\n onClick && onClick(e);\r\n }\r\n\r\n\r\n\r\n return <Tag className={cn('fkw-popup-button', isActive && 'fkw-popup-button--active', className)} role='button' onClick={toggle} aria-haspopup=\"dialog\" tabIndex={0} disabled={disabled} aria-disabled={disabled} data-fkw-popup-operator={popupId} aria-label={isActive ? 'Close Popup' : 'Open Popup'} {...props}>\r\n {children}\r\n </Tag>;\r\n};\r\n\r\n\r\n\r\nfunction reassingObject(target: object, refference: object) {\r\n const payload = { ...refference };\r\n\r\n for (const key in target) {\r\n payload[key] = target[key];\r\n }\r\n\r\n return payload;\r\n}"],"names":["hasOwn","classNames","classes","i","arg","appendClass","parseValue","key","value","newClass","module","DEFAULT_SETTINGS","PopupContext","createContext","PopupLayer","className","initialSettings","children","props","settings","useState","reassingObject","nodes","setNodes","context","toggleNode","registerNode","toggleDocument","useEffect","handleKeydown","e","maxZIndex","el","node","nod","force","open","prev","id","jsxs","jsx","cn","PopupWindow","layerClassName","style","state","stateSetter","initialAnimation","renderOnDemand","onExit","onOpen","ctx","useContext","animation","isMounted","setIsMounted","isRendered","setIsRendered","container","setContainer","isOpen","setIsOpen","zIndex","setZIndex","useMemo","createPortal","Fragment","PopupButton","as","onClick","disabled","popupId","Tag","isActive","setIsActive","toggle","target","refference","payload"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../node_modules/classnames/index.js","../src/_package/useMixedState.ts","../src/_package/Package.tsx"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","'use client';\r\n\r\nimport { useState } from 'react';\r\nimport { StateSetter } from './Interfaces';\r\n\r\n\r\n\r\nexport default function useMixedState<S = undefined>(): [S | undefined, StateSetter<S | undefined>];\r\nexport default function useMixedState<S>(initialState: S | (() => S)): [S, StateSetter<S>];\r\nexport default function useMixedState<S>(state: S, setter?: StateSetter<S>): [S, StateSetter<S>];\r\n\r\n\r\n\r\n/** \r\n * Use mixed state hook\r\n * \r\n * @param initialStateOrValue Initial state, can be undefined, value or function. If externalSetter not specified, will return default state\r\n * @param externalSetter External state setter. If specified will return external state\r\n */\r\nexport default function useMixedState<S>(initialStateOrValue?: S | (() => S), externalSetter?: StateSetter<S>) {\r\n const isControlled = arguments.length === 2 && externalSetter !== undefined;\r\n\r\n const [defaultState, defaultSetter] = useState<S | undefined>(initialStateOrValue);\r\n\r\n\r\n\r\n if (isControlled) {\r\n return [\r\n initialStateOrValue as S,\r\n externalSetter as StateSetter<S>\r\n ];\r\n }\r\n\r\n return [defaultState, defaultSetter];\r\n}","import './styles.scss';\r\n\r\nimport React, { createContext, FC, JSX, Suspense, useContext, useEffect, useMemo, useState } from \"react\";\r\nimport cn from 'classnames';\r\nimport { IPopupButtonProps, IPopupContextProps, IPopupLayerProps, IPopupNode, IPopupSettings, PopupWindowAnimationType, IPopupWindowProps } from './Interfaces';\r\nimport { createPortal } from 'react-dom';\r\nimport useMixedState from './useMixedState';\r\n\r\n\r\n\r\nconst DEFAULT_SETTINGS: Required<IPopupSettings> = {\r\n disableScroll: true,\r\n exitOnDocument: true,\r\n exitOnEscape: true,\r\n preventStateChange: false\r\n};\r\n\r\nconst PopupContext = createContext<IPopupContextProps>({} as IPopupContextProps);\r\n\r\n\r\n\r\n/** \r\n * Popup context provider. Must be inside body tag and in client environment (NextJS)\r\n */\r\nexport const PopupLayer: FC<IPopupLayerProps> = ({ className, settings: initialSettings, children, ...props }) => {\r\n const [settings] = useState<IPopupSettings>(reassingObject(initialSettings ?? {}, DEFAULT_SETTINGS));\r\n const [nodes, setNodes] = useState<IPopupNode[]>([]);\r\n\r\n const context: IPopupContextProps = {\r\n nodes,\r\n toggleNode,\r\n registerNode,\r\n toggleDocument\r\n };\r\n\r\n\r\n\r\n // Handle exitOnEscape\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n\r\n window.addEventListener('keydown', handleKeydown);\r\n\r\n function handleKeydown(e: KeyboardEvent) {\r\n const key = e.key;\r\n\r\n if (key === 'Escape') {\r\n const maxZIndex = Math.max(...nodes.filter(el => el.open).map(el => el.zIndex));\r\n const node = nodes.find(el => el.open && el.zIndex === maxZIndex);\r\n if (!node || !node.settings.exitOnEscape || !settings?.exitOnEscape) return;\r\n\r\n toggleNode(node.id);\r\n }\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleKeydown);\r\n };\r\n }, [nodes]);\r\n\r\n\r\n /** \r\n * @param state Forced state\r\n */\r\n function toggleNode(nod: string | IPopupNode, force?: boolean) {\r\n let node: IPopupNode;\r\n\r\n if (typeof nod === 'string') {\r\n node = { ...nodes.find(el => el.id === nod) } as IPopupNode;\r\n } else {\r\n node = { ...nod };\r\n }\r\n\r\n if (!node.id) return;\r\n if ((settings.preventStateChange || node.settings.preventStateChange) && force === undefined) return console.warn(`Popup action prevented`);\r\n\r\n const open = force ?? !node?.open;\r\n\r\n node.open = open;\r\n node.zIndex = open ? Math.max(...nodes.map(el => el.zIndex), 0) + 1 : 0;\r\n\r\n setNodes(prev => [...prev.filter(el => el.id !== node.id), node]);\r\n\r\n // Hide scroll on open\r\n if (settings.disableScroll && node.settings.disableScroll && open) {\r\n document.body.classList.add('fkw-popup--noScroll');\r\n }\r\n\r\n // Show scroll if no popup open\r\n if (!open && !nodes.filter(el => el.id !== node.id).some(el => el.open)) {\r\n document.body.classList.remove('fkw-popup--noScroll');\r\n }\r\n }\r\n\r\n /** Register new node */\r\n function registerNode(node: IPopupNode) {\r\n setNodes(prev => [...prev, node]);\r\n\r\n if (node.open) toggleNode(node, true);\r\n }\r\n\r\n function toggleDocument(id: string, e: React.MouseEvent) {\r\n const node: IPopupNode = { ...nodes.find(el => el.id === id) } as IPopupNode;\r\n if (!node.id) return;\r\n if (!node.settings.exitOnDocument) return;\r\n\r\n const popup = (e.target as HTMLElement).closest('.fkw-popup');\r\n if (popup || !node.settings.exitOnDocument || !settings.exitOnDocument) return;\r\n\r\n toggleNode(node.id);\r\n }\r\n\r\n\r\n\r\n return <Suspense>\r\n <PopupContext.Provider value={context}>\r\n {children}\r\n\r\n <section className={cn(`fkw-popup-container`, className)} id='fkw-popup-container' {...props}></section>\r\n </PopupContext.Provider>\r\n </Suspense>;\r\n};\r\n\r\n\r\n\r\n/** \r\n * Popup window\r\n */\r\nexport const PopupWindow: FC<IPopupWindowProps> = ({ children, className, layerClassName, style, id, settings: initialSettings, isOpen: state, setIsOpen: stateSetter, animation: initialAnimation, onExit, onOpen, ...props }) => {\r\n const ctx = useContext(PopupContext) as IPopupContextProps;\r\n\r\n state = useMemo(() => state ?? false, []);\r\n\r\n const [animation] = useState<PopupWindowAnimationType>(initialAnimation ?? 'scale');\r\n const [settings] = useState<IPopupSettings>(reassingObject(initialSettings ?? {}, DEFAULT_SETTINGS));\r\n const [container, setContainer] = useState<Element | null>(null);\r\n\r\n const [isOpen, setIsOpen] = useMixedState(state, stateSetter);\r\n const [zIndex, setZIndex] = useState<number>(0);\r\n\r\n\r\n\r\n // Mount\r\n useEffect(() => {\r\n setContainer(document.querySelector('#fkw-popup-container'));\r\n\r\n ctx.registerNode({\r\n id,\r\n open: state,\r\n zIndex: 0,\r\n settings\r\n });\r\n }, []);\r\n\r\n // Handle onOpen, onExit\r\n useEffect(() => {\r\n if (isOpen && onOpen) onOpen();\r\n if (!isOpen && onExit) onExit();\r\n }, [isOpen]);\r\n\r\n // Listen context\r\n useEffect(() => {\r\n const node = ctx.nodes.find(el => el.id === id);\r\n if (!node) return;\r\n\r\n setIsOpen(node.open);\r\n\r\n if (node.zIndex !== 0) {\r\n // Instantly update zIndex\r\n setZIndex(node.zIndex);\r\n } else {\r\n // Timeout zIndex update\r\n setTimeout(() => {\r\n setZIndex(node.zIndex);\r\n }, 200); // TODO: fix constant animation delay timeout\r\n }\r\n }, [ctx]);\r\n\r\n\r\n\r\n if (!container) return null;\r\n\r\n return createPortal(<section\r\n id={id}\r\n className={cn(`fkw-popup-layer`, isOpen && 'fkw-popup-layer--open', layerClassName)}\r\n style={{ zIndex: 10000 + zIndex, cursor: settings.exitOnDocument && !settings.preventStateChange ? 'pointer' : 'auto', ...style }}\r\n onClick={settings.exitOnDocument && !settings.preventStateChange ? e => ctx.toggleDocument(id, e) : undefined}\r\n >\r\n <article\r\n className={cn(`fkw-popup`, isOpen && 'fkw-popup--open', animation && `fkw-popup-animation--${animation}`, className)}\r\n role='dialog'\r\n aria-modal\r\n aria-hidden={!isOpen}\r\n {...props}\r\n >\r\n {children}\r\n </article>\r\n </section>, container);\r\n};\r\n\r\n\r\n\r\n/** \r\n * Popup trigger button\r\n */\r\nexport const PopupButton: FC<IPopupButtonProps> = ({ children, as, className, onClick, disabled, popupId, ...props }) => {\r\n const ctx = useContext(PopupContext) as IPopupContextProps;\r\n\r\n const [isActive, setIsActive] = useState<boolean>(false);\r\n\r\n const Tag: keyof JSX.IntrinsicElements = as ?? 'button';\r\n\r\n\r\n\r\n // Listen context\r\n useEffect(() => {\r\n const node = ctx.nodes.find(el => el.id === popupId);\r\n if (!node) return;\r\n\r\n setIsActive(node.open);\r\n }, [ctx]);\r\n\r\n\r\n\r\n function toggle(e: React.MouseEvent) {\r\n ctx.toggleNode(popupId);\r\n onClick && onClick(e);\r\n }\r\n\r\n\r\n\r\n return <Tag className={cn('fkw-popup-button', isActive && 'fkw-popup-button--active', className)} role='button' onClick={toggle} aria-haspopup=\"dialog\" tabIndex={0} disabled={disabled} aria-disabled={disabled} data-fkw-popup-operator={popupId} aria-label={isActive ? 'Close Popup' : 'Open Popup'} {...props}>\r\n {children}\r\n </Tag>;\r\n};\r\n\r\n\r\n\r\nfunction reassingObject(target: object, refference: object) {\r\n const payload = { ...refference };\r\n\r\n for (const key in target) {\r\n payload[key] = target[key];\r\n }\r\n\r\n return payload;\r\n}"],"names":["hasOwn","classNames","classes","i","arg","appendClass","parseValue","key","value","newClass","module","useMixedState","initialStateOrValue","externalSetter","isControlled","defaultState","defaultSetter","useState","DEFAULT_SETTINGS","PopupContext","createContext","PopupLayer","className","initialSettings","children","props","settings","reassingObject","nodes","setNodes","context","toggleNode","registerNode","toggleDocument","useEffect","handleKeydown","e","maxZIndex","el","node","nod","force","open","prev","id","Suspense","jsxs","jsx","cn","PopupWindow","layerClassName","style","state","stateSetter","initialAnimation","onExit","onOpen","ctx","useContext","useMemo","animation","container","setContainer","isOpen","setIsOpen","zIndex","setZIndex","createPortal","PopupButton","as","onClick","disabled","popupId","isActive","setIsActive","Tag","toggle","target","refference","payload"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.fkw-popup{cursor:auto;transition:.2s ease-in-out}.fkw-popup--noScroll{overflow:hidden;scrollbar-gutter:stable}.fkw-popup-animation--fade{opacity:1}.fkw-popup-animation--fade:not(.fkw-popup--open){opacity:0}.fkw-popup-animation--scale{scale:1}.fkw-popup-animation--scale:not(.fkw-popup--open){scale:.8}.fkw-popup-layer{position:fixed;top:0;left:0;width:100%;height:100%;max-height:100%;z-index:9999;background:#0003;-webkit-tap-highlight-color:transparent;contain:paint;opacity:0;visibility:hidden;touch-action:none;pointer-events:none;transition:.2s ease-in-out;display:flex;align-items:center;justify-content:center}.fkw-popup-layer--open{opacity:1;visibility:visible;touch-action:auto;pointer-events:auto}.fkw-popup-button{cursor:pointer}
|
|
1
|
+
.fkw-popup{cursor:auto;transition:.2s ease-in-out;max-height:100%;overflow-y:auto}.fkw-popup--noScroll{overflow:hidden;scrollbar-gutter:stable}.fkw-popup-animation--fade{opacity:1}.fkw-popup-animation--fade:not(.fkw-popup--open){opacity:0}.fkw-popup-animation--scale{scale:1}.fkw-popup-animation--scale:not(.fkw-popup--open){scale:.8}.fkw-popup-layer{position:fixed;top:0;right:0;bottom:0;left:0;width:100%;height:100%;max-height:100%;z-index:9999;background:#0003;-webkit-tap-highlight-color:transparent;contain:paint;opacity:0;visibility:hidden;touch-action:none;pointer-events:none;transition:.2s ease-in-out;display:flex;align-items:center;justify-content:center}.fkw-popup-layer--open{opacity:1;visibility:visible;touch-action:auto;pointer-events:auto}.fkw-popup-button{cursor:pointer}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { StateSetter } from './Interfaces';
|
|
2
|
+
export default function useMixedState<S = undefined>(): [S | undefined, StateSetter<S | undefined>];
|
|
3
|
+
export default function useMixedState<S>(initialState: S | (() => S)): [S, StateSetter<S>];
|
|
4
|
+
export default function useMixedState<S>(state: S, setter?: StateSetter<S>): [S, StateSetter<S>];
|