@elliemae/ds-pagination 3.57.0-next.40 → 3.57.0-next.41

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.
Files changed (56) hide show
  1. package/dist/cjs/parts/DSPageNextButton/DSPageNextButton.js +1 -1
  2. package/dist/cjs/parts/DSPageNextButton/DSPageNextButton.js.map +1 -1
  3. package/dist/cjs/parts/DSPagePrevButton/DSPagePrevButton.js +1 -1
  4. package/dist/cjs/parts/DSPagePrevButton/DSPagePrevButton.js.map +1 -1
  5. package/dist/cjs/parts/DSPaginationContainer/DSPaginationContainer.js +1 -1
  6. package/dist/cjs/parts/DSPaginationContainer/DSPaginationContainer.js.map +1 -1
  7. package/dist/cjs/parts/DSPaginator/DSPaginator.js +86 -17
  8. package/dist/cjs/parts/DSPaginator/DSPaginator.js.map +3 -3
  9. package/dist/cjs/parts/DSPaginator/config/createPaginatorHeader.js +5 -4
  10. package/dist/cjs/parts/DSPaginator/config/createPaginatorHeader.js.map +2 -2
  11. package/dist/cjs/parts/DSPaginator/config/getOptions.js +4 -4
  12. package/dist/cjs/parts/DSPaginator/config/getOptions.js.map +2 -2
  13. package/dist/cjs/parts/DSPaginator/config/usePaginator.js +17 -18
  14. package/dist/cjs/parts/DSPaginator/config/usePaginator.js.map +2 -2
  15. package/dist/cjs/parts/DSPaginator/styled.js +42 -2
  16. package/dist/cjs/parts/DSPaginator/styled.js.map +3 -3
  17. package/dist/cjs/parts/DSPerPageSelector/DSPerPageSelector.js +24 -8
  18. package/dist/cjs/parts/DSPerPageSelector/DSPerPageSelector.js.map +2 -2
  19. package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelector.js +6 -6
  20. package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelector.js.map +2 -2
  21. package/dist/cjs/parts/DSPerPageSelector/styled.js +29 -2
  22. package/dist/cjs/parts/DSPerPageSelector/styled.js.map +2 -2
  23. package/dist/cjs/parts/{DSPaginator/config → shared}/useOnElementOnResize.js.map +1 -1
  24. package/dist/esm/parts/DSPageNextButton/DSPageNextButton.js +1 -1
  25. package/dist/esm/parts/DSPageNextButton/DSPageNextButton.js.map +1 -1
  26. package/dist/esm/parts/DSPagePrevButton/DSPagePrevButton.js +1 -1
  27. package/dist/esm/parts/DSPagePrevButton/DSPagePrevButton.js.map +1 -1
  28. package/dist/esm/parts/DSPaginationContainer/DSPaginationContainer.js +1 -1
  29. package/dist/esm/parts/DSPaginationContainer/DSPaginationContainer.js.map +1 -1
  30. package/dist/esm/parts/DSPaginator/DSPaginator.js +87 -18
  31. package/dist/esm/parts/DSPaginator/DSPaginator.js.map +3 -3
  32. package/dist/esm/parts/DSPaginator/config/createPaginatorHeader.js +6 -5
  33. package/dist/esm/parts/DSPaginator/config/createPaginatorHeader.js.map +2 -2
  34. package/dist/esm/parts/DSPaginator/config/getOptions.js +4 -4
  35. package/dist/esm/parts/DSPaginator/config/getOptions.js.map +2 -2
  36. package/dist/esm/parts/DSPaginator/config/usePaginator.js +18 -19
  37. package/dist/esm/parts/DSPaginator/config/usePaginator.js.map +2 -2
  38. package/dist/esm/parts/DSPaginator/styled.js +42 -2
  39. package/dist/esm/parts/DSPaginator/styled.js.map +2 -2
  40. package/dist/esm/parts/DSPerPageSelector/DSPerPageSelector.js +26 -10
  41. package/dist/esm/parts/DSPerPageSelector/DSPerPageSelector.js.map +2 -2
  42. package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelector.js +6 -6
  43. package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelector.js.map +2 -2
  44. package/dist/esm/parts/DSPerPageSelector/styled.js +29 -2
  45. package/dist/esm/parts/DSPerPageSelector/styled.js.map +2 -2
  46. package/dist/esm/parts/{DSPaginator/config → shared}/useOnElementOnResize.js.map +1 -1
  47. package/dist/types/parts/DSPaginator/config/createPaginatorHeader.d.ts +2 -1
  48. package/dist/types/parts/DSPaginator/config/getOptions.d.ts +1 -0
  49. package/dist/types/parts/DSPaginator/config/usePaginator.d.ts +4 -0
  50. package/dist/types/parts/DSPaginator/styled.d.ts +2 -0
  51. package/dist/types/parts/DSPerPageSelector/config/usePerPageSelector.d.ts +2 -1
  52. package/dist/types/parts/DSPerPageSelector/styled.d.ts +1 -0
  53. package/package.json +13 -13
  54. /package/dist/cjs/parts/{DSPaginator/config → shared}/useOnElementOnResize.js +0 -0
  55. /package/dist/esm/parts/{DSPaginator/config → shared}/useOnElementOnResize.js +0 -0
  56. /package/dist/types/parts/{DSPaginator/config → shared}/useOnElementOnResize.d.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/parts/DSPaginator/styled.tsx", "../../../../../../../scripts/build/transpile/react-shim.js"],
