@elliemae/ds-pagination 3.80.0-next.50 → 3.80.0-next.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/dist/cjs/parts/DSPaginator/DSPaginator.js +10 -166
  2. package/dist/cjs/parts/DSPaginator/DSPaginator.js.map +2 -2
  3. package/dist/cjs/parts/DSPaginator/{config/usePaginationSearch.js → DSPaginatorCTX.js} +7 -32
  4. package/dist/cjs/parts/DSPaginator/DSPaginatorCTX.js.map +7 -0
  5. package/dist/cjs/parts/DSPaginator/config/{createPaginatorHeader.js → getAmountOfPages.js} +8 -23
  6. package/dist/cjs/parts/DSPaginator/config/getAmountOfPages.js.map +7 -0
  7. package/dist/cjs/parts/DSPaginator/config/getInstanceIds.js +40 -0
  8. package/dist/cjs/parts/DSPaginator/config/getInstanceIds.js.map +7 -0
  9. package/dist/cjs/parts/DSPaginator/config/navigationKeys.js +44 -0
  10. package/dist/cjs/parts/DSPaginator/config/navigationKeys.js.map +7 -0
  11. package/dist/cjs/parts/DSPaginator/config/useFocusTracker.js +77 -0
  12. package/dist/cjs/parts/DSPaginator/config/useFocusTracker.js.map +7 -0
  13. package/dist/cjs/parts/DSPaginator/config/usePaginator.js +73 -49
  14. package/dist/cjs/parts/DSPaginator/config/usePaginator.js.map +2 -2
  15. package/dist/cjs/parts/DSPaginator/config/usePaginatorFloatingContext.js +86 -0
  16. package/dist/cjs/parts/DSPaginator/config/usePaginatorFloatingContext.js.map +7 -0
  17. package/dist/cjs/parts/DSPaginator/config/usePaginatorInteractions.js +170 -0
  18. package/dist/cjs/parts/DSPaginator/config/usePaginatorInteractions.js.map +7 -0
  19. package/dist/cjs/parts/DSPaginator/config/usePaginatorSizing.js +80 -0
  20. package/dist/cjs/parts/DSPaginator/config/usePaginatorSizing.js.map +7 -0
  21. package/dist/cjs/parts/DSPaginator/config/useValidateProps.js.map +2 -2
  22. package/dist/cjs/parts/DSPaginator/constants/index.js +49 -3
  23. package/dist/cjs/parts/DSPaginator/constants/index.js.map +2 -2
  24. package/dist/cjs/parts/DSPaginator/parts/OptionRenderer.js +98 -0
  25. package/dist/cjs/parts/DSPaginator/parts/OptionRenderer.js.map +7 -0
  26. package/dist/cjs/parts/DSPaginator/parts/Panel.js +131 -0
  27. package/dist/cjs/parts/DSPaginator/parts/Panel.js.map +7 -0
  28. package/dist/cjs/parts/DSPaginator/parts/Trigger.js +124 -0
  29. package/dist/cjs/parts/DSPaginator/parts/Trigger.js.map +7 -0
  30. package/dist/cjs/parts/DSPaginator/react-desc-prop-types.js +6 -1
  31. package/dist/cjs/parts/DSPaginator/react-desc-prop-types.js.map +2 -2
  32. package/dist/cjs/parts/DSPaginator/styled.js +113 -38
  33. package/dist/cjs/parts/DSPaginator/styled.js.map +3 -3
  34. package/dist/cjs/parts/DSPaginator/typescript-testing/slot-props.js +12 -1
  35. package/dist/cjs/parts/DSPaginator/typescript-testing/slot-props.js.map +2 -2
  36. package/dist/cjs/parts/DSPaginator/typescript-testing/typescript-testing.js +2 -1
  37. package/dist/cjs/parts/DSPaginator/typescript-testing/typescript-testing.js.map +2 -2
  38. package/dist/cjs/parts/DSPerPageSelector/DSPerPageSelector.js +10 -79
  39. package/dist/cjs/parts/DSPerPageSelector/DSPerPageSelector.js.map +3 -3
  40. package/dist/cjs/parts/DSPerPageSelector/DSPerPageSelectorCTX.js +38 -0
  41. package/dist/cjs/parts/DSPerPageSelector/DSPerPageSelectorCTX.js.map +7 -0
  42. package/dist/cjs/parts/DSPerPageSelector/config/getInstanceIds.js +40 -0
  43. package/dist/cjs/parts/DSPerPageSelector/config/getInstanceIds.js.map +7 -0
  44. package/dist/cjs/parts/DSPerPageSelector/config/getOptions.js.map +2 -2
  45. package/dist/cjs/parts/DSPerPageSelector/config/getSelectedOptionIndex.js +36 -0
  46. package/dist/cjs/parts/DSPerPageSelector/config/getSelectedOptionIndex.js.map +7 -0
  47. package/dist/cjs/parts/DSPerPageSelector/config/navigationKeys.js +44 -0
  48. package/dist/cjs/parts/DSPerPageSelector/config/navigationKeys.js.map +7 -0
  49. package/dist/cjs/parts/DSPerPageSelector/config/useFocusTracker.js +83 -0
  50. package/dist/cjs/parts/DSPerPageSelector/config/useFocusTracker.js.map +7 -0
  51. package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelector.js +68 -20
  52. package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelector.js.map +2 -2
  53. package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorFloatingContext.js +82 -0
  54. package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorFloatingContext.js.map +7 -0
  55. package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorInteractions.js +175 -0
  56. package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorInteractions.js.map +7 -0
  57. package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorSizing.js +66 -0
  58. package/dist/cjs/parts/DSPerPageSelector/config/usePerPageSelectorSizing.js.map +7 -0
  59. package/dist/cjs/parts/DSPerPageSelector/constants/index.js +47 -8
  60. package/dist/cjs/parts/DSPerPageSelector/constants/index.js.map +2 -2
  61. package/dist/cjs/parts/DSPerPageSelector/parts/OptionRenderer.js +94 -0
  62. package/dist/cjs/parts/DSPerPageSelector/parts/OptionRenderer.js.map +7 -0
  63. package/dist/cjs/parts/DSPerPageSelector/parts/Panel.js +120 -0
  64. package/dist/cjs/parts/DSPerPageSelector/parts/Panel.js.map +7 -0
  65. package/dist/cjs/parts/DSPerPageSelector/parts/Trigger.js +95 -0
  66. package/dist/cjs/parts/DSPerPageSelector/parts/Trigger.js.map +7 -0
  67. package/dist/cjs/parts/DSPerPageSelector/react-desc-prop-types.js +19 -2
  68. package/dist/cjs/parts/DSPerPageSelector/react-desc-prop-types.js.map +2 -2
  69. package/dist/cjs/parts/DSPerPageSelector/styled.js +104 -32
  70. package/dist/cjs/parts/DSPerPageSelector/styled.js.map +2 -2
  71. package/dist/cjs/parts/DSPerPageSelector/typescript-testing/slots-props.js +10 -1
  72. package/dist/cjs/parts/DSPerPageSelector/typescript-testing/slots-props.js.map +2 -2
  73. package/dist/cjs/parts/DSPerPageSelector/typescript-testing/typescript-testing.js +60 -1
  74. package/dist/cjs/parts/DSPerPageSelector/typescript-testing/typescript-testing.js.map +2 -2
  75. package/dist/cjs/react-desc-prop-types.js.map +1 -1
  76. package/dist/esm/parts/DSPaginator/DSPaginator.js +12 -168
  77. package/dist/esm/parts/DSPaginator/DSPaginator.js.map +2 -2
  78. package/dist/esm/parts/DSPaginator/DSPaginatorCTX.js +8 -0
  79. package/dist/esm/parts/DSPaginator/DSPaginatorCTX.js.map +7 -0
  80. package/dist/esm/parts/DSPaginator/config/getAmountOfPages.js +9 -0
  81. package/dist/esm/parts/DSPaginator/config/getAmountOfPages.js.map +7 -0
  82. package/dist/esm/parts/DSPaginator/config/getInstanceIds.js +10 -0
  83. package/dist/esm/parts/DSPaginator/config/getInstanceIds.js.map +7 -0
  84. package/dist/esm/parts/DSPaginator/config/navigationKeys.js +14 -0
  85. package/dist/esm/parts/DSPaginator/config/navigationKeys.js.map +7 -0
  86. package/dist/esm/parts/DSPaginator/config/useFocusTracker.js +47 -0
  87. package/dist/esm/parts/DSPaginator/config/useFocusTracker.js.map +7 -0
  88. package/dist/esm/parts/DSPaginator/config/usePaginator.js +74 -50
  89. package/dist/esm/parts/DSPaginator/config/usePaginator.js.map +2 -2
  90. package/dist/esm/parts/DSPaginator/config/usePaginatorFloatingContext.js +56 -0
  91. package/dist/esm/parts/DSPaginator/config/usePaginatorFloatingContext.js.map +7 -0
  92. package/dist/esm/parts/DSPaginator/config/usePaginatorInteractions.js +140 -0
  93. package/dist/esm/parts/DSPaginator/config/usePaginatorInteractions.js.map +7 -0
  94. package/dist/esm/parts/DSPaginator/config/usePaginatorSizing.js +56 -0
  95. package/dist/esm/parts/DSPaginator/config/usePaginatorSizing.js.map +7 -0
  96. package/dist/esm/parts/DSPaginator/config/useValidateProps.js.map +2 -2
  97. package/dist/esm/parts/DSPaginator/constants/index.js +49 -3
  98. package/dist/esm/parts/DSPaginator/constants/index.js.map +2 -2
  99. package/dist/esm/parts/DSPaginator/parts/OptionRenderer.js +68 -0
  100. package/dist/esm/parts/DSPaginator/parts/OptionRenderer.js.map +7 -0
  101. package/dist/esm/parts/DSPaginator/parts/Panel.js +101 -0
  102. package/dist/esm/parts/DSPaginator/parts/Panel.js.map +7 -0
  103. package/dist/esm/parts/DSPaginator/parts/Trigger.js +94 -0
  104. package/dist/esm/parts/DSPaginator/parts/Trigger.js.map +7 -0
  105. package/dist/esm/parts/DSPaginator/react-desc-prop-types.js +6 -1
  106. package/dist/esm/parts/DSPaginator/react-desc-prop-types.js.map +2 -2
  107. package/dist/esm/parts/DSPaginator/styled.js +120 -39
  108. package/dist/esm/parts/DSPaginator/styled.js.map +2 -2
  109. package/dist/esm/parts/DSPaginator/typescript-testing/slot-props.js +12 -1
  110. package/dist/esm/parts/DSPaginator/typescript-testing/slot-props.js.map +2 -2
  111. package/dist/esm/parts/DSPaginator/typescript-testing/typescript-testing.js +2 -1
  112. package/dist/esm/parts/DSPaginator/typescript-testing/typescript-testing.js.map +2 -2
  113. package/dist/esm/parts/DSPerPageSelector/DSPerPageSelector.js +11 -80
  114. package/dist/esm/parts/DSPerPageSelector/DSPerPageSelector.js.map +3 -3
  115. package/dist/esm/parts/DSPerPageSelector/DSPerPageSelectorCTX.js +8 -0
  116. package/dist/esm/parts/DSPerPageSelector/DSPerPageSelectorCTX.js.map +7 -0
  117. package/dist/esm/parts/DSPerPageSelector/config/getInstanceIds.js +10 -0
  118. package/dist/esm/parts/DSPerPageSelector/config/getInstanceIds.js.map +7 -0
  119. package/dist/esm/parts/DSPerPageSelector/config/getOptions.js.map +2 -2
  120. package/dist/esm/parts/DSPerPageSelector/config/getSelectedOptionIndex.js +6 -0
  121. package/dist/esm/parts/DSPerPageSelector/config/getSelectedOptionIndex.js.map +7 -0
  122. package/dist/esm/parts/DSPerPageSelector/config/navigationKeys.js +14 -0
  123. package/dist/esm/parts/DSPerPageSelector/config/navigationKeys.js.map +7 -0
  124. package/dist/esm/parts/DSPerPageSelector/config/useFocusTracker.js +53 -0
  125. package/dist/esm/parts/DSPerPageSelector/config/useFocusTracker.js.map +7 -0
  126. package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelector.js +69 -21
  127. package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelector.js.map +2 -2
  128. package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorFloatingContext.js +52 -0
  129. package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorFloatingContext.js.map +7 -0
  130. package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorInteractions.js +145 -0
  131. package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorInteractions.js.map +7 -0
  132. package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorSizing.js +42 -0
  133. package/dist/esm/parts/DSPerPageSelector/config/usePerPageSelectorSizing.js.map +7 -0
  134. package/dist/esm/parts/DSPerPageSelector/constants/index.js +47 -8
  135. package/dist/esm/parts/DSPerPageSelector/constants/index.js.map +2 -2
  136. package/dist/esm/parts/DSPerPageSelector/parts/OptionRenderer.js +64 -0
  137. package/dist/esm/parts/DSPerPageSelector/parts/OptionRenderer.js.map +7 -0
  138. package/dist/esm/parts/DSPerPageSelector/parts/Panel.js +90 -0
  139. package/dist/esm/parts/DSPerPageSelector/parts/Panel.js.map +7 -0
  140. package/dist/esm/parts/DSPerPageSelector/parts/Trigger.js +65 -0
  141. package/dist/esm/parts/DSPerPageSelector/parts/Trigger.js.map +7 -0
  142. package/dist/esm/parts/DSPerPageSelector/react-desc-prop-types.js +19 -2
  143. package/dist/esm/parts/DSPerPageSelector/react-desc-prop-types.js.map +2 -2
  144. package/dist/esm/parts/DSPerPageSelector/styled.js +111 -33
  145. package/dist/esm/parts/DSPerPageSelector/styled.js.map +2 -2
  146. package/dist/esm/parts/DSPerPageSelector/typescript-testing/slots-props.js +10 -1
  147. package/dist/esm/parts/DSPerPageSelector/typescript-testing/slots-props.js.map +2 -2
  148. package/dist/esm/parts/DSPerPageSelector/typescript-testing/typescript-testing.js +60 -1
  149. package/dist/esm/parts/DSPerPageSelector/typescript-testing/typescript-testing.js.map +2 -2
  150. package/dist/esm/react-desc-prop-types.js.map +1 -1
  151. package/dist/types/parts/DSPageNextButton/config/usePageNextButton.d.ts +4 -4
  152. package/dist/types/parts/DSPagePrevButton/config/usePagePrevButton.d.ts +4 -4
  153. package/dist/types/parts/DSPaginationContainer/config/usePaginationContainer.d.ts +4 -4
  154. package/dist/types/parts/DSPaginationSeparator/config/usePaginationSeparator.d.ts +4 -4
  155. package/dist/types/parts/DSPaginator/DSPaginator.d.ts +5 -0
  156. package/dist/types/parts/DSPaginator/DSPaginatorCTX.d.ts +5 -0
  157. package/dist/types/parts/DSPaginator/config/getAmountOfPages.d.ts +1 -0
  158. package/dist/types/parts/DSPaginator/config/getInstanceIds.d.ts +3 -0
  159. package/dist/types/parts/DSPaginator/config/navigationKeys.d.ts +3 -0
  160. package/dist/types/parts/DSPaginator/config/useFocusTracker.d.ts +20 -0
  161. package/dist/types/parts/DSPaginator/config/usePaginator.d.ts +52 -18
  162. package/dist/types/parts/DSPaginator/config/usePaginatorFloatingContext.d.ts +31 -0
  163. package/dist/types/parts/DSPaginator/config/usePaginatorInteractions.d.ts +37 -0
  164. package/dist/types/parts/DSPaginator/config/usePaginatorSizing.d.ts +37 -0
  165. package/dist/types/parts/DSPaginator/constants/index.d.ts +36 -1
  166. package/dist/types/parts/DSPaginator/parts/OptionRenderer.d.ts +11 -0
  167. package/dist/types/parts/DSPaginator/parts/Panel.d.ts +5 -0
  168. package/dist/types/parts/DSPaginator/parts/Trigger.d.ts +5 -0
  169. package/dist/types/parts/DSPaginator/react-desc-prop-types.d.ts +17 -0
  170. package/dist/types/parts/DSPaginator/styled.d.ts +17 -4
  171. package/dist/types/parts/DSPerPageSelector/DSPerPageSelector.d.ts +5 -0
  172. package/dist/types/parts/DSPerPageSelector/DSPerPageSelectorCTX.d.ts +5 -0
  173. package/dist/types/parts/DSPerPageSelector/config/getInstanceIds.d.ts +3 -0
  174. package/dist/types/parts/DSPerPageSelector/config/getOptions.d.ts +3 -3
  175. package/dist/types/parts/DSPerPageSelector/config/getSelectedOptionIndex.d.ts +2 -0
  176. package/dist/types/parts/DSPerPageSelector/config/navigationKeys.d.ts +3 -0
  177. package/dist/types/parts/DSPerPageSelector/config/useFocusTracker.d.ts +22 -0
  178. package/dist/types/parts/DSPerPageSelector/config/usePerPageSelector.d.ts +43 -10
  179. package/dist/types/parts/DSPerPageSelector/config/usePerPageSelectorFloatingContext.d.ts +31 -0
  180. package/dist/types/parts/DSPerPageSelector/config/usePerPageSelectorInteractions.d.ts +38 -0
  181. package/dist/types/parts/DSPerPageSelector/config/usePerPageSelectorSizing.d.ts +25 -0
  182. package/dist/types/parts/DSPerPageSelector/constants/index.d.ts +32 -5
  183. package/dist/types/parts/DSPerPageSelector/parts/OptionRenderer.d.ts +11 -0
  184. package/dist/types/parts/DSPerPageSelector/parts/Panel.d.ts +5 -0
  185. package/dist/types/parts/DSPerPageSelector/parts/Trigger.d.ts +5 -0
  186. package/dist/types/parts/DSPerPageSelector/react-desc-prop-types.d.ts +27 -2
  187. package/dist/types/parts/DSPerPageSelector/styled.d.ts +15 -2
  188. package/dist/types/react-desc-prop-types.d.ts +2 -2
  189. package/package.json +15 -13
  190. package/dist/cjs/parts/DSPaginator/config/createPaginatorHeader.js.map +0 -7
  191. package/dist/cjs/parts/DSPaginator/config/getOptions.js +0 -76
  192. package/dist/cjs/parts/DSPaginator/config/getOptions.js.map +0 -7
  193. package/dist/cjs/parts/DSPaginator/config/usePaginationSearch.js.map +0 -7
  194. package/dist/esm/parts/DSPaginator/config/createPaginatorHeader.js +0 -24
  195. package/dist/esm/parts/DSPaginator/config/createPaginatorHeader.js.map +0 -7
  196. package/dist/esm/parts/DSPaginator/config/getOptions.js +0 -46
  197. package/dist/esm/parts/DSPaginator/config/getOptions.js.map +0 -7
  198. package/dist/esm/parts/DSPaginator/config/usePaginationSearch.js +0 -33
  199. package/dist/esm/parts/DSPaginator/config/usePaginationSearch.js.map +0 -7
  200. package/dist/types/parts/DSPaginator/config/createPaginatorHeader.d.ts +0 -9
  201. package/dist/types/parts/DSPaginator/config/getOptions.d.ts +0 -8
  202. 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/DSPerPageSelector/parts/OptionRenderer.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { Checkmark } from '@elliemae/ds-icons';\nimport React, { useCallback, useContext } from 'react';\nimport { getSelectedOptionIndex } from '../config/getSelectedOptionIndex.js';\nimport { getOptionRegionId } from '../config/useFocusTracker.js';\nimport { PER_PAGE_SELECTOR_DATA_TESTID } from '../constants/index.js';\nimport { DSPerPageSelectorContext } from '../DSPerPageSelectorCTX.js';\nimport { StyledOption, StyledOptionCheckmark, StyledOptionLabel } from '../styled.js';\n\ntype OptionRendererPropsT = { index: number };\n\n/**\n * One option of the list. Rendered by the virtual list, so only the options near the viewport are mounted:\n * every position-dependent a11y fact (`aria-posinset`, `aria-setsize`) is explicit, and the focus lands on an option by\n * its dsId identity from the ref callback (see useFocusTracker), not by its place in the DOM.\n */\nexport const OptionRenderer = ({ index }: OptionRendererPropsT) => {\n const {\n propsWithDefault: { pageSize },\n ownerPropsConfig: { getOwnerProps },\n options,\n chevronWidth,\n focusTrackers: { focusRegion, trackFocusOption },\n commitOption,\n } = useContext(DSPerPageSelectorContext);\n\n const option = options[index];\n const isSelected = getSelectedOptionIndex(options, pageSize) === index;\n const isFocusTarget = focusRegion === getOptionRegionId(option.dsId);\n\n const handleRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (node && isFocusTarget) node.focus();\n },\n [isFocusTarget],\n );\n // the tracker follows the real focus, so a mouse or pointer interaction can't leave it pointing somewhere else\n const handleFocus = useCallback(() => trackFocusOption(option.dsId), [option.dsId, trackFocusOption]);\n const handleClick = useCallback(() => commitOption(option), [commitOption, option]);\n const getOwnerPropsArguments = useCallback(() => ({ option, isSelected }), [option, isSelected]);\n\n return (\n <StyledOption\n // legacy data-testid \u2014 preserved for QA/consumer compatibility, breaking change if removed\n data-testid={PER_PAGE_SELECTOR_DATA_TESTID.OPTION}\n role=\"option\"\n aria-selected={isSelected}\n aria-setsize={options.length}\n aria-posinset={index + 1}\n // roving tabindex: the option that holds the focus is the single tab stop of the list\n tabIndex={isFocusTarget ? 0 : -1}\n innerRef={handleRef}\n onFocus={handleFocus}\n onClick={handleClick}\n // same columns as the header: [checkmark] [label]\n style={{ gridTemplateColumns: `${chevronWidth}px auto` }}\n getOwnerProps={getOwnerProps}\n getOwnerPropsArguments={getOwnerPropsArguments}\n >\n {/* the selected state is conveyed by aria-selected, the icon is only visual */}\n <StyledOptionCheckmark\n aria-hidden=\"true\"\n getOwnerProps={getOwnerProps}\n getOwnerPropsArguments={getOwnerPropsArguments}\n >\n {isSelected ? <Checkmark size=\"s\" color={['brand-primary', '600']} /> : null}\n </StyledOptionCheckmark>\n <StyledOptionLabel getOwnerProps={getOwnerProps} getOwnerPropsArguments={getOwnerPropsArguments}>\n {option.label}\n </StyledOptionLabel>\n </StyledOption>\n );\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACyCnB,SAuBkB,KAvBlB;AAzCJ,SAAS,iBAAiB;AAC1B,SAAgB,aAAa,kBAAkB;AAC/C,SAAS,8BAA8B;AACvC,SAAS,yBAAyB;AAClC,SAAS,qCAAqC;AAC9C,SAAS,gCAAgC;AACzC,SAAS,cAAc,uBAAuB,yBAAyB;AAShE,MAAM,iBAAiB,CAAC,EAAE,MAAM,MAA4B;AACjE,QAAM;AAAA,IACJ,kBAAkB,EAAE,SAAS;AAAA,IAC7B,kBAAkB,EAAE,cAAc;AAAA,IAClC;AAAA,IACA;AAAA,IACA,eAAe,EAAE,aAAa,iBAAiB;AAAA,IAC/C;AAAA,EACF,IAAI,WAAW,wBAAwB;AAEvC,QAAM,SAAS,QAAQ,KAAK;AAC5B,QAAM,aAAa,uBAAuB,SAAS,QAAQ,MAAM;AACjE,QAAM,gBAAgB,gBAAgB,kBAAkB,OAAO,IAAI;AAEnE,QAAM,YAAY;AAAA,IAChB,CAAC,SAAgC;AAC/B,UAAI,QAAQ,cAAe,MAAK,MAAM;AAAA,IACxC;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,cAAc,YAAY,MAAM,iBAAiB,OAAO,IAAI,GAAG,CAAC,OAAO,MAAM,gBAAgB,CAAC;AACpG,QAAM,cAAc,YAAY,MAAM,aAAa,MAAM,GAAG,CAAC,cAAc,MAAM,CAAC;AAClF,QAAM,yBAAyB,YAAY,OAAO,EAAE,QAAQ,WAAW,IAAI,CAAC,QAAQ,UAAU,CAAC;AAE/F,SACE;AAAA,IAAC;AAAA;AAAA,MAEC,eAAa,8BAA8B;AAAA,MAC3C,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,gBAAc,QAAQ;AAAA,MACtB,iBAAe,QAAQ;AAAA,MAEvB,UAAU,gBAAgB,IAAI;AAAA,MAC9B,UAAU;AAAA,MACV,SAAS;AAAA,MACT,SAAS;AAAA,MAET,OAAO,EAAE,qBAAqB,GAAG,YAAY,UAAU;AAAA,MACvD;AAAA,MACA;AAAA,MAGA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ;AAAA,YACA;AAAA,YAEC,uBAAa,oBAAC,aAAU,MAAK,KAAI,OAAO,CAAC,iBAAiB,KAAK,GAAG,IAAK;AAAA;AAAA,QAC1E;AAAA,QACA,oBAAC,qBAAkB,eAA8B,wBAC9C,iBAAO,OACV;AAAA;AAAA;AAAA,EACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,90 @@
