@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.
@@ -0,0 +1,3 @@
1
+ import { FC } from 'react';
2
+ import type { NumberPagesProps } from './types';
3
+ export declare const NumberPages: FC<NumberPagesProps>;
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,2 @@
1
+ import type { NumberPagesActionProps } from './types';
2
+ export declare const NumberPagesAction: NumberPagesActionProps;
@@ -0,0 +1,6 @@
1
+ import './index.css';
2
+ import 'react/jsx-runtime';
3
+ import 'classnames';
4
+ import '@hh.ru/magritte-ui-typography';
5
+ export { N as NumberPagesAction } from './NumberPagesAction-6879adf9.js';
6
+ //# sourceMappingURL=NumberPagesAction.js.map
@@ -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
@@ -0,0 +1,3 @@
1
+ export * from './NumberPages';
2
+ export * from './NumberPagesAction';
3
+ export type { NumberPagesProps, NumberPagesRenderItem, NumberPagesActionProps, } from './types';
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
@@ -0,0 +1,3 @@
1
+ import './index.css';
2
+
3
+ //# sourceMappingURL=types.js.map
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
@@ -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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"}