@navikt/ds-react 7.30.1 → 7.32.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 (174) 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/form/checkbox/Checkbox.js +1 -1
  6. package/cjs/form/checkbox/Checkbox.js.map +1 -1
  7. package/cjs/form/combobox/Combobox.js +15 -13
  8. package/cjs/form/combobox/Combobox.js.map +1 -1
  9. package/cjs/form/combobox/FilteredOptions/FilteredOptions.js +53 -3
  10. package/cjs/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
  11. package/cjs/form/combobox/FilteredOptions/useVirtualFocus.js.map +1 -1
  12. package/cjs/form/combobox/Input/Input.context.d.ts +2 -2
  13. package/cjs/form/combobox/Input/InputController.js +15 -14
  14. package/cjs/form/combobox/Input/InputController.js.map +1 -1
  15. package/cjs/form/file-upload/useFileUpload.d.ts +1 -1
  16. package/cjs/form/radio/Radio.js +1 -1
  17. package/cjs/form/radio/Radio.js.map +1 -1
  18. package/cjs/form/useFormField.js.map +1 -1
  19. package/cjs/modal/ModalUtils.d.ts +2 -2
  20. package/cjs/modal/ModalUtils.js.map +1 -1
  21. package/cjs/overlays/dismissablelayer/DismissableLayer.d.ts +1 -1
  22. package/cjs/overlays/floating/Floating.d.ts +11 -0
  23. package/cjs/overlays/floating/Floating.js +32 -8
  24. package/cjs/overlays/floating/Floating.js.map +1 -1
  25. package/cjs/overlays/overlay/hooks/useAnimationsFinished.d.ts +27 -0
  26. package/cjs/overlays/overlay/hooks/useAnimationsFinished.js +138 -0
  27. package/cjs/overlays/overlay/hooks/useAnimationsFinished.js.map +1 -0
  28. package/cjs/overlays/overlay/hooks/useEventCallback.d.ts +6 -0
  29. package/cjs/overlays/overlay/hooks/useEventCallback.js +89 -0
  30. package/cjs/overlays/overlay/hooks/useEventCallback.js.map +1 -0
  31. package/cjs/overlays/overlay/hooks/useLatestRef.d.ts +5 -0
  32. package/cjs/overlays/overlay/hooks/useLatestRef.js +23 -0
  33. package/cjs/overlays/overlay/hooks/useLatestRef.js.map +1 -0
  34. package/cjs/overlays/overlay/hooks/useOpenChangeAnimationComplete.d.ts +31 -0
  35. package/cjs/overlays/overlay/hooks/useOpenChangeAnimationComplete.js +35 -0
  36. package/cjs/overlays/overlay/hooks/useOpenChangeAnimationComplete.js.map +1 -0
  37. package/cjs/overlays/overlay/hooks/useRefWithInit.d.ts +7 -0
  38. package/cjs/overlays/overlay/hooks/useRefWithInit.js +14 -0
  39. package/cjs/overlays/overlay/hooks/useRefWithInit.js.map +1 -0
  40. package/cjs/overlays/overlay/hooks/useTransitionStatus.d.ts +38 -0
  41. package/cjs/overlays/overlay/hooks/useTransitionStatus.js +118 -0
  42. package/cjs/overlays/overlay/hooks/useTransitionStatus.js.map +1 -0
  43. package/cjs/progress-bar/ProgressBar.js +1 -1
  44. package/cjs/progress-bar/ProgressBar.js.map +1 -1
  45. package/cjs/read-more/ReadMore.d.ts +2 -9
  46. package/cjs/read-more/ReadMore.js +1 -8
  47. package/cjs/read-more/ReadMore.js.map +1 -1
  48. package/cjs/table/AnimateHeight.js +2 -2
  49. package/cjs/table/AnimateHeight.js.map +1 -1
  50. package/cjs/table/ExpandableRow.d.ts +1 -1
  51. package/cjs/table/ExpandableRow.js +2 -10
  52. package/cjs/table/ExpandableRow.js.map +1 -1
  53. package/cjs/table/Row.d.ts +7 -0
  54. package/cjs/table/Row.js +13 -2
  55. package/cjs/table/Row.js.map +1 -1
  56. package/cjs/table/Table.utils.d.ts +9 -0
  57. package/cjs/table/Table.utils.js +57 -0
  58. package/cjs/table/Table.utils.js.map +1 -0
  59. package/cjs/tabs/Tabs.context.d.ts +1 -1
  60. package/cjs/tabs/parts/tab/useTab.d.ts +1 -1
  61. package/cjs/tabs/parts/tablist/useScrollButtons.d.ts +1 -1
  62. package/cjs/tabs/parts/tablist/useScrollButtons.js.map +1 -1
  63. package/cjs/toggle-group/ToggleGroup.context.d.ts +1 -1
  64. package/cjs/toggle-group/parts/useToggleItem.d.ts +1 -1
  65. package/cjs/util/hooks/descendants/useDescendant.d.ts +1 -1
  66. package/cjs/util/hooks/useMergeRefs.d.ts +3 -3
  67. package/cjs/util/hooks/useMergeRefs.js +3 -3
  68. package/cjs/util/hooks/useMergeRefs.js.map +1 -1
  69. package/cjs/util/renderStoriesForChromatic.d.ts +2 -2
  70. package/cjs/util/renderStoriesForChromatic.js +2 -2
  71. package/cjs/util/renderStoriesForChromatic.js.map +1 -1
  72. package/cjs/util/virtualfocus/Context.d.ts +1 -1
  73. package/esm/chat/Chat.d.ts +1 -1
  74. package/esm/chat/Chat.js.map +1 -1
  75. package/esm/copybutton/CopyButton.js +1 -1
  76. package/esm/copybutton/CopyButton.js.map +1 -1
  77. package/esm/form/checkbox/Checkbox.js +1 -1
  78. package/esm/form/checkbox/Checkbox.js.map +1 -1
  79. package/esm/form/combobox/Combobox.js +15 -13
  80. package/esm/form/combobox/Combobox.js.map +1 -1
  81. package/esm/form/combobox/FilteredOptions/FilteredOptions.js +21 -4
  82. package/esm/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
  83. package/esm/form/combobox/FilteredOptions/useVirtualFocus.js.map +1 -1
  84. package/esm/form/combobox/Input/Input.context.d.ts +2 -2
  85. package/esm/form/combobox/Input/InputController.js +15 -14
  86. package/esm/form/combobox/Input/InputController.js.map +1 -1
  87. package/esm/form/file-upload/useFileUpload.d.ts +1 -1
  88. package/esm/form/radio/Radio.js +1 -1
  89. package/esm/form/radio/Radio.js.map +1 -1
  90. package/esm/form/useFormField.js.map +1 -1
  91. package/esm/modal/ModalUtils.d.ts +2 -2
  92. package/esm/modal/ModalUtils.js.map +1 -1
  93. package/esm/overlays/dismissablelayer/DismissableLayer.d.ts +1 -1
  94. package/esm/overlays/floating/Floating.d.ts +11 -0
  95. package/esm/overlays/floating/Floating.js +32 -8
  96. package/esm/overlays/floating/Floating.js.map +1 -1
  97. package/esm/overlays/overlay/hooks/useAnimationsFinished.d.ts +27 -0
  98. package/esm/overlays/overlay/hooks/useAnimationsFinished.js +99 -0
  99. package/esm/overlays/overlay/hooks/useAnimationsFinished.js.map +1 -0
  100. package/esm/overlays/overlay/hooks/useEventCallback.d.ts +6 -0
  101. package/esm/overlays/overlay/hooks/useEventCallback.js +53 -0
  102. package/esm/overlays/overlay/hooks/useEventCallback.js.map +1 -0
  103. package/esm/overlays/overlay/hooks/useLatestRef.d.ts +5 -0
  104. package/esm/overlays/overlay/hooks/useLatestRef.js +20 -0
  105. package/esm/overlays/overlay/hooks/useLatestRef.js.map +1 -0
  106. package/esm/overlays/overlay/hooks/useOpenChangeAnimationComplete.d.ts +31 -0
  107. package/esm/overlays/overlay/hooks/useOpenChangeAnimationComplete.js +32 -0
  108. package/esm/overlays/overlay/hooks/useOpenChangeAnimationComplete.js.map +1 -0
  109. package/esm/overlays/overlay/hooks/useRefWithInit.d.ts +7 -0
  110. package/esm/overlays/overlay/hooks/useRefWithInit.js +12 -0
  111. package/esm/overlays/overlay/hooks/useRefWithInit.js.map +1 -0
  112. package/esm/overlays/overlay/hooks/useTransitionStatus.d.ts +38 -0
  113. package/esm/overlays/overlay/hooks/useTransitionStatus.js +113 -0
  114. package/esm/overlays/overlay/hooks/useTransitionStatus.js.map +1 -0
  115. package/esm/progress-bar/ProgressBar.js +1 -1
  116. package/esm/progress-bar/ProgressBar.js.map +1 -1
  117. package/esm/read-more/ReadMore.d.ts +2 -9
  118. package/esm/read-more/ReadMore.js +1 -8
  119. package/esm/read-more/ReadMore.js.map +1 -1
  120. package/esm/table/AnimateHeight.js +2 -2
  121. package/esm/table/AnimateHeight.js.map +1 -1
  122. package/esm/table/ExpandableRow.d.ts +1 -1
  123. package/esm/table/ExpandableRow.js +2 -10
  124. package/esm/table/ExpandableRow.js.map +1 -1
  125. package/esm/table/Row.d.ts +7 -0
  126. package/esm/table/Row.js +13 -2
  127. package/esm/table/Row.js.map +1 -1
  128. package/esm/table/Table.utils.d.ts +9 -0
  129. package/esm/table/Table.utils.js +55 -0
  130. package/esm/table/Table.utils.js.map +1 -0
  131. package/esm/tabs/Tabs.context.d.ts +1 -1
  132. package/esm/tabs/parts/tab/useTab.d.ts +1 -1
  133. package/esm/tabs/parts/tablist/useScrollButtons.d.ts +1 -1
  134. package/esm/tabs/parts/tablist/useScrollButtons.js.map +1 -1
  135. package/esm/toggle-group/ToggleGroup.context.d.ts +1 -1
  136. package/esm/toggle-group/parts/useToggleItem.d.ts +1 -1
  137. package/esm/util/hooks/descendants/useDescendant.d.ts +1 -1
  138. package/esm/util/hooks/useMergeRefs.d.ts +3 -3
  139. package/esm/util/hooks/useMergeRefs.js +3 -3
  140. package/esm/util/hooks/useMergeRefs.js.map +1 -1
  141. package/esm/util/renderStoriesForChromatic.d.ts +2 -2
  142. package/esm/util/renderStoriesForChromatic.js +2 -2
  143. package/esm/util/renderStoriesForChromatic.js.map +1 -1
  144. package/esm/util/virtualfocus/Context.d.ts +1 -1
  145. package/package.json +4 -4
  146. package/src/chat/Chat.tsx +3 -3
  147. package/src/copybutton/CopyButton.tsx +1 -1
  148. package/src/form/checkbox/Checkbox.tsx +5 -3
  149. package/src/form/combobox/Combobox.tsx +44 -41
  150. package/src/form/combobox/FilteredOptions/FilteredOptions.tsx +29 -4
  151. package/src/form/combobox/FilteredOptions/useVirtualFocus.ts +1 -0
  152. package/src/form/combobox/Input/Input.context.tsx +2 -2
  153. package/src/form/combobox/Input/InputController.tsx +33 -29
  154. package/src/form/radio/Radio.tsx +5 -3
  155. package/src/form/useFormField.ts +1 -1
  156. package/src/modal/ModalUtils.ts +2 -2
  157. package/src/overlays/action-menu/ActionMenu.tsx +1 -1
  158. package/src/overlays/floating/Floating.tsx +110 -59
  159. package/src/overlays/overlay/hooks/useAnimationsFinished.ts +117 -0
  160. package/src/overlays/overlay/hooks/useEventCallback.ts +73 -0
  161. package/src/overlays/overlay/hooks/useLatestRef.ts +25 -0
  162. package/src/overlays/overlay/hooks/useOpenChangeAnimationComplete.ts +66 -0
  163. package/src/overlays/overlay/hooks/useRefWithInit.ts +25 -0
  164. package/src/overlays/overlay/hooks/useTransitionStatus.ts +145 -0
  165. package/src/progress-bar/ProgressBar.tsx +1 -1
  166. package/src/read-more/ReadMore.tsx +4 -11
  167. package/src/table/AnimateHeight.tsx +2 -2
  168. package/src/table/ExpandableRow.tsx +4 -17
  169. package/src/table/Row.tsx +33 -1
  170. package/src/table/Table.utils.ts +65 -0
  171. package/src/tabs/parts/tablist/useScrollButtons.ts +3 -1
  172. package/src/util/hooks/useMergeRefs.ts +5 -5
  173. package/src/util/link-anchor/LinkAnchor.tsx +1 -1
  174. package/src/util/renderStoriesForChromatic.tsx +4 -5