4
- "sourcesContent": ["import { DSButtonV3 } from '@elliemae/ds-button-v2';\n\nimport { css, styled } from '@elliemae/ds-system';\nimport type {} from '@xstyled/system';\nimport { DSPaginationName, PAGINATOR_SLOTS } from './constants/index.js';\n\nconst styledFocusCss = css`\n &:after {\n display: block;\n content: ' ';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid ${({ theme }) => theme.colors.brand[700]};\n pointer-events: none;\n z-index: 7;\n }\n`;\n\nexport const InvisibleDiv = styled.div`\n opacity: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: absolute;\n`;\n\nconst paginationDropdownButtonCommonStyles = css`\n height: 42px;\n display: grid;\n grid-auto-flow: column;\n justify-content: center;\n align-items: center;\n position: relative;\n padding-left: 16px;\n padding-right: 16px;\n grid-gap: 8px;\n font-size: 13px;\n color: neutral-700;\n cursor: pointer;\n border-radius: 0;\n font-weight: ${(props) => props.theme.fontWeights.regular};\n :focus {\n ${styledFocusCss}\n }\n &[aria-disabled='true'] {\n cursor: not-allowed;\n }\n white-space: nowrap;\n`;\nexport const PaginationDropdownButtonPaginator = styled(DSButtonV3, {\n name: DSPaginationName,\n slot: PAGINATOR_SLOTS.PAGINATOR,\n preserveLegacyDataTestId: true,\n})`\n ${paginationDropdownButtonCommonStyles}\n`;\n", "import * as React from 'react';\nexport { React };\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADAvB,0BAA2B;AAE3B,uBAA4B;AAE5B,uBAAkD;AAElD,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBASC,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAMvD,MAAM,eAAe,wBAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQnC,MAAM,uCAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAc5B,CAAC,UAAU,MAAM,MAAM,YAAY,OAAO;AAAA;AAAA,MAErD,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOb,MAAM,wCAAoC,yBAAO,gCAAY;AAAA,EAClE,MAAM;AAAA,EACN,MAAM,iCAAgB;AAAA,EACtB,0BAA0B;AAC5B,CAAC;AAAA,IACG,oCAAoC;AAAA;",
6
- "names": []
4
+ "sourcesContent": ["import { DSButtonV3 } from '@elliemae/ds-button-v2';\n\nimport { DSDropdownMenuV2 } from '@elliemae/ds-dropdownmenu-v2';\nimport Grid from '@elliemae/ds-grid';\nimport { css, styled } from '@elliemae/ds-system';\nimport type {} from '@xstyled/system';\nimport { DSPaginationName, PAGINATOR_SLOTS } from './constants/index.js';\n\nconst fontSize13Base13 = 13 / 13;\nconst fontSize13Base16 = 13 / 16;\nconst fontSize18Base13 = 18 / 13;\nconst fontSize18Base16 = 18 / 16;\nconst fontSize12Base13 = 12 / 13;\nconst fontSize12Base16 = 12 / 16;\n\nconst styledFocusCss = css`\n &:after {\n display: block;\n content: ' ';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid ${({ theme }) => theme.colors.brand[700]};\n pointer-events: none;\n z-index: 7;\n }\n`;\n\nexport const InvisibleDiv = styled.div`\n opacity: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: absolute;\n`;\n\nconst paginationDropdownButtonCommonStyles = css`\n min-height: 42px;\n display: grid;\n grid-auto-flow: column;\n justify-content: center;\n align-items: center;\n position: relative;\n padding-left: 16px;\n padding-right: 16px;\n grid-gap: 8px;\n font-size: 13px;\n color: neutral-700;\n cursor: pointer;\n border-radius: 0;\n font-weight: ${(props) => props.theme.fontWeights.regular};\n :focus {\n ${styledFocusCss}\n }\n &[aria-disabled='true'] {\n cursor: not-allowed;\n }\n white-space: nowrap;\n`;\nexport const PaginationDropdownButtonPaginator = styled(DSButtonV3, {\n name: DSPaginationName,\n slot: PAGINATOR_SLOTS.PAGINATOR,\n preserveLegacyDataTestId: true,\n})`\n ${paginationDropdownButtonCommonStyles}\n`;\n\nexport const StyledDropdown = styled(DSDropdownMenuV2)`\n /**\n * Pagination uses DSTypography internally, but each typography variant defines\n * its own font-size. When these components are placed inside a styled() wrapper,\n * trying to style them via styled(DSTypography) triggers TypeScript errors\n * because DSTypography exposes \"as\" props and variant-specific overrides.\n *\n * Instead of wrapping DSTypography directly in styled(), we target the\n * underlying rendered elements via className/id. This avoids the TS conflicts\n * while still allowing us to override their font-size reliably.\n */\n #typography-page-index {\n font-size: ${fontSize18Base16}rem;\n @media (min-width: ${({ theme }) => theme.breakpoints.small}) {\n font-size: ${fontSize18Base13}rem;\n }\n }\n .typography-page-info-and-detail {\n font-size: ${fontSize13Base16}rem;\n @media (min-width: ${({ theme }) => theme.breakpoints.small}) {\n font-size: ${fontSize13Base13}rem;\n }\n }\n`;\nexport const StyledHeader = styled(Grid)`\n font-size: ${fontSize12Base16}rem;\n @media (min-width: ${({ theme }) => theme.breakpoints.small}) {\n font-size: ${fontSize12Base13}rem;\n }\n`;\n", "import * as React from 'react';\nexport { React };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADAvB,0BAA2B;AAE3B,gCAAiC;AACjC,qBAAiB;AACjB,uBAA4B;AAE5B,uBAAkD;AAElD,MAAM,mBAAmB,KAAK;AAC9B,MAAM,mBAAmB,KAAK;AAC9B,MAAM,mBAAmB,KAAK;AAC9B,MAAM,mBAAmB,KAAK;AAC9B,MAAM,mBAAmB,KAAK;AAC9B,MAAM,mBAAmB,KAAK;AAE9B,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBASC,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAMvD,MAAM,eAAe,wBAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQnC,MAAM,uCAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAc5B,CAAC,UAAU,MAAM,MAAM,YAAY,OAAO;AAAA;AAAA,MAErD,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOb,MAAM,wCAAoC,yBAAO,gCAAY;AAAA,EAClE,MAAM;AAAA,EACN,MAAM,iCAAgB;AAAA,EACtB,0BAA0B;AAC5B,CAAC;AAAA,IACG,oCAAoC;AAAA;AAGjC,MAAM,qBAAiB,yBAAO,0CAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAYpC,gBAAgB;AAAA,yBACR,CAAC,EAAE,MAAM,MAAM,MAAM,YAAY,KAAK;AAAA,mBAC5C,gBAAgB;AAAA;AAAA;AAAA;AAAA,iBAIlB,gBAAgB;AAAA,yBACR,CAAC,EAAE,MAAM,MAAM,MAAM,YAAY,KAAK;AAAA,mBAC5C,gBAAgB;AAAA;AAAA;AAAA;AAI5B,MAAM,mBAAe,yBAAO,eAAAA,OAAI;AAAA,eACxB,gBAAgB;AAAA,uBACR,CAAC,EAAE,MAAM,MAAM,MAAM,YAAY,KAAK;AAAA,iBAC5C,gBAAgB;AAAA;AAAA;",
6
+ "names": ["Grid"]
7
7
  }
@@ -34,15 +34,16 @@ __export(DSPerPageSelector_exports, {
34
34
  module.exports = __toCommonJS(DSPerPageSelector_exports);
35
35
  var React = __toESM(require("react"));
36
36
  var import_jsx_runtime = require("react/jsx-runtime");
37
- var import_react = require("react");
38
37
  var import_ds_dropdownmenu_v2 = require("@elliemae/ds-dropdownmenu-v2");
39
38
  var import_ds_icons = require("@elliemae/ds-icons");
40
39
  var import_ds_props_helpers = require("@elliemae/ds-props-helpers");
40
+ var import_ds_typography = require("@elliemae/ds-typography");
41
+ var import_react = require("react");
41
42
  var import_usePerPageSelector = require("./config/usePerPageSelector.js");
42
43
  var import_constants = require("./constants/index.js");
43
44
  var import_react_desc_prop_types = require("./react-desc-prop-types.js");
44
45
  var import_styled = require("./styled.js");
45
- const Header = () => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: "Per Page" });
46
+ const Header = () => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_styled.StyledHeader, { children: "Per Page" });
46
47
  const DSPerPageSelector = (props) => {
47
48
  const {
48
49
  propsWithDefault: { pageSize, onPageSizeChange },
@@ -51,7 +52,8 @@ const DSPerPageSelector = (props) => {
51
52
  ownerPropsConfig,
52
53
  actionRef,
53
54
  btnRef,
54
- width,
55
+ chevronRef,
56
+ chevronWidth,
55
57
  isOpened,
56
58
  options,
57
59
  setIsOpened
@@ -60,6 +62,10 @@ const DSPerPageSelector = (props) => {
60
62
  if (globalAttributes.onClick) return globalAttributes.onClick;
61
63
  return () => setIsOpened((prev) => !prev);
62
64
  }, [globalAttributes.onClick, setIsOpened]);
65
+ const maxOptionsLength = (0, import_react.useMemo)(() => {
66
+ const maxLength = options.reduce((acc, cur) => Math.max(acc, ("label" in cur ? cur.label : "").length), 0);
67
+ return maxLength;
68
+ }, [options]);
63
69
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
64
70
  import_ds_dropdownmenu_v2.DSDropdownMenuV2,
65
71
  {
@@ -75,10 +81,10 @@ const DSPerPageSelector = (props) => {
75
81
  setIsOpened(false);
76
82
  btnRef.current?.focus();
77
83
  },
78
- customOffset: [-23, 2],
84
+ customOffset: [-(chevronWidth + 7), 2],
79
85
  startPlacementPreference: "top-start",
80
86
  actionRef,
81
- minWidth: width,
87
+ minWidth: `calc(${chevronWidth + 60}px + ${maxOptionsLength}ch)`,
82
88
  maxHeight: 300,
83
89
  HeaderComp: Header,
84
90
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
@@ -94,9 +100,19 @@ const DSPerPageSelector = (props) => {
94
100
  ...ownerPropsConfig,
95
101
  onClick: buttonOnClick,
96
102
  children: [
97
- pageSize,
98
- " / page",
99
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ds_icons.ChevronDown, { color: ["brand-primary", "700"] })
103
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
104
+ import_ds_typography.DSTypography,
105
+ {
106
+ variant: "b1",
107
+ as: "span",
108
+ className: "typography-per-page-selector",
109
+ children: [
110
+ pageSize,
111
+ " / page"
112
+ ]
113
+ }
114
+ ),
115
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ds_icons.ChevronDown, { color: ["brand-primary", "700"], innerRef: chevronRef })
100
116
  ]
101
117
  }
