@hh.ru/magritte-ui-breadcrumbs 3.3.39

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 { BreadcrumbsProps } from './types';
3
+ export declare const Breadcrumbs: FC<BreadcrumbsProps>;
package/Breadcrumbs.js ADDED
@@ -0,0 +1,69 @@
1
+ import './index.css';
2
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
+ import React, { useRef, useState, useCallback, useMemo } from 'react';
4
+ import classnames from 'classnames';
5
+ import { BottomSheet } from '@hh.ru/magritte-ui-bottom-sheet';
6
+ import { BreadcrumbsDivider } from './BreadcrumbsDivider.js';
7
+ import { BreadcrumbsDynamicLink } from './BreadcrumbsDynamicLink.js';
8
+ import { useDynamicDisplayContent } from './useDynamicDisplayContent.js';
9
+ import { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';
10
+ import { Card } from '@hh.ru/magritte-ui-card';
11
+ import { Drop } from '@hh.ru/magritte-ui-drop';
12
+ import { Text } from '@hh.ru/magritte-ui-typography';
13
+ import { s as styles } from './breadcrumbs-ae4fd4f8.js';
14
+ import '@hh.ru/magritte-common-func-utils';
15
+
16
+ const TEXT_TYPOGRAPHY = 'label-3-regular';
17
+ const Breadcrumbs = ({ children, hiddenOnMobile, dataQa }) => {
18
+ const activatorRef = useRef(null);
19
+ const { isMobile } = useBreakpoint();
20
+ const isHidden = hiddenOnMobile && isMobile;
21
+ const [showCollapseItems, setShowCollapseItems] = useState(false);
22
+ const showCollapseItemsToggle = useCallback(() => setShowCollapseItems((showCollapseItems) => !showCollapseItems), []);
23
+ const breadcrumbsExtendedItems = useMemo(() => {
24
+ return React.Children.map(children, (child) => {
25
+ const key = child.key || Math.random();
26
+ return {
27
+ key,
28
+ ReactElement: child,
29
+ };
30
+ });
31
+ }, [children]);
32
+ const { containerRef, contentState, refreshItem, emptySpaceRef } = useDynamicDisplayContent(breadcrumbsExtendedItems);
33
+ const renderCollapseItems = useMemo(() => {
34
+ return contentState.collapseItems.map((collapseItem) => {
35
+ const index = collapseItem.index;
36
+ const breadcrumbsExtendedItem = breadcrumbsExtendedItems[index];
37
+ if (!breadcrumbsExtendedItem) {
38
+ return null;
39
+ }
40
+ const { onClick, Element = 'a', children, ...usefulProps } = breadcrumbsExtendedItem.ReactElement.props;
41
+ return (jsx("div", { className: classnames(styles.breadcrumbsCardBottomSheet, {
42
+ [styles.breadcrumbsCardDrop]: !isMobile,
43
+ }), children: jsx(Card, { ...usefulProps, Element: Element, borderRadius: 12, padding: 8, paddingLeft: 12, paddingRight: 12, style: "blank", hoverStyle: "neutral", actionCard: true, stretched: true, children: jsx("div", { className: classnames(styles.breadcrumbsItemBottomSheet, {
44
+ [styles.breadcrumbsItemDrop]: !isMobile,
45
+ }), children: jsx(Text, { Element: "span", typography: TEXT_TYPOGRAPHY, children: children }) }) }) }, breadcrumbsExtendedItem.key));
46
+ });
47
+ }, [breadcrumbsExtendedItems, contentState.collapseItems, isMobile]);
48
+ const renderLastItem = (extendedItems) => {
49
+ if (extendedItems.length <= 1) {
50
+ return null;
51
+ }
52
+ const { style, href, ...usefulProps } = extendedItems[extendedItems.length - 1].ReactElement.props;
53
+ return (jsx("div", { className: styles.breadcrumbsItemCurrent, children: jsx(Text, { ...usefulProps, Element: "span", typography: TEXT_TYPOGRAPHY }) }));
54
+ };
55
+ return (jsxs("div", { className: classnames(styles.breadcrumbs, {
56
+ [styles.breadcrumbsHidden]: isHidden,
57
+ }), ref: containerRef, "data-qa": dataQa, children: [jsxs("div", { children: [breadcrumbsExtendedItems[0]?.ReactElement, breadcrumbsExtendedItems.length > 1 && jsx(BreadcrumbsDivider, {})] }), contentState.collapseItems.length > 0 && (jsxs(Fragment, { children: [jsx("button", { type: "button", className: styles.breadcrumbsAction, ref: activatorRef, onClick: showCollapseItemsToggle, "data-qa": "breadcrumbs-action", children: jsx("span", { className: styles.breadcrumbsItem, children: jsx(Text, { Element: "span", typography: TEXT_TYPOGRAPHY, children: "..." }) }) }), jsx(Drop, { activatorRef: activatorRef, host: containerRef, direction: "bottom", alignment: "left", space: 300, visible: showCollapseItems, onClose: showCollapseItemsToggle, children: renderCollapseItems }), jsx(BottomSheet, { visible: !isHidden && showCollapseItems, onClose: showCollapseItemsToggle, children: renderCollapseItems }), jsx(BreadcrumbsDivider, {})] })), contentState.visibleItems.map((visibleItem) => {
58
+ const index = visibleItem.index;
59
+ const breadcrumbsExtendedItem = breadcrumbsExtendedItems[index];
60
+ if (!breadcrumbsExtendedItem) {
61
+ return null;
62
+ }
63
+ return (jsx(BreadcrumbsDynamicLink, { index: index, refreshItem: refreshItem, children: breadcrumbsExtendedItem.ReactElement }, breadcrumbsExtendedItem.key));
64
+ }), renderLastItem(breadcrumbsExtendedItems), jsx("div", { className: styles.breadcrumbsEmptySpace, ref: emptySpaceRef })] }));
65
+ };
66
+ Breadcrumbs.displayName = 'Breadcrumbs';
67
+
68
+ export { Breadcrumbs };
69
+ //# sourceMappingURL=Breadcrumbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumbs.js","sources":["../src/Breadcrumbs.tsx"],"sourcesContent":["import React, { FC, useCallback, useMemo, useState, useRef } from 'react';\nimport classnames from 'classnames';\n\nimport { BottomSheet } from '@hh.ru/magritte-ui-bottom-sheet';\nimport { BreadcrumbsDivider } from '@hh.ru/magritte-ui-breadcrumbs/BreadcrumbsDivider';\nimport { BreadcrumbsDynamicLink } from '@hh.ru/magritte-ui-breadcrumbs/BreadcrumbsDynamicLink';\nimport { BreadcrumbsProps } from '@hh.ru/magritte-ui-breadcrumbs/types';\nimport { useDynamicDisplayContent } from '@hh.ru/magritte-ui-breadcrumbs/useDynamicDisplayContent';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { Card } from '@hh.ru/magritte-ui-card';\nimport { Drop } from '@hh.ru/magritte-ui-drop';\nimport { Text } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './breadcrumbs.less';\n\nconst TEXT_TYPOGRAPHY = 'label-3-regular';\n\nexport const Breadcrumbs: FC<BreadcrumbsProps> = ({ children, hiddenOnMobile, dataQa }) => {\n const activatorRef = useRef(null);\n const { isMobile } = useBreakpoint();\n const isHidden = hiddenOnMobile && isMobile;\n const [showCollapseItems, setShowCollapseItems] = useState(false);\n\n const showCollapseItemsToggle = useCallback(\n () => setShowCollapseItems((showCollapseItems) => !showCollapseItems),\n []\n );\n\n const breadcrumbsExtendedItems = useMemo(() => {\n return React.Children.map(children, (child) => {\n const key = child.key || Math.random();\n return {\n key,\n ReactElement: child,\n };\n });\n }, [children]);\n\n const { containerRef, contentState, refreshItem, emptySpaceRef } =\n useDynamicDisplayContent(breadcrumbsExtendedItems);\n\n const renderCollapseItems = useMemo(() => {\n return contentState.collapseItems.map((collapseItem) => {\n const index = collapseItem.index;\n const breadcrumbsExtendedItem = breadcrumbsExtendedItems[index];\n if (!breadcrumbsExtendedItem) {\n return null;\n }\n const { onClick, Element = 'a', children, ...usefulProps } = breadcrumbsExtendedItem.ReactElement.props;\n return (\n <div\n key={breadcrumbsExtendedItem.key}\n className={classnames(styles.breadcrumbsCardBottomSheet, {\n [styles.breadcrumbsCardDrop]: !isMobile,\n })}\n >\n <Card\n {...usefulProps}\n Element={Element}\n borderRadius={12}\n padding={8}\n paddingLeft={12}\n paddingRight={12}\n style=\"blank\"\n hoverStyle=\"neutral\"\n actionCard\n stretched\n >\n <div\n className={classnames(styles.breadcrumbsItemBottomSheet, {\n [styles.breadcrumbsItemDrop]: !isMobile,\n })}\n >\n <Text Element=\"span\" typography={TEXT_TYPOGRAPHY}>\n {children}\n </Text>\n </div>\n </Card>\n </div>\n );\n });\n }, [breadcrumbsExtendedItems, contentState.collapseItems, isMobile]);\n\n const renderLastItem = (extendedItems: typeof breadcrumbsExtendedItems) => {\n if (extendedItems.length <= 1) {\n return null;\n }\n const { style, href, ...usefulProps } = extendedItems[extendedItems.length - 1].ReactElement.props;\n return (\n <div className={styles.breadcrumbsItemCurrent}>\n <Text {...usefulProps} Element=\"span\" typography={TEXT_TYPOGRAPHY} />\n </div>\n );\n };\n\n return (\n <div\n className={classnames(styles.breadcrumbs, {\n [styles.breadcrumbsHidden]: isHidden,\n })}\n ref={containerRef}\n data-qa={dataQa}\n >\n <div>\n {breadcrumbsExtendedItems[0]?.ReactElement}\n {breadcrumbsExtendedItems.length > 1 && <BreadcrumbsDivider />}\n </div>\n {contentState.collapseItems.length > 0 && (\n <>\n <button\n type=\"button\"\n className={styles.breadcrumbsAction}\n ref={activatorRef}\n onClick={showCollapseItemsToggle}\n data-qa=\"breadcrumbs-action\"\n >\n <span className={styles.breadcrumbsItem}>\n <Text Element=\"span\" typography={TEXT_TYPOGRAPHY}>\n ...\n </Text>\n </span>\n </button>\n <Drop\n activatorRef={activatorRef}\n host={containerRef}\n direction=\"bottom\"\n alignment=\"left\"\n space={300}\n visible={showCollapseItems}\n onClose={showCollapseItemsToggle}\n >\n {renderCollapseItems}\n </Drop>\n <BottomSheet visible={!isHidden && showCollapseItems} onClose={showCollapseItemsToggle}>\n {renderCollapseItems}\n </BottomSheet>\n <BreadcrumbsDivider />\n </>\n )}\n {contentState.visibleItems.map((visibleItem) => {\n const index = visibleItem.index;\n const breadcrumbsExtendedItem = breadcrumbsExtendedItems[index];\n if (!breadcrumbsExtendedItem) {\n return null;\n }\n return (\n <BreadcrumbsDynamicLink key={breadcrumbsExtendedItem.key} index={index} refreshItem={refreshItem}>\n {breadcrumbsExtendedItem.ReactElement}\n </BreadcrumbsDynamicLink>\n );\n })}\n {renderLastItem(breadcrumbsExtendedItems)}\n <div className={styles.breadcrumbsEmptySpace} ref={emptySpaceRef} />\n </div>\n );\n};\n\nBreadcrumbs.displayName = 'Breadcrumbs';\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const BreadcrumbsDivider: FC;
@@ -0,0 +1,11 @@
1
+ import './index.css';
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { Text } from '@hh.ru/magritte-ui-typography';
4
+ import { s as styles } from './breadcrumbs-ae4fd4f8.js';
5
+
6
+ const BreadcrumbsDivider = () => {
7
+ return (jsx("span", { className: styles.breadcrumbsDivider, children: jsx(Text, { Element: "span", typography: "label-3-regular", children: "/" }) }));
8
+ };
9
+
10
+ export { BreadcrumbsDivider };
11
+ //# sourceMappingURL=BreadcrumbsDivider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbsDivider.js","sources":["../src/BreadcrumbsDivider.tsx"],"sourcesContent":["import { FC } from 'react';\n\nimport { Text } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './breadcrumbs.less';\n\nexport const BreadcrumbsDivider: FC = () => {\n return (\n <span className={styles.breadcrumbsDivider}>\n <Text Element=\"span\" typography=\"label-3-regular\">\n /\n </Text>\n </span>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;AAMO,MAAM,kBAAkB,GAAO,MAAK;IACvC,QACIA,cAAM,SAAS,EAAE,MAAM,CAAC,kBAAkB,YACtCA,GAAC,CAAA,IAAI,IAAC,OAAO,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAA,QAAA,EAAA,GAAA,EAAA,CAE1C,EACJ,CAAA,EACT;AACN;;;;"}
@@ -0,0 +1,10 @@
1
+ import { FC } from 'react';
2
+ import { BreadcrumbsItem } from './types';
3
+ import { RefreshItem } from './useDynamicDisplayContent';
4
+ interface BreadcrumbsDynamicLinkProps {
5
+ index: number;
6
+ children: BreadcrumbsItem;
7
+ refreshItem: RefreshItem;
8
+ }
9
+ export declare const BreadcrumbsDynamicLink: FC<BreadcrumbsDynamicLinkProps>;
10
+ export {};
@@ -0,0 +1,19 @@
1
+ import './index.css';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import { useRef, useEffect } from 'react';
4
+ import { BreadcrumbsDivider } from './BreadcrumbsDivider.js';
5
+ import '@hh.ru/magritte-ui-typography';
6
+ import './breadcrumbs-ae4fd4f8.js';
7
+
8
+ const BreadcrumbsDynamicLink = ({ index, children, refreshItem }) => {
9
+ const breadcrumbsDynamicLinkRef = useRef(null);
10
+ useEffect(() => {
11
+ if (breadcrumbsDynamicLinkRef.current) {
12
+ refreshItem(breadcrumbsDynamicLinkRef.current.offsetWidth, index);
13
+ }
14
+ }, [refreshItem, index]);
15
+ return (jsxs("div", { ref: breadcrumbsDynamicLinkRef, children: [children, jsx(BreadcrumbsDivider, {})] }));
16
+ };
17
+
18
+ export { BreadcrumbsDynamicLink };
19
+ //# sourceMappingURL=BreadcrumbsDynamicLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbsDynamicLink.js","sources":["../src/BreadcrumbsDynamicLink.tsx"],"sourcesContent":["import { FC, useEffect, useRef } from 'react';\n\nimport { BreadcrumbsDivider } from '@hh.ru/magritte-ui-breadcrumbs/BreadcrumbsDivider';\nimport { BreadcrumbsItem } from '@hh.ru/magritte-ui-breadcrumbs/types';\nimport { RefreshItem } from '@hh.ru/magritte-ui-breadcrumbs/useDynamicDisplayContent';\n\ninterface BreadcrumbsDynamicLinkProps {\n index: number;\n children: BreadcrumbsItem;\n refreshItem: RefreshItem;\n}\n\nexport const BreadcrumbsDynamicLink: FC<BreadcrumbsDynamicLinkProps> = ({ index, children, refreshItem }) => {\n const breadcrumbsDynamicLinkRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (breadcrumbsDynamicLinkRef.current) {\n refreshItem(breadcrumbsDynamicLinkRef.current.offsetWidth, index);\n }\n }, [refreshItem, index]);\n return (\n <div ref={breadcrumbsDynamicLinkRef}>\n {children}\n <BreadcrumbsDivider />\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;AAYO,MAAM,sBAAsB,GAAoC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAI;AACxG,IAAA,MAAM,yBAAyB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC/D,SAAS,CAAC,MAAK;QACX,IAAI,yBAAyB,CAAC,OAAO,EAAE;YACnC,WAAW,CAAC,yBAAyB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AACrE,SAAA;AACL,KAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;AACzB,IAAA,QACIA,IAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,yBAAyB,EAAA,QAAA,EAAA,CAC9B,QAAQ,EACTC,GAAC,CAAA,kBAAkB,EAAG,EAAA,CAAA,CAAA,EAAA,CACpB,EACR;AACN;;;;"}
@@ -0,0 +1,2 @@
1
+ import { BreadcrumbsItemWithCustomElement } from './types';
2
+ export declare const BreadcrumbsItem: BreadcrumbsItemWithCustomElement;
@@ -0,0 +1,12 @@
1
+ import './index.css';
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { Link } from '@hh.ru/magritte-ui-link';
4
+ import { Text } from '@hh.ru/magritte-ui-typography';
5
+ import { s as styles } from './breadcrumbs-ae4fd4f8.js';
6
+
7
+ const BreadcrumbsItem = ({ ...props }) => {
8
+ return (jsx(Link, { ...props, typography: "label-3-regular", inline: true, children: jsx("span", { className: styles.breadcrumbsItem, children: jsx(Text, { Element: "span", typography: "label-3-regular", children: props.children }) }) }));
9
+ };
10
+
11
+ export { BreadcrumbsItem };
12
+ //# sourceMappingURL=BreadcrumbsItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbsItem.js","sources":["../src/BreadcrumbsItem.tsx"],"sourcesContent":["import { BreadcrumbsItemWithCustomElement } from '@hh.ru/magritte-ui-breadcrumbs/types';\nimport { Link } from '@hh.ru/magritte-ui-link';\nimport { Text } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './breadcrumbs.less';\n\nexport const BreadcrumbsItem: BreadcrumbsItemWithCustomElement = ({ ...props }) => {\n return (\n <Link {...props} typography=\"label-3-regular\" inline>\n <span className={styles.breadcrumbsItem}>\n <Text Element=\"span\" typography=\"label-3-regular\">\n {props.children}\n </Text>\n </span>\n </Link>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;AAMa,MAAA,eAAe,GAAqC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAI;AAC9E,IAAA,QACIA,GAAC,CAAA,IAAI,EAAK,EAAA,GAAA,KAAK,EAAE,UAAU,EAAC,iBAAiB,EAAC,MAAM,EAChD,IAAA,EAAA,QAAA,EAAAA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,eAAe,EACnC,QAAA,EAAAA,GAAA,CAAC,IAAI,EAAC,EAAA,OAAO,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAA,QAAA,EAC5C,KAAK,CAAC,QAAQ,GACZ,EACJ,CAAA,EAAA,CACJ,EACT;AACN;;;;"}
@@ -0,0 +1,5 @@
1
+ import './index.css';
2
+ var styles = {"breadcrumbs":"magritte-breadcrumbs___Go2gs_3-3-39","breadcrumbs_hidden":"magritte-breadcrumbs_hidden___pQ8iE_3-3-39","breadcrumbsHidden":"magritte-breadcrumbs_hidden___pQ8iE_3-3-39","breadcrumbs-empty-space":"magritte-breadcrumbs-empty-space___AtfWO_3-3-39","breadcrumbsEmptySpace":"magritte-breadcrumbs-empty-space___AtfWO_3-3-39","breadcrumbs-item":"magritte-breadcrumbs-item___7mTAI_3-3-39","breadcrumbsItem":"magritte-breadcrumbs-item___7mTAI_3-3-39","breadcrumbs-item_current":"magritte-breadcrumbs-item_current___ab215_3-3-39","breadcrumbsItemCurrent":"magritte-breadcrumbs-item_current___ab215_3-3-39","breadcrumbs-item_bottom-sheet":"magritte-breadcrumbs-item_bottom-sheet___ETvwH_3-3-39","breadcrumbsItemBottomSheet":"magritte-breadcrumbs-item_bottom-sheet___ETvwH_3-3-39","breadcrumbs-item_drop":"magritte-breadcrumbs-item_drop___-3MTt_3-3-39","breadcrumbsItemDrop":"magritte-breadcrumbs-item_drop___-3MTt_3-3-39","breadcrumbs-divider":"magritte-breadcrumbs-divider___0esPB_3-3-39","breadcrumbsDivider":"magritte-breadcrumbs-divider___0esPB_3-3-39","breadcrumbs-action":"magritte-breadcrumbs-action___jZw4w_3-3-39","breadcrumbsAction":"magritte-breadcrumbs-action___jZw4w_3-3-39","breadcrumbs-card_bottom-sheet":"magritte-breadcrumbs-card_bottom-sheet___T4Dpd_3-3-39","breadcrumbsCardBottomSheet":"magritte-breadcrumbs-card_bottom-sheet___T4Dpd_3-3-39","breadcrumbs-card_drop":"magritte-breadcrumbs-card_drop___Gw3ry_3-3-39","breadcrumbsCardDrop":"magritte-breadcrumbs-card_drop___Gw3ry_3-3-39"};
3
+
4
+ export { styles as s };
5
+ //# sourceMappingURL=breadcrumbs-ae4fd4f8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumbs-ae4fd4f8.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
package/index.css ADDED
@@ -0,0 +1,72 @@
1
+ :root{
2
+ --magritte-color-component-breadcrumbs-text-primary-v18-1-1:#20262b;
3
+ --magritte-color-component-breadcrumbs-text-secondary-v18-1-1:#8293a2;
4
+ --magritte-color-component-breadcrumbs-text-tertiary-v18-1-1:#DCE3EB;
5
+ --magritte-color-component-breadcrumbs-text-state-secondary-hovered-v18-1-1:#6a7885;
6
+ --magritte-color-component-breadcrumbs-text-state-secondary-pressed-v18-1-1:#8293a2;
7
+ }
8
+ :root{
9
+ --magritte-static-space-100-v18-1-1:4px;
10
+ --magritte-static-space-150-v18-1-1:6px;
11
+ --magritte-static-space-200-v18-1-1:8px;
12
+ --magritte-static-space-300-v18-1-1:12px;
13
+ --magritte-static-space-500-v18-1-1:20px;
14
+ }
15
+ .magritte-night-theme{
16
+ --magritte-color-component-breadcrumbs-text-primary-v18-1-1:#D4D4D4;
17
+ --magritte-color-component-breadcrumbs-text-secondary-v18-1-1:#5E5E5E;
18
+ --magritte-color-component-breadcrumbs-text-tertiary-v18-1-1:#3B3B3B;
19
+ --magritte-color-component-breadcrumbs-text-state-secondary-hovered-v18-1-1:#767676;
20
+ --magritte-color-component-breadcrumbs-text-state-secondary-pressed-v18-1-1:#5E5E5E;
21
+ }
22
+ .magritte-breadcrumbs___Go2gs_3-3-39{
23
+ display:flex;
24
+ position:relative;
25
+ white-space:nowrap;
26
+ padding:var(--magritte-static-space-300-v18-1-1) 0;
27
+ --magritte-ui-text-color-override:var(--magritte-color-component-breadcrumbs-text-tertiary-v18-1-1);
28
+ }
29
+ .magritte-breadcrumbs_hidden___pQ8iE_3-3-39{
30
+ display:none;
31
+ }
32
+ .magritte-breadcrumbs-empty-space___AtfWO_3-3-39{
33
+ width:100%;
34
+ }
35
+ .magritte-breadcrumbs-item___7mTAI_3-3-39{
36
+ --magritte-ui-text-color-override:var(--magritte-color-component-breadcrumbs-text-secondary-v18-1-1);
37
+ }
38
+ .magritte-breadcrumbs-item___7mTAI_3-3-39:hover{
39
+ --magritte-ui-text-color-override:var(--magritte-color-component-breadcrumbs-text-state-secondary-hovered-v18-1-1);
40
+ }
41
+ .magritte-breadcrumbs-item___7mTAI_3-3-39:active{
42
+ --magritte-ui-text-color-override:var(--magritte-color-component-breadcrumbs-text-state-secondary-pressed-v18-1-1);
43
+ }
44
+ .magritte-breadcrumbs-item_current___ab215_3-3-39{
45
+ --magritte-ui-text-color-override:var(--magritte-color-component-breadcrumbs-text-primary-v18-1-1);
46
+ }
47
+ .magritte-breadcrumbs-item_bottom-sheet___ETvwH_3-3-39{
48
+ overflow:hidden;
49
+ text-overflow:ellipsis;
50
+ white-space:nowrap;
51
+ line-height:22px;
52
+ color:var(--magritte-color-component-breadcrumbs-text-primary-v18-1-1);
53
+ --magritte-ui-text-color-override:var(--magritte-color-component-breadcrumbs-text-primary-v18-1-1);
54
+ }
55
+ .magritte-breadcrumbs-item_drop___-3MTt_3-3-39{
56
+ line-height:inherit;
57
+ }
58
+ .magritte-breadcrumbs-divider___0esPB_3-3-39{
59
+ position:relative;
60
+ bottom:1px;
61
+ padding:0 var(--magritte-static-space-150-v18-1-1);
62
+ --magritte-ui-text-color-override:var(--magritte-color-component-breadcrumbs-text-tertiary-v18-1-1);
63
+ }
64
+ .magritte-breadcrumbs-action___jZw4w_3-3-39{
65
+ min-width:var(--magritte-static-space-500-v18-1-1);
66
+ }
67
+ .magritte-breadcrumbs-card_bottom-sheet___T4Dpd_3-3-39:not(.magritte-breadcrumbs-card_bottom-sheet___T4Dpd_3-3-39:last-child){
68
+ margin-bottom:var(--magritte-static-space-200-v18-1-1);
69
+ }
70
+ .magritte-breadcrumbs-card_drop___Gw3ry_3-3-39:not(.magritte-breadcrumbs-card_drop___Gw3ry_3-3-39:last-child){
71
+ margin-bottom:var(--magritte-static-space-100-v18-1-1);
72
+ }
package/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export { type BreadcrumbsItemProps, type BreadcrumbsProps } from './types';
2
+ export * from './Breadcrumbs';
3
+ export * from './BreadcrumbsItem';
4
+ export * from '@hh.ru/magritte-ui-theme-provider';
package/index.js ADDED
@@ -0,0 +1,19 @@
1
+ import './index.css';
2
+ export { Breadcrumbs } from './Breadcrumbs.js';
3
+ export { BreadcrumbsItem } from './BreadcrumbsItem.js';
4
+ export * from '@hh.ru/magritte-ui-theme-provider';
5
+ import 'react/jsx-runtime';
6
+ import 'react';
7
+ import 'classnames';
8
+ import '@hh.ru/magritte-ui-bottom-sheet';
9
+ import './BreadcrumbsDivider.js';
10
+ import '@hh.ru/magritte-ui-typography';
11
+ import './breadcrumbs-ae4fd4f8.js';
12
+ import './BreadcrumbsDynamicLink.js';
13
+ import './useDynamicDisplayContent.js';
14
+ import '@hh.ru/magritte-common-func-utils';
15
+ import '@hh.ru/magritte-ui-breakpoint';
16
+ import '@hh.ru/magritte-ui-card';
17
+ import '@hh.ru/magritte-ui-drop';
18
+ import '@hh.ru/magritte-ui-link';
19
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
@@ -0,0 +1,5 @@
1
+ import { ForwardRefExoticComponent } from 'react';
2
+ export * from './types';
3
+ declare const ThemeProvider: any;
4
+ export { ThemeProvider };
5
+ export declare const Breadcrumbs: ForwardRefExoticComponent<Record<string, unknown>>;
package/index.mock.js ADDED
@@ -0,0 +1,9 @@
1
+ import './index.css';
2
+ import { mockComponent } from '@hh.ru/magritte-ui-mock-component';
3
+
4
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
5
+ const { ThemeProvider } = jest.requireActual('@hh.ru/magritte-ui-theme-provider/index');
6
+ const Breadcrumbs = mockComponent('Breadcrumbs');
7
+
8
+ export { Breadcrumbs, ThemeProvider };
9
+ //# sourceMappingURL=index.mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mock.js","sources":["../src/index.mock.ts"],"sourcesContent":["import { ForwardRefExoticComponent } from 'react';\n\nimport { mockComponent } from '@hh.ru/magritte-ui-mock-component';\n\nexport * from '@hh.ru/magritte-ui-breadcrumbs/types';\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\nconst { ThemeProvider } = jest.requireActual('@hh.ru/magritte-ui-theme-provider/index');\n\nexport { ThemeProvider };\n\nexport const Breadcrumbs: ForwardRefExoticComponent<Record<string, unknown>> = mockComponent('Breadcrumbs');\n"],"names":[],"mappings":";;AAMA;AACM,MAAA,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,yCAAyC,EAAE;MAI3E,WAAW,GAAuD,aAAa,CAAC,aAAa;;;;"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@hh.ru/magritte-ui-breadcrumbs",
3
+ "version": "3.3.39",
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-common-func-utils": "1.3.6",
23
+ "@hh.ru/magritte-design-tokens": "18.1.1",
24
+ "@hh.ru/magritte-types": "4.0.1",
25
+ "@hh.ru/magritte-ui-bottom-sheet": "4.1.22",
26
+ "@hh.ru/magritte-ui-breakpoint": "4.0.1",
27
+ "@hh.ru/magritte-ui-card": "6.0.2",
28
+ "@hh.ru/magritte-ui-drop": "5.0.8",
29
+ "@hh.ru/magritte-ui-link": "4.1.1",
30
+ "@hh.ru/magritte-ui-mock-component": "1.0.10",
31
+ "@hh.ru/magritte-ui-theme-provider": "1.1.21",
32
+ "@hh.ru/magritte-ui-typography": "3.0.8"
33
+ },
34
+ "peerDependencies": {
35
+ "classnames": ">=2.3.2",
36
+ "react": ">=18.2.0"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "gitHead": "b660dd64fca3eaad5ec44ea9a73f92bb0d9694aa"
42
+ }
package/types.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { ReactElement, ReactNode } from 'react';
2
+ import { PropsWithCustomElement } from '@hh.ru/magritte-types';
3
+ interface BreadcrumbsItemBaseProps {
4
+ /** Кастомный элемент */
5
+ Element?: 'a';
6
+ /** Ссылка элемента навигационной цепочки */
7
+ href?: string;
8
+ /** Лейбл для скринридеров */
9
+ 'aria-label'?: string;
10
+ /** data-qa атрибут элемента навигационной цепочки */
11
+ 'data-qa'?: string;
12
+ }
13
+ export type BreadcrumbsItemProps<ElementType = 'a'> = PropsWithCustomElement<BreadcrumbsItemBaseProps, ElementType> & {
14
+ children: ReactNode;
15
+ };
16
+ export interface BreadcrumbsItemWithCustomElement<DefaultElement extends BreadcrumbsItemBaseProps['Element'] = 'a'> {
17
+ <T extends unknown = DefaultElement>(props: BreadcrumbsItemProps<T>): ReturnType<React.FC>;
18
+ }
19
+ export type BreadcrumbsItem = ReactElement<BreadcrumbsItemProps>;
20
+ export interface BreadcrumbsProps {
21
+ /** Флаг, позволяющий опционально скрывать breadcrumbs на XS/S экранах */
22
+ hiddenOnMobile?: boolean;
23
+ /** Массив элементов из которых будет построена цепочка навигации */
24
+ children: BreadcrumbsItem[];
25
+ /** data-qa атрибут */
26
+ dataQa?: string;
27
+ }
28
+ 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":""}
@@ -0,0 +1,28 @@
1
+ import { Key, RefObject } from 'react';
2
+ import { BreadcrumbsItem } from './types';
3
+ export interface BreadcrumbsItemAdditionalParameters {
4
+ key: Key;
5
+ index: number;
6
+ width: number;
7
+ }
8
+ interface StateOfBreadcrumbs {
9
+ visibleItems: BreadcrumbsItemAdditionalParameters[];
10
+ collapseItems: BreadcrumbsItemAdditionalParameters[];
11
+ }
12
+ interface BreadcrumbsExtendedItem {
13
+ key: React.Key;
14
+ ReactElement: BreadcrumbsItem;
15
+ }
16
+ export interface RefreshItem {
17
+ (width: number, index: number): void;
18
+ }
19
+ interface UseDynamicDisplayContent {
20
+ (data: BreadcrumbsExtendedItem[]): {
21
+ containerRef: RefObject<HTMLDivElement>;
22
+ contentState: StateOfBreadcrumbs;
23
+ refreshItem: RefreshItem;
24
+ emptySpaceRef: RefObject<HTMLDivElement>;
25
+ };
26
+ }
27
+ export declare const useDynamicDisplayContent: UseDynamicDisplayContent;
28
+ export {};
@@ -0,0 +1,205 @@
1
+ import './index.css';
2
+ import { useRef, useReducer, useEffect, useCallback } from 'react';
3
+ import { throttle } from '@hh.ru/magritte-common-func-utils';
4
+
5
+ const BREAK_INDEX = -2;
6
+ const RESIZE_THROTTLE_MS = 50;
7
+ var BreadcrumbsActionType;
8
+ (function (BreadcrumbsActionType) {
9
+ BreadcrumbsActionType["Limiter"] = "LIMITER";
10
+ BreadcrumbsActionType["AddVisibleItem"] = "ADD_VISIBLE_ITEM";
11
+ BreadcrumbsActionType["AddCollapseItem"] = "ADD_COLLAPSE_ITEM";
12
+ BreadcrumbsActionType["UpdateItemData"] = "UPDATE_ITEM_DATA";
13
+ BreadcrumbsActionType["UpdateData"] = "UPDATE_DATA";
14
+ })(BreadcrumbsActionType || (BreadcrumbsActionType = {}));
15
+ function reducer(state, action) {
16
+ switch (action.type) {
17
+ case BreadcrumbsActionType.Limiter: {
18
+ const visibleItems = state.visibleItems.slice(BREAK_INDEX);
19
+ const collapseItems = state.visibleItems.slice(0, BREAK_INDEX);
20
+ return {
21
+ ...state,
22
+ visibleItems,
23
+ collapseItems,
24
+ };
25
+ }
26
+ case BreadcrumbsActionType.AddVisibleItem: {
27
+ if (state.collapseItems.length > 0) {
28
+ const lastItemInCollapseItems = state.collapseItems[state.collapseItems.length - 1];
29
+ const visibleItems = [lastItemInCollapseItems, ...state.visibleItems];
30
+ const collapseItems = state.collapseItems.slice(0, -1);
31
+ return {
32
+ ...state,
33
+ visibleItems,
34
+ collapseItems,
35
+ };
36
+ }
37
+ return state;
38
+ }
39
+ case BreadcrumbsActionType.AddCollapseItem: {
40
+ if (state.visibleItems.length > 0) {
41
+ const firstItemInVisibleItems = state.visibleItems[0];
42
+ const visibleItems = state.visibleItems.slice(1);
43
+ const collapseItems = [...state.collapseItems, firstItemInVisibleItems];
44
+ return {
45
+ ...state,
46
+ visibleItems,
47
+ collapseItems,
48
+ };
49
+ }
50
+ return state;
51
+ }
52
+ case BreadcrumbsActionType.UpdateItemData: {
53
+ let updateComplete = false;
54
+ const visibleItems = state.visibleItems.map((item) => {
55
+ if (item.index === action.payload.index) {
56
+ updateComplete = true;
57
+ return { ...item, width: action.payload.width };
58
+ }
59
+ return item;
60
+ });
61
+ const collapseItems = updateComplete
62
+ ? [...state.collapseItems]
63
+ : state.collapseItems.map((item) => {
64
+ if (item.index === action.payload.index) {
65
+ return { ...item, width: action.payload.width };
66
+ }
67
+ return item;
68
+ });
69
+ return {
70
+ ...state,
71
+ visibleItems,
72
+ collapseItems,
73
+ };
74
+ }
75
+ case BreadcrumbsActionType.UpdateData: {
76
+ const oldWidthData = {};
77
+ const oldItems = state.collapseItems.concat(state.visibleItems).reduce((accumulator, currentValue) => {
78
+ const key = `${currentValue.key}`;
79
+ accumulator[key] = currentValue.width;
80
+ return accumulator;
81
+ }, oldWidthData);
82
+ const visibleItems = action.payload.visibleItems.map((item) => {
83
+ if (oldItems[item.key]) {
84
+ return { ...item, width: oldItems[item.key] };
85
+ }
86
+ return item;
87
+ });
88
+ return {
89
+ visibleItems,
90
+ collapseItems: action.payload.collapseItems,
91
+ };
92
+ }
93
+ default:
94
+ return state;
95
+ }
96
+ }
97
+ function createInitialState(data) {
98
+ const indexOfLastItem = data.length - 1;
99
+ const visibleItems = data
100
+ .map((item, index) => ({ key: item.key, index, width: 0 }))
101
+ .slice(1, indexOfLastItem);
102
+ const collapseItems = [];
103
+ return {
104
+ visibleItems,
105
+ collapseItems,
106
+ };
107
+ }
108
+ const useDynamicDisplayContent = (data) => {
109
+ const containerRef = useRef(null);
110
+ const emptySpaceRef = useRef(null);
111
+ const visibleContentWidth = useRef(0);
112
+ const staticContentWidth = useRef(0);
113
+ const expandContentWidth = useRef(0);
114
+ const [contentState, dispatch] = useReducer(reducer, data, createInitialState);
115
+ useEffect(() => {
116
+ dispatch({
117
+ type: BreadcrumbsActionType.UpdateData,
118
+ payload: createInitialState(data),
119
+ });
120
+ }, [data]);
121
+ /**
122
+ * Первоначальный вызов собирает стейт, который содержит только общие данные элементов breadcrumbs. После
123
+ * рендера элементов (на основе этих данных) мы подтягиваем в стейт ссылки на элементы и ширину каждого из них.
124
+ */
125
+ const refreshItem = useCallback((width, index) => {
126
+ dispatch({
127
+ type: BreadcrumbsActionType.UpdateItemData,
128
+ payload: {
129
+ index,
130
+ width,
131
+ },
132
+ });
133
+ }, []);
134
+ /**
135
+ * Перед отрисовкой компонента в браузере нам нужно привести его в соответствие со спецификацией ДС:
136
+ * в спецификации указано, что breadcrumbs не может отображать более 5-ти элементов.
137
+ *
138
+ * Варианты отображения breadcrumbs:
139
+ * -> link / link / link / link / text
140
+ * или
141
+ * -> link / action / link / link / text
142
+ *
143
+ * Если лимит будет превышен, лимитер схлопнет в action все элементы, которые окажутся между первым элементом и
144
+ * тремя последними. Таким образом компонент breadcrumbs будет приведен к виду -> link / action / link / link / text,
145
+ * где action - это кнопка, раскрывающая дроп-контейнер, в который складываются сколлапсировавшие элементы.
146
+ *
147
+ * Если после лимитирования контейнер-родитель всё равно не будет умещать в себе контент, то видимые элементы
148
+ * один за другим начнут коллапсировать (переходить из массива visibleItems в collapseItems) пока breadcrumbs не примет вид:
149
+ * -> ink / action / text - это максимально возможный уровень сворачивания элементов.
150
+ */
151
+ useEffect(() => {
152
+ if (data.length > 5) {
153
+ dispatch({ type: BreadcrumbsActionType.Limiter });
154
+ }
155
+ }, [data]);
156
+ /**
157
+ * Здесь мы отслеживаем ширину видимого контента, ширину статичного контента (относительно статичного:
158
+ * это общая ширина первого и последнего элементов, а также action при его наличии), а также ширину
159
+ * расширяемого контента.
160
+ */
161
+ useEffect(() => {
162
+ const containerNode = containerRef.current;
163
+ const emptySpaceNode = emptySpaceRef.current;
164
+ if (!containerNode || !emptySpaceNode) {
165
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
166
+ return () => { };
167
+ }
168
+ visibleContentWidth.current = contentState.visibleItems.reduce((sum, children) => sum + children.width, 0);
169
+ staticContentWidth.current =
170
+ containerNode.offsetWidth - visibleContentWidth.current - emptySpaceNode.offsetWidth;
171
+ if (contentState.collapseItems.length) {
172
+ expandContentWidth.current =
173
+ staticContentWidth.current +
174
+ visibleContentWidth.current +
175
+ contentState.collapseItems[contentState.collapseItems.length - 1].width;
176
+ }
177
+ const observer = new ResizeObserver(throttle(() => {
178
+ if (containerNode.scrollWidth > containerNode.offsetWidth && contentState.visibleItems.length > 0) {
179
+ dispatch({ type: BreadcrumbsActionType.AddCollapseItem });
180
+ observer.unobserve(containerNode);
181
+ return;
182
+ }
183
+ if ((contentState.visibleItems.length < 2 && contentState.collapseItems.length > 0) ||
184
+ (contentState.visibleItems.length < 3 && contentState.collapseItems.length === 1)) {
185
+ if (containerNode.offsetWidth > expandContentWidth.current) {
186
+ dispatch({ type: BreadcrumbsActionType.AddVisibleItem });
187
+ observer.unobserve(containerNode);
188
+ }
189
+ }
190
+ }, RESIZE_THROTTLE_MS));
191
+ observer.observe(containerNode);
192
+ return () => {
193
+ observer.disconnect();
194
+ };
195
+ }, [contentState.visibleItems, contentState.collapseItems]);
196
+ return {
197
+ containerRef,
198
+ contentState,
199
+ refreshItem,
200
+ emptySpaceRef,
201
+ };
202
+ };
203
+
204
+ export { useDynamicDisplayContent };
205
+ //# sourceMappingURL=useDynamicDisplayContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDynamicDisplayContent.js","sources":["../src/useDynamicDisplayContent.ts"],"sourcesContent":["import { Key, useCallback, useEffect, useRef, useReducer, RefObject } from 'react';\n\nimport { throttle } from '@hh.ru/magritte-common-func-utils';\nimport { BreadcrumbsItem } from '@hh.ru/magritte-ui-breadcrumbs/types';\n\nconst BREAK_INDEX = -2;\nconst RESIZE_THROTTLE_MS = 50;\n\nexport interface BreadcrumbsItemAdditionalParameters {\n key: Key;\n index: number;\n width: number;\n}\n\ninterface StateOfBreadcrumbs {\n visibleItems: BreadcrumbsItemAdditionalParameters[];\n collapseItems: BreadcrumbsItemAdditionalParameters[];\n}\n\nenum BreadcrumbsActionType {\n Limiter = 'LIMITER',\n AddVisibleItem = 'ADD_VISIBLE_ITEM',\n AddCollapseItem = 'ADD_COLLAPSE_ITEM',\n UpdateItemData = 'UPDATE_ITEM_DATA',\n UpdateData = 'UPDATE_DATA',\n}\n\ntype ActionOfBreadcrumbs =\n | {\n type:\n | BreadcrumbsActionType.Limiter\n | BreadcrumbsActionType.AddVisibleItem\n | BreadcrumbsActionType.AddCollapseItem;\n }\n | {\n type: BreadcrumbsActionType.UpdateItemData;\n payload: {\n index: number;\n width: number;\n };\n }\n | {\n type: BreadcrumbsActionType.UpdateData;\n payload: StateOfBreadcrumbs;\n };\n\ninterface OldWidthData {\n [key: string]: number;\n}\n\nfunction reducer(state: StateOfBreadcrumbs, action: ActionOfBreadcrumbs) {\n switch (action.type) {\n case BreadcrumbsActionType.Limiter: {\n const visibleItems = state.visibleItems.slice(BREAK_INDEX);\n const collapseItems = state.visibleItems.slice(0, BREAK_INDEX);\n return {\n ...state,\n visibleItems,\n collapseItems,\n };\n }\n case BreadcrumbsActionType.AddVisibleItem: {\n if (state.collapseItems.length > 0) {\n const lastItemInCollapseItems = state.collapseItems[state.collapseItems.length - 1];\n const visibleItems = [lastItemInCollapseItems, ...state.visibleItems];\n const collapseItems = state.collapseItems.slice(0, -1);\n return {\n ...state,\n visibleItems,\n collapseItems,\n };\n }\n return state;\n }\n case BreadcrumbsActionType.AddCollapseItem: {\n if (state.visibleItems.length > 0) {\n const firstItemInVisibleItems = state.visibleItems[0];\n const visibleItems = state.visibleItems.slice(1);\n const collapseItems = [...state.collapseItems, firstItemInVisibleItems];\n return {\n ...state,\n visibleItems,\n collapseItems,\n };\n }\n return state;\n }\n case BreadcrumbsActionType.UpdateItemData: {\n let updateComplete = false;\n const visibleItems = state.visibleItems.map((item) => {\n if (item.index === action.payload.index) {\n updateComplete = true;\n return { ...item, width: action.payload.width };\n }\n return item;\n });\n const collapseItems = updateComplete\n ? [...state.collapseItems]\n : state.collapseItems.map((item) => {\n if (item.index === action.payload.index) {\n return { ...item, width: action.payload.width };\n }\n return item;\n });\n return {\n ...state,\n visibleItems,\n collapseItems,\n };\n }\n case BreadcrumbsActionType.UpdateData: {\n const oldWidthData: OldWidthData = {};\n const oldItems = state.collapseItems.concat(state.visibleItems).reduce((accumulator, currentValue) => {\n const key = `${currentValue.key}`;\n accumulator[key] = currentValue.width;\n return accumulator;\n }, oldWidthData);\n\n const visibleItems = action.payload.visibleItems.map((item) => {\n if (oldItems[item.key]) {\n return { ...item, width: oldItems[item.key] };\n }\n return item;\n });\n return {\n visibleItems,\n collapseItems: action.payload.collapseItems,\n };\n }\n default:\n return state;\n }\n}\n\ninterface BreadcrumbsExtendedItem {\n key: React.Key;\n ReactElement: BreadcrumbsItem;\n}\n\nfunction createInitialState(data: BreadcrumbsExtendedItem[]) {\n const indexOfLastItem = data.length - 1;\n const visibleItems: BreadcrumbsItemAdditionalParameters[] = data\n .map((item, index) => ({ key: item.key, index, width: 0 }))\n .slice(1, indexOfLastItem);\n const collapseItems: BreadcrumbsItemAdditionalParameters[] = [];\n return {\n visibleItems,\n collapseItems,\n };\n}\n\nexport interface RefreshItem {\n (width: number, index: number): void;\n}\n\ninterface UseDynamicDisplayContent {\n (data: BreadcrumbsExtendedItem[]): {\n containerRef: RefObject<HTMLDivElement>;\n contentState: StateOfBreadcrumbs;\n refreshItem: RefreshItem;\n emptySpaceRef: RefObject<HTMLDivElement>;\n };\n}\n\nexport const useDynamicDisplayContent: UseDynamicDisplayContent = (data) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const emptySpaceRef = useRef<HTMLDivElement>(null);\n const visibleContentWidth = useRef(0);\n const staticContentWidth = useRef(0);\n const expandContentWidth = useRef(0);\n const [contentState, dispatch] = useReducer(reducer, data, createInitialState);\n\n useEffect(() => {\n dispatch({\n type: BreadcrumbsActionType.UpdateData,\n payload: createInitialState(data),\n });\n }, [data]);\n\n /**\n * Первоначальный вызов собирает стейт, который содержит только общие данные элементов breadcrumbs. После\n * рендера элементов (на основе этих данных) мы подтягиваем в стейт ссылки на элементы и ширину каждого из них.\n */\n\n const refreshItem: RefreshItem = useCallback((width, index) => {\n dispatch({\n type: BreadcrumbsActionType.UpdateItemData,\n payload: {\n index,\n width,\n },\n });\n }, []);\n\n /**\n * Перед отрисовкой компонента в браузере нам нужно привести его в соответствие со спецификацией ДС:\n * в спецификации указано, что breadcrumbs не может отображать более 5-ти элементов.\n *\n * Варианты отображения breadcrumbs:\n * -> link / link / link / link / text\n * или\n * -> link / action / link / link / text\n *\n * Если лимит будет превышен, лимитер схлопнет в action все элементы, которые окажутся между первым элементом и\n * тремя последними. Таким образом компонент breadcrumbs будет приведен к виду -> link / action / link / link / text,\n * где action - это кнопка, раскрывающая дроп-контейнер, в который складываются сколлапсировавшие элементы.\n *\n * Если после лимитирования контейнер-родитель всё равно не будет умещать в себе контент, то видимые элементы\n * один за другим начнут коллапсировать (переходить из массива visibleItems в collapseItems) пока breadcrumbs не примет вид:\n * -> ink / action / text - это максимально возможный уровень сворачивания элементов.\n */\n\n useEffect(() => {\n if (data.length > 5) {\n dispatch({ type: BreadcrumbsActionType.Limiter });\n }\n }, [data]);\n\n /**\n * Здесь мы отслеживаем ширину видимого контента, ширину статичного контента (относительно статичного:\n * это общая ширина первого и последнего элементов, а также action при его наличии), а также ширину\n * расширяемого контента.\n */\n\n useEffect(() => {\n const containerNode = containerRef.current;\n const emptySpaceNode = emptySpaceRef.current;\n if (!containerNode || !emptySpaceNode) {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n return () => {};\n }\n\n visibleContentWidth.current = contentState.visibleItems.reduce((sum, children) => sum + children.width, 0);\n staticContentWidth.current =\n containerNode.offsetWidth - visibleContentWidth.current - emptySpaceNode.offsetWidth;\n\n if (contentState.collapseItems.length) {\n expandContentWidth.current =\n staticContentWidth.current +\n visibleContentWidth.current +\n contentState.collapseItems[contentState.collapseItems.length - 1].width;\n }\n\n const observer = new ResizeObserver(\n throttle(() => {\n if (containerNode.scrollWidth > containerNode.offsetWidth && contentState.visibleItems.length > 0) {\n dispatch({ type: BreadcrumbsActionType.AddCollapseItem });\n observer.unobserve(containerNode);\n return;\n }\n if (\n (contentState.visibleItems.length < 2 && contentState.collapseItems.length > 0) ||\n (contentState.visibleItems.length < 3 && contentState.collapseItems.length === 1)\n ) {\n if (containerNode.offsetWidth > expandContentWidth.current) {\n dispatch({ type: BreadcrumbsActionType.AddVisibleItem });\n observer.unobserve(containerNode);\n }\n }\n }, RESIZE_THROTTLE_MS)\n );\n observer.observe(containerNode);\n return () => {\n observer.disconnect();\n };\n }, [contentState.visibleItems, contentState.collapseItems]);\n\n return {\n containerRef,\n contentState,\n refreshItem,\n emptySpaceRef,\n };\n};\n"],"names":[],"mappings":";;;AAKA,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC;AACvB,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAa9B,IAAK,qBAMJ,CAAA;AAND,CAAA,UAAK,qBAAqB,EAAA;AACtB,IAAA,qBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,qBAAA,CAAA,gBAAA,CAAA,GAAA,kBAAmC,CAAA;AACnC,IAAA,qBAAA,CAAA,iBAAA,CAAA,GAAA,mBAAqC,CAAA;AACrC,IAAA,qBAAA,CAAA,gBAAA,CAAA,GAAA,kBAAmC,CAAA;AACnC,IAAA,qBAAA,CAAA,YAAA,CAAA,GAAA,aAA0B,CAAA;AAC9B,CAAC,EANI,qBAAqB,KAArB,qBAAqB,GAMzB,EAAA,CAAA,CAAA,CAAA;AAyBD,SAAS,OAAO,CAAC,KAAyB,EAAE,MAA2B,EAAA;IACnE,QAAQ,MAAM,CAAC,IAAI;AACf,QAAA,KAAK,qBAAqB,CAAC,OAAO,EAAE;YAChC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAC3D,YAAA,MAAM,aAAa,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAC/D,OAAO;AACH,gBAAA,GAAG,KAAK;gBACR,YAAY;gBACZ,aAAa;aAChB,CAAC;AACL,SAAA;AACD,QAAA,KAAK,qBAAqB,CAAC,cAAc,EAAE;AACvC,YAAA,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAChC,gBAAA,MAAM,uBAAuB,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACpF,MAAM,YAAY,GAAG,CAAC,uBAAuB,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;AACtE,gBAAA,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACvD,OAAO;AACH,oBAAA,GAAG,KAAK;oBACR,YAAY;oBACZ,aAAa;iBAChB,CAAC;AACL,aAAA;AACD,YAAA,OAAO,KAAK,CAAC;AAChB,SAAA;AACD,QAAA,KAAK,qBAAqB,CAAC,eAAe,EAAE;AACxC,YAAA,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/B,MAAM,uBAAuB,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBACtD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjD,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;gBACxE,OAAO;AACH,oBAAA,GAAG,KAAK;oBACR,YAAY;oBACZ,aAAa;iBAChB,CAAC;AACL,aAAA;AACD,YAAA,OAAO,KAAK,CAAC;AAChB,SAAA;AACD,QAAA,KAAK,qBAAqB,CAAC,cAAc,EAAE;YACvC,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;gBACjD,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;oBACrC,cAAc,GAAG,IAAI,CAAC;AACtB,oBAAA,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;AACnD,iBAAA;AACD,gBAAA,OAAO,IAAI,CAAC;AAChB,aAAC,CAAC,CAAC;YACH,MAAM,aAAa,GAAG,cAAc;AAChC,kBAAE,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC;kBACxB,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;oBAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;AACrC,wBAAA,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;AACnD,qBAAA;AACD,oBAAA,OAAO,IAAI,CAAC;AAChB,iBAAC,CAAC,CAAC;YACT,OAAO;AACH,gBAAA,GAAG,KAAK;gBACR,YAAY;gBACZ,aAAa;aAChB,CAAC;AACL,SAAA;AACD,QAAA,KAAK,qBAAqB,CAAC,UAAU,EAAE;YACnC,MAAM,YAAY,GAAiB,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,YAAY,KAAI;AACjG,gBAAA,MAAM,GAAG,GAAG,CAAA,EAAG,YAAY,CAAC,GAAG,EAAE,CAAC;AAClC,gBAAA,WAAW,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;AACtC,gBAAA,OAAO,WAAW,CAAC;aACtB,EAAE,YAAY,CAAC,CAAC;AAEjB,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AAC1D,gBAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACpB,oBAAA,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjD,iBAAA;AACD,gBAAA,OAAO,IAAI,CAAC;AAChB,aAAC,CAAC,CAAC;YACH,OAAO;gBACH,YAAY;AACZ,gBAAA,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa;aAC9C,CAAC;AACL,SAAA;AACD,QAAA;AACI,YAAA,OAAO,KAAK,CAAC;AACpB,KAAA;AACL,CAAC;AAOD,SAAS,kBAAkB,CAAC,IAA+B,EAAA;AACvD,IAAA,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACxC,MAAM,YAAY,GAA0C,IAAI;SAC3D,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1D,SAAA,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAC/B,MAAM,aAAa,GAA0C,EAAE,CAAC;IAChE,OAAO;QACH,YAAY;QACZ,aAAa;KAChB,CAAC;AACN,CAAC;AAeY,MAAA,wBAAwB,GAA6B,CAAC,IAAI,KAAI;AACvE,IAAA,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AAClD,IAAA,MAAM,aAAa,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AACnD,IAAA,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACtC,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACrC,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACrC,IAAA,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAE/E,SAAS,CAAC,MAAK;AACX,QAAA,QAAQ,CAAC;YACL,IAAI,EAAE,qBAAqB,CAAC,UAAU;AACtC,YAAA,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC;AACpC,SAAA,CAAC,CAAC;AACP,KAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAEX;;;AAGG;IAEH,MAAM,WAAW,GAAgB,WAAW,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAC1D,QAAA,QAAQ,CAAC;YACL,IAAI,EAAE,qBAAqB,CAAC,cAAc;AAC1C,YAAA,OAAO,EAAE;gBACL,KAAK;gBACL,KAAK;AACR,aAAA;AACJ,SAAA,CAAC,CAAC;KACN,EAAE,EAAE,CAAC,CAAC;AAEP;;;;;;;;;;;;;;;;AAgBG;IAEH,SAAS,CAAC,MAAK;AACX,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACjB,QAAQ,CAAC,EAAE,IAAI,EAAE,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC;AACrD,SAAA;AACL,KAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAEX;;;;AAIG;IAEH,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC;AAC3C,QAAA,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC;AAC7C,QAAA,IAAI,CAAC,aAAa,IAAI,CAAC,cAAc,EAAE;;AAEnC,YAAA,OAAO,MAAO,GAAC,CAAC;AACnB,SAAA;QAED,mBAAmB,CAAC,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC3G,QAAA,kBAAkB,CAAC,OAAO;YACtB,aAAa,CAAC,WAAW,GAAG,mBAAmB,CAAC,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC;AAEzF,QAAA,IAAI,YAAY,CAAC,aAAa,CAAC,MAAM,EAAE;AACnC,YAAA,kBAAkB,CAAC,OAAO;AACtB,gBAAA,kBAAkB,CAAC,OAAO;AAC1B,oBAAA,mBAAmB,CAAC,OAAO;AAC3B,oBAAA,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/E,SAAA;QAED,MAAM,QAAQ,GAAG,IAAI,cAAc,CAC/B,QAAQ,CAAC,MAAK;AACV,YAAA,IAAI,aAAa,CAAC,WAAW,GAAG,aAAa,CAAC,WAAW,IAAI,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/F,QAAQ,CAAC,EAAE,IAAI,EAAE,qBAAqB,CAAC,eAAe,EAAE,CAAC,CAAC;AAC1D,gBAAA,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;gBAClC,OAAO;AACV,aAAA;AACD,YAAA,IACI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;AAC9E,iBAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,EACnF;AACE,gBAAA,IAAI,aAAa,CAAC,WAAW,GAAG,kBAAkB,CAAC,OAAO,EAAE;oBACxD,QAAQ,CAAC,EAAE,IAAI,EAAE,qBAAqB,CAAC,cAAc,EAAE,CAAC,CAAC;AACzD,oBAAA,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;AACrC,iBAAA;AACJ,aAAA;AACL,SAAC,EAAE,kBAAkB,CAAC,CACzB,CAAC;AACF,QAAA,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;AAChC,QAAA,OAAO,MAAK;YACR,QAAQ,CAAC,UAAU,EAAE,CAAC;AAC1B,SAAC,CAAC;KACL,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5D,OAAO;QACH,YAAY;QACZ,YAAY;QACZ,WAAW;QACX,aAAa;KAChB,CAAC;AACN;;;;"}