@redsift/design-system 12.6.6-alpha.2 → 13.0.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/CONTRIBUTING.md +20 -8
- package/_internal/AppContainer.js +1 -1
- package/_internal/AppContainer.js.map +1 -1
- package/_internal/Button2.js +1 -1
- package/_internal/Button2.js.map +1 -1
- package/_internal/Checkbox2.js +8 -3
- package/_internal/Checkbox2.js.map +1 -1
- package/_internal/DetailedCard.js +17 -1352
- package/_internal/DetailedCard.js.map +1 -1
- package/_internal/DetailedCardCollapsibleSectionItems.js +14 -4
- package/_internal/DetailedCardCollapsibleSectionItems.js.map +1 -1
- package/_internal/DetailedCardSection.js +4 -2
- package/_internal/DetailedCardSection.js.map +1 -1
- package/_internal/IconButton.js +1 -1
- package/_internal/IconButton.js.map +1 -1
- package/_internal/Item2.js +2 -2
- package/_internal/Item2.js.map +1 -1
- package/_internal/LinkButton.js +1 -1
- package/_internal/LinkButton.js.map +1 -1
- package/_internal/Listbox2.js +5 -5
- package/_internal/Listbox2.js.map +1 -1
- package/_internal/NumberField.js +2 -0
- package/_internal/NumberField.js.map +1 -1
- package/_internal/Radio2.js +14 -7
- package/_internal/Radio2.js.map +1 -1
- package/_internal/RadioGroup.js +6 -1
- package/_internal/RadioGroup.js.map +1 -1
- package/_internal/SideNavigationMenu.js +9 -4
- package/_internal/SideNavigationMenu.js.map +1 -1
- package/_internal/SideNavigationMenuItem.js +2 -2
- package/_internal/SideNavigationMenuItem.js.map +1 -1
- package/_internal/Switch2.js +8 -3
- package/_internal/Switch2.js.map +1 -1
- package/_internal/Tabs2.js.map +1 -1
- package/_internal/TextArea.js +5 -1
- package/_internal/TextArea.js.map +1 -1
- package/_internal/TextField.js +5 -1
- package/_internal/TextField.js.map +1 -1
- package/_internal/context.js.map +1 -1
- package/_internal/filterComponents.js +3 -0
- package/_internal/filterComponents.js.map +1 -1
- package/_internal/getElementRef.js +25 -0
- package/_internal/getElementRef.js.map +1 -0
- package/_internal/getTextWidth.js +32 -0
- package/_internal/getTextWidth.js.map +1 -0
- package/_internal/isComponent.js +3 -0
- package/_internal/isComponent.js.map +1 -1
- package/_internal/reactVersion.js +14 -0
- package/_internal/reactVersion.js.map +1 -0
- package/_internal/styles4.js +72 -72
- package/_internal/styles4.js.map +1 -1
- package/_internal/types.js.map +1 -1
- package/_internal/useFocusOnListItem.js +1 -1
- package/_internal/useFocusOnListItem.js.map +1 -1
- package/_internal/useId.js +1 -1
- package/_internal/useId.js.map +1 -1
- package/_internal/useListboxItem.js.map +1 -1
- package/_internal/useSideNavigationMenuBar.js +2 -2
- package/_internal/useSideNavigationMenuBar.js.map +1 -1
- package/_internal/warnIfNoAccessibleLabelFound.js.map +1 -1
- package/index.d.ts +48 -24
- package/index.js +3 -31
- package/index.js.map +1 -1
- package/package.json +18 -26
package/_internal/useId.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useId.js","sources":["../../src/utils/useId.ts"],"sourcesContent":["import React from 'react';\n\nlet globalPrefix = 'rsi';\nlet lastId = 0;\nexport const nextId = (localPrefix?: string | null): string => {\n lastId++;\n return `${localPrefix || globalPrefix}${lastId}`;\n};\n\nexport const resetId = (): void => {\n lastId = 0;\n};\n\nexport const setPrefix = (newPrefix: string): void => {\n globalPrefix = newPrefix;\n};\n\nconst getIds = (count: number, prefix?: string) => {\n const ids = [];\n for (let i = 0; i < count; i++) {\n ids.push(nextId(prefix));\n }\n return ids;\n};\n\nfunction usePrevious(value: unknown) {\n const ref = React.useRef<unknown>();\n React.useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n\nexport const useId = (count = 1, prefix?: string): string[] => {\n const idsListRef = React.useRef<string[]>([]);\n const prevCount = usePrevious(count);\n const prevPrefix = usePrevious(prefix);\n\n if (count !== prevCount || prevPrefix !== prefix) {\n idsListRef.current = getIds(count, prefix);\n }\n\n return idsListRef.current;\n};\n"],"names":["globalPrefix","lastId","nextId","localPrefix","resetId","setPrefix","newPrefix","getIds","count","prefix","ids","i","push","usePrevious","value","ref","React","useRef","useEffect","current","useId","arguments","length","
|
|
1
|
+
{"version":3,"file":"useId.js","sources":["../../src/utils/useId.ts"],"sourcesContent":["import React from 'react';\n\nlet globalPrefix = 'rsi';\nlet lastId = 0;\nexport const nextId = (localPrefix?: string | null): string => {\n lastId++;\n return `${localPrefix || globalPrefix}${lastId}`;\n};\n\nexport const resetId = (): void => {\n lastId = 0;\n};\n\nexport const setPrefix = (newPrefix: string): void => {\n globalPrefix = newPrefix;\n};\n\nconst getIds = (count: number, prefix?: string) => {\n const ids = [];\n for (let i = 0; i < count; i++) {\n ids.push(nextId(prefix));\n }\n return ids;\n};\n\nfunction usePrevious(value: unknown) {\n const ref = React.useRef<unknown>(undefined);\n React.useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n\nexport const useId = (count = 1, prefix?: string): string[] => {\n const idsListRef = React.useRef<string[]>([]);\n const prevCount = usePrevious(count);\n const prevPrefix = usePrevious(prefix);\n\n if (count !== prevCount || prevPrefix !== prefix) {\n idsListRef.current = getIds(count, prefix);\n }\n\n return idsListRef.current;\n};\n"],"names":["globalPrefix","lastId","nextId","localPrefix","resetId","setPrefix","newPrefix","getIds","count","prefix","ids","i","push","usePrevious","value","ref","React","useRef","undefined","useEffect","current","useId","arguments","length","idsListRef","prevCount","prevPrefix"],"mappings":";;AAEA,IAAIA,YAAY,GAAG,KAAK,CAAA;AACxB,IAAIC,MAAM,GAAG,CAAC,CAAA;AACDC,MAAAA,MAAM,GAAIC,WAA2B,IAAa;AAC7DF,EAAAA,MAAM,EAAE,CAAA;AACR,EAAA,OAAQ,GAAEE,WAAW,IAAIH,YAAa,CAAA,EAAEC,MAAO,CAAC,CAAA,CAAA;AAClD,EAAC;AAEYG,MAAAA,OAAO,GAAGA,MAAY;AACjCH,EAAAA,MAAM,GAAG,CAAC,CAAA;AACZ,EAAC;AAEYI,MAAAA,SAAS,GAAIC,SAAiB,IAAW;AACpDN,EAAAA,YAAY,GAAGM,SAAS,CAAA;AAC1B,EAAC;AAED,MAAMC,MAAM,GAAGA,CAACC,KAAa,EAAEC,MAAe,KAAK;EACjD,MAAMC,GAAG,GAAG,EAAE,CAAA;EACd,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,KAAK,EAAEG,CAAC,EAAE,EAAE;AAC9BD,IAAAA,GAAG,CAACE,IAAI,CAACV,MAAM,CAACO,MAAM,CAAC,CAAC,CAAA;AAC1B,GAAA;AACA,EAAA,OAAOC,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,SAASG,WAAWA,CAACC,KAAc,EAAE;AACnC,EAAA,MAAMC,GAAG,GAAGC,cAAK,CAACC,MAAM,CAAUC,SAAS,CAAC,CAAA;EAC5CF,cAAK,CAACG,SAAS,CAAC,MAAM;IACpBJ,GAAG,CAACK,OAAO,GAAGN,KAAK,CAAA;AACrB,GAAC,CAAC,CAAA;EACF,OAAOC,GAAG,CAACK,OAAO,CAAA;AACpB,CAAA;AAEaC,MAAAA,KAAK,GAAG,YAA0C;AAAA,EAAA,IAAzCb,KAAK,GAAAc,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAJ,SAAA,GAAAI,SAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAA;EAAA,IAAEb,MAAe,GAAAa,SAAA,CAAAC,MAAA,GAAAD,CAAAA,GAAAA,SAAA,MAAAJ,SAAA,CAAA;AAC9C,EAAA,MAAMM,UAAU,GAAGR,cAAK,CAACC,MAAM,CAAW,EAAE,CAAC,CAAA;AAC7C,EAAA,MAAMQ,SAAS,GAAGZ,WAAW,CAACL,KAAK,CAAC,CAAA;AACpC,EAAA,MAAMkB,UAAU,GAAGb,WAAW,CAACJ,MAAM,CAAC,CAAA;AAEtC,EAAA,IAAID,KAAK,KAAKiB,SAAS,IAAIC,UAAU,KAAKjB,MAAM,EAAE;IAChDe,UAAU,CAACJ,OAAO,GAAGb,MAAM,CAACC,KAAK,EAAEC,MAAM,CAAC,CAAA;AAC5C,GAAA;EAEA,OAAOe,UAAU,CAACJ,OAAO,CAAA;AAC3B;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useListboxItem.js","sources":["../../src/components/listbox/context.ts","../../src/components/listbox/types.ts","../../src/components/listbox/useListboxItem.ts"],"sourcesContent":["import React from 'react';\nimport { ListboxContextProps, ListboxState } from './types';\n\nexport const LISTBOX_INITIAL_STATE: ListboxState = {\n isDisabled: false,\n isReadOnly: false,\n selectedValues: [],\n selectionMode: 'single',\n};\n\nexport const ListboxContext = React.createContext<ListboxContextProps>({\n state: LISTBOX_INITIAL_STATE,\n dispatch: () => {},\n});\n","import { ComponentProps } from 'react';\nimport { ContainerProps, ContainerTransientProps, ValueOf } from '../../types';\nimport { FocusWithinGroupOptions, UseFocusWithinGroupProps } from '../focus-within-group';\n\n/**\n * Component variant.\n */\nexport const ListboxSelectionMode = {\n single: 'single',\n multiple: 'multiple',\n} as const;\nexport type ListboxSelectionMode = ValueOf<typeof ListboxSelectionMode>;\n\n/**\n * Context props.\n */\n\nexport type ListboxState = Readonly<{\n isDisabled: boolean;\n isReadOnly: boolean;\n selectedValues: string[];\n selectionMode: ListboxSelectionMode;\n activedescendant?: [string, string];\n}>;\n\nexport enum ListboxActionType {\n TOGGLE = 'TOGGLE',\n SET = 'SET',\n UPDATE_OPTIONS = 'UPDATE_OPTIONS',\n}\n\nexport type ListboxAction =\n | {\n type: ListboxActionType.TOGGLE;\n payload: { value: string; activedescendant?: [string, string] };\n }\n | {\n type: ListboxActionType.SET;\n payload: { values: string[]; activedescendant?: [string, string] };\n }\n | {\n type: ListboxActionType.UPDATE_OPTIONS;\n /**\n * Merged into the state as is. Unlike `SET` and `TOGGLE`, it is not blocked by `isDisabled` / `isReadOnly`,\n * so a parent component can mirror a controlled selection (`selectedValues`) into a disabled listbox.\n */\n payload: { isDisabled?: boolean; selectedValues?: string[] };\n };\n\nexport type UseListboxItemProps = UseFocusWithinGroupProps & {\n isSelected?: boolean;\n isDisabled?: boolean;\n};\n\nexport type ListboxContextProps = {\n state: ListboxState;\n dispatch: React.Dispatch<ListboxAction>;\n};\n\n/**\n * Component variant.\n */\nexport const ListboxVariant = {\n standalone: 'standalone',\n unstyled: 'unstyled',\n} as const;\nexport type ListboxVariant = ValueOf<typeof ListboxVariant>;\n\n/**\n * Component props.\n */\nexport interface ListboxProps extends Omit<ComponentProps<'div'>, 'onChange'>, ContainerProps, FocusWithinGroupOptions {\n /**\n * Default selected values.\n * Used for uncontrolled version.\n */\n defaultValues?: string[];\n /** Whether the component is disabled or not. */\n isDisabled?: boolean;\n /** Whether the component is invalid or not. */\n isInvalid?: boolean;\n /** Whether the component is read only or not. */\n isReadOnly?: boolean;\n /** Whether the component is required or not. */\n isRequired?: boolean;\n /** Label of the switch group. */\n label?: string;\n /** Method to handle component change. */\n onChange?(values: string[]): void;\n /**\n * Whether the listbox allows multiple selections or single ones.\n * @default 'single'\n */\n selectionMode?: 'single' | 'multiple';\n /**\n * Currently selected values.\n * Used for controlled version.\n */\n values?: string[];\n /**\n * Whether the Listbox is used as standalone or is unstyled within another component.\n * @default 'standalone'\n */\n variant?: ListboxVariant;\n}\n\nexport interface StyledListboxProps extends ComponentProps<'div'>, ContainerTransientProps {\n $isDisabled: ListboxProps['isDisabled'];\n $isInvalid: ListboxProps['isInvalid'];\n $isReadOnly: ListboxProps['isReadOnly'];\n $variant: ListboxProps['variant'];\n}\n","import { useCallback, useContext, useEffect, RefObject, KeyboardEvent } from 'react';\nimport { ListboxContext } from './context';\nimport { ListboxActionType, UseListboxItemProps } from './types';\nimport { useFocusOnListItem } from '../focus-within-group';\n\nexport function useListboxItem(props: {\n domElementRef: RefObject<Element>;\n value: string;\n id?: string;\n isDisabled?: boolean;\n propsIsSelected?: boolean;\n rowIndex?: number | null;\n}): UseListboxItemProps {\n const { domElementRef, value, id, isDisabled, propsIsSelected, rowIndex } = props;\n\n const {\n tabIndex,\n isFocused,\n handleKeyDown: handleFocusKeyDown,\n handleClick: handleFocusClick,\n } = useFocusOnListItem({ domElementRef, isDisabled: isDisabled!, id, value, rowIndex });\n\n const context = useContext(ListboxContext);\n\n const handleKeyDown = useCallback((event: KeyboardEvent) => {\n handleFocusKeyDown(event);\n const code = event.code;\n if (code === 'Enter' || code === 'Space') {\n if (context.state.selectionMode === 'multiple') {\n context.dispatch({\n type: ListboxActionType.TOGGLE,\n payload: { value, activedescendant: [id!, value] },\n });\n } else {\n context.dispatch({\n type: ListboxActionType.SET,\n payload: {\n values: [value],\n activedescendant: [id!, value],\n },\n });\n }\n }\n }, []);\n\n const handleClick = useCallback(() => {\n handleFocusClick();\n if (context.state.selectionMode === 'multiple') {\n if (value) {\n context.dispatch({\n type: ListboxActionType.TOGGLE,\n payload: { value, activedescendant: [id!, value] },\n });\n }\n } else {\n context.dispatch({\n type: ListboxActionType.SET,\n payload: {\n values: [value],\n activedescendant: [id!, value],\n },\n });\n }\n }, [value]);\n\n const isSelected =\n propsIsSelected ?? context?.state?.selectedValues?.find((selectedValue) => selectedValue === value) !== undefined;\n\n useEffect(() => {\n if (isFocused && domElementRef.current) {\n (domElementRef as RefObject<SVGElement | HTMLElement>).current?.focus();\n }\n }, [isFocused]);\n\n return {\n tabIndex,\n isFocused,\n isSelected,\n isDisabled,\n handleKeyDown,\n handleClick,\n };\n}\n"],"names":["LISTBOX_INITIAL_STATE","isDisabled","isReadOnly","selectedValues","selectionMode","ListboxContext","React","createContext","state","dispatch","ListboxSelectionMode","single","multiple","ListboxActionType","ListboxVariant","standalone","unstyled","useListboxItem","props","_context$state","_context$state$select","domElementRef","value","id","propsIsSelected","rowIndex","tabIndex","isFocused","handleKeyDown","handleFocusKeyDown","handleClick","handleFocusClick","useFocusOnListItem","context","useContext","useCallback","event","code","type","TOGGLE","payload","activedescendant","SET","values","isSelected","find","selectedValue","undefined","useEffect","current","_current","focus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useListboxItem.js","sources":["../../src/components/listbox/context.ts","../../src/components/listbox/types.ts","../../src/components/listbox/useListboxItem.ts"],"sourcesContent":["import React from 'react';\nimport { ListboxContextProps, ListboxState } from './types';\n\nexport const LISTBOX_INITIAL_STATE: ListboxState = {\n isDisabled: false,\n isReadOnly: false,\n selectedValues: [],\n selectionMode: 'single',\n};\n\nexport const ListboxContext = React.createContext<ListboxContextProps>({\n state: LISTBOX_INITIAL_STATE,\n dispatch: () => {},\n});\n","import { ComponentProps } from 'react';\nimport { ContainerProps, ContainerTransientProps, ValueOf } from '../../types';\nimport { FocusWithinGroupOptions, UseFocusWithinGroupProps } from '../focus-within-group';\n\n/**\n * Component variant.\n */\nexport const ListboxSelectionMode = {\n single: 'single',\n multiple: 'multiple',\n} as const;\nexport type ListboxSelectionMode = ValueOf<typeof ListboxSelectionMode>;\n\n/**\n * Context props.\n */\n\nexport type ListboxState = Readonly<{\n isDisabled: boolean;\n isReadOnly: boolean;\n selectedValues: string[];\n selectionMode: ListboxSelectionMode;\n activedescendant?: [string, string];\n}>;\n\nexport enum ListboxActionType {\n TOGGLE = 'TOGGLE',\n SET = 'SET',\n UPDATE_OPTIONS = 'UPDATE_OPTIONS',\n}\n\nexport type ListboxAction =\n | {\n type: ListboxActionType.TOGGLE;\n payload: { value: string; activedescendant?: [string, string] };\n }\n | {\n type: ListboxActionType.SET;\n payload: { values: string[]; activedescendant?: [string, string] };\n }\n | {\n type: ListboxActionType.UPDATE_OPTIONS;\n /**\n * Merged into the state as is. Unlike `SET` and `TOGGLE`, it is not blocked by `isDisabled` / `isReadOnly`,\n * so a parent component can mirror a controlled selection (`selectedValues`) into a disabled listbox.\n */\n payload: { isDisabled?: boolean; selectedValues?: string[] };\n };\n\nexport type UseListboxItemProps = UseFocusWithinGroupProps & {\n isSelected?: boolean;\n isDisabled?: boolean;\n};\n\nexport type ListboxContextProps = {\n state: ListboxState;\n dispatch: React.Dispatch<ListboxAction>;\n};\n\n/**\n * Component variant.\n */\nexport const ListboxVariant = {\n standalone: 'standalone',\n unstyled: 'unstyled',\n} as const;\nexport type ListboxVariant = ValueOf<typeof ListboxVariant>;\n\n/**\n * Component props.\n */\nexport interface ListboxProps extends Omit<ComponentProps<'div'>, 'onChange'>, ContainerProps, FocusWithinGroupOptions {\n /**\n * Default selected values.\n * Used for uncontrolled version.\n */\n defaultValues?: string[];\n /** Whether the component is disabled or not. */\n isDisabled?: boolean;\n /** Whether the component is invalid or not. */\n isInvalid?: boolean;\n /** Whether the component is read only or not. */\n isReadOnly?: boolean;\n /** Whether the component is required or not. */\n isRequired?: boolean;\n /** Label of the switch group. */\n label?: string;\n /** Method to handle component change. */\n onChange?(values: string[]): void;\n /**\n * Whether the listbox allows multiple selections or single ones.\n * @default 'single'\n */\n selectionMode?: 'single' | 'multiple';\n /**\n * Currently selected values.\n * Used for controlled version.\n */\n values?: string[];\n /**\n * Whether the Listbox is used as standalone or is unstyled within another component.\n * @default 'standalone'\n */\n variant?: ListboxVariant;\n}\n\nexport interface StyledListboxProps extends ComponentProps<'div'>, ContainerTransientProps {\n $isDisabled: ListboxProps['isDisabled'];\n $isInvalid: ListboxProps['isInvalid'];\n $isReadOnly: ListboxProps['isReadOnly'];\n $variant: ListboxProps['variant'];\n}\n","import { useCallback, useContext, useEffect, RefObject, KeyboardEvent } from 'react';\nimport { ListboxContext } from './context';\nimport { ListboxActionType, UseListboxItemProps } from './types';\nimport { useFocusOnListItem } from '../focus-within-group';\n\nexport function useListboxItem(props: {\n domElementRef: RefObject<Element | null>;\n value: string;\n id?: string;\n isDisabled?: boolean;\n propsIsSelected?: boolean;\n rowIndex?: number | null;\n}): UseListboxItemProps {\n const { domElementRef, value, id, isDisabled, propsIsSelected, rowIndex } = props;\n\n const {\n tabIndex,\n isFocused,\n handleKeyDown: handleFocusKeyDown,\n handleClick: handleFocusClick,\n } = useFocusOnListItem({ domElementRef, isDisabled: isDisabled!, id, value, rowIndex });\n\n const context = useContext(ListboxContext);\n\n const handleKeyDown = useCallback((event: KeyboardEvent) => {\n handleFocusKeyDown(event);\n const code = event.code;\n if (code === 'Enter' || code === 'Space') {\n if (context.state.selectionMode === 'multiple') {\n context.dispatch({\n type: ListboxActionType.TOGGLE,\n payload: { value, activedescendant: [id!, value] },\n });\n } else {\n context.dispatch({\n type: ListboxActionType.SET,\n payload: {\n values: [value],\n activedescendant: [id!, value],\n },\n });\n }\n }\n }, []);\n\n const handleClick = useCallback(() => {\n handleFocusClick();\n if (context.state.selectionMode === 'multiple') {\n if (value) {\n context.dispatch({\n type: ListboxActionType.TOGGLE,\n payload: { value, activedescendant: [id!, value] },\n });\n }\n } else {\n context.dispatch({\n type: ListboxActionType.SET,\n payload: {\n values: [value],\n activedescendant: [id!, value],\n },\n });\n }\n }, [value]);\n\n const isSelected =\n propsIsSelected ?? context?.state?.selectedValues?.find((selectedValue) => selectedValue === value) !== undefined;\n\n useEffect(() => {\n if (isFocused && domElementRef.current) {\n (domElementRef as RefObject<SVGElement | HTMLElement>).current?.focus();\n }\n }, [isFocused]);\n\n return {\n tabIndex,\n isFocused,\n isSelected,\n isDisabled,\n handleKeyDown,\n handleClick,\n };\n}\n"],"names":["LISTBOX_INITIAL_STATE","isDisabled","isReadOnly","selectedValues","selectionMode","ListboxContext","React","createContext","state","dispatch","ListboxSelectionMode","single","multiple","ListboxActionType","ListboxVariant","standalone","unstyled","useListboxItem","props","_context$state","_context$state$select","domElementRef","value","id","propsIsSelected","rowIndex","tabIndex","isFocused","handleKeyDown","handleFocusKeyDown","handleClick","handleFocusClick","useFocusOnListItem","context","useContext","useCallback","event","code","type","TOGGLE","payload","activedescendant","SET","values","isSelected","find","selectedValue","undefined","useEffect","current","_current","focus"],"mappings":"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"}
|
|
@@ -117,8 +117,8 @@ const CLASSNAME = 'redsift-side-navigation-menu-bar';
|
|
|
117
117
|
* The SideNavigationMenuBar component.
|
|
118
118
|
*/
|
|
119
119
|
const SideNavigationMenuBar = /*#__PURE__*/forwardRef((props, ref) => {
|
|
120
|
-
const navRef = ref || useRef();
|
|
121
|
-
const defaultListRef = useRef();
|
|
120
|
+
const navRef = ref || useRef(undefined);
|
|
121
|
+
const defaultListRef = useRef(undefined);
|
|
122
122
|
const {
|
|
123
123
|
'aria-label': ariaLabel,
|
|
124
124
|
'aria-labelledby': ariaLabelledby,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSideNavigationMenuBar.js","sources":["../../src/hooks/useBoundingRect.ts","../../src/components/app-side-panel/context.ts","../../src/components/side-navigation-menu-bar/styles.ts","../../src/components/side-navigation-menu-bar/SideNavigationMenuBar.tsx","../../src/components/side-navigation-menu-bar/useSideNavigationMenuBar.tsx"],"sourcesContent":["import { useState, useEffect, MutableRefObject, DependencyList } from 'react';\n\n/**\n * Get the bounding rect of a component.\n */\nexport const useBoundingClientRect = (\n ref: MutableRefObject<HTMLElement>,\n deps?: DependencyList\n) => {\n const [boundingRect, setBoundingRect] = useState<DOMRect>({} as DOMRect);\n\n useEffect(() => {\n if (ref.current) {\n setBoundingRect(ref.current.getBoundingClientRect());\n }\n }, deps);\n\n return boundingRect;\n};\n","import React from 'react';\n\nexport type AppSidePanelContextProps = {\n /** When set, persists menu expand/collapse states in localStorage using this key as prefix. */\n menuStorageKey?: string;\n};\n\nexport const AppSidePanelContext = React.createContext<AppSidePanelContextProps | null>(null);\n","import styled, { css } from 'styled-components';\nimport { SideNavigationMenuBarVariant, StyledSideNavigationMenuBarProps } from './types';\n\n/**\n * Component style.\n */\nexport const StyledSideNavigationMenuBar = styled.nav<StyledSideNavigationMenuBarProps>`\n background-color: ${({ $theme }) => `var(--redsift-color-${$theme}-components-side-navigation-background)`};\n box-sizing: content-box;\n overflow-x: hidden;\n overflow-y: auto;\n scrollbar-gutter: stable;\n transition: width 300ms ease-out;\n width: ${({ $variant }) => ($variant === SideNavigationMenuBarVariant.shrinked ? '64px' : '250px')};\n\n ${({ $marginTop = 0 }) =>\n $marginTop\n ? css`\n height: calc(100% - ${$marginTop}px);\n `\n : ''}\n\n ul {\n list-style: none;\n margin: unset;\n padding: unset;\n }\n\n scrollbar-color: ${({ $theme }) =>\n `var(--redsift-color-${$theme}-components-side-navigation-scrollbar-resting) transparent`};\n scrollbar-width: thin;\n\n &::-webkit-scrollbar {\n block-size: 9px;\n inline-size: 9px;\n }\n\n &::-webkit-scrollbar-thumb {\n background-clip: padding-box;\n background-color: ${({ $theme }) => `var(--redsift-color-${$theme}-components-side-navigation-scrollbar-resting)`};\n border-radius: 0px;\n border-left: 2px solid transparent;\n border-right: 2px solid transparent;\n }\n\n &::-webkit-scrollbar-track {\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb:horizontal,\n &::-webkit-scrollbar-thumb:vertical {\n &:hover {\n background-color: ${({ $theme }) => `var(--redsift-color-${$theme}-components-side-navigation-scrollbar-hover)`};\n }\n }\n\n &::-webkit-scrollbar-corner {\n visibility: hidden;\n }\n`;\n","import React, { forwardRef, MutableRefObject, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport classNames from 'classnames';\nimport { Comp } from '../../types';\nimport { SideNavigationMenu } from '../side-navigation-menu';\nimport { SideNavigationMenuItem } from '../side-navigation-menu-item';\nimport { warnIfNoAccessibleLabelFound } from '../../utils/warnIfNoAccessibleLabelFound';\nimport { StyledSideNavigationMenuBar } from './styles';\nimport { SideNavigationMenuBarProps, SideNavigationMenuBarContextProps, SideNavigationMenuBarVariant } from './types';\nimport { SideNavigationMenuBarContext } from './context';\nimport { useBoundingClientRect } from '../../hooks/useBoundingRect';\nimport { filterComponents } from '../../utils/filterComponents';\nimport { AppContainerContext } from '../app-container';\nimport { ThemeProvider, useTheme } from '../theme';\nimport { AppSidePanelVariant } from '../app-side-panel';\nimport { AppSidePanelContext } from '../app-side-panel/context';\n\nconst COMPONENT_NAME = 'SideNavigationMenuBar';\nconst CLASSNAME = 'redsift-side-navigation-menu-bar';\n\n/**\n * The SideNavigationMenuBar component.\n */\nexport const SideNavigationMenuBar: Comp<SideNavigationMenuBarProps, HTMLElement> = forwardRef((props, ref) => {\n const navRef = (ref || useRef<HTMLElement>()) as MutableRefObject<HTMLElement>;\n const defaultListRef = useRef<HTMLUListElement>();\n\n const {\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n canHaveMultipleMenuOpenAtOnce: canHaveMultipleMenuOpenAtOnceProp,\n children,\n className,\n defaultExpandAll,\n isDisabled,\n menubarProps = {},\n menubarRef = defaultListRef,\n storageKey: propsStorageKey,\n theme: propsTheme,\n variant: propsVariant = SideNavigationMenuBarVariant.standard,\n ...forwardedProps\n } = props;\n\n // Auto-enable canHaveMultipleMenuOpenAtOnce when defaultExpandAll is true\n const canHaveMultipleMenuOpenAtOnce = canHaveMultipleMenuOpenAtOnceProp || defaultExpandAll;\n\n // Resolve storageKey: prop takes precedence, then AppSidePanelContext\n const appSidePanelContext = useContext(AppSidePanelContext);\n const storageKey = propsStorageKey ?? appSidePanelContext?.menuStorageKey;\n\n warnIfNoAccessibleLabelFound(props, undefined, 'SideNavigationMenuBar');\n const appContainerState = useContext(AppContainerContext);\n const theme = useTheme(propsTheme);\n const { top } = useBoundingClientRect(navRef, [children]);\n const [variant, setVariant] = useState<SideNavigationMenuBarVariant>(\n appContainerState\n ? appContainerState.sidePanelVariant === AppSidePanelVariant.hidden\n ? SideNavigationMenuBarVariant.shrinked\n : appContainerState.sidePanelVariant\n : propsVariant!\n );\n const [currentOpenMenuId, setCurrentOpenMenuId] = useState<string | undefined>();\n\n useEffect(() => {\n setVariant(propsVariant!);\n }, [propsVariant]);\n\n useEffect(() => {\n if (appContainerState && appContainerState.sidePanelVariant && appContainerState.sidePanelVariant !== variant) {\n setVariant(\n appContainerState.sidePanelVariant === AppSidePanelVariant.hidden\n ? SideNavigationMenuBarVariant.shrinked\n : appContainerState.sidePanelVariant\n );\n }\n }, [appContainerState?.sidePanelVariant]);\n\n /**\n * Create an array containing only valid children being either SideNavigationMenu or SideNavigationMenuItem.\n */\n const childArray = filterComponents([SideNavigationMenu, SideNavigationMenuItem])(children);\n const navItems = childArray.map((child, index) => {\n return (\n <li key={child.key ?? index}>\n {React.cloneElement(child, {\n isDisabled: child.props.isDisabled || isDisabled || undefined,\n key: child.key ?? index,\n })}\n </li>\n );\n });\n\n const value = useMemo<SideNavigationMenuBarContextProps>(\n () => ({\n canHaveMultipleMenuOpenAtOnce,\n defaultExpandAll,\n sideNavigationMenuBarVariant: variant,\n setSideNavigationMenuBarVariant: setVariant,\n currentOpenMenuId,\n setCurrentOpenMenuId: (value: React.SetStateAction<string | undefined>) => {\n if (!canHaveMultipleMenuOpenAtOnce) {\n setCurrentOpenMenuId(value);\n }\n },\n storageKey,\n }),\n [variant, setVariant, currentOpenMenuId, setCurrentOpenMenuId, defaultExpandAll, storageKey]\n );\n\n return (\n <ThemeProvider value={{ theme }}>\n <StyledSideNavigationMenuBar\n {...forwardedProps}\n $isDisabled={isDisabled}\n $marginTop={top}\n $theme={theme}\n $variant={variant}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n className={classNames(SideNavigationMenuBar.className, className)}\n ref={navRef as MutableRefObject<HTMLElement>}\n >\n <SideNavigationMenuBarContext.Provider value={value}>\n <ul {...menubarProps} ref={menubarRef as MutableRefObject<HTMLUListElement>}>\n {navItems}\n </ul>\n </SideNavigationMenuBarContext.Provider>\n </StyledSideNavigationMenuBar>\n </ThemeProvider>\n );\n});\nSideNavigationMenuBar.className = CLASSNAME;\nSideNavigationMenuBar.displayName = COMPONENT_NAME;\n","import React, { MutableRefObject } from 'react';\nimport { SideNavigationMenu } from '../side-navigation-menu';\nimport { SideNavigationMenuItem } from '../side-navigation-menu-item';\nimport { MenuBarItems, MenuItem, Menu, SideNavigationMenuBarProps } from './types';\n\nconst isMenu = (item: MenuItem | Menu): item is Menu => {\n return (item as Menu).children !== undefined;\n};\n\nexport interface UseSideNavigationMenuBarProps {\n items: MenuBarItems;\n isActive?: (href: string) => boolean;\n canHaveMultipleMenuOpenAtOnce?: boolean;\n /**\n * Whether all menus should be expanded by default.\n * When true, automatically enables `canHaveMultipleMenuOpenAtOnce`.\n */\n expandAll?: boolean;\n /**\n * When set, persists menu expand/collapse states in localStorage using this key as prefix.\n * Each menu is identified by its `aria-label` prop.\n */\n storageKey?: string;\n}\n\nexport const useSideNavigationMenuBar = ({\n items,\n isActive,\n canHaveMultipleMenuOpenAtOnce,\n expandAll,\n storageKey,\n}: UseSideNavigationMenuBarProps): Omit<SideNavigationMenuBarProps, 'ref'> => {\n const menuBarChildren: SideNavigationMenuBarProps['children'][] = [];\n\n items.map((item) => {\n if (!isMenu(item)) {\n const { title, href, ref, ...rest } = item;\n menuBarChildren.push(\n <SideNavigationMenuItem\n key={title}\n isCurrent={isActive ? isActive(href!) : undefined}\n {...rest}\n href={href}\n ref={ref as MutableRefObject<HTMLAnchorElement>}\n >\n {title}\n </SideNavigationMenuItem>\n );\n } else {\n const { title, children, ref, ...rest } = item;\n // Only set isExpanded if there's an active child (to force open)\n // Otherwise leave undefined to let defaultExpandAll work\n const hasActiveChild = isActive ? children.filter((child) => isActive(child.href!)).length > 0 : false;\n menuBarChildren.push(\n <SideNavigationMenu\n key={title}\n aria-label={title}\n isExpanded={hasActiveChild ? true : undefined}\n hasBadge={children.filter((child) => child.badge).length > 0}\n {...rest}\n ref={ref as MutableRefObject<HTMLDivElement>}\n >\n {children.map((child) => {\n const { title, href, ref, ...rest } = child;\n return (\n <SideNavigationMenuItem\n key={title}\n href={href}\n isCurrent={isActive ? isActive(href!) : undefined}\n {...rest}\n ref={ref as MutableRefObject<HTMLAnchorElement>}\n >\n {title}\n </SideNavigationMenuItem>\n );\n })}\n </SideNavigationMenu>\n );\n }\n });\n\n return {\n children: menuBarChildren,\n canHaveMultipleMenuOpenAtOnce: canHaveMultipleMenuOpenAtOnce || expandAll,\n defaultExpandAll: expandAll,\n storageKey,\n };\n};\n"],"names":["useBoundingClientRect","ref","deps","boundingRect","setBoundingRect","useState","useEffect","current","getBoundingClientRect","AppSidePanelContext","React","createContext","StyledSideNavigationMenuBar","styled","nav","_ref","$theme","_ref2","$variant","SideNavigationMenuBarVariant","shrinked","_ref3","$marginTop","css","_ref4","_ref5","_ref6","COMPONENT_NAME","CLASSNAME","SideNavigationMenuBar","forwardRef","props","navRef","useRef","defaultListRef","ariaLabel","ariaLabelledby","canHaveMultipleMenuOpenAtOnce","canHaveMultipleMenuOpenAtOnceProp","children","className","defaultExpandAll","isDisabled","menubarProps","menubarRef","storageKey","propsStorageKey","theme","propsTheme","variant","propsVariant","standard","forwardedProps","_objectWithoutProperties","_excluded","appSidePanelContext","useContext","menuStorageKey","warnIfNoAccessibleLabelFound","undefined","appContainerState","AppContainerContext","useTheme","top","setVariant","sidePanelVariant","AppSidePanelVariant","hidden","currentOpenMenuId","setCurrentOpenMenuId","childArray","filterComponents","SideNavigationMenu","SideNavigationMenuItem","navItems","map","child","index","_child$key","_child$key2","createElement","key","cloneElement","value","useMemo","sideNavigationMenuBarVariant","setSideNavigationMenuBarVariant","ThemeProvider","_extends","$isDisabled","classNames","SideNavigationMenuBarContext","Provider","displayName","isMenu","item","useSideNavigationMenuBar","items","isActive","expandAll","menuBarChildren","title","href","rest","push","isCurrent","_excluded2","hasActiveChild","filter","length","isExpanded","hasBadge","badge","_excluded3"],"mappings":";;;;;;;;;;;;AAEA;AACA;AACA;MACaA,qBAAqB,GAAGA,CACnCC,GAAkC,EAClCC,IAAqB,KAClB;EACH,MAAM,CAACC,YAAY,EAAEC,eAAe,CAAC,GAAGC,QAAQ,CAAU,EAAa,CAAC,CAAA;AAExEC,EAAAA,SAAS,CAAC,MAAM;IACd,IAAIL,GAAG,CAACM,OAAO,EAAE;MACfH,eAAe,CAACH,GAAG,CAACM,OAAO,CAACC,qBAAqB,EAAE,CAAC,CAAA;AACtD,KAAA;GACD,EAAEN,IAAI,CAAC,CAAA;AAER,EAAA,OAAOC,YAAY,CAAA;AACrB;;ACXO,MAAMM,mBAAmB,gBAAGC,cAAK,CAACC,aAAa,CAAkC,IAAI;;ACJ5F;AACA;AACA;AACO,MAAMC,2BAA2B,GAAGC,MAAM,CAACC,GAAsC,CAAA;AACxF,oBAAA,EAAsBC,IAAA,IAAA;EAAA,IAAC;AAAEC,IAAAA,MAAAA;AAAO,GAAC,GAAAD,IAAA,CAAA;EAAA,OAAM,CAAA,oBAAA,EAAsBC,MAAO,CAAwC,uCAAA,CAAA,CAAA;AAAA,CAAC,CAAA;AAC7G;AACA;AACA;AACA;AACA;AACA,SAAA,EAAWC,KAAA,IAAA;EAAA,IAAC;AAAEC,IAAAA,QAAAA;AAAS,GAAC,GAAAD,KAAA,CAAA;EAAA,OAAMC,QAAQ,KAAKC,4BAA4B,CAACC,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAAA,CAAE,CAAA;AACrG;AACA,EAAA,EAAIC,KAAA,IAAA;EAAA,IAAC;AAAEC,IAAAA,UAAU,GAAG,CAAA;AAAE,GAAC,GAAAD,KAAA,CAAA;EAAA,OACnBC,UAAU,GACNC,GAAI,CAAA;AACZ,8BAAA,EAAgCD,UAAW,CAAA;AAC3C,QAAA,CAAS,GACD,EAAE,CAAA;AAAA,CAAC,CAAA;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAA,EAAqBE,KAAA,IAAA;EAAA,IAAC;AAAER,IAAAA,MAAAA;AAAO,GAAC,GAAAQ,KAAA,CAAA;EAAA,OAC3B,CAAA,oBAAA,EAAsBR,MAAO,CAA2D,0DAAA,CAAA,CAAA;AAAA,CAAC,CAAA;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAA,EAAwBS,KAAA,IAAA;EAAA,IAAC;AAAET,IAAAA,MAAAA;AAAO,GAAC,GAAAS,KAAA,CAAA;EAAA,OAAM,CAAA,oBAAA,EAAsBT,MAAO,CAA+C,8CAAA,CAAA,CAAA;AAAA,CAAC,CAAA;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAA,EAA0BU,KAAA,IAAA;EAAA,IAAC;AAAEV,IAAAA,MAAAA;AAAO,GAAC,GAAAU,KAAA,CAAA;EAAA,OAAM,CAAA,oBAAA,EAAsBV,MAAO,CAA6C,4CAAA,CAAA,CAAA;AAAA,CAAC,CAAA;AACtH;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AC3CD,MAAMW,cAAc,GAAG,uBAAuB,CAAA;AAC9C,MAAMC,SAAS,GAAG,kCAAkC,CAAA;;AAEpD;AACA;AACA;AACO,MAAMC,qBAAoE,gBAAGC,UAAU,CAAC,CAACC,KAAK,EAAE9B,GAAG,KAAK;AAC7G,EAAA,MAAM+B,MAAM,GAAI/B,GAAG,IAAIgC,MAAM,EAAiD,CAAA;AAC9E,EAAA,MAAMC,cAAc,GAAGD,MAAM,EAAoB,CAAA;EAEjD,MAAM;AACJ,MAAA,YAAY,EAAEE,SAAS;AACvB,MAAA,iBAAiB,EAAEC,cAAc;AACjCC,MAAAA,6BAA6B,EAAEC,iCAAiC;MAChEC,QAAQ;MACRC,SAAS;MACTC,gBAAgB;MAChBC,UAAU;MACVC,YAAY,GAAG,EAAE;AACjBC,MAAAA,UAAU,GAAGV,cAAc;AAC3BW,MAAAA,UAAU,EAAEC,eAAe;AAC3BC,MAAAA,KAAK,EAAEC,UAAU;AACjBC,MAAAA,OAAO,EAAEC,YAAY,GAAG/B,4BAA4B,CAACgC,QAAAA;AAEvD,KAAC,GAAGpB,KAAK;AADJqB,IAAAA,cAAc,GAAAC,wBAAA,CACftB,KAAK,EAAAuB,WAAA,CAAA,CAAA;;AAET;AACA,EAAA,MAAMjB,6BAA6B,GAAGC,iCAAiC,IAAIG,gBAAgB,CAAA;;AAE3F;AACA,EAAA,MAAMc,mBAAmB,GAAGC,UAAU,CAAC/C,mBAAmB,CAAC,CAAA;AAC3D,EAAA,MAAMoC,UAAU,GAAGC,eAAe,KAAA,IAAA,IAAfA,eAAe,KAAfA,KAAAA,CAAAA,GAAAA,eAAe,GAAIS,mBAAmB,KAAnBA,IAAAA,IAAAA,mBAAmB,KAAnBA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,mBAAmB,CAAEE,cAAc,CAAA;AAEzEC,EAAAA,4BAA4B,CAAC3B,KAAK,EAAE4B,SAAS,EAAE,uBAAuB,CAAC,CAAA;AACvE,EAAA,MAAMC,iBAAiB,GAAGJ,UAAU,CAACK,mBAAmB,CAAC,CAAA;AACzD,EAAA,MAAMd,KAAK,GAAGe,QAAQ,CAACd,UAAU,CAAC,CAAA;EAClC,MAAM;AAAEe,IAAAA,GAAAA;GAAK,GAAG/D,qBAAqB,CAACgC,MAAM,EAAE,CAACO,QAAQ,CAAC,CAAC,CAAA;EACzD,MAAM,CAACU,OAAO,EAAEe,UAAU,CAAC,GAAG3D,QAAQ,CACpCuD,iBAAiB,GACbA,iBAAiB,CAACK,gBAAgB,KAAKC,mBAAmB,CAACC,MAAM,GAC/DhD,4BAA4B,CAACC,QAAQ,GACrCwC,iBAAiB,CAACK,gBAAgB,GACpCf,YACN,CAAC,CAAA;EACD,MAAM,CAACkB,iBAAiB,EAAEC,oBAAoB,CAAC,GAAGhE,QAAQ,EAAsB,CAAA;AAEhFC,EAAAA,SAAS,CAAC,MAAM;IACd0D,UAAU,CAACd,YAAa,CAAC,CAAA;AAC3B,GAAC,EAAE,CAACA,YAAY,CAAC,CAAC,CAAA;AAElB5C,EAAAA,SAAS,CAAC,MAAM;IACd,IAAIsD,iBAAiB,IAAIA,iBAAiB,CAACK,gBAAgB,IAAIL,iBAAiB,CAACK,gBAAgB,KAAKhB,OAAO,EAAE;AAC7Ge,MAAAA,UAAU,CACRJ,iBAAiB,CAACK,gBAAgB,KAAKC,mBAAmB,CAACC,MAAM,GAC7DhD,4BAA4B,CAACC,QAAQ,GACrCwC,iBAAiB,CAACK,gBACxB,CAAC,CAAA;AACH,KAAA;GACD,EAAE,CAACL,iBAAiB,KAAjBA,IAAAA,IAAAA,iBAAiB,uBAAjBA,iBAAiB,CAAEK,gBAAgB,CAAC,CAAC,CAAA;;AAEzC;AACF;AACA;AACE,EAAA,MAAMK,UAAU,GAAGC,gBAAgB,CAAC,CAACC,kBAAkB,EAAEC,sBAAsB,CAAC,CAAC,CAAClC,QAAQ,CAAC,CAAA;EAC3F,MAAMmC,QAAQ,GAAGJ,UAAU,CAACK,GAAG,CAAC,CAACC,KAAK,EAAEC,KAAK,KAAK;IAAA,IAAAC,UAAA,EAAAC,WAAA,CAAA;IAChD,oBACErE,cAAA,CAAAsE,aAAA,CAAA,IAAA,EAAA;MAAIC,GAAG,EAAA,CAAAH,UAAA,GAAEF,KAAK,CAACK,GAAG,MAAAH,IAAAA,IAAAA,UAAA,KAAAA,KAAAA,CAAAA,GAAAA,UAAA,GAAID,KAAAA;AAAM,KAAA,eACzBnE,cAAK,CAACwE,YAAY,CAACN,KAAK,EAAE;MACzBlC,UAAU,EAAEkC,KAAK,CAAC7C,KAAK,CAACW,UAAU,IAAIA,UAAU,IAAIiB,SAAS;MAC7DsB,GAAG,EAAA,CAAAF,WAAA,GAAEH,KAAK,CAACK,GAAG,MAAAF,IAAAA,IAAAA,WAAA,KAAAA,KAAAA,CAAAA,GAAAA,WAAA,GAAIF,KAAAA;AACpB,KAAC,CACC,CAAC,CAAA;AAET,GAAC,CAAC,CAAA;AAEF,EAAA,MAAMM,KAAK,GAAGC,OAAO,CACnB,OAAO;IACL/C,6BAA6B;IAC7BI,gBAAgB;AAChB4C,IAAAA,4BAA4B,EAAEpC,OAAO;AACrCqC,IAAAA,+BAA+B,EAAEtB,UAAU;IAC3CI,iBAAiB;IACjBC,oBAAoB,EAAGc,KAA+C,IAAK;MACzE,IAAI,CAAC9C,6BAA6B,EAAE;QAClCgC,oBAAoB,CAACc,KAAK,CAAC,CAAA;AAC7B,OAAA;KACD;AACDtC,IAAAA,UAAAA;AACF,GAAC,CAAC,EACF,CAACI,OAAO,EAAEe,UAAU,EAAEI,iBAAiB,EAAEC,oBAAoB,EAAE5B,gBAAgB,EAAEI,UAAU,CAC7F,CAAC,CAAA;AAED,EAAA,oBACEnC,cAAA,CAAAsE,aAAA,CAACO,aAAa,EAAA;AAACJ,IAAAA,KAAK,EAAE;AAAEpC,MAAAA,KAAAA;AAAM,KAAA;GAC5BrC,eAAAA,cAAA,CAAAsE,aAAA,CAACpE,2BAA2B,EAAA4E,QAAA,KACtBpC,cAAc,EAAA;AAClBqC,IAAAA,WAAW,EAAE/C,UAAW;AACxBpB,IAAAA,UAAU,EAAEyC,GAAI;AAChB/C,IAAAA,MAAM,EAAE+B,KAAM;AACd7B,IAAAA,QAAQ,EAAE+B,OAAQ;AAClB,IAAA,YAAA,EAAYd,SAAU;AACtB,IAAA,iBAAA,EAAiBC,cAAe;IAChCI,SAAS,EAAEkD,UAAU,CAAC7D,qBAAqB,CAACW,SAAS,EAAEA,SAAS,CAAE;AAClEvC,IAAAA,GAAG,EAAE+B,MAAAA;AAAwC,GAAA,CAAA,eAE7CtB,cAAA,CAAAsE,aAAA,CAACW,4BAA4B,CAACC,QAAQ,EAAA;AAACT,IAAAA,KAAK,EAAEA,KAAAA;AAAM,GAAA,eAClDzE,cAAA,CAAAsE,aAAA,CAAAQ,IAAAA,EAAAA,QAAA,KAAQ7C,YAAY,EAAA;AAAE1C,IAAAA,GAAG,EAAE2C,UAAAA;AAAiD,GAAA,CAAA,EACzE8B,QACC,CACiC,CACZ,CAChB,CAAC,CAAA;AAEpB,CAAC,EAAC;AACF7C,qBAAqB,CAACW,SAAS,GAAGZ,SAAS,CAAA;AAC3CC,qBAAqB,CAACgE,WAAW,GAAGlE,cAAc;;;;;AC9HlD,MAAMmE,MAAM,GAAIC,IAAqB,IAAmB;AACtD,EAAA,OAAQA,IAAI,CAAUxD,QAAQ,KAAKoB,SAAS,CAAA;AAC9C,CAAC,CAAA;AAkBYqC,MAAAA,wBAAwB,GAAGjF,IAAA,IAMsC;EAAA,IANrC;IACvCkF,KAAK;IACLC,QAAQ;IACR7D,6BAA6B;IAC7B8D,SAAS;AACTtD,IAAAA,UAAAA;AAC6B,GAAC,GAAA9B,IAAA,CAAA;EAC9B,MAAMqF,eAAyD,GAAG,EAAE,CAAA;AAEpEH,EAAAA,KAAK,CAACtB,GAAG,CAAEoB,IAAI,IAAK;AAClB,IAAA,IAAI,CAACD,MAAM,CAACC,IAAI,CAAC,EAAE;MACjB,MAAM;UAAEM,KAAK;UAAEC,IAAI;AAAErG,UAAAA,GAAAA;AAAa,SAAC,GAAG8F,IAAI;AAAbQ,QAAAA,IAAI,GAAAlD,wBAAA,CAAK0C,IAAI,EAAAzC,SAAA,CAAA,CAAA;MAC1C8C,eAAe,CAACI,IAAI,eAClB9F,cAAA,CAAAsE,aAAA,CAACP,sBAAsB,EAAAe,QAAA,CAAA;AACrBP,QAAAA,GAAG,EAAEoB,KAAM;AACXI,QAAAA,SAAS,EAAEP,QAAQ,GAAGA,QAAQ,CAACI,IAAK,CAAC,GAAG3C,SAAAA;AAAU,OAAA,EAC9C4C,IAAI,EAAA;AACRD,QAAAA,IAAI,EAAEA,IAAK;AACXrG,QAAAA,GAAG,EAAEA,GAAAA;OAEJoG,CAAAA,EAAAA,KACqB,CAC1B,CAAC,CAAA;AACH,KAAC,MAAM;MACL,MAAM;UAAEA,KAAK;UAAE9D,QAAQ;AAAEtC,UAAAA,GAAAA;AAAa,SAAC,GAAG8F,IAAI;AAAbQ,QAAAA,IAAI,GAAAlD,wBAAA,CAAK0C,IAAI,EAAAW,UAAA,CAAA,CAAA;AAC9C;AACA;MACA,MAAMC,cAAc,GAAGT,QAAQ,GAAG3D,QAAQ,CAACqE,MAAM,CAAEhC,KAAK,IAAKsB,QAAQ,CAACtB,KAAK,CAAC0B,IAAK,CAAC,CAAC,CAACO,MAAM,GAAG,CAAC,GAAG,KAAK,CAAA;MACtGT,eAAe,CAACI,IAAI,eAClB9F,cAAA,CAAAsE,aAAA,CAACR,kBAAkB,EAAAgB,QAAA,CAAA;AACjBP,QAAAA,GAAG,EAAEoB,KAAM;AACX,QAAA,YAAA,EAAYA,KAAM;AAClBS,QAAAA,UAAU,EAAEH,cAAc,GAAG,IAAI,GAAGhD,SAAU;AAC9CoD,QAAAA,QAAQ,EAAExE,QAAQ,CAACqE,MAAM,CAAEhC,KAAK,IAAKA,KAAK,CAACoC,KAAK,CAAC,CAACH,MAAM,GAAG,CAAA;AAAE,OAAA,EACzDN,IAAI,EAAA;AACRtG,QAAAA,GAAG,EAAEA,GAAAA;AAAwC,OAAA,CAAA,EAE5CsC,QAAQ,CAACoC,GAAG,CAAEC,KAAK,IAAK;QACvB,MAAM;YAAEyB,KAAK;YAAEC,IAAI;AAAErG,YAAAA,GAAAA;AAAa,WAAC,GAAG2E,KAAK;AAAd2B,UAAAA,IAAI,GAAAlD,wBAAA,CAAKuB,KAAK,EAAAqC,UAAA,CAAA,CAAA;AAC3C,QAAA,oBACEvG,cAAA,CAAAsE,aAAA,CAACP,sBAAsB,EAAAe,QAAA,CAAA;AACrBP,UAAAA,GAAG,EAAEoB,KAAM;AACXC,UAAAA,IAAI,EAAEA,IAAK;AACXG,UAAAA,SAAS,EAAEP,QAAQ,GAAGA,QAAQ,CAACI,IAAK,CAAC,GAAG3C,SAAAA;AAAU,SAAA,EAC9C4C,IAAI,EAAA;AACRtG,UAAAA,GAAG,EAAEA,GAAAA;AAA2C,SAAA,CAAA,EAE/CoG,KACqB,CAAC,CAAA;OAE5B,CACiB,CACtB,CAAC,CAAA;AACH,KAAA;AACF,GAAC,CAAC,CAAA;EAEF,OAAO;AACL9D,IAAAA,QAAQ,EAAE6D,eAAe;IACzB/D,6BAA6B,EAAEA,6BAA6B,IAAI8D,SAAS;AACzE1D,IAAAA,gBAAgB,EAAE0D,SAAS;AAC3BtD,IAAAA,UAAAA;GACD,CAAA;AACH;;;;"}
|
|
1
|
+
{"version":3,"file":"useSideNavigationMenuBar.js","sources":["../../src/hooks/useBoundingRect.ts","../../src/components/app-side-panel/context.ts","../../src/components/side-navigation-menu-bar/styles.ts","../../src/components/side-navigation-menu-bar/SideNavigationMenuBar.tsx","../../src/components/side-navigation-menu-bar/useSideNavigationMenuBar.tsx"],"sourcesContent":["import { useState, useEffect, RefObject, DependencyList } from 'react';\n\n/**\n * Get the bounding rect of a component.\n */\nexport const useBoundingClientRect = (\n ref: RefObject<HTMLElement | null>,\n deps?: DependencyList\n) => {\n const [boundingRect, setBoundingRect] = useState<DOMRect>({} as DOMRect);\n\n useEffect(() => {\n if (ref.current) {\n setBoundingRect(ref.current.getBoundingClientRect());\n }\n }, deps);\n\n return boundingRect;\n};\n","import React from 'react';\n\nexport type AppSidePanelContextProps = {\n /** When set, persists menu expand/collapse states in localStorage using this key as prefix. */\n menuStorageKey?: string;\n};\n\nexport const AppSidePanelContext = React.createContext<AppSidePanelContextProps | null>(null);\n","import styled, { css } from 'styled-components';\nimport { SideNavigationMenuBarVariant, StyledSideNavigationMenuBarProps } from './types';\n\n/**\n * Component style.\n */\nexport const StyledSideNavigationMenuBar = styled.nav<StyledSideNavigationMenuBarProps>`\n background-color: ${({ $theme }) => `var(--redsift-color-${$theme}-components-side-navigation-background)`};\n box-sizing: content-box;\n overflow-x: hidden;\n overflow-y: auto;\n scrollbar-gutter: stable;\n transition: width 300ms ease-out;\n width: ${({ $variant }) => ($variant === SideNavigationMenuBarVariant.shrinked ? '64px' : '250px')};\n\n ${({ $marginTop = 0 }) =>\n $marginTop\n ? css`\n height: calc(100% - ${$marginTop}px);\n `\n : ''}\n\n ul {\n list-style: none;\n margin: unset;\n padding: unset;\n }\n\n scrollbar-color: ${({ $theme }) =>\n `var(--redsift-color-${$theme}-components-side-navigation-scrollbar-resting) transparent`};\n scrollbar-width: thin;\n\n &::-webkit-scrollbar {\n block-size: 9px;\n inline-size: 9px;\n }\n\n &::-webkit-scrollbar-thumb {\n background-clip: padding-box;\n background-color: ${({ $theme }) => `var(--redsift-color-${$theme}-components-side-navigation-scrollbar-resting)`};\n border-radius: 0px;\n border-left: 2px solid transparent;\n border-right: 2px solid transparent;\n }\n\n &::-webkit-scrollbar-track {\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb:horizontal,\n &::-webkit-scrollbar-thumb:vertical {\n &:hover {\n background-color: ${({ $theme }) => `var(--redsift-color-${$theme}-components-side-navigation-scrollbar-hover)`};\n }\n }\n\n &::-webkit-scrollbar-corner {\n visibility: hidden;\n }\n`;\n","import React, { forwardRef, MutableRefObject, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport classNames from 'classnames';\nimport { Comp } from '../../types';\nimport { SideNavigationMenu } from '../side-navigation-menu';\nimport { SideNavigationMenuItem } from '../side-navigation-menu-item';\nimport { warnIfNoAccessibleLabelFound } from '../../utils/warnIfNoAccessibleLabelFound';\nimport { StyledSideNavigationMenuBar } from './styles';\nimport { SideNavigationMenuBarProps, SideNavigationMenuBarContextProps, SideNavigationMenuBarVariant } from './types';\nimport { SideNavigationMenuBarContext } from './context';\nimport { useBoundingClientRect } from '../../hooks/useBoundingRect';\nimport { filterComponents } from '../../utils/filterComponents';\nimport { AppContainerContext } from '../app-container';\nimport { ThemeProvider, useTheme } from '../theme';\nimport { AppSidePanelVariant } from '../app-side-panel';\nimport { AppSidePanelContext } from '../app-side-panel/context';\n\nconst COMPONENT_NAME = 'SideNavigationMenuBar';\nconst CLASSNAME = 'redsift-side-navigation-menu-bar';\n\n/**\n * The SideNavigationMenuBar component.\n */\nexport const SideNavigationMenuBar: Comp<SideNavigationMenuBarProps, HTMLElement> = forwardRef((props, ref) => {\n const navRef = (ref || useRef<HTMLElement>(undefined)) as MutableRefObject<HTMLElement>;\n const defaultListRef = useRef<HTMLUListElement>(undefined);\n\n const {\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n canHaveMultipleMenuOpenAtOnce: canHaveMultipleMenuOpenAtOnceProp,\n children,\n className,\n defaultExpandAll,\n isDisabled,\n menubarProps = {},\n menubarRef = defaultListRef,\n storageKey: propsStorageKey,\n theme: propsTheme,\n variant: propsVariant = SideNavigationMenuBarVariant.standard,\n ...forwardedProps\n } = props;\n\n // Auto-enable canHaveMultipleMenuOpenAtOnce when defaultExpandAll is true\n const canHaveMultipleMenuOpenAtOnce = canHaveMultipleMenuOpenAtOnceProp || defaultExpandAll;\n\n // Resolve storageKey: prop takes precedence, then AppSidePanelContext\n const appSidePanelContext = useContext(AppSidePanelContext);\n const storageKey = propsStorageKey ?? appSidePanelContext?.menuStorageKey;\n\n warnIfNoAccessibleLabelFound(props, undefined, 'SideNavigationMenuBar');\n const appContainerState = useContext(AppContainerContext);\n const theme = useTheme(propsTheme);\n const { top } = useBoundingClientRect(navRef, [children]);\n const [variant, setVariant] = useState<SideNavigationMenuBarVariant>(\n appContainerState\n ? appContainerState.sidePanelVariant === AppSidePanelVariant.hidden\n ? SideNavigationMenuBarVariant.shrinked\n : appContainerState.sidePanelVariant\n : propsVariant!\n );\n const [currentOpenMenuId, setCurrentOpenMenuId] = useState<string | undefined>();\n\n useEffect(() => {\n setVariant(propsVariant!);\n }, [propsVariant]);\n\n useEffect(() => {\n if (appContainerState && appContainerState.sidePanelVariant && appContainerState.sidePanelVariant !== variant) {\n setVariant(\n appContainerState.sidePanelVariant === AppSidePanelVariant.hidden\n ? SideNavigationMenuBarVariant.shrinked\n : appContainerState.sidePanelVariant\n );\n }\n }, [appContainerState?.sidePanelVariant]);\n\n /**\n * Create an array containing only valid children being either SideNavigationMenu or SideNavigationMenuItem.\n */\n const childArray = filterComponents([SideNavigationMenu, SideNavigationMenuItem])(children);\n const navItems = childArray.map((child, index) => {\n return (\n <li key={child.key ?? index}>\n {React.cloneElement(child, {\n isDisabled: child.props.isDisabled || isDisabled || undefined,\n key: child.key ?? index,\n })}\n </li>\n );\n });\n\n const value = useMemo<SideNavigationMenuBarContextProps>(\n () => ({\n canHaveMultipleMenuOpenAtOnce,\n defaultExpandAll,\n sideNavigationMenuBarVariant: variant,\n setSideNavigationMenuBarVariant: setVariant,\n currentOpenMenuId,\n setCurrentOpenMenuId: (value: React.SetStateAction<string | undefined>) => {\n if (!canHaveMultipleMenuOpenAtOnce) {\n setCurrentOpenMenuId(value);\n }\n },\n storageKey,\n }),\n [variant, setVariant, currentOpenMenuId, setCurrentOpenMenuId, defaultExpandAll, storageKey]\n );\n\n return (\n <ThemeProvider value={{ theme }}>\n <StyledSideNavigationMenuBar\n {...forwardedProps}\n $isDisabled={isDisabled}\n $marginTop={top}\n $theme={theme}\n $variant={variant}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n className={classNames(SideNavigationMenuBar.className, className)}\n ref={navRef as MutableRefObject<HTMLElement>}\n >\n <SideNavigationMenuBarContext.Provider value={value}>\n <ul {...menubarProps} ref={menubarRef as MutableRefObject<HTMLUListElement>}>\n {navItems}\n </ul>\n </SideNavigationMenuBarContext.Provider>\n </StyledSideNavigationMenuBar>\n </ThemeProvider>\n );\n});\nSideNavigationMenuBar.className = CLASSNAME;\nSideNavigationMenuBar.displayName = COMPONENT_NAME;\n","import React, { MutableRefObject } from 'react';\nimport { SideNavigationMenu } from '../side-navigation-menu';\nimport { SideNavigationMenuItem } from '../side-navigation-menu-item';\nimport { MenuBarItems, MenuItem, Menu, SideNavigationMenuBarProps } from './types';\n\nconst isMenu = (item: MenuItem | Menu): item is Menu => {\n return (item as Menu).children !== undefined;\n};\n\nexport interface UseSideNavigationMenuBarProps {\n items: MenuBarItems;\n isActive?: (href: string) => boolean;\n canHaveMultipleMenuOpenAtOnce?: boolean;\n /**\n * Whether all menus should be expanded by default.\n * When true, automatically enables `canHaveMultipleMenuOpenAtOnce`.\n */\n expandAll?: boolean;\n /**\n * When set, persists menu expand/collapse states in localStorage using this key as prefix.\n * Each menu is identified by its `aria-label` prop.\n */\n storageKey?: string;\n}\n\nexport const useSideNavigationMenuBar = ({\n items,\n isActive,\n canHaveMultipleMenuOpenAtOnce,\n expandAll,\n storageKey,\n}: UseSideNavigationMenuBarProps): Omit<SideNavigationMenuBarProps, 'ref'> => {\n const menuBarChildren: SideNavigationMenuBarProps['children'][] = [];\n\n items.map((item) => {\n if (!isMenu(item)) {\n const { title, href, ref, ...rest } = item;\n menuBarChildren.push(\n <SideNavigationMenuItem\n key={title}\n isCurrent={isActive ? isActive(href!) : undefined}\n {...rest}\n href={href}\n ref={ref as MutableRefObject<HTMLAnchorElement>}\n >\n {title}\n </SideNavigationMenuItem>\n );\n } else {\n const { title, children, ref, ...rest } = item;\n // Only set isExpanded if there's an active child (to force open)\n // Otherwise leave undefined to let defaultExpandAll work\n const hasActiveChild = isActive ? children.filter((child) => isActive(child.href!)).length > 0 : false;\n menuBarChildren.push(\n <SideNavigationMenu\n key={title}\n aria-label={title}\n isExpanded={hasActiveChild ? true : undefined}\n hasBadge={children.filter((child) => child.badge).length > 0}\n {...rest}\n ref={ref as MutableRefObject<HTMLDivElement>}\n >\n {children.map((child) => {\n const { title, href, ref, ...rest } = child;\n return (\n <SideNavigationMenuItem\n key={title}\n href={href}\n isCurrent={isActive ? isActive(href!) : undefined}\n {...rest}\n ref={ref as MutableRefObject<HTMLAnchorElement>}\n >\n {title}\n </SideNavigationMenuItem>\n );\n })}\n </SideNavigationMenu>\n );\n }\n });\n\n return {\n children: menuBarChildren,\n canHaveMultipleMenuOpenAtOnce: canHaveMultipleMenuOpenAtOnce || expandAll,\n defaultExpandAll: expandAll,\n storageKey,\n };\n};\n"],"names":["useBoundingClientRect","ref","deps","boundingRect","setBoundingRect","useState","useEffect","current","getBoundingClientRect","AppSidePanelContext","React","createContext","StyledSideNavigationMenuBar","styled","nav","_ref","$theme","_ref2","$variant","SideNavigationMenuBarVariant","shrinked","_ref3","$marginTop","css","_ref4","_ref5","_ref6","COMPONENT_NAME","CLASSNAME","SideNavigationMenuBar","forwardRef","props","navRef","useRef","undefined","defaultListRef","ariaLabel","ariaLabelledby","canHaveMultipleMenuOpenAtOnce","canHaveMultipleMenuOpenAtOnceProp","children","className","defaultExpandAll","isDisabled","menubarProps","menubarRef","storageKey","propsStorageKey","theme","propsTheme","variant","propsVariant","standard","forwardedProps","_objectWithoutProperties","_excluded","appSidePanelContext","useContext","menuStorageKey","warnIfNoAccessibleLabelFound","appContainerState","AppContainerContext","useTheme","top","setVariant","sidePanelVariant","AppSidePanelVariant","hidden","currentOpenMenuId","setCurrentOpenMenuId","childArray","filterComponents","SideNavigationMenu","SideNavigationMenuItem","navItems","map","child","index","_child$key","_child$key2","createElement","key","cloneElement","value","useMemo","sideNavigationMenuBarVariant","setSideNavigationMenuBarVariant","ThemeProvider","_extends","$isDisabled","classNames","SideNavigationMenuBarContext","Provider","displayName","isMenu","item","useSideNavigationMenuBar","items","isActive","expandAll","menuBarChildren","title","href","rest","push","isCurrent","_excluded2","hasActiveChild","filter","length","isExpanded","hasBadge","badge","_excluded3"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warnIfNoAccessibleLabelFound.js","sources":["../../src/utils/warnIfNoAccessibleLabelFound.ts"],"sourcesContent":["import { ComponentProps, DependencyList } from 'react';\n\n/**\n * Display a warning if no label was found for screen readers and assistive technologies.\n *\n * @param props Component props containing the aria-label and aria-labelledby params to check for.\n * @param additionalKeysToCheck Additional props to check that can act as a label for screen readers (i.e. children).\n */\nexport const warnIfNoAccessibleLabelFound = (\n props: ComponentProps<keyof JSX.IntrinsicElements>,\n additionalKeysToCheck?: DependencyList,\n componentName?: string\n): void => {\n const { 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledby } = props;\n\n const hasText = additionalKeysToCheck && additionalKeysToCheck.filter((key) => !!key).length > 0;\n const hasAriaLabel = Boolean(ariaLabel || ariaLabelledby);\n\n if (!hasAriaLabel && !hasText) {\n console.warn(`You must provide a label ${componentName ? `to ${componentName} ` : ''}for accessibility`, props);\n }\n};\n"],"names":["warnIfNoAccessibleLabelFound","props","additionalKeysToCheck","componentName","ariaLabel","ariaLabelledby","hasText","filter","key","length","hasAriaLabel","Boolean","console","warn"],"mappings":"AAEA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,4BAA4B,GAAGA,CAC1CC,KAAkD,EAClDC,qBAAsC,EACtCC,aAAsB,KACb;EACT,MAAM;AAAE,IAAA,YAAY,EAAEC,SAAS;AAAE,IAAA,iBAAiB,EAAEC,cAAAA;AAAe,GAAC,GAAGJ,KAAK,CAAA;AAE5E,EAAA,MAAMK,OAAO,GAAGJ,qBAAqB,IAAIA,qBAAqB,CAACK,MAAM,CAAEC,GAAG,IAAK,CAAC,CAACA,GAAG,CAAC,CAACC,MAAM,GAAG,CAAC,CAAA;AAChG,EAAA,MAAMC,YAAY,GAAGC,OAAO,CAACP,SAAS,IAAIC,cAAc,CAAC,CAAA;AAEzD,EAAA,IAAI,CAACK,YAAY,IAAI,CAACJ,OAAO,EAAE;AAC7BM,IAAAA,OAAO,CAACC,IAAI,CAAE,CAAA,yBAAA,EAA2BV,aAAa,GAAI,CAAA,GAAA,EAAKA,aAAc,CAAA,CAAA,CAAE,GAAG,EAAG,CAAkB,iBAAA,CAAA,EAAEF,KAAK,CAAC,CAAA;AACjH,GAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"warnIfNoAccessibleLabelFound.js","sources":["../../src/utils/warnIfNoAccessibleLabelFound.ts"],"sourcesContent":["import type { ComponentProps, DependencyList, JSX } from 'react';\n\n/**\n * Display a warning if no label was found for screen readers and assistive technologies.\n *\n * @param props Component props containing the aria-label and aria-labelledby params to check for.\n * @param additionalKeysToCheck Additional props to check that can act as a label for screen readers (i.e. children).\n */\nexport const warnIfNoAccessibleLabelFound = (\n props: ComponentProps<keyof JSX.IntrinsicElements>,\n additionalKeysToCheck?: DependencyList,\n componentName?: string\n): void => {\n const { 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledby } = props;\n\n const hasText = additionalKeysToCheck && additionalKeysToCheck.filter((key) => !!key).length > 0;\n const hasAriaLabel = Boolean(ariaLabel || ariaLabelledby);\n\n if (!hasAriaLabel && !hasText) {\n console.warn(`You must provide a label ${componentName ? `to ${componentName} ` : ''}for accessibility`, props);\n }\n};\n"],"names":["warnIfNoAccessibleLabelFound","props","additionalKeysToCheck","componentName","ariaLabel","ariaLabelledby","hasText","filter","key","length","hasAriaLabel","Boolean","console","warn"],"mappings":"AAEA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,4BAA4B,GAAGA,CAC1CC,KAAkD,EAClDC,qBAAsC,EACtCC,aAAsB,KACb;EACT,MAAM;AAAE,IAAA,YAAY,EAAEC,SAAS;AAAE,IAAA,iBAAiB,EAAEC,cAAAA;AAAe,GAAC,GAAGJ,KAAK,CAAA;AAE5E,EAAA,MAAMK,OAAO,GAAGJ,qBAAqB,IAAIA,qBAAqB,CAACK,MAAM,CAAEC,GAAG,IAAK,CAAC,CAACA,GAAG,CAAC,CAACC,MAAM,GAAG,CAAC,CAAA;AAChG,EAAA,MAAMC,YAAY,GAAGC,OAAO,CAACP,SAAS,IAAIC,cAAc,CAAC,CAAA;AAEzD,EAAA,IAAI,CAACK,YAAY,IAAI,CAACJ,OAAO,EAAE;AAC7BM,IAAAA,OAAO,CAACC,IAAI,CAAE,CAAA,yBAAA,EAA2BV,aAAa,GAAI,CAAA,GAAA,EAAKA,aAAc,CAAA,CAAA,CAAE,GAAG,EAAG,CAAkB,iBAAA,CAAA,EAAEF,KAAK,CAAC,CAAA;AACjH,GAAA;AACF;;;;"}
|