@alfalab/core-components-side-panel 3.0.16 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/Component.desktop.d.ts +2 -2
  2. package/Component.desktop.js +2 -2
  3. package/Component.mobile.js +2 -2
  4. package/Component.responsive.d.ts +2 -2
  5. package/Component.responsive.js +2 -3
  6. package/components/content/Component.desktop.js +1 -1
  7. package/components/content/Component.js +1 -1
  8. package/components/content/Component.mobile.js +1 -1
  9. package/components/content/desktop.css +3 -3
  10. package/components/content/index.css +4 -4
  11. package/components/content/mobile.css +3 -3
  12. package/components/footer/Component.desktop.js +1 -1
  13. package/components/footer/Component.js +2 -2
  14. package/components/footer/Component.mobile.js +1 -1
  15. package/components/footer/desktop.css +3 -3
  16. package/components/footer/index.css +4 -4
  17. package/components/footer/layout.css +25 -25
  18. package/components/footer/mobile.css +7 -7
  19. package/components/header/Component.js +3 -3
  20. package/components/header/desktop.css +5 -5
  21. package/components/header/index.css +14 -14
  22. package/components/header/mobile.css +4 -4
  23. package/cssm/Component.desktop.d.ts +2 -2
  24. package/cssm/Component.responsive.d.ts +2 -2
  25. package/cssm/Component.responsive.js +2 -3
  26. package/cssm/index.d.ts +2 -2
  27. package/cssm/index.js +4 -4
  28. package/cssm/shared.d.ts +1 -0
  29. package/cssm/shared.js +10 -0
  30. package/desktop.css +3 -3
  31. package/esm/Component.desktop.d.ts +2 -2
  32. package/esm/Component.desktop.js +2 -2
  33. package/esm/Component.mobile.js +2 -2
  34. package/esm/Component.responsive.d.ts +2 -2
  35. package/esm/Component.responsive.js +1 -2
  36. package/esm/components/content/Component.desktop.js +1 -1
  37. package/esm/components/content/Component.js +1 -1
  38. package/esm/components/content/Component.mobile.js +1 -1
  39. package/esm/components/content/desktop.css +3 -3
  40. package/esm/components/content/index.css +4 -4
  41. package/esm/components/content/mobile.css +3 -3
  42. package/esm/components/footer/Component.desktop.js +1 -1
  43. package/esm/components/footer/Component.js +2 -2
  44. package/esm/components/footer/Component.mobile.js +1 -1
  45. package/esm/components/footer/desktop.css +3 -3
  46. package/esm/components/footer/index.css +4 -4
  47. package/esm/components/footer/layout.css +25 -25
  48. package/esm/components/footer/mobile.css +7 -7
  49. package/esm/components/header/Component.js +3 -3
  50. package/esm/components/header/desktop.css +5 -5
  51. package/esm/components/header/index.css +14 -14
  52. package/esm/components/header/mobile.css +4 -4
  53. package/esm/desktop.css +3 -3
  54. package/esm/index.d.ts +2 -2
  55. package/esm/index.js +4 -3
  56. package/esm/mobile.css +3 -3
  57. package/esm/shared.d.ts +1 -0
  58. package/esm/shared.js +2 -0
  59. package/esm/transitions.desktop.css +7 -7
  60. package/esm/transitions.mobile.css +8 -8
  61. package/index.d.ts +2 -2
  62. package/index.js +4 -4
  63. package/mobile.css +3 -3
  64. package/modern/Component.desktop.d.ts +2 -2
  65. package/modern/Component.desktop.js +2 -2
  66. package/modern/Component.mobile.js +2 -2
  67. package/modern/Component.responsive.d.ts +2 -2
  68. package/modern/Component.responsive.js +1 -2
  69. package/modern/components/content/Component.desktop.js +1 -1
  70. package/modern/components/content/Component.js +1 -1
  71. package/modern/components/content/Component.mobile.js +1 -1
  72. package/modern/components/content/desktop.css +3 -3
  73. package/modern/components/content/index.css +4 -4
  74. package/modern/components/content/mobile.css +3 -3
  75. package/modern/components/footer/Component.desktop.js +1 -1
  76. package/modern/components/footer/Component.js +2 -2
  77. package/modern/components/footer/Component.mobile.js +1 -1
  78. package/modern/components/footer/desktop.css +3 -3
  79. package/modern/components/footer/index.css +4 -4
  80. package/modern/components/footer/layout.css +25 -25
  81. package/modern/components/footer/mobile.css +7 -7
  82. package/modern/components/header/Component.js +3 -3
  83. package/modern/components/header/desktop.css +5 -5
  84. package/modern/components/header/index.css +14 -14
  85. package/modern/components/header/mobile.css +4 -4
  86. package/modern/desktop.css +3 -3
  87. package/modern/index.d.ts +2 -2
  88. package/modern/index.js +4 -3
  89. package/modern/mobile.css +3 -3
  90. package/modern/shared.d.ts +1 -0
  91. package/modern/shared.js +2 -0
  92. package/modern/transitions.desktop.css +7 -7
  93. package/modern/transitions.mobile.css +8 -8
  94. package/package.json +30 -5
  95. package/shared.d.ts +1 -0
  96. package/shared.js +10 -0
  97. package/src/Component.desktop.tsx +105 -0
  98. package/src/Component.mobile.tsx +57 -0
  99. package/src/Component.responsive.tsx +83 -0
  100. package/src/Context.tsx +3 -0
  101. package/src/ResponsiveContext.ts +5 -0
  102. package/src/components/content/Component.desktop.tsx +19 -0
  103. package/src/components/content/Component.mobile.tsx +12 -0
  104. package/src/components/content/Component.tsx +39 -0
  105. package/src/components/content/desktop.module.css +9 -0
  106. package/src/components/content/index.module.css +16 -0
  107. package/src/components/content/mobile.module.css +9 -0
  108. package/src/components/footer/Component.desktop.tsx +28 -0
  109. package/src/components/footer/Component.mobile.tsx +24 -0
  110. package/src/components/footer/Component.tsx +72 -0
  111. package/src/components/footer/desktop.module.css +9 -0
  112. package/src/components/footer/index.module.css +18 -0
  113. package/src/components/footer/layout.module.css +70 -0
  114. package/src/components/footer/mobile.module.css +25 -0
  115. package/src/components/header/Component.tsx +59 -0
  116. package/src/components/header/desktop.module.css +20 -0
  117. package/src/components/header/index.module.css +66 -0
  118. package/src/components/header/mobile.module.css +17 -0
  119. package/src/desktop.module.css +9 -0
  120. package/src/desktop.ts +1 -0
  121. package/src/index.ts +4 -0
  122. package/src/mobile.module.css +19 -0
  123. package/src/mobile.ts +1 -0
  124. package/src/shared.ts +1 -0
  125. package/src/transitions.desktop.module.css +35 -0
  126. package/src/transitions.mobile.module.css +24 -0
  127. package/src/typings.ts +6 -0
  128. package/src/vars.css +40 -0
  129. package/transitions.desktop.css +7 -7
  130. package/transitions.mobile.css +8 -8
  131. package/cssm/responsive.d.ts +0 -2
  132. package/cssm/responsive.js +0 -42
  133. package/esm/responsive.d.ts +0 -2
  134. package/esm/responsive.js +0 -20
  135. package/modern/responsive.d.ts +0 -2
  136. package/modern/responsive.js +0 -19
  137. package/responsive.d.ts +0 -2
  138. package/responsive.js +0 -28
