From 06d14f9bb25e4a424e52e8dab0ec81cb919cba0c Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sat, 25 Aug 2018 09:37:56 +0200 Subject: [PATCH] settings redesign --- app/src/entry.ts | 2 + app/src/global.scss | 87 ++++ app/src/preload.scss | 14 - .../src/components/checkbox.component.pug | 4 +- .../src/components/checkbox.component.ts | 6 +- .../src/components/toggle.component.scss | 70 ++++ .../src/components/toggle.component.ts | 22 ++ terminus-core/src/index.ts | 5 +- terminus-core/src/theme.scss | 6 +- .../src/components/settingsTab.component.pug | 371 +++++++++--------- .../src/components/colorPicker.component.pug | 2 +- .../terminalSettingsTab.component.pug | 271 ++++++------- 12 files changed, 522 insertions(+), 338 deletions(-) create mode 100644 app/src/global.scss create mode 100644 terminus-core/src/components/toggle.component.scss create mode 100644 terminus-core/src/components/toggle.component.ts diff --git a/app/src/entry.ts b/app/src/entry.ts index ee03e958..2a8c639e 100644 --- a/app/src/entry.ts +++ b/app/src/entry.ts @@ -2,6 +2,8 @@ import 'zone.js' import 'core-js/es7/reflect' import 'core-js/core/delay' import 'rxjs' + +import './global.scss' import './toastr.scss' // Always land on the start view diff --git a/app/src/global.scss b/app/src/global.scss new file mode 100644 index 00000000..9fbf606b --- /dev/null +++ b/app/src/global.scss @@ -0,0 +1,87 @@ +body { + min-height: 100vh; + overflow: hidden; + background: #1D272D; +} + +.modal-dialog, .modal-backdrop { + -webkit-app-region: no-drag; +} + +[ngbradiogroup] input[type="radio"] { + display: none; +} + +.form-line { + display: flex; + border-top: 1px solid rgba(0, 0, 0, 0.2); + align-items: center; + padding: 10px 0; + margin: 0; + min-height: 64px; + + .header { + margin-right: auto; + + .title { + } + + .description { + font-size: 13px; + opacity: .5; + } + } + + &>.form-control, &>.input-group { + width: 33%; + } +} + +input[type=range] { + -webkit-appearance: none; + background: transparent; + outline: none; + padding: 0; + + &:focus { + border-color: transparent; + } + + @mixin thumb() { + -webkit-appearance: none; + display: block; + height: 12px; + width: 12px; + background: #aaa; + border-radius: 6px; + cursor: pointer; + margin-top: -4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.95); + transition: 0.25s background; + + &:hover { + background: #777; + } + + &:active { + background: #666; + } + } + + &::-webkit-slider-thumb { @include thumb(); } + &::-moz-range-thumb { @include thumb(); } + &::-ms-thumb { @include thumb(); } + &::thumb { @include thumb(); } + + @mixin track() { + height: 4px; + background: #111; + margin: 3px 0 0; + box-sizing: border-box; + } + + &::-webkit-slider-runnable-track { @include track(); } + &:focus::-webkit-slider-runnable-track { @include track(); } + &::-moz-range-track { @include track(); } + &::-ms-track { @include track(); } +} diff --git a/app/src/preload.scss b/app/src/preload.scss index ad087e36..d7664cf5 100644 --- a/app/src/preload.scss +++ b/app/src/preload.scss @@ -58,17 +58,3 @@ color: #842fe0; } } - -.modal-dialog, .modal-backdrop { - -webkit-app-region: no-drag; -} - -[ngbradiogroup] input[type="radio"] { - display: none; -} - -body { - min-height: 100vh; - overflow: hidden; - background: #1D272D; -} diff --git a/terminus-core/src/components/checkbox.component.pug b/terminus-core/src/components/checkbox.component.pug index cb6b09fc..2a5115a6 100644 --- a/terminus-core/src/components/checkbox.component.pug +++ b/terminus-core/src/components/checkbox.component.pug @@ -1,4 +1,4 @@ -.icon((click)='click()', tabindex='0', [class.active]='model', (keyup.space)='click()') +.icon(tabindex='0', [class.active]='model', (keyup.space)='click()') i.fa.fa-square-o.off i.fa.fa-check-square.on -.text((click)='click()') {{text}} +.text {{text}} diff --git a/terminus-core/src/components/checkbox.component.ts b/terminus-core/src/components/checkbox.component.ts index b6df6b55..060f0e95 100644 --- a/terminus-core/src/components/checkbox.component.ts +++ b/terminus-core/src/components/checkbox.component.ts @@ -1,4 +1,4 @@ -import { NgZone, Component, Input } from '@angular/core' +import { NgZone, Component, Input, HostBinding, HostListener } from '@angular/core' import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms' @Component({ @@ -10,12 +10,12 @@ import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms' ] }) export class CheckboxComponent implements ControlValueAccessor { - @Input() model: boolean + @HostBinding('class.active') @Input() model: boolean @Input() disabled: boolean @Input() text: string private changed = new Array<(val: boolean) => void>() - click () { + @HostListener('click') click () { NgZone.assertInAngularZone() if (this.disabled) { return diff --git a/terminus-core/src/components/toggle.component.scss b/terminus-core/src/components/toggle.component.scss new file mode 100644 index 00000000..bbf6a805 --- /dev/null +++ b/terminus-core/src/components/toggle.component.scss @@ -0,0 +1,70 @@ +:host { + flex: none; + $toggle-size: 18px; + $height: 30px; + $padding: 2px; + cursor: pointer; + display: inline-flex; + overflow: visible; + border-radius: 3px; + line-height: $height; + height: $height; + transition: 0.25s opacity; + align-items: center; + overflow: hidden; + padding-right: 10px; + padding-left: 10px; + margin-left: -10px; + + &:focus { + background: rgba(255,255,255,.05); + border-radius: 5px; + } + + &[disabled] { + opacity: 0.5; + } + + .body { + $border-width: 2px; + border-radius: 5px; + border: $border-width solid rgba(255, 255, 255, .2); + padding: $padding; + height: $toggle-size + $border-width * 2 + $padding * 2; + width: $toggle-size * 2 + $border-width * 2 + $padding * 2; + + position: relative; + + .toggle { + position: absolute; + border-radius: 2px; + width: $toggle-size; + height: $toggle-size; + background: #475158; + top: $padding; + left: $padding; + transition: 0.25s left; + line-height: 19px; + text-align: center; + font-size: 10px; + + i { + opacity: 0; + transition: 0.25s opacity; + } + } + } + + &.active .body .toggle { + left: $toggle-size + $padding; + + i { + color: white; + opacity: 1; + } + } + + &:active { + background: rgba(255,255,255,.1); + } +} diff --git a/terminus-core/src/components/toggle.component.ts b/terminus-core/src/components/toggle.component.ts new file mode 100644 index 00000000..91fd5878 --- /dev/null +++ b/terminus-core/src/components/toggle.component.ts @@ -0,0 +1,22 @@ +import { Component } from '@angular/core' +import { NG_VALUE_ACCESSOR } from '@angular/forms' +import { CheckboxComponent } from './checkbox.component' + +@Component({ + selector: 'toggle', + template: ` +
+
+
+ +
+
+
+ `, + styles: [require('./toggle.component.scss')], + providers: [ + { provide: NG_VALUE_ACCESSOR, useExisting: ToggleComponent, multi: true }, + ] +}) +export class ToggleComponent extends CheckboxComponent { +} diff --git a/terminus-core/src/index.ts b/terminus-core/src/index.ts index f9fe6348..13e27df4 100644 --- a/terminus-core/src/index.ts +++ b/terminus-core/src/index.ts @@ -25,6 +25,7 @@ import { SafeModeModalComponent } from './components/safeModeModal.component' import { StartPageComponent } from './components/startPage.component' import { TabHeaderComponent } from './components/tabHeader.component' import { TitleBarComponent } from './components/titleBar.component' +import { ToggleComponent } from './components/toggle.component' import { WindowControlsComponent } from './components/windowControls.component' import { RenameTabModalComponent } from './components/renameTabModal.component' @@ -73,6 +74,7 @@ const PROVIDERS = [ TabBodyComponent, TabHeaderComponent, TitleBarComponent, + ToggleComponent, WindowControlsComponent, RenameTabModalComponent, SafeModeModalComponent, @@ -82,7 +84,8 @@ const PROVIDERS = [ SafeModeModalComponent, ], exports: [ - CheckboxComponent + CheckboxComponent, + ToggleComponent, ] }) export default class AppModule { diff --git a/terminus-core/src/theme.scss b/terminus-core/src/theme.scss index ae90fc05..15ed4e2b 100644 --- a/terminus-core/src/theme.scss +++ b/terminus-core/src/theme.scss @@ -350,5 +350,9 @@ select.form-control { } checkbox i.on { - color: $blue; + color: $blue; +} + +toggle.active .body .toggle { + background: $blue; } diff --git a/terminus-settings/src/components/settingsTab.component.pug b/terminus-settings/src/components/settingsTab.component.pug index c6c98f2e..e4a67313 100644 --- a/terminus-settings/src/components/settingsTab.component.pug +++ b/terminus-settings/src/components/settingsTab.component.pug @@ -6,199 +6,204 @@ ngb-tabset.vertical(type='tabs', [activeId]='activeTab') | Application ng-template(ngbTabContent) h3.mb-3 Application - .row - .col.col-lg-6 - .form-group - label Theme - select.form-control( - '[(ngModel)]'='config.store.appearance.theme', - (ngModelChange)='config.save()', - ) - option(*ngFor='let theme of themes', [ngValue]='theme.name') {{theme.name}} + .form-line + .header + .title Theme + select.form-control( + [(ngModel)]='config.store.appearance.theme', + (ngModelChange)='config.save()', + ) + option(*ngFor='let theme of themes', [ngValue]='theme.name') {{theme.name}} - .form-group - label Show tabs - br - .btn-group( - '[(ngModel)]'='config.store.appearance.tabsLocation', - (ngModelChange)='config.save()', - ngbRadioGroup - ) - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"top"' - ) - | On the top - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"bottom"' - ) - | At the bottom - - .form-group(*ngIf='hostApp.platform !== Platform.Linux') - label Vibrancy - br - .btn-group( - '[(ngModel)]'='config.store.appearance.vibrancy' - '(ngModelChange)'='config.save(); (hostApp.platform === Platform.Windows && config.requestRestart())' - ngbRadioGroup - ) - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='true' - ) - | Enable - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='false' - ) - | Disable - - .form-group(*ngIf='hostApp.platform !== Platform.Linux') - label Opacity - br + .form-line + .header + .title Tabs location + .btn-group( + [(ngModel)]='config.store.appearance.tabsLocation', + (ngModelChange)='config.save()', + ngbRadioGroup + ) + label.btn.btn-secondary(ngbButtonLabel) input( - type='range', - '[(ngModel)]'='config.store.appearance.opacity', - '(ngModelChange)'='config.save()', - min='0.05', - max='1', - step='0.01' + type='radio', + ngbButton, + [value]='"top"' ) - - .col.col-lg-6 - .form-group - label Window frame - br - .btn-group( - '[(ngModel)]'='config.store.appearance.frame' - '(ngModelChange)'='config.save(); config.requestRestart()' - ngbRadioGroup + | On the top + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"bottom"' ) - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"native"' - ) - | Native - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"thin"' - ) - | Thin - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"full"' - ) - | Full - small.form-text.text-muted Whether a custom window or an OS native window should be used + | At the bottom - .row - .col.col-auto - .form-group - label Dock the terminal - br - .btn-group( - '[(ngModel)]'='config.store.appearance.dock' - '(ngModelChange)'='config.save(); docking.dock()' - ngbRadioGroup - ) - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"off"' - ) - | Off - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"top"' - ) - | Top - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"left"' - ) - | Left - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"right"' - ) - | Right - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"bottom"' - ) - | Bottom + .form-line(*ngIf='hostApp.platform !== Platform.Linux') + .header + .title Vibrancy + .description Gives the window a blurred transparent background - .form-group(*ngIf='config.store.appearance.dock != "off"') - label Display on - br - div( - [(ngModel)]='config.store.appearance.dockScreen', - (ngModelChange)='config.save(); docking.dock()', - ngbRadioGroup - ) - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - value='current' - ) - | Current - label.btn.btn-secondary(*ngFor='let screen of screens', ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='screen.id' - ) - | {{screen.name}} - .col.col-auto - .form-group(*ngIf='config.store.appearance.dock != "off"') - label Docked terminal size - br - input( - type='range', - '[(ngModel)]'='config.store.appearance.dockFill', - '(mouseup)'='config.save(); docking.dock()', - min='0.05', - max='1', - step='0.01' - ) + .btn-group( + [(ngModel)]='config.store.appearance.vibrancy', + (ngModelChange)='config.save(); (hostApp.platform === Platform.Windows && config.requestRestart())', + ngbRadioGroup + ) + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='true' + ) + | Enable + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='false' + ) + | Disable - .form-group - label Debugging - div - button.btn.btn-secondary((click)='hostApp.openDevTools()') - i.fa.fa-bug - span Open DevTools + .form-line(*ngIf='hostApp.platform !== Platform.Linux') + .header + .title Window opacity + input( + type='range', + [(ngModel)]='config.store.appearance.opacity', + (ngModelChange)='config.save()', + min='0.05', + max='1', + step='0.01' + ) - .form-group - label Custom CSS + .form-line + .header + .title Window frame + .description Whether a custom window or an OS native window should be used + + .btn-group( + [(ngModel)]='config.store.appearance.frame', + (ngModelChange)='config.save(); config.requestRestart()', + ngbRadioGroup + ) + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"native"' + ) + | Native + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"thin"' + ) + | Thin + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"full"' + ) + | Full + + .form-line + .header + .title Dock the terminal + .description Snaps the window to a side of the screen + + .btn-group( + [(ngModel)]='config.store.appearance.dock', + (ngModelChange)='config.save(); docking.dock()', + ngbRadioGroup + ) + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"off"' + ) + | Off + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"top"' + ) + | Top + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"left"' + ) + | Left + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"right"' + ) + | Right + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"bottom"' + ) + | Bottom + + .form-line(*ngIf='config.store.appearance.dock != "off"') + .header + .title Display on + .description Snaps the window to a side of the screen + + div( + [(ngModel)]='config.store.appearance.dockScreen', + (ngModelChange)='config.save(); docking.dock()', + ngbRadioGroup + ) + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + value='current' + ) + | Current + label.btn.btn-secondary(*ngFor='let screen of screens', ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='screen.id' + ) + | {{screen.name}} + + .form-line(*ngIf='config.store.appearance.dock != "off"') + .header + .title Docked terminal size + input( + type='range', + [(ngModel)]='config.store.appearance.dockFill', + (mouseup)='config.save(); docking.dock()', + min='0.05', + max='1', + step='0.01' + ) + + .form-line + .header + .title Debugging + + button.btn.btn-secondary((click)='hostApp.openDevTools()') + i.fa.fa-bug + span Open DevTools + + .form-line + .header + .title Custom CSS textarea.form-control( [(ngModel)]='config.store.appearance.css', - '(ngModelChange)'='config.save()', + (ngModelChange)='config.save()', ) ngb-tab(id='hotkeys') diff --git a/terminus-terminal/src/components/colorPicker.component.pug b/terminus-terminal/src/components/colorPicker.component.pug index 918d25db..db063f7e 100644 --- a/terminus-terminal/src/components/colorPicker.component.pug +++ b/terminus-terminal/src/components/colorPicker.component.pug @@ -1,4 +1,4 @@ -template(#content) +ng-template(#content) .preview( [style.width]='"100%"', [style.background]='model', diff --git a/terminus-terminal/src/components/terminalSettingsTab.component.pug b/terminus-terminal/src/components/terminalSettingsTab.component.pug index e3ae2438..047a832e 100644 --- a/terminus-terminal/src/components/terminalSettingsTab.component.pug +++ b/terminus-terminal/src/components/terminalSettingsTab.component.pug @@ -1,33 +1,36 @@ h3.mb-3 Appearance .row .col-md-6 - .form-group - label Font - .row - .col-8 - input.form-control( - type='text', - [ngbTypeahead]='fontAutocomplete', - [(ngModel)]='config.store.terminal.font', - (ngModelChange)='config.save()', - ) - .col-4 - input.form-control( - type='number', - [(ngModel)]='config.store.terminal.fontSize', - (ngModelChange)='config.save()', - ) + .form-line + .header + .title Font - div - checkbox( - text='Enable font ligatures', - [(ngModel)]='config.store.terminal.ligatures', + .d-flex.w-50 + input.form-control( + type='text', + [ngbTypeahead]='fontAutocomplete', + [(ngModel)]='config.store.terminal.font', + (ngModelChange)='config.save()', + ) + input.form-control( + type='number', + [(ngModel)]='config.store.terminal.fontSize', (ngModelChange)='config.save()', ) - .form-group(*ngIf='!editingColorScheme') - label Color scheme - .input-group + .form-line + .header + .title Enable font ligatures + toggle( + [(ngModel)]='config.store.terminal.ligatures', + (ngModelChange)='config.save()', + ) + + .form-line(*ngIf='!editingColorScheme') + .header + .title Color scheme + + .input-group.w-50 select.form-control( [compareWith]='equalComparator', [(ngModel)]='config.store.terminal.colorScheme', @@ -53,7 +56,6 @@ h3.mb-3 Appearance .input-group-btn button.btn.btn-secondary((click)='cancelEditing()') Cancel - .form-group(*ngIf='editingColorScheme') color-picker( '[(model)]'='editingColorScheme.foreground', @@ -77,9 +79,10 @@ h3.mb-3 Appearance [title]='idx', ) - .form-group - label Terminal background - br + .form-line + .header + .title Terminal background + .btn-group( [(ngModel)]='config.store.terminal.background', (ngModelChange)='config.save()', @@ -100,59 +103,6 @@ h3.mb-3 Appearance ) | From colors - .d-flex - .form-group.mr-3 - label Cursor shape - br - .btn-group( - [(ngModel)]='config.store.terminal.cursor', - (ngModelChange)='config.save()', - ngbRadioGroup - ) - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"block"' - ) - | █ - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"beam"' - ) - | | - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='"underline"' - ) - | ▁ - - .form-group - label Blink cursor - br - .btn-group( - [(ngModel)]='config.store.terminal.cursorBlink', - (ngModelChange)='config.save()', - ngbRadioGroup - ) - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='false' - ) - | Off - label.btn.btn-secondary(ngbButtonLabel) - input( - type='radio', - ngbButton, - [value]='true' - ) - | On .col-md-6 .form-group .appearance-preview( @@ -240,55 +190,101 @@ h3.mb-3 Appearance span rm -rf / span([style.background-color]='config.store.terminal.colorScheme.cursor')   +.form-line + .header + .title Cursor shape + + .btn-group( + [(ngModel)]='config.store.terminal.cursor', + (ngModelChange)='config.save()', + ngbRadioGroup + ) + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"block"' + ) + | █ + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"beam"' + ) + | | + label.btn.btn-secondary(ngbButtonLabel) + input( + type='radio', + ngbButton, + [value]='"underline"' + ) + | ▁ + +.form-line + .header + .title Blink cursor + + toggle( + [(ngModel)]='config.store.terminal.cursorBlink', + (ngModelChange)='config.save()', + ) + h3.mt-3.mb-3 Shell -.d-flex - .form-group.mr-3 - label Shell - select.form-control( - [(ngModel)]='config.store.terminal.shell', - (ngModelChange)='config.save()', - ) - option( - *ngFor='let shell of shells', - [ngValue]='shell.id' - ) {{shell.name}} +.form-line + .header + .title Shell + .description Default shell for new tabs + + select.form-control( + [(ngModel)]='config.store.terminal.shell', + (ngModelChange)='config.save()', + ) + option( + *ngFor='let shell of shells', + [ngValue]='shell.id' + ) {{shell.name}} + +.form-line(*ngIf='config.store.terminal.shell == "custom"') + .header + .title Custom shell - .form-group.mr-3(*ngIf='persistenceProviders.length > 0') - label Session persistence - select.form-control( - [(ngModel)]='config.store.terminal.persistence', - (ngModelChange)='config.save()', - ) - option([ngValue]='null') Off - option( - *ngFor='let provider of persistenceProviders', - [ngValue]='provider.id' - ) {{provider.displayName}} - - .form-group - label Working directory - input.form-control( - type='text', - placeholder='Home directory', - [(ngModel)]='config.store.terminal.workingDirectory', - (ngModelChange)='config.save()', - ) - -.form-group(*ngIf='config.store.terminal.shell == "custom"') - label Custom shell input.form-control( type='text', [(ngModel)]='config.store.terminal.customShell', (ngModelChange)='config.save()', ) - + +.form-line(*ngIf='persistenceProviders.length > 0') + .header + .title Session persistence + .description Restores tabs when Terminus is restarted + select.form-control( + [(ngModel)]='config.store.terminal.persistence', + (ngModelChange)='config.save()', + ) + option([ngValue]='null') Off + option( + *ngFor='let provider of persistenceProviders', + [ngValue]='provider.id' + ) {{provider.displayName}} + +.form-line + .header + .title Working directory + input.form-control( + type='text', + placeholder='Home directory', + [(ngModel)]='config.store.terminal.workingDirectory', + (ngModelChange)='config.save()', + ) h3.mt-3.mb-3 Behaviour -.form-group - label Terminal bell - br +.form-line + .header + .title Terminal bell .btn-group( [(ngModel)]='config.store.terminal.bell', (ngModelChange)='config.save()', @@ -315,10 +311,10 @@ h3.mt-3.mb-3 Behaviour [value]='"audible"' ) | Audible - -.form-group - label Right click - br + +.form-line + .header + .title Right click .btn-group( [(ngModel)]='config.store.terminal.rightClick', (ngModelChange)='config.save()', @@ -339,28 +335,37 @@ h3.mt-3.mb-3 Behaviour ) | Paste +.form-line + .header + .title Auto-open a terminal on app start -.form-group - checkbox( + toggle( [(ngModel)]='config.store.terminal.autoOpen', (ngModelChange)='config.save()', - text='Auto-open a terminal on app start', ) - - checkbox( + +.form-line + .header + .title Bracketed paste (requires shell support) + .description Prevents accidental execution of pasted commands + toggle( [(ngModel)]='config.store.terminal.bracketedPaste', (ngModelChange)='config.save()', - text='Bracketed paste (requires shell support)', ) - - checkbox( + +.form-line + .header + .title Copy on select + toggle( [(ngModel)]='config.store.terminal.copyOnSelect', (ngModelChange)='config.save()', - text='Copy on select', ) - checkbox( +.form-line + .header + .title Use Alt key as the Meta key + .description Lets the shell handle Meta key instead of OS + toggle( [(ngModel)]='config.store.terminal.altIsMeta', (ngModelChange)='config.save()', - text='Use Alt key as the Meta key', )