@@ -11,7 +11,12 @@ import {
11
11
VNode ,
12
12
Watch ,
13
13
} from "@stencil/core" ;
14
- import { focusFirstTabbable , slotChangeGetAssignedElements , toAriaBoolean } from "../../utils/dom" ;
14
+ import {
15
+ focusFirstTabbable ,
16
+ slotChangeGetAssignedElements ,
17
+ slotChangeHasAssignedElement ,
18
+ toAriaBoolean ,
19
+ } from "../../utils/dom" ;
15
20
import {
16
21
connectInteractive ,
17
22
disconnectInteractive ,
@@ -168,6 +173,8 @@ export class Panel
168
173
169
174
resizeObserver = createObserver ( "resize" , ( ) => this . resizeHandler ( ) ) ;
170
175
176
+ @State ( ) hasDefaultContent = false ;
177
+
171
178
@State ( ) hasStartActions = false ;
172
179
173
180
@State ( ) hasEndActions = false ;
@@ -257,28 +264,20 @@ export class Panel
257
264
this . calcitePanelScroll . emit ( ) ;
258
265
} ;
259
266
260
- handleHeaderActionsStartSlotChange = ( event : Event ) : void => {
261
- const elements = ( event . target as HTMLSlotElement ) . assignedElements ( {
262
- flatten : true ,
263
- } ) ;
267
+ handleDefaultSlotChange = ( event : Event ) : void => {
268
+ this . hasDefaultContent = slotChangeHasAssignedElement ( event ) ;
269
+ } ;
264
270
265
- this . hasStartActions = ! ! elements . length ;
271
+ handleHeaderActionsStartSlotChange = ( event : Event ) : void => {
272
+ this . hasStartActions = slotChangeHasAssignedElement ( event ) ;
266
273
} ;
267
274
268
275
handleHeaderActionsEndSlotChange = ( event : Event ) : void => {
269
- const elements = ( event . target as HTMLSlotElement ) . assignedElements ( {
270
- flatten : true ,
271
- } ) ;
272
-
273
- this . hasEndActions = ! ! elements . length ;
276
+ this . hasEndActions = slotChangeHasAssignedElement ( event ) ;
274
277
} ;
275
278
276
279
handleHeaderMenuActionsSlotChange = ( event : Event ) : void => {
277
- const elements = ( event . target as HTMLSlotElement ) . assignedElements ( {
278
- flatten : true ,
279
- } ) ;
280
-
281
- this . hasMenuItems = ! ! elements . length ;
280
+ this . hasMenuItems = slotChangeHasAssignedElement ( event ) ;
282
281
} ;
283
282
284
283
handleActionBarSlotChange = ( event : Event ) : void => {
@@ -292,35 +291,19 @@ export class Panel
292
291
} ;
293
292
294
293
handleHeaderContentSlotChange = ( event : Event ) : void => {
295
- const elements = ( event . target as HTMLSlotElement ) . assignedElements ( {
296
- flatten : true ,
297
- } ) ;
298
-
299
- this . hasHeaderContent = ! ! elements . length ;
294
+ this . hasHeaderContent = slotChangeHasAssignedElement ( event ) ;
300
295
} ;
301
296
302
297
handleFooterSlotChange = ( event : Event ) : void => {
303
- const elements = ( event . target as HTMLSlotElement ) . assignedElements ( {
304
- flatten : true ,
305
- } ) ;
306
-
307
- this . hasFooterContent = ! ! elements . length ;
298
+ this . hasFooterContent = slotChangeHasAssignedElement ( event ) ;
308
299
} ;
309
300
310
301
handleFooterActionsSlotChange = ( event : Event ) : void => {
311
- const elements = ( event . target as HTMLSlotElement ) . assignedElements ( {
312
- flatten : true ,
313
- } ) ;
314
-
315
- this . hasFooterActions = ! ! elements . length ;
302
+ this . hasFooterActions = slotChangeHasAssignedElement ( event ) ;
316
303
} ;
317
304
318
305
handleFabSlotChange = ( event : Event ) : void => {
319
- const elements = ( event . target as HTMLSlotElement ) . assignedElements ( {
320
- flatten : true ,
321
- } ) ;
322
-
323
- this . hasFab = ! ! elements . length ;
306
+ this . hasFab = slotChangeHasAssignedElement ( event ) ;
324
307
} ;
325
308
326
309
// --------------------------------------------------------------------------
@@ -380,7 +363,10 @@ export class Panel
380
363
381
364
renderActionBar ( ) : VNode {
382
365
return (
383
- < div class = { CSS . actionBarContainer } hidden = { ! this . hasActionBar } >
366
+ < div
367
+ class = { { [ CSS . actionBarContainer ] : true , [ CSS . bottomSeparator ] : this . hasDefaultContent } }
368
+ hidden = { ! this . hasActionBar }
369
+ >
384
370
< slot name = { SLOTS . actionBar } onSlotchange = { this . handleActionBarSlotChange } />
385
371
</ div >
386
372
) ;
@@ -475,7 +461,15 @@ export class Panel
475
461
}
476
462
477
463
renderHeaderNode ( ) : VNode {
478
- const { hasHeaderContent, hasStartActions, hasEndActions, closable, hasMenuItems } = this ;
464
+ const {
465
+ hasHeaderContent,
466
+ hasStartActions,
467
+ hasEndActions,
468
+ closable,
469
+ hasMenuItems,
470
+ hasDefaultContent,
471
+ hasActionBar,
472
+ } = this ;
479
473
480
474
const headerContentNode = this . renderHeaderContent ( ) ;
481
475
@@ -488,7 +482,10 @@ export class Panel
488
482
hasMenuItems ;
489
483
490
484
return (
491
- < header class = { CSS . header } hidden = { ! showHeader } >
485
+ < header
486
+ class = { { [ CSS . header ] : true , [ CSS . bottomSeparator ] : hasDefaultContent || hasActionBar } }
487
+ hidden = { ! showHeader }
488
+ >
492
489
{ this . renderHeaderStartActions ( ) }
493
490
{ this . renderHeaderSlottedContent ( ) }
494
491
{ headerContentNode }
@@ -525,27 +522,16 @@ export class Panel
525
522
} ;
526
523
527
524
renderContent ( ) : VNode {
528
- const { hasFab } = this ;
529
-
530
- const defaultSlotNode : VNode = < slot key = "default-slot" /> ;
531
- const containerNode = hasFab ? (
532
- < section class = { CSS . contentContainer } > { defaultSlotNode } </ section >
533
- ) : (
534
- defaultSlotNode
535
- ) ;
536
-
537
525
return (
538
526
< div
539
- class = { {
540
- [ CSS . contentWrapper ] : true ,
541
- [ CSS . contentContainer ] : ! hasFab ,
542
- [ CSS . contentHeight ] : hasFab ,
543
- } }
527
+ class = { CSS . contentWrapper }
544
528
onScroll = { this . panelScrollHandler }
545
529
// eslint-disable-next-line react/jsx-sort-props
546
530
ref = { this . setPanelScrollEl }
547
531
>
548
- { containerNode }
532
+ < section class = { CSS . contentContainer } >
533
+ < slot onSlotchange = { this . handleDefaultSlotChange } />
534
+ </ section >
549
535
{ this . renderFab ( ) }
550
536
</ div >
551
537
) ;
0 commit comments