colibri-ui 0.7.80 → 0.7.82
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/Chip/Chip.module.css +7 -4
- package/Chip/index.d.ts +2 -12
- package/Chip/index.props.d.ts +12 -0
- package/TabsMenu/Tab/Tab.d.ts +4 -0
- package/TabsMenu/Tab/Tab.js +41 -0
- package/TabsMenu/Tab/Tab.module.css +61 -0
- package/TabsMenu/Tab/Tab.props.d.ts +16 -0
- package/TabsMenu/TabsMenu.module.css +4 -0
- package/TabsMenu/index.d.ts +4 -0
- package/TabsMenu/index.js +94 -0
- package/TabsMenu/index.props.d.ts +12 -0
- package/TabsMenu/package.json +6 -0
- package/esm/Chip/Chip.module.css +7 -4
- package/esm/Chip/index.d.ts +2 -12
- package/esm/Chip/index.props.d.ts +12 -0
- package/esm/TabsMenu/Tab/Tab.d.ts +4 -0
- package/esm/TabsMenu/Tab/Tab.js +31 -0
- package/esm/TabsMenu/Tab/Tab.module.css +61 -0
- package/esm/TabsMenu/Tab/Tab.props.d.ts +16 -0
- package/esm/TabsMenu/TabsMenu.module.css +4 -0
- package/esm/TabsMenu/index.d.ts +4 -0
- package/esm/TabsMenu/index.js +84 -0
- package/esm/TabsMenu/index.props.d.ts +12 -0
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- package/esm/lib/keyboard.d.ts +4 -0
- package/esm/lib/keyboard.js +25 -0
- package/index.d.ts +1 -0
- package/index.js +16 -14
- package/lib/keyboard.d.ts +4 -0
- package/lib/keyboard.js +28 -0
- package/package.json +1 -1
package/Chip/Chip.module.css
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
transition-timing-function: ease;
|
|
17
17
|
}
|
|
18
18
|
.inner_active {
|
|
19
|
-
background:
|
|
19
|
+
background: var(--palette-bg-1);
|
|
20
20
|
}
|
|
21
21
|
.inner_inactive {
|
|
22
22
|
background: var(--palette-white);
|
|
@@ -43,15 +43,18 @@
|
|
|
43
43
|
}
|
|
44
44
|
.inner[data-size=s] {
|
|
45
45
|
border-radius: 32px;
|
|
46
|
-
|
|
46
|
+
font-size: 15px;
|
|
47
|
+
line-height: 32px;
|
|
47
48
|
}
|
|
48
49
|
.inner[data-size=m] {
|
|
49
50
|
border-radius: 36px;
|
|
50
|
-
|
|
51
|
+
font-size: 16px;
|
|
52
|
+
line-height: 36px;
|
|
51
53
|
}
|
|
52
54
|
.inner[data-size=l] {
|
|
53
55
|
border-radius: 44px;
|
|
54
|
-
|
|
56
|
+
font-size: 18px;
|
|
57
|
+
line-height: 44px;
|
|
55
58
|
}
|
|
56
59
|
|
|
57
60
|
.content {
|
package/Chip/index.d.ts
CHANGED
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type { FC
|
|
3
|
-
type Size = "s" | "m" | "l";
|
|
4
|
-
type Props = {
|
|
5
|
-
size?: Size;
|
|
6
|
-
testID?: string;
|
|
7
|
-
isActive?: boolean;
|
|
8
|
-
iconOnRight?: React.ReactNode;
|
|
9
|
-
onClick?: () => void;
|
|
10
|
-
onIconOnRightClick?: () => void;
|
|
11
|
-
children?: ReactNode;
|
|
12
|
-
};
|
|
1
|
+
import type { Props } from "./index.props";
|
|
2
|
+
import type { FC } from "react";
|
|
13
3
|
declare const Chip: FC<Props>;
|
|
14
4
|
export default Chip;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
type Size = "s" | "m" | "l";
|
|
3
|
+
export type Props = {
|
|
4
|
+
size?: Size;
|
|
5
|
+
testID?: string;
|
|
6
|
+
isActive?: boolean;
|
|
7
|
+
iconOnRight?: React.ReactNode;
|
|
8
|
+
onClick?: () => void;
|
|
9
|
+
onIconOnRightClick?: () => void;
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var tslib = require('tslib');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var classNames = require('classnames/bind');
|
|
8
|
+
var styles = require('./Tab.module.css');
|
|
9
|
+
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
13
|
+
var classNames__default = /*#__PURE__*/_interopDefault(classNames);
|
|
14
|
+
var styles__default = /*#__PURE__*/_interopDefault(styles);
|
|
15
|
+
|
|
16
|
+
var clx = classNames__default.default.bind(styles__default.default);
|
|
17
|
+
var Tab = function Tab(_a) {
|
|
18
|
+
var innerRef = _a.innerRef,
|
|
19
|
+
active = _a.active,
|
|
20
|
+
className = _a.className,
|
|
21
|
+
content = _a.content,
|
|
22
|
+
disabled = _a.disabled,
|
|
23
|
+
first = _a.first,
|
|
24
|
+
size = _a.size,
|
|
25
|
+
props = tslib.__rest(_a, ["innerRef", "active", "className", "content", "disabled", "first", "size"]);
|
|
26
|
+
return /*#__PURE__*/React__default.default.createElement("li", tslib.__assign({}, props, {
|
|
27
|
+
"aria-selected": active,
|
|
28
|
+
ref: innerRef,
|
|
29
|
+
className: clx(styles__default.default.tab, {
|
|
30
|
+
tab_inactive: !active,
|
|
31
|
+
tab_active: !!active,
|
|
32
|
+
tab_disabled: !!disabled,
|
|
33
|
+
tab_first: !!first
|
|
34
|
+
}, className),
|
|
35
|
+
"data-size": size,
|
|
36
|
+
role: "tab",
|
|
37
|
+
tabIndex: disabled ? undefined : active ? 0 : -1
|
|
38
|
+
}), content);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
exports.default = Tab;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
.tab {
|
|
2
|
+
cursor: pointer;
|
|
3
|
+
display: inline-block;
|
|
4
|
+
margin-left: 16px;
|
|
5
|
+
padding: 0 20px;
|
|
6
|
+
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
|
7
|
+
transition-duration: 0.3s;
|
|
8
|
+
transition-property: background, box-shadow, transform;
|
|
9
|
+
transition-timing-function: ease;
|
|
10
|
+
user-select: none;
|
|
11
|
+
white-space: nowrap;
|
|
12
|
+
}
|
|
13
|
+
.tab[data-size=s] {
|
|
14
|
+
border-radius: 32px;
|
|
15
|
+
font-size: 15px;
|
|
16
|
+
line-height: 32px;
|
|
17
|
+
}
|
|
18
|
+
.tab[data-size=m] {
|
|
19
|
+
border-radius: 36px;
|
|
20
|
+
font-size: 16px;
|
|
21
|
+
line-height: 36px;
|
|
22
|
+
}
|
|
23
|
+
.tab[data-size=l] {
|
|
24
|
+
border-radius: 44px;
|
|
25
|
+
font-size: 18px;
|
|
26
|
+
line-height: 44px;
|
|
27
|
+
}
|
|
28
|
+
.tab_active {
|
|
29
|
+
background: var(--palette-bg-1);
|
|
30
|
+
}
|
|
31
|
+
.tab_inactive {
|
|
32
|
+
background: var(--palette-white);
|
|
33
|
+
box-shadow: rgba(193, 193, 193, 0.4) 0 5px 20px;
|
|
34
|
+
}
|
|
35
|
+
.tab_inactive:hover {
|
|
36
|
+
box-shadow: rgba(193, 193, 193, 0.4) 0 5px 20px;
|
|
37
|
+
}
|
|
38
|
+
.tab_inactive:active {
|
|
39
|
+
background: rgba(0, 0, 0, 0.02);
|
|
40
|
+
box-shadow: rgba(193, 193, 193, 0.4) 0 1px 3px;
|
|
41
|
+
outline: 0;
|
|
42
|
+
transition-duration: 0.15s;
|
|
43
|
+
}
|
|
44
|
+
@media (hover: none) {
|
|
45
|
+
.tab_inactive:hover {
|
|
46
|
+
box-shadow: rgba(193, 193, 193, 0.4) 0 5px 20px;
|
|
47
|
+
}
|
|
48
|
+
.tab_inactive:active {
|
|
49
|
+
box-shadow: rgba(193, 193, 193, 0.4) 0 1px 3px;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
.tab_first {
|
|
53
|
+
margin-left: 0;
|
|
54
|
+
}
|
|
55
|
+
.tab_disabled {
|
|
56
|
+
background: #f7f8f9;
|
|
57
|
+
box-shadow: none;
|
|
58
|
+
color: var(--palette-bg-3);
|
|
59
|
+
cursor: not-allowed;
|
|
60
|
+
pointer-events: none;
|
|
61
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Size } from "../index.props";
|
|
2
|
+
import type { KeyboardEventHandler, MouseEventHandler, ReactNode, RefObject } from "react";
|
|
3
|
+
export type TabProps = {
|
|
4
|
+
id?: string;
|
|
5
|
+
active?: boolean;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
first?: boolean;
|
|
8
|
+
content?: ReactNode;
|
|
9
|
+
onClick?: MouseEventHandler<HTMLLIElement>;
|
|
10
|
+
innerRef?: RefObject<HTMLLIElement>;
|
|
11
|
+
className?: string;
|
|
12
|
+
role?: string;
|
|
13
|
+
tabIndex?: number;
|
|
14
|
+
onKeyDown?: KeyboardEventHandler<HTMLElement>;
|
|
15
|
+
size?: Size;
|
|
16
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var tslib = require('tslib');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var classNames = require('classnames/bind');
|
|
8
|
+
var keyboard = require('../lib/keyboard.js');
|
|
9
|
+
var Tab = require('./Tab/Tab.js');
|
|
10
|
+
var styles = require('./TabsMenu.module.css');
|
|
11
|
+
|
|
12
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
|
|
14
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
15
|
+
var classNames__default = /*#__PURE__*/_interopDefault(classNames);
|
|
16
|
+
var styles__default = /*#__PURE__*/_interopDefault(styles);
|
|
17
|
+
|
|
18
|
+
var clx = classNames__default.default.bind(styles__default.default);
|
|
19
|
+
var TabsMenu = function TabsMenu(_a) {
|
|
20
|
+
var activeTab = _a.activeTab,
|
|
21
|
+
onChange = _a.onChange,
|
|
22
|
+
className = _a.className,
|
|
23
|
+
innerRef = _a.innerRef,
|
|
24
|
+
tabs = _a.tabs,
|
|
25
|
+
_b = _a.size,
|
|
26
|
+
size = _b === void 0 ? "m" : _b,
|
|
27
|
+
externalTabsRefs = _a.tabsRefs,
|
|
28
|
+
props = tslib.__rest(_a, ["activeTab", "onChange", "className", "innerRef", "tabs", "size", "tabsRefs"]);
|
|
29
|
+
var tabsRefs = externalTabsRefs || React.useMemo(function () {
|
|
30
|
+
return tabs.map(function () {
|
|
31
|
+
return /*#__PURE__*/React.createRef();
|
|
32
|
+
});
|
|
33
|
+
}, [tabs]);
|
|
34
|
+
var onKeyDown = React.useCallback(function (event) {
|
|
35
|
+
if (keyboard.isKey(event.key, [keyboard.Keys.LEFT, keyboard.Keys.DOWN, keyboard.Keys.RIGHT, keyboard.Keys.UP])) {
|
|
36
|
+
event.preventDefault();
|
|
37
|
+
var nextTabMenuIndex = 0;
|
|
38
|
+
var direction = keyboard.isKey(event.key, [keyboard.Keys.LEFT, keyboard.Keys.UP]) ? -1 : 1;
|
|
39
|
+
for (var i = 0; i < tabs.length; i++) {
|
|
40
|
+
if (tabs[i].id === activeTab) {
|
|
41
|
+
nextTabMenuIndex = i;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (var i = nextTabMenuIndex; i < tabs.length; i += direction) {
|
|
46
|
+
nextTabMenuIndex += direction;
|
|
47
|
+
var isEdge = nextTabMenuIndex >= tabs.length || nextTabMenuIndex < 0;
|
|
48
|
+
var isTabNonDisabled = tabs[nextTabMenuIndex] && !tabs[nextTabMenuIndex].disabled;
|
|
49
|
+
if (isEdge || isTabNonDisabled) {
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
var nextTabMenu = tabs[nextTabMenuIndex];
|
|
54
|
+
var nextTabMenuRef = tabsRefs[nextTabMenuIndex];
|
|
55
|
+
if (nextTabMenu !== undefined && nextTabMenuRef !== undefined && nextTabMenuRef.current !== null && (nextTabMenu.onClick !== undefined || onChange !== undefined)) {
|
|
56
|
+
nextTabMenuRef.current.focus();
|
|
57
|
+
if (nextTabMenu.onClick !== undefined) {
|
|
58
|
+
nextTabMenu.onClick(event);
|
|
59
|
+
}
|
|
60
|
+
if (onChange !== undefined) {
|
|
61
|
+
onChange(nextTabMenuIndex.toString());
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}, [activeTab, tabsRefs, tabs, onChange]);
|
|
66
|
+
return /*#__PURE__*/React__default.default.createElement("ul", tslib.__assign({}, props, {
|
|
67
|
+
className: clx(styles__default.default.root, className),
|
|
68
|
+
ref: innerRef,
|
|
69
|
+
role: "tablist"
|
|
70
|
+
}), tabs.map(function (_a, index) {
|
|
71
|
+
var id = _a.id,
|
|
72
|
+
disabled = _a.disabled,
|
|
73
|
+
tabProps = tslib.__rest(_a, ["id", "disabled"]);
|
|
74
|
+
return /*#__PURE__*/React__default.default.createElement(Tab.default, tslib.__assign({}, tabProps, {
|
|
75
|
+
innerRef: tabsRefs[index],
|
|
76
|
+
first: index === 0,
|
|
77
|
+
disabled: disabled,
|
|
78
|
+
size: size,
|
|
79
|
+
onClick: disabled || !onChange && !tabProps.onClick ? undefined : function (event) {
|
|
80
|
+
if (tabProps.onClick !== undefined) {
|
|
81
|
+
tabProps.onClick(event);
|
|
82
|
+
}
|
|
83
|
+
if (onChange !== undefined) {
|
|
84
|
+
onChange(id);
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
active: id === activeTab,
|
|
88
|
+
key: id,
|
|
89
|
+
onKeyDown: onKeyDown
|
|
90
|
+
}));
|
|
91
|
+
}));
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
exports.default = TabsMenu;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RefObject } from "react";
|
|
2
|
+
import type { TabProps } from "./Tab/Tab.props";
|
|
3
|
+
export type Size = "s" | "m" | "l";
|
|
4
|
+
export type TabsMenuProps = {
|
|
5
|
+
activeTab?: string;
|
|
6
|
+
onChange?: (tabId: string) => void;
|
|
7
|
+
tabs: TabProps[];
|
|
8
|
+
tabsRefs?: RefObject<HTMLLIElement>[];
|
|
9
|
+
innerRef?: RefObject<HTMLUListElement>;
|
|
10
|
+
className?: string;
|
|
11
|
+
size?: Size;
|
|
12
|
+
};
|
package/esm/Chip/Chip.module.css
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
transition-timing-function: ease;
|
|
17
17
|
}
|
|
18
18
|
.inner_active {
|
|
19
|
-
background:
|
|
19
|
+
background: var(--palette-bg-1);
|
|
20
20
|
}
|
|
21
21
|
.inner_inactive {
|
|
22
22
|
background: var(--palette-white);
|
|
@@ -43,15 +43,18 @@
|
|
|
43
43
|
}
|
|
44
44
|
.inner[data-size=s] {
|
|
45
45
|
border-radius: 32px;
|
|
46
|
-
|
|
46
|
+
font-size: 15px;
|
|
47
|
+
line-height: 32px;
|
|
47
48
|
}
|
|
48
49
|
.inner[data-size=m] {
|
|
49
50
|
border-radius: 36px;
|
|
50
|
-
|
|
51
|
+
font-size: 16px;
|
|
52
|
+
line-height: 36px;
|
|
51
53
|
}
|
|
52
54
|
.inner[data-size=l] {
|
|
53
55
|
border-radius: 44px;
|
|
54
|
-
|
|
56
|
+
font-size: 18px;
|
|
57
|
+
line-height: 44px;
|
|
55
58
|
}
|
|
56
59
|
|
|
57
60
|
.content {
|
package/esm/Chip/index.d.ts
CHANGED
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type { FC
|
|
3
|
-
type Size = "s" | "m" | "l";
|
|
4
|
-
type Props = {
|
|
5
|
-
size?: Size;
|
|
6
|
-
testID?: string;
|
|
7
|
-
isActive?: boolean;
|
|
8
|
-
iconOnRight?: React.ReactNode;
|
|
9
|
-
onClick?: () => void;
|
|
10
|
-
onIconOnRightClick?: () => void;
|
|
11
|
-
children?: ReactNode;
|
|
12
|
-
};
|
|
1
|
+
import type { Props } from "./index.props";
|
|
2
|
+
import type { FC } from "react";
|
|
13
3
|
declare const Chip: FC<Props>;
|
|
14
4
|
export default Chip;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
type Size = "s" | "m" | "l";
|
|
3
|
+
export type Props = {
|
|
4
|
+
size?: Size;
|
|
5
|
+
testID?: string;
|
|
6
|
+
isActive?: boolean;
|
|
7
|
+
iconOnRight?: React.ReactNode;
|
|
8
|
+
onClick?: () => void;
|
|
9
|
+
onIconOnRightClick?: () => void;
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { __rest, __assign } from 'tslib';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import classNames from 'classnames/bind';
|
|
4
|
+
import styles from './Tab.module.css';
|
|
5
|
+
|
|
6
|
+
var clx = classNames.bind(styles);
|
|
7
|
+
var Tab = function Tab(_a) {
|
|
8
|
+
var innerRef = _a.innerRef,
|
|
9
|
+
active = _a.active,
|
|
10
|
+
className = _a.className,
|
|
11
|
+
content = _a.content,
|
|
12
|
+
disabled = _a.disabled,
|
|
13
|
+
first = _a.first,
|
|
14
|
+
size = _a.size,
|
|
15
|
+
props = __rest(_a, ["innerRef", "active", "className", "content", "disabled", "first", "size"]);
|
|
16
|
+
return /*#__PURE__*/React__default.createElement("li", __assign({}, props, {
|
|
17
|
+
"aria-selected": active,
|
|
18
|
+
ref: innerRef,
|
|
19
|
+
className: clx(styles.tab, {
|
|
20
|
+
tab_inactive: !active,
|
|
21
|
+
tab_active: !!active,
|
|
22
|
+
tab_disabled: !!disabled,
|
|
23
|
+
tab_first: !!first
|
|
24
|
+
}, className),
|
|
25
|
+
"data-size": size,
|
|
26
|
+
role: "tab",
|
|
27
|
+
tabIndex: disabled ? undefined : active ? 0 : -1
|
|
28
|
+
}), content);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export { Tab as default };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
.tab {
|
|
2
|
+
cursor: pointer;
|
|
3
|
+
display: inline-block;
|
|
4
|
+
margin-left: 16px;
|
|
5
|
+
padding: 0 20px;
|
|
6
|
+
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
|
7
|
+
transition-duration: 0.3s;
|
|
8
|
+
transition-property: background, box-shadow, transform;
|
|
9
|
+
transition-timing-function: ease;
|
|
10
|
+
user-select: none;
|
|
11
|
+
white-space: nowrap;
|
|
12
|
+
}
|
|
13
|
+
.tab[data-size=s] {
|
|
14
|
+
border-radius: 32px;
|
|
15
|
+
font-size: 15px;
|
|
16
|
+
line-height: 32px;
|
|
17
|
+
}
|
|
18
|
+
.tab[data-size=m] {
|
|
19
|
+
border-radius: 36px;
|
|
20
|
+
font-size: 16px;
|
|
21
|
+
line-height: 36px;
|
|
22
|
+
}
|
|
23
|
+
.tab[data-size=l] {
|
|
24
|
+
border-radius: 44px;
|
|
25
|
+
font-size: 18px;
|
|
26
|
+
line-height: 44px;
|
|
27
|
+
}
|
|
28
|
+
.tab_active {
|
|
29
|
+
background: var(--palette-bg-1);
|
|
30
|
+
}
|
|
31
|
+
.tab_inactive {
|
|
32
|
+
background: var(--palette-white);
|
|
33
|
+
box-shadow: rgba(193, 193, 193, 0.4) 0 5px 20px;
|
|
34
|
+
}
|
|
35
|
+
.tab_inactive:hover {
|
|
36
|
+
box-shadow: rgba(193, 193, 193, 0.4) 0 5px 20px;
|
|
37
|
+
}
|
|
38
|
+
.tab_inactive:active {
|
|
39
|
+
background: rgba(0, 0, 0, 0.02);
|
|
40
|
+
box-shadow: rgba(193, 193, 193, 0.4) 0 1px 3px;
|
|
41
|
+
outline: 0;
|
|
42
|
+
transition-duration: 0.15s;
|
|
43
|
+
}
|
|
44
|
+
@media (hover: none) {
|
|
45
|
+
.tab_inactive:hover {
|
|
46
|
+
box-shadow: rgba(193, 193, 193, 0.4) 0 5px 20px;
|
|
47
|
+
}
|
|
48
|
+
.tab_inactive:active {
|
|
49
|
+
box-shadow: rgba(193, 193, 193, 0.4) 0 1px 3px;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
.tab_first {
|
|
53
|
+
margin-left: 0;
|
|
54
|
+
}
|
|
55
|
+
.tab_disabled {
|
|
56
|
+
background: #f7f8f9;
|
|
57
|
+
box-shadow: none;
|
|
58
|
+
color: var(--palette-bg-3);
|
|
59
|
+
cursor: not-allowed;
|
|
60
|
+
pointer-events: none;
|
|
61
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Size } from "../index.props";
|
|
2
|
+
import type { KeyboardEventHandler, MouseEventHandler, ReactNode, RefObject } from "react";
|
|
3
|
+
export type TabProps = {
|
|
4
|
+
id?: string;
|
|
5
|
+
active?: boolean;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
first?: boolean;
|
|
8
|
+
content?: ReactNode;
|
|
9
|
+
onClick?: MouseEventHandler<HTMLLIElement>;
|
|
10
|
+
innerRef?: RefObject<HTMLLIElement>;
|
|
11
|
+
className?: string;
|
|
12
|
+
role?: string;
|
|
13
|
+
tabIndex?: number;
|
|
14
|
+
onKeyDown?: KeyboardEventHandler<HTMLElement>;
|
|
15
|
+
size?: Size;
|
|
16
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { __rest, __assign } from 'tslib';
|
|
2
|
+
import React__default, { useMemo, createRef, useCallback } from 'react';
|
|
3
|
+
import classNames from 'classnames/bind';
|
|
4
|
+
import { isKey, Keys } from '../lib/keyboard.js';
|
|
5
|
+
import Tab from './Tab/Tab.js';
|
|
6
|
+
import styles from './TabsMenu.module.css';
|
|
7
|
+
|
|
8
|
+
var clx = classNames.bind(styles);
|
|
9
|
+
var TabsMenu = function TabsMenu(_a) {
|
|
10
|
+
var activeTab = _a.activeTab,
|
|
11
|
+
onChange = _a.onChange,
|
|
12
|
+
className = _a.className,
|
|
13
|
+
innerRef = _a.innerRef,
|
|
14
|
+
tabs = _a.tabs,
|
|
15
|
+
_b = _a.size,
|
|
16
|
+
size = _b === void 0 ? "m" : _b,
|
|
17
|
+
externalTabsRefs = _a.tabsRefs,
|
|
18
|
+
props = __rest(_a, ["activeTab", "onChange", "className", "innerRef", "tabs", "size", "tabsRefs"]);
|
|
19
|
+
var tabsRefs = externalTabsRefs || useMemo(function () {
|
|
20
|
+
return tabs.map(function () {
|
|
21
|
+
return /*#__PURE__*/createRef();
|
|
22
|
+
});
|
|
23
|
+
}, [tabs]);
|
|
24
|
+
var onKeyDown = useCallback(function (event) {
|
|
25
|
+
if (isKey(event.key, [Keys.LEFT, Keys.DOWN, Keys.RIGHT, Keys.UP])) {
|
|
26
|
+
event.preventDefault();
|
|
27
|
+
var nextTabMenuIndex = 0;
|
|
28
|
+
var direction = isKey(event.key, [Keys.LEFT, Keys.UP]) ? -1 : 1;
|
|
29
|
+
for (var i = 0; i < tabs.length; i++) {
|
|
30
|
+
if (tabs[i].id === activeTab) {
|
|
31
|
+
nextTabMenuIndex = i;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
for (var i = nextTabMenuIndex; i < tabs.length; i += direction) {
|
|
36
|
+
nextTabMenuIndex += direction;
|
|
37
|
+
var isEdge = nextTabMenuIndex >= tabs.length || nextTabMenuIndex < 0;
|
|
38
|
+
var isTabNonDisabled = tabs[nextTabMenuIndex] && !tabs[nextTabMenuIndex].disabled;
|
|
39
|
+
if (isEdge || isTabNonDisabled) {
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
var nextTabMenu = tabs[nextTabMenuIndex];
|
|
44
|
+
var nextTabMenuRef = tabsRefs[nextTabMenuIndex];
|
|
45
|
+
if (nextTabMenu !== undefined && nextTabMenuRef !== undefined && nextTabMenuRef.current !== null && (nextTabMenu.onClick !== undefined || onChange !== undefined)) {
|
|
46
|
+
nextTabMenuRef.current.focus();
|
|
47
|
+
if (nextTabMenu.onClick !== undefined) {
|
|
48
|
+
nextTabMenu.onClick(event);
|
|
49
|
+
}
|
|
50
|
+
if (onChange !== undefined) {
|
|
51
|
+
onChange(nextTabMenuIndex.toString());
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}, [activeTab, tabsRefs, tabs, onChange]);
|
|
56
|
+
return /*#__PURE__*/React__default.createElement("ul", __assign({}, props, {
|
|
57
|
+
className: clx(styles.root, className),
|
|
58
|
+
ref: innerRef,
|
|
59
|
+
role: "tablist"
|
|
60
|
+
}), tabs.map(function (_a, index) {
|
|
61
|
+
var id = _a.id,
|
|
62
|
+
disabled = _a.disabled,
|
|
63
|
+
tabProps = __rest(_a, ["id", "disabled"]);
|
|
64
|
+
return /*#__PURE__*/React__default.createElement(Tab, __assign({}, tabProps, {
|
|
65
|
+
innerRef: tabsRefs[index],
|
|
66
|
+
first: index === 0,
|
|
67
|
+
disabled: disabled,
|
|
68
|
+
size: size,
|
|
69
|
+
onClick: disabled || !onChange && !tabProps.onClick ? undefined : function (event) {
|
|
70
|
+
if (tabProps.onClick !== undefined) {
|
|
71
|
+
tabProps.onClick(event);
|
|
72
|
+
}
|
|
73
|
+
if (onChange !== undefined) {
|
|
74
|
+
onChange(id);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
active: id === activeTab,
|
|
78
|
+
key: id,
|
|
79
|
+
onKeyDown: onKeyDown
|
|
80
|
+
}));
|
|
81
|
+
}));
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export { TabsMenu as default };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RefObject } from "react";
|
|
2
|
+
import type { TabProps } from "./Tab/Tab.props";
|
|
3
|
+
export type Size = "s" | "m" | "l";
|
|
4
|
+
export type TabsMenuProps = {
|
|
5
|
+
activeTab?: string;
|
|
6
|
+
onChange?: (tabId: string) => void;
|
|
7
|
+
tabs: TabProps[];
|
|
8
|
+
tabsRefs?: RefObject<HTMLLIElement>[];
|
|
9
|
+
innerRef?: RefObject<HTMLUListElement>;
|
|
10
|
+
className?: string;
|
|
11
|
+
size?: Size;
|
|
12
|
+
};
|
package/esm/index.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export { default as Select } from "./Select";
|
|
|
21
21
|
export { default as Separator } from "./Separator";
|
|
22
22
|
export { SkeletonText, SkeletonRect } from "./Skeleton";
|
|
23
23
|
export { default as Switch } from "./Switch";
|
|
24
|
+
export { default as TabsMenu } from "./TabsMenu";
|
|
24
25
|
export { THEMES } from "./Theme";
|
|
25
26
|
export { default as Tooltip } from "./Tooltip";
|
|
26
27
|
export { default as TimeSelect } from "./TimeSelect";
|
package/esm/index.js
CHANGED
|
@@ -21,6 +21,7 @@ export { default as Select } from './Select/index.js';
|
|
|
21
21
|
export { default as Separator } from './Separator/index.js';
|
|
22
22
|
export { SkeletonRect, SkeletonText } from './Skeleton/index.js';
|
|
23
23
|
export { default as Switch } from './Switch/index.js';
|
|
24
|
+
export { default as TabsMenu } from './TabsMenu/index.js';
|
|
24
25
|
export { THEMES } from './Theme/index.js';
|
|
25
26
|
export { default as Tooltip } from './Tooltip/index.js';
|
|
26
27
|
export { default as TimeSelect } from './TimeSelect/index.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type Keys = Record<string, string> & Record<KeyboardKeys, string>;
|
|
2
|
+
export type KeyboardKeys = "BACKSPACE" | "TAB" | "ENTER" | "CAPS_LOCK" | "ESC" | "SPACE" | "PAGE_UP" | "PAGE_DOWN" | "END" | "HOME" | "LEFT" | "UP" | "RIGHT" | "DOWN" | "INSERT" | "DELETE" | string;
|
|
3
|
+
export declare const Keys: Keys;
|
|
4
|
+
export declare function isKey(eventKey: string, keys: Array<KeyboardKeys | string>): boolean;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
var Keys = {
|
|
2
|
+
BACKSPACE: "Backspace",
|
|
3
|
+
TAB: "Tab",
|
|
4
|
+
ENTER: "Enter",
|
|
5
|
+
CAPS_LOCK: "CapsLock",
|
|
6
|
+
ESC: "Escape",
|
|
7
|
+
SPACE: " ",
|
|
8
|
+
PAGE_UP: "PageUp",
|
|
9
|
+
PAGE_DOWN: "PageDown",
|
|
10
|
+
END: "End",
|
|
11
|
+
HOME: "Home",
|
|
12
|
+
LEFT: "ArrowLeft",
|
|
13
|
+
UP: "ArrowUp",
|
|
14
|
+
RIGHT: "ArrowRight",
|
|
15
|
+
DOWN: "ArrowDown",
|
|
16
|
+
INSERT: "Insert",
|
|
17
|
+
DELETE: "Delete"
|
|
18
|
+
};
|
|
19
|
+
function isKey(eventKey, keys) {
|
|
20
|
+
return keys.some(function (value) {
|
|
21
|
+
return Keys[value] === eventKey || value === eventKey;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { Keys, isKey };
|
package/index.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export { default as Select } from "./Select";
|
|
|
21
21
|
export { default as Separator } from "./Separator";
|
|
22
22
|
export { SkeletonText, SkeletonRect } from "./Skeleton";
|
|
23
23
|
export { default as Switch } from "./Switch";
|
|
24
|
+
export { default as TabsMenu } from "./TabsMenu";
|
|
24
25
|
export { THEMES } from "./Theme";
|
|
25
26
|
export { default as Tooltip } from "./Tooltip";
|
|
26
27
|
export { default as TimeSelect } from "./TimeSelect";
|
package/index.js
CHANGED
|
@@ -23,13 +23,14 @@ var index$j = require('./Select/index.js');
|
|
|
23
23
|
var index$k = require('./Separator/index.js');
|
|
24
24
|
var index$l = require('./Skeleton/index.js');
|
|
25
25
|
var index$m = require('./Switch/index.js');
|
|
26
|
-
var index$n = require('./
|
|
27
|
-
var index$o = require('./
|
|
28
|
-
var index$p = require('./
|
|
29
|
-
var index$q = require('./
|
|
30
|
-
var index$r = require('./
|
|
31
|
-
var index$s = require('./hooks/
|
|
32
|
-
var index$t = require('./hooks/
|
|
26
|
+
var index$n = require('./TabsMenu/index.js');
|
|
27
|
+
var index$o = require('./Theme/index.js');
|
|
28
|
+
var index$p = require('./Tooltip/index.js');
|
|
29
|
+
var index$q = require('./TimeSelect/index.js');
|
|
30
|
+
var index$r = require('./Typography/index.js');
|
|
31
|
+
var index$s = require('./hooks/useMediaSizes/index.js');
|
|
32
|
+
var index$t = require('./hooks/useOnClickOutside/index.js');
|
|
33
|
+
var index$u = require('./hooks/useScrollLock/index.js');
|
|
33
34
|
require('./Icons/index.js');
|
|
34
35
|
var ArrowNext = require('./Icons/ArrowNext.js');
|
|
35
36
|
var Cart = require('./Icons/Cart.js');
|
|
@@ -73,13 +74,14 @@ exports.Separator = index$k.default;
|
|
|
73
74
|
exports.SkeletonRect = index$l.SkeletonRect;
|
|
74
75
|
exports.SkeletonText = index$l.SkeletonText;
|
|
75
76
|
exports.Switch = index$m.default;
|
|
76
|
-
exports.
|
|
77
|
-
exports.
|
|
78
|
-
exports.
|
|
79
|
-
exports.
|
|
80
|
-
exports.
|
|
81
|
-
exports.
|
|
82
|
-
exports.
|
|
77
|
+
exports.TabsMenu = index$n.default;
|
|
78
|
+
exports.THEMES = index$o.THEMES;
|
|
79
|
+
exports.Tooltip = index$p.default;
|
|
80
|
+
exports.TimeSelect = index$q.default;
|
|
81
|
+
exports.Typography = index$r.default;
|
|
82
|
+
exports.useMediaSizes = index$s.default;
|
|
83
|
+
exports.useOnClickOutside = index$t.default;
|
|
84
|
+
exports.useScrollLock = index$u.default;
|
|
83
85
|
exports.ArrowNext = ArrowNext.default;
|
|
84
86
|
exports.Cart = Cart.default;
|
|
85
87
|
exports.Chevron = Chevron.default;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type Keys = Record<string, string> & Record<KeyboardKeys, string>;
|
|
2
|
+
export type KeyboardKeys = "BACKSPACE" | "TAB" | "ENTER" | "CAPS_LOCK" | "ESC" | "SPACE" | "PAGE_UP" | "PAGE_DOWN" | "END" | "HOME" | "LEFT" | "UP" | "RIGHT" | "DOWN" | "INSERT" | "DELETE" | string;
|
|
3
|
+
export declare const Keys: Keys;
|
|
4
|
+
export declare function isKey(eventKey: string, keys: Array<KeyboardKeys | string>): boolean;
|
package/lib/keyboard.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Keys = {
|
|
4
|
+
BACKSPACE: "Backspace",
|
|
5
|
+
TAB: "Tab",
|
|
6
|
+
ENTER: "Enter",
|
|
7
|
+
CAPS_LOCK: "CapsLock",
|
|
8
|
+
ESC: "Escape",
|
|
9
|
+
SPACE: " ",
|
|
10
|
+
PAGE_UP: "PageUp",
|
|
11
|
+
PAGE_DOWN: "PageDown",
|
|
12
|
+
END: "End",
|
|
13
|
+
HOME: "Home",
|
|
14
|
+
LEFT: "ArrowLeft",
|
|
15
|
+
UP: "ArrowUp",
|
|
16
|
+
RIGHT: "ArrowRight",
|
|
17
|
+
DOWN: "ArrowDown",
|
|
18
|
+
INSERT: "Insert",
|
|
19
|
+
DELETE: "Delete"
|
|
20
|
+
};
|
|
21
|
+
function isKey(eventKey, keys) {
|
|
22
|
+
return keys.some(function (value) {
|
|
23
|
+
return Keys[value] === eventKey || value === eventKey;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.Keys = Keys;
|
|
28
|
+
exports.isKey = isKey;
|