ydb-ui-components 1.1.0 → 1.1.3

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 (42) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/build/components/NavigationTree/EmptyView/EmptyView.css +4 -0
  3. package/build/components/NavigationTree/EmptyView/EmptyView.d.ts +3 -0
  4. package/build/components/NavigationTree/EmptyView/EmptyView.js +28 -0
  5. package/build/components/NavigationTree/ErrorView/ErrorView.css +3 -0
  6. package/build/components/NavigationTree/ErrorView/ErrorView.d.ts +3 -0
  7. package/build/components/NavigationTree/ErrorView/ErrorView.js +28 -0
  8. package/build/components/NavigationTree/LoaderView/LoaderView.css +7 -0
  9. package/build/components/NavigationTree/LoaderView/LoaderView.d.ts +3 -0
  10. package/build/components/NavigationTree/LoaderView/LoaderView.js +30 -0
  11. package/build/components/NavigationTree/NavigationTree.d.ts +4 -0
  12. package/build/components/NavigationTree/NavigationTree.js +54 -0
  13. package/build/components/NavigationTree/NavigationTreeDirectory.d.ts +13 -0
  14. package/build/components/NavigationTree/NavigationTreeDirectory.js +101 -0
  15. package/build/components/NavigationTree/NavigationTreeNode.d.ts +13 -0
  16. package/build/components/NavigationTree/NavigationTreeNode.js +93 -0
  17. package/build/components/NavigationTree/i18n/en.json +4 -0
  18. package/build/components/NavigationTree/i18n/index.d.ts +2 -0
  19. package/build/components/NavigationTree/i18n/index.js +24 -0
  20. package/build/components/NavigationTree/i18n/ru.json +4 -0
  21. package/build/components/NavigationTree/index.d.ts +2 -0
  22. package/build/components/NavigationTree/index.js +31 -0
  23. package/build/components/NavigationTree/state.d.ts +18 -0
  24. package/build/components/NavigationTree/state.js +92 -0
  25. package/build/components/NavigationTree/types.d.ts +26 -0
  26. package/build/components/NavigationTree/types.js +5 -0
  27. package/build/components/TreeView/TreeView.css +87 -0
  28. package/build/components/TreeView/TreeView.d.ts +16 -0
  29. package/build/components/TreeView/TreeView.js +93 -0
  30. package/build/components/i18n.d.ts +3 -0
  31. package/build/components/i18n.js +17 -0
  32. package/build/components/icons/Database.d.ts +2 -0
  33. package/build/components/icons/Database.js +22 -0
  34. package/build/components/icons/Folder.d.ts +2 -0
  35. package/build/components/icons/Folder.js +22 -0
  36. package/build/components/icons/FolderOpen.d.ts +2 -0
  37. package/build/components/icons/FolderOpen.js +22 -0
  38. package/build/components/icons/Table.d.ts +2 -0
  39. package/build/components/icons/Table.js +22 -0
  40. package/build/index.d.ts +1 -0
  41. package/build/index.js +18 -0
  42. package/package.json +7 -4
