@hh.ru/magritte-ui-number-pages 3.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NumberPages.d.ts +3 -0
- package/NumberPages.js +97 -0
- package/NumberPages.js.map +1 -0
- package/NumberPagesAction-6879adf9.js +17 -0
- package/NumberPagesAction-6879adf9.js.map +1 -0
- package/NumberPagesAction.d.ts +2 -0
- package/NumberPagesAction.js +6 -0
- package/NumberPagesAction.js.map +1 -0
- package/index.css +156 -0
- package/index.d.ts +3 -0
- package/index.js +11 -0
- package/index.js.map +1 -0
- package/package.json +36 -0
- package/types.d.ts +57 -0
- package/types.js +3 -0
- package/types.js.map +1 -0
- package/usePages.d.ts +15 -0
- package/usePages.js +62 -0
- package/usePages.js.map +1 -0
package/NumberPages.d.ts
ADDED
package/NumberPages.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useState, useEffect } from 'react';
|
|
4
|
+
import classnames from 'classnames';
|
|
5
|
+
import { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';
|
|
6
|
+
import { ChevronRightOutlinedSize24, ChevronLeftOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
|
|
7
|
+
import { s as styles, N as NumberPagesAction } from './NumberPagesAction-6879adf9.js';
|
|
8
|
+
import { usePages, PageControls } from './usePages.js';
|
|
9
|
+
import '@hh.ru/magritte-ui-typography';
|
|
10
|
+
|
|
11
|
+
const baseRenderItem = ({ isPrevious, isNext, ...props }) => {
|
|
12
|
+
return jsx(NumberPagesAction, { ...props, isIcon: isPrevious || isNext });
|
|
13
|
+
};
|
|
14
|
+
const getPropsByScreenSize = (isXS, isS) => {
|
|
15
|
+
if (isXS) {
|
|
16
|
+
return [0, 0];
|
|
17
|
+
}
|
|
18
|
+
else if (isS) {
|
|
19
|
+
return [1, 1];
|
|
20
|
+
}
|
|
21
|
+
return [2, 1];
|
|
22
|
+
};
|
|
23
|
+
const NumberPages = ({ first, last, current, onChange, ariaLabel, renderItem = baseRenderItem, renderNavigation = baseRenderItem, getAriaLabelItem, ...props }) => {
|
|
24
|
+
const { isXS, isS } = useBreakpoint();
|
|
25
|
+
const [initialSiblingCount, initialBoundaryCount] = getPropsByScreenSize(isXS, isS);
|
|
26
|
+
const [siblingCount, setSiblingCount] = useState(initialSiblingCount);
|
|
27
|
+
const [boundaryCount, setBoundaryCount] = useState(initialBoundaryCount);
|
|
28
|
+
const pages = usePages({ first, last, current, siblingCount, boundaryCount });
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
const [siblingCount, boundaryCount] = getPropsByScreenSize(isXS, isS);
|
|
31
|
+
setSiblingCount(siblingCount);
|
|
32
|
+
setBoundaryCount(boundaryCount);
|
|
33
|
+
}, [isXS, isS]);
|
|
34
|
+
if (first > last) {
|
|
35
|
+
throw new Error(`Magritte component NumberPages: First prop more than last prop. first: ${first}, last: ${last}`);
|
|
36
|
+
}
|
|
37
|
+
if (current < first || current > last) {
|
|
38
|
+
throw new Error(`Magritte component NumberPages: Current is wrong. current: ${current}, first: ${first}, last: ${last}`);
|
|
39
|
+
}
|
|
40
|
+
if (last - first < 1) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const renderPageItem = (item) => {
|
|
44
|
+
const isSelected = item === current;
|
|
45
|
+
const baseProps = {
|
|
46
|
+
selected: isSelected,
|
|
47
|
+
key: item,
|
|
48
|
+
ariaLabel: getAriaLabelItem?.(item),
|
|
49
|
+
};
|
|
50
|
+
switch (item) {
|
|
51
|
+
case PageControls.Previous:
|
|
52
|
+
return renderNavigation({
|
|
53
|
+
...baseProps,
|
|
54
|
+
'data-qa': 'number-pages-previous',
|
|
55
|
+
onClick: () => {
|
|
56
|
+
onChange?.(current - 1);
|
|
57
|
+
},
|
|
58
|
+
isPrevious: true,
|
|
59
|
+
page: current - 1,
|
|
60
|
+
children: jsx(ChevronLeftOutlinedSize24, {}),
|
|
61
|
+
});
|
|
62
|
+
case PageControls.StartEllipsis:
|
|
63
|
+
case PageControls.EndEllipsis:
|
|
64
|
+
return (jsx("li", { "data-qa": "number-pages-ellipsis", className: styles.numberPagesEllipsis, children: "..." }, item));
|
|
65
|
+
case PageControls.Next:
|
|
66
|
+
return renderNavigation({
|
|
67
|
+
...baseProps,
|
|
68
|
+
'data-qa': 'number-pages-next',
|
|
69
|
+
onClick: () => {
|
|
70
|
+
onChange?.(current + 1);
|
|
71
|
+
},
|
|
72
|
+
isNext: true,
|
|
73
|
+
page: current + 1,
|
|
74
|
+
children: jsx(ChevronRightOutlinedSize24, {}),
|
|
75
|
+
});
|
|
76
|
+
default:
|
|
77
|
+
return renderItem({
|
|
78
|
+
...baseProps,
|
|
79
|
+
onClick: () => {
|
|
80
|
+
if (!isSelected) {
|
|
81
|
+
onChange?.(item);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
'data-qa': `number-pages-${item} ${isSelected ? 'number-pages-selected' : ''}`,
|
|
85
|
+
page: item,
|
|
86
|
+
selected: isSelected,
|
|
87
|
+
children: item,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
return (jsx("nav", { ...props, "aria-label": ariaLabel, className: classnames(styles.numberPagesWrapper, {
|
|
92
|
+
[styles.numberPagesWrapperWithoutNavigationButtons]: !pages.includes(PageControls.Next) && !pages.includes(PageControls.Previous),
|
|
93
|
+
}), children: jsx("ul", { className: styles.numberPagesContainer, children: pages.map(renderPageItem) }) }));
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export { NumberPages };
|
|
97
|
+
//# sourceMappingURL=NumberPages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberPages.js","sources":["../src/NumberPages.tsx"],"sourcesContent":["import { ReactNode, FC, useEffect, useState } from 'react';\nimport classnames from 'classnames';\n\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { ChevronLeftOutlinedSize24, ChevronRightOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport { NumberPagesAction } from '@hh.ru/magritte-ui-number-pages/NumberPagesAction';\nimport type { NumberPagesRenderItem, NumberPagesProps } from '@hh.ru/magritte-ui-number-pages/types';\nimport { usePages, PageControls } from '@hh.ru/magritte-ui-number-pages/usePages';\n\nimport styles from './styles.less';\n\nconst baseRenderItem: NumberPagesRenderItem = ({ isPrevious, isNext, ...props }) => {\n return <NumberPagesAction {...props} isIcon={isPrevious || isNext} />;\n};\n\nconst getPropsByScreenSize = (isXS: boolean, isS: boolean): number[] => {\n if (isXS) {\n return [0, 0];\n } else if (isS) {\n return [1, 1];\n }\n return [2, 1];\n};\n\nexport const NumberPages: FC<NumberPagesProps> = ({\n first,\n last,\n current,\n onChange,\n ariaLabel,\n renderItem = baseRenderItem,\n renderNavigation = baseRenderItem,\n getAriaLabelItem,\n ...props\n}) => {\n const { isXS, isS } = useBreakpoint();\n const [initialSiblingCount, initialBoundaryCount] = getPropsByScreenSize(isXS, isS);\n const [siblingCount, setSiblingCount] = useState(initialSiblingCount);\n const [boundaryCount, setBoundaryCount] = useState(initialBoundaryCount);\n const pages = usePages({ first, last, current, siblingCount, boundaryCount });\n\n useEffect(() => {\n const [siblingCount, boundaryCount] = getPropsByScreenSize(isXS, isS);\n setSiblingCount(siblingCount);\n setBoundaryCount(boundaryCount);\n }, [isXS, isS]);\n\n if (first > last) {\n throw new Error(\n `Magritte component NumberPages: First prop more than last prop. first: ${first}, last: ${last}`\n );\n }\n\n if (current < first || current > last) {\n throw new Error(\n `Magritte component NumberPages: Current is wrong. current: ${current}, first: ${first}, last: ${last}`\n );\n }\n\n if (last - first < 1) {\n return null;\n }\n\n const renderPageItem = (item: number): ReactNode => {\n const isSelected = item === current;\n\n const baseProps = {\n selected: isSelected,\n key: item,\n ariaLabel: getAriaLabelItem?.(item),\n };\n\n switch (item) {\n case PageControls.Previous:\n return renderNavigation({\n ...baseProps,\n 'data-qa': 'number-pages-previous',\n onClick: () => {\n onChange?.(current - 1);\n },\n isPrevious: true,\n page: current - 1,\n children: <ChevronLeftOutlinedSize24 />,\n });\n case PageControls.StartEllipsis:\n case PageControls.EndEllipsis:\n return (\n <li key={item} data-qa=\"number-pages-ellipsis\" className={styles.numberPagesEllipsis}>\n ...\n </li>\n );\n case PageControls.Next:\n return renderNavigation({\n ...baseProps,\n 'data-qa': 'number-pages-next',\n onClick: () => {\n onChange?.(current + 1);\n },\n isNext: true,\n page: current + 1,\n children: <ChevronRightOutlinedSize24 />,\n });\n default:\n return renderItem({\n ...baseProps,\n onClick: () => {\n if (!isSelected) {\n onChange?.(item);\n }\n },\n 'data-qa': `number-pages-${item} ${isSelected ? 'number-pages-selected' : ''}`,\n page: item,\n selected: isSelected,\n children: item,\n });\n }\n };\n\n return (\n <nav\n {...props}\n aria-label={ariaLabel}\n className={classnames(styles.numberPagesWrapper, {\n [styles.numberPagesWrapperWithoutNavigationButtons]:\n !pages.includes(PageControls.Next) && !pages.includes(PageControls.Previous),\n })}\n >\n <ul className={styles.numberPagesContainer}>{pages.map(renderPageItem)}</ul>\n </nav>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import classnames from 'classnames';
|
|
4
|
+
import { Text } from '@hh.ru/magritte-ui-typography';
|
|
5
|
+
|
|
6
|
+
var styles = {"number-pages-wrapper":"magritte-number-pages-wrapper___lYp70_3-0-23","numberPagesWrapper":"magritte-number-pages-wrapper___lYp70_3-0-23","number-pages-wrapper-without-navigation-buttons":"magritte-number-pages-wrapper-without-navigation-buttons___78a7R_3-0-23","numberPagesWrapperWithoutNavigationButtons":"magritte-number-pages-wrapper-without-navigation-buttons___78a7R_3-0-23","number-pages-container":"magritte-number-pages-container___YIJLn_3-0-23","numberPagesContainer":"magritte-number-pages-container___YIJLn_3-0-23","number-pages-ellipsis":"magritte-number-pages-ellipsis___GNIbV_3-0-23","numberPagesEllipsis":"magritte-number-pages-ellipsis___GNIbV_3-0-23","number-pages-action":"magritte-number-pages-action___e3ozw_3-0-23","numberPagesAction":"magritte-number-pages-action___e3ozw_3-0-23","number-pages-action-icon":"magritte-number-pages-action-icon___lwXFB_3-0-23","numberPagesActionIcon":"magritte-number-pages-action-icon___lwXFB_3-0-23","number-pages-action-selected":"magritte-number-pages-action-selected___N5Tl4_3-0-23","numberPagesActionSelected":"magritte-number-pages-action-selected___N5Tl4_3-0-23"};
|
|
7
|
+
|
|
8
|
+
const NumberPagesAction = ({ children, selected = false, isIcon = false, Element = 'button', ariaLabel, page, ...props }) => {
|
|
9
|
+
const buttonProps = Element === 'button' ? { type: 'button' } : {};
|
|
10
|
+
return (jsx("li", { children: jsx(Text, { typography: "label-2-regular", children: jsx(Element, { ...props, ...buttonProps, "aria-current": selected, "aria-label": ariaLabel, className: classnames(styles.numberPagesAction, {
|
|
11
|
+
[styles.numberPagesActionSelected]: selected,
|
|
12
|
+
[styles.numberPagesActionIcon]: isIcon,
|
|
13
|
+
}), children: children }) }) }));
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export { NumberPagesAction as N, styles as s };
|
|
17
|
+
//# sourceMappingURL=NumberPagesAction-6879adf9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberPagesAction-6879adf9.js","sources":["../src/NumberPagesAction.tsx"],"sourcesContent":["import classnames from 'classnames';\n\nimport type { NumberPagesActionProps } from '@hh.ru/magritte-ui-number-pages/types';\nimport { Text } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './styles.less';\n\nexport const NumberPagesAction: NumberPagesActionProps = ({\n children,\n selected = false,\n isIcon = false,\n Element = 'button',\n ariaLabel,\n page,\n ...props\n}) => {\n const buttonProps = Element === 'button' ? ({ type: 'button' } as const) : {};\n\n return (\n <li>\n <Text typography=\"label-2-regular\">\n <Element\n {...props}\n {...buttonProps}\n aria-current={selected}\n aria-label={ariaLabel}\n className={classnames(styles.numberPagesAction, {\n [styles.numberPagesActionSelected]: selected,\n [styles.numberPagesActionIcon]: isIcon,\n })}\n >\n {children}\n </Element>\n </Text>\n </li>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;AAOO,MAAM,iBAAiB,GAA2B,CAAC,EACtD,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,MAAM,GAAG,KAAK,EACd,OAAO,GAAG,QAAQ,EAClB,SAAS,EACT,IAAI,EACJ,GAAG,KAAK,EACX,KAAI;AACD,IAAA,MAAM,WAAW,GAAG,OAAO,KAAK,QAAQ,GAAI,EAAE,IAAI,EAAE,QAAQ,EAAY,GAAG,EAAE,CAAC;IAE9E,QACIA,GACI,CAAA,IAAA,EAAA,EAAA,QAAA,EAAAA,GAAA,CAAC,IAAI,EAAA,EAAC,UAAU,EAAC,iBAAiB,EAAA,QAAA,EAC9BA,GAAC,CAAA,OAAO,EACA,EAAA,GAAA,KAAK,EACL,GAAA,WAAW,EACD,cAAA,EAAA,QAAQ,EACV,YAAA,EAAA,SAAS,EACrB,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,iBAAiB,EAAE;AAC5C,oBAAA,CAAC,MAAM,CAAC,yBAAyB,GAAG,QAAQ;AAC5C,oBAAA,CAAC,MAAM,CAAC,qBAAqB,GAAG,MAAM;AACzC,iBAAA,CAAC,YAED,QAAQ,EAAA,CACH,EACP,CAAA,EAAA,CACN,EACP;AACN;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberPagesAction.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
package/index.css
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
:root{
|
|
2
|
+
--magritte-color-component-number-pages-background-content-v18-1-1:#ffffff;
|
|
3
|
+
--magritte-color-component-number-pages-stroke-content-v18-1-1:#DCE3EB;
|
|
4
|
+
--magritte-color-component-number-pages-item-text-unselected-v18-1-1:#768694;
|
|
5
|
+
--magritte-color-component-number-pages-item-text-selected-v18-1-1:#000000;
|
|
6
|
+
--magritte-color-component-number-pages-item-text-state-unselected-hovered-v18-1-1:#000000;
|
|
7
|
+
--magritte-color-component-number-pages-item-text-state-unselected-pressed-v18-1-1:#000000;
|
|
8
|
+
--magritte-color-component-number-pages-item-icon-content-v18-1-1:#768694;
|
|
9
|
+
--magritte-color-component-number-pages-item-icon-state-content-hovered-v18-1-1:#000000;
|
|
10
|
+
--magritte-color-component-number-pages-item-icon-state-content-pressed-v18-1-1:#000000;
|
|
11
|
+
--magritte-color-component-number-pages-item-background-selected-v18-1-1:#F1F4F9;
|
|
12
|
+
--magritte-color-component-number-pages-item-background-unselected-v18-1-1:#dce3eb00;
|
|
13
|
+
--magritte-color-component-number-pages-item-background-state-unselected-hovered-v18-1-1:#F1F4F9;
|
|
14
|
+
--magritte-color-component-number-pages-item-background-state-unselected-pressed-v18-1-1:#DCE3EB;
|
|
15
|
+
--magritte-color-component-number-pages-stroke-state-focused-accessible-v18-1-1:#0070ff7a;
|
|
16
|
+
}
|
|
17
|
+
:root{
|
|
18
|
+
--magritte-semantic-scale-pressed-v18-1-1:0.96;
|
|
19
|
+
--magritte-semantic-animation-ease-in-out-100-timing-function-v18-1-1:cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
20
|
+
--magritte-semantic-animation-ease-in-out-100-duration-v18-1-1:100ms;
|
|
21
|
+
--magritte-semantic-animation-ease-in-out-200-timing-function-v18-1-1:cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
22
|
+
--magritte-semantic-animation-ease-in-out-200-duration-v18-1-1:200ms;
|
|
23
|
+
--magritte-static-space-100-v18-1-1:4px;
|
|
24
|
+
--magritte-static-space-150-v18-1-1:6px;
|
|
25
|
+
--magritte-static-space-200-v18-1-1:8px;
|
|
26
|
+
}
|
|
27
|
+
.magritte-night-theme{
|
|
28
|
+
--magritte-color-component-number-pages-background-content-v18-1-1:#000000;
|
|
29
|
+
--magritte-color-component-number-pages-stroke-content-v18-1-1:#3B3B3B;
|
|
30
|
+
--magritte-color-component-number-pages-item-text-unselected-v18-1-1:#ABABAB;
|
|
31
|
+
--magritte-color-component-number-pages-item-text-selected-v18-1-1:#ffffff;
|
|
32
|
+
--magritte-color-component-number-pages-item-text-state-unselected-hovered-v18-1-1:#ffffff;
|
|
33
|
+
--magritte-color-component-number-pages-item-text-state-unselected-pressed-v18-1-1:#ffffff;
|
|
34
|
+
--magritte-color-component-number-pages-item-icon-content-v18-1-1:#ABABAB;
|
|
35
|
+
--magritte-color-component-number-pages-item-icon-state-content-hovered-v18-1-1:#ffffff;
|
|
36
|
+
--magritte-color-component-number-pages-item-icon-state-content-pressed-v18-1-1:#ffffff;
|
|
37
|
+
--magritte-color-component-number-pages-item-background-selected-v18-1-1:#262626;
|
|
38
|
+
--magritte-color-component-number-pages-item-background-unselected-v18-1-1:#dce3eb00;
|
|
39
|
+
--magritte-color-component-number-pages-item-background-state-unselected-hovered-v18-1-1:#262626;
|
|
40
|
+
--magritte-color-component-number-pages-item-background-state-unselected-pressed-v18-1-1:#262626;
|
|
41
|
+
--magritte-color-component-number-pages-stroke-state-focused-accessible-v18-1-1:#0070ff7a;
|
|
42
|
+
}
|
|
43
|
+
.magritte-number-pages-wrapper___lYp70_3-0-23{
|
|
44
|
+
display:flex;
|
|
45
|
+
width:100%;
|
|
46
|
+
}
|
|
47
|
+
@media (min-width: 350px){
|
|
48
|
+
.magritte-number-pages-wrapper___lYp70_3-0-23{
|
|
49
|
+
display:inline-flex;
|
|
50
|
+
width:auto;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
.magritte-number-pages-wrapper-without-navigation-buttons___78a7R_3-0-23{
|
|
54
|
+
display:inline-flex;
|
|
55
|
+
width:auto;
|
|
56
|
+
}
|
|
57
|
+
.magritte-number-pages-container___YIJLn_3-0-23{
|
|
58
|
+
display:flex;
|
|
59
|
+
width:100%;
|
|
60
|
+
justify-content:space-between;
|
|
61
|
+
align-items:center;
|
|
62
|
+
border-radius:26px;
|
|
63
|
+
padding:calc(var(--magritte-static-space-150-v18-1-1) - 1px);
|
|
64
|
+
border:1px solid var(--magritte-color-component-number-pages-stroke-content-v18-1-1);
|
|
65
|
+
background:var(--magritte-color-component-number-pages-background-content-v18-1-1);
|
|
66
|
+
}
|
|
67
|
+
@media (min-width: 350px){
|
|
68
|
+
.magritte-number-pages-container___YIJLn_3-0-23{
|
|
69
|
+
display:inline-flex;
|
|
70
|
+
justify-content:center;
|
|
71
|
+
gap:var(--magritte-static-space-200-v18-1-1);
|
|
72
|
+
width:auto;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
@media (min-width: 600px){
|
|
76
|
+
.magritte-number-pages-container___YIJLn_3-0-23{
|
|
77
|
+
gap:var(--magritte-static-space-100-v18-1-1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
@media (min-width: 640px){
|
|
81
|
+
.magritte-number-pages-container___YIJLn_3-0-23{
|
|
82
|
+
gap:var(--magritte-static-space-200-v18-1-1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
.magritte-number-pages-ellipsis___GNIbV_3-0-23{
|
|
86
|
+
display:flex;
|
|
87
|
+
height:40px;
|
|
88
|
+
width:40px;
|
|
89
|
+
align-items:center;
|
|
90
|
+
justify-content:center;
|
|
91
|
+
}
|
|
92
|
+
.magritte-number-pages-action___e3ozw_3-0-23{
|
|
93
|
+
display:flex;
|
|
94
|
+
align-items:center;
|
|
95
|
+
justify-content:center;
|
|
96
|
+
cursor:pointer;
|
|
97
|
+
box-sizing:border-box;
|
|
98
|
+
min-height:40px;
|
|
99
|
+
min-width:40px;
|
|
100
|
+
border-radius:20px;
|
|
101
|
+
padding:5px 14px;
|
|
102
|
+
color:var(--magritte-color-component-number-pages-item-text-unselected-v18-1-1);
|
|
103
|
+
background-color:var(--magritte-color-component-number-pages-item-background-unselected-v18-1-1);
|
|
104
|
+
--magritte-ui-icon-color-override:var(--magritte-color-component-number-pages-item-icon-content-v18-1-1);
|
|
105
|
+
}
|
|
106
|
+
.magritte-number-pages-action___e3ozw_3-0-23:focus:not(.focus-visible),
|
|
107
|
+
.magritte-number-pages-action___e3ozw_3-0-23:focus-visible:not(.focus-visible){
|
|
108
|
+
outline:none;
|
|
109
|
+
}
|
|
110
|
+
.magritte-number-pages-action___e3ozw_3-0-23:active{
|
|
111
|
+
--magritte-ui-icon-color-override:var(--magritte-color-component-number-pages-item-icon-state-content-pressed-v18-1-1);
|
|
112
|
+
color:var(--magritte-color-component-number-pages-item-text-state-unselected-pressed-v18-1-1);
|
|
113
|
+
background-color:var(--magritte-color-component-number-pages-item-background-state-unselected-pressed-v18-1-1);
|
|
114
|
+
}
|
|
115
|
+
@media (prefers-reduced-motion: no-preference){
|
|
116
|
+
.magritte-number-pages-action___e3ozw_3-0-23:active{
|
|
117
|
+
transition:transform var(--magritte-semantic-animation-ease-in-out-100-duration-v18-1-1) var(--magritte-semantic-animation-ease-in-out-100-timing-function-v18-1-1);
|
|
118
|
+
transform:scale(var(--magritte-semantic-scale-pressed-v18-1-1));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
.magritte-number-pages-action___e3ozw_3-0-23.focus-visible{
|
|
122
|
+
outline:var(--magritte-color-component-number-pages-stroke-state-focused-accessible-v18-1-1) solid 4px;
|
|
123
|
+
}
|
|
124
|
+
@media (prefers-reduced-motion: no-preference){
|
|
125
|
+
.magritte-number-pages-action___e3ozw_3-0-23{
|
|
126
|
+
transition:transform var(--magritte-semantic-animation-ease-in-out-200-duration-v18-1-1) var(--magritte-semantic-animation-ease-in-out-200-timing-function-v18-1-1);
|
|
127
|
+
transform:scale(1);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
@media (min-width: 1020px){
|
|
131
|
+
body.magritte-old-layout .magritte-number-pages-action___e3ozw_3-0-23:hover:not(:active){
|
|
132
|
+
--magritte-ui-icon-color-override:var(--magritte-color-component-number-pages-item-icon-state-content-hovered-v18-1-1);
|
|
133
|
+
color:var(--magritte-color-component-number-pages-item-text-state-unselected-hovered-v18-1-1);
|
|
134
|
+
background-color:var(--magritte-color-component-number-pages-item-background-state-unselected-hovered-v18-1-1);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
@media (min-width: 1024px){
|
|
138
|
+
body:not(.magritte-old-layout) .magritte-number-pages-action___e3ozw_3-0-23:hover:not(:active){
|
|
139
|
+
--magritte-ui-icon-color-override:var(--magritte-color-component-number-pages-item-icon-state-content-hovered-v18-1-1);
|
|
140
|
+
color:var(--magritte-color-component-number-pages-item-text-state-unselected-hovered-v18-1-1);
|
|
141
|
+
background-color:var(--magritte-color-component-number-pages-item-background-state-unselected-hovered-v18-1-1);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
.magritte-number-pages-action-icon___lwXFB_3-0-23{
|
|
145
|
+
padding:5px var(--magritte-static-space-200-v18-1-1);
|
|
146
|
+
}
|
|
147
|
+
.magritte-number-pages-action-selected___N5Tl4_3-0-23,
|
|
148
|
+
.magritte-number-pages-action-selected___N5Tl4_3-0-23:hover,
|
|
149
|
+
.magritte-number-pages-action-selected___N5Tl4_3-0-23:active{
|
|
150
|
+
pointer-events:none;
|
|
151
|
+
user-select:none;
|
|
152
|
+
transform:none;
|
|
153
|
+
color:var(--magritte-color-component-number-pages-item-text-selected-v18-1-1);
|
|
154
|
+
background-color:var(--magritte-color-component-number-pages-item-background-selected-v18-1-1);
|
|
155
|
+
cursor:default;
|
|
156
|
+
}
|
package/index.d.ts
ADDED
package/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
export { NumberPages } from './NumberPages.js';
|
|
3
|
+
export { N as NumberPagesAction } from './NumberPagesAction-6879adf9.js';
|
|
4
|
+
import 'react/jsx-runtime';
|
|
5
|
+
import 'react';
|
|
6
|
+
import 'classnames';
|
|
7
|
+
import '@hh.ru/magritte-ui-breakpoint';
|
|
8
|
+
import '@hh.ru/magritte-ui-icon/icon';
|
|
9
|
+
import './usePages.js';
|
|
10
|
+
import '@hh.ru/magritte-ui-typography';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hh.ru/magritte-ui-number-pages",
|
|
3
|
+
"version": "3.0.23",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"types": "index.d.ts",
|
|
6
|
+
"sideEffects": [
|
|
7
|
+
"index.css"
|
|
8
|
+
],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "yarn root:build $(pwd)",
|
|
11
|
+
"build-test-branch": "yarn root:build-test-branch $(pwd)",
|
|
12
|
+
"changelog": "yarn root:changelog $(pwd)",
|
|
13
|
+
"prepack": "yarn root:prepack $(pwd)",
|
|
14
|
+
"postpublish": "yarn root:postpublish $(pwd)",
|
|
15
|
+
"stylelint-test": "yarn root:stylelint-test $(pwd)",
|
|
16
|
+
"eslint-test": "yarn root:eslint-test $(pwd)",
|
|
17
|
+
"ts-config": "yarn root:ts-config $(pwd)",
|
|
18
|
+
"ts-check": "yarn root:ts-check $(pwd)",
|
|
19
|
+
"test": "yarn root:test $(pwd)"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@hh.ru/magritte-design-tokens": "18.1.1",
|
|
23
|
+
"@hh.ru/magritte-types": "4.0.1",
|
|
24
|
+
"@hh.ru/magritte-ui-breakpoint": "4.0.1",
|
|
25
|
+
"@hh.ru/magritte-ui-icon": "7.1.3",
|
|
26
|
+
"@hh.ru/magritte-ui-typography": "3.0.8"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"classnames": ">=2.3.2",
|
|
30
|
+
"react": ">=18.2.0"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
},
|
|
35
|
+
"gitHead": "b660dd64fca3eaad5ec44ea9a73f92bb0d9694aa"
|
|
36
|
+
}
|
package/types.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { PropsWithChildren, ReactNode } from 'react';
|
|
2
|
+
import type { ComponentWithCustomElement } from '@hh.ru/magritte-types';
|
|
3
|
+
type NumberPagesRenderItemBaseProps = PropsWithChildren<{
|
|
4
|
+
/** Флаг выбрана текущая страница или нет */
|
|
5
|
+
selected: boolean;
|
|
6
|
+
/** Data-qa атрибут */
|
|
7
|
+
'data-qa': string;
|
|
8
|
+
/** Хнедлер клика */
|
|
9
|
+
onClick: VoidFunction;
|
|
10
|
+
/** Номер страницы */
|
|
11
|
+
page: number;
|
|
12
|
+
/** Аria заголовок */
|
|
13
|
+
ariaLabel?: string;
|
|
14
|
+
/** Ключ item */
|
|
15
|
+
key: number | string;
|
|
16
|
+
}>;
|
|
17
|
+
type NumberPagesRenderItemProps = NumberPagesRenderItemBaseProps & {
|
|
18
|
+
isPrevious?: boolean;
|
|
19
|
+
isNext?: boolean;
|
|
20
|
+
};
|
|
21
|
+
export interface NumberPagesRenderItem {
|
|
22
|
+
(props: NumberPagesRenderItemProps): ReactNode;
|
|
23
|
+
}
|
|
24
|
+
export type BaseNumberPagesActionProps = Partial<NumberPagesRenderItemBaseProps> & {
|
|
25
|
+
/** Кастомный компонент */
|
|
26
|
+
Element?: 'button' | 'a';
|
|
27
|
+
/** Флаг иконка или текст являются содержимым */
|
|
28
|
+
isIcon?: boolean;
|
|
29
|
+
};
|
|
30
|
+
export type NumberPagesActionProps = ComponentWithCustomElement<BaseNumberPagesActionProps, 'button'>;
|
|
31
|
+
export interface BaseNumberPagesProps {
|
|
32
|
+
/** Первая страница */
|
|
33
|
+
first: number;
|
|
34
|
+
/** Последняя страница */
|
|
35
|
+
last: number;
|
|
36
|
+
/** Текущая страница */
|
|
37
|
+
current: number;
|
|
38
|
+
/** Aria заголовок страничного компонента навигации */
|
|
39
|
+
ariaLabel?: string;
|
|
40
|
+
/** Метод для получения aria заголовков для каждого item */
|
|
41
|
+
getAriaLabelItem?: (item: number) => string;
|
|
42
|
+
}
|
|
43
|
+
interface OnChangeHandler {
|
|
44
|
+
/** Рендер функция для кастомного рисования Item */
|
|
45
|
+
renderItem?: NumberPagesRenderItem;
|
|
46
|
+
/** Рендер функция для кастомного рисования стрелок навигации */
|
|
47
|
+
renderNavigation?: NumberPagesRenderItem;
|
|
48
|
+
/** Хендлер изменения страницы, вызывается при попытке смены страницы */
|
|
49
|
+
onChange: (page: number) => void;
|
|
50
|
+
}
|
|
51
|
+
type RenderItemMethod = {
|
|
52
|
+
renderItem: NumberPagesRenderItem;
|
|
53
|
+
renderNavigation: NumberPagesRenderItem;
|
|
54
|
+
onChange?: (page: number) => void;
|
|
55
|
+
};
|
|
56
|
+
export type NumberPagesProps = BaseNumberPagesProps & (OnChangeHandler | RenderItemMethod);
|
|
57
|
+
export {};
|
package/types.js
ADDED
package/types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/usePages.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface UsePagesProps {
|
|
2
|
+
last: number;
|
|
3
|
+
first: number;
|
|
4
|
+
current: number;
|
|
5
|
+
boundaryCount: number;
|
|
6
|
+
siblingCount: number;
|
|
7
|
+
}
|
|
8
|
+
export declare enum PageControls {
|
|
9
|
+
Previous = -1,
|
|
10
|
+
Next = -2,
|
|
11
|
+
StartEllipsis = -3,
|
|
12
|
+
EndEllipsis = -4
|
|
13
|
+
}
|
|
14
|
+
export declare const usePages: ({ last, first, current, boundaryCount, siblingCount }: UsePagesProps) => number[];
|
|
15
|
+
export {};
|
package/usePages.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
const range = (start, end) => {
|
|
3
|
+
const length = end - start + 1;
|
|
4
|
+
// eslint-disable-next-line no-restricted-properties
|
|
5
|
+
return Array.from({ length }, (_, i) => start + i);
|
|
6
|
+
};
|
|
7
|
+
var PageControls;
|
|
8
|
+
(function (PageControls) {
|
|
9
|
+
PageControls[PageControls["Previous"] = -1] = "Previous";
|
|
10
|
+
PageControls[PageControls["Next"] = -2] = "Next";
|
|
11
|
+
PageControls[PageControls["StartEllipsis"] = -3] = "StartEllipsis";
|
|
12
|
+
PageControls[PageControls["EndEllipsis"] = -4] = "EndEllipsis";
|
|
13
|
+
})(PageControls || (PageControls = {}));
|
|
14
|
+
const CURENT_PAGE_AND_ELLIPSIS_POSITION = 2;
|
|
15
|
+
const usePages = ({ last, first, current, boundaryCount, siblingCount }) => {
|
|
16
|
+
const count = last - first + 1;
|
|
17
|
+
const startPages = range(first, Math.min(first - 1 + boundaryCount, last));
|
|
18
|
+
const endPages = range(Math.max(count - boundaryCount + first, boundaryCount + first), last);
|
|
19
|
+
const siblingsStart = Math.max(Math.min(
|
|
20
|
+
// Настоящее начальное значение для siblings node
|
|
21
|
+
current - siblingCount,
|
|
22
|
+
// Нижняя граница, от max
|
|
23
|
+
last - boundaryCount - siblingCount * 2 - CURENT_PAGE_AND_ELLIPSIS_POSITION),
|
|
24
|
+
// Больше стартовой страницы
|
|
25
|
+
startPages.length > 0 ? startPages[0] + CURENT_PAGE_AND_ELLIPSIS_POSITION : first + 1);
|
|
26
|
+
const siblingsEnd = Math.min(Math.max(
|
|
27
|
+
// Настоящее конечное значение для siblings node
|
|
28
|
+
current + siblingCount,
|
|
29
|
+
// Верхняя граница, от min
|
|
30
|
+
first + boundaryCount + siblingCount * 2 + CURENT_PAGE_AND_ELLIPSIS_POSITION),
|
|
31
|
+
// Меньше чем endPages
|
|
32
|
+
endPages.length > 0 ? endPages[0] - CURENT_PAGE_AND_ELLIPSIS_POSITION : last - 1);
|
|
33
|
+
const startEllipsis =
|
|
34
|
+
// eslint-disable-next-line no-nested-ternary
|
|
35
|
+
siblingsStart > first + boundaryCount + 1
|
|
36
|
+
? [PageControls.StartEllipsis]
|
|
37
|
+
: boundaryCount + first < last - boundaryCount
|
|
38
|
+
? [boundaryCount + first]
|
|
39
|
+
: [];
|
|
40
|
+
const endEllipsis =
|
|
41
|
+
// eslint-disable-next-line no-nested-ternary
|
|
42
|
+
siblingsEnd < last - boundaryCount - 1
|
|
43
|
+
? [PageControls.EndEllipsis]
|
|
44
|
+
: last - boundaryCount > boundaryCount
|
|
45
|
+
? [last - boundaryCount]
|
|
46
|
+
: [];
|
|
47
|
+
const hasPrevious = first < current && startEllipsis[0] === PageControls.StartEllipsis;
|
|
48
|
+
const hasNext = current < last && endEllipsis[0] === PageControls.EndEllipsis;
|
|
49
|
+
return [
|
|
50
|
+
...(hasPrevious ? [PageControls.Previous] : []),
|
|
51
|
+
...startPages,
|
|
52
|
+
...startEllipsis,
|
|
53
|
+
// Sibling страницы вместе с текущей
|
|
54
|
+
...range(siblingsStart, siblingsEnd),
|
|
55
|
+
...endEllipsis,
|
|
56
|
+
...endPages,
|
|
57
|
+
...(hasNext ? [PageControls.Next] : []),
|
|
58
|
+
];
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export { PageControls, usePages };
|
|
62
|
+
//# sourceMappingURL=usePages.js.map
|
package/usePages.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePages.js","sources":["../src/usePages.tsx"],"sourcesContent":["const range = (start: number, end: number): number[] => {\n const length = end - start + 1;\n // eslint-disable-next-line no-restricted-properties\n return Array.from({ length }, (_, i) => start + i);\n};\n\ninterface UsePagesProps {\n last: number;\n first: number;\n current: number;\n boundaryCount: number;\n siblingCount: number;\n}\n\nexport enum PageControls {\n Previous = -1,\n Next = -2,\n StartEllipsis = -3,\n EndEllipsis = -4,\n}\n\nconst CURENT_PAGE_AND_ELLIPSIS_POSITION = 2;\n\nexport const usePages = ({ last, first, current, boundaryCount, siblingCount }: UsePagesProps): number[] => {\n const count = last - first + 1;\n\n const startPages = range(first, Math.min(first - 1 + boundaryCount, last));\n const endPages = range(Math.max(count - boundaryCount + first, boundaryCount + first), last);\n\n const siblingsStart = Math.max(\n Math.min(\n // Настоящее начальное значение для siblings node\n current - siblingCount,\n // Нижняя граница, от max\n last - boundaryCount - siblingCount * 2 - CURENT_PAGE_AND_ELLIPSIS_POSITION\n ),\n // Больше стартовой страницы\n startPages.length > 0 ? startPages[0] + CURENT_PAGE_AND_ELLIPSIS_POSITION : first + 1\n );\n\n const siblingsEnd = Math.min(\n Math.max(\n // Настоящее конечное значение для siblings node\n current + siblingCount,\n // Верхняя граница, от min\n first + boundaryCount + siblingCount * 2 + CURENT_PAGE_AND_ELLIPSIS_POSITION\n ),\n // Меньше чем endPages\n endPages.length > 0 ? endPages[0] - CURENT_PAGE_AND_ELLIPSIS_POSITION : last - 1\n );\n\n const startEllipsis =\n // eslint-disable-next-line no-nested-ternary\n siblingsStart > first + boundaryCount + 1\n ? [PageControls.StartEllipsis]\n : boundaryCount + first < last - boundaryCount\n ? [boundaryCount + first]\n : [];\n\n const endEllipsis =\n // eslint-disable-next-line no-nested-ternary\n siblingsEnd < last - boundaryCount - 1\n ? [PageControls.EndEllipsis]\n : last - boundaryCount > boundaryCount\n ? [last - boundaryCount]\n : [];\n\n const hasPrevious = first < current && startEllipsis[0] === PageControls.StartEllipsis;\n const hasNext = current < last && endEllipsis[0] === PageControls.EndEllipsis;\n\n return [\n ...(hasPrevious ? [PageControls.Previous] : []),\n ...startPages,\n ...startEllipsis,\n // Sibling страницы вместе с текущей\n ...range(siblingsStart, siblingsEnd),\n ...endEllipsis,\n ...endPages,\n ...(hasNext ? [PageControls.Next] : []),\n ];\n};\n"],"names":[],"mappings":"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"}
|