@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.
- package/Component.desktop.d.ts +2 -2
- package/Component.desktop.js +2 -2
- package/Component.mobile.js +2 -2
- package/Component.responsive.d.ts +2 -2
- package/Component.responsive.js +2 -3
- package/components/content/Component.desktop.js +1 -1
- package/components/content/Component.js +1 -1
- package/components/content/Component.mobile.js +1 -1
- package/components/content/desktop.css +3 -3
- package/components/content/index.css +4 -4
- package/components/content/mobile.css +3 -3
- package/components/footer/Component.desktop.js +1 -1
- package/components/footer/Component.js +2 -2
- package/components/footer/Component.mobile.js +1 -1
- package/components/footer/desktop.css +3 -3
- package/components/footer/index.css +4 -4
- package/components/footer/layout.css +25 -25
- package/components/footer/mobile.css +7 -7
- package/components/header/Component.js +3 -3
- package/components/header/desktop.css +5 -5
- package/components/header/index.css +14 -14
- package/components/header/mobile.css +4 -4
- package/cssm/Component.desktop.d.ts +2 -2
- package/cssm/Component.responsive.d.ts +2 -2
- package/cssm/Component.responsive.js +2 -3
- package/cssm/index.d.ts +2 -2
- package/cssm/index.js +4 -4
- package/cssm/shared.d.ts +1 -0
- package/cssm/shared.js +10 -0
- package/desktop.css +3 -3
- package/esm/Component.desktop.d.ts +2 -2
- package/esm/Component.desktop.js +2 -2
- package/esm/Component.mobile.js +2 -2
- package/esm/Component.responsive.d.ts +2 -2
- package/esm/Component.responsive.js +1 -2
- package/esm/components/content/Component.desktop.js +1 -1
- package/esm/components/content/Component.js +1 -1
- package/esm/components/content/Component.mobile.js +1 -1
- package/esm/components/content/desktop.css +3 -3
- package/esm/components/content/index.css +4 -4
- package/esm/components/content/mobile.css +3 -3
- package/esm/components/footer/Component.desktop.js +1 -1
- package/esm/components/footer/Component.js +2 -2
- package/esm/components/footer/Component.mobile.js +1 -1
- package/esm/components/footer/desktop.css +3 -3
- package/esm/components/footer/index.css +4 -4
- package/esm/components/footer/layout.css +25 -25
- package/esm/components/footer/mobile.css +7 -7
- package/esm/components/header/Component.js +3 -3
- package/esm/components/header/desktop.css +5 -5
- package/esm/components/header/index.css +14 -14
- package/esm/components/header/mobile.css +4 -4
- package/esm/desktop.css +3 -3
- package/esm/index.d.ts +2 -2
- package/esm/index.js +4 -3
- package/esm/mobile.css +3 -3
- package/esm/shared.d.ts +1 -0
- package/esm/shared.js +2 -0
- package/esm/transitions.desktop.css +7 -7
- package/esm/transitions.mobile.css +8 -8
- package/index.d.ts +2 -2
- package/index.js +4 -4
- package/mobile.css +3 -3
- package/modern/Component.desktop.d.ts +2 -2
- package/modern/Component.desktop.js +2 -2
- package/modern/Component.mobile.js +2 -2
- package/modern/Component.responsive.d.ts +2 -2
- package/modern/Component.responsive.js +1 -2
- package/modern/components/content/Component.desktop.js +1 -1
- package/modern/components/content/Component.js +1 -1
- package/modern/components/content/Component.mobile.js +1 -1
- package/modern/components/content/desktop.css +3 -3
- package/modern/components/content/index.css +4 -4
- package/modern/components/content/mobile.css +3 -3
- package/modern/components/footer/Component.desktop.js +1 -1
- package/modern/components/footer/Component.js +2 -2
- package/modern/components/footer/Component.mobile.js +1 -1
- package/modern/components/footer/desktop.css +3 -3
- package/modern/components/footer/index.css +4 -4
- package/modern/components/footer/layout.css +25 -25
- package/modern/components/footer/mobile.css +7 -7
- package/modern/components/header/Component.js +3 -3
- package/modern/components/header/desktop.css +5 -5
- package/modern/components/header/index.css +14 -14
- package/modern/components/header/mobile.css +4 -4
- package/modern/desktop.css +3 -3
- package/modern/index.d.ts +2 -2
- package/modern/index.js +4 -3
- package/modern/mobile.css +3 -3
- package/modern/shared.d.ts +1 -0
- package/modern/shared.js +2 -0
- package/modern/transitions.desktop.css +7 -7
- package/modern/transitions.mobile.css +8 -8
- package/package.json +30 -5
- package/shared.d.ts +1 -0
- package/shared.js +10 -0
- package/src/Component.desktop.tsx +105 -0
- package/src/Component.mobile.tsx +57 -0
- package/src/Component.responsive.tsx +83 -0
- package/src/Context.tsx +3 -0
- package/src/ResponsiveContext.ts +5 -0
- package/src/components/content/Component.desktop.tsx +19 -0
- package/src/components/content/Component.mobile.tsx +12 -0
- package/src/components/content/Component.tsx +39 -0
- package/src/components/content/desktop.module.css +9 -0
- package/src/components/content/index.module.css +16 -0
- package/src/components/content/mobile.module.css +9 -0
- package/src/components/footer/Component.desktop.tsx +28 -0
- package/src/components/footer/Component.mobile.tsx +24 -0
- package/src/components/footer/Component.tsx +72 -0
- package/src/components/footer/desktop.module.css +9 -0
- package/src/components/footer/index.module.css +18 -0
- package/src/components/footer/layout.module.css +70 -0
- package/src/components/footer/mobile.module.css +25 -0
- package/src/components/header/Component.tsx +59 -0
- package/src/components/header/desktop.module.css +20 -0
- package/src/components/header/index.module.css +66 -0
- package/src/components/header/mobile.module.css +17 -0
- package/src/desktop.module.css +9 -0
- package/src/desktop.ts +1 -0
- package/src/index.ts +4 -0
- package/src/mobile.module.css +19 -0
- package/src/mobile.ts +1 -0
- package/src/shared.ts +1 -0
- package/src/transitions.desktop.module.css +35 -0
- package/src/transitions.mobile.module.css +24 -0
- package/src/typings.ts +6 -0
- package/src/vars.css +40 -0
- package/transitions.desktop.css +7 -7
- package/transitions.mobile.css +8 -8
- package/cssm/responsive.d.ts +0 -2
- package/cssm/responsive.js +0 -42
- package/esm/responsive.d.ts +0 -2
- package/esm/responsive.js +0 -20
- package/modern/responsive.d.ts +0 -2
- package/modern/responsive.js +0 -19
- package/responsive.d.ts +0 -2
- package/responsive.js +0 -28
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* hash:
|
|
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-
|
|
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-
|
|
39
|
+
} .side-panel__header_15gdd:not(.side-panel__hasContent_15gdd) {
|
|
40
40
|
pointer-events: none;
|
|
41
|
-
} .side-
|
|
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-
|
|
44
|
+
} .side-panel__sticky_15gdd {
|
|
45
45
|
position: sticky;
|
|
46
46
|
z-index: 1
|
|
47
|
-
} .side-
|
|
47
|
+
} .side-panel__sticky_15gdd.side-panel__hasContent_15gdd {
|
|
48
48
|
background: var(--side-panel-header-background);
|
|
49
|
-
} .side-
|
|
49
|
+
} .side-panel__header_15gdd.side-panel__backgroundImage_15gdd {
|
|
50
50
|
background: center no-repeat;
|
|
51
51
|
background-size: cover;
|
|
52
|
-
} .side-
|
|
52
|
+
} .side-panel__content_15gdd {
|
|
53
53
|
flex-grow: 1;
|
|
54
|
-
} .side-
|
|
54
|
+
} .side-panel__title_15gdd {
|
|
55
55
|
word-break: break-word;
|
|
56
|
-
} .side-
|
|
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-
|
|
63
|
+
} .side-panel__closer_15gdd {
|
|
64
64
|
margin-left: auto;
|
|
65
|
-
} .side-
|
|
65
|
+
} .side-panel__right_15gdd {
|
|
66
66
|
justify-content: flex-end;
|
|
67
67
|
text-align: right;
|
|
68
|
-
} .side-
|
|
68
|
+
} .side-panel__trim_15gdd {
|
|
69
69
|
overflow: hidden
|
|
70
|
-
} .side-
|
|
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:
|
|
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-
|
|
41
|
+
} .side-panel__header_6bhp6 {
|
|
42
42
|
padding: var(--side-panel-header-mobile-paddings);
|
|
43
|
-
} .side-
|
|
43
|
+
} .side-panel__sticky_6bhp6 {
|
|
44
44
|
top: 0;
|
|
45
|
-
} .side-
|
|
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);
|
package/modern/desktop.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* hash:
|
|
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-
|
|
31
|
+
} .side-panel__s_1ke29 {
|
|
32
32
|
width: var(--side-panel-s-width);
|
|
33
|
-
} .side-
|
|
33
|
+
} .side-panel__hidden_1ke29 {
|
|
34
34
|
overflow-x: hidden;
|
|
35
35
|
}
|
package/modern/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
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:
|
|
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-
|
|
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-
|
|
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";
|
package/modern/shared.js
ADDED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
/* hash:
|
|
2
|
-
.side-
|
|
1
|
+
/* hash: 19z9l */
|
|
2
|
+
.side-panel__enterRight_co1v7 {
|
|
3
3
|
opacity: 0;
|
|
4
4
|
transform: translateX(15px);
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
.side-
|
|
7
|
+
.side-panel__enterLeft_co1v7 {
|
|
8
8
|
opacity: 0;
|
|
9
9
|
transform: translateX(-15px);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
.side-
|
|
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-
|
|
18
|
+
.side-panel__exit_co1v7 {
|
|
19
19
|
opacity: 1;
|
|
20
20
|
transform: translateX(0);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
.side-
|
|
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-
|
|
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:
|
|
2
|
-
.side-
|
|
3
|
-
.side-
|
|
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-
|
|
9
|
-
.side-
|
|
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-
|
|
15
|
+
.side-panel__exit_1rr7d {
|
|
16
16
|
opacity: 1;
|
|
17
17
|
transform: translateY(0);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
.side-
|
|
21
|
-
.side-
|
|
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
|
+
"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.
|
|
18
|
-
"@alfalab/core-components-drawer": "^
|
|
19
|
-
"@alfalab/core-components-mq": "^4.
|
|
20
|
-
"@alfalab/core-components-navigation-bar": "^0.
|
|
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,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
|
+
});
|
package/src/Context.tsx
ADDED
|
@@ -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
|
+
};
|