@sima-land/ui-nucleons 44.2.10 → 45.0.0-alpha.1
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/_internal/custom-scrollbar/index.d.ts +13 -7
- package/_internal/custom-scrollbar/index.js +29 -15
- package/_internal/dropdown-loading/index.d.ts +3 -3
- package/_internal/dropdown-loading/index.js +4 -2
- package/_internal/page-scroll-lock/adapters/body-scroll-lock.d.ts +39 -0
- package/_internal/page-scroll-lock/adapters/body-scroll-lock.js +62 -0
- package/_internal/page-scroll-lock/adapters/ui-nucleons.d.ts +25 -0
- package/_internal/page-scroll-lock/adapters/ui-nucleons.js +103 -0
- package/_internal/page-scroll-lock/context.d.ts +13 -0
- package/_internal/page-scroll-lock/context.js +54 -0
- package/_internal/page-scroll-lock/hook.d.ts +12 -0
- package/_internal/page-scroll-lock/hook.js +26 -0
- package/_internal/page-scroll-lock/index.d.ts +4 -0
- package/_internal/page-scroll-lock/index.js +9 -0
- package/_internal/page-scroll-lock/types.d.ts +22 -0
- package/_internal/readme.md +2 -0
- package/_internal/utils/dropdown.d.ts +1 -0
- package/_internal/utils/dropdown.js +1 -0
- package/alert/alert.module.scss +1 -24
- package/alert/index.d.ts +11 -17
- package/alert/index.js +33 -16
- package/arrow-button/arrow-button.module.scss +2 -0
- package/arrow-button/index.d.ts +2 -2
- package/autocomplete/autocomplete.d.ts +8 -0
- package/autocomplete/autocomplete.js +190 -0
- package/autocomplete/autocomplete.module.scss +2 -15
- package/autocomplete/index.d.ts +2 -27
- package/autocomplete/index.js +2 -126
- package/autocomplete/types.d.ts +19 -0
- package/autocomplete/types.js +2 -0
- package/autocomplete-deprecated/autocomplete.module.scss +20 -0
- package/autocomplete-deprecated/index.d.ts +28 -0
- package/autocomplete-deprecated/index.js +130 -0
- package/avatar/index.d.ts +2 -2
- package/avatar/user.d.ts +1 -1
- package/base-input/base-input.d.ts +11 -0
- package/base-input/base-input.js +96 -0
- package/base-input/base-input.module.scss +3 -3
- package/base-input/index.d.ts +2 -23
- package/base-input/index.js +2 -76
- package/base-input/types.d.ts +31 -0
- package/base-input/types.js +2 -0
- package/base-input/utils.d.ts +6 -0
- package/base-input/utils.js +14 -0
- package/base-input-deprecated/base-input.module.scss +66 -0
- package/base-input-deprecated/index.d.ts +24 -0
- package/base-input-deprecated/index.js +80 -0
- package/bordered-layout/index.d.ts +1 -0
- package/bordered-layout/index.js +1 -0
- package/bottom-bar/bottom-bar-util.scss +20 -0
- package/bottom-bar/bottom-bar.d.ts +12 -0
- package/bottom-bar/bottom-bar.js +47 -0
- package/bottom-bar/bottom-bar.module.scss +14 -0
- package/bottom-bar/index.d.ts +2 -21
- package/bottom-bar/index.js +5 -44
- package/bottom-bar/types.d.ts +10 -0
- package/bottom-bar/types.js +2 -0
- package/box/index.d.ts +1 -1
- package/breakpoints.scss +34 -3
- package/button/button.module.scss +70 -53
- package/button/index.d.ts +26 -41
- package/button/index.js +22 -46
- package/card/index.d.ts +2 -1
- package/card/index.js +23 -6
- package/card/slots.d.ts +17 -3
- package/card/slots.js +15 -13
- package/carousel/draggable.d.ts +7 -3
- package/carousel/draggable.js +10 -3
- package/carousel/helpers/draggable-event.d.ts +5 -2
- package/carousel/helpers/draggable-event.js +5 -0
- package/carousel/index.d.ts +1 -1
- package/carousel/index.js +24 -24
- package/checkbox/checkbox.module.scss +1 -0
- package/checkbox/index.d.ts +3 -3
- package/checkbox-field/index.d.ts +3 -0
- package/checkbox-field/index.js +3 -0
- package/clean-buttons/clean-buttons-util.scss +15 -0
- package/clean-buttons/clean-buttons.module.scss +5 -3
- package/clean-buttons/index.d.ts +16 -7
- package/clean-buttons/index.js +17 -14
- package/clean-buttons/types.d.ts +1 -1
- package/clean-buttons/utils.d.ts +5 -1
- package/clean-buttons/utils.js +4 -0
- package/{colors.d.ts → colors/index.d.ts} +2 -2
- package/{colors.js → colors/index.js} +2 -1
- package/colors.scss +2 -0
- package/dot-nav/index.d.ts +1 -1
- package/dropdown/index.d.ts +1 -0
- package/dropdown/utils.d.ts +19 -0
- package/dropdown/utils.js +47 -0
- package/dropdown-item/dropdown-item.module.scss +80 -15
- package/dropdown-item/index.d.ts +20 -9
- package/dropdown-item/index.js +12 -9
- package/dropdown-item/types.d.ts +3 -0
- package/dropdown-item/types.js +2 -0
- package/dropdown-item/utils.d.ts +45 -0
- package/dropdown-item/utils.js +89 -0
- package/expandable/utils.js +3 -3
- package/field-block/field-block.module.scss +155 -0
- package/field-block/index.d.ts +63 -0
- package/field-block/index.js +43 -0
- package/field-grid/index.d.ts +5 -4
- package/field-grid/index.js +1 -0
- package/helpers/bounds-of.d.ts +5 -1
- package/helpers/bounds-of.js +5 -0
- package/helpers/center-of.d.ts +4 -1
- package/helpers/center-of.js +8 -1
- package/helpers/create-container.d.ts +5 -2
- package/helpers/create-container.js +7 -2
- package/helpers/define-slots.d.ts +3 -3
- package/helpers/define-slots.js +5 -3
- package/helpers/events.d.ts +16 -8
- package/helpers/events.js +41 -15
- package/helpers/find-child-element.d.ts +12 -9
- package/helpers/find-child-element.js +9 -5
- package/helpers/find-offset-parent.d.ts +1 -2
- package/helpers/find-offset-parent.js +2 -2
- package/helpers/find-sibling-index.d.ts +11 -8
- package/helpers/find-sibling-index.js +8 -3
- package/helpers/fit-element-height.d.ts +5 -5
- package/helpers/fit-element-height.js +9 -7
- package/helpers/format-date.d.ts +11 -11
- package/helpers/format-date.js +15 -13
- package/helpers/format-number.d.ts +1 -1
- package/helpers/format-number.js +2 -2
- package/helpers/get-date-interval-data.d.ts +4 -1
- package/helpers/get-date-interval-data.js +7 -2
- package/helpers/get-declination.d.ts +5 -1
- package/helpers/get-declination.js +5 -0
- package/helpers/get-fraction-depth.d.ts +1 -1
- package/helpers/get-fraction-depth.js +2 -2
- package/helpers/get-no-index.d.ts +2 -2
- package/helpers/get-no-index.js +4 -3
- package/helpers/get-relative-pos.d.ts +4 -1
- package/helpers/get-relative-pos.js +7 -2
- package/helpers/get-scroll-parent.d.ts +1 -2
- package/helpers/get-scroll-parent.js +5 -5
- package/helpers/is-browser.d.ts +4 -1
- package/helpers/is-browser.js +8 -1
- package/helpers/is-fully-scrolled.d.ts +3 -3
- package/helpers/is-fully-scrolled.js +2 -2
- package/helpers/is-touch-device.d.ts +1 -1
- package/helpers/is-touch-device.js +4 -5
- package/helpers/layer.d.ts +1 -1
- package/helpers/layer.js +2 -2
- package/helpers/max-index-of.d.ts +4 -1
- package/helpers/max-index-of.js +7 -2
- package/helpers/media-query-list.d.ts +1 -1
- package/helpers/media-query-list.js +2 -2
- package/helpers/on.d.ts +4 -1
- package/helpers/on.js +7 -2
- package/helpers/point.d.ts +4 -1
- package/helpers/point.js +8 -1
- package/helpers/rename.d.ts +3 -1
- package/helpers/rename.js +1 -0
- package/helpers/scroll-to-child.d.ts +1 -1
- package/helpers/scroll-to-child.js +3 -2
- package/helpers/styles.d.ts +8 -2
- package/helpers/styles.js +18 -4
- package/helpers/with-prevent.d.ts +9 -6
- package/helpers/with-prevent.js +16 -9
- package/hint/hint-view.d.ts +26 -0
- package/hint/hint-view.js +43 -0
- package/hint/hint-view.module.scss +32 -0
- package/hint/hint.d.ts +14 -0
- package/hint/hint.js +41 -0
- package/hint/index.d.ts +5 -8
- package/hint/index.js +13 -48
- package/hint/utils.d.ts +61 -0
- package/hint/utils.js +161 -0
- package/hint-deprecated/index.d.ts +11 -0
- package/hint-deprecated/index.js +53 -0
- package/hooks/breakpoint/index.d.ts +7 -4
- package/hooks/breakpoint/index.js +21 -13
- package/hooks/breakpoint/types.d.ts +3 -4
- package/hooks/breakpoint/utils.d.ts +2 -1
- package/hooks/breakpoint/utils.js +2 -1
- package/hooks/index.d.ts +8 -8
- package/hooks/index.js +27 -19
- package/hooks/intersection/test-utils.d.ts +1 -1
- package/hooks/intersection/test-utils.js +2 -1
- package/hooks/styles.d.ts +6 -0
- package/hooks/styles.js +26 -0
- package/info-text/index.d.ts +23 -0
- package/info-text/index.js +60 -0
- package/info-text/info-text.module.scss +28 -0
- package/input/index.d.ts +32 -0
- package/input/index.js +96 -0
- package/input/input.module.scss +20 -0
- package/input/utils.d.ts +36 -0
- package/input/utils.js +71 -0
- package/layout/index.d.ts +6 -11
- package/layout/index.js +6 -60
- package/layout/layout.d.ts +10 -0
- package/layout/layout.js +32 -0
- package/layout/layout.module.scss +33 -26
- package/layout/legacy.d.ts +15 -0
- package/layout/legacy.js +68 -0
- package/layout/legacy.module.scss +49 -0
- package/layout/types.d.ts +6 -0
- package/layout/types.js +2 -0
- package/link/index.d.ts +4 -1
- package/link/index.js +2 -2
- package/link/link-util.scss +37 -0
- package/link/link.module.scss +19 -12
- package/loading-overlay/index.d.ts +1 -0
- package/loading-overlay/index.js +1 -0
- package/masked-field/index.d.ts +1 -0
- package/masked-field/index.js +1 -0
- package/masked-input/hook.d.ts +8 -0
- package/masked-input/hook.js +72 -0
- package/masked-input/index.d.ts +5 -0
- package/masked-input/index.js +7 -0
- package/masked-input/masked-input.d.ts +8 -0
- package/masked-input/masked-input.js +73 -0
- package/masked-input/types.d.ts +51 -0
- package/masked-input/types.js +2 -0
- package/masked-input/utils.d.ts +15 -0
- package/masked-input/utils.js +49 -0
- package/modal/index.d.ts +10 -12
- package/modal/index.js +27 -64
- package/modal/modal.module.scss +98 -55
- package/modal/slots.d.ts +13 -10
- package/modal/slots.js +30 -28
- package/modal/utils.d.ts +8 -10
- package/modal/utils.js +2 -26
- package/modal-overlay/index.d.ts +13 -0
- package/modal-overlay/index.js +60 -0
- package/modal-overlay/modal-overlay-util.scss +1 -0
- package/modal-overlay/modal-overlay.module.scss +14 -0
- package/modal-overlay/utils.d.ts +14 -0
- package/modal-overlay/utils.js +32 -0
- package/package.json +49 -41
- package/pagination/utils.d.ts +2 -2
- package/panel/index.d.ts +27 -13
- package/panel/index.js +43 -9
- package/panel/panel.module.scss +49 -8
- package/phone-input/index.d.ts +4 -28
- package/phone-input/index.js +2 -121
- package/phone-input/phone-input.d.ts +8 -0
- package/phone-input/phone-input.js +133 -0
- package/phone-input/phone-input.module.scss +8 -32
- package/phone-input/presets.d.ts +21 -22
- package/phone-input/presets.js +1 -2
- package/phone-input/types.d.ts +6 -0
- package/phone-input/types.js +2 -0
- package/phone-input/utils.d.ts +30 -1
- package/phone-input/utils.js +52 -3
- package/phone-input-deprecated/index.d.ts +29 -0
- package/phone-input-deprecated/index.js +124 -0
- package/phone-input-deprecated/phone-input.module.scss +41 -0
- package/plate/index.d.ts +3 -3
- package/plate/index.js +2 -2
- package/plate/plate.module.scss +3 -0
- package/popup/index.d.ts +5 -0
- package/popup/index.js +12 -0
- package/popup/popup-view.d.ts +14 -0
- package/popup/popup-view.js +35 -0
- package/popup/popup-view.module.scss +40 -0
- package/popup/popup.d.ts +17 -0
- package/popup/popup.js +73 -0
- package/popup/utils.d.ts +38 -0
- package/popup/utils.js +83 -0
- package/price/index.d.ts +1 -1
- package/price/index.js +3 -3
- package/price/utils.d.ts +5 -5
- package/price/utils.js +33 -23
- package/radio-button/index.d.ts +10 -0
- package/radio-button/index.js +33 -0
- package/radio-button/radio-button.module.scss +46 -0
- package/rating/index.d.ts +2 -1
- package/rating/types.d.ts +1 -1
- package/readme.md +56 -65
- package/screen/index.d.ts +4 -2
- package/screen/index.js +34 -3
- package/screen/screen.module.scss +0 -2
- package/screen/slots.d.ts +2 -8
- package/screen/slots.js +8 -9
- package/screen/utils.d.ts +2 -1
- package/select/index.d.ts +2 -33
- package/select/index.js +3 -109
- package/select/parts/block.d.ts +8 -0
- package/select/parts/block.js +70 -0
- package/select/parts/block.module.scss +7 -0
- package/select/parts/button.d.ts +8 -0
- package/select/parts/button.js +69 -0
- package/select/parts/menu.d.ts +8 -0
- package/select/parts/menu.js +105 -0
- package/select/parts/menu.module.scss +4 -0
- package/select/select.d.ts +14 -0
- package/select/select.js +145 -0
- package/select/types.d.ts +55 -0
- package/select/types.js +2 -0
- package/select/utils.d.ts +3 -0
- package/select/utils.js +13 -0
- package/select-deprecated/index.d.ts +34 -0
- package/select-deprecated/index.js +112 -0
- package/shadows.scss +18 -0
- package/side-page/index.d.ts +11 -26
- package/side-page/index.js +21 -26
- package/side-page/side-page.module.scss +35 -29
- package/side-page/slots.d.ts +12 -20
- package/side-page/slots.js +16 -28
- package/spinner/index.d.ts +18 -6
- package/spinner/index.js +25 -12
- package/spinner/spinner.module.scss +8 -0
- package/stepper/index.d.ts +18 -10
- package/stepper/index.js +17 -8
- package/stepper/stepper.module.scss +14 -15
- package/styling/fonts.d.ts +3 -3
- package/switcher-row/index.d.ts +42 -0
- package/switcher-row/index.js +59 -0
- package/switcher-row/switcher-row.module.scss +59 -0
- package/text/index.d.ts +1 -1
- package/text-button/index.d.ts +42 -0
- package/text-button/index.js +46 -0
- package/text-button/text-button.module.scss +96 -0
- package/text-field/index.d.ts +7 -6
- package/text-field/index.js +3 -2
- package/textarea/index.d.ts +21 -0
- package/textarea/index.js +85 -0
- package/textarea/textarea.module.scss +15 -0
- package/toggle/index.d.ts +3 -3
- package/toggle/toggle.module.scss +17 -8
- package/tooltip/index.d.ts +1 -0
- package/tooltip/index.js +1 -0
- package/top-bar/index.d.ts +3 -40
- package/top-bar/index.js +4 -60
- package/top-bar/top-bar-util.scss +29 -0
- package/top-bar/top-bar.d.ts +9 -0
- package/top-bar/top-bar.js +101 -0
- package/top-bar/top-bar.module.scss +129 -67
- package/top-bar/types.d.ts +31 -0
- package/top-bar/types.js +2 -0
- package/top-bar/utils.d.ts +14 -0
- package/top-bar/utils.js +56 -0
- package/touch-slider/index.d.ts +1 -0
- package/touch-slider/index.js +3 -2
- package/types.d.ts +18 -0
- package/types.js +2 -0
- package/unknown-content/index.d.ts +3 -3
- package/unknown-content/index.js +3 -3
- package/unknown-content/unknown-content.module.scss +16 -12
- package/upload-area/index.d.ts +2 -0
- package/upload-area/index.js +5 -0
- package/upload-area/types.d.ts +32 -0
- package/upload-area/types.js +2 -0
- package/upload-area/upload-area-util.scss +17 -0
- package/upload-area/upload-area.d.ts +8 -0
- package/upload-area/upload-area.js +105 -0
- package/upload-area/upload-area.module.scss +78 -0
- package/upload-area/utils.d.ts +17 -0
- package/upload-area/utils.js +48 -0
- package/utils.scss +74 -1
- package/with-hint/index.d.ts +3 -2
- package/with-hint/index.js +1 -0
- package/with-hint/positioning-hint.d.ts +1 -1
- package/with-hint/positioning-hint.js +2 -2
- package/with-tooltip/index.d.ts +2 -1
- package/with-tooltip/index.js +1 -0
- package/with-tooltip/utils.d.ts +2 -2
- package/_internal/body-scroll.d.ts +0 -23
- package/_internal/body-scroll.js +0 -41
- package/_internal/checkbox/index.d.ts +0 -5
- package/constants.d.ts +0 -6
- package/constants.js +0 -9
- package/nav-bar/index.d.ts +0 -46
- package/nav-bar/index.js +0 -76
- package/nav-bar/nav-bar.module.scss +0 -95
- package/upload/area.d.ts +0 -25
- package/upload/area.js +0 -65
- package/upload/area.module.scss +0 -44
- package/upload/utils.d.ts +0 -29
- package/upload/utils.js +0 -45
- /package/_internal/{checkbox/index.js → page-scroll-lock/types.js} +0 -0
- /package/{hint → hint-deprecated}/hint.module.scss +0 -0
- /package/{select → select-deprecated}/select.module.scss +0 -0
- /package/{upload → upload-area}/upload.svg +0 -0
package/price/utils.js
CHANGED
|
@@ -8,30 +8,30 @@ exports.formatFractional = exports.formatInteger = exports.formatPrice = void 0;
|
|
|
8
8
|
* @param options Опции.
|
|
9
9
|
* @return Отформатированная цена.
|
|
10
10
|
*/
|
|
11
|
-
|
|
11
|
+
function formatPrice(value, grapheme, { graphemeBefore } = {}) {
|
|
12
12
|
const number = Number(value);
|
|
13
13
|
return [
|
|
14
14
|
// графема до
|
|
15
15
|
grapheme && graphemeBefore && `${grapheme} `,
|
|
16
16
|
// целая часть
|
|
17
|
-
|
|
17
|
+
formatInteger(number),
|
|
18
18
|
// дробная часть
|
|
19
|
-
Number.isFinite(number) && !Number.isInteger(number) && `,${
|
|
19
|
+
Number.isFinite(number) && !Number.isInteger(number) && `,${formatFractional(number)}`,
|
|
20
20
|
// графема после
|
|
21
21
|
grapheme && !graphemeBefore && ` ${grapheme}`,
|
|
22
22
|
]
|
|
23
23
|
.filter(Boolean)
|
|
24
24
|
.map(s => s.replace(/\s/g, '\u2009')) // заменяем все пробелы на полупробелы
|
|
25
25
|
.join('');
|
|
26
|
-
}
|
|
26
|
+
}
|
|
27
27
|
exports.formatPrice = formatPrice;
|
|
28
|
-
// eslint-disable-next-line require-jsdoc
|
|
29
|
-
|
|
28
|
+
// eslint-disable-next-line require-jsdoc, jsdoc/require-jsdoc
|
|
29
|
+
function formatInteger(value) {
|
|
30
30
|
let result = '0';
|
|
31
31
|
if (Number.isFinite(value)) {
|
|
32
32
|
// если число меньше 0.0001 - округляем до 0.0001
|
|
33
33
|
const valid = value === 0 ? 0 : Math.max(value, 0.0001);
|
|
34
|
-
const integer =
|
|
34
|
+
const integer = toString(valid).replace(/\..*$/g, ''); // все числа до точки
|
|
35
35
|
const separated = [];
|
|
36
36
|
const list = integer.split('');
|
|
37
37
|
while (list.length) {
|
|
@@ -41,23 +41,33 @@ const formatInteger = (value) => {
|
|
|
41
41
|
result = separated.join(' ');
|
|
42
42
|
}
|
|
43
43
|
return result;
|
|
44
|
-
}
|
|
44
|
+
}
|
|
45
45
|
exports.formatInteger = formatInteger;
|
|
46
|
-
// eslint-disable-next-line require-jsdoc
|
|
47
|
-
|
|
48
|
-
let
|
|
46
|
+
// eslint-disable-next-line require-jsdoc, jsdoc/require-jsdoc
|
|
47
|
+
function formatFractional(value) {
|
|
48
|
+
let fractional = '';
|
|
49
49
|
if (Number.isFinite(value) && !Number.isInteger(value)) {
|
|
50
|
-
|
|
51
|
-
// если число меньше 0.0001 - округляем до 0.0001
|
|
52
|
-
result = '0001';
|
|
53
|
-
}
|
|
54
|
-
else if (value < 0.01) {
|
|
55
|
-
result = value.toFixed(4).slice(-4);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
result = value.toFixed(2).slice(-2);
|
|
59
|
-
}
|
|
50
|
+
fractional = toString(value).replace(/^.*\./g, '');
|
|
60
51
|
}
|
|
61
|
-
return
|
|
62
|
-
}
|
|
52
|
+
return fractional;
|
|
53
|
+
}
|
|
63
54
|
exports.formatFractional = formatFractional;
|
|
55
|
+
/**
|
|
56
|
+
* Округляет число и приводит его к строке по дизайн-гайдам цен.
|
|
57
|
+
* @param value Число.
|
|
58
|
+
* @return Отформатированное число.
|
|
59
|
+
*/
|
|
60
|
+
function toString(value) {
|
|
61
|
+
let result;
|
|
62
|
+
if (value <= 0.0001) {
|
|
63
|
+
// если число меньше 0.0001 - округляем до 0.0001
|
|
64
|
+
result = '0.0001';
|
|
65
|
+
}
|
|
66
|
+
else if (value < 0.01) {
|
|
67
|
+
result = value.toFixed(4);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
result = value.toFixed(2);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { InputHTMLAttributes } from 'react';
|
|
2
|
+
import { FieldProps, WithTestId } from '../types';
|
|
3
|
+
export interface RadioButtonProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'>, FieldProps, WithTestId {
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Радио-кнопка.
|
|
7
|
+
* @param props Свойства.
|
|
8
|
+
* @return Элемент.
|
|
9
|
+
*/
|
|
10
|
+
export declare function RadioButton({ style, className, 'data-testid': testId, ...restProps }: RadioButtonProps): JSX.Element;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.RadioButton = void 0;
|
|
18
|
+
const react_1 = __importDefault(require("react"));
|
|
19
|
+
const bind_1 = __importDefault(require("classnames/bind"));
|
|
20
|
+
const radio_button_module_scss_1 = __importDefault(require("./radio-button.module.scss"));
|
|
21
|
+
const cx = bind_1.default.bind(radio_button_module_scss_1.default);
|
|
22
|
+
/**
|
|
23
|
+
* Радио-кнопка.
|
|
24
|
+
* @param props Свойства.
|
|
25
|
+
* @return Элемент.
|
|
26
|
+
*/
|
|
27
|
+
function RadioButton(_a) {
|
|
28
|
+
var { style, className, 'data-testid': testId = 'radio-button' } = _a, restProps = __rest(_a, ["style", "className", 'data-testid']);
|
|
29
|
+
return (react_1.default.createElement("div", { style: style, className: cx('root', className) },
|
|
30
|
+
react_1.default.createElement("input", Object.assign({}, restProps, { type: 'radio', className: cx('input'), "data-testid": testId })),
|
|
31
|
+
react_1.default.createElement("div", { className: cx('circle') })));
|
|
32
|
+
}
|
|
33
|
+
exports.RadioButton = RadioButton;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
@use '../colors';
|
|
2
|
+
|
|
3
|
+
.root {
|
|
4
|
+
display: inline-block;
|
|
5
|
+
position: relative;
|
|
6
|
+
width: 16px;
|
|
7
|
+
height: 16px;
|
|
8
|
+
vertical-align: -0.125em; // не понятно почему, но это значение ставит блок ровно по середине строки
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.circle {
|
|
12
|
+
--radio-border-width: 1px;
|
|
13
|
+
--radio-border-color: #{colors.$basic-gray38};
|
|
14
|
+
--radio-color: #fff;
|
|
15
|
+
display: block;
|
|
16
|
+
pointer-events: none;
|
|
17
|
+
border-radius: 50%;
|
|
18
|
+
width: 100%;
|
|
19
|
+
height: 100%;
|
|
20
|
+
background: var(--radio-color);
|
|
21
|
+
box-shadow: inset 0 0 0 var(--radio-border-width) var(--radio-border-color);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.input {
|
|
25
|
+
position: absolute;
|
|
26
|
+
top: 0;
|
|
27
|
+
left: 0;
|
|
28
|
+
width: 100%;
|
|
29
|
+
margin: 0;
|
|
30
|
+
height: 100%;
|
|
31
|
+
opacity: 0;
|
|
32
|
+
cursor: pointer;
|
|
33
|
+
&:checked + .circle {
|
|
34
|
+
--radio-border-width: 6px;
|
|
35
|
+
--radio-border-color: #{colors.$basic-blue};
|
|
36
|
+
}
|
|
37
|
+
&:not(:checked):disabled + .circle {
|
|
38
|
+
--radio-border-color: #{colors.$basic-gray24};
|
|
39
|
+
--radio-color: #{colors.$basic-gray4};
|
|
40
|
+
}
|
|
41
|
+
&:checked:disabled + .circle {
|
|
42
|
+
--radio-border-width: 6px;
|
|
43
|
+
--radio-border-color: #{colors.$basic-gray24};
|
|
44
|
+
--radio-color: #{colors.$basic-gray4};
|
|
45
|
+
}
|
|
46
|
+
}
|
package/rating/index.d.ts
CHANGED
package/rating/types.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type StarType = 'full' | 'half' | 'empty';
|
package/readme.md
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
## Использование
|
|
6
6
|
|
|
7
|
-
Установка
|
|
7
|
+
### Установка
|
|
8
|
+
|
|
8
9
|
```bash
|
|
9
10
|
# npm
|
|
10
11
|
npm i -S @sima-land/ui-nucleons
|
|
@@ -13,22 +14,28 @@ npm i -S @sima-land/ui-nucleons
|
|
|
13
14
|
yarn add @sima-land/ui-nucleons
|
|
14
15
|
```
|
|
15
16
|
|
|
16
|
-
### Настройка
|
|
17
|
+
### Настройка среды
|
|
18
|
+
|
|
17
19
|
Компоненты библиотеки используют:
|
|
20
|
+
|
|
21
|
+
- импорты изображений (jpg, png..) как url/src
|
|
18
22
|
- импорты стилей
|
|
19
23
|
- импорты стилей как css-модулей (каждый такой файл промаркирован в виде `%filename%.module.scss`)
|
|
20
24
|
- импорты svg-файлов как react-компоненты
|
|
21
25
|
|
|
22
26
|
#### Для работы с Webpack необходимо (как вариант):
|
|
27
|
+
|
|
23
28
|
- добавить необходимые пакеты `@svgr/*`
|
|
24
29
|
- сконфигурировать обработку svg, css, scss файлов
|
|
25
30
|
|
|
26
|
-
#####
|
|
31
|
+
##### Зависимости
|
|
32
|
+
|
|
27
33
|
```bash
|
|
28
|
-
npm install --save-dev @svgr/core @svgr/plugin-svgo @svgr/webpack
|
|
34
|
+
npm install --save-dev @svgr/core @svgr/plugin-jsx @svgr/plugin-svgo @svgr/webpack
|
|
29
35
|
```
|
|
30
36
|
|
|
31
|
-
##### Конфигурация
|
|
37
|
+
##### Конфигурация
|
|
38
|
+
|
|
32
39
|
```js
|
|
33
40
|
// webpack.config.js
|
|
34
41
|
const svgrOptions = require('../../svgr.config'); // опции SVGR (скопировать из данного проекта)
|
|
@@ -36,7 +43,7 @@ const svgrOptions = require('../../svgr.config'); // опции SVGR (скопи
|
|
|
36
43
|
module.exports = {
|
|
37
44
|
module: {
|
|
38
45
|
rules: [
|
|
39
|
-
//
|
|
46
|
+
// svg
|
|
40
47
|
{
|
|
41
48
|
test: /\.svg$/,
|
|
42
49
|
use: [
|
|
@@ -47,30 +54,20 @@ module.exports = {
|
|
|
47
54
|
],
|
|
48
55
|
},
|
|
49
56
|
|
|
50
|
-
//
|
|
57
|
+
// стилей
|
|
51
58
|
{
|
|
52
59
|
test: /\.(css|scss)$/,
|
|
53
|
-
exclude: /\.module\.(css|scss)$/,
|
|
54
|
-
use: [
|
|
55
|
-
'css-loader',
|
|
56
|
-
'postcss-loader',
|
|
57
|
-
],
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
// обработка css-модулей
|
|
61
|
-
{
|
|
62
|
-
test: /\.module\.(css|scss)$/,
|
|
63
60
|
use: [
|
|
61
|
+
// ...здесь style-loader, mini-css-extract-plugin или что-то другое
|
|
64
62
|
{
|
|
65
63
|
loader: 'css-loader',
|
|
66
64
|
options: {
|
|
67
65
|
modules: {
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
auto: /\.module\.(css|scss)$/,
|
|
67
|
+
localIdentName: '[name]__[local]--[hash:hex:3]',
|
|
70
68
|
},
|
|
71
69
|
},
|
|
72
70
|
},
|
|
73
|
-
'postcss-loader',
|
|
74
71
|
'sass-loader',
|
|
75
72
|
],
|
|
76
73
|
},
|
|
@@ -81,47 +78,50 @@ module.exports = {
|
|
|
81
78
|
|
|
82
79
|
#### Для работы с Jest необходимо (как вариант):
|
|
83
80
|
|
|
81
|
+
- добавить необходимые пакеты `@svgr/*`
|
|
82
|
+
- сконфигурировать обработку svg, css, scss файлов
|
|
83
|
+
|
|
84
84
|
##### Добавить обработку SVG
|
|
85
85
|
|
|
86
86
|
- добавить файл "трансформера" вида:
|
|
87
|
+
|
|
87
88
|
```js
|
|
88
89
|
const babel = require('@babel/core');
|
|
89
|
-
const
|
|
90
|
-
const svgr = require('@svgr/core')
|
|
91
|
-
const
|
|
90
|
+
const babelConfig = require('../../babel.config');
|
|
91
|
+
const svgr = require('@svgr/core');
|
|
92
|
+
const svgrConfig = require('../../svgr.config');
|
|
92
93
|
|
|
93
94
|
module.exports = {
|
|
94
|
-
process
|
|
95
|
-
const code = svgr.sync(
|
|
95
|
+
process(sourceText, sourcePath) {
|
|
96
|
+
const code = svgr.transform.sync(sourceText, svgrConfig, { filePath: sourcePath });
|
|
96
97
|
|
|
97
|
-
return babel.transformSync(code, {
|
|
98
|
-
filename,
|
|
99
|
-
presets: [babelJestPreset],
|
|
100
|
-
}).code;
|
|
98
|
+
return babel.transformSync(code, { filename: sourcePath, ...babelConfig });
|
|
101
99
|
},
|
|
102
100
|
};
|
|
103
101
|
```
|
|
102
|
+
|
|
104
103
|
- задействовать его в конфигурации Jest
|
|
105
104
|
|
|
106
105
|
##### Добавить поддержку стилей
|
|
107
106
|
|
|
108
107
|
В конфигурации Jest:
|
|
108
|
+
|
|
109
109
|
```js
|
|
110
110
|
module.exports = {
|
|
111
111
|
transform: {
|
|
112
|
-
// svg
|
|
113
|
-
'\\.svg$': '<rootDir
|
|
112
|
+
// svg как react-компоненты
|
|
113
|
+
'\\.svg$': '<rootDir>/.jest/transforms/svg.js',
|
|
114
114
|
|
|
115
|
-
//
|
|
116
|
-
'\\.module\\.(css|scss)$': '
|
|
115
|
+
// обычный css
|
|
116
|
+
'(?<!(\\.module))\\.(css|scss)$': './transformer/empty.js',
|
|
117
117
|
|
|
118
|
-
//
|
|
119
|
-
|
|
120
|
-
moduleNameMapper: {
|
|
121
|
-
// обычные стили делаем просто пустыми модулями
|
|
122
|
-
'(?<!(.+\\.module))(\\.css|\\.scss)$': '<rootDir>/jest/mocks/style.js',
|
|
118
|
+
// css-модули
|
|
119
|
+
'\\.module\\.(css|scss)$': 'jest-css-modules-transform',
|
|
123
120
|
},
|
|
124
|
-
|
|
121
|
+
transformIgnorePatterns: [
|
|
122
|
+
// в пакете содержится css-модули, поэтому игнорируем только скрипты
|
|
123
|
+
'/node_modules/.+js$',
|
|
124
|
+
],
|
|
125
125
|
// ...
|
|
126
126
|
};
|
|
127
127
|
```
|
|
@@ -154,39 +154,30 @@ declare module '*.svg' {
|
|
|
154
154
|
|
|
155
155
|
### Принципы библиотеки
|
|
156
156
|
|
|
157
|
-
- в библиотеке не должно быть HOC (компонентов высшего порядка -
|
|
157
|
+
- в библиотеке не должно быть HOC (компонентов высшего порядка - функций, возвращающих компонент)
|
|
158
158
|
- компонент интерфейса не должен иметь внешних отступов по умолчанию
|
|
159
159
|
|
|
160
|
-
### Консольные команды, необходимые в процессе разработки
|
|
161
|
-
* ```npm run build``` - сборка компонентов в `./build` для публикации
|
|
162
|
-
* ```npm run test``` - запуск тестов *Jest*
|
|
163
|
-
* ```npm run lint:scripts``` - запуск линтера *ESLint*
|
|
164
|
-
* ```npm run lint:styles``` - запуск линтера *styleLint*
|
|
165
|
-
* ```npm run type-check``` - Проверка типов TS
|
|
166
|
-
* ```npm run storybook``` - запуск *storybook*
|
|
167
|
-
|
|
168
160
|
### Структура библиотеки
|
|
169
161
|
|
|
170
162
|
`src/` - директория со всеми компонентами библиотеки
|
|
171
|
-
* `something/` - директория с компонентом
|
|
172
|
-
* `__stories__/`
|
|
173
|
-
* `index.stories.tsx` - описание компонента для storybook
|
|
174
|
-
* `__test__/`
|
|
175
|
-
* `index.test.tsx` - unit-тесты
|
|
176
|
-
* `index.tsx` - файл, с именованными экспортами компонента и интерфейса
|
|
177
|
-
* `helpers/` - общие вспомогательные функции (для использования вне библиотеки)
|
|
178
|
-
* `hooks/` - общие react-хуки (для использования вне библиотеки)
|
|
179
|
-
* `_internal/` - внутренние скрипты для использования только в рамках данной библиотеки
|
|
180
163
|
|
|
181
|
-
|
|
164
|
+
- `something/` - директория с компонентом
|
|
165
|
+
- `__stories__/`
|
|
166
|
+
- `index.stories.tsx` - описание компонента для storybook
|
|
167
|
+
- `__test__/`
|
|
168
|
+
- `index.test.tsx` - unit-тесты
|
|
169
|
+
- `index.tsx` - файл, с именованными экспортами компонента и интерфейса
|
|
170
|
+
- `helpers/` - общие вспомогательные функции (для использования вне библиотеки)
|
|
171
|
+
- `hooks/` - общие react-хуки (для использования вне библиотеки)
|
|
172
|
+
- `_internal/` - внутренние скрипты для использования только в рамках данной библиотеки
|
|
182
173
|
|
|
183
|
-
|
|
174
|
+
### Тестирование
|
|
184
175
|
|
|
185
|
-
|
|
186
|
-
- `--offsetTop`: используется как позиция верхней границы визуального viewport'а
|
|
176
|
+
Локально E2E-тесты должны запускаться через docker, пример:
|
|
187
177
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
178
|
+
```bash
|
|
179
|
+
docker run --rm --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.29.2-focal /bin/bash
|
|
180
|
+
npx playwright test
|
|
181
|
+
```
|
|
191
182
|
|
|
192
|
-
|
|
183
|
+
В противном случае скриншотные тесты не будут совпадать из-за разницы окружения запуска.
|
package/screen/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ScreenInnerProps } from './utils';
|
|
3
|
-
|
|
3
|
+
import { WithPageScrollLock } from '../_internal/page-scroll-lock';
|
|
4
|
+
export interface ScreenProps extends ScreenInnerProps, WithPageScrollLock {
|
|
4
5
|
/** Содержимое. */
|
|
5
6
|
children?: React.ReactNode;
|
|
6
7
|
/** Определяет область отображаемую как загружающуюся. */
|
|
@@ -10,11 +11,12 @@ export interface ScreenProps extends ScreenInnerProps {
|
|
|
10
11
|
}
|
|
11
12
|
/**
|
|
12
13
|
* Экран.
|
|
14
|
+
* @deprecated На адаптивных страницах стоит использовать Modal.
|
|
13
15
|
* @param props Свойства.
|
|
14
16
|
* @return Элемент.
|
|
15
17
|
*/
|
|
16
18
|
export declare const Screen: {
|
|
17
|
-
({ children, loading, loadingArea, loadingOverlayProps, onFullScroll, fullScrollThreshold, "data-testid": testId, }: ScreenProps): JSX.Element;
|
|
19
|
+
({ children, loading, loadingArea, loadingOverlayProps, onFullScroll, fullScrollThreshold, withScrollDisable, scrollDisableOptions, "data-testid": testId, }: ScreenProps): JSX.Element;
|
|
18
20
|
Header: ({ divided, title, subtitle, buttons, onBack, onClose, ...restProps }: import("./slots").HeaderSlotProps) => JSX.Element;
|
|
19
21
|
Body: React.ForwardRefExoticComponent<{
|
|
20
22
|
children?: React.ReactNode;
|
package/screen/index.js
CHANGED
|
@@ -1,21 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
27
|
};
|
|
5
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
29
|
exports.Screen = void 0;
|
|
7
|
-
const react_1 =
|
|
30
|
+
const react_1 = __importStar(require("react"));
|
|
8
31
|
const slots_1 = require("./slots");
|
|
9
32
|
const layer_1 = require("../helpers/layer");
|
|
10
33
|
const define_slots_1 = require("../helpers/define-slots");
|
|
11
34
|
const utils_1 = require("./utils");
|
|
12
35
|
const screen_module_scss_1 = __importDefault(require("./screen.module.scss"));
|
|
36
|
+
const styles_1 = require("../hooks/styles");
|
|
13
37
|
/**
|
|
14
38
|
* Экран.
|
|
39
|
+
* @deprecated На адаптивных страницах стоит использовать Modal.
|
|
15
40
|
* @param props Свойства.
|
|
16
41
|
* @return Элемент.
|
|
17
42
|
*/
|
|
18
|
-
const Screen = ({ children, loading, loadingArea = 'full', loadingOverlayProps, onFullScroll, fullScrollThreshold = 320, 'data-testid': testId = 'screen', }) => {
|
|
43
|
+
const Screen = ({ children, loading, loadingArea = 'full', loadingOverlayProps, onFullScroll, fullScrollThreshold = 320, withScrollDisable, scrollDisableOptions, 'data-testid': testId = 'screen', }) => {
|
|
19
44
|
const fullLoading = loading && loadingArea === 'full';
|
|
20
45
|
const layer = (0, layer_1.useLayer)() + 300; // 300 из-за монолита
|
|
21
46
|
const { header, body, footer } = (0, define_slots_1.defineSlots)(children, {
|
|
@@ -23,10 +48,14 @@ const Screen = ({ children, loading, loadingArea = 'full', loadingOverlayProps,
|
|
|
23
48
|
body: slots_1.BodySlot,
|
|
24
49
|
footer: slots_1.FooterSlot,
|
|
25
50
|
});
|
|
51
|
+
const rootRef = (0, react_1.useRef)(null);
|
|
52
|
+
(0, styles_1.useViewportHeightUnit)(rootRef);
|
|
26
53
|
if (!body) {
|
|
27
54
|
throw Error('Looks like you are trying to render <Screen /> without <Screen.Body /> slot, but it is required');
|
|
28
55
|
}
|
|
29
|
-
return (react_1.default.createElement("div", { className: screen_module_scss_1.default.root, style: {
|
|
56
|
+
return (react_1.default.createElement("div", { ref: rootRef, className: screen_module_scss_1.default.root, style: {
|
|
57
|
+
zIndex: layer, // z-index именно здесь из-за position: fixed
|
|
58
|
+
}, "data-testid": testId },
|
|
30
59
|
react_1.default.createElement(layer_1.LayerProvider, { value: layer },
|
|
31
60
|
!fullLoading && header,
|
|
32
61
|
react_1.default.createElement(utils_1.ScreenContext.Provider, { value: {
|
|
@@ -34,6 +63,8 @@ const Screen = ({ children, loading, loadingArea = 'full', loadingOverlayProps,
|
|
|
34
63
|
loadingOverlayProps,
|
|
35
64
|
onFullScroll,
|
|
36
65
|
fullScrollThreshold,
|
|
66
|
+
withScrollDisable,
|
|
67
|
+
scrollDisableOptions,
|
|
37
68
|
} }, body),
|
|
38
69
|
!fullLoading && footer && (react_1.default.createElement("div", { className: screen_module_scss_1.default.footer, "data-testid": 'screen:footer' }, footer)))));
|
|
39
70
|
};
|
package/screen/slots.d.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
export interface HeaderSlotProps extends
|
|
4
|
-
/** Нужна ли разделительная полоса внизу шапки экрана. */
|
|
5
|
-
divided?: boolean;
|
|
6
|
-
/** Заголовок. */
|
|
7
|
-
title?: string;
|
|
8
|
-
/** Подзаголовок. */
|
|
9
|
-
subtitle?: string;
|
|
2
|
+
import { TopBarProps } from '../top-bar';
|
|
3
|
+
export interface HeaderSlotProps extends TopBarProps {
|
|
10
4
|
/** Будет вызвана при нажатии на кнопку-стрелку. */
|
|
11
5
|
onBack?: () => void;
|
|
12
6
|
/** Будет вызвана при нажатии на кнопку-крести. */
|
package/screen/slots.js
CHANGED
|
@@ -39,16 +39,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
40
|
exports.FooterSlot = exports.BodySlot = exports.HeaderSlot = void 0;
|
|
41
41
|
const react_1 = __importStar(require("react"));
|
|
42
|
-
const nav_bar_1 = require("../nav-bar");
|
|
43
42
|
const lodash_1 = require("lodash");
|
|
44
43
|
const arrow_left_1 = __importDefault(require("@sima-land/ui-quarks/icons/24x24/Stroked/arrow-left"));
|
|
45
44
|
const cross_1 = __importDefault(require("@sima-land/ui-quarks/icons/24x24/Stroked/cross"));
|
|
46
|
-
const
|
|
45
|
+
const page_scroll_lock_1 = require("../_internal/page-scroll-lock");
|
|
47
46
|
const hooks_1 = require("../hooks");
|
|
48
47
|
const loading_overlay_1 = require("../loading-overlay");
|
|
49
48
|
const utils_1 = require("./utils");
|
|
50
49
|
const screen_module_scss_1 = __importDefault(require("./screen.module.scss"));
|
|
51
|
-
const
|
|
50
|
+
const top_bar_1 = require("../top-bar");
|
|
52
51
|
/**
|
|
53
52
|
* Слот шапки экрана.
|
|
54
53
|
* @param props Свойства.
|
|
@@ -56,11 +55,11 @@ const constants_1 = require("../constants");
|
|
|
56
55
|
*/
|
|
57
56
|
const HeaderSlot = (_a) => {
|
|
58
57
|
var { divided, title, subtitle, buttons, onBack, onClose } = _a, restProps = __rest(_a, ["divided", "title", "subtitle", "buttons", "onBack", "onClose"]);
|
|
59
|
-
return (react_1.default.createElement(
|
|
58
|
+
return (react_1.default.createElement(top_bar_1.TopBar, Object.assign({}, restProps, { size: 's', title: title, subtitle: subtitle, divided: divided, buttons: Object.assign(Object.assign({}, buttons), { start: onBack
|
|
60
59
|
? {
|
|
61
60
|
// ВАЖНО: не подмешиваем свойства из buttons.start
|
|
62
61
|
// чтобы не распылять конфигурацию одной и той же кнопки по нескольким местам
|
|
63
|
-
icon: arrow_left_1.default,
|
|
62
|
+
icon: react_1.default.createElement(arrow_left_1.default, null),
|
|
64
63
|
onClick: onBack,
|
|
65
64
|
'aria-label': 'Вернуться назад',
|
|
66
65
|
'data-testid': 'screen:back',
|
|
@@ -69,7 +68,7 @@ const HeaderSlot = (_a) => {
|
|
|
69
68
|
? {
|
|
70
69
|
// ВАЖНО: не подмешиваем свойства из buttons.end
|
|
71
70
|
// чтобы не распылять конфигурацию одной и той же кнопки по нескольким местам
|
|
72
|
-
icon: cross_1.default,
|
|
71
|
+
icon: react_1.default.createElement(cross_1.default, null),
|
|
73
72
|
onClick: onClose,
|
|
74
73
|
'aria-label': `Закрыть ${title || ''}`.trim(),
|
|
75
74
|
'data-testid': 'screen:close',
|
|
@@ -81,17 +80,17 @@ exports.HeaderSlot = HeaderSlot;
|
|
|
81
80
|
* Слот основного контента экрана.
|
|
82
81
|
*/
|
|
83
82
|
exports.BodySlot = (0, react_1.forwardRef)(function BodySlot({ children }, outerRef) {
|
|
84
|
-
const { loading, loadingOverlayProps, onFullScroll, fullScrollThreshold } = (0, react_1.useContext)(utils_1.ScreenContext);
|
|
83
|
+
const { loading, loadingOverlayProps, onFullScroll, fullScrollThreshold, withScrollDisable, scrollDisableOptions, } = (0, react_1.useContext)(utils_1.ScreenContext);
|
|
85
84
|
// при блокировке прокрутки нужно передавать элемент, которому нужно сохранить возможность прокрутки
|
|
86
85
|
// https://github.com/willmcpo/body-scroll-lock/blame/79c4cf2c956eb7d5cf8d54a03d12751bc6ac8aa3/README.md#L52
|
|
87
86
|
// поэтому используем внутренний ref и useImperativeHandle
|
|
88
87
|
const ref = (0, react_1.useRef)(null);
|
|
89
88
|
(0, react_1.useImperativeHandle)(outerRef, () => ref.current);
|
|
90
|
-
(0,
|
|
89
|
+
(0, page_scroll_lock_1.usePageScrollLock)(ref, Object.assign({ lockEnabled: withScrollDisable }, scrollDisableOptions));
|
|
91
90
|
(0, hooks_1.useInfiniteScroll)(ref, { onFullScroll, threshold: fullScrollThreshold });
|
|
92
91
|
return (
|
|
93
92
|
// ВАЖНО: элемент с ref должен выводиться всегда (без условий), т.к. он нужен для блокировки прокрутки
|
|
94
|
-
react_1.default.createElement("div",
|
|
93
|
+
react_1.default.createElement("div", { ref: ref, className: screen_module_scss_1.default.body, "data-testid": 'screen:body' }, loading ? (react_1.default.createElement(loading_overlay_1.LoadingOverlay, Object.assign({}, loadingOverlayProps, { fill: false, style: { height: '100%' } }))) : (children)));
|
|
95
94
|
});
|
|
96
95
|
/**
|
|
97
96
|
* Слот футера экрана.
|
package/screen/utils.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { LoadingOverlayProps } from '../loading-overlay';
|
|
3
|
-
|
|
3
|
+
import { WithPageScrollLock } from '../_internal/page-scroll-lock';
|
|
4
|
+
export interface ScreenInnerProps extends WithPageScrollLock {
|
|
4
5
|
/** Нужно ли выводить вместо содержимого состояние загрузки. */
|
|
5
6
|
loading?: boolean;
|
|
6
7
|
/** Свойства компонента LoadingOverlay. */
|
package/select/index.d.ts
CHANGED
|
@@ -1,33 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
declare type Size = 's' | 'm' | 'l' | 'xl';
|
|
4
|
-
export interface SelectProps extends Omit<TextFieldProps, 'style' | 'endAdornment'> {
|
|
5
|
-
/** Нужно ли выводить состояние загрузки списка. */
|
|
6
|
-
loading?: boolean;
|
|
7
|
-
/** Сработает при открытии/закрытии меню. */
|
|
8
|
-
onMenuToggle?: (opened: boolean) => void;
|
|
9
|
-
/** Сработает при выборе. */
|
|
10
|
-
onSelect?: (option: any) => void;
|
|
11
|
-
/** Список опций. */
|
|
12
|
-
options: any[];
|
|
13
|
-
/** Размер для DropdownItem. */
|
|
14
|
-
optionSize?: Size;
|
|
15
|
-
/** Вернет содержимое опции. */
|
|
16
|
-
renderOption?: (option: any) => React.ReactNode;
|
|
17
|
-
/** Стили. */
|
|
18
|
-
style?: React.CSSProperties;
|
|
19
|
-
endAdornment?: TextFieldProps['endAdornment'] | ((opened: boolean) => React.ReactNode);
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Выводит иконку стрелки для поля Select по умолчанию.
|
|
23
|
-
* @param opened Открыт ли список опций.
|
|
24
|
-
* @return Элемент.
|
|
25
|
-
*/
|
|
26
|
-
export declare const renderDefaultArrow: (opened: boolean) => JSX.Element;
|
|
27
|
-
/**
|
|
28
|
-
* Поле выбора из списка.
|
|
29
|
-
* @param props Свойства.
|
|
30
|
-
* @return Элемент.
|
|
31
|
-
*/
|
|
32
|
-
export declare const Select: ({ options, optionSize, onSelect, style, className, label, onClick, value, loading, onMenuToggle, renderOption, "data-testid": dataTestId, size, endAdornment, ...restProps }: SelectProps) => JSX.Element;
|
|
33
|
-
export {};
|
|
1
|
+
export type { SelectProps, SelectStyle } from './types';
|
|
2
|
+
export { Select } from './select';
|