@@ -1,4 +1,4 @@
1
- /* hash: nijjd */
1
+ /* hash: 19s6s */
2
2
  :root {
3
3
  } /* deprecated */ :root {
4
4
  --color-light-bg-primary: #fff;
@@ -32,42 +32,42 @@
32
32
  /* mobile */
33
33
 
34
34
  /* paddings */
35
- } .side-panel__header_18jha {
35
+ } .side-panel__header_15gdd {
36
36
  width: 100%;
37
37
  box-sizing: border-box;
38
38
  transition: box-shadow 0.2s ease, background 0.2s ease
39
- } .side-panel__header_18jha:not(.side-panel__hasContent_18jha) {
39
+ } .side-panel__header_15gdd:not(.side-panel__hasContent_15gdd) {
40
40
  pointer-events: none;
41
- } .side-panel__highlighted_18jha {
41
+ } .side-panel__highlighted_15gdd {
42
42
  background: var(--side-panel-header-highlight-background);
43
43
  box-shadow: var(--side-panel-header-highlight-box-shadow);
44
- } .side-panel__sticky_18jha {
44
+ } .side-panel__sticky_15gdd {
45
45
  position: sticky;
46
46
  z-index: 1
47
- } .side-panel__sticky_18jha.side-panel__hasContent_18jha {
47
+ } .side-panel__sticky_15gdd.side-panel__hasContent_15gdd {
48
48
  background: var(--side-panel-header-background);
49
- } .side-panel__header_18jha.side-panel__backgroundImage_18jha {
49
+ } .side-panel__header_15gdd.side-panel__backgroundImage_15gdd {
50
50
  background: center no-repeat;
51
51
  background-size: cover;
52
- } .side-panel__content_18jha {
52
+ } .side-panel__content_15gdd {
53
53
  flex-grow: 1;
54
- } .side-panel__title_18jha {
54
+ } .side-panel__title_15gdd {
55
55
  word-break: break-word;
56
- } .side-panel__addon_18jha {
56
+ } .side-panel__addon_15gdd {
57
57
  min-width: 48px;
58
58
  height: 48px;
59
59
  display: flex;
60
60
  justify-content: center;
61
61
  align-items: center;
62
62
  pointer-events: all;
63
- } .side-panel__closer_18jha {
63
+ } .side-panel__closer_15gdd {
64
64
  margin-left: auto;
65
- } .side-panel__right_18jha {
65
+ } .side-panel__right_15gdd {
66
66
  justify-content: flex-end;
67
67
  text-align: right;
68
- } .side-panel__trim_18jha {
68
+ } .side-panel__trim_15gdd {
69
69
  overflow: hidden
70
- } .side-panel__trim_18jha .side-panel__title_18jha {
70
+ } .side-panel__trim_15gdd .side-panel__title_15gdd {
71
71
  overflow: hidden;
72
72
  white-space: nowrap;
73
73
  text-overflow: ellipsis;
@@ -1,4 +1,4 @@
1
- /* hash: 1qec0 */
1
+ /* hash: qdp72 */
2
2
  :root {
3
3
  } /* deprecated */ :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
4
4
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
@@ -38,11 +38,11 @@
38
38
 
39
39
  /* paddings */
40
40
  --side-panel-header-mobile-paddings: var(--gap-2xs) var(--gap-xs);
41
- } .side-panel__header_ah76r {
41
+ } .side-panel__header_6bhp6 {
42
42
  padding: var(--side-panel-header-mobile-paddings);
43
- } .side-panel__sticky_ah76r {
43
+ } .side-panel__sticky_6bhp6 {
44
44
  top: 0;
45
- } .side-panel__content_ah76r {
45
+ } .side-panel__content_6bhp6 {
46
46
  font-size: var(--side-panel-header-mobile-font-size);
47
47
  line-height: var(--side-panel-header-mobile-line-height);
48
48
  font-family: var(--side-panel-header-mobile-font-family);
@@ -1,4 +1,4 @@
1
- /* hash: up6dh */
1
+ /* hash: di9bv */
2
2
  :root {
3
3
  } /* deprecated */ :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
4
4
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
@@ -28,8 +28,8 @@
28
28
  /* mobile */
29
29
 
30
30
  /* paddings */
31
- } .side-panel__s_164lo {
31
+ } .side-panel__s_1ke29 {
32
32
  width: var(--side-panel-s-width);
33
- } .side-panel__hidden_164lo {
33
+ } .side-panel__hidden_1ke29 {
34
34
  overflow-x: hidden;
35
35
  }
