@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.
- 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/form/checkbox/Checkbox.js +1 -1
- package/cjs/form/checkbox/Checkbox.js.map +1 -1
- package/cjs/form/combobox/Combobox.js +15 -13
- package/cjs/form/combobox/Combobox.js.map +1 -1
- package/cjs/form/combobox/FilteredOptions/FilteredOptions.js +53 -3
- package/cjs/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
- package/cjs/form/combobox/FilteredOptions/useVirtualFocus.js.map +1 -1
- package/cjs/form/combobox/Input/Input.context.d.ts +2 -2
- package/cjs/form/combobox/Input/InputController.js +15 -14
- package/cjs/form/combobox/Input/InputController.js.map +1 -1
- package/cjs/form/file-upload/useFileUpload.d.ts +1 -1
- package/cjs/form/radio/Radio.js +1 -1
- package/cjs/form/radio/Radio.js.map +1 -1
- package/cjs/form/useFormField.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.d.ts +11 -0
- package/cjs/overlays/floating/Floating.js +32 -8
- package/cjs/overlays/floating/Floating.js.map +1 -1
- package/cjs/overlays/overlay/hooks/useAnimationsFinished.d.ts +27 -0
- package/cjs/overlays/overlay/hooks/useAnimationsFinished.js +138 -0
- package/cjs/overlays/overlay/hooks/useAnimationsFinished.js.map +1 -0
- package/cjs/overlays/overlay/hooks/useEventCallback.d.ts +6 -0
- package/cjs/overlays/overlay/hooks/useEventCallback.js +89 -0
- package/cjs/overlays/overlay/hooks/useEventCallback.js.map +1 -0
- package/cjs/overlays/overlay/hooks/useLatestRef.d.ts +5 -0
- package/cjs/overlays/overlay/hooks/useLatestRef.js +23 -0
- package/cjs/overlays/overlay/hooks/useLatestRef.js.map +1 -0
- package/cjs/overlays/overlay/hooks/useOpenChangeAnimationComplete.d.ts +31 -0
- package/cjs/overlays/overlay/hooks/useOpenChangeAnimationComplete.js +35 -0
- package/cjs/overlays/overlay/hooks/useOpenChangeAnimationComplete.js.map +1 -0
- package/cjs/overlays/overlay/hooks/useRefWithInit.d.ts +7 -0
- package/cjs/overlays/overlay/hooks/useRefWithInit.js +14 -0
- package/cjs/overlays/overlay/hooks/useRefWithInit.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/table/ExpandableRow.d.ts +1 -1
- package/cjs/table/ExpandableRow.js +2 -10
- package/cjs/table/ExpandableRow.js.map +1 -1
- package/cjs/table/Row.d.ts +7 -0
- package/cjs/table/Row.js +13 -2
- package/cjs/table/Row.js.map +1 -1
- package/cjs/table/Table.utils.d.ts +9 -0
- package/cjs/table/Table.utils.js +57 -0
- package/cjs/table/Table.utils.js.map +1 -0
- 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/form/checkbox/Checkbox.js +1 -1
- package/esm/form/checkbox/Checkbox.js.map +1 -1
- package/esm/form/combobox/Combobox.js +15 -13
- package/esm/form/combobox/Combobox.js.map +1 -1
- package/esm/form/combobox/FilteredOptions/FilteredOptions.js +21 -4
- package/esm/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
- package/esm/form/combobox/FilteredOptions/useVirtualFocus.js.map +1 -1
- package/esm/form/combobox/Input/Input.context.d.ts +2 -2
- package/esm/form/combobox/Input/InputController.js +15 -14
- package/esm/form/combobox/Input/InputController.js.map +1 -1
- package/esm/form/file-upload/useFileUpload.d.ts +1 -1
- package/esm/form/radio/Radio.js +1 -1
- package/esm/form/radio/Radio.js.map +1 -1
- package/esm/form/useFormField.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.d.ts +11 -0
- package/esm/overlays/floating/Floating.js +32 -8
- package/esm/overlays/floating/Floating.js.map +1 -1
- package/esm/overlays/overlay/hooks/useAnimationsFinished.d.ts +27 -0
- package/esm/overlays/overlay/hooks/useAnimationsFinished.js +99 -0
- package/esm/overlays/overlay/hooks/useAnimationsFinished.js.map +1 -0
- package/esm/overlays/overlay/hooks/useEventCallback.d.ts +6 -0
- package/esm/overlays/overlay/hooks/useEventCallback.js +53 -0
- package/esm/overlays/overlay/hooks/useEventCallback.js.map +1 -0
- package/esm/overlays/overlay/hooks/useLatestRef.d.ts +5 -0
- package/esm/overlays/overlay/hooks/useLatestRef.js +20 -0
- package/esm/overlays/overlay/hooks/useLatestRef.js.map +1 -0
- package/esm/overlays/overlay/hooks/useOpenChangeAnimationComplete.d.ts +31 -0
- package/esm/overlays/overlay/hooks/useOpenChangeAnimationComplete.js +32 -0
- package/esm/overlays/overlay/hooks/useOpenChangeAnimationComplete.js.map +1 -0
- package/esm/overlays/overlay/hooks/useRefWithInit.d.ts +7 -0
- package/esm/overlays/overlay/hooks/useRefWithInit.js +12 -0
- package/esm/overlays/overlay/hooks/useRefWithInit.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/table/ExpandableRow.d.ts +1 -1
- package/esm/table/ExpandableRow.js +2 -10
- package/esm/table/ExpandableRow.js.map +1 -1
- package/esm/table/Row.d.ts +7 -0
- package/esm/table/Row.js +13 -2
- package/esm/table/Row.js.map +1 -1
- package/esm/table/Table.utils.d.ts +9 -0
- package/esm/table/Table.utils.js +55 -0
- package/esm/table/Table.utils.js.map +1 -0
- 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/form/checkbox/Checkbox.tsx +5 -3
- package/src/form/combobox/Combobox.tsx +44 -41
- package/src/form/combobox/FilteredOptions/FilteredOptions.tsx +29 -4
- package/src/form/combobox/FilteredOptions/useVirtualFocus.ts +1 -0
- package/src/form/combobox/Input/Input.context.tsx +2 -2
- package/src/form/combobox/Input/InputController.tsx +33 -29
- package/src/form/radio/Radio.tsx +5 -3
- package/src/form/useFormField.ts +1 -1
- package/src/modal/ModalUtils.ts +2 -2
- package/src/overlays/action-menu/ActionMenu.tsx +1 -1
- package/src/overlays/floating/Floating.tsx +110 -59
- package/src/overlays/overlay/hooks/useAnimationsFinished.ts +117 -0
- package/src/overlays/overlay/hooks/useEventCallback.ts +73 -0
- package/src/overlays/overlay/hooks/useLatestRef.ts +25 -0
- package/src/overlays/overlay/hooks/useOpenChangeAnimationComplete.ts +66 -0
- package/src/overlays/overlay/hooks/useRefWithInit.ts +25 -0
- 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/table/ExpandableRow.tsx +4 -17
- package/src/table/Row.tsx +33 -1
- package/src/table/Table.utils.ts +65 -0
- 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
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { StoryObj } from "@storybook/react";
|
|
1
|
+
import { StoryObj } from "@storybook/react-vite";
|
|
2
2
|
import React from "react";
|
|
3
3
|
export declare function renderStoriesForChromatic(stories: Record<string, {
|
|
4
4
|
render?: (...args: any[]) => React.ReactNode;
|
|
5
|
-
} | React.FunctionComponent
|
|
5
|
+
} | React.FunctionComponent>): StoryObj;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
export function renderStoriesForChromatic(stories) {
|
|
3
3
|
return {
|
|
4
|
-
render: (...args) => (React.createElement(React.Fragment, null, Object.entries(stories).map(([storyName,
|
|
4
|
+
render: (...args) => (React.createElement(React.Fragment, null, Object.entries(stories).map(([storyName, Story]) => {
|
|
5
5
|
var _a;
|
|
6
6
|
return (React.createElement("div", { key: storyName },
|
|
7
7
|
React.createElement("h2", { className: "storyheading" }, storyName),
|
|
8
|
-
typeof
|
|
8
|
+
typeof Story === "function" ? React.createElement(Story, null) : (_a = Story.render) === null || _a === void 0 ? void 0 : _a.call(Story, ...args)));
|
|
9
9
|
}))),
|
|
10
10
|
parameters: {
|
|
11
11
|
chromatic: { disable: false },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderStoriesForChromatic.js","sourceRoot":"","sources":["../../src/util/renderStoriesForChromatic.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,UAAU,yBAAyB,CACvC,
|
|
1
|
+
{"version":3,"file":"renderStoriesForChromatic.js","sourceRoot":"","sources":["../../src/util/renderStoriesForChromatic.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,UAAU,yBAAyB,CACvC,OAGC;IAED,OAAO;QACL,MAAM,EAAE,CAAC,GAAG,IAA0C,EAAE,EAAE,CAAC,CACzD,0CACG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE;;YAAC,OAAA,CACnD,6BAAK,GAAG,EAAE,SAAS;gBACjB,4BAAI,SAAS,EAAC,cAAc,IAAE,SAAS,CAAM;gBAC5C,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,oBAAC,KAAK,OAAG,CAAC,CAAC,CAAC,MAAA,KAAK,CAAC,MAAM,sDAAG,GAAG,IAAI,CAAC,CAC9D,CACP,CAAA;SAAA,CAAC,CACD,CACJ;QACD,UAAU,EAAE;YACV,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;SAC9B;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -21,7 +21,7 @@ export declare const VirtualFocusDescendantsProvider: import("react").Provider<i
|
|
|
21
21
|
}>;
|
|
22
22
|
index: number;
|
|
23
23
|
enabledIndex: number;
|
|
24
|
-
register: (instance: HTMLDivElement | null) => void
|
|
24
|
+
register: (instance: HTMLDivElement | null) => void;
|
|
25
25
|
};
|
|
26
26
|
export declare const VirtualFocusInternalContextProvider: import("react").ForwardRefExoticComponent<{
|
|
27
27
|
virtualFocusIdx: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@navikt/ds-react",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.32.0",
|
|
4
4
|
"description": "React components from the Norwegian Labour and Welfare Administration.",
|
|
5
5
|
"author": "Aksel, a team part of the Norwegian Labour and Welfare Administration.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -650,8 +650,8 @@
|
|
|
650
650
|
"dependencies": {
|
|
651
651
|
"@floating-ui/react": "0.27.8",
|
|
652
652
|
"@floating-ui/react-dom": "^2.0.9",
|
|
653
|
-
"@navikt/aksel-icons": "^7.
|
|
654
|
-
"@navikt/ds-tokens": "^7.
|
|
653
|
+
"@navikt/aksel-icons": "^7.32.0",
|
|
654
|
+
"@navikt/ds-tokens": "^7.32.0",
|
|
655
655
|
"clsx": "^2.1.0",
|
|
656
656
|
"date-fns": "^4.0.0",
|
|
657
657
|
"react-day-picker": "9.7.0"
|
|
@@ -673,7 +673,7 @@
|
|
|
673
673
|
"rimraf": "6.0.1",
|
|
674
674
|
"swr": "^2.3.6",
|
|
675
675
|
"tsc-alias": "1.8.16",
|
|
676
|
-
"tsx": "^4.
|
|
676
|
+
"tsx": "^4.20.6",
|
|
677
677
|
"typescript": "5.8.3",
|
|
678
678
|
"vitest": "^2.1.9"
|
|
679
679
|
},
|
package/src/chat/Chat.tsx
CHANGED
|
@@ -2,7 +2,7 @@ import React, { HTMLAttributes, forwardRef } from "react";
|
|
|
2
2
|
import { useRenameCSS } from "../theme/Theme";
|
|
3
3
|
import { AkselColor } from "../types";
|
|
4
4
|
import { BodyLong, HeadingProps } from "../typography";
|
|
5
|
-
import Bubble from "./Bubble";
|
|
5
|
+
import Bubble, { type ChatBubbleProps } from "./Bubble";
|
|
6
6
|
|
|
7
7
|
export const VARIANTS = ["subtle", "info", "neutral"] as const;
|
|
8
8
|
export const POSITIONS = ["left", "right"] as const;
|
|
@@ -60,7 +60,7 @@ interface ChatComponent
|
|
|
60
60
|
ChatProps & React.RefAttributes<HTMLDivElement>
|
|
61
61
|
> {
|
|
62
62
|
/**
|
|
63
|
-
* @see 🏷️ {@link
|
|
63
|
+
* @see 🏷️ {@link ChatBubbleProps}
|
|
64
64
|
*/
|
|
65
65
|
Bubble: typeof Bubble;
|
|
66
66
|
}
|
|
@@ -128,7 +128,7 @@ export const Chat = forwardRef<HTMLDivElement, ChatProps>(
|
|
|
128
128
|
className={cn("navds-chat__bubble-wrapper")}
|
|
129
129
|
>
|
|
130
130
|
{React.Children.map(children, (child, i) => {
|
|
131
|
-
if (!React.isValidElement(child)) {
|
|
131
|
+
if (!React.isValidElement<ChatBubbleProps>(child)) {
|
|
132
132
|
return null;
|
|
133
133
|
}
|
|
134
134
|
|
|
@@ -94,7 +94,7 @@ export const CopyButton = forwardRef<HTMLButtonElement, CopyButtonProps>(
|
|
|
94
94
|
ref,
|
|
95
95
|
) => {
|
|
96
96
|
const [active, setActive] = useState(false);
|
|
97
|
-
const timeoutRef = useRef<number>();
|
|
97
|
+
const timeoutRef = useRef<number>(undefined);
|
|
98
98
|
const translate = useI18n("CopyButton");
|
|
99
99
|
|
|
100
100
|
const { cn } = useRenameCSS();
|
|
@@ -42,9 +42,11 @@ export const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(
|
|
|
42
42
|
"readOnly",
|
|
43
43
|
])}
|
|
44
44
|
{...omit(inputProps, ["aria-invalid", "aria-describedby"])}
|
|
45
|
-
aria-describedby={
|
|
46
|
-
[
|
|
47
|
-
|
|
45
|
+
aria-describedby={
|
|
46
|
+
cl(inputProps["aria-describedby"], {
|
|
47
|
+
[descriptionId]: props.description,
|
|
48
|
+
}) || undefined
|
|
49
|
+
}
|
|
48
50
|
type="checkbox"
|
|
49
51
|
className={cn("navds-checkbox__input")}
|
|
50
52
|
ref={(el) => {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React, { forwardRef } from "react";
|
|
2
|
+
import { Floating } from "../../overlays/floating/Floating";
|
|
2
3
|
import { useRenameCSS } from "../../theme/Theme";
|
|
3
4
|
import { BodyShort, ErrorMessage, Label } from "../../typography";
|
|
4
5
|
import { ReadOnlyIconWithTitle } from "../ReadOnlyIcon";
|
|
@@ -34,52 +35,54 @@ export const Combobox = forwardRef<
|
|
|
34
35
|
} = useInputContext();
|
|
35
36
|
|
|
36
37
|
return (
|
|
37
|
-
<
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
<Label
|
|
45
|
-
htmlFor={inputProps.id}
|
|
46
|
-
size={size}
|
|
47
|
-
className={cn("navds-form-field__label", {
|
|
48
|
-
"navds-sr-only": hideLabel,
|
|
49
|
-
})}
|
|
38
|
+
<Floating>
|
|
39
|
+
<ComboboxWrapper
|
|
40
|
+
className={className}
|
|
41
|
+
hasError={hasError}
|
|
42
|
+
inputProps={inputProps}
|
|
43
|
+
inputSize={size}
|
|
44
|
+
toggleIsListOpen={toggleIsListOpen}
|
|
50
45
|
>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
<BodyShort
|
|
56
|
-
as="div"
|
|
57
|
-
className={cn("navds-form-field__description", {
|
|
46
|
+
<Label
|
|
47
|
+
htmlFor={inputProps.id}
|
|
48
|
+
size={size}
|
|
49
|
+
className={cn("navds-form-field__label", {
|
|
58
50
|
"navds-sr-only": hideLabel,
|
|
59
51
|
})}
|
|
60
|
-
id={inputDescriptionId}
|
|
61
|
-
size={size}
|
|
62
52
|
>
|
|
63
|
-
{
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
<ErrorMessage size={size} showIcon>
|
|
78
|
-
{error}
|
|
79
|
-
</ErrorMessage>
|
|
53
|
+
{readOnly && <ReadOnlyIconWithTitle />}
|
|
54
|
+
{label}
|
|
55
|
+
</Label>
|
|
56
|
+
{!!description && (
|
|
57
|
+
<BodyShort
|
|
58
|
+
as="div"
|
|
59
|
+
className={cn("navds-form-field__description", {
|
|
60
|
+
"navds-sr-only": hideLabel,
|
|
61
|
+
})}
|
|
62
|
+
id={inputDescriptionId}
|
|
63
|
+
size={size}
|
|
64
|
+
>
|
|
65
|
+
{description}
|
|
66
|
+
</BodyShort>
|
|
80
67
|
)}
|
|
81
|
-
|
|
82
|
-
|
|
68
|
+
<div className={cn("navds-combobox__wrapper")}>
|
|
69
|
+
<InputController ref={ref} {...rest} />
|
|
70
|
+
<FilteredOptions />
|
|
71
|
+
</div>
|
|
72
|
+
<div
|
|
73
|
+
className={cn("navds-form-field__error")}
|
|
74
|
+
id={errorId}
|
|
75
|
+
aria-relevant="additions removals"
|
|
76
|
+
aria-live="polite"
|
|
77
|
+
>
|
|
78
|
+
{showErrorMsg && (
|
|
79
|
+
<ErrorMessage size={size} showIcon>
|
|
80
|
+
{error}
|
|
81
|
+
</ErrorMessage>
|
|
82
|
+
)}
|
|
83
|
+
</div>
|
|
84
|
+
</ComboboxWrapper>
|
|
85
|
+
</Floating>
|
|
83
86
|
);
|
|
84
87
|
});
|
|
85
88
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import {
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Floating } from "../../../overlays/floating/Floating";
|
|
3
|
+
import { useRenameCSS, useThemeInternal } from "../../../theme/Theme";
|
|
4
|
+
import { useClientLayoutEffect } from "../../../util";
|
|
3
5
|
import { useInputContext } from "../Input/Input.context";
|
|
4
6
|
import { useSelectedOptionsContext } from "../SelectedOptions/selectedOptionsContext";
|
|
5
7
|
import AddNewOption from "./AddNewOption";
|
|
@@ -12,6 +14,7 @@ import { useFilteredOptionsContext } from "./filteredOptionsContext";
|
|
|
12
14
|
|
|
13
15
|
const FilteredOptions = () => {
|
|
14
16
|
const { cn } = useRenameCSS();
|
|
17
|
+
const themeContext = useThemeInternal(false);
|
|
15
18
|
const {
|
|
16
19
|
inputProps: { id },
|
|
17
20
|
} = useInputContext();
|
|
@@ -25,6 +28,16 @@ const FilteredOptions = () => {
|
|
|
25
28
|
isMouseLastUsedInputDevice,
|
|
26
29
|
isValueNew,
|
|
27
30
|
} = useFilteredOptionsContext();
|
|
31
|
+
const [localOpen, setLocalOpen] = useState(isListOpen);
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* This is a dirty hack to make the positioning-logic in Floating base the "flip" on the static 290px max-height,
|
|
35
|
+
* instead of the dynamic one based on available space. Without this, the list won't flip to top when there's
|
|
36
|
+
* not enough space below the input.
|
|
37
|
+
*/
|
|
38
|
+
useClientLayoutEffect(() => {
|
|
39
|
+
queueMicrotask(() => setLocalOpen(isListOpen));
|
|
40
|
+
}, [isListOpen]);
|
|
28
41
|
|
|
29
42
|
const { maxSelected, isMultiSelect } = useSelectedOptionsContext();
|
|
30
43
|
|
|
@@ -37,14 +50,26 @@ const FilteredOptions = () => {
|
|
|
37
50
|
(allowNewValues && isValueNew && !maxSelected.isLimitReached) || // Render add new option
|
|
38
51
|
filteredOptions.length > 0; // Render filtered options
|
|
39
52
|
|
|
53
|
+
const height = themeContext?.isDarkside ? "316px" : "290px";
|
|
54
|
+
|
|
40
55
|
return (
|
|
41
|
-
<
|
|
56
|
+
<Floating.Content
|
|
42
57
|
className={cn("navds-combobox__list", {
|
|
43
58
|
"navds-combobox__list--closed": !isListOpen,
|
|
44
59
|
"navds-combobox__list--with-hover": isMouseLastUsedInputDevice,
|
|
45
60
|
})}
|
|
46
61
|
id={filteredOptionsUtil.getFilteredOptionsId(id)}
|
|
47
62
|
tabIndex={-1}
|
|
63
|
+
sideOffset={8}
|
|
64
|
+
side="bottom"
|
|
65
|
+
fallbackPlacements={["top"]}
|
|
66
|
+
enabled={isListOpen}
|
|
67
|
+
style={{
|
|
68
|
+
maxHeight: localOpen
|
|
69
|
+
? `min(${height}, var(--ac-floating-available-height))`
|
|
70
|
+
: `${height}`,
|
|
71
|
+
}}
|
|
72
|
+
autoUpdateWhileMounted={false}
|
|
48
73
|
>
|
|
49
74
|
{shouldRenderNonSelectables && (
|
|
50
75
|
<div
|
|
@@ -74,7 +99,7 @@ const FilteredOptions = () => {
|
|
|
74
99
|
))}
|
|
75
100
|
</ul>
|
|
76
101
|
)}
|
|
77
|
-
</
|
|
102
|
+
</Floating.Content>
|
|
78
103
|
);
|
|
79
104
|
};
|
|
80
105
|
|
|
@@ -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
|
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
/* eslint-disable jsx-a11y/click-events-have-key-events */
|
|
2
|
+
|
|
1
3
|
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
|
2
4
|
import React, { forwardRef } from "react";
|
|
5
|
+
import { Floating } from "../../../overlays/floating/Floating";
|
|
3
6
|
import { useRenameCSS } from "../../../theme/Theme";
|
|
4
7
|
import { useMergeRefs } from "../../../util/hooks";
|
|
5
8
|
import { useFilteredOptionsContext } from "../FilteredOptions/filteredOptionsContext";
|
|
@@ -54,42 +57,43 @@ export const InputController = forwardRef<
|
|
|
54
57
|
const mergedInputRef = useMergeRefs(inputRef, ref);
|
|
55
58
|
|
|
56
59
|
return (
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
60
|
+
<Floating.Anchor asChild>
|
|
61
|
+
<div
|
|
62
|
+
className={cn("navds-combobox__wrapper-inner navds-text-field__input", {
|
|
63
|
+
"navds-combobox__wrapper-inner--virtually-unfocused":
|
|
64
|
+
activeDecendantId !== undefined,
|
|
65
|
+
})}
|
|
66
|
+
onClick={() => {
|
|
67
|
+
if (inputProps.disabled || readOnly) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
67
70
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
<Input
|
|
74
|
-
id={inputProps.id}
|
|
75
|
-
ref={mergedInputRef}
|
|
76
|
-
inputClassName={inputClassName}
|
|
77
|
-
readOnly={readOnly}
|
|
78
|
-
{...rest}
|
|
79
|
-
/>
|
|
80
|
-
) : (
|
|
81
|
-
<SelectedOptions selectedOptions={selectedOptions} size={size}>
|
|
71
|
+
toggleIsListOpen(true);
|
|
72
|
+
focusInput();
|
|
73
|
+
}}
|
|
74
|
+
>
|
|
75
|
+
{!shouldShowSelectedOptions ? (
|
|
82
76
|
<Input
|
|
83
77
|
id={inputProps.id}
|
|
84
78
|
ref={mergedInputRef}
|
|
85
79
|
inputClassName={inputClassName}
|
|
86
|
-
shouldShowSelectedOptions={shouldShowSelectedOptions}
|
|
87
80
|
readOnly={readOnly}
|
|
88
81
|
{...rest}
|
|
89
82
|
/>
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
83
|
+
) : (
|
|
84
|
+
<SelectedOptions selectedOptions={selectedOptions} size={size}>
|
|
85
|
+
<Input
|
|
86
|
+
id={inputProps.id}
|
|
87
|
+
ref={mergedInputRef}
|
|
88
|
+
inputClassName={inputClassName}
|
|
89
|
+
shouldShowSelectedOptions={shouldShowSelectedOptions}
|
|
90
|
+
readOnly={readOnly}
|
|
91
|
+
{...rest}
|
|
92
|
+
/>
|
|
93
|
+
</SelectedOptions>
|
|
94
|
+
)}
|
|
95
|
+
{toggleListButton && <ToggleListButton ref={toggleOpenButtonRef} />}
|
|
96
|
+
</div>
|
|
97
|
+
</Floating.Anchor>
|
|
94
98
|
);
|
|
95
99
|
});
|
package/src/form/radio/Radio.tsx
CHANGED
|
@@ -25,9 +25,11 @@ export const Radio = forwardRef<HTMLInputElement, RadioProps>((props, ref) => {
|
|
|
25
25
|
<input
|
|
26
26
|
{...omit(props, ["children", "size", "description", "readOnly"])}
|
|
27
27
|
{...omit(inputProps, ["aria-invalid", "aria-describedby"])}
|
|
28
|
-
aria-describedby={
|
|
29
|
-
[
|
|
30
|
-
|
|
28
|
+
aria-describedby={
|
|
29
|
+
cl(inputProps["aria-describedby"], {
|
|
30
|
+
[descriptionId]: props.description,
|
|
31
|
+
}) || undefined
|
|
32
|
+
}
|
|
31
33
|
className={cn("navds-radio__input")}
|
|
32
34
|
ref={ref}
|
|
33
35
|
/>
|
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
|
}
|
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;
|