1
+ import * as React from "react";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useContext } from "react";
4
+ import { PER_PAGE_SELECTOR_DATA_TESTID, PER_PAGE_SELECTOR_OPTION_HEIGHT } from "../constants/index.js";
5
+ import { DSPerPageSelectorContext } from "../DSPerPageSelectorCTX.js";
6
+ import { StyledFloatingWrapper, StyledHeader, StyledList, StyledListWrapper, StyledPanel } from "../styled.js";
7
+ import { OptionRenderer } from "./OptionRenderer.js";
8
+ const getEstimatedSize = () => PER_PAGE_SELECTOR_OPTION_HEIGHT;
9
+ const Panel = () => {
10
+ const {
11
+ ownerPropsConfig,
12
+ isOpen,
13
+ options,
14
+ panelStyle,
15
+ listMaxHeight,
16
+ floatingStyles,
17
+ floatingContext,
18
+ floatingInnerRef,
19
+ listActionRef,
20
+ handleListWrapperRef,
21
+ handlePanelKeyDown,
22
+ handlePanelKeyDownCapture,
23
+ handleBlurOutOfWidget,
24
+ headerId,
25
+ listId,
26
+ dialogId
27
+ } = useContext(DSPerPageSelectorContext);
28
+ const getOptionId = useCallback((index) => options[index].dsId, [options]);
29
+ return /* @__PURE__ */ jsx(
30
+ StyledFloatingWrapper,
31
+ {
32
+ innerRef: floatingInnerRef,
33
+ isOpen,
34
+ floatingStyles,
35
+ context: floatingContext,
36
+ id: dialogId,
37
+ role: "dialog",
38
+ "aria-labelledby": headerId,
39
+ ...ownerPropsConfig,
40
+ children: /* @__PURE__ */ jsxs(
41
+ StyledPanel,
42
+ {
43
+ "data-testid": PER_PAGE_SELECTOR_DATA_TESTID.PANEL,
44
+ style: panelStyle,
45
+ onKeyDownCapture: handlePanelKeyDownCapture,
46
+ onKeyDown: handlePanelKeyDown,
47
+ onBlur: handleBlurOutOfWidget,
48
+ ...ownerPropsConfig,
49
+ children: [
50
+ /* @__PURE__ */ jsx(
51
+ StyledHeader,
52
+ {
53
+ id: headerId,
54
+ "data-testid": PER_PAGE_SELECTOR_DATA_TESTID.HEADER,
55
+ ...ownerPropsConfig,
56
+ children: /* @__PURE__ */ jsx("span", { children: "Per Page" })
57
+ }
58
+ ),
59
+ /* @__PURE__ */ jsx(StyledListWrapper, { innerRef: handleListWrapperRef, ...ownerPropsConfig, children: /* @__PURE__ */ jsx(
60
+ StyledList,
61
+ {
62
+ dsFastlistWrapperList: {
63
+ role: "listbox",
64
+ id: listId,
65
+ "aria-labelledby": headerId,
66
+ // legacy data-testid — preserved for QA/consumer compatibility, breaking change if removed
67
+ "data-testid": PER_PAGE_SELECTOR_DATA_TESTID.LIST
68
+ },
69
+ dsFastlistItem: { role: "none" },
70
+ dsFastlistContainer: { style: { height: "auto", maxHeight: listMaxHeight } },
71
+ actionRef: listActionRef,
72
+ count: options.length,
73
+ ItemRenderer: OptionRenderer,
74
+ getId: getOptionId,
75
+ estimateSize: getEstimatedSize,
76
+ remountOnCountChange: false,
77
+ ...ownerPropsConfig
78
+ }
79
+ ) })
80
+ ]
81
+ }
82
+ )
83
+ }
84
+ );
85
+ };
86
+ Panel.displayName = "DSPerPageSelector.Panel";
87
+ export {
88
+ Panel
89
+ };
90
+ //# sourceMappingURL=Panel.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/parts/DSPerPageSelector/parts/Panel.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useCallback, useContext } from 'react';\nimport { PER_PAGE_SELECTOR_DATA_TESTID, PER_PAGE_SELECTOR_OPTION_HEIGHT } from '../constants/index.js';\nimport { DSPerPageSelectorContext } from '../DSPerPageSelectorCTX.js';\nimport { StyledFloatingWrapper, StyledHeader, StyledList, StyledListWrapper, StyledPanel } from '../styled.js';\nimport { OptionRenderer } from './OptionRenderer.js';\n\n// stable reference: the virtual list reads it on every render\nconst getEstimatedSize = () => PER_PAGE_SELECTOR_OPTION_HEIGHT;\n\nexport const Panel = () => {\n const {\n ownerPropsConfig,\n isOpen,\n options,\n panelStyle,\n listMaxHeight,\n floatingStyles,\n floatingContext,\n floatingInnerRef,\n listActionRef,\n handleListWrapperRef,\n handlePanelKeyDown,\n handlePanelKeyDownCapture,\n handleBlurOutOfWidget,\n headerId,\n listId,\n dialogId,\n } = useContext(DSPerPageSelectorContext);\n\n const getOptionId = useCallback((index: number) => options[index].dsId, [options]);\n\n // the dialog (non-modal) and the list are named by the visible header, so what is announced is what is displayed\n return (\n <StyledFloatingWrapper\n innerRef={floatingInnerRef}\n isOpen={isOpen}\n floatingStyles={floatingStyles}\n context={floatingContext}\n id={dialogId}\n role=\"dialog\"\n aria-labelledby={headerId}\n {...ownerPropsConfig}\n >\n <StyledPanel\n // legacy data-testid \u2014 preserved for QA/consumer compatibility, breaking change if removed\n data-testid={PER_PAGE_SELECTOR_DATA_TESTID.PANEL}\n style={panelStyle}\n onKeyDownCapture={handlePanelKeyDownCapture}\n onKeyDown={handlePanelKeyDown}\n onBlur={handleBlurOutOfWidget}\n {...ownerPropsConfig}\n >\n <StyledHeader\n id={headerId}\n // legacy data-testid \u2014 preserved for QA/consumer compatibility, breaking change if removed\n data-testid={PER_PAGE_SELECTOR_DATA_TESTID.HEADER}\n {...ownerPropsConfig}\n >\n <span>Per Page</span>\n </StyledHeader>\n <StyledListWrapper innerRef={handleListWrapperRef} {...ownerPropsConfig}>\n <StyledList\n dsFastlistWrapperList={{\n role: 'listbox',\n id: listId,\n 'aria-labelledby': headerId,\n // legacy data-testid \u2014 preserved for QA/consumer compatibility, breaking change if removed\n 'data-testid': PER_PAGE_SELECTOR_DATA_TESTID.LIST,\n }}\n // the rows are the options themselves (they carry role=\"option\"), the wrapper of the virtual list is inert\n dsFastlistItem={{ role: 'none' }}\n // rows can wrap, so the list is as tall as its rows up to a maximum (its own default is height: 100%)\n dsFastlistContainer={{ style: { height: 'auto', maxHeight: listMaxHeight } }}\n actionRef={listActionRef}\n count={options.length}\n ItemRenderer={OptionRenderer}\n getId={getOptionId}\n estimateSize={getEstimatedSize}\n remountOnCountChange={false}\n {...ownerPropsConfig}\n />\n </StyledListWrapper>\n </StyledPanel>\n </StyledFloatingWrapper>\n );\n};\n\nPanel.displayName = 'DSPerPageSelector.Panel';\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;AC2CjB,SAeI,KAfJ;AA3CN,SAAgB,aAAa,kBAAkB;AAC/C,SAAS,+BAA+B,uCAAuC;AAC/E,SAAS,gCAAgC;AACzC,SAAS,uBAAuB,cAAc,YAAY,mBAAmB,mBAAmB;AAChG,SAAS,sBAAsB;AAG/B,MAAM,mBAAmB,MAAM;AAExB,MAAM,QAAQ,MAAM;AACzB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,wBAAwB;AAEvC,QAAM,cAAc,YAAY,CAAC,UAAkB,QAAQ,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC;AAGjF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,mBAAiB;AAAA,MAChB,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UAEC,eAAa,8BAA8B;AAAA,UAC3C,OAAO;AAAA,UACP,kBAAkB;AAAA,UAClB,WAAW;AAAA,UACX,QAAQ;AAAA,UACP,GAAG;AAAA,UAEJ;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,gBAEJ,eAAa,8BAA8B;AAAA,gBAC1C,GAAG;AAAA,gBAEJ,8BAAC,UAAK,sBAAQ;AAAA;AAAA,YAChB;AAAA,YACA,oBAAC,qBAAkB,UAAU,sBAAuB,GAAG,kBACrD;AAAA,cAAC;AAAA;AAAA,gBACC,uBAAuB;AAAA,kBACrB,MAAM;AAAA,kBACN,IAAI;AAAA,kBACJ,mBAAmB;AAAA;AAAA,kBAEnB,eAAe,8BAA8B;AAAA,gBAC/C;AAAA,gBAEA,gBAAgB,EAAE,MAAM,OAAO;AAAA,gBAE/B,qBAAqB,EAAE,OAAO,EAAE,QAAQ,QAAQ,WAAW,cAAc,EAAE;AAAA,gBAC3E,WAAW;AAAA,gBACX,OAAO,QAAQ;AAAA,gBACf,cAAc;AAAA,gBACd,OAAO;AAAA,gBACP,cAAc;AAAA,gBACd,sBAAsB;AAAA,gBACrB,GAAG;AAAA;AAAA,YACN,GACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,MAAM,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,65 @@
1
+ import * as React from "react";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { ChevronDown } from "@elliemae/ds-icons";
4
+ import { DSTypography } from "@elliemae/ds-typography";
5
+ import { useCallback, useContext } from "react";
6
+ import { PER_PAGE_SELECTOR_DATA_TESTID, PER_PAGE_SELECTOR_REGION_FOCUSES } from "../constants/index.js";
7
+ import { DSPerPageSelectorContext } from "../DSPerPageSelectorCTX.js";
8
+ import { StyledTrigger, StyledTriggerWrapper } from "../styled.js";
9
+ const Trigger = () => {
10
+ const {
11
+ propsWithDefault: { pageSize },
12
+ xstyledProps,
13
+ globalAttributes,
14
+ ownerPropsConfig,
15
+ isOpen,
16
+ focusTrackers: { focusRegion },
17
+ chevronRef,
18
+ handleTriggerRef,
19
+ handleTriggerClick,
20
+ handleTriggerKeyDown,
21
+ handleBlurOutOfWidget,
22
+ dialogId
23
+ } = useContext(DSPerPageSelectorContext);
24
+ const isFocusTarget = focusRegion === PER_PAGE_SELECTOR_REGION_FOCUSES.TRIGGER;
25
+ const handleRef = useCallback(
26
+ (node) => {
27
+ handleTriggerRef(node);
28
+ if (node && isFocusTarget) node.focus();
29
+ },
30
+ [handleTriggerRef, isFocusTarget]
31
+ );
32
+ return (
33
+ // legacy data-testid (the wrapper of the DSDropdownMenuV2 trigger) — preserved for QA/consumer compatibility, breaking change if removed
34
+ /* @__PURE__ */ jsx(StyledTriggerWrapper, { "data-testid": PER_PAGE_SELECTOR_DATA_TESTID.TRIGGER_WRAPPER, ...ownerPropsConfig, children: /* @__PURE__ */ jsxs(
35
+ StyledTrigger,
36
+ {
37
+ buttonType: "raw",
38
+ innerRef: handleRef,
39
+ "aria-haspopup": "dialog",
40
+ "aria-expanded": isOpen,
41
+ "aria-controls": isOpen ? dialogId : void 0,
42
+ "aria-label": `${pageSize} rows per page`,
43
+ "data-testid": PER_PAGE_SELECTOR_DATA_TESTID.PER_PAGE_SELECTOR,
44
+ ...globalAttributes,
45
+ ...xstyledProps,
46
+ ...ownerPropsConfig,
47
+ onClick: handleTriggerClick,
48
+ onKeyDown: handleTriggerKeyDown,
49
+ onBlur: handleBlurOutOfWidget,
50
+ children: [
51
+ /* @__PURE__ */ jsxs(DSTypography, { variant: "b1", as: "span", className: "typography-per-page-selector", children: [
52
+ pageSize,
53
+ " / page"
54
+ ] }),
55
+ /* @__PURE__ */ jsx(ChevronDown, { color: ["brand-primary", "700"], innerRef: chevronRef })
56
+ ]
57
+ }
58
+ ) })
59
+ );
60
+ };
61
+ Trigger.displayName = "DSPerPageSelector.Trigger";
62
+ export {
63
+ Trigger
64
+ };
65
+ //# sourceMappingURL=Trigger.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/parts/DSPerPageSelector/parts/Trigger.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { ChevronDown } from '@elliemae/ds-icons';\nimport { DSTypography } from '@elliemae/ds-typography';\nimport React, { useCallback, useContext } from 'react';\nimport { PER_PAGE_SELECTOR_DATA_TESTID, PER_PAGE_SELECTOR_REGION_FOCUSES } from '../constants/index.js';\nimport { DSPerPageSelectorContext } from '../DSPerPageSelectorCTX.js';\nimport { StyledTrigger, StyledTriggerWrapper } from '../styled.js';\n\nexport const Trigger = () => {\n const {\n propsWithDefault: { pageSize },\n xstyledProps,\n globalAttributes,\n ownerPropsConfig,\n isOpen,\n focusTrackers: { focusRegion },\n chevronRef,\n handleTriggerRef,\n handleTriggerClick,\n handleTriggerKeyDown,\n handleBlurOutOfWidget,\n dialogId,\n } = useContext(DSPerPageSelectorContext);\n\n // focus tracker: the trigger focuses itself when it is the declared target (e.g. after an option was activated)\n const isFocusTarget = focusRegion === PER_PAGE_SELECTOR_REGION_FOCUSES.TRIGGER;\n const handleRef = useCallback(\n (node: HTMLButtonElement | null) => {\n handleTriggerRef(node);\n if (node && isFocusTarget) node.focus();\n },\n [handleTriggerRef, isFocusTarget],\n );\n\n return (\n // legacy data-testid (the wrapper of the DSDropdownMenuV2 trigger) \u2014 preserved for QA/consumer compatibility, breaking change if removed\n <StyledTriggerWrapper data-testid={PER_PAGE_SELECTOR_DATA_TESTID.TRIGGER_WRAPPER} {...ownerPropsConfig}>\n <StyledTrigger\n buttonType=\"raw\"\n innerRef={handleRef}\n // the trigger owns a non-modal dialog (that hosts the list of options): it is not a toggle button, so no aria-pressed\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? dialogId : undefined}\n aria-label={`${pageSize} rows per page`}\n // legacy data-testid \u2014 preserved for QA/consumer compatibility, breaking change if removed\n data-testid={PER_PAGE_SELECTOR_DATA_TESTID.PER_PAGE_SELECTOR}\n {...globalAttributes}\n {...xstyledProps}\n {...ownerPropsConfig}\n onClick={handleTriggerClick}\n onKeyDown={handleTriggerKeyDown}\n onBlur={handleBlurOutOfWidget}\n >\n <DSTypography variant=\"b1\" as=\"span\" className=\"typography-per-page-selector\">\n {pageSize} / page\n </DSTypography>\n <ChevronDown color={['brand-primary', '700']} innerRef={chevronRef} />\n </StyledTrigger>\n </StyledTriggerWrapper>\n );\n};\n\nTrigger.displayName = 'DSPerPageSelector.Trigger';\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACqDf,SAGA,KAHA;AArDR,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB;AAC7B,SAAgB,aAAa,kBAAkB;AAC/C,SAAS,+BAA+B,wCAAwC;AAChF,SAAS,gCAAgC;AACzC,SAAS,eAAe,4BAA4B;AAE7C,MAAM,UAAU,MAAM;AAC3B,QAAM;AAAA,IACJ,kBAAkB,EAAE,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,EAAE,YAAY;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,wBAAwB;AAGvC,QAAM,gBAAgB,gBAAgB,iCAAiC;AACvE,QAAM,YAAY;AAAA,IAChB,CAAC,SAAmC;AAClC,uBAAiB,IAAI;AACrB,UAAI,QAAQ,cAAe,MAAK,MAAM;AAAA,IACxC;AAAA,IACA,CAAC,kBAAkB,aAAa;AAAA,EAClC;AAEA;AAAA;AAAA,IAEE,oBAAC,wBAAqB,eAAa,8BAA8B,iBAAkB,GAAG,kBACpF;AAAA,MAAC;AAAA;AAAA,QACC,YAAW;AAAA,QACX,UAAU;AAAA,QAEV,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe,SAAS,WAAW;AAAA,QACnC,cAAY,GAAG,QAAQ;AAAA,QAEvB,eAAa,8BAA8B;AAAA,QAC1C,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACJ,SAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQ;AAAA,QAER;AAAA,+BAAC,gBAAa,SAAQ,MAAK,IAAG,QAAO,WAAU,gCAC5C;AAAA;AAAA,YAAS;AAAA,aACZ;AAAA,UACA,oBAAC,eAAY,OAAO,CAAC,iBAAiB,KAAK,GAAG,UAAU,YAAY;AAAA;AAAA;AAAA,IACtE,GACF;AAAA;AAEJ;AAEA,QAAQ,cAAc;",
6
+ "names": []
7
+ }
@@ -18,8 +18,25 @@ const DSPerPageSelectorPropTypes = {
18
18
  ...globalAttributesPropTypes,
19
19
  ...xstyledPropTypes,
20
20
  pageSize: PropTypes.number.description("The current page size").defaultValue(10),
21
- onPageSizeChange: PropTypes.func.description("Function invoked when the page size changes").defaultValue(() => null),
22
- perPageOptions: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.number, PropTypes.object])).description("The available options for page size").defaultValue([10]),
21
+ onPageSizeChange: PropTypes.func.description(
22
+ "Function invoked when the user commits a different page size (Enter, Space, click, or Tab out of the list). Moving through the options with the arrow keys does NOT invoke it"
23
+ ).defaultValue(() => null),
24
+ perPageOptions: PropTypes.arrayOf(
25
+ PropTypes.oneOfType([
26
+ PropTypes.number,
27
+ PropTypes.shape({
28
+ type: PropTypes.oneOf(["single"]),
29
+ dsId: PropTypes.string.isRequired,
30
+ label: PropTypes.string.isRequired,
31
+ value: PropTypes.number.isRequired
32
+ })
33
+ ])
34
+ ).description(
35
+ 'The available options for page size: a number (its own label and dsId), or an object { type?: "single", dsId, label, value }. The selected option is the one whose dsId is the page size. Nothing else of an object is read'
36
+ ).defaultValue([10]),
37
+ listWidth: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).description(
38
+ "Width of the open list (a number is px, a string is any CSS length). Labels wrap inside it; it is never wider than the viewport. Default: 100px"
39
+ ),
23
40
  minPerPage: PropTypes.number.description("Min for the per page options").defaultValue(0),
