@navikt/ds-react 6.8.0 → 6.10.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 (240) hide show
  1. package/cjs/chat/Bubble.d.ts +4 -4
  2. package/cjs/chat/Chat.d.ts +6 -4
  3. package/cjs/chat/Chat.js +1 -1
  4. package/cjs/chat/Chat.js.map +1 -1
  5. package/cjs/date/monthpicker/MonthButton.js +2 -2
  6. package/cjs/date/monthpicker/MonthButton.js.map +1 -1
  7. package/cjs/date/utils/check-dates.d.ts +1 -1
  8. package/cjs/date/utils/check-dates.js +1 -1
  9. package/cjs/date/utils/check-dates.js.map +1 -1
  10. package/cjs/date/utils/dates-disabled.js +1 -1
  11. package/cjs/date/utils/dates-disabled.js.map +1 -1
  12. package/cjs/date/utils/navigation.d.ts +1 -1
  13. package/cjs/date/utils/navigation.js +1 -1
  14. package/cjs/date/utils/navigation.js.map +1 -1
  15. package/cjs/date/utils/parse-date.js +7 -11
  16. package/cjs/date/utils/parse-date.js.map +1 -1
  17. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +17 -4
  18. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  19. package/cjs/form/combobox/FilteredOptions/useVirtualFocus.js +1 -3
  20. package/cjs/form/combobox/FilteredOptions/useVirtualFocus.js.map +1 -1
  21. package/cjs/form/combobox/combobox-utils.js +1 -3
  22. package/cjs/form/combobox/combobox-utils.js.map +1 -1
  23. package/cjs/form/file-upload/parts/item/ItemIcon.js +1 -1
  24. package/cjs/form/file-upload/parts/item/ItemIcon.js.map +1 -1
  25. package/cjs/form/file-upload/utils/is-accepted-file-type.js +1 -1
  26. package/cjs/form/file-upload/utils/is-accepted-file-type.js.map +1 -1
  27. package/cjs/index.d.ts +1 -1
  28. package/cjs/index.js.map +1 -1
  29. package/cjs/layout/bleed/Bleed.d.ts +8 -4
  30. package/cjs/layout/bleed/Bleed.js.map +1 -1
  31. package/cjs/layout/box/Box.d.ts +16 -4
  32. package/cjs/layout/box/Box.js.map +1 -1
  33. package/cjs/layout/grid/HGrid.d.ts +7 -3
  34. package/cjs/layout/grid/HGrid.js.map +1 -1
  35. package/cjs/layout/stack/Stack.d.ts +3 -1
  36. package/cjs/layout/stack/Stack.js.map +1 -1
  37. package/cjs/layout/utilities/css.js +1 -1
  38. package/cjs/layout/utilities/css.js.map +1 -1
  39. package/cjs/list/List.d.ts +15 -3
  40. package/cjs/list/List.js +15 -0
  41. package/cjs/list/List.js.map +1 -1
  42. package/cjs/list/ListItem.d.ts +4 -11
  43. package/cjs/list/ListItem.js +3 -0
  44. package/cjs/list/ListItem.js.map +1 -1
  45. package/cjs/list/index.d.ts +2 -2
  46. package/cjs/list/index.js.map +1 -1
  47. package/cjs/list/types.d.ts +19 -5
  48. package/cjs/modal/Modal.js +4 -1
  49. package/cjs/modal/Modal.js.map +1 -1
  50. package/cjs/modal/ModalBody.js.map +1 -1
  51. package/cjs/modal/ModalFooter.js.map +1 -1
  52. package/cjs/modal/dialog-polyfill.js +4 -1
  53. package/cjs/modal/dialog-polyfill.js.map +1 -1
  54. package/cjs/modal/types.d.ts +5 -1
  55. package/cjs/{overlay/dismiss → overlays/dismissablelayer}/DismissableLayer.d.ts +6 -0
  56. package/cjs/{overlay/dismiss → overlays/dismissablelayer}/DismissableLayer.js +36 -14
  57. package/cjs/overlays/dismissablelayer/DismissableLayer.js.map +1 -0
  58. package/{esm/overlay/dismiss → cjs/overlays/dismissablelayer}/util/dispatchCustomEvent.d.ts +1 -1
  59. package/cjs/overlays/dismissablelayer/util/dispatchCustomEvent.js.map +1 -0
  60. package/cjs/overlays/dismissablelayer/util/useEscapeKeydown.js.map +1 -0
  61. package/cjs/overlays/dismissablelayer/util/useFocusOutside.js.map +1 -0
  62. package/cjs/overlays/dismissablelayer/util/usePointerDownOutside.js.map +1 -0
  63. package/cjs/pagination/Pagination.js +1 -1
  64. package/cjs/pagination/Pagination.js.map +1 -1
  65. package/cjs/popover/Popover.js +1 -1
  66. package/cjs/popover/Popover.js.map +1 -1
  67. package/cjs/stepper/Step.d.ts +0 -5
  68. package/cjs/stepper/Step.js +8 -13
  69. package/cjs/stepper/Step.js.map +1 -1
  70. package/cjs/stepper/Stepper.js +12 -22
  71. package/cjs/stepper/Stepper.js.map +1 -1
  72. package/cjs/stepper/context.d.ts +6 -3
  73. package/cjs/stepper/context.js +9 -3
  74. package/cjs/stepper/context.js.map +1 -1
  75. package/cjs/table/AnimateHeight.js +1 -1
  76. package/cjs/table/AnimateHeight.js.map +1 -1
  77. package/cjs/tabs/parts/tablist/useScrollButtons.js +1 -1
  78. package/cjs/tabs/parts/tablist/useScrollButtons.js.map +1 -1
  79. package/cjs/timeline/AxisLabels.js +2 -4
  80. package/cjs/timeline/AxisLabels.js.map +1 -1
  81. package/cjs/util/debounce.js.map +1 -1
  82. package/cjs/util/hooks/descendants/utils.js +1 -3
  83. package/cjs/util/hooks/descendants/utils.js.map +1 -1
  84. package/cjs/util/omit.js +2 -3
  85. package/cjs/util/omit.js.map +1 -1
  86. package/esm/chat/Bubble.d.ts +4 -4
  87. package/esm/chat/Chat.d.ts +6 -4
  88. package/esm/chat/Chat.js +1 -1
  89. package/esm/chat/Chat.js.map +1 -1
  90. package/esm/date/monthpicker/MonthButton.js +2 -2
  91. package/esm/date/monthpicker/MonthButton.js.map +1 -1
  92. package/esm/date/utils/check-dates.d.ts +1 -1
  93. package/esm/date/utils/check-dates.js +1 -1
  94. package/esm/date/utils/check-dates.js.map +1 -1
  95. package/esm/date/utils/dates-disabled.js +1 -1
  96. package/esm/date/utils/dates-disabled.js.map +1 -1
  97. package/esm/date/utils/navigation.d.ts +1 -1
  98. package/esm/date/utils/navigation.js +1 -1
  99. package/esm/date/utils/navigation.js.map +1 -1
  100. package/esm/date/utils/parse-date.js +7 -11
  101. package/esm/date/utils/parse-date.js.map +1 -1
  102. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +17 -4
  103. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  104. package/esm/form/combobox/FilteredOptions/useVirtualFocus.js +1 -3
  105. package/esm/form/combobox/FilteredOptions/useVirtualFocus.js.map +1 -1
  106. package/esm/form/combobox/combobox-utils.js +1 -3
  107. package/esm/form/combobox/combobox-utils.js.map +1 -1
  108. package/esm/form/file-upload/parts/item/ItemIcon.js +1 -1
  109. package/esm/form/file-upload/parts/item/ItemIcon.js.map +1 -1
  110. package/esm/form/file-upload/utils/is-accepted-file-type.js +1 -1
  111. package/esm/form/file-upload/utils/is-accepted-file-type.js.map +1 -1
  112. package/esm/index.d.ts +1 -1
  113. package/esm/index.js.map +1 -1
  114. package/esm/layout/bleed/Bleed.d.ts +8 -4
  115. package/esm/layout/bleed/Bleed.js.map +1 -1
  116. package/esm/layout/box/Box.d.ts +16 -4
  117. package/esm/layout/box/Box.js.map +1 -1
  118. package/esm/layout/grid/HGrid.d.ts +7 -3
  119. package/esm/layout/grid/HGrid.js.map +1 -1
  120. package/esm/layout/stack/Stack.d.ts +3 -1
  121. package/esm/layout/stack/Stack.js.map +1 -1
  122. package/esm/layout/utilities/css.js +1 -1
  123. package/esm/layout/utilities/css.js.map +1 -1
  124. package/esm/list/List.d.ts +15 -3
  125. package/esm/list/List.js +15 -0
  126. package/esm/list/List.js.map +1 -1
  127. package/esm/list/ListItem.d.ts +4 -11
  128. package/esm/list/ListItem.js +3 -0
  129. package/esm/list/ListItem.js.map +1 -1
  130. package/esm/list/index.d.ts +2 -2
  131. package/esm/list/index.js.map +1 -1
  132. package/esm/list/types.d.ts +19 -5
  133. package/esm/modal/Modal.js +4 -1
  134. package/esm/modal/Modal.js.map +1 -1
  135. package/esm/modal/ModalBody.js.map +1 -1
  136. package/esm/modal/ModalFooter.js.map +1 -1
  137. package/esm/modal/dialog-polyfill.js +4 -1
  138. package/esm/modal/dialog-polyfill.js.map +1 -1
  139. package/esm/modal/types.d.ts +5 -1
  140. package/esm/{overlay/dismiss → overlays/dismissablelayer}/DismissableLayer.d.ts +6 -0
  141. package/esm/{overlay/dismiss → overlays/dismissablelayer}/DismissableLayer.js +37 -15
  142. package/esm/overlays/dismissablelayer/DismissableLayer.js.map +1 -0
  143. package/{cjs/overlay/dismiss → esm/overlays/dismissablelayer}/util/dispatchCustomEvent.d.ts +1 -1
  144. package/esm/overlays/dismissablelayer/util/dispatchCustomEvent.js.map +1 -0
  145. package/esm/overlays/dismissablelayer/util/useEscapeKeydown.js.map +1 -0
  146. package/esm/overlays/dismissablelayer/util/useFocusOutside.js.map +1 -0
  147. package/esm/overlays/dismissablelayer/util/usePointerDownOutside.js.map +1 -0
  148. package/esm/pagination/Pagination.js +1 -1
  149. package/esm/pagination/Pagination.js.map +1 -1
  150. package/esm/popover/Popover.js +1 -1
  151. package/esm/popover/Popover.js.map +1 -1
  152. package/esm/stepper/Step.d.ts +0 -5
  153. package/esm/stepper/Step.js +10 -15
  154. package/esm/stepper/Step.js.map +1 -1
  155. package/esm/stepper/Stepper.js +13 -23
  156. package/esm/stepper/Stepper.js.map +1 -1
  157. package/esm/stepper/context.d.ts +6 -3
  158. package/esm/stepper/context.js +7 -2
  159. package/esm/stepper/context.js.map +1 -1
  160. package/esm/table/AnimateHeight.js +1 -1
  161. package/esm/table/AnimateHeight.js.map +1 -1
  162. package/esm/tabs/parts/tablist/useScrollButtons.js +1 -1
  163. package/esm/tabs/parts/tablist/useScrollButtons.js.map +1 -1
  164. package/esm/timeline/AxisLabels.js +2 -4
  165. package/esm/timeline/AxisLabels.js.map +1 -1
  166. package/esm/util/debounce.js.map +1 -1
  167. package/esm/util/hooks/descendants/utils.js +1 -3
  168. package/esm/util/hooks/descendants/utils.js.map +1 -1
  169. package/esm/util/omit.js +2 -3
  170. package/esm/util/omit.js.map +1 -1
  171. package/package.json +3 -3
  172. package/src/chat/Bubble.tsx +4 -4
  173. package/src/chat/Chat.tsx +6 -4
  174. package/src/date/monthpicker/MonthButton.tsx +6 -2
  175. package/src/date/utils/check-dates.ts +2 -2
  176. package/src/date/utils/dates-disabled.ts +3 -1
  177. package/src/date/utils/navigation.ts +3 -3
  178. package/src/date/utils/parse-date.ts +21 -15
  179. package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +23 -24
  180. package/src/form/combobox/FilteredOptions/useVirtualFocus.ts +2 -2
  181. package/src/form/combobox/combobox-utils.ts +5 -5
  182. package/src/form/file-upload/parts/item/ItemIcon.tsx +3 -1
  183. package/src/form/file-upload/utils/is-accepted-file-type.ts +4 -1
  184. package/src/index.ts +1 -1
  185. package/src/layout/bleed/Bleed.tsx +8 -4
  186. package/src/layout/box/Box.tsx +16 -4
  187. package/src/layout/grid/HGrid.tsx +7 -3
  188. package/src/layout/stack/Stack.tsx +5 -1
  189. package/src/layout/utilities/css.ts +3 -1
  190. package/src/list/List.tsx +15 -3
  191. package/src/list/ListItem.tsx +4 -15
  192. package/src/list/index.ts +2 -2
  193. package/src/list/types.ts +20 -5
  194. package/src/modal/Modal.tsx +6 -1
  195. package/src/modal/ModalBody.tsx +5 -3
  196. package/src/modal/ModalFooter.tsx +9 -3
  197. package/src/modal/dialog-polyfill.ts +8 -2
  198. package/src/modal/types.ts +5 -1
  199. package/src/{overlay/dismiss → overlays/dismissablelayer}/DismissableLayer.tsx +40 -19
  200. package/src/{overlay/dismiss → overlays/dismissablelayer}/util/dispatchCustomEvent.ts +1 -1
  201. package/src/pagination/Pagination.tsx +1 -1
  202. package/src/popover/Popover.tsx +1 -1
  203. package/src/stepper/Step.tsx +24 -38
  204. package/src/stepper/Stepper.tsx +29 -35
  205. package/src/stepper/context.ts +11 -4
  206. package/src/table/AnimateHeight.tsx +1 -1
  207. package/src/tabs/parts/tablist/useScrollButtons.ts +2 -2
  208. package/src/timeline/AxisLabels.tsx +5 -3
  209. package/src/util/__tests__/omit.test.ts +36 -0
  210. package/src/util/debounce.ts +1 -1
  211. package/src/util/hooks/descendants/utils.ts +2 -2
  212. package/src/util/omit.ts +5 -9
  213. package/cjs/overlay/dismiss/DismissableLayer.js.map +0 -1
  214. package/cjs/overlay/dismiss/util/dispatchCustomEvent.js.map +0 -1
  215. package/cjs/overlay/dismiss/util/useEscapeKeydown.js.map +0 -1
  216. package/cjs/overlay/dismiss/util/useFocusOutside.js.map +0 -1
  217. package/cjs/overlay/dismiss/util/usePointerDownOutside.js.map +0 -1
  218. package/esm/overlay/dismiss/DismissableLayer.js.map +0 -1
  219. package/esm/overlay/dismiss/util/dispatchCustomEvent.js.map +0 -1
  220. package/esm/overlay/dismiss/util/useEscapeKeydown.js.map +0 -1
  221. package/esm/overlay/dismiss/util/useFocusOutside.js.map +0 -1
  222. package/esm/overlay/dismiss/util/usePointerDownOutside.js.map +0 -1
  223. /package/cjs/{overlay/dismiss → overlays/dismissablelayer}/util/dispatchCustomEvent.js +0 -0
  224. /package/cjs/{overlay/dismiss → overlays/dismissablelayer}/util/useEscapeKeydown.d.ts +0 -0
  225. /package/cjs/{overlay/dismiss → overlays/dismissablelayer}/util/useEscapeKeydown.js +0 -0
  226. /package/cjs/{overlay/dismiss → overlays/dismissablelayer}/util/useFocusOutside.d.ts +0 -0
  227. /package/cjs/{overlay/dismiss → overlays/dismissablelayer}/util/useFocusOutside.js +0 -0
  228. /package/cjs/{overlay/dismiss → overlays/dismissablelayer}/util/usePointerDownOutside.d.ts +0 -0
  229. /package/cjs/{overlay/dismiss → overlays/dismissablelayer}/util/usePointerDownOutside.js +0 -0
  230. /package/esm/{overlay/dismiss → overlays/dismissablelayer}/util/dispatchCustomEvent.js +0 -0
  231. /package/esm/{overlay/dismiss → overlays/dismissablelayer}/util/useEscapeKeydown.d.ts +0 -0
  232. /package/esm/{overlay/dismiss → overlays/dismissablelayer}/util/useEscapeKeydown.js +0 -0
  233. /package/esm/{overlay/dismiss → overlays/dismissablelayer}/util/useFocusOutside.d.ts +0 -0
  234. /package/esm/{overlay/dismiss → overlays/dismissablelayer}/util/useFocusOutside.js +0 -0
  235. /package/esm/{overlay/dismiss → overlays/dismissablelayer}/util/usePointerDownOutside.d.ts +0 -0
  236. /package/esm/{overlay/dismiss → overlays/dismissablelayer}/util/usePointerDownOutside.js +0 -0
  237. /package/src/{overlay → overlays/dismissablelayer}/README.md +0 -0
  238. /package/src/{overlay/dismiss → overlays/dismissablelayer}/util/useEscapeKeydown.ts +0 -0
  239. /package/src/{overlay/dismiss → overlays/dismissablelayer}/util/useFocusOutside.ts +0 -0
  240. /package/src/{overlay/dismiss → overlays/dismissablelayer}/util/usePointerDownOutside.ts +0 -0
