@invoicebox/ui 0.1.0-alpha.326 → 0.1.0-alpha.328

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/components/common/AdaptiveModalDrawer/index.d.ts +11 -0
  2. package/dist/components/common/AdaptiveModalDrawer/index.js +31 -0
  3. package/dist/components/common/AdaptiveModalDrawer/index.stories.d.ts +5 -0
  4. package/dist/components/common/AdaptiveModalDrawer/index.stories.js +44 -0
  5. package/dist/components/common/Modal/assets/CollapseIcon.d.ts +1 -0
  6. package/dist/components/common/Modal/assets/CollapseIcon.js +42 -0
  7. package/dist/components/common/Modal/assets/ExpandIcon.d.ts +1 -0
  8. package/dist/components/common/Modal/assets/ExpandIcon.js +42 -0
  9. package/dist/components/common/Modal/context.d.ts +9 -0
  10. package/dist/components/common/Modal/context.js +14 -0
  11. package/dist/components/common/Modal/index.d.ts +15 -0
  12. package/dist/components/common/Modal/index.js +165 -0
  13. package/dist/components/common/Modal/index.stories.d.ts +6 -0
  14. package/dist/components/common/Modal/index.stories.js +76 -0
  15. package/dist/components/common/Modal/palette.d.ts +9 -0
  16. package/dist/components/common/Modal/palette.js +23 -0
  17. package/dist/components/common/Modal/styles.d.ts +25 -0
  18. package/dist/components/common/Modal/styles.js +69 -0
  19. package/dist/components/common/Skeleton/index.d.ts +16 -2
  20. package/dist/components/common/Skeleton/index.js +19 -2
  21. package/dist/components/common/Skeleton/index.stories.d.ts +4 -0
  22. package/dist/components/common/Skeleton/index.stories.js +42 -1
  23. package/dist/components/common/Skeleton/styles.d.ts +2 -0
  24. package/dist/components/common/Skeleton/styles.js +18 -9
  25. package/dist/components/common/WentWrongModal/assets/icons.d.ts +3 -0
  26. package/dist/components/common/WentWrongModal/assets/icons.js +84 -0
  27. package/dist/components/common/WentWrongModal/assets/racoonImage.d.ts +1 -0
  28. package/dist/components/common/WentWrongModal/assets/racoonImage.js +9 -0
  29. package/dist/components/common/WentWrongModal/index.d.ts +23 -0
  30. package/dist/components/common/WentWrongModal/index.js +193 -0
  31. package/dist/components/common/WentWrongModal/index.stories.d.ts +6 -0
  32. package/dist/components/common/WentWrongModal/index.stories.js +60 -0
  33. package/dist/components/common/WentWrongModal/index.test.d.ts +1 -0
  34. package/dist/components/common/WentWrongModal/index.test.js +209 -0
  35. package/dist/components/common/WentWrongModal/palette.d.ts +11 -0
  36. package/dist/components/common/WentWrongModal/palette.js +22 -0
  37. package/dist/components/common/WentWrongModal/styles.d.ts +24 -0
  38. package/dist/components/common/WentWrongModal/styles.js +88 -0
  39. package/dist/components/form/Select/index.js +11 -3
  40. package/dist/esm/components/common/AdaptiveModalDrawer/index.js +24 -0
  41. package/dist/esm/components/common/AdaptiveModalDrawer/index.stories.js +37 -0
  42. package/dist/esm/components/common/Modal/assets/CollapseIcon.js +35 -0
  43. package/dist/esm/components/common/Modal/assets/ExpandIcon.js +35 -0
  44. package/dist/esm/components/common/Modal/context.js +8 -0
  45. package/dist/esm/components/common/Modal/index.js +147 -0
  46. package/dist/esm/components/common/Modal/index.stories.js +69 -0
  47. package/dist/esm/components/common/Modal/palette.js +16 -0
  48. package/dist/esm/components/common/Modal/styles.js +61 -0
  49. package/dist/esm/components/common/Skeleton/index.js +19 -2
  50. package/dist/esm/components/common/Skeleton/index.stories.js +41 -0
  51. package/dist/esm/components/common/Skeleton/styles.js +19 -10
  52. package/dist/esm/components/common/WentWrongModal/assets/icons.js +77 -0
  53. package/dist/esm/components/common/WentWrongModal/assets/racoonImage.js +3 -0
  54. package/dist/esm/components/common/WentWrongModal/index.js +186 -0
  55. package/dist/esm/components/common/WentWrongModal/index.stories.js +53 -0
  56. package/dist/esm/components/common/WentWrongModal/index.test.js +208 -0
  57. package/dist/esm/components/common/WentWrongModal/palette.js +15 -0
  58. package/dist/esm/components/common/WentWrongModal/styles.js +81 -0
  59. package/dist/esm/components/form/Select/index.js +11 -2
  60. package/dist/esm/index.js +3 -1
  61. package/dist/esm/palette/context.js +5 -1
  62. package/dist/esm/palette/provider.js +5 -1
  63. package/dist/index.d.ts +6 -0
  64. package/dist/index.js +39 -0
  65. package/dist/palette/context.d.ts +4 -0
  66. package/dist/palette/context.js +5 -1
  67. package/dist/palette/provider.js +5 -1
  68. package/dist/palette/usePalette.d.ts +2 -0
  69. package/package.json +1 -1
  70. package/dist/components/form/Select/components/Loader/index.d.ts +0 -2
  71. package/dist/components/form/Select/components/Loader/index.js +0 -25
  72. package/dist/components/form/Select/components/Loader/styles.d.ts +0 -4
  73. package/dist/components/form/Select/components/Loader/styles.js +0 -20
  74. package/dist/esm/components/form/Select/components/Loader/index.js +0 -16
  75. package/dist/esm/components/form/Select/components/Loader/styles.js +0 -13
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Title = exports.RequestIdWrapper = exports.RequestIdValue = exports.ModalInner = exports.Header = exports.Description = exports.CopyText = exports.CopiedStatus = exports.Content = exports.Contacts = exports.ContactItem = exports.ButtonCopyCode = void 0;
7
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
8
+ var _breakpoints = require("../../../breakpoints");
9
+ var _Typography = require("../Typography");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
11
+ var ModalInner = exports.ModalInner = _styledComponents["default"].div.withConfig({
12
+ displayName: "styles__ModalInner",
13
+ componentId: "sc-1sxwtvv-0"
14
+ })(["width:624px;color:", ";@media ", "{width:100%;}"], function (_ref) {
15
+ var $palette = _ref.$palette;
16
+ return $palette.text;
17
+ }, _breakpoints.breakpoints.md);
18
+ var Header = exports.Header = _styledComponents["default"].div.withConfig({
19
+ displayName: "styles__Header",
20
+ componentId: "sc-1sxwtvv-1"
21
+ })(["height:171px;background:url(", ") no-repeat center bottom,", ";background-size:184px;@media ", "{background-size:163px;}"], function (_ref2) {
22
+ var $image = _ref2.$image;
23
+ return $image;
24
+ }, function (_ref3) {
25
+ var $palette = _ref3.$palette;
26
+ return $palette.headerBg;
27
+ }, _breakpoints.breakpoints.sm);
28
+ var Content = exports.Content = _styledComponents["default"].div.withConfig({
29
+ displayName: "styles__Content",
30
+ componentId: "sc-1sxwtvv-2"
31
+ })(["padding:30px;text-align:center;@media ", "{padding:24px 16px 32px;}"], _breakpoints.breakpoints.sm);
32
+ var Title = exports.Title = (0, _styledComponents["default"])(_Typography.Typography).withConfig({
33
+ displayName: "styles__Title",
34
+ componentId: "sc-1sxwtvv-3"
35
+ })(["margin-bottom:12px;"]);
36
+ var Description = exports.Description = (0, _styledComponents["default"])(_Typography.Typography).withConfig({
37
+ displayName: "styles__Description",
38
+ componentId: "sc-1sxwtvv-4"
39
+ })(["margin-bottom:24px;color:", ";@media ", "{margin-bottom:16px;}"], function (_ref4) {
40
+ var $palette = _ref4.$palette;
41
+ return $palette.description;
42
+ }, _breakpoints.breakpoints.sm);
43
+ var Contacts = exports.Contacts = _styledComponents["default"].div.withConfig({
44
+ displayName: "styles__Contacts",
45
+ componentId: "sc-1sxwtvv-5"
46
+ })(["display:flex;align-items:center;gap:12px;justify-content:center;margin-bottom:", ";@media ", "{flex-direction:column;gap:0;}"], function (_ref5) {
47
+ var $marginBottom = _ref5.$marginBottom;
48
+ return $marginBottom;
49
+ }, _breakpoints.breakpoints.sm);
50
+ var ContactItem = exports.ContactItem = _styledComponents["default"].a.withConfig({
51
+ displayName: "styles__ContactItem",
52
+ componentId: "sc-1sxwtvv-6"
53
+ })(["padding:8px 16px 8px 12px;display:flex;align-items:center;gap:8px;color:inherit;text-decoration:none;@media ", "{gap:6px;}"], _breakpoints.breakpoints.sm);
54
+ var RequestIdWrapper = exports.RequestIdWrapper = _styledComponents["default"].div.withConfig({
55
+ displayName: "styles__RequestIdWrapper",
56
+ componentId: "sc-1sxwtvv-7"
57
+ })(["margin-bottom:24px;display:flex;justify-content:center;align-items:center;gap:4px;color:", ";"], function (_ref6) {
58
+ var $palette = _ref6.$palette;
59
+ return $palette.requestId;
60
+ });
61
+ var CopyText = exports.CopyText = _styledComponents["default"].div.withConfig({
62
+ displayName: "styles__CopyText",
63
+ componentId: "sc-1sxwtvv-8"
64
+ })(["padding:4px 12px;pointer-events:none;"]);
65
+ var RequestIdValue = exports.RequestIdValue = (0, _styledComponents["default"])(_Typography.Typography).withConfig({
66
+ displayName: "styles__RequestIdValue",
67
+ componentId: "sc-1sxwtvv-9"
68
+ })(["max-width:320px;padding:0;border:none;background:transparent;color:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;&:is(button){cursor:pointer;}&:is(button):hover{background-color:", ";}@media ", "{max-width:200px;}"], function (_ref7) {
69
+ var $palette = _ref7.$palette;
70
+ return $palette.copyValueHoverBg;
71
+ }, _breakpoints.breakpoints.sm);
72
+ var ButtonCopyCode = exports.ButtonCopyCode = _styledComponents["default"].button.withConfig({
73
+ displayName: "styles__ButtonCopyCode",
74
+ componentId: "sc-1sxwtvv-10"
75
+ })(["flex-shrink:0;height:24px;width:24px;padding:0;border:none;border-radius:50%;cursor:pointer;color:", ";background:", ";display:flex;justify-content:center;align-items:center;"], function (_ref8) {
76
+ var $palette = _ref8.$palette;
77
+ return $palette.copyIcon;
78
+ }, function (_ref9) {
79
+ var $palette = _ref9.$palette;
80
+ return $palette.copyButtonBg;
81
+ });
82
+ var CopiedStatus = exports.CopiedStatus = _styledComponents["default"].span.withConfig({
83
+ displayName: "styles__CopiedStatus",
84
+ componentId: "sc-1sxwtvv-11"
85
+ })(["flex-shrink:0;", ""], function (_ref0) {
86
+ var $isVisuallyHidden = _ref0.$isVisuallyHidden;
87
+ return $isVisuallyHidden && "\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n ";
88
+ });
@@ -15,11 +15,10 @@ var _useOutsideClick = require("../../../hooks/useOutsideClick");
15
15
  var _palette = require("../../../palette");
