@elliemae/ds-pagination 3.80.0-next.50 → 3.80.0-next.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/parts/DSPaginator/DSPaginator.js +10 -166
- package/dist/cjs/parts/DSPaginator/DSPaginator.js.map +2 -2
- package/dist/cjs/parts/DSPaginator/{config/usePaginationSearch.js → DSPaginatorCTX.js} +7 -32
- package/dist/cjs/parts/DSPaginator/DSPaginatorCTX.js.map +7 -0
- package/dist/cjs/parts/DSPaginator/config/{createPaginatorHeader.js → getAmountOfPages.js} +8 -23
- package/dist/cjs/parts/DSPaginator/config/getAmountOfPages.js.map +7 -0
- package/dist/cjs/parts/DSPaginator/config/getInstanceIds.js +40 -0
- package/dist/cjs/parts/DSPaginator/config/getInstanceIds.js.map +7 -0
- package/dist/cjs/parts/DSPaginator/config/navigationKeys.js +44 -0
- package/dist/cjs/parts/DSPaginator/config/navigationKeys.js.map +7 -0
- package/dist/cjs/parts/DSPaginator/config/useFocusTracker.js +77 -0
- package/dist/cjs/parts/DSPaginator/config/useFocusTracker.js.map +7 -0
- package/dist/cjs/parts/DSPaginator/config/usePaginator.js +73 -49
- package/dist/cjs/parts/DSPaginator/config/usePaginator.js.map +2 -2
- package/dist/cjs/parts/DSPaginator/config/usePaginatorFloatingContext.js +86 -0
- package/dist/cjs/parts/DSPaginator/config/usePaginatorFloatingContext.js.map +7 -0
- package/dist/cjs/parts/DSPaginator/config/usePaginatorInteractions.js +170 -0
- package/dist/cjs/parts/DSPaginator/config/usePaginatorInteractions.js.map +7 -0
- package/dist/cjs/parts/DSPaginator/config/usePaginatorSizing.js +80 -0
- package/dist/cjs/parts/DSPaginator/config/usePaginatorSizing.js.map +7 -0
- package/dist/cjs/parts/DSPaginator/config/useValidateProps.js.map +2 -2
- package/dist/cjs/parts/DSPaginator/constants/index.js +49 -3
- package/dist/cjs/parts/DSPaginator/constants/index.js.map +2 -2
- package/dist/cjs/parts/DSPaginator/parts/OptionRenderer.js +98 -0
- package/dist/cjs/parts/DSPaginator/parts/OptionRenderer.js.map +7 -0
- package/dist/cjs/parts/DSPaginator/parts/Panel.js +131 -0
- package/dist/cjs/parts/DSPaginator/parts/Panel.js.map +7 -0
- package/dist/cjs/parts/DSPaginator/parts/Trigger.js +124 -0
- package/dist/cjs/parts/DSPaginator/parts/Trigger.js.map +7 -0
- package/dist/cjs/parts/DSPaginator/react-desc-prop-types.js +6 -1
- package/dist/cjs/parts/DSPaginator/react-desc-prop-types.js.map +2 -2
- package/dist/cjs/parts/DSPaginator/styled.js +113 -38
- package/dist/cjs/parts/DSPaginator/styled.js.map +3 -3
- package/dist/cjs/parts/DSPaginator/typescript-testing/slot-props.js +12 -1
- package/dist/cjs/parts/DSPaginator/typescript-testing/slot-props.js.map +2 -2
- package/dist/cjs/parts/DSPaginator/typescript-testing/typescript-testing.js +2 -1
- package/dist/cjs/parts/DSPaginator/typescript-testing/typescript-testing.js.map +2 -2
- package/dist/cjs/parts/DSPerPageSelector/DSPerPageSelector.js +10 -79
- package/dist/cjs/parts/DSPerPageSelector/DSPerPageSelector.js.map +3 -3
- package/dist/cjs/parts/DSPerPageSelector/DSPerPageSelectorCTX.js +38 -0
- package/dist/cjs/parts/DSPerPageSelector/DSPerPageSelectorCTX.js.map +7 -0
- package/dist/cjs/parts/DSPerPageSelector/config/getInstanceIds.js +40 -0
- package/dist/cjs/parts/DSPerPageSelector/config/getInstanceIds.js.map +7 -0
- package/dist/cjs/parts/DSPerPageSelector/config/getOptions.js.map +2 -2
- package/dist/cjs/parts/DSPerPageSelector/config/getSelectedOptionIndex.js +36 -0
- package/dist/cjs/parts/DSPerPageSelector/config/getSelectedOptionIndex.js.map +7 -0
- package/dist/cjs/parts/DSPerPageSelector/config/navigationKeys.js +44 -0
- package/dist/cjs/parts/DSPerPageSelector/config/navigationKeys.js.map +7 -0
- package/dist/cjs/parts/DSPerPageSelector/config/useFocusTracker.js +83 -0
- package/dist/cjs/parts/DSPerPageSelector/config/useFocusTracker.js.map +7 -0
- package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelector.js +68 -20
- package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelector.js.map +2 -2
- package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorFloatingContext.js +82 -0
- package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorFloatingContext.js.map +7 -0
- package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorInteractions.js +175 -0
- package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorInteractions.js.map +7 -0
- package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorSizing.js +66 -0
- package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorSizing.js.map +7 -0
- package/dist/cjs/parts/DSPerPageSelector/constants/index.js +47 -8
- package/dist/cjs/parts/DSPerPageSelector/constants/index.js.map +2 -2
- package/dist/cjs/parts/DSPerPageSelector/parts/OptionRenderer.js +94 -0
- package/dist/cjs/parts/DSPerPageSelector/parts/OptionRenderer.js.map +7 -0
- package/dist/cjs/parts/DSPerPageSelector/parts/Panel.js +120 -0
- package/dist/cjs/parts/DSPerPageSelector/parts/Panel.js.map +7 -0
- package/dist/cjs/parts/DSPerPageSelector/parts/Trigger.js +95 -0
- package/dist/cjs/parts/DSPerPageSelector/parts/Trigger.js.map +7 -0
- package/dist/cjs/parts/DSPerPageSelector/react-desc-prop-types.js +19 -2
- package/dist/cjs/parts/DSPerPageSelector/react-desc-prop-types.js.map +2 -2
- package/dist/cjs/parts/DSPerPageSelector/styled.js +104 -32
- package/dist/cjs/parts/DSPerPageSelector/styled.js.map +2 -2
- package/dist/cjs/parts/DSPerPageSelector/typescript-testing/slots-props.js +10 -1
- package/dist/cjs/parts/DSPerPageSelector/typescript-testing/slots-props.js.map +2 -2
- package/dist/cjs/parts/DSPerPageSelector/typescript-testing/typescript-testing.js +60 -1
- package/dist/cjs/parts/DSPerPageSelector/typescript-testing/typescript-testing.js.map +2 -2
- package/dist/cjs/react-desc-prop-types.js.map +1 -1
- package/dist/esm/parts/DSPaginator/DSPaginator.js +12 -168
- package/dist/esm/parts/DSPaginator/DSPaginator.js.map +2 -2
- package/dist/esm/parts/DSPaginator/DSPaginatorCTX.js +8 -0
- package/dist/esm/parts/DSPaginator/DSPaginatorCTX.js.map +7 -0
- package/dist/esm/parts/DSPaginator/config/getAmountOfPages.js +9 -0
- package/dist/esm/parts/DSPaginator/config/getAmountOfPages.js.map +7 -0
- package/dist/esm/parts/DSPaginator/config/getInstanceIds.js +10 -0
- package/dist/esm/parts/DSPaginator/config/getInstanceIds.js.map +7 -0
- package/dist/esm/parts/DSPaginator/config/navigationKeys.js +14 -0
- package/dist/esm/parts/DSPaginator/config/navigationKeys.js.map +7 -0
- package/dist/esm/parts/DSPaginator/config/useFocusTracker.js +47 -0
- package/dist/esm/parts/DSPaginator/config/useFocusTracker.js.map +7 -0
- package/dist/esm/parts/DSPaginator/config/usePaginator.js +74 -50
- package/dist/esm/parts/DSPaginator/config/usePaginator.js.map +2 -2
- package/dist/esm/parts/DSPaginator/config/usePaginatorFloatingContext.js +56 -0
- package/dist/esm/parts/DSPaginator/config/usePaginatorFloatingContext.js.map +7 -0
- package/dist/esm/parts/DSPaginator/config/usePaginatorInteractions.js +140 -0
- package/dist/esm/parts/DSPaginator/config/usePaginatorInteractions.js.map +7 -0
- package/dist/esm/parts/DSPaginator/config/usePaginatorSizing.js +56 -0
- package/dist/esm/parts/DSPaginator/config/usePaginatorSizing.js.map +7 -0
- package/dist/esm/parts/DSPaginator/config/useValidateProps.js.map +2 -2
- package/dist/esm/parts/DSPaginator/constants/index.js +49 -3
- package/dist/esm/parts/DSPaginator/constants/index.js.map +2 -2
- package/dist/esm/parts/DSPaginator/parts/OptionRenderer.js +68 -0
- package/dist/esm/parts/DSPaginator/parts/OptionRenderer.js.map +7 -0
- package/dist/esm/parts/DSPaginator/parts/Panel.js +101 -0
- package/dist/esm/parts/DSPaginator/parts/Panel.js.map +7 -0
- package/dist/esm/parts/DSPaginator/parts/Trigger.js +94 -0
- package/dist/esm/parts/DSPaginator/parts/Trigger.js.map +7 -0
- package/dist/esm/parts/DSPaginator/react-desc-prop-types.js +6 -1
- package/dist/esm/parts/DSPaginator/react-desc-prop-types.js.map +2 -2
- package/dist/esm/parts/DSPaginator/styled.js +120 -39
- package/dist/esm/parts/DSPaginator/styled.js.map +2 -2
- package/dist/esm/parts/DSPaginator/typescript-testing/slot-props.js +12 -1
- package/dist/esm/parts/DSPaginator/typescript-testing/slot-props.js.map +2 -2
- package/dist/esm/parts/DSPaginator/typescript-testing/typescript-testing.js +2 -1
- package/dist/esm/parts/DSPaginator/typescript-testing/typescript-testing.js.map +2 -2
- package/dist/esm/parts/DSPerPageSelector/DSPerPageSelector.js +11 -80
- package/dist/esm/parts/DSPerPageSelector/DSPerPageSelector.js.map +3 -3
- package/dist/esm/parts/DSPerPageSelector/DSPerPageSelectorCTX.js +8 -0
- package/dist/esm/parts/DSPerPageSelector/DSPerPageSelectorCTX.js.map +7 -0
- package/dist/esm/parts/DSPerPageSelector/config/getInstanceIds.js +10 -0
- package/dist/esm/parts/DSPerPageSelector/config/getInstanceIds.js.map +7 -0
- package/dist/esm/parts/DSPerPageSelector/config/getOptions.js.map +2 -2
- package/dist/esm/parts/DSPerPageSelector/config/getSelectedOptionIndex.js +6 -0
- package/dist/esm/parts/DSPerPageSelector/config/getSelectedOptionIndex.js.map +7 -0
- package/dist/esm/parts/DSPerPageSelector/config/navigationKeys.js +14 -0
- package/dist/esm/parts/DSPerPageSelector/config/navigationKeys.js.map +7 -0
- package/dist/esm/parts/DSPerPageSelector/config/useFocusTracker.js +53 -0
- package/dist/esm/parts/DSPerPageSelector/config/useFocusTracker.js.map +7 -0
- package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelector.js +69 -21
- package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelector.js.map +2 -2
- package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorFloatingContext.js +52 -0
- package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorFloatingContext.js.map +7 -0
- package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorInteractions.js +145 -0
- package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorInteractions.js.map +7 -0
- package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorSizing.js +42 -0
- package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorSizing.js.map +7 -0
- package/dist/esm/parts/DSPerPageSelector/constants/index.js +47 -8
- package/dist/esm/parts/DSPerPageSelector/constants/index.js.map +2 -2
- package/dist/esm/parts/DSPerPageSelector/parts/OptionRenderer.js +64 -0
- package/dist/esm/parts/DSPerPageSelector/parts/OptionRenderer.js.map +7 -0
- package/dist/esm/parts/DSPerPageSelector/parts/Panel.js +90 -0
- package/dist/esm/parts/DSPerPageSelector/parts/Panel.js.map +7 -0
- package/dist/esm/parts/DSPerPageSelector/parts/Trigger.js +65 -0
- package/dist/esm/parts/DSPerPageSelector/parts/Trigger.js.map +7 -0
- package/dist/esm/parts/DSPerPageSelector/react-desc-prop-types.js +19 -2
- package/dist/esm/parts/DSPerPageSelector/react-desc-prop-types.js.map +2 -2
- package/dist/esm/parts/DSPerPageSelector/styled.js +111 -33
- package/dist/esm/parts/DSPerPageSelector/styled.js.map +2 -2
- package/dist/esm/parts/DSPerPageSelector/typescript-testing/slots-props.js +10 -1
- package/dist/esm/parts/DSPerPageSelector/typescript-testing/slots-props.js.map +2 -2
- package/dist/esm/parts/DSPerPageSelector/typescript-testing/typescript-testing.js +60 -1
- package/dist/esm/parts/DSPerPageSelector/typescript-testing/typescript-testing.js.map +2 -2
- package/dist/esm/react-desc-prop-types.js.map +1 -1
- package/dist/types/parts/DSPageNextButton/config/usePageNextButton.d.ts +4 -4
- package/dist/types/parts/DSPagePrevButton/config/usePagePrevButton.d.ts +4 -4
- package/dist/types/parts/DSPaginationContainer/config/usePaginationContainer.d.ts +4 -4
- package/dist/types/parts/DSPaginationSeparator/config/usePaginationSeparator.d.ts +4 -4
- package/dist/types/parts/DSPaginator/DSPaginator.d.ts +5 -0
- package/dist/types/parts/DSPaginator/DSPaginatorCTX.d.ts +5 -0
- package/dist/types/parts/DSPaginator/config/getAmountOfPages.d.ts +1 -0
- package/dist/types/parts/DSPaginator/config/getInstanceIds.d.ts +3 -0
- package/dist/types/parts/DSPaginator/config/navigationKeys.d.ts +3 -0
- package/dist/types/parts/DSPaginator/config/useFocusTracker.d.ts +20 -0
- package/dist/types/parts/DSPaginator/config/usePaginator.d.ts +52 -18
- package/dist/types/parts/DSPaginator/config/usePaginatorFloatingContext.d.ts +31 -0
- package/dist/types/parts/DSPaginator/config/usePaginatorInteractions.d.ts +37 -0
- package/dist/types/parts/DSPaginator/config/usePaginatorSizing.d.ts +37 -0
- package/dist/types/parts/DSPaginator/constants/index.d.ts +36 -1
- package/dist/types/parts/DSPaginator/parts/OptionRenderer.d.ts +11 -0
- package/dist/types/parts/DSPaginator/parts/Panel.d.ts +5 -0
- package/dist/types/parts/DSPaginator/parts/Trigger.d.ts +5 -0
- package/dist/types/parts/DSPaginator/react-desc-prop-types.d.ts +17 -0
- package/dist/types/parts/DSPaginator/styled.d.ts +17 -4
- package/dist/types/parts/DSPerPageSelector/DSPerPageSelector.d.ts +5 -0
- package/dist/types/parts/DSPerPageSelector/DSPerPageSelectorCTX.d.ts +5 -0
- package/dist/types/parts/DSPerPageSelector/config/getInstanceIds.d.ts +3 -0
- package/dist/types/parts/DSPerPageSelector/config/getOptions.d.ts +3 -3
- package/dist/types/parts/DSPerPageSelector/config/getSelectedOptionIndex.d.ts +2 -0
- package/dist/types/parts/DSPerPageSelector/config/navigationKeys.d.ts +3 -0
- package/dist/types/parts/DSPerPageSelector/config/useFocusTracker.d.ts +22 -0
- package/dist/types/parts/DSPerPageSelector/config/usePerPageSelector.d.ts +43 -10
- package/dist/types/parts/DSPerPageSelector/config/usePerPageSelectorFloatingContext.d.ts +31 -0
- package/dist/types/parts/DSPerPageSelector/config/usePerPageSelectorInteractions.d.ts +38 -0
- package/dist/types/parts/DSPerPageSelector/config/usePerPageSelectorSizing.d.ts +25 -0
- package/dist/types/parts/DSPerPageSelector/constants/index.d.ts +32 -5
- package/dist/types/parts/DSPerPageSelector/parts/OptionRenderer.d.ts +11 -0
- package/dist/types/parts/DSPerPageSelector/parts/Panel.d.ts +5 -0
- package/dist/types/parts/DSPerPageSelector/parts/Trigger.d.ts +5 -0
- package/dist/types/parts/DSPerPageSelector/react-desc-prop-types.d.ts +27 -2
- package/dist/types/parts/DSPerPageSelector/styled.d.ts +15 -2
- package/dist/types/react-desc-prop-types.d.ts +2 -2
- package/package.json +15 -13
- package/dist/cjs/parts/DSPaginator/config/createPaginatorHeader.js.map +0 -7
- package/dist/cjs/parts/DSPaginator/config/getOptions.js +0 -76
- package/dist/cjs/parts/DSPaginator/config/getOptions.js.map +0 -7
- package/dist/cjs/parts/DSPaginator/config/usePaginationSearch.js.map +0 -7
- package/dist/esm/parts/DSPaginator/config/createPaginatorHeader.js +0 -24
- package/dist/esm/parts/DSPaginator/config/createPaginatorHeader.js.map +0 -7
- package/dist/esm/parts/DSPaginator/config/getOptions.js +0 -46
- package/dist/esm/parts/DSPaginator/config/getOptions.js.map +0 -7
- package/dist/esm/parts/DSPaginator/config/usePaginationSearch.js +0 -33
- package/dist/esm/parts/DSPaginator/config/usePaginationSearch.js.map +0 -7
- package/dist/types/parts/DSPaginator/config/createPaginatorHeader.d.ts +0 -9
- package/dist/types/parts/DSPaginator/config/getOptions.d.ts +0 -8
- package/dist/types/parts/DSPaginator/config/usePaginationSearch.d.ts +0 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { DSFastListT } from '@elliemae/ds-fast-list';
|
|
2
|
+
import type React from 'react';
|
|
3
|
+
import type { DSPaginatorT } from '../react-desc-prop-types.js';
|
|
4
|
+
import type { useFocusTracker } from './useFocusTracker.js';
|
|
5
|
+
type InteractionsConfigT = {
|
|
6
|
+
propsWithDefault: DSPaginatorT.InternalProps;
|
|
7
|
+
globalAttributes: {
|
|
8
|
+
onClick?: unknown;
|
|
9
|
+
onKeyDown?: unknown;
|
|
10
|
+
};
|
|
11
|
+
isOpen: boolean;
|
|
12
|
+
setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
|
13
|
+
amountOfPages: number;
|
|
14
|
+
focusTrackers: ReturnType<typeof useFocusTracker>;
|
|
15
|
+
triggerRef: React.MutableRefObject<HTMLButtonElement | null>;
|
|
16
|
+
floatingNodeRef: React.MutableRefObject<HTMLDivElement | null>;
|
|
17
|
+
listActionRef: React.MutableRefObject<DSFastListT.ActionRef>;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Every user intent on the trigger and on the list. The selection model is the one of a native select:
|
|
21
|
+
* - moving through the options (arrows, Home/End, PageUp/PageDown, typing a page number) only moves the focus:
|
|
22
|
+
* `onPageChange` is NOT invoked while navigating, because committing a page is a costly side effect for a paginator
|
|
23
|
+
* - Enter, Space or a click on an option commits it, closes the list and returns the focus to the trigger
|
|
24
|
+
* - Tab (and Shift+Tab) commits the focused option, closes the list and continues from the trigger
|
|
25
|
+
* - Escape (see usePaginatorFloatingContext) and click outside close without committing
|
|
26
|
+
* Handlers only declare focus intents through the focus tracker (see useFocusTracker), with ONE documented exception:
|
|
27
|
+
* Tab (see handlePanelKeyDownCapture).
|
|
28
|
+
*/
|
|
29
|
+
export declare const usePaginatorInteractions: ({ propsWithDefault, globalAttributes, isOpen, setIsOpen, amountOfPages, focusTrackers, triggerRef, floatingNodeRef, listActionRef, }: InteractionsConfigT) => {
|
|
30
|
+
commitPage: (page: number) => void;
|
|
31
|
+
handleTriggerClick: (e: React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>) => void;
|
|
32
|
+
handleTriggerKeyDown: (e: React.KeyboardEvent<HTMLButtonElement>) => void;
|
|
33
|
+
handlePanelKeyDown: (e: React.KeyboardEvent<HTMLElement>) => void;
|
|
34
|
+
handlePanelKeyDownCapture: (e: React.KeyboardEvent<HTMLElement>) => void;
|
|
35
|
+
handleBlurOutOfWidget: (e: React.FocusEvent<HTMLElement>) => void;
|
|
36
|
+
};
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { DSFastListT } from '@elliemae/ds-fast-list';
|
|
2
|
+
import type React from 'react';
|
|
3
|
+
type SizingConfigT = {
|
|
4
|
+
pageCount: number | string;
|
|
5
|
+
pageIndex: number;
|
|
6
|
+
pageDetails: string[] | readonly string[];
|
|
7
|
+
listWidth?: number | string;
|
|
8
|
+
chevronRef: React.RefObject<HTMLElement>;
|
|
9
|
+
pageInfoRef: React.RefObject<HTMLDivElement>;
|
|
10
|
+
listActionRef: React.MutableRefObject<DSFastListT.ActionRef>;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Everything about sizes. The rows of the list are virtualized (out of flow), so nothing inside the list can make the panel
|
|
14
|
+
* grow: its width is an explicit policy, not something derived from its content.
|
|
15
|
+
* - with `pageDetails` (or when the consumer passes `listWidth`) the list is `listWidth` wide (280px by default), never wider
|
|
16
|
+
* than the viewport, and the details WRAP inside it. Nothing here renders or measures every detail: that would be O(n) hidden
|
|
17
|
+
* components just to size the list to the widest detail, and it forced a one-line (truncating) design.
|
|
18
|
+
* - without details the list is as wide as its page numbers need (the previous formula: chevron + 60px + the digits of the
|
|
19
|
+
* page count in `ch`), plain CSS.
|
|
20
|
+
* The trigger does not reserve the width of the widest detail either: it follows the detail of the current page.
|
|
21
|
+
*/
|
|
22
|
+
export declare const usePaginatorSizing: ({ pageCount, pageIndex, pageDetails, listWidth, chevronRef, pageInfoRef, listActionRef, }: SizingConfigT) => {
|
|
23
|
+
hasDetails: boolean;
|
|
24
|
+
chevronWidth: number;
|
|
25
|
+
pageInfoWidth: number;
|
|
26
|
+
panelStyle: {
|
|
27
|
+
width: string;
|
|
28
|
+
minWidth?: undefined;
|
|
29
|
+
} | {
|
|
30
|
+
minWidth: string;
|
|
31
|
+
width?: undefined;
|
|
32
|
+
};
|
|
33
|
+
detailMaxWidth: string | undefined;
|
|
34
|
+
listMaxHeight: number;
|
|
35
|
+
handleListWrapperRef: (node: HTMLDivElement | null) => void;
|
|
36
|
+
};
|
|
37
|
+
export {};
|
|
@@ -3,7 +3,42 @@ export { DSPaginationName };
|
|
|
3
3
|
export declare const DSPaginatorName = "DSPaginator";
|
|
4
4
|
export declare const PAGINATOR_SLOTS: {
|
|
5
5
|
readonly PAGINATOR: "paginator";
|
|
6
|
+
readonly TRIGGER_WRAPPER: "paginator-trigger-wrapper";
|
|
7
|
+
readonly PAGE_INFO: "paginator-page-info";
|
|
8
|
+
readonly FLOATING_WRAPPER: "paginator-floating-wrapper";
|
|
9
|
+
readonly PANEL: "paginator-panel";
|
|
10
|
+
readonly HEADER: "paginator-header";
|
|
11
|
+
readonly LIST_WRAPPER: "paginator-list-wrapper";
|
|
12
|
+
readonly LIST: "paginator-list";
|
|
13
|
+
readonly OPTION: "paginator-option";
|
|
14
|
+
readonly OPTION_CHECKMARK: "paginator-option-checkmark";
|
|
15
|
+
readonly OPTION_PAGE: "paginator-option-page";
|
|
16
|
+
readonly OPTION_DETAIL: "paginator-option-detail";
|
|
6
17
|
};
|
|
7
18
|
export declare const PAGINATOR_DATA_TESTID: {
|
|
8
|
-
|
|
19
|
+
TRIGGER_WRAPPER: string;
|
|
20
|
+
PANEL: string;
|
|
21
|
+
HEADER: string;
|
|
22
|
+
LIST: string;
|
|
23
|
+
OPTION: string;
|
|
24
|
+
PAGINATOR: "ds-pagination-paginator";
|
|
25
|
+
PAGE_INFO: "ds-pagination-paginator-page-info";
|
|
26
|
+
FLOATING_WRAPPER: "ds-pagination-paginator-floating-wrapper";
|
|
27
|
+
LIST_WRAPPER: "ds-pagination-paginator-list-wrapper";
|
|
28
|
+
OPTION_CHECKMARK: "ds-pagination-paginator-option-checkmark";
|
|
29
|
+
OPTION_PAGE: "ds-pagination-paginator-option-page";
|
|
30
|
+
OPTION_DETAIL: "ds-pagination-paginator-option-detail";
|
|
9
31
|
};
|
|
32
|
+
export declare const PAGINATOR_REGION_FOCUSES: {
|
|
33
|
+
readonly RESET: "";
|
|
34
|
+
readonly TRIGGER: "trigger";
|
|
35
|
+
readonly OPTION_PREFIX: "option-";
|
|
36
|
+
};
|
|
37
|
+
export declare const PAGINATOR_OPTION_HEIGHT = 32;
|
|
38
|
+
export declare const PAGINATOR_PANEL_MAX_HEIGHT = 300;
|
|
39
|
+
export declare const PAGINATOR_HEADER_HEIGHT = 17;
|
|
40
|
+
export declare const PAGINATOR_PANEL_PADDING_BOTTOM = 4;
|
|
41
|
+
export declare const PAGINATOR_DEFAULT_LIST_WIDTH = 280;
|
|
42
|
+
export declare const PAGINATOR_VIEWPORT_MARGIN = 16;
|
|
43
|
+
export declare const PAGINATOR_PAGE_JUMP = 10;
|
|
44
|
+
export declare const PAGINATOR_TYPEAHEAD_RESET_MS = 1000;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
type OptionRendererPropsT = {
|
|
3
|
+
index: number;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* One page of the list. Rendered by the virtual list, so only the options near the viewport are mounted:
|
|
7
|
+
* every position-dependent a11y fact (`aria-posinset`, `aria-setsize`) is explicit, and the focus lands on an option by
|
|
8
|
+
* its page identity from the ref callback (see useFocusTracker), not by its place in the DOM.
|
|
9
|
+
*/
|
|
10
|
+
export declare const OptionRenderer: ({ index }: OptionRendererPropsT) => React.JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -4,6 +4,17 @@ import { DSPaginationName, PAGINATOR_SLOTS } from './constants/index.js';
|
|
|
4
4
|
export declare namespace DSPaginatorT {
|
|
5
5
|
type SlotFunctionArguments = {
|
|
6
6
|
dsPaginationPaginator: () => object;
|
|
7
|
+
dsPaginationPaginatorTriggerWrapper: () => object;
|
|
8
|
+
dsPaginationPaginatorPageInfo: () => object;
|
|
9
|
+
dsPaginationPaginatorFloatingWrapper: () => object;
|
|
10
|
+
dsPaginationPaginatorPanel: () => object;
|
|
11
|
+
dsPaginationPaginatorHeader: () => object;
|
|
12
|
+
dsPaginationPaginatorListWrapper: () => object;
|
|
13
|
+
dsPaginationPaginatorList: () => object;
|
|
14
|
+
dsPaginationPaginatorOption: () => object;
|
|
15
|
+
dsPaginationPaginatorOptionCheckmark: () => object;
|
|
16
|
+
dsPaginationPaginatorOptionPage: () => object;
|
|
17
|
+
dsPaginationPaginatorOptionDetail: () => object;
|
|
7
18
|
};
|
|
8
19
|
interface RequiredProps {
|
|
9
20
|
}
|
|
@@ -16,6 +27,12 @@ export declare namespace DSPaginatorT {
|
|
|
16
27
|
pageDetailsTitle: string;
|
|
17
28
|
}
|
|
18
29
|
interface OptionalProps extends TypescriptHelpersT.PropsForGlobalOnSlots<typeof DSPaginationName, typeof PAGINATOR_SLOTS> {
|
|
30
|
+
/**
|
|
31
|
+
* Width of the open list (a number is px, a string is any CSS length) when the paginator has `pageDetails`: the details
|
|
32
|
+
* wrap inside it. The list is never wider than the viewport. Default: 280px. Without `pageDetails` the list is as wide
|
|
33
|
+
* as its page numbers need, unless this is passed.
|
|
34
|
+
*/
|
|
35
|
+
listWidth?: number | string;
|
|
19
36
|
}
|
|
20
37
|
interface Props extends Partial<DefaultProps>, OptionalProps, Omit<GlobalAttributesT<HTMLElement>, keyof DefaultProps | keyof XstyledProps>, XstyledProps, RequiredProps {
|
|
21
38
|
}
|
|
@@ -1,5 +1,18 @@
|
|
|
1
|
-
export declare const
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const StyledDropdown: import("styled-components").StyledComponent<import("react").ComponentType<import("@elliemae/ds-dropdownmenu-v2").DSDropdownMenuT.Props>, import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<import("react").ComponentType<import("@elliemae/ds-dropdownmenu-v2").DSDropdownMenuT.Props>>, never>;
|
|
4
|
-
export declare const StyledHeader: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<import("@elliemae/ds-grid").DSGridT.Props & import("react").RefAttributes<HTMLDivElement>>, import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<import("react").ForwardRefExoticComponent<import("@elliemae/ds-grid").DSGridT.Props & import("react").RefAttributes<HTMLDivElement>>>, never>;
|
|
1
|
+
export declare const StyledTrigger: import("styled-components").StyledComponent<import("react").ComponentType<import("@elliemae/ds-button-v2").DSButtonV3T.Props>, import("@elliemae/ds-system").Theme, import("styled-components").ThemeProps<import("@xstyled/system").Theme> & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<import("react").ComponentType<import("@elliemae/ds-button-v2").DSButtonV3T.Props>>, never>;
|
|
2
|
+
export declare const StyledTriggerWrapper: import("styled-components").StyledComponent<"div", import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<"div">, never>;
|
|
5
3
|
export declare const StyledPageInfo: import("styled-components").StyledComponent<"div", import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<"div">, never>;
|
|
4
|
+
export declare const StyledFloatingWrapper: import("styled-components").StyledComponent<import("react").ComponentType<import("@elliemae/ds-floating-context").DSFloatingWrapperT.Props>, import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<import("react").ComponentType<import("@elliemae/ds-floating-context").DSFloatingWrapperT.Props>>, never>;
|
|
5
|
+
export declare const StyledPanel: import("styled-components").StyledComponent<"div", import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<"div">, never>;
|
|
6
|
+
export declare const StyledHeader: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<import("@elliemae/ds-grid").DSGridT.Props & import("react").RefAttributes<HTMLDivElement>>, import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<import("react").ForwardRefExoticComponent<import("@elliemae/ds-grid").DSGridT.Props & import("react").RefAttributes<HTMLDivElement>>>, never>;
|
|
7
|
+
export declare const StyledListWrapper: import("styled-components").StyledComponent<"div", import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<"div">, never>;
|
|
8
|
+
export declare const StyledList: import("styled-components").StyledComponent<{
|
|
9
|
+
<T extends object>(props: import("@elliemae/ds-fast-list").DSFastListT.Props<T>): React.JSX.Element;
|
|
10
|
+
displayName: string;
|
|
11
|
+
}, import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<{
|
|
12
|
+
<T extends object>(props: import("@elliemae/ds-fast-list").DSFastListT.Props<T>): React.JSX.Element;
|
|
13
|
+
displayName: string;
|
|
14
|
+
}>, never>;
|
|
15
|
+
export declare const StyledOption: import("styled-components").StyledComponent<"div", import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<"div">, never>;
|
|
16
|
+
export declare const StyledOptionCheckmark: import("styled-components").StyledComponent<"span", import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<"span">, never>;
|
|
17
|
+
export declare const StyledOptionPage: import("styled-components").StyledComponent<"span", import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<"span">, never>;
|
|
18
|
+
export declare const StyledOptionDetail: import("styled-components").StyledComponent<"span", import("@elliemae/ds-system").Theme, object & import("@elliemae/ds-system").OwnerInterface & import("@elliemae/ds-system").InnerRefInterface<"span">, never>;
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type DSPerPageSelectorT } from './react-desc-prop-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* A trigger (aria-haspopup="dialog") that owns a non-modal dialog, positioned by the floating context, whose content is
|
|
5
|
+
* a listbox of page sizes (virtualized with DSFastList). It replaced a DSDropdownMenuV2 based implementation keeping its
|
|
6
|
+
* public contract; same widget as DSPaginator (accepted deviations: KNOWN_INTENTIONAL_DEVIATIONS.md, package root).
|
|
7
|
+
*/
|
|
3
8
|
declare const DSPerPageSelector: React.ComponentType<DSPerPageSelectorT.Props>;
|
|
4
9
|
declare const DSPerPageSelectorWithSchema: import("@elliemae/ds-props-helpers/dist/types/propTypes/types.js").DocumentedReactComponent<DSPerPageSelectorT.Props>;
|
|
5
10
|
export { DSPerPageSelector, DSPerPageSelectorWithSchema };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { usePerPageSelector } from './config/usePerPageSelector.js';
|
|
2
|
+
export interface DSPerPageSelectorCTX extends ReturnType<typeof usePerPageSelector> {
|
|
3
|
+
}
|
|
4
|
+
/** Single source of truth for the parts of DSPerPageSelector: props, owner props, floating context, focus tracker. */
|
|
5
|
+
export declare const DSPerPageSelectorContext: import("react").Context<DSPerPageSelectorCTX>;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare const generateOption: (value: number |
|
|
3
|
-
export declare const getOptions: (step: number, min: number, max: number) =>
|
|
1
|
+
import type { DSPerPageSelectorT } from '../react-desc-prop-types.js';
|
|
2
|
+
export declare const generateOption: (value: number | DSPerPageSelectorT.PerPageOption) => DSPerPageSelectorT.PerPageOption;
|
|
3
|
+
export declare const getOptions: (step: number, min: number, max: number) => DSPerPageSelectorT.PerPageOption[];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DSPerPageSelectorT } from '../react-desc-prop-types.js';
|
|
2
|
+
type FocusTrackerConfigT = {
|
|
3
|
+
options: DSPerPageSelectorT.PerPageOption[];
|
|
4
|
+
pageSize: number;
|
|
5
|
+
};
|
|
6
|
+
export declare const getOptionRegionId: (dsId: string) => string;
|
|
7
|
+
/**
|
|
8
|
+
* Focus tracker (see .github/memories/project_focus_tracker.md): the handlers declare WHAT must receive focus
|
|
9
|
+
* (a semantic identity), each part checks whether it IS that identity, and only the matching part focuses itself
|
|
10
|
+
* from its ref callback. Nothing in here calls `.focus()`.
|
|
11
|
+
*/
|
|
12
|
+
export declare const useFocusTracker: ({ options, pageSize }: FocusTrackerConfigT) => {
|
|
13
|
+
focusRegion: string;
|
|
14
|
+
focusedIndex: number;
|
|
15
|
+
clampIndex: (index: number) => number;
|
|
16
|
+
trackFocusRegionReset: () => void;
|
|
17
|
+
trackFocusTrigger: () => void;
|
|
18
|
+
trackFocusOption: (dsId: string) => void;
|
|
19
|
+
trackFocusOptionAtIndex: (index: number) => void;
|
|
20
|
+
trackFocusSelectedOption: () => void;
|
|
21
|
+
};
|
|
22
|
+
export {};
|
|
@@ -1,13 +1,29 @@
|
|
|
1
1
|
import type { DSButtonV3T } from '@elliemae/ds-button-v2';
|
|
2
|
+
import type { DSFastListT } from '@elliemae/ds-fast-list';
|
|
2
3
|
import React from 'react';
|
|
3
4
|
import { type DSPerPageSelectorT } from '../react-desc-prop-types.js';
|
|
4
5
|
export declare const usePerPageSelector: (propsFromUser: DSPerPageSelectorT.Props) => {
|
|
6
|
+
commitOption: (option: DSPerPageSelectorT.PerPageOption) => void;
|
|
7
|
+
handleTriggerClick: (e: React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>) => void;
|
|
8
|
+
handleTriggerKeyDown: (e: React.KeyboardEvent<HTMLButtonElement>) => void;
|
|
9
|
+
handlePanelKeyDown: (e: React.KeyboardEvent<HTMLElement>) => void;
|
|
10
|
+
handlePanelKeyDownCapture: (e: React.KeyboardEvent<HTMLElement>) => void;
|
|
11
|
+
handleBlurOutOfWidget: (e: React.FocusEvent<HTMLElement>) => void;
|
|
12
|
+
headerId: string;
|
|
13
|
+
listId: string;
|
|
14
|
+
dialogId: string;
|
|
15
|
+
chevronWidth: number;
|
|
16
|
+
panelStyle: {
|
|
17
|
+
width: string;
|
|
18
|
+
};
|
|
19
|
+
listMaxHeight: number;
|
|
20
|
+
handleListWrapperRef: (node: HTMLDivElement | null) => void;
|
|
5
21
|
propsWithDefault: DSPerPageSelectorT.InternalProps;
|
|
6
22
|
xstyledProps: import("@elliemae/ds-props-helpers").XstyledProps;
|
|
7
|
-
globalAttributes: Partial<Pick<DSButtonV3T.Props, "
|
|
8
|
-
width?: number | string | undefined | undefined;
|
|
9
|
-
form?: string | undefined | undefined;
|
|
23
|
+
globalAttributes: Partial<Pick<DSButtonV3T.Props, "list" | "label" | "form" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "autoCapitalize" | "autoFocus" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "enterKeyHint" | "hidden" | "id" | "lang" | "nonce" | "slot" | "spellCheck" | "style" | "tabIndex" | "title" | "translate" | "radioGroup" | "role" | "about" | "content" | "datatype" | "inlist" | "prefix" | "property" | "rel" | "resource" | "rev" | "typeof" | "vocab" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "exportparts" | "part" | "accept" | "acceptCharset" | "action" | "allowFullScreen" | "allowTransparency" | "alt" | "async" | "autoComplete" | "autoPlay" | "capture" | "cellPadding" | "cellSpacing" | "charSet" | "challenge" | "checked" | "cite" | "classID" | "cols" | "colSpan" | "controls" | "coords" | "crossOrigin" | "data" | "dateTime" | "default" | "defer" | "disabled" | "download" | "encType" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "frameBorder" | "headers" | "height" | "high" | "href" | "hrefLang" | "htmlFor" | "httpEquiv" | "integrity" | "keyParams" | "keyType" | "kind" | "loop" | "low" | "manifest" | "marginHeight" | "marginWidth" | "max" | "maxLength" | "media" | "mediaGroup" | "method" | "min" | "minLength" | "multiple" | "muted" | "name" | "noValidate" | "open" | "optimum" | "pattern" | "placeholder" | "playsInline" | "poster" | "preload" | "readOnly" | "required" | "reversed" | "rows" | "rowSpan" | "sandbox" | "scope" | "scoped" | "scrolling" | "seamless" | "selected" | "shape" | "size" | "sizes" | "span" | "src" | "srcDoc" | "srcLang" | "srcSet" | "start" | "step" | "summary" | "target" | "type" | "useMap" | "value" | "width" | "wmode" | "wrap"> & Omit<{
|
|
10
24
|
list?: string | undefined | undefined;
|
|
25
|
+
label?: string | undefined | undefined;
|
|
26
|
+
form?: string | undefined | undefined;
|
|
11
27
|
"aria-activedescendant"?: string | undefined | undefined;
|
|
12
28
|
"aria-atomic"?: (boolean | "true" | "false") | undefined;
|
|
13
29
|
"aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
|
|
@@ -317,7 +333,6 @@ export declare const usePerPageSelector: (propsFromUser: DSPerPageSelectorT.Prop
|
|
|
317
333
|
keyParams?: string | undefined | undefined;
|
|
318
334
|
keyType?: string | undefined | undefined;
|
|
319
335
|
kind?: string | undefined | undefined;
|
|
320
|
-
label?: string | undefined | undefined;
|
|
321
336
|
loop?: boolean | undefined | undefined;
|
|
322
337
|
low?: number | undefined | undefined;
|
|
323
338
|
manifest?: string | undefined | undefined;
|
|
@@ -367,6 +382,7 @@ export declare const usePerPageSelector: (propsFromUser: DSPerPageSelectorT.Prop
|
|
|
367
382
|
type?: string | undefined | undefined;
|
|
368
383
|
useMap?: string | undefined | undefined;
|
|
369
384
|
value?: string | number | readonly string[] | undefined;
|
|
385
|
+
width?: number | string | undefined | undefined;
|
|
370
386
|
wmode?: string | undefined | undefined;
|
|
371
387
|
wrap?: string | undefined | undefined;
|
|
372
388
|
}, keyof DSButtonV3T.Props>>;
|
|
@@ -374,11 +390,28 @@ export declare const usePerPageSelector: (propsFromUser: DSPerPageSelectorT.Prop
|
|
|
374
390
|
getOwnerProps: () => DSPerPageSelectorT.InternalProps;
|
|
375
391
|
getOwnerPropsArguments: () => {};
|
|
376
392
|
};
|
|
377
|
-
|
|
378
|
-
|
|
393
|
+
isOpen: boolean;
|
|
394
|
+
options: DSPerPageSelectorT.PerPageOption[];
|
|
395
|
+
focusTrackers: {
|
|
396
|
+
focusRegion: string;
|
|
397
|
+
focusedIndex: number;
|
|
398
|
+
clampIndex: (index: number) => number;
|
|
399
|
+
trackFocusRegionReset: () => void;
|
|
400
|
+
trackFocusTrigger: () => void;
|
|
401
|
+
trackFocusOption: (dsId: string) => void;
|
|
402
|
+
trackFocusOptionAtIndex: (index: number) => void;
|
|
403
|
+
trackFocusSelectedOption: () => void;
|
|
404
|
+
};
|
|
405
|
+
triggerRef: React.MutableRefObject<HTMLButtonElement | null>;
|
|
379
406
|
chevronRef: React.RefObject<HTMLElement>;
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
407
|
+
listActionRef: React.MutableRefObject<DSFastListT.ActionRef>;
|
|
408
|
+
floatingStyles: React.CSSProperties;
|
|
409
|
+
floatingContext: {
|
|
410
|
+
withoutPortal: boolean;
|
|
411
|
+
withoutAnimation: boolean;
|
|
412
|
+
portalDOMContainer: HTMLElement | undefined;
|
|
413
|
+
animationDuration: number;
|
|
414
|
+
};
|
|
415
|
+
handleTriggerRef: (instance: HTMLButtonElement | null) => void | React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES];
|
|
416
|
+
floatingInnerRef: (instance: HTMLDivElement | null) => void | React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES];
|
|
384
417
|
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
type FloatingContextConfigT = {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
|
5
|
+
triggerRef: React.MutableRefObject<HTMLButtonElement | null>;
|
|
6
|
+
trackFocusRegionReset: () => void;
|
|
7
|
+
chevronWidth: number;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* The single point that wires DSPerPageSelector to `useFloatingContext` (same shape as DSPaginator's one).
|
|
11
|
+
*
|
|
12
|
+
* The open state is owned by the component, so the floating context is "controlled" by it
|
|
13
|
+
* (`externallyControlledIsOpen`) and this hook only translates the closing intents of the floating context into it:
|
|
14
|
+
* - scoped Escape: the floating context routes it to `onEscape` and, because `returnFocusToReference` is on, it also
|
|
15
|
+
* returns the focus to the trigger. This is the ONLY close path where the floating context moves the focus.
|
|
16
|
+
* - click outside (panel + trigger): closes, the focus stays where the user clicked.
|
|
17
|
+
* The other close paths (activation, Tab, trigger toggle) live in usePerPageSelectorInteractions.
|
|
18
|
+
*/
|
|
19
|
+
export declare const usePerPageSelectorFloatingContext: ({ isOpen, setIsOpen, triggerRef, trackFocusRegionReset, chevronWidth, }: FloatingContextConfigT) => {
|
|
20
|
+
floatingStyles: React.CSSProperties;
|
|
21
|
+
floatingContext: {
|
|
22
|
+
withoutPortal: boolean;
|
|
23
|
+
withoutAnimation: boolean;
|
|
24
|
+
portalDOMContainer: HTMLElement | undefined;
|
|
25
|
+
animationDuration: number;
|
|
26
|
+
};
|
|
27
|
+
handleTriggerRef: (instance: HTMLButtonElement | null) => void | React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES];
|
|
28
|
+
floatingInnerRef: (instance: HTMLDivElement | null) => void | React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES];
|
|
29
|
+
floatingNodeRef: React.MutableRefObject<HTMLDivElement | null>;
|
|
30
|
+
};
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { DSFastListT } from '@elliemae/ds-fast-list';
|
|
2
|
+
import type React from 'react';
|
|
3
|
+
import type { DSPerPageSelectorT } from '../react-desc-prop-types.js';
|
|
4
|
+
import type { useFocusTracker } from './useFocusTracker.js';
|
|
5
|
+
type InteractionsConfigT = {
|
|
6
|
+
propsWithDefault: DSPerPageSelectorT.InternalProps;
|
|
7
|
+
globalAttributes: {
|
|
8
|
+
onClick?: unknown;
|
|
9
|
+
onKeyDown?: unknown;
|
|
10
|
+
};
|
|
11
|
+
options: DSPerPageSelectorT.PerPageOption[];
|
|
12
|
+
isOpen: boolean;
|
|
13
|
+
setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
|
14
|
+
focusTrackers: ReturnType<typeof useFocusTracker>;
|
|
15
|
+
triggerRef: React.MutableRefObject<HTMLButtonElement | null>;
|
|
16
|
+
floatingNodeRef: React.MutableRefObject<HTMLDivElement | null>;
|
|
17
|
+
listActionRef: React.MutableRefObject<DSFastListT.ActionRef>;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Every user intent on the trigger and on the list. The selection model is the one of a native select (and the same one
|
|
21
|
+
* as DSPaginator):
|
|
22
|
+
* - moving through the options (arrows, Home/End, PageUp/PageDown, typing the start of a label) only moves the focus:
|
|
23
|
+
* `onPageSizeChange` is NOT invoked while navigating
|
|
24
|
+
* - Enter, Space or a click on an option commits it, closes the list and returns the focus to the trigger
|
|
25
|
+
* - Tab (and Shift+Tab) commits the focused option, closes the list and continues from the trigger
|
|
26
|
+
* - Escape (see usePerPageSelectorFloatingContext) and click outside close without committing
|
|
27
|
+
* Handlers only declare focus intents through the focus tracker (see useFocusTracker), with ONE documented exception:
|
|
28
|
+
* Tab (see handlePanelKeyDownCapture).
|
|
29
|
+
*/
|
|
30
|
+
export declare const usePerPageSelectorInteractions: ({ propsWithDefault, globalAttributes, options, isOpen, setIsOpen, focusTrackers, triggerRef, floatingNodeRef, listActionRef, }: InteractionsConfigT) => {
|
|
31
|
+
commitOption: (option: DSPerPageSelectorT.PerPageOption) => void;
|
|
32
|
+
handleTriggerClick: (e: React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>) => void;
|
|
33
|
+
handleTriggerKeyDown: (e: React.KeyboardEvent<HTMLButtonElement>) => void;
|
|
34
|
+
handlePanelKeyDown: (e: React.KeyboardEvent<HTMLElement>) => void;
|
|
35
|
+
handlePanelKeyDownCapture: (e: React.KeyboardEvent<HTMLElement>) => void;
|
|
36
|
+
handleBlurOutOfWidget: (e: React.FocusEvent<HTMLElement>) => void;
|
|
37
|
+
};
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DSFastListT } from '@elliemae/ds-fast-list';
|
|
2
|
+
import type React from 'react';
|
|
3
|
+
import type { DSPerPageSelectorT } from '../react-desc-prop-types.js';
|
|
4
|
+
type SizingConfigT = {
|
|
5
|
+
pageSize: number;
|
|
6
|
+
options: DSPerPageSelectorT.PerPageOption[];
|
|
7
|
+
listWidth?: number | string;
|
|
8
|
+
chevronRef: React.RefObject<HTMLElement>;
|
|
9
|
+
listActionRef: React.MutableRefObject<DSFastListT.ActionRef>;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Everything about sizes. The rows of the list are virtualized (out of flow), so nothing inside the list can make the panel
|
|
13
|
+
* grow: its width is an explicit policy, not something derived from its content. The list is `listWidth` wide (100px by
|
|
14
|
+
* default), never wider than the viewport, and the labels WRAP inside it. Nothing here renders or measures every label: that
|
|
15
|
+
* would be O(n) hidden components just to size the list to the widest label, and it forced a one-line (truncating) design.
|
|
16
|
+
*/
|
|
17
|
+
export declare const usePerPageSelectorSizing: ({ pageSize, options, listWidth, chevronRef, listActionRef, }: SizingConfigT) => {
|
|
18
|
+
chevronWidth: number;
|
|
19
|
+
panelStyle: {
|
|
20
|
+
width: string;
|
|
21
|
+
};
|
|
22
|
+
listMaxHeight: number;
|
|
23
|
+
handleListWrapperRef: (node: HTMLDivElement | null) => void;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
@@ -1,13 +1,40 @@
|
|
|
1
1
|
import { DSPaginationName } from '../../../constants/index.js';
|
|
2
2
|
export { DSPaginationName };
|
|
3
3
|
export declare const DSPerPageSelectorName = "DSPerPageSelector";
|
|
4
|
-
export declare const EXAMPLE_CONSTANTS: {
|
|
5
|
-
readonly HELLO: "WORLD";
|
|
6
|
-
readonly FOO: "BAR";
|
|
7
|
-
};
|
|
8
4
|
export declare const PER_PAGE_SELECTOR_SLOTS: {
|
|
9
5
|
readonly PER_PAGE_SELECTOR: "per-page-selector";
|
|
6
|
+
readonly TRIGGER_WRAPPER: "per-page-selector-trigger-wrapper";
|
|
7
|
+
readonly FLOATING_WRAPPER: "per-page-selector-floating-wrapper";
|
|
8
|
+
readonly PANEL: "per-page-selector-panel";
|
|
9
|
+
readonly HEADER: "per-page-selector-header";
|
|
10
|
+
readonly LIST_WRAPPER: "per-page-selector-list-wrapper";
|
|
11
|
+
readonly LIST: "per-page-selector-list";
|
|
12
|
+
readonly OPTION: "per-page-selector-option";
|
|
13
|
+
readonly OPTION_CHECKMARK: "per-page-selector-option-checkmark";
|
|
14
|
+
readonly OPTION_LABEL: "per-page-selector-option-label";
|
|
10
15
|
};
|
|
11
16
|
export declare const PER_PAGE_SELECTOR_DATA_TESTID: {
|
|
12
|
-
|
|
17
|
+
TRIGGER_WRAPPER: string;
|
|
18
|
+
PANEL: string;
|
|
19
|
+
HEADER: string;
|
|
20
|
+
LIST: string;
|
|
21
|
+
OPTION: string;
|
|
22
|
+
PER_PAGE_SELECTOR: "ds-pagination-per-page-selector";
|
|
23
|
+
FLOATING_WRAPPER: "ds-pagination-per-page-selector-floating-wrapper";
|
|
24
|
+
LIST_WRAPPER: "ds-pagination-per-page-selector-list-wrapper";
|
|
25
|
+
OPTION_CHECKMARK: "ds-pagination-per-page-selector-option-checkmark";
|
|
26
|
+
OPTION_LABEL: "ds-pagination-per-page-selector-option-label";
|
|
27
|
+
};
|
|
28
|
+
export declare const PER_PAGE_SELECTOR_REGION_FOCUSES: {
|
|
29
|
+
readonly RESET: "";
|
|
30
|
+
readonly TRIGGER: "trigger";
|
|
31
|
+
readonly OPTION_PREFIX: "option-";
|
|
13
32
|
};
|
|
33
|
+
export declare const PER_PAGE_SELECTOR_OPTION_HEIGHT = 32;
|
|
34
|
+
export declare const PER_PAGE_SELECTOR_PANEL_MAX_HEIGHT = 300;
|
|
35
|
+
export declare const PER_PAGE_SELECTOR_HEADER_HEIGHT = 17;
|
|
36
|
+
export declare const PER_PAGE_SELECTOR_PANEL_PADDING_BOTTOM = 4;
|
|
37
|
+
export declare const PER_PAGE_SELECTOR_DEFAULT_LIST_WIDTH = 100;
|
|
38
|
+
export declare const PER_PAGE_SELECTOR_VIEWPORT_MARGIN = 16;
|
|
39
|
+
export declare const PER_PAGE_SELECTOR_PAGE_JUMP = 10;
|
|
40
|
+
export declare const PER_PAGE_SELECTOR_TYPEAHEAD_RESET_MS = 1000;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
type OptionRendererPropsT = {
|
|
3
|
+
index: number;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* One option of the list. Rendered by the virtual list, so only the options near the viewport are mounted:
|
|
7
|
+
* every position-dependent a11y fact (`aria-posinset`, `aria-setsize`) is explicit, and the focus lands on an option by
|
|
8
|
+
* its dsId identity from the ref callback (see useFocusTracker), not by its place in the DOM.
|
|
9
|
+
*/
|
|
10
|
+
export declare const OptionRenderer: ({ index }: OptionRendererPropsT) => React.JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -1,11 +1,31 @@
|
|
|
1
|
-
import type { DSDropdownMenuT } from '@elliemae/ds-dropdownmenu-v2';
|
|
2
1
|
import type { DSPropTypesSchema, GlobalAttributesT, ValidationMap, XstyledProps } from '@elliemae/ds-props-helpers';
|
|
3
2
|
import { type TypescriptHelpersT } from '@elliemae/ds-typescript-helpers';
|
|
4
3
|
import { DSPaginationName, PER_PAGE_SELECTOR_SLOTS } from './constants/index.js';
|
|
5
4
|
export declare namespace DSPerPageSelectorT {
|
|
6
5
|
type SlotFunctionArguments = {
|
|
7
6
|
dsPaginationPerPageSelector: () => object;
|
|
7
|
+
dsPaginationPerPageSelectorTriggerWrapper: () => object;
|
|
8
|
+
dsPaginationPerPageSelectorFloatingWrapper: () => object;
|
|
9
|
+
dsPaginationPerPageSelectorPanel: () => object;
|
|
10
|
+
dsPaginationPerPageSelectorHeader: () => object;
|
|
11
|
+
dsPaginationPerPageSelectorListWrapper: () => object;
|
|
12
|
+
dsPaginationPerPageSelectorList: () => object;
|
|
13
|
+
dsPaginationPerPageSelectorOption: () => object;
|
|
14
|
+
dsPaginationPerPageSelectorOptionCheckmark: () => object;
|
|
15
|
+
dsPaginationPerPageSelectorOptionLabel: () => object;
|
|
8
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* One option of the list: what the examples use and what the list reads. It used to be typed as a `DSDropdownMenuV2`
|
|
19
|
+
* single item, which handed consumers a whole contract that was never meant for them nor shown in the examples (`render`,
|
|
20
|
+
* `disabled`, `onClick`, global attributes, xstyled props...). Some of it happened to work because the options were passed
|
|
21
|
+
* to the dropdown unchanged; none of it is supported anymore.
|
|
22
|
+
*/
|
|
23
|
+
interface PerPageOption {
|
|
24
|
+
type?: 'single';
|
|
25
|
+
dsId: string;
|
|
26
|
+
label: string;
|
|
27
|
+
value: number;
|
|
28
|
+
}
|
|
9
29
|
interface RequiredProps {
|
|
10
30
|
}
|
|
11
31
|
interface DefaultProps {
|
|
@@ -16,7 +36,12 @@ export declare namespace DSPerPageSelectorT {
|
|
|
16
36
|
maxPerPage: number;
|
|
17
37
|
}
|
|
18
38
|
interface OptionalProps extends TypescriptHelpersT.PropsForGlobalOnSlots<typeof DSPaginationName, typeof PER_PAGE_SELECTOR_SLOTS> {
|
|
19
|
-
perPageOptions?: (number |
|
|
39
|
+
perPageOptions?: (number | PerPageOption)[];
|
|
40
|
+
/**
|
|
41
|
+
* Width of the open list (a number is px, a string is any CSS length). Labels wrap inside it; the list is never wider
|
|
42
|
+
* than the viewport. Default: 100px.
|
|
43
|
+
*/
|
|
44
|
+
listWidth?: number | string;
|
|
20
45
|
}
|
|
21
46
|
interface Props extends Partial<DefaultProps>, OptionalProps, Omit<GlobalAttributesT<HTMLElement>, keyof DefaultProps | keyof XstyledProps>, XstyledProps, RequiredProps {
|
|
22
47
|
}
|