@hh.ru/magritte-ui-nav-bar 1.4.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.css +97 -101
- package/index.js +1 -1
- package/internal/useBindScrollToAnimationProgress.d.ts +1 -1
- package/internal/useBindScrollToAnimationProgress.js +62 -28
- package/internal/useBindScrollToAnimationProgress.js.map +1 -1
- package/nav-bar-u4djNNnN.js +5 -0
- package/nav-bar-u4djNNnN.js.map +1 -0
- package/package.json +4 -4
- package/public/Actions.js +1 -1
- package/public/LayoutMorph.js +1 -1
- package/public/LayoutStage.js +1 -1
- package/public/Morph.js +1 -1
- package/public/NavBar.d.ts +5 -0
- package/public/NavBar.js +14 -5
- package/public/NavBar.js.map +1 -1
- package/public/Pane.js +1 -1
- package/public/Stage.js +1 -1
- package/public/TitleContainer.js +1 -1
- package/nav-bar-B7uPipzE.js +0 -5
- package/nav-bar-B7uPipzE.js.map +0 -1
package/index.css
CHANGED
|
@@ -9,94 +9,90 @@
|
|
|
9
9
|
--magritte-color-text-primary-v24-7-1:#ffffff;
|
|
10
10
|
--magritte-color-text-secondary-v24-7-1:#ABABAB;
|
|
11
11
|
}
|
|
12
|
-
.magritte-actions-container___CBgYW_1-
|
|
12
|
+
.magritte-actions-container___CBgYW_1-5-1{
|
|
13
13
|
display:flex;
|
|
14
14
|
flex-direction:row;
|
|
15
15
|
gap:12px;
|
|
16
16
|
min-height:40px;
|
|
17
17
|
}
|
|
18
|
-
.magritte-actions-no-children___rgJUl_1-
|
|
18
|
+
.magritte-actions-no-children___rgJUl_1-5-1{
|
|
19
19
|
justify-content:space-between;
|
|
20
20
|
}
|
|
21
|
-
.magritte-actions-left-slot___DNOj0_1-
|
|
22
|
-
.magritte-actions-right-slot___aodtj_1-
|
|
21
|
+
.magritte-actions-left-slot___DNOj0_1-5-1,
|
|
22
|
+
.magritte-actions-right-slot___aodtj_1-5-1{
|
|
23
23
|
display:grid;
|
|
24
24
|
flex:0 0 auto;
|
|
25
25
|
--magritte-ui-icon-margin-not-transparent:var(--magritte-ui-navbar-actions-icon-margin-not-transparent-override, -8px);
|
|
26
26
|
--magritte-ui-icon-margin-transparent:var(--magritte-ui-navbar-actions-icon-margin-transparent-override, 0);
|
|
27
27
|
--magritte-ui-icon-margin-delta:calc(var(--magritte-ui-icon-margin-not-transparent) - var(--magritte-ui-icon-margin-transparent));
|
|
28
28
|
}
|
|
29
|
-
.magritte-navbar-transparent-end___6KqLR_1-
|
|
30
|
-
.magritte-navbar-transparent-start___wysv0_1-
|
|
31
|
-
.magritte-navbar-not-transparent___5KZNp_1-
|
|
32
|
-
.magritte-navbar-not-transparent___5KZNp_1-4-0 .magritte-actions-end-stage___qHtTV_1-4-0 .magritte-actions-left-slot___DNOj0_1-4-0 .magritte-actions-side-slot-content___TlHrX_1-4-0 > .magritte-actions-icon-morph___-nNgW_1-4-0:first-child{
|
|
29
|
+
.magritte-navbar-transparent-end___6KqLR_1-5-1 .magritte-actions-start-stage___MJ67a_1-5-1 .magritte-actions-left-slot___DNOj0_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:first-child,
|
|
30
|
+
.magritte-navbar-transparent-start___wysv0_1-5-1 .magritte-actions-end-stage___qHtTV_1-5-1 .magritte-actions-left-slot___DNOj0_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:first-child,
|
|
31
|
+
.magritte-navbar-not-transparent___5KZNp_1-5-1 .magritte-actions-left-slot___DNOj0_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:first-child{
|
|
33
32
|
margin-left:var(--magritte-ui-icon-margin-not-transparent);
|
|
34
33
|
}
|
|
35
|
-
.magritte-navbar-transparent-end___6KqLR_1-
|
|
36
|
-
.magritte-navbar-transparent-start___wysv0_1-
|
|
37
|
-
.magritte-navbar-not-transparent___5KZNp_1-
|
|
38
|
-
.magritte-navbar-not-transparent___5KZNp_1-4-0 .magritte-actions-end-stage___qHtTV_1-4-0 .magritte-actions-right-slot___aodtj_1-4-0 .magritte-actions-side-slot-content___TlHrX_1-4-0 > .magritte-actions-icon-morph___-nNgW_1-4-0:last-child{
|
|
34
|
+
.magritte-navbar-transparent-end___6KqLR_1-5-1 .magritte-actions-start-stage___MJ67a_1-5-1 .magritte-actions-right-slot___aodtj_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:last-child,
|
|
35
|
+
.magritte-navbar-transparent-start___wysv0_1-5-1 .magritte-actions-end-stage___qHtTV_1-5-1 .magritte-actions-right-slot___aodtj_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:last-child,
|
|
36
|
+
.magritte-navbar-not-transparent___5KZNp_1-5-1 .magritte-actions-right-slot___aodtj_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:last-child{
|
|
39
37
|
margin-right:var(--magritte-ui-icon-margin-not-transparent);
|
|
40
38
|
}
|
|
41
|
-
.magritte-navbar-transparent-end___6KqLR_1-
|
|
42
|
-
.magritte-navbar-transparent-start___wysv0_1-
|
|
43
|
-
.magritte-navbar-transparent___ULEh8_1-
|
|
44
|
-
.magritte-navbar-transparent___ULEh8_1-4-0 .magritte-actions-end-stage___qHtTV_1-4-0 .magritte-actions-left-slot___DNOj0_1-4-0 .magritte-actions-side-slot-content___TlHrX_1-4-0 > .magritte-actions-icon-morph___-nNgW_1-4-0:first-child{
|
|
39
|
+
.magritte-navbar-transparent-end___6KqLR_1-5-1 .magritte-actions-end-stage___qHtTV_1-5-1 .magritte-actions-left-slot___DNOj0_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:first-child,
|
|
40
|
+
.magritte-navbar-transparent-start___wysv0_1-5-1 .magritte-actions-start-stage___MJ67a_1-5-1 .magritte-actions-left-slot___DNOj0_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:first-child,
|
|
41
|
+
.magritte-navbar-transparent___ULEh8_1-5-1 .magritte-actions-left-slot___DNOj0_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:first-child{
|
|
45
42
|
margin-left:var(--magritte-ui-icon-margin-transparent);
|
|
46
43
|
}
|
|
47
|
-
.magritte-navbar-transparent-end___6KqLR_1-
|
|
48
|
-
.magritte-navbar-transparent-start___wysv0_1-
|
|
49
|
-
.magritte-navbar-transparent___ULEh8_1-
|
|
50
|
-
.magritte-navbar-transparent___ULEh8_1-4-0 .magritte-actions-end-stage___qHtTV_1-4-0 .magritte-actions-right-slot___aodtj_1-4-0 .magritte-actions-side-slot-content___TlHrX_1-4-0 > .magritte-actions-icon-morph___-nNgW_1-4-0:last-child{
|
|
44
|
+
.magritte-navbar-transparent-end___6KqLR_1-5-1 .magritte-actions-end-stage___qHtTV_1-5-1 .magritte-actions-right-slot___aodtj_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:last-child,
|
|
45
|
+
.magritte-navbar-transparent-start___wysv0_1-5-1 .magritte-actions-start-stage___MJ67a_1-5-1 .magritte-actions-right-slot___aodtj_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:last-child,
|
|
46
|
+
.magritte-navbar-transparent___ULEh8_1-5-1 .magritte-actions-right-slot___aodtj_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:last-child{
|
|
51
47
|
margin-right:var(--magritte-ui-icon-margin-transparent);
|
|
52
48
|
}
|
|
53
|
-
.magritte-navbar-transparent-start___wysv0_1-
|
|
54
|
-
.magritte-navbar-transparent-start___wysv0_1-
|
|
49
|
+
.magritte-navbar-transparent-start___wysv0_1-5-1 .magritte-actions-only-stage___cg10A_1-5-1 .magritte-actions-left-slot___DNOj0_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:first-child,
|
|
50
|
+
.magritte-navbar-transparent-start___wysv0_1-5-1 .magritte-actions-only-stage___cg10A_1-5-1 .magritte-actions-right-slot___aodtj_1-5-1 .magritte-actions-side-slot-content-clone___jDxVm_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:first-child{
|
|
55
51
|
margin-left:calc(var(--magritte-ui-icon-margin-transparent) + (var(--magritte-ui-icon-margin-delta) * var(--magritte-ui-navbar-animation-progress)));
|
|
56
52
|
}
|
|
57
|
-
.magritte-navbar-transparent-start___wysv0_1-
|
|
58
|
-
.magritte-navbar-transparent-start___wysv0_1-
|
|
53
|
+
.magritte-navbar-transparent-start___wysv0_1-5-1 .magritte-actions-only-stage___cg10A_1-5-1 .magritte-actions-right-slot___aodtj_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:last-child,
|
|
54
|
+
.magritte-navbar-transparent-start___wysv0_1-5-1 .magritte-actions-only-stage___cg10A_1-5-1 .magritte-actions-left-slot___DNOj0_1-5-1 .magritte-actions-side-slot-content-clone___jDxVm_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:last-child{
|
|
59
55
|
margin-right:calc(var(--magritte-ui-icon-margin-transparent) + (var(--magritte-ui-icon-margin-delta) * var(--magritte-ui-navbar-animation-progress)));
|
|
60
56
|
}
|
|
61
|
-
.magritte-navbar-transparent-end___6KqLR_1-
|
|
62
|
-
.magritte-navbar-transparent-end___6KqLR_1-
|
|
57
|
+
.magritte-navbar-transparent-end___6KqLR_1-5-1 .magritte-actions-only-stage___cg10A_1-5-1 .magritte-actions-left-slot___DNOj0_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:first-child,
|
|
58
|
+
.magritte-navbar-transparent-end___6KqLR_1-5-1 .magritte-actions-only-stage___cg10A_1-5-1 .magritte-actions-right-slot___aodtj_1-5-1 .magritte-actions-side-slot-content-clone___jDxVm_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:first-child{
|
|
63
59
|
margin-left:calc(var(--magritte-ui-icon-margin-not-transparent) - (var(--magritte-ui-icon-margin-delta) * var(--magritte-ui-navbar-animation-progress)));
|
|
64
60
|
}
|
|
65
|
-
.magritte-navbar-transparent-end___6KqLR_1-
|
|
66
|
-
.magritte-navbar-transparent-end___6KqLR_1-
|
|
61
|
+
.magritte-navbar-transparent-end___6KqLR_1-5-1 .magritte-actions-only-stage___cg10A_1-5-1 .magritte-actions-right-slot___aodtj_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:last-child,
|
|
62
|
+
.magritte-navbar-transparent-end___6KqLR_1-5-1 .magritte-actions-only-stage___cg10A_1-5-1 .magritte-actions-left-slot___DNOj0_1-5-1 .magritte-actions-side-slot-content-clone___jDxVm_1-5-1 > .magritte-actions-icon-morph___-nNgW_1-5-1:last-child{
|
|
67
63
|
margin-right:calc(var(--magritte-ui-icon-margin-not-transparent) - (var(--magritte-ui-icon-margin-delta) * var(--magritte-ui-navbar-animation-progress)));
|
|
68
64
|
}
|
|
69
|
-
.magritte-actions-center-slot___hLAy6_1-
|
|
65
|
+
.magritte-actions-center-slot___hLAy6_1-5-1{
|
|
70
66
|
display:flex;
|
|
71
67
|
flex:1 1 auto;
|
|
72
68
|
min-width:0;
|
|
73
69
|
}
|
|
74
|
-
.magritte-actions-center-slot___hLAy6_1-
|
|
70
|
+
.magritte-actions-center-slot___hLAy6_1-5-1.magritte-actions-center-slot-centered___merXQ_1-5-1{
|
|
75
71
|
justify-content:center;
|
|
76
72
|
}
|
|
77
|
-
.magritte-actions-side-slot-content___TlHrX_1-
|
|
78
|
-
.magritte-actions-side-slot-content-clone___jDxVm_1-
|
|
73
|
+
.magritte-actions-side-slot-content___TlHrX_1-5-1,
|
|
74
|
+
.magritte-actions-side-slot-content-clone___jDxVm_1-5-1{
|
|
79
75
|
grid-area:1 / 1;
|
|
80
76
|
display:flex;
|
|
81
77
|
align-items:center;
|
|
82
78
|
gap:4px;
|
|
83
79
|
}
|
|
84
|
-
.magritte-align-top___-QSFW_1-
|
|
85
|
-
.magritte-align-top___-QSFW_1-
|
|
80
|
+
.magritte-align-top___-QSFW_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1,
|
|
81
|
+
.magritte-align-top___-QSFW_1-5-1 .magritte-actions-side-slot-content-clone___jDxVm_1-5-1{
|
|
86
82
|
align-items:start;
|
|
87
83
|
}
|
|
88
|
-
.magritte-align-bottom___FliHI_1-
|
|
89
|
-
.magritte-align-bottom___FliHI_1-
|
|
84
|
+
.magritte-align-bottom___FliHI_1-5-1 .magritte-actions-side-slot-content___TlHrX_1-5-1,
|
|
85
|
+
.magritte-align-bottom___FliHI_1-5-1 .magritte-actions-side-slot-content-clone___jDxVm_1-5-1{
|
|
90
86
|
align-items:end;
|
|
91
87
|
}
|
|
92
|
-
.magritte-actions-side-slot-content-clone___jDxVm_1-
|
|
88
|
+
.magritte-actions-side-slot-content-clone___jDxVm_1-5-1{
|
|
93
89
|
visibility:hidden;
|
|
94
90
|
z-index:0;
|
|
95
91
|
pointer-events:none;
|
|
96
92
|
user-select:none;
|
|
97
93
|
contain:style layout;
|
|
98
94
|
}
|
|
99
|
-
.magritte-title-container-wrapper___DQUcj_1-
|
|
95
|
+
.magritte-title-container-wrapper___DQUcj_1-5-1{
|
|
100
96
|
display:flex;
|
|
101
97
|
flex-direction:row;
|
|
102
98
|
align-items:center;
|
|
@@ -104,28 +100,28 @@
|
|
|
104
100
|
min-width:0;
|
|
105
101
|
gap:12px;
|
|
106
102
|
}
|
|
107
|
-
.magritte-title-main-part___npoHN_1-
|
|
103
|
+
.magritte-title-main-part___npoHN_1-5-1{
|
|
108
104
|
display:flex;
|
|
109
105
|
flex-direction:column;
|
|
110
106
|
flex:0 1 auto;
|
|
111
107
|
min-width:0;
|
|
112
108
|
}
|
|
113
|
-
.magritte-title-left-slot___HTE7h_1-
|
|
109
|
+
.magritte-title-left-slot___HTE7h_1-5-1{
|
|
114
110
|
display:flex;
|
|
115
111
|
align-items:center;
|
|
116
112
|
flex:0 0 auto;
|
|
117
113
|
}
|
|
118
|
-
.magritte-title-container___y9AIx_1-
|
|
114
|
+
.magritte-title-container___y9AIx_1-5-1{
|
|
119
115
|
display:flex;
|
|
120
116
|
flex-direction:row;
|
|
121
117
|
align-items:center;
|
|
122
118
|
gap:5px;
|
|
123
119
|
min-height:var(--magritte-ui-navbar-title-container-min-height-small-override, 0);
|
|
124
120
|
}
|
|
125
|
-
.magritte-subtitle-container___nVUBu_1-
|
|
121
|
+
.magritte-subtitle-container___nVUBu_1-5-1{
|
|
126
122
|
display:flex;
|
|
127
123
|
}
|
|
128
|
-
.magritte-subtitle-container___nVUBu_1-
|
|
124
|
+
.magritte-subtitle-container___nVUBu_1-5-1 .magritte-text-morph-item___-vXru_1-5-1{
|
|
129
125
|
color:var(--magritte-ui-nav-bar-subtitle-color-override, var(--magritte-color-text-secondary-v24-7-1));
|
|
130
126
|
font-family:"hh sans";
|
|
131
127
|
font-weight:400;
|
|
@@ -136,20 +132,20 @@
|
|
|
136
132
|
text-transform:none;
|
|
137
133
|
text-decoration:none;
|
|
138
134
|
}
|
|
139
|
-
.magritte-centered___Y2mlP_1-
|
|
140
|
-
.magritte-centered___Y2mlP_1-
|
|
135
|
+
.magritte-centered___Y2mlP_1-5-1 .magritte-subtitle-container___nVUBu_1-5-1,
|
|
136
|
+
.magritte-centered___Y2mlP_1-5-1 .magritte-title-container___y9AIx_1-5-1{
|
|
141
137
|
justify-content:center;
|
|
142
138
|
}
|
|
143
|
-
.magritte-title-morph-item___t7Wf3_1-
|
|
139
|
+
.magritte-title-morph-item___t7Wf3_1-5-1{
|
|
144
140
|
display:flex;
|
|
145
141
|
min-width:0;
|
|
146
142
|
}
|
|
147
|
-
.magritte-title___ZbLgP_1-
|
|
143
|
+
.magritte-title___ZbLgP_1-5-1{
|
|
148
144
|
display:flex;
|
|
149
145
|
flex:0 1 auto;
|
|
150
146
|
min-width:0;
|
|
151
147
|
}
|
|
152
|
-
.magritte-title___ZbLgP_1-
|
|
148
|
+
.magritte-title___ZbLgP_1-5-1 .magritte-text-morph-item___-vXru_1-5-1{
|
|
153
149
|
color:var(--magritte-ui-nav-bar-title-color-override, var(--magritte-color-text-primary-v24-7-1));
|
|
154
150
|
font-family:"hh sans";
|
|
155
151
|
font-weight:500;
|
|
@@ -160,13 +156,13 @@
|
|
|
160
156
|
text-transform:none;
|
|
161
157
|
text-decoration:none;
|
|
162
158
|
}
|
|
163
|
-
.magritte-size-large___ISXfH_1-
|
|
159
|
+
.magritte-size-large___ISXfH_1-5-1 .magritte-title-main-part___npoHN_1-5-1{
|
|
164
160
|
gap:4px;
|
|
165
161
|
}
|
|
166
|
-
.magritte-size-large___ISXfH_1-
|
|
162
|
+
.magritte-size-large___ISXfH_1-5-1 .magritte-title-container___y9AIx_1-5-1{
|
|
167
163
|
min-height:var(--magritte-ui-navbar-title-container-min-height-large-override, 0);
|
|
168
164
|
}
|
|
169
|
-
.magritte-size-large___ISXfH_1-
|
|
165
|
+
.magritte-size-large___ISXfH_1-5-1 .magritte-title___ZbLgP_1-5-1 .magritte-text-morph-item___-vXru_1-5-1{
|
|
170
166
|
font-family:"hh sans";
|
|
171
167
|
font-weight:500;
|
|
172
168
|
line-height:32px;
|
|
@@ -176,7 +172,7 @@
|
|
|
176
172
|
text-transform:none;
|
|
177
173
|
text-decoration:none;
|
|
178
174
|
}
|
|
179
|
-
.magritte-size-large___ISXfH_1-
|
|
175
|
+
.magritte-size-large___ISXfH_1-5-1 .magritte-subtitle-container___nVUBu_1-5-1 .magritte-text-morph-item___-vXru_1-5-1{
|
|
180
176
|
font-family:"hh sans";
|
|
181
177
|
font-weight:400;
|
|
182
178
|
line-height:22px;
|
|
@@ -186,12 +182,12 @@
|
|
|
186
182
|
text-transform:none;
|
|
187
183
|
text-decoration:none;
|
|
188
184
|
}
|
|
189
|
-
.magritte-pane-content___UVmC6_1-
|
|
185
|
+
.magritte-pane-content___UVmC6_1-5-1{
|
|
190
186
|
position:relative;
|
|
191
187
|
pointer-events:none;
|
|
192
188
|
z-index:2;
|
|
193
189
|
}
|
|
194
|
-
.magritte-pane-background___PDZAX_1-
|
|
190
|
+
.magritte-pane-background___PDZAX_1-5-1{
|
|
195
191
|
position:absolute;
|
|
196
192
|
background-color:var(--magritte-ui-nav-bar-background-color-override, var(--magritte-ui-container-background-color-override, var(--magritte-color-background-body-v24-7-1)));
|
|
197
193
|
opacity:0;
|
|
@@ -199,43 +195,43 @@
|
|
|
199
195
|
z-index:-1;
|
|
200
196
|
transform-origin:0 0;
|
|
201
197
|
}
|
|
202
|
-
.magritte-navbar-transparent-start___wysv0_1-
|
|
198
|
+
.magritte-navbar-transparent-start___wysv0_1-5-1 .magritte-pane-background___PDZAX_1-5-1{
|
|
203
199
|
opacity:calc(var(--magritte-ui-navbar-animation-progress) * 0.95);
|
|
204
200
|
}
|
|
205
|
-
.magritte-navbar-transparent-end___6KqLR_1-
|
|
201
|
+
.magritte-navbar-transparent-end___6KqLR_1-5-1 .magritte-pane-background___PDZAX_1-5-1{
|
|
206
202
|
opacity:calc((1 - var(--magritte-ui-navbar-animation-progress)) * 0.95);
|
|
207
203
|
}
|
|
208
|
-
.magritte-navbar-not-transparent___5KZNp_1-
|
|
204
|
+
.magritte-navbar-not-transparent___5KZNp_1-5-1 .magritte-pane-background___PDZAX_1-5-1{
|
|
209
205
|
opacity:0.95;
|
|
210
206
|
}
|
|
211
|
-
.magritte-morph-item___8kF46_1-
|
|
207
|
+
.magritte-morph-item___8kF46_1-5-1{
|
|
212
208
|
line-height:0;
|
|
213
209
|
transform-origin:var(--magritte-ui-morph-item-transform-origin-x, center) var(--magritte-ui-morph-item-transform-origin-y, center);
|
|
214
210
|
}
|
|
215
|
-
.magritte-morph-item-top___WPEkn_1-
|
|
211
|
+
.magritte-morph-item-top___WPEkn_1-5-1{
|
|
216
212
|
--magritte-ui-morph-item-transform-origin-y:top;
|
|
217
213
|
}
|
|
218
|
-
.magritte-morph-item-bottom___zNbsF_1-
|
|
214
|
+
.magritte-morph-item-bottom___zNbsF_1-5-1{
|
|
219
215
|
--magritte-ui-morph-item-transform-origin-y:bottom;
|
|
220
216
|
}
|
|
221
|
-
.magritte-morph-item-left___T6AMW_1-
|
|
217
|
+
.magritte-morph-item-left___T6AMW_1-5-1{
|
|
222
218
|
--magritte-ui-morph-item-transform-origin-x:left;
|
|
223
219
|
}
|
|
224
|
-
.magritte-morph-item-right___EuT1E_1-
|
|
220
|
+
.magritte-morph-item-right___EuT1E_1-5-1{
|
|
225
221
|
--magritte-ui-morph-item-transform-origin-x:right;
|
|
226
222
|
}
|
|
227
|
-
.magritte-pane___f8eFC_1-
|
|
223
|
+
.magritte-pane___f8eFC_1-5-1{
|
|
228
224
|
position:relative;
|
|
229
225
|
overflow:hidden;
|
|
230
226
|
pointer-events:none;
|
|
231
227
|
}
|
|
232
|
-
.magritte-start-state-container___giBVb_1-
|
|
228
|
+
.magritte-start-state-container___giBVb_1-5-1{
|
|
233
229
|
position:relative;
|
|
234
230
|
z-index:1;
|
|
235
231
|
box-sizing:border-box;
|
|
236
232
|
pointer-events:auto;
|
|
237
233
|
}
|
|
238
|
-
.magritte-end-state-container___uiW8Q_1-
|
|
234
|
+
.magritte-end-state-container___uiW8Q_1-5-1{
|
|
239
235
|
position:absolute;
|
|
240
236
|
z-index:0;
|
|
241
237
|
top:0;
|
|
@@ -244,66 +240,66 @@
|
|
|
244
240
|
pointer-events:none;
|
|
245
241
|
opacity:0;
|
|
246
242
|
}
|
|
247
|
-
.magritte-content-container___7s7vv_1-
|
|
243
|
+
.magritte-content-container___7s7vv_1-5-1{
|
|
248
244
|
box-sizing:border-box;
|
|
249
245
|
}
|
|
250
|
-
.magritte-next-pane___H2oxQ_1-
|
|
246
|
+
.magritte-next-pane___H2oxQ_1-5-1{
|
|
251
247
|
position:relative;
|
|
252
248
|
}
|
|
253
|
-
.magritte-nav-bar___RRGe0_1-
|
|
249
|
+
.magritte-nav-bar___RRGe0_1-5-1{
|
|
254
250
|
top:0;
|
|
255
251
|
position:sticky;
|
|
256
252
|
pointer-events:none;
|
|
257
253
|
overflow-anchor:none;
|
|
258
254
|
z-index:10;
|
|
259
255
|
}
|
|
260
|
-
.magritte-nav-bar-overlay___Mq5ZD_1-
|
|
256
|
+
.magritte-nav-bar-overlay___Mq5ZD_1-5-1 .magritte-nav-bar-overlay-wrapper___y1VpY_1-5-1{
|
|
261
257
|
position:absolute;
|
|
262
258
|
inset:0;
|
|
263
259
|
}
|
|
264
|
-
.magritte-nav-bar-content-container___H-WMO_1-
|
|
260
|
+
.magritte-nav-bar-content-container___H-WMO_1-5-1{
|
|
265
261
|
display:grid;
|
|
266
262
|
position:relative;
|
|
267
263
|
}
|
|
268
|
-
.magritte-nav-bar-panes-container___5ZDLa_1-
|
|
264
|
+
.magritte-nav-bar-panes-container___5ZDLa_1-5-1{
|
|
269
265
|
position:relative;
|
|
270
266
|
z-index:1;
|
|
271
267
|
grid-area:1 / 1;
|
|
272
268
|
min-width:0;
|
|
273
269
|
}
|
|
274
|
-
.magritte-nav-bar-progressive-blur___qyeUV_1-
|
|
270
|
+
.magritte-nav-bar-progressive-blur___qyeUV_1-5-1{
|
|
275
271
|
position:relative;
|
|
276
272
|
z-index:0;
|
|
277
273
|
transform-origin:0 0;
|
|
278
274
|
grid-area:1 / 1;
|
|
279
275
|
min-width:0;
|
|
280
276
|
}
|
|
281
|
-
.magritte-nav-bar-content-container___H-WMO_1-
|
|
282
|
-
.magritte-nav-bar-content-container___H-WMO_1-
|
|
283
|
-
.magritte-nav-bar-content-container___H-WMO_1-
|
|
277
|
+
.magritte-nav-bar-content-container___H-WMO_1-5-1 .magritte-nav-bar-stage___amDz7_1-5-1,
|
|
278
|
+
.magritte-nav-bar-content-container___H-WMO_1-5-1 .nav-bar-layout-animation-stage-start,
|
|
279
|
+
.magritte-nav-bar-content-container___H-WMO_1-5-1 .nav-bar-layout-animation-stage-end{
|
|
284
280
|
padding-top:calc(8px + var(--magritte-ui-nav-bar-padding-top-override, 0px));
|
|
285
281
|
}
|
|
286
|
-
.magritte-nav-bar-content-container___H-WMO_1-
|
|
287
|
-
.magritte-nav-bar-content-container___H-WMO_1-
|
|
288
|
-
.magritte-nav-bar-content-container___H-WMO_1-
|
|
282
|
+
.magritte-nav-bar-content-container___H-WMO_1-5-1 .magritte-next-pane___H2oxQ_1-5-1 .magritte-nav-bar-stage___amDz7_1-5-1,
|
|
283
|
+
.magritte-nav-bar-content-container___H-WMO_1-5-1 .magritte-next-pane___H2oxQ_1-5-1 .nav-bar-layout-animation-stage-start,
|
|
284
|
+
.magritte-nav-bar-content-container___H-WMO_1-5-1 .magritte-next-pane___H2oxQ_1-5-1 .nav-bar-layout-animation-stage-end{
|
|
289
285
|
padding-top:8px;
|
|
290
286
|
}
|
|
291
|
-
.magritte-last-pane___Hf2No_1-
|
|
292
|
-
.magritte-last-pane___Hf2No_1-
|
|
293
|
-
.magritte-last-pane___Hf2No_1-
|
|
287
|
+
.magritte-last-pane___Hf2No_1-5-1 .magritte-nav-bar-stage___amDz7_1-5-1,
|
|
288
|
+
.magritte-last-pane___Hf2No_1-5-1 .nav-bar-layout-animation-stage-start,
|
|
289
|
+
.magritte-last-pane___Hf2No_1-5-1 .nav-bar-layout-animation-stage-end{
|
|
294
290
|
padding-bottom:var(--magritte-ui-nav-bar-stage-padding-bottom-override, 8px);
|
|
295
291
|
}
|
|
296
|
-
.magritte-next-pane___H2oxQ_1-
|
|
297
|
-
.magritte-next-pane___H2oxQ_1-
|
|
298
|
-
.magritte-next-pane___H2oxQ_1-
|
|
292
|
+
.magritte-next-pane___H2oxQ_1-5-1 .magritte-last-pane___Hf2No_1-5-1 .magritte-nav-bar-stage___amDz7_1-5-1,
|
|
293
|
+
.magritte-next-pane___H2oxQ_1-5-1 .magritte-last-pane___Hf2No_1-5-1 .nav-bar-layout-animation-stage-start,
|
|
294
|
+
.magritte-next-pane___H2oxQ_1-5-1 .magritte-last-pane___Hf2No_1-5-1 .nav-bar-layout-animation-stage-end{
|
|
299
295
|
padding-bottom:var(--magritte-ui-nav-bar-stage-padding-bottom-override, 16px);
|
|
300
296
|
}
|
|
301
|
-
.magritte-nav-bar-stage___amDz7_1-
|
|
297
|
+
.magritte-nav-bar-stage___amDz7_1-5-1{
|
|
302
298
|
padding:8px var(--magritte-ui-nav-bar-stage-horizontal-padding-override, 16px);
|
|
303
299
|
}
|
|
304
|
-
.magritte-metrics-mode___h38aX_1-
|
|
305
|
-
.magritte-metrics-mode___h38aX_1-
|
|
306
|
-
.magritte-metrics-mode___h38aX_1-
|
|
300
|
+
.magritte-metrics-mode___h38aX_1-5-1 .magritte-morph-item___8kF46_1-5-1,
|
|
301
|
+
.magritte-metrics-mode___h38aX_1-5-1 .magritte-pane___f8eFC_1-5-1,
|
|
302
|
+
.magritte-metrics-mode___h38aX_1-5-1 .magritte-next-pane___H2oxQ_1-5-1{
|
|
307
303
|
transform:none !important;
|
|
308
304
|
}
|
|
309
305
|
.nav-bar-layout-animation-stage-end,
|
|
@@ -314,49 +310,49 @@
|
|
|
314
310
|
height:auto !important;
|
|
315
311
|
transform:none !important;
|
|
316
312
|
}
|
|
317
|
-
.nav-bar-layout-animation-stage-end .magritte-layout-morph___I3SPy_1-
|
|
318
|
-
.nav-bar-layout-animation-stage-start .magritte-layout-morph___I3SPy_1-
|
|
313
|
+
.nav-bar-layout-animation-stage-end .magritte-layout-morph___I3SPy_1-5-1,
|
|
314
|
+
.nav-bar-layout-animation-stage-start .magritte-layout-morph___I3SPy_1-5-1{
|
|
319
315
|
position:static !important;
|
|
320
316
|
width:auto !important;
|
|
321
317
|
height:auto !important;
|
|
322
318
|
transform:none !important;
|
|
323
319
|
}
|
|
324
|
-
.magritte-layout-morph___I3SPy_1-
|
|
320
|
+
.magritte-layout-morph___I3SPy_1-5-1{
|
|
325
321
|
display:block;
|
|
326
322
|
position:absolute;
|
|
327
323
|
transform-origin:var(--magritte-ui-morph-item-transform-origin-x, center) var(--magritte-ui-morph-item-transform-origin-y, center);
|
|
328
324
|
z-index:3;
|
|
329
325
|
}
|
|
330
|
-
.magritte-animation-stage-progress___5FthT_1-
|
|
326
|
+
.magritte-animation-stage-progress___5FthT_1-5-1 .magritte-layout-morph___I3SPy_1-5-1 > *{
|
|
331
327
|
margin:0 !important;
|
|
332
328
|
}
|
|
333
|
-
.magritte-layout-morph-start___9-krP_1-
|
|
329
|
+
.magritte-layout-morph-start___9-krP_1-5-1{
|
|
334
330
|
z-index:2;
|
|
335
331
|
}
|
|
336
|
-
.magritte-layout-morph-end___LIg4d_1-
|
|
332
|
+
.magritte-layout-morph-end___LIg4d_1-5-1{
|
|
337
333
|
z-index:1;
|
|
338
334
|
}
|
|
339
|
-
.nav-bar-layout-animation-stage-start .magritte-layout-morph___I3SPy_1-
|
|
335
|
+
.nav-bar-layout-animation-stage-start .magritte-layout-morph___I3SPy_1-5-1{
|
|
340
336
|
display:contents;
|
|
341
337
|
}
|
|
342
|
-
.nav-bar-layout-animation-stage-start .magritte-layout-morph-end___LIg4d_1-
|
|
338
|
+
.nav-bar-layout-animation-stage-start .magritte-layout-morph-end___LIg4d_1-5-1{
|
|
343
339
|
display:none;
|
|
344
340
|
}
|
|
345
|
-
.nav-bar-layout-animation-stage-end .magritte-layout-morph___I3SPy_1-
|
|
341
|
+
.nav-bar-layout-animation-stage-end .magritte-layout-morph___I3SPy_1-5-1{
|
|
346
342
|
display:contents;
|
|
347
343
|
}
|
|
348
|
-
.nav-bar-layout-animation-stage-end .magritte-layout-morph-start___9-krP_1-
|
|
344
|
+
.nav-bar-layout-animation-stage-end .magritte-layout-morph-start___9-krP_1-5-1{
|
|
349
345
|
display:none;
|
|
350
346
|
}
|
|
351
|
-
.magritte-divider-container___-NdWi_1-
|
|
347
|
+
.magritte-divider-container___-NdWi_1-5-1{
|
|
352
348
|
position:absolute;
|
|
353
349
|
width:100%;
|
|
354
350
|
bottom:0;
|
|
355
351
|
z-index:1;
|
|
356
352
|
}
|
|
357
|
-
.magritte-navbar-transparent-start___wysv0_1-
|
|
353
|
+
.magritte-navbar-transparent-start___wysv0_1-5-1 .magritte-divider-container___-NdWi_1-5-1 .magritte-divider___UhH0j_1-5-1{
|
|
358
354
|
opacity:var(--magritte-ui-navbar-animation-progress);
|
|
359
355
|
}
|
|
360
|
-
.magritte-navbar-transparent-end___6KqLR_1-
|
|
356
|
+
.magritte-navbar-transparent-end___6KqLR_1-5-1 .magritte-divider-container___-NdWi_1-5-1 .magritte-divider___UhH0j_1-5-1{
|
|
361
357
|
opacity:calc(1 - var(--magritte-ui-navbar-animation-progress));
|
|
362
358
|
}
|
package/index.js
CHANGED
|
@@ -15,7 +15,7 @@ import 'react/jsx-runtime';
|
|
|
15
15
|
import 'react';
|
|
16
16
|
import 'classnames';
|
|
17
17
|
import '@hh.ru/magritte-ui-icon';
|
|
18
|
-
import './nav-bar-
|
|
18
|
+
import './nav-bar-u4djNNnN.js';
|
|
19
19
|
import './internal/MetricsProvider.js';
|
|
20
20
|
import './internal/utils.js';
|
|
21
21
|
import 'motion';
|
|
@@ -7,4 +7,4 @@ import { type TriggerEdge } from '@hh.ru/magritte-ui-nav-bar/public/TriggerConte
|
|
|
7
7
|
export declare const useBindScrollToAnimationProgress: (scrollPosition: MotionValue<number>, getNavBarMetrics: () => NavBarMetrics, getAnimationRanges: () => AnimationRanges, scrollAdapter: ScrollAdapter, startTriggerPosition: "start" | "full-area" | RefObject<HTMLElement | null>, endTriggerPosition: RefObject<HTMLElement | null> | number | undefined, startTriggerEdge?: TriggerEdge, endTriggerEdge?: TriggerEdge) => [VoidFunction, () => {
|
|
8
8
|
top: number;
|
|
9
9
|
bottom: number;
|
|
10
|
-
}, MotionValue<number>, MotionStyle];
|
|
10
|
+
}, MotionValue<number>, MotionStyle, VoidFunction];
|
|
@@ -5,14 +5,20 @@ import { useActualRef, useInitOnce, getRelativeOffset, remap, clamp } from './ut
|
|
|
5
5
|
import 'motion';
|
|
6
6
|
|
|
7
7
|
const createScrollToAnimationProgressMapFn = (getNavBarMetrics, scrollAdapter, animationRanges, startTriggerPosition, endTriggerPosition, startTriggerEdge, endTriggerEdge) => {
|
|
8
|
-
const maxScrollTop = scrollAdapter.getMaxScrollTop();
|
|
9
8
|
const { heightDelta, top, bottom, animationHeight } = getNavBarMetrics();
|
|
10
9
|
if (startTriggerPosition === 'full-area') {
|
|
11
10
|
let currentStart = top;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
// Зависит от maxScrollTop — поэтому считается в recompute и может быть обновлено без полной пересборки.
|
|
12
|
+
let maxProgress = 1;
|
|
13
|
+
const recompute = () => {
|
|
14
|
+
const maxScrollTop = scrollAdapter.getMaxScrollTop();
|
|
15
|
+
maxProgress =
|
|
16
|
+
maxScrollTop >= animationHeight + top
|
|
17
|
+
? 1
|
|
18
|
+
: (animationRanges.find((range) => range[0] * animationHeight <= maxScrollTop - top) ?? [0])[0];
|
|
19
|
+
};
|
|
20
|
+
recompute();
|
|
21
|
+
const map = (scrollPosition) => {
|
|
16
22
|
const progress = (scrollPosition - currentStart) / animationHeight;
|
|
17
23
|
if (progress > maxProgress) {
|
|
18
24
|
currentStart = scrollPosition - animationHeight * maxProgress;
|
|
@@ -27,29 +33,46 @@ const createScrollToAnimationProgressMapFn = (getNavBarMetrics, scrollAdapter, a
|
|
|
27
33
|
bottom: currentStart,
|
|
28
34
|
top: currentStart + animationHeight * maxProgress,
|
|
29
35
|
});
|
|
30
|
-
return
|
|
36
|
+
return { map, getClosestStops, recompute };
|
|
31
37
|
}
|
|
32
38
|
let startPos = startTriggerPosition === 'start' || !startTriggerPosition.current
|
|
33
39
|
? 0
|
|
34
40
|
: getRelativeOffset(scrollAdapter, startTriggerPosition.current, startTriggerEdge) - bottom;
|
|
35
|
-
let
|
|
41
|
+
let fullEndPos;
|
|
36
42
|
if (typeof endTriggerPosition === 'number') {
|
|
37
|
-
|
|
43
|
+
fullEndPos = startPos + endTriggerPosition;
|
|
38
44
|
}
|
|
39
45
|
else {
|
|
40
|
-
|
|
46
|
+
fullEndPos = endTriggerPosition?.current
|
|
41
47
|
? getRelativeOffset(scrollAdapter, endTriggerPosition.current, endTriggerEdge) + heightDelta - bottom
|
|
42
48
|
: startPos + animationHeight;
|
|
43
49
|
}
|
|
44
|
-
|
|
50
|
+
fullEndPos += top;
|
|
45
51
|
startPos += top;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
const scrollDelta = fullEndPos - startPos;
|
|
53
|
+
// Конец анимации ограничиваем доступным скроллом: если контента не хватает доиграть анимацию целиком,
|
|
54
|
+
// останавливаемся на ближайшем достижимом стопе. Зависит только от maxScrollTop, поэтому пересобирается
|
|
55
|
+
// в recompute отдельно от дорогих измерений — как только появляется скролл, клампинг подхватит новое
|
|
56
|
+
// значение без полной пересборки привязки.
|
|
57
|
+
let clampedMap = remap([startPos, fullEndPos], [0, 1]);
|
|
58
|
+
let clampedEndPos = fullEndPos;
|
|
59
|
+
const recompute = () => {
|
|
60
|
+
const maxScrollTop = scrollAdapter.getMaxScrollTop();
|
|
61
|
+
let endProgress = 1;
|
|
62
|
+
let endPos = fullEndPos;
|
|
63
|
+
if (scrollDelta !== 0 && fullEndPos > maxScrollTop) {
|
|
64
|
+
endProgress = (animationRanges.find((range) => range[0] * scrollDelta + startPos < maxScrollTop) ?? [0])[0];
|
|
65
|
+
endPos = startPos + scrollDelta * endProgress;
|
|
66
|
+
}
|
|
67
|
+
clampedEndPos = endPos;
|
|
68
|
+
clampedMap = remap([startPos, endPos], [0, endProgress]);
|
|
69
|
+
};
|
|
70
|
+
recompute();
|
|
71
|
+
return {
|
|
72
|
+
map: (scrollPosition) => clampedMap(scrollPosition),
|
|
73
|
+
getClosestStops: () => ({ bottom: startPos, top: clampedEndPos }),
|
|
74
|
+
recompute,
|
|
75
|
+
};
|
|
53
76
|
};
|
|
54
77
|
const isDividerVisible = (scrollTop, navBarTop, heightDelta, animationProgress) => Math.ceil(navBarTop + heightDelta * animationProgress) < Math.floor(scrollTop);
|
|
55
78
|
const useBindScrollToAnimationProgress = (scrollPosition, getNavBarMetrics, getAnimationRanges, scrollAdapter, startTriggerPosition, endTriggerPosition,
|
|
@@ -63,6 +86,9 @@ startTriggerEdge = 'top', endTriggerEdge = 'bottom') => {
|
|
|
63
86
|
const startTriggerEdgeRef = useActualRef(startTriggerEdge);
|
|
64
87
|
const endTriggerEdgeRef = useActualRef(endTriggerEdge);
|
|
65
88
|
const getClosestStopsRef = useRef(null);
|
|
89
|
+
const controllerRef = useRef(null);
|
|
90
|
+
// Применяет текущий маппинг к позиции скролла: ставит прогресс анимации и обновляет дивайдер.
|
|
91
|
+
const applyRef = useRef(null);
|
|
66
92
|
const bindScrollToAnimation = useInitOnce(() => {
|
|
67
93
|
let unsubscribe = null;
|
|
68
94
|
return () => {
|
|
@@ -74,20 +100,27 @@ startTriggerEdge = 'top', endTriggerEdge = 'bottom') => {
|
|
|
74
100
|
range[1] / animationHeight,
|
|
75
101
|
])),
|
|
76
102
|
].sort((a, b) => b[0] - a[0]);
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
103
|
+
const controller = createScrollToAnimationProgressMapFn(getNavBarMetrics, scrollAdapter, animationRanges, startTriggerPositionRef.current, endTriggerPositionRef.current, startTriggerEdgeRef.current, endTriggerEdgeRef.current);
|
|
104
|
+
controllerRef.current = controller;
|
|
105
|
+
getClosestStopsRef.current = controller.getClosestStops;
|
|
106
|
+
const apply = (scrollTop) => {
|
|
107
|
+
const progress = controller.map(scrollTop);
|
|
108
|
+
totalAnimationProgress.set(progress);
|
|
109
|
+
dividerVisibility.set(isDividerVisible(scrollTop, top, heightDelta, progress) ? 'visible' : 'hidden');
|
|
110
|
+
dividerOffsetY.set(-heightDelta * progress);
|
|
82
111
|
};
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
});
|
|
87
|
-
totalAnimationProgress.set(mapFn(scrollPosition.get()));
|
|
88
|
-
updateDivider(scrollPosition.get(), totalAnimationProgress.get());
|
|
112
|
+
applyRef.current = apply;
|
|
113
|
+
unsubscribe = scrollPosition.on('change', apply);
|
|
114
|
+
apply(scrollPosition.get());
|
|
89
115
|
};
|
|
90
116
|
});
|
|
117
|
+
// Дешёвый пересчёт клампинга конца анимации (зависит от maxScrollTop) без полного bindScrollToAnimation:
|
|
118
|
+
// не пере-измеряет метрики/триггеры и не переподписывается на скролл. Используется как обработчик ресайза
|
|
119
|
+
// для «самодостаточных» навбаров, где полная пересборка привязки на ресайз не требуется.
|
|
120
|
+
const recomputeClamp = useInitOnce(() => () => {
|
|
121
|
+
controllerRef.current?.recompute();
|
|
122
|
+
applyRef.current?.(scrollPosition.get());
|
|
123
|
+
});
|
|
91
124
|
const getClosestStops = useInitOnce(() => () => {
|
|
92
125
|
if (getClosestStopsRef.current) {
|
|
93
126
|
return getClosestStopsRef.current();
|
|
@@ -99,6 +132,7 @@ startTriggerEdge = 'top', endTriggerEdge = 'bottom') => {
|
|
|
99
132
|
getClosestStops,
|
|
100
133
|
totalAnimationProgress,
|
|
101
134
|
{ visibility: dividerVisibility, y: dividerOffsetY },
|
|
135
|
+
recomputeClamp,
|
|
102
136
|
];
|
|
103
137
|
};
|
|
104
138
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBindScrollToAnimationProgress.js","sources":["src/internal/useBindScrollToAnimationProgress.ts"],"sourcesContent":["import { type MutableRefObject, type RefObject, useRef } from 'react';\nimport { type MotionStyle, type MotionValue, useMotionValue } from 'motion/react';\n\nimport { type AnimationRanges } from '@hh.ru/magritte-ui-nav-bar/internal/useAnimationRanges';\nimport { type NavBarMetrics } from '@hh.ru/magritte-ui-nav-bar/internal/useNavBarMetrics';\nimport { type ScrollAdapter } from '@hh.ru/magritte-ui-nav-bar/internal/useScrollAdapter';\nimport { remap, clamp, useInitOnce, useActualRef, getRelativeOffset } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport { type TriggerEdge } from '@hh.ru/magritte-ui-nav-bar/public/TriggerContext';\n\nconst createScrollToAnimationProgressMapFn = (\n getNavBarMetrics: () => NavBarMetrics,\n scrollAdapter: ScrollAdapter,\n animationRanges: [number, number][],\n startTriggerPosition: 'start' | 'full-area' | RefObject<HTMLElement | null>,\n endTriggerPosition: RefObject<HTMLElement | null> | number | undefined,\n startTriggerEdge: TriggerEdge,\n endTriggerEdge: TriggerEdge\n) => {\n const maxScrollTop = scrollAdapter.getMaxScrollTop();\n const { heightDelta, top, bottom, animationHeight } = getNavBarMetrics();\n\n if (startTriggerPosition === 'full-area') {\n let currentStart = top;\n const maxProgress =\n maxScrollTop >= animationHeight + top\n ? 1\n : (animationRanges.find((range) => range[0] * animationHeight <= maxScrollTop - top) ?? [0])[0];\n\n const mapScrollToAnimationPropgress = (scrollPosition: number) => {\n const progress = (scrollPosition - currentStart) / animationHeight;\n if (progress > maxProgress) {\n currentStart = scrollPosition - animationHeight * maxProgress;\n } else if (progress < 0) {\n currentStart = scrollPosition;\n }\n currentStart = Math.max(currentStart, top);\n\n return clamp(progress, 0, maxProgress);\n };\n\n const getClosestStops = () => ({\n bottom: currentStart,\n top: currentStart + animationHeight * maxProgress,\n });\n\n return [mapScrollToAnimationPropgress, getClosestStops] as const;\n }\n\n let startPos =\n startTriggerPosition === 'start' || !startTriggerPosition.current\n ? 0\n : getRelativeOffset(scrollAdapter, startTriggerPosition.current, startTriggerEdge) - bottom;\n\n let endPos: number;\n if (typeof endTriggerPosition === 'number') {\n endPos = startPos + endTriggerPosition;\n } else {\n endPos = endTriggerPosition?.current\n ? getRelativeOffset(scrollAdapter, endTriggerPosition.current, endTriggerEdge) + heightDelta - bottom\n : startPos + animationHeight;\n }\n\n endPos += top;\n startPos += top;\n\n let endProgress = 1;\n if (endPos > maxScrollTop) {\n const scrollDelta = endPos - startPos;\n endProgress = (animationRanges.find((range) => range[0] * scrollDelta + startPos < maxScrollTop) ?? [0])[0];\n endPos = startPos + scrollDelta * endProgress;\n }\n\n return [remap([startPos, endPos], [0, endProgress]), () => ({ bottom: startPos, top: endPos })] as const;\n};\n\nconst isDividerVisible = (scrollTop: number, navBarTop: number, heightDelta: number, animationProgress: number) =>\n Math.ceil(navBarTop + heightDelta * animationProgress) < Math.floor(scrollTop);\n\nexport const useBindScrollToAnimationProgress = (\n scrollPosition: MotionValue<number>,\n getNavBarMetrics: () => NavBarMetrics,\n getAnimationRanges: () => AnimationRanges,\n scrollAdapter: ScrollAdapter,\n startTriggerPosition: 'start' | 'full-area' | RefObject<HTMLElement | null>,\n endTriggerPosition: RefObject<HTMLElement | null> | number | undefined,\n // Дефолты дублируют продуктовые дефолты `NavBar` (начало — по верхнему краю, конец — по нижнему).\n startTriggerEdge: TriggerEdge = 'top',\n endTriggerEdge: TriggerEdge = 'bottom'\n): [VoidFunction, () => { top: number; bottom: number }, MotionValue<number>, MotionStyle] => {\n const totalAnimationProgress = useMotionValue(0);\n const dividerVisibility = useMotionValue<'visible' | 'hidden'>('hidden');\n const dividerOffsetY = useMotionValue(0);\n const startTriggerPositionRef = useActualRef(startTriggerPosition);\n const endTriggerPositionRef = useActualRef(endTriggerPosition);\n const startTriggerEdgeRef = useActualRef(startTriggerEdge);\n const endTriggerEdgeRef = useActualRef(endTriggerEdge);\n const getClosestStopsRef: MutableRefObject<(() => { top: number; bottom: number }) | null> = useRef(null);\n\n const bindScrollToAnimation = useInitOnce(() => {\n let unsubscribe: VoidFunction | null = null;\n return () => {\n unsubscribe?.();\n const { heightDelta, top, animationHeight } = getNavBarMetrics();\n\n const animationRanges = [\n ...new Set<[number, number]>(\n [...getAnimationRanges().values()].map((range) => [\n range[0] / animationHeight,\n range[1] / animationHeight,\n ])\n ),\n ].sort((a, b) => b[0] - a[0]);\n\n const [mapFn, getClosestStops] = createScrollToAnimationProgressMapFn(\n getNavBarMetrics,\n scrollAdapter,\n animationRanges,\n startTriggerPositionRef.current,\n endTriggerPositionRef.current,\n startTriggerEdgeRef.current,\n endTriggerEdgeRef.current\n );\n getClosestStopsRef.current = getClosestStops;\n const updateDivider = (scrollPosition: number, totalAnimationProgress: number) => {\n dividerVisibility.set(\n isDividerVisible(scrollPosition, top, heightDelta, totalAnimationProgress) ? 'visible' : 'hidden'\n );\n dividerOffsetY.set(-heightDelta * totalAnimationProgress);\n };\n unsubscribe = scrollPosition.on('change', (value) => {\n totalAnimationProgress.set(mapFn(value));\n updateDivider(value, totalAnimationProgress.get());\n });\n\n totalAnimationProgress.set(mapFn(scrollPosition.get()));\n updateDivider(scrollPosition.get(), totalAnimationProgress.get());\n };\n });\n\n const getClosestStops = useInitOnce(() => () => {\n if (getClosestStopsRef.current) {\n return getClosestStopsRef.current();\n }\n\n return { bottom: 0, top: getNavBarMetrics().heightDelta };\n });\n\n return [\n bindScrollToAnimation,\n getClosestStops,\n totalAnimationProgress,\n { visibility: dividerVisibility, y: dividerOffsetY },\n ];\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useBindScrollToAnimationProgress.js","sources":["src/internal/useBindScrollToAnimationProgress.ts"],"sourcesContent":["import { type MutableRefObject, type RefObject, useRef } from 'react';\nimport { type MotionStyle, type MotionValue, useMotionValue } from 'motion/react';\n\nimport { type AnimationRanges } from '@hh.ru/magritte-ui-nav-bar/internal/useAnimationRanges';\nimport { type NavBarMetrics } from '@hh.ru/magritte-ui-nav-bar/internal/useNavBarMetrics';\nimport { type ScrollAdapter } from '@hh.ru/magritte-ui-nav-bar/internal/useScrollAdapter';\nimport { remap, clamp, useInitOnce, useActualRef, getRelativeOffset } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport { type TriggerEdge } from '@hh.ru/magritte-ui-nav-bar/public/TriggerContext';\n\ninterface ScrollProgressController {\n /** Преобразует позицию скролла в прогресс анимации 0..1 */\n map: (scrollPosition: number) => number;\n /** Ближайшие стопы автодоскролла в пикселях скролла */\n getClosestStops: () => { top: number; bottom: number };\n /**\n * Пересчитывает зависящую от `maxScrollTop` часть (клампинг конца анимации), не трогая дорогие\n * измерения (метрики навбара, позиции триггеров) и подписку на скролл. Позволяет дёшево\n * отреагировать на изменение доступного скролла — например, как обработчик ресайза.\n */\n recompute: () => void;\n}\n\nconst createScrollToAnimationProgressMapFn = (\n getNavBarMetrics: () => NavBarMetrics,\n scrollAdapter: ScrollAdapter,\n animationRanges: [number, number][],\n startTriggerPosition: 'start' | 'full-area' | RefObject<HTMLElement | null>,\n endTriggerPosition: RefObject<HTMLElement | null> | number | undefined,\n startTriggerEdge: TriggerEdge,\n endTriggerEdge: TriggerEdge\n): ScrollProgressController => {\n const { heightDelta, top, bottom, animationHeight } = getNavBarMetrics();\n\n if (startTriggerPosition === 'full-area') {\n let currentStart = top;\n // Зависит от maxScrollTop — поэтому считается в recompute и может быть обновлено без полной пересборки.\n let maxProgress = 1;\n const recompute = () => {\n const maxScrollTop = scrollAdapter.getMaxScrollTop();\n maxProgress =\n maxScrollTop >= animationHeight + top\n ? 1\n : (animationRanges.find((range) => range[0] * animationHeight <= maxScrollTop - top) ?? [0])[0];\n };\n recompute();\n\n const map = (scrollPosition: number) => {\n const progress = (scrollPosition - currentStart) / animationHeight;\n if (progress > maxProgress) {\n currentStart = scrollPosition - animationHeight * maxProgress;\n } else if (progress < 0) {\n currentStart = scrollPosition;\n }\n currentStart = Math.max(currentStart, top);\n\n return clamp(progress, 0, maxProgress);\n };\n\n const getClosestStops = () => ({\n bottom: currentStart,\n top: currentStart + animationHeight * maxProgress,\n });\n\n return { map, getClosestStops, recompute };\n }\n\n let startPos =\n startTriggerPosition === 'start' || !startTriggerPosition.current\n ? 0\n : getRelativeOffset(scrollAdapter, startTriggerPosition.current, startTriggerEdge) - bottom;\n\n let fullEndPos: number;\n if (typeof endTriggerPosition === 'number') {\n fullEndPos = startPos + endTriggerPosition;\n } else {\n fullEndPos = endTriggerPosition?.current\n ? getRelativeOffset(scrollAdapter, endTriggerPosition.current, endTriggerEdge) + heightDelta - bottom\n : startPos + animationHeight;\n }\n\n fullEndPos += top;\n startPos += top;\n\n const scrollDelta = fullEndPos - startPos;\n\n // Конец анимации ограничиваем доступным скроллом: если контента не хватает доиграть анимацию целиком,\n // останавливаемся на ближайшем достижимом стопе. Зависит только от maxScrollTop, поэтому пересобирается\n // в recompute отдельно от дорогих измерений — как только появляется скролл, клампинг подхватит новое\n // значение без полной пересборки привязки.\n let clampedMap = remap([startPos, fullEndPos], [0, 1]);\n let clampedEndPos = fullEndPos;\n const recompute = () => {\n const maxScrollTop = scrollAdapter.getMaxScrollTop();\n let endProgress = 1;\n let endPos = fullEndPos;\n if (scrollDelta !== 0 && fullEndPos > maxScrollTop) {\n endProgress = (animationRanges.find((range) => range[0] * scrollDelta + startPos < maxScrollTop) ?? [0])[0];\n endPos = startPos + scrollDelta * endProgress;\n }\n clampedEndPos = endPos;\n clampedMap = remap([startPos, endPos], [0, endProgress]);\n };\n recompute();\n\n return {\n map: (scrollPosition: number) => clampedMap(scrollPosition),\n getClosestStops: () => ({ bottom: startPos, top: clampedEndPos }),\n recompute,\n };\n};\n\nconst isDividerVisible = (scrollTop: number, navBarTop: number, heightDelta: number, animationProgress: number) =>\n Math.ceil(navBarTop + heightDelta * animationProgress) < Math.floor(scrollTop);\n\nexport const useBindScrollToAnimationProgress = (\n scrollPosition: MotionValue<number>,\n getNavBarMetrics: () => NavBarMetrics,\n getAnimationRanges: () => AnimationRanges,\n scrollAdapter: ScrollAdapter,\n startTriggerPosition: 'start' | 'full-area' | RefObject<HTMLElement | null>,\n endTriggerPosition: RefObject<HTMLElement | null> | number | undefined,\n // Дефолты дублируют продуктовые дефолты `NavBar` (начало — по верхнему краю, конец — по нижнему).\n startTriggerEdge: TriggerEdge = 'top',\n endTriggerEdge: TriggerEdge = 'bottom'\n): [VoidFunction, () => { top: number; bottom: number }, MotionValue<number>, MotionStyle, VoidFunction] => {\n const totalAnimationProgress = useMotionValue(0);\n const dividerVisibility = useMotionValue<'visible' | 'hidden'>('hidden');\n const dividerOffsetY = useMotionValue(0);\n const startTriggerPositionRef = useActualRef(startTriggerPosition);\n const endTriggerPositionRef = useActualRef(endTriggerPosition);\n const startTriggerEdgeRef = useActualRef(startTriggerEdge);\n const endTriggerEdgeRef = useActualRef(endTriggerEdge);\n const getClosestStopsRef: MutableRefObject<(() => { top: number; bottom: number }) | null> = useRef(null);\n const controllerRef: MutableRefObject<ScrollProgressController | null> = useRef(null);\n // Применяет текущий маппинг к позиции скролла: ставит прогресс анимации и обновляет дивайдер.\n const applyRef: MutableRefObject<((scrollTop: number) => void) | null> = useRef(null);\n\n const bindScrollToAnimation = useInitOnce(() => {\n let unsubscribe: VoidFunction | null = null;\n return () => {\n unsubscribe?.();\n const { heightDelta, top, animationHeight } = getNavBarMetrics();\n\n const animationRanges = [\n ...new Set<[number, number]>(\n [...getAnimationRanges().values()].map((range) => [\n range[0] / animationHeight,\n range[1] / animationHeight,\n ])\n ),\n ].sort((a, b) => b[0] - a[0]);\n\n const controller = createScrollToAnimationProgressMapFn(\n getNavBarMetrics,\n scrollAdapter,\n animationRanges,\n startTriggerPositionRef.current,\n endTriggerPositionRef.current,\n startTriggerEdgeRef.current,\n endTriggerEdgeRef.current\n );\n controllerRef.current = controller;\n getClosestStopsRef.current = controller.getClosestStops;\n\n const apply = (scrollTop: number) => {\n const progress = controller.map(scrollTop);\n totalAnimationProgress.set(progress);\n dividerVisibility.set(isDividerVisible(scrollTop, top, heightDelta, progress) ? 'visible' : 'hidden');\n dividerOffsetY.set(-heightDelta * progress);\n };\n applyRef.current = apply;\n\n unsubscribe = scrollPosition.on('change', apply);\n apply(scrollPosition.get());\n };\n });\n\n // Дешёвый пересчёт клампинга конца анимации (зависит от maxScrollTop) без полного bindScrollToAnimation:\n // не пере-измеряет метрики/триггеры и не переподписывается на скролл. Используется как обработчик ресайза\n // для «самодостаточных» навбаров, где полная пересборка привязки на ресайз не требуется.\n const recomputeClamp = useInitOnce(() => () => {\n controllerRef.current?.recompute();\n applyRef.current?.(scrollPosition.get());\n });\n\n const getClosestStops = useInitOnce(() => () => {\n if (getClosestStopsRef.current) {\n return getClosestStopsRef.current();\n }\n\n return { bottom: 0, top: getNavBarMetrics().heightDelta };\n });\n\n return [\n bindScrollToAnimation,\n getClosestStops,\n totalAnimationProgress,\n { visibility: dividerVisibility, y: dividerOffsetY },\n recomputeClamp,\n ];\n};\n"],"names":[],"mappings":";;;;;AAsBA,MAAM,oCAAoC,GAAG,CACzC,gBAAqC,EACrC,aAA4B,EAC5B,eAAmC,EACnC,oBAA2E,EAC3E,kBAAsE,EACtE,gBAA6B,EAC7B,cAA2B,KACD;AAC1B,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,gBAAgB,EAAE,CAAC;AAEzE,IAAA,IAAI,oBAAoB,KAAK,WAAW,EAAE;QACtC,IAAI,YAAY,GAAG,GAAG,CAAC;;QAEvB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,SAAS,GAAG,MAAK;AACnB,YAAA,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YACrD,WAAW;gBACP,YAAY,IAAI,eAAe,GAAG,GAAG;AACjC,sBAAE,CAAC;AACH,sBAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,eAAe,IAAI,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5G,SAAC,CAAC;AACF,QAAA,SAAS,EAAE,CAAC;AAEZ,QAAA,MAAM,GAAG,GAAG,CAAC,cAAsB,KAAI;YACnC,MAAM,QAAQ,GAAG,CAAC,cAAc,GAAG,YAAY,IAAI,eAAe,CAAC;AACnE,YAAA,IAAI,QAAQ,GAAG,WAAW,EAAE;AACxB,gBAAA,YAAY,GAAG,cAAc,GAAG,eAAe,GAAG,WAAW,CAAC;aACjE;AAAM,iBAAA,IAAI,QAAQ,GAAG,CAAC,EAAE;gBACrB,YAAY,GAAG,cAAc,CAAC;aACjC;YACD,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YAE3C,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;AAC3C,SAAC,CAAC;AAEF,QAAA,MAAM,eAAe,GAAG,OAAO;AAC3B,YAAA,MAAM,EAAE,YAAY;AACpB,YAAA,GAAG,EAAE,YAAY,GAAG,eAAe,GAAG,WAAW;AACpD,SAAA,CAAC,CAAC;AAEH,QAAA,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;KAC9C;IAED,IAAI,QAAQ,GACR,oBAAoB,KAAK,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO;AAC7D,UAAE,CAAC;AACH,UAAE,iBAAiB,CAAC,aAAa,EAAE,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,CAAC,GAAG,MAAM,CAAC;AAEpG,IAAA,IAAI,UAAkB,CAAC;AACvB,IAAA,IAAI,OAAO,kBAAkB,KAAK,QAAQ,EAAE;AACxC,QAAA,UAAU,GAAG,QAAQ,GAAG,kBAAkB,CAAC;KAC9C;SAAM;QACH,UAAU,GAAG,kBAAkB,EAAE,OAAO;AACpC,cAAE,iBAAiB,CAAC,aAAa,EAAE,kBAAkB,CAAC,OAAO,EAAE,cAAc,CAAC,GAAG,WAAW,GAAG,MAAM;AACrG,cAAE,QAAQ,GAAG,eAAe,CAAC;KACpC;IAED,UAAU,IAAI,GAAG,CAAC;IAClB,QAAQ,IAAI,GAAG,CAAC;AAEhB,IAAA,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;;;;;AAM1C,IAAA,IAAI,UAAU,GAAG,KAAK,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,aAAa,GAAG,UAAU,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAK;AACnB,QAAA,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;QACrD,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,MAAM,GAAG,UAAU,CAAC;QACxB,IAAI,WAAW,KAAK,CAAC,IAAI,UAAU,GAAG,YAAY,EAAE;AAChD,YAAA,WAAW,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5G,YAAA,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;SACjD;QACD,aAAa,GAAG,MAAM,CAAC;AACvB,QAAA,UAAU,GAAG,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;AAC7D,KAAC,CAAC;AACF,IAAA,SAAS,EAAE,CAAC;IAEZ,OAAO;QACH,GAAG,EAAE,CAAC,cAAsB,KAAK,UAAU,CAAC,cAAc,CAAC;AAC3D,QAAA,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;QACjE,SAAS;KACZ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,WAAmB,EAAE,iBAAyB,KAC1G,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,WAAW,GAAG,iBAAiB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAE5E,MAAM,gCAAgC,GAAG,CAC5C,cAAmC,EACnC,gBAAqC,EACrC,kBAAyC,EACzC,aAA4B,EAC5B,oBAA2E,EAC3E,kBAAsE;AACtE;AACA,gBAAA,GAAgC,KAAK,EACrC,cAA8B,GAAA,QAAQ,KACiE;AACvG,IAAA,MAAM,sBAAsB,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;AACjD,IAAA,MAAM,iBAAiB,GAAG,cAAc,CAAuB,QAAQ,CAAC,CAAC;AACzE,IAAA,MAAM,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;AACzC,IAAA,MAAM,uBAAuB,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC;AACnE,IAAA,MAAM,qBAAqB,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;AAC/D,IAAA,MAAM,mBAAmB,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAC3D,IAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;AACvD,IAAA,MAAM,kBAAkB,GAAqE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC1G,IAAA,MAAM,aAAa,GAAsD,MAAM,CAAC,IAAI,CAAC,CAAC;;AAEtF,IAAA,MAAM,QAAQ,GAA2D,MAAM,CAAC,IAAI,CAAC,CAAC;AAEtF,IAAA,MAAM,qBAAqB,GAAG,WAAW,CAAC,MAAK;QAC3C,IAAI,WAAW,GAAwB,IAAI,CAAC;AAC5C,QAAA,OAAO,MAAK;YACR,WAAW,IAAI,CAAC;YAChB,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,gBAAgB,EAAE,CAAC;AAEjE,YAAA,MAAM,eAAe,GAAG;AACpB,gBAAA,GAAG,IAAI,GAAG,CACN,CAAC,GAAG,kBAAkB,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK;AAC9C,oBAAA,KAAK,CAAC,CAAC,CAAC,GAAG,eAAe;AAC1B,oBAAA,KAAK,CAAC,CAAC,CAAC,GAAG,eAAe;AAC7B,iBAAA,CAAC,CACL;AACJ,aAAA,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE9B,MAAM,UAAU,GAAG,oCAAoC,CACnD,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,uBAAuB,CAAC,OAAO,EAC/B,qBAAqB,CAAC,OAAO,EAC7B,mBAAmB,CAAC,OAAO,EAC3B,iBAAiB,CAAC,OAAO,CAC5B,CAAC;AACF,YAAA,aAAa,CAAC,OAAO,GAAG,UAAU,CAAC;AACnC,YAAA,kBAAkB,CAAC,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;AAExD,YAAA,MAAM,KAAK,GAAG,CAAC,SAAiB,KAAI;gBAChC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC3C,gBAAA,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACrC,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;gBACtG,cAAc,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC;AAChD,aAAC,CAAC;AACF,YAAA,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;YAEzB,WAAW,GAAG,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACjD,YAAA,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC;AAChC,SAAC,CAAC;AACN,KAAC,CAAC,CAAC;;;;IAKH,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,MAAK;AAC1C,QAAA,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACnC,QAAQ,CAAC,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7C,KAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,MAAK;AAC3C,QAAA,IAAI,kBAAkB,CAAC,OAAO,EAAE;AAC5B,YAAA,OAAO,kBAAkB,CAAC,OAAO,EAAE,CAAC;SACvC;AAED,QAAA,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,CAAC,WAAW,EAAE,CAAC;AAC9D,KAAC,CAAC,CAAC;IAEH,OAAO;QACH,qBAAqB;QACrB,eAAe;QACf,sBAAsB;AACtB,QAAA,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC,EAAE,cAAc,EAAE;QACpD,cAAc;KACjB,CAAC;AACN;;;;"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
var styles = {"actions-container":"magritte-actions-container___CBgYW_1-5-1","actionsContainer":"magritte-actions-container___CBgYW_1-5-1","actions-no-children":"magritte-actions-no-children___rgJUl_1-5-1","actionsNoChildren":"magritte-actions-no-children___rgJUl_1-5-1","actions-left-slot":"magritte-actions-left-slot___DNOj0_1-5-1","actionsLeftSlot":"magritte-actions-left-slot___DNOj0_1-5-1","actions-right-slot":"magritte-actions-right-slot___aodtj_1-5-1","actionsRightSlot":"magritte-actions-right-slot___aodtj_1-5-1","navbar-transparent-end":"magritte-navbar-transparent-end___6KqLR_1-5-1","navbarTransparentEnd":"magritte-navbar-transparent-end___6KqLR_1-5-1","actions-start-stage":"magritte-actions-start-stage___MJ67a_1-5-1","actionsStartStage":"magritte-actions-start-stage___MJ67a_1-5-1","actions-side-slot-content":"magritte-actions-side-slot-content___TlHrX_1-5-1","actionsSideSlotContent":"magritte-actions-side-slot-content___TlHrX_1-5-1","actions-icon-morph":"magritte-actions-icon-morph___-nNgW_1-5-1","actionsIconMorph":"magritte-actions-icon-morph___-nNgW_1-5-1","navbar-transparent-start":"magritte-navbar-transparent-start___wysv0_1-5-1","navbarTransparentStart":"magritte-navbar-transparent-start___wysv0_1-5-1","actions-end-stage":"magritte-actions-end-stage___qHtTV_1-5-1","actionsEndStage":"magritte-actions-end-stage___qHtTV_1-5-1","navbar-not-transparent":"magritte-navbar-not-transparent___5KZNp_1-5-1","navbarNotTransparent":"magritte-navbar-not-transparent___5KZNp_1-5-1","navbar-transparent":"magritte-navbar-transparent___ULEh8_1-5-1","navbarTransparent":"magritte-navbar-transparent___ULEh8_1-5-1","actions-only-stage":"magritte-actions-only-stage___cg10A_1-5-1","actionsOnlyStage":"magritte-actions-only-stage___cg10A_1-5-1","actions-side-slot-content-clone":"magritte-actions-side-slot-content-clone___jDxVm_1-5-1","actionsSideSlotContentClone":"magritte-actions-side-slot-content-clone___jDxVm_1-5-1","actions-center-slot":"magritte-actions-center-slot___hLAy6_1-5-1","actionsCenterSlot":"magritte-actions-center-slot___hLAy6_1-5-1","actions-center-slot-centered":"magritte-actions-center-slot-centered___merXQ_1-5-1","actionsCenterSlotCentered":"magritte-actions-center-slot-centered___merXQ_1-5-1","align-top":"magritte-align-top___-QSFW_1-5-1","alignTop":"magritte-align-top___-QSFW_1-5-1","align-bottom":"magritte-align-bottom___FliHI_1-5-1","alignBottom":"magritte-align-bottom___FliHI_1-5-1","title-container-wrapper":"magritte-title-container-wrapper___DQUcj_1-5-1","titleContainerWrapper":"magritte-title-container-wrapper___DQUcj_1-5-1","title-main-part":"magritte-title-main-part___npoHN_1-5-1","titleMainPart":"magritte-title-main-part___npoHN_1-5-1","title-left-slot":"magritte-title-left-slot___HTE7h_1-5-1","titleLeftSlot":"magritte-title-left-slot___HTE7h_1-5-1","title-container":"magritte-title-container___y9AIx_1-5-1","titleContainer":"magritte-title-container___y9AIx_1-5-1","subtitle-container":"magritte-subtitle-container___nVUBu_1-5-1","subtitleContainer":"magritte-subtitle-container___nVUBu_1-5-1","text-morph-item":"magritte-text-morph-item___-vXru_1-5-1","textMorphItem":"magritte-text-morph-item___-vXru_1-5-1","centered":"magritte-centered___Y2mlP_1-5-1","title-morph-item":"magritte-title-morph-item___t7Wf3_1-5-1","titleMorphItem":"magritte-title-morph-item___t7Wf3_1-5-1","title":"magritte-title___ZbLgP_1-5-1","size-large":"magritte-size-large___ISXfH_1-5-1","sizeLarge":"magritte-size-large___ISXfH_1-5-1","pane-content":"magritte-pane-content___UVmC6_1-5-1","paneContent":"magritte-pane-content___UVmC6_1-5-1","pane-background":"magritte-pane-background___PDZAX_1-5-1","paneBackground":"magritte-pane-background___PDZAX_1-5-1","morph-item":"magritte-morph-item___8kF46_1-5-1","morphItem":"magritte-morph-item___8kF46_1-5-1","morph-item-top":"magritte-morph-item-top___WPEkn_1-5-1","morphItemTop":"magritte-morph-item-top___WPEkn_1-5-1","morph-item-bottom":"magritte-morph-item-bottom___zNbsF_1-5-1","morphItemBottom":"magritte-morph-item-bottom___zNbsF_1-5-1","morph-item-left":"magritte-morph-item-left___T6AMW_1-5-1","morphItemLeft":"magritte-morph-item-left___T6AMW_1-5-1","morph-item-right":"magritte-morph-item-right___EuT1E_1-5-1","morphItemRight":"magritte-morph-item-right___EuT1E_1-5-1","pane":"magritte-pane___f8eFC_1-5-1","start-state-container":"magritte-start-state-container___giBVb_1-5-1","startStateContainer":"magritte-start-state-container___giBVb_1-5-1","end-state-container":"magritte-end-state-container___uiW8Q_1-5-1","endStateContainer":"magritte-end-state-container___uiW8Q_1-5-1","content-container":"magritte-content-container___7s7vv_1-5-1","contentContainer":"magritte-content-container___7s7vv_1-5-1","next-pane":"magritte-next-pane___H2oxQ_1-5-1","nextPane":"magritte-next-pane___H2oxQ_1-5-1","nav-bar":"magritte-nav-bar___RRGe0_1-5-1","navBar":"magritte-nav-bar___RRGe0_1-5-1","nav-bar-overlay":"magritte-nav-bar-overlay___Mq5ZD_1-5-1","navBarOverlay":"magritte-nav-bar-overlay___Mq5ZD_1-5-1","nav-bar-overlay-wrapper":"magritte-nav-bar-overlay-wrapper___y1VpY_1-5-1","navBarOverlayWrapper":"magritte-nav-bar-overlay-wrapper___y1VpY_1-5-1","nav-bar-content-container":"magritte-nav-bar-content-container___H-WMO_1-5-1","navBarContentContainer":"magritte-nav-bar-content-container___H-WMO_1-5-1","nav-bar-panes-container":"magritte-nav-bar-panes-container___5ZDLa_1-5-1","navBarPanesContainer":"magritte-nav-bar-panes-container___5ZDLa_1-5-1","nav-bar-progressive-blur":"magritte-nav-bar-progressive-blur___qyeUV_1-5-1","navBarProgressiveBlur":"magritte-nav-bar-progressive-blur___qyeUV_1-5-1","nav-bar-stage":"magritte-nav-bar-stage___amDz7_1-5-1","navBarStage":"magritte-nav-bar-stage___amDz7_1-5-1","last-pane":"magritte-last-pane___Hf2No_1-5-1","lastPane":"magritte-last-pane___Hf2No_1-5-1","metrics-mode":"magritte-metrics-mode___h38aX_1-5-1","metricsMode":"magritte-metrics-mode___h38aX_1-5-1","layout-morph":"magritte-layout-morph___I3SPy_1-5-1","layoutMorph":"magritte-layout-morph___I3SPy_1-5-1","animation-stage-progress":"magritte-animation-stage-progress___5FthT_1-5-1","animationStageProgress":"magritte-animation-stage-progress___5FthT_1-5-1","layout-morph-start":"magritte-layout-morph-start___9-krP_1-5-1","layoutMorphStart":"magritte-layout-morph-start___9-krP_1-5-1","layout-morph-end":"magritte-layout-morph-end___LIg4d_1-5-1","layoutMorphEnd":"magritte-layout-morph-end___LIg4d_1-5-1","divider-container":"magritte-divider-container___-NdWi_1-5-1","dividerContainer":"magritte-divider-container___-NdWi_1-5-1","divider":"magritte-divider___UhH0j_1-5-1"};
|
|
3
|
+
|
|
4
|
+
export { styles as s };
|
|
5
|
+
//# sourceMappingURL=nav-bar-u4djNNnN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav-bar-u4djNNnN.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hh.ru/magritte-ui-nav-bar",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -30,15 +30,15 @@
|
|
|
30
30
|
"@hh.ru/magritte-common-use-multiple-refs": "1.1.11",
|
|
31
31
|
"@hh.ru/magritte-common-use-when-font-loaded": "1.0.14",
|
|
32
32
|
"@hh.ru/magritte-design-tokens": "24.7.1",
|
|
33
|
-
"@hh.ru/magritte-internal-accessible-region": "1.0.
|
|
33
|
+
"@hh.ru/magritte-internal-accessible-region": "1.0.2",
|
|
34
34
|
"@hh.ru/magritte-internal-custom-scroll": "2.1.1",
|
|
35
35
|
"@hh.ru/magritte-internal-default-props-context": "1.0.2",
|
|
36
36
|
"@hh.ru/magritte-internal-slot-registry": "1.1.0",
|
|
37
|
-
"@hh.ru/magritte-ui-divider": "3.
|
|
37
|
+
"@hh.ru/magritte-ui-divider": "3.2.0",
|
|
38
38
|
"@hh.ru/magritte-ui-icon": "14.2.10",
|
|
39
39
|
"@hh.ru/magritte-ui-layer": "3.2.5",
|
|
40
40
|
"@hh.ru/magritte-ui-mock-component": "1.1.7",
|
|
41
41
|
"@hh.ru/magritte-ui-typography": "5.3.4"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "573faba7b94110c97e71efc35a954dd11440f973"
|
|
44
44
|
}
|
package/public/Actions.js
CHANGED
|
@@ -7,7 +7,7 @@ import { EnvironmentFingerprintNode } from './EnvironmentFingerprintNode.js';
|
|
|
7
7
|
import { Morph } from './Morph.js';
|
|
8
8
|
import { useAnimationStage } from './Stage.js';
|
|
9
9
|
import { useActionsDefaultProps, useActionsIconsDefaultProps } from './defaultProps.js';
|
|
10
|
-
import { s as styles } from '../nav-bar-
|
|
10
|
+
import { s as styles } from '../nav-bar-u4djNNnN.js';
|
|
11
11
|
import '../internal/MetricsProvider.js';
|
|
12
12
|
import '../internal/utils.js';
|
|
13
13
|
import 'motion';
|
package/public/LayoutMorph.js
CHANGED
|
@@ -10,7 +10,7 @@ import { usePaneStore } from '../internal/PaneStore.js';
|
|
|
10
10
|
import { useInert } from '../internal/useInert.js';
|
|
11
11
|
import { useActualRef, useStoreSyncedTransform, lerp, calcMorphParams } from '../internal/utils.js';
|
|
12
12
|
import { AnimationStageContext } from './LayoutStage.js';
|
|
13
|
-
import { s as styles } from '../nav-bar-
|
|
13
|
+
import { s as styles } from '../nav-bar-u4djNNnN.js';
|
|
14
14
|
import '../internal/KeyedSubscriptions.js';
|
|
15
15
|
import 'motion';
|
|
16
16
|
import '../internal/NavBarContext.js';
|
package/public/LayoutStage.js
CHANGED
|
@@ -9,7 +9,7 @@ import { MorphStoreProvider, useMorphStore } from '../internal/MorphStore.js';
|
|
|
9
9
|
import { usePaneStore } from '../internal/PaneStore.js';
|
|
10
10
|
import { useInitOnce } from '../internal/utils.js';
|
|
11
11
|
import { EnvironmentFingerprintNode, useEnvironmentFingerprint } from './EnvironmentFingerprintNode.js';
|
|
12
|
-
import { s as styles } from '../nav-bar-
|
|
12
|
+
import { s as styles } from '../nav-bar-u4djNNnN.js';
|
|
13
13
|
import '../internal/KeyedSubscriptions.js';
|
|
14
14
|
import 'motion';
|
|
15
15
|
import '../internal/NavBarContext.js';
|
package/public/Morph.js
CHANGED
|
@@ -9,7 +9,7 @@ import { usePaneStore } from '../internal/PaneStore.js';
|
|
|
9
9
|
import { useStoreSyncedTransform, calcMorphParams, lerp } from '../internal/utils.js';
|
|
10
10
|
import { useEnvironmentFingerprint } from './EnvironmentFingerprintNode.js';
|
|
11
11
|
import { useAnimationStage } from './Stage.js';
|
|
12
|
-
import { s as styles } from '../nav-bar-
|
|
12
|
+
import { s as styles } from '../nav-bar-u4djNNnN.js';
|
|
13
13
|
import '../internal/KeyedSubscriptions.js';
|
|
14
14
|
import 'motion';
|
|
15
15
|
import '../internal/NavBarContext.js';
|
package/public/NavBar.d.ts
CHANGED
|
@@ -62,5 +62,10 @@ export interface NavBarProps {
|
|
|
62
62
|
* Предназначен для синхронизации внешних анимаций с анимациями NavBar.
|
|
63
63
|
*/
|
|
64
64
|
animationProgress?: MotionValue<number>;
|
|
65
|
+
/**
|
|
66
|
+
* Принимает ReactNode который будет отображен сразу под навбаром и будет менять вертикальную позицию
|
|
67
|
+
* синхронно с анимацией навбара
|
|
68
|
+
*/
|
|
69
|
+
bottomAttachment?: ReactNode;
|
|
65
70
|
}
|
|
66
71
|
export declare const NavBar: FC<NavBarProps>;
|
package/public/NavBar.js
CHANGED
|
@@ -18,7 +18,7 @@ import { useInitOnce, scheduleMicro, scheduleMacro, remap } from '../internal/ut
|
|
|
18
18
|
import { isPaneElement, ExternalPane } from './Pane.js';
|
|
19
19
|
import { useTriggerSlot } from './TriggerContext.js';
|
|
20
20
|
import { useNavBarRootDefaultProps } from './defaultProps.js';
|
|
21
|
-
import { s as styles } from '../nav-bar-
|
|
21
|
+
import { s as styles } from '../nav-bar-u4djNNnN.js';
|
|
22
22
|
import '@hh.ru/magritte-internal-custom-scroll';
|
|
23
23
|
import 'motion';
|
|
24
24
|
import '../internal/MorphStore.js';
|
|
@@ -41,17 +41,18 @@ const NavBar = (props) => {
|
|
|
41
41
|
...(startSlot ? { startTriggerPosition: startSlot.ref, startTriggerEdge: startSlot.edge } : null),
|
|
42
42
|
...(endSlot ? { endTriggerPosition: endSlot.ref, endTriggerEdge: endSlot.edge } : null),
|
|
43
43
|
};
|
|
44
|
-
const { children, transparent = false, startTriggerPosition = 'start', startTriggerEdge = 'top', endTriggerPosition, endTriggerEdge = 'bottom', overlay = false, snapScroll: scrollSnapping = true, showDivider = false, animationProgress, } = { ...slotProps, ...defaultProps, ...props };
|
|
44
|
+
const { children, transparent = false, startTriggerPosition = 'start', startTriggerEdge = 'top', endTriggerPosition, endTriggerEdge = 'bottom', overlay = false, snapScroll: scrollSnapping = true, showDivider = false, animationProgress, bottomAttachment = null, } = { ...slotProps, ...defaultProps, ...props };
|
|
45
45
|
const paneStoreRegistry = useInitOnce(() => new Set());
|
|
46
46
|
const prevFullHeight = useRef(0);
|
|
47
47
|
const rootRef = useRef(null);
|
|
48
48
|
const [scrollAdapter, scrollPosition] = useScrollAdapter(rootRef);
|
|
49
49
|
const [getMetrics, invalidateMetrics] = useNavBarMetrics(paneStoreRegistry, rootRef, scrollAdapter);
|
|
50
50
|
const [getAnimationRanges, invalidateAnimationRanges] = useAnimationRanges(paneStoreRegistry, getMetrics);
|
|
51
|
-
const [bindScrollToAnimation, getClosestStops, totalAnimationProgress, dividerStyle] = useBindScrollToAnimationProgress(scrollPosition, getMetrics, getAnimationRanges, scrollAdapter, startTriggerPosition, endTriggerPosition, startTriggerEdge, endTriggerEdge);
|
|
51
|
+
const [bindScrollToAnimation, getClosestStops, totalAnimationProgress, dividerStyle, recomputeClamp] = useBindScrollToAnimationProgress(scrollPosition, getMetrics, getAnimationRanges, scrollAdapter, startTriggerPosition, endTriggerPosition, startTriggerEdge, endTriggerEdge);
|
|
52
52
|
const snapScroll = useSnapScroll(scrollPosition, totalAnimationProgress, scrollAdapter, getClosestStops, scrollSnapping);
|
|
53
53
|
// При получении размеров важно дождаться применения MotionValue к DOM, поэтому используем frame.render
|
|
54
54
|
const bindScrollToAnimationScheduled = useInitOnce(() => scheduleMicro(() => frame.render(bindScrollToAnimation)));
|
|
55
|
+
const recomputeClampScheduled = useInitOnce(() => scheduleMicro(() => frame.render(recomputeClamp)));
|
|
55
56
|
useResetFocus(rootRef, totalAnimationProgress);
|
|
56
57
|
useSyncMotionValue(totalAnimationProgress, animationProgress);
|
|
57
58
|
const dividerVisibility =
|
|
@@ -100,21 +101,29 @@ const NavBar = (props) => {
|
|
|
100
101
|
return () => {
|
|
101
102
|
paneStoreRegistry.delete(paneStore);
|
|
102
103
|
unsubscribe();
|
|
104
|
+
onChange();
|
|
103
105
|
};
|
|
104
106
|
};
|
|
105
107
|
});
|
|
106
108
|
useLayoutEffect(() => {
|
|
107
109
|
bindScrollToAnimation();
|
|
108
110
|
snapScroll();
|
|
109
|
-
if (!rootRef.current
|
|
111
|
+
if (!rootRef.current) {
|
|
110
112
|
return void 0;
|
|
111
113
|
}
|
|
114
|
+
// Для «самодостаточного» навбара (начало анимации по собственной геометрии, конец вычисляется
|
|
115
|
+
// автоматически) положения триггеров от ресайза не зависят, поэтому полная пересборка привязки не
|
|
116
|
+
// нужна — на ресайз достаточно пересчитать только клампинг конца анимации по актуальному maxScrollTop.
|
|
117
|
+
if (typeof startTriggerPosition === 'string' && !endTriggerPosition) {
|
|
118
|
+
return scrollAdapter.onResize(recomputeClampScheduled);
|
|
119
|
+
}
|
|
112
120
|
return scrollAdapter.onResize(bindScrollToAnimationScheduled);
|
|
113
121
|
}, [
|
|
114
122
|
startTriggerPosition,
|
|
115
123
|
endTriggerPosition,
|
|
116
124
|
bindScrollToAnimation,
|
|
117
125
|
bindScrollToAnimationScheduled,
|
|
126
|
+
recomputeClampScheduled,
|
|
118
127
|
snapScroll,
|
|
119
128
|
scrollAdapter,
|
|
120
129
|
]);
|
|
@@ -136,7 +145,7 @@ const NavBar = (props) => {
|
|
|
136
145
|
[styles.navbarNotTransparent]: !transparent,
|
|
137
146
|
[styles.navbarTransparent]: transparent === true,
|
|
138
147
|
[styles.navBarOverlay]: overlay,
|
|
139
|
-
}), ref: rootRef, measureClassName: styles.metricsMode, children: jsx("div", { className: styles.navBarOverlayWrapper, children: jsxs(motion.div, { className: styles.navBarContentContainer, style: { '--magritte-ui-navbar-animation-progress': totalAnimationProgress }, children: [jsx("div", { className: styles.navBarPanesContainer, children: jsx(NavBarContext.Provider, { value: registerPaneStore, children: nested }) }),
|
|
148
|
+
}), ref: rootRef, measureClassName: styles.metricsMode, children: jsx("div", { className: styles.navBarOverlayWrapper, children: jsxs(motion.div, { className: styles.navBarContentContainer, style: { '--magritte-ui-navbar-animation-progress': totalAnimationProgress }, children: [jsx("div", { className: styles.navBarPanesContainer, children: jsx(NavBarContext.Provider, { value: registerPaneStore, children: nested }) }), jsxs(motion.div, { className: styles.dividerContainer, style: { y: dividerStyle.y }, children: [jsx(motion.div, { style: { visibility: dividerVisibility }, children: jsx(Divider, { className: styles.divider }) }), bottomAttachment] })] }) }) }) }));
|
|
140
149
|
};
|
|
141
150
|
|
|
142
151
|
export { NavBar };
|
package/public/NavBar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavBar.js","sources":["src/public/NavBar.tsx"],"sourcesContent":["import React, { Children, type ReactNode, type RefObject, useLayoutEffect, useRef, type FC } from 'react';\nimport classNames from 'classnames';\nimport { motion, type MotionStyle, MotionValue, frame } from 'motion/react';\n\nimport { Divider, type ShowDivider } from '@hh.ru/magritte-ui-divider';\nimport { Layer } from '@hh.ru/magritte-ui-layer';\nimport { MetricsProvider } from '@hh.ru/magritte-ui-nav-bar/internal/MetricsProvider';\nimport { NavBarContext } from '@hh.ru/magritte-ui-nav-bar/internal/NavBarContext';\nimport { PaneStore } from '@hh.ru/magritte-ui-nav-bar/internal/PaneStore';\nimport { useAnimationRanges } from '@hh.ru/magritte-ui-nav-bar/internal/useAnimationRanges';\nimport { useBindScrollToAnimationProgress } from '@hh.ru/magritte-ui-nav-bar/internal/useBindScrollToAnimationProgress';\nimport { useNavBarMetrics } from '@hh.ru/magritte-ui-nav-bar/internal/useNavBarMetrics';\nimport { useResetFocus } from '@hh.ru/magritte-ui-nav-bar/internal/useResetFocus';\nimport { useScrollAdapter } from '@hh.ru/magritte-ui-nav-bar/internal/useScrollAdapter';\nimport { useSnapScroll } from '@hh.ru/magritte-ui-nav-bar/internal/useSnapScroll';\nimport { useSyncMotionValue } from '@hh.ru/magritte-ui-nav-bar/internal/useSyncMotionValue';\nimport { remap, scheduleMicro, scheduleMacro, useInitOnce } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport {\n type PaneElement,\n type InternalPaneProps,\n ExternalPane,\n isPaneElement,\n} from '@hh.ru/magritte-ui-nav-bar/public/Pane';\nimport { type TriggerEdge, useTriggerSlot } from '@hh.ru/magritte-ui-nav-bar/public/TriggerContext';\nimport { useNavBarRootDefaultProps } from '@hh.ru/magritte-ui-nav-bar/public/defaultProps';\n\nimport styles from './nav-bar.less';\n\nexport interface NavBarProps {\n /**\n * В качестве потомков могут передаваться компоненты <Pane /> или произвольные элементы,\n * которые будут автоматически обёрнуты в <Pane />.\n */\n children: ReactNode;\n /**\n * Управляет режимом прозрачности:\n * -- Прозрачность отключена (`false`)\n * -- Прозрачный всегда (`true`)\n * -- Прозрачный в начале анимации (`start`)\n * -- Прозрачный в конце анимации (`end`)\n * @default false\n */\n transparent?: 'start' | 'end' | boolean;\n /**\n * Управляет позицией триггера начала анимации\n * @default start\n */\n startTriggerPosition?: 'start' | 'full-area' | RefObject<HTMLElement | null>;\n /**\n * Край элемента `startTriggerPosition`, по которому измеряется позиция начала анимации.\n * @default top\n */\n startTriggerEdge?: TriggerEdge;\n /**\n * Управляет позицией триггера конца анимации. Если не передан вычисляется автоматически на основе изменения\n * высоты навбара в процессе анимации и позиции триггера начала анмиации. Если передано число, то интерпретируется\n * как отступ в пикселях от позиции триггера старта анимации.\n */\n endTriggerPosition?: RefObject<HTMLElement | null> | number;\n /**\n * Край элемента `endTriggerPosition`, по которому измеряется позиция конца анимации.\n * @default bottom\n */\n endTriggerEdge?: TriggerEdge;\n /**\n * Включает режим когда NavBar не занимает место в лейауте и контент располагается под ним.\n * @default false\n */\n overlay?: boolean;\n /**\n * Управляет режимом автодоскролла. По умолчанию включен.\n * @default true\n */\n snapScroll?: boolean;\n /**\n * Управляет режимом отображения дивайдера:\n * - `false` дивайдер отключен\n * - `always` дивайдер отображается постоянно\n * - `with-scroll` дивайдер отображается только когда контент подскроллен под NavBar\n * @default false\n */\n showDivider?: ShowDivider;\n /**\n * Принимает MotionValue значение которого будет обновляться синхронно с анимацией всего NavBar.\n * Прогресс анимации представляется в виде числа 0..1\n * Предназначен для синхронизации внешних анимаций с анимациями NavBar.\n */\n animationProgress?: MotionValue<number>;\n}\n\nexport const NavBar: FC<NavBarProps> = (props) => {\n const defaultProps = useNavBarRootDefaultProps();\n const startSlot = useTriggerSlot('startTrigger');\n const endSlot = useTriggerSlot('endTrigger');\n // Приоритет (от высшего к низшему): явные пропсы > NavBarDefaultPropsContext > слоты `Trigger` > дефолты.\n const slotProps = {\n ...(startSlot ? { startTriggerPosition: startSlot.ref, startTriggerEdge: startSlot.edge } : null),\n ...(endSlot ? { endTriggerPosition: endSlot.ref, endTriggerEdge: endSlot.edge } : null),\n };\n const {\n children,\n transparent = false,\n startTriggerPosition = 'start',\n startTriggerEdge = 'top',\n endTriggerPosition,\n endTriggerEdge = 'bottom',\n overlay = false,\n snapScroll: scrollSnapping = true,\n showDivider = false,\n animationProgress,\n } = { ...slotProps, ...defaultProps, ...props };\n const paneStoreRegistry = useInitOnce(() => new Set<PaneStore>());\n const prevFullHeight = useRef<null | number>(0);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const [scrollAdapter, scrollPosition] = useScrollAdapter(rootRef);\n const [getMetrics, invalidateMetrics] = useNavBarMetrics(paneStoreRegistry, rootRef, scrollAdapter);\n const [getAnimationRanges, invalidateAnimationRanges] = useAnimationRanges(paneStoreRegistry, getMetrics);\n const [bindScrollToAnimation, getClosestStops, totalAnimationProgress, dividerStyle] =\n useBindScrollToAnimationProgress(\n scrollPosition,\n getMetrics,\n getAnimationRanges,\n scrollAdapter,\n startTriggerPosition,\n endTriggerPosition,\n startTriggerEdge,\n endTriggerEdge\n );\n const snapScroll = useSnapScroll(\n scrollPosition,\n totalAnimationProgress,\n scrollAdapter,\n getClosestStops,\n scrollSnapping\n );\n\n // При получении размеров важно дождаться применения MotionValue к DOM, поэтому используем frame.render\n const bindScrollToAnimationScheduled = useInitOnce(() => scheduleMicro(() => frame.render(bindScrollToAnimation)));\n useResetFocus(rootRef, totalAnimationProgress);\n useSyncMotionValue(totalAnimationProgress, animationProgress);\n\n const dividerVisibility =\n // eslint-disable-next-line no-nested-ternary\n showDivider === 'with-scroll' ? dividerStyle.visibility : showDivider ? 'visible' : 'hidden';\n\n const registerPaneStore = useInitOnce(() => {\n const subscriptions: VoidFunction[] = [];\n\n const updateAnimationParams = () => {\n subscriptions.length = 0;\n invalidateMetrics();\n invalidateAnimationRanges();\n bindScrollToAnimationScheduled();\n const navBarMetrics = getMetrics();\n const fullPanesStartHeight = navBarMetrics.bottom - navBarMetrics.top;\n\n let scroll = scrollAdapter.getScrollTop();\n if (prevFullHeight.current !== null && scroll !== 0) {\n const heightDelta = fullPanesStartHeight - prevFullHeight.current;\n scroll += heightDelta;\n\n requestAnimationFrame(() => {\n scrollPosition.jump(scrollAdapter.getScrollTop() - 1);\n scrollPosition.jump(scrollAdapter.getScrollTop());\n });\n }\n\n const animationRanges = getAnimationRanges();\n [...paneStoreRegistry.values()].forEach((paneStore) => {\n const range = animationRanges.get(paneStore.get('id'));\n if (!range) {\n return;\n }\n const remapFn = remap(\n range[0] === 0 && range[1] === 0\n ? [0, 1]\n : [range[0] / navBarMetrics.animationHeight, range[1] / navBarMetrics.animationHeight],\n [0, 1]\n );\n const motionValue = paneStore.get('motionValue');\n motionValue.set(remapFn(totalAnimationProgress.get()));\n subscriptions.push(totalAnimationProgress.on('change', (value) => motionValue.set(remapFn(value))));\n });\n\n prevFullHeight.current = fullPanesStartHeight;\n };\n\n // основной триггер запуска updateAnimationParams это изменения размеров, обработка которых происходит\n // в очереди микрозадач, поэтому откладываем запуск функции до перехдоа к макрозадачам, чтобы сократить\n // количество вызовов при массовых изменениях\n const onChange = scheduleMacro(updateAnimationParams);\n\n return (paneStore: PaneStore) => {\n const unsubscribe = paneStore.onChange(\n ['startHeight', 'endHeight', 'top', 'foldable', 'animated'],\n onChange\n );\n paneStoreRegistry.add(paneStore);\n return () => {\n paneStoreRegistry.delete(paneStore);\n unsubscribe();\n };\n };\n });\n\n useLayoutEffect(() => {\n bindScrollToAnimation();\n snapScroll();\n if (!rootRef.current || (typeof startTriggerPosition === 'string' && !endTriggerPosition)) {\n return void 0;\n }\n return scrollAdapter.onResize(bindScrollToAnimationScheduled);\n }, [\n startTriggerPosition,\n endTriggerPosition,\n bindScrollToAnimation,\n bindScrollToAnimationScheduled,\n snapScroll,\n scrollAdapter,\n ]);\n\n // Оборачиваем потомков, не являющихся Pane, в Pane и вкладываем панели друг в друга через проп nextPane\n const childrenArray = Children.toArray(children);\n const nested = isPaneElement(childrenArray[0]) ? (\n childrenArray.reduceRight<PaneElement | null>((acc, child) => {\n if (!isPaneElement(child)) {\n return acc;\n }\n // cloneElement сужает конструктор до InternalPaneProps, поэтому возвращаем к PaneElement\n return React.cloneElement<InternalPaneProps>(child, {\n ...child.props,\n nextPane: acc,\n }) as PaneElement;\n }, null)\n ) : (\n <ExternalPane>{children}</ExternalPane>\n );\n\n return (\n <Layer layer=\"navigation-bar\">\n <MetricsProvider\n className={classNames(styles.navBar, {\n [styles.navbarTransparentStart]: transparent === 'start',\n [styles.navbarTransparentEnd]: transparent === 'end',\n [styles.navbarNotTransparent]: !transparent,\n [styles.navbarTransparent]: transparent === true,\n [styles.navBarOverlay]: overlay,\n })}\n ref={rootRef}\n measureClassName={styles.metricsMode}\n >\n <div className={styles.navBarOverlayWrapper}>\n <motion.div\n className={styles.navBarContentContainer}\n style={{ '--magritte-ui-navbar-animation-progress': totalAnimationProgress } as MotionStyle}\n >\n <div className={styles.navBarPanesContainer}>\n <NavBarContext.Provider value={registerPaneStore}>{nested}</NavBarContext.Provider>\n </div>\n <motion.div\n className={styles.dividerContainer}\n style={{ ...dividerStyle, visibility: dividerVisibility }}\n >\n <Divider />\n </motion.div>\n </motion.div>\n </div>\n </MetricsProvider>\n </Layer>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NavBar.js","sources":["src/public/NavBar.tsx"],"sourcesContent":["import React, { Children, type ReactNode, type RefObject, useLayoutEffect, useRef, type FC } from 'react';\nimport classNames from 'classnames';\nimport { motion, type MotionStyle, MotionValue, frame } from 'motion/react';\n\nimport { Divider, type ShowDivider } from '@hh.ru/magritte-ui-divider';\nimport { Layer } from '@hh.ru/magritte-ui-layer';\nimport { MetricsProvider } from '@hh.ru/magritte-ui-nav-bar/internal/MetricsProvider';\nimport { NavBarContext } from '@hh.ru/magritte-ui-nav-bar/internal/NavBarContext';\nimport { PaneStore } from '@hh.ru/magritte-ui-nav-bar/internal/PaneStore';\nimport { useAnimationRanges } from '@hh.ru/magritte-ui-nav-bar/internal/useAnimationRanges';\nimport { useBindScrollToAnimationProgress } from '@hh.ru/magritte-ui-nav-bar/internal/useBindScrollToAnimationProgress';\nimport { useNavBarMetrics } from '@hh.ru/magritte-ui-nav-bar/internal/useNavBarMetrics';\nimport { useResetFocus } from '@hh.ru/magritte-ui-nav-bar/internal/useResetFocus';\nimport { useScrollAdapter } from '@hh.ru/magritte-ui-nav-bar/internal/useScrollAdapter';\nimport { useSnapScroll } from '@hh.ru/magritte-ui-nav-bar/internal/useSnapScroll';\nimport { useSyncMotionValue } from '@hh.ru/magritte-ui-nav-bar/internal/useSyncMotionValue';\nimport { remap, scheduleMicro, scheduleMacro, useInitOnce } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport {\n type PaneElement,\n type InternalPaneProps,\n ExternalPane,\n isPaneElement,\n} from '@hh.ru/magritte-ui-nav-bar/public/Pane';\nimport { type TriggerEdge, useTriggerSlot } from '@hh.ru/magritte-ui-nav-bar/public/TriggerContext';\nimport { useNavBarRootDefaultProps } from '@hh.ru/magritte-ui-nav-bar/public/defaultProps';\n\nimport styles from './nav-bar.less';\n\nexport interface NavBarProps {\n /**\n * В качестве потомков могут передаваться компоненты <Pane /> или произвольные элементы,\n * которые будут автоматически обёрнуты в <Pane />.\n */\n children: ReactNode;\n /**\n * Управляет режимом прозрачности:\n * -- Прозрачность отключена (`false`)\n * -- Прозрачный всегда (`true`)\n * -- Прозрачный в начале анимации (`start`)\n * -- Прозрачный в конце анимации (`end`)\n * @default false\n */\n transparent?: 'start' | 'end' | boolean;\n /**\n * Управляет позицией триггера начала анимации\n * @default start\n */\n startTriggerPosition?: 'start' | 'full-area' | RefObject<HTMLElement | null>;\n /**\n * Край элемента `startTriggerPosition`, по которому измеряется позиция начала анимации.\n * @default top\n */\n startTriggerEdge?: TriggerEdge;\n /**\n * Управляет позицией триггера конца анимации. Если не передан вычисляется автоматически на основе изменения\n * высоты навбара в процессе анимации и позиции триггера начала анмиации. Если передано число, то интерпретируется\n * как отступ в пикселях от позиции триггера старта анимации.\n */\n endTriggerPosition?: RefObject<HTMLElement | null> | number;\n /**\n * Край элемента `endTriggerPosition`, по которому измеряется позиция конца анимации.\n * @default bottom\n */\n endTriggerEdge?: TriggerEdge;\n /**\n * Включает режим когда NavBar не занимает место в лейауте и контент располагается под ним.\n * @default false\n */\n overlay?: boolean;\n /**\n * Управляет режимом автодоскролла. По умолчанию включен.\n * @default true\n */\n snapScroll?: boolean;\n /**\n * Управляет режимом отображения дивайдера:\n * - `false` дивайдер отключен\n * - `always` дивайдер отображается постоянно\n * - `with-scroll` дивайдер отображается только когда контент подскроллен под NavBar\n * @default false\n */\n showDivider?: ShowDivider;\n /**\n * Принимает MotionValue значение которого будет обновляться синхронно с анимацией всего NavBar.\n * Прогресс анимации представляется в виде числа 0..1\n * Предназначен для синхронизации внешних анимаций с анимациями NavBar.\n */\n animationProgress?: MotionValue<number>;\n /**\n * Принимает ReactNode который будет отображен сразу под навбаром и будет менять вертикальную позицию\n * синхронно с анимацией навбара\n */\n bottomAttachment?: ReactNode;\n}\n\nexport const NavBar: FC<NavBarProps> = (props) => {\n const defaultProps = useNavBarRootDefaultProps();\n const startSlot = useTriggerSlot('startTrigger');\n const endSlot = useTriggerSlot('endTrigger');\n // Приоритет (от высшего к низшему): явные пропсы > NavBarDefaultPropsContext > слоты `Trigger` > дефолты.\n const slotProps = {\n ...(startSlot ? { startTriggerPosition: startSlot.ref, startTriggerEdge: startSlot.edge } : null),\n ...(endSlot ? { endTriggerPosition: endSlot.ref, endTriggerEdge: endSlot.edge } : null),\n };\n const {\n children,\n transparent = false,\n startTriggerPosition = 'start',\n startTriggerEdge = 'top',\n endTriggerPosition,\n endTriggerEdge = 'bottom',\n overlay = false,\n snapScroll: scrollSnapping = true,\n showDivider = false,\n animationProgress,\n bottomAttachment = null,\n } = { ...slotProps, ...defaultProps, ...props };\n const paneStoreRegistry = useInitOnce(() => new Set<PaneStore>());\n const prevFullHeight = useRef<null | number>(0);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const [scrollAdapter, scrollPosition] = useScrollAdapter(rootRef);\n const [getMetrics, invalidateMetrics] = useNavBarMetrics(paneStoreRegistry, rootRef, scrollAdapter);\n const [getAnimationRanges, invalidateAnimationRanges] = useAnimationRanges(paneStoreRegistry, getMetrics);\n const [bindScrollToAnimation, getClosestStops, totalAnimationProgress, dividerStyle, recomputeClamp] =\n useBindScrollToAnimationProgress(\n scrollPosition,\n getMetrics,\n getAnimationRanges,\n scrollAdapter,\n startTriggerPosition,\n endTriggerPosition,\n startTriggerEdge,\n endTriggerEdge\n );\n const snapScroll = useSnapScroll(\n scrollPosition,\n totalAnimationProgress,\n scrollAdapter,\n getClosestStops,\n scrollSnapping\n );\n\n // При получении размеров важно дождаться применения MotionValue к DOM, поэтому используем frame.render\n const bindScrollToAnimationScheduled = useInitOnce(() => scheduleMicro(() => frame.render(bindScrollToAnimation)));\n const recomputeClampScheduled = useInitOnce(() => scheduleMicro(() => frame.render(recomputeClamp)));\n useResetFocus(rootRef, totalAnimationProgress);\n useSyncMotionValue(totalAnimationProgress, animationProgress);\n\n const dividerVisibility =\n // eslint-disable-next-line no-nested-ternary\n showDivider === 'with-scroll' ? dividerStyle.visibility : showDivider ? 'visible' : 'hidden';\n\n const registerPaneStore = useInitOnce(() => {\n const subscriptions: VoidFunction[] = [];\n\n const updateAnimationParams = () => {\n subscriptions.length = 0;\n invalidateMetrics();\n invalidateAnimationRanges();\n bindScrollToAnimationScheduled();\n const navBarMetrics = getMetrics();\n const fullPanesStartHeight = navBarMetrics.bottom - navBarMetrics.top;\n\n let scroll = scrollAdapter.getScrollTop();\n if (prevFullHeight.current !== null && scroll !== 0) {\n const heightDelta = fullPanesStartHeight - prevFullHeight.current;\n scroll += heightDelta;\n\n requestAnimationFrame(() => {\n scrollPosition.jump(scrollAdapter.getScrollTop() - 1);\n scrollPosition.jump(scrollAdapter.getScrollTop());\n });\n }\n\n const animationRanges = getAnimationRanges();\n [...paneStoreRegistry.values()].forEach((paneStore) => {\n const range = animationRanges.get(paneStore.get('id'));\n if (!range) {\n return;\n }\n const remapFn = remap(\n range[0] === 0 && range[1] === 0\n ? [0, 1]\n : [range[0] / navBarMetrics.animationHeight, range[1] / navBarMetrics.animationHeight],\n [0, 1]\n );\n const motionValue = paneStore.get('motionValue');\n motionValue.set(remapFn(totalAnimationProgress.get()));\n subscriptions.push(totalAnimationProgress.on('change', (value) => motionValue.set(remapFn(value))));\n });\n\n prevFullHeight.current = fullPanesStartHeight;\n };\n\n // основной триггер запуска updateAnimationParams это изменения размеров, обработка которых происходит\n // в очереди микрозадач, поэтому откладываем запуск функции до перехдоа к макрозадачам, чтобы сократить\n // количество вызовов при массовых изменениях\n const onChange = scheduleMacro(updateAnimationParams);\n\n return (paneStore: PaneStore) => {\n const unsubscribe = paneStore.onChange(\n ['startHeight', 'endHeight', 'top', 'foldable', 'animated'],\n onChange\n );\n paneStoreRegistry.add(paneStore);\n return () => {\n paneStoreRegistry.delete(paneStore);\n unsubscribe();\n onChange();\n };\n };\n });\n\n useLayoutEffect(() => {\n bindScrollToAnimation();\n snapScroll();\n if (!rootRef.current) {\n return void 0;\n }\n // Для «самодостаточного» навбара (начало анимации по собственной геометрии, конец вычисляется\n // автоматически) положения триггеров от ресайза не зависят, поэтому полная пересборка привязки не\n // нужна — на ресайз достаточно пересчитать только клампинг конца анимации по актуальному maxScrollTop.\n if (typeof startTriggerPosition === 'string' && !endTriggerPosition) {\n return scrollAdapter.onResize(recomputeClampScheduled);\n }\n return scrollAdapter.onResize(bindScrollToAnimationScheduled);\n }, [\n startTriggerPosition,\n endTriggerPosition,\n bindScrollToAnimation,\n bindScrollToAnimationScheduled,\n recomputeClampScheduled,\n snapScroll,\n scrollAdapter,\n ]);\n\n // Оборачиваем потомков, не являющихся Pane, в Pane и вкладываем панели друг в друга через проп nextPane\n const childrenArray = Children.toArray(children);\n const nested = isPaneElement(childrenArray[0]) ? (\n childrenArray.reduceRight<PaneElement | null>((acc, child) => {\n if (!isPaneElement(child)) {\n return acc;\n }\n // cloneElement сужает конструктор до InternalPaneProps, поэтому возвращаем к PaneElement\n return React.cloneElement<InternalPaneProps>(child, {\n ...child.props,\n nextPane: acc,\n }) as PaneElement;\n }, null)\n ) : (\n <ExternalPane>{children}</ExternalPane>\n );\n\n return (\n <Layer layer=\"navigation-bar\">\n <MetricsProvider\n className={classNames(styles.navBar, {\n [styles.navbarTransparentStart]: transparent === 'start',\n [styles.navbarTransparentEnd]: transparent === 'end',\n [styles.navbarNotTransparent]: !transparent,\n [styles.navbarTransparent]: transparent === true,\n [styles.navBarOverlay]: overlay,\n })}\n ref={rootRef}\n measureClassName={styles.metricsMode}\n >\n <div className={styles.navBarOverlayWrapper}>\n <motion.div\n className={styles.navBarContentContainer}\n style={{ '--magritte-ui-navbar-animation-progress': totalAnimationProgress } as MotionStyle}\n >\n <div className={styles.navBarPanesContainer}>\n <NavBarContext.Provider value={registerPaneStore}>{nested}</NavBarContext.Provider>\n </div>\n <motion.div className={styles.dividerContainer} style={{ y: dividerStyle.y }}>\n <motion.div style={{ visibility: dividerVisibility }}>\n <Divider className={styles.divider} />\n </motion.div>\n {bottomAttachment}\n </motion.div>\n </motion.div>\n </div>\n </MetricsProvider>\n </Layer>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
package/public/Pane.js
CHANGED
|
@@ -10,7 +10,7 @@ import { useInitOnce, useStoreSyncedTransform, lerp } from '../internal/utils.js
|
|
|
10
10
|
import { EnvironmentFingerprintProvider } from './EnvironmentFingerprintNode.js';
|
|
11
11
|
import { LayoutStage } from './LayoutStage.js';
|
|
12
12
|
import { Stage } from './Stage.js';
|
|
13
|
-
import { s as styles } from '../nav-bar-
|
|
13
|
+
import { s as styles } from '../nav-bar-u4djNNnN.js';
|
|
14
14
|
import '../internal/KeyedSubscriptions.js';
|
|
15
15
|
import 'motion';
|
|
16
16
|
import '../internal/NavBarContext.js';
|
package/public/Stage.js
CHANGED
|
@@ -7,7 +7,7 @@ import { useMeasureAuto } from '../internal/MetricsProvider.js';
|
|
|
7
7
|
import { usePaneStore } from '../internal/PaneStore.js';
|
|
8
8
|
import { useInert } from '../internal/useInert.js';
|
|
9
9
|
import { EnvironmentFingerprintNode } from './EnvironmentFingerprintNode.js';
|
|
10
|
-
import { s as styles } from '../nav-bar-
|
|
10
|
+
import { s as styles } from '../nav-bar-u4djNNnN.js';
|
|
11
11
|
import '../internal/utils.js';
|
|
12
12
|
import 'motion';
|
|
13
13
|
import '../internal/KeyedSubscriptions.js';
|
package/public/TitleContainer.js
CHANGED
|
@@ -5,7 +5,7 @@ import { useRegisterRegionLabel, useRegisterRegionDescription } from '@hh.ru/mag
|
|
|
5
5
|
import { Morph } from './Morph.js';
|
|
6
6
|
import { useTitleDefaultProps, useSubtitleDefaultProps } from './defaultProps.js';
|
|
7
7
|
import { TextDefaultPropsContext } from '@hh.ru/magritte-ui-typography';
|
|
8
|
-
import { s as styles } from '../nav-bar-
|
|
8
|
+
import { s as styles } from '../nav-bar-u4djNNnN.js';
|
|
9
9
|
import 'react';
|
|
10
10
|
import 'motion/react';
|
|
11
11
|
import '../internal/MetricsProvider.js';
|
package/nav-bar-B7uPipzE.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import './index.css';
|
|
2
|
-
var styles = {"actions-container":"magritte-actions-container___CBgYW_1-4-0","actionsContainer":"magritte-actions-container___CBgYW_1-4-0","actions-no-children":"magritte-actions-no-children___rgJUl_1-4-0","actionsNoChildren":"magritte-actions-no-children___rgJUl_1-4-0","actions-left-slot":"magritte-actions-left-slot___DNOj0_1-4-0","actionsLeftSlot":"magritte-actions-left-slot___DNOj0_1-4-0","actions-right-slot":"magritte-actions-right-slot___aodtj_1-4-0","actionsRightSlot":"magritte-actions-right-slot___aodtj_1-4-0","navbar-transparent-end":"magritte-navbar-transparent-end___6KqLR_1-4-0","navbarTransparentEnd":"magritte-navbar-transparent-end___6KqLR_1-4-0","actions-start-stage":"magritte-actions-start-stage___MJ67a_1-4-0","actionsStartStage":"magritte-actions-start-stage___MJ67a_1-4-0","actions-side-slot-content":"magritte-actions-side-slot-content___TlHrX_1-4-0","actionsSideSlotContent":"magritte-actions-side-slot-content___TlHrX_1-4-0","actions-icon-morph":"magritte-actions-icon-morph___-nNgW_1-4-0","actionsIconMorph":"magritte-actions-icon-morph___-nNgW_1-4-0","navbar-transparent-start":"magritte-navbar-transparent-start___wysv0_1-4-0","navbarTransparentStart":"magritte-navbar-transparent-start___wysv0_1-4-0","actions-end-stage":"magritte-actions-end-stage___qHtTV_1-4-0","actionsEndStage":"magritte-actions-end-stage___qHtTV_1-4-0","navbar-not-transparent":"magritte-navbar-not-transparent___5KZNp_1-4-0","navbarNotTransparent":"magritte-navbar-not-transparent___5KZNp_1-4-0","navbar-transparent":"magritte-navbar-transparent___ULEh8_1-4-0","navbarTransparent":"magritte-navbar-transparent___ULEh8_1-4-0","actions-only-stage":"magritte-actions-only-stage___cg10A_1-4-0","actionsOnlyStage":"magritte-actions-only-stage___cg10A_1-4-0","actions-side-slot-content-clone":"magritte-actions-side-slot-content-clone___jDxVm_1-4-0","actionsSideSlotContentClone":"magritte-actions-side-slot-content-clone___jDxVm_1-4-0","actions-center-slot":"magritte-actions-center-slot___hLAy6_1-4-0","actionsCenterSlot":"magritte-actions-center-slot___hLAy6_1-4-0","actions-center-slot-centered":"magritte-actions-center-slot-centered___merXQ_1-4-0","actionsCenterSlotCentered":"magritte-actions-center-slot-centered___merXQ_1-4-0","align-top":"magritte-align-top___-QSFW_1-4-0","alignTop":"magritte-align-top___-QSFW_1-4-0","align-bottom":"magritte-align-bottom___FliHI_1-4-0","alignBottom":"magritte-align-bottom___FliHI_1-4-0","title-container-wrapper":"magritte-title-container-wrapper___DQUcj_1-4-0","titleContainerWrapper":"magritte-title-container-wrapper___DQUcj_1-4-0","title-main-part":"magritte-title-main-part___npoHN_1-4-0","titleMainPart":"magritte-title-main-part___npoHN_1-4-0","title-left-slot":"magritte-title-left-slot___HTE7h_1-4-0","titleLeftSlot":"magritte-title-left-slot___HTE7h_1-4-0","title-container":"magritte-title-container___y9AIx_1-4-0","titleContainer":"magritte-title-container___y9AIx_1-4-0","subtitle-container":"magritte-subtitle-container___nVUBu_1-4-0","subtitleContainer":"magritte-subtitle-container___nVUBu_1-4-0","text-morph-item":"magritte-text-morph-item___-vXru_1-4-0","textMorphItem":"magritte-text-morph-item___-vXru_1-4-0","centered":"magritte-centered___Y2mlP_1-4-0","title-morph-item":"magritte-title-morph-item___t7Wf3_1-4-0","titleMorphItem":"magritte-title-morph-item___t7Wf3_1-4-0","title":"magritte-title___ZbLgP_1-4-0","size-large":"magritte-size-large___ISXfH_1-4-0","sizeLarge":"magritte-size-large___ISXfH_1-4-0","pane-content":"magritte-pane-content___UVmC6_1-4-0","paneContent":"magritte-pane-content___UVmC6_1-4-0","pane-background":"magritte-pane-background___PDZAX_1-4-0","paneBackground":"magritte-pane-background___PDZAX_1-4-0","morph-item":"magritte-morph-item___8kF46_1-4-0","morphItem":"magritte-morph-item___8kF46_1-4-0","morph-item-top":"magritte-morph-item-top___WPEkn_1-4-0","morphItemTop":"magritte-morph-item-top___WPEkn_1-4-0","morph-item-bottom":"magritte-morph-item-bottom___zNbsF_1-4-0","morphItemBottom":"magritte-morph-item-bottom___zNbsF_1-4-0","morph-item-left":"magritte-morph-item-left___T6AMW_1-4-0","morphItemLeft":"magritte-morph-item-left___T6AMW_1-4-0","morph-item-right":"magritte-morph-item-right___EuT1E_1-4-0","morphItemRight":"magritte-morph-item-right___EuT1E_1-4-0","pane":"magritte-pane___f8eFC_1-4-0","start-state-container":"magritte-start-state-container___giBVb_1-4-0","startStateContainer":"magritte-start-state-container___giBVb_1-4-0","end-state-container":"magritte-end-state-container___uiW8Q_1-4-0","endStateContainer":"magritte-end-state-container___uiW8Q_1-4-0","content-container":"magritte-content-container___7s7vv_1-4-0","contentContainer":"magritte-content-container___7s7vv_1-4-0","next-pane":"magritte-next-pane___H2oxQ_1-4-0","nextPane":"magritte-next-pane___H2oxQ_1-4-0","nav-bar":"magritte-nav-bar___RRGe0_1-4-0","navBar":"magritte-nav-bar___RRGe0_1-4-0","nav-bar-overlay":"magritte-nav-bar-overlay___Mq5ZD_1-4-0","navBarOverlay":"magritte-nav-bar-overlay___Mq5ZD_1-4-0","nav-bar-overlay-wrapper":"magritte-nav-bar-overlay-wrapper___y1VpY_1-4-0","navBarOverlayWrapper":"magritte-nav-bar-overlay-wrapper___y1VpY_1-4-0","nav-bar-content-container":"magritte-nav-bar-content-container___H-WMO_1-4-0","navBarContentContainer":"magritte-nav-bar-content-container___H-WMO_1-4-0","nav-bar-panes-container":"magritte-nav-bar-panes-container___5ZDLa_1-4-0","navBarPanesContainer":"magritte-nav-bar-panes-container___5ZDLa_1-4-0","nav-bar-progressive-blur":"magritte-nav-bar-progressive-blur___qyeUV_1-4-0","navBarProgressiveBlur":"magritte-nav-bar-progressive-blur___qyeUV_1-4-0","nav-bar-stage":"magritte-nav-bar-stage___amDz7_1-4-0","navBarStage":"magritte-nav-bar-stage___amDz7_1-4-0","last-pane":"magritte-last-pane___Hf2No_1-4-0","lastPane":"magritte-last-pane___Hf2No_1-4-0","metrics-mode":"magritte-metrics-mode___h38aX_1-4-0","metricsMode":"magritte-metrics-mode___h38aX_1-4-0","layout-morph":"magritte-layout-morph___I3SPy_1-4-0","layoutMorph":"magritte-layout-morph___I3SPy_1-4-0","animation-stage-progress":"magritte-animation-stage-progress___5FthT_1-4-0","animationStageProgress":"magritte-animation-stage-progress___5FthT_1-4-0","layout-morph-start":"magritte-layout-morph-start___9-krP_1-4-0","layoutMorphStart":"magritte-layout-morph-start___9-krP_1-4-0","layout-morph-end":"magritte-layout-morph-end___LIg4d_1-4-0","layoutMorphEnd":"magritte-layout-morph-end___LIg4d_1-4-0","divider-container":"magritte-divider-container___-NdWi_1-4-0","dividerContainer":"magritte-divider-container___-NdWi_1-4-0"};
|
|
3
|
-
|
|
4
|
-
export { styles as s };
|
|
5
|
-
//# sourceMappingURL=nav-bar-B7uPipzE.js.map
|
package/nav-bar-B7uPipzE.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nav-bar-B7uPipzE.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|