diff --git a/projects/example/src/app/plot-app/plot-app.component.html b/projects/example/src/app/plot-app/plot-app.component.html index 91296c85b58391bf48037138ee20ab6aa4b6a956..62d68d3427671ac14a5348c9acdfdec971802b6a 100644 --- a/projects/example/src/app/plot-app/plot-app.component.html +++ b/projects/example/src/app/plot-app/plot-app.component.html @@ -40,7 +40,7 @@ <!-- App content --> <nshmp-template-main-content> - <mat-tab-group> + <mat-tab-group class="height-full"> <mat-tab label="Plots"> <div class="padding-x-1 padding-top-2"> <mat-accordion> diff --git a/projects/nshmp-template/src/lib/components/content-container/content-container.component.html b/projects/nshmp-template/src/lib/components/content-container/content-container.component.html index c32da0deb0083907183adb07e08c884bce6107f4..38278984cefd197e9e06e3217bba9ad8288c6f0d 100644 --- a/projects/nshmp-template/src/lib/components/content-container/content-container.component.html +++ b/projects/nshmp-template/src/lib/components/content-container/content-container.component.html @@ -1,32 +1,27 @@ <!-- Appplication Content --> <div class="app-content"> + @let controlSelected = headerService.controlPanelSelected(); + @let settingsSelected = headerService.settingsSelected(); + <!-- Control Panel --> <div class="side-panel control-panel" [ngClass]="{ - selected: headerService.controlPanelSelected(), + selected: controlSelected, }" > - <div class="container panel-control"> - <div class="spacer"></div> + @if (!(isSmallScreen && settingsSelected)) { + <div class="panel-control"> + @let icon = controlSelected ? 'left_panel_close' : 'left_panel_open'; + @let tooltip = controlSelected ? 'Close control panel' : 'Open control panel'; - @if (headerService.controlPanelSelected()) { - <button - mat-icon-button - class="control" - [ngClass]="{'touch-target-20': nshmpService.isSmallScreen$ | async}" - (click)="headerService.toggleControlPanel()" - > - <mat-icon matTooltip="Close control panel"> left_panel_close </mat-icon> + <button mat-mini-fab class="control" (click)="headerService.toggleControlPanel()"> + <mat-icon [matTooltip]="tooltip"> {{ icon }} </mat-icon> </button> - } @else { - <button mat-icon-button class="control" (click)="headerService.toggleControlPanel()"> - <mat-icon matTooltip="Open control panel"> left_panel_open </mat-icon> - </button> - } - </div> + </div> + } - @if (headerService.controlPanelSelected()) { + @if (controlSelected) { <div class="panel-content"> <ng-content select="nshmp-template-control-panel" /> </div> @@ -34,9 +29,6 @@ </div> <!-- Main Content --> - @let controlSelected = headerService.controlPanelSelected(); - @let settingsSelected = headerService.settingsSelected(); - @if (!(isSmallScreen && (controlSelected || settingsSelected))) { <div class="main"> <ng-content select="nshmp-template-main-content" /> @@ -44,31 +36,23 @@ } <!-- Settings --> - @if (showSettingsPanel()) { + @if (showSettingsPanel() && !(isSmallScreen && controlSelected)) { <div class="side-panel settings" [ngClass]="{ - selected: headerService.settingsSelected(), + selected: settingsSelected, }" > <div class="panel-control"> - @if (headerService.settingsSelected()) { - <button - mat-icon-button - class="control" - [ngClass]="{'touch-target-20': nshmpService.isSmallScreen$ | async}" - (click)="headerService.toggleSettingsPanel()" - > - <mat-icon matTooltip="Close plot settings panel"> right_panel_close </mat-icon> - </button> - } @else { - <button mat-icon-button class="control" (click)="headerService.toggleSettingsPanel()"> - <mat-icon matTooltip="Open plot settings panel"> right_panel_open </mat-icon> - </button> - } + @let icon = settingsSelected ? 'right_panel_close' : 'right_panel_open'; + @let tooltip = settingsSelected ? 'Close plot settings panel' : 'Open plot settings panel'; + + <button mat-mini-fab class="control" (click)="headerService.toggleSettingsPanel()"> + <mat-icon [matTooltip]="tooltip"> {{ icon }} </mat-icon> + </button> </div> - @if (headerService.settingsSelected()) { + @if (settingsSelected) { <div class="panel-content"> <ng-content select="nshmp-template-settings" /> </div> diff --git a/projects/nshmp-template/src/lib/components/content-container/content-container.component.scss b/projects/nshmp-template/src/lib/components/content-container/content-container.component.scss index a32723e2bedea0d1030244602c470394282137c5..6a5d2262b4e6402046eb63cb109c09ea0582a73e 100644 --- a/projects/nshmp-template/src/lib/components/content-container/content-container.component.scss +++ b/projects/nshmp-template/src/lib/components/content-container/content-container.component.scss @@ -11,6 +11,8 @@ } } +$fab-size: 40px; + .app-content { display: flex; flex-direction: row; @@ -24,13 +26,25 @@ width: variables.$side-panel-width; z-index: 2; + &.control-panel .control { + left: variables.$side-panel-width; + } + + &.settings .panel-control { + right: 0; + } + + &.settings .control { + right: variables.$side-panel-width; + } + .panel-control { - border-bottom: solid 1px var(--mat-sys-surface-variant); + position: absolute; } .panel-content { - overflow: scroll; - height: calc(100% - variables.$side-panel-control-height); + height: 100%; + overflow: auto; button { margin-bottom: variables.$form-field-padding-bottom; @@ -43,47 +57,82 @@ state-layer-size: variables.$side-panel-control-height, ) ); + + @include mat.fab-overrides( + ( + small-container-color: var(--mat-sys-background), + small-container-elevation-shadow: none, + small-hover-container-elevation-shadow: none, + small-focus-container-elevation-shadow: none, + ) + ); + + &.mat-mdc-mini-fab { + width: $fab-size; + height: $fab-size; + margin: calc((variables.$side-panel-control-height - $fab-size) / 2); + } } } .side-panel:not(.selected) { position: absolute; - width: variables.$side-panel-control-height; + width: 0; background-color: unset; &.settings { right: 0; - z-index: 100; } - &.control-panel { - left: 0; + &.settings .control { + right: 0; z-index: 100; } - .panel-control { - border-bottom: none; + &.control-panel .control { + left: 0; + z-index: 100; } } .main { height: 100%; flex: 1; - overflow: scroll; width: 100%; + overflow: hidden; } +} + +body.small-screen :host { + .side-panel.selected { + width: 100%; + + &.control-panel .panel-control { + right: 0; + } - .container { - display: flex; + &.control-panel .control { + left: unset; + } - .spacer { - flex: 1 1 auto; + &.settings .panel-control { + left: 0; + right: unset; + } + + &.settings .control { + left: 0; + right: unset; } } } -body.small-screen :host { - .side-panel.selected { - width: 100%; +body:not(.dark-mode) :host { + .control { + @include mat.fab-overrides( + ( + small-foreground-color: var(--mat-sys-on-secondary-container) + ) + ); } } diff --git a/projects/nshmp-template/src/lib/components/content-container/content-container.component.ts b/projects/nshmp-template/src/lib/components/content-container/content-container.component.ts index 7408d113d9e0c5f5314bba6cafefd5dcd5aa0054..60f954b8ffbbd25ceaa30b13bdc0b1bb2d81197f 100644 --- a/projects/nshmp-template/src/lib/components/content-container/content-container.component.ts +++ b/projects/nshmp-template/src/lib/components/content-container/content-container.component.ts @@ -1,4 +1,4 @@ -import {AsyncPipe, NgClass} from '@angular/common'; +import {NgClass} from '@angular/common'; import {Component, input, OnDestroy, OnInit} from '@angular/core'; import {MatButtonModule} from '@angular/material/button'; import {MatIconModule} from '@angular/material/icon'; @@ -8,7 +8,7 @@ import {Subscription} from 'rxjs'; import {HeaderService, NshmpTemplateService} from '../../services'; @Component({ - imports: [NgClass, AsyncPipe, MatIconModule, MatButtonModule, MatTooltipModule], + imports: [NgClass, MatIconModule, MatButtonModule, MatTooltipModule], selector: 'nshmp-template-content-container', styleUrl: './content-container.component.scss', templateUrl: './content-container.component.html',