@kaizen/components 0.0.0-canary-update-floating-fms-20250715035144 → 0.0.0-canary-handle-avatar-error-20250716233812
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/dist/cjs/alpha.cjs +4 -0
- package/dist/cjs/src/Avatar/Avatar.cjs +3 -2
- package/dist/cjs/src/Button/Button/Button.cjs +5 -0
- package/dist/cjs/src/Button/IconButton/IconButton.cjs +5 -0
- package/dist/cjs/src/Filter/FilterMultiSelect/FilterMultiSelect.cjs +3 -7
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.cjs +1 -1
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.scss.cjs +9 -0
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/ListBoxSection/ListBoxSection.cjs +2 -1
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.cjs +38 -69
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/{MenuPopup.module.css.cjs → MenuPopup.module.scss.cjs} +1 -1
- package/dist/cjs/src/LikertScaleLegacy/LikertScaleLegacy.cjs +3 -0
- package/dist/cjs/src/Modal/GenericModal/GenericModal.cjs +11 -1
- package/dist/cjs/src/Skirt/Skirt.cjs +3 -0
- package/dist/cjs/src/Skirt/subcomponents/SkirtCard/SkirtCard.cjs +4 -0
- package/dist/cjs/src/SplitButton/SplitButton.cjs +2 -0
- package/dist/cjs/src/TitleBlockZen/TitleBlockZen.cjs +3 -0
- package/dist/cjs/src/__alpha__/SingleSelect/SingleSelect.cjs +32 -0
- package/dist/cjs/src/__alpha__/SingleSelect/SingleSelect.module.css.cjs +6 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/List/List.cjs +24 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/List/List.module.css.cjs +6 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.cjs +24 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css.cjs +6 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.cjs +25 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css.cjs +6 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.cjs +21 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css.cjs +6 -0
- package/dist/esm/alpha.mjs +1 -0
- package/dist/esm/src/Avatar/Avatar.mjs +3 -2
- package/dist/esm/src/Button/Button/Button.mjs +5 -0
- package/dist/esm/src/Button/IconButton/IconButton.mjs +5 -0
- package/dist/esm/src/Filter/FilterMultiSelect/FilterMultiSelect.mjs +3 -7
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.mjs +1 -1
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.scss.mjs +7 -0
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/ListBoxSection/ListBoxSection.mjs +2 -1
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.mjs +41 -70
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.module.scss.mjs +4 -0
- package/dist/esm/src/LikertScaleLegacy/LikertScaleLegacy.mjs +3 -0
- package/dist/esm/src/Modal/GenericModal/GenericModal.mjs +11 -1
- package/dist/esm/src/Skirt/Skirt.mjs +3 -0
- package/dist/esm/src/Skirt/subcomponents/SkirtCard/SkirtCard.mjs +4 -0
- package/dist/esm/src/SplitButton/SplitButton.mjs +2 -0
- package/dist/esm/src/TitleBlockZen/TitleBlockZen.mjs +3 -0
- package/dist/esm/src/__alpha__/SingleSelect/SingleSelect.mjs +27 -0
- package/dist/esm/src/__alpha__/SingleSelect/SingleSelect.module.css.mjs +4 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/List/List.mjs +18 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/List/List.module.css.mjs +4 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.mjs +18 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css.mjs +4 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.mjs +19 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css.mjs +4 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.mjs +13 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css.mjs +4 -0
- package/dist/styles.css +81 -29
- package/dist/types/Button/Button/Button.d.ts +5 -0
- package/dist/types/Button/IconButton/IconButton.d.ts +5 -0
- package/dist/types/Filter/FilterMultiSelect/FilterMultiSelect.d.ts +1 -1
- package/dist/types/Filter/FilterMultiSelect/_docs/MockData.d.ts +0 -1
- package/dist/types/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.d.ts +4 -11
- package/dist/types/LikertScaleLegacy/LikertScaleLegacy.d.ts +3 -0
- package/dist/types/Skirt/Skirt.d.ts +3 -0
- package/dist/types/Skirt/subcomponents/SkirtCard/SkirtCard.d.ts +3 -0
- package/dist/types/SplitButton/SplitButton.d.ts +2 -0
- package/dist/types/TitleBlockZen/TitleBlockZen.d.ts +3 -0
- package/dist/types/__alpha__/SingleSelect/SingleSelect.d.ts +23 -0
- package/dist/types/__alpha__/SingleSelect/_docs/mockData.d.ts +59 -0
- package/dist/types/__alpha__/SingleSelect/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/List/List.d.ts +6 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/List/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.d.ts +6 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/ListItem/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.d.ts +8 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/ListSection/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Trigger/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/index.d.ts +4 -0
- package/dist/types/__alpha__/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/Avatar/Avatar.tsx +5 -2
- package/src/Avatar/_docs/Avatar.stickersheet.stories.tsx +2 -2
- package/src/Button/Button/Button.tsx +5 -0
- package/src/Button/IconButton/IconButton.tsx +5 -0
- package/src/Filter/FilterBar/subcomponents/FilterBarMultiSelect/FilterBarMultiSelect.spec.tsx +0 -1
- package/src/Filter/FilterMultiSelect/FilterMultiSelect.tsx +2 -3
- package/src/Filter/FilterMultiSelect/_docs/FilterMultiSelect.mdx +0 -10
- package/src/Filter/FilterMultiSelect/_docs/FilterMultiSelect.stories.tsx +1 -178
- package/src/Filter/FilterMultiSelect/_docs/MockData.ts +0 -39
- package/src/Filter/FilterMultiSelect/context/MenuTriggerProvider/MenuTriggerProvider.spec.tsx +18 -2
- package/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.scss +25 -0
- package/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.tsx +1 -1
- package/src/Filter/FilterMultiSelect/subcomponents/ListBoxSection/ListBoxSection.tsx +1 -1
- package/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.module.scss +24 -0
- package/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.tsx +42 -89
- package/src/LikertScaleLegacy/LikertScaleLegacy.tsx +3 -0
- package/src/LikertScaleLegacy/_docs/LikertScaleLegacy.mdx +3 -2
- package/src/LikertScaleLegacy/_docs/LikertScaleLegacy.stickersheet.stories.tsx +1 -1
- package/src/LikertScaleLegacy/_docs/LikertScaleLegacy.stories.tsx +1 -1
- package/src/Modal/GenericModal/GenericModal.tsx +18 -1
- package/src/Skirt/Skirt.tsx +4 -0
- package/src/Skirt/_docs/Skirt.mdx +3 -1
- package/src/Skirt/_docs/Skirt.stories.tsx +1 -1
- package/src/Skirt/subcomponents/SkirtCard/SkirtCard.tsx +4 -0
- package/src/SplitButton/SplitButton.tsx +2 -0
- package/src/SplitButton/_docs/SplitButton.mdx +3 -1
- package/src/SplitButton/_docs/SplitButton.stickersheet.stories.tsx +1 -1
- package/src/SplitButton/_docs/SplitButton.stories.tsx +1 -1
- package/src/TitleBlockZen/TitleBlockZen.tsx +3 -0
- package/src/TitleBlockZen/_docs/TitleBlockZen.mdx +3 -2
- package/src/__alpha__/SingleSelect/SingleSelect.module.css +9 -0
- package/src/__alpha__/SingleSelect/SingleSelect.spec.tsx +26 -0
- package/src/__alpha__/SingleSelect/SingleSelect.tsx +27 -0
- package/src/__alpha__/SingleSelect/_docs/SingleSelect.mdx +27 -0
- package/src/__alpha__/SingleSelect/_docs/SingleSelect.stickersheet.stories.tsx +83 -0
- package/src/__alpha__/SingleSelect/_docs/SingleSelect.stories.tsx +23 -0
- package/src/__alpha__/SingleSelect/_docs/mockData.ts +92 -0
- package/src/__alpha__/SingleSelect/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/List/List.module.css +7 -0
- package/src/__alpha__/SingleSelect/subcomponents/List/List.tsx +17 -0
- package/src/__alpha__/SingleSelect/subcomponents/List/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css +9 -0
- package/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.tsx +17 -0
- package/src/__alpha__/SingleSelect/subcomponents/ListItem/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css +9 -0
- package/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.tsx +23 -0
- package/src/__alpha__/SingleSelect/subcomponents/ListSection/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css +18 -0
- package/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.tsx +13 -0
- package/src/__alpha__/SingleSelect/subcomponents/Trigger/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/index.ts +4 -0
- package/src/__alpha__/index.ts +1 -0
- package/src/__next__/Button/_docs/Button--api-specification.mdx +6 -0
- package/src/__next__/Button/_docs/Button.docs.stories.tsx +29 -0
- package/src/__next__/Menu/_docs/Menu--api-specification.mdx +6 -0
- package/src/__next__/Menu/_docs/Menu.stories.tsx +29 -0
- package/src/__next__/Tabs/subcomponents/TabList/TabList.module.css +3 -1
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.css.cjs +0 -9
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.css.mjs +0 -7
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.module.css.mjs +0 -4
- package/src/Filter/FilterMultiSelect/_docs/FilterMultiSelectReportsTest.stories.tsx +0 -328
- package/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.css +0 -22
- package/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.module.css +0 -22
|
@@ -1,17 +1,10 @@
|
|
|
1
|
-
import React
|
|
2
|
-
import { type UseFloatingOptions } from '@floating-ui/react-dom';
|
|
3
|
-
import { type OverrideClassName } from "../../../../types/OverrideClassName";
|
|
4
|
-
export type FloatingConfig = Pick<UseFloatingOptions, 'placement' | 'strategy' | 'whileElementsMounted'> & {
|
|
5
|
-
shouldResize?: boolean;
|
|
6
|
-
shouldFlip?: boolean;
|
|
7
|
-
};
|
|
1
|
+
import React from 'react';
|
|
8
2
|
export type MenuPopupProps = {
|
|
9
|
-
children: React.ReactNode;
|
|
10
3
|
isLoading?: boolean;
|
|
11
4
|
loadingSkeleton?: React.ReactNode;
|
|
12
|
-
|
|
13
|
-
}
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
};
|
|
14
7
|
export declare const MenuPopup: {
|
|
15
|
-
({
|
|
8
|
+
({ isLoading, loadingSkeleton, children, }: MenuPopupProps): JSX.Element;
|
|
16
9
|
displayName: string;
|
|
17
10
|
};
|
|
@@ -19,6 +19,9 @@ export type LikertScaleProps = {
|
|
|
19
19
|
'onSelect': (value: ScaleItem | null) => void;
|
|
20
20
|
};
|
|
21
21
|
/**
|
|
22
|
+
* @deprecated This component will be renamed to LikertScale in v2.
|
|
23
|
+
* Start importing as LikertScale instead.
|
|
24
|
+
*
|
|
22
25
|
* {@link https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3082060201/Likert+Scale Guidance} |
|
|
23
26
|
* {@link https://cultureamp.design/?path=/docs/components-likertscalelegacy--docs Storybook}
|
|
24
27
|
*/
|
|
@@ -6,6 +6,9 @@ export type SkirtProps = {
|
|
|
6
6
|
variant?: Variant;
|
|
7
7
|
titleBlockHasNavigation?: boolean;
|
|
8
8
|
} & ContentProps;
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated This component will be removed in v2. Please remove any usages.
|
|
11
|
+
*/
|
|
9
12
|
export declare const Skirt: {
|
|
10
13
|
({ children, variant, titleBlockHasNavigation, classNameOverride, ...restProps }: SkirtProps): JSX.Element;
|
|
11
14
|
displayName: string;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { type CardProps } from "../../../Card";
|
|
2
2
|
export type SkirtCardProps = CardProps;
|
|
3
|
+
/**
|
|
4
|
+
* @deprecated This component will be removed in v2. Use a regular Card component instead.
|
|
5
|
+
*/
|
|
3
6
|
export declare const SkirtCard: {
|
|
4
7
|
(props: SkirtCardProps): JSX.Element;
|
|
5
8
|
displayName: string;
|
|
@@ -36,6 +36,8 @@ export type SplitButtonProps = {
|
|
|
36
36
|
dir?: 'ltr' | 'rtl';
|
|
37
37
|
} & OverrideClassName<HTMLAttributes<HTMLDivElement>>;
|
|
38
38
|
/**
|
|
39
|
+
* @deprecated This component will be removed in v2. Use a Button and Menu component instead.
|
|
40
|
+
*
|
|
39
41
|
* {@link https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3081896196/Split+Button Guidance} |
|
|
40
42
|
* {@link https://cultureamp.design/storybook/?path=/docs/components-splitbutton--docs Storybook}
|
|
41
43
|
*/
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { type TitleBlockProps } from './types';
|
|
2
2
|
/**
|
|
3
|
+
* @deprecated This component will be renamed to TitleBlock in v2.
|
|
4
|
+
* Start importing as TitleBlock instead.
|
|
5
|
+
*
|
|
3
6
|
* {@link https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3075605782/Title+Block Guidance} |
|
|
4
7
|
* {@link https://cultureamp.design/?path=/story/components-titleblock--docs Storybook}
|
|
5
8
|
*/
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React, { type HTMLAttributes, type PropsWithChildren } from 'react';
|
|
2
|
+
import { type OverrideClassName } from "../../types/OverrideClassName";
|
|
3
|
+
export type SingleSelectProps = {
|
|
4
|
+
children?: React.ReactNode;
|
|
5
|
+
} & OverrideClassName<HTMLAttributes<Element>>;
|
|
6
|
+
export declare const SingleSelect: {
|
|
7
|
+
({ classNameOverride, children, ...restProps }: PropsWithChildren<SingleSelectProps>): JSX.Element;
|
|
8
|
+
displayName: string;
|
|
9
|
+
List: {
|
|
10
|
+
({ children, className, ...props }: import("react-aria-components").ListBoxProps<object> & PropsWithChildren): React.ReactElement;
|
|
11
|
+
displayName: string;
|
|
12
|
+
};
|
|
13
|
+
ListItem: {
|
|
14
|
+
({ children, className, ...props }: import("react-aria-components").ListBoxItemProps<object> & PropsWithChildren): React.ReactElement;
|
|
15
|
+
displayName: string;
|
|
16
|
+
};
|
|
17
|
+
ListSection: {
|
|
18
|
+
({ name, className, children, ...props }: import("react-aria-components").ListBoxSectionProps<object> & PropsWithChildren & {
|
|
19
|
+
name: string;
|
|
20
|
+
}): React.ReactElement;
|
|
21
|
+
displayName: string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export declare const singleMockItems: {
|
|
2
|
+
label: string;
|
|
3
|
+
value: string;
|
|
4
|
+
}[];
|
|
5
|
+
export declare const groupedMockItems: {
|
|
6
|
+
label: string;
|
|
7
|
+
options: {
|
|
8
|
+
label: string;
|
|
9
|
+
value: string;
|
|
10
|
+
}[];
|
|
11
|
+
}[];
|
|
12
|
+
export declare const mixedMockItemsDisabled: ({
|
|
13
|
+
label: string;
|
|
14
|
+
value: string;
|
|
15
|
+
disabled: boolean;
|
|
16
|
+
options?: undefined;
|
|
17
|
+
} | {
|
|
18
|
+
label: string;
|
|
19
|
+
value: string;
|
|
20
|
+
disabled?: undefined;
|
|
21
|
+
options?: undefined;
|
|
22
|
+
} | {
|
|
23
|
+
label: string;
|
|
24
|
+
options: ({
|
|
25
|
+
label: string;
|
|
26
|
+
value: string;
|
|
27
|
+
disabled?: undefined;
|
|
28
|
+
} | {
|
|
29
|
+
label: string;
|
|
30
|
+
value: string;
|
|
31
|
+
disabled: boolean;
|
|
32
|
+
})[];
|
|
33
|
+
value?: undefined;
|
|
34
|
+
disabled?: undefined;
|
|
35
|
+
})[];
|
|
36
|
+
export declare const mixedMockItemsUngroupedFirst: ({
|
|
37
|
+
label: string;
|
|
38
|
+
value: string;
|
|
39
|
+
options?: undefined;
|
|
40
|
+
} | {
|
|
41
|
+
label: string;
|
|
42
|
+
options: {
|
|
43
|
+
label: string;
|
|
44
|
+
value: string;
|
|
45
|
+
}[];
|
|
46
|
+
value?: undefined;
|
|
47
|
+
})[];
|
|
48
|
+
export declare const mixedMockItemsUnordered: ({
|
|
49
|
+
label: string;
|
|
50
|
+
options: {
|
|
51
|
+
label: string;
|
|
52
|
+
value: string;
|
|
53
|
+
}[];
|
|
54
|
+
value?: undefined;
|
|
55
|
+
} | {
|
|
56
|
+
label: string;
|
|
57
|
+
value: string;
|
|
58
|
+
options?: undefined;
|
|
59
|
+
})[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SingleSelect';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React, { type PropsWithChildren } from 'react';
|
|
2
|
+
import { type ListBoxProps } from 'react-aria-components';
|
|
3
|
+
export declare const List: {
|
|
4
|
+
({ children, className, ...props }: ListBoxProps<object> & PropsWithChildren): React.ReactElement;
|
|
5
|
+
displayName: string;
|
|
6
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './List';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React, { type PropsWithChildren } from 'react';
|
|
2
|
+
import { type ListBoxItemProps } from 'react-aria-components';
|
|
3
|
+
export declare const ListItem: {
|
|
4
|
+
({ children, className, ...props }: ListBoxItemProps<object> & PropsWithChildren): React.ReactElement;
|
|
5
|
+
displayName: string;
|
|
6
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ListItem';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React, { type PropsWithChildren } from 'react';
|
|
2
|
+
import { type ListBoxSectionProps } from 'react-aria-components';
|
|
3
|
+
export declare const ListSection: {
|
|
4
|
+
({ name, className, children, ...props }: ListBoxSectionProps<object> & PropsWithChildren & {
|
|
5
|
+
name: string;
|
|
6
|
+
}): React.ReactElement;
|
|
7
|
+
displayName: string;
|
|
8
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ListSection';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const Trigger: () => JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Trigger';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SingleSelect';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kaizen/components",
|
|
3
|
-
"version": "0.0.0-canary-
|
|
3
|
+
"version": "0.0.0-canary-handle-avatar-error-20250716233812",
|
|
4
4
|
"description": "Kaizen component library",
|
|
5
5
|
"author": "Geoffrey Chong <geoff.chong@cultureamp.com>",
|
|
6
6
|
"homepage": "https://cultureamp.design",
|
package/src/Avatar/Avatar.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useEffect, useRef, useState, type HTMLAttributes } from 'react'
|
|
1
|
+
import React, { useEffect, useRef, useState, type HTMLAttributes, type SyntheticEvent } from 'react'
|
|
2
2
|
import classnames from 'classnames'
|
|
3
3
|
import { Textfit } from 'react-textfit'
|
|
4
4
|
import { Icon } from '~components/__next__/Icon'
|
|
@@ -132,7 +132,10 @@ export const Avatar = ({
|
|
|
132
132
|
setAvatarState(avatarSrc ? 'loading' : 'none')
|
|
133
133
|
}, [avatarSrc])
|
|
134
134
|
|
|
135
|
-
const onImageFailure = (): void =>
|
|
135
|
+
const onImageFailure = (event: SyntheticEvent<HTMLImageElement>): void => {
|
|
136
|
+
event.preventDefault()
|
|
137
|
+
setAvatarState('error')
|
|
138
|
+
}
|
|
136
139
|
const onImageSuccess = (): void => setAvatarState('success')
|
|
137
140
|
|
|
138
141
|
// if the image is cached onLoad may not trigger: https://stackoverflow.com/a/59809184
|
|
@@ -22,7 +22,7 @@ const PROPS_PHOTO_PERSONAL: GenericAvatarProps = {
|
|
|
22
22
|
disableInitials: false,
|
|
23
23
|
isCurrentUser: true,
|
|
24
24
|
avatarSrc:
|
|
25
|
-
'https://
|
|
25
|
+
'https://cultureamp.cultureamp.com/profile_images/12d1f70b-4e6d-8a65-784c-ea6768000001/31cb1c5d-ad7c-4e7c-8d05-6aa4bfa07afd/profile_image.jpg',
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
const PROPS_INITIALS_PERSONAL: GenericAvatarProps = {
|
|
@@ -51,7 +51,7 @@ const PROPS_INITIALS_LONG: GenericAvatarProps = {
|
|
|
51
51
|
|
|
52
52
|
const PROPS_COMPANY: CompanyAvatarProps = {
|
|
53
53
|
fullName: 'Hooli',
|
|
54
|
-
avatarSrc: 'https://d1e7r7b0lb8p4d.cloudfront.net/third-party-logos/hooli-
|
|
54
|
+
avatarSrc: 'https://d1e7r7b0lb8p4d.cloudfront.net/third-party-logos/hooli-logod.svg',
|
|
55
55
|
isCompany: true,
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -5,6 +5,11 @@ import { GenericButton, type ButtonRef, type GenericButtonProps } from '../Gener
|
|
|
5
5
|
export type ButtonProps = GenericButtonProps
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
+
* @deprecated This component will be replaced by the next Button component in v2.
|
|
9
|
+
* Use `@kaizen/components/next` Button instead.
|
|
10
|
+
* Migration guide: {@link https://cultureamp.design/?path=/docs/components-button-migration-guide--docs}
|
|
11
|
+
* Codemod available: `upgradeV1Buttons`
|
|
12
|
+
*
|
|
8
13
|
* {@link https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3062890984/Button Guidance} |
|
|
9
14
|
* {@link https://cultureamp.design/?path=/docs/components-buttons-button--docs Storybook}
|
|
10
15
|
*/
|
|
@@ -9,6 +9,11 @@ import {
|
|
|
9
9
|
export type IconButtonProps = Omit<BaseButtonProps, 'iconPosition'> & WorkingButtonProps
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
+
* @deprecated This component will be replaced by the next Button component in v2.
|
|
13
|
+
* Use `@kaizen/components/next` Button instead.
|
|
14
|
+
* Migration guide: {@link https://cultureamp.design/?path=/docs/components-button-migration-guide--docs}
|
|
15
|
+
* Codemod available: `upgradeV1Buttons`
|
|
16
|
+
*
|
|
12
17
|
* {@link https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3062890984/Button Guidance} |
|
|
13
18
|
* {@link https://cultureamp.design/?path=/docs/components-iconbutton--docs Storybook}
|
|
14
19
|
*/
|
package/src/Filter/FilterBar/subcomponents/FilterBarMultiSelect/FilterBarMultiSelect.spec.tsx
CHANGED
|
@@ -180,7 +180,6 @@ describe('<FilterBarMultiSelect />', () => {
|
|
|
180
180
|
})
|
|
181
181
|
|
|
182
182
|
await user.click(getByRole('option', { name: 'Fruit Jelly' }))
|
|
183
|
-
await user.keyboard('{Escape}')
|
|
184
183
|
await waitFor(() => {
|
|
185
184
|
expect(getByRole('button', { name: 'Toppings : Pearls, Fruit Jelly' })).toBeInTheDocument()
|
|
186
185
|
})
|
|
@@ -58,10 +58,9 @@ export const FilterMultiSelect = ({
|
|
|
58
58
|
onSearchInputChange,
|
|
59
59
|
triggerRef,
|
|
60
60
|
className,
|
|
61
|
-
floatingConfig,
|
|
62
61
|
}: FilterMultiSelectProps): JSX.Element => {
|
|
63
62
|
const menuTriggerProps = { isOpen, defaultOpen, onOpenChange, triggerRef }
|
|
64
|
-
const menuPopupProps = { isLoading, loadingSkeleton
|
|
63
|
+
const menuPopupProps = { isLoading, loadingSkeleton }
|
|
65
64
|
const disabledKeys: Selection = new Set(
|
|
66
65
|
items?.filter((item) => item.isDisabled === true).map((disabledItem) => disabledItem.value),
|
|
67
66
|
)
|
|
@@ -80,7 +79,7 @@ export const FilterMultiSelect = ({
|
|
|
80
79
|
<MenuTriggerProvider {...menuTriggerProps}>
|
|
81
80
|
<div className={className}>
|
|
82
81
|
<MenuTriggerConsumer>{trigger}</MenuTriggerConsumer>
|
|
83
|
-
<MenuPopup
|
|
82
|
+
<MenuPopup {...menuPopupProps}>
|
|
84
83
|
<SelectionProvider {...selectionProps}>
|
|
85
84
|
<SelectionConsumer>{children}</SelectionConsumer>
|
|
86
85
|
</SelectionProvider>
|
|
@@ -30,16 +30,6 @@ The FilterMultiSelect is a component relies heavily on consumer implemntation. I
|
|
|
30
30
|
|
|
31
31
|
<Canvas of={FilterMultiSelectStories.WithSectionHeaders} />
|
|
32
32
|
|
|
33
|
-
### With floatingConfig
|
|
34
|
-
|
|
35
|
-
You can also use the `floatingConfig` to leverage a subset of `Floating UI's` [configurable options](https://floating-ui.com/docs/usefloating). While in most cases the default behavior should satisfy most scenarios, this can be used when there is limited space available in the viewport and you cannot rely on the popup add height to the page.
|
|
36
|
-
|
|
37
|
-
The `shouldFlip` property will enable the [autoPlacement](https://floating-ui.com/docs/autoPlacement) middleware and `shouldResize` will enable the [size](https://floating-ui.com/docs/size) middleware.
|
|
38
|
-
|
|
39
|
-
The `shouldFlip` middleware will automatically flip the position of the menu when there is not enough space to display it in the intended direction, while the `shouldResize` middleware will resize the popover based on the window size availability
|
|
40
|
-
|
|
41
|
-
<Canvas of={FilterMultiSelectStories.AboveIfAvailable} />
|
|
42
|
-
|
|
43
33
|
### Async
|
|
44
34
|
|
|
45
35
|
The following is an example of how you may create an async FilterMultiSelect using `@tanstack/react-query`.
|
|
@@ -5,7 +5,7 @@ import isChromatic from 'chromatic'
|
|
|
5
5
|
import { InlineNotification } from '~components/Notification'
|
|
6
6
|
import { TextField } from '~components/TextField'
|
|
7
7
|
import { FilterMultiSelect, getSelectedOptionLabels } from '..'
|
|
8
|
-
import { mockItems
|
|
8
|
+
import { mockItems } from './MockData'
|
|
9
9
|
|
|
10
10
|
const IS_CHROMATIC = isChromatic()
|
|
11
11
|
|
|
@@ -308,180 +308,3 @@ export const WithSectionNotification: Story = {
|
|
|
308
308
|
chromatic: { disable: false },
|
|
309
309
|
},
|
|
310
310
|
}
|
|
311
|
-
|
|
312
|
-
export const WithManyOptions: Story = {
|
|
313
|
-
...FilterMultiSelectTemplate,
|
|
314
|
-
name: 'With many options',
|
|
315
|
-
args: {
|
|
316
|
-
items: mockManyItems,
|
|
317
|
-
children: (): JSX.Element => (
|
|
318
|
-
<>
|
|
319
|
-
<FilterMultiSelect.SearchInput />
|
|
320
|
-
<FilterMultiSelect.ListBox>
|
|
321
|
-
{({ selectedItems, unselectedItems, hasNoItems }): JSX.Element => (
|
|
322
|
-
<>
|
|
323
|
-
{hasNoItems ? (
|
|
324
|
-
<FilterMultiSelect.NoResults>No results found.</FilterMultiSelect.NoResults>
|
|
325
|
-
) : (
|
|
326
|
-
<>
|
|
327
|
-
{selectedItems.length > 0 && (
|
|
328
|
-
<FilterMultiSelect.ListBoxSection
|
|
329
|
-
items={selectedItems}
|
|
330
|
-
sectionHeader="Selected items"
|
|
331
|
-
>
|
|
332
|
-
{(item): JSX.Element => (
|
|
333
|
-
<FilterMultiSelect.Option key={item.key} item={item} />
|
|
334
|
-
)}
|
|
335
|
-
</FilterMultiSelect.ListBoxSection>
|
|
336
|
-
)}
|
|
337
|
-
|
|
338
|
-
{unselectedItems.length > 0 && (
|
|
339
|
-
<FilterMultiSelect.ListBoxSection
|
|
340
|
-
items={unselectedItems}
|
|
341
|
-
sectionHeader="Unselected items"
|
|
342
|
-
>
|
|
343
|
-
{(item): JSX.Element => (
|
|
344
|
-
<FilterMultiSelect.Option key={item.key} item={item} />
|
|
345
|
-
)}
|
|
346
|
-
</FilterMultiSelect.ListBoxSection>
|
|
347
|
-
)}
|
|
348
|
-
|
|
349
|
-
{unselectedItems.length > 0 && (
|
|
350
|
-
<FilterMultiSelect.ListBoxSection
|
|
351
|
-
items={unselectedItems}
|
|
352
|
-
sectionHeader="Unselected items 2"
|
|
353
|
-
>
|
|
354
|
-
{(item): JSX.Element => (
|
|
355
|
-
<FilterMultiSelect.Option key={item.key} item={item} />
|
|
356
|
-
)}
|
|
357
|
-
</FilterMultiSelect.ListBoxSection>
|
|
358
|
-
)}
|
|
359
|
-
|
|
360
|
-
{unselectedItems.length > 0 && (
|
|
361
|
-
<FilterMultiSelect.ListBoxSection
|
|
362
|
-
items={unselectedItems}
|
|
363
|
-
sectionHeader="Unselected items 3"
|
|
364
|
-
>
|
|
365
|
-
{(item): JSX.Element => (
|
|
366
|
-
<FilterMultiSelect.Option key={item.key} item={item} />
|
|
367
|
-
)}
|
|
368
|
-
</FilterMultiSelect.ListBoxSection>
|
|
369
|
-
)}
|
|
370
|
-
</>
|
|
371
|
-
)}
|
|
372
|
-
</>
|
|
373
|
-
)}
|
|
374
|
-
</FilterMultiSelect.ListBox>
|
|
375
|
-
<FilterMultiSelect.MenuFooter>
|
|
376
|
-
<FilterMultiSelect.SelectAllButton />
|
|
377
|
-
<FilterMultiSelect.ClearButton />
|
|
378
|
-
</FilterMultiSelect.MenuFooter>
|
|
379
|
-
</>
|
|
380
|
-
),
|
|
381
|
-
},
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
const floatingOptionsSourceCode = `
|
|
385
|
-
import { autoPlacement, size, offset } from '@floating-ui/react-dom'
|
|
386
|
-
|
|
387
|
-
// ...source code
|
|
388
|
-
|
|
389
|
-
<FilterMultiSelect
|
|
390
|
-
{...args}
|
|
391
|
-
floatingOptions={{
|
|
392
|
-
...{
|
|
393
|
-
middleware: [
|
|
394
|
-
size({
|
|
395
|
-
apply({ availableHeight, elements }) {
|
|
396
|
-
Object.assign(elements.floating.style, {
|
|
397
|
-
maxHeight: Math.max(250, Math.min(availableHeight - 12, 500)) + "px",
|
|
398
|
-
})
|
|
399
|
-
},
|
|
400
|
-
}),
|
|
401
|
-
autoPlacement({
|
|
402
|
-
allowedPlacements: ['bottom-start', 'top-start'],
|
|
403
|
-
}),
|
|
404
|
-
offset(6),
|
|
405
|
-
],
|
|
406
|
-
},
|
|
407
|
-
}}
|
|
408
|
-
/>
|
|
409
|
-
`
|
|
410
|
-
|
|
411
|
-
export const ShouldFlip: Story = {
|
|
412
|
-
...WithManyOptions,
|
|
413
|
-
name: 'With flipping Popup',
|
|
414
|
-
args: {
|
|
415
|
-
floatingConfig: {
|
|
416
|
-
shouldFlip: true,
|
|
417
|
-
shouldResize: false,
|
|
418
|
-
},
|
|
419
|
-
},
|
|
420
|
-
parameters: {
|
|
421
|
-
docs: { source: { code: floatingOptionsSourceCode } },
|
|
422
|
-
},
|
|
423
|
-
decorators: [
|
|
424
|
-
(Story) => (
|
|
425
|
-
<div>
|
|
426
|
-
<div style={{ height: '80vh', background: 'rebeccapurple' }}>content</div>
|
|
427
|
-
<Story />
|
|
428
|
-
<div style={{ height: '80vh', background: 'blue' }}>content 2</div>
|
|
429
|
-
</div>
|
|
430
|
-
),
|
|
431
|
-
],
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
export const ShouldFlipAndResize: Story = {
|
|
435
|
-
...WithManyOptions,
|
|
436
|
-
name: 'With flipping and resizing Popup',
|
|
437
|
-
args: {
|
|
438
|
-
floatingConfig: {
|
|
439
|
-
shouldFlip: true,
|
|
440
|
-
shouldResize: true,
|
|
441
|
-
},
|
|
442
|
-
},
|
|
443
|
-
parameters: {
|
|
444
|
-
docs: { source: { code: floatingOptionsSourceCode } },
|
|
445
|
-
},
|
|
446
|
-
decorators: [
|
|
447
|
-
(Story) => (
|
|
448
|
-
<div>
|
|
449
|
-
<div style={{ height: '80vh', background: 'rebeccapurple' }}>content</div>
|
|
450
|
-
<Story />
|
|
451
|
-
<div style={{ height: '80vh', background: 'blue' }}>content 2</div>
|
|
452
|
-
</div>
|
|
453
|
-
),
|
|
454
|
-
],
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
export const AboveIfAvailable: Story = {
|
|
458
|
-
...WithManyOptions,
|
|
459
|
-
name: 'With limited viewport and autoplacement above',
|
|
460
|
-
parameters: {
|
|
461
|
-
viewport: {
|
|
462
|
-
viewports: {
|
|
463
|
-
LimitedViewportAutoPlace: {
|
|
464
|
-
name: 'Limited vertical space',
|
|
465
|
-
styles: {
|
|
466
|
-
width: '1024px',
|
|
467
|
-
height: '500px',
|
|
468
|
-
},
|
|
469
|
-
},
|
|
470
|
-
},
|
|
471
|
-
defaultViewport: 'LimitedViewportAutoPlace',
|
|
472
|
-
},
|
|
473
|
-
},
|
|
474
|
-
args: {
|
|
475
|
-
floatingConfig: {
|
|
476
|
-
shouldFlip: true,
|
|
477
|
-
shouldResize: true,
|
|
478
|
-
},
|
|
479
|
-
},
|
|
480
|
-
decorators: [
|
|
481
|
-
(Story) => (
|
|
482
|
-
<div className="mt-[350px]">
|
|
483
|
-
<Story />
|
|
484
|
-
</div>
|
|
485
|
-
),
|
|
486
|
-
],
|
|
487
|
-
}
|
|
@@ -58,42 +58,3 @@ export const locationDemographicValues = [
|
|
|
58
58
|
label: 'London',
|
|
59
59
|
},
|
|
60
60
|
]
|
|
61
|
-
|
|
62
|
-
export const mockManyItems: ItemType[] = [
|
|
63
|
-
{ label: 'Front-End', value: 'id-fe', count: '1245' },
|
|
64
|
-
{ label: 'Back-End', value: 'id-be', count: '4', isDisabled: true },
|
|
65
|
-
{ label: 'SRE', value: 'id-sre', count: '4', isDisabled: true },
|
|
66
|
-
{ label: 'Dev-ops', value: 'id-devops' },
|
|
67
|
-
{ label: 'Others', value: 'id-others' },
|
|
68
|
-
{
|
|
69
|
-
label: 'Engineer-type-1 has a really really long label',
|
|
70
|
-
value: 'id-type-1',
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
label: 'Engineer-type-2 also has a really really long label',
|
|
74
|
-
value: 'id-type-2',
|
|
75
|
-
count: '156',
|
|
76
|
-
},
|
|
77
|
-
{ label: 'Engineer-type-3', value: 'id-type-3' },
|
|
78
|
-
{
|
|
79
|
-
label: 'Engineer-type-4',
|
|
80
|
-
value: 'id-type-4',
|
|
81
|
-
count: '4',
|
|
82
|
-
isDisabled: true,
|
|
83
|
-
},
|
|
84
|
-
{ label: 'Engineer-type-5', value: 'id-type-5' },
|
|
85
|
-
{ label: 'UI Designer', value: 'id-ui', count: '42' },
|
|
86
|
-
{ label: 'UX Researcher', value: 'id-ux', count: '15' },
|
|
87
|
-
{ label: 'Product Manager', value: 'id-pm', count: '28' },
|
|
88
|
-
{ label: 'Project Manager', value: 'id-project', count: '19', isDisabled: true },
|
|
89
|
-
{ label: 'Data Scientist', value: 'id-ds', count: '11' },
|
|
90
|
-
{ label: 'Machine Learning Engineer', value: 'id-ml', count: '7' },
|
|
91
|
-
{ label: 'QA Tester', value: 'id-qa', count: '22' },
|
|
92
|
-
{
|
|
93
|
-
label: 'Technical Writer with documentation expertise',
|
|
94
|
-
value: 'id-tech-writer',
|
|
95
|
-
count: '5',
|
|
96
|
-
},
|
|
97
|
-
{ label: 'DevSecOps Engineer', value: 'id-devsecops', count: '3', isDisabled: true },
|
|
98
|
-
{ label: 'Cloud Architect', value: 'id-cloud', count: '8' },
|
|
99
|
-
]
|
package/src/Filter/FilterMultiSelect/context/MenuTriggerProvider/MenuTriggerProvider.spec.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { render, screen, waitFor } from '@testing-library/react'
|
|
3
3
|
import userEvent from '@testing-library/user-event'
|
|
4
|
+
import { vi } from 'vitest'
|
|
4
5
|
import { FilterTriggerButton } from '~components/Filter/FilterMultiSelect/subcomponents/Trigger'
|
|
5
6
|
import { MenuPopup } from '../../subcomponents/MenuPopup'
|
|
6
7
|
import { MenuTriggerProvider, type MenuTriggerProviderProps } from './MenuTriggerProvider'
|
|
@@ -52,11 +53,15 @@ describe('<MenuTriggerProvider /> - Visual content', () => {
|
|
|
52
53
|
rerender(<MenuTriggerProviderWrapper isOpen={false} />)
|
|
53
54
|
expect(screen.queryByText('menu-content-mock')).not.toBeInTheDocument()
|
|
54
55
|
})
|
|
55
|
-
|
|
56
|
+
|
|
57
|
+
it('fires the onOpenChange callback when the trigger is interacted', async () => {
|
|
56
58
|
const onOpenChange = vi.fn()
|
|
57
59
|
render(<MenuTriggerProviderWrapper isOpen onOpenChange={onOpenChange} />)
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
const trigger = screen.getByRole('button', {
|
|
62
|
+
name: 'trigger-display-label-mock',
|
|
63
|
+
})
|
|
64
|
+
await user.click(trigger)
|
|
60
65
|
|
|
61
66
|
await waitFor(() => {
|
|
62
67
|
expect(onOpenChange).toBeCalledTimes(1)
|
|
@@ -81,6 +86,17 @@ describe('<MenuTriggerProvider /> - Mouse interaction', () => {
|
|
|
81
86
|
})
|
|
82
87
|
|
|
83
88
|
describe('Given the menu is opened', () => {
|
|
89
|
+
it('is closed when user clicks on the trigger', async () => {
|
|
90
|
+
render(<MenuTriggerProviderWrapper defaultOpen />)
|
|
91
|
+
const trigger = screen.getByRole('button', {
|
|
92
|
+
name: 'trigger-display-label-mock',
|
|
93
|
+
})
|
|
94
|
+
await user.click(trigger)
|
|
95
|
+
await waitFor(() => {
|
|
96
|
+
expect(screen.queryByText('menu-content-mock')).not.toBeInTheDocument()
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
|
|
84
100
|
it('is closed when user clicks outside of the menu', async () => {
|
|
85
101
|
render(<MenuTriggerProviderWrapper defaultOpen />)
|
|
86
102
|
await user.click(document.body)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
@import '~@kaizen/design-tokens/sass/spacing';
|
|
2
|
+
|
|
3
|
+
@layer kz-components {
|
|
4
|
+
.listBox {
|
|
5
|
+
list-style: none;
|
|
6
|
+
padding: $spacing-sm;
|
|
7
|
+
margin: 0 $spacing-sm 0 0;
|
|
8
|
+
display: grid;
|
|
9
|
+
max-height: 22rem;
|
|
10
|
+
overflow-y: auto;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.overflown {
|
|
14
|
+
padding-right: $spacing-sm;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.hidden {
|
|
18
|
+
display: none;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// this is a div but remove styles briefly flickering to a bullet list as the sections are removed
|
|
22
|
+
.noResultsWrapper {
|
|
23
|
+
list-style: none;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -3,7 +3,7 @@ import { type Collection, type Key } from '@react-types/shared'
|
|
|
3
3
|
import classnames from 'classnames'
|
|
4
4
|
import { useSelectionContext } from '../../context/SelectionProvider'
|
|
5
5
|
import { type MultiSelectItem } from '../../types'
|
|
6
|
-
import styles from './ListBox.module.
|
|
6
|
+
import styles from './ListBox.module.scss'
|
|
7
7
|
|
|
8
8
|
export type ListBoxItems = {
|
|
9
9
|
selectedItems: MultiSelectItem[]
|
|
@@ -47,7 +47,7 @@ export const ListBoxSection = ({
|
|
|
47
47
|
>
|
|
48
48
|
{hasSectionHeader && (
|
|
49
49
|
<li className={styles.listBoxSectionHeader} id={listSectionId} role="presentation">
|
|
50
|
-
{
|
|
50
|
+
{sectionName && <VisuallyHidden>{sectionName}. </VisuallyHidden>}
|
|
51
51
|
{restProps.sectionHeader}
|
|
52
52
|
</li>
|
|
53
53
|
)}
|