24
41
  maxPerPage: PropTypes.number.description("Max for the per page options").defaultValue(100),
25
42
  perPageStep: PropTypes.number.description("Step for the per page options").defaultValue(5)
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/parts/DSPerPageSelector/react-desc-prop-types.ts"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import type { DSDropdownMenuT } from '@elliemae/ds-dropdownmenu-v2';\nimport type { DSPropTypesSchema, GlobalAttributesT, ValidationMap, XstyledProps } from '@elliemae/ds-props-helpers';\nimport {\n PropTypes,\n getPropsPerSlotPropTypes,\n globalAttributesPropTypes,\n xstyledPropTypes,\n} from '@elliemae/ds-props-helpers';\nimport { type TypescriptHelpersT } from '@elliemae/ds-typescript-helpers';\nimport { DSPaginationName, PER_PAGE_SELECTOR_SLOTS } from './constants/index.js';\n\nexport declare namespace DSPerPageSelectorT {\n export type SlotFunctionArguments = {\n dsPaginationPerPageSelector: () => object;\n };\n export interface RequiredProps {}\n\n export interface DefaultProps {\n pageSize: number;\n onPageSizeChange: (pageSize: number) => void;\n perPageStep: number;\n minPerPage: number;\n maxPerPage: number;\n }\n\n export interface OptionalProps extends TypescriptHelpersT.PropsForGlobalOnSlots<\n typeof DSPaginationName,\n typeof PER_PAGE_SELECTOR_SLOTS\n > {\n perPageOptions?: (number | DSDropdownMenuT.ItemSingleOptions)[];\n }\n export interface Props\n extends\n Partial<DefaultProps>,\n OptionalProps,\n Omit<GlobalAttributesT<HTMLElement>, keyof DefaultProps | keyof XstyledProps>,\n XstyledProps,\n RequiredProps {}\n\n export interface InternalProps\n extends\n DefaultProps,\n OptionalProps,\n Omit<GlobalAttributesT<HTMLElement>, keyof DefaultProps | keyof XstyledProps>,\n XstyledProps,\n RequiredProps {}\n}\n\nexport const defaultProps: DSPerPageSelectorT.DefaultProps = {\n pageSize: 10,\n onPageSizeChange: () => null,\n perPageStep: 5,\n minPerPage: 0,\n maxPerPage: 100,\n};\n\nexport const DSPerPageSelectorPropTypes: DSPropTypesSchema<DSPerPageSelectorT.Props> = {\n ...getPropsPerSlotPropTypes(DSPaginationName, PER_PAGE_SELECTOR_SLOTS),\n ...globalAttributesPropTypes,\n ...xstyledPropTypes,\n pageSize: PropTypes.number.description('The current page size').defaultValue(10),\n onPageSizeChange: PropTypes.func.description('Function invoked when the page size changes').defaultValue(() => null),\n perPageOptions: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.number, PropTypes.object]))\n .description('The available options for page size')\n .defaultValue([10]),\n minPerPage: PropTypes.number.description('Min for the per page options').defaultValue(0),\n maxPerPage: PropTypes.number.description('Max for the per page options').defaultValue(100),\n perPageStep: PropTypes.number.description('Step for the per page options').defaultValue(5),\n};\n\nexport const DSPerPageSelectorPropTypesSchema =\n DSPerPageSelectorPropTypes as unknown as ValidationMap<DSPerPageSelectorT.Props>;\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACEvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,kBAAkB,+BAA+B;AAuCnD,MAAM,eAAgD;AAAA,EAC3D,UAAU;AAAA,EACV,kBAAkB,MAAM;AAAA,EACxB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AACd;AAEO,MAAM,6BAA0E;AAAA,EACrF,GAAG,yBAAyB,kBAAkB,uBAAuB;AAAA,EACrE,GAAG;AAAA,EACH,GAAG;AAAA,EACH,UAAU,UAAU,OAAO,YAAY,uBAAuB,EAAE,aAAa,EAAE;AAAA,EAC/E,kBAAkB,UAAU,KAAK,YAAY,6CAA6C,EAAE,aAAa,MAAM,IAAI;AAAA,EACnH,gBAAgB,UAAU,QAAQ,UAAU,UAAU,CAAC,UAAU,QAAQ,UAAU,MAAM,CAAC,CAAC,EACxF,YAAY,qCAAqC,EACjD,aAAa,CAAC,EAAE,CAAC;AAAA,EACpB,YAAY,UAAU,OAAO,YAAY,8BAA8B,EAAE,aAAa,CAAC;AAAA,EACvF,YAAY,UAAU,OAAO,YAAY,8BAA8B,EAAE,aAAa,GAAG;AAAA,EACzF,aAAa,UAAU,OAAO,YAAY,+BAA+B,EAAE,aAAa,CAAC;AAC3F;AAEO,MAAM,mCACX;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import type { DSPropTypesSchema, GlobalAttributesT, ValidationMap, XstyledProps } from '@elliemae/ds-props-helpers';\nimport {\n PropTypes,\n getPropsPerSlotPropTypes,\n globalAttributesPropTypes,\n xstyledPropTypes,\n} from '@elliemae/ds-props-helpers';\nimport { type TypescriptHelpersT } from '@elliemae/ds-typescript-helpers';\nimport { DSPaginationName, PER_PAGE_SELECTOR_SLOTS } from './constants/index.js';\n\nexport declare namespace DSPerPageSelectorT {\n export type SlotFunctionArguments = {\n dsPaginationPerPageSelector: () => object;\n dsPaginationPerPageSelectorTriggerWrapper: () => object;\n dsPaginationPerPageSelectorFloatingWrapper: () => object;\n dsPaginationPerPageSelectorPanel: () => object;\n dsPaginationPerPageSelectorHeader: () => object;\n dsPaginationPerPageSelectorListWrapper: () => object;\n dsPaginationPerPageSelectorList: () => object;\n dsPaginationPerPageSelectorOption: () => object;\n dsPaginationPerPageSelectorOptionCheckmark: () => object;\n dsPaginationPerPageSelectorOptionLabel: () => object;\n };\n\n /**\n * One option of the list: what the examples use and what the list reads. It used to be typed as a `DSDropdownMenuV2`\n * single item, which handed consumers a whole contract that was never meant for them nor shown in the examples (`render`,\n * `disabled`, `onClick`, global attributes, xstyled props...). Some of it happened to work because the options were passed\n * to the dropdown unchanged; none of it is supported anymore.\n */\n export interface PerPageOption {\n type?: 'single';\n dsId: string;\n label: string;\n value: number;\n }\n export interface RequiredProps {}\n\n export interface DefaultProps {\n pageSize: number;\n onPageSizeChange: (pageSize: number) => void;\n perPageStep: number;\n minPerPage: number;\n maxPerPage: number;\n }\n\n export interface OptionalProps extends TypescriptHelpersT.PropsForGlobalOnSlots<\n typeof DSPaginationName,\n typeof PER_PAGE_SELECTOR_SLOTS\n > {\n perPageOptions?: (number | PerPageOption)[];\n /**\n * Width of the open list (a number is px, a string is any CSS length). Labels wrap inside it; the list is never wider\n * than the viewport. Default: 100px.\n */\n listWidth?: number | string;\n }\n export interface Props\n extends\n Partial<DefaultProps>,\n OptionalProps,\n Omit<GlobalAttributesT<HTMLElement>, keyof DefaultProps | keyof XstyledProps>,\n XstyledProps,\n RequiredProps {}\n\n export interface InternalProps\n extends\n DefaultProps,\n OptionalProps,\n Omit<GlobalAttributesT<HTMLElement>, keyof DefaultProps | keyof XstyledProps>,\n XstyledProps,\n RequiredProps {}\n}\n\nexport const defaultProps: DSPerPageSelectorT.DefaultProps = {\n pageSize: 10,\n onPageSizeChange: () => null,\n perPageStep: 5,\n minPerPage: 0,\n maxPerPage: 100,\n};\n\nexport const DSPerPageSelectorPropTypes: DSPropTypesSchema<DSPerPageSelectorT.Props> = {\n ...getPropsPerSlotPropTypes(DSPaginationName, PER_PAGE_SELECTOR_SLOTS),\n ...globalAttributesPropTypes,\n ...xstyledPropTypes,\n pageSize: PropTypes.number.description('The current page size').defaultValue(10),\n onPageSizeChange: PropTypes.func\n .description(\n 'Function invoked when the user commits a different page size (Enter, Space, click, or Tab out of the list). Moving through the options with the arrow keys does NOT invoke it',\n )\n .defaultValue(() => null),\n perPageOptions: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.shape({\n type: PropTypes.oneOf(['single']),\n dsId: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n value: PropTypes.number.isRequired,\n }),\n ]),\n )\n .description(\n 'The available options for page size: a number (its own label and dsId), or an object { type?: \"single\", dsId, label, value }. The selected option is the one whose dsId is the page size. Nothing else of an object is read',\n )\n .defaultValue([10]),\n listWidth: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).description(\n 'Width of the open list (a number is px, a string is any CSS length). Labels wrap inside it; it is never wider than the viewport. Default: 100px',\n ),\n minPerPage: PropTypes.number.description('Min for the per page options').defaultValue(0),\n maxPerPage: PropTypes.number.description('Max for the per page options').defaultValue(100),\n perPageStep: PropTypes.number.description('Step for the per page options').defaultValue(5),\n};\n\nexport const DSPerPageSelectorPropTypesSchema =\n DSPerPageSelectorPropTypes as unknown as ValidationMap<DSPerPageSelectorT.Props>;\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACCvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,kBAAkB,+BAA+B;AAkEnD,MAAM,eAAgD;AAAA,EAC3D,UAAU;AAAA,EACV,kBAAkB,MAAM;AAAA,EACxB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AACd;AAEO,MAAM,6BAA0E;AAAA,EACrF,GAAG,yBAAyB,kBAAkB,uBAAuB;AAAA,EACrE,GAAG;AAAA,EACH,GAAG;AAAA,EACH,UAAU,UAAU,OAAO,YAAY,uBAAuB,EAAE,aAAa,EAAE;AAAA,EAC/E,kBAAkB,UAAU,KACzB;AAAA,IACC;AAAA,EACF,EACC,aAAa,MAAM,IAAI;AAAA,EAC1B,gBAAgB,UAAU;AAAA,IACxB,UAAU,UAAU;AAAA,MAClB,UAAU;AAAA,MACV,UAAU,MAAM;AAAA,QACd,MAAM,UAAU,MAAM,CAAC,QAAQ,CAAC;AAAA,QAChC,MAAM,UAAU,OAAO;AAAA,QACvB,OAAO,UAAU,OAAO;AAAA,QACxB,OAAO,UAAU,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAAA,EACH,EACG;AAAA,IACC;AAAA,EACF,EACC,aAAa,CAAC,EAAE,CAAC;AAAA,EACpB,WAAW,UAAU,UAAU,CAAC,UAAU,QAAQ,UAAU,MAAM,CAAC,EAAE;AAAA,IACnE;AAAA,EACF;AAAA,EACA,YAAY,UAAU,OAAO,YAAY,8BAA8B,EAAE,aAAa,CAAC;AAAA,EACvF,YAAY,UAAU,OAAO,YAAY,8BAA8B,EAAE,aAAa,GAAG;AAAA,EACzF,aAAa,UAAU,OAAO,YAAY,+BAA+B,EAAE,aAAa,CAAC;AAC3F;AAEO,MAAM,mCACX;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,15 @@
1
1
  import * as React from "react";