102
118
  )
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/parts/DSPerPageSelector/DSPerPageSelector.tsx", "../../../../../../../scripts/build/transpile/react-shim.js"],
4
- "sourcesContent": ["import React, { useMemo } from 'react';\nimport type { DSButtonT } from '@elliemae/ds-button-v2';\nimport { DSDropdownMenuV2, type DSDropdownMenuT } from '@elliemae/ds-dropdownmenu-v2';\nimport { ChevronDown } from '@elliemae/ds-icons';\nimport { describe } from '@elliemae/ds-props-helpers';\nimport { usePerPageSelector } from './config/usePerPageSelector.js';\nimport { DSPerPageSelectorName, PER_PAGE_SELECTOR_DATA_TESTID } from './constants/index.js';\nimport { DSPerPageSelectorPropTypesSchema, type DSPerPageSelectorT } from './react-desc-prop-types.js';\nimport { PaginationDropdownButtonPerPageSelector } from './styled.js';\n\nconst Header = () => <>Per Page</>;\n\nconst DSPerPageSelector: React.ComponentType<DSPerPageSelectorT.Props> = (props) => {\n const {\n propsWithDefault: { pageSize, onPageSizeChange },\n xstyledProps,\n globalAttributes,\n ownerPropsConfig,\n actionRef,\n btnRef,\n width,\n isOpened,\n options,\n setIsOpened,\n } = usePerPageSelector(props);\n const buttonOnClick: DSButtonT.Props['onClick'] = useMemo(() => {\n if (globalAttributes.onClick) return globalAttributes.onClick as DSButtonT.Props['onClick'];\n return () => setIsOpened((prev) => !prev);\n }, [globalAttributes.onClick, setIsOpened]);\n return (\n <DSDropdownMenuV2\n isOpened={isOpened}\n options={options}\n selectedOptions={{ [pageSize.toString()]: true }}\n onOptionClick={(_, clickedOption) => {\n onPageSizeChange((clickedOption as DSDropdownMenuT.ItemSingleOptions).value as number);\n setIsOpened(false);\n btnRef.current?.focus();\n }}\n onClickOutside={() => {\n setIsOpened(false);\n btnRef.current?.focus();\n }}\n customOffset={[-23, 2]}\n startPlacementPreference=\"top-start\"\n actionRef={actionRef}\n minWidth={width}\n maxHeight={300}\n HeaderComp={Header}\n >\n <PaginationDropdownButtonPerPageSelector\n buttonType=\"raw\"\n innerRef={btnRef}\n aria-pressed={isOpened}\n aria-label={`${pageSize} rows per page. Press to select rows per page`}\n data-testid={PER_PAGE_SELECTOR_DATA_TESTID.PER_PAGE_SELECTOR}\n {...globalAttributes}\n {...xstyledProps}\n {...ownerPropsConfig}\n onClick={buttonOnClick}\n >\n {pageSize} / page\n <ChevronDown color={['brand-primary', '700']} />\n </PaginationDropdownButtonPerPageSelector>\n </DSDropdownMenuV2>\n );\n};\n\nDSPerPageSelector.displayName = DSPerPageSelectorName;\nconst DSPerPageSelectorWithSchema = describe(DSPerPageSelector);\nDSPerPageSelectorWithSchema.propTypes = DSPerPageSelectorPropTypesSchema;\n\nexport { DSPerPageSelector, DSPerPageSelectorWithSchema };\n", "import * as React from 'react';\nexport { React };\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADUF;AAVrB,mBAA+B;AAE/B,gCAAuD;AACvD,sBAA4B;AAC5B,8BAAyB;AACzB,gCAAmC;AACnC,uBAAqE;AACrE,mCAA0E;AAC1E,oBAAwD;AAExD,MAAM,SAAS,MAAM,2EAAE,sBAAQ;AAE/B,MAAM,oBAAmE,CAAC,UAAU;AAClF,QAAM;AAAA,IACJ,kBAAkB,EAAE,UAAU,iBAAiB;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,QAAI,8CAAmB,KAAK;AAC5B,QAAM,oBAA4C,sBAAQ,MAAM;AAC9D,QAAI,iBAAiB,QAAS,QAAO,iBAAiB;AACtD,WAAO,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI;AAAA,EAC1C,GAAG,CAAC,iBAAiB,SAAS,WAAW,CAAC;AAC1C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,iBAAiB,EAAE,CAAC,SAAS,SAAS,CAAC,GAAG,KAAK;AAAA,MAC/C,eAAe,CAAC,GAAG,kBAAkB;AACnC,yBAAkB,cAAoD,KAAe;AACrF,oBAAY,KAAK;AACjB,eAAO,SAAS,MAAM;AAAA,MACxB;AAAA,MACA,gBAAgB,MAAM;AACpB,oBAAY,KAAK;AACjB,eAAO,SAAS,MAAM;AAAA,MACxB;AAAA,MACA,cAAc,CAAC,KAAK,CAAC;AAAA,MACrB,0BAAyB;AAAA,MACzB;AAAA,MACA,UAAU;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MAEZ;AAAA,QAAC;AAAA;AAAA,UACC,YAAW;AAAA,UACX,UAAU;AAAA,UACV,gBAAc;AAAA,UACd,cAAY,GAAG,QAAQ;AAAA,UACvB,eAAa,+CAA8B;AAAA,UAC1C,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACJ,SAAS;AAAA,UAER;AAAA;AAAA,YAAS;AAAA,YACV,4CAAC,+BAAY,OAAO,CAAC,iBAAiB,KAAK,GAAG;AAAA;AAAA;AAAA,MAChD;AAAA;AAAA,EACF;AAEJ;AAEA,kBAAkB,cAAc;AAChC,MAAM,kCAA8B,kCAAS,iBAAiB;AAC9D,4BAA4B,YAAY;",
4
+ "sourcesContent": ["import type { DSButtonT } from '@elliemae/ds-button-v2';\nimport { DSDropdownMenuV2, type DSDropdownMenuT } from '@elliemae/ds-dropdownmenu-v2';\nimport { ChevronDown } from '@elliemae/ds-icons';\nimport { describe } from '@elliemae/ds-props-helpers';\nimport { DSTypography } from '@elliemae/ds-typography';\nimport React, { useMemo } from 'react';\nimport { usePerPageSelector } from './config/usePerPageSelector.js';\nimport { DSPerPageSelectorName, PER_PAGE_SELECTOR_DATA_TESTID } from './constants/index.js';\nimport { DSPerPageSelectorPropTypesSchema, type DSPerPageSelectorT } from './react-desc-prop-types.js';\nimport { PaginationDropdownButtonPerPageSelector, StyledHeader } from './styled.js';\n\nconst Header = () => <StyledHeader>Per Page</StyledHeader>;\n\nconst DSPerPageSelector: React.ComponentType<DSPerPageSelectorT.Props> = (props) => {\n const {\n propsWithDefault: { pageSize, onPageSizeChange },\n xstyledProps,\n globalAttributes,\n ownerPropsConfig,\n actionRef,\n btnRef,\n chevronRef,\n chevronWidth,\n isOpened,\n options,\n setIsOpened,\n } = usePerPageSelector(props);\n const buttonOnClick: DSButtonT.Props['onClick'] = useMemo(() => {\n if (globalAttributes.onClick) return globalAttributes.onClick as DSButtonT.Props['onClick'];\n return () => setIsOpened((prev) => !prev);\n }, [globalAttributes.onClick, setIsOpened]);\n\n const maxOptionsLength = useMemo(() => {\n const maxLength = options.reduce((acc, cur) => Math.max(acc, ('label' in cur ? cur.label : '').length), 0);\n return maxLength;\n }, [options]);\n\n return (\n <DSDropdownMenuV2\n isOpened={isOpened}\n options={options}\n selectedOptions={{ [pageSize.toString()]: true }}\n onOptionClick={(_, clickedOption) => {\n onPageSizeChange((clickedOption as DSDropdownMenuT.ItemSingleOptions).value as number);\n setIsOpened(false);\n btnRef.current?.focus();\n }}\n onClickOutside={() => {\n setIsOpened(false);\n btnRef.current?.focus();\n }}\n customOffset={[-(chevronWidth + 7), 2]}\n startPlacementPreference=\"top-start\"\n actionRef={actionRef}\n /**\n * Calculate the dynamic minWidth for the Dropdown:\n *\n * Structure of the width:\n * 16px (left padding)\n * + chevronWidth (size of the chevron icon)\n * + 8px (spacing between chevron and text)\n * + maxOptionsLength ch (longest option label measured in characters)\n * + 16px (right padding)\n * + a small scrollbar placeholder (to avoid text wrapping when scrollbars appear)\n *\n * Why `calc()`?\n * - When using pure px values, the initial render works correctly.\n * - But when switching between different stories in Storybook \u2014 especially those\n * that modify font-size or typography scale \u2014 the measured width from the ref\n * becomes outdated and ends up returning a smaller value than it should.\n * - That incorrect (underestimated) width causes the longest option label to wrap,\n * even though there is actually enough space.\n *\n * By using `calc()` + `ch` units, the component stays responsive to font-size changes\n * without requiring an extra ref to measure the page size text width.\n */\n minWidth={`calc(${chevronWidth + 60}px + ${maxOptionsLength}ch)`}\n maxHeight={300}\n HeaderComp={Header}\n >\n <PaginationDropdownButtonPerPageSelector\n buttonType=\"raw\"\n innerRef={btnRef}\n aria-pressed={isOpened}\n aria-label={`${pageSize} rows per page. Press to select rows per page`}\n data-testid={PER_PAGE_SELECTOR_DATA_TESTID.PER_PAGE_SELECTOR}\n {...globalAttributes}\n {...xstyledProps}\n {...ownerPropsConfig}\n onClick={buttonOnClick}\n >\n <DSTypography\n variant=\"b1\"\n as=\"span\"\n /**\n * Pagination uses DSTypography internally, but each typography variant defines\n * its own font-size. When these components are placed inside a styled() wrapper,\n * trying to style them via styled(DSTypography) triggers TypeScript errors\n * because DSTypography exposes \"as\" props and variant-specific overrides.\n *\n * Instead of wrapping DSTypography directly in styled(), we target the\n * underlying rendered elements via className/id. This avoids the TS conflicts\n * while still allowing us to override their font-size reliably.\n */\n className=\"typography-per-page-selector\"\n >\n {pageSize} / page\n </DSTypography>\n\n <ChevronDown color={['brand-primary', '700']} innerRef={chevronRef} />\n </PaginationDropdownButtonPerPageSelector>\n </DSDropdownMenuV2>\n );\n};\n\nDSPerPageSelector.displayName = DSPerPageSelectorName;\nconst DSPerPageSelectorWithSchema = describe(DSPerPageSelector);\nDSPerPageSelectorWithSchema.propTypes = DSPerPageSelectorPropTypesSchema;\n\nexport { DSPerPageSelector, DSPerPageSelectorWithSchema };\n", "import * as React from 'react';\nexport { React };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADWF;AAVrB,gCAAuD;AACvD,sBAA4B;AAC5B,8BAAyB;AACzB,2BAA6B;AAC7B,mBAA+B;AAC/B,gCAAmC;AACnC,uBAAqE;AACrE,mCAA0E;AAC1E,oBAAsE;AAEtE,MAAM,SAAS,MAAM,4CAAC,8BAAa,sBAAQ;AAE3C,MAAM,oBAAmE,CAAC,UAAU;AAClF,QAAM;AAAA,IACJ,kBAAkB,EAAE,UAAU,iBAAiB;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,QAAI,8CAAmB,KAAK;AAC5B,QAAM,oBAA4C,sBAAQ,MAAM;AAC9D,QAAI,iBAAiB,QAAS,QAAO,iBAAiB;AACtD,WAAO,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI;AAAA,EAC1C,GAAG,CAAC,iBAAiB,SAAS,WAAW,CAAC;AAE1C,QAAM,uBAAmB,sBAAQ,MAAM;AACrC,UAAM,YAAY,QAAQ,OAAO,CAAC,KAAK,QAAQ,KAAK,IAAI,MAAM,WAAW,MAAM,IAAI,QAAQ,IAAI,MAAM,GAAG,CAAC;AACzG,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,iBAAiB,EAAE,CAAC,SAAS,SAAS,CAAC,GAAG,KAAK;AAAA,MAC/C,eAAe,CAAC,GAAG,kBAAkB;AACnC,yBAAkB,cAAoD,KAAe;AACrF,oBAAY,KAAK;AACjB,eAAO,SAAS,MAAM;AAAA,MACxB;AAAA,MACA,gBAAgB,MAAM;AACpB,oBAAY,KAAK;AACjB,eAAO,SAAS,MAAM;AAAA,MACxB;AAAA,MACA,cAAc,CAAC,EAAE,eAAe,IAAI,CAAC;AAAA,MACrC,0BAAyB;AAAA,MACzB;AAAA,MAuBA,UAAU,QAAQ,eAAe,EAAE,QAAQ,gBAAgB;AAAA,MAC3D,WAAW;AAAA,MACX,YAAY;AAAA,MAEZ;AAAA,QAAC;AAAA;AAAA,UACC,YAAW;AAAA,UACX,UAAU;AAAA,UACV,gBAAc;AAAA,UACd,cAAY,GAAG,QAAQ;AAAA,UACvB,eAAa,+CAA8B;AAAA,UAC1C,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACJ,SAAS;AAAA,UAET;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,IAAG;AAAA,gBAWH,WAAU;AAAA,gBAET;AAAA;AAAA,kBAAS;AAAA;AAAA;AAAA,YACZ;AAAA,YAEA,4CAAC,+BAAY,OAAO,CAAC,iBAAiB,KAAK,GAAG,UAAU,YAAY;AAAA;AAAA;AAAA,MACtE;AAAA;AAAA,EACF;AAEJ;AAEA,kBAAkB,cAAc;AAChC,MAAM,kCAA8B,kCAAS,iBAAiB;AAC9D,4BAA4B,YAAY;",
6
6
  "names": []
7
7
  }
@@ -37,6 +37,7 @@ var import_react = __toESM(require("react"));
37
37
  var import_react_desc_prop_types = require("../react-desc-prop-types.js");
38
38
  var import_useValidateProps = require("./useValidateProps.js");
39
39
  var import_getOptions = require("./getOptions.js");
40
+ var import_useOnElementOnResize = require("../../shared/useOnElementOnResize.js");
40
41
  const usePerPageSelector = (propsFromUser) => {
41
42
  const propsWithDefault = (0, import_ds_props_helpers.useMemoMergePropsWithDefault)(propsFromUser, import_react_desc_prop_types.defaultProps);
42
43
  (0, import_useValidateProps.useValidateProps)(propsWithDefault, import_react_desc_prop_types.DSPerPageSelectorPropTypesSchema);
@@ -51,10 +52,8 @@ const usePerPageSelector = (propsFromUser) => {
51
52
  }, [maxPerPage, minPerPage, perPageOptions, perPageStep]);
52
53
  const actionRef = (0, import_react.useRef)({});
53
54
  const btnRef = (0, import_react.useRef)(null);
54
- const width = (0, import_react.useMemo)(() => {
55
- const maxLength = options.reduce((acc, cur) => Math.max(acc, ("label" in cur ? cur.label : "").length), 0);
56
- return maxLength * 6 + 90;
57
- }, [options]);
55
+ const chevronRef = (0, import_react.useRef)(null);
56
+ const { width: chevronWidth } = (0, import_useOnElementOnResize.useOnElementResize)(chevronRef);
58
57
  (0, import_react.useEffect)(() => {
59
58
  if (isOpened) {
60
59
  actionRef.current.setActiveDescendant(pageSize.toString());
@@ -69,12 +68,13 @@ const usePerPageSelector = (propsFromUser) => {
69
68
  ownerPropsConfig,
70
69
  actionRef,
71
70
  btnRef,
72
- width,
71
+ chevronRef,
72
+ chevronWidth,
73
73
  isOpened,
74
74
  options,
75
75
  setIsOpened
76
76
  }),
77
- [propsWithDefault, xstyledProps, globalAttributes, ownerPropsConfig, width, isOpened, options]
77
+ [propsWithDefault, xstyledProps, globalAttributes, ownerPropsConfig, isOpened, options, chevronRef, chevronWidth]
78
78
  );
79
79
  };
80
80
  //# sourceMappingURL=usePerPageSelector.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/parts/DSPerPageSelector/config/usePerPageSelector.ts", "../../../../../../../../scripts/build/transpile/react-shim.js"],
4
- "sourcesContent": ["import type { DSButtonV3T } from '@elliemae/ds-button-v2';\nimport {\n useGetGlobalAttributes,\n useGetXstyledProps,\n useMemoMergePropsWithDefault,\n useOwnerProps,\n} from '@elliemae/ds-props-helpers';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type DSPerPageSelectorT, DSPerPageSelectorPropTypesSchema, defaultProps } from '../react-desc-prop-types.js';\nimport { useValidateProps } from './useValidateProps.js';\nimport { generateOption, getOptions } from './getOptions.js';\n\nexport const usePerPageSelector = (propsFromUser: DSPerPageSelectorT.Props) => {\n // =============================================================================\n // MERGE WITH DEFAULT AND VALIDATE PROPS\n // =============================================================================\n const propsWithDefault = useMemoMergePropsWithDefault<DSPerPageSelectorT.InternalProps>(propsFromUser, defaultProps);\n useValidateProps(propsWithDefault, DSPerPageSelectorPropTypesSchema);\n // =============================================================================\n // XSTYLED PROPS\n // =============================================================================\n const xstyledProps = useGetXstyledProps(propsWithDefault);\n // =============================================================================\n // GLOBAL ATTRIBUTES\n // =============================================================================\n const globalAttributes = useGetGlobalAttributes<\n DSPerPageSelectorT.InternalProps,\n HTMLButtonElement,\n DSButtonV3T.Props\n >(propsWithDefault);\n // =============================================================================\n // OWNER PROPS\n // =============================================================================\n const ownerPropsConfig = useOwnerProps(propsWithDefault);\n // AD HOC PER COMPONENT LOGIC\n // =============================================================================\n // custom code goes here, this is an example\n // const instanceUid = React.useMemo(() => `ds-per-page-selector-${uid(5)}`, []);\n\n const { pageSize, perPageOptions, perPageStep, minPerPage, maxPerPage } = propsWithDefault;\n const [isOpened, setIsOpened] = useState(false);\n const options = useMemo(() => {\n if (perPageOptions) return perPageOptions.map(generateOption);\n return getOptions(perPageStep, minPerPage, maxPerPage);\n }, [maxPerPage, minPerPage, perPageOptions, perPageStep]);\n\n const actionRef = useRef<Record<string, (dsId: string) => void>>({});\n const btnRef = useRef<HTMLButtonElement>(null);\n const width = useMemo(() => {\n const maxLength = options.reduce((acc, cur) => Math.max(acc, ('label' in cur ? cur.label : '').length), 0);\n return maxLength * 6 + 90;\n }, [options]);\n\n useEffect(() => {\n if (isOpened) {\n actionRef.current.setActiveDescendant(pageSize.toString());\n actionRef.current.scrollOptionIntoView(pageSize.toString());\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpened]);\n\n // =============================================================================\n // HELPERS HOOKS CONFIGS\n // =============================================================================\n // const eventHandlers = useEventHandlers({ propsWithDefault, instanceUid }); // <-- complex logic should be made atomics this way\n\n return React.useMemo(\n () => ({\n propsWithDefault,\n xstyledProps,\n globalAttributes,\n ownerPropsConfig,\n actionRef,\n btnRef,\n width,\n isOpened,\n options,\n setIsOpened,\n }),\n [propsWithDefault, xstyledProps, globalAttributes, ownerPropsConfig, width, isOpened, options],\n );\n};\n", "import * as React from 'react';\nexport { React };\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADCvB,8BAKO;AACP,mBAA4D;AAE5D,mCAAwF;AACxF,8BAAiC;AACjC,wBAA2C;AAEpC,MAAM,qBAAqB,CAAC,kBAA4C;AAI7E,QAAM,uBAAmB,sDAA+D,eAAe,yCAAY;AACnH,gDAAiB,kBAAkB,6DAAgC;AAInE,QAAM,mBAAe,4CAAmB,gBAAgB;AAIxD,QAAM,uBAAmB,gDAIvB,gBAAgB;AAIlB,QAAM,uBAAmB,uCAAc,gBAAgB;AAMvD,QAAM,EAAE,UAAU,gBAAgB,aAAa,YAAY,WAAW,IAAI;AAC1E,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAC9C,QAAM,cAAU,sBAAQ,MAAM;AAC5B,QAAI,eAAgB,QAAO,eAAe,IAAI,gCAAc;AAC5D,eAAO,8BAAW,aAAa,YAAY,UAAU;AAAA,EACvD,GAAG,CAAC,YAAY,YAAY,gBAAgB,WAAW,CAAC;AAExD,QAAM,gBAAY,qBAA+C,CAAC,CAAC;AACnE,QAAM,aAAS,qBAA0B,IAAI;AAC7C,QAAM,YAAQ,sBAAQ,MAAM;AAC1B,UAAM,YAAY,QAAQ,OAAO,CAAC,KAAK,QAAQ,KAAK,IAAI,MAAM,WAAW,MAAM,IAAI,QAAQ,IAAI,MAAM,GAAG,CAAC;AACzG,WAAO,YAAY,IAAI;AAAA,EACzB,GAAG,CAAC,OAAO,CAAC;AAEZ,8BAAU,MAAM;AACd,QAAI,UAAU;AACZ,gBAAU,QAAQ,oBAAoB,SAAS,SAAS,CAAC;AACzD,gBAAU,QAAQ,qBAAqB,SAAS,SAAS,CAAC;AAAA,IAC5D;AAAA,EAEF,GAAG,CAAC,QAAQ,CAAC;AAOb,SAAO,aAAAA,QAAM;AAAA,IACX,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,cAAc,kBAAkB,kBAAkB,OAAO,UAAU,OAAO;AAAA,EAC/F;AACF;",
4
+ "sourcesContent": ["import type { DSButtonV3T } from '@elliemae/ds-button-v2';\nimport {\n useGetGlobalAttributes,\n useGetXstyledProps,\n useMemoMergePropsWithDefault,\n useOwnerProps,\n} from '@elliemae/ds-props-helpers';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type DSPerPageSelectorT, DSPerPageSelectorPropTypesSchema, defaultProps } from '../react-desc-prop-types.js';\nimport { useValidateProps } from './useValidateProps.js';\nimport { generateOption, getOptions } from './getOptions.js';\nimport { useOnElementResize } from '../../shared/useOnElementOnResize.js';\n\nexport const usePerPageSelector = (propsFromUser: DSPerPageSelectorT.Props) => {\n // =============================================================================\n // MERGE WITH DEFAULT AND VALIDATE PROPS\n // =============================================================================\n const propsWithDefault = useMemoMergePropsWithDefault<DSPerPageSelectorT.InternalProps>(propsFromUser, defaultProps);\n useValidateProps(propsWithDefault, DSPerPageSelectorPropTypesSchema);\n // =============================================================================\n // XSTYLED PROPS\n // =============================================================================\n const xstyledProps = useGetXstyledProps(propsWithDefault);\n // =============================================================================\n // GLOBAL ATTRIBUTES\n // =============================================================================\n const globalAttributes = useGetGlobalAttributes<\n DSPerPageSelectorT.InternalProps,\n HTMLButtonElement,\n DSButtonV3T.Props\n >(propsWithDefault);\n // =============================================================================\n // OWNER PROPS\n // =============================================================================\n const ownerPropsConfig = useOwnerProps(propsWithDefault);\n // AD HOC PER COMPONENT LOGIC\n // =============================================================================\n // custom code goes here, this is an example\n // const instanceUid = React.useMemo(() => `ds-per-page-selector-${uid(5)}`, []);\n\n const { pageSize, perPageOptions, perPageStep, minPerPage, maxPerPage } = propsWithDefault;\n const [isOpened, setIsOpened] = useState(false);\n const options = useMemo(() => {\n if (perPageOptions) return perPageOptions.map(generateOption);\n return getOptions(perPageStep, minPerPage, maxPerPage);\n }, [maxPerPage, minPerPage, perPageOptions, perPageStep]);\n\n const actionRef = useRef<Record<string, (dsId: string) => void>>({});\n const btnRef = useRef<HTMLButtonElement>(null);\n\n const chevronRef = useRef<HTMLElement>(null);\n const { width: chevronWidth } = useOnElementResize(chevronRef);\n\n useEffect(() => {\n if (isOpened) {\n actionRef.current.setActiveDescendant(pageSize.toString());\n actionRef.current.scrollOptionIntoView(pageSize.toString());\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpened]);\n\n // =============================================================================\n // HELPERS HOOKS CONFIGS\n // =============================================================================\n // const eventHandlers = useEventHandlers({ propsWithDefault, instanceUid }); // <-- complex logic should be made atomics this way\n\n return React.useMemo(\n () => ({\n propsWithDefault,\n xstyledProps,\n globalAttributes,\n ownerPropsConfig,\n actionRef,\n btnRef,\n chevronRef,\n chevronWidth,\n isOpened,\n options,\n setIsOpened,\n }),\n [propsWithDefault, xstyledProps, globalAttributes, ownerPropsConfig, isOpened, options, chevronRef, chevronWidth],\n );\n};\n", "import * as React from 'react';\nexport { React };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADCvB,8BAKO;AACP,mBAA4D;AAE5D,mCAAwF;AACxF,8BAAiC;AACjC,wBAA2C;AAC3C,kCAAmC;AAE5B,MAAM,qBAAqB,CAAC,kBAA4C;AAI7E,QAAM,uBAAmB,sDAA+D,eAAe,yCAAY;AACnH,gDAAiB,kBAAkB,6DAAgC;AAInE,QAAM,mBAAe,4CAAmB,gBAAgB;AAIxD,QAAM,uBAAmB,gDAIvB,gBAAgB;AAIlB,QAAM,uBAAmB,uCAAc,gBAAgB;AAMvD,QAAM,EAAE,UAAU,gBAAgB,aAAa,YAAY,WAAW,IAAI;AAC1E,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAC9C,QAAM,cAAU,sBAAQ,MAAM;AAC5B,QAAI,eAAgB,QAAO,eAAe,IAAI,gCAAc;AAC5D,eAAO,8BAAW,aAAa,YAAY,UAAU;AAAA,EACvD,GAAG,CAAC,YAAY,YAAY,gBAAgB,WAAW,CAAC;AAExD,QAAM,gBAAY,qBAA+C,CAAC,CAAC;AACnE,QAAM,aAAS,qBAA0B,IAAI;AAE7C,QAAM,iBAAa,qBAAoB,IAAI;AAC3C,QAAM,EAAE,OAAO,aAAa,QAAI,gDAAmB,UAAU;AAE7D,8BAAU,MAAM;AACd,QAAI,UAAU;AACZ,gBAAU,QAAQ,oBAAoB,SAAS,SAAS,CAAC;AACzD,gBAAU,QAAQ,qBAAqB,SAAS,SAAS,CAAC;AAAA,IAC5D;AAAA,EAEF,GAAG,CAAC,QAAQ,CAAC;AAOb,SAAO,aAAAA,QAAM;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,IACF;AAAA,IACA,CAAC,kBAAkB,cAAc,kBAAkB,kBAAkB,UAAU,SAAS,YAAY,YAAY;AAAA,EAClH;AACF;",
6
6
  "names": ["React"]
7
7
  }
@@ -29,13 +29,18 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
29
29
  var styled_exports = {};
30
30
  __export(styled_exports, {
31
31
  InvisibleDiv: () => InvisibleDiv,
32
- PaginationDropdownButtonPerPageSelector: () => PaginationDropdownButtonPerPageSelector
32
+ PaginationDropdownButtonPerPageSelector: () => PaginationDropdownButtonPerPageSelector,
33
+ StyledHeader: () => StyledHeader
33
34
  });
34
35
  module.exports = __toCommonJS(styled_exports);
35
36
  var React = __toESM(require("react"));
36
37
  var import_ds_button_v2 = require("@elliemae/ds-button-v2");
37
38
  var import_ds_system = require("@elliemae/ds-system");
38
39
  var import_constants = require("./constants/index.js");
40
+ const fontSize13Base13 = 13 / 13;
41
+ const fontSize13Base16 = 13 / 16;
42
+ const fontSize12Base13 = 12 / 13;
43
+ const fontSize12Base16 = 12 / 16;
39
44
  const styledFocusCss = import_ds_system.css`
40
45
  &:after {
41
46
  display: block;
@@ -58,7 +63,7 @@ const InvisibleDiv = import_ds_system.styled.div`
58
63
  position: absolute;
59
64
  `;
60
65
  const paginationDropdownButtonCommonStyles = import_ds_system.css`
61
- height: 42px;
66
+ min-height: 42px;
62
67
  display: grid;
63
68
  grid-auto-flow: column;
64
69
  justify-content: center;
@@ -86,5 +91,27 @@ const PaginationDropdownButtonPerPageSelector = (0, import_ds_system.styled)(imp
86
91
  preserveLegacyDataTestId: true
87
92
  })`
88
93
  ${paginationDropdownButtonCommonStyles}
94
+ /**
95
+ * Pagination uses DSTypography internally, but each typography variant defines
96
+ * its own font-size. When these components are placed inside a styled() wrapper,
97
+ * trying to style them via styled(DSTypography) triggers TypeScript errors
98
+ * because DSTypography exposes "as" props and variant-specific overrides.
99
+ *
100
+ * Instead of wrapping DSTypography directly in styled(), we target the
101
+ * underlying rendered elements via className/id. This avoids the TS conflicts
102
+ * while still allowing us to override their font-size reliably.
103
+ */
104
+ .typography-per-page-selector {
105
+ font-size: ${fontSize13Base16}rem;
106
+ @media (min-width: ${({ theme }) => theme.breakpoints.small}) {
107
+ font-size: ${fontSize13Base13}rem;
108
+ }
109
+ }
110
+ `;
111
+ const StyledHeader = import_ds_system.styled.div`
112
+ font-size: ${fontSize12Base16}rem;
113
+ @media (min-width: ${({ theme }) => theme.breakpoints.small}) {
114
+ font-size: ${fontSize12Base13}rem;
115
+ }
89
116
  `;
90
117
  //# sourceMappingURL=styled.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/parts/DSPerPageSelector/styled.tsx", "../../../../../../../scripts/build/transpile/react-shim.js"],
4
- "sourcesContent": ["import { DSButtonV3 } from '@elliemae/ds-button-v2';\n\nimport { css, styled } from '@elliemae/ds-system';\nimport type {} from '@xstyled/system';\nimport { DSPaginationName, PER_PAGE_SELECTOR_SLOTS } from './constants/index.js';\n\nconst styledFocusCss = css`\n &:after {\n display: block;\n content: ' ';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid ${({ theme }) => theme.colors.brand[700]};\n pointer-events: none;\n z-index: 7;\n }\n`;\n\nexport const InvisibleDiv = styled.div`\n opacity: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: absolute;\n`;\n\nconst paginationDropdownButtonCommonStyles = css`\n height: 42px;\n display: grid;\n grid-auto-flow: column;\n justify-content: center;\n align-items: center;\n position: relative;\n padding-left: 16px;\n padding-right: 16px;\n grid-gap: 8px;\n font-size: 13px;\n color: neutral-700;\n cursor: pointer;\n border-radius: 0;\n font-weight: ${(props) => props.theme.fontWeights.regular};\n :focus {\n ${styledFocusCss}\n }\n &[aria-disabled='true'] {\n cursor: not-allowed;\n }\n white-space: nowrap;\n`;\nexport const PaginationDropdownButtonPerPageSelector = styled(DSButtonV3, {\n name: DSPaginationName,\n slot: PER_PAGE_SELECTOR_SLOTS.PER_PAGE_SELECTOR,\n preserveLegacyDataTestId: true,\n})`\n ${paginationDropdownButtonCommonStyles}\n`;\n", "import * as React from 'react';\nexport { React };\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADAvB,0BAA2B;AAE3B,uBAA4B;AAE5B,uBAA0D;AAE1D,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBASC,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAMvD,MAAM,eAAe,wBAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQnC,MAAM,uCAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAc5B,CAAC,UAAU,MAAM,MAAM,YAAY,OAAO;AAAA;AAAA,MAErD,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOb,MAAM,8CAA0C,yBAAO,gCAAY;AAAA,EACxE,MAAM;AAAA,EACN,MAAM,yCAAwB;AAAA,EAC9B,0BAA0B;AAC5B,CAAC;AAAA,IACG,oCAAoC;AAAA;",
4
+ "sourcesContent": ["import { DSButtonV3 } from '@elliemae/ds-button-v2';\n\nimport { css, styled } from '@elliemae/ds-system';\nimport type {} from '@xstyled/system';\nimport { DSPaginationName, PER_PAGE_SELECTOR_SLOTS } from './constants/index.js';\nconst fontSize13Base13 = 13 / 13;\nconst fontSize13Base16 = 13 / 16;\n\nconst fontSize12Base13 = 12 / 13;\nconst fontSize12Base16 = 12 / 16;\n\nconst styledFocusCss = css`\n &:after {\n display: block;\n content: ' ';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid ${({ theme }) => theme.colors.brand[700]};\n pointer-events: none;\n z-index: 7;\n }\n`;\n\nexport const InvisibleDiv = styled.div`\n opacity: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: absolute;\n`;\n\nconst paginationDropdownButtonCommonStyles = css`\n min-height: 42px;\n display: grid;\n grid-auto-flow: column;\n justify-content: center;\n align-items: center;\n position: relative;\n padding-left: 16px;\n padding-right: 16px;\n grid-gap: 8px;\n font-size: 13px;\n color: neutral-700;\n cursor: pointer;\n border-radius: 0;\n font-weight: ${(props) => props.theme.fontWeights.regular};\n :focus {\n ${styledFocusCss}\n }\n &[aria-disabled='true'] {\n cursor: not-allowed;\n }\n white-space: nowrap;\n`;\nexport const PaginationDropdownButtonPerPageSelector = styled(DSButtonV3, {\n name: DSPaginationName,\n slot: PER_PAGE_SELECTOR_SLOTS.PER_PAGE_SELECTOR,\n preserveLegacyDataTestId: true,\n})`\n ${paginationDropdownButtonCommonStyles}\n /**\n * Pagination uses DSTypography internally, but each typography variant defines\n * its own font-size. When these components are placed inside a styled() wrapper,\n * trying to style them via styled(DSTypography) triggers TypeScript errors\n * because DSTypography exposes \"as\" props and variant-specific overrides.\n *\n * Instead of wrapping DSTypography directly in styled(), we target the\n * underlying rendered elements via className/id. This avoids the TS conflicts\n * while still allowing us to override their font-size reliably.\n */\n .typography-per-page-selector {\n font-size: ${fontSize13Base16}rem;\n @media (min-width: ${({ theme }) => theme.breakpoints.small}) {\n font-size: ${fontSize13Base13}rem;\n }\n }\n`;\n\nexport const StyledHeader = styled.div`\n font-size: ${fontSize12Base16}rem;\n @media (min-width: ${({ theme }) => theme.breakpoints.small}) {\n font-size: ${fontSize12Base13}rem;\n }\n`;\n", "import * as React from 'react';\nexport { React };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADAvB,0BAA2B;AAE3B,uBAA4B;AAE5B,uBAA0D;AAC1D,MAAM,mBAAmB,KAAK;AAC9B,MAAM,mBAAmB,KAAK;AAE9B,MAAM,mBAAmB,KAAK;AAC9B,MAAM,mBAAmB,KAAK;AAE9B,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBASC,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAMvD,MAAM,eAAe,wBAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQnC,MAAM,uCAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAc5B,CAAC,UAAU,MAAM,MAAM,YAAY,OAAO;AAAA;AAAA,MAErD,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOb,MAAM,8CAA0C,yBAAO,gCAAY;AAAA,EACxE,MAAM;AAAA,EACN,MAAM,yCAAwB;AAAA,EAC9B,0BAA0B;AAC5B,CAAC;AAAA,IACG,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAYvB,gBAAgB;AAAA,yBACR,CAAC,EAAE,MAAM,MAAM,MAAM,YAAY,KAAK;AAAA,mBAC5C,gBAAgB;AAAA;AAAA;AAAA;AAK5B,MAAM,eAAe,wBAAO;AAAA,eACpB,gBAAgB;AAAA,uBACR,CAAC,EAAE,MAAM,MAAM,MAAM,YAAY,KAAK;AAAA,iBAC5C,gBAAgB;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../../src/parts/DSPaginator/config/useOnElementOnResize.tsx", "../../../../../../../../scripts/build/transpile/react-shim.js"],
3
+ "sources": ["../../../../src/parts/shared/useOnElementOnResize.tsx", "../../../../../../../scripts/build/transpile/react-shim.js"],
4
4
  "sourcesContent": ["import type React from 'react';\nimport { useState, useEffect, useRef, useMemo } from 'react';\n\n// Custom hook to track dimension of a component\n// Taken and modified from https://stackoverflow.com/a/60218754\nexport const useOnElementResize = <T extends HTMLElement>(\n targetRef: React.RefObject<T>,\n): Record<'width' | 'height', number> => {\n const [width, setWidth] = useState(targetRef.current?.offsetWidth ?? 0);\n const [height, setHeight] = useState(targetRef.current?.offsetHeight ?? 0);\n const observer = useRef<ResizeObserver>();\n\n useEffect(() => {\n function outputsize() {\n setWidth(targetRef.current?.offsetWidth ?? 0);\n setHeight(targetRef.current?.offsetHeight ?? 0);\n }\n\n observer.current = new ResizeObserver(outputsize);\n const el = targetRef.current as Element | null;\n if (el) observer.current.observe(el);\n\n return () => {\n if (el) observer.current?.disconnect();\n };\n }, [targetRef]);\n\n return useMemo(\n () => ({\n width,\n height,\n }),\n [width, height],\n );\n};\n", "import * as React from 'react';\nexport { React };\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADCvB,mBAAqD;AAI9C,MAAM,qBAAqB,CAChC,cACuC;AACvC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,UAAU,SAAS,eAAe,CAAC;AACtE,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,UAAU,SAAS,gBAAgB,CAAC;AACzE,QAAM,eAAW,qBAAuB;AAExC,8BAAU,MAAM;AACd,aAAS,aAAa;AACpB,eAAS,UAAU,SAAS,eAAe,CAAC;AAC5C,gBAAU,UAAU,SAAS,gBAAgB,CAAC;AAAA,IAChD;AAEA,aAAS,UAAU,IAAI,eAAe,UAAU;AAChD,UAAM,KAAK,UAAU;AACrB,QAAI,GAAI,UAAS,QAAQ,QAAQ,EAAE;AAEnC,WAAO,MAAM;AACX,UAAI,GAAI,UAAS,SAAS,WAAW;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,aAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,MAAM;AAAA,EAChB;AACF;",
6
6
  "names": []
@@ -17,7 +17,7 @@ const NextPageButton = styled(DSButtonV3, {
17
17
  slot: PAGE_NEXT_BUTTON_SLOTS.PAGE_NEXT_BUTTON,
18
18
  preserveLegacyDataTestId: true
19
19
  })`
20
- height: 42px;
20
+ min-height: 42px;
21
21
  display: grid;
22
22
  place-items: center;
23
23
  position: relative;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/parts/DSPageNextButton/DSPageNextButton.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { describe } from '@elliemae/ds-props-helpers';\nimport { styled } from '@elliemae/ds-system';\nimport React from 'react';\n\nimport { DSButtonV3 } from '@elliemae/ds-button-v2';\nimport { ChevronRight } from '@elliemae/ds-icons';\nimport { usePageNextButton } from './config/usePageNextButton.js';\nimport {\n DSPageNextButtonName,\n DSPaginationName,\n PAGE_NEXT_BUTTON_DATA_TESTID,\n PAGE_NEXT_BUTTON_SLOTS,\n} from './constants/index.js';\nimport { type DSPageNextButtonT, DSPageNextButtonPropTypesSchema } from './react-desc-prop-types.js';\n\nconst NextPageButton = styled(DSButtonV3, {\n name: DSPaginationName,\n slot: PAGE_NEXT_BUTTON_SLOTS.PAGE_NEXT_BUTTON,\n preserveLegacyDataTestId: true,\n})`\n height: 42px;\n display: grid;\n place-items: center;\n position: relative;\n padding-left: 8px;\n padding-right: 8px;\n border-radius: 0;\n :focus {\n &:after {\n display: block;\n content: ' ';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid ${({ theme }) => theme.colors.brand[700]};\n pointer-events: none;\n z-index: 7;\n }\n }\n cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n`;\n\nconst DSPageNextButton: React.ComponentType<DSPageNextButtonT.Props> = (props) => {\n const {\n propsWithDefault: { canNextPage, onNextPage },\n xstyledProps,\n globalAttributes,\n ownerPropsConfig,\n } = usePageNextButton(props);\n\n return (\n <NextPageButton\n disabled={!canNextPage}\n buttonType=\"raw\"\n data-testid={PAGE_NEXT_BUTTON_DATA_TESTID.PAGE_NEXT_BUTTON}\n aria-label=\"Go to next page\"\n {...globalAttributes}\n {...xstyledProps}\n {...ownerPropsConfig}\n onClick={() => {\n if (canNextPage) onNextPage();\n }}\n >\n <ChevronRight color={canNextPage ? ['brand-primary', '700'] : ['neutral', '500']} />\n </NextPageButton>\n );\n};\n\nDSPageNextButton.displayName = DSPageNextButtonName;\nconst DSPageNextButtonWithSchema = describe(DSPageNextButton);\nDSPageNextButtonWithSchema.propTypes = DSPageNextButtonPropTypesSchema;\n\nexport { DSPageNextButton, DSPageNextButtonWithSchema };\n"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { describe } from '@elliemae/ds-props-helpers';\nimport { styled } from '@elliemae/ds-system';\nimport React from 'react';\n\nimport { DSButtonV3 } from '@elliemae/ds-button-v2';\nimport { ChevronRight } from '@elliemae/ds-icons';\nimport { usePageNextButton } from './config/usePageNextButton.js';\nimport {\n DSPageNextButtonName,\n DSPaginationName,\n PAGE_NEXT_BUTTON_DATA_TESTID,\n PAGE_NEXT_BUTTON_SLOTS,\n} from './constants/index.js';\nimport { type DSPageNextButtonT, DSPageNextButtonPropTypesSchema } from './react-desc-prop-types.js';\n\nconst NextPageButton = styled(DSButtonV3, {\n name: DSPaginationName,\n slot: PAGE_NEXT_BUTTON_SLOTS.PAGE_NEXT_BUTTON,\n preserveLegacyDataTestId: true,\n})`\n min-height: 42px;\n display: grid;\n place-items: center;\n position: relative;\n padding-left: 8px;\n padding-right: 8px;\n border-radius: 0;\n :focus {\n &:after {\n display: block;\n content: ' ';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid ${({ theme }) => theme.colors.brand[700]};\n pointer-events: none;\n z-index: 7;\n }\n }\n cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n`;\n\nconst DSPageNextButton: React.ComponentType<DSPageNextButtonT.Props> = (props) => {\n const {\n propsWithDefault: { canNextPage, onNextPage },\n xstyledProps,\n globalAttributes,\n ownerPropsConfig,\n } = usePageNextButton(props);\n\n return (\n <NextPageButton\n disabled={!canNextPage}\n buttonType=\"raw\"\n data-testid={PAGE_NEXT_BUTTON_DATA_TESTID.PAGE_NEXT_BUTTON}\n aria-label=\"Go to next page\"\n {...globalAttributes}\n {...xstyledProps}\n {...ownerPropsConfig}\n onClick={() => {\n if (canNextPage) onNextPage();\n }}\n >\n <ChevronRight color={canNextPage ? ['brand-primary', '700'] : ['neutral', '500']} />\n </NextPageButton>\n );\n};\n\nDSPageNextButton.displayName = DSPageNextButtonName;\nconst DSPageNextButtonWithSchema = describe(DSPageNextButton);\nDSPageNextButtonWithSchema.propTypes = DSPageNextButtonPropTypesSchema;\n\nexport { DSPageNextButton, DSPageNextButtonWithSchema };\n"],
5
5
  "mappings": "AAAA,YAAY,WAAW;ACiEjB;AAjEN,SAAS,gBAAgB;AACzB,SAAS,cAAc;AAGvB,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAiC,uCAAuC;AAExE,MAAM,iBAAiB,OAAO,YAAY;AAAA,EACxC,MAAM;AAAA,EACN,MAAM,uBAAuB;AAAA,EAC7B,0BAA0B;AAC5B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAiByB,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,YAKpD,CAAC,UAAW,MAAM,WAAW,gBAAgB,SAAU;AAAA;AAGnE,MAAM,mBAAiE,CAAC,UAAU;AAChF,QAAM;AAAA,IACJ,kBAAkB,EAAE,aAAa,WAAW;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,kBAAkB,KAAK;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,CAAC;AAAA,MACX,YAAW;AAAA,MACX,eAAa,6BAA6B;AAAA,MAC1C,cAAW;AAAA,MACV,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACJ,SAAS,MAAM;AACb,YAAI,YAAa,YAAW;AAAA,MAC9B;AAAA,MAEA,8BAAC,gBAAa,OAAO,cAAc,CAAC,iBAAiB,KAAK,IAAI,CAAC,WAAW,KAAK,GAAG;AAAA;AAAA,EACpF;AAEJ;AAEA,iBAAiB,cAAc;AAC/B,MAAM,6BAA6B,SAAS,gBAAgB;AAC5D,2BAA2B,YAAY;",
6
6
  "names": []
7
7
  }
@@ -17,7 +17,7 @@ const PreviousPageButton = styled(DSButtonV3, {
17
17
  slot: PAGE_PREV_BUTTON_SLOTS.PREVIOUS_BUTTON,
18
18
  preserveLegacyDataTestId: true
19
19
  })`
20
- height: 42px;
20
+ min-height: 42px;
21
21
  display: grid;
22
22
  place-items: center;
23
23
  position: relative;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/parts/DSPagePrevButton/DSPagePrevButton.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { describe } from '@elliemae/ds-props-helpers';\nimport { styled } from '@elliemae/ds-system';\nimport React from 'react';\n\nimport { DSButtonV3 } from '@elliemae/ds-button-v2';\nimport { ChevronLeft } from '@elliemae/ds-icons';\nimport { usePagePrevButton } from './config/usePagePrevButton.js';\nimport {\n DSPagePrevButtonName,\n DSPaginationName,\n PAGE_PREV_BUTTON_DATA_TESTID,\n PAGE_PREV_BUTTON_SLOTS,\n} from './constants/index.js';\nimport { type DSPagePrevButtonT, DSPagePrevButtonPropTypesSchema } from './react-desc-prop-types.js';\n\nconst PreviousPageButton = styled(DSButtonV3, {\n name: DSPaginationName,\n slot: PAGE_PREV_BUTTON_SLOTS.PREVIOUS_BUTTON,\n preserveLegacyDataTestId: true,\n})`\n height: 42px;\n display: grid;\n place-items: center;\n position: relative;\n padding-left: 8px;\n padding-right: 8px;\n border-radius: 0;\n :focus {\n &:after {\n display: block;\n content: ' ';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid ${({ theme }) => theme.colors.brand[700]};\n pointer-events: none;\n z-index: 7;\n }\n }\n cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n`;\n\nconst DSPagePrevButton: React.ComponentType<DSPagePrevButtonT.Props> = (props) => {\n const {\n propsWithDefault: { canPreviousPage, onPreviousPage },\n xstyledProps,\n globalAttributes,\n ownerPropsConfig,\n } = usePagePrevButton(props);\n\n return (\n <PreviousPageButton\n disabled={!canPreviousPage}\n buttonType=\"raw\"\n data-testid={PAGE_PREV_BUTTON_DATA_TESTID.PREVIOUS_BUTTON}\n aria-label=\"Go to previous page\"\n {...globalAttributes}\n {...xstyledProps}\n {...ownerPropsConfig}\n onClick={() => {\n if (canPreviousPage) onPreviousPage();\n }}\n >\n <ChevronLeft color={canPreviousPage ? ['brand-primary', '700'] : ['neutral', '500']} />\n </PreviousPageButton>\n );\n};\n\nDSPagePrevButton.displayName = DSPagePrevButtonName;\nconst DSPagePrevButtonWithSchema = describe(DSPagePrevButton);\nDSPagePrevButtonWithSchema.propTypes = DSPagePrevButtonPropTypesSchema;\n\nexport { DSPagePrevButton, DSPagePrevButtonWithSchema };\n"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { describe } from '@elliemae/ds-props-helpers';\nimport { styled } from '@elliemae/ds-system';\nimport React from 'react';\n\nimport { DSButtonV3 } from '@elliemae/ds-button-v2';\nimport { ChevronLeft } from '@elliemae/ds-icons';\nimport { usePagePrevButton } from './config/usePagePrevButton.js';\nimport {\n DSPagePrevButtonName,\n DSPaginationName,\n PAGE_PREV_BUTTON_DATA_TESTID,\n PAGE_PREV_BUTTON_SLOTS,\n} from './constants/index.js';\nimport { type DSPagePrevButtonT, DSPagePrevButtonPropTypesSchema } from './react-desc-prop-types.js';\n\nconst PreviousPageButton = styled(DSButtonV3, {\n name: DSPaginationName,\n slot: PAGE_PREV_BUTTON_SLOTS.PREVIOUS_BUTTON,\n preserveLegacyDataTestId: true,\n})`\n min-height: 42px;\n display: grid;\n place-items: center;\n position: relative;\n padding-left: 8px;\n padding-right: 8px;\n border-radius: 0;\n :focus {\n &:after {\n display: block;\n content: ' ';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid ${({ theme }) => theme.colors.brand[700]};\n pointer-events: none;\n z-index: 7;\n }\n }\n cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n`;\n\nconst DSPagePrevButton: React.ComponentType<DSPagePrevButtonT.Props> = (props) => {\n const {\n propsWithDefault: { canPreviousPage, onPreviousPage },\n xstyledProps,\n globalAttributes,\n ownerPropsConfig,\n } = usePagePrevButton(props);\n\n return (\n <PreviousPageButton\n disabled={!canPreviousPage}\n buttonType=\"raw\"\n data-testid={PAGE_PREV_BUTTON_DATA_TESTID.PREVIOUS_BUTTON}\n aria-label=\"Go to previous page\"\n {...globalAttributes}\n {...xstyledProps}\n {...ownerPropsConfig}\n onClick={() => {\n if (canPreviousPage) onPreviousPage();\n }}\n >\n <ChevronLeft color={canPreviousPage ? ['brand-primary', '700'] : ['neutral', '500']} />\n </PreviousPageButton>\n );\n};\n\nDSPagePrevButton.displayName = DSPagePrevButtonName;\nconst DSPagePrevButtonWithSchema = describe(DSPagePrevButton);\nDSPagePrevButtonWithSchema.propTypes = DSPagePrevButtonPropTypesSchema;\n\nexport { DSPagePrevButton, DSPagePrevButtonWithSchema };\n"],
5
5
  "mappings": "AAAA,YAAY,WAAW;ACiEjB;AAjEN,SAAS,gBAAgB;AACzB,SAAS,cAAc;AAGvB,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAiC,uCAAuC;AAExE,MAAM,qBAAqB,OAAO,YAAY;AAAA,EAC5C,MAAM;AAAA,EACN,MAAM,uBAAuB;AAAA,EAC7B,0BAA0B;AAC5B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAiByB,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,YAKpD,CAAC,UAAW,MAAM,WAAW,gBAAgB,SAAU;AAAA;AAGnE,MAAM,mBAAiE,CAAC,UAAU;AAChF,QAAM;AAAA,IACJ,kBAAkB,EAAE,iBAAiB,eAAe;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,kBAAkB,KAAK;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,CAAC;AAAA,MACX,YAAW;AAAA,MACX,eAAa,6BAA6B;AAAA,MAC1C,cAAW;AAAA,MACV,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACJ,SAAS,MAAM;AACb,YAAI,gBAAiB,gBAAe;AAAA,MACtC;AAAA,MAEA,8BAAC,eAAY,OAAO,kBAAkB,CAAC,iBAAiB,KAAK,IAAI,CAAC,WAAW,KAAK,GAAG;AAAA;AAAA,EACvF;AAEJ;AAEA,iBAAiB,cAAc;AAC/B,MAAM,6BAA6B,SAAS,gBAAgB;AAC5D,2BAA2B,YAAY;",
6
6
  "names": []
7
7
  }
@@ -12,7 +12,7 @@ import {
12
12
  PAGINATION_CONTAINER_SLOTS
13
13
  } from "./constants/index.js";
14
14
  const StyledPaginationContainer = styled(Grid, { name: DSPaginationName, slot: PAGINATION_CONTAINER_SLOTS.ROOT })`
15
- height: 42px;
15
+ min-height: 42px;
16
16
  max-width: 100%;
17
17
  align-items: center;
18
18
  justify-content: center;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/parts/DSPaginationContainer/DSPaginationContainer.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React from 'react';\nimport { describe, type XstyledProps } from '@elliemae/ds-props-helpers';\nimport { styled, xStyledCommonProps } from '@elliemae/ds-system';\nimport { Grid } from '@elliemae/ds-grid';\nimport { type DSPaginationContainerT, DSPaginationContainerPropTypesSchema } from './react-desc-prop-types.js';\nimport { usePaginationContainer } from './config/usePaginationContainer.js';\nimport {\n DSPaginationContainerName,\n DSPaginationName,\n PAGINATION_CONTAINER_DATA_TESTID,\n PAGINATION_CONTAINER_SLOTS,\n} from './constants/index.js';\n\nconst StyledPaginationContainer = styled(Grid, { name: DSPaginationName, slot: PAGINATION_CONTAINER_SLOTS.ROOT })<\n React.ComponentProps<typeof Grid> & XstyledProps\n>`\n height: 42px;\n max-width: 100%;\n align-items: center;\n justify-content: center;\n box-shadow: 0 -1px 3px 0 rgba(0, 0, 0, 0.5);\n position: relative;\n ${xStyledCommonProps}\n`;\n\nconst StyledPaginationWrapper = styled('div', { name: DSPaginationName, slot: PAGINATION_CONTAINER_SLOTS.WRAPPER })`\n display: grid;\n grid-auto-flow: column;\n justify-content: center;\n align-items: center;\n`;\n\nconst DSPaginationContainer: React.ComponentType<DSPaginationContainerT.Props> = (props) => {\n const { xstyledProps, globalAttributes, ownerPropsConfig } = usePaginationContainer(props);\n\n return (\n <StyledPaginationContainer\n data-testid={PAGINATION_CONTAINER_DATA_TESTID.ROOT}\n {...globalAttributes}\n {...xstyledProps}\n {...ownerPropsConfig}\n cols={['minmax(auto, 80%)']}\n >\n <StyledPaginationWrapper {...ownerPropsConfig}>{props.children}</StyledPaginationWrapper>\n </StyledPaginationContainer>\n );\n};\n\nDSPaginationContainer.displayName = DSPaginationContainerName;\nconst DSPaginationContainerWithSchema = describe(DSPaginationContainer);\nDSPaginationContainerWithSchema.propTypes = DSPaginationContainerPropTypesSchema;\n\nexport { DSPaginationContainer, DSPaginationContainerWithSchema };\n"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React from 'react';\nimport { describe, type XstyledProps } from '@elliemae/ds-props-helpers';\nimport { styled, xStyledCommonProps } from '@elliemae/ds-system';\nimport { Grid } from '@elliemae/ds-grid';\nimport { type DSPaginationContainerT, DSPaginationContainerPropTypesSchema } from './react-desc-prop-types.js';\nimport { usePaginationContainer } from './config/usePaginationContainer.js';\nimport {\n DSPaginationContainerName,\n DSPaginationName,\n PAGINATION_CONTAINER_DATA_TESTID,\n PAGINATION_CONTAINER_SLOTS,\n} from './constants/index.js';\n\nconst StyledPaginationContainer = styled(Grid, { name: DSPaginationName, slot: PAGINATION_CONTAINER_SLOTS.ROOT })<\n React.ComponentProps<typeof Grid> & XstyledProps\n>`\n min-height: 42px;\n max-width: 100%;\n align-items: center;\n justify-content: center;\n box-shadow: 0 -1px 3px 0 rgba(0, 0, 0, 0.5);\n position: relative;\n ${xStyledCommonProps}\n`;\n\nconst StyledPaginationWrapper = styled('div', { name: DSPaginationName, slot: PAGINATION_CONTAINER_SLOTS.WRAPPER })`\n display: grid;\n grid-auto-flow: column;\n justify-content: center;\n align-items: center;\n`;\n\nconst DSPaginationContainer: React.ComponentType<DSPaginationContainerT.Props> = (props) => {\n const { xstyledProps, globalAttributes, ownerPropsConfig } = usePaginationContainer(props);\n\n return (\n <StyledPaginationContainer\n data-testid={PAGINATION_CONTAINER_DATA_TESTID.ROOT}\n {...globalAttributes}\n {...xstyledProps}\n {...ownerPropsConfig}\n cols={['minmax(auto, 80%)']}\n >\n <StyledPaginationWrapper {...ownerPropsConfig}>{props.children}</StyledPaginationWrapper>\n </StyledPaginationContainer>\n );\n};\n\nDSPaginationContainer.displayName = DSPaginationContainerName;\nconst DSPaginationContainerWithSchema = describe(DSPaginationContainer);\nDSPaginationContainerWithSchema.propTypes = DSPaginationContainerPropTypesSchema;\n\nexport { DSPaginationContainer, DSPaginationContainerWithSchema };\n"],
5
5
  "mappings": "AAAA,YAAY,WAAW;AC2CjB;AA1CN,SAAS,gBAAmC;AAC5C,SAAS,QAAQ,0BAA0B;AAC3C,SAAS,YAAY;AACrB,SAAsC,4CAA4C;AAClF,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,MAAM,4BAA4B,OAAO,MAAM,EAAE,MAAM,kBAAkB,MAAM,2BAA2B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAS5G,kBAAkB;AAAA;AAGtB,MAAM,0BAA0B,OAAO,OAAO,EAAE,MAAM,kBAAkB,MAAM,2BAA2B,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAOlH,MAAM,wBAA2E,CAAC,UAAU;AAC1F,QAAM,EAAE,cAAc,kBAAkB,iBAAiB,IAAI,uBAAuB,KAAK;AAEzF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAa,iCAAiC;AAAA,MAC7C,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACJ,MAAM,CAAC,mBAAmB;AAAA,MAE1B,8BAAC,2BAAyB,GAAG,kBAAmB,gBAAM,UAAS;AAAA;AAAA,EACjE;AAEJ;AAEA,sBAAsB,cAAc;AACpC,MAAM,kCAAkC,SAAS,qBAAqB;AACtE,gCAAgC,YAAY;",
6
6
  "names": []
7
7
  }
@@ -1,8 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { useMemo } from "react";
3
+ import React2, { useMemo } from "react";
4
4
  import { DSCircularIndeterminateIndicator } from "@elliemae/ds-circular-progress-indicator";
5
- import { DSDropdownMenuV2 } from "@elliemae/ds-dropdownmenu-v2";
6
5
  import { Grid } from "@elliemae/ds-grid";
7
6
  import { ChevronDown } from "@elliemae/ds-icons";
8
7
  import { describe } from "@elliemae/ds-props-helpers";
@@ -12,7 +11,7 @@ import { createPaginatorHeader } from "./config/createPaginatorHeader.js";
12
11
  import { usePaginator } from "./config/usePaginator.js";
13
12
  import { DSPaginatorName, PAGINATOR_DATA_TESTID } from "./constants/index.js";
14
13
  import { DSPaginatorPropTypesSchema } from "./react-desc-prop-types.js";
15
- import { PaginationDropdownButtonPaginator, InvisibleDiv } from "./styled.js";
14
+ import { InvisibleDiv, PaginationDropdownButtonPaginator, StyledDropdown } from "./styled.js";
16
15
  const DSPaginator = (props) => {
17
16
  const {
18
17
  propsWithDefault: { pageIndex, pageCount, isLoadingPageCount, onPageChange, pageDetails, pageDetailsTitle },
@@ -24,21 +23,25 @@ const DSPaginator = (props) => {
24
23
  pageInfoWidth,
25
24
  options,
26
25
  isOpened,
27
- setIsOpened,
28
- detailWidth,
29
26
  actionRef,
30
- onKeyDown
27
+ widestChildRef,
28
+ pageInfoRef,
29
+ checkMarkRef,
30
+ checkMarkWidth,
31
+ onKeyDown,
32
+ setIsOpened
31
33
  } = usePaginator(props);
34
+ const widestTypographyRef = React2.useRef(null);
32
35
  const Header = useMemo(
33
- () => createPaginatorHeader({ pageDetailsTitle, pageInfoWidth, ownerPropsConfig }),
34
- [pageDetailsTitle, pageInfoWidth, ownerPropsConfig]
36
+ () => createPaginatorHeader({ pageDetailsTitle, pageInfoWidth, ownerPropsConfig, checkMarkWidth }),
37
+ [pageDetailsTitle, pageInfoWidth, ownerPropsConfig, checkMarkWidth]
35
38
  );
36
39
  const buttonOnClick = useMemo(() => {
37
40
  if (globalAttributes.onClick) return globalAttributes.onClick;
38
41
  return () => setIsOpened((prev) => !prev);
39
42
  }, [globalAttributes.onClick, setIsOpened]);
40
43
  return /* @__PURE__ */ jsxs(
41
- DSDropdownMenuV2,
44
+ StyledDropdown,
42
45
  {
43
46
  isOpened,
44
47
  options,
@@ -52,11 +55,24 @@ const DSPaginator = (props) => {
52
55
  setIsOpened(false);
53
56
  btnRef.current?.focus();
54
57
  },
55
- customOffset: [-23, 2],
58
+ customOffset: [-(checkMarkWidth + 7), 2],
56
59
  startPlacementPreference: "top-start",
57
60
  actionRef,
58
61
  onKeyDown,
59
- minWidth: pageDetails.length !== 0 ? btnWidth + 23 : pageCount.toString().length * 6 + 90,
62
+ minWidth: pageDetails.length !== 0 ? btnWidth + checkMarkWidth + 7 : (
63
+ /**
64
+ * Structure of the width:
65
+ * 16px (left padding)
66
+ * + chevronWidth (size of the chevron icon)
67
+ * + 8px (spacing between chevron and text)
68
+ * + pageCount length in ch
69
+ * + 16px (right padding)
70
+ * + a small scrollbar placeholder (to avoid text wrapping when scrollbars appear)
71
+ * By using `calc()` + `ch` units, the component stays responsive to font-size changes
72
+ * without requiring an extra ref to measure the page count text width.
73
+ */
74
+ `calc(${checkMarkWidth + 60}px + ${pageCount.toString().length}ch)`
75
+ ),
60
76
  maxHeight: 300,
61
77
  HeaderComp: Header,
62
78
  children: [
@@ -74,17 +90,39 @@ const DSPaginator = (props) => {
74
90
  ...ownerPropsConfig,
75
91
  onClick: buttonOnClick,
76
92
  children: /* @__PURE__ */ jsxs(Grid, { gutter: "xxxs", alignItems: "center", style: { gridAutoFlow: "column" }, children: [
77
- /* @__PURE__ */ jsx(DSTypography, { fontSize: "18px", variant: "b1", as: "span", fontWeight: "semibold", textAlign: "start", children: pageIndex }),
78
- "/ ",
79
- pageCount,
93
+ /* @__PURE__ */ jsxs("div", { ref: pageInfoRef, children: [
94
+ /* @__PURE__ */ jsx(
95
+ DSTypography,
96
+ {
97
+ id: "typography-page-index",
98
+ variant: "b1",
99
+ as: "span",
100
+ fontWeight: "semibold",
101
+ textAlign: "start",
102
+ children: pageIndex
103
+ }
104
+ ),
105
+ /* @__PURE__ */ jsxs(
106
+ DSTypography,
107
+ {
108
+ variant: "b1",
109
+ as: "span",
110
+ className: "typography-page-info-and-detail",
111
+ children: [
112
+ "/ ",
113
+ pageCount
114
+ ]
115
+ }
116
+ )
117
+ ] }),
80
118
  isLoadingPageCount && /* @__PURE__ */ jsx(DSCircularIndeterminateIndicator, { ml: "xxxs", mr: "xxxs", size: "xs" }),
81
119
  pageDetails.length !== 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
82
120
  /* @__PURE__ */ jsx(DSPaginationSeparator, { height: "12px", ml: "12px", mr: "xxxs", ...ownerPropsConfig }),
83
121
  /* @__PURE__ */ jsx(
84
122
  DSTypography,
85
123
  {
86
- fontSize: "13px",
87
- w: detailWidth,
124
+ className: "typography-page-info-and-detail",
125
+ innerRef: widestTypographyRef,
88
126
  mr: "xxs",
89
127
  variant: "b1",
90
128
  as: "span",
@@ -94,11 +132,42 @@ const DSPaginator = (props) => {
94
132
  }
95
133
  )
96
134
  ] }),
97
- /* @__PURE__ */ jsx(ChevronDown, { ml: "xxxs", color: ["brand-primary", "700"] })
135
+ /* @__PURE__ */ jsx(ChevronDown, { ml: "xxxs", color: ["brand-primary", "700"], innerRef: checkMarkRef })
98
136
  ] })
99
137
  }
100
138
  ),
101
- /* @__PURE__ */ jsx(Grid, { style: { position: "relative" }, children: pageDetails.map((pageDetail) => /* @__PURE__ */ jsx(InvisibleDiv, { "data-testid": "ds-pagination-invisible-detail-for-width-calc", children: /* @__PURE__ */ jsx(DSTypography, { fontSize: "13px", mr: "xxs", variant: "b1", as: "span", fontWeight: "semibold", textAlign: "start", children: pageDetail }) }, pageDetail)) })
139
+ /* @__PURE__ */ jsx(Grid, { style: { position: "relative" }, children: pageDetails.map((pageDetail, index) => /* @__PURE__ */ jsx(
140
+ InvisibleDiv,
141
+ {
142
+ innerRef: (el) => {
143
+ if (!el) return;
144
+ if (!widestChildRef.current) {
145
+ widestChildRef.current = el;
146
+ return;
147
+ }
148
+ if (el.offsetWidth > widestChildRef.current.offsetWidth) {
149
+ widestChildRef.current = el;
150
+ }
151
+ if (index === pageDetails.length - 1) {
152
+ widestTypographyRef.current?.style.setProperty("min-width", `${widestChildRef.current?.offsetWidth}px`);
153
+ }
154
+ },
155
+ "data-testid": "ds-pagination-invisible-detail-for-width-calc",
156
+ children: /* @__PURE__ */ jsx(
157
+ DSTypography,
158
+ {
159
+ className: "typography-page-info-and-detail",
160
+ mr: "xxs",
161
+ variant: "b1",
162
+ as: "span",
163
+ fontWeight: "semibold",
164
+ textAlign: "start",
165
+ children: pageDetail
166
+ }
167
+ )
168
+ },
169
+ pageDetail
170
+ )) })
102
171
  ]
103
172
  }
104
173
  );