@navikt/ds-react 7.31.0 → 7.32.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.
Files changed (115) hide show
  1. package/cjs/chat/Chat.d.ts +1 -1
  2. package/cjs/chat/Chat.js.map +1 -1
  3. package/cjs/copybutton/CopyButton.js +1 -1
  4. package/cjs/copybutton/CopyButton.js.map +1 -1
  5. package/cjs/date/date-utils/dropdown-options.d.ts +11 -2
  6. package/cjs/date/date-utils/dropdown-options.js +5 -3
  7. package/cjs/date/date-utils/dropdown-options.js.map +1 -1
  8. package/cjs/date/datepicker/parts/DatePicker.Months.js +7 -2
  9. package/cjs/date/datepicker/parts/DatePicker.Months.js.map +1 -1
  10. package/cjs/form/combobox/Input/Input.context.d.ts +2 -2
  11. package/cjs/form/file-upload/useFileUpload.d.ts +1 -1
  12. package/cjs/form/useFormField.js.map +1 -1
  13. package/cjs/layout/page/parts/PageBlock.d.ts +4 -0
  14. package/cjs/layout/page/parts/PageBlock.js.map +1 -1
  15. package/cjs/modal/ModalUtils.d.ts +2 -2
  16. package/cjs/modal/ModalUtils.js.map +1 -1
  17. package/cjs/overlays/dismissablelayer/DismissableLayer.d.ts +1 -1
  18. package/cjs/overlays/floating/Floating.js +2 -2
  19. package/cjs/overlays/floating/Floating.js.map +1 -1
  20. package/cjs/overlays/overlay/hooks/{useOpenChangeComplete.d.ts → useOpenChangeAnimationComplete.d.ts} +2 -2
  21. package/cjs/overlays/overlay/hooks/{useOpenChangeComplete.js → useOpenChangeAnimationComplete.js} +3 -3
  22. package/cjs/overlays/overlay/hooks/useOpenChangeAnimationComplete.js.map +1 -0
  23. package/cjs/overlays/overlay/hooks/useTransitionStatus.d.ts +38 -0
  24. package/cjs/overlays/overlay/hooks/useTransitionStatus.js +118 -0
  25. package/cjs/overlays/overlay/hooks/useTransitionStatus.js.map +1 -0
  26. package/cjs/progress-bar/ProgressBar.js +1 -1
  27. package/cjs/progress-bar/ProgressBar.js.map +1 -1
  28. package/cjs/read-more/ReadMore.d.ts +2 -9
  29. package/cjs/read-more/ReadMore.js +1 -8
  30. package/cjs/read-more/ReadMore.js.map +1 -1
  31. package/cjs/table/AnimateHeight.js +2 -2
  32. package/cjs/table/AnimateHeight.js.map +1 -1
  33. package/cjs/tabs/Tabs.context.d.ts +1 -1
  34. package/cjs/tabs/parts/tab/useTab.d.ts +1 -1
  35. package/cjs/tabs/parts/tablist/useScrollButtons.d.ts +1 -1
  36. package/cjs/tabs/parts/tablist/useScrollButtons.js.map +1 -1
  37. package/cjs/toggle-group/ToggleGroup.context.d.ts +1 -1
  38. package/cjs/toggle-group/parts/useToggleItem.d.ts +1 -1
  39. package/cjs/util/hooks/descendants/useDescendant.d.ts +1 -1
  40. package/cjs/util/hooks/useMergeRefs.d.ts +3 -3
  41. package/cjs/util/hooks/useMergeRefs.js +3 -3
  42. package/cjs/util/hooks/useMergeRefs.js.map +1 -1
  43. package/cjs/util/renderStoriesForChromatic.d.ts +2 -2
  44. package/cjs/util/renderStoriesForChromatic.js +2 -2
  45. package/cjs/util/renderStoriesForChromatic.js.map +1 -1
  46. package/cjs/util/virtualfocus/Context.d.ts +1 -1
  47. package/esm/chat/Chat.d.ts +1 -1
  48. package/esm/chat/Chat.js.map +1 -1
  49. package/esm/copybutton/CopyButton.js +1 -1
  50. package/esm/copybutton/CopyButton.js.map +1 -1
  51. package/esm/date/date-utils/dropdown-options.d.ts +11 -2
  52. package/esm/date/date-utils/dropdown-options.js +5 -3
  53. package/esm/date/date-utils/dropdown-options.js.map +1 -1
  54. package/esm/date/datepicker/parts/DatePicker.Months.js +7 -2
  55. package/esm/date/datepicker/parts/DatePicker.Months.js.map +1 -1
  56. package/esm/form/combobox/Input/Input.context.d.ts +2 -2
  57. package/esm/form/file-upload/useFileUpload.d.ts +1 -1
  58. package/esm/form/useFormField.js.map +1 -1
  59. package/esm/layout/page/parts/PageBlock.d.ts +4 -0
  60. package/esm/layout/page/parts/PageBlock.js.map +1 -1
  61. package/esm/modal/ModalUtils.d.ts +2 -2
  62. package/esm/modal/ModalUtils.js.map +1 -1
  63. package/esm/overlays/dismissablelayer/DismissableLayer.d.ts +1 -1
  64. package/esm/overlays/floating/Floating.js +2 -2
  65. package/esm/overlays/floating/Floating.js.map +1 -1
  66. package/esm/overlays/overlay/hooks/{useOpenChangeComplete.d.ts → useOpenChangeAnimationComplete.d.ts} +2 -2
  67. package/esm/overlays/overlay/hooks/{useOpenChangeComplete.js → useOpenChangeAnimationComplete.js} +2 -2
  68. package/esm/overlays/overlay/hooks/useOpenChangeAnimationComplete.js.map +1 -0
  69. package/esm/overlays/overlay/hooks/useTransitionStatus.d.ts +38 -0
  70. package/esm/overlays/overlay/hooks/useTransitionStatus.js +113 -0
  71. package/esm/overlays/overlay/hooks/useTransitionStatus.js.map +1 -0
  72. package/esm/progress-bar/ProgressBar.js +1 -1
  73. package/esm/progress-bar/ProgressBar.js.map +1 -1
  74. package/esm/read-more/ReadMore.d.ts +2 -9
  75. package/esm/read-more/ReadMore.js +1 -8
  76. package/esm/read-more/ReadMore.js.map +1 -1
  77. package/esm/table/AnimateHeight.js +2 -2
  78. package/esm/table/AnimateHeight.js.map +1 -1
  79. package/esm/tabs/Tabs.context.d.ts +1 -1
  80. package/esm/tabs/parts/tab/useTab.d.ts +1 -1
  81. package/esm/tabs/parts/tablist/useScrollButtons.d.ts +1 -1
  82. package/esm/tabs/parts/tablist/useScrollButtons.js.map +1 -1
  83. package/esm/toggle-group/ToggleGroup.context.d.ts +1 -1
  84. package/esm/toggle-group/parts/useToggleItem.d.ts +1 -1
  85. package/esm/util/hooks/descendants/useDescendant.d.ts +1 -1
  86. package/esm/util/hooks/useMergeRefs.d.ts +3 -3
  87. package/esm/util/hooks/useMergeRefs.js +3 -3
  88. package/esm/util/hooks/useMergeRefs.js.map +1 -1
  89. package/esm/util/renderStoriesForChromatic.d.ts +2 -2
  90. package/esm/util/renderStoriesForChromatic.js +2 -2
  91. package/esm/util/renderStoriesForChromatic.js.map +1 -1
  92. package/esm/util/virtualfocus/Context.d.ts +1 -1
  93. package/package.json +4 -4
  94. package/src/chat/Chat.tsx +3 -3
  95. package/src/copybutton/CopyButton.tsx +1 -1
  96. package/src/date/date-utils/dropdown-options.test.ts +37 -9
  97. package/src/date/date-utils/dropdown-options.ts +23 -12
  98. package/src/date/datepicker/parts/DatePicker.Months.tsx +8 -2
  99. package/src/form/combobox/Input/Input.context.tsx +2 -2
  100. package/src/form/useFormField.ts +1 -1
  101. package/src/layout/page/parts/PageBlock.tsx +4 -0
  102. package/src/modal/ModalUtils.ts +2 -2
  103. package/src/overlays/action-menu/ActionMenu.tsx +1 -1
  104. package/src/overlays/floating/Floating.tsx +2 -2
  105. package/src/overlays/overlay/hooks/{useOpenChangeComplete.ts → useOpenChangeAnimationComplete.ts} +3 -3
  106. package/src/overlays/overlay/hooks/useTransitionStatus.ts +145 -0
  107. package/src/progress-bar/ProgressBar.tsx +1 -1
  108. package/src/read-more/ReadMore.tsx +4 -11
  109. package/src/table/AnimateHeight.tsx +2 -2
  110. package/src/tabs/parts/tablist/useScrollButtons.ts +3 -1
  111. package/src/util/hooks/useMergeRefs.ts +5 -5
  112. package/src/util/link-anchor/LinkAnchor.tsx +1 -1
  113. package/src/util/renderStoriesForChromatic.tsx +4 -5
  114. package/cjs/overlays/overlay/hooks/useOpenChangeComplete.js.map +0 -1
  115. package/esm/overlays/overlay/hooks/useOpenChangeComplete.js.map +0 -1