package/src/list/List.tsx CHANGED
@@ -10,12 +10,24 @@ export interface ListComponent
10
10
  extends React.ForwardRefExoticComponent<
11
11
  ListProps & React.RefAttributes<HTMLDivElement>
12
12
  > {
13
- /**
14
- * @see 🏷️ {@link ListItemProps}
15
- */
16
13
  Item: typeof ListItem;
17
14
  }
18
15
 
16
+ /**
17
+ * A list component
18
+ *
19
+ * @see [📝 Documentation](https://aksel.nav.no/komponenter/core/list)
20
+ * @see 🏷️ {@link ListProps | Props}
21
+ *
22
+ * @example
23
+ * ```jsx
24
+ * <List>
25
+ * <List.Item>Coffee</List.Item>
26
+ * <List.Item>Tea</List.Item>
27
+ * <List.Item>Milk</List.Item>
28
+ * </List>
29
+ * ```
30
+ */
19
31
  export const List = forwardRef<HTMLDivElement, ListProps>(
20
32
  (
21
33
  {
@@ -2,22 +2,11 @@ import cl from "clsx";
2
2
  import React, { forwardRef, useContext } from "react";
3
3
  import { BodyShort, Label } from "../typography";
4
4
  import { ListContext } from "./context";
5
+ import { ListItemProps } from "./types";
5
6
 
6
- export interface ListItemProps extends React.HTMLAttributes<HTMLLIElement> {
7
- /**
8
- * Content for description of the list item
9
- */
10
- children: React.ReactNode;
11
- /**
12
- * Title for the list item
13
- */
14
- title?: string;
15
- /*
16
- * Icon to be used as list marker for unordered lists.
17
- */
18
- icon?: React.ReactNode;
19
- }
20
-
7
+ /**
8
+ * @see 🏷️ {@link ListItemProps}
9
+ */
21
10
  export const ListItem = forwardRef<HTMLLIElement, ListItemProps>(
22
11
  ({ className, children, title, icon, ...rest }, ref) => {
23
12
  const { listType, size } = useContext(ListContext);
package/src/list/index.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  "use client";
2
2
  export { default as List } from "./List";
3
- export type { ListProps } from "./types";
4
- export { default as ListItem, type ListItemProps } from "./ListItem";
3
+ export type { ListProps, ListItemProps } from "./types";
4
+ export { default as ListItem } from "./ListItem";
package/src/list/types.ts CHANGED
@@ -1,26 +1,41 @@
1
1
  export interface ListProps extends React.HTMLAttributes<HTMLDivElement> {
2
2
  children: React.ReactNode;
3
3
  /**
4
- * HTML list element to render
4
+ * HTML list element to render.
5
5
  * @default "ul"
6
6
  */
7
7
  as?: "ul" | "ol";
8
8
  /**
9
- * List heading title
9
+ * List heading title.
10
10
  */
11
11
  title?: string;
12
12
  /**
13
- * List heading description
13
+ * List heading description.
14
14
  */
15
15
  description?: string;
16
16
  /**
17
- * Allows setting a different HTML h-tag
17
+ * Allows setting a different HTML h-tag.
18
18
  * @default "h3"
19
19
  */
20
20
  headingTag?: React.ElementType<any>;
21
21
  /**
22
- * Changes padding, height and font-size
22
+ * Changes padding, height and font-size.
23
23
  * @default "medium"
24
24
  */
25
25
  size?: "medium" | "small";
26
26
  }
27
+
28
+ export interface ListItemProps extends React.HTMLAttributes<HTMLLIElement> {
29
+ /**
30
+ * List item content.
31
+ */
32
+ children: React.ReactNode;
33
+ /**
34
+ * List item title.
35
+ */
36
+ title?: string;
37
+ /**
38
+ * Icon to be used instead of bullet (unordered lists only).
39
+ */
40
+ icon?: React.ReactNode;
41
+ }
@@ -21,6 +21,8 @@ import {
21
21
  import dialogPolyfill, { needPolyfill } from "./dialog-polyfill";
22
22
  import { ModalProps } from "./types";
23
23
 
24
+ const polyfillClassName = "navds-modal--polyfilled";
25
+
24
26
  interface ModalComponent
25
27
  extends React.ForwardRefExoticComponent<
26
28
  ModalProps & React.RefAttributes<HTMLDialogElement>
@@ -115,6 +117,9 @@ export const Modal = forwardRef<HTMLDialogElement, ModalProps>(
115
117
  // We check both to avoid activating polyfill twice when not using portal.
116
118
  if (needPolyfill && modalRef.current && portalNode) {
117
119
  dialogPolyfill.registerDialog(modalRef.current);
120
+
121
+ // Force-add the "polyfilled" class in case of SSR (needPolyfill will always be false on the server)
122
+ modalRef.current.classList.add(polyfillClassName);
118
123
  }
119
124
  // We set autofocus on the dialog element to prevent the default behavior where first focusable element gets focus when modal is opened.
120
125
  // This is mainly to fix an edge case where having a Tooltip as the first focusable element would make it activate when you open the modal.
@@ -142,7 +147,7 @@ export const Modal = forwardRef<HTMLDialogElement, ModalProps>(
142
147
  typeof width === "string" && ["small", "medium"].includes(width);
143
148
 
144
149
  const mergedClassName = cl("navds-modal", className, {
145
- "navds-modal--polyfilled": needPolyfill,
150
+ polyfillClassName: needPolyfill,
146
151
  "navds-modal--autowidth": !width,
147
152
  [`navds-modal--${width}`]: isWidthPreset,
148
153
  });
@@ -6,9 +6,11 @@ export interface ModalBodyProps extends React.HTMLAttributes<HTMLDivElement> {
6
6
  }
7
7
 
8
8
  const ModalBody = forwardRef<HTMLDivElement, ModalBodyProps>(
9
- ({ className, ...rest }, ref) => (
10
- <div {...rest} ref={ref} className={cl("navds-modal__body", className)} />
11
- ),
9
+ ({ className, ...rest }, ref) => {
10
+ return (
11
+ <div {...rest} ref={ref} className={cl("navds-modal__body", className)} />
12
+ );
13
+ },
12
14
  );
13
15
 
14
16
  export default ModalBody;
@@ -6,9 +6,15 @@ export interface ModalFooterProps extends React.HTMLAttributes<HTMLDivElement> {
6
6
  }
7
7
 
8
8
  const ModalFooter = forwardRef<HTMLDivElement, ModalFooterProps>(
9
- ({ className, ...rest }, ref) => (
10
- <div {...rest} ref={ref} className={cl("navds-modal__footer", className)} />
11
- ),
9
+ ({ className, ...rest }, ref) => {
10
+ return (
11
+ <div
12
+ {...rest}
13
+ ref={ref}
14
+ className={cl("navds-modal__footer", className)}
15
+ />
16
+ );
17
+ },
12
18
  );
13
19
 
14
20
  export default ModalFooter;
@@ -260,7 +260,7 @@ function dialogPolyfillInfo(dialog) {
260
260
  removed ? this.downgradeModal() : this.maybeHideModal();
261
261
  removed = false;
262
262
  }.bind(this);
263
- var timeout;
263
+ var timeout: ReturnType<typeof setTimeout>;
264
264
  var delayModel = function (ev) {
265
265
  if (ev.target !== dialog) {
266
266
  return;
@@ -631,12 +631,16 @@ dialogPolyfill.DialogManager = function () {
631
631
  this.mo_ = new MutationObserver(function (records) {
632
632
  var removed = [];
633
633
  records.forEach(function (rec) {
634
+ // biome-ignore lint/suspicious/noImplicitAnyLet: Reduntant to type c in this scenario
634
635
  for (var i = 0, c; (c = rec.removedNodes[i]); ++i) {
635
636
  if (!(c instanceof Element)) {
636
637
  continue;
637
- } else if (c.localName === "dialog") {
638
+ }
639
+
640
+ if (c.localName === "dialog") {
638
641
  removed.push(c);
639
642
  }
643
+
640
644
  removed = removed.concat(c.querySelectorAll("dialog"));
641
645
  }
642
646
  });
@@ -675,6 +679,7 @@ dialogPolyfill.DialogManager.prototype.unblockDocument = function () {
675
679
  dialogPolyfill.DialogManager.prototype.updateStacking = function () {
676
680
  var zIndex = this.zIndexHigh_;
677
681
 
682
+ // biome-ignore lint/suspicious/noImplicitAnyLet: Reduntant to type dpi in this scenario
678
683
  for (var i = 0, dpi; (dpi = this.pendingDialogStack[i]); ++i) {
679
684
  dpi.updateZIndex(--zIndex, --zIndex);
680
685
  if (i === 0) {
@@ -700,6 +705,7 @@ dialogPolyfill.DialogManager.prototype.containedByTopDialog_ = function (
700
705
  candidate,
701
706
  ) {
702
707
  while ((candidate = findNearestDialog(candidate))) {
708
+ // biome-ignore lint/suspicious/noImplicitAnyLet: Reduntant to type dpi in this scenario
703
709
  for (var i = 0, dpi; (dpi = this.pendingDialogStack[i]); ++i) {
704
710
  if (dpi.dialog === candidate) {
705
711
  return i === 0; // only valid if top-most
@@ -1,4 +1,8 @@
1
1
  interface ModalPropsBase extends React.DialogHTMLAttributes<HTMLDialogElement> {
2
+ /**
3
+ * Affects internal padding
4
+ */
5
+ size?: "small" | "medium";
2
6
  /**
3
7
  * Content for the header. Alteratively you can use `<Modal.Header>` instead for more control, but then you have to set `aria-label` or `aria-labelledby` on the modal manually.
4
8
  */
@@ -9,7 +13,7 @@ interface ModalPropsBase extends React.DialogHTMLAttributes<HTMLDialogElement> {
9
13
  /**
10
14
  * Heading size.
11
15
  * @default "medium"
12
- * */
16
+ */
13
17
  size?: "medium" | "small";
14
18
  /**
15
19
  * Removes close-button (X) when false.
@@ -2,7 +2,6 @@ import React, {
2
2
  CSSProperties,
3
3
  forwardRef,
4
4
  useEffect,
5
- useMemo,
6
5
  useRef,
7
6
  useState,
8
7
  } from "react";
@@ -77,9 +76,13 @@ export const [
77
76
  useDismissableDescendant,
78
77
  ] = createDescendantContext<
79
78
  HTMLDivElement,
80
- { disableOutsidePointerEvents: boolean }
79
+ { disableOutsidePointerEvents: boolean; forceUpdate: () => void }
81
80
  >();
82
81
 
82
+ /**
83
+ * Number of layers with `disableOutsidePointerEvents` set to `true` currently enabled.
84
+ */
85
+ let bodyLockCount = 0;
83
86
  let originalBodyPointerEvents: string;
84
87
 
85
88
  const DismissableLayer = forwardRef<HTMLDivElement, DismissableLayerProps>(
@@ -133,9 +136,11 @@ const DismissableLayerNode = forwardRef<HTMLDivElement, DismissableLayerProps>(
133
136
  }: DismissableLayerProps,
134
137
  ref,
135
138
  ) => {
139
+ const [, setForce] = useState({});
136
140
  const { register, index, descendants } = useDismissableDescendant({
137
141
  disableOutsidePointerEvents,
138
142
  disabled: !enabled,
143
+ forceUpdate: () => setForce({}),
139
144
  });
140
145
 
141
146
  /**
@@ -162,10 +167,11 @@ const DismissableLayerNode = forwardRef<HTMLDivElement, DismissableLayerProps>(
162
167
  const hasInteractedOutsideRef = useRef(false);
163
168
  const hasPointerDownOutsideRef = useRef(false);
164
169
 
165
- const pointerEnabled = useMemo(() => {
170
+ const pointerState = (() => {
166
171
  let lastIndex = -1;
167
172
 
168
173
  const descendantNodes = descendants.enabledValues();
174
+
169
175
  descendantNodes.forEach((obj, _index) => {
170
176
  if (obj.disableOutsidePointerEvents) {
171
177
  lastIndex = _index;
@@ -181,9 +187,12 @@ const DismissableLayerNode = forwardRef<HTMLDivElement, DismissableLayerProps>(
181
187
  /**
182
188
  * If we find a node with `disableOutsidePointerEvents` we want to disable pointer events on the body.
183
189
  */
184
- isBodyPointerEventsDisabled: lastIndex > -1,
190
+ isBodyPointerEventsDisabled: bodyLockCount > 0,
191
+ pointerStyle: (index >= lastIndex && bodyLockCount > 0
192
+ ? "auto"
193
+ : undefined) as CSSProperties["pointerEvents"] | undefined,
185
194
  };
186
- }, [descendants, index]);
195
+ })();
187
196
 
188
197
  /**
189
198
  * We want to prevent the Layer from closing when the trigger, anchor element, or its child elements are interacted with.
@@ -248,7 +257,7 @@ const DismissableLayerNode = forwardRef<HTMLDivElement, DismissableLayerProps>(
248
257
  }
249
258
 
250
259
  const pointerDownOutside = usePointerDownOutside((event) => {
251
- if (!pointerEnabled.isPointerEventsEnabled || !enabled) {
260
+ if (!pointerState.isPointerEventsEnabled || !enabled) {
252
261
  return;
253
262
  }
254
263
 
@@ -329,17 +338,33 @@ const DismissableLayerNode = forwardRef<HTMLDivElement, DismissableLayerProps>(
329
338
  * we want to disable pointer events on the body when the first layer is opened.
330
339
  */
331
340
  useEffect(() => {
332
- if (!node || !disableOutsidePointerEvents || index !== 0 || !enabled) {
333
- return;
334
- }
335
-
336
- originalBodyPointerEvents = ownerDocument.body.style.pointerEvents;
337
- ownerDocument.body.style.pointerEvents = "none";
341
+ if (!node || !enabled || !disableOutsidePointerEvents) return;
338
342
 
343
+ if (bodyLockCount === 0) {
344
+ originalBodyPointerEvents = ownerDocument.body.style.pointerEvents;
345
+ ownerDocument.body.style.pointerEvents = "none";
346
+ }
347
+ bodyLockCount++;
339
348
  return () => {
340
- ownerDocument.body.style.pointerEvents = originalBodyPointerEvents;
349
+ if (bodyLockCount === 1) {
350
+ ownerDocument.body.style.pointerEvents = originalBodyPointerEvents;
351
+ }
352
+ bodyLockCount--;
341
353
  };
342
- }, [node, ownerDocument, disableOutsidePointerEvents, index, enabled]);
354
+ }, [
355
+ node,
356
+ ownerDocument,
357
+ disableOutsidePointerEvents,
358
+ descendants,
359
+ enabled,
360
+ ]);
361
+
362
+ /**
363
+ * To make sure pointerEvents are enabled for all parents and siblings when the layer is removed from the DOM
364
+ */
365
+ useEffect(() => {
366
+ return () => descendants.values().forEach((x) => x.forceUpdate());
367
+ }, [descendants, node]);
343
368
 
344
369
  const Comp = asChild ? Slot : "div";
345
370
 
@@ -351,11 +376,7 @@ const DismissableLayerNode = forwardRef<HTMLDivElement, DismissableLayerProps>(
351
376
  onBlurCapture={focusOutside.onBlurCapture}
352
377
  onPointerDownCapture={pointerDownOutside.onPointerDownCapture}
353
378
  style={{
354
- pointerEvents: pointerEnabled.isBodyPointerEventsDisabled
355
- ? pointerEnabled.isPointerEventsEnabled
356
- ? "auto"
357
- : "none"
358
- : undefined,
379
+ pointerEvents: pointerState.pointerStyle,
359
380
  ...rest.style,
360
381
  }}
361
382
  >
@@ -5,7 +5,7 @@ type CustomPointerDownEvent = CustomEvent<{
5
5
  originalEvent: PointerEvent;
6
6
  }>;
7
7
 
8
- export { CustomFocusEvent, CustomPointerDownEvent };
8
+ export type { CustomFocusEvent, CustomPointerDownEvent };
9
9
 
10
10
  export const CUSTOM_EVENTS = {
11
11
  FOCUS_OUTSIDE: "AKSEL_FOCUS_OUTSIDE",
@@ -184,7 +184,7 @@ export const Pagination = forwardRef<HTMLElement, PaginationProps>(
184
184
  {getSteps({ page, count, siblingCount, boundaryCount }).map(
185
185
  (step, i) => {
186
186
  const n = Number(step);
187
- return isNaN(n) ? (
187
+ return Number.isNaN(n) ? (
188
188
  <li className="navds-pagination__ellipsis" key={`${step}${i}`}>
189
189
  <BodyShort size={size === "xsmall" ? "small" : size}>
190
190
  ...
@@ -10,7 +10,7 @@ import cl from "clsx";
10
10
  import React, { HTMLAttributes, forwardRef, useContext, useRef } from "react";
11
11
  import { DateContext } from "../date/context";
12
12
  import { useModalContext } from "../modal/Modal.context";
13
- import { DismissableLayer } from "../overlay/dismiss/DismissableLayer";
13
+ import { DismissableLayer } from "../overlays/dismissablelayer/DismissableLayer";
14
14
  import { useClientLayoutEffect } from "../util/hooks";
15
15
  import { useMergeRefs } from "../util/hooks/useMergeRefs";
16
16
  import PopoverContent, { PopoverContentType } from "./PopoverContent";
@@ -1,9 +1,9 @@
1
1
  import cl from "clsx";
2
- import React, { forwardRef, useContext } from "react";
2
+ import React, { forwardRef } from "react";
3
3
  import { Label } from "../typography";
4
4
  import { composeEventHandlers } from "../util/composeEventHandlers";
5
5
  import { OverridableComponent } from "../util/types";
6
- import { StepperContext } from "./context";
6
+ import { useStepperContext } from "./context";
7
7
 
8
8
  export interface StepperStepProps
9
9
  extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
@@ -11,11 +11,6 @@ export interface StepperStepProps
11
11
  * Text content by indicator.
12
12
  */
13
13
  children: string;
14
- /**
15
- * Handled by Stepper, overwriting may break component logic.
16
- * @private
17
- */
18
- unsafe_index?: number;
19
14
  /**
20
15
  * Makes step-indicator a checkmark.
21
16
  * @default false
@@ -28,25 +23,6 @@ export interface StepperStepProps
28
23
  interactive?: boolean;
29
24
  }
30
25
 
31
- const CompletedIcon = () => (
32
- <svg
33
- width="14"
34
- height="10"
35
- viewBox="0 0 14 10"
36
- fill="none"
37
- xmlns="http://www.w3.org/2000/svg"
38
- focusable={false}
39
- role="img"
40
- aria-hidden
41
- aria-label="Fullført"
42
- >
43
- <path
44
- d="M4.93563 6.41478L11.3755 0.404669C11.9796 -0.160351 12.9294 -0.130672 13.4959 0.47478C14.0624 1.08027 14.0299 2.03007 13.4249 2.59621L5.92151 9.59934C5.64138 9.85904 5.27598 10 4.90064 10C4.5069 10 4.12756 9.84621 3.83953 9.56111L1.33953 7.06111C0.75401 6.47558 0.75401 5.52542 1.33953 4.93989C1.92506 4.35437 2.87522 4.35437 3.46075 4.93989L4.93563 6.41478Z"
45
- fill="currentColor"
46
- />
47
- </svg>
48
- );
49
-
50
26
  export const Step: OverridableComponent<StepperStepProps, HTMLAnchorElement> =
51
27
  forwardRef(
52
28
  (
@@ -54,7 +30,6 @@ export const Step: OverridableComponent<StepperStepProps, HTMLAnchorElement> =
54
30
  className,
55
31
  children,
56
32
  as: Component = "a",
57
- unsafe_index = 0,
58
33
  completed = false,
59
34
  interactive,
60
35
  onClick,
@@ -62,11 +37,8 @@ export const Step: OverridableComponent<StepperStepProps, HTMLAnchorElement> =
62
37
  },
63
38
  ref,
64
39
  ) => {
65
- const context = useContext(StepperContext);
66
- if (context === null) {
67
- console.error("<Stepper.Step> has to be used within <Stepper>");
68
- return null;
69
- }
40
+ const context = useStepperContext();
41
+
70
42
  const { activeStep } = context;
71
43
 
72
44
  const isInteractive = interactive ?? context?.interactive;
@@ -74,17 +46,17 @@ export const Step: OverridableComponent<StepperStepProps, HTMLAnchorElement> =
74
46
  const Comp = isInteractive ? Component : "div";
75
47
 
76
48
  const handleStepClick = () => {
77
- isInteractive && context.onStepChange(unsafe_index + 1);
49
+ isInteractive && context.onStepChange(context.index + 1);
78
50
  };
79
51
 
80
52
  return (
81
53
  <Comp
82
54
  {...rest}
83
- aria-current={activeStep === unsafe_index ? "step" : undefined}
55
+ aria-current={activeStep === context.index ? "step" : undefined}
84
56
  ref={ref}
85
57
  className={cl("navds-stepper__step", className, {
86
- "navds-stepper__step--active": activeStep === unsafe_index,
87
- "navds-stepper__step--behind": activeStep > unsafe_index,
58
+ "navds-stepper__step--active": activeStep === context.index,
59
+ "navds-stepper__step--behind": activeStep > context.index,
88
60
  "navds-stepper__step--non-interactive": !isInteractive,
89
61
  "navds-stepper__step--completed": completed,
90
62
  })}
@@ -92,7 +64,21 @@ export const Step: OverridableComponent<StepperStepProps, HTMLAnchorElement> =
92
64
  >
93
65
  {completed ? (
94
66
  <span className="navds-stepper__circle navds-stepper__circle--success">
95
- <CompletedIcon />
67
+ <svg
68
+ width="14"
69
+ height="10"
70
+ viewBox="0 0 14 10"
71
+ fill="none"
72
+ xmlns="http://www.w3.org/2000/svg"
73
+ focusable={false}
74
+ role="presentation"
75
+ aria-hidden
76
+ >
77
+ <path
78
+ d="M4.93563 6.41478L11.3755 0.404669C11.9796 -0.160351 12.9294 -0.130672 13.4959 0.47478C14.0624 1.08027 14.0299 2.03007 13.4249 2.59621L5.92151 9.59934C5.64138 9.85904 5.27598 10 4.90064 10C4.5069 10 4.12756 9.84621 3.83953 9.56111L1.33953 7.06111C0.75401 6.47558 0.75401 5.52542 1.33953 4.93989C1.92506 4.35437 2.87522 4.35437 3.46075 4.93989L4.93563 6.41478Z"
79
+ fill="currentColor"
80
+ />
81
+ </svg>
96
82
  </span>
97
83
  ) : (
98
84
  <Label
@@ -100,7 +86,7 @@ export const Step: OverridableComponent<StepperStepProps, HTMLAnchorElement> =
100
86
  as="span"
101
87
  aria-hidden="true"
102
88
  >
103
- {unsafe_index + 1}
89
+ {context.index + 1}
104
90
  </Label>
105
91
  )}
106
92
  <Label as="span" className="navds-stepper__content">
@@ -1,7 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import Step, { StepperStepProps } from "./Step";
4
- import { StepperContext } from "./context";
4
+ import { StepperContextProvider } from "./context";
5
5
 
6
6
  export interface StepperProps extends React.HTMLAttributes<HTMLOListElement> {
7
7
  /**
@@ -94,41 +94,35 @@ export const Stepper: StepperComponent = forwardRef<
94
94
  className,
95
95
  )}
96
96
  >
97
- <StepperContext.Provider
98
- value={{
99
- activeStep,
100
- onStepChange,
101
- lastIndex: React.Children.count(children),
102
- orientation,
103
- interactive,
104
- }}
105
- >
106
- {React.Children.map(children, (step, index) => {
107
- return (
108
- <li
109
- className={cl("navds-stepper__item", {
110
- "navds-stepper__item--behind": activeStep > index,
111
- "navds-stepper__item--completed":
112
- React.isValidElement<StepperStepProps>(step) &&
113
- step?.props?.completed,
114
- "navds-stepper__item--non-interactive":
115
- React.isValidElement<StepperStepProps>(step) &&
116
- !(step?.props?.interactive ?? interactive),
117
- })}
118
- key={index + (children?.toString?.() ?? "")}
97
+ {React.Children.map(children, (step, index) => {
98
+ const stepProps: Partial<StepperStepProps> =
99
+ React.isValidElement<StepperStepProps>(step) ? step.props : {};
100
+
101
+ return (
102
+ <li
103
+ className={cl("navds-stepper__item", {
104
+ "navds-stepper__item--behind": activeStep > index,
105
+ "navds-stepper__item--completed": stepProps.completed,
106
+ "navds-stepper__item--non-interactive":
107
+ stepProps.interactive ?? interactive,
108
+ })}
109
+ key={index + (children?.toString?.() ?? "")}
110
+ >
111
+ <span className="navds-stepper__line navds-stepper__line--1" />
112
+ <StepperContextProvider
113
+ interactive={interactive}
114
+ activeStep={activeStep}
115
+ lastIndex={React.Children.count(children)}
116
+ index={index}
117
+ onStepChange={onStepChange}
118
+ orientation={orientation}
119
119
  >
120
- <span className="navds-stepper__line navds-stepper__line--1" />
121
- {React.isValidElement<StepperStepProps>(step)
122
- ? React.cloneElement(step, {
123
- ...step.props,
124
- unsafe_index: index,
125
- })
126
- : step}
127
- <span className="navds-stepper__line navds-stepper__line--2" />
128
- </li>
129
- );
130
- })}
131
- </StepperContext.Provider>
120
+ {step}
121
+ </StepperContextProvider>
122
+ <span className="navds-stepper__line navds-stepper__line--2" />
123
+ </li>
124
+ );
125
+ })}
132
126
  </ol>
133
127
  );
134
128
  },
@@ -1,11 +1,18 @@
1
- import { createContext } from "react";
1
+ import { createContext } from "../util/create-context";
2
2
 
3
- interface StepperContextProps {
4
- activeStep: number;
3
+ interface StepperContextValue {
5
4
  onStepChange: (step: number) => void;
6
5
  lastIndex: number;
7
6
  orientation: "horizontal" | "vertical";
8
7
  interactive: boolean;
8
+ activeStep: number;
9
+ index: number;
9
10
  }
10
11
 
11
- export const StepperContext = createContext<StepperContextProps | null>(null);
12
+ export const [StepperContextProvider, useStepperContext] =
13
+ createContext<StepperContextValue>({
14
+ hookName: "useStepperContext",
15
+ providerName: "StepperContextProvider",
16
+ name: "StepperContext",
17
+ errorMessage: "<Stepper.Step> has to be used within <Stepper>",
18
+ });
@@ -15,7 +15,7 @@ const prefersReducedMotion = globalThis?.matchMedia
15
15
 
16
16
  function isNumber(n: string) {
17
17
  const number = parseFloat(n);
18
- return !isNaN(number) && isFinite(number);
18
+ return !Number.isNaN(number) && Number.isFinite(number);
19
19
  }
20
20
 
21
21
  function isPercentage(height: Height) {
@@ -32,9 +32,9 @@ export function useScrollButtons(listRef: React.RefObject<HTMLDivElement>) {
32
32
  const win = listRef.current?.ownerDocument ?? document ?? window;
33
33
  win.addEventListener("resize", handleResize);
34
34
 
35
- let resizeObserver;
35
+ let resizeObserver: ResizeObserver;
36
36
 
37
- if (typeof ResizeObserver !== "undefined") {
37
+ if (typeof ResizeObserver !== "undefined" && listRef.current) {
38
38
  resizeObserver = new ResizeObserver(handleResize);
39
39
  resizeObserver.observe(listRef.current);
40
40
  }
@@ -115,11 +115,13 @@ const axisLabels = (
115
115
  const totalDays = differenceInDays(end, start);
116
116
  if (totalDays < 40) {
117
117
  return dayLabels(start, end, totalDays, direction, templates?.day);
118
- } else if (totalDays < 370) {
118
+ }
119
+
120
+ if (totalDays < 370) {
119
121
  return monthLabels(start, end, direction, templates?.month);
120
- } else {
121
- return yearLabels(start, end, direction, templates?.year);
122
122
  }
123
+
124
+ return yearLabels(start, end, direction, templates?.year);
123
125
  };
124
126
 
125
127
  export const AxisLabels = ({