@lumx/react 4.19.1-alpha.4 → 4.19.1-alpha.5
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/_internal/{BvaFEHZn.js → CcLi-Wuu.js} +6 -3
- package/_internal/CcLi-Wuu.js.map +1 -0
- package/index.d.ts +12 -71
- package/index.js +82 -125
- package/index.js.map +1 -1
- package/package.json +3 -3
- package/utils/index.d.ts +6 -2
- package/utils/index.js +1 -1
- package/_internal/BvaFEHZn.js.map +0 -1
|
@@ -210,12 +210,15 @@ const InfiniteScroll = ({
|
|
|
210
210
|
const {
|
|
211
211
|
current: element
|
|
212
212
|
} = elementRef;
|
|
213
|
-
if (!element) {
|
|
213
|
+
if (!element || !callback) {
|
|
214
214
|
return undefined;
|
|
215
215
|
}
|
|
216
216
|
return setupInfiniteScrollObserver(element, callback, options);
|
|
217
|
+
// `options?.root` starts as `null` (before the scrollable list's ref attaches) and is
|
|
218
|
+
// then set to the real element — must be a dep, or the observer gets stuck watching
|
|
219
|
+
// the wrong root (falling back to the viewport) for the component's whole lifetime.
|
|
217
220
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
218
|
-
}, [elementRef.current, callback]);
|
|
221
|
+
}, [elementRef.current, callback, options?.root]);
|
|
219
222
|
return InfiniteScroll$1({
|
|
220
223
|
ref: elementRef
|
|
221
224
|
});
|
|
@@ -259,4 +262,4 @@ const Portal = ({
|
|
|
259
262
|
};
|
|
260
263
|
|
|
261
264
|
export { ClickAwayProvider as C, DisabledStateProvider as D, InfiniteScroll as I, Portal as P, PortalProvider as a, useDisabledStateContext as u };
|
|
262
|
-
//# sourceMappingURL=
|
|
265
|
+
//# sourceMappingURL=CcLi-Wuu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CcLi-Wuu.js","sources":["../../src/utils/disabled/DisabledStateContext.tsx","../../../lumx-core/src/js/utils/ClickAway/index.ts","../../src/hooks/useClickAway.tsx","../../src/utils/ClickAwayProvider/ClickAwayProvider.tsx","../../../lumx-core/src/js/utils/InfiniteScroll/setupInfiniteScrollObserver.ts","../../../lumx-core/src/js/utils/InfiniteScroll/index.tsx","../../src/utils/InfiniteScroll/InfiniteScroll.tsx","../../src/utils/Portal/PortalProvider.tsx","../../src/utils/Portal/Portal.tsx"],"sourcesContent":["import React, { useContext } from 'react';\n\nimport { DisabledStateContextValue } from '@lumx/core/js/utils/disabledState';\n\nexport const DisabledStateContext = React.createContext<DisabledStateContextValue>({ state: null });\n\nexport type DisabledStateProviderProps = DisabledStateContextValue & {\n children: React.ReactNode;\n};\n\n/**\n * Disabled state provider.\n * All nested LumX Design System components inherit this disabled state.\n */\nexport function DisabledStateProvider({ children, ...value }: DisabledStateProviderProps) {\n return <DisabledStateContext.Provider value={value}>{children}</DisabledStateContext.Provider>;\n}\n\n/**\n * Get DisabledState context value\n */\nexport function useDisabledStateContext(): DisabledStateContextValue {\n return useContext(DisabledStateContext);\n}\n","/**\n * Shared types and logic for ClickAway detection.\n *\n * ClickAway detects clicks outside a set of elements and triggers a callback.\n * The core logic (event listening + target checking) is framework-agnostic.\n * Framework-specific wrappers (React hook, Vue composable) and context providers\n * (React context, Vue provide/inject) are implemented in each framework package.\n */\n\nimport type { Falsy } from '@lumx/core/js/types';\n\n/** Event types that trigger click away detection. */\nexport const CLICK_AWAY_EVENT_TYPES = ['mousedown', 'touchstart'] as const;\n\n/** Callback triggered when a click away is detected. */\nexport type ClickAwayCallback = EventListener | Falsy;\n\n/**\n * Check if the click event targets are outside all the given elements.\n *\n * @param targets - The event target elements (from `event.target` and `event.composedPath()`).\n * @param elements - The elements considered \"inside\" the click away context.\n * @returns `true` if the click is outside all elements (i.e. a click away).\n */\nexport function isClickAway(targets: HTMLElement[], elements: HTMLElement[]): boolean {\n return !elements.some((element) => element instanceof Node && targets.some((target) => element.contains(target)));\n}\n\n/**\n * Imperative setup for click away detection.\n * Adds mousedown/touchstart listeners on `document` and calls the callback when a click\n * occurs outside the elements returned by `getElements`.\n *\n * Note: when `getElements` returns an empty array, any click is considered a click away.\n * Callers should guard against calling `setupClickAway` when no refs are registered.\n *\n * @param getElements - Getter returning the current list of elements considered \"inside\".\n * @param callback - Callback to invoke on click away.\n * @returns A teardown function that removes the event listeners.\n */\nexport function setupClickAway(\n getElements: () => HTMLElement[],\n callback: ClickAwayCallback,\n): (() => void) | undefined {\n if (!callback) {\n return undefined;\n }\n\n const listener: EventListener = (evt) => {\n const targets = [evt.composedPath?.()[0], evt.target].filter((t): t is HTMLElement => t instanceof Node);\n const elements = getElements();\n if (isClickAway(targets, elements)) {\n callback(evt);\n }\n };\n\n CLICK_AWAY_EVENT_TYPES.forEach((evtType) => document.addEventListener(evtType, listener));\n return () => {\n CLICK_AWAY_EVENT_TYPES.forEach((evtType) => document.removeEventListener(evtType, listener));\n };\n}\n","import { RefObject, useEffect } from 'react';\n\nimport { Falsy } from '@lumx/react/utils/type';\nimport { setupClickAway } from '@lumx/core/js/utils/ClickAway';\n\nexport interface ClickAwayParameters {\n /**\n * A callback function to call when the user clicks away from the elements.\n */\n callback: EventListener | Falsy;\n /**\n * Elements considered within the click away context (clicking outside them will trigger the click away callback).\n */\n childrenRefs: RefObject<Array<RefObject<HTMLElement>>>;\n}\n\n/**\n * Listen to clicks away from the given elements and callback the passed in function.\n *\n * Warning: If you need to detect click away on nested React portals, please use the `ClickAwayProvider` component.\n */\nexport function useClickAway({ callback, childrenRefs }: ClickAwayParameters): void {\n useEffect(() => {\n const getElements = () => {\n const refs = childrenRefs.current;\n if (!refs) return [];\n return refs.map((ref) => ref?.current).filter(Boolean) as HTMLElement[];\n };\n return setupClickAway(getElements, callback);\n }, [callback, childrenRefs]);\n}\n","import { createContext, RefObject, useContext, useEffect, useMemo, useRef } from 'react';\nimport { ClickAwayParameters, useClickAway } from '@lumx/react/hooks/useClickAway';\n\ninterface ContextValue {\n childrenRefs: Array<RefObject<HTMLElement>>;\n addRefs(...newChildrenRefs: Array<RefObject<HTMLElement>>): void;\n}\n\nconst ClickAwayAncestorContext = createContext<ContextValue | null>(null);\n\ninterface ClickAwayProviderProps extends ClickAwayParameters {\n /**\n * (Optional) Element that should be considered as part of the parent\n */\n parentRef?: RefObject<HTMLElement>;\n /**\n * Children\n */\n children?: React.ReactNode;\n}\n\n/**\n * Component combining the `useClickAway` hook with a React context to hook into the React component tree and make sure\n * we take into account both the DOM tree and the React tree to detect click away.\n *\n * @return the react component.\n */\nexport const ClickAwayProvider: React.FC<ClickAwayProviderProps> = ({\n children,\n callback,\n childrenRefs,\n parentRef,\n}) => {\n const parentContext = useContext(ClickAwayAncestorContext);\n const currentContext = useMemo(() => {\n const context: ContextValue = {\n childrenRefs: [],\n /**\n * Add element refs to the current context and propagate to the parent context.\n */\n addRefs(...newChildrenRefs) {\n // Add element refs that should be considered as inside the click away context.\n context.childrenRefs.push(...newChildrenRefs);\n\n if (parentContext) {\n // Also add then to the parent context\n parentContext.addRefs(...newChildrenRefs);\n if (parentRef) {\n // The parent element is also considered as inside the parent click away context but not inside the current context\n parentContext.addRefs(parentRef);\n }\n }\n },\n };\n return context;\n }, [parentContext, parentRef]);\n\n useEffect(() => {\n const { current: currentRefs } = childrenRefs;\n if (!currentRefs) {\n return;\n }\n currentContext.addRefs(...currentRefs);\n }, [currentContext, childrenRefs]);\n\n useClickAway({ callback, childrenRefs: useRef(currentContext.childrenRefs) });\n return <ClickAwayAncestorContext.Provider value={currentContext}>{children}</ClickAwayAncestorContext.Provider>;\n};\nClickAwayProvider.displayName = 'ClickAwayProvider';\n","type EventCallback = (evt?: Event) => void;\n\n/**\n * Sets up an IntersectionObserver on the given element.\n * Calls `callback` when at least one observed entry is intersecting.\n * Returns a cleanup function that unobserves the element.\n */\nexport function setupInfiniteScrollObserver(\n element: Element,\n callback: EventCallback,\n options?: IntersectionObserverInit,\n): () => void {\n const observer = new IntersectionObserver((entries = []) => {\n const hasIntersection = entries.some((entry) => entry.isIntersecting);\n\n if (!hasIntersection) {\n return;\n }\n\n callback();\n }, options);\n\n observer.observe(element);\n\n return () => {\n observer.unobserve(element);\n };\n}\n","import type { CommonRef } from '../../types';\n\nexport { setupInfiniteScrollObserver } from './setupInfiniteScrollObserver';\n\nexport const INFINITE_SCROLL_CLASSNAME = 'lumx-infinite-scroll-anchor';\n\nexport interface InfiniteScrollProps {\n /**\n * Callback when infinite scroll component is in view.\n * Omit (e.g. while loading) to temporarily disable without changing the callback's\n * identity when re-enabled — keeps the underlying observer stable.\n */\n // eslint-disable-next-line react/no-unused-prop-types\n callback?(evt?: Event): void;\n /** Customize intersection observer option */\n // eslint-disable-next-line react/no-unused-prop-types\n options?: IntersectionObserverInit;\n}\n\n/**\n * Framework-agnostic InfiniteScroll sentinel component.\n *\n * Renders a tiny invisible div that triggers a callback when it enters the viewport\n * (or intersects its root element) via IntersectionObserver.\n *\n * The div has a small height (4px) to avoid issues when a browser zoom is applied,\n * where a zero-height element might not trigger IntersectionObserver reliably.\n */\nexport const InfiniteScroll = ({ ref }: { ref?: CommonRef }) => (\n // In order to avoid issues when a zoom is added to the browser, we add a small height to the div so that\n // the intersection has a higher chance of working correctly.\n <div ref={ref} aria-hidden=\"true\" className={INFINITE_SCROLL_CLASSNAME} style={{ height: '4px' }} />\n);\n","import React, { useEffect } from 'react';\nimport {\n InfiniteScroll as UI,\n type InfiniteScrollProps,\n setupInfiniteScrollObserver,\n} from '@lumx/core/js/utils/InfiniteScroll';\n\nexport type { InfiniteScrollProps };\n\n/**\n * Handles basic callback pattern by using intersection observers.\n */\nexport const InfiniteScroll: React.FC<InfiniteScrollProps> = ({ callback, options }) => {\n const elementRef = React.useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const { current: element } = elementRef;\n if (!element || !callback) {\n return undefined;\n }\n\n return setupInfiniteScrollObserver(element, callback, options);\n // `options?.root` starts as `null` (before the scrollable list's ref attaches) and is\n // then set to the real element — must be a dep, or the observer gets stuck watching\n // the wrong root (falling back to the viewport) for the component's whole lifetime.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [elementRef.current, callback, options?.root]);\n\n return UI({ ref: elementRef });\n};\n","import React from 'react';\nimport type { PortalInit } from '@lumx/core/js/utils/Portal';\n\nexport type { PortalInit, PortalProviderProps } from '@lumx/core/js/utils/Portal';\n\nexport const PortalContext = React.createContext<PortalInit>(() => ({ container: document.body }));\n\nexport interface ReactPortalProviderProps {\n children?: React.ReactNode;\n value: PortalInit;\n}\n\n/**\n * Customize where <Portal> wrapped elements render (tooltip, popover, dialog, etc.)\n */\nexport const PortalProvider: React.FC<ReactPortalProviderProps> = PortalContext.Provider;\n","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport { PortalContext } from './PortalProvider';\n\nexport type { PortalProps } from '@lumx/core/js/utils/Portal';\n\nexport interface ReactPortalProps {\n enabled?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * Render children in a portal outside the current DOM position\n * (defaults to `document.body` but can be customized with the PortalContextProvider)\n */\nexport const Portal: React.FC<ReactPortalProps> = ({ children, enabled = true }) => {\n const init = React.useContext(PortalContext);\n const context = React.useMemo(\n () => {\n return enabled ? init() : null;\n },\n // Only update on 'enabled'\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [enabled],\n );\n\n React.useLayoutEffect(() => {\n return context?.teardown;\n }, [context?.teardown, enabled]);\n\n const { container } = context ?? {};\n if (!container || typeof container === 'string') {\n return <>{children}</>;\n }\n return createPortal(children, container);\n};\n"],"names":["DisabledStateContext","React","createContext","state","DisabledStateProvider","children","value","_jsx","Provider","useDisabledStateContext","useContext","CLICK_AWAY_EVENT_TYPES","isClickAway","targets","elements","some","element","Node","target","contains","setupClickAway","getElements","callback","undefined","listener","evt","composedPath","filter","t","forEach","evtType","document","addEventListener","removeEventListener","useClickAway","childrenRefs","useEffect","refs","current","map","ref","Boolean","ClickAwayAncestorContext","ClickAwayProvider","parentRef","parentContext","currentContext","useMemo","context","addRefs","newChildrenRefs","push","currentRefs","useRef","displayName","setupInfiniteScrollObserver","options","observer","IntersectionObserver","entries","hasIntersection","entry","isIntersecting","observe","unobserve","INFINITE_SCROLL_CLASSNAME","InfiniteScroll","className","style","height","elementRef","root","UI","PortalContext","container","body","PortalProvider","Portal","enabled","init","useLayoutEffect","teardown","_Fragment","createPortal"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -5271,17 +5271,14 @@ interface TabListProps$1 extends HasClassName, HasTheme {
|
|
|
5271
5271
|
layout?: TabListLayout;
|
|
5272
5272
|
/** Position of the tabs in the list (requires 'clustered' layout). */
|
|
5273
5273
|
position?: Alignment;
|
|
5274
|
-
/** `role` applied to the inner `__links` container */
|
|
5275
|
-
role?: 'navigation' | 'tablist';
|
|
5276
5274
|
/** ref to the wrapper element */
|
|
5277
5275
|
ref?: CommonRef;
|
|
5278
5276
|
}
|
|
5279
|
-
type TabListPropsToOverride = 'role';
|
|
5280
5277
|
|
|
5281
5278
|
/**
|
|
5282
5279
|
* Defines the props of the component.
|
|
5283
5280
|
*/
|
|
5284
|
-
interface TabListProps extends GenericProps$1, ReactToJSX<TabListProps$1
|
|
5281
|
+
interface TabListProps extends GenericProps$1, ReactToJSX<TabListProps$1> {
|
|
5285
5282
|
}
|
|
5286
5283
|
|
|
5287
5284
|
/**
|
|
@@ -5289,8 +5286,6 @@ interface TabListProps extends GenericProps$1, ReactToJSX<TabListProps$1, TabLis
|
|
|
5289
5286
|
*
|
|
5290
5287
|
* Implements WAI-ARIA `tablist` role {@see https://www.w3.org/TR/wai-aria-practices-1.1/examples/tabs/tabs-1/tabs.html#rps_label}
|
|
5291
5288
|
*
|
|
5292
|
-
* Renders a `role="navigation"` landmark instead when used outside a `TabProvider` (nav-link mode).
|
|
5293
|
-
*
|
|
5294
5289
|
* @param props Component props.
|
|
5295
5290
|
* @param ref Component ref.
|
|
5296
5291
|
* @return React element.
|
|
@@ -5298,14 +5293,9 @@ interface TabListProps extends GenericProps$1, ReactToJSX<TabListProps$1, TabLis
|
|
|
5298
5293
|
declare const TabList: Comp<TabListProps, HTMLDivElement>;
|
|
5299
5294
|
|
|
5300
5295
|
/**
|
|
5301
|
-
*
|
|
5302
|
-
* required via {@link HasRequiredLinkHref}), or any `ElementType` (nav-link, e.g. a router `Link`).
|
|
5303
|
-
*/
|
|
5304
|
-
type TabElement = 'a' | 'button' | ElementType;
|
|
5305
|
-
/**
|
|
5306
|
-
* Defines the props of the component (independent of the `as` element).
|
|
5296
|
+
* Defines the props of the component.
|
|
5307
5297
|
*/
|
|
5308
|
-
interface
|
|
5298
|
+
interface TabProps$1 extends HasClassName {
|
|
5309
5299
|
/** Children are not supported. */
|
|
5310
5300
|
children?: never;
|
|
5311
5301
|
/** Icon (SVG path). */
|
|
@@ -5316,13 +5306,6 @@ interface CommonTabProps extends HasClassName {
|
|
|
5316
5306
|
id?: string;
|
|
5317
5307
|
/** Whether the tab is active or not. */
|
|
5318
5308
|
isActive?: boolean;
|
|
5319
|
-
/** Synonym for `isActive` — `'page'` marks the tab as active (WAI-ARIA nav-link convention). */
|
|
5320
|
-
'aria-current'?: 'page' | boolean;
|
|
5321
|
-
/**
|
|
5322
|
-
* WAI-ARIA `tab` role, resolved by the framework wrapper from `TabProvider` presence:
|
|
5323
|
-
* `'tab'` inside a provider (classic tab mode), `undefined` outside (nav-link mode).
|
|
5324
|
-
*/
|
|
5325
|
-
role?: 'tab';
|
|
5326
5309
|
/** Whether the component is disabled or not. */
|
|
5327
5310
|
isDisabled?: boolean;
|
|
5328
5311
|
/** Label content. */
|
|
@@ -5343,38 +5326,23 @@ interface CommonTabProps extends HasClassName {
|
|
|
5343
5326
|
tabIndexProp?: string;
|
|
5344
5327
|
/** Name of the prop used to attach the keypress event (framework-dependent). */
|
|
5345
5328
|
keyPressProp?: string;
|
|
5329
|
+
/** ID applied to the tab button element (for aria-labelledby on the panel). */
|
|
5330
|
+
tabId?: string;
|
|
5346
5331
|
/** ID of the associated tab panel (for aria-controls). */
|
|
5347
5332
|
tabPanelId?: string;
|
|
5348
5333
|
/** Icon component injected by the framework wrapper. */
|
|
5349
5334
|
Icon: any;
|
|
5350
5335
|
/** Text component injected by the framework wrapper. */
|
|
5351
5336
|
Text: any;
|
|
5352
|
-
/** Forward ref to the underlying element. */
|
|
5337
|
+
/** Forward ref to the underlying button element. */
|
|
5353
5338
|
ref?: CommonRef;
|
|
5354
5339
|
}
|
|
5355
|
-
|
|
5356
|
-
* Polymorphic `as` surface for `Tab`. Not `HasPolymorphicAs<E>`: core JSX is type-checked under
|
|
5357
|
-
* both the React and Vue namespaces, so spreading React DOM prop types would break the Vue
|
|
5358
|
-
* cross-check. `href` is required at compile time when `as === 'a'` (via {@link HasRequiredLinkHref}).
|
|
5359
|
-
*/
|
|
5360
|
-
type TabAsProps<E extends TabElement = 'button'> = {
|
|
5361
|
-
as?: E;
|
|
5362
|
-
} & (E extends 'a' ? HasRequiredLinkHref<'a'> : unknown);
|
|
5363
|
-
/**
|
|
5364
|
-
* Props of the `Tab` component. Polymorphic on `as` (element selection only): `as` picks the
|
|
5365
|
-
* rendered element, while **mode is driven by `TabProvider` presence** (via the wrapper-resolved
|
|
5366
|
-
* `role`), not by `as`. The `href` conditional's false branch is `unknown` (not a record) to avoid
|
|
5367
|
-
* widening `keyof TabProps`.
|
|
5368
|
-
*/
|
|
5369
|
-
type TabProps$1<E extends TabElement = 'button'> = CommonTabProps & TabAsProps<E>;
|
|
5370
|
-
type TabPropsToOverride = 'as' | 'role' | 'isAnyDisabled' | 'shouldActivateOnFocus' | 'changeToTab' | 'tabIndex' | 'tabIndexProp' | 'keyPressProp' | 'tabPanelId' | 'Icon' | 'Text';
|
|
5340
|
+
type TabPropsToOverride = 'isAnyDisabled' | 'shouldActivateOnFocus' | 'changeToTab' | 'tabIndex' | 'tabIndexProp' | 'keyPressProp' | 'tabId' | 'tabPanelId' | 'Icon' | 'Text';
|
|
5371
5341
|
|
|
5372
5342
|
/**
|
|
5373
|
-
* Defines the props of the component.
|
|
5374
|
-
* rendered element (`as="a"` with required `href`, or `as={RouterLink}`), while the mode
|
|
5375
|
-
* (`role="tab"` vs nav-link) is driven by `TabProvider` presence. The forwarded ref type follows `as`.
|
|
5343
|
+
* Defines the props of the component.
|
|
5376
5344
|
*/
|
|
5377
|
-
|
|
5345
|
+
interface TabProps extends GenericProps$1, ReactToJSX<TabProps$1, TabPropsToOverride> {
|
|
5378
5346
|
/** Children are not supported. */
|
|
5379
5347
|
children?: never;
|
|
5380
5348
|
/** Icon (SVG path). */
|
|
@@ -5389,44 +5357,17 @@ type TabProps<E extends ElementType$1 = 'button'> = GenericProps$1 & HasPolymorp
|
|
|
5389
5357
|
isDisabled?: boolean;
|
|
5390
5358
|
/** Label content. */
|
|
5391
5359
|
label: string | ReactNode;
|
|
5392
|
-
}
|
|
5360
|
+
}
|
|
5393
5361
|
/**
|
|
5394
5362
|
* Tab component.
|
|
5395
5363
|
*
|
|
5396
5364
|
* Implements WAI-ARIA `tab` role {@see https://www.w3.org/TR/wai-aria-practices-1.1/examples/tabs/tabs-1/tabs.html#rps_label}
|
|
5397
|
-
* when rendered inside a `TabProvider`.
|
|
5398
|
-
*
|
|
5399
|
-
* Outside a `TabProvider` (nav-link mode): plain link, no `role="tab"`/roving tabindex/`changeToTab`
|
|
5400
|
-
* dispatch — only `aria-current` marks the active item.
|
|
5401
5365
|
*
|
|
5402
5366
|
* @param props Component props.
|
|
5403
|
-
* @param ref Component ref
|
|
5367
|
+
* @param ref Component ref.
|
|
5404
5368
|
* @return React element.
|
|
5405
5369
|
*/
|
|
5406
|
-
declare const Tab:
|
|
5407
|
-
as?: E | undefined;
|
|
5408
|
-
} & HasRequiredLinkHref$1<E> & ReactToJSX<TabProps$1, TabPropsToOverride> & {
|
|
5409
|
-
/** Children are not supported. */
|
|
5410
|
-
children?: never;
|
|
5411
|
-
/** Icon (SVG path). */
|
|
5412
|
-
icon?: IconProps["icon"];
|
|
5413
|
-
/** Icon component properties. */
|
|
5414
|
-
iconProps?: Omit<IconProps, "icon">;
|
|
5415
|
-
/** Native id property. */
|
|
5416
|
-
id?: string;
|
|
5417
|
-
/** Whether the tab is active or not. */
|
|
5418
|
-
isActive?: boolean;
|
|
5419
|
-
/** Whether the component is disabled or not. */
|
|
5420
|
-
isDisabled?: boolean;
|
|
5421
|
-
/** Label content. */
|
|
5422
|
-
label: string | ReactNode;
|
|
5423
|
-
} & React$1.ComponentProps<E> & {
|
|
5424
|
-
ref?: ComponentRef<E> | undefined;
|
|
5425
|
-
}) => React.JSX.Element) & {
|
|
5426
|
-
displayName: string;
|
|
5427
|
-
className: string;
|
|
5428
|
-
defaultProps: Partial<TabProps$1<"button">>;
|
|
5429
|
-
};
|
|
5370
|
+
declare const Tab: Comp<TabProps, HTMLButtonElement>;
|
|
5430
5371
|
|
|
5431
5372
|
/**
|
|
5432
5373
|
* Defines the props of the component.
|
package/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import ReactDOM__default from 'react-dom';
|
|
|
9
9
|
import { classNames, onEscapePressed, onEnterPressed as onEnterPressed$1, detectHorizontalSwipe } from '@lumx/core/js/utils';
|
|
10
10
|
import last from 'lodash/last.js';
|
|
11
11
|
import pull from 'lodash/pull.js';
|
|
12
|
-
import { u as useDisabledStateContext, P as Portal, C as ClickAwayProvider, I as InfiniteScroll } from './_internal/
|
|
12
|
+
import { u as useDisabledStateContext, P as Portal, C as ClickAwayProvider, I as InfiniteScroll } from './_internal/CcLi-Wuu.js';
|
|
13
13
|
import isEmpty from 'lodash/isEmpty.js';
|
|
14
14
|
import get from 'lodash/get.js';
|
|
15
15
|
import { getDisabledState as getDisabledState$1 } from '@lumx/core/js/utils/disabledState';
|
|
@@ -17991,6 +17991,8 @@ const SelectButton$2 = (props, {
|
|
|
17991
17991
|
const isLoadingMore = listStatus === 'loadingMore';
|
|
17992
17992
|
const isError = listStatus === 'error';
|
|
17993
17993
|
const isMultiselectable = selectionType === 'multiple';
|
|
17994
|
+
// Prevent firing during loading or error states to avoid duplicate fetches.
|
|
17995
|
+
const isInfiniteScrollEnabled = !listStatus || listStatus === 'idle';
|
|
17994
17996
|
|
|
17995
17997
|
/*
|
|
17996
17998
|
* Display value: castArray normalizes single/multi value to an array, then resolve
|
|
@@ -18029,11 +18031,7 @@ const SelectButton$2 = (props, {
|
|
|
18029
18031
|
}, {
|
|
18030
18032
|
Combobox
|
|
18031
18033
|
}), onLoadMore && InfiniteScroll && /*#__PURE__*/jsx(InfiniteScroll, {
|
|
18032
|
-
callback:
|
|
18033
|
-
// Guard: prevent firing during loading or error states to avoid duplicate fetches.
|
|
18034
|
-
if (listStatus && listStatus !== 'idle') return;
|
|
18035
|
-
onLoadMore();
|
|
18036
|
-
},
|
|
18034
|
+
callback: isInfiniteScrollEnabled ? onLoadMore : undefined,
|
|
18037
18035
|
options: infiniteScrollOptions
|
|
18038
18036
|
}), isLoadingMore && /*#__PURE__*/jsx(Combobox.OptionSkeleton, {
|
|
18039
18037
|
count: 1
|
|
@@ -18177,7 +18175,13 @@ const SelectButton$1 = React__default.forwardRef((props, ref) => {
|
|
|
18177
18175
|
as,
|
|
18178
18176
|
...buttonProps
|
|
18179
18177
|
} = props;
|
|
18180
|
-
|
|
18178
|
+
// The list itself doesn't scroll — its ancestor `__scroll` wrapper does. The
|
|
18179
|
+
// IntersectionObserver root must be the actual scrolling/clipping element, or the
|
|
18180
|
+
// sentinel is trivially always "intersecting" its non-clipping `<ul>` parent.
|
|
18181
|
+
const [scrollContainer, setScrollContainer] = useState(null);
|
|
18182
|
+
const setListElement = useCallback(listElement => {
|
|
18183
|
+
setScrollContainer(listElement?.closest(`.${CLASSNAME$17}__scroll`) ?? null);
|
|
18184
|
+
}, []);
|
|
18181
18185
|
const isMultiple = selectionType === 'multiple';
|
|
18182
18186
|
|
|
18183
18187
|
// Inject core-computed props into the consumer's renderOption result.
|
|
@@ -18218,7 +18222,7 @@ const SelectButton$1 = React__default.forwardRef((props, ref) => {
|
|
|
18218
18222
|
translations,
|
|
18219
18223
|
onLoadMore,
|
|
18220
18224
|
infiniteScrollOptions: {
|
|
18221
|
-
root:
|
|
18225
|
+
root: scrollContainer,
|
|
18222
18226
|
rootMargin: '100px'
|
|
18223
18227
|
}
|
|
18224
18228
|
}, {
|
|
@@ -18291,6 +18295,8 @@ const SelectTextField$2 = (props, {
|
|
|
18291
18295
|
const isFullLoading = listStatus === 'loading';
|
|
18292
18296
|
const isLoadingMore = listStatus === 'loadingMore';
|
|
18293
18297
|
const isError = listStatus === 'error';
|
|
18298
|
+
// Prevent firing during loading or error states to avoid duplicate fetches.
|
|
18299
|
+
const isInfiniteScrollEnabled = !listStatus || listStatus === 'idle';
|
|
18294
18300
|
return /*#__PURE__*/jsxs(Combobox.Provider, {
|
|
18295
18301
|
onOpen: onOpen,
|
|
18296
18302
|
children: [/*#__PURE__*/jsx(Combobox.Input, {
|
|
@@ -18321,11 +18327,7 @@ const SelectTextField$2 = (props, {
|
|
|
18321
18327
|
}, {
|
|
18322
18328
|
Combobox
|
|
18323
18329
|
}), afterOptions, onLoadMore && InfiniteScroll && /*#__PURE__*/jsx(InfiniteScroll, {
|
|
18324
|
-
callback:
|
|
18325
|
-
// Guard: prevent firing during loading or error states to avoid duplicate fetches.
|
|
18326
|
-
if (listStatus && listStatus !== 'idle') return;
|
|
18327
|
-
onLoadMore();
|
|
18328
|
-
},
|
|
18330
|
+
callback: isInfiniteScrollEnabled ? onLoadMore : undefined,
|
|
18329
18331
|
options: infiniteScrollOptions
|
|
18330
18332
|
}), isLoadingMore && /*#__PURE__*/jsx(Combobox.OptionSkeleton, {
|
|
18331
18333
|
count: 1
|
|
@@ -18413,7 +18415,14 @@ const SelectTextField$1 = props => {
|
|
|
18413
18415
|
// Wrap the consumer's renderOption to inject core-computed props
|
|
18414
18416
|
// (`value`, `isSelected`, `description`, `key`) into the returned <Combobox.Option>.
|
|
18415
18417
|
const wrappedRenderOption = wrapRenderOption(renderOption);
|
|
18416
|
-
|
|
18418
|
+
|
|
18419
|
+
// The list itself doesn't scroll — its ancestor `__scroll` wrapper does. The
|
|
18420
|
+
// IntersectionObserver root must be the actual scrolling/clipping element, or the
|
|
18421
|
+
// sentinel is trivially always "intersecting" its non-clipping `<ul>` parent.
|
|
18422
|
+
const [scrollContainer, setScrollContainer] = useState(null);
|
|
18423
|
+
const setListElement = useCallback(listElement => {
|
|
18424
|
+
setScrollContainer(listElement?.closest(`.${CLASSNAME$17}__scroll`) ?? null);
|
|
18425
|
+
}, []);
|
|
18417
18426
|
const localInputRef = useRef(null);
|
|
18418
18427
|
const mergedInputRef = useMergeRefs(localInputRef, externalInputRef);
|
|
18419
18428
|
|
|
@@ -18563,7 +18572,7 @@ const SelectTextField$1 = props => {
|
|
|
18563
18572
|
beforeOptions,
|
|
18564
18573
|
onLoadMore,
|
|
18565
18574
|
infiniteScrollOptions: {
|
|
18566
|
-
root:
|
|
18575
|
+
root: scrollContainer,
|
|
18567
18576
|
rootMargin: '100px'
|
|
18568
18577
|
}
|
|
18569
18578
|
}, {
|
|
@@ -20935,7 +20944,6 @@ const TabList$1 = props => {
|
|
|
20935
20944
|
className,
|
|
20936
20945
|
layout = DEFAULT_PROPS$7.layout,
|
|
20937
20946
|
position = DEFAULT_PROPS$7.position,
|
|
20938
|
-
role = 'tablist',
|
|
20939
20947
|
theme,
|
|
20940
20948
|
ref,
|
|
20941
20949
|
...forwardedProps
|
|
@@ -20950,7 +20958,7 @@ const TabList$1 = props => {
|
|
|
20950
20958
|
})),
|
|
20951
20959
|
children: /*#__PURE__*/jsx("div", {
|
|
20952
20960
|
className: element$4('links'),
|
|
20953
|
-
role:
|
|
20961
|
+
role: "tablist",
|
|
20954
20962
|
"aria-label": ariaLabel,
|
|
20955
20963
|
children: children
|
|
20956
20964
|
})
|
|
@@ -20962,8 +20970,6 @@ const TabList$1 = props => {
|
|
|
20962
20970
|
*
|
|
20963
20971
|
* Implements WAI-ARIA `tablist` role {@see https://www.w3.org/TR/wai-aria-practices-1.1/examples/tabs/tabs-1/tabs.html#rps_label}
|
|
20964
20972
|
*
|
|
20965
|
-
* Renders a `role="navigation"` landmark instead when used outside a `TabProvider` (nav-link mode).
|
|
20966
|
-
*
|
|
20967
20973
|
* @param props Component props.
|
|
20968
20974
|
* @param ref Component ref.
|
|
20969
20975
|
* @return React element.
|
|
@@ -20975,19 +20981,14 @@ const TabList = forwardRef((props, ref) => {
|
|
|
20975
20981
|
...forwardedProps
|
|
20976
20982
|
} = props;
|
|
20977
20983
|
const tabListRef = React__default.useRef(null);
|
|
20978
|
-
const role = useTabProviderContextState() === undefined ? 'navigation' : 'tablist';
|
|
20979
|
-
|
|
20980
|
-
// Classic roving tabindex (role="tab"). Disabled in nav-link mode: nav links keep their
|
|
20981
|
-
// native per-link Tab stops, so this path is never engaged there.
|
|
20982
20984
|
useRovingTabIndexContainer({
|
|
20983
|
-
containerRef:
|
|
20985
|
+
containerRef: tabListRef,
|
|
20984
20986
|
itemSelector: '[role="tab"]'
|
|
20985
20987
|
});
|
|
20986
20988
|
return TabList$1({
|
|
20987
|
-
...forwardedProps,
|
|
20988
20989
|
theme,
|
|
20989
|
-
|
|
20990
|
-
|
|
20990
|
+
ref: mergeRefs(ref, tabListRef),
|
|
20991
|
+
...forwardedProps
|
|
20991
20992
|
});
|
|
20992
20993
|
});
|
|
20993
20994
|
TabList.displayName = COMPONENT_NAME$6;
|
|
@@ -21013,11 +21014,9 @@ const {
|
|
|
21013
21014
|
} = bem(CLASSNAME$6);
|
|
21014
21015
|
|
|
21015
21016
|
/**
|
|
21016
|
-
* Tab component.
|
|
21017
|
-
*
|
|
21018
|
-
* {@see https://www.w3.org/TR/wai-aria-practices-1.1/examples/tabs/tabs-1/tabs.html#rps_label}
|
|
21019
|
-
* nav-link mode (no provider) renders plain link semantics (`aria-current`, no tab role/aria).
|
|
21020
|
-
* `as` only selects the rendered element and applies in both modes.
|
|
21017
|
+
* Tab component.
|
|
21018
|
+
*
|
|
21019
|
+
* Implements WAI-ARIA `tab` role {@see https://www.w3.org/TR/wai-aria-practices-1.1/examples/tabs/tabs-1/tabs.html#rps_label}
|
|
21021
21020
|
*
|
|
21022
21021
|
* @param props Component props.
|
|
21023
21022
|
* @param ref Component ref.
|
|
@@ -21025,16 +21024,13 @@ const {
|
|
|
21025
21024
|
*/
|
|
21026
21025
|
const Tab$1 = props => {
|
|
21027
21026
|
const {
|
|
21028
|
-
as = 'button',
|
|
21029
21027
|
className,
|
|
21030
21028
|
icon,
|
|
21031
21029
|
iconProps = {},
|
|
21032
21030
|
isAnyDisabled,
|
|
21033
21031
|
isDisabled,
|
|
21034
21032
|
id,
|
|
21035
|
-
isActive
|
|
21036
|
-
'aria-current': ariaCurrent,
|
|
21037
|
-
role,
|
|
21033
|
+
isActive,
|
|
21038
21034
|
label,
|
|
21039
21035
|
handleFocus,
|
|
21040
21036
|
handleKeyPress,
|
|
@@ -21044,146 +21040,107 @@ const Tab$1 = props => {
|
|
|
21044
21040
|
changeToTab,
|
|
21045
21041
|
tabPanelId,
|
|
21046
21042
|
shouldActivateOnFocus,
|
|
21043
|
+
tabId,
|
|
21047
21044
|
Icon,
|
|
21048
21045
|
Text,
|
|
21049
21046
|
ref,
|
|
21050
21047
|
...forwardedProps
|
|
21051
21048
|
} = props;
|
|
21052
|
-
const
|
|
21053
|
-
|
|
21054
|
-
|
|
21055
|
-
|
|
21056
|
-
|
|
21057
|
-
|
|
21058
|
-
|
|
21059
|
-
|
|
21060
|
-
|
|
21061
|
-
};
|
|
21062
|
-
const onFocus = event => {
|
|
21063
|
-
handleFocus?.(event);
|
|
21064
|
-
if (shouldActivateOnFocus) {
|
|
21065
|
-
changeToCurrentTab();
|
|
21066
|
-
}
|
|
21067
|
-
};
|
|
21068
|
-
const onKeyPress = event => {
|
|
21069
|
-
handleKeyPress?.(event);
|
|
21070
|
-
if (event.key !== 'Enter' || isAnyDisabled) {
|
|
21071
|
-
return;
|
|
21072
|
-
}
|
|
21049
|
+
const changeToCurrentTab = () => {
|
|
21050
|
+
if (isAnyDisabled) {
|
|
21051
|
+
return;
|
|
21052
|
+
}
|
|
21053
|
+
changeToTab?.();
|
|
21054
|
+
};
|
|
21055
|
+
const onFocus = event => {
|
|
21056
|
+
handleFocus?.(event);
|
|
21057
|
+
if (shouldActivateOnFocus) {
|
|
21073
21058
|
changeToCurrentTab();
|
|
21074
|
-
}
|
|
21075
|
-
|
|
21076
|
-
|
|
21077
|
-
|
|
21078
|
-
|
|
21079
|
-
|
|
21080
|
-
|
|
21081
|
-
|
|
21082
|
-
|
|
21083
|
-
|
|
21084
|
-
|
|
21085
|
-
|
|
21086
|
-
|
|
21087
|
-
|
|
21088
|
-
const {
|
|
21089
|
-
onClick,
|
|
21090
|
-
...rest
|
|
21091
|
-
} = forwardedProps;
|
|
21092
|
-
rawClickableProps = {
|
|
21093
|
-
...rest,
|
|
21094
|
-
isDisabled,
|
|
21095
|
-
handleClick: onClick,
|
|
21096
|
-
'aria-current': isActive ? 'page' : undefined
|
|
21097
|
-
};
|
|
21098
|
-
}
|
|
21099
|
-
return RawClickable({
|
|
21100
|
-
...rawClickableProps,
|
|
21101
|
-
as,
|
|
21102
|
-
id,
|
|
21059
|
+
}
|
|
21060
|
+
};
|
|
21061
|
+
const onKeyPress = event => {
|
|
21062
|
+
handleKeyPress?.(event);
|
|
21063
|
+
if (event.key !== 'Enter' || isAnyDisabled) {
|
|
21064
|
+
return;
|
|
21065
|
+
}
|
|
21066
|
+
changeToCurrentTab();
|
|
21067
|
+
};
|
|
21068
|
+
return /*#__PURE__*/jsxs("button", {
|
|
21069
|
+
ref: ref,
|
|
21070
|
+
...forwardedProps,
|
|
21071
|
+
type: "button",
|
|
21072
|
+
id: tabId,
|
|
21103
21073
|
className: classnames(className, block$6({
|
|
21104
21074
|
'is-active': isActive,
|
|
21105
21075
|
'is-disabled': isAnyDisabled
|
|
21106
21076
|
})),
|
|
21107
|
-
|
|
21108
|
-
|
|
21109
|
-
|
|
21110
|
-
|
|
21111
|
-
|
|
21112
|
-
|
|
21113
|
-
|
|
21114
|
-
|
|
21115
|
-
|
|
21116
|
-
|
|
21117
|
-
|
|
21118
|
-
|
|
21077
|
+
onClick: changeToCurrentTab,
|
|
21078
|
+
[keyPressProp]: onKeyPress,
|
|
21079
|
+
onFocus: onFocus,
|
|
21080
|
+
role: "tab",
|
|
21081
|
+
[tabIndexProp]: isActive ? 0 : tabIndex,
|
|
21082
|
+
"aria-disabled": isAnyDisabled,
|
|
21083
|
+
"aria-selected": isActive,
|
|
21084
|
+
"aria-controls": tabPanelId,
|
|
21085
|
+
children: [icon && /*#__PURE__*/jsx(Icon, {
|
|
21086
|
+
icon: icon,
|
|
21087
|
+
size: Size.xs,
|
|
21088
|
+
...iconProps
|
|
21089
|
+
}), label && /*#__PURE__*/jsx(Text, {
|
|
21090
|
+
as: "span",
|
|
21091
|
+
truncate: true,
|
|
21092
|
+
children: label
|
|
21093
|
+
})]
|
|
21119
21094
|
});
|
|
21120
21095
|
};
|
|
21121
21096
|
|
|
21122
21097
|
/**
|
|
21123
|
-
* Defines the props of the component.
|
|
21124
|
-
* rendered element (`as="a"` with required `href`, or `as={RouterLink}`), while the mode
|
|
21125
|
-
* (`role="tab"` vs nav-link) is driven by `TabProvider` presence. The forwarded ref type follows `as`.
|
|
21098
|
+
* Defines the props of the component.
|
|
21126
21099
|
*/
|
|
21127
21100
|
|
|
21128
21101
|
/**
|
|
21129
21102
|
* Tab component.
|
|
21130
21103
|
*
|
|
21131
21104
|
* Implements WAI-ARIA `tab` role {@see https://www.w3.org/TR/wai-aria-practices-1.1/examples/tabs/tabs-1/tabs.html#rps_label}
|
|
21132
|
-
* when rendered inside a `TabProvider`.
|
|
21133
|
-
*
|
|
21134
|
-
* Outside a `TabProvider` (nav-link mode): plain link, no `role="tab"`/roving tabindex/`changeToTab`
|
|
21135
|
-
* dispatch — only `aria-current` marks the active item.
|
|
21136
21105
|
*
|
|
21137
21106
|
* @param props Component props.
|
|
21138
|
-
* @param ref Component ref
|
|
21107
|
+
* @param ref Component ref.
|
|
21139
21108
|
* @return React element.
|
|
21140
21109
|
*/
|
|
21141
|
-
const Tab =
|
|
21110
|
+
const Tab = forwardRef((props, ref) => {
|
|
21142
21111
|
const {
|
|
21143
21112
|
isAnyDisabled,
|
|
21144
21113
|
otherProps
|
|
21145
21114
|
} = useDisableStateProps(props);
|
|
21146
21115
|
const {
|
|
21147
|
-
as = 'button',
|
|
21148
21116
|
isActive: propIsActive,
|
|
21149
21117
|
id,
|
|
21150
21118
|
onFocus,
|
|
21151
21119
|
onKeyPress,
|
|
21152
21120
|
...forwardedProps
|
|
21153
21121
|
} = otherProps;
|
|
21154
|
-
|
|
21155
|
-
// Register into the provider (if any) so it can track this tab's index / active state.
|
|
21156
21122
|
const tabState = useTabProviderContext('tab', id);
|
|
21157
|
-
// In a provider => tab mode (role="tab"); outside => nav-link mode. Mirrors TabList's role.
|
|
21158
|
-
const inProvider = tabState !== undefined;
|
|
21159
21123
|
const {
|
|
21160
21124
|
isLazy: _isLazy,
|
|
21161
|
-
tabId,
|
|
21162
21125
|
...state
|
|
21163
21126
|
} = tabState ?? {};
|
|
21164
|
-
// Without a provider there's no active index, so this collapses to the caller-provided value.
|
|
21165
21127
|
const isActive = propIsActive || state?.isActive;
|
|
21166
21128
|
return Tab$1({
|
|
21167
|
-
|
|
21129
|
+
id,
|
|
21168
21130
|
...state,
|
|
21169
|
-
as,
|
|
21170
|
-
role: inProvider ? 'tab' : undefined,
|
|
21171
21131
|
Icon,
|
|
21172
21132
|
Text,
|
|
21173
21133
|
ref,
|
|
21174
|
-
// Falls back to the caller-provided `id` when there's no TabProvider to generate one.
|
|
21175
|
-
id: tabId || id,
|
|
21176
21134
|
isActive,
|
|
21177
21135
|
isAnyDisabled,
|
|
21178
|
-
isDisabled: isAnyDisabled,
|
|
21179
21136
|
handleFocus: onFocus,
|
|
21180
|
-
handleKeyPress: onKeyPress
|
|
21137
|
+
handleKeyPress: onKeyPress,
|
|
21138
|
+
...forwardedProps
|
|
21181
21139
|
});
|
|
21182
|
-
}), {
|
|
21183
|
-
displayName: COMPONENT_NAME$5,
|
|
21184
|
-
className: CLASSNAME$6,
|
|
21185
|
-
defaultProps: DEFAULT_PROPS$6
|
|
21186
21140
|
});
|
|
21141
|
+
Tab.displayName = COMPONENT_NAME$5;
|
|
21142
|
+
Tab.className = CLASSNAME$6;
|
|
21143
|
+
Tab.defaultProps = DEFAULT_PROPS$6;
|
|
21187
21144
|
|
|
21188
21145
|
/**
|
|
21189
21146
|
* Component display name.
|