@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.
- package/cjs/chat/Chat.d.ts +1 -1
- package/cjs/chat/Chat.js.map +1 -1
- package/cjs/copybutton/CopyButton.js +1 -1
- package/cjs/copybutton/CopyButton.js.map +1 -1
- package/cjs/date/date-utils/dropdown-options.d.ts +11 -2
- package/cjs/date/date-utils/dropdown-options.js +5 -3
- package/cjs/date/date-utils/dropdown-options.js.map +1 -1
- package/cjs/date/datepicker/parts/DatePicker.Months.js +7 -2
- package/cjs/date/datepicker/parts/DatePicker.Months.js.map +1 -1
- package/cjs/form/combobox/Input/Input.context.d.ts +2 -2
- package/cjs/form/file-upload/useFileUpload.d.ts +1 -1
- package/cjs/form/useFormField.js.map +1 -1
- package/cjs/layout/page/parts/PageBlock.d.ts +4 -0
- package/cjs/layout/page/parts/PageBlock.js.map +1 -1
- package/cjs/modal/ModalUtils.d.ts +2 -2
- package/cjs/modal/ModalUtils.js.map +1 -1
- package/cjs/overlays/dismissablelayer/DismissableLayer.d.ts +1 -1
- package/cjs/overlays/floating/Floating.js +2 -2
- package/cjs/overlays/floating/Floating.js.map +1 -1
- package/cjs/overlays/overlay/hooks/{useOpenChangeComplete.d.ts → useOpenChangeAnimationComplete.d.ts} +2 -2
- package/cjs/overlays/overlay/hooks/{useOpenChangeComplete.js → useOpenChangeAnimationComplete.js} +3 -3
- package/cjs/overlays/overlay/hooks/useOpenChangeAnimationComplete.js.map +1 -0
- package/cjs/overlays/overlay/hooks/useTransitionStatus.d.ts +38 -0
- package/cjs/overlays/overlay/hooks/useTransitionStatus.js +118 -0
- package/cjs/overlays/overlay/hooks/useTransitionStatus.js.map +1 -0
- package/cjs/progress-bar/ProgressBar.js +1 -1
- package/cjs/progress-bar/ProgressBar.js.map +1 -1
- package/cjs/read-more/ReadMore.d.ts +2 -9
- package/cjs/read-more/ReadMore.js +1 -8
- package/cjs/read-more/ReadMore.js.map +1 -1
- package/cjs/table/AnimateHeight.js +2 -2
- package/cjs/table/AnimateHeight.js.map +1 -1
- package/cjs/tabs/Tabs.context.d.ts +1 -1
- package/cjs/tabs/parts/tab/useTab.d.ts +1 -1
- package/cjs/tabs/parts/tablist/useScrollButtons.d.ts +1 -1
- package/cjs/tabs/parts/tablist/useScrollButtons.js.map +1 -1
- package/cjs/toggle-group/ToggleGroup.context.d.ts +1 -1
- package/cjs/toggle-group/parts/useToggleItem.d.ts +1 -1
- package/cjs/util/hooks/descendants/useDescendant.d.ts +1 -1
- package/cjs/util/hooks/useMergeRefs.d.ts +3 -3
- package/cjs/util/hooks/useMergeRefs.js +3 -3
- package/cjs/util/hooks/useMergeRefs.js.map +1 -1
- package/cjs/util/renderStoriesForChromatic.d.ts +2 -2
- package/cjs/util/renderStoriesForChromatic.js +2 -2
- package/cjs/util/renderStoriesForChromatic.js.map +1 -1
- package/cjs/util/virtualfocus/Context.d.ts +1 -1
- package/esm/chat/Chat.d.ts +1 -1
- package/esm/chat/Chat.js.map +1 -1
- package/esm/copybutton/CopyButton.js +1 -1
- package/esm/copybutton/CopyButton.js.map +1 -1
- package/esm/date/date-utils/dropdown-options.d.ts +11 -2
- package/esm/date/date-utils/dropdown-options.js +5 -3
- package/esm/date/date-utils/dropdown-options.js.map +1 -1
- package/esm/date/datepicker/parts/DatePicker.Months.js +7 -2
- package/esm/date/datepicker/parts/DatePicker.Months.js.map +1 -1
- package/esm/form/combobox/Input/Input.context.d.ts +2 -2
- package/esm/form/file-upload/useFileUpload.d.ts +1 -1
- package/esm/form/useFormField.js.map +1 -1
- package/esm/layout/page/parts/PageBlock.d.ts +4 -0
- package/esm/layout/page/parts/PageBlock.js.map +1 -1
- package/esm/modal/ModalUtils.d.ts +2 -2
- package/esm/modal/ModalUtils.js.map +1 -1
- package/esm/overlays/dismissablelayer/DismissableLayer.d.ts +1 -1
- package/esm/overlays/floating/Floating.js +2 -2
- package/esm/overlays/floating/Floating.js.map +1 -1
- package/esm/overlays/overlay/hooks/{useOpenChangeComplete.d.ts → useOpenChangeAnimationComplete.d.ts} +2 -2
- package/esm/overlays/overlay/hooks/{useOpenChangeComplete.js → useOpenChangeAnimationComplete.js} +2 -2
- package/esm/overlays/overlay/hooks/useOpenChangeAnimationComplete.js.map +1 -0
- package/esm/overlays/overlay/hooks/useTransitionStatus.d.ts +38 -0
- package/esm/overlays/overlay/hooks/useTransitionStatus.js +113 -0
- package/esm/overlays/overlay/hooks/useTransitionStatus.js.map +1 -0
- package/esm/progress-bar/ProgressBar.js +1 -1
- package/esm/progress-bar/ProgressBar.js.map +1 -1
- package/esm/read-more/ReadMore.d.ts +2 -9
- package/esm/read-more/ReadMore.js +1 -8
- package/esm/read-more/ReadMore.js.map +1 -1
- package/esm/table/AnimateHeight.js +2 -2
- package/esm/table/AnimateHeight.js.map +1 -1
- package/esm/tabs/Tabs.context.d.ts +1 -1
- package/esm/tabs/parts/tab/useTab.d.ts +1 -1
- package/esm/tabs/parts/tablist/useScrollButtons.d.ts +1 -1
- package/esm/tabs/parts/tablist/useScrollButtons.js.map +1 -1
- package/esm/toggle-group/ToggleGroup.context.d.ts +1 -1
- package/esm/toggle-group/parts/useToggleItem.d.ts +1 -1
- package/esm/util/hooks/descendants/useDescendant.d.ts +1 -1
- package/esm/util/hooks/useMergeRefs.d.ts +3 -3
- package/esm/util/hooks/useMergeRefs.js +3 -3
- package/esm/util/hooks/useMergeRefs.js.map +1 -1
- package/esm/util/renderStoriesForChromatic.d.ts +2 -2
- package/esm/util/renderStoriesForChromatic.js +2 -2
- package/esm/util/renderStoriesForChromatic.js.map +1 -1
- package/esm/util/virtualfocus/Context.d.ts +1 -1
- package/package.json +4 -4
- package/src/chat/Chat.tsx +3 -3
- package/src/copybutton/CopyButton.tsx +1 -1
- package/src/date/date-utils/dropdown-options.test.ts +37 -9
- package/src/date/date-utils/dropdown-options.ts +23 -12
- package/src/date/datepicker/parts/DatePicker.Months.tsx +8 -2
- package/src/form/combobox/Input/Input.context.tsx +2 -2
- package/src/form/useFormField.ts +1 -1
- package/src/layout/page/parts/PageBlock.tsx +4 -0
- package/src/modal/ModalUtils.ts +2 -2
- package/src/overlays/action-menu/ActionMenu.tsx +1 -1
- package/src/overlays/floating/Floating.tsx +2 -2
- package/src/overlays/overlay/hooks/{useOpenChangeComplete.ts → useOpenChangeAnimationComplete.ts} +3 -3
- package/src/overlays/overlay/hooks/useTransitionStatus.ts +145 -0
- package/src/progress-bar/ProgressBar.tsx +1 -1
- package/src/read-more/ReadMore.tsx +4 -11
- package/src/table/AnimateHeight.tsx +2 -2
- package/src/tabs/parts/tablist/useScrollButtons.ts +3 -1
- package/src/util/hooks/useMergeRefs.ts +5 -5
- package/src/util/link-anchor/LinkAnchor.tsx +1 -1
- package/src/util/renderStoriesForChromatic.tsx +4 -5
- package/cjs/overlays/overlay/hooks/useOpenChangeComplete.js.map +0 -1
- 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
|
|
18
|
-
navStart
|
|
19
|
-
navEnd
|
|
20
|
-
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", {
|
|
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
|
|
49
|
-
navEnd
|
|
50
|
-
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(
|
|
73
|
-
|
|
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.
|
|
18
|
+
toggleOpenButtonRef: React.MutableRefObject<HTMLDivElement | null>;
|
|
19
19
|
hideCaret: boolean;
|
|
20
20
|
setHideCaret: React.Dispatch<React.SetStateAction<boolean>>;
|
|
21
21
|
}
|
package/src/form/useFormField.ts
CHANGED
|
@@ -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;
|
package/src/modal/ModalUtils.ts
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
366
|
+
useOpenChangeAnimationComplete({
|
|
367
367
|
enabled: !!modalContext?.ref,
|
|
368
368
|
open: enabled,
|
|
369
369
|
ref: modalContext?.ref,
|
package/src/overlays/overlay/hooks/{useOpenChangeComplete.ts → useOpenChangeAnimationComplete.ts}
RENAMED
|
@@ -5,7 +5,7 @@ import { useAnimationsFinished } from "./useAnimationsFinished";
|
|
|
5
5
|
import { useEventCallback } from "./useEventCallback";
|
|
6
6
|
import { useLatestRef } from "./useLatestRef";
|
|
7
7
|
|
|
8
|
-
interface
|
|
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
|
|
38
|
-
parameters:
|
|
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
|
|
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
|
-
|
|
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(
|
|
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.
|
|
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>[])
|
|
12
|
-
return (
|
|
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(
|
|
15
|
+
ref(instance);
|
|
16
16
|
} else if (ref !== null && ref !== undefined) {
|
|
17
|
-
(ref as React.MutableRefObject<T | null>).current =
|
|
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
|
-
|
|
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,
|
|
14
|
+
{Object.entries(stories).map(([storyName, Story]) => (
|
|
16
15
|
<div key={storyName}>
|
|
17
16
|
<h2 className="storyheading">{storyName}</h2>
|
|
18
|
-
{typeof
|
|
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"}
|