16
16
  var _useOptionGroups = require("./hooks/useOptionGroups");
17
17
  var _Drawer = require("../../common/Drawer");
18
- var _Loader = _interopRequireDefault(require("./components/Loader"));
18
+ var _Skeleton = require("../../common/Skeleton");
19
19
  var _MultipleValue = require("./components/MultipleValue");
20
20
  var _Checkbox = require("../Checkbox");
21
21
  var _ErrorBoundary = require("../../common/ErrorBoundary");
22
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
23
22
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
24
23
  function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
25
24
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -328,7 +327,16 @@ var SelectInner = function SelectInner(props) {
328
327
  variant: 'bodyMRegular',
329
328
  $color: palette.empty
330
329
  }, emptyOptionsLabel || 'Нет значений'));
331
- var loader = /*#__PURE__*/_react["default"].createElement(S.DefaultOptionWrapper, null, /*#__PURE__*/_react["default"].createElement(_Loader["default"], null));
330
+
331
+ // Пока варианты грузятся — плашки на месте вариантов, как у `Autocomplete`
332
+ var loader = /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, [0, 1, 2].map(function (key) {
333
+ return /*#__PURE__*/_react["default"].createElement(S.DefaultOptionWrapper, {
334
+ key: key
335
+ }, /*#__PURE__*/_react["default"].createElement(_Skeleton.Skeleton, {
336
+ height: 20,
337
+ borderRadius: 4
338
+ }));
339
+ }));
332
340
  var handleDropdownContentRender = function handleDropdownContentRender() {
333
341
  if (isLoading) {
334
342
  return loader;
@@ -0,0 +1,24 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ import React from 'react';
3
+ import { useMobile } from '../../../hooks/useMedia';
4
+ import { Drawer } from '../Drawer';
5
+ import { Modal } from '../Modal';
6
+ /** Модалка на десктопе и шторка (Drawer) на мобильных. Скролл фона блокируют сами Modal и Drawer. */
7
+ export var AdaptiveModalDrawer = function AdaptiveModalDrawer(_ref) {
8
+ var children = _ref.children,
9
+ isOpen = _ref.isOpen,
10
+ onClose = _ref.onClose,
11
+ drawerProps = _ref.drawerProps,
12
+ modalProps = _ref.modalProps;
13
+ var isMobile = useMobile();
14
+ if (isMobile) {
15
+ return /*#__PURE__*/React.createElement(Drawer, _extends({
16
+ onClose: onClose,
17
+ isOpen: isOpen
18
+ }, drawerProps), children);
19
+ }
20
+ return /*#__PURE__*/React.createElement(Modal, _extends({
21
+ onClose: onClose,
22
+ isOpen: isOpen
23
+ }, modalProps), children);
24
+ };
@@ -0,0 +1,37 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
3
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
5
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
6
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
7
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
8
+ import React from 'react';
9
+ import { useModal } from '../../../hooks/useModal';
10
+ import { AdaptiveModalDrawer } from '.';
11
+ var meta = {
12
+ title: 'common/AdaptiveModalDrawer',
13
+ component: AdaptiveModalDrawer,
14
+ tags: ['autodocs']
15
+ };
16
+ export default meta;
17
+ export var Default = {
18
+ args: {},
19
+ render: function Render(args) {
20
+ var _useModal = useModal(false),
21
+ _useModal2 = _slicedToArray(_useModal, 3),
22
+ isOpen = _useModal2[0],
23
+ open = _useModal2[1],
24
+ close = _useModal2[2];
25
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("button", {
26
+ type: "button",
27
+ onClick: open
28
+ }, "Open"), /*#__PURE__*/React.createElement(AdaptiveModalDrawer, _extends({}, args, {
29
+ onClose: close,
30
+ isOpen: isOpen
31
+ }), /*#__PURE__*/React.createElement("div", {
32
+ style: {
33
+ padding: 24
34
+ }
35
+ }, "\u041C\u043E\u0434\u0430\u043B\u043A\u0430 \u043D\u0430 \u0434\u0435\u0441\u043A\u0442\u043E\u043F\u0435, \u0448\u0442\u043E\u0440\u043A\u0430 \u043D\u0430 \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u043E\u043C")));
36
+ }
37
+ };
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ export var CollapseIcon = function CollapseIcon() {
3
+ return /*#__PURE__*/React.createElement("svg", {
4
+ width: "20",
5
+ height: "20",
6
+ viewBox: "0 0 24 24",
7
+ fill: "none",
8
+ xmlns: "http://www.w3.org/2000/svg",
9
+ "aria-hidden": true
10
+ }, /*#__PURE__*/React.createElement("path", {
11
+ d: "M20 10H14V4",
12
+ stroke: "currentColor",
13
+ strokeWidth: "1.8",
14
+ strokeLinecap: "round",
15
+ strokeLinejoin: "round"
16
+ }), /*#__PURE__*/React.createElement("path", {
17
+ d: "M4 14H10V20",
18
+ stroke: "currentColor",
19
+ strokeWidth: "1.8",
20
+ strokeLinecap: "round",
21
+ strokeLinejoin: "round"
22
+ }), /*#__PURE__*/React.createElement("path", {
23
+ d: "M14 10L21 3",
24
+ stroke: "currentColor",
25
+ strokeWidth: "1.8",
26
+ strokeLinecap: "round",
27
+ strokeLinejoin: "round"
28
+ }), /*#__PURE__*/React.createElement("path", {
29
+ d: "M10 14L3 21",
30
+ stroke: "currentColor",
31
+ strokeWidth: "1.8",
32
+ strokeLinecap: "round",
33
+ strokeLinejoin: "round"
34
+ }));
35
+ };
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ export var ExpandIcon = function ExpandIcon() {
3
+ return /*#__PURE__*/React.createElement("svg", {
4
+ width: "20",
5
+ height: "20",
6
+ viewBox: "0 0 24 24",
7
+ fill: "none",
8
+ xmlns: "http://www.w3.org/2000/svg",
9
+ "aria-hidden": true
10
+ }, /*#__PURE__*/React.createElement("path", {
11
+ d: "M15 3H21V9",
12
+ stroke: "currentColor",
13
+ strokeWidth: "1.8",
14
+ strokeLinecap: "round",
15
+ strokeLinejoin: "round"
16
+ }), /*#__PURE__*/React.createElement("path", {
17
+ d: "M9 21H3V15",
18
+ stroke: "currentColor",
19
+ strokeWidth: "1.8",
20
+ strokeLinecap: "round",
21
+ strokeLinejoin: "round"
22
+ }), /*#__PURE__*/React.createElement("path", {
23
+ d: "M21 3L14 10",
24
+ stroke: "currentColor",
25
+ strokeWidth: "1.8",
26
+ strokeLinecap: "round",
27
+ strokeLinejoin: "round"
28
+ }), /*#__PURE__*/React.createElement("path", {
29
+ d: "M3 21L10 14",
30
+ stroke: "currentColor",
31
+ strokeWidth: "1.8",
32
+ strokeLinecap: "round",
33
+ strokeLinejoin: "round"
34
+ }));
35
+ };
@@ -0,0 +1,8 @@
1
+ import { createContext, useContext } from 'react';
2
+ export var ModalExpansionContext = /*#__PURE__*/createContext({
3
+ isExpandable: false,
4
+ isExpanded: false
5
+ });
6
+ export var useModalExpansion = function useModalExpansion() {
7
+ return useContext(ModalExpansionContext);
8
+ };
@@ -0,0 +1,147 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
+ import React, { useEffect, useMemo, useRef, useState } from 'react';
8
+ import { createPortal } from 'react-dom';
9
+ import { isDropdownPortalClick } from '../../../hooks/useOutsideClick';
10
+ import { useLockBodyScroll } from '../../../hooks/useLockBodyScroll';
11
+ import { useComponentPalette } from '../../../palette';
12
+ import { ErrorBoundary } from '../ErrorBoundary';
13
+ import { ExpandIcon } from './assets/ExpandIcon';
14
+ import { CollapseIcon } from './assets/CollapseIcon';
15
+ import { ModalExpansionContext } from './context';
16
+ import * as S from './styles';
17
+ var FOCUSABLE_SELECTOR = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
18
+ export var Modal = function Modal(_ref) {
19
+ var onClose = _ref.onClose,
20
+ isOpen = _ref.isOpen,
21
+ children = _ref.children,
22
+ _ref$overflow = _ref.overflow,
23
+ overflow = _ref$overflow === void 0 ? 'auto' : _ref$overflow,
24
+ width = _ref.width,
25
+ isDisabledOutsideClick = _ref.isDisabledOutsideClick,
26
+ isExpandable = _ref.isExpandable;
27
+ var palette = useComponentPalette('modal');
28
+ var contentRef = useRef(null);
29
+ var previousFocusRef = useRef(null);
30
+ var _useState = useState(false),
31
+ _useState2 = _slicedToArray(_useState, 2),
32
+ isExpanded = _useState2[0],
33
+ setIsExpanded = _useState2[1];
34
+ var expansionContextValue = useMemo(function () {
35
+ return {
36
+ isExpandable: Boolean(isExpandable),
37
+ isExpanded: isExpanded
38
+ };
39
+ }, [isExpandable, isExpanded]);
40
+ useLockBodyScroll(isOpen);
41
+ useEffect(function () {
42
+ if (!isOpen) {
43
+ setIsExpanded(false);
44
+ }
45
+ }, [isOpen]);
46
+
47
+ // Фокус переносим в окно при открытии и возвращаем на прежний элемент при закрытии
48
+ useEffect(function () {
49
+ var _contentRef$current;
50
+ if (!isOpen) return undefined;
51
+ previousFocusRef.current = document.activeElement;
52
+ (_contentRef$current = contentRef.current) === null || _contentRef$current === void 0 || _contentRef$current.focus();
53
+ return function () {
54
+ var _previousFocusRef$cur;
55
+ (_previousFocusRef$cur = previousFocusRef.current) === null || _previousFocusRef$cur === void 0 || _previousFocusRef$cur.focus();
56
+ };
57
+ }, [isOpen]);
58
+
59
+ /**
60
+ * Клик вне окна закрывает модалку. Не считаем «снаружи» клики по порталу Dropdown и по другим диалогам
61
+ * поверх неё (role="dialog"): например, Drawer с опциями Select на планшете рендерится порталом в body,
62
+ * и клик по его затемнению иначе закрывал бы и эту модалку.
63
+ */
64
+ useEffect(function () {
65
+ if (!isOpen || isDisabledOutsideClick) return undefined;
66
+ var handleMouseDown = function handleMouseDown(event) {
67
+ var content = contentRef.current;
68
+ var target = event.target;
69
+ if (!content || !(target instanceof Element) || content.contains(target)) return;
70
+ if (isDropdownPortalClick(target)) return;
71
+ var dialog = target.closest('[role="dialog"]');
72
+ if (dialog && dialog !== content) return;
73
+ onClose();
74
+ };
75
+ document.addEventListener('mousedown', handleMouseDown);
76
+ return function () {
77
+ document.removeEventListener('mousedown', handleMouseDown);
78
+ };
79
+ }, [isOpen, isDisabledOutsideClick, onClose]);
80
+
81
+ // Escape закрывает окно, Tab/Shift+Tab не выпускают фокус за его пределы
82
+ useEffect(function () {
83
+ if (!isOpen) return undefined;
84
+ var handleKeyDown = function handleKeyDown(e) {
85
+ var _document$activeEleme;
86
+ // Поверх открыта другая модалка и фокус в ней — Escape и Tab обрабатывает она, а не эта
87
+ var activeDialog = (_document$activeEleme = document.activeElement) === null || _document$activeEleme === void 0 ? void 0 : _document$activeEleme.closest('[role="dialog"]');
88
+ if (activeDialog && activeDialog !== contentRef.current) return;
89
+ if (e.key === 'Escape') {
90
+ onClose();
91
+ return;
92
+ }
93
+ if (e.key !== 'Tab') return;
94
+ var content = contentRef.current;
95
+ if (!content) return;
96
+ var focusable = Array.from(content.querySelectorAll(FOCUSABLE_SELECTOR));
97
+ if (!focusable.length) {
98
+ e.preventDefault();
99
+ return;
100
+ }
101
+ var first = focusable[0];
102
+ var last = focusable[focusable.length - 1];
103
+ var active = document.activeElement;
104
+ if (e.shiftKey && active === first) {
105
+ e.preventDefault();
106
+ last.focus();
107
+ } else if (!e.shiftKey && (active === last || !content.contains(active))) {
108
+ e.preventDefault();
109
+ first.focus();
110
+ }
111
+ };
112
+ document.addEventListener('keydown', handleKeyDown);
113
+ return function () {
114
+ document.removeEventListener('keydown', handleKeyDown);
115
+ };
116
+ }, [isOpen, onClose]);
117
+ if (!isOpen) return null;
118
+ return /*#__PURE__*/createPortal(/*#__PURE__*/React.createElement(S.Container, null, /*#__PURE__*/React.createElement(S.ContainerInner, {
119
+ $isExpanded: isExpanded
120
+ }, /*#__PURE__*/React.createElement(S.Backdrop, {
121
+ $palette: palette
122
+ }), /*#__PURE__*/React.createElement(S.Content, {
123
+ $palette: palette,
124
+ $overflow: overflow,
125
+ $width: width,
126
+ $isExpandable: isExpandable,
127
+ $isExpanded: isExpanded,
128
+ ref: contentRef,
129
+ role: "dialog",
130
+ "aria-modal": "true",
131
+ tabIndex: -1
132
+ }, isExpandable && /*#__PURE__*/React.createElement(S.ExpandButton, {
133
+ type: "button",
134
+ $palette: palette,
135
+ onClick: function onClick() {
136
+ return setIsExpanded(function (prev) {
137
+ return !prev;
138
+ });
139
+ },
140
+ "aria-label": isExpanded ? 'Свернуть окно' : 'Развернуть окно на весь экран',
141
+ title: isExpanded ? 'Свернуть' : 'Развернуть на весь экран'
142
+ }, isExpanded ? /*#__PURE__*/React.createElement(CollapseIcon, null) : /*#__PURE__*/React.createElement(ExpandIcon, null)), /*#__PURE__*/React.createElement(ModalExpansionContext.Provider, {
143
+ value: expansionContextValue
144
+ }, /*#__PURE__*/React.createElement(ErrorBoundary, null, children))))), document.body);
145
+ };
146
+ export { useModalExpansion } from './context';
147
+ export { modalExpansionFlexItem } from './styles';
@@ -0,0 +1,69 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
3
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
5
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
6
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
7
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
8
+ import React from 'react';
9
+ import { useModal } from '../../../hooks/useModal';
10
+ import { Modal } from '.';
11
+ var meta = {
12
+ title: 'common/Modal',
13
+ component: Modal,
14
+ tags: ['autodocs']
15
+ };
16
+ export default meta;
17
+ export var Default = {
18
+ args: {},
19
+ render: function Render(args) {
20
+ var _useModal = useModal(false),
21
+ _useModal2 = _slicedToArray(_useModal, 3),
22
+ isOpen = _useModal2[0],
23
+ open = _useModal2[1],
24
+ close = _useModal2[2];
25
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("button", {
26
+ type: "button",
27
+ onClick: open
28
+ }, "Open"), /*#__PURE__*/React.createElement(Modal, _extends({}, args, {
29
+ onClose: close,
30
+ isOpen: isOpen
31
+ }), /*#__PURE__*/React.createElement("div", {
32
+ style: {
33
+ padding: 24
34
+ }
35
+ }, "Content")));
36
+ }
37
+ };
38
+ export var Expandable = {
39
+ args: {},
40
+ render: function Render(args) {
41
+ var _useModal3 = useModal(false),
42
+ _useModal4 = _slicedToArray(_useModal3, 3),
43
+ isOpen = _useModal4[0],
44
+ open = _useModal4[1],
45
+ close = _useModal4[2];
46
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("button", {
47
+ type: "button",
48
+ onClick: open
49
+ }, "Open"), /*#__PURE__*/React.createElement(Modal, _extends({}, args, {
50
+ onClose: close,
51
+ isOpen: isOpen,
52
+ isExpandable: true,
53
+ width: 600,
54
+ overflow: "visible"
55
+ }), /*#__PURE__*/React.createElement("div", {
56
+ style: {
57
+ width: 600,
58
+ flex: 1,
59
+ background: '#f2f4f6',
60
+ borderRadius: 20
61
+ }
62
+ }, /*#__PURE__*/React.createElement("div", {
63
+ style: {
64
+ padding: 24,
65
+ height: 200
66
+ }
67
+ }, "Content"))));
68
+ }
69
+ };
@@ -0,0 +1,16 @@
1
+ import { transformColorByHsl } from '../../../utils/transformColorByHsl';
2
+ import hexToRgba from '../../../utils/hexToRgba';
3
+ export var generateModalPalette = function generateModalPalette(abstractPalette) {
4
+ return {
5
+ bg: abstractPalette.base,
6
+ // тот же затемнённый primary, что и у подложки Drawer
7
+ backdropBg: hexToRgba(transformColorByHsl(abstractPalette.primary, {
8
+ hue: -3.3333333333333144,
9
+ saturation: -0.07435090479937062,
10
+ lightness: 0.08235294117647063
11
+ }), 0.5),
12
+ shadow: '0 10px 30px 0 rgba(53, 63, 71, 0.1)',
13
+ expandButton: hexToRgba(abstractPalette.primary, 0.7),
14
+ expandButtonHoverBg: hexToRgba(abstractPalette.primary, 0.06)
15
+ };
16
+ };
@@ -0,0 +1,61 @@
1
+ import styled, { css } from 'styled-components';
2
+ import { breakpoints } from '../../../breakpoints';
3
+ /**
4
+ * Растяжение flex-элемента по высоте внутри expandable-модалки: занимает свободное
5
+ * место и умеет сжиматься, отдавая скролл вложенному контенту. Вешается на конкретные
6
+ * обёртки по пропу (см. useModalExpansion), а не через селекторы.
7
+ */
8
+ export var modalExpansionFlexItem = css(["flex:1 1 auto;min-height:0;"]);
9
+ export var Container = styled.div.withConfig({
10
+ displayName: "styles__Container",
11
+ componentId: "sc-1kjfcg5-0"
12
+ })(["position:fixed;top:0;left:0;right:0;bottom:0;z-index:100;"]);
13
+ export var ContainerInner = styled.div.withConfig({
14
+ displayName: "styles__ContainerInner",
15
+ componentId: "sc-1kjfcg5-1"
16
+ })(["box-sizing:border-box;width:100%;height:100%;position:relative;display:flex;justify-content:center;overflow:hidden auto;align-items:flex-start;padding:", ";@media ", "{padding:", ";}"], function (_ref) {
17
+ var $isExpanded = _ref.$isExpanded;
18
+ return $isExpanded ? '20px' : '55px 0';
19
+ }, breakpoints.sm, function (_ref2) {
20
+ var $isExpanded = _ref2.$isExpanded;
21
+ return $isExpanded ? '20px' : '15px 0';
22
+ });
23
+ export var Backdrop = styled.div.withConfig({
24
+ displayName: "styles__Backdrop",
25
+ componentId: "sc-1kjfcg5-2"
26
+ })(["position:fixed;top:0;left:0;right:0;bottom:0;z-index:-1;background-color:", ";"], function (_ref3) {
27
+ var $palette = _ref3.$palette;
28
+ return $palette.backdropBg;
29
+ });
30
+ export var Content = styled.div.withConfig({
31
+ displayName: "styles__Content",
32
+ componentId: "sc-1kjfcg5-3"
33
+ })(["margin:auto;max-width:calc(100vw - 10px);", " overflow:", ";position:relative;background-color:", ";border-radius:20px;box-shadow:", ";outline:none;", " ", " @media ", "{width:100%;}"], function (_ref4) {
34
+ var $width = _ref4.$width;
35
+ return $width && "width: ".concat($width, "px;");
36
+ }, function (_ref5) {
37
+ var $overflow = _ref5.$overflow;
38
+ return $overflow;
39
+ }, function (_ref6) {
40
+ var $palette = _ref6.$palette;
41
+ return $palette.bg;
42
+ }, function (_ref7) {
43
+ var $palette = _ref7.$palette;
44
+ return $palette.shadow;
45
+ }, function (_ref8) {
46
+ var $isExpandable = _ref8.$isExpandable;
47
+ return $isExpandable && css(["display:flex;flex-direction:column;align-items:center;max-height:100%;overflow:auto;@media ", "{display:block;max-height:none;}"], breakpoints.md);
48
+ }, function (_ref9) {
49
+ var $isExpanded = _ref9.$isExpanded;
50
+ return $isExpanded && css(["width:100%;max-width:100%;height:100%;"]);
51
+ }, breakpoints.md);
52
+ export var ExpandButton = styled.button.withConfig({
53
+ displayName: "styles__ExpandButton",
54
+ componentId: "sc-1kjfcg5-4"
55
+ })(["position:absolute;top:14px;right:14px;z-index:2;display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:8px;background-color:transparent;cursor:pointer;color:", ";&:hover{background-color:", ";}@media ", "{display:none;}"], function (_ref0) {
56
+ var $palette = _ref0.$palette;
57
+ return $palette.expandButton;
58
+ }, function (_ref1) {
59
+ var $palette = _ref1.$palette;
60
+ return $palette.expandButtonHoverBg;
61
+ }, breakpoints.md);
@@ -1,16 +1,33 @@
1
1
  import React from 'react';
