@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.
- package/dist/cjs/components/Breadcrumbs/Breadcrumbs.js +90 -0
- package/dist/cjs/components/Breadcrumbs/index.js +25 -0
- package/dist/cjs/components/Collapse/Collapse.js +68 -0
- package/dist/cjs/components/Collapse/index.js +25 -0
- package/dist/cjs/components/Crumb/Crumb.js +118 -0
- package/dist/cjs/components/Crumb/index.js +25 -0
- package/dist/cjs/components/CrumbsTypography/CrumbsTypography.js +24 -0
- package/dist/cjs/components/CrumbsTypography/index.js +25 -0
- package/dist/cjs/components/HiddenChain/HiddenChain.js +57 -0
- package/dist/cjs/components/HiddenChain/hooks.js +42 -0
- package/dist/cjs/components/HiddenChain/index.js +25 -0
- package/dist/cjs/components/Separator/Separator.js +36 -0
- package/dist/cjs/components/Separator/index.js +25 -0
- package/dist/cjs/components/Wrapper/Wrapper.js +57 -0
- package/dist/cjs/components/Wrapper/index.js +25 -0
- package/dist/cjs/components/index.js +25 -0
- package/dist/cjs/constants.js +22 -0
- package/dist/cjs/context.js +13 -0
- package/dist/cjs/hooks.js +97 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/types.js +6 -0
- package/dist/cjs/utils/buildBreadcrumbsConfigs.js +136 -0
- package/dist/cjs/utils/buildSizeMap.js +32 -0
- package/dist/cjs/utils/getMaxPossibleWidth.js +27 -0
- package/dist/cjs/utils/getTestId.js +8 -0
- package/dist/cjs/utils/index.js +28 -0
- package/dist/esm/components/Breadcrumbs/Breadcrumbs.d.ts +33 -0
- package/dist/esm/components/Collapse/Collapse.d.ts +6 -0
- package/dist/esm/components/Collapse/index.js +1 -0
- package/dist/esm/components/Collapse/styles.module.css +18 -0
- package/dist/esm/components/Crumb/Crumb.d.ts +11 -0
- package/dist/esm/components/Crumb/index.js +1 -0
- package/dist/esm/components/Crumb/styles.module.css +55 -0
- package/dist/esm/components/CrumbsTypography/CrumbsTypography.d.ts +7 -0
- package/dist/esm/components/CrumbsTypography/index.js +1 -0
- package/dist/esm/components/HiddenChain/HiddenChain.d.ts +10 -0
- package/dist/esm/components/HiddenChain/hooks.d.ts +6 -0
- package/dist/esm/components/HiddenChain/index.js +1 -0
- package/dist/esm/components/Separator/Separator.d.ts +1 -0
- package/dist/esm/components/Separator/index.js +1 -0
- package/dist/esm/components/Separator/styles.module.css +15 -0
- package/dist/esm/components/Wrapper/Wrapper.d.ts +19 -0
- package/dist/esm/components/Wrapper/index.js +1 -0
- package/dist/esm/components/Wrapper/styles.module.css +19 -0
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/components/index.js +1 -0
- package/dist/esm/components/styles.module.css +3 -0
- package/dist/esm/constants.d.ts +16 -0
- package/dist/esm/context.d.ts +9 -0
- package/dist/esm/hooks.d.ts +21 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/types.d.ts +54 -0
- package/dist/esm/utils/buildBreadcrumbsConfigs.d.ts +2 -0
- package/dist/esm/utils/buildSizeMap.d.ts +2 -0
- package/dist/esm/utils/getMaxPossibleWidth.d.ts +6 -0
- package/dist/esm/utils/getTestId.d.ts +1 -0
- package/dist/esm/utils/index.js +4 -0
- package/package.json +12 -8
- /package/dist/{components → cjs/components}/Breadcrumbs/Breadcrumbs.d.ts +0 -0
- /package/dist/{components → cjs/components}/Breadcrumbs/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/Collapse/Collapse.d.ts +0 -0
- /package/dist/{components → cjs/components}/Collapse/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/Collapse/styles.module.css +0 -0
- /package/dist/{components → cjs/components}/Crumb/Crumb.d.ts +0 -0
- /package/dist/{components → cjs/components}/Crumb/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/Crumb/styles.module.css +0 -0
- /package/dist/{components → cjs/components}/CrumbsTypography/CrumbsTypography.d.ts +0 -0
- /package/dist/{components → cjs/components}/CrumbsTypography/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/HiddenChain/HiddenChain.d.ts +0 -0
- /package/dist/{components → cjs/components}/HiddenChain/hooks.d.ts +0 -0
- /package/dist/{components → cjs/components}/HiddenChain/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/Separator/Separator.d.ts +0 -0
- /package/dist/{components → cjs/components}/Separator/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/Separator/styles.module.css +0 -0
- /package/dist/{components → cjs/components}/Wrapper/Wrapper.d.ts +0 -0
- /package/dist/{components → cjs/components}/Wrapper/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/Wrapper/styles.module.css +0 -0
- /package/dist/{components → cjs/components}/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/styles.module.css +0 -0
- /package/dist/{constants.d.ts → cjs/constants.d.ts} +0 -0
- /package/dist/{context.d.ts → cjs/context.d.ts} +0 -0
- /package/dist/{hooks.d.ts → cjs/hooks.d.ts} +0 -0
- /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
- /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
- /package/dist/{utils → cjs/utils}/buildBreadcrumbsConfigs.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/buildSizeMap.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/getMaxPossibleWidth.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/getTestId.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/index.d.ts +0 -0
- /package/dist/{components → esm/components}/Breadcrumbs/Breadcrumbs.js +0 -0
- /package/dist/{components/Breadcrumbs/index.js → esm/components/Breadcrumbs/index.d.ts} +0 -0
- /package/dist/{components → esm/components/Breadcrumbs}/index.js +0 -0
- /package/dist/{components → esm/components}/Collapse/Collapse.js +0 -0
- /package/dist/{components/Collapse/index.js → esm/components/Collapse/index.d.ts} +0 -0
- /package/dist/{components → esm/components}/Crumb/Crumb.js +0 -0
- /package/dist/{components/Crumb/index.js → esm/components/Crumb/index.d.ts} +0 -0
- /package/dist/{components → esm/components}/CrumbsTypography/CrumbsTypography.js +0 -0
- /package/dist/{components/CrumbsTypography/index.js → esm/components/CrumbsTypography/index.d.ts} +0 -0
- /package/dist/{components → esm/components}/HiddenChain/HiddenChain.js +0 -0
- /package/dist/{components → esm/components}/HiddenChain/hooks.js +0 -0
- /package/dist/{components/HiddenChain/index.js → esm/components/HiddenChain/index.d.ts} +0 -0
- /package/dist/{components → esm/components}/Separator/Separator.js +0 -0
- /package/dist/{components/Separator/index.js → esm/components/Separator/index.d.ts} +0 -0
- /package/dist/{components → esm/components}/Wrapper/Wrapper.js +0 -0
- /package/dist/{components/Wrapper/index.js → esm/components/Wrapper/index.d.ts} +0 -0
- /package/dist/{constants.js → esm/constants.js} +0 -0
- /package/dist/{context.js → esm/context.js} +0 -0
- /package/dist/{hooks.js → esm/hooks.js} +0 -0
- /package/dist/{index.js → esm/index.js} +0 -0
- /package/dist/{types.js → esm/types.js} +0 -0
- /package/dist/{utils → esm/utils}/buildBreadcrumbsConfigs.js +0 -0
- /package/dist/{utils → esm/utils}/buildSizeMap.js +0 -0
- /package/dist/{utils → esm/utils}/getMaxPossibleWidth.js +0 -0
- /package/dist/{utils → esm/utils}/getTestId.js +0 -0
- /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,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,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';
|