|
9 | 9 | @mixin splitter($theme) { |
10 | 10 | @include css-vars($theme); |
11 | 11 | $splitter-color: var-get($theme, 'bar-color'); |
| 12 | + $splitter-size: var-get($theme, 'size'); |
12 | 13 | $hitbox-size: rem(4px); |
13 | 14 | $debug-hitbox: false; |
14 | 15 | $hitbox-debug-color: rgba(coral, .24); |
15 | 16 |
|
16 | 17 | $variant: map.get($theme, '_meta', 'theme'); |
17 | 18 |
|
18 | | - //splitter-size + borders |
19 | | - $splitter-size: unitless(map.get($theme, 'size')) + 2; |
20 | | - |
21 | | - //calculate the value for the slim(indigo) splitter |
22 | | - $slim-splitter: calc( 1 / $splitter-size); |
| 19 | + // Get unitless value from theme for use in CSS custom properties |
| 20 | + $size-unitless: unitless(map.get($theme, 'size')); |
23 | 21 |
|
24 | 22 | %igx-splitter-base { |
| 23 | + // Define CSS custom properties that use --ig-base-font-size for dynamic calculations |
| 24 | + --splitter-size: calc(#{$size-unitless} * var(--ig-base-font-size, 16px) + 2px); |
| 25 | + --slim-splitter: calc(1 / calc(var(--splitter-size) / 1px)); |
| 26 | + |
25 | 27 | &[aria-orientation='horizontal'] { |
26 | 28 | [dir='rtl'] & { |
27 | 29 | flex-direction: row-reverse !important; |
|
37 | 39 | background: if($debug-hitbox, $hitbox-debug-color, transparent); |
38 | 40 |
|
39 | 41 | @if $variant == 'indigo' { |
40 | | - height: rem($splitter-size * 4px); |
| 42 | + height: calc(var(--splitter-size) * 4); |
41 | 43 | } |
42 | 44 | } |
43 | 45 |
|
|
46 | 48 | height: 100%; |
47 | 49 |
|
48 | 50 | @if $variant == 'indigo' { |
49 | | - width: rem($splitter-size * 4px); |
| 51 | + width: calc(var(--splitter-size) * 4); |
50 | 52 | } |
51 | 53 | } |
52 | 54 |
|
53 | 55 | %hide-controls { |
54 | 56 | %igx-splitter-handle, |
55 | 57 | %igx-splitter-expander { |
56 | 58 | opacity: 0; |
57 | | - transition: opacity .25s .5s ease; |
| 59 | + transition: opacity .25s .3s ease; |
58 | 60 | pointer-events: none; |
59 | 61 | } |
60 | 62 | } |
61 | 63 |
|
62 | 64 | %show-controls { |
63 | 65 | %igx-splitter-handle, |
64 | 66 | %igx-splitter-expander { |
65 | | - opacity: 1; |
| 67 | + opacity: .68; |
66 | 68 | transition: opacity .25s ease; |
67 | 69 | pointer-events: auto; |
68 | 70 | } |
|
76 | 78 | [aria-orientation='vertical'] & { |
77 | 79 | transform: scaleY(1); |
78 | 80 | } |
| 81 | + |
79 | 82 | transition-delay: 0s !important; |
80 | 83 | } |
81 | 84 |
|
82 | 85 | %indigo-splitter-bar { |
83 | 86 | @extend %hide-controls; |
| 87 | + transition: all .25s .3s $in-out-quad !important; |
84 | 88 |
|
85 | 89 | [aria-orientation='horizontal'] & { |
86 | | - transform: scaleX($slim-splitter); |
| 90 | + transform: scaleX(var(--slim-splitter)); |
87 | 91 | } |
88 | 92 |
|
89 | 93 | [aria-orientation='vertical'] & { |
90 | | - transform: scaleY($slim-splitter); |
| 94 | + transform: scaleY(var(--slim-splitter)); |
91 | 95 | } |
92 | 96 |
|
93 | | - &.igx-splitter-bar--collapsible { |
94 | | - transition: all .25s .5s $in-out-quad !important; |
| 97 | + &:hover { |
| 98 | + @extend %expand-bars; |
| 99 | + } |
95 | 100 |
|
| 101 | + &.igx-splitter-bar--collapsible { |
96 | 102 | &::before, |
97 | 103 | &::after { |
98 | 104 | transition-delay: 2s; |
99 | 105 | } |
100 | 106 |
|
101 | 107 | &:hover { |
102 | | - @extend %show-controls; |
103 | | - @extend %expand-bars; |
| 108 | + %igx-splitter-handle, |
| 109 | + %igx-splitter-expander { |
| 110 | + opacity: 1; |
| 111 | + transition: opacity .25s ease; |
| 112 | + pointer-events: auto; |
| 113 | + } |
104 | 114 |
|
105 | 115 | &::before, |
106 | 116 | &::after { |
|
126 | 136 | flex-grow: 1; |
127 | 137 | justify-content: center; |
128 | 138 | align-items: center; |
129 | | - background: $splitter-color; |
130 | | - border: rem(1px) solid $splitter-color; |
| 139 | + background: hsla(from $splitter-color h s l / 0.68); |
131 | 140 | z-index: 99; |
132 | | - opacity: .68; |
133 | | - transition: opacity .15s $out-quad !important; |
| 141 | + padding-block: rem(1px); |
134 | 142 |
|
135 | 143 | @if $variant != 'indigo' { |
| 144 | + transition: background .15s $out-quad !important; |
136 | 145 | @extend %hide-controls; |
137 | 146 |
|
138 | 147 | &.igx-splitter-bar--collapsible { |
139 | 148 | @extend %show-controls; |
| 149 | + |
| 150 | + &:hover { |
| 151 | + %igx-splitter-handle, |
| 152 | + %igx-splitter-expander { |
| 153 | + opacity: 1; |
| 154 | + } |
| 155 | + } |
140 | 156 | } |
141 | 157 | } |
142 | 158 |
|
|
156 | 172 |
|
157 | 173 | &:hover { |
158 | 174 | transition: all .25s ease-out; |
159 | | - opacity: 1; |
| 175 | + background: $splitter-color; |
160 | 176 | } |
161 | 177 | } |
162 | 178 |
|
163 | 179 | %igx-splitter-bar--focus { |
164 | 180 | // Remove the default browser outline styles |
165 | | - outline: transparent solid rem(1px); |
166 | | - box-shadow: inset 0 0 0 rem(1px) var-get($theme, 'focus-color'); |
| 181 | + outline: none; |
| 182 | + box-shadow: 0 0 0 rem(2px) var-get($theme, 'focus-color'); |
| 183 | + transition: box-shadow .15s ease-in if($variant == 'indigo', .1s, 0s); |
| 184 | + z-index: 100; |
167 | 185 |
|
168 | 186 | @if $variant == 'indigo' { |
169 | | - box-shadow: none; |
170 | | - |
171 | 187 | %indigo-splitter-bar { |
172 | | - background: var-get($theme, 'focus-color'); |
173 | | - border-color: var-get($theme, 'focus-color'); |
| 188 | + @extend %expand-bars; |
174 | 189 |
|
175 | 190 | &.igx-splitter-bar--collapsible { |
176 | | - @extend %show-controls; |
177 | | - @extend %expand-bars; |
| 191 | + @extend %show-controls; |
| 192 | + |
| 193 | + &:hover { |
| 194 | + %igx-splitter-handle, |
| 195 | + %igx-splitter-expander { |
| 196 | + opacity: 1; |
| 197 | + } |
| 198 | + } |
178 | 199 | } |
179 | 200 | } |
180 | 201 | } |
181 | 202 | } |
182 | 203 |
|
| 204 | + %igx-splitter-bar--active { |
| 205 | + background: var-get($theme, 'bar-color-active'); |
| 206 | + } |
| 207 | + |
183 | 208 | %igx-splitter-bar--vertical { |
| 209 | + padding: 0 rem(1px); |
184 | 210 | flex-direction: column; |
185 | 211 | height: 100%; |
186 | 212 |
|
|
202 | 228 | border-radius: var-get($theme, 'border-radius'); |
203 | 229 | } |
204 | 230 |
|
| 231 | + %igx-splitter-handle--active { |
| 232 | + background: var-get($theme, 'handle-color-active'); |
| 233 | + } |
| 234 | + |
205 | 235 | %igx-splitter-handle--horizontal { |
206 | 236 | width: 25%; |
207 | | - height: var-get($theme, 'size'); |
| 237 | + height: $splitter-size; |
208 | 238 | margin: 0 rem(48px); |
209 | 239 | } |
210 | 240 |
|
211 | 241 | %igx-splitter-handle--vertical { |
212 | | - width: var-get($theme, 'size'); |
| 242 | + width: $splitter-size; |
213 | 243 | height: 25%; |
214 | 244 | margin: rem(48px) 0; |
215 | 245 | } |
|
224 | 254 | position: relative; |
225 | 255 | width: 0; |
226 | 256 | height: 0; |
227 | | - border-inline-end: var-get($theme, 'size') solid transparent; |
228 | | - border-inline-start: var-get($theme, 'size') solid transparent; |
| 257 | + border-inline-end: $splitter-size solid transparent; |
| 258 | + border-inline-start: $splitter-size solid transparent; |
229 | 259 | cursor: pointer; |
230 | 260 | z-index: 1; |
231 | 261 | } |
232 | 262 |
|
233 | 263 | %igx-splitter-expander--start { |
234 | | - border-bottom: var-get($theme, 'size') solid var-get($theme, 'expander-color'); |
| 264 | + border-block-end: $splitter-size solid var-get($theme, 'expander-color'); |
235 | 265 |
|
236 | 266 | &::before { |
237 | 267 | @extend %igx-splitter-hitbox; |
|
242 | 272 | } |
243 | 273 | } |
244 | 274 |
|
| 275 | + %igx-splitter-expander--start--active { |
| 276 | + border-block-end-color: var-get($theme, 'expander-color-active'); |
| 277 | + } |
| 278 | + |
245 | 279 | %igx-splitter-expander--end { |
246 | | - border-bottom: unset; |
247 | | - border-top: var-get($theme, 'size') solid var-get($theme, 'expander-color'); |
| 280 | + border-block-start: $splitter-size solid var-get($theme, 'expander-color'); |
248 | 281 |
|
249 | 282 | &::before { |
250 | 283 | @extend %igx-splitter-hitbox; |
|
255 | 288 | } |
256 | 289 | } |
257 | 290 |
|
| 291 | + %igx-splitter-expander--end--active { |
| 292 | + border-block-start-color: var-get($theme, 'expander-color-active'); |
| 293 | + } |
| 294 | + |
258 | 295 | %igx-splitter-expander--start-vertical { |
259 | | - border-top: var-get($theme, 'size') solid transparent; |
260 | | - border-inline-end: var-get($theme, 'size') solid var-get($theme, 'expander-color'); |
261 | | - border-bottom: var-get($theme, 'size') solid transparent; |
| 296 | + border-block-start: $splitter-size solid transparent; |
| 297 | + border-inline-end: $splitter-size solid var-get($theme, 'expander-color'); |
| 298 | + border-block-end: $splitter-size solid transparent; |
262 | 299 | border-inline-start: unset; |
263 | 300 |
|
264 | 301 | &::before { |
|
270 | 307 | } |
271 | 308 | } |
272 | 309 |
|
| 310 | + %igx-splitter-expander--start-vertical--active { |
| 311 | + border-block-end-color: transparent; |
| 312 | + border-inline-end-color: var-get($theme, 'expander-color-active'); |
| 313 | + } |
| 314 | + |
273 | 315 | %igx-splitter-expander--end-vertical { |
274 | | - border-top: var-get($theme, 'size') solid transparent; |
| 316 | + border-block-start: $splitter-size solid transparent; |
275 | 317 | border-inline-end: unset; |
276 | | - border-bottom: var-get($theme, 'size') solid transparent; |
277 | | - border-inline-start: var-get($theme, 'size') solid var-get($theme, 'expander-color'); |
| 318 | + border-block-end: $splitter-size solid transparent; |
| 319 | + border-inline-start: $splitter-size solid var-get($theme, 'expander-color'); |
278 | 320 |
|
279 | 321 | &::before { |
280 | 322 | @extend %igx-splitter-hitbox; |
|
284 | 326 | width: calc(#{map.get($theme, 'size')} * 3); |
285 | 327 | } |
286 | 328 | } |
| 329 | + |
| 330 | + %igx-splitter-expander--end-vertical--active { |
| 331 | + border-block-start-color: transparent; |
| 332 | + border-inline-start-color: var-get($theme, 'expander-color-active'); |
| 333 | + } |
287 | 334 | } |
0 commit comments