2
2
  import { DSButtonV3 } from "@elliemae/ds-button-v2";
3
+ import { FloatingWrapper } from "@elliemae/ds-floating-context";
4
+ import { DSFastList } from "@elliemae/ds-fast-list";
3
5
  import { css, styled } from "@elliemae/ds-system";
4
- import { DSPaginationName, PER_PAGE_SELECTOR_SLOTS } from "./constants/index.js";
6
+ import {
7
+ DSPaginationName,
8
+ PER_PAGE_SELECTOR_HEADER_HEIGHT,
9
+ PER_PAGE_SELECTOR_OPTION_HEIGHT,
10
+ PER_PAGE_SELECTOR_PANEL_PADDING_BOTTOM,
11
+ PER_PAGE_SELECTOR_SLOTS
12
+ } from "./constants/index.js";
5
13
  const fontSize13Base13 = 13 / 13;
6
14
  const fontSize13Base16 = 13 / 16;
7
15
  const fontSize12Base13 = 12 / 13;
@@ -20,14 +28,17 @@ const styledFocusCss = css`
20
28
  z-index: 7;
21
29
  }
22
30
  `;
23
- const InvisibleDiv = styled.div`
24
- opacity: 0;
25
- white-space: nowrap;
26
- overflow: hidden;
27
- text-overflow: ellipsis;
28
- position: absolute;
31
+ const optionFontSizeCss = css`
32
+ font-size: ${fontSize13Base16}rem;
33
+ @media (min-width: ${({ theme }) => theme.breakpoints.small}) {
34
+ font-size: ${fontSize13Base13}rem;
35
+ }
29
36
  `;
30
- const paginationDropdownButtonCommonStyles = css`
37
+ const StyledTrigger = styled(DSButtonV3, {
38
+ name: DSPaginationName,
39
+ slot: PER_PAGE_SELECTOR_SLOTS.PER_PAGE_SELECTOR,
40
+ preserveLegacyDataTestId: true
41
+ })`
31
42
  min-height: 42px;
32
43
  display: grid;
33
44
  grid-auto-flow: column;
@@ -38,7 +49,9 @@ const paginationDropdownButtonCommonStyles = css`
38
49
  padding-right: 16px;
