@navikt/ds-react 4.12.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/_docs.json +101 -127
  2. package/cjs/date/datepicker/DatePicker.js +1 -1
  3. package/cjs/date/hooks/useEscape.js +6 -1
  4. package/cjs/modal/Modal.js +85 -46
  5. package/cjs/modal/{ModalContent.js → ModalBody.js} +3 -3
  6. package/cjs/modal/ModalContext.js +8 -0
  7. package/cjs/modal/ModalFooter.js +46 -0
  8. package/cjs/modal/ModalHeader.js +56 -0
  9. package/cjs/modal/ModalUtils.js +40 -0
  10. package/cjs/modal/dialog-polyfill.js +833 -0
  11. package/cjs/popover/Popover.js +5 -2
  12. package/cjs/table/DataCell.js +1 -3
  13. package/cjs/table/ExpandableRow.js +2 -1
  14. package/cjs/table/HeaderCell.js +1 -4
  15. package/cjs/table/Table.js +1 -1
  16. package/esm/date/datepicker/DatePicker.d.ts +2 -2
  17. package/esm/date/datepicker/DatePicker.js +1 -1
  18. package/esm/date/datepicker/DatePicker.js.map +1 -1
  19. package/esm/date/hooks/useEscape.d.ts +2 -1
  20. package/esm/date/hooks/useEscape.js +6 -1
  21. package/esm/date/hooks/useEscape.js.map +1 -1
  22. package/esm/modal/Modal.d.ts +76 -51
  23. package/esm/modal/Modal.js +87 -48
  24. package/esm/modal/Modal.js.map +1 -1
  25. package/esm/modal/ModalBody.d.ts +6 -0
  26. package/esm/modal/{ModalContent.js → ModalBody.js} +4 -4
  27. package/esm/modal/ModalBody.js.map +1 -0
  28. package/esm/modal/ModalContext.d.ts +6 -0
  29. package/esm/modal/ModalContext.js +3 -0
  30. package/esm/modal/ModalContext.js.map +1 -0
  31. package/esm/modal/ModalFooter.d.ts +6 -0
  32. package/esm/modal/ModalFooter.js +19 -0
  33. package/esm/modal/ModalFooter.js.map +1 -0
  34. package/esm/modal/ModalHeader.d.ts +11 -0
  35. package/esm/modal/ModalHeader.js +29 -0
  36. package/esm/modal/ModalHeader.js.map +1 -0
  37. package/esm/modal/ModalUtils.d.ts +4 -0
  38. package/esm/modal/ModalUtils.js +33 -0
  39. package/esm/modal/ModalUtils.js.map +1 -0
  40. package/esm/modal/dialog-polyfill.d.ts +5 -0
  41. package/esm/modal/dialog-polyfill.js +832 -0
  42. package/esm/modal/dialog-polyfill.js.map +1 -0
  43. package/esm/modal/index.d.ts +3 -1
  44. package/esm/popover/Popover.js +6 -3
  45. package/esm/popover/Popover.js.map +1 -1
  46. package/esm/provider/Provider.d.ts +1 -6
  47. package/esm/provider/Provider.js.map +1 -1
  48. package/esm/table/DataCell.js +2 -4
  49. package/esm/table/DataCell.js.map +1 -1
  50. package/esm/table/ExpandableRow.js +2 -1
  51. package/esm/table/ExpandableRow.js.map +1 -1
  52. package/esm/table/HeaderCell.js +1 -4
  53. package/esm/table/HeaderCell.js.map +1 -1
  54. package/esm/table/Table.d.ts +2 -3
  55. package/esm/table/Table.js +1 -1
  56. package/esm/table/Table.js.map +1 -1
  57. package/package.json +3 -5
  58. package/src/date/datepicker/DatePicker.tsx +3 -3
  59. package/src/date/hooks/useEscape.tsx +8 -3
  60. package/src/modal/Modal.tsx +171 -121
  61. package/src/modal/ModalBody.tsx +14 -0
  62. package/src/modal/ModalContext.ts +6 -0
  63. package/src/modal/ModalFooter.tsx +14 -0
  64. package/src/modal/ModalHeader.tsx +42 -0
  65. package/src/modal/ModalUtils.ts +37 -0
  66. package/src/modal/dialog-polyfill.ts +980 -0
  67. package/src/modal/index.ts +3 -1
  68. package/src/modal/modal.stories.tsx +142 -59
  69. package/src/popover/Popover.tsx +6 -2
  70. package/src/provider/Provider.tsx +1 -6
  71. package/src/table/DataCell.tsx +1 -5
  72. package/src/table/ExpandableRow.tsx +2 -1
  73. package/src/table/HeaderCell.tsx +1 -5
  74. package/src/table/Table.tsx +3 -4
  75. package/src/table/stories/table-expandable.stories.tsx +37 -1
  76. package/src/table/stories/table.stories.tsx +4 -1
  77. package/esm/modal/ModalContent.d.ts +0 -10
  78. package/esm/modal/ModalContent.js.map +0 -1
  79. package/src/modal/ModalContent.tsx +0 -26
