@simplybusiness/mobius 4.2.8 → 4.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.
- package/CHANGELOG.md +10 -0
- package/dist/cjs/components/Drawer/Drawer.js +1 -1
- package/dist/cjs/components/Drawer/Drawer.js.map +1 -1
- package/dist/cjs/components/Modal/Content.js +3 -13
- package/dist/cjs/components/Modal/Content.js.map +1 -1
- package/dist/cjs/components/Modal/Header.js +4 -14
- package/dist/cjs/components/Modal/Header.js.map +1 -1
- package/dist/cjs/components/Modal/Modal.js +35 -22
- package/dist/cjs/components/Modal/Modal.js.map +1 -1
- package/dist/cjs/components/Modal/index.js.map +1 -1
- package/dist/cjs/components/Modal/types.js +6 -0
- package/dist/cjs/components/Modal/types.js.map +1 -0
- package/dist/cjs/hooks/useTextField/useTextField.js +1 -1
- package/dist/cjs/hooks/useTextField/useTextField.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/utils/index.js +0 -1
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/jestMockMatchMedia.js +28 -0
- package/dist/cjs/utils/jestMockMatchMedia.js.map +1 -0
- package/dist/esm/components/Drawer/Drawer.js +1 -1
- package/dist/esm/components/Drawer/Drawer.js.map +1 -1
- package/dist/esm/components/Modal/Content.js +3 -8
- package/dist/esm/components/Modal/Content.js.map +1 -1
- package/dist/esm/components/Modal/Header.js +4 -9
- package/dist/esm/components/Modal/Header.js.map +1 -1
- package/dist/esm/components/Modal/Modal.js +36 -24
- package/dist/esm/components/Modal/Modal.js.map +1 -1
- package/dist/esm/components/Modal/index.js.map +1 -1
- package/dist/esm/components/Modal/types.js +3 -0
- package/dist/esm/components/Modal/types.js.map +1 -0
- package/dist/esm/hooks/useTextField/useTextField.js +1 -1
- package/dist/esm/hooks/useTextField/useTextField.js.map +1 -1
- package/dist/esm/utils/index.js +0 -1
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/jestMockMatchMedia.js +18 -0
- package/dist/esm/utils/jestMockMatchMedia.js.map +1 -0
- package/package.json +1 -1
- package/src/components/Accordion/Accordion.test.tsx +3 -19
- package/src/components/Checkbox/Checkbox.stories.tsx +2 -1
- package/src/components/Checkbox/CheckboxGroup.stories.tsx +3 -2
- package/src/components/Divider/Divider.stories.tsx +1 -1
- package/src/components/Drawer/Drawer.test.tsx +13 -47
- package/src/components/Drawer/Drawer.tsx +1 -1
- package/src/components/DropdownMenu/DropdownMenu.stories.tsx +4 -3
- package/src/components/Fieldset/Fieldset.stories.tsx +3 -2
- package/src/components/Modal/Content.tsx +18 -22
- package/src/components/Modal/Header.tsx +16 -22
- package/src/components/Modal/Modal.stories.tsx +6 -28
- package/src/components/Modal/Modal.test.tsx +82 -101
- package/src/components/Modal/Modal.tsx +62 -75
- package/src/components/Modal/index.tsx +2 -1
- package/src/components/Modal/types.ts +32 -0
- package/src/components/NumberField/NumberField.stories.tsx +2 -1
- package/src/components/PasswordField/PasswordField.stories.tsx +2 -1
- package/src/components/Progress/Progress.stories.tsx +2 -1
- package/src/components/Radio/Radio.stories.tsx +4 -3
- package/src/components/Radio/RadioButton.stories.tsx +4 -3
- package/src/components/Select/Select.stories.tsx +2 -2
- package/src/components/Slider/Slider.stories.tsx +2 -1
- package/src/components/TextArea/TextArea.stories.tsx +2 -1
- package/src/components/TextField/TextField.stories.tsx +6 -5
- package/src/hooks/useTextField/useTextField.tsx +3 -3
- package/src/utils/index.ts +0 -1
- package/src/utils/jestMockMatchMedia.ts +16 -0
- package/dist/cjs/utils/StoryContainer.js +0 -39
- package/dist/cjs/utils/StoryContainer.js.map +0 -1
- package/dist/esm/utils/StoryContainer.js +0 -29
- package/dist/esm/utils/StoryContainer.js.map +0 -1
package/dist/cjs/utils/index.js
CHANGED
|
@@ -9,7 +9,6 @@ _export_star(require("./mergeRefs"), exports);
|
|
|
9
9
|
_export_star(require("./polyfill-tests"), exports);
|
|
10
10
|
_export_star(require("./sizeClasses"), exports);
|
|
11
11
|
_export_star(require("./spaceDelimitedList"), exports);
|
|
12
|
-
_export_star(require("./StoryContainer"), exports);
|
|
13
12
|
function _export_star(from, to) {
|
|
14
13
|
Object.keys(from).forEach(function(k) {
|
|
15
14
|
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from \"./changeCSS\";\nexport * from \"./excludeControls\";\nexport * from \"./jestHTMLDialogPolyfill\";\nexport * from \"./mergeRefs\";\nexport * from \"./polyfill-tests\";\nexport * from \"./sizeClasses\";\nexport * from \"./spaceDelimitedList\";\
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from \"./changeCSS\";\nexport * from \"./excludeControls\";\nexport * from \"./jestHTMLDialogPolyfill\";\nexport * from \"./mergeRefs\";\nexport * from \"./polyfill-tests\";\nexport * from \"./sizeClasses\";\nexport * from \"./spaceDelimitedList\";\n"],"names":[],"mappings":";;;;qBAAc;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "jestMockMatchMedia", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return jestMockMatchMedia;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const jestMockMatchMedia = (matches)=>{
|
|
12
|
+
Object.defineProperty(window, "matchMedia", {
|
|
13
|
+
writable: true,
|
|
14
|
+
configurable: true,
|
|
15
|
+
value: jest.fn().mockImplementation((query)=>({
|
|
16
|
+
matches,
|
|
17
|
+
media: query,
|
|
18
|
+
onchange: null,
|
|
19
|
+
addListener: jest.fn(),
|
|
20
|
+
removeListener: jest.fn(),
|
|
21
|
+
addEventListener: jest.fn(),
|
|
22
|
+
removeEventListener: jest.fn(),
|
|
23
|
+
dispatchEvent: jest.fn()
|
|
24
|
+
}))
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=jestMockMatchMedia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/jestMockMatchMedia.ts"],"sourcesContent":["export const jestMockMatchMedia = (matches: boolean) => {\n Object.defineProperty(window, \"matchMedia\", {\n writable: true,\n configurable: true,\n value: jest.fn().mockImplementation(query => ({\n matches,\n media: query,\n onchange: null,\n addListener: jest.fn(),\n removeListener: jest.fn(),\n addEventListener: jest.fn(),\n removeEventListener: jest.fn(),\n dispatchEvent: jest.fn(),\n })),\n });\n};\n"],"names":["jestMockMatchMedia","matches","Object","defineProperty","window","writable","configurable","value","jest","fn","mockImplementation","query","media","onchange","addListener","removeListener","addEventListener","removeEventListener","dispatchEvent"],"mappings":";;;;+BAAaA;;;eAAAA;;;AAAN,MAAMA,qBAAqB,CAACC;IACjCC,OAAOC,cAAc,CAACC,QAAQ,cAAc;QAC1CC,UAAU;QACVC,cAAc;QACdC,OAAOC,KAAKC,EAAE,GAAGC,kBAAkB,CAACC,CAAAA,QAAU,CAAA;gBAC5CV;gBACAW,OAAOD;gBACPE,UAAU;gBACVC,aAAaN,KAAKC,EAAE;gBACpBM,gBAAgBP,KAAKC,EAAE;gBACvBO,kBAAkBR,KAAKC,EAAE;gBACzBQ,qBAAqBT,KAAKC,EAAE;gBAC5BS,eAAeV,KAAKC,EAAE;YACxB,CAAA;IACF;AACF"}
|
|
@@ -26,7 +26,7 @@ const Drawer = /*#__PURE__*/ forwardRef((props, ref)=>{
|
|
|
26
26
|
event.stopPropagation();
|
|
27
27
|
}
|
|
28
28
|
const doClose = ()=>{
|
|
29
|
-
dialog.close();
|
|
29
|
+
dialog === null || dialog === void 0 ? void 0 : dialog.close();
|
|
30
30
|
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
31
31
|
};
|
|
32
32
|
// Delay close to allow exit animation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Drawer/Drawer.tsx"],"sourcesContent":["\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport {\n Children,\n Ref,\n SyntheticEvent,\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { useBodyScrollLock } from \"../../hooks/useBodyScrollLock\";\nimport { supportsDialog } from \"../../utils/polyfill-tests\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\nimport { DrawerProps } from \"./types\";\nimport { mergeRefs } from \"../../utils\";\n\nexport type DialogElementType = HTMLDialogElement;\nexport type DialogRef = Ref<DialogElementType>;\n\nconst Drawer = forwardRef((props: DrawerProps, ref: DialogRef) => {\n const {\n isOpen,\n className,\n closeLabel,\n direction,\n announce = \"Drawer opened on screen\",\n onOpen,\n onClose,\n children,\n } = props;\n const hasOpened = useRef<boolean>(false);\n const modalRef = useRef<HTMLDialogElement>(null);\n const dialog = modalRef.current as HTMLDialogElement;\n\n // Fire onOpen once\n if (onOpen && !hasOpened.current) {\n onOpen();\n hasOpened.current = true;\n }\n\n useBodyScrollLock({ enabled: isOpen });\n\n // Add close handler, to enable closing animations\n const handleClose = useCallback(\n (event?: SyntheticEvent<HTMLElement, Event>) => {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n const doClose = () => {\n dialog
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Drawer/Drawer.tsx"],"sourcesContent":["\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport {\n Children,\n Ref,\n SyntheticEvent,\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { useBodyScrollLock } from \"../../hooks/useBodyScrollLock\";\nimport { supportsDialog } from \"../../utils/polyfill-tests\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\nimport { DrawerProps } from \"./types\";\nimport { mergeRefs } from \"../../utils\";\n\nexport type DialogElementType = HTMLDialogElement;\nexport type DialogRef = Ref<DialogElementType>;\n\nconst Drawer = forwardRef((props: DrawerProps, ref: DialogRef) => {\n const {\n isOpen,\n className,\n closeLabel,\n direction,\n announce = \"Drawer opened on screen\",\n onOpen,\n onClose,\n children,\n } = props;\n const hasOpened = useRef<boolean>(false);\n const modalRef = useRef<HTMLDialogElement>(null);\n const dialog = modalRef.current as HTMLDialogElement;\n\n // Fire onOpen once\n if (onOpen && !hasOpened.current) {\n onOpen();\n hasOpened.current = true;\n }\n\n useBodyScrollLock({ enabled: isOpen });\n\n // Add close handler, to enable closing animations\n const handleClose = useCallback(\n (event?: SyntheticEvent<HTMLElement, Event>) => {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n const doClose = () => {\n dialog?.close();\n onClose?.();\n };\n\n // Delay close to allow exit animation\n dialog?.classList.add(\"close\");\n dialog?.addEventListener(\n \"animationend\",\n () => {\n dialog.classList.remove(\"close\");\n doClose();\n },\n { once: true },\n );\n },\n [onClose, dialog],\n );\n\n const modalClasses = classNames(\n \"mobius\",\n \"mobius/Drawer\",\n `--${direction}`,\n className,\n );\n\n // Add polyfill for HTML Dialog in old browsers\n useEffect(() => {\n async function toggleModal() {\n if (!supportsDialog() && typeof window !== \"undefined\") {\n // eslint-disable-next-line import/no-extraneous-dependencies\n const { default: dialogPolyfill } = await import(\"dialog-polyfill\");\n dialogPolyfill.registerDialog(modalRef.current as HTMLDialogElement);\n }\n\n if (isOpen) {\n modalRef.current?.showModal();\n onOpen?.();\n } else if (modalRef.current?.open) {\n handleClose();\n }\n }\n\n toggleModal();\n }, [isOpen, onOpen, handleClose]);\n\n return (\n <dialog\n ref={mergeRefs([modalRef, ref])}\n onCancel={handleClose}\n className={modalClasses}\n aria-describedby=\"screen-reader-announce\"\n >\n <VisuallyHidden>\n <div id=\"screen-reader-announce\">{announce}</div>\n </VisuallyHidden>\n {Children.map(children, child => {\n if (isValidElement(child)) {\n return cloneElement(child, {\n onClose: handleClose,\n closeLabel,\n } as any);\n }\n\n return child;\n })}\n </dialog>\n );\n});\n\nDrawer.displayName = \"Drawer\";\nexport { Drawer };\n"],"names":["classNames","Children","cloneElement","forwardRef","isValidElement","useCallback","useEffect","useRef","useBodyScrollLock","supportsDialog","VisuallyHidden","mergeRefs","Drawer","props","ref","isOpen","className","closeLabel","direction","announce","onOpen","onClose","children","hasOpened","modalRef","dialog","current","enabled","handleClose","event","preventDefault","stopPropagation","doClose","close","classList","add","addEventListener","remove","once","modalClasses","toggleModal","window","default","dialogPolyfill","registerDialog","showModal","open","onCancel","aria-describedby","div","id","map","child","displayName"],"mappings":"AAAA;;AAEA,OAAOA,gBAAgB,oBAAoB;AAC3C,SACEC,QAAQ,EAGRC,YAAY,EACZC,UAAU,EACVC,cAAc,EACdC,WAAW,EACXC,SAAS,EACTC,MAAM,QACD,QAAQ;AACf,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,cAAc,QAAQ,6BAA6B;AAC5D,SAASC,cAAc,QAAQ,oBAAoB;AAEnD,SAASC,SAAS,QAAQ,cAAc;AAKxC,MAAMC,uBAAST,WAAW,CAACU,OAAoBC;IAC7C,MAAM,EACJC,MAAM,EACNC,SAAS,EACTC,UAAU,EACVC,SAAS,EACTC,WAAW,yBAAyB,EACpCC,MAAM,EACNC,OAAO,EACPC,QAAQ,EACT,GAAGT;IACJ,MAAMU,YAAYhB,OAAgB;IAClC,MAAMiB,WAAWjB,OAA0B;IAC3C,MAAMkB,SAASD,SAASE,OAAO;IAE/B,mBAAmB;IACnB,IAAIN,UAAU,CAACG,UAAUG,OAAO,EAAE;QAChCN;QACAG,UAAUG,OAAO,GAAG;IACtB;IAEAlB,kBAAkB;QAAEmB,SAASZ;IAAO;IAEpC,kDAAkD;IAClD,MAAMa,cAAcvB,YAClB,CAACwB;QACC,IAAIA,OAAO;YACTA,MAAMC,cAAc;YACpBD,MAAME,eAAe;QACvB;QAEA,MAAMC,UAAU;YACdP,mBAAAA,6BAAAA,OAAQQ,KAAK;YACbZ,oBAAAA,8BAAAA;QACF;QAEA,sCAAsC;QACtCI,mBAAAA,6BAAAA,OAAQS,SAAS,CAACC,GAAG,CAAC;QACtBV,mBAAAA,6BAAAA,OAAQW,gBAAgB,CACtB,gBACA;YACEX,OAAOS,SAAS,CAACG,MAAM,CAAC;YACxBL;QACF,GACA;YAAEM,MAAM;QAAK;IAEjB,GACA;QAACjB;QAASI;KAAO;IAGnB,MAAMc,eAAevC,WACnB,UACA,iBACA,CAAC,EAAE,EAAEkB,UAAU,CAAC,EAChBF;IAGF,+CAA+C;IAC/CV,UAAU;QACR,eAAekC;gBAUFhB;YATX,IAAI,CAACf,oBAAoB,OAAOgC,WAAW,aAAa;gBACtD,6DAA6D;gBAC7D,MAAM,EAAEC,SAASC,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC;gBACjDA,eAAeC,cAAc,CAACpB,SAASE,OAAO;YAChD;YAEA,IAAIX,QAAQ;oBACVS;iBAAAA,qBAAAA,SAASE,OAAO,cAAhBF,yCAAAA,mBAAkBqB,SAAS;gBAC3BzB,mBAAAA,6BAAAA;YACF,OAAO,KAAII,oBAAAA,SAASE,OAAO,cAAhBF,wCAAAA,kBAAkBsB,IAAI,EAAE;gBACjClB;YACF;QACF;QAEAY;IACF,GAAG;QAACzB;QAAQK;QAAQQ;KAAY;IAEhC,qBACE,MAACH;QACCX,KAAKH,UAAU;YAACa;YAAUV;SAAI;QAC9BiC,UAAUnB;QACVZ,WAAWuB;QACXS,oBAAiB;;0BAEjB,KAACtC;0BACC,cAAA,KAACuC;oBAAIC,IAAG;8BAA0B/B;;;YAEnClB,SAASkD,GAAG,CAAC7B,UAAU8B,CAAAA;gBACtB,kBAAIhD,eAAegD,QAAQ;oBACzB,qBAAOlD,aAAakD,OAAO;wBACzB/B,SAASO;wBACTX;oBACF;gBACF;gBAEA,OAAOmC;YACT;;;AAGN;AAEAxC,OAAOyC,WAAW,GAAG;AACrB,SAASzC,MAAM,GAAG"}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import classNames from "classnames/dedupe";
|
|
3
2
|
import { Children, cloneElement, forwardRef, isValidElement } from "react";
|
|
4
|
-
const Content = /*#__PURE__*/ forwardRef((
|
|
5
|
-
{ children, onClose, closeLabel, ...otherProps }, ref)=>{
|
|
6
|
-
const classes = classNames("mobius/ModalContent");
|
|
7
|
-
return /*#__PURE__*/ _jsx("div", {
|
|
3
|
+
const Content = /*#__PURE__*/ forwardRef(({ children, onClose, closeLabel: _, ...otherProps }, ref)=>/*#__PURE__*/ _jsx("div", {
|
|
8
4
|
ref: ref,
|
|
9
5
|
...otherProps,
|
|
10
|
-
className:
|
|
6
|
+
className: "mobius/ModalContent",
|
|
11
7
|
children: Children.map(children, (child)=>{
|
|
12
8
|
if (/*#__PURE__*/ isValidElement(child)) {
|
|
13
9
|
return /*#__PURE__*/ cloneElement(child, {
|
|
@@ -16,8 +12,7 @@ const Content = /*#__PURE__*/ forwardRef((// eslint-disable-next-line @typescrip
|
|
|
16
12
|
}
|
|
17
13
|
return child;
|
|
18
14
|
})
|
|
19
|
-
});
|
|
20
|
-
});
|
|
15
|
+
}));
|
|
21
16
|
Content.displayName = "Content";
|
|
22
17
|
export { Content };
|
|
23
18
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Modal/Content.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Modal/Content.tsx"],"sourcesContent":["import {\n Children,\n PropsWithChildren,\n Ref,\n RefAttributes,\n cloneElement,\n forwardRef,\n isValidElement,\n} from \"react\";\nimport { DOMProps } from \"../../types/dom\";\n\nexport type DivRef = Ref<HTMLDivElement>;\nexport type DivElementType = HTMLDivElement;\nexport interface ContentProps\n extends DOMProps,\n RefAttributes<DivElementType>,\n PropsWithChildren {\n onClose?: () => void;\n closeLabel?: string;\n}\n\nconst Content = forwardRef(\n (\n { children, onClose, closeLabel: _, ...otherProps }: ContentProps,\n ref: DivRef,\n ) => (\n <div ref={ref} {...otherProps} className=\"mobius/ModalContent\">\n {Children.map(children, child => {\n if (isValidElement(child)) {\n return cloneElement(child, {\n onClose,\n } as any);\n }\n\n return child;\n })}\n </div>\n ),\n);\n\nContent.displayName = \"Content\";\nexport { Content };\n"],"names":["Children","cloneElement","forwardRef","isValidElement","Content","children","onClose","closeLabel","_","otherProps","ref","div","className","map","child","displayName"],"mappings":";AAAA,SACEA,QAAQ,EAIRC,YAAY,EACZC,UAAU,EACVC,cAAc,QACT,QAAQ;AAaf,MAAMC,wBAAUF,WACd,CACE,EAAEG,QAAQ,EAAEC,OAAO,EAAEC,YAAYC,CAAC,EAAE,GAAGC,YAA0B,EACjEC,oBAEA,KAACC;QAAID,KAAKA;QAAM,GAAGD,UAAU;QAAEG,WAAU;kBACtCZ,SAASa,GAAG,CAACR,UAAUS,CAAAA;YACtB,kBAAIX,eAAeW,QAAQ;gBACzB,qBAAOb,aAAaa,OAAO;oBACzBR;gBACF;YACF;YAEA,OAAOQ;QACT;;AAKNV,QAAQW,WAAW,GAAG;AACtB,SAASX,OAAO,GAAG"}
|
|
@@ -1,23 +1,19 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef } from "react";
|
|
3
|
-
import classNames from "classnames/dedupe";
|
|
4
3
|
import { cross } from "@simplybusiness/icons";
|
|
5
4
|
import { Button } from "../Button";
|
|
6
5
|
import { Icon } from "../Icon";
|
|
7
|
-
const Header = /*#__PURE__*/ forwardRef(({ children, onClose, closeLabel, ...otherProps }, ref)
|
|
8
|
-
const classes = classNames("mobius/ModalHeader");
|
|
9
|
-
const closeClasses = classNames("mobius/ModalClose");
|
|
10
|
-
return /*#__PURE__*/ _jsxs("header", {
|
|
6
|
+
const Header = /*#__PURE__*/ forwardRef(({ children, onClose, closeLabel, ...otherProps }, ref)=>/*#__PURE__*/ _jsxs("header", {
|
|
11
7
|
ref: ref,
|
|
12
8
|
...otherProps,
|
|
13
|
-
className:
|
|
9
|
+
className: "mobius/ModalHeader",
|
|
14
10
|
children: [
|
|
15
11
|
children,
|
|
16
12
|
/*#__PURE__*/ _jsxs(Button, {
|
|
17
13
|
"aria-label": "Close",
|
|
18
14
|
variant: "basic",
|
|
19
15
|
onPress: onClose,
|
|
20
|
-
className:
|
|
16
|
+
className: "mobius/ModalClose",
|
|
21
17
|
children: [
|
|
22
18
|
/*#__PURE__*/ _jsx(Icon, {
|
|
23
19
|
icon: cross
|
|
@@ -27,8 +23,7 @@ const Header = /*#__PURE__*/ forwardRef(({ children, onClose, closeLabel, ...oth
|
|
|
27
23
|
]
|
|
28
24
|
})
|
|
29
25
|
]
|
|
30
|
-
});
|
|
31
|
-
});
|
|
26
|
+
}));
|
|
32
27
|
Header.displayName = "Header";
|
|
33
28
|
export { Header };
|
|
34
29
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Modal/Header.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Modal/Header.tsx"],"sourcesContent":["import { PropsWithChildren, Ref, RefAttributes, forwardRef } from \"react\";\n\nimport { cross } from \"@simplybusiness/icons\";\nimport { DOMProps } from \"../../types/dom\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\n\nexport type HeaderElementType = HTMLDivElement;\nexport type HeaderRef = Ref<HTMLElement>;\n\nexport interface HeaderProps\n extends DOMProps,\n RefAttributes<HeaderElementType>,\n PropsWithChildren {\n onClose?: () => void;\n closeLabel?: string;\n}\n\nconst Header = forwardRef(\n (\n { children, onClose, closeLabel, ...otherProps }: HeaderProps,\n ref: HeaderRef,\n ) => (\n <header ref={ref} {...otherProps} className=\"mobius/ModalHeader\">\n {children}\n <Button\n aria-label=\"Close\"\n variant=\"basic\"\n onPress={onClose}\n className=\"mobius/ModalClose\"\n >\n <Icon icon={cross} /> {closeLabel}\n </Button>\n </header>\n ),\n);\n\nHeader.displayName = \"Header\";\nexport { Header };\n"],"names":["forwardRef","cross","Button","Icon","Header","children","onClose","closeLabel","otherProps","ref","header","className","aria-label","variant","onPress","icon","displayName"],"mappings":";AAAA,SAAgDA,UAAU,QAAQ,QAAQ;AAE1E,SAASC,KAAK,QAAQ,wBAAwB;AAE9C,SAASC,MAAM,QAAQ,YAAY;AACnC,SAASC,IAAI,QAAQ,UAAU;AAa/B,MAAMC,uBAASJ,WACb,CACE,EAAEK,QAAQ,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGC,YAAyB,EAC7DC,oBAEA,MAACC;QAAOD,KAAKA;QAAM,GAAGD,UAAU;QAAEG,WAAU;;YACzCN;0BACD,MAACH;gBACCU,cAAW;gBACXC,SAAQ;gBACRC,SAASR;gBACTK,WAAU;;kCAEV,KAACR;wBAAKY,MAAMd;;oBAAS;oBAAEM;;;;;AAM/BH,OAAOY,WAAW,GAAG;AACrB,SAASZ,MAAM,GAAG"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
4
3
|
import classNames from "classnames/dedupe";
|
|
5
|
-
import { Children, cloneElement, isValidElement, useCallback, useEffect, useRef } from "react";
|
|
4
|
+
import { Children, cloneElement, forwardRef, isValidElement, useCallback, useEffect, useRef } from "react";
|
|
6
5
|
import { useBodyScrollLock } from "../../hooks/useBodyScrollLock";
|
|
7
6
|
import { supportsDialog } from "../../utils/polyfill-tests";
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
import { mergeRefs } from "../../utils";
|
|
8
|
+
const Modal = /*#__PURE__*/ forwardRef((props, ref)=>{
|
|
10
9
|
var _window;
|
|
10
|
+
const { isOpen, onClose, onOpen, children, className, closeLabel, isFullScreen, animation, // Deprecated props below
|
|
11
|
+
size, appElement, preventCloseOnEsc, shouldFocusAfterRender, parentSelector } = props;
|
|
11
12
|
const hasWarnedAboutMissingLabels = useRef(false);
|
|
12
13
|
// Handle deprecated props
|
|
13
14
|
if (!hasWarnedAboutMissingLabels.current) {
|
|
@@ -16,9 +17,15 @@ size, appElement, preventCloseOnEsc, shouldFocusAfterRender, parentSelector })=>
|
|
|
16
17
|
hasWarnedAboutMissingLabels.current = true;
|
|
17
18
|
}
|
|
18
19
|
}
|
|
20
|
+
const hasOpened = useRef(false);
|
|
19
21
|
const modalRef = useRef(null);
|
|
20
22
|
const dialog = modalRef.current;
|
|
21
23
|
const noPreference = (_window = window) === null || _window === void 0 ? void 0 : _window.matchMedia("(prefers-reduced-motion: no-preference)");
|
|
24
|
+
// Fire onOpen once
|
|
25
|
+
if (onOpen && !hasOpened.current) {
|
|
26
|
+
onOpen();
|
|
27
|
+
hasOpened.current = true;
|
|
28
|
+
}
|
|
22
29
|
useBodyScrollLock({
|
|
23
30
|
enabled: isOpen
|
|
24
31
|
});
|
|
@@ -27,21 +34,21 @@ size, appElement, preventCloseOnEsc, shouldFocusAfterRender, parentSelector })=>
|
|
|
27
34
|
if (event) {
|
|
28
35
|
event.preventDefault();
|
|
29
36
|
event.stopPropagation();
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}, {
|
|
40
|
-
once: true
|
|
41
|
-
});
|
|
42
|
-
} else {
|
|
37
|
+
}
|
|
38
|
+
const doClose = ()=>{
|
|
39
|
+
dialog === null || dialog === void 0 ? void 0 : dialog.close();
|
|
40
|
+
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
41
|
+
};
|
|
42
|
+
if (animation) {
|
|
43
|
+
dialog === null || dialog === void 0 ? void 0 : dialog.classList.add("close");
|
|
44
|
+
dialog === null || dialog === void 0 ? void 0 : dialog.addEventListener("animationend", ()=>{
|
|
45
|
+
dialog.classList.remove("close");
|
|
43
46
|
doClose();
|
|
44
|
-
}
|
|
47
|
+
}, {
|
|
48
|
+
once: true
|
|
49
|
+
});
|
|
50
|
+
} else {
|
|
51
|
+
doClose();
|
|
45
52
|
}
|
|
46
53
|
}, [
|
|
47
54
|
animation,
|
|
@@ -67,17 +74,22 @@ size, appElement, preventCloseOnEsc, shouldFocusAfterRender, parentSelector })=>
|
|
|
67
74
|
if (isOpen) {
|
|
68
75
|
var _modalRef_current1;
|
|
69
76
|
(_modalRef_current1 = modalRef.current) === null || _modalRef_current1 === void 0 ? void 0 : _modalRef_current1.showModal();
|
|
77
|
+
onOpen === null || onOpen === void 0 ? void 0 : onOpen();
|
|
70
78
|
} else if ((_modalRef_current = modalRef.current) === null || _modalRef_current === void 0 ? void 0 : _modalRef_current.open) {
|
|
71
|
-
|
|
72
|
-
(_modalRef_current2 = modalRef.current) === null || _modalRef_current2 === void 0 ? void 0 : _modalRef_current2.close();
|
|
79
|
+
handleClose();
|
|
73
80
|
}
|
|
74
81
|
}
|
|
75
82
|
toggleModal();
|
|
76
83
|
}, [
|
|
77
|
-
isOpen
|
|
84
|
+
isOpen,
|
|
85
|
+
onOpen,
|
|
86
|
+
handleClose
|
|
78
87
|
]);
|
|
79
88
|
return /*#__PURE__*/ _jsx("dialog", {
|
|
80
|
-
ref:
|
|
89
|
+
ref: mergeRefs([
|
|
90
|
+
modalRef,
|
|
91
|
+
ref
|
|
92
|
+
]),
|
|
81
93
|
onCancel: handleClose,
|
|
82
94
|
className: modalClasses,
|
|
83
95
|
children: Children.map(children, (child)=>{
|
|
@@ -90,7 +102,7 @@ size, appElement, preventCloseOnEsc, shouldFocusAfterRender, parentSelector })=>
|
|
|
90
102
|
return child;
|
|
91
103
|
})
|
|
92
104
|
});
|
|
93
|
-
};
|
|
105
|
+
});
|
|
94
106
|
Modal.displayName = "Modal";
|
|
95
107
|
export { Modal };
|
|
96
108
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Modal/Modal.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Modal/Modal.tsx"],"sourcesContent":["\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport {\n Children,\n Ref,\n SyntheticEvent,\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { useBodyScrollLock } from \"../../hooks/useBodyScrollLock\";\nimport { supportsDialog } from \"../../utils/polyfill-tests\";\nimport { ModalProps } from \"./types\";\nimport { mergeRefs } from \"../../utils\";\n\nexport type ModalElementType = HTMLDialogElement;\nexport type ModalRef = Ref<ModalElementType>;\n\nconst Modal = forwardRef((props: ModalProps, ref: ModalRef) => {\n const {\n isOpen,\n onClose,\n onOpen,\n children,\n className,\n closeLabel,\n isFullScreen,\n animation,\n // Deprecated props below\n size,\n appElement,\n preventCloseOnEsc,\n shouldFocusAfterRender,\n parentSelector,\n } = props;\n const hasWarnedAboutMissingLabels = useRef<boolean>(false);\n // Handle deprecated props\n if (!hasWarnedAboutMissingLabels.current) {\n if (\n size ||\n appElement ||\n preventCloseOnEsc ||\n shouldFocusAfterRender ||\n parentSelector\n ) {\n console.warn(\n `Deprecation warning: Mobius Modal no longer supports the following props: size, appElement, preventCloseOnEsc, shouldFocusAfterRender and parentSelector.`,\n );\n hasWarnedAboutMissingLabels.current = true;\n }\n }\n\n const hasOpened = useRef<boolean>(false);\n const modalRef = useRef<HTMLDialogElement>(null);\n const dialog = modalRef.current as HTMLDialogElement;\n const noPreference = window?.matchMedia(\n \"(prefers-reduced-motion: no-preference)\",\n );\n\n // Fire onOpen once\n if (onOpen && !hasOpened.current) {\n onOpen();\n hasOpened.current = true;\n }\n\n useBodyScrollLock({ enabled: isOpen });\n\n // Add close handler, to enable closing animations\n const handleClose = useCallback(\n (event?: SyntheticEvent<HTMLElement, Event>) => {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n const doClose = () => {\n dialog?.close();\n onClose?.();\n };\n\n if (animation) {\n dialog?.classList.add(\"close\");\n dialog?.addEventListener(\n \"animationend\",\n () => {\n dialog.classList.remove(\"close\");\n doClose();\n },\n { once: true },\n );\n } else {\n doClose();\n }\n },\n [animation, dialog, onClose],\n );\n\n const modalClasses = classNames(\n \"mobius\",\n \"mobius/Modal\",\n {\n animation,\n \"--slide-up\": animation === \"slideUp\",\n \"--fade\": animation === \"fade\",\n \"--has-reduced-motion\": !noPreference.matches,\n \"--is-fullscreen\": isFullScreen,\n },\n className,\n );\n\n // Add polyfill for HTML Dialog in old browsers\n useEffect(() => {\n async function toggleModal() {\n if (!supportsDialog() && typeof window !== \"undefined\") {\n // eslint-disable-next-line import/no-extraneous-dependencies\n const { default: dialogPolyfill } = await import(\"dialog-polyfill\");\n dialogPolyfill.registerDialog(modalRef.current as HTMLDialogElement);\n }\n\n if (isOpen) {\n modalRef.current?.showModal();\n onOpen?.();\n } else if (modalRef.current?.open) {\n handleClose();\n }\n }\n\n toggleModal();\n }, [isOpen, onOpen, handleClose]);\n\n return (\n <dialog\n ref={mergeRefs([modalRef, ref])}\n onCancel={handleClose}\n className={modalClasses}\n >\n {Children.map(children, child => {\n if (isValidElement(child)) {\n return cloneElement(child, {\n onClose: handleClose,\n closeLabel,\n } as any);\n }\n\n return child;\n })}\n </dialog>\n );\n});\n\nModal.displayName = \"Modal\";\nexport { Modal };\n"],"names":["classNames","Children","cloneElement","forwardRef","isValidElement","useCallback","useEffect","useRef","useBodyScrollLock","supportsDialog","mergeRefs","Modal","props","ref","window","isOpen","onClose","onOpen","children","className","closeLabel","isFullScreen","animation","size","appElement","preventCloseOnEsc","shouldFocusAfterRender","parentSelector","hasWarnedAboutMissingLabels","current","console","warn","hasOpened","modalRef","dialog","noPreference","matchMedia","enabled","handleClose","event","preventDefault","stopPropagation","doClose","close","classList","add","addEventListener","remove","once","modalClasses","matches","toggleModal","default","dialogPolyfill","registerDialog","showModal","open","onCancel","map","child","displayName"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Modal/index.tsx"],"sourcesContent":["import {\n Content,\n DivElementType as ModalContentDivElementType,\n ContentProps as ModalContentProps,\n} from \"./Content\";\nimport {\n Header,\n HeaderElementType as ModalHeaderElementType,\n HeaderProps as ModalHeaderProps,\n} from \"./Header\";\nimport { Modal as ModalComponent
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Modal/index.tsx"],"sourcesContent":["import {\n Content,\n DivElementType as ModalContentDivElementType,\n ContentProps as ModalContentProps,\n} from \"./Content\";\nimport {\n Header,\n HeaderElementType as ModalHeaderElementType,\n HeaderProps as ModalHeaderProps,\n} from \"./Header\";\nimport { Modal as ModalComponent } from \"./Modal\";\nimport { ModalProps } from \"./types\";\n\nconst Modal = Object.assign(ModalComponent, {\n Header,\n Content,\n});\n\nModal.displayName = \"Modal\";\nexport { Modal };\n\nexport type {\n ModalContentDivElementType,\n ModalContentProps,\n ModalHeaderElementType,\n ModalHeaderProps,\n ModalProps,\n};\n"],"names":["Content","Header","Modal","ModalComponent","Object","assign","displayName"],"mappings":"AAAA,SACEA,OAAO,QAGF,YAAY;AACnB,SACEC,MAAM,QAGD,WAAW;AAClB,SAASC,SAASC,cAAc,QAAQ,UAAU;AAGlD,MAAMD,QAAQE,OAAOC,MAAM,CAACF,gBAAgB;IAC1CF;IACAD;AACF;AAEAE,MAAMI,WAAW,GAAG;AACpB,SAASJ,KAAK,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Modal/types.ts"],"sourcesContent":["import { ReactNode } from \"react\";\n\nexport interface ModalProps {\n isOpen: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n children?: ReactNode;\n className?: string;\n closeLabel?: string;\n animation?: \"slideUp\" | \"fade\";\n isFullScreen?: boolean;\n /**\n * **Deprecated:** No longer needed\n */\n size?: string;\n /**\n * **Deprecated:** No longer needed\n */\n appElement?: string;\n /**\n * **Deprecated:** No longer needed\n */\n preventCloseOnEsc?: boolean;\n /**\n * **Deprecated:** No longer needed\n */\n shouldFocusAfterRender?: boolean;\n /**\n * **Deprecated:** No longer needed\n */\n parentSelector?: () => HTMLElement;\n}\n"],"names":[],"mappings":"AAEA,WA6BC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useId } from "react";
|
|
2
|
-
import { useLabel } from "../useLabel/useLabel";
|
|
3
2
|
import { spaceDelimitedList } from "../../utils/spaceDelimitedList";
|
|
3
|
+
import { useLabel } from "../useLabel/useLabel";
|
|
4
4
|
export function useTextField(props) {
|
|
5
5
|
const { isDisabled = false, isReadOnly = false, isRequired = false, inputElementType = "input" } = props;
|
|
6
6
|
const { labelProps, fieldProps } = useLabel(props);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/hooks/useTextField/useTextField.tsx"],"sourcesContent":["import { useId } from \"react\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/hooks/useTextField/useTextField.tsx"],"sourcesContent":["import { useId } from \"react\";\nimport { spaceDelimitedList } from \"../../utils/spaceDelimitedList\";\nimport { useLabel } from \"../useLabel/useLabel\";\nimport { UseTextFieldProps, UseTextFieldReturn } from \"./types\";\n\nexport function useTextField(props: UseTextFieldProps): UseTextFieldReturn {\n const {\n isDisabled = false,\n isReadOnly = false,\n isRequired = false,\n inputElementType = \"input\",\n } = props;\n const { labelProps, fieldProps } = useLabel(props);\n\n const descriptionId = useId();\n const descriptionProps = { id: descriptionId };\n\n const errorMessageId = useId();\n const errorMessageProps = { id: errorMessageId };\n\n const ariaDescribedBy = spaceDelimitedList([\n props.description && descriptionId,\n props.errorMessage && errorMessageId,\n props[\"aria-describedby\"],\n ]);\n\n return {\n descriptionProps,\n errorMessageProps,\n labelProps,\n inputProps: {\n defaultValue: props.defaultValue,\n value: props.value,\n onChange: props.onChange,\n disabled: isDisabled,\n readOnly: isReadOnly,\n \"aria-required\": isRequired === true ? true : undefined,\n \"aria-invalid\":\n props.validationState === \"invalid\"\n ? true\n : props.validationState === \"valid\"\n ? false\n : undefined,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-errormessage\": props[\"aria-errormessage\"],\n\n type: inputElementType === \"input\" ? props.type : undefined,\n pattern: inputElementType === \"input\" ? props.pattern : undefined,\n\n autoComplete: props.autoComplete,\n maxLength: props.maxLength,\n minLength: props.minLength,\n name: props.name,\n placeholder: props.placeholder,\n inputMode: props.inputMode,\n\n // Clipboard events\n onCopy: props.onCopy,\n onCut: props.onCut,\n onPaste: props.onPaste,\n\n // Composition events\n onCompositionEnd: props.onCompositionEnd,\n onCompositionStart: props.onCompositionStart,\n onCompositionUpdate: props.onCompositionUpdate,\n\n // Selection events\n onSelect: props.onSelect,\n\n // Input events\n onBeforeInput: props.onBeforeInput,\n onInput: props.onInput,\n\n // Focus events\n onFocus: props.onFocus,\n onBlur: props.onBlur,\n\n ...fieldProps,\n },\n };\n}\n"],"names":["useId","spaceDelimitedList","useLabel","useTextField","props","isDisabled","isReadOnly","isRequired","inputElementType","labelProps","fieldProps","descriptionId","descriptionProps","id","errorMessageId","errorMessageProps","ariaDescribedBy","description","errorMessage","inputProps","defaultValue","value","onChange","disabled","readOnly","undefined","validationState","type","pattern","autoComplete","maxLength","minLength","name","placeholder","inputMode","onCopy","onCut","onPaste","onCompositionEnd","onCompositionStart","onCompositionUpdate","onSelect","onBeforeInput","onInput","onFocus","onBlur"],"mappings":"AAAA,SAASA,KAAK,QAAQ,QAAQ;AAC9B,SAASC,kBAAkB,QAAQ,iCAAiC;AACpE,SAASC,QAAQ,QAAQ,uBAAuB;AAGhD,OAAO,SAASC,aAAaC,KAAwB;IACnD,MAAM,EACJC,aAAa,KAAK,EAClBC,aAAa,KAAK,EAClBC,aAAa,KAAK,EAClBC,mBAAmB,OAAO,EAC3B,GAAGJ;IACJ,MAAM,EAAEK,UAAU,EAAEC,UAAU,EAAE,GAAGR,SAASE;IAE5C,MAAMO,gBAAgBX;IACtB,MAAMY,mBAAmB;QAAEC,IAAIF;IAAc;IAE7C,MAAMG,iBAAiBd;IACvB,MAAMe,oBAAoB;QAAEF,IAAIC;IAAe;IAE/C,MAAME,kBAAkBf,mBAAmB;QACzCG,MAAMa,WAAW,IAAIN;QACrBP,MAAMc,YAAY,IAAIJ;QACtBV,KAAK,CAAC,mBAAmB;KAC1B;IAED,OAAO;QACLQ;QACAG;QACAN;QACAU,YAAY;YACVC,cAAchB,MAAMgB,YAAY;YAChCC,OAAOjB,MAAMiB,KAAK;YAClBC,UAAUlB,MAAMkB,QAAQ;YACxBC,UAAUlB;YACVmB,UAAUlB;YACV,iBAAiBC,eAAe,OAAO,OAAOkB;YAC9C,gBACErB,MAAMsB,eAAe,KAAK,YACtB,OACAtB,MAAMsB,eAAe,KAAK,UACxB,QACAD;YACR,oBAAoBT;YACpB,qBAAqBZ,KAAK,CAAC,oBAAoB;YAE/CuB,MAAMnB,qBAAqB,UAAUJ,MAAMuB,IAAI,GAAGF;YAClDG,SAASpB,qBAAqB,UAAUJ,MAAMwB,OAAO,GAAGH;YAExDI,cAAczB,MAAMyB,YAAY;YAChCC,WAAW1B,MAAM0B,SAAS;YAC1BC,WAAW3B,MAAM2B,SAAS;YAC1BC,MAAM5B,MAAM4B,IAAI;YAChBC,aAAa7B,MAAM6B,WAAW;YAC9BC,WAAW9B,MAAM8B,SAAS;YAE1B,mBAAmB;YACnBC,QAAQ/B,MAAM+B,MAAM;YACpBC,OAAOhC,MAAMgC,KAAK;YAClBC,SAASjC,MAAMiC,OAAO;YAEtB,qBAAqB;YACrBC,kBAAkBlC,MAAMkC,gBAAgB;YACxCC,oBAAoBnC,MAAMmC,kBAAkB;YAC5CC,qBAAqBpC,MAAMoC,mBAAmB;YAE9C,mBAAmB;YACnBC,UAAUrC,MAAMqC,QAAQ;YAExB,eAAe;YACfC,eAAetC,MAAMsC,aAAa;YAClCC,SAASvC,MAAMuC,OAAO;YAEtB,eAAe;YACfC,SAASxC,MAAMwC,OAAO;YACtBC,QAAQzC,MAAMyC,MAAM;YAEpB,GAAGnC,UAAU;QACf;IACF;AACF"}
|
package/dist/esm/utils/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from \"./changeCSS\";\nexport * from \"./excludeControls\";\nexport * from \"./jestHTMLDialogPolyfill\";\nexport * from \"./mergeRefs\";\nexport * from \"./polyfill-tests\";\nexport * from \"./sizeClasses\";\nexport * from \"./spaceDelimitedList\";\
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from \"./changeCSS\";\nexport * from \"./excludeControls\";\nexport * from \"./jestHTMLDialogPolyfill\";\nexport * from \"./mergeRefs\";\nexport * from \"./polyfill-tests\";\nexport * from \"./sizeClasses\";\nexport * from \"./spaceDelimitedList\";\n"],"names":[],"mappings":"AAAA,cAAc,cAAc;AAC5B,cAAc,oBAAoB;AAClC,cAAc,2BAA2B;AACzC,cAAc,cAAc;AAC5B,cAAc,mBAAmB;AACjC,cAAc,gBAAgB;AAC9B,cAAc,uBAAuB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const jestMockMatchMedia = (matches)=>{
|
|
2
|
+
Object.defineProperty(window, "matchMedia", {
|
|
3
|
+
writable: true,
|
|
4
|
+
configurable: true,
|
|
5
|
+
value: jest.fn().mockImplementation((query)=>({
|
|
6
|
+
matches,
|
|
7
|
+
media: query,
|
|
8
|
+
onchange: null,
|
|
9
|
+
addListener: jest.fn(),
|
|
10
|
+
removeListener: jest.fn(),
|
|
11
|
+
addEventListener: jest.fn(),
|
|
12
|
+
removeEventListener: jest.fn(),
|
|
13
|
+
dispatchEvent: jest.fn()
|
|
14
|
+
}))
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=jestMockMatchMedia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/jestMockMatchMedia.ts"],"sourcesContent":["export const jestMockMatchMedia = (matches: boolean) => {\n Object.defineProperty(window, \"matchMedia\", {\n writable: true,\n configurable: true,\n value: jest.fn().mockImplementation(query => ({\n matches,\n media: query,\n onchange: null,\n addListener: jest.fn(),\n removeListener: jest.fn(),\n addEventListener: jest.fn(),\n removeEventListener: jest.fn(),\n dispatchEvent: jest.fn(),\n })),\n });\n};\n"],"names":["jestMockMatchMedia","matches","Object","defineProperty","window","writable","configurable","value","jest","fn","mockImplementation","query","media","onchange","addListener","removeListener","addEventListener","removeEventListener","dispatchEvent"],"mappings":"AAAA,OAAO,MAAMA,qBAAqB,CAACC;IACjCC,OAAOC,cAAc,CAACC,QAAQ,cAAc;QAC1CC,UAAU;QACVC,cAAc;QACdC,OAAOC,KAAKC,EAAE,GAAGC,kBAAkB,CAACC,CAAAA,QAAU,CAAA;gBAC5CV;gBACAW,OAAOD;gBACPE,UAAU;gBACVC,aAAaN,KAAKC,EAAE;gBACpBM,gBAAgBP,KAAKC,EAAE;gBACvBO,kBAAkBR,KAAKC,EAAE;gBACzBQ,qBAAqBT,KAAKC,EAAE;gBAC5BS,eAAeV,KAAKC,EAAE;YACxB,CAAA;IACF;AACF,EAAE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { fireEvent, render, screen } from "@testing-library/react";
|
|
2
2
|
import userEvent from "@testing-library/user-event";
|
|
3
3
|
import { Accordion } from ".";
|
|
4
|
+
import { jestMockMatchMedia } from "../../utils/jestMockMatchMedia";
|
|
4
5
|
|
|
5
6
|
const CONTAINER_CLASS_NAME = "mobius/Accordion";
|
|
6
7
|
const CONTENT_CONTAINER_CLASS_NAME = "mobius/AccordionContentContainer";
|
|
@@ -10,26 +11,9 @@ const OPEN_CLASS_NAME = "--is-open";
|
|
|
10
11
|
const OPEN_TEXT = "See more";
|
|
11
12
|
const CLOSE_TEXT = "See less";
|
|
12
13
|
|
|
13
|
-
const mockMatchMedia = (matches: boolean) => {
|
|
14
|
-
Object.defineProperty(window, "matchMedia", {
|
|
15
|
-
writable: true,
|
|
16
|
-
configurable: true,
|
|
17
|
-
value: jest.fn().mockImplementation(query => ({
|
|
18
|
-
matches,
|
|
19
|
-
media: query,
|
|
20
|
-
onchange: null,
|
|
21
|
-
addListener: jest.fn(),
|
|
22
|
-
removeListener: jest.fn(),
|
|
23
|
-
addEventListener: jest.fn(),
|
|
24
|
-
removeEventListener: jest.fn(),
|
|
25
|
-
dispatchEvent: jest.fn(),
|
|
26
|
-
})),
|
|
27
|
-
});
|
|
28
|
-
};
|
|
29
|
-
|
|
30
14
|
describe("Accordion", () => {
|
|
31
15
|
beforeEach(() => {
|
|
32
|
-
|
|
16
|
+
jestMockMatchMedia(true);
|
|
33
17
|
});
|
|
34
18
|
|
|
35
19
|
it("should render without errors", () => {
|
|
@@ -234,7 +218,7 @@ describe("Accordion", () => {
|
|
|
234
218
|
|
|
235
219
|
describe("given user prefers reduced motion", () => {
|
|
236
220
|
beforeEach(() => {
|
|
237
|
-
|
|
221
|
+
jestMockMatchMedia(false);
|
|
238
222
|
});
|
|
239
223
|
|
|
240
224
|
it("runs no animations", () => {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
2
|
import { Checkbox, CheckboxProps } from ".";
|
|
3
|
-
import {
|
|
3
|
+
import { excludeControls } from "../../utils";
|
|
4
|
+
import { StoryContainer } from "../../utils/StoryContainer";
|
|
4
5
|
|
|
5
6
|
type StoryType = StoryObj<typeof Checkbox>;
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
-
import { CheckboxGroup, CheckboxGroupProps
|
|
3
|
-
import {
|
|
2
|
+
import { Checkbox, CheckboxGroup, CheckboxGroupProps } from ".";
|
|
3
|
+
import { excludeControls } from "../../utils";
|
|
4
|
+
import { StoryContainer } from "../../utils/StoryContainer";
|
|
4
5
|
|
|
5
6
|
type StoryType = StoryObj<typeof CheckboxGroup>;
|
|
6
7
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { StoryContainer } from "../../utils/StoryContainer";
|
|
2
3
|
import { Divider, DividerProps } from "./Divider";
|
|
3
|
-
import { StoryContainer } from "../../utils";
|
|
4
4
|
|
|
5
5
|
type StoryType = StoryObj<typeof Divider>;
|
|
6
6
|
|