@elliemae/ds-pagination 3.80.0-next.51 → 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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/parts/DSPaginator/DSPaginatorCTX.ts"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { createContext } from 'react';\nimport type { usePaginator } from './config/usePaginator.js';\n\nexport interface DSPaginatorCTX extends ReturnType<typeof usePaginator> {}\n\nconst defaultContext = {} as DSPaginatorCTX;\n\n/** Single source of truth for the parts of DSPaginator: props, owner props, floating context, focus tracker. */\nexport const DSPaginatorContext = createContext<DSPaginatorCTX>(defaultContext);\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,qBAAqB;AAK9B,MAAM,iBAAiB,CAAC;AAGjB,MAAM,qBAAqB,cAA8B,cAAc;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
const getAmountOfPages = (pageCount, pageIndex) => {
|
|
3
|
+
const amount = typeof pageCount === "string" ? pageIndex + 1 : pageCount;
|
|
4
|
+
return Number.isFinite(amount) && amount > 0 ? Math.floor(amount) : 0;
|
|
5
|
+
};
|
|
6
|
+
export {
|
|
7
|
+
getAmountOfPages
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=getAmountOfPages.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/parts/DSPaginator/config/getAmountOfPages.ts"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "// same rule as the existing DSPaginator: when the page count is not known (a string, e.g. \"many\"),\n// the user can only reach the pages up to the one after the current\nexport const getAmountOfPages = (pageCount: number | string, pageIndex: number): number => {\n const amount = typeof pageCount === 'string' ? pageIndex + 1 : pageCount;\n return Number.isFinite(amount) && amount > 0 ? Math.floor(amount) : 0;\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACEhB,MAAM,mBAAmB,CAAC,WAA4B,cAA8B;AACzF,QAAM,SAAS,OAAO,cAAc,WAAW,YAAY,IAAI;AAC/D,SAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,KAAK,MAAM,MAAM,IAAI;AACtE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
const getHeaderId = (instanceUid) => `ds-paginator-header-${instanceUid}`;
|
|
3
|
+
const getListId = (instanceUid) => `ds-paginator-list-${instanceUid}`;
|
|
4
|
+
const getDialogId = (instanceUid) => `ds-paginator-dialog-${instanceUid}`;
|
|
5
|
+
export {
|
|
6
|
+
getDialogId,
|
|
7
|
+
getHeaderId,
|
|
8
|
+
getListId
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=getInstanceIds.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/parts/DSPaginator/config/getInstanceIds.ts"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "// one place composes the ids so the parts and the aria relationships cannot drift apart\nexport const getHeaderId = (instanceUid: string) => `ds-paginator-header-${instanceUid}`;\nexport const getListId = (instanceUid: string) => `ds-paginator-list-${instanceUid}`;\nexport const getDialogId = (instanceUid: string) => `ds-paginator-dialog-${instanceUid}`;\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACChB,MAAM,cAAc,CAAC,gBAAwB,uBAAuB,WAAW;AAC/E,MAAM,YAAY,CAAC,gBAAwB,qBAAqB,WAAW;AAC3E,MAAM,cAAc,CAAC,gBAAwB,uBAAuB,WAAW;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { PAGINATOR_PAGE_JUMP } from "../constants/index.js";
|
|
3
|
+
const NAVIGATION_KEYS = {
|
|
4
|
+
ArrowDown: (currentPage) => currentPage + 1,
|
|
5
|
+
ArrowUp: (currentPage) => currentPage - 1,
|
|
6
|
+
PageDown: (currentPage) => currentPage + PAGINATOR_PAGE_JUMP,
|
|
7
|
+
PageUp: (currentPage) => currentPage - PAGINATOR_PAGE_JUMP,
|
|
8
|
+
Home: () => 1,
|
|
9
|
+
End: (_currentPage, amountOfPages) => amountOfPages
|
|
10
|
+
};
|
|
11
|
+
export {
|
|
12
|
+
NAVIGATION_KEYS
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=navigationKeys.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/parts/DSPaginator/config/navigationKeys.ts"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { PAGINATOR_PAGE_JUMP } from '../constants/index.js';\n\ntype GetTargetPage = (currentPage: number, amountOfPages: number) => number;\n\n// the keys that only MOVE the focus through the options (APG listbox / select-only combobox navigation)\nexport const NAVIGATION_KEYS: Record<string, GetTargetPage> = {\n ArrowDown: (currentPage) => currentPage + 1,\n ArrowUp: (currentPage) => currentPage - 1,\n PageDown: (currentPage) => currentPage + PAGINATOR_PAGE_JUMP,\n PageUp: (currentPage) => currentPage - PAGINATOR_PAGE_JUMP,\n Home: () => 1,\n End: (_currentPage, amountOfPages) => amountOfPages,\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,2BAA2B;AAK7B,MAAM,kBAAiD;AAAA,EAC5D,WAAW,CAAC,gBAAgB,cAAc;AAAA,EAC1C,SAAS,CAAC,gBAAgB,cAAc;AAAA,EACxC,UAAU,CAAC,gBAAgB,cAAc;AAAA,EACzC,QAAQ,CAAC,gBAAgB,cAAc;AAAA,EACvC,MAAM,MAAM;AAAA,EACZ,KAAK,CAAC,cAAc,kBAAkB;AACxC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useCallback, useMemo, useState } from "react";
|
|
3
|
+
import { PAGINATOR_REGION_FOCUSES } from "../constants/index.js";
|
|
4
|
+
const getOptionRegionId = (page) => `${PAGINATOR_REGION_FOCUSES.OPTION_PREFIX}${page}`;
|
|
5
|
+
const getPageFromRegion = (region) => {
|
|
6
|
+
if (!region.startsWith(PAGINATOR_REGION_FOCUSES.OPTION_PREFIX)) return null;
|
|
7
|
+
return Number(region.slice(PAGINATOR_REGION_FOCUSES.OPTION_PREFIX.length));
|
|
8
|
+
};
|
|
9
|
+
const useFocusTracker = ({ amountOfPages, pageIndex }) => {
|
|
10
|
+
const [focusRegion, setFocusRegion] = useState(PAGINATOR_REGION_FOCUSES.RESET);
|
|
11
|
+
const focusedPage = useMemo(() => getPageFromRegion(focusRegion), [focusRegion]);
|
|
12
|
+
const clampPage = useCallback((page) => Math.min(Math.max(page, 1), amountOfPages), [amountOfPages]);
|
|
13
|
+
const trackFocusRegionReset = useCallback(() => setFocusRegion(PAGINATOR_REGION_FOCUSES.RESET), []);
|
|
14
|
+
const trackFocusTrigger = useCallback(() => setFocusRegion(PAGINATOR_REGION_FOCUSES.TRIGGER), []);
|
|
15
|
+
const trackFocusOption = useCallback(
|
|
16
|
+
(page) => {
|
|
17
|
+
if (amountOfPages > 0) setFocusRegion(getOptionRegionId(clampPage(page)));
|
|
18
|
+
},
|
|
19
|
+
[amountOfPages, clampPage]
|
|
20
|
+
);
|
|
21
|
+
const trackFocusSelectedOption = useCallback(() => trackFocusOption(pageIndex), [pageIndex, trackFocusOption]);
|
|
22
|
+
return useMemo(
|
|
23
|
+
() => ({
|
|
24
|
+
focusRegion,
|
|
25
|
+
focusedPage,
|
|
26
|
+
clampPage,
|
|
27
|
+
trackFocusRegionReset,
|
|
28
|
+
trackFocusTrigger,
|
|
29
|
+
trackFocusOption,
|
|
30
|
+
trackFocusSelectedOption
|
|
31
|
+
}),
|
|
32
|
+
[
|
|
33
|
+
focusRegion,
|
|
34
|
+
focusedPage,
|
|
35
|
+
clampPage,
|
|
36
|
+
trackFocusRegionReset,
|
|
37
|
+
trackFocusTrigger,
|
|
38
|
+
trackFocusOption,
|
|
39
|
+
trackFocusSelectedOption
|
|
40
|
+
]
|
|
41
|
+
);
|
|
42
|
+
};
|
|
43
|
+
export {
|
|
44
|
+
getOptionRegionId,
|
|
45
|
+
useFocusTracker
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=useFocusTracker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/parts/DSPaginator/config/useFocusTracker.ts"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { useCallback, useMemo, useState } from 'react';\nimport { PAGINATOR_REGION_FOCUSES } from '../constants/index.js';\n\ntype FocusTrackerConfigT = {\n amountOfPages: number;\n pageIndex: number;\n};\n\n// the identity of an option is the page it represents: stable, never the position in the (virtualized) DOM\nexport const getOptionRegionId = (page: number) => `${PAGINATOR_REGION_FOCUSES.OPTION_PREFIX}${page}`;\n\nconst getPageFromRegion = (region: string): number | null => {\n if (!region.startsWith(PAGINATOR_REGION_FOCUSES.OPTION_PREFIX)) return null;\n return Number(region.slice(PAGINATOR_REGION_FOCUSES.OPTION_PREFIX.length));\n};\n\n/**\n * Focus tracker (see .github/memories/project_focus_tracker.md): the handlers declare WHAT must receive focus\n * (a semantic identity), each part checks whether it IS that identity, and only the matching part focuses itself\n * from its ref callback. Nothing in here calls `.focus()`.\n */\nexport const useFocusTracker = ({ amountOfPages, pageIndex }: FocusTrackerConfigT) => {\n const [focusRegion, setFocusRegion] = useState<string>(PAGINATOR_REGION_FOCUSES.RESET);\n\n const focusedPage = useMemo(() => getPageFromRegion(focusRegion), [focusRegion]);\n\n const clampPage = useCallback((page: number) => Math.min(Math.max(page, 1), amountOfPages), [amountOfPages]);\n\n const trackFocusRegionReset = useCallback(() => setFocusRegion(PAGINATOR_REGION_FOCUSES.RESET), []);\n const trackFocusTrigger = useCallback(() => setFocusRegion(PAGINATOR_REGION_FOCUSES.TRIGGER), []);\n const trackFocusOption = useCallback(\n (page: number) => {\n if (amountOfPages > 0) setFocusRegion(getOptionRegionId(clampPage(page)));\n },\n [amountOfPages, clampPage],\n );\n const trackFocusSelectedOption = useCallback(() => trackFocusOption(pageIndex), [pageIndex, trackFocusOption]);\n\n return useMemo(\n () => ({\n focusRegion,\n focusedPage,\n clampPage,\n trackFocusRegionReset,\n trackFocusTrigger,\n trackFocusOption,\n trackFocusSelectedOption,\n }),\n [\n focusRegion,\n focusedPage,\n clampPage,\n trackFocusRegionReset,\n trackFocusTrigger,\n trackFocusOption,\n trackFocusSelectedOption,\n ],\n );\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,aAAa,SAAS,gBAAgB;AAC/C,SAAS,gCAAgC;AAQlC,MAAM,oBAAoB,CAAC,SAAiB,GAAG,yBAAyB,aAAa,GAAG,IAAI;AAEnG,MAAM,oBAAoB,CAAC,WAAkC;AAC3D,MAAI,CAAC,OAAO,WAAW,yBAAyB,aAAa,EAAG,QAAO;AACvE,SAAO,OAAO,OAAO,MAAM,yBAAyB,cAAc,MAAM,CAAC;AAC3E;AAOO,MAAM,kBAAkB,CAAC,EAAE,eAAe,UAAU,MAA2B;AACpF,QAAM,CAAC,aAAa,cAAc,IAAI,SAAiB,yBAAyB,KAAK;AAErF,QAAM,cAAc,QAAQ,MAAM,kBAAkB,WAAW,GAAG,CAAC,WAAW,CAAC;AAE/E,QAAM,YAAY,YAAY,CAAC,SAAiB,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,GAAG,aAAa,GAAG,CAAC,aAAa,CAAC;AAE3G,QAAM,wBAAwB,YAAY,MAAM,eAAe,yBAAyB,KAAK,GAAG,CAAC,CAAC;AAClG,QAAM,oBAAoB,YAAY,MAAM,eAAe,yBAAyB,OAAO,GAAG,CAAC,CAAC;AAChG,QAAM,mBAAmB;AAAA,IACvB,CAAC,SAAiB;AAChB,UAAI,gBAAgB,EAAG,gBAAe,kBAAkB,UAAU,IAAI,CAAC,CAAC;AAAA,IAC1E;AAAA,IACA,CAAC,eAAe,SAAS;AAAA,EAC3B;AACA,QAAM,2BAA2B,YAAY,MAAM,iBAAiB,SAAS,GAAG,CAAC,WAAW,gBAAgB,CAAC;AAE7G,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -5,12 +5,16 @@ import {
|
|
|
5
5
|
useMemoMergePropsWithDefault,
|
|
6
6
|
useOwnerProps
|
|
7
7
|
} from "@elliemae/ds-props-helpers";
|
|
8
|
-
import React2, {
|
|
8
|
+
import React2, { useMemo, useRef, useState } from "react";
|
|
9
|
+
import { uid } from "uid";
|
|
9
10
|
import { DSPaginatorPropTypesSchema, defaultProps } from "../react-desc-prop-types.js";
|
|
11
|
+
import { getAmountOfPages } from "./getAmountOfPages.js";
|
|
12
|
+
import { getDialogId, getHeaderId, getListId } from "./getInstanceIds.js";
|
|
13
|
+
import { useFocusTracker } from "./useFocusTracker.js";
|
|
14
|
+
import { usePaginatorFloatingContext } from "./usePaginatorFloatingContext.js";
|
|
15
|
+
import { usePaginatorInteractions } from "./usePaginatorInteractions.js";
|
|
16
|
+
import { usePaginatorSizing } from "./usePaginatorSizing.js";
|
|
10
17
|
import { useValidateProps } from "./useValidateProps.js";
|
|
11
|
-
import { useOnElementResize } from "../../shared/useOnElementOnResize.js";
|
|
12
|
-
import { getOptions } from "./getOptions.js";
|
|
13
|
-
import { usePaginationSearch } from "./usePaginationSearch.js";
|
|
14
18
|
const usePaginator = (propsFromUser) => {
|
|
15
19
|
const propsWithDefault = useMemoMergePropsWithDefault(propsFromUser, defaultProps);
|
|
16
20
|
useValidateProps(propsWithDefault, DSPaginatorPropTypesSchema);
|
|
@@ -19,66 +23,86 @@ const usePaginator = (propsFromUser) => {
|
|
|
19
23
|
propsWithDefault
|
|
20
24
|
);
|
|
21
25
|
const ownerPropsConfig = useOwnerProps(propsWithDefault);
|
|
22
|
-
const { pageIndex, pageCount, pageDetails } = propsWithDefault;
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
const { pageIndex, pageCount, pageDetails, listWidth } = propsWithDefault;
|
|
27
|
+
const instanceUid = useMemo(() => uid(5), []);
|
|
28
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
29
|
+
const amountOfPages = getAmountOfPages(pageCount, pageIndex);
|
|
30
|
+
const triggerRef = useRef(null);
|
|
31
|
+
const chevronRef = useRef(null);
|
|
32
|
+
const pageInfoRef = useRef(null);
|
|
33
|
+
const listActionRef = useRef({});
|
|
34
|
+
const sizing = usePaginatorSizing({
|
|
35
|
+
pageCount,
|
|
36
|
+
pageIndex,
|
|
37
|
+
pageDetails,
|
|
38
|
+
listWidth,
|
|
39
|
+
chevronRef,
|
|
40
|
+
pageInfoRef,
|
|
41
|
+
listActionRef
|
|
42
|
+
});
|
|
43
|
+
const focusTrackers = useFocusTracker({ amountOfPages, pageIndex });
|
|
44
|
+
const { floatingStyles, floatingContext, handleTriggerRef, floatingInnerRef, floatingNodeRef } = usePaginatorFloatingContext({
|
|
45
|
+
isOpen,
|
|
46
|
+
setIsOpen,
|
|
47
|
+
triggerRef,
|
|
48
|
+
trackFocusRegionReset: focusTrackers.trackFocusRegionReset,
|
|
49
|
+
chevronWidth: sizing.chevronWidth
|
|
50
|
+
});
|
|
51
|
+
const interactions = usePaginatorInteractions({
|
|
52
|
+
propsWithDefault,
|
|
53
|
+
globalAttributes,
|
|
54
|
+
isOpen,
|
|
55
|
+
setIsOpen,
|
|
56
|
+
amountOfPages,
|
|
57
|
+
focusTrackers,
|
|
58
|
+
triggerRef,
|
|
59
|
+
floatingNodeRef,
|
|
60
|
+
listActionRef
|
|
61
|
+
});
|
|
62
|
+
const ids = useMemo(
|
|
63
|
+
() => ({
|
|
64
|
+
headerId: getHeaderId(instanceUid),
|
|
65
|
+
listId: getListId(instanceUid),
|
|
66
|
+
dialogId: getDialogId(instanceUid)
|
|
67
|
+
}),
|
|
68
|
+
[instanceUid]
|
|
36
69
|
);
|
|
37
|
-
const onKeyDown = usePaginationSearch(pageCount, actionRef);
|
|
38
|
-
useEffect(() => {
|
|
39
|
-
if (isOpened) {
|
|
40
|
-
actionRef.current.setActiveDescendant(pageIndex.toString());
|
|
41
|
-
actionRef.current.scrollOptionIntoView(pageIndex.toString());
|
|
42
|
-
}
|
|
43
|
-
}, [isOpened]);
|
|
44
70
|
return React2.useMemo(
|
|
45
71
|
() => ({
|
|
46
72
|
propsWithDefault,
|
|
47
73
|
xstyledProps,
|
|
48
74
|
globalAttributes,
|
|
49
75
|
ownerPropsConfig,
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
76
|
+
isOpen,
|
|
77
|
+
amountOfPages,
|
|
78
|
+
focusTrackers,
|
|
79
|
+
triggerRef,
|
|
80
|
+
chevronRef,
|
|
53
81
|
pageInfoRef,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
onKeyDown
|
|
82
|
+
listActionRef,
|
|
83
|
+
floatingStyles,
|
|
84
|
+
floatingContext,
|
|
85
|
+
handleTriggerRef,
|
|
86
|
+
floatingInnerRef,
|
|
87
|
+
...sizing,
|
|
88
|
+
...ids,
|
|
89
|
+
...interactions
|
|
63
90
|
}),
|
|
64
91
|
[
|
|
65
92
|
propsWithDefault,
|
|
66
93
|
xstyledProps,
|
|
67
94
|
globalAttributes,
|
|
68
95
|
ownerPropsConfig,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
pageInfoRef,
|
|
80
|
-
setIsOpened,
|
|
81
|
-
onKeyDown
|
|
96
|
+
isOpen,
|
|
97
|
+
amountOfPages,
|
|
98
|
+
focusTrackers,
|
|
99
|
+
floatingStyles,
|
|
100
|
+
floatingContext,
|
|
101
|
+
handleTriggerRef,
|
|
102
|
+
floatingInnerRef,
|
|
103
|
+
sizing,
|
|
104
|
+
ids,
|
|
105
|
+
interactions
|
|
82
106
|
]
|
|
83
107
|
);
|
|
84
108
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/parts/DSPaginator/config/usePaginator.ts"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "
|
|
5
|
-
"mappings": "AAAA,YAAY,WAAW;
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import type { DSButtonV3T } from '@elliemae/ds-button-v2';\nimport type { DSFastListT } from '@elliemae/ds-fast-list';\nimport {\n useGetGlobalAttributes,\n useGetXstyledProps,\n useMemoMergePropsWithDefault,\n useOwnerProps,\n} from '@elliemae/ds-props-helpers';\nimport React, { useMemo, useRef, useState } from 'react';\nimport { uid } from 'uid';\nimport { DSPaginatorPropTypesSchema, defaultProps, type DSPaginatorT } from '../react-desc-prop-types.js';\nimport { getAmountOfPages } from './getAmountOfPages.js';\nimport { getDialogId, getHeaderId, getListId } from './getInstanceIds.js';\nimport { useFocusTracker } from './useFocusTracker.js';\nimport { usePaginatorFloatingContext } from './usePaginatorFloatingContext.js';\nimport { usePaginatorInteractions } from './usePaginatorInteractions.js';\nimport { usePaginatorSizing } from './usePaginatorSizing.js';\nimport { useValidateProps } from './useValidateProps.js';\n\nexport const usePaginator = (propsFromUser: DSPaginatorT.Props) => {\n // =============================================================================\n // MERGE WITH DEFAULT AND VALIDATE PROPS\n // =============================================================================\n const propsWithDefault = useMemoMergePropsWithDefault<DSPaginatorT.InternalProps>(propsFromUser, defaultProps);\n useValidateProps(propsWithDefault, DSPaginatorPropTypesSchema);\n // =============================================================================\n // XSTYLED PROPS\n // =============================================================================\n const xstyledProps = useGetXstyledProps(propsWithDefault);\n // =============================================================================\n // GLOBAL ATTRIBUTES\n // =============================================================================\n const globalAttributes = useGetGlobalAttributes<DSPaginatorT.InternalProps, HTMLButtonElement, DSButtonV3T.Props>(\n propsWithDefault,\n );\n // =============================================================================\n // OWNER PROPS\n // =============================================================================\n const ownerPropsConfig = useOwnerProps(propsWithDefault);\n // =============================================================================\n // AD HOC PER COMPONENT LOGIC\n // =============================================================================\n const { pageIndex, pageCount, pageDetails, listWidth } = propsWithDefault;\n const instanceUid = useMemo(() => uid(5), []);\n const [isOpen, setIsOpen] = useState(false);\n const amountOfPages = getAmountOfPages(pageCount, pageIndex);\n\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const chevronRef = useRef<HTMLElement>(null);\n const pageInfoRef = useRef<HTMLDivElement>(null);\n const listActionRef = useRef<DSFastListT.ActionRef>({});\n\n const sizing = usePaginatorSizing({\n pageCount,\n pageIndex,\n pageDetails,\n listWidth,\n chevronRef,\n pageInfoRef,\n listActionRef,\n });\n\n const focusTrackers = useFocusTracker({ amountOfPages, pageIndex });\n\n const { floatingStyles, floatingContext, handleTriggerRef, floatingInnerRef, floatingNodeRef } =\n usePaginatorFloatingContext({\n isOpen,\n setIsOpen,\n triggerRef,\n trackFocusRegionReset: focusTrackers.trackFocusRegionReset,\n chevronWidth: sizing.chevronWidth,\n });\n\n const interactions = usePaginatorInteractions({\n propsWithDefault,\n globalAttributes,\n isOpen,\n setIsOpen,\n amountOfPages,\n focusTrackers,\n triggerRef,\n floatingNodeRef,\n listActionRef,\n });\n\n const ids = useMemo(\n () => ({\n headerId: getHeaderId(instanceUid),\n listId: getListId(instanceUid),\n dialogId: getDialogId(instanceUid),\n }),\n [instanceUid],\n );\n\n return React.useMemo(\n () => ({\n propsWithDefault,\n xstyledProps,\n globalAttributes,\n ownerPropsConfig,\n isOpen,\n amountOfPages,\n focusTrackers,\n triggerRef,\n chevronRef,\n pageInfoRef,\n listActionRef,\n floatingStyles,\n floatingContext,\n handleTriggerRef,\n floatingInnerRef,\n ...sizing,\n ...ids,\n ...interactions,\n }),\n [\n propsWithDefault,\n xstyledProps,\n globalAttributes,\n ownerPropsConfig,\n isOpen,\n amountOfPages,\n focusTrackers,\n floatingStyles,\n floatingContext,\n handleTriggerRef,\n floatingInnerRef,\n sizing,\n ids,\n interactions,\n ],\n );\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACEvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAOA,UAAS,SAAS,QAAQ,gBAAgB;AACjD,SAAS,WAAW;AACpB,SAAS,4BAA4B,oBAAuC;AAC5E,SAAS,wBAAwB;AACjC,SAAS,aAAa,aAAa,iBAAiB;AACpD,SAAS,uBAAuB;AAChC,SAAS,mCAAmC;AAC5C,SAAS,gCAAgC;AACzC,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AAE1B,MAAM,eAAe,CAAC,kBAAsC;AAIjE,QAAM,mBAAmB,6BAAyD,eAAe,YAAY;AAC7G,mBAAiB,kBAAkB,0BAA0B;AAI7D,QAAM,eAAe,mBAAmB,gBAAgB;AAIxD,QAAM,mBAAmB;AAAA,IACvB;AAAA,EACF;AAIA,QAAM,mBAAmB,cAAc,gBAAgB;AAIvD,QAAM,EAAE,WAAW,WAAW,aAAa,UAAU,IAAI;AACzD,QAAM,cAAc,QAAQ,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,gBAAgB,iBAAiB,WAAW,SAAS;AAE3D,QAAM,aAAa,OAAiC,IAAI;AACxD,QAAM,aAAa,OAAoB,IAAI;AAC3C,QAAM,cAAc,OAAuB,IAAI;AAC/C,QAAM,gBAAgB,OAA8B,CAAC,CAAC;AAEtD,QAAM,SAAS,mBAAmB;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,gBAAgB,EAAE,eAAe,UAAU,CAAC;AAElE,QAAM,EAAE,gBAAgB,iBAAiB,kBAAkB,kBAAkB,gBAAgB,IAC3F,4BAA4B;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB,cAAc;AAAA,IACrC,cAAc,OAAO;AAAA,EACvB,CAAC;AAEH,QAAM,eAAe,yBAAyB;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,MAAM;AAAA,IACV,OAAO;AAAA,MACL,UAAU,YAAY,WAAW;AAAA,MACjC,QAAQ,UAAU,WAAW;AAAA,MAC7B,UAAU,YAAY,WAAW;AAAA,IACnC;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,SAAOA,OAAM;AAAA,IACX,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["React"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useFloatingContext } from "@elliemae/ds-floating-context";
|
|
3
|
+
import { useCallback, useMemo, useRef } from "react";
|
|
4
|
+
const usePaginatorFloatingContext = ({
|
|
5
|
+
isOpen,
|
|
6
|
+
setIsOpen,
|
|
7
|
+
triggerRef,
|
|
8
|
+
trackFocusRegionReset,
|
|
9
|
+
chevronWidth
|
|
10
|
+
}) => {
|
|
11
|
+
const floatingNodeRef = useRef(null);
|
|
12
|
+
const handleClickOutside = useCallback(() => {
|
|
13
|
+
setIsOpen(false);
|
|
14
|
+
trackFocusRegionReset();
|
|
15
|
+
}, [setIsOpen, trackFocusRegionReset]);
|
|
16
|
+
const handleScopedEscape = useCallback(() => {
|
|
17
|
+
setIsOpen(false);
|
|
18
|
+
trackFocusRegionReset();
|
|
19
|
+
}, [setIsOpen, trackFocusRegionReset]);
|
|
20
|
+
const floatingContextConfig = useMemo(
|
|
21
|
+
() => ({
|
|
22
|
+
// the existing DSPaginator opens upwards (it lives in a footer) and aligns the selected page with the trigger
|
|
23
|
+
placement: "top-start",
|
|
24
|
+
placementOrderPreference: ["top-start", "bottom-start"],
|
|
25
|
+
customOffset: [-(chevronWidth + 7), 2],
|
|
26
|
+
externallyControlledIsOpen: isOpen,
|
|
27
|
+
withoutAnimation: true,
|
|
28
|
+
onClickOutside: handleClickOutside,
|
|
29
|
+
closeOnEscape: true,
|
|
30
|
+
onEscape: handleScopedEscape,
|
|
31
|
+
returnFocusToReference: true,
|
|
32
|
+
externalReferenceElement: triggerRef.current
|
|
33
|
+
}),
|
|
34
|
+
[chevronWidth, handleClickOutside, handleScopedEscape, isOpen, triggerRef]
|
|
35
|
+
);
|
|
36
|
+
const { refs: floatingRefs, floatingStyles, context: floatingContext } = useFloatingContext(floatingContextConfig);
|
|
37
|
+
const handleTriggerRef = useCallback(
|
|
38
|
+
(node) => {
|
|
39
|
+
triggerRef.current = node;
|
|
40
|
+
floatingRefs.setReference(node);
|
|
41
|
+
},
|
|
42
|
+
[floatingRefs, triggerRef]
|
|
43
|
+
);
|
|
44
|
+
const floatingInnerRef = useCallback(
|
|
45
|
+
(node) => {
|
|
46
|
+
floatingNodeRef.current = node;
|
|
47
|
+
floatingRefs.setFloating(node);
|
|
48
|
+
},
|
|
49
|
+
[floatingRefs.setFloating]
|
|
50
|
+
);
|
|
51
|
+
return { floatingStyles, floatingContext, handleTriggerRef, floatingInnerRef, floatingNodeRef };
|
|
52
|
+
};
|
|
53
|
+
export {
|
|
54
|
+
usePaginatorFloatingContext
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=usePaginatorFloatingContext.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/parts/DSPaginator/config/usePaginatorFloatingContext.ts"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { useFloatingContext, type DSHookFloatingContextT } from '@elliemae/ds-floating-context';\nimport type React from 'react';\nimport { useCallback, useMemo, useRef } from 'react';\n\ntype FloatingContextConfigT = {\n isOpen: boolean;\n setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;\n triggerRef: React.MutableRefObject<HTMLButtonElement | null>;\n trackFocusRegionReset: () => void;\n chevronWidth: number;\n};\n\n/**\n * The single point that wires DSPaginator to `useFloatingContext` (same shape as ds-app-picker's one).\n *\n * The open state is owned by the component, so the floating context is \"controlled\" by it\n * (`externallyControlledIsOpen`) and this hook only translates the closing intents of the floating context into it:\n * - scoped Escape: the floating context routes it to `onEscape` and, because `returnFocusToReference` is on, it also\n * returns the focus to the trigger. This is the ONLY close path where the floating context moves the focus.\n * - click outside (panel + trigger): closes, the focus stays where the user clicked.\n * The other close paths (activation, Tab, trigger toggle) live in usePaginatorInteractions.\n */\nexport const usePaginatorFloatingContext = ({\n isOpen,\n setIsOpen,\n triggerRef,\n trackFocusRegionReset,\n chevronWidth,\n}: FloatingContextConfigT) => {\n const floatingNodeRef = useRef<HTMLDivElement | null>(null);\n\n const handleClickOutside = useCallback(() => {\n setIsOpen(false);\n trackFocusRegionReset();\n }, [setIsOpen, trackFocusRegionReset]);\n\n const handleScopedEscape = useCallback(() => {\n setIsOpen(false);\n trackFocusRegionReset();\n }, [setIsOpen, trackFocusRegionReset]);\n\n const floatingContextConfig = useMemo(\n () =>\n ({\n // the existing DSPaginator opens upwards (it lives in a footer) and aligns the selected page with the trigger\n placement: 'top-start',\n placementOrderPreference: ['top-start', 'bottom-start'],\n customOffset: [-(chevronWidth + 7), 2],\n externallyControlledIsOpen: isOpen,\n withoutAnimation: true,\n onClickOutside: handleClickOutside,\n closeOnEscape: true,\n onEscape: handleScopedEscape,\n returnFocusToReference: true,\n externalReferenceElement: triggerRef.current,\n }) as DSHookFloatingContextT.Props,\n [chevronWidth, handleClickOutside, handleScopedEscape, isOpen, triggerRef],\n );\n\n const { refs: floatingRefs, floatingStyles, context: floatingContext } = useFloatingContext(floatingContextConfig);\n\n const handleTriggerRef = useCallback<React.RefCallback<HTMLButtonElement>>(\n (node) => {\n // eslint-disable-next-line no-param-reassign\n triggerRef.current = node;\n floatingRefs.setReference(node);\n },\n [floatingRefs, triggerRef],\n );\n\n const floatingInnerRef = useCallback<React.RefCallback<HTMLDivElement>>(\n (node) => {\n floatingNodeRef.current = node;\n (floatingRefs.setFloating as React.RefCallback<HTMLDivElement>)(node);\n },\n [floatingRefs.setFloating],\n );\n\n return { floatingStyles, floatingContext, handleTriggerRef, floatingInnerRef, floatingNodeRef };\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,0BAAuD;AAEhE,SAAS,aAAa,SAAS,cAAc;AAoBtC,MAAM,8BAA8B,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA8B;AAC5B,QAAM,kBAAkB,OAA8B,IAAI;AAE1D,QAAM,qBAAqB,YAAY,MAAM;AAC3C,cAAU,KAAK;AACf,0BAAsB;AAAA,EACxB,GAAG,CAAC,WAAW,qBAAqB,CAAC;AAErC,QAAM,qBAAqB,YAAY,MAAM;AAC3C,cAAU,KAAK;AACf,0BAAsB;AAAA,EACxB,GAAG,CAAC,WAAW,qBAAqB,CAAC;AAErC,QAAM,wBAAwB;AAAA,IAC5B,OACG;AAAA;AAAA,MAEC,WAAW;AAAA,MACX,0BAA0B,CAAC,aAAa,cAAc;AAAA,MACtD,cAAc,CAAC,EAAE,eAAe,IAAI,CAAC;AAAA,MACrC,4BAA4B;AAAA,MAC5B,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,UAAU;AAAA,MACV,wBAAwB;AAAA,MACxB,0BAA0B,WAAW;AAAA,IACvC;AAAA,IACF,CAAC,cAAc,oBAAoB,oBAAoB,QAAQ,UAAU;AAAA,EAC3E;AAEA,QAAM,EAAE,MAAM,cAAc,gBAAgB,SAAS,gBAAgB,IAAI,mBAAmB,qBAAqB;AAEjH,QAAM,mBAAmB;AAAA,IACvB,CAAC,SAAS;AAER,iBAAW,UAAU;AACrB,mBAAa,aAAa,IAAI;AAAA,IAChC;AAAA,IACA,CAAC,cAAc,UAAU;AAAA,EAC3B;AAEA,QAAM,mBAAmB;AAAA,IACvB,CAAC,SAAS;AACR,sBAAgB,UAAU;AAC1B,MAAC,aAAa,YAAkD,IAAI;AAAA,IACtE;AAAA,IACA,CAAC,aAAa,WAAW;AAAA,EAC3B;AAEA,SAAO,EAAE,gBAAgB,iBAAiB,kBAAkB,kBAAkB,gBAAgB;AAChG;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useCallback, useMemo, useRef } from "react";
|
|
3
|
+
import { PAGINATOR_TYPEAHEAD_RESET_MS } from "../constants/index.js";
|
|
4
|
+
import { NAVIGATION_KEYS } from "./navigationKeys.js";
|
|
5
|
+
const DIGIT_REGEXP = /^[0-9]$/;
|
|
6
|
+
const usePaginatorInteractions = ({
|
|
7
|
+
propsWithDefault,
|
|
8
|
+
globalAttributes,
|
|
9
|
+
isOpen,
|
|
10
|
+
setIsOpen,
|
|
11
|
+
amountOfPages,
|
|
12
|
+
focusTrackers,
|
|
13
|
+
triggerRef,
|
|
14
|
+
floatingNodeRef,
|
|
15
|
+
listActionRef
|
|
16
|
+
}) => {
|
|
17
|
+
const { pageIndex, pageCount, onPageChange } = propsWithDefault;
|
|
18
|
+
const {
|
|
19
|
+
focusedPage,
|
|
20
|
+
clampPage,
|
|
21
|
+
trackFocusOption,
|
|
22
|
+
trackFocusSelectedOption,
|
|
23
|
+
trackFocusTrigger,
|
|
24
|
+
trackFocusRegionReset
|
|
25
|
+
} = focusTrackers;
|
|
26
|
+
const typeaheadRef = useRef({ buffer: "", lastKeyTimestamp: 0 });
|
|
27
|
+
const moveFocusToPage = useCallback(
|
|
28
|
+
(page) => {
|
|
29
|
+
const targetPage = clampPage(page);
|
|
30
|
+
trackFocusOption(targetPage);
|
|
31
|
+
listActionRef.current.scrollTo?.(targetPage - 1, { align: "auto" });
|
|
32
|
+
},
|
|
33
|
+
[clampPage, listActionRef, trackFocusOption]
|
|
34
|
+
);
|
|
35
|
+
const commitPage = useCallback(
|
|
36
|
+
(page) => {
|
|
37
|
+
if (page !== pageIndex) onPageChange(page);
|
|
38
|
+
setIsOpen(false);
|
|
39
|
+
trackFocusTrigger();
|
|
40
|
+
},
|
|
41
|
+
[onPageChange, pageIndex, setIsOpen, trackFocusTrigger]
|
|
42
|
+
);
|
|
43
|
+
const handleTriggerClick = useCallback(
|
|
44
|
+
(e) => {
|
|
45
|
+
globalAttributes.onClick?.(e);
|
|
46
|
+
if (isOpen) {
|
|
47
|
+
setIsOpen(false);
|
|
48
|
+
trackFocusTrigger();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (amountOfPages === 0) return;
|
|
52
|
+
setIsOpen(true);
|
|
53
|
+
trackFocusSelectedOption();
|
|
54
|
+
},
|
|
55
|
+
[amountOfPages, globalAttributes.onClick, isOpen, setIsOpen, trackFocusSelectedOption, trackFocusTrigger]
|
|
56
|
+
);
|
|
57
|
+
const handleTriggerKeyDown = useCallback(
|
|
58
|
+
(e) => {
|
|
59
|
+
globalAttributes.onKeyDown?.(e);
|
|
60
|
+
if (e.key !== "ArrowDown" && e.key !== "ArrowUp") return;
|
|
61
|
+
if (isOpen || amountOfPages === 0) return;
|
|
62
|
+
e.preventDefault();
|
|
63
|
+
setIsOpen(true);
|
|
64
|
+
trackFocusSelectedOption();
|
|
65
|
+
},
|
|
66
|
+
[amountOfPages, globalAttributes.onKeyDown, isOpen, setIsOpen, trackFocusSelectedOption]
|
|
67
|
+
);
|
|
68
|
+
const handlePanelKeyDownCapture = useCallback(
|
|
69
|
+
(e) => {
|
|
70
|
+
if (e.key !== "Tab") return;
|
|
71
|
+
triggerRef.current?.focus();
|
|
72
|
+
trackFocusRegionReset();
|
|
73
|
+
if (focusedPage !== null && focusedPage !== pageIndex) onPageChange(focusedPage);
|
|
74
|
+
setIsOpen(false);
|
|
75
|
+
},
|
|
76
|
+
[focusedPage, onPageChange, pageIndex, setIsOpen, trackFocusRegionReset, triggerRef]
|
|
77
|
+
);
|
|
78
|
+
const handleDigitTypeahead = useCallback(
|
|
79
|
+
(digit) => {
|
|
80
|
+
if (typeof pageCount === "string") return;
|
|
81
|
+
const now = Date.now();
|
|
82
|
+
const typeahead = typeaheadRef.current;
|
|
83
|
+
if (now - typeahead.lastKeyTimestamp > PAGINATOR_TYPEAHEAD_RESET_MS) typeahead.buffer = "";
|
|
84
|
+
typeahead.buffer += digit;
|
|
85
|
+
typeahead.lastKeyTimestamp = now;
|
|
86
|
+
const targetPage = Number.parseInt(typeahead.buffer, 10);
|
|
87
|
+
if (targetPage >= 1 && targetPage <= amountOfPages) moveFocusToPage(targetPage);
|
|
88
|
+
},
|
|
89
|
+
[amountOfPages, moveFocusToPage, pageCount]
|
|
90
|
+
);
|
|
91
|
+
const handlePanelKeyDown = useCallback(
|
|
92
|
+
(e) => {
|
|
93
|
+
if (e.ctrlKey || e.metaKey || e.altKey) return;
|
|
94
|
+
const getTargetPage = NAVIGATION_KEYS[e.key];
|
|
95
|
+
if (getTargetPage) {
|
|
96
|
+
e.preventDefault();
|
|
97
|
+
moveFocusToPage(getTargetPage(focusedPage ?? pageIndex, amountOfPages));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
101
|
+
e.preventDefault();
|
|
102
|
+
if (focusedPage !== null) commitPage(focusedPage);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (DIGIT_REGEXP.test(e.key)) handleDigitTypeahead(e.key);
|
|
106
|
+
},
|
|
107
|
+
[amountOfPages, commitPage, focusedPage, handleDigitTypeahead, moveFocusToPage, pageIndex]
|
|
108
|
+
);
|
|
109
|
+
const handleBlurOutOfWidget = useCallback(
|
|
110
|
+
(e) => {
|
|
111
|
+
const nextFocused = e.relatedTarget;
|
|
112
|
+
if (!nextFocused) return;
|
|
113
|
+
if (triggerRef.current?.contains(nextFocused) || floatingNodeRef.current?.contains(nextFocused)) return;
|
|
114
|
+
trackFocusRegionReset();
|
|
115
|
+
},
|
|
116
|
+
[floatingNodeRef, trackFocusRegionReset, triggerRef]
|
|
117
|
+
);
|
|
118
|
+
return useMemo(
|
|
119
|
+
() => ({
|
|
120
|
+
commitPage,
|
|
121
|
+
handleTriggerClick,
|
|
122
|
+
handleTriggerKeyDown,
|
|
123
|
+
handlePanelKeyDown,
|
|
124
|
+
handlePanelKeyDownCapture,
|
|
125
|
+
handleBlurOutOfWidget
|
|
126
|
+
}),
|
|
127
|
+
[
|
|
128
|
+
commitPage,
|
|
129
|
+
handleTriggerClick,
|
|
130
|
+
handleTriggerKeyDown,
|
|
131
|
+
handlePanelKeyDown,
|
|
132
|
+
handlePanelKeyDownCapture,
|
|
133
|
+
handleBlurOutOfWidget
|
|
134
|
+
]
|
|
135
|
+
);
|
|
136
|
+
};
|
|
137
|
+
export {
|
|
138
|
+
usePaginatorInteractions
|
|
139
|
+
};
|
|
140
|
+
//# sourceMappingURL=usePaginatorInteractions.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/parts/DSPaginator/config/usePaginatorInteractions.ts"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import type { DSFastListT } from '@elliemae/ds-fast-list';\nimport type React from 'react';\nimport { useCallback, useMemo, useRef } from 'react';\nimport { PAGINATOR_TYPEAHEAD_RESET_MS } from '../constants/index.js';\nimport { NAVIGATION_KEYS } from './navigationKeys.js';\nimport type { DSPaginatorT } from '../react-desc-prop-types.js';\nimport type { useFocusTracker } from './useFocusTracker.js';\n\ntype InteractionsConfigT = {\n propsWithDefault: DSPaginatorT.InternalProps;\n globalAttributes: { onClick?: unknown; onKeyDown?: unknown };\n isOpen: boolean;\n setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;\n amountOfPages: number;\n focusTrackers: ReturnType<typeof useFocusTracker>;\n triggerRef: React.MutableRefObject<HTMLButtonElement | null>;\n floatingNodeRef: React.MutableRefObject<HTMLDivElement | null>;\n listActionRef: React.MutableRefObject<DSFastListT.ActionRef>;\n};\n\nconst DIGIT_REGEXP = /^[0-9]$/;\n\n/**\n * Every user intent on the trigger and on the list. The selection model is the one of a native select:\n * - moving through the options (arrows, Home/End, PageUp/PageDown, typing a page number) only moves the focus:\n * `onPageChange` is NOT invoked while navigating, because committing a page is a costly side effect for a paginator\n * - Enter, Space or a click on an option commits it, closes the list and returns the focus to the trigger\n * - Tab (and Shift+Tab) commits the focused option, closes the list and continues from the trigger\n * - Escape (see usePaginatorFloatingContext) and click outside close without committing\n * Handlers only declare focus intents through the focus tracker (see useFocusTracker), with ONE documented exception:\n * Tab (see handlePanelKeyDownCapture).\n */\nexport const usePaginatorInteractions = ({\n propsWithDefault,\n globalAttributes,\n isOpen,\n setIsOpen,\n amountOfPages,\n focusTrackers,\n triggerRef,\n floatingNodeRef,\n listActionRef,\n}: InteractionsConfigT) => {\n const { pageIndex, pageCount, onPageChange } = propsWithDefault;\n const {\n focusedPage,\n clampPage,\n trackFocusOption,\n trackFocusSelectedOption,\n trackFocusTrigger,\n trackFocusRegionReset,\n } = focusTrackers;\n const typeaheadRef = useRef({ buffer: '', lastKeyTimestamp: 0 });\n\n // the target option may not be mounted (virtualized): the focus intent is declared, the list is scrolled to it and\n // the option focuses itself from its ref callback as soon as it mounts\n const moveFocusToPage = useCallback(\n (page: number) => {\n const targetPage = clampPage(page);\n trackFocusOption(targetPage);\n listActionRef.current.scrollTo?.(targetPage - 1, { align: 'auto' });\n },\n [clampPage, listActionRef, trackFocusOption],\n );\n\n const commitPage = useCallback(\n (page: number) => {\n if (page !== pageIndex) onPageChange(page);\n setIsOpen(false);\n trackFocusTrigger();\n },\n [onPageChange, pageIndex, setIsOpen, trackFocusTrigger],\n );\n\n const handleTriggerClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>) => {\n (globalAttributes.onClick as ((event: typeof e) => void) | undefined)?.(e);\n if (isOpen) {\n setIsOpen(false);\n trackFocusTrigger();\n return;\n }\n if (amountOfPages === 0) return;\n setIsOpen(true);\n trackFocusSelectedOption();\n },\n [amountOfPages, globalAttributes.onClick, isOpen, setIsOpen, trackFocusSelectedOption, trackFocusTrigger],\n );\n\n // ArrowDown / ArrowUp on the trigger open the list (same as the select-only combobox and the menu button patterns)\n // Enter and Space are not handled here: the trigger is a native button and they arrive as a click\n const handleTriggerKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n (globalAttributes.onKeyDown as React.KeyboardEventHandler<HTMLButtonElement> | undefined)?.(e);\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return;\n if (isOpen || amountOfPages === 0) return;\n e.preventDefault();\n setIsOpen(true);\n trackFocusSelectedOption();\n },\n [amountOfPages, globalAttributes.onKeyDown, isOpen, setIsOpen, trackFocusSelectedOption],\n );\n\n /*\n * Tab is handled in the CAPTURE phase and moves the focus from the handler: the one exception to \"the ref callbacks\n * are the only place that calls .focus()\". Tab has a browser default action that runs right after the keydown\n * handlers return and moves the focus from wherever it IS at that moment. The panel is portaled, so from an option\n * the default would continue after the portal, not after the trigger: the trigger must hold the focus BEFORE the\n * default runs, and a post-commit mechanism (tracker -> render -> ref callback) can never be ahead of it.\n * Same decision as ds-menu-button's `handleMenuTabKeyDownCapture` (see its KNOWN_INTENTIONAL_DEVIATIONS.md).\n * The tracker is reset (\"nothing to focus\") so nothing can steal the focus back.\n */\n const handlePanelKeyDownCapture = useCallback(\n (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.key !== 'Tab') return;\n triggerRef.current?.focus();\n trackFocusRegionReset();\n if (focusedPage !== null && focusedPage !== pageIndex) onPageChange(focusedPage);\n setIsOpen(false);\n },\n [focusedPage, onPageChange, pageIndex, setIsOpen, trackFocusRegionReset, triggerRef],\n );\n\n const handleDigitTypeahead = useCallback(\n (digit: string) => {\n // an unknown page count (string) only exposes the pages up to the next one: nothing meaningful to type\n if (typeof pageCount === 'string') return;\n const now = Date.now();\n const typeahead = typeaheadRef.current;\n if (now - typeahead.lastKeyTimestamp > PAGINATOR_TYPEAHEAD_RESET_MS) typeahead.buffer = '';\n typeahead.buffer += digit;\n typeahead.lastKeyTimestamp = now;\n const targetPage = Number.parseInt(typeahead.buffer, 10);\n if (targetPage >= 1 && targetPage <= amountOfPages) moveFocusToPage(targetPage);\n },\n [amountOfPages, moveFocusToPage, pageCount],\n );\n\n const handlePanelKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.ctrlKey || e.metaKey || e.altKey) return;\n const getTargetPage = NAVIGATION_KEYS[e.key];\n if (getTargetPage) {\n e.preventDefault(); // the list scrolls through the virtualizer, not through the browser\n moveFocusToPage(getTargetPage(focusedPage ?? pageIndex, amountOfPages));\n return;\n }\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (focusedPage !== null) commitPage(focusedPage);\n return;\n }\n if (DIGIT_REGEXP.test(e.key)) handleDigitTypeahead(e.key);\n },\n [amountOfPages, commitPage, focusedPage, handleDigitTypeahead, moveFocusToPage, pageIndex],\n );\n\n /*\n * The tracker resets when the focus leaves the whole widget (trigger + portaled panel), not on every blur:\n * - a blur with no `relatedTarget` is ambiguous (the focused option unmounted because the list scrolled, the\n * window lost focus...) and must NOT reset, or an option that is about to mount for a pending focus intent\n * would find the intent erased\n * - a blur towards the trigger or the panel is internal\n */\n const handleBlurOutOfWidget = useCallback(\n (e: React.FocusEvent<HTMLElement>) => {\n const nextFocused = e.relatedTarget as Node | null;\n if (!nextFocused) return;\n if (triggerRef.current?.contains(nextFocused) || floatingNodeRef.current?.contains(nextFocused)) return;\n trackFocusRegionReset();\n },\n [floatingNodeRef, trackFocusRegionReset, triggerRef],\n );\n\n return useMemo(\n () => ({\n commitPage,\n handleTriggerClick,\n handleTriggerKeyDown,\n handlePanelKeyDown,\n handlePanelKeyDownCapture,\n handleBlurOutOfWidget,\n }),\n [\n commitPage,\n handleTriggerClick,\n handleTriggerKeyDown,\n handlePanelKeyDown,\n handlePanelKeyDownCapture,\n handleBlurOutOfWidget,\n ],\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|