@@ -44,6 +44,7 @@ const react_2 = __importStar(require("react"));
44
44
  const __1 = require("..");
45
45
  const util_1 = require("../util");
46
46
  const PopoverContent_1 = __importDefault(require("./PopoverContent"));
47
+ const ModalContext_1 = require("../modal/ModalContext");
47
48
  /**
48
49
  * A component that displays a popover.
49
50
  *
@@ -65,10 +66,12 @@ const PopoverContent_1 = __importDefault(require("./PopoverContent"));
65
66
  * ```
66
67
  */
67
68
  exports.Popover = (0, react_2.forwardRef)((_a, ref) => {
68
- var { className, children, anchorEl, arrow = true, open, onClose, placement = "top", offset, strategy: userStrategy = "absolute", bubbleEscape = false } = _a, rest = __rest(_a, ["className", "children", "anchorEl", "arrow", "open", "onClose", "placement", "offset", "strategy", "bubbleEscape"]);
69
+ var { className, children, anchorEl, arrow = true, open, onClose, placement = "top", offset, strategy: userStrategy, bubbleEscape = false } = _a, rest = __rest(_a, ["className", "children", "anchorEl", "arrow", "open", "onClose", "placement", "offset", "strategy", "bubbleEscape"]);
69
70
  const arrowRef = (0, react_2.useRef)(null);
71
+ const isInModal = (0, react_2.useContext)(ModalContext_1.ModalContext) !== null;
72
+ const chosenStrategy = userStrategy !== null && userStrategy !== void 0 ? userStrategy : (isInModal ? "fixed" : "absolute");
70
73
  const { x, y, strategy, context, update, refs, placement: flPlacement, middlewareData: { arrow: { x: arrowX, y: arrowY } = {} }, } = (0, react_1.useFloating)({
71
- strategy: userStrategy,
74
+ strategy: chosenStrategy,
72
75
  placement,
73
76
  open: open,
74
77
  onOpenChange: onClose,
@@ -41,12 +41,10 @@ exports.DataCell = void 0;
41
41
  const react_1 = __importStar(require("react"));
42
42
  const clsx_1 = __importDefault(require("clsx"));
43
43
  const __1 = require("..");
44
- const Table_1 = require("./Table");
45
44
  exports.DataCell = (0, react_1.forwardRef)((_a, ref) => {
46
45
  var { className, children = "", align } = _a, rest = __rest(_a, ["className", "children", "align"]);
47
- const context = (0, react_1.useContext)(Table_1.TableContext);
48
46
  return (react_1.default.createElement(__1.BodyShort, Object.assign({ as: "td", ref: ref, className: (0, clsx_1.default)("navds-table__data-cell", className, {
49
47
  [`navds-table__data-cell--align-${align}`]: align,
50
- }), size: context === null || context === void 0 ? void 0 : context.size }, rest), children));
48
+ }) }, rest), children));
51
49
  });
52
50
  exports.default = exports.DataCell;