@@ -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");
@@ -8,8 +8,10 @@ import { useI18n } from "../util/i18n/i18n.hooks";
8
8
  import AnimateHeight from "./AnimateHeight";
9
9
  import DataCell from "./DataCell";
10
10
  import Row, { RowProps } from "./Row";
11
+ import { isElementInteractiveTarget } from "./Table.utils";
11
12
 
12
- export interface ExpandableRowProps extends Omit<RowProps, "content"> {
13
+ export interface ExpandableRowProps
14
+ extends Omit<RowProps, "content" | "onRowClick"> {
13
15
  /**
14
16
  * Content of the expanded row
15
17
  */
@@ -96,7 +98,7 @@ export const ExpandableRow: ExpandableRowType = forwardRef(
96
98
  const handleRowClick = (event: React.MouseEvent<HTMLTableRowElement>) => {
97
99
  expandOnRowClick &&
98
100
  !expansionDisabled &&
99
- !isInteractiveTarget(event.target as HTMLElement) &&
101
+ !isElementInteractiveTarget(event.target as HTMLElement) &&
100
102
  expansionHandler(event);
101
103
  };
102
104
 
@@ -167,19 +169,4 @@ export const ExpandableRow: ExpandableRowType = forwardRef(
167
169
  },
168
170
  );
169
171
 
170
- function isInteractiveTarget(elm: HTMLElement) {
171
- if (elm.nodeName === "TD" || elm.nodeName === "TH" || !elm.parentElement) {
172
- return false;
173
- }
174
- if (
175
- ["BUTTON", "DETAILS", "LABEL", "SELECT", "TEXTAREA", "INPUT", "A"].includes(
176
- elm.nodeName,
177
- )
178
- ) {
179
- return true;
180
- }
181
-
182
- return isInteractiveTarget(elm.parentElement);
183
- }
184
-
185
172
  export default ExpandableRow;
package/src/table/Row.tsx CHANGED
@@ -1,5 +1,7 @@
1
1
  import React, { forwardRef } from "react";
2
2
  import { useRenameCSS } from "../theme/Theme";
3
+ import { composeEventHandlers } from "../util/composeEventHandlers";
4
+ import { isElementInteractiveTarget } from "./Table.utils";
3
5
 
4
6
  export interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
5
7
  /**
@@ -12,6 +14,13 @@ export interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
12
14
  * @default true
13
15
  */
14
16
  shadeOnHover?: boolean;
17
+ /**
18
+ * Click handler for row. This differs from onClick by not being called
19
+ * when clicking on interactive elements within the row (buttons, links, inputs etc).
20
+ *
21
+ * **Warning:** This will not be accessible by keyboard! Provide an alternative way to select the row, e.g. a checkbox or a button.
22
+ */
23
+ onRowClick?: (event: React.MouseEvent<HTMLTableRowElement>) => void;
15
24
  }
16
25
 
17
26
  export type RowType = React.ForwardRefExoticComponent<
@@ -19,8 +28,29 @@ export type RowType = React.ForwardRefExoticComponent<
19
28
  >;
20
29
 
21
30
  export const Row: RowType = forwardRef(
22
- ({ className, selected = false, shadeOnHover = true, ...rest }, ref) => {
31
+ (
32
+ {
33
+ className,
34
+ selected = false,
35
+ shadeOnHover = true,
36
+ onClick,
37
+ onRowClick,
38
+ ...rest
39
+ },
40
+ ref,
41
+ ) => {
23
42
  const { cn } = useRenameCSS();
43
+
44
+ const handleRowClick = (event: React.MouseEvent<HTMLTableRowElement>) => {
45
+ if (!onRowClick) {
46
+ return;
47
+ }
48
+ if (isElementInteractiveTarget(event.target as HTMLElement)) {
49
+ return;
50
+ }
51
+ onRowClick(event);
52
+ };
53
+
24
54
  return (
25
55
  <tr
26
56
  {...rest}
@@ -29,6 +59,8 @@ export const Row: RowType = forwardRef(
29
59
  "navds-table__row--selected": selected,
30
60
  "navds-table__row--shade-on-hover": shadeOnHover,
31
61
  })}
62
+ onClick={composeEventHandlers(onClick, handleRowClick)}
63
+ data-interactive={!!onRowClick}
32
64
  />
33
65
  );
34
66
  },
@@ -0,0 +1,65 @@
1
+ const INTERACTIVE_TAGS = new Set([
2
+ "BUTTON",
3
+ "A",
4
+ "INPUT",
5
+ "SELECT",
6
+ "TEXTAREA",
7
+ "DETAILS",
8
+ "SUMMARY",
9
+ "LABEL",
10
+ ]);
11
+
12
+ const INTERACTIVE_ROLES = new Set([
13
+ "button",
14
+ "link",
15
+ "checkbox",
16
+ "radio",
17
+ "switch",
18
+ "menuitem",
19
+ "option",
20
+ "tab",
21
+ "textbox",
22
+ "combobox",
23
+ "spinbutton",
24
+ "slider",
25
+ ]);
26
+
27
+ /**
28
+ * Walks up from the event target until TR/TH (row / header) or root.
29
+ * Returns true if any ancestor is inherently interactive, explicitly focusable,
30
+ * or has an interactive ARIA role.
31
+ * Used to decide whether a row click should be treated as a row selection
32
+ * or ignored because the user interacted with an embedded control.
33
+ */
34
+ function isElementInteractiveTarget(element: HTMLElement | null) {
35
+ for (
36
+ let node: HTMLElement | null = element;
37
+ node && node.nodeName !== "TR" && node.nodeName !== "TH";
38
+ node = node.parentElement
39
+ ) {
40
+ const tag = node.nodeName;
41
+
42
+ /* Native interactive tag */
43
+ if (INTERACTIVE_TAGS.has(tag)) {
44
+ return true;
45
+ }
46
+
47
+ /* Explicit interactive role */
48
+ const role = node.getAttribute("role");
49
+ if (role && INTERACTIVE_ROLES.has(role)) {
50
+ return true;
51
+ }
52
+
53
+ /* Focusable via tabindex (exclude -1) */
54
+ if (node.hasAttribute("tabindex")) {
55
+ const ti = node.getAttribute("tabindex");
56
+ if (ti !== "-1") {
57
+ return true;
58
+ }
59
+ }
60
+ }
61
+
62
+ return false;
63
+ }
64
+
65
+ export { isElementInteractiveTarget };
@@ -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
  </>