package/modern/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from "./responsive";
2
- export * from "./Context";
1
+ export { SidePanelResponsive as SidePanel, SidePanelResponsiveProps as SidePanelProps } from "./Component.responsive";
2
+ export {};
package/modern/index.js CHANGED
@@ -1,10 +1,12 @@
1
- export { SidePanelResponsive } from './Component.responsive.js';
2
- export { ModalContext } from './Context.js';
1
+ export { SidePanelResponsive as SidePanel } from './Component.responsive.js';
3
2
  import 'react';
4
3
  import '@alfalab/core-components-mq/modern';
4
+ import '@alfalab/core-components-shared/modern';
5
5
  import './components/header/Component.js';
6
6
  import 'classnames';
7
7
  import '@alfalab/core-components-navigation-bar/modern';
8
+ import './Context.js';
9
+ import '@alfalab/core-components-base-modal/modern';
8
10
  import './ResponsiveContext.js';
9
11
  import './Component.desktop.js';
10
12
  import 'react-merge-refs';
@@ -14,6 +16,5 @@ import './components/content/Component.js';
14
16
  import './components/footer/Component.desktop.js';
15
17
  import './components/footer/Component.js';
16
18
  import './Component.mobile.js';
17
- import '@alfalab/core-components-base-modal/modern';
18
19
  import './components/content/Component.mobile.js';