39
50
  grid-gap: 8px;
40
51
  font-size: 13px;
41
- color: neutral-700;
52
+ /* the previous DSPerPageSelector declares color: neutral-700 here, but inside its css helper the token is never
53
+ resolved, so the declaration is dropped and the text renders with the browser's button color (black, greyed when
54
+ disabled). Not copied: the selector keeps what is rendered today (see dimsum_compliance_status_report.md) */
42
55
  cursor: pointer;
43
56
  border-radius: 0;
44
57
  font-weight: ${(props) => props.theme.fontWeights.regular};
@@ -49,39 +62,104 @@ const paginationDropdownButtonCommonStyles = css`
49
62
  cursor: not-allowed;
50
63
  }
51
64
  white-space: nowrap;
65
+
66
+ /* the typography variants own their font-size, so we target the rendered element by className instead of wrapping
67
+ DSTypography in styled() (same approach as the previous implementation) */
68
+ .typography-per-page-selector {
69
+ ${optionFontSizeCss}
70
+ }
52
71
  `;
53
- const PaginationDropdownButtonPerPageSelector = styled(DSButtonV3, {
72
+ const StyledTriggerWrapper = styled("div", {
54
73
  name: DSPaginationName,
55
- slot: PER_PAGE_SELECTOR_SLOTS.PER_PAGE_SELECTOR,
56
- preserveLegacyDataTestId: true
74
+ slot: PER_PAGE_SELECTOR_SLOTS.TRIGGER_WRAPPER
57
75
  })`
58
- ${paginationDropdownButtonCommonStyles}
59
- /**
60
- * Pagination uses DSTypography internally, but each typography variant defines
61
- * its own font-size. When these components are placed inside a styled() wrapper,
62
- * trying to style them via styled(DSTypography) triggers TypeScript errors
63
- * because DSTypography exposes "as" props and variant-specific overrides.
64
- *
65
- * Instead of wrapping DSTypography directly in styled(), we target the
66
- * underlying rendered elements via className/id. This avoids the TS conflicts
67
- * while still allowing us to override their font-size reliably.
68
- */
69
- .typography-per-page-selector {
70
- font-size: ${fontSize13Base16}rem;
71
- @media (min-width: ${({ theme }) => theme.breakpoints.small}) {
72
- font-size: ${fontSize13Base13}rem;
73
- }
74
- }
76
+ display: contents;
75
77
  `;
76
- const StyledHeader = styled.div`
78
+ const StyledFloatingWrapper = styled(FloatingWrapper, {
79
+ name: DSPaginationName,
80
+ slot: PER_PAGE_SELECTOR_SLOTS.FLOATING_WRAPPER
81
+ })``;
82
+ const StyledPanel = styled("div", { name: DSPaginationName, slot: PER_PAGE_SELECTOR_SLOTS.PANEL })`
83
+ display: grid;
84
+ grid-template-rows: auto 1fr;
85
+ /* same as the previous DSDropdownMenuV2 wrapper: 4px of padding below the list */
86
+ padding-bottom: ${PER_PAGE_SELECTOR_PANEL_PADDING_BOTTOM}px;
87
+ background-color: ${({ theme }) => theme.colors.neutral["000"]};
88
+ `;
89
+ const StyledHeader = styled("div", { name: DSPaginationName, slot: PER_PAGE_SELECTOR_SLOTS.HEADER })`
90
+ display: grid;
91
+ align-items: center;
92
+ box-sizing: border-box;
93
+ min-height: ${PER_PAGE_SELECTOR_HEADER_HEIGHT}px;
94
+ padding: 0 0 0 4px;
95
+ border-bottom: 1px solid ${({ theme }) => theme.colors.neutral[300]};
77
96
  font-size: ${fontSize12Base16}rem;
97
+ color: ${({ theme }) => theme.colors.neutral[500]};
78
98
  @media (min-width: ${({ theme }) => theme.breakpoints.small}) {
79
99
  font-size: ${fontSize12Base13}rem;
80
100
  }
81
101
  `;
102
+ const StyledListWrapper = styled("div", {
103
+ name: DSPaginationName,
104
+ slot: PER_PAGE_SELECTOR_SLOTS.LIST_WRAPPER
105
+ })``;
106
+ const StyledList = styled(DSFastList, { name: DSPaginationName, slot: PER_PAGE_SELECTOR_SLOTS.LIST })``;
107
+ const StyledOption = styled("div", { name: DSPaginationName, slot: PER_PAGE_SELECTOR_SLOTS.OPTION })`
108
+ position: relative;
109
+ display: grid;
110
+ align-items: center;
111
+ column-gap: 8px;
112
+ min-height: ${PER_PAGE_SELECTOR_OPTION_HEIGHT}px;
113
+ padding: 4px 16px;
114
+ cursor: pointer;
115
+ list-style: none;
116
+ ${optionFontSizeCss}
117
+ background-color: ${({ theme }) => theme.colors.neutral["000"]};
118
+ &:hover {
119
+ background-color: ${({ theme }) => theme.colors.brand[200]};
120
+ }
121
+ &:focus {
122
+ outline: none;
123
+ background-color: ${({ theme }) => theme.colors.brand[200]};
124
+ &:after {
125
+ display: block;
126
+ content: ' ';
127
+ position: absolute;
128
+ top: 0;
129
+ left: 0;
130
+ right: 0;
131
+ bottom: 0;
132
+ border: 1px solid ${({ theme }) => theme.colors.brand[500]};
133
+ pointer-events: none;
134
+ z-index: 7;
135
+ }
136
+ }
137
+ `;
138
+ const StyledOptionCheckmark = styled("span", {
139
+ name: DSPaginationName,
140
+ slot: PER_PAGE_SELECTOR_SLOTS.OPTION_CHECKMARK
141
+ })`
142
+ display: grid;
143
+ place-items: center;
144
+ `;
145
+ const StyledOptionLabel = styled("span", {
146
+ name: DSPaginationName,
147
+ slot: PER_PAGE_SELECTOR_SLOTS.OPTION_LABEL
148
+ })`
149
+ /* labels wrap, they are never truncated (see stories/docs/principles/a11y/TextTruncationCriticalities.md) */
150
+ white-space: normal;
151
+ overflow-wrap: anywhere;
152
+ `;
82
153
  export {
83
- InvisibleDiv,
84
- PaginationDropdownButtonPerPageSelector,
85
- StyledHeader
154
+ StyledFloatingWrapper,
155
+ StyledHeader,
156
+ StyledList,
157
+ StyledListWrapper,
158
+ StyledOption,
159
+ StyledOptionCheckmark,
160
+ StyledOptionLabel,
161
+ StyledPanel,
162
+ StyledTrigger,
163
+ StyledTriggerWrapper
86
164
  };
87
165
  //# sourceMappingURL=styled.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/parts/DSPerPageSelector/styled.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "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 &:disabled {\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"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,kBAAkB;AAE3B,SAAS,KAAK,cAAc;AAE5B,SAAS,kBAAkB,+BAA+B;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,OAAO;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,0CAA0C,OAAO,YAAY;AAAA,EACxE,MAAM;AAAA,EACN,MAAM,wBAAwB;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,OAAO;AAAA,eACpB,gBAAgB;AAAA,uBACR,CAAC,EAAE,MAAM,MAAM,MAAM,YAAY,KAAK;AAAA,iBAC5C,gBAAgB;AAAA;AAAA;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { DSButtonV3 } from '@elliemae/ds-button-v2';\nimport { FloatingWrapper } from '@elliemae/ds-floating-context';\nimport { DSFastList } from '@elliemae/ds-fast-list';\nimport { css, styled } from '@elliemae/ds-system';\nimport type {} from '@xstyled/system';\nimport {\n DSPaginationName,\n PER_PAGE_SELECTOR_HEADER_HEIGHT,\n PER_PAGE_SELECTOR_OPTION_HEIGHT,\n PER_PAGE_SELECTOR_PANEL_PADDING_BOTTOM,\n PER_PAGE_SELECTOR_SLOTS,\n} from './constants/index.js';\n\n// the font sizes are the ones of the previous DSPerPageSelector (same rem/px dance between the 13px and 16px base)\nconst fontSize13Base13 = 13 / 13;\nconst fontSize13Base16 = 13 / 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\nconst optionFontSizeCss = css`\n font-size: ${fontSize13Base16}rem;\n @media (min-width: ${({ theme }) => theme.breakpoints.small}) {\n font-size: ${fontSize13Base13}rem;\n }\n`;\n\nexport const StyledTrigger = styled(DSButtonV3, {\n name: DSPaginationName,\n slot: PER_PAGE_SELECTOR_SLOTS.PER_PAGE_SELECTOR,\n preserveLegacyDataTestId: true,\n})`\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 /* the previous DSPerPageSelector declares color: neutral-700 here, but inside its css helper the token is never\n resolved, so the declaration is dropped and the text renders with the browser's button color (black, greyed when\n disabled). Not copied: the selector keeps what is rendered today (see dimsum_compliance_status_report.md) */\n cursor: pointer;\n border-radius: 0;\n font-weight: ${(props) => props.theme.fontWeights.regular};\n :focus {\n ${styledFocusCss}\n }\n &:disabled {\n cursor: not-allowed;\n }\n white-space: nowrap;\n\n /* the typography variants own their font-size, so we target the rendered element by className instead of wrapping\n DSTypography in styled() (same approach as the previous implementation) */\n .typography-per-page-selector {\n ${optionFontSizeCss}\n }\n`;\n\nexport const StyledTriggerWrapper = styled('div', {\n name: DSPaginationName,\n slot: PER_PAGE_SELECTOR_SLOTS.TRIGGER_WRAPPER,\n})`\n display: contents;\n`;\n\nexport const StyledFloatingWrapper = styled(FloatingWrapper, {\n name: DSPaginationName,\n slot: PER_PAGE_SELECTOR_SLOTS.FLOATING_WRAPPER,\n})``;\n\nexport const StyledPanel = styled('div', { name: DSPaginationName, slot: PER_PAGE_SELECTOR_SLOTS.PANEL })`\n display: grid;\n grid-template-rows: auto 1fr;\n /* same as the previous DSDropdownMenuV2 wrapper: 4px of padding below the list */\n padding-bottom: ${PER_PAGE_SELECTOR_PANEL_PADDING_BOTTOM}px;\n background-color: ${({ theme }) => theme.colors.neutral['000']};\n`;\n\nexport const StyledHeader = styled('div', { name: DSPaginationName, slot: PER_PAGE_SELECTOR_SLOTS.HEADER })`\n display: grid;\n align-items: center;\n box-sizing: border-box;\n min-height: ${PER_PAGE_SELECTOR_HEADER_HEIGHT}px;\n padding: 0 0 0 4px;\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral[300]};\n font-size: ${fontSize12Base16}rem;\n color: ${({ theme }) => theme.colors.neutral[500]};\n @media (min-width: ${({ theme }) => theme.breakpoints.small}) {\n font-size: ${fontSize12Base13}rem;\n }\n`;\n\n// explicit height: the virtual list needs a constrained box to scroll (its own container is height: 100%)\nexport const StyledListWrapper = styled('div', {\n name: DSPaginationName,\n slot: PER_PAGE_SELECTOR_SLOTS.LIST_WRAPPER,\n})``;\n\nexport const StyledList = styled(DSFastList, { name: DSPaginationName, slot: PER_PAGE_SELECTOR_SLOTS.LIST })``;\n\nexport const StyledOption = styled('div', { name: DSPaginationName, slot: PER_PAGE_SELECTOR_SLOTS.OPTION })`\n position: relative;\n display: grid;\n align-items: center;\n column-gap: 8px;\n min-height: ${PER_PAGE_SELECTOR_OPTION_HEIGHT}px;\n padding: 4px 16px;\n cursor: pointer;\n list-style: none;\n ${optionFontSizeCss}\n background-color: ${({ theme }) => theme.colors.neutral['000']};\n &:hover {\n background-color: ${({ theme }) => theme.colors.brand[200]};\n }\n &:focus {\n outline: none;\n background-color: ${({ theme }) => theme.colors.brand[200]};\n &:after {\n display: block;\n content: ' ';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 1px solid ${({ theme }) => theme.colors.brand[500]};\n pointer-events: none;\n z-index: 7;\n }\n }\n`;\n\nexport const StyledOptionCheckmark = styled('span', {\n name: DSPaginationName,\n slot: PER_PAGE_SELECTOR_SLOTS.OPTION_CHECKMARK,\n})`\n display: grid;\n place-items: center;\n`;\n\nexport const StyledOptionLabel = styled('span', {\n name: DSPaginationName,\n slot: PER_PAGE_SELECTOR_SLOTS.OPTION_LABEL,\n})`\n /* labels wrap, they are never truncated (see stories/docs/principles/a11y/TextTruncationCriticalities.md) */\n white-space: normal;\n overflow-wrap: anywhere;\n`;\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAC3B,SAAS,KAAK,cAAc;AAE5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,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;AAM9D,MAAM,oBAAoB;AAAA,eACX,gBAAgB;AAAA,uBACR,CAAC,EAAE,MAAM,MAAM,MAAM,YAAY,KAAK;AAAA,iBAC5C,gBAAgB;AAAA;AAAA;AAI1B,MAAM,gBAAgB,OAAO,YAAY;AAAA,EAC9C,MAAM;AAAA,EACN,MAAM,wBAAwB;AAAA,EAC9B,0BAA0B;AAC5B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAgBgB,CAAC,UAAU,MAAM,MAAM,YAAY,OAAO;AAAA;AAAA,MAErD,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUd,iBAAiB;AAAA;AAAA;AAIhB,MAAM,uBAAuB,OAAO,OAAO;AAAA,EAChD,MAAM;AAAA,EACN,MAAM,wBAAwB;AAChC,CAAC;AAAA;AAAA;AAIM,MAAM,wBAAwB,OAAO,iBAAiB;AAAA,EAC3D,MAAM;AAAA,EACN,MAAM,wBAAwB;AAChC,CAAC;AAEM,MAAM,cAAc,OAAO,OAAO,EAAE,MAAM,kBAAkB,MAAM,wBAAwB,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA,oBAIpF,sCAAsC;AAAA,sBACpC,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,QAAQ,KAAK,CAAC;AAAA;AAGzD,MAAM,eAAe,OAAO,OAAO,EAAE,MAAM,kBAAkB,MAAM,wBAAwB,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,gBAI1F,+BAA+B;AAAA;AAAA,6BAElB,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,QAAQ,GAAG,CAAC;AAAA,eACtD,gBAAgB;AAAA,WACpB,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,QAAQ,GAAG,CAAC;AAAA,uBAC5B,CAAC,EAAE,MAAM,MAAM,MAAM,YAAY,KAAK;AAAA,iBAC5C,gBAAgB;AAAA;AAAA;AAK1B,MAAM,oBAAoB,OAAO,OAAO;AAAA,EAC7C,MAAM;AAAA,EACN,MAAM,wBAAwB;AAChC,CAAC;AAEM,MAAM,aAAa,OAAO,YAAY,EAAE,MAAM,kBAAkB,MAAM,wBAAwB,KAAK,CAAC;AAEpG,MAAM,eAAe,OAAO,OAAO,EAAE,MAAM,kBAAkB,MAAM,wBAAwB,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,gBAK1F,+BAA+B;AAAA;AAAA;AAAA;AAAA,IAI3C,iBAAiB;AAAA,sBACC,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,QAAQ,KAAK,CAAC;AAAA;AAAA,wBAExC,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA,wBAItC,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BASpC,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAOzD,MAAM,wBAAwB,OAAO,QAAQ;AAAA,EAClD,MAAM;AAAA,EACN,MAAM,wBAAwB;AAChC,CAAC;AAAA;AAAA;AAAA;AAKM,MAAM,oBAAoB,OAAO,QAAQ;AAAA,EAC9C,MAAM;AAAA,EACN,MAAM,wBAAwB;AAChC,CAAC;AAAA;AAAA;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,16 @@ const SlotPropsAsObj = {
3
3
  dsPaginationPerPageSelector: { "aria-label": "just a typescript test" }
4
4
  };
5
5
  const SlotPropsAsFunctions = {
6
- dsPaginationPerPageSelector: () => ({ "aria-label": "just a typescript test" })
6
+ dsPaginationPerPageSelector: () => ({ "aria-label": "just a typescript test" }),
7
+ dsPaginationPerPageSelectorTriggerWrapper: () => ({ "aria-label": "just a typescript test" }),
8
+ dsPaginationPerPageSelectorFloatingWrapper: () => ({ "aria-label": "just a typescript test" }),
9
+ dsPaginationPerPageSelectorPanel: () => ({ "aria-label": "just a typescript test" }),
10
+ dsPaginationPerPageSelectorHeader: () => ({ "aria-label": "just a typescript test" }),
11
+ dsPaginationPerPageSelectorListWrapper: () => ({ "aria-label": "just a typescript test" }),
12
+ dsPaginationPerPageSelectorList: () => ({ "aria-label": "just a typescript test" }),
13
+ dsPaginationPerPageSelectorOption: () => ({ "aria-label": "just a typescript test" }),
14
+ dsPaginationPerPageSelectorOptionCheckmark: () => ({ "aria-label": "just a typescript test" }),
15
+ dsPaginationPerPageSelectorOptionLabel: () => ({ "aria-label": "just a typescript test" })
7
16
  };
8
17
  const EnsureAllSlotsExistInSlotFunctionArguments = SlotPropsAsFunctions;
9
18
  //# sourceMappingURL=slots-props.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/parts/DSPerPageSelector/typescript-testing/slots-props.ts"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\n\nimport type { TypescriptHelpersT } from '@elliemae/ds-typescript-helpers';\nimport type { DSPaginationName, PER_PAGE_SELECTOR_SLOTS } from '../constants/index.js';\nimport type { DSPerPageSelectorT } from '../react-desc-prop-types.js';\n\nconst SlotPropsAsObj: Partial<DSPerPageSelectorT.Props> = {\n dsPaginationPerPageSelector: { 'aria-label': 'just a typescript test' },\n};\nconst SlotPropsAsFunctions: DSPerPageSelectorT.SlotFunctionArguments = {\n dsPaginationPerPageSelector: () => ({ 'aria-label': 'just a typescript test' }),\n};\nconst EnsureAllSlotsExistInSlotFunctionArguments: Required<\n TypescriptHelpersT.PropsForSlots<typeof DSPaginationName, typeof PER_PAGE_SELECTOR_SLOTS>\n> = SlotPropsAsFunctions;\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACMvB,MAAM,iBAAoD;AAAA,EACxD,6BAA6B,EAAE,cAAc,yBAAyB;AACxE;AACA,MAAM,uBAAiE;AAAA,EACrE,6BAA6B,OAAO,EAAE,cAAc,yBAAyB;AAC/E;AACA,MAAM,6CAEF;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\n\nimport type { TypescriptHelpersT } from '@elliemae/ds-typescript-helpers';\nimport type { DSPaginationName, PER_PAGE_SELECTOR_SLOTS } from '../constants/index.js';\nimport type { DSPerPageSelectorT } from '../react-desc-prop-types.js';\n\nconst SlotPropsAsObj: Partial<DSPerPageSelectorT.Props> = {\n dsPaginationPerPageSelector: { 'aria-label': 'just a typescript test' },\n};\nconst SlotPropsAsFunctions: DSPerPageSelectorT.SlotFunctionArguments = {\n dsPaginationPerPageSelector: () => ({ 'aria-label': 'just a typescript test' }),\n dsPaginationPerPageSelectorTriggerWrapper: () => ({ 'aria-label': 'just a typescript test' }),\n dsPaginationPerPageSelectorFloatingWrapper: () => ({ 'aria-label': 'just a typescript test' }),\n dsPaginationPerPageSelectorPanel: () => ({ 'aria-label': 'just a typescript test' }),\n dsPaginationPerPageSelectorHeader: () => ({ 'aria-label': 'just a typescript test' }),\n dsPaginationPerPageSelectorListWrapper: () => ({ 'aria-label': 'just a typescript test' }),\n dsPaginationPerPageSelectorList: () => ({ 'aria-label': 'just a typescript test' }),\n dsPaginationPerPageSelectorOption: () => ({ 'aria-label': 'just a typescript test' }),\n dsPaginationPerPageSelectorOptionCheckmark: () => ({ 'aria-label': 'just a typescript test' }),\n dsPaginationPerPageSelectorOptionLabel: () => ({ 'aria-label': 'just a typescript test' }),\n};\nconst EnsureAllSlotsExistInSlotFunctionArguments: Required<\n TypescriptHelpersT.PropsForSlots<typeof DSPaginationName, typeof PER_PAGE_SELECTOR_SLOTS>\n> = SlotPropsAsFunctions;\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACMvB,MAAM,iBAAoD;AAAA,EACxD,6BAA6B,EAAE,cAAc,yBAAyB;AACxE;AACA,MAAM,uBAAiE;AAAA,EACrE,6BAA6B,OAAO,EAAE,cAAc,yBAAyB;AAAA,EAC7E,2CAA2C,OAAO,EAAE,cAAc,yBAAyB;AAAA,EAC3F,4CAA4C,OAAO,EAAE,cAAc,yBAAyB;AAAA,EAC5F,kCAAkC,OAAO,EAAE,cAAc,yBAAyB;AAAA,EAClF,mCAAmC,OAAO,EAAE,cAAc,yBAAyB;AAAA,EACnF,wCAAwC,OAAO,EAAE,cAAc,yBAAyB;AAAA,EACxF,iCAAiC,OAAO,EAAE,cAAc,yBAAyB;AAAA,EACjF,mCAAmC,OAAO,EAAE,cAAc,yBAAyB;AAAA,EACnF,4CAA4C,OAAO,EAAE,cAAc,yBAAyB;AAAA,EAC5F,wCAAwC,OAAO,EAAE,cAAc,yBAAyB;AAC1F;AACA,MAAM,6CAEF;",
6
6
  "names": []
7
7
  }
@@ -3,8 +3,10 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { DSPerPageSelector } from "../index.js";
4
4
  const testRequiredProps = {};
5
5
  const testOptionalProps = {
6
- perPageOptions: [5, 10, 20]
6
+ perPageOptions: [5, 10, 20],
7
+ listWidth: 120
7
8
  };
9
+ const testOptionalPropsCssLength = { listWidth: "10rem" };
8
10
  const testPartialDefaults = {
9
11
  onPageSizeChange: () => null,
10
12
  perPageStep: 5
@@ -63,4 +65,61 @@ const ExampleUsageComponent = () => /* @__PURE__ */ jsxs(Fragment, { children: [
63
65
  /* @__PURE__ */ jsx(DSPerPageSelector, { ...testDefinitionAsConst }),
64
66
  /* @__PURE__ */ jsx(DSPerPageSelector, { pageSize: 10, onPageSizeChange: () => null, perPageStep: 5, minPerPage: 0, maxPerPage: 100 })
65
67
  ] });
68
+ const testOptionObject = { type: "single", dsId: "all", label: "All", value: 1e3 };
69
+ const testOptionObjectWithoutType = { dsId: "all", label: "All", value: 1e3 };
70
+ const testPerPageOptions = [
71
+ 10,
72
+ 20,
73
+ testOptionObject,
74
+ testOptionObjectWithoutType
75
+ ];
76
+ const testNoRender = {
77
+ dsId: "a",
78
+ label: "A",
79
+ value: 1,
80
+ // @ts-expect-error `render` is not part of the contract (it only worked because the dropdown got the options unchanged)
81
+ render: () => null
82
+ };
83
+ const testNoDisabled = {
84
+ dsId: "a",
85
+ label: "A",
86
+ value: 1,
87
+ // @ts-expect-error `disabled` is not part of the contract
88
+ disabled: true
89
+ };
90
+ const testNoApplyAriaDisabled = {
91
+ dsId: "a",
92
+ label: "A",
93
+ value: 1,
94
+ // @ts-expect-error `applyAriaDisabled` is not part of the contract
95
+ applyAriaDisabled: true
96
+ };
97
+ const testNoOnClick = {
98
+ dsId: "a",
99
+ label: "A",
100
+ value: 1,
101
+ // @ts-expect-error `onClick` is not part of the contract
102
+ onClick: () => null
103
+ };
104
+ const testNoGlobalAttributes = {
105
+ dsId: "a",
106
+ label: "A",
107
+ value: 1,
108
+ // @ts-expect-error global attributes are not part of the contract
109
+ "aria-label": "x"
110
+ };
111
+ const testNoXstyled = {
112
+ dsId: "a",
113
+ label: "A",
114
+ value: 1,
115
+ // @ts-expect-error xstyled props are not part of the contract
116
+ mt: "xs"
117
+ };
118
+ const testValueIsANumber = {
119
+ dsId: "a",
120
+ label: "A",
121
+ // @ts-expect-error the value is the number of rows
122
+ value: "many"
123
+ };
124
+ const testDsIdIsRequired = { label: "A", value: 1 };
66
125
  //# sourceMappingURL=typescript-testing.js.map