@@ -13,12 +13,17 @@ import {
13
13
  } from "date-fns";
14
14
 
15
15
  /** Return the months to show in the dropdown. */
16
- export function getMonthOptions(
17
- displayMonth: Date,
18
- navStart: Date | undefined,
19
- navEnd: Date | undefined,
20
- locale: Locale,
21
- ):
16
+ export function getMonthOptions({
17
+ displayMonth,
18
+ navStart,
19
+ navEnd,
20
+ locale,
21
+ }: {
22
+ displayMonth: Date;
23
+ navStart: Date | undefined;
24
+ navEnd: Date | undefined;
25
+ locale: Locale;
26
+ }):
22
27
  | {
23
28
  value: number;
24
29
  label: string;
@@ -31,7 +36,9 @@ export function getMonthOptions(
31
36
  });
32
37
 
33
38
  const options = months.map((month) => {
34
- const label = format(month, "LLLL", { locale });
39
+ const label = format(month, "LLLL", {
40
+ locale,
41
+ }).replace(".", "");
35
42
  const value = getMonth(month);
36
43
  const disabled =
37
44
  (navStart && month < startOfMonth(navStart)) ||
@@ -44,11 +51,15 @@ export function getMonthOptions(
44
51
  }
45
52
 
46
53
  /** Return the years to show in the dropdown. */
47
- export function getYearOptions(
48
- navStart: Date | undefined,
49
- navEnd: Date | undefined,
50
- locale: Locale,
51
- ):
54
+ export function getYearOptions({
55
+ navStart,
56
+ navEnd,
57
+ locale,
58
+ }: {
59
+ navStart: Date | undefined;
60
+ navEnd: Date | undefined;
61
+ locale: Locale;
62
+ }):
52
63
  | {
53
64
  value: number;
54
65
  label: string;
@@ -69,8 +69,14 @@ const DatePickerMonths = ({
69
69
  today: dayPickerProps.today,
70
70
  });
71
71
 
72
- const months = getMonthOptions(calendarMonth.date, navStart, navEnd, locale);
73
- const dropdownYears = getYearOptions(navStart, navEnd, locale);
72
+ const months = getMonthOptions({
73
+ displayMonth: calendarMonth.date,
74
+ navStart,
75
+ navEnd,
76
+ locale,
77
+ });
78
+
79
+ const dropdownYears = getYearOptions({ navStart, navEnd, locale });
74
80
 
75
81
  return (
76
82
  <div {...omit(rest, ["displayIndex"])}>
@@ -8,14 +8,14 @@ interface InputContextValue extends FormFieldType {
8
8
  clearInput: NonNullable<ComboboxProps["onClear"]>;
9
9
  error?: ComboboxProps["error"];
10
10
  focusInput: () => void;
11
- inputRef: React.RefObject<HTMLInputElement>;
11
+ inputRef: React.RefObject<HTMLInputElement | null>;
12
12
  value: string;
13
13
  setValue: (text: string) => void;
14
14
  onChange: (newValue: string) => void;
15
15
  searchTerm: string;
16
16
  setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
17
17
  shouldAutocomplete?: boolean;
18
- toggleOpenButtonRef: React.RefObject<HTMLDivElement>;
18
+ toggleOpenButtonRef: React.MutableRefObject<HTMLDivElement | null>;
19
19
  hideCaret: boolean;
20
20
  setHideCaret: React.Dispatch<React.SetStateAction<boolean>>;
21
21
  }
@@ -116,7 +116,7 @@ export function containsReadMore(
116
116
  children: React.ReactNode,
117
117
  checkNested = true,
118
118
  ): boolean {
119
- if (React.isValidElement(children)) {
119
+ if (React.isValidElement<{ children?: any }>(children)) {
120
120
  if (children.type === ReadMore) {
121
121
  return true;
122
122
  }
@@ -8,19 +8,23 @@ export interface PageBlockProps extends React.HTMLAttributes<HTMLDivElement> {
8
8
  /**
9
9
  * Predefined max-width
10
10
  * @example
11
+ * ```
11
12
  * text: 576px + dynamic gutters
12
13
  * md: 768px
13
14
  * lg: 1024px
14
15
  * xl: 1280px
15
16
  * 2xl: 1440px
17
+ * ```
16
18
  * @default max-width: 100%;
17
19
  */
18
20
  width?: (typeof widths)[number];
19
21
  /**
20
22
  * Adds a standardised responsive padding-inline
21
23
  * @example
24
+ * ```
22
25
  * 3rem on > md
23
26
  * 1rem on < md
27
+ * ```
24
28
  * @default false
25
29
  */
26
30
  gutters?: boolean;
@@ -16,7 +16,7 @@ export const coordsAreInside = (
16
16
  };
17
17
 
18
18
  export function getCloseHandler(
19
- modalRef: React.RefObject<HTMLDialogElement>,
19
+ modalRef: React.RefObject<HTMLDialogElement | null>,
20
20
  header: ModalProps["header"],
21
21
  onBeforeClose: ModalProps["onBeforeClose"],
22
22
  ) {
@@ -31,7 +31,7 @@ export const BODY_CLASS_LEGACY = "navds-modal__document-body";
31
31
  export const BODY_CLASS = "aksel-modal__document-body";
32
32
 
33
33
  export function useBodyScrollLock(
34
- modalRef: React.RefObject<HTMLDialogElement>,
34
+ modalRef: React.RefObject<HTMLDialogElement | null>,
35
35
  portalNode: HTMLElement | null,
36
36
  isNested: boolean,
37
37
  ) {
@@ -16,7 +16,7 @@ import { Menu, MenuPortalProps } from "../floating-menu/Menu";
16
16
  /* -------------------------------------------------------------------------- */
17
17
  type ActionMenuContextValue = {
18
18
  triggerId: string;
19
- triggerRef: React.RefObject<HTMLButtonElement>;
19
+ triggerRef: React.RefObject<HTMLButtonElement | null>;
20
20
  contentId: string;
21
21
  open: boolean;
22
22
  onOpenChange: (open: boolean) => void;
@@ -27,7 +27,7 @@ import {
27
27
  useMergeRefs,
28
28
  } from "../../util/hooks";
29
29
  import { AsChildProps } from "../../util/types";
30
- import { useOpenChangeComplete } from "../overlay/hooks/useOpenChangeComplete";
30
+ import { useOpenChangeAnimationComplete } from "../overlay/hooks/useOpenChangeAnimationComplete";
31
31
  import {
32
32
  type Align,
33
33
  type Measurable,
@@ -363,7 +363,7 @@ const FloatingContent = forwardRef<HTMLDivElement, FloatingContentProps>(
363
363
  }
364
364
  }, [autoUpdateWhileMounted, enabled, floatingElements, update]);
365
365
 
366
- useOpenChangeComplete({
366
+ useOpenChangeAnimationComplete({
367
367
  enabled: !!modalContext?.ref,
368
368
  open: enabled,
369
369
  ref: modalContext?.ref,
@@ -5,7 +5,7 @@ import { useAnimationsFinished } from "./useAnimationsFinished";
5
5
  import { useEventCallback } from "./useEventCallback";
6
6
  import { useLatestRef } from "./useLatestRef";
7
7
 
8
- interface useOpenChangeCompleteParameters {
8
+ interface useOpenChangeAnimationCompleteParameters {
9
9
  /**
10
10
  * Enable / disable the effect. Disabled => no animation tracking / callback.
11
11
  * @default true
@@ -34,8 +34,8 @@ interface useOpenChangeCompleteParameters {
34
34
  * comparing the `open` value captured at scheduling time with the latest `open` via ref;
35
35
  * if they differ (state flipped again mid‑animation) the callback is skipped.
36
36
  */
37
- export function useOpenChangeComplete(
38
- parameters: useOpenChangeCompleteParameters,
37
+ export function useOpenChangeAnimationComplete(
38
+ parameters: useOpenChangeAnimationCompleteParameters,
39
39
  ) {
40
40
  const {
41
41
  enabled = true,
@@ -0,0 +1,145 @@
1
+ "use client";
2
+
3
+ import { useMemo, useState } from "react";
4
+ import ReactDOM from "react-dom";
5
+ import { useClientLayoutEffect } from "../../../util";
6
+
7
+ type TransitionStatus = "entering" | "exiting" | "idle" | undefined;
8
+
9
+ /**
10
+ * Transition status state machine for components that animate between an
11
+ * `open` boolean and actual mount/unmount. Keeps the element mounted while
12
+ * exit animations run and introduces an optional stable `idle` phase.
13
+ *
14
+ * Adapted from MUI Base + Floating UI examples:
15
+ * - Source: https://github.com/mui/base-ui/blob/6fd69008d83561dbe75ff89acf270f0fac3e0049/packages/react/src/utils/useTransitionStatus.ts
16
+ * - Originally based on https://github.com/floating-ui/floating-ui/blob/7c33a3d0198a9b523d54ae2c37cedb315a309452/packages/react/src/hooks/useTransition.ts
17
+ *
18
+ * States (transitionStatus):
19
+ * - "entering" : just entered (initial frame of enter) OR re-entering to reach "idle".
20
+ * - "idle" : stable open (only when `enableIdleState === true`).
21
+ * - "exiting" : exit animation is running; element still mounted.
22
+ * - undefined : closed (unmounted) OR stable open when idle state is disabled.
23
+ * When `enableIdleState` is false we clear the label after
24
+ * the first frame so styling can rely purely on `mounted`.
25
+ *
26
+ * Distinction:
27
+ * - `mounted` tells you whether to render DOM.
28
+ * - `transitionStatus` tells you which phase-specific classes to apply.
29
+ *
30
+ * Frame separation: state changes that must trigger CSS transitions are
31
+ * scheduled with `requestAnimationFrame` so the browser sees distinct style
32
+ * mutations across frames (avoids missed transitions due to batching).
33
+ *
34
+ * @param open Controls visibility lifecycle.
35
+ * @param enableIdleState Insert a persistent "idle" phase after entering.
36
+ * @param deferExitingState Delay entering the exit phase by one frame to allow
37
+ * measurement / layout work before applying exit styles.
38
+ */
39
+ function useTransitionStatus(
40
+ open: boolean,
41
+ enableIdleState: boolean = false,
42
+ deferExitingState: boolean = false,
43
+ ) {
44
+ const [mounted, setMounted] = useState(open);
45
+ const [transitionStatus, setTransitionStatus] = useState<TransitionStatus>(
46
+ open && enableIdleState ? "idle" : undefined,
47
+ );
48
+
49
+ /* Opening: mount immediately and label as "entering" for the first frame. */
50
+ if (open && !mounted) {
51
+ setMounted(true);
52
+ setTransitionStatus("entering");
53
+ }
54
+
55
+ /* Closing (no defer): begin exit animation right away. */
56
+ if (
57
+ !open &&
58
+ mounted &&
59
+ transitionStatus !== "exiting" &&
60
+ !deferExitingState
61
+ ) {
62
+ setTransitionStatus("exiting");
63
+ }
64
+
65
+ /* Cleanup: after unmount post-exit ensure status returns to undefined. */
66
+ if (!open && !mounted && transitionStatus === "exiting") {
67
+ setTransitionStatus(undefined);
68
+ }
69
+
70
+ /* Deferred closing: provide one frame to measure / flush layout before exit styles. */
71
+ useClientLayoutEffect(() => {
72
+ if (
73
+ !open &&
74
+ mounted &&
75
+ transitionStatus !== "exiting" &&
76
+ deferExitingState
77
+ ) {
78
+ const frame = requestAnimationFrame(() => {
79
+ setTransitionStatus("exiting");
80
+ });
81
+
82
+ return () => {
83
+ cancelAnimationFrame(frame);
84
+ };
85
+ }
86
+
87
+ return undefined;
88
+ }, [open, mounted, transitionStatus, deferExitingState]);
89
+
90
+ /* Enter (no idle): hold "entering" for one frame, then clear label (stable open). */
91
+ useClientLayoutEffect(() => {
92
+ if (!open || enableIdleState) {
93
+ return undefined;
94
+ }
95
+
96
+ const frame = requestAnimationFrame(() => {
97
+ ReactDOM.flushSync(() => {
98
+ setTransitionStatus(undefined);
99
+ });
100
+ });
101
+
102
+ return () => {
103
+ cancelAnimationFrame(frame);
104
+ };
105
+ }, [enableIdleState, open]);
106
+
107
+ useClientLayoutEffect(() => {
108
+ if (!open || !enableIdleState) {
109
+ return undefined;
110
+ }
111
+
112
+ /*
113
+ * We can enter this state by re-opening before exiting-state was finished
114
+ * (open → close → open in quick succession).
115
+ */
116
+ if (open && mounted && transitionStatus !== "idle") {
117
+ setTransitionStatus("entering");
118
+ }
119
+
120
+ /**
121
+ * Next frame, after "entering", switch to persistent "idle" state.
122
+ * By delaying to the next frame we ensure any "entering" styles are
123
+ * applied and the transition can run.
124
+ */
125
+ const frame = requestAnimationFrame(() => {
126
+ setTransitionStatus("idle");
127
+ });
128
+
129
+ return () => {
130
+ cancelAnimationFrame(frame);
131
+ };
132
+ }, [enableIdleState, open, mounted, setTransitionStatus, transitionStatus]);
133
+
134
+ return useMemo(
135
+ () => ({
136
+ mounted,
137
+ setMounted,
138
+ transitionStatus,
139
+ }),
140
+ [mounted, transitionStatus],
141
+ );
142
+ }
143
+
144
+ export { useTransitionStatus };
145
+ export type { TransitionStatus };
@@ -95,7 +95,7 @@ export const ProgressBar = forwardRef<HTMLDivElement, ProgressBarProps>(
95
95
  ) => {
96
96
  const { cn } = useRenameCSS();
97
97
  const translateX = 100 - (Math.round(value) / valueMax) * 100;
98
- const onTimeoutRef = useRef<() => void>();
98
+ const onTimeoutRef = useRef<() => void>(undefined);
99
99
  onTimeoutRef.current = simulated?.onTimeout;
100
100
  const translate = useI18n("ProgressBar");
101
101
 
@@ -26,11 +26,11 @@ export interface ReadMoreProps
26
26
  */
27
27
  defaultOpen?: boolean;
28
28
  /**
29
- * Callback for current open-state
29
+ * Callback for current open-state.
30
30
  */
31
31
  onOpenChange?: (open: boolean) => void;
32
32
  /**
33
- * Changes fontsize for content.
33
+ * Changes font size for content.
34
34
  * @default "medium"
35
35
  */
36
36
  size?: "large" | "medium" | "small";
@@ -42,14 +42,7 @@ export interface ReadMoreProps
42
42
  * @see 🏷️ {@link ReadMoreProps}
43
43
  *
44
44
  * @example
45
- * // Default
46
45
  * <ReadMore header="Dette regnes som helsemessige begrensninger">
47
- * Med helsemessige begrensninger mener vi funksjonshemming, sykdom...
48
- * </ReadMore>
49
- *
50
- * @example
51
- * // Litt mindre versjon
52
- * <ReadMore size="small" header="Dette regnes som helsemessige begrensninger">
53
46
  * Med helsemessige begrensninger mener vi funksjonshemming, sykdom...
54
47
  * </ReadMore>
55
48
  */
@@ -65,7 +58,7 @@ export const ReadMore = forwardRef<HTMLButtonElement, ReadMoreProps>(
65
58
  size = "medium",
66
59
  onOpenChange,
67
60
  ...rest
68
- },
61
+ }: ReadMoreProps,
69
62
  ref,
70
63
  ) => {
71
64
  const { cn } = useRenameCSS();
@@ -107,7 +100,7 @@ export const ReadMore = forwardRef<HTMLButtonElement, ReadMoreProps>(
107
100
 
108
101
  <BodyLong
109
102
  as="div"
110
- aria-hidden={!_open}
103
+ tabIndex={0}
111
104
  className={cn("navds-read-more__content", {
112
105
  "navds-read-more__content--closed": !_open,
113
106
  })}
@@ -73,8 +73,8 @@ const AnimateHeight: React.FC<AnimateHeightProps> = ({
73
73
  const prevHeight = useRef<Height>(height);
74
74
  const contentElement = useRef<HTMLDivElement>(null);
75
75
 
76
- const animationClassesTimeoutID = useRef<Timeout>();
77
- const timeoutID = useRef<Timeout>();
76
+ const animationClassesTimeoutID = useRef<Timeout>(undefined);
77
+ const timeoutID = useRef<Timeout>(undefined);
78
78
 
79
79
  const initialHeight = useRef<Height>(height);
80
80
  const initialOverflow = useRef<Overflow>("visible");
@@ -1,7 +1,9 @@
1
1
  import { useEffect, useMemo, useState } from "react";
2
2
  import { debounce } from "../../../util";
3
3
 
4
- export function useScrollButtons(listRef: React.RefObject<HTMLDivElement>) {
4
+ export function useScrollButtons(
5
+ listRef: React.RefObject<HTMLDivElement | null>,
6
+ ) {
5
7
  const [displayScroll, setDisplayScroll] = useState({
6
8
  start: false,
7
9
  end: false,
@@ -1,20 +1,20 @@
1
1
  /* https://github.com/radix-ui/primitives/blob/main/packages/react/compose-refs/src/composeRefs.tsx */
2
2
  import React from "react";
3
3
 
4
- type PossibleRef<T> = React.LegacyRef<T> | undefined;
4
+ type PossibleRef<T> = React.Ref<T> | undefined;
5
5
 
6
6
  // https://github.com/gregberge/react-merge-refs
7
7
  /**
8
8
  * Use `useMergeRefs`
9
9
  * @internal
10
10
  */
11
- export function mergeRefs<T>(refs: PossibleRef<T>[]): React.RefCallback<T> {
12
- return (value) => {
11
+ export function mergeRefs<T>(refs: PossibleRef<T>[]) {
12
+ return (instance: T | null) => {
13
13
  refs.forEach((ref) => {
14
14
  if (typeof ref === "function") {
15
- ref(value);
15
+ ref(instance);
16
16
  } else if (ref !== null && ref !== undefined) {
17
- (ref as React.MutableRefObject<T | null>).current = value;
17
+ (ref as React.MutableRefObject<T | null>).current = instance;
18
18
  }
19
19
  });
20
20
  };
@@ -14,7 +14,7 @@ import { useMergeRefs } from "../hooks/useMergeRefs";
14
14
  import { AsChildProps } from "../types";
15
15
 
16
16
  type LinkAnchorOverlayContextProps = {
17
- anchorRef: React.RefObject<HTMLAnchorElement>;
17
+ anchorRef: React.RefObject<HTMLAnchorElement | null>;
18
18
  };
19
19
 
20
20
  const [LinkAnchorContextProvider, useLinkAnchorContext] =
@@ -1,21 +1,20 @@
1
- import { Args, StoryObj } from "@storybook/react";
1
+ import { Args, StoryObj } from "@storybook/react-vite";
2
2
  import React from "react";
3
3
  import { Renderer, StoryContext } from "storybook/internal/types";
4
4
 
5
5
  export function renderStoriesForChromatic(
6
6
  stories: Record<
7
7
  string,
8
- | { render?: (...args: any[]) => React.ReactNode }
9
- | React.FunctionComponent<void>
8
+ { render?: (...args: any[]) => React.ReactNode } | React.FunctionComponent
10
9
  >,
11
10
  ): StoryObj {
12
11
  return {
13
12
  render: (...args: [Args, StoryContext<Renderer, Args>]) => (
14
13
  <>
15
- {Object.entries(stories).map(([storyName, story]) => (
14
+ {Object.entries(stories).map(([storyName, Story]) => (
16
15
  <div key={storyName}>
17
16
  <h2 className="storyheading">{storyName}</h2>
18
- {typeof story === "function" ? story() : story.render?.(...args)}
17
+ {typeof Story === "function" ? <Story /> : Story.render?.(...args)}
19
18
  </div>
20
19
  ))}
21
20
  </>
@@ -1 +0,0 @@
1
- {"version":3,"file":"useOpenChangeComplete.js","sourceRoot":"","sources":["../../../../src/overlays/overlay/hooks/useOpenChangeComplete.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAoCb,sDA6BC;AA/DD,iCAAyC;AACzC,mEAAgE;AAChE,yDAAsD;AACtD,iDAA8C;AAyB9C;;;;;GAKG;AACH,SAAgB,qBAAqB,CACnC,UAA2C;IAE3C,MAAM,EACJ,OAAO,GAAG,IAAI,EACd,IAAI,EACJ,GAAG,GAAG,IAAI,EACV,UAAU,EAAE,eAAe,GAC5B,GAAG,UAAU,CAAC;IAEf,MAAM,OAAO,GAAG,IAAA,2BAAY,EAAC,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,IAAA,mCAAgB,EAAC,eAAe,CAAC,CAAC;IACrD,MAAM,uBAAuB,GAAG,IAAA,6CAAqB,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEjE,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED;;;WAGG;QACH,uBAAuB,CAAC,GAAG,EAAE;YAC3B,IAAI,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC7B,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC,CAAC;AACpE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useOpenChangeComplete.js","sourceRoot":"","sources":["../../../../src/overlays/overlay/hooks/useOpenChangeComplete.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAyB9C;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAA2C;IAE3C,MAAM,EACJ,OAAO,GAAG,IAAI,EACd,IAAI,EACJ,GAAG,GAAG,IAAI,EACV,UAAU,EAAE,eAAe,GAC5B,GAAG,UAAU,CAAC;IAEf,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACrD,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEjE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED;;;WAGG;QACH,uBAAuB,CAAC,GAAG,EAAE;YAC3B,IAAI,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC7B,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC,CAAC;AACpE,CAAC"}