2
2
  import * as S from './styles';
3
3
  import { useComponentPalette } from '../../../palette';
4
+ var toCssSize = function toCssSize(value) {
5
+ return typeof value === 'number' ? "".concat(value, "px") : value;
6
+ };
7
+
8
+ /**
9
+ * Плашка скелетона. Сама по себе декорация (`aria-hidden`): факт загрузки объявляет
10
+ * один статус рядом с группой плашек
11
+ */
4
12
  export var Skeleton = function Skeleton(_ref) {
5
13
  var _ref$width = _ref.width,
6
14
  width = _ref$width === void 0 ? '100%' : _ref$width,
7
15
  _ref$height = _ref.height,
8
16
  height = _ref$height === void 0 ? '100%' : _ref$height,
17
+ _ref$borderRadius = _ref.borderRadius,
18
+ borderRadius = _ref$borderRadius === void 0 ? 10 : _ref$borderRadius,
19
+ _ref$circle = _ref.circle,
20
+ circle = _ref$circle === void 0 ? false : _ref$circle,
21
+ _ref$showDelay = _ref.showDelay,
22
+ showDelay = _ref$showDelay === void 0 ? 0 : _ref$showDelay,
9
23
  palette = _ref.palette;
10
24
  var mergedPalette = useComponentPalette('skeleton', palette);
11
25
  return /*#__PURE__*/React.createElement(S.Wrapper, {
12
- $width: width,
13
- $height: height,
26
+ "aria-hidden": true,
27
+ $width: toCssSize(circle ? width === '100%' ? height : width : width),
28
+ $height: toCssSize(height),
29
+ $borderRadius: circle ? '50%' : "".concat(borderRadius, "px"),
30
+ $showDelay: showDelay,
14
31
  $palette: mergedPalette
15
32
  }, /*#__PURE__*/React.createElement(S.Inner, {
16
33
  $palette: mergedPalette
@@ -21,4 +21,45 @@ export var ByOwnSize = {
21
21
  width: '200px',
22
22
  height: '100px'
23
23
  }
24
+ };
25
+
26
+ /** Строки текста, поле и кнопка: скругление по месту, как в личном кабинете */
27
+ export var Shapes = {
28
+ render: function render() {
29
+ return /*#__PURE__*/React.createElement("div", {
30
+ style: {
31
+ width: 320,
32
+ display: 'flex',
33
+ flexDirection: 'column',
34
+ gap: 12
35
+ }
36
+ }, /*#__PURE__*/React.createElement("div", {
37
+ style: {
38
+ display: 'flex',
39
+ gap: 12,
40
+ alignItems: 'center'
41
+ }
42
+ }, /*#__PURE__*/React.createElement(Skeleton, {
43
+ circle: true,
44
+ height: 36
45
+ }), /*#__PURE__*/React.createElement(Skeleton, {
46
+ height: 14,
47
+ borderRadius: 4
48
+ })), /*#__PURE__*/React.createElement(Skeleton, {
49
+ height: 56
50
+ }), /*#__PURE__*/React.createElement(Skeleton, {
51
+ height: 36,
52
+ width: 132,
53
+ borderRadius: 20
54
+ }));
55
+ }
56
+ };
57
+
58
+ /** Плашка появляется через 180 мс: на быстром ответе её не видно */
59
+ export var WithShowDelay = {
60
+ args: {
61
+ width: 200,
62
+ height: 56,
63
+ showDelay: 180
64
+ }
24
65
  };