@sima-land/ui-nucleons 45.0.0-alpha.20 → 45.0.0-alpha.22
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/helpers/index.d.ts +1 -0
- package/helpers/index.js +3 -1
- package/helpers/index.js.map +1 -1
- package/helpers/merge-refs.d.ts +8 -0
- package/helpers/merge-refs.js +22 -0
- package/helpers/merge-refs.js.map +1 -0
- package/input/input.js +1 -1
- package/input/input.js.map +1 -1
- package/package.json +3 -4
- package/phone-input/phone-input.js +21 -10
- package/phone-input/phone-input.js.map +1 -1
- package/select/index.d.ts +2 -0
- package/select/index.js +5 -1
- package/select/index.js.map +1 -1
- package/select/parts/{block.d.ts → field-block.d.ts} +1 -1
- package/select/parts/field-block.js +70 -0
- package/select/parts/field-block.js.map +1 -0
- package/select/parts/menu.d.ts +2 -2
- package/select/parts/menu.js +132 -46
- package/select/parts/menu.js.map +1 -1
- package/select/parts/{button.d.ts → text-button.d.ts} +1 -1
- package/select/parts/text-button.js +48 -0
- package/select/parts/text-button.js.map +1 -0
- package/select/select.d.ts +1 -7
- package/select/select.js +44 -105
- package/select/select.js.map +1 -1
- package/select/types.d.ts +16 -22
- package/select/utils.d.ts +3 -2
- package/select/utils.js +16 -10
- package/select/utils.js.map +1 -1
- package/side-page/index.d.ts +2 -1
- package/side-page/index.js +6 -5
- package/side-page/index.js.map +1 -1
- package/side-page/side-page-body.d.ts +7 -0
- package/side-page/side-page-body.js +27 -0
- package/side-page/side-page-body.js.map +1 -0
- package/side-page/side-page-body.m.scss +4 -0
- package/side-page/side-page-util.scss +9 -0
- package/side-page/side-page.d.ts +1 -7
- package/side-page/side-page.js +10 -37
- package/side-page/side-page.js.map +1 -1
- package/side-page/side-page.m.scss +6 -72
- package/side-page/types.d.ts +11 -23
- package/side-page/utils.d.ts +26 -0
- package/side-page/utils.js +69 -0
- package/side-page/utils.js.map +1 -0
- package/side-page/utils.m.scss +67 -0
- package/textarea/textarea.js +5 -5
- package/textarea/textarea.js.map +1 -1
- package/textarea/types.d.ts +1 -1
- package/select/parts/block.js +0 -52
- package/select/parts/block.js.map +0 -1
- package/select/parts/button.js +0 -33
- package/select/parts/button.js.map +0 -1
- package/select/parts/menu.m.scss +0 -4
- package/side-page/slots.d.ts +0 -26
- package/side-page/slots.js +0 -39
- package/side-page/slots.js.map +0 -1
- /package/select/parts/{block.m.scss → field-block.m.scss} +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SelectTextButton = SelectTextButton;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const text_button_1 = require("../../text-button");
|
|
10
|
+
const utils_1 = require("../utils");
|
|
11
|
+
const ArrowExpandUp_1 = __importDefault(require("@sima-land/ui-quarks/icons/16x16/Stroked/ArrowExpandUp"));
|
|
12
|
+
const ArrowExpandDown_1 = __importDefault(require("@sima-land/ui-quarks/icons/16x16/Stroked/ArrowExpandDown"));
|
|
13
|
+
const helpers_1 = require("../../helpers");
|
|
14
|
+
/**
|
|
15
|
+
* "Открывашка" для Select в виде текстовой кнопки.
|
|
16
|
+
* @param props Свойства.
|
|
17
|
+
* @return Элемент.
|
|
18
|
+
*/
|
|
19
|
+
function SelectTextButton({ buttonRef, children, onMouseDown, onKeyDown, ...restProps }) {
|
|
20
|
+
const {
|
|
21
|
+
//
|
|
22
|
+
selectProps, currentValue, menuOpen, setMenuOpen, setOpenerElement, setAnchorElement, } = (0, react_1.useContext)(utils_1.SelectContext);
|
|
23
|
+
const { label, disabled } = selectProps;
|
|
24
|
+
const ArrowSVG = menuOpen ? ArrowExpandUp_1.default : ArrowExpandDown_1.default;
|
|
25
|
+
const mergedRef = (0, react_1.useMemo)(() => (0, helpers_1.mergeRefs)([buttonRef, setOpenerElement, setAnchorElement]), [buttonRef, setOpenerElement, setAnchorElement]);
|
|
26
|
+
return ((0, jsx_runtime_1.jsx)(text_button_1.TextButton, { role: 'combobox', disabled: disabled, iconGutter: 4, endIcon: ArrowSVG, ...restProps, as: 'button', buttonRef: mergedRef, onMouseDown: event => {
|
|
27
|
+
onMouseDown?.(event);
|
|
28
|
+
if (disabled || event.defaultPrevented) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// ВАЖНО: предотвращаем фокус
|
|
32
|
+
!menuOpen && event.preventDefault();
|
|
33
|
+
setMenuOpen(a => !a);
|
|
34
|
+
}, onKeyDown: event => {
|
|
35
|
+
onKeyDown?.(event);
|
|
36
|
+
if (disabled || event.defaultPrevented) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
switch (event.code) {
|
|
40
|
+
case 'Enter':
|
|
41
|
+
case 'ArrowUp':
|
|
42
|
+
case 'ArrowDown':
|
|
43
|
+
setMenuOpen(true);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}, children: children ?? (currentValue || label) }));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=text-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-button.js","sourceRoot":"","sources":["../../../src/select/parts/text-button.tsx"],"names":[],"mappings":";;;;;AAYA,4CAkEC;;AA9ED,iCAA4C;AAC5C,mDAAwE;AACxE,oCAAyC;AACzC,2GAA2E;AAC3E,+GAA+E;AAC/E,2CAA0C;AAE1C;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,QAAQ,EACR,WAAW,EACX,SAAS,EACT,GAAG,SAAS,EACY;IACxB,MAAM;IACJ,EAAE;IACF,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GACjB,GAAG,IAAA,kBAAU,EAAC,qBAAa,CAAC,CAAC;IAE9B,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;IAExC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,uBAAK,CAAC,CAAC,CAAC,yBAAO,CAAC;IAE5C,MAAM,SAAS,GAAG,IAAA,eAAO,EACvB,GAAG,EAAE,CAAC,IAAA,mBAAS,EAAoB,CAAC,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,EACnF,CAAC,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAChD,CAAC;IAEF,OAAO,CACL,uBAAC,wBAAU,IACT,IAAI,EAAC,UAAU,EACf,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,CAAC,EACb,OAAO,EAAE,QAAQ,KACb,SAAS,EACb,EAAE,EAAC,QAAQ,EACX,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,KAAK,CAAC,EAAE;YACnB,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC;YAErB,IAAI,QAAQ,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YAED,6BAA6B;YAC7B,CAAC,QAAQ,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YAEpC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC,EACD,SAAS,EAAE,KAAK,CAAC,EAAE;YACjB,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;YAEnB,IAAI,QAAQ,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,OAAO,CAAC;gBACb,KAAK,SAAS,CAAC;gBACf,KAAK,WAAW;oBACd,WAAW,CAAC,IAAI,CAAC,CAAC;oBAClB,MAAM;YACV,CAAC;QACH,CAAC,YAEA,QAAQ,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,GACzB,CACd,CAAC;AACJ,CAAC"}
|
package/select/select.d.ts
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import { SelectProps } from './types';
|
|
2
|
-
import { SelectFieldBlock } from './parts/block';
|
|
3
|
-
import { SelectTextButton } from './parts/button';
|
|
4
2
|
/**
|
|
5
3
|
* Поле выбора из списка.
|
|
6
4
|
* @param props Свойства.
|
|
7
5
|
* @return Элемент.
|
|
8
6
|
*/
|
|
9
|
-
export declare function Select(
|
|
10
|
-
export declare namespace Select {
|
|
11
|
-
var FieldBlock: typeof SelectFieldBlock;
|
|
12
|
-
var TextButton: typeof SelectTextButton;
|
|
13
|
-
}
|
|
7
|
+
export declare function Select(props: SelectProps): import("react/jsx-runtime").JSX.Element;
|
package/select/select.js
CHANGED
|
@@ -4,124 +4,63 @@ exports.Select = Select;
|
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
const utils_1 = require("./utils");
|
|
7
|
-
const
|
|
8
|
-
const utils_2 = require("../dropdown-item/utils");
|
|
9
|
-
const react_2 = require("@floating-ui/react");
|
|
7
|
+
const field_block_1 = require("./parts/field-block");
|
|
10
8
|
const menu_1 = require("./parts/menu");
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const lifecycle_1 = require("../_internal/lifecycle");
|
|
15
|
-
const portal_1 = require("../portal");
|
|
9
|
+
const react_2 = require("@floating-ui/react");
|
|
10
|
+
const dropdown_1 = require("../dropdown");
|
|
11
|
+
const hooks_1 = require("../hooks");
|
|
16
12
|
/**
|
|
17
13
|
* Поле выбора из списка.
|
|
18
14
|
* @param props Свойства.
|
|
19
15
|
* @return Элемент.
|
|
20
16
|
*/
|
|
21
|
-
function Select(
|
|
17
|
+
function Select(props) {
|
|
18
|
+
const { opener = (0, jsx_runtime_1.jsx)(field_block_1.SelectFieldBlock, {}), menu = (0, jsx_runtime_1.jsx)(menu_1.SelectMenu, {}), value, defaultValue, onValueChange, } = props;
|
|
22
19
|
// @todo по аналогии с <select /> надо проверять, есть ли значение в списке переданных
|
|
23
|
-
const [
|
|
24
|
-
const [
|
|
25
|
-
const [
|
|
20
|
+
const [currentValue, setCurrentValue] = (0, react_1.useState)(() => value ?? defaultValue ?? '');
|
|
21
|
+
const [menuOpen, setMenuOpen] = (0, react_1.useState)(false);
|
|
22
|
+
const [openerElement, setOpenerElement] = (0, react_1.useState)(null);
|
|
23
|
+
const [anchorElement, setAnchorElement] = (0, react_1.useState)(null);
|
|
26
24
|
const [menuElement, setMenuElement] = (0, react_1.useState)(null);
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
open: needMenu,
|
|
33
|
-
...(0, utils_3.dropdownFloatingConfig)(),
|
|
34
|
-
});
|
|
35
|
-
(0, react_1.useImperativeHandle)(refs.setFloating, () => menuElement, [menuElement]);
|
|
36
|
-
(0, react_1.useEffect)(() => {
|
|
37
|
-
if (typeof value !== 'undefined') {
|
|
38
|
-
// @todo по аналогии с <select /> надо проверять, есть ли значение в списке переданных
|
|
25
|
+
const menuFloating = (0, react_2.useFloating)({ open: menuOpen, ...(0, dropdown_1.dropdownFloatingConfig)() });
|
|
26
|
+
const { setReference, setFloating } = menuFloating.refs;
|
|
27
|
+
const menuFloatingStyle = (0, dropdown_1.useDropdownFloatingStyle)(menuFloating);
|
|
28
|
+
(0, hooks_1.useIsomorphicLayoutEffect)(() => {
|
|
29
|
+
if (typeof value === 'string') {
|
|
39
30
|
setCurrentValue(value);
|
|
40
31
|
}
|
|
41
32
|
}, [value]);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
// @todo menuShown в зависимости или useCallback
|
|
50
|
-
onMenuToggleRef.current?.({ opened: menuShown });
|
|
51
|
-
}, [disabled, menuElement, isPositioned]);
|
|
52
|
-
const openerBinding = {
|
|
53
|
-
label,
|
|
54
|
-
anchorRef: refs.setReference,
|
|
55
|
-
openerRef,
|
|
56
|
-
value: renderValue(currentValue),
|
|
57
|
-
opened: menuShown,
|
|
58
|
-
failed,
|
|
59
|
-
disabled,
|
|
60
|
-
menuFocused,
|
|
61
|
-
onMouseDown: event => {
|
|
62
|
-
if (!disabled) {
|
|
63
|
-
!menuElement && event.preventDefault();
|
|
64
|
-
setNeedMenu(a => !a);
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
onKeyDown: e => {
|
|
68
|
-
if (!disabled) {
|
|
69
|
-
switch (e.code) {
|
|
70
|
-
case 'Enter':
|
|
71
|
-
case 'ArrowUp':
|
|
72
|
-
case 'ArrowDown':
|
|
73
|
-
setNeedMenu(true);
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
33
|
+
const contextValue = {
|
|
34
|
+
selectProps: props,
|
|
35
|
+
currentValue,
|
|
36
|
+
setCurrentValue: (0, react_1.useCallback)(valueInit => {
|
|
37
|
+
let nextValue = valueInit;
|
|
38
|
+
if (typeof nextValue === 'function') {
|
|
39
|
+
nextValue = nextValue(currentValue);
|
|
76
40
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const menuProps = {
|
|
81
|
-
...dropdownProps,
|
|
82
|
-
style: {
|
|
83
|
-
...floatingStyle,
|
|
84
|
-
...dropdownProps?.style,
|
|
85
|
-
},
|
|
86
|
-
menuRef: setMenuElement,
|
|
87
|
-
value,
|
|
88
|
-
loading,
|
|
89
|
-
onFocus: () => {
|
|
90
|
-
setMenuFocused(true);
|
|
91
|
-
},
|
|
92
|
-
onBlur: () => {
|
|
93
|
-
setNeedMenu(false);
|
|
94
|
-
setMenuFocused(false);
|
|
95
|
-
},
|
|
96
|
-
onKeyDown: event => {
|
|
97
|
-
switch (event.code) {
|
|
98
|
-
case 'ArrowUp':
|
|
99
|
-
case 'ArrowDown':
|
|
100
|
-
event.preventDefault(); // предотвращаем прокрутку страницы
|
|
101
|
-
break;
|
|
102
|
-
case 'Enter':
|
|
103
|
-
case 'Escape':
|
|
104
|
-
openerRef.current?.focus();
|
|
105
|
-
break;
|
|
106
|
-
case 'Tab':
|
|
107
|
-
event.preventDefault(); // предотвращаем фокус на следующем элементе
|
|
108
|
-
openerRef.current?.focus();
|
|
109
|
-
break;
|
|
41
|
+
if (currentValue !== nextValue) {
|
|
42
|
+
setCurrentValue(nextValue);
|
|
43
|
+
onValueChange?.(nextValue);
|
|
110
44
|
}
|
|
111
|
-
},
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
45
|
+
}, [currentValue, onValueChange]),
|
|
46
|
+
menuOpen,
|
|
47
|
+
setMenuOpen,
|
|
48
|
+
openerElement,
|
|
49
|
+
setOpenerElement: (0, react_1.useCallback)(element => {
|
|
50
|
+
setOpenerElement(element);
|
|
51
|
+
}, []),
|
|
52
|
+
anchorElement,
|
|
53
|
+
setAnchorElement: (0, react_1.useCallback)(element => {
|
|
54
|
+
setReference(element);
|
|
55
|
+
setAnchorElement(element);
|
|
56
|
+
}, [setReference]),
|
|
57
|
+
menuElement,
|
|
58
|
+
setMenuElement: (0, react_1.useCallback)(element => {
|
|
59
|
+
setFloating(element);
|
|
60
|
+
setMenuElement(element);
|
|
61
|
+
}, [setFloating]),
|
|
62
|
+
menuFloatingStyle,
|
|
122
63
|
};
|
|
123
|
-
return ((0, jsx_runtime_1.
|
|
64
|
+
return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsxs)(utils_1.SelectContext.Provider, { value: contextValue, children: [opener, menu] }) }));
|
|
124
65
|
}
|
|
125
|
-
Select.FieldBlock = block_1.SelectFieldBlock;
|
|
126
|
-
Select.TextButton = button_1.SelectTextButton;
|
|
127
66
|
//# sourceMappingURL=select.js.map
|
package/select/select.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/select/select.tsx"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/select/select.tsx"],"names":[],"mappings":"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"}
|
package/select/types.d.ts
CHANGED
|
@@ -1,30 +1,22 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CSSProperties, Dispatch, ReactElement, ReactNode, SetStateAction } from 'react';
|
|
2
2
|
import type { DropdownProps } from '../dropdown';
|
|
3
|
-
import type { DropdownItemElement } from '../dropdown-item/types';
|
|
4
3
|
import type { FieldBlockStyle } from '../field-block';
|
|
5
4
|
export interface SelectStyle extends FieldBlockStyle {
|
|
6
5
|
'--dropdown-width'?: string | number;
|
|
7
6
|
}
|
|
8
|
-
export interface
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
menuRef?: Ref<HTMLDivElement | null>;
|
|
22
|
-
value?: ReactNode;
|
|
23
|
-
children?: ReactNode;
|
|
24
|
-
loading?: boolean;
|
|
25
|
-
onBlur?: FocusEventHandler;
|
|
26
|
-
onItemSelect?: (item: DropdownItemElement) => void;
|
|
27
|
-
onDismiss?: VoidFunction;
|
|
7
|
+
export interface SelectContextValue {
|
|
8
|
+
selectProps: SelectProps;
|
|
9
|
+
currentValue: string;
|
|
10
|
+
setCurrentValue: Dispatch<SetStateAction<string>>;
|
|
11
|
+
menuOpen: boolean;
|
|
12
|
+
setMenuOpen: Dispatch<SetStateAction<boolean>>;
|
|
13
|
+
openerElement: HTMLElement | null;
|
|
14
|
+
setOpenerElement: (element: HTMLElement | null) => void;
|
|
15
|
+
anchorElement: HTMLElement | null;
|
|
16
|
+
setAnchorElement: (element: HTMLElement | null) => void;
|
|
17
|
+
menuElement: HTMLElement | null;
|
|
18
|
+
setMenuElement: (element: HTMLElement | null) => void;
|
|
19
|
+
menuFloatingStyle?: CSSProperties;
|
|
28
20
|
}
|
|
29
21
|
export interface SelectProps {
|
|
30
22
|
/** Опции. */
|
|
@@ -51,6 +43,8 @@ export interface SelectProps {
|
|
|
51
43
|
label?: string;
|
|
52
44
|
/** Открывающий элемент. */
|
|
53
45
|
opener?: ReactElement;
|
|
46
|
+
/** Элемент меню. */
|
|
47
|
+
menu?: ReactElement;
|
|
54
48
|
/** Свойства компонента Dropdown. */
|
|
55
49
|
dropdownProps?: Omit<DropdownProps, 'rootRef' | 'viewportRef'>;
|
|
56
50
|
/** Сработает при открытии меню. */
|
package/select/utils.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare const
|
|
1
|
+
import type { SelectContextValue } from './types';
|
|
2
|
+
export declare const SELECT_CONTEXT_DEFAULT_VALUE: SelectContextValue;
|
|
3
|
+
export declare const SelectContext: import("react").Context<SelectContextValue>;
|
package/select/utils.js
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SelectContext = void 0;
|
|
3
|
+
exports.SelectContext = exports.SELECT_CONTEXT_DEFAULT_VALUE = void 0;
|
|
4
4
|
const react_1 = require("react");
|
|
5
|
-
exports.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
exports.SELECT_CONTEXT_DEFAULT_VALUE = {
|
|
6
|
+
selectProps: {},
|
|
7
|
+
currentValue: '',
|
|
8
|
+
setCurrentValue: () => { },
|
|
9
|
+
menuOpen: false,
|
|
10
|
+
setMenuOpen: () => { },
|
|
11
|
+
openerElement: null,
|
|
12
|
+
setOpenerElement: () => { },
|
|
13
|
+
anchorElement: null,
|
|
14
|
+
setAnchorElement: () => { },
|
|
15
|
+
menuElement: null,
|
|
16
|
+
setMenuElement: () => { },
|
|
17
|
+
menuFloatingStyle: {},
|
|
18
|
+
};
|
|
19
|
+
exports.SelectContext = (0, react_1.createContext)(exports.SELECT_CONTEXT_DEFAULT_VALUE);
|
|
14
20
|
//# sourceMappingURL=utils.js.map
|
package/select/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/select/utils.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/select/utils.ts"],"names":[],"mappings":";;;AACA,iCAAsC;AAEzB,QAAA,4BAA4B,GAAuB;IAC9D,WAAW,EAAE,EAAE;IAEf,YAAY,EAAE,EAAE;IAChB,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC;IAEzB,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;IAErB,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;IAE1B,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;IAE1B,WAAW,EAAE,IAAI;IACjB,cAAc,EAAE,GAAG,EAAE,GAAE,CAAC;IAExB,iBAAiB,EAAE,EAAE;CACtB,CAAC;AAEW,QAAA,aAAa,GAAG,IAAA,qBAAa,EAAqB,oCAA4B,CAAC,CAAC"}
|
package/side-page/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export type { SidePageProps } from './types';
|
|
2
2
|
export { SidePage } from './side-page';
|
|
3
|
-
export {
|
|
3
|
+
export { SidePageBody } from './side-page-body';
|
|
4
|
+
export { getResponsiveSidePageProps, useSidePageTransition } from './utils';
|
package/side-page/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.useSidePageTransition = exports.getResponsiveSidePageProps = exports.SidePageBody = exports.SidePage = void 0;
|
|
4
4
|
var side_page_1 = require("./side-page");
|
|
5
5
|
Object.defineProperty(exports, "SidePage", { enumerable: true, get: function () { return side_page_1.SidePage; } });
|
|
6
|
-
var
|
|
7
|
-
Object.defineProperty(exports, "
|
|
8
|
-
|
|
9
|
-
Object.defineProperty(exports, "
|
|
6
|
+
var side_page_body_1 = require("./side-page-body");
|
|
7
|
+
Object.defineProperty(exports, "SidePageBody", { enumerable: true, get: function () { return side_page_body_1.SidePageBody; } });
|
|
8
|
+
var utils_1 = require("./utils");
|
|
9
|
+
Object.defineProperty(exports, "getResponsiveSidePageProps", { enumerable: true, get: function () { return utils_1.getResponsiveSidePageProps; } });
|
|
10
|
+
Object.defineProperty(exports, "useSidePageTransition", { enumerable: true, get: function () { return utils_1.useSidePageTransition; } });
|
|
10
11
|
//# sourceMappingURL=index.js.map
|
package/side-page/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/side-page/index.ts"],"names":[],"mappings":";;;AACA,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AACjB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/side-page/index.ts"],"names":[],"mappings":";;;AACA,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AACjB,mDAAgD;AAAvC,8GAAA,YAAY,OAAA;AACrB,iCAA4E;AAAnE,mHAAA,0BAA0B,OAAA;AAAE,8GAAA,qBAAqB,OAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SidePageBodyProps } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Основной контент SidePage.
|
|
4
|
+
* @param props Свойства.
|
|
5
|
+
* @return Элемент.
|
|
6
|
+
*/
|
|
7
|
+
export declare function SidePageBody({ rootRef, children, className, withScrollDisable, scrollDisableOptions, 'data-testid': testId, ...restProps }: SidePageBodyProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SidePageBody = SidePageBody;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const page_scroll_lock_1 = require("../_internal/page-scroll-lock");
|
|
10
|
+
const helpers_1 = require("../helpers");
|
|
11
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
12
|
+
const side_page_body_m_scss_1 = __importDefault(require("./side-page-body.m.scss"));
|
|
13
|
+
/**
|
|
14
|
+
* Основной контент SidePage.
|
|
15
|
+
* @param props Свойства.
|
|
16
|
+
* @return Элемент.
|
|
17
|
+
*/
|
|
18
|
+
function SidePageBody({ rootRef, children, className, withScrollDisable, scrollDisableOptions, 'data-testid': testId, ...restProps }) {
|
|
19
|
+
const innerRootRef = (0, react_1.useRef)(null);
|
|
20
|
+
const mergedRef = (0, react_1.useMemo)(() => (0, helpers_1.mergeRefs)([rootRef, innerRootRef]), [rootRef, innerRootRef]);
|
|
21
|
+
(0, page_scroll_lock_1.usePageScrollLock)(innerRootRef, {
|
|
22
|
+
lockEnabled: withScrollDisable,
|
|
23
|
+
...scrollDisableOptions,
|
|
24
|
+
});
|
|
25
|
+
return ((0, jsx_runtime_1.jsx)("div", { ref: mergedRef, className: (0, classnames_1.default)(side_page_body_m_scss_1.default.body, className), ...restProps, "data-testid": testId, children: children }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=side-page-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"side-page-body.js","sourceRoot":"","sources":["../../src/side-page/side-page-body.tsx"],"names":[],"mappings":";;;;;AAYA,oCA2BC;;AAtCD,iCAAwC;AACxC,oEAAkE;AAClE,wCAAuC;AACvC,4DAAoC;AACpC,oFAA6C;AAE7C;;;;GAIG;AACH,SAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,oBAAoB,EACpB,aAAa,EAAE,MAAM,EACrB,GAAG,SAAS,EACM;IAClB,MAAM,YAAY,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAA,mBAAS,EAAC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAE7F,IAAA,oCAAiB,EAAC,YAAY,EAAE;QAC9B,WAAW,EAAE,iBAAiB;QAC9B,GAAG,oBAAoB;KACxB,CAAC,CAAC;IAEH,OAAO,CACL,gCACE,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,IAAA,oBAAU,EAAC,+BAAM,CAAC,IAAI,EAAE,SAAS,CAAC,KACzC,SAAS,iBACA,MAAM,YAElB,QAAQ,GACL,CACP,CAAC;AACJ,CAAC"}
|
package/side-page/side-page.d.ts
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import type { SidePageProps } from './types';
|
|
2
|
-
import { SidePageBody, SidePageFooter, SidePageHeader } from './slots';
|
|
3
2
|
/**
|
|
4
3
|
* Модальное окно, прикрепленное к правой стороне экрана.
|
|
5
4
|
* @param props Свойства.
|
|
6
5
|
* @return Элемент.
|
|
7
6
|
*/
|
|
8
|
-
export declare function SidePage({
|
|
9
|
-
export declare namespace SidePage {
|
|
10
|
-
var Header: typeof SidePageHeader;
|
|
11
|
-
var Body: typeof SidePageBody;
|
|
12
|
-
var Footer: typeof SidePageFooter;
|
|
13
|
-
}
|
|
7
|
+
export declare function SidePage({ size, className, children, onClose, overlayProps, 'data-testid': testId, ...restProps }: SidePageProps): import("react/jsx-runtime").JSX.Element;
|
package/side-page/side-page.js
CHANGED
|
@@ -5,53 +5,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.SidePage = SidePage;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
-
const react_1 = require("react");
|
|
9
|
-
const define_slots_1 = require("../helpers/define-slots");
|
|
10
|
-
const page_scroll_lock_1 = require("../_internal/page-scroll-lock");
|
|
11
|
-
const slots_1 = require("./slots");
|
|
12
|
-
const CSSTransition_1 = __importDefault(require("react-transition-group/CSSTransition"));
|
|
13
8
|
const modal_overlay_1 = require("../modal-overlay");
|
|
14
9
|
const utils_1 = require("../modal-overlay/utils");
|
|
15
10
|
const bind_1 = __importDefault(require("classnames/bind"));
|
|
16
11
|
const side_page_m_scss_1 = __importDefault(require("./side-page.m.scss"));
|
|
17
12
|
const cx = bind_1.default.bind(side_page_m_scss_1.default);
|
|
18
|
-
const transitionClasses = {
|
|
19
|
-
enter: cx('enter'),
|
|
20
|
-
enterActive: cx('enter-active'),
|
|
21
|
-
exit: cx('exit'),
|
|
22
|
-
exitActive: cx('exit-active'),
|
|
23
|
-
};
|
|
24
13
|
/**
|
|
25
14
|
* Модальное окно, прикрепленное к правой стороне экрана.
|
|
26
15
|
* @param props Свойства.
|
|
27
16
|
* @return Элемент.
|
|
28
17
|
*/
|
|
29
|
-
function SidePage({
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Фиктивный компонент, необходимый для того чтобы задействовать хук блокировки прокрутки внутри CSSTransition.
|
|
35
|
-
* @param props Свойства.
|
|
36
|
-
* @return Элемент.
|
|
37
|
-
*/
|
|
38
|
-
function SidePageInner({ size = 'm', children, onClose, withScrollDisable = false, scrollDisableOptions, transitionStatus, transitionDuration, }) {
|
|
39
|
-
const overlayClickBind = (0, utils_1.useExactClick)(onClose);
|
|
40
|
-
const ref = (0, react_1.useRef)(null);
|
|
41
|
-
(0, page_scroll_lock_1.usePageScrollLock)(ref, { lockEnabled: withScrollDisable, ...scrollDisableOptions });
|
|
42
|
-
const { header, body, footer } = (0, define_slots_1.defineSlots)(children, {
|
|
43
|
-
header: SidePage.Header,
|
|
44
|
-
body: SidePage.Body,
|
|
45
|
-
footer: SidePage.Footer,
|
|
18
|
+
function SidePage({ size = 'm', className, children, onClose, overlayProps, 'data-testid': testId = 'side-page', ...restProps }) {
|
|
19
|
+
const overlayClickProps = (0, utils_1.useExactClick)(onClose, {
|
|
20
|
+
onMouseDown: overlayProps?.onMouseDown,
|
|
21
|
+
onMouseUp: overlayProps?.onMouseUp,
|
|
46
22
|
});
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return ((0, jsx_runtime_1.jsx)(modal_overlay_1.ModalOverlay, { ...overlayProps, children: (0, jsx_runtime_1.
|
|
23
|
+
const overlayClassName = cx('overlay',
|
|
24
|
+
// ВАЖНО: классы размера и скруглений кидаем на ModalOverlay для того чтобы понизить специфичность
|
|
25
|
+
// а также потому что надо регулировать отступы от края
|
|
26
|
+
size !== 'unset' && `size-${size}`, overlayProps?.className);
|
|
27
|
+
const sidePageClassName = cx('side-page', className);
|
|
28
|
+
return ((0, jsx_runtime_1.jsx)(modal_overlay_1.ModalOverlay, { ...overlayProps, className: overlayClassName, ...overlayClickProps, children: (0, jsx_runtime_1.jsx)("div", { className: sidePageClassName, "data-testid": testId, ...restProps, children: children }) }));
|
|
53
29
|
}
|
|
54
|
-
SidePage.Header = slots_1.SidePageHeader;
|
|
55
|
-
SidePage.Body = slots_1.SidePageBody;
|
|
56
|
-
SidePage.Footer = slots_1.SidePageFooter;
|
|
57
30
|
//# sourceMappingURL=side-page.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"side-page.js","sourceRoot":"","sources":["../../src/side-page/side-page.tsx"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"side-page.js","sourceRoot":"","sources":["../../src/side-page/side-page.tsx"],"names":[],"mappings":";;;;;AAaA,4BA+BC;;AA3CD,oDAAgD;AAChD,kDAAuD;AACvD,2DAAyC;AACzC,0EAAwC;AAExC,MAAM,EAAE,GAAG,cAAU,CAAC,IAAI,CAAC,0BAAM,CAAC,CAAC;AAEnC;;;;GAIG;AACH,SAAgB,QAAQ,CAAC,EACvB,IAAI,GAAG,GAAG,EACV,SAAS,EACT,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,aAAa,EAAE,MAAM,GAAG,WAAW,EACnC,GAAG,SAAS,EACE;IACd,MAAM,iBAAiB,GAAG,IAAA,qBAAa,EAAC,OAAO,EAAE;QAC/C,WAAW,EAAE,YAAY,EAAE,WAAW;QACtC,SAAS,EAAE,YAAY,EAAE,SAAS;KACnC,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,EAAE,CACzB,SAAS;IACT,kGAAkG;IAClG,uDAAuD;IACvD,IAAI,KAAK,OAAO,IAAI,QAAQ,IAAI,EAAE,EAClC,YAAY,EAAE,SAAS,CACxB,CAAC;IAEF,MAAM,iBAAiB,GAAG,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAErD,OAAO,CACL,uBAAC,4BAAY,OAAK,YAAY,EAAE,SAAS,EAAE,gBAAgB,KAAM,iBAAiB,YAChF,gCAAK,SAAS,EAAE,iBAAiB,iBAAe,MAAM,KAAM,SAAS,YAClE,QAAQ,GACL,GACO,CAChB,CAAC;AACJ,CAAC"}
|