@navikt/ds-react 6.1.0 → 6.1.1

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.
@@ -102,7 +102,7 @@ const dialog_polyfill_1 = __importStar(require("./dialog-polyfill"));
102
102
  */
103
103
  exports.Modal = (0, react_2.forwardRef)((_a, ref) => {
104
104
  var _b, _c;
105
- var { header, children, open, onBeforeClose, onCancel, closeOnBackdropClick, width, portal, className, "aria-labelledby": ariaLabelledby, style, onClick } = _a, rest = __rest(_a, ["header", "children", "open", "onBeforeClose", "onCancel", "closeOnBackdropClick", "width", "portal", "className", "aria-labelledby", "style", "onClick"]);
105
+ var { header, children, open, onBeforeClose, onCancel, closeOnBackdropClick, width, portal, className, "aria-labelledby": ariaLabelledby, style, onClick, onMouseDown } = _a, rest = __rest(_a, ["header", "children", "open", "onBeforeClose", "onCancel", "closeOnBackdropClick", "width", "portal", "className", "aria-labelledby", "style", "onClick", "onMouseDown"]);
106
106
  const modalRef = (0, react_2.useRef)(null);
107
107
  const mergedRef = (0, useMergeRefs_1.useMergeRefs)(modalRef, ref);
108
108
  const ariaLabelId = (0, hooks_1.useId)();
@@ -148,16 +148,30 @@ exports.Modal = (0, react_2.forwardRef)((_a, ref) => {
148
148
  [`navds-modal--${width}`]: isWidthPreset,
149
149
  });
150
150
  const mergedStyle = Object.assign(Object.assign({}, style), (!isWidthPreset ? { width } : {}));
151
+ const mouseClickStart = (0, react_2.useRef)({
152
+ clientX: 0,
153
+ clientY: 0,
154
+ });
155
+ const handleModalMouseDown = (event) => {
156
+ mouseClickStart.current = event;
157
+ };
158
+ const shouldHandleModalClick = closeOnBackdropClick && !dialog_polyfill_1.needPolyfill;
151
159
  /**
152
160
  * @note `closeOnBackdropClick` has issues on polyfill when nesting modals (DatePicker)
153
161
  */
154
- const handleModalClick = (event) => {
155
- if (closeOnBackdropClick &&
156
- !dialog_polyfill_1.needPolyfill &&
157
- event.target === modalRef.current &&
158
- (!onBeforeClose || onBeforeClose() !== false)) {
159
- modalRef.current.close();
162
+ const handleModalClick = (endEvent) => {
163
+ if (endEvent.target !== modalRef.current) {
164
+ return;
165
+ }
166
+ const modalRect = modalRef.current.getBoundingClientRect();
167
+ if ((0, ModalUtils_1.coordsAreInside)(mouseClickStart.current, modalRect) ||
168
+ (0, ModalUtils_1.coordsAreInside)(endEvent, modalRect)) {
169
+ return;
170
+ }
171
+ if (onBeforeClose !== undefined && onBeforeClose() === false) {
172
+ return;
160
173
  }
174
+ modalRef.current.close();
161
175
  };
162
176
  /**
163
177
  * @note onCancel fires when you press `Esc`
@@ -170,7 +184,11 @@ exports.Modal = (0, react_2.forwardRef)((_a, ref) => {
170
184
  : ariaLabelledby;
171
185
  const component = (
172
186
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions
173
- react_2.default.createElement("dialog", Object.assign({}, rest, { ref: mergedRef, className: mergedClassName, style: mergedStyle, onCancel: (0, composeEventHandlers_1.composeEventHandlers)(onCancel, handleModalCancel), onClick: (0, composeEventHandlers_1.composeEventHandlers)(onClick, handleModalClick), "aria-labelledby": mergedAriaLabelledBy }),
187
+ react_2.default.createElement("dialog", Object.assign({}, rest, { ref: mergedRef, className: mergedClassName, style: mergedStyle, onCancel: (0, composeEventHandlers_1.composeEventHandlers)(onCancel, handleModalCancel), onClick: shouldHandleModalClick
188
+ ? (0, composeEventHandlers_1.composeEventHandlers)(onClick, handleModalClick)
189
+ : onClick, onMouseDown: shouldHandleModalClick
190
+ ? (0, composeEventHandlers_1.composeEventHandlers)(onMouseDown, handleModalMouseDown)
191
+ : onMouseDown, "aria-labelledby": mergedAriaLabelledBy }),
174
192
  react_2.default.createElement(Modal_context_1.ModalContextProvider, { closeHandler: (0, ModalUtils_1.getCloseHandler)(modalRef, header, onBeforeClose), ref: modalRef },
175
193
  header && (react_2.default.createElement(ModalHeader_1.default, null,
176
194
  header.label && (react_2.default.createElement(typography_1.Detail, { className: "navds-modal__label" }, header.label)),
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../src/modal/Modal.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../src/modal/Modal.tsx"],"names":[],"mappings":"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"}
@@ -46,7 +46,7 @@ const ModalHeader = (0, react_1.forwardRef)((_a, ref) => {
46
46
  var { children, className, closeButton = true } = _a, rest = __rest(_a, ["children", "className", "closeButton"]);
47
47
  const context = (0, Modal_context_1.useModalContext)();
48
48
  return (react_1.default.createElement("div", Object.assign({}, rest, { ref: ref, className: (0, clsx_1.default)("navds-modal__header", className) }),
49
- context.closeHandler && closeButton && (react_1.default.createElement(button_1.Button, { type: "button", className: "navds-modal__button", size: "small", variant: "tertiary-neutral", onClick: context.closeHandler, icon: react_1.default.createElement(aksel_icons_1.XMarkIcon, { title: "Lukk modalvindu" }) })),
49
+ context.closeHandler && closeButton && (react_1.default.createElement(button_1.Button, { type: "button", className: "navds-modal__button", size: "small", variant: "tertiary-neutral", onClick: context.closeHandler, icon: react_1.default.createElement(aksel_icons_1.XMarkIcon, { title: "Lukk" }) })),
50
50
  children));
51
51
  });
52
52
  exports.default = ModalHeader;
@@ -1 +1 @@
1
- {"version":3,"file":"ModalHeader.js","sourceRoot":"","sources":["../../src/modal/ModalHeader.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAsB;AACtB,+CAA0C;AAC1C,qDAAgD;AAChD,sCAAmC;AACnC,mDAAkD;AAWlD,MAAM,WAAW,GAAG,IAAA,kBAAU,EAC5B,CAAC,EAAoD,EAAE,GAAG,EAAE,EAAE;QAA7D,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,OAAW,EAAN,IAAI,cAAlD,wCAAoD,CAAF;IACjD,MAAM,OAAO,GAAG,IAAA,+BAAe,GAAE,CAAC;IAElC,OAAO,CACL,uDAAS,IAAI,IAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAA,cAAE,EAAC,qBAAqB,EAAE,SAAS,CAAC;QACrE,OAAO,CAAC,YAAY,IAAI,WAAW,IAAI,CACtC,8BAAC,eAAM,IACL,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAC,OAAO,EACZ,OAAO,EAAC,kBAAkB,EAC1B,OAAO,EAAE,OAAO,CAAC,YAAY,EAC7B,IAAI,EAAE,8BAAC,uBAAS,IAAC,KAAK,EAAC,iBAAiB,GAAG,GAC3C,CACH;QACA,QAAQ,CACL,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,kBAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ModalHeader.js","sourceRoot":"","sources":["../../src/modal/ModalHeader.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAsB;AACtB,+CAA0C;AAC1C,qDAAgD;AAChD,sCAAmC;AACnC,mDAAkD;AAWlD,MAAM,WAAW,GAAG,IAAA,kBAAU,EAC5B,CAAC,EAAoD,EAAE,GAAG,EAAE,EAAE;QAA7D,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,OAAW,EAAN,IAAI,cAAlD,wCAAoD,CAAF;IACjD,MAAM,OAAO,GAAG,IAAA,+BAAe,GAAE,CAAC;IAElC,OAAO,CACL,uDAAS,IAAI,IAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAA,cAAE,EAAC,qBAAqB,EAAE,SAAS,CAAC;QACrE,OAAO,CAAC,YAAY,IAAI,WAAW,IAAI,CACtC,8BAAC,eAAM,IACL,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAC,OAAO,EACZ,OAAO,EAAC,kBAAkB,EAC1B,OAAO,EAAE,OAAO,CAAC,YAAY,EAC7B,IAAI,EAAE,8BAAC,uBAAS,IAAC,KAAK,EAAC,MAAM,GAAG,GAChC,CACH;QACA,QAAQ,CACL,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,kBAAe,WAAW,CAAC"}
@@ -1,5 +1,10 @@
1
1
  import React from "react";
2
2
  import type { ModalProps } from "./types";
3
+ export interface MouseCoordinates {
4
+ clientX: number;
5
+ clientY: number;
6
+ }
7
+ export declare const coordsAreInside: ({ clientX, clientY }: MouseCoordinates, { left, top, right, bottom }: DOMRect) => boolean;
3
8
  export declare function getCloseHandler(modalRef: React.RefObject<HTMLDialogElement>, header: ModalProps["header"], onBeforeClose: ModalProps["onBeforeClose"]): (() => false | void | undefined) | undefined;
4
9
  export declare const BODY_CLASS = "navds-modal__document-body";
5
10
  export declare function useBodyScrollLock(modalRef: React.RefObject<HTMLDialogElement>, portalNode: HTMLElement | null, isNested: boolean): void;
@@ -3,8 +3,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.useBodyScrollLock = exports.BODY_CLASS = exports.getCloseHandler = void 0;
6
+ exports.useBodyScrollLock = exports.BODY_CLASS = exports.getCloseHandler = exports.coordsAreInside = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
+ const coordsAreInside = ({ clientX, clientY }, { left, top, right, bottom }) => {
9
+ if (clientX < left || clientY < top)
10
+ return false;
11
+ if (clientX > right || clientY > bottom)
12
+ return false;
13
+ return true;
14
+ };
15
+ exports.coordsAreInside = coordsAreInside;
8
16
  function getCloseHandler(modalRef, header, onBeforeClose) {
9
17
  if (header && header.closeButton === false)
10
18
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"ModalUtils.js","sourceRoot":"","sources":["../../src/modal/ModalUtils.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,SAAgB,eAAe,CAC7B,QAA4C,EAC5C,MAA4B,EAC5B,aAA0C;IAE1C,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,GAAG,EAAE,WAAC,OAAA,aAAa,EAAE,KAAK,KAAK,KAAI,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,CAAA,EAAA,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,EAAE,WAAC,OAAA,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,EAAA,CAAC;AACzC,CAAC;AAVD,0CAUC;AAEY,QAAA,UAAU,GAAG,4BAA4B,CAAC;AAEvD,SAAgB,iBAAiB,CAC/B,QAA4C,EAC5C,UAA8B,EAC9B,QAAiB;IAEjB,eAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,QAAQ;YAAE,OAAO;QACrB,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,kEAAkE;QAChH,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAU,CAAC,CAAC,CAAC,mCAAmC;QAEvG,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;;YACzC,IAAI,MAAA,QAAQ,CAAC,OAAO,0CAAE,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAU,CAAC,CAAC;;gBAC/D,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAU,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE;YACjC,UAAU,EAAE,IAAI;YAChB,eAAe,EAAE,CAAC,MAAM,CAAC;SAC1B,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAU,CAAC,CAAC,CAAC,gDAAgD;QAC9F,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvC,CAAC;AAvBD,8CAuBC"}
1
+ {"version":3,"file":"ModalUtils.js","sourceRoot":"","sources":["../../src/modal/ModalUtils.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAQnB,MAAM,eAAe,GAAG,CAC7B,EAAE,OAAO,EAAE,OAAO,EAAoB,EACtC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAW,EACrC,EAAE;IACF,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,IAAI,OAAO,GAAG,MAAM;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAPW,QAAA,eAAe,mBAO1B;AAEF,SAAgB,eAAe,CAC7B,QAA4C,EAC5C,MAA4B,EAC5B,aAA0C;IAE1C,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,GAAG,EAAE,WAAC,OAAA,aAAa,EAAE,KAAK,KAAK,KAAI,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,CAAA,EAAA,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,EAAE,WAAC,OAAA,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,EAAA,CAAC;AACzC,CAAC;AAVD,0CAUC;AAEY,QAAA,UAAU,GAAG,4BAA4B,CAAC;AAEvD,SAAgB,iBAAiB,CAC/B,QAA4C,EAC5C,UAA8B,EAC9B,QAAiB;IAEjB,eAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,QAAQ;YAAE,OAAO;QACrB,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,kEAAkE;QAChH,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAU,CAAC,CAAC,CAAC,mCAAmC;QAEvG,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;;YACzC,IAAI,MAAA,QAAQ,CAAC,OAAO,0CAAE,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAU,CAAC,CAAC;;gBAC/D,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAU,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE;YACjC,UAAU,EAAE,IAAI;YAChB,eAAe,EAAE,CAAC,MAAM,CAAC;SAC1B,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAU,CAAC,CAAC,CAAC,gDAAgD;QAC9F,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvC,CAAC;AAvBD,8CAuBC"}
@@ -23,7 +23,7 @@ import { ModalContextProvider, useModalContext } from "./Modal.context.js";
23
23
  import ModalBody from "./ModalBody.js";
24
24
  import ModalFooter from "./ModalFooter.js";
25
25
  import ModalHeader from "./ModalHeader.js";
26
- import { getCloseHandler, useBodyScrollLock } from "./ModalUtils.js";
26
+ import { coordsAreInside, getCloseHandler, useBodyScrollLock, } from "./ModalUtils.js";
27
27
  import dialogPolyfill, { needPolyfill } from "./dialog-polyfill.js";
28
28
  /**
29
29
  * A component that displays a modal dialog.
@@ -73,7 +73,7 @@ import dialogPolyfill, { needPolyfill } from "./dialog-polyfill.js";
73
73
  */
74
74
  export const Modal = forwardRef((_a, ref) => {
75
75
  var _b, _c;
76
- var { header, children, open, onBeforeClose, onCancel, closeOnBackdropClick, width, portal, className, "aria-labelledby": ariaLabelledby, style, onClick } = _a, rest = __rest(_a, ["header", "children", "open", "onBeforeClose", "onCancel", "closeOnBackdropClick", "width", "portal", "className", "aria-labelledby", "style", "onClick"]);
76
+ var { header, children, open, onBeforeClose, onCancel, closeOnBackdropClick, width, portal, className, "aria-labelledby": ariaLabelledby, style, onClick, onMouseDown } = _a, rest = __rest(_a, ["header", "children", "open", "onBeforeClose", "onCancel", "closeOnBackdropClick", "width", "portal", "className", "aria-labelledby", "style", "onClick", "onMouseDown"]);
77
77
  const modalRef = useRef(null);
78
78
  const mergedRef = useMergeRefs(modalRef, ref);
79
79
  const ariaLabelId = useId();
@@ -119,16 +119,30 @@ export const Modal = forwardRef((_a, ref) => {
119
119
  [`navds-modal--${width}`]: isWidthPreset,
120
120
  });
121
121
  const mergedStyle = Object.assign(Object.assign({}, style), (!isWidthPreset ? { width } : {}));
122
+ const mouseClickStart = useRef({
123
+ clientX: 0,
124
+ clientY: 0,
125
+ });
126
+ const handleModalMouseDown = (event) => {
127
+ mouseClickStart.current = event;
128
+ };
129
+ const shouldHandleModalClick = closeOnBackdropClick && !needPolyfill;
122
130
  /**
123
131
  * @note `closeOnBackdropClick` has issues on polyfill when nesting modals (DatePicker)
124
132
  */
125
- const handleModalClick = (event) => {
126
- if (closeOnBackdropClick &&
127
- !needPolyfill &&
128
- event.target === modalRef.current &&
129
- (!onBeforeClose || onBeforeClose() !== false)) {
130
- modalRef.current.close();
133
+ const handleModalClick = (endEvent) => {
134
+ if (endEvent.target !== modalRef.current) {
135
+ return;
136
+ }
137
+ const modalRect = modalRef.current.getBoundingClientRect();
138
+ if (coordsAreInside(mouseClickStart.current, modalRect) ||
139
+ coordsAreInside(endEvent, modalRect)) {
140
+ return;
141
+ }
142
+ if (onBeforeClose !== undefined && onBeforeClose() === false) {
143
+ return;
131
144
  }
145
+ modalRef.current.close();
132
146
  };
133
147
  /**
134
148
  * @note onCancel fires when you press `Esc`
@@ -141,7 +155,11 @@ export const Modal = forwardRef((_a, ref) => {
141
155
  : ariaLabelledby;
142
156
  const component = (
143
157
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions
144
- React.createElement("dialog", Object.assign({}, rest, { ref: mergedRef, className: mergedClassName, style: mergedStyle, onCancel: composeEventHandlers(onCancel, handleModalCancel), onClick: composeEventHandlers(onClick, handleModalClick), "aria-labelledby": mergedAriaLabelledBy }),
158
+ React.createElement("dialog", Object.assign({}, rest, { ref: mergedRef, className: mergedClassName, style: mergedStyle, onCancel: composeEventHandlers(onCancel, handleModalCancel), onClick: shouldHandleModalClick
159
+ ? composeEventHandlers(onClick, handleModalClick)
160
+ : onClick, onMouseDown: shouldHandleModalClick
161
+ ? composeEventHandlers(onMouseDown, handleModalMouseDown)
162
+ : onMouseDown, "aria-labelledby": mergedAriaLabelledBy }),
145
163
  React.createElement(ModalContextProvider, { closeHandler: getCloseHandler(modalRef, header, onBeforeClose), ref: modalRef },
146
164
  header && (React.createElement(ModalHeader, null,
147
165
  header.label && (React.createElement(Detail, { className: "navds-modal__label" }, header.label)),
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../src/modal/Modal.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../src/modal/Modal.tsx"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ const ModalHeader = forwardRef((_a, ref) => {
18
18
  var { children, className, closeButton = true } = _a, rest = __rest(_a, ["children", "className", "closeButton"]);
19
19
  const context = useModalContext();
20
20
  return (React.createElement("div", Object.assign({}, rest, { ref: ref, className: cl("navds-modal__header", className) }),
21
- context.closeHandler && closeButton && (React.createElement(Button, { type: "button", className: "navds-modal__button", size: "small", variant: "tertiary-neutral", onClick: context.closeHandler, icon: React.createElement(XMarkIcon, { title: "Lukk modalvindu" }) })),
21
+ context.closeHandler && closeButton && (React.createElement(Button, { type: "button", className: "navds-modal__button", size: "small", variant: "tertiary-neutral", onClick: context.closeHandler, icon: React.createElement(XMarkIcon, { title: "Lukk" }) })),
22
22
  children));
23
23
  });
24
24
  export default ModalHeader;
@@ -1 +1 @@
1
- {"version":3,"file":"ModalHeader.js","sourceRoot":"","sources":["../../src/modal/ModalHeader.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAWlD,MAAM,WAAW,GAAG,UAAU,CAC5B,CAAC,EAAoD,EAAE,GAAG,EAAE,EAAE;QAA7D,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,OAAW,EAAN,IAAI,cAAlD,wCAAoD,CAAF;IACjD,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAElC,OAAO,CACL,6CAAS,IAAI,IAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC;QACrE,OAAO,CAAC,YAAY,IAAI,WAAW,IAAI,CACtC,oBAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAC,OAAO,EACZ,OAAO,EAAC,kBAAkB,EAC1B,OAAO,EAAE,OAAO,CAAC,YAAY,EAC7B,IAAI,EAAE,oBAAC,SAAS,IAAC,KAAK,EAAC,iBAAiB,GAAG,GAC3C,CACH;QACA,QAAQ,CACL,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ModalHeader.js","sourceRoot":"","sources":["../../src/modal/ModalHeader.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAWlD,MAAM,WAAW,GAAG,UAAU,CAC5B,CAAC,EAAoD,EAAE,GAAG,EAAE,EAAE;QAA7D,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,OAAW,EAAN,IAAI,cAAlD,wCAAoD,CAAF;IACjD,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAElC,OAAO,CACL,6CAAS,IAAI,IAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC;QACrE,OAAO,CAAC,YAAY,IAAI,WAAW,IAAI,CACtC,oBAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAC,OAAO,EACZ,OAAO,EAAC,kBAAkB,EAC1B,OAAO,EAAE,OAAO,CAAC,YAAY,EAC7B,IAAI,EAAE,oBAAC,SAAS,IAAC,KAAK,EAAC,MAAM,GAAG,GAChC,CACH;QACA,QAAQ,CACL,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1,5 +1,10 @@
1
1
  import React from "react";
2
2
  import type { ModalProps } from "./types.js";
3
+ export interface MouseCoordinates {
4
+ clientX: number;
5
+ clientY: number;
6
+ }
7
+ export declare const coordsAreInside: ({ clientX, clientY }: MouseCoordinates, { left, top, right, bottom }: DOMRect) => boolean;
3
8
  export declare function getCloseHandler(modalRef: React.RefObject<HTMLDialogElement>, header: ModalProps["header"], onBeforeClose: ModalProps["onBeforeClose"]): (() => false | void | undefined) | undefined;
4
9
  export declare const BODY_CLASS = "navds-modal__document-body";
5
10
  export declare function useBodyScrollLock(modalRef: React.RefObject<HTMLDialogElement>, portalNode: HTMLElement | null, isNested: boolean): void;
@@ -1,4 +1,11 @@
1
1
  import React from "react";
2
+ export const coordsAreInside = ({ clientX, clientY }, { left, top, right, bottom }) => {
3
+ if (clientX < left || clientY < top)
4
+ return false;
5
+ if (clientX > right || clientY > bottom)
6
+ return false;
7
+ return true;
8
+ };
2
9
  export function getCloseHandler(modalRef, header, onBeforeClose) {
3
10
  if (header && header.closeButton === false)
4
11
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"ModalUtils.js","sourceRoot":"","sources":["../../src/modal/ModalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,UAAU,eAAe,CAC7B,QAA4C,EAC5C,MAA4B,EAC5B,aAA0C;IAE1C,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,GAAG,EAAE,WAAC,OAAA,aAAa,EAAE,KAAK,KAAK,KAAI,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,CAAA,EAAA,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,EAAE,WAAC,OAAA,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,EAAA,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,4BAA4B,CAAC;AAEvD,MAAM,UAAU,iBAAiB,CAC/B,QAA4C,EAC5C,UAA8B,EAC9B,QAAiB;IAEjB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,QAAQ;YAAE,OAAO;QACrB,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,kEAAkE;QAChH,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,mCAAmC;QAEvG,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;;YACzC,IAAI,MAAA,QAAQ,CAAC,OAAO,0CAAE,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;;gBAC/D,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE;YACjC,UAAU,EAAE,IAAI;YAChB,eAAe,EAAE,CAAC,MAAM,CAAC;SAC1B,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,gDAAgD;QAC9F,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"ModalUtils.js","sourceRoot":"","sources":["../../src/modal/ModalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,EAAE,OAAO,EAAE,OAAO,EAAoB,EACtC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAW,EACrC,EAAE;IACF,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,IAAI,OAAO,GAAG,MAAM;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,QAA4C,EAC5C,MAA4B,EAC5B,aAA0C;IAE1C,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,GAAG,EAAE,WAAC,OAAA,aAAa,EAAE,KAAK,KAAK,KAAI,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,CAAA,EAAA,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,EAAE,WAAC,OAAA,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,EAAA,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,4BAA4B,CAAC;AAEvD,MAAM,UAAU,iBAAiB,CAC/B,QAA4C,EAC5C,UAA8B,EAC9B,QAAiB;IAEjB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,QAAQ;YAAE,OAAO;QACrB,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,kEAAkE;QAChH,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,mCAAmC;QAEvG,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;;YACzC,IAAI,MAAA,QAAQ,CAAC,OAAO,0CAAE,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;;gBAC/D,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE;YACjC,UAAU,EAAE,IAAI;YAChB,eAAe,EAAE,CAAC,MAAM,CAAC;SAC1B,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,gDAAgD;QAC9F,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@navikt/ds-react",
3
- "version": "6.1.0",
3
+ "version": "6.1.1",
4
4
  "description": "React components from the Norwegian Labour and Welfare Administration.",
5
5
  "author": "Aksel, a team part of the Norwegian Labour and Welfare Administration.",
6
6
  "license": "MIT",
@@ -552,8 +552,8 @@
552
552
  },
553
553
  "dependencies": {
554
554
  "@floating-ui/react": "0.25.4",
555
- "@navikt/aksel-icons": "^6.1.0",
556
- "@navikt/ds-tokens": "^6.1.0",
555
+ "@navikt/aksel-icons": "^6.1.1",
556
+ "@navikt/ds-tokens": "^6.1.1",
557
557
  "@radix-ui/react-tabs": "1.0.0",
558
558
  "@radix-ui/react-toggle-group": "1.0.0",
559
559
  "clsx": "^2.1.0",
@@ -567,7 +567,6 @@
567
567
  "@testing-library/user-event": "^14.2.0",
568
568
  "@types/faker": "5.5.8",
569
569
  "concurrently": "7.2.1",
570
- "copyfiles": "^2.4.1",
571
570
  "faker": "5.5.3",
572
571
  "fast-glob": "3.2.11",
573
572
  "jsdom": "24.0.0",
@@ -1,15 +1,22 @@
1
+ import { Meta } from "@storybook/react";
1
2
  import React from "react";
2
3
  import { PlusCircleFillIcon } from "@navikt/aksel-icons";
3
4
  import { Alert } from "../../alert";
4
5
  import { ConfirmationPanel } from "../../form/confirmation-panel";
6
+ import { Box } from "../../layout/box";
7
+ import { VStack } from "../../layout/stack";
5
8
  import { BodyLong } from "../../typography";
6
9
  import Link from "../Link";
7
10
  import { RandomIcon } from "./RandomIcon";
8
11
 
9
- export default {
12
+ const meta: Meta<typeof Link> = {
10
13
  title: "ds-react/Link",
11
14
  component: Link,
15
+ parameters: {
16
+ chromatic: { disable: true },
17
+ },
12
18
  };
19
+ export default meta;
13
20
 
14
21
  const LinkWrapper = ({
15
22
  children = "Ex aliqua incididunt",
@@ -27,53 +34,38 @@ const LinkWrapper = ({
27
34
  variant={variant as "action" | "neutral" | "subtle"}
28
35
  inlineText={inlineText}
29
36
  >
30
- {iconLeft && (
31
- <>
32
- <RandomIcon />{" "}
33
- </>
34
- )}
37
+ {iconLeft && <RandomIcon />}
35
38
  {children}
36
- {iconRight && (
37
- <>
38
- {" "}
39
- <RandomIcon />
40
- </>
41
- )}
39
+ {iconRight && <RandomIcon />}
42
40
  </Link>{" "}
43
41
  </>
44
42
  );
45
43
 
46
44
  export const Default = {
47
- render: ({ icon, inline }) => {
45
+ render: ({ icon, inline, underline }) => {
48
46
  const LinkD = () => (
49
- <>
50
- {" "}
51
- <Link href="#" underline={!inline} inlineText={inline}>
52
- {icon && <PlusCircleFillIcon />}Ex aliqua incididunt
53
- {icon && <PlusCircleFillIcon />}
54
- </Link>{" "}
55
- </>
47
+ <Link href="#" underline={underline} inlineText={inline}>
48
+ {icon && <PlusCircleFillIcon />}Ex aliqua incididunt
49
+ {icon && <PlusCircleFillIcon />}
50
+ </Link>
56
51
  );
57
52
 
58
53
  if (inline) {
59
54
  return (
60
- <div
61
- className="colgap"
62
- style={{
63
- width: "800px",
64
- border: "1px solid black",
65
- borderRadius: "8px",
66
- }}
55
+ <Box
56
+ borderWidth="1"
57
+ borderRadius="large"
58
+ padding="4"
59
+ style={{ maxWidth: "800px" }}
67
60
  >
68
61
  <BodyLong>
69
- Incididunt laborum nisi nisi Lorem
70
- <LinkD />
71
- in. Laborum aute fugiat officia adipisicing non veniam dolor nulla
72
- non ex consectetur fugiat eiusmod aute. Culpa sit aute est duis
73
- minim in in voluptate velit fugiat. Laboris est id deserunt ut ea
74
- Lorem eu. Esse elit laboris aute commodo sint laborum fugiat aliqua.
62
+ Incididunt laborum nisi nisi Lorem <LinkD /> in. Laborum aute fugiat
63
+ officia adipisicing non veniam dolor nulla non ex consectetur fugiat
64
+ eiusmod aute. Culpa sit aute est duis minim in in voluptate velit
65
+ fugiat. Laboris est id deserunt ut ea Lorem eu. Esse elit laboris
66
+ aute commodo sint laborum fugiat aliqua.
75
67
  </BodyLong>
76
- </div>
68
+ </Box>
77
69
  );
78
70
  }
79
71
  return <LinkD />;
@@ -82,22 +74,21 @@ export const Default = {
82
74
  args: {
83
75
  icon: false,
84
76
  inline: false,
77
+ underline: true,
85
78
  },
86
79
  };
87
80
 
88
81
  export const InlineInsideBodyLong = {
89
82
  render: ({ iconLeft, iconRight }) => {
90
83
  return (
91
- <div
92
- className="colgap"
93
- style={{
94
- width: "800px",
95
- border: "1px solid black",
96
- borderRadius: "8px",
97
- }}
84
+ <Box
85
+ borderWidth="1"
86
+ borderRadius="large"
87
+ padding="4"
88
+ style={{ width: "800px" }}
98
89
  >
99
90
  <style>{`.storybook-custom-spacing { white-space: pre;}`}</style>
100
- <BodyLong>
91
+ <BodyLong spacing>
101
92
  <LinkWrapper underline iconLeft={iconLeft} iconRight={iconRight} />
102
93
  Eiusmod aute.
103
94
  <LinkWrapper underline iconLeft={iconLeft} iconRight={iconRight} />
@@ -119,7 +110,7 @@ export const InlineInsideBodyLong = {
119
110
  </LinkWrapper>
120
111
  {" "}spacing.
121
112
  </BodyLong>
122
- </div>
113
+ </Box>
123
114
  );
124
115
  },
125
116
  args: {
@@ -128,86 +119,186 @@ export const InlineInsideBodyLong = {
128
119
  },
129
120
  };
130
121
 
131
- const DemoLink = () => (
122
+ export const Varianter = {
123
+ render: ({ iconLeft, iconRight }) => {
124
+ return (
125
+ <VStack gap="3">
126
+ {["action", "neutral", "subtle"].map((variant) => (
127
+ <div key={variant}>
128
+ <LinkWrapper
129
+ iconLeft={iconLeft}
130
+ iconRight={iconRight}
131
+ variant={variant}
132
+ />
133
+ </div>
134
+ ))}
135
+ </VStack>
136
+ );
137
+ },
138
+ args: {
139
+ iconLeft: false,
140
+ iconRight: false,
141
+ },
142
+ };
143
+
144
+ const LinkWithIcon = () => (
132
145
  <Link href="#">
133
- <PlusCircleFillIcon aria-hidden /> Ex aliqua incididunt{" "}
146
+ <PlusCircleFillIcon aria-hidden />
147
+ Ex aliqua incididunt
134
148
  <PlusCircleFillIcon aria-hidden />
135
149
  </Link>
136
150
  );
137
151
 
138
- export const Icon = () => <DemoLink />;
152
+ export const Icon = () => <LinkWithIcon />;
153
+
154
+ const Variants = () => (
155
+ <VStack gap="3">
156
+ {["action", "neutral", "subtle"].map((variant) => (
157
+ <div key={variant}>
158
+ <LinkWrapper variant={variant} />
159
+ </div>
160
+ ))}
161
+ </VStack>
162
+ );
139
163
 
140
- export const InAlert = () => {
141
- return (
164
+ export const Chromatic = () => (
165
+ <>
166
+ <h2>Default</h2>
167
+ <Link href="#">Ex aliqua incididunt</Link>
168
+
169
+ <h2>With icon</h2>
170
+ <LinkWithIcon />
171
+
172
+ <h2>Variants (no underline)</h2>
173
+ <Variants />
174
+
175
+ <h2>Inline</h2>
176
+ <BodyLong style={{ width: 500 }}>
177
+ Culpa sit aute est duis minim in in voluptate{" "}
178
+ <Link href="#" inlineText>
179
+ dette er en veldig lang lenke som brekker over flere linjer
180
+ <PlusCircleFillIcon aria-hidden />
181
+ </Link>{" "}
182
+ Culpa sit aute est duis minim in in voluptate velit Incididunt laborum
183
+ nisi nisi{" "}
184
+ <Link href="#" inlineText>
185
+ dette er en veldig lang lenke som brekker over flere linjer
186
+ </Link>{" "}
187
+ Lorem officia adipisicing non veniam occaecat commodo id ad aliquip.
188
+ </BodyLong>
189
+
190
+ <h2>In Alert</h2>
142
191
  <div className="colgap">
143
192
  <Alert variant="info">
144
- <DemoLink />
193
+ <LinkWithIcon />
145
194
  </Alert>
146
195
  <Alert variant="success">
147
- <DemoLink />
196
+ <LinkWithIcon />
148
197
  </Alert>
149
198
  <Alert variant="warning">
150
- <DemoLink />
199
+ <LinkWithIcon />
151
200
  </Alert>
152
201
  <Alert variant="error">
153
- <DemoLink />
202
+ <LinkWithIcon />
154
203
  </Alert>
155
204
  </div>
156
- );
157
- };
158
205
 
159
- export const InConfirmationPanel = () => {
160
- return (
206
+ <h2>In ConfirmationPanel</h2>
161
207
  <div className="colgap">
162
208
  <ConfirmationPanel label="demo">
163
- <DemoLink />
209
+ <LinkWithIcon />
164
210
  </ConfirmationPanel>
165
211
  <ConfirmationPanel checked label="demo">
166
- <DemoLink />
212
+ <LinkWithIcon />
167
213
  </ConfirmationPanel>
168
214
  <ConfirmationPanel error="demo" label="demo">
169
- <DemoLink />
215
+ <LinkWithIcon />
216
+ </ConfirmationPanel>
217
+ </div>
218
+ </>
219
+ );
220
+ Chromatic.parameters = { chromatic: { disable: false } };
221
+
222
+ export const ChromaticHover = () => (
223
+ <>
224
+ <h2>With icon</h2>
225
+ <LinkWithIcon />
226
+
227
+ <h2>Variants (no underline)</h2>
228
+ <Variants />
229
+
230
+ <h2>In Alert</h2>
231
+ <div className="colgap">
232
+ <Alert variant="info">
233
+ <LinkWithIcon />
234
+ </Alert>
235
+ </div>
236
+
237
+ <h2>In ConfirmationPanel</h2>
238
+ <div className="colgap">
239
+ <ConfirmationPanel checked label="demo">
240
+ <LinkWithIcon />
170
241
  </ConfirmationPanel>
171
242
  </div>
172
- );
243
+ </>
244
+ );
245
+ ChromaticHover.parameters = {
246
+ chromatic: { disable: false },
247
+ pseudo: { hover: true },
173
248
  };
174
249
 
175
- export const Variants = {
176
- render: ({ iconLeft, iconRight }) => {
177
- return (
178
- <div className="colgap">
179
- {["action", "neutral", "subtle"].map((variant) => (
180
- <>
181
- <div>
182
- <LinkWrapper
183
- iconLeft={iconLeft}
184
- iconRight={iconRight}
185
- variant={variant}
186
- />
187
- </div>
188
- </>
189
- ))}
190
- </div>
191
- );
192
- },
193
- args: {
194
- iconLeft: false,
195
- iconRight: false,
196
- },
250
+ export const ChromaticFocusVisible = () => (
251
+ <>
252
+ <h2>With icon</h2>
253
+ <LinkWithIcon />
254
+
255
+ <h2>Variants (no underline)</h2>
256
+ <Variants />
257
+
258
+ <h2>In Alert</h2>
259
+ <div className="colgap">
260
+ <Alert variant="info">
261
+ <LinkWithIcon />
262
+ </Alert>
263
+ </div>
264
+
265
+ <h2>In ConfirmationPanel</h2>
266
+ <div className="colgap">
267
+ <ConfirmationPanel checked label="demo">
268
+ <LinkWithIcon />
269
+ </ConfirmationPanel>
270
+ </div>
271
+ </>
272
+ );
273
+ ChromaticFocusVisible.parameters = {
274
+ chromatic: { disable: false },
275
+ pseudo: { focusVisible: true },
197
276
  };
198
277
 
199
- export const InlineLink = {
200
- render: () => (
201
- <BodyLong>
202
- Officia incididunt Culpa sit aute est duis minim in in voluptate velit
203
- Incididunt laborum nisi nisi Lorem officia adipisicing non veniam{" "}
204
- <Link href="#" inlineText={true}>
205
- lenke til ny side
206
- <PlusCircleFillIcon aria-hidden />
207
- </Link>{" "}
208
- Culpa sit aute est duis minim in in voluptate velit Incididunt laborum
209
- nisi nisi Lorem officia adipisicing non veniam occaecat commodo id ad
210
- aliquip.
211
- </BodyLong>
212
- ),
278
+ export const ChromaticActive = () => (
279
+ <>
280
+ <h2>With icon</h2>
281
+ <LinkWithIcon />
282
+
283
+ <h2>Variants (no underline)</h2>
284
+ <Variants />
285
+
286
+ <h2>In Alert</h2>
287
+ <div className="colgap">
288
+ <Alert variant="info">
289
+ <LinkWithIcon />
290
+ </Alert>
291
+ </div>
292
+
293
+ <h2>In ConfirmationPanel</h2>
294
+ <div className="colgap">
295
+ <ConfirmationPanel checked label="demo">
296
+ <LinkWithIcon />
297
+ </ConfirmationPanel>
298
+ </div>
299
+ </>
300
+ );
301
+ ChromaticActive.parameters = {
302
+ chromatic: { disable: false },
303
+ pseudo: { active: true },
213
304
  };
@@ -12,7 +12,12 @@ import { ModalContextProvider, useModalContext } from "./Modal.context";
12
12
  import ModalBody from "./ModalBody";
13
13
  import ModalFooter from "./ModalFooter";
14
14
  import ModalHeader from "./ModalHeader";
15
- import { getCloseHandler, useBodyScrollLock } from "./ModalUtils";
15
+ import {
16
+ MouseCoordinates,
17
+ coordsAreInside,
18
+ getCloseHandler,
19
+ useBodyScrollLock,
20
+ } from "./ModalUtils";
16
21
  import dialogPolyfill, { needPolyfill } from "./dialog-polyfill";
17
22
  import { ModalProps } from "./types";
18
23
 
@@ -86,6 +91,7 @@ export const Modal = forwardRef<HTMLDialogElement, ModalProps>(
86
91
  "aria-labelledby": ariaLabelledby,
87
92
  style,
88
93
  onClick,
94
+ onMouseDown,
89
95
  ...rest
90
96
  }: ModalProps,
91
97
  ref,
@@ -146,18 +152,42 @@ export const Modal = forwardRef<HTMLDialogElement, ModalProps>(
146
152
  ...(!isWidthPreset ? { width } : {}),
147
153
  };
148
154
 
155
+ const mouseClickStart = useRef<MouseCoordinates>({
156
+ clientX: 0,
157
+ clientY: 0,
158
+ });
159
+ const handleModalMouseDown: React.MouseEventHandler<HTMLDialogElement> = (
160
+ event,
161
+ ) => {
162
+ mouseClickStart.current = event;
163
+ };
164
+
165
+ const shouldHandleModalClick = closeOnBackdropClick && !needPolyfill;
166
+
149
167
  /**
150
168
  * @note `closeOnBackdropClick` has issues on polyfill when nesting modals (DatePicker)
151
169
  */
152
- const handleModalClick = (event: React.MouseEvent<HTMLDialogElement>) => {
170
+ const handleModalClick = (
171
+ endEvent: React.MouseEvent<HTMLDialogElement>,
172
+ ) => {
173
+ if (endEvent.target !== modalRef.current) {
174
+ return;
175
+ }
176
+
177
+ const modalRect = modalRef.current.getBoundingClientRect();
178
+
153
179
  if (
154
- closeOnBackdropClick &&
155
- !needPolyfill &&
156
- event.target === modalRef.current &&
157
- (!onBeforeClose || onBeforeClose() !== false)
180
+ coordsAreInside(mouseClickStart.current, modalRect) ||
181
+ coordsAreInside(endEvent, modalRect)
158
182
  ) {
159
- modalRef.current.close();
183
+ return;
184
+ }
185
+
186
+ if (onBeforeClose !== undefined && onBeforeClose() === false) {
187
+ return;
160
188
  }
189
+
190
+ modalRef.current.close();
161
191
  };
162
192
 
163
193
  /**
@@ -182,7 +212,16 @@ export const Modal = forwardRef<HTMLDialogElement, ModalProps>(
182
212
  className={mergedClassName}
183
213
  style={mergedStyle}
184
214
  onCancel={composeEventHandlers(onCancel, handleModalCancel)}
185
- onClick={composeEventHandlers(onClick, handleModalClick)}
215
+ onClick={
216
+ shouldHandleModalClick
217
+ ? composeEventHandlers(onClick, handleModalClick)
218
+ : onClick
219
+ }
220
+ onMouseDown={
221
+ shouldHandleModalClick
222
+ ? composeEventHandlers(onMouseDown, handleModalMouseDown)
223
+ : onMouseDown
224
+ }
186
225
  aria-labelledby={mergedAriaLabelledBy}
187
226
  >
188
227
  <ModalContextProvider
@@ -26,7 +26,7 @@ const ModalHeader = forwardRef<HTMLDivElement, ModalHeaderProps>(
26
26
  size="small"
27
27
  variant="tertiary-neutral"
28
28
  onClick={context.closeHandler}
29
- icon={<XMarkIcon title="Lukk modalvindu" />}
29
+ icon={<XMarkIcon title="Lukk" />}
30
30
  />
31
31
  )}
32
32
  {children}
@@ -1,6 +1,20 @@
1
1
  import React from "react";
2
2
  import type { ModalProps } from "./types";
3
3
 
4
+ export interface MouseCoordinates {
5
+ clientX: number;
6
+ clientY: number;
7
+ }
8
+
9
+ export const coordsAreInside = (
10
+ { clientX, clientY }: MouseCoordinates,
11
+ { left, top, right, bottom }: DOMRect,
12
+ ) => {
13
+ if (clientX < left || clientY < top) return false;
14
+ if (clientX > right || clientY > bottom) return false;
15
+ return true;
16
+ };
17
+
4
18
  export function getCloseHandler(
5
19
  modalRef: React.RefObject<HTMLDialogElement>,
6
20
  header: ModalProps["header"],