@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 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-4-0{
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-4-0{
18
+ .magritte-actions-no-children___rgJUl_1-5-1{
19
19
  justify-content:space-between;
20
20
  }
21
- .magritte-actions-left-slot___DNOj0_1-4-0,
22
- .magritte-actions-right-slot___aodtj_1-4-0{
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-4-0 .magritte-actions-start-stage___MJ67a_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,
30
- .magritte-navbar-transparent-start___wysv0_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,
31
- .magritte-navbar-not-transparent___5KZNp_1-4-0 .magritte-actions-start-stage___MJ67a_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,
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-4-0 .magritte-actions-start-stage___MJ67a_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,
36
- .magritte-navbar-transparent-start___wysv0_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,
37
- .magritte-navbar-not-transparent___5KZNp_1-4-0 .magritte-actions-start-stage___MJ67a_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,
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-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,
42
- .magritte-navbar-transparent-start___wysv0_1-4-0 .magritte-actions-start-stage___MJ67a_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,
43
- .magritte-navbar-transparent___ULEh8_1-4-0 .magritte-actions-start-stage___MJ67a_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,
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-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,
48
- .magritte-navbar-transparent-start___wysv0_1-4-0 .magritte-actions-start-stage___MJ67a_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,
49
- .magritte-navbar-transparent___ULEh8_1-4-0 .magritte-actions-start-stage___MJ67a_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,
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-4-0 .magritte-actions-only-stage___cg10A_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,
54
- .magritte-navbar-transparent-start___wysv0_1-4-0 .magritte-actions-only-stage___cg10A_1-4-0 .magritte-actions-right-slot___aodtj_1-4-0 .magritte-actions-side-slot-content-clone___jDxVm_1-4-0 > .magritte-actions-icon-morph___-nNgW_1-4-0:first-child{
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-4-0 .magritte-actions-only-stage___cg10A_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,
58
- .magritte-navbar-transparent-start___wysv0_1-4-0 .magritte-actions-only-stage___cg10A_1-4-0 .magritte-actions-left-slot___DNOj0_1-4-0 .magritte-actions-side-slot-content-clone___jDxVm_1-4-0 > .magritte-actions-icon-morph___-nNgW_1-4-0:last-child{
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-4-0 .magritte-actions-only-stage___cg10A_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,
62
- .magritte-navbar-transparent-end___6KqLR_1-4-0 .magritte-actions-only-stage___cg10A_1-4-0 .magritte-actions-right-slot___aodtj_1-4-0 .magritte-actions-side-slot-content-clone___jDxVm_1-4-0 > .magritte-actions-icon-morph___-nNgW_1-4-0:first-child{
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-4-0 .magritte-actions-only-stage___cg10A_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,
66
- .magritte-navbar-transparent-end___6KqLR_1-4-0 .magritte-actions-only-stage___cg10A_1-4-0 .magritte-actions-left-slot___DNOj0_1-4-0 .magritte-actions-side-slot-content-clone___jDxVm_1-4-0 > .magritte-actions-icon-morph___-nNgW_1-4-0:last-child{
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-4-0{
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-4-0.magritte-actions-center-slot-centered___merXQ_1-4-0{
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-4-0,
78
- .magritte-actions-side-slot-content-clone___jDxVm_1-4-0{
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-4-0 .magritte-actions-side-slot-content___TlHrX_1-4-0,
85
- .magritte-align-top___-QSFW_1-4-0 .magritte-actions-side-slot-content-clone___jDxVm_1-4-0{
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-4-0 .magritte-actions-side-slot-content___TlHrX_1-4-0,
89
- .magritte-align-bottom___FliHI_1-4-0 .magritte-actions-side-slot-content-clone___jDxVm_1-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0{
121
+ .magritte-subtitle-container___nVUBu_1-5-1{
126
122
  display:flex;
127
123
  }
128
- .magritte-subtitle-container___nVUBu_1-4-0 .magritte-text-morph-item___-vXru_1-4-0{
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-4-0 .magritte-subtitle-container___nVUBu_1-4-0,
140
- .magritte-centered___Y2mlP_1-4-0 .magritte-title-container___y9AIx_1-4-0{
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-4-0{
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-4-0{
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-4-0 .magritte-text-morph-item___-vXru_1-4-0{
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-4-0 .magritte-title-main-part___npoHN_1-4-0{
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-4-0 .magritte-title-container___y9AIx_1-4-0{
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-4-0 .magritte-title___ZbLgP_1-4-0 .magritte-text-morph-item___-vXru_1-4-0{
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-4-0 .magritte-subtitle-container___nVUBu_1-4-0 .magritte-text-morph-item___-vXru_1-4-0{
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-4-0{
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-4-0{
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-4-0 .magritte-pane-background___PDZAX_1-4-0{
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-4-0 .magritte-pane-background___PDZAX_1-4-0{
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-4-0 .magritte-pane-background___PDZAX_1-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0{
243
+ .magritte-content-container___7s7vv_1-5-1{
248
244
  box-sizing:border-box;
249
245
  }
250
- .magritte-next-pane___H2oxQ_1-4-0{
246
+ .magritte-next-pane___H2oxQ_1-5-1{
251
247
  position:relative;
252
248
  }
253
- .magritte-nav-bar___RRGe0_1-4-0{
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-4-0 .magritte-nav-bar-overlay-wrapper___y1VpY_1-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0 .magritte-nav-bar-stage___amDz7_1-4-0,
282
- .magritte-nav-bar-content-container___H-WMO_1-4-0 .nav-bar-layout-animation-stage-start,
283
- .magritte-nav-bar-content-container___H-WMO_1-4-0 .nav-bar-layout-animation-stage-end{
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-4-0 .magritte-next-pane___H2oxQ_1-4-0 .magritte-nav-bar-stage___amDz7_1-4-0,
287
- .magritte-nav-bar-content-container___H-WMO_1-4-0 .magritte-next-pane___H2oxQ_1-4-0 .nav-bar-layout-animation-stage-start,
288
- .magritte-nav-bar-content-container___H-WMO_1-4-0 .magritte-next-pane___H2oxQ_1-4-0 .nav-bar-layout-animation-stage-end{
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-4-0 .magritte-nav-bar-stage___amDz7_1-4-0,
292
- .magritte-last-pane___Hf2No_1-4-0 .nav-bar-layout-animation-stage-start,
293
- .magritte-last-pane___Hf2No_1-4-0 .nav-bar-layout-animation-stage-end{
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-4-0 .magritte-last-pane___Hf2No_1-4-0 .magritte-nav-bar-stage___amDz7_1-4-0,
297
- .magritte-next-pane___H2oxQ_1-4-0 .magritte-last-pane___Hf2No_1-4-0 .nav-bar-layout-animation-stage-start,
298
- .magritte-next-pane___H2oxQ_1-4-0 .magritte-last-pane___Hf2No_1-4-0 .nav-bar-layout-animation-stage-end{
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-4-0{
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-4-0 .magritte-morph-item___8kF46_1-4-0,
305
- .magritte-metrics-mode___h38aX_1-4-0 .magritte-pane___f8eFC_1-4-0,
306
- .magritte-metrics-mode___h38aX_1-4-0 .magritte-next-pane___H2oxQ_1-4-0{
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-4-0,
318
- .nav-bar-layout-animation-stage-start .magritte-layout-morph___I3SPy_1-4-0{
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-4-0{
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-4-0 .magritte-layout-morph___I3SPy_1-4-0 > *{
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-4-0{
329
+ .magritte-layout-morph-start___9-krP_1-5-1{
334
330
  z-index:2;
335
331
  }
336
- .magritte-layout-morph-end___LIg4d_1-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0{
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-4-0 .magritte-divider-container___-NdWi_1-4-0{
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-4-0 .magritte-divider-container___-NdWi_1-4-0{
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-B7uPipzE.js';
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
- const maxProgress = maxScrollTop >= animationHeight + top
13
- ? 1
14
- : (animationRanges.find((range) => range[0] * animationHeight <= maxScrollTop - top) ?? [0])[0];
15
- const mapScrollToAnimationPropgress = (scrollPosition) => {
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 [mapScrollToAnimationPropgress, getClosestStops];
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 endPos;
41
+ let fullEndPos;
36
42
  if (typeof endTriggerPosition === 'number') {
37
- endPos = startPos + endTriggerPosition;
43
+ fullEndPos = startPos + endTriggerPosition;
38
44
  }
39
45
  else {
40
- endPos = endTriggerPosition?.current
46
+ fullEndPos = endTriggerPosition?.current
41
47
  ? getRelativeOffset(scrollAdapter, endTriggerPosition.current, endTriggerEdge) + heightDelta - bottom
42
48
  : startPos + animationHeight;
43
49
  }
44
- endPos += top;
50
+ fullEndPos += top;
45
51
  startPos += top;
46
- let endProgress = 1;
47
- if (endPos > maxScrollTop) {
48
- const scrollDelta = endPos - startPos;
49
- endProgress = (animationRanges.find((range) => range[0] * scrollDelta + startPos < maxScrollTop) ?? [0])[0];
50
- endPos = startPos + scrollDelta * endProgress;
51
- }
52
- return [remap([startPos, endPos], [0, endProgress]), () => ({ bottom: startPos, top: endPos })];
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 [mapFn, getClosestStops] = createScrollToAnimationProgressMapFn(getNavBarMetrics, scrollAdapter, animationRanges, startTriggerPositionRef.current, endTriggerPositionRef.current, startTriggerEdgeRef.current, endTriggerEdgeRef.current);
78
- getClosestStopsRef.current = getClosestStops;
79
- const updateDivider = (scrollPosition, totalAnimationProgress) => {
80
- dividerVisibility.set(isDividerVisible(scrollPosition, top, heightDelta, totalAnimationProgress) ? 'visible' : 'hidden');
81
- dividerOffsetY.set(-heightDelta * totalAnimationProgress);
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
- unsubscribe = scrollPosition.on('change', (value) => {
84
- totalAnimationProgress.set(mapFn(value));
85
- updateDivider(value, totalAnimationProgress.get());
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":"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"}
@@ -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.4.0",
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.1",
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.1.4",
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": "9f10e45677eb8f50f47c766674fb072a4dc88dc0"
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-B7uPipzE.js';
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';
@@ -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-B7uPipzE.js';
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';
@@ -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-B7uPipzE.js';
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-B7uPipzE.js';
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';
@@ -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-B7uPipzE.js';
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 || (typeof startTriggerPosition === 'string' && !endTriggerPosition)) {
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 }) }), jsx(motion.div, { className: styles.dividerContainer, style: { ...dividerStyle, visibility: dividerVisibility }, children: jsx(Divider, {}) })] }) }) }) }));
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 };
@@ -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-B7uPipzE.js';
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-B7uPipzE.js';
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';
@@ -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-B7uPipzE.js';
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';
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"nav-bar-B7uPipzE.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}