package/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ### [1.1.3](https://github.com/ydb-platform/ydb-ui-components/compare/v1.1.2...v1.1.3) (2022-05-23)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * add @yandex-cloud/uikit to peer deps ([61d5628](https://github.com/ydb-platform/ydb-ui-components/commit/61d5628088528e5c532c096bacebb2eca3f68206))
9
+
10
+ ### [1.1.2](https://github.com/ydb-platform/ydb-ui-components/compare/v1.1.1...v1.1.2) (2022-05-19)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * move react-treeview to prod deps ([#5](https://github.com/ydb-platform/ydb-ui-components/issues/5)) ([04d307b](https://github.com/ydb-platform/ydb-ui-components/commit/04d307b226b8b0d7bdaf58542df8d214fb49acce))
16
+ * @yandex-cloud/browserslist-config as peer dependency ([c3b48a7](https://github.com/ydb-platform/ydb-ui-components/commit/c3b48a7ea0370c854fb68b1e1fc12541e8a6494e))
17
+ * use provided root path ([203abd1](https://github.com/ydb-platform/ydb-ui-components/commit/203abd1892ad1e8c8c4555b06b99aa41ff01ab01))
18
+ * include i18n files ([8363de6](https://github.com/ydb-platform/ydb-ui-components/commit/8363de686cbad9e10753b47a62e7917610dcc84d))
19
+
20
+ ### [1.1.1](https://www.github.com/ydb-platform/ydb-ui-components/compare/v1.1.0...v1.1.1) (2022-05-13)
21
+
22
+
23
+ ### Bug Fixes
24
+
25
+ * fix package ([67b3b0e](https://www.github.com/ydb-platform/ydb-ui-components/commit/67b3b0e3c2678452847ca3b1489be11fc73ea6c2))
26
+
3
27
  ## 1.1.0 (2022-04-18)
@@ -0,0 +1,4 @@
1
+ .ydb-navigation-tree-view-empty {
2
+ color: var(--yc-color-text-secondary);
3
+ font-style: italic;
4
+ }
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import './EmptyView.scss';
3
+ export declare function EmptyView(): JSX.Element;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.EmptyView = EmptyView;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _bemCnLite = _interopRequireDefault(require("bem-cn-lite"));
11
+
12
+ var _i18n = _interopRequireDefault(require("../i18n"));
13
+
14
+ var _TreeView = require("../../TreeView/TreeView");
15
+
16
+ require("./EmptyView.css");
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ const b = (0, _bemCnLite.default)('ydb-navigation-tree-view-empty');
21
+
22
+ function EmptyView() {
23
+ return /*#__PURE__*/_react.default.createElement(_TreeView.TreeView, {
24
+ name: /*#__PURE__*/_react.default.createElement("span", {
25
+ className: b()
26
+ }, (0, _i18n.default)('label_empty'))
27
+ });
28
+ }
@@ -0,0 +1,3 @@
1
+ .ydb-navigation-tree-view-error {
2
+ color: var(--yc-color-text-danger);
3
+ }
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import './ErrorView.scss';
3
+ export declare function ErrorView(): JSX.Element;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ErrorView = ErrorView;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _bemCnLite = _interopRequireDefault(require("bem-cn-lite"));
11
+
12
+ var _i18n = _interopRequireDefault(require("../i18n"));
13
+
14
+ var _TreeView = require("../../TreeView/TreeView");
15
+
16
+ require("./ErrorView.css");
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ const b = (0, _bemCnLite.default)('ydb-navigation-tree-view-error');
21
+
22
+ function ErrorView() {
23
+ return /*#__PURE__*/_react.default.createElement(_TreeView.TreeView, {
24
+ name: /*#__PURE__*/_react.default.createElement("span", {
25
+ className: b()
26
+ }, (0, _i18n.default)('label_error'))
27
+ });
28
+ }
@@ -0,0 +1,7 @@
1
+ .ydb-navigation-tree-view-loader {
2
+ display: flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ width: 20px;
6
+ height: 24px;
7
+ }
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import './LoaderView.scss';
3
+ export declare function LoaderView(): JSX.Element;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LoaderView = LoaderView;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _bemCnLite = _interopRequireDefault(require("bem-cn-lite"));
11
+
12
+ var _uikit = require("@yandex-cloud/uikit");
13
+
14
+ var _TreeView = require("../../TreeView/TreeView");
15
+
16
+ require("./LoaderView.css");
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ const b = (0, _bemCnLite.default)('ydb-navigation-tree-view-loader');
21
+
22
+ function LoaderView() {
23
+ return /*#__PURE__*/_react.default.createElement(_TreeView.TreeView, {
24
+ name: /*#__PURE__*/_react.default.createElement("div", {
25
+ className: b()
26
+ }, /*#__PURE__*/_react.default.createElement(_uikit.Spin, {
27
+ size: "xs"
28
+ }))
29
+ });
30
+ }
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import { NavigationTreeProps } from './types';
3
+ export type { NavigationTreeProps };
4
+ export declare function NavigationTree({ rootState: partialRootState, fetchPath, getActions, activePath, onActivePathUpdate, }: NavigationTreeProps): JSX.Element;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NavigationTree = NavigationTree;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _state = require("./state");
11
+
12
+ var _NavigationTreeNode = require("./NavigationTreeNode");
13
+
14
+ var _NavigationTreeDirectory = require("./NavigationTreeDirectory");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
19
+
20
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
21
+
22
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
23
+
24
+ function NavigationTree(_ref) {
25
+ let {
26
+ rootState: partialRootState,
27
+ fetchPath,
28
+ getActions,
29
+ activePath,
30
+ onActivePathUpdate
31
+ } = _ref;
32
+
33
+ const [state, dispatch] = _react.default.useReducer(_state.reducer, {
34
+ [partialRootState.path]: _objectSpread(_objectSpread({}, (0, _state.getDefaultNodeState)()), partialRootState)
35
+ });
36
+
37
+ const rootState = state[partialRootState.path];
38
+ return /*#__PURE__*/_react.default.createElement(_NavigationTreeNode.NavigationTreeNode, {
39
+ path: rootState.path,
40
+ state: state,
41
+ dispatch: dispatch,
42
+ active: rootState.path === activePath,
43
+ onActivate: onActivePathUpdate,
44
+ getActions: getActions
45
+ }, /*#__PURE__*/_react.default.createElement(_NavigationTreeDirectory.NavigationTreeDirectory, {
46
+ state: state,
47
+ dispatch: dispatch,
48
+ path: rootState.path,
49
+ fetchPath: fetchPath,
50
+ activePath: activePath,
51
+ onItemActivate: onActivePathUpdate,
52
+ getActions: getActions
53
+ }));
54
+ }
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { NavigationTreeState, NavigationTreeProps } from './types';
3
+ import { NavigationTreeAction } from './state';
4
+ export interface NavigationTreeDirectoryProps {
5
+ state: NavigationTreeState;
6
+ dispatch: React.Dispatch<NavigationTreeAction>;
7
+ path: string;
8
+ fetchPath: NavigationTreeProps['fetchPath'];
9
+ activePath?: string;
10
+ onItemActivate?: (itemPath: string) => void;
11
+ getActions?: NavigationTreeProps['getActions'];
12
+ }
13
+ export declare function NavigationTreeDirectory({ state, dispatch, path, fetchPath, activePath, onItemActivate, getActions, }: NavigationTreeDirectoryProps): JSX.Element;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NavigationTreeDirectory = NavigationTreeDirectory;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _state = require("./state");
11
+
12
+ var _NavigationTreeNode = require("./NavigationTreeNode");
13
+
14
+ var _LoaderView = require("./LoaderView/LoaderView");
15
+
16
+ var _ErrorView = require("./ErrorView/ErrorView");
17
+
18
+ var _EmptyView = require("./EmptyView/EmptyView");
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ function NavigationTreeDirectory(_ref) {
23
+ let {
24
+ state,
25
+ dispatch,
26
+ path,
27
+ fetchPath,
28
+ activePath,
29
+ onItemActivate,
30
+ getActions
31
+ } = _ref;
32
+ const nodeState = state[path];
33
+
34
+ _react.default.useEffect(() => {
35
+ if (!nodeState.loaded && !nodeState.loading) {
36
+ dispatch({
37
+ type: _state.NavigationTreeActionType.StartLoading,
38
+ payload: {
39
+ path
40
+ }
41
+ });
42
+ fetchPath(path).then(data => {
43
+ dispatch({
44
+ type: _state.NavigationTreeActionType.FinishLoading,
45
+ payload: {
46
+ path,
47
+ data
48
+ }
49
+ });
50
+ }).catch(error => {
51
+ dispatch({
52
+ type: _state.NavigationTreeActionType.FinishLoading,
53
+ payload: {
54
+ path,
55
+ error
56
+ }
57
+ });
58
+ });
59
+ }
60
+ }, []);
61
+
62
+ if (nodeState.loading) {
63
+ return /*#__PURE__*/_react.default.createElement(_LoaderView.LoaderView, null);
64
+ }
65
+
66
+ if (nodeState.error) {
67
+ return /*#__PURE__*/_react.default.createElement(_ErrorView.ErrorView, null);
68
+ }
69
+
70
+ if (nodeState.loaded && nodeState.children.length > 0) {
71
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, nodeState.children.map(childName => {
72
+ const childPath = `${path}/${childName}`;
73
+ let children;
74
+
75
+ if (state[childPath].type === 'directory') {
76
+ children = /*#__PURE__*/_react.default.createElement(NavigationTreeDirectory, {
77
+ state: state,
78
+ dispatch: dispatch,
79
+ path: childPath,
80
+ fetchPath: fetchPath,
81
+ activePath: activePath,
82
+ onItemActivate: onItemActivate,
83
+ getActions: getActions
84
+ });
85
+ }
86
+
87
+ return /*#__PURE__*/_react.default.createElement(_NavigationTreeNode.NavigationTreeNode, {
88
+ key: childPath,
89
+ path: childPath,
90
+ state: state,
91
+ dispatch: dispatch,
92
+ active: childPath === activePath,
93
+ onActivate: onItemActivate,
94
+ getActions: getActions,
95
+ children: children
96
+ });
97
+ }));
98
+ }
99
+
100
+ return /*#__PURE__*/_react.default.createElement(_EmptyView.EmptyView, null);
101
+ }
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { NavigationTreeState, NavigationTreeProps } from './types';
3
+ import { NavigationTreeAction } from './state';
4
+ export interface NavigationTreeNodeProps {
5
+ path: string;
6
+ state: NavigationTreeState;
7
+ dispatch: React.Dispatch<NavigationTreeAction>;
8
+ children?: React.ReactNode;
9
+ active?: boolean;
10
+ onActivate?: (path: string) => void;
11
+ getActions?: NavigationTreeProps['getActions'];
12
+ }
13
+ export declare function NavigationTreeNode({ path, state, dispatch, children, active, onActivate, getActions, }: NavigationTreeNodeProps): JSX.Element;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NavigationTreeNode = NavigationTreeNode;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _state = require("./state");
11
+
12
+ var _Database = require("../icons/Database");
13
+
14
+ var _Folder = require("../icons/Folder");
15
+
16
+ var _FolderOpen = require("../icons/FolderOpen");
17
+
18
+ var _Table = require("../icons/Table");
19
+
20
+ var _TreeView = require("../TreeView/TreeView");
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ function renderIcon(type, collapsed) {
25
+ switch (type) {
26
+ case 'database':
27
+ return /*#__PURE__*/_react.default.createElement(_Database.DatabaseIcon, {
28
+ height: 14
29
+ });
30
+
31
+ case 'directory':
32
+ return collapsed ? /*#__PURE__*/_react.default.createElement(_Folder.FolderIcon, {
33
+ height: 14
34
+ }) : /*#__PURE__*/_react.default.createElement(_FolderOpen.FolderOpenIcon, {
35
+ height: 14
36
+ });
37
+
38
+ case 'table':
39
+ return /*#__PURE__*/_react.default.createElement(_Table.TableIcon, {
40
+ height: 14
41
+ });
42
+
43
+ default:
44
+ return null;
45
+ }
46
+ }
47
+
48
+ function isArrowVisible(type) {
49
+ return type === 'database' || type === 'directory';
50
+ }
51
+
52
+ function NavigationTreeNode(_ref) {
53
+ let {
54
+ path,
55
+ state,
56
+ dispatch,
57
+ children,
58
+ active,
59
+ onActivate,
60
+ getActions
61
+ } = _ref;
62
+ const nodeState = state[path];
63
+
64
+ const handleClick = _react.default.useCallback(() => {
65
+ if (onActivate) {
66
+ onActivate(path);
67
+ }
68
+ }, [path, onActivate]);
69
+
70
+ const handleArrowClick = _react.default.useCallback(() => {
71
+ dispatch({
72
+ type: _state.NavigationTreeActionType.ToggleCollapsed,
73
+ payload: {
74
+ path
75
+ }
76
+ });
77
+ }, []);
78
+
79
+ const actions = _react.default.useMemo(() => {
80
+ return getActions === null || getActions === void 0 ? void 0 : getActions(nodeState.path, nodeState.type);
81
+ }, [getActions, nodeState]);
82
+
83
+ return /*#__PURE__*/_react.default.createElement(_TreeView.TreeView, {
84
+ name: nodeState.name,
85
+ icon: renderIcon(nodeState.type, nodeState.collapsed),
86
+ collapsed: nodeState.collapsed,
87
+ active: active,
88
+ actions: actions,
89
+ hasArrow: isArrowVisible(nodeState.type),
90
+ onClick: handleClick,
91
+ onArrowClick: handleArrowClick
92
+ }, children);
93
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "label_error": "Error",
3
+ "label_empty": "No data"
4
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: (key: string, params?: import("@yandex-cloud/i18n").Params | undefined) => string;
2
+ export default _default;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _i18n = require("../../i18n");
9
+
10
+ var _en = _interopRequireDefault(require("./en.json"));
11
+
12
+ var _ru = _interopRequireDefault(require("./ru.json"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ const COMPONENT = 'ydb-navigation-tree';
17
+
18
+ _i18n.i18n.registerKeyset(_i18n.I18N.LANGS.en, COMPONENT, _en.default);
19
+
20
+ _i18n.i18n.registerKeyset(_i18n.I18N.LANGS.ru, COMPONENT, _ru.default);
21
+
22
+ var _default = _i18n.i18n.keyset(COMPONENT);
23
+
24
+ exports.default = _default;
@@ -0,0 +1,4 @@
1
+ {
2
+ "label_error": "Ошибка",
3
+ "label_empty": "Нет данных"
4
+ }
@@ -0,0 +1,2 @@
1
+ export * from './NavigationTree';
2
+ export * from './types';
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _NavigationTree = require("./NavigationTree");
8
+
9
+ Object.keys(_NavigationTree).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _NavigationTree[key]) return;
12
+ Object.defineProperty(exports, key, {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _NavigationTree[key];
16
+ }
17
+ });
18
+ });
19
+
20
+ var _types = require("./types");
21
+
22
+ Object.keys(_types).forEach(function (key) {
23
+ if (key === "default" || key === "__esModule") return;
24
+ if (key in exports && exports[key] === _types[key]) return;
25
+ Object.defineProperty(exports, key, {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _types[key];
29
+ }
30
+ });
31
+ });
@@ -0,0 +1,18 @@
1
+ import { NavigationTreeState } from './types';
2
+ export declare enum NavigationTreeActionType {
3
+ ToggleCollapsed = "toggle-collapsed",
4
+ StartLoading = "start-loading",
5
+ FinishLoading = "finish-loading"
6
+ }
7
+ export interface NavigationTreeAction {
8
+ type: NavigationTreeActionType;
9
+ payload: any;
10
+ }
11
+ export declare function getDefaultNodeState(): {
12
+ collapsed: boolean;
13
+ loading: boolean;
14
+ loaded: boolean;
15
+ error: boolean;
16
+ children: never[];
17
+ };
18
+ export declare function reducer(state: NavigationTreeState | undefined, action: NavigationTreeAction): NavigationTreeState;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NavigationTreeActionType = void 0;
7
+ exports.getDefaultNodeState = getDefaultNodeState;
8
+ exports.reducer = reducer;
9
+
10
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
11
+
12
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
13
+
14
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
+
16
+ let NavigationTreeActionType;
17
+ exports.NavigationTreeActionType = NavigationTreeActionType;
18
+
19
+ (function (NavigationTreeActionType) {
20
+ NavigationTreeActionType["ToggleCollapsed"] = "toggle-collapsed";
21
+ NavigationTreeActionType["StartLoading"] = "start-loading";
22
+ NavigationTreeActionType["FinishLoading"] = "finish-loading";
23
+ })(NavigationTreeActionType || (exports.NavigationTreeActionType = NavigationTreeActionType = {}));
24
+
25
+ function getDefaultNodeState() {
26
+ return {
27
+ collapsed: true,
28
+ loading: false,
29
+ loaded: false,
30
+ error: false,
31
+ children: []
32
+ };
33
+ }
34
+
35
+ function reducer() {
36
+ let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
37
+ let action = arguments.length > 1 ? arguments[1] : undefined;
38
+
39
+ switch (action.type) {
40
+ case NavigationTreeActionType.ToggleCollapsed:
41
+ return _objectSpread(_objectSpread({}, state), {}, {
42
+ [action.payload.path]: _objectSpread(_objectSpread({}, state[action.payload.path]), {}, {
43
+ collapsed: !state[action.payload.path].collapsed
44
+ })
45
+ });
46
+
47
+ case NavigationTreeActionType.StartLoading:
48
+ return _objectSpread(_objectSpread({}, state), {}, {
49
+ [action.payload.path]: _objectSpread(_objectSpread({}, state[action.payload.path]), {}, {
50
+ loading: true,
51
+ loaded: false,
52
+ error: false
53
+ })
54
+ });
55
+
56
+ case NavigationTreeActionType.FinishLoading:
57
+ {
58
+ const newState = _objectSpread(_objectSpread({}, state), {}, {
59
+ [action.payload.path]: _objectSpread(_objectSpread({}, state[action.payload.path]), {}, {
60
+ loading: false,
61
+ loaded: Boolean(action.payload.data),
62
+ error: Boolean(action.payload.error)
63
+ })
64
+ });
65
+
66
+ if (action.payload.data) {
67
+ newState[action.payload.path].children = action.payload.data.map(_ref => {
68
+ let {
69
+ name
70
+ } = _ref;
71
+ return name;
72
+ });
73
+
74
+ for (const item of action.payload.data) {
75
+ const path = `${action.payload.path}/${item.name}`;
76
+ const name = item.name;
77
+ const type = item.type;
78
+ newState[path] = _objectSpread(_objectSpread({}, getDefaultNodeState()), {}, {
79
+ path,
80
+ name,
81
+ type
82
+ });
83
+ }
84
+ }
85
+
86
+ return newState;
87
+ }
88
+
89
+ default:
90
+ return state;
91
+ }
92
+ }
@@ -0,0 +1,26 @@
1
+ import { DropdownMenuItemMixed } from '@yandex-cloud/uikit';
2
+ export declare type NavigationTreeNodeType = 'database' | 'directory' | 'table';
3
+ export interface NavigationTreeDataItem {
4
+ name: string;
5
+ type: NavigationTreeNodeType;
6
+ }
7
+ export interface NavigationTreeState {
8
+ [path: string]: NavigationTreeNodeState;
9
+ }
10
+ export interface NavigationTreeNodeState {
11
+ path: string;
12
+ name: string;
13
+ type: NavigationTreeNodeType;
14
+ collapsed: boolean;
15
+ loading: boolean;
16
+ loaded: boolean;
17
+ error: boolean;
18
+ children: string[];
19
+ }
20
+ export interface NavigationTreeProps<D = any> {
21
+ rootState: Omit<NavigationTreeNodeState, 'loading' | 'loaded' | 'error' | 'children'>;
22
+ fetchPath: (path: string) => Promise<NavigationTreeDataItem[]>;
23
+ getActions?: (path: string, type: NavigationTreeNodeType) => DropdownMenuItemMixed<D>[];
24
+ activePath?: string;
25
+ onActivePathUpdate?: (activePath: string) => void;
26
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,87 @@
1
+ .ydb-tree-view {
2
+ font-size: 13px;
3
+ line-height: 18px;
4
+ }
5
+ .ydb-tree-view, .ydb-tree-view * {
6
+ box-sizing: border-box;
7
+ }
8
+ .ydb-tree-view__item {
9
+ display: flex;
10
+ align-items: center;
11
+ height: 24px;
12
+ padding-right: 3px;
13
+ border-bottom: 1px solid var(--yc-color-line-solid);
14
+ cursor: pointer;
15
+ }
16
+ .ydb-tree-view__item:hover {
17
+ background-color: var(--yc-color-base-simple-hover);
18
+ }
19
+ .ydb-tree-view__item:hover .ydb-tree-view__actions {
20
+ display: block;
21
+ }
22
+ .ydb-tree-view__item_active {
23
+ font-weight: bold;
24
+ background-color: var(--yc-color-base-selection);
25
+ }
26
+ .ydb-tree-view__item_active:hover {
27
+ background-color: var(--yc-color-base-selection-hover);
28
+ }
29
+ .ydb-tree-view__content {
30
+ flex-grow: 1;
31
+ display: flex;
32
+ align-items: center;
33
+ overflow: hidden;
34
+ }
35
+ .ydb-tree-view__icon {
36
+ flex-shrink: 0;
37
+ display: flex;
38
+ align-items: center;
39
+ justify-content: center;
40
+ width: 24px;
41
+ height: 24px;
42
+ color: var(--yc-color-text-hint);
43
+ }
44
+ .ydb-tree-view__icon svg {
45
+ display: block;
46
+ }
47
+ .ydb-tree-view__text {
48
+ flex-grow: 1;
49
+ white-space: nowrap;
50
+ overflow: hidden;
51
+ text-overflow: ellipsis;
52
+ }
53
+ .ydb-tree-view__actions {
54
+ display: none;
55
+ margin-left: 6px;
56
+ }
57
+ .ydb-tree-view .tree-view_arrow {
58
+ flex-shrink: 0;
59
+ width: 24px;
60
+ height: 24px;
61
+ cursor: pointer;
62
+ background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 6 12" width="6" height="12"><path d="M0.192529 10.7483C-0.0845649 11.0562 -0.0596061 11.5304 0.248276 11.8075C0.556159 12.0846 1.03038 12.0596 1.30747 11.7517L0.192529 10.7483ZM5.25 6.25L5.80747 6.75172C6.06418 6.46649 6.06418 6.0335 5.80747 5.74828L5.25 6.25ZM1.30747 0.748277C1.03038 0.440394 0.556159 0.415435 0.248276 0.69253C-0.0596065 0.969624 -0.0845653 1.44384 0.192529 1.75172L1.30747 0.748277ZM1.30747 11.7517L5.80747 6.75172L4.69253 5.74828L0.192529 10.7483L1.30747 11.7517ZM5.80747 5.74828L1.30747 0.748277L0.192529 1.75172L4.69253 6.75172L5.80747 5.74828Z" fill="rgba(0, 0, 0, 0.85)"/></svg>') no-repeat center center;
63
+ }
64
+ .yc-root_theme_dark .ydb-tree-view .tree-view_arrow {
65
+ background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 6 12" width="6" height="12"><path d="M0.192529 10.7483C-0.0845649 11.0562 -0.0596061 11.5304 0.248276 11.8075C0.556159 12.0846 1.03038 12.0596 1.30747 11.7517L0.192529 10.7483ZM5.25 6.25L5.80747 6.75172C6.06418 6.46649 6.06418 6.0335 5.80747 5.74828L5.25 6.25ZM1.30747 0.748277C1.03038 0.440394 0.556159 0.415435 0.248276 0.69253C-0.0596065 0.969624 -0.0845653 1.44384 0.192529 1.75172L1.30747 0.748277ZM1.30747 11.7517L5.80747 6.75172L4.69253 5.74828L0.192529 10.7483L1.30747 11.7517ZM5.80747 5.74828L1.30747 0.748277L0.192529 1.75172L4.69253 6.75172L5.80747 5.74828Z" fill="rgba(255, 255, 255, 0.85)"/></svg>') no-repeat center center;
66
+ }
67
+ .ydb-tree-view .tree-view_arrow:not(.tree-view_arrow-collapsed) {
68
+ transform: rotate(90deg);
69
+ }
70
+ .ydb-tree-view_no-arrow .tree-view_arrow {
71
+ visibility: hidden;
72
+ }
73
+ .ydb-tree-view .ydb-tree-view .ydb-tree-view__item {
74
+ padding-left: calc(24px * 1);
75
+ }
76
+ .ydb-tree-view .ydb-tree-view .ydb-tree-view .ydb-tree-view__item {
77
+ padding-left: calc(24px * 2);
78
+ }
79
+ .ydb-tree-view .ydb-tree-view .ydb-tree-view .ydb-tree-view .ydb-tree-view__item {
80
+ padding-left: calc(24px * 3);
81
+ }
82
+ .ydb-tree-view .ydb-tree-view .ydb-tree-view .ydb-tree-view .ydb-tree-view .ydb-tree-view__item {
83
+ padding-left: calc(24px * 4);
84
+ }
85
+ .ydb-tree-view .ydb-tree-view .ydb-tree-view .ydb-tree-view .ydb-tree-view .ydb-tree-view .ydb-tree-view__item {
86
+ padding-left: calc(24px * 5);
87
+ }
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import { DropdownMenuItemMixed } from '@yandex-cloud/uikit';
3
+ import './TreeView.scss';
4
+ export interface TreeViewProps {
5
+ children?: React.ReactNode;
6
+ name: React.ReactNode;
7
+ title?: string;
8
+ icon?: React.ReactNode;
9
+ collapsed?: boolean;
10
+ active?: boolean;
11
+ onClick?: () => void;
12
+ onArrowClick?: () => void;
13
+ hasArrow?: boolean;
14
+ actions?: DropdownMenuItemMixed<any>[];
15
+ }
16
+ export declare function TreeView({ children, name, title, icon, collapsed, active, onClick, onArrowClick, hasArrow, actions, }: TreeViewProps): JSX.Element;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TreeView = TreeView;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _bemCnLite = _interopRequireDefault(require("bem-cn-lite"));
11
+
12
+ var _reactTreeview = _interopRequireDefault(require("react-treeview"));
13
+
14
+ var _uikit = require("@yandex-cloud/uikit");
15
+
16
+ require("./TreeView.css");
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ const b = (0, _bemCnLite.default)('ydb-tree-view');
21
+
22
+ function TreeView(_ref) {
23
+ let {
24
+ children,
25
+ name,
26
+ title,
27
+ icon,
28
+ collapsed = true,
29
+ active = false,
30
+ onClick,
31
+ onArrowClick,
32
+ hasArrow = false,
33
+ actions
34
+ } = _ref;
35
+
36
+ const rootRef = _react.default.useRef(null);
37
+
38
+ const nodeLabel = /*#__PURE__*/_react.default.createElement("div", {
39
+ className: b('content')
40
+ }, icon && /*#__PURE__*/_react.default.createElement("div", {
41
+ className: b('icon')
42
+ }, icon), /*#__PURE__*/_react.default.createElement("div", {
43
+ className: b('text'),
44
+ title: title
45
+ }, name), actions && actions.length > 0 && /*#__PURE__*/_react.default.createElement("div", {
46
+ className: b('actions')
47
+ }, /*#__PURE__*/_react.default.createElement(_uikit.DropdownMenu, {
48
+ defaultSwitcherProps: {
49
+ view: 'clear',
50
+ size: 's'
51
+ },
52
+ items: actions
53
+ })));
54
+
55
+ _react.default.useEffect(() => {
56
+ const rootEl = rootRef.current;
57
+ const itemEl = rootEl && rootEl.querySelector(`.${b('item')}`);
58
+
59
+ if (!onClick || !itemEl) {
60
+ return;
61
+ }
62
+
63
+ const skipClicksSelector = `.tree-view_arrow, .${b('actions')}`;
64
+
65
+ function handleClick(event) {
66
+ const path = event.composedPath().filter(item => item.nodeType === Node.ELEMENT_NODE);
67
+ const hasSkipped = path.some(el => el.matches(skipClicksSelector));
68
+
69
+ if (!hasSkipped) {
70
+ onClick();
71
+ }
72
+ }
73
+
74
+ itemEl.addEventListener('click', handleClick);
75
+ return () => {
76
+ itemEl.removeEventListener('click', handleClick);
77
+ };
78
+ }, [onClick]);
79
+
80
+ return /*#__PURE__*/_react.default.createElement("div", {
81
+ ref: rootRef,
82
+ className: b({
83
+ 'no-arrow': !hasArrow
84
+ })
85
+ }, /*#__PURE__*/_react.default.createElement(_reactTreeview.default, {
86
+ collapsed: collapsed,
87
+ itemClassName: b('item', {
88
+ active
89
+ }),
90
+ nodeLabel: nodeLabel,
91
+ onClick: onArrowClick
92
+ }, children));
93
+ }
@@ -0,0 +1,3 @@
1
+ import { I18N } from '@yandex-cloud/i18n';
2
+ export declare const i18n: I18N;
3
+ export { I18N } from '@yandex-cloud/i18n';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "I18N", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _i18n.I18N;
10
+ }
11
+ });
12
+ exports.i18n = void 0;
13
+
14
+ var _i18n = require("@yandex-cloud/i18n");
15
+
16
+ const i18n = new _i18n.I18N();
17
+ exports.i18n = i18n;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare function DatabaseIcon(props: React.SVGProps<SVGSVGElement>): JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DatabaseIcon = DatabaseIcon;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
13
+
14
+ function DatabaseIcon(props) {
15
+ return /*#__PURE__*/_react.default.createElement("svg", _extends({
16
+ xmlns: "http://www.w3.org/2000/svg",
17
+ viewBox: "0 0 448 512",
18
+ fill: "currentColor"
19
+ }, props), /*#__PURE__*/_react.default.createElement("path", {
20
+ d: "M448 80V128C448 172.2 347.7 208 224 208C100.3 208 0 172.2 0 128V80C0 35.82 100.3 0 224 0C347.7 0 448 35.82 448 80zM393.2 214.7C413.1 207.3 433.1 197.8 448 186.1V288C448 332.2 347.7 368 224 368C100.3 368 0 332.2 0 288V186.1C14.93 197.8 34.02 207.3 54.85 214.7C99.66 230.7 159.5 240 224 240C288.5 240 348.3 230.7 393.2 214.7V214.7zM54.85 374.7C99.66 390.7 159.5 400 224 400C288.5 400 348.3 390.7 393.2 374.7C413.1 367.3 433.1 357.8 448 346.1V432C448 476.2 347.7 512 224 512C100.3 512 0 476.2 0 432V346.1C14.93 357.8 34.02 367.3 54.85 374.7z"
21
+ }));
22
+ }
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare function FolderIcon(props: React.SVGProps<SVGSVGElement>): JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FolderIcon = FolderIcon;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
13
+
14
+ function FolderIcon(props) {
15
+ return /*#__PURE__*/_react.default.createElement("svg", _extends({
16
+ xmlns: "http://www.w3.org/2000/svg",
17
+ viewBox: "0 0 512 512",
18
+ fill: "currentColor"
19
+ }, props), /*#__PURE__*/_react.default.createElement("path", {
20
+ d: "M512 144v288c0 26.5-21.5 48-48 48h-416C21.5 480 0 458.5 0 432v-352C0 53.5 21.5 32 48 32h160l64 64h192C490.5 96 512 117.5 512 144z"
21
+ }));
22
+ }
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare function FolderOpenIcon(props: React.SVGProps<SVGSVGElement>): JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FolderOpenIcon = FolderOpenIcon;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
13
+
14
+ function FolderOpenIcon(props) {
15
+ return /*#__PURE__*/_react.default.createElement("svg", _extends({
16
+ xmlns: "http://www.w3.org/2000/svg",
17
+ viewBox: "0 0 576 512",
18
+ fill: "currentColor"
19
+ }, props), /*#__PURE__*/_react.default.createElement("path", {
20
+ d: "M147.8 192H480V144C480 117.5 458.5 96 432 96h-160l-64-64h-160C21.49 32 0 53.49 0 80v328.4l90.54-181.1C101.4 205.6 123.4 192 147.8 192zM543.1 224H147.8C135.7 224 124.6 230.8 119.2 241.7L0 480h447.1c12.12 0 23.2-6.852 28.62-17.69l96-192C583.2 249 567.7 224 543.1 224z"
21
+ }));
22
+ }
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare function TableIcon(props: React.SVGProps<SVGSVGElement>): JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TableIcon = TableIcon;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
13
+
14
+ function TableIcon(props) {
15
+ return /*#__PURE__*/_react.default.createElement("svg", _extends({
16
+ xmlns: "http://www.w3.org/2000/svg",
17
+ viewBox: "0 0 512 512",
18
+ fill: "currentColor"
19
+ }, props), /*#__PURE__*/_react.default.createElement("path", {
20
+ d: "M448 32C483.3 32 512 60.65 512 96V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H448zM224 256V160H64V256H224zM64 320V416H224V320H64zM288 416H448V320H288V416zM448 256V160H288V256H448z"
21
+ }));
22
+ }
@@ -0,0 +1 @@
1
+ export * from './components/NavigationTree';
package/build/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _NavigationTree = require("./components/NavigationTree");
8
+
9
+ Object.keys(_NavigationTree).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _NavigationTree[key]) return;
12
+ Object.defineProperty(exports, key, {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _NavigationTree[key];
16
+ }
17
+ });
18
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ydb-ui-components",
3
- "version": "1.1.0",
3
+ "version": "1.1.3",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "main": "build/index.js",
@@ -19,10 +19,12 @@
19
19
  "lint:js": "eslint --ext .js,.jsx,.ts,.tsx .",
20
20
  "lint:styles": "stylelint 'src/**/*.scss'",
21
21
  "lint": "run-p lint:*",
22
- "start": "start-storybook -p 7002"
22
+ "start": "start-storybook -p 7002",
23
+ "prepublishOnly": "npm run build"
23
24
  },
24
25
  "dependencies": {
25
- "bem-cn-lite": "^4.1.0"
26
+ "bem-cn-lite": "^4.1.0",
27
+ "react-treeview": "^0.4.7"
26
28
  },
27
29
  "devDependencies": {
28
30
  "@babel/core": "^7.17.8",
@@ -55,7 +57,6 @@
55
57
  "react": "^16.14.0",
56
58
  "react-docgen-typescript": "^2.2.2",
57
59
  "react-dom": "^16.14.0",
58
- "react-treeview": "^0.4.7",
59
60
  "rimraf": "^3.0.2",
60
61
  "sass": "^1.49.9",
61
62
  "sass-loader": "^10.2.1",
@@ -64,7 +65,9 @@
64
65
  "typescript": "^4.6.2"
65
66
  },
66
67
  "peerDependencies": {
68
+ "@yandex-cloud/browserslist-config": "^1.0.1",
67
69
  "@yandex-cloud/i18n": "^0.4.0",
70
+ "@yandex-cloud/uikit": "^1.8.0",
68
71
  "react": "^16.0.0",
69
72
  "react-dom": "^16.0.0"
70
73
  },