@ozen-ui/kit 0.17.0 → 0.19.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/ChipNext/package.json +5 -0
- package/__inner__/cjs/components/Chip/Chip.d.ts +3 -0
- package/__inner__/cjs/components/Chip/Chip.js +3 -0
- package/__inner__/cjs/components/ChipNext/Chip.css +108 -0
- package/__inner__/cjs/components/ChipNext/Chip.d.ts +42 -0
- package/__inner__/cjs/components/ChipNext/Chip.js +46 -0
- package/__inner__/cjs/components/ChipNext/constants.d.ts +4 -0
- package/__inner__/cjs/components/ChipNext/constants.js +7 -0
- package/__inner__/cjs/components/ChipNext/index.d.ts +1 -0
- package/__inner__/cjs/components/ChipNext/index.js +4 -0
- package/__inner__/cjs/components/FieldIcon/FieldIcon.d.ts +4 -7
- package/__inner__/cjs/components/FieldIcon/FieldIcon.js +5 -21
- package/__inner__/cjs/components/List/List.css +1 -0
- package/__inner__/cjs/components/Menu/Menu.css +0 -1
- package/__inner__/cjs/components/Menu/components/MenuItem/MenuItem.js +4 -4
- package/__inner__/cjs/components/Menu/components/MenuList/MenuList.d.ts +2 -2
- package/__inner__/cjs/components/Menu/components/MenuList/MenuList.js +44 -26
- package/__inner__/cjs/components/Menu/useMenuFocusList.js +11 -1
- package/__inner__/cjs/components/Modal/Modal.js +3 -7
- package/__inner__/cjs/components/Popover/Popover.js +1 -5
- package/__inner__/cjs/components/Select/Select.js +2 -5
- package/__inner__/cjs/components/ThemeProvider/types.d.ts +2 -0
- package/__inner__/cjs/hooks/useFocusList/useFocusList.js +10 -1
- package/__inner__/cjs/hooks/useMultiRef/useMultiRef.js +2 -7
- package/__inner__/cjs/utils/isKeys.d.ts +3 -0
- package/__inner__/cjs/utils/isKeys.js +6 -0
- package/__inner__/cjs/utils/renderContent/index.d.ts +1 -0
- package/__inner__/cjs/utils/renderContent/index.js +4 -0
- package/__inner__/cjs/utils/renderContent/renderContent.d.ts +6 -0
- package/__inner__/cjs/utils/renderContent/renderContent.js +29 -0
- package/__inner__/cjs/utils/setRef.d.ts +4 -0
- package/__inner__/cjs/utils/setRef.js +13 -0
- package/__inner__/esm/components/Chip/Chip.d.ts +3 -0
- package/__inner__/esm/components/Chip/Chip.js +3 -0
- package/__inner__/esm/components/ChipNext/Chip.css +108 -0
- package/__inner__/esm/components/ChipNext/Chip.d.ts +42 -0
- package/__inner__/esm/components/ChipNext/Chip.js +43 -0
- package/__inner__/esm/components/ChipNext/constants.d.ts +4 -0
- package/__inner__/esm/components/ChipNext/constants.js +4 -0
- package/__inner__/esm/components/ChipNext/index.d.ts +1 -0
- package/__inner__/esm/components/ChipNext/index.js +1 -0
- package/__inner__/esm/components/FieldIcon/FieldIcon.d.ts +4 -7
- package/__inner__/esm/components/FieldIcon/FieldIcon.js +5 -21
- package/__inner__/esm/components/List/List.css +1 -0
- package/__inner__/esm/components/Menu/Menu.css +0 -1
- package/__inner__/esm/components/Menu/components/MenuItem/MenuItem.js +4 -4
- package/__inner__/esm/components/Menu/components/MenuList/MenuList.d.ts +2 -2
- package/__inner__/esm/components/Menu/components/MenuList/MenuList.js +46 -28
- package/__inner__/esm/components/Menu/useMenuFocusList.js +11 -1
- package/__inner__/esm/components/Modal/Modal.js +3 -7
- package/__inner__/esm/components/Popover/Popover.js +1 -5
- package/__inner__/esm/components/Select/Select.js +2 -5
- package/__inner__/esm/components/ThemeProvider/types.d.ts +2 -0
- package/__inner__/esm/hooks/useFocusList/useFocusList.js +10 -1
- package/__inner__/esm/hooks/useMultiRef/useMultiRef.js +2 -7
- package/__inner__/esm/utils/isKeys.d.ts +3 -0
- package/__inner__/esm/utils/isKeys.js +2 -0
- package/__inner__/esm/utils/renderContent/index.d.ts +1 -0
- package/__inner__/esm/utils/renderContent/index.js +1 -0
- package/__inner__/esm/utils/renderContent/renderContent.d.ts +6 -0
- package/__inner__/esm/utils/renderContent/renderContent.js +25 -0
- package/__inner__/esm/utils/setRef.d.ts +4 -0
- package/__inner__/esm/utils/setRef.js +9 -0
- package/package.json +1 -1
|
@@ -33,4 +33,7 @@ export type ChipBaseProps = {
|
|
|
33
33
|
'data-testid'?: string;
|
|
34
34
|
};
|
|
35
35
|
export type ChipProps = ExtendableProps<InputHTMLAttributes<HTMLInputElement>, ChipBaseProps>;
|
|
36
|
+
/**
|
|
37
|
+
* @deprecated Компонент устарел. Для замены используйте компонент ChipNext
|
|
38
|
+
*/
|
|
36
39
|
export declare const Chip: React.ForwardRefExoticComponent<ChipBaseProps & Omit<React.InputHTMLAttributes<HTMLInputElement>, keyof ChipBaseProps> & React.RefAttributes<HTMLLabelElement>>;
|
|
@@ -11,6 +11,9 @@ var constants_1 = require("./constants");
|
|
|
11
11
|
exports.cnChip = (0, classname_1.cn)('Chip');
|
|
12
12
|
exports.chipSizeVariant = ['xs', 's', 'm', 'l'];
|
|
13
13
|
exports.chipColorVariant = ['primary', 'secondary'];
|
|
14
|
+
/**
|
|
15
|
+
* @deprecated Компонент устарел. Для замены используйте компонент ChipNext
|
|
16
|
+
*/
|
|
14
17
|
exports.Chip = (0, react_1.forwardRef)(function (inProps, ref) {
|
|
15
18
|
var _a = (0, useThemeProps_1.useThemeProps)({ name: 'Chip', props: inProps }), _b = _a.size, size = _b === void 0 ? constants_1.CHIP_DEFAULT_SIZE : _b, _c = _a.color, color = _c === void 0 ? constants_1.CHIP_DEFAULT_VARIANT : _c, _d = _a.disabled, disabled = _d === void 0 ? constants_1.CHIP_DEFAULT_DISABLED : _d, IconLeft = _a.iconLeft, IconRight = _a.iconRight, labelProps = _a.labelProps, inputRef = _a.inputRef, className = _a.className, children = _a.children, dataTestId = _a["data-testid"], other = tslib_1.__rest(_a, ["size", "color", "disabled", "iconLeft", "iconRight", "labelProps", "inputRef", "className", "children", 'data-testid']);
|
|
16
19
|
var iconSize = (0, react_1.useMemo)(function () { return (0, getIconSizeToFormElement_1.getIconSizeToFormElement)(size); }, [size]);
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/* stylelint-disable */
|
|
2
|
+
.ChipNext {
|
|
3
|
+
--chip-border-radius: 24px;
|
|
4
|
+
--chip-text-wrap: nowrap;
|
|
5
|
+
background-color: var(--chip-bg-color);
|
|
6
|
+
border-radius: var(--chip-border-radius);
|
|
7
|
+
min-block-size: var(--chip-height);
|
|
8
|
+
padding: 0 var(--chip-padding-x);
|
|
9
|
+
min-inline-size: var(--chip-min-width);
|
|
10
|
+
color: var(--chip-text-color);
|
|
11
|
+
gap: var(--space-s);
|
|
12
|
+
display: inline-flex;
|
|
13
|
+
justify-content: center;
|
|
14
|
+
align-items: center;
|
|
15
|
+
cursor: pointer;
|
|
16
|
+
box-sizing: border-box;
|
|
17
|
+
text-decoration: none;
|
|
18
|
+
border: none;
|
|
19
|
+
outline: none;
|
|
20
|
+
transition:
|
|
21
|
+
border-color var(--transition-default),
|
|
22
|
+
color var(--transition-default),
|
|
23
|
+
background-color var(--transition-default),
|
|
24
|
+
box-shadow var(--transition-default);
|
|
25
|
+
}
|
|
26
|
+
.ChipNext-Content {
|
|
27
|
+
overflow: hidden;
|
|
28
|
+
text-overflow: ellipsis;
|
|
29
|
+
white-space: var(--chip-text-wrap);
|
|
30
|
+
}
|
|
31
|
+
.ChipNext-Icon {
|
|
32
|
+
color: inherit;
|
|
33
|
+
flex-shrink: 0;
|
|
34
|
+
}
|
|
35
|
+
.ChipNext_multiline {
|
|
36
|
+
--chip-text-wrap: normal;
|
|
37
|
+
}
|
|
38
|
+
.ChipNext_size_xs {
|
|
39
|
+
font: var(--typography-text-2xs-font);
|
|
40
|
+
letter-spacing: var(--typography-text-2xs-letter_spacing, 0);
|
|
41
|
+
text-transform: var(--typography-text-2xs-text_transform, none);
|
|
42
|
+
|
|
43
|
+
--chip-min-width: 64px;
|
|
44
|
+
--chip-height: var(--space-xl);
|
|
45
|
+
--chip-padding-x: var(--space-m);
|
|
46
|
+
}
|
|
47
|
+
.ChipNext_size_s {
|
|
48
|
+
font: var(--typography-text-s-font);
|
|
49
|
+
letter-spacing: var(--typography-text-s-letter_spacing, 0);
|
|
50
|
+
text-transform: var(--typography-text-s-text_transform, none);
|
|
51
|
+
|
|
52
|
+
--chip-min-width: 72px;
|
|
53
|
+
--chip-height: var(--space-2xl);
|
|
54
|
+
--chip-padding-x: var(--space-l);
|
|
55
|
+
}
|
|
56
|
+
.ChipNext_size_m {
|
|
57
|
+
font: var(--typography-text-m-font);
|
|
58
|
+
letter-spacing: var(--typography-text-m-letter_spacing, 0);
|
|
59
|
+
text-transform: var(--typography-text-m-text_transform, none);
|
|
60
|
+
|
|
61
|
+
--chip-min-width: 80px;
|
|
62
|
+
--chip-height: var(--space-3xl);
|
|
63
|
+
--chip-padding-x: 20px;
|
|
64
|
+
}
|
|
65
|
+
.ChipNext_size_l {
|
|
66
|
+
font: var(--typography-text-l-font);
|
|
67
|
+
letter-spacing: var(--typography-text-l-letter_spacing, 0);
|
|
68
|
+
text-transform: var(--typography-text-l-text_transform, none);
|
|
69
|
+
|
|
70
|
+
--chip-min-width: 88px;
|
|
71
|
+
--chip-height: var(--space-4xl);
|
|
72
|
+
--chip-padding-x: var(--space-xl);
|
|
73
|
+
}
|
|
74
|
+
.ChipNext_color_primary {
|
|
75
|
+
--chip-bg-color: var(--color-background-action-light);
|
|
76
|
+
--chip-bg-color-hover: var(--color-background-action-light-hover);
|
|
77
|
+
--chip-bg-color-active: var(--color-background-action-light-pressed);
|
|
78
|
+
--chip-text-color: var(--color-content-action-dark);
|
|
79
|
+
}
|
|
80
|
+
.ChipNext_color_secondary {
|
|
81
|
+
--chip-bg-color: var(--color-background-secondary);
|
|
82
|
+
--chip-bg-color-hover: var(--color-background-secondary-hover);
|
|
83
|
+
--chip-bg-color-active: var(--color-background-secondary-pressed);
|
|
84
|
+
--chip-text-color: var(--color-content-primary);
|
|
85
|
+
}
|
|
86
|
+
.ChipNext:hover {
|
|
87
|
+
--chip-bg-color: var(--chip-bg-color-hover);
|
|
88
|
+
}
|
|
89
|
+
.ChipNext:active {
|
|
90
|
+
--chip-bg-color: var(--chip-bg-color-active);
|
|
91
|
+
}
|
|
92
|
+
.ChipNext:focus {
|
|
93
|
+
box-shadow: var(--shadow-outline-focused);
|
|
94
|
+
}
|
|
95
|
+
.ChipNext:focus:not(:focus-visible) {
|
|
96
|
+
box-shadow: none;
|
|
97
|
+
}
|
|
98
|
+
.ChipNext_checked,
|
|
99
|
+
.ChipNext_checked:hover,
|
|
100
|
+
.ChipNext_checked:active {
|
|
101
|
+
--chip-bg-color: var(--color-background-action);
|
|
102
|
+
--chip-text-color: var(--color-content-action-on);
|
|
103
|
+
}
|
|
104
|
+
.ChipNext_disabled {
|
|
105
|
+
--chip-bg-color: var(--color-background-disabled);
|
|
106
|
+
--chip-text-color: var(--color-content-disabled);
|
|
107
|
+
pointer-events: none;
|
|
108
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import './Chip.css';
|
|
2
|
+
import type { ReactNode, MouseEvent, ElementType } from 'react';
|
|
3
|
+
import type { IconProps, IconSize } from '@ozen-ui/icons';
|
|
4
|
+
import type { PolymorphicComponentPropsWithRef } from '../../utils/polymorphicComponentWithRef';
|
|
5
|
+
import type { RenderContentType } from '../../utils/renderContent';
|
|
6
|
+
import { CHIP_DEFAULT_TAG } from './constants';
|
|
7
|
+
export declare const cnChip: import("@bem-react/classname").ClassNameFormatter;
|
|
8
|
+
export declare const chipSizeVariant: readonly ["xs", "s", "m", "l"];
|
|
9
|
+
export declare const chipColorVariant: readonly ["primary", "secondary"];
|
|
10
|
+
export type ChipSizeVariant = (typeof chipSizeVariant)[number];
|
|
11
|
+
export type ChipColorVariant = (typeof chipColorVariant)[number];
|
|
12
|
+
export type ChipIcon = RenderContentType<IconProps & {
|
|
13
|
+
size?: IconSize;
|
|
14
|
+
}>['content'];
|
|
15
|
+
export type ChipBaseProps = {
|
|
16
|
+
/** Размер компонента */
|
|
17
|
+
size?: ChipSizeVariant;
|
|
18
|
+
/** Вариант представления компонента */
|
|
19
|
+
color?: ChipColorVariant;
|
|
20
|
+
/** Если {true} компонент отображается как заблокированный */
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
/** Если {true} делает элемент выбранным */
|
|
23
|
+
checked?: boolean;
|
|
24
|
+
/** Обработчик нажатия */
|
|
25
|
+
onClick?: (e: MouseEvent<HTMLElement>, payload: {
|
|
26
|
+
checked: boolean;
|
|
27
|
+
}) => void;
|
|
28
|
+
/** Иконка слева */
|
|
29
|
+
iconLeft?: ChipIcon;
|
|
30
|
+
/** Иконка справа */
|
|
31
|
+
iconRight?: ChipIcon;
|
|
32
|
+
/** Если {true} разбивает длинный текст на несколько строк */
|
|
33
|
+
multiline?: boolean;
|
|
34
|
+
/** Дополнительные СSS-классы */
|
|
35
|
+
className?: string;
|
|
36
|
+
/** Содержимое компонента */
|
|
37
|
+
children?: ReactNode;
|
|
38
|
+
/** Идентификатор компонента для тестов */
|
|
39
|
+
'data-testid'?: string;
|
|
40
|
+
};
|
|
41
|
+
export type ChipProps<As extends ElementType = typeof CHIP_DEFAULT_TAG> = PolymorphicComponentPropsWithRef<ChipBaseProps, As>;
|
|
42
|
+
export declare const Chip: import("../../utils/polymorphicComponentWithRef").PolymorphicComponentWithRef<ChipBaseProps, "button">;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Chip = exports.chipColorVariant = exports.chipSizeVariant = exports.cnChip = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
require("./Chip.css");
|
|
6
|
+
var react_1 = tslib_1.__importDefault(require("react"));
|
|
7
|
+
var useControlled_1 = require("../../hooks/useControlled");
|
|
8
|
+
var useThemeProps_1 = require("../../hooks/useThemeProps");
|
|
9
|
+
var classname_1 = require("../../utils/classname");
|
|
10
|
+
var getIconSizeToFormElement_1 = require("../../utils/getIconSizeToFormElement");
|
|
11
|
+
var polymorphicComponentWithRef_1 = require("../../utils/polymorphicComponentWithRef");
|
|
12
|
+
var renderContent_1 = require("../../utils/renderContent");
|
|
13
|
+
var constants_1 = require("./constants");
|
|
14
|
+
exports.cnChip = (0, classname_1.cn)('ChipNext');
|
|
15
|
+
exports.chipSizeVariant = ['xs', 's', 'm', 'l'];
|
|
16
|
+
exports.chipColorVariant = ['primary', 'secondary'];
|
|
17
|
+
exports.Chip = (0, polymorphicComponentWithRef_1.polymorphicComponentWithRef)(function (inProps, ref) {
|
|
18
|
+
var _a = (0, useThemeProps_1.useThemeProps)({ name: 'ChipNext', props: inProps }), _b = _a.size, size = _b === void 0 ? constants_1.CHIP_DEFAULT_SIZE : _b, _c = _a.color, color = _c === void 0 ? constants_1.CHIP_DEFAULT_VARIANT : _c, _d = _a.disabled, disabled = _d === void 0 ? constants_1.CHIP_DEFAULT_DISABLED : _d, iconLeft = _a.iconLeft, iconRight = _a.iconRight, multiline = _a.multiline, className = _a.className, children = _a.children, onClick = _a.onClick, checkedProp = _a.checked, _e = _a.as, Tag = _e === void 0 ? constants_1.CHIP_DEFAULT_TAG : _e, dataTestId = _a["data-testid"], other = tslib_1.__rest(_a, ["size", "color", "disabled", "iconLeft", "iconRight", "multiline", "className", "children", "onClick", "checked", "as", 'data-testid']);
|
|
19
|
+
var _f = tslib_1.__read((0, useControlled_1.useControlled)({
|
|
20
|
+
value: checkedProp,
|
|
21
|
+
defaultValue: false,
|
|
22
|
+
name: 'ChipNext',
|
|
23
|
+
state: 'open',
|
|
24
|
+
}), 2), checkedState = _f[0], setCheckedState = _f[1];
|
|
25
|
+
var handleClick = function (event) {
|
|
26
|
+
if (disabled) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
setCheckedState(!checkedState);
|
|
30
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(event, { checked: !checkedState });
|
|
31
|
+
};
|
|
32
|
+
var renderIcon = function (content) {
|
|
33
|
+
return (0, renderContent_1.renderContent)({
|
|
34
|
+
content: content,
|
|
35
|
+
props: {
|
|
36
|
+
size: (0, getIconSizeToFormElement_1.getIconSizeToFormElement)(size),
|
|
37
|
+
className: (0, exports.cnChip)('Icon'),
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
return (react_1.default.createElement(Tag, tslib_1.__assign({ type: "button", "data-testid": dataTestId, disabled: disabled }, other, { className: (0, exports.cnChip)({ size: size, disabled: disabled, color: color, multiline: multiline, checked: checkedState }, [className]), onClick: handleClick, ref: ref }),
|
|
42
|
+
renderIcon(iconLeft),
|
|
43
|
+
children && react_1.default.createElement("span", { className: (0, exports.cnChip)('Content') }, children),
|
|
44
|
+
renderIcon(iconRight)));
|
|
45
|
+
});
|
|
46
|
+
exports.Chip.displayName = 'Chip';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CHIP_DEFAULT_DISABLED = exports.CHIP_DEFAULT_SIZE = exports.CHIP_DEFAULT_VARIANT = exports.CHIP_DEFAULT_TAG = void 0;
|
|
4
|
+
exports.CHIP_DEFAULT_TAG = 'button';
|
|
5
|
+
exports.CHIP_DEFAULT_VARIANT = 'primary';
|
|
6
|
+
exports.CHIP_DEFAULT_SIZE = 'm';
|
|
7
|
+
exports.CHIP_DEFAULT_DISABLED = false;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Chip';
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import './FieldIcon.css';
|
|
2
|
-
import type { ComponentPropsWithRef, ComponentRef
|
|
2
|
+
import type { ComponentPropsWithRef, ComponentRef } from 'react';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import type { IconProps, IconSize } from '@ozen-ui/icons';
|
|
5
5
|
import type { FormElementSizeVariant } from '../../types/FormElementSizeVariant';
|
|
6
|
+
import type { RenderContentType } from '../../utils/renderContent';
|
|
6
7
|
export declare const FIELD_ICON_DEFAULT_TAG = "div";
|
|
7
8
|
export type FieldIconRef = ComponentRef<typeof FIELD_ICON_DEFAULT_TAG>;
|
|
8
9
|
export type FieldIconProps = ComponentPropsWithRef<typeof FIELD_ICON_DEFAULT_TAG> & {
|
|
9
|
-
icon?:
|
|
10
|
+
icon?: RenderContentType<IconProps & {
|
|
10
11
|
size?: IconSize;
|
|
11
|
-
}>
|
|
12
|
-
size?: IconSize;
|
|
13
|
-
}>) | FC<IconProps & {
|
|
14
|
-
size?: IconSize;
|
|
15
|
-
}>;
|
|
12
|
+
}>['content'];
|
|
16
13
|
size?: FormElementSizeVariant;
|
|
17
14
|
children?: never;
|
|
18
15
|
};
|
|
@@ -4,31 +4,12 @@ exports.FieldIcon = exports.cnFieldIcon = exports.FIELD_ICON_DEFAULT_TAG = void
|
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
require("./FieldIcon.css");
|
|
6
6
|
var react_1 = tslib_1.__importStar(require("react"));
|
|
7
|
-
var react_is_1 = require("react-is");
|
|
8
7
|
var classname_1 = require("../../utils/classname");
|
|
9
8
|
var getIconSizeToFormElement_1 = require("../../utils/getIconSizeToFormElement");
|
|
9
|
+
var renderContent_1 = require("../../utils/renderContent");
|
|
10
10
|
var FieldControl_1 = require("../FieldControl");
|
|
11
11
|
exports.FIELD_ICON_DEFAULT_TAG = 'div';
|
|
12
12
|
exports.cnFieldIcon = (0, classname_1.cn)('FieldIcon');
|
|
13
|
-
// TODO: взять за основу для всех рендер-функций
|
|
14
|
-
var resolveChildren = function (content, size) {
|
|
15
|
-
if (typeof content === 'string') {
|
|
16
|
-
return content;
|
|
17
|
-
}
|
|
18
|
-
if ((0, react_is_1.isElement)(content)) {
|
|
19
|
-
return react_1.default.cloneElement(content, {
|
|
20
|
-
size: content.props.size || (size && (0, getIconSizeToFormElement_1.getIconSizeToFormElement)(size)),
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
if (typeof content === 'function' && !react_1.default.isValidElement(content)) {
|
|
24
|
-
return content({ size: size && (0, getIconSizeToFormElement_1.getIconSizeToFormElement)(size) });
|
|
25
|
-
}
|
|
26
|
-
if ((0, react_is_1.isValidElementType)(content)) {
|
|
27
|
-
var Content = content;
|
|
28
|
-
return react_1.default.createElement(Content, { size: size && (0, getIconSizeToFormElement_1.getIconSizeToFormElement)(size) });
|
|
29
|
-
}
|
|
30
|
-
return null;
|
|
31
|
-
};
|
|
32
13
|
exports.FieldIcon = (0, react_1.forwardRef)(function (_a, ref) {
|
|
33
14
|
var icon = _a.icon, className = _a.className, sizeProp = _a.size, other = tslib_1.__rest(_a, ["icon", "className", "size"]);
|
|
34
15
|
var context = (0, react_1.useContext)(FieldControl_1.FieldControlContext);
|
|
@@ -43,6 +24,9 @@ exports.FieldIcon = (0, react_1.forwardRef)(function (_a, ref) {
|
|
|
43
24
|
size = fieldControl.size;
|
|
44
25
|
}
|
|
45
26
|
}
|
|
46
|
-
return (react_1.default.createElement(Tag, tslib_1.__assign({ className: (0, exports.cnFieldIcon)({ size: size }, [className]) }, other, { ref: ref }),
|
|
27
|
+
return (react_1.default.createElement(Tag, tslib_1.__assign({ className: (0, exports.cnFieldIcon)({ size: size }, [className]) }, other, { ref: ref }), (0, renderContent_1.renderContent)({
|
|
28
|
+
content: icon,
|
|
29
|
+
props: { size: size && (0, getIconSizeToFormElement_1.getIconSizeToFormElement)(size) },
|
|
30
|
+
})));
|
|
47
31
|
});
|
|
48
32
|
exports.FieldIcon.displayName = 'FieldIcon';
|
|
@@ -12,14 +12,14 @@ var constants_1 = require("../../../List/constants");
|
|
|
12
12
|
exports.cnMenuItem = (0, classname_1.cn)('MenuItem');
|
|
13
13
|
exports.MenuItem = (0, polymorphicComponentWithRef_1.polymorphicComponentWithRef)(function (inProps, ref) {
|
|
14
14
|
var props = (0, useThemeProps_1.useThemeProps)({ props: inProps, name: 'MenuItem' });
|
|
15
|
-
var children = props.children, selected = props.selected, value = props.value, label = props.label, _a = props.autoFocus, autoFocus = _a === void 0 ? false : _a, className = props.className, _b = props.as, Tag = _b === void 0 ? constants_1.LIST_ITEM_BUTTON_DEFAULT_TAG : _b, other = tslib_1.__rest(props, ["children", "selected", "value", "label", "autoFocus", "className", "as"]);
|
|
15
|
+
var children = props.children, selected = props.selected, value = props.value, label = props.label, _a = props.autoFocus, autoFocus = _a === void 0 ? false : _a, disabled = props.disabled, className = props.className, _b = props.as, Tag = _b === void 0 ? constants_1.LIST_ITEM_BUTTON_DEFAULT_TAG : _b, other = tslib_1.__rest(props, ["children", "selected", "value", "label", "autoFocus", "disabled", "className", "as"]);
|
|
16
16
|
var innerRef = (0, react_1.useRef)(null);
|
|
17
17
|
(0, react_1.useEffect)(function () {
|
|
18
18
|
var _a;
|
|
19
|
-
if (autoFocus) {
|
|
19
|
+
if (autoFocus && !disabled) {
|
|
20
20
|
(_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
21
21
|
}
|
|
22
|
-
}, [autoFocus]);
|
|
23
|
-
return (react_1.default.createElement(List_1.ListItemButton, tslib_1.__assign({ role: "menuitem", as: Tag }, other, { ref: (0, useMultiRef_1.useMultiRef)([ref, innerRef]), className: (0, List_1.cnListItemButton)({ selected: selected }, [className, (0, exports.cnMenuItem)()]), "data-value": value, "data-label": label }), children));
|
|
22
|
+
}, [autoFocus, disabled]);
|
|
23
|
+
return (react_1.default.createElement(List_1.ListItemButton, tslib_1.__assign({ role: "menuitem", as: Tag, disabled: disabled }, other, { ref: (0, useMultiRef_1.useMultiRef)([ref, innerRef]), className: (0, List_1.cnListItemButton)({ selected: selected }, [className, (0, exports.cnMenuItem)()]), "data-value": value, "data-label": label }), children));
|
|
24
24
|
});
|
|
25
25
|
exports.MenuItem.displayName = 'MenuItem';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { ListProps } from '../../../List';
|
|
3
3
|
export type MenuListProps = {
|
|
4
|
-
/** Если {true} устанавливает автофокус на первый
|
|
4
|
+
/** Если {true} устанавливает автофокус на первый активный элемент в списке */
|
|
5
5
|
autoFocus?: boolean;
|
|
6
|
-
} & ListProps
|
|
6
|
+
} & ListProps<'div'>;
|
|
7
7
|
export declare const MenuList: React.ForwardRefExoticComponent<Omit<MenuListProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -6,61 +6,79 @@ var react_1 = tslib_1.__importStar(require("react"));
|
|
|
6
6
|
var react_is_1 = require("react-is");
|
|
7
7
|
var useMultiRef_1 = require("../../../../hooks/useMultiRef");
|
|
8
8
|
var useThemeProps_1 = require("../../../../hooks/useThemeProps");
|
|
9
|
+
var setRef_1 = require("../../../../utils/setRef");
|
|
9
10
|
var List_1 = require("../../../List");
|
|
10
11
|
var useMenuFocusList_1 = require("../../useMenuFocusList");
|
|
11
12
|
var MenuItem_1 = require("../MenuItem");
|
|
13
|
+
var isNotSelectOption = function (child) {
|
|
14
|
+
return !(0, react_1.isValidElement)(child) || (child === null || child === void 0 ? void 0 : child.type) !== MenuItem_1.MenuItem || !!child.props.disabled;
|
|
15
|
+
};
|
|
12
16
|
exports.MenuList = (0, react_1.forwardRef)(function (inProps, ref) {
|
|
13
17
|
var props = (0, useThemeProps_1.useThemeProps)({ props: inProps, name: 'MenuList' });
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var
|
|
18
|
+
var _a = props.autoFocus, autoFocus = _a === void 0 ? false : _a, children = props.children, onMouseDownProp = props.onMouseDown, other = tslib_1.__rest(props, ["autoFocus", "children", "onMouseDown"]);
|
|
19
|
+
var listRef = (0, react_1.useRef)(null);
|
|
20
|
+
var _b = tslib_1.__read((0, react_1.useState)({}), 2), nodes = _b[0], setNodes = _b[1];
|
|
21
|
+
var onKeyDown = (0, useMenuFocusList_1.useMenuFocusList)(Object.values(nodes)).onKeyDown;
|
|
17
22
|
var activeItemIndex = -1;
|
|
23
|
+
var focusedItemIndex = -1;
|
|
18
24
|
var resolvedChildren = (0, react_is_1.isFragment)(children)
|
|
19
25
|
? children.props.children
|
|
20
26
|
: children;
|
|
21
27
|
react_1.Children.forEach(resolvedChildren, function (child, index) {
|
|
22
|
-
if (
|
|
23
|
-
(child === null || child === void 0 ? void 0 : child.type) !== MenuItem_1.MenuItem ||
|
|
24
|
-
child.props.disabled) {
|
|
28
|
+
if (isNotSelectOption(child)) {
|
|
25
29
|
return;
|
|
26
30
|
}
|
|
27
|
-
if (child.props.selected) {
|
|
31
|
+
if (child.props.autoFocus || child.props.selected) {
|
|
28
32
|
activeItemIndex = index;
|
|
33
|
+
focusedItemIndex = index;
|
|
29
34
|
}
|
|
30
35
|
else if (activeItemIndex === -1) {
|
|
31
36
|
activeItemIndex = index;
|
|
37
|
+
if (autoFocus) {
|
|
38
|
+
focusedItemIndex = index;
|
|
39
|
+
}
|
|
32
40
|
}
|
|
33
41
|
});
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (e.target === e.currentTarget) {
|
|
37
|
-
(_a = nodesRef.current[0]) === null || _a === void 0 ? void 0 : _a.focus();
|
|
38
|
-
}
|
|
39
|
-
}, ref: ref }, other), react_1.Children.map(resolvedChildren, function (child, index) {
|
|
40
|
-
if (!(0, react_1.isValidElement)(child) ||
|
|
41
|
-
(child === null || child === void 0 ? void 0 : child.type) !== MenuItem_1.MenuItem ||
|
|
42
|
-
child.props.disabled) {
|
|
42
|
+
var renderChildren = react_1.Children.map(resolvedChildren, function (child, index) {
|
|
43
|
+
if (isNotSelectOption(child)) {
|
|
43
44
|
return child;
|
|
44
45
|
}
|
|
45
46
|
var isActiveElement = activeItemIndex === index;
|
|
47
|
+
var isFocusedElement = focusedItemIndex === index;
|
|
46
48
|
var elementChild = child;
|
|
49
|
+
var ref = function (ref) {
|
|
50
|
+
(0, setRef_1.setRef)(elementChild.ref, ref);
|
|
51
|
+
if (ref) {
|
|
52
|
+
setNodes(function (prevNodes) {
|
|
53
|
+
var _a;
|
|
54
|
+
return (tslib_1.__assign(tslib_1.__assign({}, prevNodes), (_a = {}, _a[index] = ref, _a)));
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
setNodes(function (prevNodes) {
|
|
59
|
+
var obj = tslib_1.__assign({}, prevNodes);
|
|
60
|
+
delete obj[index];
|
|
61
|
+
return obj;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
};
|
|
47
65
|
var props = {
|
|
66
|
+
ref: ref,
|
|
48
67
|
tabIndex: isActiveElement ? 0 : -1,
|
|
49
|
-
autoFocus:
|
|
68
|
+
autoFocus: isFocusedElement,
|
|
50
69
|
onKeyDown: function (event) {
|
|
51
70
|
var _a, _b;
|
|
52
71
|
onKeyDown(event);
|
|
53
72
|
(_b = (_a = child.props).onKeyDown) === null || _b === void 0 ? void 0 : _b.call(_a, event);
|
|
54
73
|
},
|
|
55
74
|
};
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
})));
|
|
75
|
+
return react_1.default.cloneElement(elementChild, tslib_1.__assign({}, props));
|
|
76
|
+
});
|
|
77
|
+
return (react_1.default.createElement(List_1.List, tslib_1.__assign({ onMouseDown: function (event) {
|
|
78
|
+
if (event.target === listRef.current) {
|
|
79
|
+
event.preventDefault();
|
|
80
|
+
}
|
|
81
|
+
onMouseDownProp === null || onMouseDownProp === void 0 ? void 0 : onMouseDownProp(event);
|
|
82
|
+
}, role: "menu", as: "div", tabIndex: -1, ref: (0, useMultiRef_1.useMultiRef)([ref, listRef]) }, other), renderChildren));
|
|
65
83
|
});
|
|
66
84
|
exports.MenuList.displayName = 'MenuList';
|
|
@@ -5,17 +5,27 @@ var react_1 = require("react");
|
|
|
5
5
|
var getNextIndex_1 = require("../../utils/getNextIndex");
|
|
6
6
|
var getPrevIndex_1 = require("../../utils/getPrevIndex");
|
|
7
7
|
var isKey_1 = require("../../utils/isKey");
|
|
8
|
+
var isKeys_1 = require("../../utils/isKeys");
|
|
8
9
|
function useMenuFocusList(nodes) {
|
|
9
10
|
var savedNodes = (0, react_1.useRef)(nodes);
|
|
10
11
|
(0, react_1.useEffect)(function () {
|
|
11
12
|
savedNodes.current = nodes;
|
|
12
13
|
}, [nodes]);
|
|
13
14
|
var onKeyDown = (0, react_1.useCallback)(function (event) {
|
|
14
|
-
|
|
15
|
+
var _a, _b;
|
|
16
|
+
if (!(0, isKeys_1.isKeys)(event, ['ArrowUp', 'ArrowDown', 'Home', 'End'])) {
|
|
15
17
|
return;
|
|
16
18
|
}
|
|
17
19
|
event.preventDefault();
|
|
18
20
|
var items = savedNodes.current;
|
|
21
|
+
if ((0, isKey_1.isKey)(event, 'Home')) {
|
|
22
|
+
(_a = items === null || items === void 0 ? void 0 : items[0]) === null || _a === void 0 ? void 0 : _a.focus();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if ((0, isKey_1.isKey)(event, 'End')) {
|
|
26
|
+
(_b = items === null || items === void 0 ? void 0 : items[items.length - 1]) === null || _b === void 0 ? void 0 : _b.focus();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
19
29
|
var currentEl = event.target;
|
|
20
30
|
var currentIndex = items.indexOf(currentEl);
|
|
21
31
|
var newIndex = (0, isKey_1.isKey)(event, 'ArrowUp')
|
|
@@ -22,7 +22,6 @@ exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
|
|
|
22
22
|
var hasBackdrop = !hideBackdrop;
|
|
23
23
|
var modalInnerRef = (0, react_1.useRef)(null);
|
|
24
24
|
var focusedElement = (0, react_1.useRef)(null);
|
|
25
|
-
var isClickOutSide = (0, react_1.useRef)(null);
|
|
26
25
|
var _h = tslib_1.__read((0, react_1.useState)(false), 2), openState = _h[0], setOpenState = _h[1];
|
|
27
26
|
var _j = tslib_1.__read((0, react_1.useState)(false), 2), opened = _j[0], setOpened = _j[1];
|
|
28
27
|
var _k = (0, index_1.useModalManager)(modalInnerRef, 1000, openState), isTop = _k.isTop, refsClickOutside = _k.refsClickOutside;
|
|
@@ -31,7 +30,6 @@ exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
|
|
|
31
30
|
modalInnerRef
|
|
32
31
|
], tslib_1.__read(refsClickOutside), false), tslib_1.__read((ignoreClickOutsideRefs || [])), false),
|
|
33
32
|
handler: function () {
|
|
34
|
-
isClickOutSide.current = true;
|
|
35
33
|
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
36
34
|
},
|
|
37
35
|
active: !disableClickOutside,
|
|
@@ -43,7 +41,6 @@ exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
|
|
|
43
41
|
// Сохраняем фокус активного элемента до момента открытия всплывающего окна
|
|
44
42
|
if (open) {
|
|
45
43
|
setOpened(true);
|
|
46
|
-
isClickOutSide.current = null;
|
|
47
44
|
focusedElement.current =
|
|
48
45
|
document.activeElement;
|
|
49
46
|
(_a = focusedElement.current) === null || _a === void 0 ? void 0 : _a.blur();
|
|
@@ -57,10 +54,9 @@ exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
|
|
|
57
54
|
var onExited = (0, react_1.useCallback)(function () {
|
|
58
55
|
var _a, _b;
|
|
59
56
|
// Возвращаем фокус активного элемента
|
|
60
|
-
if (
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
(_b = focusedElement.current) === null || _b === void 0 ? void 0 : _b.focus();
|
|
57
|
+
if (((_a = modalInnerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement)) ||
|
|
58
|
+
document.activeElement === document.body) {
|
|
59
|
+
(_b = focusedElement.current) === null || _b === void 0 ? void 0 : _b.focus({ preventScroll: true });
|
|
64
60
|
}
|
|
65
61
|
setOpened(false);
|
|
66
62
|
onExitedProp === null || onExitedProp === void 0 ? void 0 : onExitedProp();
|
|
@@ -23,7 +23,6 @@ exports.cnPopover = (0, classname_1.cn)('Popover');
|
|
|
23
23
|
exports.Popover = (0, polymorphicComponentWithRef_1.polymorphicComponentWithRef)(function (inProps, ref) {
|
|
24
24
|
var props = (0, useThemeProps_1.useThemeProps)({ props: inProps, name: 'Popover' });
|
|
25
25
|
var _a = props.arrow, arrow = _a === void 0 ? constants_1.POPOVER_DEFAULT_ARROW : _a, _b = props.open, open = _b === void 0 ? constants_1.POPOVER_DEFAULT_OPEN : _b, _c = props.disableInteractive, disableInteractive = _c === void 0 ? constants_1.POPOVER_DEFAULT_DISABLE_INTERACTIVE : _c, _d = props.disableEnforceFocus, disableEnforceFocus = _d === void 0 ? constants_1.POPOVER_DEFAULT_DISABLE_ENFORCE_FOCUS : _d, _e = props.disableReturnFocus, disableReturnFocus = _e === void 0 ? constants_1.POPOVER_DEFAULT_DISABLE_RETURN_FOCUS : _e, _f = props.disableClickOutside, disableClickOutside = _f === void 0 ? constants_1.POPOVER_DEFAULT_DISABLE_CLICK_OUTSIDE : _f, _g = props.placement, placement = _g === void 0 ? constants_1.POPOVER_DEFAULT_PLACEMENT : _g, ignoreClickOutsideRefs = props.ignoreClickOutsideRefs, arrowProps = props.arrowProps, anchorRef = props.anchorRef, equalAnchorWidth = props.equalAnchorWidth, offset = props.offset, children = props.children, transitionProps = props.transitionProps, onClose = props.onClose, onEnter = props.onEnter, onEntered = props.onEntered, onExit = props.onExit, onExitedProp = props.onExited, className = props.className, position = props.position, style = props.style, setUpdate = props.setUpdate, _h = props.as, as = _h === void 0 ? constants_1.POPOVER_DEFAULT_TAG : _h, other = tslib_1.__rest(props, ["arrow", "open", "disableInteractive", "disableEnforceFocus", "disableReturnFocus", "disableClickOutside", "placement", "ignoreClickOutsideRefs", "arrowProps", "anchorRef", "equalAnchorWidth", "offset", "children", "transitionProps", "onClose", "onEnter", "onEntered", "onExit", "onExited", "className", "position", "style", "setUpdate", "as"]);
|
|
26
|
-
var isClickOutSide = (0, react_1.useRef)(null);
|
|
27
26
|
var _j = tslib_1.__read((0, react_1.useState)(false), 2), openState = _j[0], setOpenState = _j[1];
|
|
28
27
|
var focusedElement = (0, react_1.useRef)(null);
|
|
29
28
|
var popoverRef = (0, react_1.useRef)(null);
|
|
@@ -49,7 +48,6 @@ exports.Popover = (0, polymorphicComponentWithRef_1.polymorphicComponentWithRef)
|
|
|
49
48
|
popoverRef
|
|
50
49
|
], tslib_1.__read(refsClickOutside), false), tslib_1.__read((anchorRef ? [anchorRef] : [])), false), tslib_1.__read((ignoreClickOutsideRefs || [])), false),
|
|
51
50
|
handler: function () {
|
|
52
|
-
isClickOutSide.current = true;
|
|
53
51
|
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
54
52
|
},
|
|
55
53
|
active: openState && !disableClickOutside,
|
|
@@ -58,10 +56,9 @@ exports.Popover = (0, polymorphicComponentWithRef_1.polymorphicComponentWithRef)
|
|
|
58
56
|
var _a, _b;
|
|
59
57
|
// Возвращаем фокус активного элемента
|
|
60
58
|
if (!disableReturnFocus &&
|
|
61
|
-
!isClickOutSide.current &&
|
|
62
59
|
(((_a = popoverRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement)) ||
|
|
63
60
|
document.activeElement === document.body)) {
|
|
64
|
-
(_b = focusedElement.current) === null || _b === void 0 ? void 0 : _b.focus();
|
|
61
|
+
(_b = focusedElement.current) === null || _b === void 0 ? void 0 : _b.focus({ preventScroll: true });
|
|
65
62
|
}
|
|
66
63
|
onExitedProp === null || onExitedProp === void 0 ? void 0 : onExitedProp();
|
|
67
64
|
}, [onExitedProp]);
|
|
@@ -136,7 +133,6 @@ exports.Popover = (0, polymorphicComponentWithRef_1.polymorphicComponentWithRef)
|
|
|
136
133
|
var _a;
|
|
137
134
|
// Сохраняем фокус активного элемента до момента открытия всплывающего окна
|
|
138
135
|
if (open && !disableReturnFocus) {
|
|
139
|
-
isClickOutSide.current = null;
|
|
140
136
|
focusedElement.current =
|
|
141
137
|
document.activeElement;
|
|
142
138
|
(_a = focusedElement.current) === null || _a === void 0 ? void 0 : _a.blur();
|
|
@@ -9,7 +9,7 @@ var useControlled_1 = require("../../hooks/useControlled");
|
|
|
9
9
|
var useMultiRef_1 = require("../../hooks/useMultiRef");
|
|
10
10
|
var useThemeProps_1 = require("../../hooks/useThemeProps");
|
|
11
11
|
var classname_1 = require("../../utils/classname");
|
|
12
|
-
var
|
|
12
|
+
var isKeys_1 = require("../../utils/isKeys");
|
|
13
13
|
var DataList_1 = require("../DataList");
|
|
14
14
|
var components_1 = require("./components");
|
|
15
15
|
var constants_1 = require("./constants");
|
|
@@ -93,10 +93,7 @@ var SelectRender = function (inProps, ref) {
|
|
|
93
93
|
};
|
|
94
94
|
/** Управление элементом контроля через клавиатуру */
|
|
95
95
|
var handleKeyDown = function (event) {
|
|
96
|
-
if ((
|
|
97
|
-
(0, isKey_1.isKey)(event, 'ArrowDown') ||
|
|
98
|
-
(0, isKey_1.isKey)(event, 'ArrowUp')) &&
|
|
99
|
-
!open) {
|
|
96
|
+
if ((0, isKeys_1.isKeys)(event, ['Space', 'ArrowDown', 'ArrowUp']) && !open) {
|
|
100
97
|
event.preventDefault();
|
|
101
98
|
handleToggle();
|
|
102
99
|
}
|
|
@@ -8,6 +8,7 @@ import type { CardProps } from '../Card';
|
|
|
8
8
|
import type { CheckboxProps } from '../Checkbox';
|
|
9
9
|
import type { CheckboxGroupProps } from '../CheckboxGroup';
|
|
10
10
|
import type { ChipProps } from '../Chip';
|
|
11
|
+
import type { ChipProps as ChiPropsNext } from '../ChipNext';
|
|
11
12
|
import type { CollapseProps } from '../Collapse';
|
|
12
13
|
import type { ContainerProps } from '../Container';
|
|
13
14
|
import type { DataListProps } from '../DataList';
|
|
@@ -69,6 +70,7 @@ export type Theme = {
|
|
|
69
70
|
Checkbox?: Partial<CheckboxProps>;
|
|
70
71
|
CheckboxGroup?: Partial<CheckboxGroupProps>;
|
|
71
72
|
Chip?: Partial<ChipProps>;
|
|
73
|
+
ChipNext?: Partial<ChiPropsNext>;
|
|
72
74
|
Collapse?: Partial<CollapseProps>;
|
|
73
75
|
Container?: Partial<ContainerProps>;
|
|
74
76
|
DataList?: Partial<DataListProps>;
|