@snack-uikit/breadcrumbs 0.8.62 → 0.8.63-preview-ba12ca94.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/cjs/components/Breadcrumbs/Breadcrumbs.js +90 -0
  2. package/dist/cjs/components/Breadcrumbs/index.js +25 -0
  3. package/dist/cjs/components/Collapse/Collapse.js +68 -0
  4. package/dist/cjs/components/Collapse/index.js +25 -0
  5. package/dist/cjs/components/Crumb/Crumb.js +118 -0
  6. package/dist/cjs/components/Crumb/index.js +25 -0
  7. package/dist/cjs/components/CrumbsTypography/CrumbsTypography.js +24 -0
  8. package/dist/cjs/components/CrumbsTypography/index.js +25 -0
  9. package/dist/cjs/components/HiddenChain/HiddenChain.js +57 -0
  10. package/dist/cjs/components/HiddenChain/hooks.js +42 -0
  11. package/dist/cjs/components/HiddenChain/index.js +25 -0
  12. package/dist/cjs/components/Separator/Separator.js +36 -0
  13. package/dist/cjs/components/Separator/index.js +25 -0
  14. package/dist/cjs/components/Wrapper/Wrapper.js +57 -0
  15. package/dist/cjs/components/Wrapper/index.js +25 -0
  16. package/dist/cjs/components/index.js +25 -0
  17. package/dist/cjs/constants.js +22 -0
  18. package/dist/cjs/context.js +13 -0
  19. package/dist/cjs/hooks.js +97 -0
  20. package/dist/cjs/index.js +25 -0
  21. package/dist/cjs/types.js +6 -0
  22. package/dist/cjs/utils/buildBreadcrumbsConfigs.js +136 -0
  23. package/dist/cjs/utils/buildSizeMap.js +32 -0
  24. package/dist/cjs/utils/getMaxPossibleWidth.js +27 -0
  25. package/dist/cjs/utils/getTestId.js +8 -0
  26. package/dist/cjs/utils/index.js +28 -0
  27. package/dist/esm/components/Breadcrumbs/Breadcrumbs.d.ts +33 -0
  28. package/dist/esm/components/Collapse/Collapse.d.ts +6 -0
  29. package/dist/esm/components/Collapse/index.js +1 -0
  30. package/dist/esm/components/Collapse/styles.module.css +18 -0
  31. package/dist/esm/components/Crumb/Crumb.d.ts +11 -0
  32. package/dist/esm/components/Crumb/index.js +1 -0
  33. package/dist/esm/components/Crumb/styles.module.css +55 -0
  34. package/dist/esm/components/CrumbsTypography/CrumbsTypography.d.ts +7 -0
  35. package/dist/esm/components/CrumbsTypography/index.js +1 -0
  36. package/dist/esm/components/HiddenChain/HiddenChain.d.ts +10 -0
  37. package/dist/esm/components/HiddenChain/hooks.d.ts +6 -0
  38. package/dist/esm/components/HiddenChain/index.js +1 -0
  39. package/dist/esm/components/Separator/Separator.d.ts +1 -0
  40. package/dist/esm/components/Separator/index.js +1 -0
  41. package/dist/esm/components/Separator/styles.module.css +15 -0
  42. package/dist/esm/components/Wrapper/Wrapper.d.ts +19 -0
  43. package/dist/esm/components/Wrapper/index.js +1 -0
  44. package/dist/esm/components/Wrapper/styles.module.css +19 -0
  45. package/dist/esm/components/index.d.ts +1 -0
  46. package/dist/esm/components/index.js +1 -0
  47. package/dist/esm/components/styles.module.css +3 -0
  48. package/dist/esm/constants.d.ts +16 -0
  49. package/dist/esm/context.d.ts +9 -0
  50. package/dist/esm/hooks.d.ts +21 -0
  51. package/dist/esm/index.d.ts +2 -0
  52. package/dist/esm/types.d.ts +54 -0
  53. package/dist/esm/utils/buildBreadcrumbsConfigs.d.ts +2 -0
  54. package/dist/esm/utils/buildSizeMap.d.ts +2 -0
  55. package/dist/esm/utils/getMaxPossibleWidth.d.ts +6 -0
  56. package/dist/esm/utils/getTestId.d.ts +1 -0
  57. package/dist/esm/utils/index.js +4 -0
  58. package/package.json +12 -8
  59. /package/dist/{components → cjs/components}/Breadcrumbs/Breadcrumbs.d.ts +0 -0
  60. /package/dist/{components → cjs/components}/Breadcrumbs/index.d.ts +0 -0
  61. /package/dist/{components → cjs/components}/Collapse/Collapse.d.ts +0 -0
  62. /package/dist/{components → cjs/components}/Collapse/index.d.ts +0 -0
  63. /package/dist/{components → cjs/components}/Collapse/styles.module.css +0 -0
  64. /package/dist/{components → cjs/components}/Crumb/Crumb.d.ts +0 -0
  65. /package/dist/{components → cjs/components}/Crumb/index.d.ts +0 -0
  66. /package/dist/{components → cjs/components}/Crumb/styles.module.css +0 -0
  67. /package/dist/{components → cjs/components}/CrumbsTypography/CrumbsTypography.d.ts +0 -0
  68. /package/dist/{components → cjs/components}/CrumbsTypography/index.d.ts +0 -0
  69. /package/dist/{components → cjs/components}/HiddenChain/HiddenChain.d.ts +0 -0
  70. /package/dist/{components → cjs/components}/HiddenChain/hooks.d.ts +0 -0
  71. /package/dist/{components → cjs/components}/HiddenChain/index.d.ts +0 -0
  72. /package/dist/{components → cjs/components}/Separator/Separator.d.ts +0 -0
  73. /package/dist/{components → cjs/components}/Separator/index.d.ts +0 -0
  74. /package/dist/{components → cjs/components}/Separator/styles.module.css +0 -0
  75. /package/dist/{components → cjs/components}/Wrapper/Wrapper.d.ts +0 -0
  76. /package/dist/{components → cjs/components}/Wrapper/index.d.ts +0 -0
  77. /package/dist/{components → cjs/components}/Wrapper/styles.module.css +0 -0
  78. /package/dist/{components → cjs/components}/index.d.ts +0 -0
  79. /package/dist/{components → cjs/components}/styles.module.css +0 -0
  80. /package/dist/{constants.d.ts → cjs/constants.d.ts} +0 -0
  81. /package/dist/{context.d.ts → cjs/context.d.ts} +0 -0
  82. /package/dist/{hooks.d.ts → cjs/hooks.d.ts} +0 -0
  83. /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  84. /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
  85. /package/dist/{utils → cjs/utils}/buildBreadcrumbsConfigs.d.ts +0 -0
  86. /package/dist/{utils → cjs/utils}/buildSizeMap.d.ts +0 -0
  87. /package/dist/{utils → cjs/utils}/getMaxPossibleWidth.d.ts +0 -0
  88. /package/dist/{utils → cjs/utils}/getTestId.d.ts +0 -0
  89. /package/dist/{utils → cjs/utils}/index.d.ts +0 -0
  90. /package/dist/{components → esm/components}/Breadcrumbs/Breadcrumbs.js +0 -0
  91. /package/dist/{components/Breadcrumbs/index.js → esm/components/Breadcrumbs/index.d.ts} +0 -0
  92. /package/dist/{components → esm/components/Breadcrumbs}/index.js +0 -0
  93. /package/dist/{components → esm/components}/Collapse/Collapse.js +0 -0
  94. /package/dist/{components/Collapse/index.js → esm/components/Collapse/index.d.ts} +0 -0
  95. /package/dist/{components → esm/components}/Crumb/Crumb.js +0 -0
  96. /package/dist/{components/Crumb/index.js → esm/components/Crumb/index.d.ts} +0 -0
  97. /package/dist/{components → esm/components}/CrumbsTypography/CrumbsTypography.js +0 -0
  98. /package/dist/{components/CrumbsTypography/index.js → esm/components/CrumbsTypography/index.d.ts} +0 -0
  99. /package/dist/{components → esm/components}/HiddenChain/HiddenChain.js +0 -0
  100. /package/dist/{components → esm/components}/HiddenChain/hooks.js +0 -0
  101. /package/dist/{components/HiddenChain/index.js → esm/components/HiddenChain/index.d.ts} +0 -0
  102. /package/dist/{components → esm/components}/Separator/Separator.js +0 -0
  103. /package/dist/{components/Separator/index.js → esm/components/Separator/index.d.ts} +0 -0
  104. /package/dist/{components → esm/components}/Wrapper/Wrapper.js +0 -0
  105. /package/dist/{components/Wrapper/index.js → esm/components/Wrapper/index.d.ts} +0 -0
  106. /package/dist/{constants.js → esm/constants.js} +0 -0
  107. /package/dist/{context.js → esm/context.js} +0 -0
  108. /package/dist/{hooks.js → esm/hooks.js} +0 -0
  109. /package/dist/{index.js → esm/index.js} +0 -0
  110. /package/dist/{types.js → esm/types.js} +0 -0
  111. /package/dist/{utils → esm/utils}/buildBreadcrumbsConfigs.js +0 -0
  112. /package/dist/{utils → esm/utils}/buildSizeMap.js +0 -0
  113. /package/dist/{utils → esm/utils}/getMaxPossibleWidth.js +0 -0
  114. /package/dist/{utils → esm/utils}/getTestId.js +0 -0
  115. /package/dist/{utils/index.js → esm/utils/index.d.ts} +0 -0
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ var __createBinding = void 0 && (void 0).__createBinding || (Object.create ? function (o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = {
8
+ enumerable: true,
9
+ get: function () {
10
+ return m[k];
11
+ }
12
+ };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ } : function (o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ });
19
+ var __exportStar = void 0 && (void 0).__exportStar || function (m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", {
23
+ value: true
24
+ });
25
+ __exportStar(require("./Breadcrumbs"), exports);
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SIZE = exports.ELEMENT_TYPE = exports.ITEM_RENDER_MODE = exports.SEPARATOR = void 0;
7
+ exports.SEPARATOR = '›';
8
+ exports.ITEM_RENDER_MODE = {
9
+ Full: 'full',
10
+ ShortLabel: 'shortLabel',
11
+ Ellipsis: 'ellipsis',
12
+ Collapsed: 'collapsed'
13
+ };
14
+ exports.ELEMENT_TYPE = {
15
+ Separator: 'separator',
16
+ Collapse: 'collapse',
17
+ Item: 'item'
18
+ };
19
+ exports.SIZE = {
20
+ Xs: 'xs',
21
+ S: 's'
22
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BreadcrumbsContext = void 0;
7
+ const react_1 = require("react");
8
+ const constants_1 = require("./constants");
9
+ exports.BreadcrumbsContext = (0, react_1.createContext)({
10
+ hidden: false,
11
+ size: constants_1.SIZE.S,
12
+ separator: constants_1.SEPARATOR
13
+ });
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+
3
+ var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
4
+ return mod && mod.__esModule ? mod : {
5
+ "default": mod
6
+ };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", {
9
+ value: true
10
+ });
11
+ exports.useBreadcrumbsLayout = useBreadcrumbsLayout;
12
+ const lodash_debounce_1 = __importDefault(require("lodash.debounce"));
13
+ const react_1 = require("react");
14
+ const utils_1 = require("./utils");
15
+ const selectConfig = (containerWidth, configs) => {
16
+ if (!configs.length) {
17
+ return;
18
+ }
19
+ let [bestConfig] = configs;
20
+ for (const config of configs) {
21
+ if (config.width <= containerWidth) {
22
+ if (bestConfig.width > containerWidth) {
23
+ bestConfig = config;
24
+ } else {
25
+ if (bestConfig.weight > config.weight) {
26
+ bestConfig = config;
27
+ }
28
+ }
29
+ } else if (config.width < bestConfig.width) {
30
+ bestConfig = config;
31
+ }
32
+ }
33
+ if (bestConfig) {
34
+ return {
35
+ chain: bestConfig.chain,
36
+ containerWidth,
37
+ chainWidth: bestConfig.width
38
+ };
39
+ }
40
+ };
41
+ /**
42
+ * Расчет способа отображения breadcrumbs работает следующим образом:
43
+ * Каждый item может быть отображен в одном из режимов:
44
+ * full - целиком
45
+ * shortLabel - с использованием укороченного лейбла
46
+ * ellipsis - cо скруглением текста в ...
47
+ * collapse - спрятан в специальный узел "..." с тултипом.
48
+ * Для того чтоб эффективно распределить свободное по ширине пространство между айтемами в компоненте создается скрытый контейнер (HiddenChain),
49
+ * в котором рендерятся все айтемы во всех возможных способах отображения. Замеряется размер каждого из айтемов и записывается в sizeMap.
50
+ * Далее перебираются все возможные варианты отображения всей цепочки - конфиги (buildBreadcrumbsConfigs). У такого конфига есть два атрибута:
51
+ * width - суммарная ширина
52
+ * weight - вес, отображает общее количество сокращений, примененных к цепочке (например, отображение в режиме full - 0, сокращение shortLabel - +1, а ellipsis - +100 и тд)
53
+ * Для того чтоб отобразить breadcrumbs, нужно подобрать конфиг, максимальный по ширине, влезающий в контейнер, но с минимальным весом (наименьшим количеством сокращений).
54
+ */
55
+ function useBreadcrumbsLayout(containerRef) {
56
+ const [currentConfig, setCurrentConfig] = (0, react_1.useState)(undefined);
57
+ const [configs, setConfigs] = (0, react_1.useState)([]);
58
+ const selectConfigForWidth = (0, react_1.useCallback)(width => selectConfig(width, configs), [configs]);
59
+ /**
60
+ * Подбор подходящего конфига триггерится изменением ширины контейнера и изменением набора конфигов
61
+ */
62
+ (0, react_1.useEffect)(() => {
63
+ var _a;
64
+ const visibleContainer = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.parentElement;
65
+ if (!visibleContainer) {
66
+ return;
67
+ }
68
+ setCurrentConfig(selectConfig((0, utils_1.getMaxPossibleWidth)(visibleContainer), configs));
69
+ }, [configs, containerRef]);
70
+ (0, react_1.useEffect)(() => {
71
+ var _a;
72
+ const visibleContainer = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.parentElement;
73
+ if (!visibleContainer) {
74
+ return;
75
+ }
76
+ const reselectConfig = (0, lodash_debounce_1.default)(() => {
77
+ const width = (0, utils_1.getMaxPossibleWidth)(visibleContainer);
78
+ setCurrentConfig(prevConfig => {
79
+ if ((prevConfig === null || prevConfig === void 0 ? void 0 : prevConfig.containerWidth) === width) {
80
+ return prevConfig;
81
+ }
82
+ const newConf = selectConfigForWidth(width);
83
+ return newConf || (prevConfig ? Object.assign(Object.assign({}, prevConfig), {
84
+ containerWidth: width
85
+ }) : prevConfig);
86
+ });
87
+ }, 100);
88
+ const visibleContainerObserver = new ResizeObserver(reselectConfig);
89
+ visibleContainerObserver.observe(visibleContainer);
90
+ visibleContainerObserver.observe(document.body);
91
+ return () => visibleContainerObserver.disconnect();
92
+ }, [containerRef, selectConfigForWidth]);
93
+ return {
94
+ setConfigs,
95
+ currentConfig
96
+ };
97
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ var __createBinding = void 0 && (void 0).__createBinding || (Object.create ? function (o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = {
8
+ enumerable: true,
9
+ get: function () {
10
+ return m[k];
11
+ }
12
+ };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ } : function (o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ });
19
+ var __exportStar = void 0 && (void 0).__exportStar || function (m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", {
23
+ value: true
24
+ });
25
+ __exportStar(require("./components"), exports);
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ const constants_1 = require("./constants");
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildBreadcrumbsConfigs = buildBreadcrumbsConfigs;
7
+ const constants_1 = require("../constants");
8
+ const RENDER_MODE_WEIGHT = {
9
+ [constants_1.ITEM_RENDER_MODE.Full]: 0,
10
+ [constants_1.ITEM_RENDER_MODE.ShortLabel]: 1,
11
+ [constants_1.ITEM_RENDER_MODE.Ellipsis]: 100,
12
+ [constants_1.ITEM_RENDER_MODE.Collapsed]: 10000
13
+ };
14
+ const RENDER_MODE_WITH_WIDTH = [constants_1.ITEM_RENDER_MODE.Full, constants_1.ITEM_RENDER_MODE.ShortLabel, constants_1.ITEM_RENDER_MODE.Ellipsis];
15
+ const startsWith = renderMode => (item, tail) => [Object.assign(Object.assign({}, item), {
16
+ renderMode
17
+ }), ...tail];
18
+ const startsWithFull = startsWith(constants_1.ITEM_RENDER_MODE.Full);
19
+ const startsWithShortLabel = startsWith(constants_1.ITEM_RENDER_MODE.ShortLabel);
20
+ const startsWithEllipsis = startsWith(constants_1.ITEM_RENDER_MODE.Ellipsis);
21
+ const startsWithCollapsed = startsWith(constants_1.ITEM_RENDER_MODE.Collapsed);
22
+ function buildSubChain(_ref, _ref2) {
23
+ let [current, ...rest] = _ref;
24
+ let {
25
+ useCollapse = true,
26
+ useEllipse = true
27
+ } = _ref2;
28
+ const result = [];
29
+ if (!current) {
30
+ return result;
31
+ }
32
+ if (!rest.length) {
33
+ result.push(startsWithFull(current, []));
34
+ current.shortLabel && result.push(startsWithShortLabel(current, []));
35
+ return result;
36
+ }
37
+ buildSubChain(rest, {
38
+ useCollapse: false,
39
+ useEllipse: false
40
+ }).forEach(variant => {
41
+ result.push(startsWithFull(current, variant));
42
+ current.shortLabel && result.push(startsWithShortLabel(current, variant));
43
+ });
44
+ if (useEllipse) {
45
+ buildSubChain(rest, {
46
+ useCollapse: false,
47
+ useEllipse: true
48
+ }).forEach(variant => {
49
+ result.push(startsWithEllipsis(current, variant));
50
+ });
51
+ }
52
+ if (useCollapse) {
53
+ buildSubChain(rest, {
54
+ useCollapse: true,
55
+ useEllipse: false
56
+ }).forEach(variant => {
57
+ result.push(startsWithCollapsed(current, variant));
58
+ });
59
+ }
60
+ return result;
61
+ }
62
+ const collapseAllRest = (lastElementRenderMode, rest) => rest.map((element, index, array) => {
63
+ const lastItem = index === array.length - 1;
64
+ return Object.assign(Object.assign({}, element), {
65
+ renderMode: lastItem ? lastElementRenderMode : constants_1.ITEM_RENDER_MODE.Collapsed
66
+ });
67
+ });
68
+ function buildBreadcrumbsConfigs(items, sizeMap, lastEmpty) {
69
+ if (!items.length) {
70
+ return [];
71
+ }
72
+ const chains = [];
73
+ const [first, ...rest] = items.map(item => Object.assign(Object.assign({}, item), {
74
+ renderMode: constants_1.ITEM_RENDER_MODE.Full
75
+ }));
76
+ buildSubChain(rest, {
77
+ useCollapse: true,
78
+ useEllipse: true
79
+ }).forEach(subset => {
80
+ chains.push(startsWithFull(first, subset));
81
+ first.shortLabel && chains.push(startsWithShortLabel(first, subset));
82
+ });
83
+ /** Первый элемент можно схлопывать/сокращать только когда уже сокращено все что можно */
84
+ chains.push(startsWithEllipsis(first, collapseAllRest(constants_1.ITEM_RENDER_MODE.Full, rest)));
85
+ chains.push(startsWithEllipsis(first, collapseAllRest(constants_1.ITEM_RENDER_MODE.Ellipsis, rest)));
86
+ chains.push(startsWithCollapsed(first, collapseAllRest(constants_1.ITEM_RENDER_MODE.Full, rest)));
87
+ chains.push(startsWithCollapsed(first, collapseAllRest(constants_1.ITEM_RENDER_MODE.Ellipsis, rest)));
88
+ return chains.map(chain => chain.reduce((acc, item, index, array) => {
89
+ const {
90
+ renderMode
91
+ } = item;
92
+ if (index && RENDER_MODE_WITH_WIDTH.includes(renderMode)) {
93
+ acc.width += sizeMap.separator;
94
+ acc.chain.push({
95
+ element: constants_1.ELEMENT_TYPE.Separator,
96
+ width: sizeMap.separator
97
+ });
98
+ }
99
+ if (!acc.hasCollapsed && renderMode === constants_1.ITEM_RENDER_MODE.Collapsed) {
100
+ if (index) {
101
+ acc.width += sizeMap.separator;
102
+ acc.chain.push({
103
+ element: constants_1.ELEMENT_TYPE.Separator,
104
+ width: sizeMap.separator
105
+ });
106
+ }
107
+ acc.hasCollapsed = true;
108
+ acc.width += sizeMap.collapse;
109
+ acc.chain.push({
110
+ element: constants_1.ELEMENT_TYPE.Collapse,
111
+ width: sizeMap.collapse
112
+ });
113
+ }
114
+ const width = sizeMap.items[item.id][renderMode];
115
+ acc.weight += RENDER_MODE_WEIGHT[item.renderMode];
116
+ acc.width += width;
117
+ acc.chain.push({
118
+ element: constants_1.ELEMENT_TYPE.Item,
119
+ item,
120
+ width
121
+ });
122
+ if (index === array.length - 1 && lastEmpty) {
123
+ acc.width += sizeMap.separator;
124
+ acc.chain.push({
125
+ element: constants_1.ELEMENT_TYPE.Separator,
126
+ width: sizeMap.separator
127
+ });
128
+ }
129
+ return acc;
130
+ }, {
131
+ chain: [],
132
+ weight: 0,
133
+ width: 0,
134
+ hasCollapsed: false
135
+ }));
136
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildSizeMap = buildSizeMap;
7
+ const constants_1 = require("../constants");
8
+ const getEmptyItemSizeMap = () => ({
9
+ [constants_1.ITEM_RENDER_MODE.ShortLabel]: 0,
10
+ [constants_1.ITEM_RENDER_MODE.Collapsed]: 0,
11
+ [constants_1.ITEM_RENDER_MODE.Ellipsis]: 0,
12
+ [constants_1.ITEM_RENDER_MODE.Full]: 0
13
+ });
14
+ const getElementWidth = element => element.getBoundingClientRect().width;
15
+ function buildSizeMap(container) {
16
+ if (!container) {
17
+ return;
18
+ }
19
+ const children = container.children;
20
+ const [separator, collapse, ...itemElements] = Array.from(children);
21
+ return {
22
+ separator: getElementWidth(separator),
23
+ collapse: getElementWidth(collapse),
24
+ items: itemElements.reduce((result, element) => {
25
+ const id = element.getAttribute('data-id');
26
+ const renderMode = element.getAttribute('data-render-mode');
27
+ result[id] = result[id] || getEmptyItemSizeMap();
28
+ result[id][renderMode] = getElementWidth(element);
29
+ return result;
30
+ }, {})
31
+ };
32
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getMaxPossibleWidth = void 0;
7
+ const utils_1 = require("@snack-uikit/utils");
8
+ /**
9
+ * Функция предназначена для измерения максимально возможной ширины контейнера
10
+ * она вставляет широкую распорку, замеряет ширину и удаляет ее
11
+ * это происходит в одном обороте eventLoop, поэтому новый кадр с распоркой не рендерится браузером.
12
+ */
13
+ const getMaxPossibleWidth = element => {
14
+ if (!element) {
15
+ return 0;
16
+ }
17
+ if ((0, utils_1.isBrowser)()) {
18
+ const spreader = document.createElement('div');
19
+ spreader.style.width = '10000px';
20
+ element.append(spreader);
21
+ const width = element.getBoundingClientRect().width;
22
+ element.removeChild(spreader);
23
+ return width;
24
+ }
25
+ return 0;
26
+ };
27
+ exports.getMaxPossibleWidth = getMaxPossibleWidth;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getTestId = void 0;
7
+ const getTestId = (prefix, testId) => testId ? `${prefix}-element-${testId}` : '';
8
+ exports.getTestId = getTestId;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ var __createBinding = void 0 && (void 0).__createBinding || (Object.create ? function (o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = {
8
+ enumerable: true,
9
+ get: function () {
10
+ return m[k];
11
+ }
12
+ };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ } : function (o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ });
19
+ var __exportStar = void 0 && (void 0).__exportStar || function (m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", {
23
+ value: true
24
+ });
25
+ __exportStar(require("./buildBreadcrumbsConfigs"), exports);
26
+ __exportStar(require("./buildSizeMap"), exports);
27
+ __exportStar(require("./getMaxPossibleWidth"), exports);
28
+ __exportStar(require("./getTestId"), exports);
@@ -0,0 +1,33 @@
1
+ import { WithSupportProps } from '@snack-uikit/utils';
2
+ import { Item, Size } from '../../types';
3
+ export type BreadcrumbsProps = WithSupportProps<{
4
+ /** Массив айтемов */
5
+ items: Item[];
6
+ /** CSS-класс */
7
+ className?: string;
8
+ /**
9
+ * Разделитель
10
+ * @default "›"
11
+ */
12
+ separator?: string;
13
+ /**
14
+ * Размер
15
+ * @default s
16
+ */
17
+ size?: Size;
18
+ /**
19
+ * Использовать иконку без лейбла в первом айтеме
20
+ * @default false
21
+ */
22
+ firstItemIconOnly?: boolean;
23
+ /**
24
+ * Делает некликабельным последний элемент, даже если для него переданы `href` или `onClick`
25
+ * @default false
26
+ */
27
+ inactiveLastItem?: boolean;
28
+ lastEmpty?: boolean;
29
+ }>;
30
+ /**
31
+ * Компонент хлебных крошек
32
+ */
33
+ export declare const Breadcrumbs: import("react").NamedExoticComponent<BreadcrumbsProps>;
@@ -0,0 +1,6 @@
1
+ import { BreadcrumbsConfigChain } from '../../types';
2
+ export type CollapseProps = {
3
+ className?: string;
4
+ currentConfig: BreadcrumbsConfigChain;
5
+ };
6
+ export declare function Collapse({ currentConfig, className }: CollapseProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from './Collapse';
@@ -0,0 +1,18 @@
1
+ .collapse{
2
+ color:var(--sys-neutral-text-light, #8b8e9b);
3
+ background:none;
4
+ border:none;
5
+ }
6
+ .collapse:focus-visible, .collapse:hover{
7
+ color:var(--sys-neutral-text-support, #6d707f);
8
+ }
9
+ .collapse:focus-visible{
10
+ outline-width:var(--border-state-focus-s-border-width, 2px);
11
+ outline-style:var(--border-state-focus-s-border-style, solid);
12
+ outline-color:var(--border-state-focus-s-border-color, );
13
+ outline-color:var(--sys-available-complementary, #1c1c24);
14
+ }
15
+
16
+ .collapsedRow{
17
+ display:flex;
18
+ }
@@ -0,0 +1,11 @@
1
+ import { WithSupportProps } from '@snack-uikit/utils';
2
+ import { Item, ItemRenderMode } from '../../types';
3
+ export type CrumbProps = WithSupportProps<{
4
+ renderMode: ItemRenderMode;
5
+ className?: string;
6
+ minWidth?: number;
7
+ current?: boolean;
8
+ item: Item;
9
+ useIconOnly?: boolean;
10
+ }>;
11
+ export declare const Crumb: import("react").NamedExoticComponent<CrumbProps>;
@@ -0,0 +1 @@
1
+ export * from './Crumb';
@@ -0,0 +1,55 @@
1
+ .wrapper{
2
+ flex-shrink:0;
3
+ list-style:none;
4
+ }
5
+ .wrapper[data-render-mode=ellipsis]{
6
+ flex-shrink:1;
7
+ }
8
+
9
+ .crumb, a.crumb{
10
+ display:flex;
11
+ align-items:center;
12
+ width:100%;
13
+ margin:0;
14
+ padding:0;
15
+ color:var(--sys-neutral-text-light, #8b8e9b);
16
+ text-decoration:none;
17
+ background:none;
18
+ border:none;
19
+ }
20
+ .crumb[data-clickable], a.crumb[data-clickable]{
21
+ cursor:pointer;
22
+ }
23
+ .crumb[data-clickable]:focus-visible, .crumb[data-clickable]:hover, a.crumb[data-clickable]:focus-visible, a.crumb[data-clickable]:hover{
24
+ color:var(--sys-neutral-text-support, #6d707f);
25
+ }
26
+ .crumb[data-current=true], a.crumb[data-current=true]{
27
+ color:var(--sys-neutral-text-support, #6d707f);
28
+ }
29
+ .crumb:focus-visible, a.crumb:focus-visible{
30
+ outline-width:var(--border-state-focus-s-border-width, 2px);
31
+ outline-style:var(--border-state-focus-s-border-style, solid);
32
+ outline-color:var(--border-state-focus-s-border-color, );
33
+ outline-color:var(--sys-available-complementary, #1c1c24);
34
+ }
35
+ .crumb[data-size=xs], a.crumb[data-size=xs]{
36
+ height:var(--size-breadcrumbs-xs, 16px);
37
+ gap:var(--space-breadcrumbs-crumb-xs-gap, 2px);
38
+ }
39
+ .crumb[data-size=s], a.crumb[data-size=s]{
40
+ height:var(--size-breadcrumbs-s, 24px);
41
+ gap:var(--space-breadcrumbs-crumb-s-gap, 2px);
42
+ }
43
+ .crumb .label, a.crumb .label{
44
+ overflow:hidden;
45
+ width:100%;
46
+ text-overflow:ellipsis;
47
+ white-space:nowrap;
48
+ }
49
+ .crumb .icon, a.crumb .icon{
50
+ display:flex;
51
+ flex-shrink:0;
52
+ align-items:center;
53
+ width:-moz-fit-content;
54
+ width:fit-content;
55
+ }
@@ -0,0 +1,7 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { Size } from '../../types';
3
+ export type CrumbsTypographyProps = PropsWithChildren<{
4
+ size: Size;
5
+ className?: string;
6
+ }>;
7
+ export declare function CrumbsTypography({ size, children, className }: CrumbsTypographyProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from './CrumbsTypography';
@@ -0,0 +1,10 @@
1
+ import { BreadcrumbsConfig, Item, Size } from '../../types';
2
+ export type HiddenChainProps = {
3
+ separator: string;
4
+ items: Item[];
5
+ size: Size;
6
+ onConfigsBuilt(config: BreadcrumbsConfig[]): void;
7
+ firstItemIconOnly?: boolean;
8
+ lastEmpty?: boolean;
9
+ };
10
+ export declare const HiddenChain: import("react").NamedExoticComponent<HiddenChainProps>;
@@ -0,0 +1,6 @@
1
+ import { Item } from '../../types';
2
+ type UseItemModesRenderProps = {
3
+ firstItemIconOnly: boolean;
4
+ };
5
+ export declare const useItemModesRender: ({ firstItemIconOnly }: UseItemModesRenderProps) => (item: Item, index: number) => (import("react/jsx-runtime").JSX.Element | null)[];
6
+ export {};
@@ -0,0 +1 @@
1
+ export * from './HiddenChain';
@@ -0,0 +1 @@
1
+ export declare function Separator(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from './Separator';
@@ -0,0 +1,15 @@
1
+ .separator{
2
+ display:flex;
3
+ align-items:center;
4
+ color:var(--sys-neutral-text-disabled, #aaaebd);
5
+ }
6
+ .separator[data-size=xs]{
7
+ height:var(--size-breadcrumbs-xs, 16px);
8
+ padding-left:var(--space-breadcrumbs-separator-padding-xs, 4px);
9
+ padding-right:var(--space-breadcrumbs-separator-padding-xs, 4px);
10
+ }
11
+ .separator[data-size=s]{
12
+ height:var(--size-breadcrumbs-s, 24px);
13
+ padding-left:var(--space-breadcrumbs-separator-padding-s, 8px);
14
+ padding-right:var(--space-breadcrumbs-separator-padding-s, 8px);
15
+ }
@@ -0,0 +1,19 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { WithSupportProps } from '@snack-uikit/utils';
3
+ import { Size } from '../../types';
4
+ export type WrapperProps = PropsWithChildren<WithSupportProps<{
5
+ hidden: boolean;
6
+ className?: string;
7
+ size: Size;
8
+ separator: string;
9
+ }>>;
10
+ export declare const Wrapper: import("react").ForwardRefExoticComponent<{
11
+ 'data-test-id'?: string;
12
+ } & import("react").AriaAttributes & {
13
+ hidden: boolean;
14
+ className?: string;
15
+ size: Size;
16
+ separator: string;
17
+ } & {
18
+ children?: import("react").ReactNode | undefined;
19
+ } & import("react").RefAttributes<HTMLUListElement>>;
@@ -0,0 +1 @@
1
+ export * from './Wrapper';
@@ -0,0 +1,19 @@
1
+ .wrapper{
2
+ padding:var(--space-breadcrumbs-container, 2px);
3
+ overflow:hidden;
4
+ }
5
+ .wrapper[data-hidden=true]{
6
+ position:absolute;
7
+ width:1px;
8
+ height:1px;
9
+ opacity:0;
10
+ }
11
+
12
+ .row{
13
+ display:flex;
14
+ margin:0;
15
+ padding:0;
16
+ }
17
+ .row[data-hidden=true]{
18
+ display:inline-flex;
19
+ }
@@ -0,0 +1 @@
1
+ export * from './Breadcrumbs';