19
20
  import './components/footer/Component.mobile.js';
package/modern/mobile.css CHANGED
@@ -1,4 +1,4 @@
1
- /* hash: bmcw8 */
1
+ /* hash: nnz71 */
2
2
  :root {
3
3
  } /* deprecated */ :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
4
4
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
@@ -27,7 +27,7 @@
27
27
  /* mobile */
28
28
 
29
29
  /* paddings */
30
- } .side-panel__component_1fi8z {
30
+ } .side-panel__component_ar6xg {
31
31
  position: fixed;
32
32
  top: 0;
33
33
  flex: 1;
@@ -36,7 +36,7 @@
36
36
  overflow-x: hidden;
37
37
  overflow-y: auto;
38
38
  max-width: 600px;
39
- } .side-panel__mobileContent_1fi8z {
39
+ } .side-panel__mobileContent_ar6xg {
40
40
  display: flex;
41
41
  flex-direction: column;
42
42
  width: 100%;
@@ -0,0 +1 @@
1
+ export { ModalContext } from "./Context";
@@ -0,0 +1,2 @@
1
+ export { ModalContext } from './Context.js';
2
+ import '@alfalab/core-components-base-modal/modern';
@@ -1,32 +1,32 @@
1
- /* hash: 1q3gi */
2
- .side-panel__enterRight_1av3a {
1
+ /* hash: 19z9l */
2
+ .side-panel__enterRight_co1v7 {
3
3
  opacity: 0;
4
4
  transform: translateX(15px);
5
5
  }
6
6
 
7
- .side-panel__enterLeft_1av3a {
7
+ .side-panel__enterLeft_co1v7 {
8
8
  opacity: 0;
9
9
  transform: translateX(-15px);
10
10
  }
11
11
 
12
- .side-panel__enterActive_1av3a {
12
+ .side-panel__enterActive_co1v7 {
13
13
  opacity: 1;
14
14
  transform: translateX(0);
15
15
  transition: opacity 200ms ease-in, transform 200ms ease-in;
16
16
  }
17
17
 
18
- .side-panel__exit_1av3a {
18
+ .side-panel__exit_co1v7 {
19
19
  opacity: 1;
20
20
  transform: translateX(0);
21
21
  }
22
22
 
23
- .side-panel__exitActiveRight_1av3a {
23
+ .side-panel__exitActiveRight_co1v7 {
24
24
  opacity: 0;
25
25
  transition: opacity 200ms ease-out, transform 200ms ease-out;
26
26
  transform: translateX(15px);
27
27
  }
28
28
 
29
- .side-panel__exitActiveLeft_1av3a {
29
+ .side-panel__exitActiveLeft_co1v7 {
30
30
  opacity: 0;
31
31
  transition: opacity 200ms ease-out, transform 200ms ease-out;
32
32
  transform: translateX(-15px);
@@ -1,24 +1,24 @@
1
- /* hash: dqsky */
2
- .side-panel__appear_fbxtx,
3
- .side-panel__enter_fbxtx {
1
+ /* hash: 1qi9d */
2
+ .side-panel__appear_1rr7d,
3
+ .side-panel__enter_1rr7d {
4
4
  opacity: 0;
5
5
  transform: translateY(15px);
6
6
  }
7
7
 
8
- .side-panel__appearActive_fbxtx,
9
- .side-panel__enterActive_fbxtx {
8
+ .side-panel__appearActive_1rr7d,
9
+ .side-panel__enterActive_1rr7d {
10
10
  opacity: 1;
11
11
  transform: translateY(0);
12
12
  transition: opacity 200ms ease-in, transform 200ms ease-in;
13
13
  }
14
14
 
15
- .side-panel__exit_fbxtx {
15
+ .side-panel__exit_1rr7d {
16
16
  opacity: 1;
17
17
  transform: translateY(0);
18
18
  }
19
19
 
20
- .side-panel__exitActive_fbxtx,
21
- .side-panel__exitDone_fbxtx {
20
+ .side-panel__exitActive_1rr7d,
21
+ .side-panel__exitDone_1rr7d {
22
22
  opacity: 0;
23
23
  transform: translateY(15px);
24
24
  transition: opacity 200ms ease-out, transform 200ms ease-out;
package/package.json CHANGED
@@ -1,11 +1,35 @@
1
1
  {
2
2
  "name": "@alfalab/core-components-side-panel",
3
- "version": "3.0.16",
3
+ "version": "4.0.0",
4
4
  "description": "SidePanel component",
5
5
  "keywords": [],
6
6
  "license": "MIT",
7
7
  "main": "index.js",
8
8
  "module": "./esm/index.js",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./esm/index.js",
12
+ "require": "./index.js"
13
+ },
14
+ "./mobile": {
15
+ "import": "./esm/mobile.js",
16
+ "require": "./mobile.js"
17
+ },
18
+ "./desktop": {
19
+ "import": "./esm/desktop.js",
20
+ "require": "./desktop.js"
21
+ },
22
+ "./shared": {
23
+ "import": "./esm/shared.js",
24
+ "require": "./shared.js"
25
+ },
26
+ "./esm": "./esm/index.js",
27
+ "./cssm": "./cssm/index.js",
28
+ "./modern": "./modern/index.js",
29
+ "./esm/*": "./esm/*",
30
+ "./cssm/*": "./cssm/*",
31
+ "./modern/*": "./modern/*"
32
+ },
9
33
  "publishConfig": {
10
34
  "access": "public",
11
35
  "directory": "dist"
@@ -14,10 +38,11 @@
14
38
  "react": "^16.9.0 || ^17.0.1 || ^18.0.0"
15
39
  },
16
40
  "dependencies": {
17
- "@alfalab/core-components-base-modal": "^5.2.1",
18
- "@alfalab/core-components-drawer": "^4.2.12",
19
- "@alfalab/core-components-mq": "^4.1.5",
20
- "@alfalab/core-components-navigation-bar": "^0.3.7",
41
+ "@alfalab/core-components-base-modal": "^5.3.0",
42
+ "@alfalab/core-components-drawer": "^5.0.0",
43
+ "@alfalab/core-components-mq": "^4.2.0",
44
+ "@alfalab/core-components-navigation-bar": "^0.4.0",
45
+ "@alfalab/core-components-shared": "^0.1.0",
21
46
  "classnames": "^2.3.1",
22
47
  "react-merge-refs": "^1.1.0",
23
48
  "tslib": "^2.4.0"
package/shared.d.ts ADDED
@@ -0,0 +1 @@
1
+ export { ModalContext } from "./Context";
package/shared.js ADDED
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var Context = require('./Context.js');
6
+ require('@alfalab/core-components-base-modal');
7
+
8
+
9
+
10
+ exports.ModalContext = Context.ModalContext;
@@ -0,0 +1,105 @@
1
+ import React, { cloneElement, forwardRef, isValidElement, useContext, useRef } from 'react';
2
+ import mergeRefs from 'react-merge-refs';
3
+ import cn from 'classnames';
4
+
5
+ import { BaseModalProps } from '@alfalab/core-components-base-modal';
6
+ import { Drawer, DrawerProps } from '@alfalab/core-components-drawer';
7
+
8
+ import { ContentDesktop } from './components/content/Component.desktop';
9
+ import { FooterDesktop } from './components/footer/Component.desktop';
10
+ import { Header } from './components/header/Component';
11
+ import { ResponsiveContext } from './ResponsiveContext';
12
+ import { TResponsiveModalContext } from './typings';
13
+
14
+ import styles from './desktop.module.css';
15
+ import transitions from './transitions.desktop.module.css';
16
+
17
+ export type SidePanelDesktopProps = BaseModalProps &
18
+ Pick<DrawerProps, 'placement' | 'nativeScrollbar' | 'contentTransitionProps'> & {
19
+ /**
20
+ * Ширина модального окна
21
+ * @default "s"
22
+ */
23
+ size?: 's';
24
+
25
+ /**
26
+ * Управление наличием закрывающего крестика
27
+ * @default false
28
+ */
29
+ hasCloser?: boolean;
30
+ };
31
+
32
+ const SidePanelDesktopComponent = forwardRef<HTMLDivElement, SidePanelDesktopProps>(
33
+ (
34
+ {
35
+ size = 's',
36
+ children,
37
+ className,
38
+ wrapperClassName,
39
+ contentTransitionProps = {},
40
+ backdropProps,
41
+ placement = 'right',
42
+ ...restProps
43
+ },
44
+ ref,
45
+ ) => {
46
+ const responsiveContext = useContext(ResponsiveContext);
47
+ const modalRef = useRef<HTMLElement>(null);
48
+
49
+ const enterCn = cn({
50
+ [transitions.appearRight]: placement === 'right',
51
+ [transitions.appearLeft]: placement === 'left',
52
+ });
53
+
54
+ const exitCn = cn({
55
+ [transitions.exitActiveRight]: placement === 'right',
56
+ [transitions.exitActiveLeft]: placement === 'left',
57
+ });
58
+
59
+ const contextValue = React.useMemo<TResponsiveModalContext>(
60
+ () => ({ size, view: 'desktop' }),
61
+ [size],
62
+ );
63
+
64
+ const renderContent = () => (
65
+ <Drawer
66
+ {...restProps}
67
+ ref={mergeRefs([ref, modalRef])}
68
+ placement={placement}
69
+ wrapperClassName={wrapperClassName}
70
+ className={cn(className, styles[size], styles.hidden)}
71
+ backdropProps={backdropProps}
72
+ contentTransitionProps={{
73
+ classNames: {
74
+ appear: enterCn,
75
+ enter: enterCn,
76
+ appearActive: transitions.enterActive,
77
+ enterActive: transitions.enterActive,
78
+ exit: transitions.exit,
79
+ exitActive: exitCn,
80
+ exitDone: exitCn,
81
+ },
82
+ ...contentTransitionProps,
83
+ }}
84
+ >
85
+ {React.Children.map(children, (child) =>
86
+ isValidElement(child) ? cloneElement(child, { size }) : child,
87
+ )}
88
+ </Drawer>
89
+ );
90
+
91
+ const renderWithContext = () => (
92
+ <ResponsiveContext.Provider value={contextValue}>
93
+ {renderContent()}
94
+ </ResponsiveContext.Provider>
95
+ );
96
+
97
+ return responsiveContext ? renderContent() : renderWithContext();
98
+ },
99
+ );
100
+
101
+ export const SidePanelDesktop = Object.assign(SidePanelDesktopComponent, {
102
+ Content: ContentDesktop,
103
+ Header,
104
+ Footer: FooterDesktop,
105
+ });
@@ -0,0 +1,57 @@
1
+ import React, { forwardRef, useContext } from 'react';
2
+ import cn from 'classnames';
3
+
4
+ import { BaseModal, BaseModalProps } from '@alfalab/core-components-base-modal';
5
+
6
+ import { ContentMobile } from './components/content/Component.mobile';
7
+ import { FooterMobile } from './components/footer/Component.mobile';
8
+ import { Header } from './components/header/Component';
9
+ import { ResponsiveContext } from './ResponsiveContext';
10
+
11
+ import styles from './mobile.module.css';
12
+ import transitions from './transitions.mobile.module.css';
13
+
14
+ export type SidePanelMobileProps = BaseModalProps & {
15
+ /**
16
+ * Управление наличием закрывающего крестика
17
+ * @default false
18
+ */
19
+ hasCloser?: boolean;
20
+ };
21
+
22
+ const contextValue = { size: 's', view: 'mobile' } as const;
23
+
24
+ const SidePanelMobileComponent = forwardRef<HTMLDivElement, SidePanelMobileProps>(
25
+ ({ children, className, transitionProps, ...restProps }, ref) => {
26
+ const responsiveContext = useContext(ResponsiveContext);
27
+
28
+ const renderContent = () => (
29
+ <BaseModal
30
+ {...restProps}
31
+ ref={ref}
32
+ transitionProps={{
33
+ classNames: transitions,
34
+ ...transitionProps,
35
+ }}
36
+ className={cn(className, styles.component)}
37
+ scrollHandler='content'
38
+ >
39
+ <div className={styles.mobileContent}>{children}</div>
40
+ </BaseModal>
41
+ );
42
+
43
+ const renderWithContext = () => (
44
+ <ResponsiveContext.Provider value={contextValue}>
45
+ {renderContent()}
46
+ </ResponsiveContext.Provider>
47
+ );
48
+
49
+ return responsiveContext ? renderContent() : renderWithContext();
50
+ },
51
+ );
52
+
53
+ export const SidePanelMobile = Object.assign(SidePanelMobileComponent, {
54
+ Content: ContentMobile,
55
+ Header,
56
+ Footer: FooterMobile,
57
+ });
@@ -0,0 +1,83 @@
1
+ import React, { FC, forwardRef, useContext, useMemo } from 'react';
2
+
3
+ import { BaseModalProps } from '@alfalab/core-components-base-modal';
4
+ import { DrawerProps } from '@alfalab/core-components-drawer';
5
+ import { useMatchMedia } from '@alfalab/core-components-mq';
6
+ import { isClient } from '@alfalab/core-components-shared';
7
+
8
+ import { Header } from './components/header/Component';
9
+ import { SidePanelDesktop } from './Component.desktop';
10
+ import { SidePanelMobile } from './Component.mobile';
11
+ import { ResponsiveContext } from './ResponsiveContext';
12
+ import { TResponsiveModalContext } from './typings';
13
+
14
+ export type SidePanelResponsiveProps = BaseModalProps &
15
+ Pick<DrawerProps, 'contentTransitionProps' | 'placement' | 'nativeScrollbar'> & {
16
+ /**
17
+ * Ширина модального окна
18
+ * @default "s"
19
+ */
20
+ size?: 's';
21
+
22
+ /**
23
+ * Управление наличием закрывающего крестика
24
+ * @default false
25
+ */
26
+ hasCloser?: boolean;
27
+
28
+ /**
29
+ * Контрольная точка, с нее начинается desktop версия
30
+ * @default 1024
31
+ */
32
+ breakpoint?: number;
33
+
34
+ /**
35
+ * Значение по-умолчанию для хука useMatchMedia
36
+ */
37
+ defaultMatchMediaValue?: boolean | (() => boolean);
38
+ };
39
+
40
+ function createResponsive<DesktopType extends FC, MobileType extends FC>(
41
+ desktop: DesktopType,
42
+ mobile: MobileType,
43
+ ) {
44
+ // eslint-disable-next-line
45
+ function ResponsiveChild(props: any) {
46
+ const { view = 'desktop' } = useContext(ResponsiveContext) || {};
47
+
48
+ const Child = view === 'desktop' ? desktop : mobile;
49
+
50
+ return <Child {...props} />;
51
+ }
52
+
53
+ return ResponsiveChild as DesktopType | MobileType;
54
+ }
55
+
56
+ const SidePanelResponsiveComponent = forwardRef<HTMLDivElement, SidePanelResponsiveProps>(
57
+ ({ children, breakpoint = 1024, size = 's', defaultMatchMediaValue, ...restProps }, ref) => {
58
+ const query = `(min-width: ${breakpoint}px)`;
59
+ const getDefaultValue = () => (isClient() ? window.matchMedia(query).matches : false);
60
+
61
+ const [isDesktop] = useMatchMedia(query, defaultMatchMediaValue ?? getDefaultValue);
62
+
63
+ const view = isDesktop ? 'desktop' : 'mobile';
64
+
65
+ const contextValue = useMemo<TResponsiveModalContext>(() => ({ view, size }), [view, size]);
66
+
67
+ const Component = isDesktop ? SidePanelDesktop : SidePanelMobile;
68
+
69
+ return (
70
+ <ResponsiveContext.Provider value={contextValue}>
71
+ <Component ref={ref} size={size} {...restProps}>
72
+ {children}
73
+ </Component>
74
+ </ResponsiveContext.Provider>
75
+ );
76
+ },
77
+ );
78
+
79
+ export const SidePanelResponsive = Object.assign(SidePanelResponsiveComponent, {
80
+ Header,
81
+ Content: createResponsive(SidePanelDesktop.Content, SidePanelMobile.Content),
82
+ Footer: createResponsive(SidePanelDesktop.Footer, SidePanelMobile.Footer),
83
+ });
@@ -0,0 +1,3 @@
1
+ import { BaseModalContext } from '@alfalab/core-components-base-modal';
2
+
3
+ export const ModalContext = BaseModalContext;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+
3
+ import type { TResponsiveModalContext } from './typings';
4
+
5
+ export const ResponsiveContext = React.createContext<TResponsiveModalContext>(null);
@@ -0,0 +1,19 @@
1
+ import React, { FC } from 'react';
2
+ import cn from 'classnames';
3
+
4
+ import { Content, ContentProps } from './Component';
5
+
6
+ import styles from './desktop.module.css';
7
+
8
+ export type ContentDesktopProps = ContentProps & {
9
+ /**
10
+ * Размер (только для desktop версии компонента)
11
+ */
12
+ size?: 's';
13
+ };
14
+
15
+ export const ContentDesktop: FC<ContentDesktopProps> = ({
16
+ size = 's',
17
+ className,
18
+ ...restProps
19
+ }) => <Content className={cn(className, size && styles[size])} {...restProps} />;
@@ -0,0 +1,12 @@
1
+ import React, { FC } from 'react';
2
+ import cn from 'classnames';
3
+
4
+ import { Content, ContentProps } from './Component';
5
+
6
+ import styles from './mobile.module.css';
7
+
8
+ export type ContentMobileProps = ContentProps;
9
+
10
+ export const ContentMobile: FC<ContentMobileProps> = ({ className, ...restProps }) => (
11
+ <Content className={cn(className, styles.content)} {...restProps} />
12
+ );
@@ -0,0 +1,39 @@
1
+ import React, { FC, ReactNode, Ref, useContext } from 'react';
2
+ import cn from 'classnames';
3
+
4
+ import { ModalContext } from '../../Context';
5
+
6
+ import styles from './index.module.css';
7
+
8
+ export type ContentProps = {
9
+ /**
10
+ * Контент
11
+ */
12
+ children?: ReactNode;
13
+
14
+ /**
15
+ * Дополнительный класс
16
+ */
17
+ className?: string;
18
+
19
+ /**
20
+ * Идентификатор для систем автоматизированного тестирования
21
+ */
22
+ dataTestId?: string;
23
+ };
24
+
25
+ export const Content: FC<ContentProps> = ({ children, className, dataTestId }) => {
26
+ const { contentRef, hasHeader } = useContext(ModalContext);
27
+
28
+ return (
29
+ <div
30
+ className={cn(styles.content, className, styles.flex, {
31
+ [styles.withHeader]: hasHeader,
32
+ })}
33
+ ref={contentRef as Ref<HTMLDivElement>}
34
+ data-test-id={dataTestId}
35
+ >
36
+ {children}
37
+ </div>
38
+ );
39
+ };
@@ -0,0 +1,9 @@
1
+ @import '../../vars.css';
2
+
3
+ .s {
4
+ padding: var(--side-panel-s-content-paddings);
5
+
6
+ &:last-child {
7
+ padding-bottom: var(--gap-2xl);
8
+ }
9
+ }