@@ -66,6 +66,7 @@ exports.ExpandableRow = (0, react_1.forwardRef)((_a, ref) => {
66
66
  react_1.default.createElement(Row_1.default, Object.assign({}, rest, { ref: ref, className: (0, clsx_1.default)("navds-table__expandable-row", className, {
67
67
  "navds-table__expandable-row--open": isOpen,
68
68
  "navds-table__expandable-row--expansion-disabled": expansionDisabled,
69
+ "navds-table__expandable-row--clickable": expandOnRowClick,
69
70
  }), onClick: (e) => {
70
71
  var _a;
71
72
  !expansionDisabled && expandOnRowClick && onRowClick(e);
@@ -74,7 +75,7 @@ exports.ExpandableRow = (0, react_1.forwardRef)((_a, ref) => {
74
75
  togglePlacement === "right" && children,
75
76
  react_1.default.createElement(DataCell_1.default, { className: (0, clsx_1.default)("navds-table__toggle-expand-cell", {
76
77
  "navds-table__toggle-expand-cell--open": isOpen,
77
- }) }, !expansionDisabled && (react_1.default.createElement("button", { type: "button", className: "navds-table__toggle-expand-button", "aria-controls": id, "aria-expanded": isOpen, onClick: expansionHandler },
78
+ }) }, !expansionDisabled && (react_1.default.createElement("button", { className: "navds-table__toggle-expand-button", type: "button", "aria-controls": id, "aria-expanded": isOpen, onClick: expansionHandler },
78
79
  react_1.default.createElement(aksel_icons_1.ChevronDownIcon, { className: "navds-table__expandable-icon", title: isOpen ? "Vis mindre" : "Vis mer" })))),
79
80
  togglePlacement === "left" && children),
80
81
  react_1.default.createElement("tr", { className: "navds-table__expanded-row", "aria-hidden": !isOpen, id: id },
@@ -38,15 +38,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  };
39
39
  Object.defineProperty(exports, "__esModule", { value: true });
40
40
  exports.HeaderCell = void 0;
41
- const react_1 = __importStar(require("react"));
42
41
  const clsx_1 = __importDefault(require("clsx"));
43
- const Table_1 = require("./Table");
42
+ const react_1 = __importStar(require("react"));
44
43
  exports.HeaderCell = (0, react_1.forwardRef)((_a, ref) => {
45
44
  var { className, children, align } = _a, rest = __rest(_a, ["className", "children", "align"]);
46
- const context = (0, react_1.useContext)(Table_1.TableContext);
47
45
  return (react_1.default.createElement("th", Object.assign({ ref: ref, className: (0, clsx_1.default)("navds-table__header-cell", "navds-label", className, {
48
46
  [`navds-table__header-cell--align-${align}`]: align,
49
- "navds-label--small": (context === null || context === void 0 ? void 0 : context.size) === "small",
50
47
  }) }, rest), children));
51
48
  });
52
49
  exports.default = exports.HeaderCell;
@@ -82,7 +82,7 @@ exports.TableContext = (0, react_1.createContext)(null);
82
82
  */
83
83
  exports.Table = (0, react_1.forwardRef)((_a, ref) => {
84
84
  var { className, zebraStripes = false, size = "medium", onSortChange, sort } = _a, rest = __rest(_a, ["className", "zebraStripes", "size", "onSortChange", "sort"]);
85
- return (react_1.default.createElement(exports.TableContext.Provider, { value: { size, onSortChange, sort } },
85
+ return (react_1.default.createElement(exports.TableContext.Provider, { value: { onSortChange, sort } },
86
86
  react_1.default.createElement("table", Object.assign({}, rest, { ref: ref, className: (0, clsx_1.default)("navds-table", `navds-table--${size}`, className, {
87
87
  "navds-table--zebra-stripes": zebraStripes,
88
88
  }) }))));
@@ -82,9 +82,9 @@ export interface DatePickerDefaultProps extends Omit<React.HTMLAttributes<HTMLDi
82
82
  onOpenToggle?: () => void;
83
83
  /**
84
84
  * Avoid using if possible!
85
- * Changes what CSS position property to use
85
+ * Changes what CSS position property to use.
86
86
  * You want to use "fixed" if parent wrapper has position relative, but you want popover to escape
87
- * @default "absolute"
87
+ * @default See Popover
88
88
  */
89
89
  strategy?: "absolute" | "fixed";
90
90
  /**
@@ -45,7 +45,7 @@ import { TableHead } from "./TableHead";
45
45
  */
46
46
  export const DatePicker = forwardRef((_a, ref) => {
47
47
  var _b;
48
- var { children, locale = "nb", dropdownCaption, disabled = [], disableWeekends = false, showWeekNumber = false, selected, id, defaultSelected, className, wrapperClassName, open: _open, onClose, onOpenToggle, strategy = "absolute", bubbleEscape = false } = _a, rest = __rest(_a, ["children", "locale", "dropdownCaption", "disabled", "disableWeekends", "showWeekNumber", "selected", "id", "defaultSelected", "className", "wrapperClassName", "open", "onClose", "onOpenToggle", "strategy", "bubbleEscape"]);
48
+ var { children, locale = "nb", dropdownCaption, disabled = [], disableWeekends = false, showWeekNumber = false, selected, id, defaultSelected, className, wrapperClassName, open: _open, onClose, onOpenToggle, strategy, bubbleEscape = false } = _a, rest = __rest(_a, ["children", "locale", "dropdownCaption", "disabled", "disableWeekends", "showWeekNumber", "selected", "id", "defaultSelected", "className", "wrapperClassName", "open", "onClose", "onOpenToggle", "strategy", "bubbleEscape"]);
49
49
  const ariaId = useId(id);
50
50
  const [open, setOpen] = useState(_open !== null && _open !== void 0 ? _open : false);
51
51
  const wrapperRef = useRef(null);
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../src/date/datepicker/DatePicker.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../src/date/datepicker/DatePicker.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAEL,SAAS,EAET,OAAO,GAKR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAkB,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,oBAEN,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA6HxC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAClC,CACE,EAkBC,EACD,GAAG,EACH,EAAE;;QApBF,EACE,QAAQ,EACR,MAAM,GAAG,IAAI,EACb,eAAe,EACf,QAAQ,GAAG,EAAE,EACb,eAAe,GAAG,KAAK,EACvB,cAAc,GAAG,KAAK,EACtB,QAAQ,EACR,EAAE,EACF,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,IAAI,EAAE,KAAK,EACX,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,YAAY,GAAG,KAAK,OAErB,EADI,IAAI,cAjBT,+NAkBC,CADQ;IAIT,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IACzB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,KAAK,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAEvD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAEtD,eAAe,CAAC,CAAC;IAEnB,MAAM,kBAAkB,GAA6B,CAAC,WAAW,EAAE,EAAE;;QACnE,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC9B,WAAW,IAAI,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,EAAI,mCAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,KAAI,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAiC,CAAA,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAA+B,CAAC,YAAY,EAAE,EAAE;QACxE,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ;YACZ,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAmC,CAAA,CAAC,YAAY,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAA4B,CAAC,YAAY,EAAE,EAAE;;QAClE,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,MAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,EAAE,CAAA,IAAI,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,EAAI,mCAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1E,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ;YACZ,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAsC,CAAA,CAAC,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG;QACpB,IAAI,EAAE,MAAA,IAAI,CAAC,IAAI,mCAAK,QAAgB;QACpC,QAAQ,EACN,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,MAAK,QAAQ;YACrB,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,MAAK,UAAU;gBAC3B,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,iBAAiB;KACxB,CAAC;IAEF,OAAO,CACL,oBAAC,WAAW,CAAC,QAAQ,IACnB,KAAK,EAAE;YACL,IAAI,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI;YACnB,MAAM,EAAE,GAAG,EAAE;gBACX,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnB,YAAY,aAAZ,YAAY,uBAAZ,YAAY,EAAI,CAAC;YACnB,CAAC;YACD,MAAM;SACP;QAED,6BACE,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,gBAAgB,CAAC;YAErD,QAAQ;YACR,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,CAAC,IAAI,CAClB,oBAAC,OAAO,IACN,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAU,CAAC,OAAO,EAC5B,IAAI,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,EACnB,OAAO,EAAE,GAAG,EAAE;;oBACZ,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,EAAI,mCAAI,OAAO,CAAC,KAAK,CAAC,CAAC;gBAChC,CAAC,EACD,SAAS,EAAC,cAAc,EACxB,EAAE,EAAE,MAAM,EACV,IAAI,EAAC,QAAQ,EACb,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,qBAAqB,EAC/B,YAAY,EAAE,YAAY;gBAE1B,oBAAC,SAAS,kBACR,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC,IAC/B,aAAa,IACjB,QAAQ,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,aAAa,EACnC,UAAU,EAAE;wBACV,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO;wBACpD,GAAG,EAAE,SAAS;wBACd,IAAI,EAAE,SAAS;qBAChB,EACD,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,EACtC,UAAU,EAAE;wBACV,OAAO,EAAE,eAAe;qBACzB,EACD,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;wBAChB,OAAO,CACL,CAAC,eAAe,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;4BACnC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CACvB,CAAC;oBACJ,CAAC,EACD,YAAY,EAAE,CAAC,EACf,YAAY,EAAE,KAAK,EACnB,MAAM,EAAE,MAAa,EACrB,SAAS,EAAE;wBACT,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,IAAI,SAAS,CAAC,GAAG,CAAC;qBACpD,EACD,mBAAmB,EAAE;wBACnB,OAAO,EAAE,kBAAkB;qBAC5B,EACD,cAAc,EAAE,cAAc,EAC9B,UAAU,QACV,eAAe,UACX,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,EAC5B,CACM,CACX,CACG,CACe,CACxB,CAAC;AACJ,CAAC,CACqB,CAAC;AAEzB,UAAU,CAAC,UAAU,GAAG,oBAAoB,CAAC;AAC7C,UAAU,CAAC,KAAK,GAAG,eAAe,CAAC;AAEnC,eAAe,UAAU,CAAC"}
@@ -1 +1,2 @@
1
- export declare const useEscape: (open: boolean, setOpen: (openState: boolean) => void, focusRef: any) => void;
1
+ import { RefObject } from "react";
2
+ export declare const useEscape: (open: boolean, setOpen: (openState: boolean) => void, focusRef: RefObject<HTMLElement>) => void;
@@ -4,7 +4,12 @@ export const useEscape = (open, setOpen, focusRef) => {
4
4
  setOpen(false);
5
5
  (focusRef === null || focusRef === void 0 ? void 0 : focusRef.current) && focusRef.current.focus();
6
6
  }, [focusRef, setOpen]);
7
- const escape = useCallback((e) => open && e.key === "Escape" && handleClose(), [handleClose, open]);
7
+ const escape = useCallback((event) => {
8
+ if (open && event.key === "Escape") {
9
+ event.preventDefault(); // This prevents modal from closing when using datepicker inside modal
10
+ handleClose();
11
+ }
12
+ }, [handleClose, open]);
8
13
  useEffect(() => {
9
14
  window.addEventListener("keydown", escape, false);
10
15
  return () => {
@@ -1 +1 @@
1
- {"version":3,"file":"useEscape.js","sourceRoot":"","sources":["../../../src/date/hooks/useEscape.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE/C,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,IAAa,EACb,OAAqC,EACrC,QAAa,EACb,EAAE;IACF,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,KAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAChD,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAExB,MAAM,MAAM,GAAG,WAAW,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,WAAW,EAAE,EAClD,CAAC,WAAW,EAAE,IAAI,CAAC,CACpB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAElD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AACf,CAAC,CAAC"}
1
+ {"version":3,"file":"useEscape.js","sourceRoot":"","sources":["../../../src/date/hooks/useEscape.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAE1D,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,IAAa,EACb,OAAqC,EACrC,QAAgC,EAChC,EAAE;IACF,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,KAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAChD,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAExB,MAAM,MAAM,GAAG,WAAW,CACxB,CAAC,KAAoB,EAAE,EAAE;QACvB,IAAI,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAClC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,sEAAsE;YAC9F,WAAW,EAAE,CAAC;SACf;IACH,CAAC,EACD,CAAC,WAAW,EAAE,IAAI,CAAC,CACpB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAElD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AACf,CAAC,CAAC"}
@@ -1,64 +1,70 @@
1
1
  import React from "react";
2
- import ReactModal from "react-modal";
3
- import { ModalContentType } from "./ModalContent";
4
- export interface ModalProps {
2
+ import ModalBody from "./ModalBody";
3
+ import ModalHeader from "./ModalHeader";
4
+ import ModalFooter from "./ModalFooter";
5
+ export interface ModalProps extends React.DialogHTMLAttributes<HTMLDialogElement> {
6
+ /**
7
+ * Content for the header. Alteratively you can use <Modal.Header> instead for more control,
8
+ * but then you have to set `aria-label` or `aria-labelledby` on the modal manually.
9
+ */
10
+ header?: {
11
+ label?: string;
12
+ icon?: React.ReactNode;
13
+ heading: string;
14
+ /**
15
+ * Heading size
16
+ * @default "medium"
17
+ * */
18
+ size?: "medium" | "small";
19
+ /**
20
+ * Removes close-button (X) when false
21
+ * @default true
22
+ */
23
+ closeButton?: boolean;
24
+ };
5
25
  /**
6
26
  * Modal content
7
27
  */
8
28
  children: React.ReactNode;
9
29
  /**
10
- * Open state for modal
30
+ * Whether the modal should be visible or not.
31
+ * Remember to use the `onClose` callback to keep your local state in sync.
32
+ * You can also use `ref.current.openModal()` and `ref.current.close()`.
11
33
  */
12
- open: boolean;
34
+ open?: boolean;
13
35
  /**
14
- * Callback for modal wanting to close
36
+ * Called when the modal has been closed
15
37
  */
16
- onClose: () => void;
38
+ onClose?: React.ReactEventHandler<HTMLDialogElement>;
17
39
  /**
18
- * If modal should close on overlay click (click outside Modal)
19
- * @default true
40
+ * Called when the user wants to close the modal (clicked the close button or pressed Esc).
41
+ * @returns Whether to close the modal
20
42
  */
21
- shouldCloseOnOverlayClick?: boolean;
43
+ onBeforeClose?: () => boolean | void;
22
44
  /**
23
- * User defined classname for modal
45
+ * Called when the user presses the Esc key, unless `onBeforeClose()` returns `false`.
24
46
  */
25
- className?: string;
47
+ onCancel?: React.ReactEventHandler<HTMLDialogElement>;
26
48
  /**
27
- * User defined classname for modal
28
- */
29
- overlayClassName?: string;
49
+ * @default fit-content (up to 700px)
50
+ * */
51
+ width?: "medium" | "small" | number | string;
30
52
  /**
31
- * Removes close-button(X) when false
32
- * @default true
33
- */
34
- closeButton?: boolean;
35
- /**
36
- *
37
- */
38
- shouldCloseOnEsc?: boolean;
39
- /**
40
- * Allows custom styling of ReactModal, in accordance with their typing
53
+ * User defined classname for modal
41
54
  */
42
- style?: ReactModal.Styles;
55
+ className?: string;
43
56
  /**
44
- * Callback for setting parent element modal will attach to
57
+ * Sets aria-labelledby on modal.
58
+ * No need to set this manually if the `header` prop is used. A reference to `header.heading` will be created automatically.
59
+ * @warning If not using `header`, you should set either `aria-labelledby` or `aria-label`.
45
60
  */
46
- parentSelector?(): HTMLElement;
47
61
  "aria-labelledby"?: string;
48
- "aria-describedby"?: string;
49
- "aria-modal"?: boolean;
50
- /**
51
- * Sets aria-label on modal
52
- * @warning This should be set if not using 'aria-labelledby' or 'aria-describedby'
53
- */
54
- "aria-label"?: string;
55
62
  }
56
- interface ModalComponent extends ModalLifecycle, React.ForwardRefExoticComponent<ModalProps & React.RefAttributes<ReactModal>> {
57
- Content: ModalContentType;
63
+ interface ModalComponent extends React.ForwardRefExoticComponent<ModalProps & React.RefAttributes<HTMLDialogElement>> {
64
+ Header: typeof ModalHeader;
65
+ Body: typeof ModalBody;
66
+ Footer: typeof ModalFooter;
58
67
  }
59
- type ModalLifecycle = {
60
- setAppElement: (element: any) => void;
61
- };
62
68
  /**
63
69
  * A component that displays a modal dialog.
64
70
  *
@@ -66,23 +72,42 @@ type ModalLifecycle = {
66
72
  * @see 🏷️ {@link ModalProps}
67
73
  *
68
74
  * @example
75
+ * State change with `useRef`
76
+ * ```jsx
77
+ * const ref = useRef<HTMLDialogElement>(null);
78
+ * <Button onClick={() => ref.current?.showModal()}>Open modal</Button>
79
+ * <Modal
80
+ * ref={ref}
81
+ * header={{
82
+ * label: "Optional label",
83
+ * icon: <FileIcon aria-hidden />,
84
+ * heading: "My heading",
85
+ * }}
86
+ * >
87
+ * <Modal.Body>
88
+ * <BodyLong>Hello world</BodyLong>
89
+ * </Modal.Body>
90
+ * <Modal.Footer>
91
+ * <Button>Save</Button>
92
+ * <Button type="button" variant="tertiary" onClick={() => ref.current?.close()}>Close</Button>
93
+ * </Modal.Footer>
94
+ * </Modal>
95
+ * ```
96
+ * @example
97
+ * State change with `useState`
69
98
  * ```jsx
70
99
  * const [open, setOpen] = useState(false);
71
- *
72
100
  * <Modal
73
101
  * open={open}
74
- * aria-label="Modal demo"
75
- * onClose={() => setOpen((x) => !x)}
102
+ * onClose={() => setOpen(false)}
76
103
  * aria-labelledby="modal-heading"
77
104
  * >
78
- * <Modal.Content>
79
- * <Heading spacing level="1" size="large" id="modal-heading">
80
- * Viktig info
81
- * </Heading>
82
- * <BodyLong spacing>
83
- * Hallo!
84
- * </BodyLong>
85
- * </Modal.Content>
105
+ * <Modal.Header>
106
+ * <Heading level="1" size="large" id="modal-heading">My heading</Heading>
107
+ * </Modal.Header>
108
+ * <Modal.Body>
109
+ * <BodyLong>Hello world</BodyLong>
110
+ * </Modal.Body>
86
111
  * </Modal>
87
112
  * ```
88
113
  */
@@ -9,12 +9,16 @@ var __rest = (this && this.__rest) || function (s, e) {
9
9
  }
10
10
  return t;
11
11
  };
12
- import React, { forwardRef, useEffect, useMemo, useRef } from "react";
12
+ import React, { forwardRef, useContext, useEffect, useMemo, useRef, } from "react";
13
13
  import cl from "clsx";
14
- import ReactModal from "react-modal";
15
- import { Button, mergeRefs, useProvider } from "..";
16
- import ModalContent from "./ModalContent";
17
- import { XMarkIcon } from "@navikt/aksel-icons";
14
+ import dialogPolyfill from "./dialog-polyfill";
15
+ import { Detail, Heading, mergeRefs, useId } from "..";
16
+ import ModalBody from "./ModalBody";
17
+ import ModalHeader from "./ModalHeader";
18
+ import ModalFooter from "./ModalFooter";
19
+ import { getCloseHandler, useBodyScrollLock } from "./ModalUtils";
20
+ import { ModalContext } from "./ModalContext";
21
+ const needPolyfill = typeof window !== "undefined" && window.HTMLDialogElement === undefined;
18
22
  /**
19
23
  * A component that displays a modal dialog.
20
24
  *
@@ -22,64 +26,99 @@ import { XMarkIcon } from "@navikt/aksel-icons";
22
26
  * @see 🏷️ {@link ModalProps}
23
27
  *
24
28
  * @example
29
+ * State change with `useRef`
30
+ * ```jsx
31
+ * const ref = useRef<HTMLDialogElement>(null);
32
+ * <Button onClick={() => ref.current?.showModal()}>Open modal</Button>
33
+ * <Modal
34
+ * ref={ref}
35
+ * header={{
36
+ * label: "Optional label",
37
+ * icon: <FileIcon aria-hidden />,
38
+ * heading: "My heading",
39
+ * }}
40
+ * >
41
+ * <Modal.Body>
42
+ * <BodyLong>Hello world</BodyLong>
43
+ * </Modal.Body>
44
+ * <Modal.Footer>
45
+ * <Button>Save</Button>
46
+ * <Button type="button" variant="tertiary" onClick={() => ref.current?.close()}>Close</Button>
47
+ * </Modal.Footer>
48
+ * </Modal>
49
+ * ```
50
+ * @example
51
+ * State change with `useState`
25
52
  * ```jsx
26
53
  * const [open, setOpen] = useState(false);
27
- *
28
54
  * <Modal
29
55
  * open={open}
30
- * aria-label="Modal demo"
31
- * onClose={() => setOpen((x) => !x)}
56
+ * onClose={() => setOpen(false)}
32
57
  * aria-labelledby="modal-heading"
33
58
  * >
34
- * <Modal.Content>
35
- * <Heading spacing level="1" size="large" id="modal-heading">
36
- * Viktig info
37
- * </Heading>
38
- * <BodyLong spacing>
39
- * Hallo!
40
- * </BodyLong>
41
- * </Modal.Content>
59
+ * <Modal.Header>
60
+ * <Heading level="1" size="large" id="modal-heading">My heading</Heading>
61
+ * </Modal.Header>
62
+ * <Modal.Body>
63
+ * <BodyLong>Hello world</BodyLong>
64
+ * </Modal.Body>
42
65
  * </Modal>
43
66
  * ```
44
67
  */
45
68
  export const Modal = forwardRef((_a, ref) => {
46
- var _b, _c;
47
- var { children, open, onClose, className, overlayClassName, shouldCloseOnOverlayClick = true, shouldCloseOnEsc = true, closeButton = true, "aria-describedby": ariaDescribedBy, "aria-labelledby": ariaLabelledBy, "aria-modal": ariaModal, "aria-label": contentLabel, style, parentSelector } = _a, rest = __rest(_a, ["children", "open", "onClose", "className", "overlayClassName", "shouldCloseOnOverlayClick", "shouldCloseOnEsc", "closeButton", "aria-describedby", "aria-labelledby", "aria-modal", "aria-label", "style", "parentSelector"]);
69
+ var _b;
70
+ var { header, children, open, onBeforeClose, onCancel, width, className, "aria-labelledby": ariaLabelledby, style } = _a, rest = __rest(_a, ["header", "children", "open", "onBeforeClose", "onCancel", "width", "className", "aria-labelledby", "style"]);
48
71
  const modalRef = useRef(null);
49
72
  const mergedRef = useMemo(() => mergeRefs([modalRef, ref]), [ref]);
50
- const buttonRef = useRef(null);
51
- const rootElement = (_b = useProvider()) === null || _b === void 0 ? void 0 : _b.rootElement;
52
- const appElement = (_c = useProvider()) === null || _c === void 0 ? void 0 : _c.appElement;
73
+ const ariaLabelId = useId();
74
+ if (useContext(ModalContext)) {
75
+ console.error("Modals should not be nested");
76
+ }
53
77
  useEffect(() => {
54
- appElement && Modal.setAppElement(appElement);
55
- }, [appElement]);
56
- const onModalCloseRequest = (e) => {
57
- if (shouldCloseOnOverlayClick || e.type === "keydown") {
58
- onClose();
78
+ if (needPolyfill && modalRef.current) {
79
+ dialogPolyfill.registerDialog(modalRef.current);
59
80
  }
60
- else if (buttonRef.current) {
61
- buttonRef.current.focus();
62
- }
63
- };
64
- const getParentSelector = () => {
65
- if (parentSelector) {
66
- return parentSelector;
81
+ }, [modalRef]);
82
+ useEffect(() => {
83
+ // We need to have this in a useEffect so that the content renders before the modal is displayed,
84
+ // and in case `open` is true initially.
85
+ if (modalRef.current && open !== undefined) {
86
+ if (open && !modalRef.current.open) {
87
+ modalRef.current.showModal();
88
+ }
89
+ else if (!open && modalRef.current.open) {
90
+ modalRef.current.close();
91
+ }
67
92
  }
68
- return rootElement !== undefined
69
- ? () => rootElement
70
- : undefined;
71
- };
72
- return (React.createElement(ReactModal, Object.assign({}, rest, { parentSelector: getParentSelector(), style: style, isOpen: open, ref: mergedRef, className: cl("navds-modal", className), overlayClassName: cl("navds-modal__overlay", overlayClassName), shouldCloseOnOverlayClick: shouldCloseOnOverlayClick, shouldCloseOnEsc: shouldCloseOnEsc, onRequestClose: (e) => onModalCloseRequest(e), aria: {
73
- describedby: ariaDescribedBy,
74
- labelledby: ariaLabelledBy,
75
- modal: ariaModal,
76
- }, contentLabel: contentLabel }),
77
- children,
78
- closeButton && (React.createElement(Button, { className: cl("navds-modal__button", {
79
- "navds-modal__button--shake": shouldCloseOnOverlayClick,
80
- }), size: "small", variant: "tertiary-neutral", ref: buttonRef, onClick: onClose, icon: React.createElement(XMarkIcon, { title: "Lukk modalvindu" }) }))));
93
+ }, [modalRef, open]);
94
+ useBodyScrollLock(modalRef, "navds-modal__document-body");
95
+ const isWidthPreset = typeof width === "string" && ["small", "medium"].includes(width);
96
+ return (React.createElement("dialog", Object.assign({ ref: mergedRef, className: cl("navds-modal", className, {
97
+ "navds-modal--polyfilled": needPolyfill,
98
+ "navds-modal--autowidth": !width,
99
+ [`navds-modal--${width}`]: isWidthPreset,
100
+ }), style: Object.assign(Object.assign({}, style), (!isWidthPreset ? { width } : {})), onCancel: (event) => {
101
+ // FYI: onCancel fires when you press Esc
102
+ if (onBeforeClose && onBeforeClose() === false) {
103
+ event.preventDefault();
104
+ }
105
+ else if (onCancel)
106
+ onCancel(event);
107
+ }, "aria-labelledby": !ariaLabelledby && !rest["aria-label"] && header
108
+ ? ariaLabelId
109
+ : ariaLabelledby }, rest),
110
+ React.createElement(ModalContext.Provider, { value: {
111
+ closeHandler: getCloseHandler(modalRef, header, onBeforeClose),
112
+ } },
113
+ header && (React.createElement(ModalHeader, null,
114
+ header.label && (React.createElement(Detail, { className: "navds-modal__label" }, header.label)),
115
+ React.createElement(Heading, { size: (_b = header.size) !== null && _b !== void 0 ? _b : "medium", level: "1", id: ariaLabelId },
116
+ React.createElement("span", { className: "navds-modal__header-icon" }, header.icon),
117
+ header.heading))),
118
+ children)));
81
119
  });
82
- Modal.setAppElement = (element) => ReactModal.setAppElement(element);
83
- Modal.Content = ModalContent;
120
+ Modal.Header = ModalHeader;
121
+ Modal.Body = ModalBody;
122
+ Modal.Footer = ModalFooter;
84
123
  export default Modal;
85
124
  //# sourceMappingURL=Modal.js.map
@@ -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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"}
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ export interface ModalBodyProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ children: React.ReactNode;
4
+ }
5
+ declare const ModalBody: React.ForwardRefExoticComponent<ModalBodyProps & React.RefAttributes<HTMLDivElement>>;
6
+ export default ModalBody;
@@ -11,9 +11,9 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  };
12
12
  import React, { forwardRef } from "react";
13
13
  import cl from "clsx";
14
- const ModalContent = forwardRef((_a, ref) => {
14
+ const ModalBody = forwardRef((_a, ref) => {
15
15
  var { className } = _a, rest = __rest(_a, ["className"]);
16
- return (React.createElement("div", Object.assign({}, rest, { ref: ref, className: cl("navds-modal__content", className) })));
16
+ return (React.createElement("div", Object.assign({}, rest, { ref: ref, className: cl("navds-modal__body", className) })));
17
17
  });
18
- export default ModalContent;
19
- //# sourceMappingURL=ModalContent.js.map
18
+ export default ModalBody;
19
+ //# sourceMappingURL=ModalBody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModalBody.js","sourceRoot":"","sources":["../../src/modal/ModalBody.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,MAAM,MAAM,CAAC;AAMtB,MAAM,SAAS,GAAG,UAAU,CAC1B,CAAC,EAAsB,EAAE,GAAG,EAAE,EAAE;QAA/B,EAAE,SAAS,OAAW,EAAN,IAAI,cAApB,aAAsB,CAAF;IAAY,OAAA,CAC/B,6CAAS,IAAI,IAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,SAAS,CAAC,IAAI,CAC3E,CAAA;CAAA,CACF,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ interface ModalContextProps {
3
+ closeHandler?: React.MouseEventHandler<HTMLButtonElement>;
4
+ }
5
+ export declare const ModalContext: React.Context<ModalContextProps | null>;
6
+ export {};
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ export const ModalContext = React.createContext(null);
3
+ //# sourceMappingURL=ModalContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModalContext.js","sourceRoot":"","sources":["../../src/modal/ModalContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAA2B,IAAI,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ export interface ModalFooterProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ children: React.ReactNode;
4
+ }
5
+ declare const ModalFooter: React.ForwardRefExoticComponent<ModalFooterProps & React.RefAttributes<HTMLDivElement>>;
6
+ export default ModalFooter;
@@ -0,0 +1,19 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import React, { forwardRef } from "react";
13
+ import cl from "clsx";
14
+ const ModalFooter = forwardRef((_a, ref) => {
15
+ var { className } = _a, rest = __rest(_a, ["className"]);
16
+ return (React.createElement("div", Object.assign({}, rest, { ref: ref, className: cl("navds-modal__footer", className) })));
17
+ });
18
+ export default ModalFooter;
19
+ //# sourceMappingURL=ModalFooter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModalFooter.js","sourceRoot":"","sources":["../../src/modal/ModalFooter.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,MAAM,MAAM,CAAC;AAMtB,MAAM,WAAW,GAAG,UAAU,CAC5B,CAAC,EAAsB,EAAE,GAAG,EAAE,EAAE;QAA/B,EAAE,SAAS,OAAW,EAAN,IAAI,cAApB,aAAsB,CAAF;IAAY,OAAA,CAC/B,6CAAS,IAAI,IAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,IAAI,CAC7E,CAAA;CAAA,CACF,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ export interface ModalHeaderProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ children?: React.ReactNode;
4
+ /**
5
+ * Removes close-button (X) when false
6
+ * @default true
7
+ */
8
+ closeButton?: boolean;
9
+ }
10
+ declare const ModalHeader: React.ForwardRefExoticComponent<ModalHeaderProps & React.RefAttributes<HTMLDivElement>>;
11
+ export default ModalHeader;