Browse Source

Styles improved

pull/1/head
Sebastian 9 years ago
parent
commit
31d79b4394
  1. 24
      src/Squidex/app/features/content/pages/content/content-page.component.html
  2. 5
      src/Squidex/app/features/content/pages/content/content-page.component.scss
  3. 6
      src/Squidex/app/features/content/pages/contents/content-item.component.html
  4. 35
      src/Squidex/app/features/content/pages/contents/content-item.component.scss
  5. 26
      src/Squidex/app/features/content/pages/contents/contents-page.component.html
  6. 13
      src/Squidex/app/features/content/pages/contents/contents-page.component.scss
  7. 31
      src/Squidex/app/features/content/pages/schemas/schemas-page.component.html
  8. 72
      src/Squidex/app/features/content/pages/schemas/schemas-page.component.scss
  9. 61
      src/Squidex/app/features/content/pages/schemas/schemas-page.component.ts
  10. 7
      src/Squidex/app/features/dashboard/pages/dashboard-page.component.scss
  11. 2
      src/Squidex/app/features/schemas/pages/schema/field.component.html
  12. 51
      src/Squidex/app/features/schemas/pages/schema/field.component.scss
  13. 24
      src/Squidex/app/features/schemas/pages/schema/schema-page.component.html
  14. 2
      src/Squidex/app/features/schemas/pages/schema/types/boolean-validation.component.html
  15. 2
      src/Squidex/app/features/schemas/pages/schema/types/number-ui.component.html
  16. 2
      src/Squidex/app/features/schemas/pages/schema/types/number-validation.component.html
  17. 2
      src/Squidex/app/features/schemas/pages/schema/types/string-ui.component.html
  18. 4
      src/Squidex/app/features/schemas/pages/schema/types/string-validation.component.html
  19. 32
      src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.html
  20. 101
      src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.scss
  21. 106
      src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.ts
  22. 2
      src/Squidex/app/features/settings/pages/clients/client.component.html
  23. 1
      src/Squidex/app/features/settings/pages/clients/client.component.scss
  24. 11
      src/Squidex/app/features/settings/pages/clients/client.component.ts
  25. 24
      src/Squidex/app/features/settings/pages/clients/clients-page.component.html
  26. 25
      src/Squidex/app/features/settings/pages/clients/clients-page.component.scss
  27. 7
      src/Squidex/app/features/settings/pages/clients/clients-page.component.ts
  28. 28
      src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html
  29. 12
      src/Squidex/app/features/settings/pages/contributors/contributors-page.component.scss
  30. 8
      src/Squidex/app/features/settings/pages/contributors/contributors-page.component.ts
  31. 24
      src/Squidex/app/features/settings/pages/languages/languages-page.component.html
  32. 2
      src/Squidex/app/features/settings/pages/languages/languages-page.component.scss
  33. 3
      src/Squidex/app/features/settings/pages/languages/languages-page.component.ts
  34. 17
      src/Squidex/app/features/settings/settings-area.component.html
  35. 14
      src/Squidex/app/features/settings/settings-area.component.scss
  36. 26
      src/Squidex/app/framework/angular/animations.ts
  37. 49
      src/Squidex/app/framework/angular/panel.component.ts
  38. 30
      src/Squidex/app/framework/angular/panel.directive.ts
  39. 2
      src/Squidex/app/framework/declarations.ts
  40. 6
      src/Squidex/app/framework/module.ts
  41. 3
      src/Squidex/app/framework/services/panel.service.ts
  42. 2
      src/Squidex/app/shared/components/app-form.component.scss
  43. 16
      src/Squidex/app/shared/components/history.component.html
  44. 13
      src/Squidex/app/shared/components/history.component.scss
  45. 3
      src/Squidex/app/shared/services/app-clients.service.ts
  46. 2
      src/Squidex/app/shell/pages/app/app-area.component.scss
  47. 10
      src/Squidex/app/shell/pages/app/left-menu.component.html
  48. 39
      src/Squidex/app/shell/pages/app/left-menu.component.scss
  49. 2
      src/Squidex/app/shell/pages/home/home-page.component.html
  50. 10
      src/Squidex/app/shell/pages/home/home-page.component.scss
  51. 2
      src/Squidex/app/shell/pages/internal/apps-menu.component.html
  52. 74
      src/Squidex/app/shell/pages/internal/apps-menu.component.scss
  53. 6
      src/Squidex/app/shell/pages/internal/internal-area.component.scss
  54. 2
      src/Squidex/app/shell/pages/internal/profile-menu.component.html
  55. 48
      src/Squidex/app/shell/pages/internal/profile-menu.component.scss
  56. 2
      src/Squidex/app/shell/pages/not-found/not-found-page.component.html
  57. 14
      src/Squidex/app/shell/pages/not-found/not-found-page.component.scss
  58. 8
      src/Squidex/app/theme/_bootstrap-vars.scss
  59. 410
      src/Squidex/app/theme/_bootstrap.scss
  60. 74
      src/Squidex/app/theme/_common.scss
  61. 115
      src/Squidex/app/theme/_forms.scss
  62. 10
      src/Squidex/app/theme/_history.scss
  63. 20
      src/Squidex/app/theme/_layout.scss
  64. 84
      src/Squidex/app/theme/_lists.scss
  65. 2
      src/Squidex/app/theme/_mixins.scss
  66. 196
      src/Squidex/app/theme/_panels.scss
  67. 45
      src/Squidex/app/theme/_vars.scss
  68. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.eot
  69. 3
      src/Squidex/app/theme/icomoon/fonts/icomoon.svg
  70. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.ttf
  71. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.woff
  72. 170
      src/Squidex/app/theme/icomoon/selection.json
  73. 13
      src/Squidex/app/theme/icomoon/style.css
  74. 8
      src/Squidex/app/theme/theme.scss
  75. 5
      src/Squidex/app/theme/vendor.scss

24
src/Squidex/app/features/content/pages/content/content-page.component.html

@ -1,9 +1,9 @@
<sqx-title message="{app} | Content" parameter1="app" value1="{{appName() | async}}"></sqx-title>
<form [formGroup]="contentForm" (ngSubmit)="saveContent()">
<div class="panel panel-light" >
<sqx-panel panelWidth="36rem">
<div class="panel-header">
<div class="panel-header-title-row">
<div class="panel-title-row">
<div class="float-xs-right">
<button type="submit" class="btn btn-primary">
Save
@ -12,11 +12,11 @@
<h3 class="panel-title" *ngIf="isNewMode">New {{schema|displayName}}</h3>
<h3 class="panel-title" *ngIf="!isNewMode">Edit {{schema|displayName}}</h3>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<div class="panel-main">
@ -26,16 +26,12 @@
</div>
</div>
<div class="panel-sidebar" *ngIf="!isNewMode">
<div class="nav nav-pills nav-stacked nav-light">
<li class="nav-item">
<a class="nav-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</li>
</div>
<a class="panel-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</div>
</div>
</div>
</sqx-panel>
</form>
<router-outlet></router-outlet>

5
src/Squidex/app/features/content/pages/content/content-page.component.scss

@ -1,7 +1,2 @@
@import '_vars';
@import '_mixins';
.panel {
min-width: 36rem;
max-width: 36rem;
}

6
src/Squidex/app/features/content/pages/contents/content-item.component.html

@ -4,14 +4,14 @@
</span>
</td>
<td>
<span class="content-published" [class.unpublished]="!content.isPublished"></span>
<span class="content-modified">{{content.lastModified | fromNow}}</span>
<span class="item-published" [class.unpublished]="!content.isPublished"></span>
<span class="item-modified">{{content.lastModified | fromNow}}</span>
</td>
<td>
<img class="user-picture" [attr.title]="userName(content.lastModifiedBy) | async" [attr.src]="userPicture(content.lastModifiedBy, true) | async" />
</td>
<td>
<div class="dropdown" *ngIf="content">
<div class="tooltip-dropdown" *ngIf="content">
<button type="button" class="btn btn-simple" (click)="dropdown.toggle(); $event.stopPropagation()" [class.active]="dropdown.isOpen | async">
<i class="icon-dots"></i>
</button>

35
src/Squidex/app/features/content/pages/contents/content-item.component.scss

@ -5,41 +5,6 @@
@include truncate;
}
.dropdown {
& {
display: inline-block;
}
&-menu {
@include absolute(100%, 0, auto, auto);
}
&-item {
cursor: pointer;
}
}
.btn-simple {
& {
color: $color-border-dark;
}
&:hover,
&.active {
color: $color-text;
}
}
.user-picture {
& {
@include circle(2.2rem);
}
&:not([src]) {
@include opacity(0);
}
}
.content {
& {
cursor: pointer;

26
src/Squidex/app/features/content/pages/contents/contents-page.component.html

@ -1,8 +1,8 @@
<sqx-title message="{app} | Contents" parameter1="app" value1="{{appName() | async}}"></sqx-title>
<div class="panel panel-light">
<sqx-panel panelWidth="61rem">
<div class="panel-header">
<div class="panel-header-title-row">
<div class="panel-title-row">
<div class="float-xs-right">
<div class="btn-group languages-buttons" role="group">
<button type="button" class="btn btn-secondary" *ngFor="let language of languages" [attr.title]="language.englishName" [class.active]="language == languageSelected" (click)="selectLanguage(language)">
@ -16,15 +16,15 @@
</div>
<h3 class="panel-title">{{schema|displayName}} Contents</h3>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<div class="panel-main">
<div class="panel-content">
<div class="panel-content panel-content-scroll">
<table class="table table-items table-fixed" *ngIf="contentItems">
<colgroup>
<col *ngFor="let field of contentFields" [style.width]="columnWidth + '%'" />
@ -66,15 +66,11 @@
</table>
</div>
<div class="panel-sidebar">
<div class="nav nav-pills nav-stacked nav-light">
<li class="nav-item">
<a class="nav-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</li>
</div>
<a class="panel-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</div>
</div>
</div>
</sqx-panel>
<router-outlet></router-outlet>

13
src/Squidex/app/features/content/pages/contents/contents-page.component.scss

@ -1,23 +1,10 @@
@import '_vars';
@import '_mixins';
.panel {
min-width: 64rem;
max-width: 64rem;
}
.panel-content {
overflow-y: scroll;
}
.languages-buttons {
margin-right: 1rem;
}
.field {
@include truncate;
}
.content {
cursor: pointer;
}

31
src/Squidex/app/features/content/pages/schemas/schemas-page.component.html

@ -1,16 +1,16 @@
<sqx-title message="{app} | Schemas" parameter1="app" value1="{{appName() | async}}"></sqx-title>
<div class="panel panel-dark">
<sqx-panel theme="dark" panelWidth="16rem">
<div class="panel-header">
<div class="panel-header-title-row">
<div class="panel-title-row">
<h3 class="panel-title">Schemas</h3>
<a class="panel-close" dashboardLink>
<i class="icon-close"></i>
</a>
</div>
<div class="panel-header-row">
<a class="panel-close" dashboardLink>
<i class="icon-close"></i>
</a>
<div class="panel-row">
<div class="search-form">
<input class="form-control form-control-dark" [formControl]="schemasFilter" placeholder="Search for schemas..." />
@ -21,15 +21,16 @@
<div class="panel-main">
<div class="panel-content">
<div class="schemas">
<div class="schema" *ngFor="let schema of schemasFiltered | async" [routerLink]="[schema.name]" routerLinkActive="active">
<div class="schema-inner">
<span class="schema-name">{{schema|displayName}}</span>
</div>
</div>
</div>
<ul class="nav nav-pills nav-stacked nav-dark nav-dark-bordered">
<li class="nav-item" *ngFor="let schema of schemasFiltered | async">
<a class="nav-link" [routerLink]="[schema.name]" routerLinkActive="active">
{{schema|displayName}}
<i class="icon-angle-right"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
</sqx-panel>
<router-outlet></router-outlet>

72
src/Squidex/app/features/content/pages/schemas/schemas-page.component.scss

@ -1,72 +1,12 @@
@import '_vars';
@import '_mixins';
.panel {
min-width: 20rem;
max-width: 20rem;
.nav-link {
position: relative;
padding-top: .6rem;
padding-bottom: .6rem;
}
.search-form {
& {
@include flex-grow(1);
position: relative;
}
.form-control {
padding-left: 3rem;
}
.icon-search {
@include absolute(.625rem, auto, auto, 1rem);
color: $color-dark-foreground-selected;
font-size: 1.3rem;
font-weight: lighter;
}
}
.schemas {
margin-left: -$panel-padding;
margin-right: -$panel-padding;
}
.schema {
& {
padding-left: $panel-padding;
padding-right: $panel-padding;
cursor: pointer;
}
&:hover,
&.active {
& {
background: $color-dark-background-selected;
}
& + .schema > .schema-inner {
border-color: transparent;
}
.schema-inner {
border-color: transparent;
}
}
&-inner {
padding-top: 1rem;
padding-bottom: 1rem;
border-top: 1px solid darken($color-dark-foreground, 10%);
}
&-name {
@include truncate;
color: $color-dark-foreground-selected;
font-size: 1rem;
font-weight: normal;
}
&:first-child {
.schema-inner {
border: 0;
}
}
.icon-angle-right {
@include absolute(14px, 2rem, auto, auto);
}

61
src/Squidex/app/features/content/pages/schemas/schemas-page.component.ts

@ -7,12 +7,12 @@
import { Component, OnInit } from '@angular/core';
import { FormControl } from '@angular/forms';
import { BehaviorSubject, Observable } from 'rxjs';
import { ActivatedRoute, Router } from '@angular/router';
import { Observable } from 'rxjs';
import {
AppComponentBase,
AppsStoreService,
ImmutableArray,
NotificationService,
SchemaDto,
SchemasService,
@ -25,51 +25,54 @@ import {
templateUrl: './schemas-page.component.html'
})
export class SchemasPageComponent extends AppComponentBase implements OnInit {
public schemas = new BehaviorSubject(ImmutableArray.empty<SchemaDto>());
public schemasFilter = new FormControl();
public schemasFiltered =
Observable.of(null)
.merge(this.schemasFilter.valueChanges.debounceTime(100))
.combineLatest(this.schemas,
this.route.queryParams.map(q => q['schemaQuery'])
.combineLatest(this.loadSchemas(),
(query, schemas) => {
this.schemasFilter.setValue(query);
schemas = schemas.filter(t => t.isPublished);
if (query && query.length > 0) {
schemas = schemas.filter(t => t.name.indexOf(query) >= 0);
}
schemas = schemas.filter(t => t.isPublished);
schemas =
schemas.sort((a, b) => {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
if (query && query.length > 0) {
schemas = schemas.filter(t => t.name.indexOf(query) >= 0);
}
return schemas;
return schemas;
}).map(schemas => {
return schemas.sort((a, b) => {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
});
public schemasFilter = new FormControl();
constructor(apps: AppsStoreService, notifications: NotificationService, users: UsersProviderService,
private readonly route: ActivatedRoute,
private readonly router: Router,
private readonly schemasService: SchemasService
) {
super(apps, notifications, users);
}
public ngOnInit() {
this.load();
this.schemasFilter.valueChanges.distinctUntilChanged().debounceTime(100)
.subscribe(f => {
this.router.navigate([], { queryParams: { schemaQuery: f }});
});
}
public load() {
this.appName()
private loadSchemas(): Observable<SchemaDto[]> {
return this.appName()
.switchMap(app => this.schemasService.getSchemas(app).retry(2))
.subscribe(dtos => {
this.schemas.next(ImmutableArray.of(dtos));
}, error => {
.catch(error => {
this.notifyError(error);
return [];
});
}
}

7
src/Squidex/app/features/dashboard/pages/dashboard-page.component.scss

@ -1,7 +0,0 @@
@import '_vars';
@import '_mixins';
.panel {
min-width: 36rem;
max-width: 36rem;
}

2
src/Squidex/app/features/schemas/pages/schema/field.component.html

@ -21,7 +21,7 @@
<i class="icon-settings"></i>
</button>
<div class="dropdown">
<div class="tooltip-dropdown">
<button type="button" class="btn btn-simple" (click)="dropdown.toggle()" [class.active]="dropdown.isOpen | async">
<i class="icon-dots"></i>
</button>

51
src/Squidex/app/features/schemas/pages/schema/field.component.scss

@ -7,31 +7,6 @@ $field-header: #e7ebef;
padding: 0;
}
.dropdown {
& {
display: inline-block;
}
&-menu {
@include absolute(100%, 0, auto, auto);
}
&-item {
cursor: pointer;
}
}
.btn-simple {
& {
color: $color-border-dark;
}
&:hover,
&.active {
color: $color-text;
}
}
.field {
&-summary {
padding: 1rem 1.25rem;
@ -106,29 +81,3 @@ $field-header: #e7ebef;
max-width: 6rem;
}
}
.nav-field-tabs {
& {
@include absolute(auto, auto, 0, 1.25rem);
}
& .nav-link {
& {
color: $color-text;
cursor: pointer;
padding: 1rem .625rem;
border-bottom: .25rem solid transparent;
width: 6.25rem;
text-align: center;
}
&.active {
font-weight: bold;
}
&.active,
&:hover {
border-color: $color-theme-blue;
}
}
}

24
src/Squidex/app/features/schemas/pages/schema/schema-page.component.html

@ -1,8 +1,8 @@
<sqx-title message="{app} | {schema}" parameter1="app" value1="{{appName() | async}}" parameter2="schema" value2="{{schemaName}}"></sqx-title>
<div class="panel panel-light">
<sqx-panel panelWidth="48rem">
<div class="panel-header">
<div class="panel-header-title-row">
<div class="panel-title-row">
<div class="float-xs-right">
<div class="btn-group btn-group-sm" data-toggle="buttons">
<button type="button" class="btn btn-publishing btn-secondary" [class.btn-success]="isPublished" [disabled]="isPublished" (click)="publish()">
@ -17,11 +17,11 @@
<h3 class="panel-title">
{{schemaProperties|displayName}} <i class="schema-edit icon-pencil" (click)="editSchemaDialog.show()"></i>
</h3>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<div class="panel-main">
@ -56,16 +56,12 @@
</div>
</div>
<div class="panel-sidebar">
<div class="nav nav-pills nav-stacked nav-light">
<li class="nav-item">
<a class="nav-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</li>
</div>
<a class="panel-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</div>
</div>
</div>
</sqx-panel>
<div class="modal" *sqxModalView="editSchemaDialog" [@fade]>
<div class="modal-backdrop"></div>

2
src/Squidex/app/features/schemas/pages/schema/types/boolean-validation.component.html

@ -7,7 +7,7 @@
</div>
</div>
<div class="form-group row" [class.hide]="(hideDefaultValue | async)">
<div class="form-group row" [class.hidden]="(hideDefaultValue | async)">
<label class="col-xs-3 col-form-label" for="field-default-value">Default Value</label>
<div class="col-xs-6">

2
src/Squidex/app/features/schemas/pages/schema/types/number-ui.component.html

@ -39,7 +39,7 @@
</label>
</div>
</div>
<div class="form-group row" [class.hide]="hideAllowedValues | async">
<div class="form-group row" [class.hidden]="hideAllowedValues | async">
<label for="field-allowed-values" class="col-xs-3 col-form-label">Allowed Values</label>
<div class="col-xs-6">

2
src/Squidex/app/features/schemas/pages/schema/types/number-validation.component.html

@ -20,7 +20,7 @@
</div>
</div>
<div class="form-group row" [class.hide]="(hideDefaultValue | async)">
<div class="form-group row" [class.hidden]="(hideDefaultValue | async)">
<label class="col-xs-3 col-form-label" for="field-default-value">Default Value</label>
<div class="col-xs-6">

2
src/Squidex/app/features/schemas/pages/schema/types/string-ui.component.html

@ -46,7 +46,7 @@
</label>
</div>
</div>
<div class="form-group row" [class.hide]="hideAllowedValues | async">
<div class="form-group row" [class.hidden]="hideAllowedValues | async">
<label for="field-allowed-values" class="col-xs-3 col-form-label">Allowed Values</label>
<div class="col-xs-6">

4
src/Squidex/app/features/schemas/pages/schema/types/string-validation.component.html

@ -27,7 +27,7 @@
<input type="text" class="form-control" id="field-pattern" formControlName="pattern" placeholder="Regex Pattern" />
</div>
</div>
<div class="form-group row" [class.hide]="hidePatternMessage | async">
<div class="form-group row" [class.hidden]="hidePatternMessage | async">
<label class="col-xs-3 col-form-label" for="field-pattern-message">Pattern Message</label>
<div class="col-xs-6">
@ -35,7 +35,7 @@
</div>
</div>
<div class="form-group row" [class.hide]="(hideDefaultValue | async)">
<div class="form-group row" [class.hidden]="(hideDefaultValue | async)">
<label class="col-xs-3 col-form-label" for="field-default-value">Default Value</label>
<div class="col-xs-6">

32
src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.html

@ -1,15 +1,15 @@
<sqx-title message="{app} | Schemas" parameter1="app" value1="{{appName() | async}}"></sqx-title>
<div class="panel panel-dark">
<sqx-panel theme="dark" panelWidth="30rem">
<div class="panel-header">
<div class="panel-header-title-row">
<div class="panel-title-row">
<h3 class="panel-title">Schemas</h3>
<a class="panel-close" dashboardLink>
<i class="icon-close"></i>
</a>
</div>
<a class="panel-close" dashboardLink>
<i class="icon-close"></i>
</a>
<div class="panel-header-row">
<button class="btn btn-success subheader-button" (click)="addSchemaDialog.show()">
<i class="icon-plus"></i>
@ -25,9 +25,9 @@
<div class="panel-main">
<div class="panel-content">
<div class="schemas">
<div class="schema" *ngFor="let schema of schemasFiltered | async" [routerLink]="[schema.name]" routerLinkActive="active">
<div class="schema-inner">
<ul class="nav nav-pills nav-stacked nav-dark nav-dark-bordered">
<li class="nav-item" *ngFor="let schema of schemasFiltered">
<a class="nav-link" [routerLink]="[schema.name]" routerLinkActive="active">
<div class="row">
<div class="col-xs-4">
<span class="schema-name">{{schema|displayName}}</span>
@ -37,17 +37,17 @@
<i class="icon-person"></i> {{userName(schema.lastModifiedBy, true) | async}}
</span>
</div>
<div class="col-xs-4 schema-col-right">
<span class="schema-published" [class.unpublished]="!schema.isPublished"></span>
<span class="schema-modified">{{schema.lastModified | fromNow}}</span>
<div class="col-xs-4 schema-modified">
<span class="item-modified">{{schema.lastModified | fromNow}}</span>
<span class="item-published" [class.unpublished]="!schema.isPublished"></span>
</div>
</div>
</div>
</div>
</div>
</a>
</li>
</ul>
</div>
</div>
</div>
</sqx-panel>
<div class="modal" *sqxModalView="addSchemaDialog" [@fade]>
<div class="modal-backdrop"></div>

101
src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.scss

@ -1,12 +1,7 @@
@import '_vars';
@import '_mixins';
@import '_vars';
$button-size: 2.5rem;
.panel {
min-width: 30rem;
max-width: 30rem;
}
$button-size: calc(2.5rem - 2px);
.subheader-button {
height: $button-size;
@ -18,108 +13,26 @@ $button-size: 2.5rem;
font-size: 1.1rem;
}
.search-form {
& {
@include flex-grow(1);
position: relative;
}
.form-control {
padding-left: $button-size + 1rem;
height: $button-size;
}
.icon-search {
@include absolute(50%, auto, auto, .8rem);
color: $color-dark-foreground-selected;
font-size: 1.3rem;
font-weight: lighter;
margin-top: -.6rem;
}
}
.schemas {
margin-left: -$panel-padding;
margin-right: -$panel-padding;
}
.schema {
& {
padding-left: $panel-padding;
padding-right: $panel-padding;
cursor: pointer;
}
&:hover,
&.active {
& {
background: $color-dark-background-selected;
}
& + .schema > .schema-inner {
border-color: transparent;
}
.schema-inner {
border-color: transparent;
}
}
&-inner {
padding-top: 1rem;
padding-bottom: 1rem;
border-top: 1px solid darken($color-dark-foreground, 10%);
}
&-col-left {
@include truncate;
}
&-col-right {
text-align: right;
}
&-modified {
font-size: .8rem;
}
&-name {
@include truncate;
color: $color-dark-foreground-selected;
font-size: 1rem;
font-weight: normal;
}
&-published {
& {
@include circle(.5rem);
display: inline-block;
border: 0;
background: $color-theme-green;
margin-left: .4rem;
}
&.unpublished {
background: $color-theme-error;
}
&-modified {
text-align: right;
}
&-user {
@include border-radius(1px);
@include truncate;
display: inline-block;
background: $color-dark-background-accent;
background: $color-dark2-control;
padding: .1rem .3rem;
font-size: .8rem;
font-weight: normal;
margin-left: 10px;
margin-bottom: 2px;
max-width: 100%;
vertical-align: baseline;
}
&:first-child {
.schema-inner {
border: 0;
}
vertical-align: middle;
}
}

106
src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.ts

@ -7,7 +7,8 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import { FormControl } from '@angular/forms';
import { BehaviorSubject, Observable, Subscription } from 'rxjs';
import { ActivatedRoute, Router } from '@angular/router';
import { Subscription } from 'rxjs';
import {
AppComponentBase,
@ -39,33 +40,14 @@ export class SchemasPageComponent extends AppComponentBase implements OnDestroy,
public addSchemaDialog = new ModalView();
public schemas = new BehaviorSubject(ImmutableArray.empty<SchemaDto>());
public schemas = ImmutableArray.empty<SchemaDto>();
public schemaQuery: string;
public schemasFilter = new FormControl();
public schemasFiltered =
Observable.of(null)
.merge(this.schemasFilter.valueChanges.debounceTime(100))
.combineLatest(this.schemas,
(query, schemas) => {
if (query && query.length > 0) {
schemas = schemas.filter(t => t.name.indexOf(query) >= 0);
}
schemas =
schemas.sort((a, b) => {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
return schemas;
});
public schemasFiltered = ImmutableArray.empty<SchemaDto>();
constructor(apps: AppsStoreService, notifications: NotificationService, users: UsersProviderService,
private readonly route: ActivatedRoute,
private readonly router: Router,
private readonly schemasService: SchemasService,
private readonly messageBus: MessageBus,
private readonly authService: AuthService
@ -78,43 +60,75 @@ export class SchemasPageComponent extends AppComponentBase implements OnDestroy,
}
public ngOnInit() {
this.load();
this.schemasFilter.valueChanges.distinctUntilChanged().debounceTime(100)
.subscribe(q => {
this.router.navigate([], { queryParams: { schemaQuery: q }});
});
this.messageSubscription =
this.messageBus.of(SchemaUpdated).subscribe(message => {
const schemas = this.schemas.value;
const oldSchema = schemas.find(i => i.name === message.name);
if (oldSchema) {
const me = `subject:${this.authService.user!.id}`;
const newSchema =
new SchemaDto(
oldSchema.id,
oldSchema.name,
message.label,
message.isPublished,
oldSchema.createdBy, me,
oldSchema.created, DateTime.now());
this.schemas.next(schemas.replace(oldSchema, newSchema));
}
this.route.queryParams.map(q => q['schemaQuery']).distinctUntilChanged()
.subscribe(q => {
this.updateSchemas(this.schemas, this.schemaQuery = q);
});
this.messageSubscription =
this.messageBus.of(SchemaUpdated)
.subscribe(m => {
this.updateSchemas(this.schemas.map(s => s.name === m.name ? updateSchema(s, this.authService, m) : s));
});
this.load();
}
public load() {
this.appName()
.switchMap(app => this.schemasService.getSchemas(app).retry(2))
.subscribe(dtos => {
this.schemas.next(ImmutableArray.of(dtos));
this.updateSchemas(ImmutableArray.of(dtos));
}, error => {
this.notifyError(error);
});
}
public onSchemaCreated(dto: SchemaDto) {
this.schemas.next(this.schemas.getValue().push(dto));
this.updateSchemas(this.schemas.push(dto), this.schemaQuery);
this.addSchemaDialog.hide();
}
private updateSchemas(schemas: ImmutableArray<SchemaDto>, query?: string) {
this.schemas = schemas;
query = query || this.schemaQuery;
if (query && query.length > 0) {
schemas = schemas.filter(t => t.name.indexOf(query) >= 0);
}
schemas =
schemas.sort((a, b) => {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
this.schemasFiltered = schemas;
}
}
function updateSchema(schema: SchemaDto, authService: AuthService, message: SchemaUpdated): SchemaDto {
const me = `subject:${authService.user!.id}`;
return new SchemaDto(
schema.id,
schema.name,
message.label,
message.isPublished,
schema.createdBy, me,
schema.created, DateTime.now());
}

2
src/Squidex/app/features/settings/pages/clients/client.component.html

@ -82,7 +82,7 @@
</div>
<div class="modal-body">
<textarea class="form-control access-token">{{appClientToken.tokenType}} {{appClientToken.accessToken}}</textarea>
<textarea class="form-control access-token">{{token.tokenType}} {{token.accessToken}}</textarea>
</div>
</div>
</div>

1
src/Squidex/app/features/settings/pages/clients/client.component.scss

@ -66,6 +66,5 @@ $color-editor: #eceeef;
}
.access-token {
resize: none;
height: 18rem;
}

11
src/Squidex/app/features/settings/pages/clients/client.component.ts

@ -14,7 +14,6 @@ import {
AppClientsService,
fadeAnimation,
ModalView,
Notification,
NotificationService
} from 'shared';
@ -31,7 +30,7 @@ const ESCAPE_KEY = 27;
export class ClientComponent {
public isRenaming = false;
public appClientToken: AccessTokenDto;
public token: AccessTokenDto;
@Output()
public renamed = new EventEmitter<string>();
@ -107,11 +106,11 @@ export class ClientComponent {
public createToken(client: AppClientDto) {
this.appClientsService.createToken(this.appName, client)
.subscribe(token => {
this.appClientToken = token;
.subscribe(dto => {
this.token = dto;
this.tokenDialog.show();
}, _ => {
this.notifications.notify(Notification.error('Failed to retrieve access token. Please retry.'));
}, error => {
this.notifications.notify(error);
});
}
}

24
src/Squidex/app/features/settings/pages/clients/clients-page.component.html

@ -1,14 +1,14 @@
<sqx-title message="{app} | Clients | Settings" parameter1="app" value1="{{appName() | async}}"></sqx-title>
<div class="panel panel-light">
<sqx-panel panelWidth="44rem">
<div class="panel-header">
<div class="panel-header-title-row">
<div class="panel-title-row">
<h3 class="panel-title">Clients</h3>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<div class="panel-main">
@ -35,15 +35,11 @@
</div>
</div>
<div class="panel-sidebar">
<div class="nav nav-pills nav-stacked nav-light">
<li class="nav-item">
<a class="nav-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</li>
</div>
<a class="panel-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</div>
</div>
</div>
</sqx-panel>
<router-outlet></router-outlet>

25
src/Squidex/app/features/settings/pages/clients/clients-page.component.scss

@ -1,27 +1,2 @@
@import '_vars';
@import '_mixins';
.panel {
min-width: 44rem;
max-width: 44rem;
}
.card {
& {
max-width: 44rem;
}
&-block {
padding-left: .5rem;
padding-right: .5rem;
}
}
.clients {
&-empty {
color: $color-empty;
font-size: 1.2rem;
font-weight: lighter;
padding: .2rem 1rem;
}
}

7
src/Squidex/app/features/settings/pages/clients/clients-page.component.ts

@ -23,10 +23,6 @@ import {
ValidatorsEx
} from 'shared';
function rename(client: AppClientDto, name: string): AppClientDto {
return new AppClientDto(client.id, client.secret, name, client.expiresUtc);
};
@Component({
selector: 'sqx-clients-page',
styleUrls: ['./clients-page.component.scss'],
@ -125,3 +121,6 @@ export class ClientsPageComponent extends AppComponentBase implements OnInit {
}
}
function rename(client: AppClientDto, name: string): AppClientDto {
return new AppClientDto(client.id, client.secret, name, client.expiresUtc);
};

28
src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html

@ -1,14 +1,14 @@
<sqx-title message="{app} | Contributors | Settings" parameter1="app" value1="{{appName() | async}}"></sqx-title>
<div class="panel panel-light">
<sqx-panel panelWidth="42rem">
<div class="panel-header">
<div class="panel-header-title-row">
<div class="panel-title-row">
<h3 class="panel-title">Contributors</h3>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<div class="panel-main">
@ -18,8 +18,8 @@
<col style="width: 70px" />
<col style="width: 50%" />
<col style="width: 50%" />
<col style="width: 150px" />
<col style="width: 80px" />
<col style="width: 160px" />
<col style="width: 60px" />
</colgroup>
<thead>
@ -78,15 +78,11 @@
</div>
</div>
<div class="panel-sidebar">
<div class="nav nav-pills nav-stacked nav-light">
<li class="nav-item">
<a class="nav-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</li>
</div>
<a class="panel-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</div>
</div>
</div>
</sqx-panel>
<router-outlet></router-outlet>

12
src/Squidex/app/features/settings/pages/contributors/contributors-page.component.scss

@ -1,7 +1,7 @@
@import '_vars';
@import '_mixins';
.panel {
sqx-panel {
min-width: 50rem;
max-width: 50rem;
}
@ -21,16 +21,6 @@
}
.user {
&-picture {
& {
@include circle(2.2rem);
}
&:not([src]) {
@include opacity(0);
}
}
&-name,
&-email {
@include truncate;

8
src/Squidex/app/features/settings/pages/contributors/contributors-page.component.ts

@ -52,10 +52,6 @@ export class UsersDataSource implements AutocompleteSource {
}
}
function changePermission(contributor: AppContributorDto, permission: string): AppContributorDto {
return new AppContributorDto(contributor.contributorId, permission);
}
@Component({
selector: 'sqx-contributors-page',
styleUrls: ['./contributors-page.component.scss'],
@ -151,3 +147,7 @@ export class ContributorsPageComponent extends AppComponentBase implements OnIni
}
}
function changePermission(contributor: AppContributorDto, permission: string): AppContributorDto {
return new AppContributorDto(contributor.contributorId, permission);
}

24
src/Squidex/app/features/settings/pages/languages/languages-page.component.html

@ -1,14 +1,14 @@
<sqx-title message="{app} | Languages | Settings" parameter1="app" value1="{{appName() | async}}"></sqx-title>
<div class="panel panel-light">
<sqx-panel panelWidth="42rem">
<div class="panel-header">
<div class="panel-header-title-row">
<div class="panel-title-row">
<h3 class="panel-title">Settings</h3>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<div class="panel-main">
@ -77,15 +77,11 @@
</div>
</div>
<div class="panel-sidebar">
<div class="nav nav-pills nav-stacked nav-light">
<li class="nav-item">
<a class="nav-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</li>
</div>
<a class="panel-link" routerLink="history" routerLinkActive="active">
<i class="icon-time"></i>
</a>
</div>
</div>
</div>
</sqx-panel>
<router-outlet></router-outlet>

2
src/Squidex/app/features/settings/pages/languages/languages-page.component.scss

@ -1,7 +1,7 @@
@import '_vars';
@import '_mixins';
.panel {
sqx-panel {
min-width: 42rem;
max-width: 42rem;
}

3
src/Squidex/app/features/settings/pages/languages/languages-page.component.ts

@ -94,8 +94,6 @@ export class LanguagesPageComponent extends AppComponentBase implements OnInit {
}, error => {
this.notifyError(error);
});
this.addLanguageForm.reset();
}
public setMasterLanguage(language: AppLanguageDto) {
@ -119,6 +117,7 @@ export class LanguagesPageComponent extends AppComponentBase implements OnInit {
}
private updateLanguages(languages: ImmutableArray<AppLanguageDto>) {
this.addLanguageForm.reset();
this.appLanguages = languages;
this.messageBus.publish(new HistoryChannelUpdated());

17
src/Squidex/app/features/settings/settings-area.component.html

@ -1,12 +1,12 @@
<div class="panel panel-dark">
<sqx-panel theme="dark" panelWidth="16rem">
<div class="panel-header">
<div class="panel-header-title-row">
<div class="panel-title-row">
<h3 class="panel-title">Settings</h3>
<a class="panel-close" dashboardLink>
<i class="icon-close"></i>
</a>
</div>
<a class="panel-close" dashboardLink>
<i class="icon-close"></i>
</a>
</div>
<div class="panel-main">
@ -15,21 +15,24 @@
<li class="nav-item">
<a class="nav-link" routerLink="clients" routerLinkActive="active">
Clients
<i class="icon-angle-right"></i>
</a>
</li>
<li class="nav-item">
<a class="nav-link" routerLink="contributors" routerLinkActive="active">
Contributors
<i class="icon-angle-right"></i>
</a>
</li>
<li class="nav-item">
<a class="nav-link" routerLink="languages" routerLinkActive="active">
Languages
<i class="icon-angle-right"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
</sqx-panel>
<router-outlet></router-outlet>

14
src/Squidex/app/features/settings/settings-area.component.scss

@ -2,6 +2,16 @@
@import '_mixins';
.panel {
min-width: 12rem;
max-width: 12rem;
min-width: 16rem;
max-width: 16rem;
}
.nav-link {
position: relative;
padding-top: .6rem;
padding-bottom: .6rem;
}
.icon-angle-right {
@include absolute(14px, 2rem, auto, auto);
}

26
src/Squidex/app/framework/angular/animations.ts

@ -14,6 +14,29 @@ import {
trigger
} from '@angular/core';
export function buildSlideRightAnimation(name = 'slideRight', timing = '150ms'): AnimationEntryMetadata {
return trigger(
name, [
transition(':enter', [
style({ transform: 'translateX(-100%)' }),
animate(timing, style({ transform: 'translateX(0%)' }))
]),
transition(':leave', [
style({transform: 'translateX(0%)' }),
animate(timing, style({ transform: 'translateX(-100%)' }))
]),
state('true',
style({ transform: 'translateX(0%)' })
),
state('false',
style({ transform: 'translateX(-100%)' })
),
transition('1 => 0', animate(timing)),
transition('0 => 1', animate(timing))
]
);
}
export function buildFadeAnimation(name = 'fade', timing = '150ms'): AnimationEntryMetadata {
return trigger(
name, [
@ -61,4 +84,5 @@ export function buildHeightAnimation(name = 'height', timing = '200ms'): Animati
};
export const fadeAnimation = buildFadeAnimation();
export const heightAnimation = buildHeightAnimation();
export const slideRightAnimation = buildSlideRightAnimation();

49
src/Squidex/app/framework/angular/panel.component.ts

@ -0,0 +1,49 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
import { AfterViewInit, Component, ElementRef, Input, OnDestroy, Renderer, ViewChild } from '@angular/core';
import { slideRightAnimation } from './animations';
import { PanelService } from './../services/panel.service';
@Component({
selector: 'sqx-panel',
template: `
<div [style.width]="panelWidth" #panel>
<div class="panel panel-{{theme}}" [@slideRight]>
<ng-content></ng-content>
</div>
</div>`,
animations: [
slideRightAnimation
]
})
export class PanelComponent implements OnDestroy, AfterViewInit {
@Input()
public theme: string = 'light';
@Input()
public panelWidth: string = '10rem';
@ViewChild('panel')
public panel: ElementRef;
constructor(
private readonly renderer: Renderer,
private readonly panels: PanelService
) {
}
public ngOnDestroy() {
this.panels.pop(this.panel.nativeElement, this.renderer);
}
public ngAfterViewInit() {
this.panels.push(this.panel.nativeElement, this.renderer);
}
}

30
src/Squidex/app/framework/angular/panel.directive.ts

@ -1,30 +0,0 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
import { Directive, ElementRef, OnDestroy, OnInit, Renderer } from '@angular/core';
import { PanelService } from './../services/panel.service';
@Directive({
selector: '.panel'
})
export class PanelDirective implements OnInit, OnDestroy {
constructor(
private readonly element: ElementRef,
private readonly renderer: Renderer,
private readonly panels: PanelService
) {
}
public ngOnDestroy() {
this.panels.pop(this.element.nativeElement, this.renderer);
}
public ngOnInit() {
this.panels.push(this.element.nativeElement, this.renderer);
}
}

2
src/Squidex/app/framework/declarations.ts

@ -18,7 +18,7 @@ export * from './angular/http-utils';
export * from './angular/modal-view.directive';
export * from './angular/money.pipe';
export * from './angular/name.pipe';
export * from './angular/panel.directive';
export * from './angular/panel.component';
export * from './angular/panel-container.directive';
export * from './angular/scroll-active.directive';
export * from './angular/shortcut.component';

6
src/Squidex/app/framework/module.ts

@ -31,7 +31,7 @@ import {
MonthPipe,
NotificationService,
PanelContainerDirective,
PanelDirective,
PanelComponent,
PanelService,
ScrollActiveDirective,
ShortcutComponent,
@ -69,7 +69,7 @@ import {
MoneyPipe,
MonthPipe,
PanelContainerDirective,
PanelDirective,
PanelComponent,
ScrollActiveDirective,
ShortcutComponent,
ShortDatePipe,
@ -95,7 +95,7 @@ import {
MoneyPipe,
MonthPipe,
PanelContainerDirective,
PanelDirective,
PanelComponent,
ScrollActiveDirective,
ShortcutComponent,
ShortDatePipe,

3
src/Squidex/app/framework/services/panel.service.ts

@ -38,7 +38,10 @@ export class PanelService {
for (let element of this.elements) {
const width = element.getBoundingClientRect().width;
renderer.setElementStyle(element, 'top', '0px');
renderer.setElementStyle(element, 'left', currentPosition + 'px');
renderer.setElementStyle(element, 'bottom', '0px');
renderer.setElementStyle(element, 'position', 'absolute');
renderer.setElementStyle(element, 'z-index', currentLayer.toString());
currentPosition += width;

2
src/Squidex/app/shared/components/app-form.component.scss

@ -1,2 +0,0 @@
@import '_vars';
@import '_mixins';

16
src/Squidex/app/shared/components/history.component.html

@ -1,21 +1,21 @@
<sqx-title message="{app} | Contributors | Settings" parameter1="app" value1="{{appName() | async}}"></sqx-title>
<div class="panel panel-light">
<sqx-panel panelWidth="16rem">
<div class="panel-header">
<div class="panel-header-title-row">
<div class="panel-title-row">
<h3 class="panel-title">Activity</h3>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<a class="panel-close" routerLink="../">
<i class="icon-close"></i>
</a>
</div>
<div class="panel-main">
<div class="panel-content panel-content-blank">
<div *ngFor="let event of events | async" class="event">
<div class="event-left">
<img class="event-picture"[attr.title]="actorName(event.actor) | async" [attr.src]="actorProfile(event.actor) | async" />
<img class="user-picture"[attr.title]="actorName(event.actor) | async" [attr.src]="actorProfile(event.actor) | async" />
</div>
<div class="event-main">
<div class="event-message">
@ -26,4 +26,4 @@
</div>
</div>
</div>
</div>
</sqx-panel>

13
src/Squidex/app/shared/components/history.component.scss

@ -1,9 +1,12 @@
@import '_vars';
@import '_mixins';
.panel {
min-width: 16rem;
max-width: 16rem;
.user-ref {
color: $color-theme-blue-dark;
}
.marker-ref {
color: $color-theme-blue-dark;
}
.event {
@ -12,10 +15,6 @@
margin-bottom: .8rem;
}
&-picture {
@include circle(2.2rem);
}
&-message {
font-size: .9rem;
}

3
src/Squidex/app/shared/services/app-clients.service.ts

@ -117,6 +117,7 @@ export class AppClientsService {
return this.http.post(url, body, options)
.map(response => response.json())
.map(response => new AccessTokenDto(response.access_token, response.token_type));
.map(response => new AccessTokenDto(response.access_token, response.token_type))
.catchError('Failed to create token. Please retry.');
}
}

2
src/Squidex/app/shell/pages/app/app-area.component.scss

@ -1,2 +0,0 @@
@import '_vars';
@import '_mixins';

10
src/Squidex/app/shell/pages/app/left-menu.component.html

@ -1,18 +1,18 @@
<div class="sidebar panel-dark">
<ul class="nav nav-pills nav-stacked nav-dark">
<div class="sidebar">
<ul class="nav nav-stacked">
<li class="nav-item" *ngIf="permission !== 'Editor'">
<a class="nav-link" routerLink="schemas" routerLinkActive="active">
<i class="nav-icon icon-schemas"></i> <span class="nav-text">Schemas</span>
<i class="nav-icon icon-schemas"></i> <div class="nav-text">Schemas</div>
</a>
</li>
<li class="nav-item">
<a class="nav-link" routerLink="content" routerLinkActive="active">
<i class="nav-icon icon-content"></i> <span class="nav-text">Content</span>
<i class="nav-icon icon-content"></i> <div class="nav-text">Content</div>
</a>
</li>
<li class="nav-item" *ngIf="permission === 'Owner'">
<a class="nav-link" routerLink="settings" routerLinkActive="active">
<i class="nav-icon icon-settings2"></i> <span class="nav-text">Settings</span>
<i class="nav-icon icon-settings2"></i> <div class="nav-text">Settings</div>
</a>
</li>
</ul>

39
src/Squidex/app/shell/pages/app/left-menu.component.scss

@ -1,51 +1,46 @@
@import '_vars';
@import '_mixins';
@import '_vars';
.sidebar {
@include fixed($size-navbar-height, auto, 0, 0);
@include box-shadow-colored(2px, 0, 0, $color-dark1-border2);
min-width: $size-sidebar-width;
max-width: $size-sidebar-width;
border-right: 1px solid $color-dark1-border1;
background: $color-dark1-background;
z-index: 100;
}
.nav {
& {
text-align: center;
}
&-icon {
font-size: 2rem;
}
&-text {
display: block;
}
&-item {
& {
color: $color-dark-foreground;
}
&:hover {
i {
color: $color-theme-blue;
}
}
font-size: .9rem;
}
&-link {
& {
@include transition(color .3s ease);
padding: 1.25rem;
display: block;
text-align: center;
text-decoration: none;
color: $color-dark1-foreground;
}
&:hover,
&.active {
& {
background: $color-theme-blue-dark;
}
color: $color-dark1-focus-foreground;
i {
.nav-icon {
color: $color-theme-blue;
}
}
&.active {
background: $color-dark1-active-background;
}
}
}

2
src/Squidex/app/shell/pages/home/home-page.component.html

@ -1,4 +1,4 @@
<div class="content">
<div class="landing-page">
<img class="logo" src="/images/logo.png" />
<button class="btn btn-primary btn-lg login-button" (click)="login()">Login to Squidex</button>

10
src/Squidex/app/shell/pages/home/home-page.component.scss

@ -1,16 +1,6 @@
@import '_mixins';
@import '_vars';
.content {
margin: 8rem auto;
max-width: 32rem;
text-align: center;
}
.logo {
height: 4rem;
}
.login {
&-button {
margin: 2.5rem 0;

2
src/Squidex/app/shell/pages/internal/apps-menu.component.html

@ -11,7 +11,7 @@
<div class="dropdown-divider"></div>
<div *ngIf="apps && apps.length > 0">
<a class="dropdown-item" *ngFor="let app of apps" [routerLink]="['/app', app.name]">{{app.name}}</a>
<a class="dropdown-item" *ngFor="let app of apps" [routerLink]="['/app', app.name]" routerLinkActive="active">{{app.name}}</a>
<div class="dropdown-divider"></div>
</div>

74
src/Squidex/app/shell/pages/internal/apps-menu.component.scss

@ -1,35 +1,39 @@
@import '_vars';
@import '_mixins';
$size-arrow: .6rem;
.navbar-dark {
.navbar-nav {
.nav {
.nav-item {
.nav-link {
color: $color-accent-dark;
& {
@include transition(opacity .4 ease);
@include opacity(.95);
@include no-selection;
@include border-radius;
color: $color-accent-dark;
cursor: pointer;
border: 0;
background: $color-theme-blue-dark;
padding-top: .25rem;
padding-left: 1rem;
padding-right: 2rem;
padding-bottom: .25rem;
margin-top: -.2rem;
}
&:hover {
@include opacity(1);
}
&::after {
@include absolute(50%, 1rem, auto, auto);
color: $color-theme-blue-light;
}
}
}
}
.nav-link {
@include truncate;
}
.drodown-button {
padding: .25rem 1.5rem;
}
.dropdown-menu {
& {
top: $size-navbar-height - $size-arrow;
}
&::before {
@include absolute(-$size-arrow, auto, auto, $size-arrow);
@include caret-top;
border-color: transparent transparent $color-accent-dark;
border-width: $size-arrow;
}
padding: 1rem 1.5rem;
}
.all-apps {
@ -42,29 +46,9 @@ $size-arrow: .6rem;
}
&-pill {
@include absolute(.3rem, .625rem, auto, auto);
background: $color-theme-blue-lighter;
@include absolute(.8rem, .625rem, auto, auto);
background: $color-theme-blue-lightest;
border: 0;
color: $color-theme-blue;
}
}
#app-name {
& {
@include transition(opacity .4 ease);
@include opacity(.95);
@include no-selection;
padding-right: 1rem;
color: $color-accent-dark;
cursor: pointer;
}
&:hover {
@include opacity(1);
}
&::after {
@include absolute(50%, 0, auto, auto);
color: $color-theme-blue-light;
}
}

6
src/Squidex/app/shell/pages/internal/internal-area.component.scss

@ -6,14 +6,14 @@
}
.navbar-brand {
text-align: center;
width: $size-sidebar-width - 2rem;
padding-top: 0;
padding-bottom: 0;
margin-top: -.2rem;
margin-bottom: -.2rem;
margin-right: 2.5rem;
margin-right: 2rem;
font-size: 1.8rem;
width: 4.5rem;
text-align: center;
}
.notification {

2
src/Squidex/app/shell/pages/internal/profile-menu.component.html

@ -3,8 +3,6 @@
<span class="nav-link dropdown-toggle" (click)="modalMenu.toggle()">
<span class="user">
<img class="user-picture" [attr.src]="profilePictureUrl" />
<span class="user-name">{{profileDisplayName}}</span>
</span>
</span>

48
src/Squidex/app/shell/pages/internal/profile-menu.component.scss

@ -1,52 +1,16 @@
@import '_mixins';
@import '_vars';
$size-avatar: 2.2rem;
$size-arrow: .6rem;
.user {
&-picture {
& {
@include circle(2.2rem);
}
&:not([src]) {
@include opacity(0);
}
}
}
.navbar-nav {
.nav-link {
@include no-selection;
padding: 0;
cursor: pointer;
color: $color-accent-dark;
line-height: 2.2rem;
}
}
@import '_mixins';
.nav-link {
&::after {
color: $color-theme-blue-light;
}
padding: 0;
}
.dropdown {
&-item {
cursor: pointer;
}
&-menu {
& {
@include absolute($size-navbar-height - $size-arrow, 0, auto, auto);
}
@include absolute(2.6rem, 0, auto, auto);
}
&::before {
@include absolute(-$size-arrow, $size-arrow, auto, auto);
@include caret-top;
border-color: transparent transparent $color-accent-dark;
border-width: $size-arrow;
}
&-item {
cursor: pointer;
}
}

2
src/Squidex/app/shell/pages/not-found/not-found-page.component.html

@ -1,6 +1,6 @@
<sqx-title message="Not Found"></sqx-title>
<div class="content">
<div class="landing-page">
<img class="logo" src="/images/logo.png" />
<h1>Not Found</h1>

14
src/Squidex/app/shell/pages/not-found/not-found-page.component.scss

@ -1,16 +1,2 @@
@import '_mixins';
@import '_vars';
.content {
margin: 8rem auto;
max-width: 32rem;
text-align: center;
}
.logo {
height: 4rem;
}
h1 {
margin-top: 2.5rem;
}

8
src/Squidex/app/theme/_vendor-overrides.scss → src/Squidex/app/theme/_bootstrap-vars.scss

@ -11,9 +11,7 @@ $btn-secondary-border: #dce5e8;
$input-bg-disabled: #eef1f4;
$input-border-color: #dbe4eb;
$card-border-color: $color-border;
$card-cap-bg: $color-card-footer;
$dropdown-border-color: $color-border;
.completer-input {
@extend .form-control;
}
$card-border-color: $color-border;
$card-cap-bg: #fff;

410
src/Squidex/app/theme/_bootstrap.scss

@ -1,216 +1,159 @@
@import '_mixins';
@import '_vars';
.hide {
display: none;
body {
background: $color-background;
}
.table {
&-fixed {
table-layout: fixed;
.navbar {
& {
height: $size-navbar-height;
}
&-borderless {
td {
border: 0;
}
&-nav {
line-height: 2.2rem;
}
&-borderless-top {
tr {
&:first-child {
td {
border: 0;
}
}
}
.dropdown-menu {
top: 2.6rem;
}
}
&-middle {
td {
vertical-align: middle;
}
.nav-pills {
.nav-link {
@include border-radius(0);
}
}
&-items {
& {
margin-bottom: -.25rem;
}
.navbar-nav {
.nav-link {
cursor: pointer;
}
}
th,
td {
& {
padding: 1rem;
}
.dropdown-menu {
@include box-shadow(0, .3px, 16px, .2px);
border: 0;
background: $panel-light-background;
}
&:first-child {
padding-left: 1.25rem;
}
.nav-dark {
& {
background: $color-dark2-background;
}
&:last-child {
padding-right: 1.25rem;
}
}
.nav-item + .nav-item {
margin: 0;
}
thead {
th {
color: $color-table-header;
font-size: .8rem;
font-weight: normal;
border: 0;
padding-top: 0;
}
&-bordered {
.nav-link {
border-bottom: 1px solid $color-dark2-separator;
}
tbody {
td {
margin: 0;
margin-bottom: 10px;
vertical-align: middle;
}
tr {
& {
background: $color-table;
border: 1px solid $color-border;
border-bottom: 2px solid $color-border;
margin-bottom: .5rem;
}
&:hover {
background: $color-table-footer;
}
&.active {
background: $color-theme-blue;
border-color: $color-theme-blue;
color: $color-accent-dark;
.nav-item {
&:last-child {
.nav-link {
border: 0;
}
}
}
}
&-row,
&-footer {
padding: 1rem 1.25rem;
background: $color-table-footer;
border: 1px solid $color-table-border;
border-bottom-width: 2px;
}
&-row {
background: $color-table;
margin-bottom: .25rem;
}
&.nav-pills {
.nav-link {
& {
color: $color-dark2-foreground;
}
&-footer {
background: $color-table-footer;
margin-top: .8rem;
}
&:hover,
&.active {
color: $color-dark1-focus-foreground;
}
.spacer {
border: 0;
height: .3rem;
&.active {
background: $color-dark2-active-background;
}
}
}
}
.ng-invalid {
&.ng-dirty {
.nav-field-tabs {
& {
@include absolute(auto, auto, 0, 1.25rem);
}
& .nav-link {
& {
border-color: $color-theme-error;
color: $color-text;
cursor: pointer;
padding: 1rem .625rem;
border-bottom: .25rem solid transparent;
width: 6.25rem;
text-align: center;
}
&:hover,
&:focus {
border-color: $color-theme-error-dark;
&.active {
font-weight: bold;
}
}
}
.errors {
&-box {
position: relative;
}
&::after {
@include absolute(auto, auto, -.8rem, .625rem);
content: '';
height: 0;
border-style: solid;
border-width: .4rem;
border-color: $color-theme-error transparent transparent;
width: 0;
&.active,
&:hover {
border-color: $color-theme-blue;
}
}
}
@mixin link-button($color) {
& {
@include absolute(auto, auto, .4rem, 0);
@include border-radius(2px);
color: $color-accent-dark;
cursor: none;
display: inline-block;
font-size: .9rem;
font-weight: normal;
line-height: 1.1rem;
padding: .3rem .4rem;
background: $color-theme-error;
color: $color;
}
}
.col-form-label,
.col-form-checkbox-label {
text-align: right;
}
input,
select {
&.form-control {
padding-top: 0;
padding-bottom: 0;
height: calc(2.5rem - 2px);
&:focus {
outline-color: transparent;
}
}
.form-hint {
& {
font-size: .8rem;
color: lighten($color-text, 30%);
&:disabled {
@include opacity(.4);
}
p {
margin-top: .4rem;
margin-bottom: 0;
&:focus,
&:active,
&:hover {
color: darken($color, 8%);
border-color: transparent;
background: transparent;
text-decoration: none;
}
}
.form-error {
@include border-radius(4px);
@include truncate;
color: $color-accent-dark;
margin-top: .25rem;
margin-bottom: .5rem;
padding: .5rem;
background: $color-theme-error;
}
.btn {
&-simple {
& {
background: transparent;
color: $color-border-dark;
}
.form-group {
&:last-child {
margin-bottom: 0;
&:hover,
&.active {
color: $color-text;
}
}
}
.form-control-dark {
& {
@include transition(background-color .3s ease);
@include placeholder-color(darken($color-accent-dark, 30%));
background: $color-dark-background-accent;
border: 1px solid $color-dark-background-accent;
color: darken($color-accent-dark, 20%);
&-cancel {
padding: .2rem;
font-size: 1.5rem;
font-weight: normal;
}
&:focus {
background: lighten($color-dark-background-accent, 2%);
border-color: lighten($color-dark-background-accent, 2%);
color: $color-accent-dark;
&-link {
&.btn-danger {
@include link-button($color-theme-error);
}
&.btn-primary {
@include link-button($color-theme-blue);
}
}
}
@ -265,145 +208,20 @@ select {
}
}
.dropdown-menu {
@include box-shadow(0, .3px, 16px, .2px);
border: 0;
}
@mixin link-button($color) {
& {
color: $color;
}
&:focus {
outline-color: transparent;
}
&:disabled {
@include opacity(.4);
}
&:focus,
&:active,
&:hover {
color: darken($color, 8%);
border-color: transparent;
background: transparent;
text-decoration: none;
}
}
.btn {
&-simple {
background: transparent;
}
&-cancel {
padding: .2rem;
font-size: 1.5rem;
font-weight: normal;
}
&-radio {
& {
color: $color-border-dark;
cursor: pointer;
border: 1px solid $color-border;
background: transparent;
margin-right: .5rem;
font-size: 1.5rem;
font-weight: normal;
text-align: center;
width: 4.5rem;
}
.radio-label {
display: block;
font-size: .7rem;
font-weight: bold;
margin-left: -.5rem;
margin-right: -.5rem;
line-height: 1.5rem;
}
&.active {
& {
@include box-shadow(0, 0, 10px, .5);
background: $color-theme-blue;
border: 0;
color: $color-accent-dark;
}
&:hover {
color: $color-accent-dark;
}
}
&:hover {
color: $color-theme-blue;
}
.radio-input {
display: none;
}
}
&-link {
&.btn-danger {
@include link-button($color-theme-error);
}
&.btn-primary {
@include link-button($color-theme-blue);
}
}
}
.nav-dark {
& {
background: $color-dark-background;
}
.nav-item + .nav-item {
margin: 0;
.table {
&-fixed {
table-layout: fixed;
}
&.nav-pills {
.nav-link {
& {
color: $color-dark-foreground;
}
&:hover {
color: lighten($color-dark-foreground, 15%);
border: 0;
background: $color-dark-background;
}
&.active {
& {
@include border-radius(0);
background: $color-dark-background-selected;
border: 0;
color: $color-dark-foreground-selected;
}
&:hover {
background: $color-dark-background-selected;
}
}
&-middle {
td {
vertical-align: middle;
}
}
}
.nav-light {
&.nav-pills {
.nav-link {
&.active {
& {
@include border-radius(0);
}
}
&-borderless {
td {
border: 0;
}
}
}

74
src/Squidex/app/theme/_common.scss

@ -0,0 +1,74 @@
@import '_mixins';
@import '_vars';
body {
background: $color-background;
padding-top: $size-navbar-height;
padding-left: $size-sidebar-width;
}
h1 {
font-size: 2rem;
}
.user-picture {
& {
@include circle(2.2rem);
}
&:not([src]) {
@include opacity(0);
}
}
.item-published {
& {
@include circle(.5rem);
display: inline-block;
border: 0;
background: $color-theme-green;
margin-left: .4rem;
}
&.unpublished {
background: $color-theme-error;
}
}
.tooltip-dropdown {
& {
display: inline-block;
}
&-menu {
@include absolute(100%, 0, auto, auto);
}
&-item {
cursor: pointer;
}
}
.landing-page {
& {
margin: 8rem auto;
max-width: 32rem;
text-align: center;
}
h1 {
margin-top: 2.5rem;
}
.logo {
height: 4rem;
}
}
.hidden {
display: none;
}
.item-modified {
font-size: .8rem;
}

115
src/Squidex/app/theme/_forms.scss

@ -0,0 +1,115 @@
@import '_mixins';
@import '_vars';
.ng-invalid {
&.ng-dirty {
& {
border-color: $color-theme-error;
}
&:hover,
&:focus {
border-color: $color-theme-error-dark;
}
}
}
.errors {
&-box {
position: relative;
}
&::after {
@include absolute(auto, auto, -.7rem, .625rem);
content: '';
height: 0;
border-style: solid;
border-width: .4rem;
border-color: $color-theme-error transparent transparent;
width: 0;
}
& {
@include absolute(auto, auto, .4rem, 0);
@include border-radius(2px);
color: $color-accent-dark;
cursor: none;
display: inline-block;
font-size: .9rem;
font-weight: normal;
line-height: 1.1rem;
padding: .3rem .4rem;
background: $color-theme-error;
}
}
.col-form-label,
.col-form-checkbox-label {
text-align: right;
}
input,
select {
&.form-control {
padding-top: 0;
padding-bottom: 0;
height: calc(2.5rem - 2px);
}
}
.form-hint {
font-size: .8rem;
margin-top: .1rem;
margin-bottom: 0;
color: lighten($color-text, 30%);
}
.form-error {
@include border-radius(4px);
@include truncate;
color: $color-accent-dark;
margin-top: .25rem;
margin-bottom: .5rem;
padding: .5rem;
background: $color-theme-error;
}
.form-group {
&:last-child {
margin-bottom: 0;
}
}
.search-form {
& {
@include flex-grow(1);
position: relative;
}
.form-control {
padding-right: 3rem;
}
.icon-search {
@include absolute(.625rem, 1rem, auto, auto);
color: $color-dark2-focus-foreground;
font-size: 1.3rem;
font-weight: lighter;
}
}
.form-control-dark {
& {
@include transition(background-color .3s ease);
@include placeholder-color(darken($color-accent-dark, 30%));
background: $color-dark2-control;
border: 1px solid $color-dark2-control;
color: darken($color-accent-dark, 20%);
}
&:focus {
background: lighten($color-dark2-control, 2%);
border-color: lighten($color-dark2-control, 2%);
color: $color-dark2-focus-foreground;
}
}

10
src/Squidex/app/theme/_history.scss

@ -1,10 +0,0 @@
@import '_mixins';
@import '_vars';
.user-ref {
color: $color-theme-blue-dark;
}
.marker-ref {
color: $color-theme-blue-dark;
}

20
src/Squidex/app/theme/_layout.scss

@ -1,20 +0,0 @@
@import '_mixins';
@import '_vars';
body {
background: $color-background;
padding-top: $size-navbar-height;
padding-left: $size-sidebar-width;
}
h1 {
font-size: 2rem;
}
.hidden {
display: none;
}
.card {
@include box-shadow(0, 2px, 2px, .1);
}

84
src/Squidex/app/theme/_lists.scss

@ -0,0 +1,84 @@
@import '_mixins';
@import '_vars';
.table-items {
& {
margin-bottom: -.25rem;
}
th,
td {
& {
padding: 1rem;
}
&:first-child {
padding-left: 1.25rem;
}
&:last-child {
padding-right: 1.25rem;
}
}
thead {
th {
color: $color-table-header;
font-size: .8rem;
font-weight: normal;
border: 0;
padding-top: 0;
}
}
tbody {
td {
margin: 0;
margin-bottom: 10px;
vertical-align: middle;
}
tr {
& {
@include transition(all .2s ease);
background: $color-table;
border: 1px solid $color-table-border;
border-bottom: 2px solid $color-table-border;
margin-bottom: .5rem;
}
&:hover {
background: darken($color-table, 1%);
}
&.active {
background: $color-theme-blue;
border-color: $color-theme-blue;
color: $color-accent-dark;
}
}
}
&-row,
&-footer {
padding: 1rem 1.25rem;
background: $color-table-footer;
border: 1px solid $color-border;
border-bottom-width: 2px;
}
&-row {
background: $color-table;
margin-bottom: .25rem;
}
&-footer {
background: $color-table-footer;
margin-top: .8rem;
}
.spacer {
border: 0;
height: .3rem;
}
}

2
src/Squidex/app/theme/_mixins.scss

@ -153,7 +153,7 @@
box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);
}
@mixin box-shadow-colored($x-axis: 0, $y-axis: 1px, $blur: 2px, $colo: #000) {
@mixin box-shadow-colored($x-axis: 0, $y-axis: 1px, $blur: 2px, $color: #000) {
-webkit-box-shadow: $x-axis $y-axis $blur $color;
-moz-box-shadow: $x-axis $y-axis $blur $color;
box-shadow: $x-axis $y-axis $blur $color;

196
src/Squidex/app/theme/_panels.scss

@ -2,59 +2,82 @@
@import '_vars';
.panel-container {
@include absolute($size-navbar-height, 0, 0, $size-sidebar-width);
@include fixed($size-navbar-height, 0, 0, $size-sidebar-width);
overflow-x: auto;
}
.panel {
@mixin panel-icon {
& {
@include flex-box;
@include absolute(0, auto, 0, auto);
height: 100%;
flex-direction: column;
color: $color-panel-icon;
font-size: 1.2rem;
font-weight: 400;
text-decoration: none;
text-align: center;
padding: .6rem;
cursor: pointer;
}
&-header,
&-content {
padding: $panel-padding;
&:hover,
&:focus {
text-decoration: none;
color: darken($color-panel-icon, 10%);
}
&-main,
&-content {
@include flex-grow(1);
&.active {
color: $color-theme-blue;
}
}
&-main {
.panel {
& {
@include flex-box;
flex-direction: row;
}
&-title {
font-size: 1.5rem;
font-weight: 400;
@include flex-flow(column);
height: 100%;
background: $color-background;
border-right: 1px solid $color-border;
}
&-header {
max-height: $panel-header * 3;
& {
background: $panel-light-background;
min-height: $panel-header;
max-height: $panel-header * 3;
padding: $panel-padding;
position: relative;
}
&-row {
@include flex-box;
@include flex-flow(row);
margin-top: 1.2rem;
position: relative;
}
}
&-header-row {
&-main {
@include flex-box;
@include flex-flow(row);
position: relative;
margin-top: 1.2rem;
}
&-header-title-row {
position: relative;
padding-right: $panel-sidebar - $panel-padding;
@include flex-grow(1);
}
&-content {
& {
@include flex-grow(1);
border-top: 1px solid $color-border;
background: $color-background;
padding: $panel-padding;
overflow-y: auto;
}
&-blank {
background: $panel-light-background;
border: 0;
}
&-scroll {
overflow-y: scroll;
}
& .nav-stacked {
margin-left: -$panel-padding;
margin-right: -$panel-padding;
@ -62,93 +85,84 @@
& .nav-link {
padding-left: $panel-padding;
padding-right: $panel-padding;
}
}
&-sidebar {
& {
background: $panel-light-background;
border-top: 1px solid $color-border;
border-left: 1px solid $color-border;
min-width: $panel-sidebar;
max-width: $panel-sidebar;
}
& .nav-link {
text-align: center;
color: $color-text;
}
}
&-close {
& {
@include absolute(0, -.125rem, auto, auto);
font-size: 1.3rem;
font-weight: 400;
cursor: pointer;
}
&:hover,
&:focus {
text-decoration: none;
}
}
&-dark {
& {
@include box-shadow(2px, 0, 1px, .3);
background: $color-dark-background;
border-right: 1px solid darken($color-dark-foreground, 15%);
color: $color-dark-foreground;
}
.panel-close {
& .panel-link {
& {
color: $color-dark-foreground;
@include panel-icon;
display: block;
padding-top: .6rem;
padding-bottom: .6rem;
margin-top: -1px;
margin-right: -1px;
border-top: 1px solid transparent;
border-bottom: 1px solid transparent;
border-right: 1px solid $color-border;
}
&:hover {
color: lighten($color-dark-foreground, 15%);
&.active {
border-top-color: $color-border;
border-bottom-color: $color-border;
border-right-color: $panel-light-background;
}
}
}
&-light {
& {
border-right: 1px solid $color-border;
}
&-title {
font-size: 1.5rem;
font-weight: 400;
}
.panel-header {
background: $color-card-footer;
}
&-row {
margin-top: 1rem;
}
.panel-content {
border-top: 1px solid $color-border;
}
&-title-row {
padding-right: 2rem;
}
.panel-content-blank {
border: 0;
background: $color-card-footer;
}
&-close {
@include absolute($panel-padding - .6rem, $panel-padding - .8rem, auto, auto);
@include panel-icon;
}
}
.panel-sidebar {
background: $color-card-footer;
border-left: 1px solid $color-border;
color: lighten($color-dark-foreground, 20%);
}
.panel-dark {
& {
@include box-shadow(2px, 0, 1px, .3);
border-right: 1px solid darken($color-dark2-foreground, 15%);
background: $color-dark2-background;
color: $color-dark2-foreground;
}
.panel-close {
& {
color: lighten($color-dark-foreground, 20%);
}
.panel-content,
.panel-header {
background: $color-dark2-background;
border: 0;
}
&:hover {
color: darken($color-dark-foreground, 15%);
}
.panel-close {
& {
color: $color-dark2-foreground;
}
&:hover {
color: lighten($color-dark2-foreground, 15%);
}
}
}
.panel-menu {
& {
margin-left: -$panel-padding;
margin-right: -$panel-padding;
.nav-link {
@include transition(color .4s ease);
}
}

45
src/Squidex/app/theme/_vars.scss

@ -1,6 +1,6 @@
$color-background: #f4f8f9;
$color-background: #eef1f4;
$color-border: #dbe4eb;
$color-border: #dae4e9;
$color-border-dark: darken($color-border, 20%);
$color-text: #373a3c;
@ -8,9 +8,9 @@ $color-empty: #777;
$color-control: rgba(0, 0, 0, .15);
$color-theme-blue: #438cef;
$color-theme-blue-dark: #3f83df;
$color-theme-blue-light: #a1c6f7;
$color-theme-blue-lighter: #d9e8fc;
$color-theme-blue-dark: #3d7dd5;
$color-theme-blue-light: #9ebeea;
$color-theme-blue-lightest: #d9e8fc;
$color-theme-green: #4cc159;
$color-theme-green-dark: #47b353;
@ -18,27 +18,38 @@ $color-theme-green-dark: #47b353;
$color-theme-error: #f00;
$color-theme-error-dark: darken($color-theme-error, 5%);
$color-dark-foreground: #6a7681;
$color-dark-foreground-selected: lighten($color-dark-foreground, 40%);
$color-dark-background: #2e3842;
$color-dark-background-accent: lighten($color-dark-background, 5%);
$color-dark-background-selected: #273039;
$color-dark1-background: #2e3842;
$color-dark1-foreground: #6a7681;
$color-dark1-border1: #37424c;
$color-dark1-border2: #222a32;
$color-dark1-focus-foreground: #fff;
$color-dark1-active-background: #273039;
$color-modal-header-background: #2e3842;
$color-modal-header-foreground: #6a7681;
$color-dark2-background: #273039;
$color-dark2-foreground: #6a7681;
$color-dark2-border1: #37424c;
$color-dark2-border2: #222a32;
$color-dark2-focus-foreground: #fff;
$color-dark2-active-background: #222931;
$color-dark2-control: #2e3842;
$color-dark2-separator: #2e3842;
$color-panel-icon: #a2b0b6;
$color-table: #fff;
$color-table-footer: #ecf2f6;
$color-table-border: #dbe4eb;
$color-table-border: #e9ecef;
$color-table-header: #a0a0a0;
$color-accent-dark: #fff;
$color-modal-header-background: #2e3842;
$color-modal-header-foreground: #6a7681;
$color-card-footer: #fff;
$color-accent-dark: #fff;
$size-navbar-height: 3.25rem;
$size-sidebar-width: 6.25rem;
$size-sidebar-width: 7rem;
$panel-padding: 1.5rem;
$panel-header: 4.6rem;
$panel-header: 5.4rem;
$panel-sidebar: 3.75rem;
$panel-light-background: #fff;

BIN
src/Squidex/app/theme/icomoon/fonts/icomoon.eot

Binary file not shown.

3
src/Squidex/app/theme/icomoon/fonts/icomoon.svg

@ -1,5 +1,5 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
@ -26,6 +26,7 @@
<glyph unicode="&#xe90c;" glyph-name="control-toggle" d="M682.667 911.238h-341.333c-121.198 0-219.429-98.231-219.429-219.429s98.231-219.429 219.429-219.429h341.333c121.198 0 219.429 98.231 219.429 219.429s-98.231 219.429-219.429 219.429zM682.667 521.143h-341.333c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667h341.333c94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667zM341.333 813.714c-67.34 0-121.905-54.565-121.905-121.905s54.565-121.905 121.905-121.905c67.34 0 121.905 54.565 121.905 121.905s-54.565 121.905-121.905 121.905zM341.333 618.667c-40.399 0-73.143 32.744-73.143 73.143s32.744 73.143 73.143 73.143c40.399 0 73.143-32.744 73.143-73.143s-32.744-73.143-73.143-73.143zM121.905 204.19c0-121.198 98.231-219.429 219.429-219.429h341.333c121.198 0 219.429 98.231 219.429 219.429s-98.231 219.429-219.429 219.429h-341.333c-121.198 0-219.429-98.231-219.429-219.429zM170.667 204.19c0 94.257 76.41 170.667 170.667 170.667h341.333c94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667h-341.333c-94.257 0-170.667 76.41-170.667 170.667zM560.762 204.19c0-67.34 54.565-121.905 121.905-121.905s121.905 54.565 121.905 121.905c0 67.34-54.565 121.905-121.905 121.905s-121.905-54.565-121.905-121.905zM609.524 204.19c0 40.399 32.744 73.143 73.143 73.143s73.143-32.744 73.143-73.143c0-40.399-32.744-73.143-73.143-73.143s-73.143 32.744-73.143 73.143z" />
<glyph unicode="&#xe90d;" glyph-name="control-radio" d="M170.667 252.952c-80.774 0-146.286-65.512-146.286-146.286s65.512-146.286 146.286-146.286c80.774 0 146.286 65.512 146.286 146.286s-65.512 146.286-146.286 146.286zM170.667 9.143c-53.858 0-97.524 43.666-97.524 97.524s43.666 97.524 97.524 97.524c53.858 0 97.524-43.666 97.524-97.524s-43.666-97.524-97.524-97.524zM390.095 764.952c-13.458 0-24.381 10.898-24.381 24.381s10.923 24.381 24.381 24.381h585.143c13.483 0 24.381-10.898 24.381-24.381s-10.898-24.381-24.381-24.381h-585.143zM975.238 472.381c13.483 0 24.381-10.898 24.381-24.381s-10.898-24.381-24.381-24.381h-585.143c-13.458 0-24.381 10.898-24.381 24.381s10.923 24.381 24.381 24.381h585.143zM170.667 935.619c-80.774 0-146.286-65.512-146.286-146.286s65.512-146.286 146.286-146.286c80.774 0 146.286 65.512 146.286 146.286s-65.512 146.286-146.286 146.286zM170.667 691.81c-53.858 0-97.524 43.666-97.524 97.524s43.666 97.524 97.524 97.524c53.858 0 97.524-43.666 97.524-97.524s-43.666-97.524-97.524-97.524zM170.667 594.286c-80.774 0-146.286-65.512-146.286-146.286s65.512-146.286 146.286-146.286c80.774 0 146.286 65.512 146.286 146.286s-65.512 146.286-146.286 146.286zM170.667 350.476c-53.858 0-97.524 43.666-97.524 97.524s43.666 97.524 97.524 97.524c53.858 0 97.524-43.666 97.524-97.524s-43.666-97.524-97.524-97.524zM170.667 838.095c26.917 0 48.762-21.845 48.762-48.762s-21.845-48.762-48.762-48.762c-26.917 0-48.762 21.845-48.762 48.762s21.845 48.762 48.762 48.762zM975.238 131.048c13.483 0 24.381-10.898 24.381-24.381s-10.898-24.381-24.381-24.381h-585.143c-13.458 0-24.381 10.898-24.381 24.381s10.923 24.381 24.381 24.381h585.143z" />
<glyph unicode="&#xe90e;" glyph-name="media" horiz-adv-x="1152" d="M1088 832h-64v64c0 35.2-28.8 64-64 64h-896c-35.2 0-64-28.8-64-64v-768c0-35.2 28.8-64 64-64h64v-64c0-35.2 28.8-64 64-64h896c35.2 0 64 28.8 64 64v768c0 35.2-28.8 64-64 64zM128 768v-640h-63.886c-0.040 0.034-0.082 0.076-0.114 0.116v767.77c0.034 0.040 0.076 0.082 0.114 0.114h895.77c0.040-0.034 0.082-0.076 0.116-0.116v-63.884h-768c-35.2 0-64-28.8-64-64v0zM1088 0.116c-0.034-0.040-0.076-0.082-0.116-0.116h-895.77c-0.040 0.034-0.082 0.076-0.114 0.116v767.77c0.034 0.040 0.076 0.082 0.114 0.114h895.77c0.040-0.034 0.082-0.076 0.116-0.116v-767.768zM960 608c0-53.020-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96 96-42.98 96-96zM1024 64h-768v128l224 384 256-320h64l224 192z" />
<glyph unicode="&#xe90f;" glyph-name="angle-right" horiz-adv-x="347" d="M340 402.286c0-4.571-2.286-9.714-5.714-13.143l-266.286-266.286c-3.429-3.429-8.571-5.714-13.143-5.714s-9.714 2.286-13.143 5.714l-28.571 28.571c-3.429 3.429-5.714 8-5.714 13.143 0 4.571 2.286 9.714 5.714 13.143l224.571 224.571-224.571 224.571c-3.429 3.429-5.714 8.571-5.714 13.143s2.286 9.714 5.714 13.143l28.571 28.571c3.429 3.429 8.571 5.714 13.143 5.714s9.714-2.286 13.143-5.714l266.286-266.286c3.429-3.429 5.714-8.571 5.714-13.143z" />
<glyph unicode="&#xe925;" glyph-name="content" d="M917.806 602.924c-22.21 30.292-53.174 65.7-87.178 99.704s-69.412 64.964-99.704 87.178c-51.574 37.82-76.592 42.194-90.924 42.194h-368c-44.114 0-80-35.888-80-80v-736c0-44.112 35.886-80 80-80h608c44.112 0 80 35.888 80 80v496c0 14.332-4.372 39.35-42.194 90.924zM785.374 657.374c30.7-30.7 54.8-58.398 72.58-81.374h-153.954v153.946c22.982-17.78 50.678-41.878 81.374-72.572v0zM896 16c0-8.672-7.328-16-16-16h-608c-8.672 0-16 7.328-16 16v736c0 8.672 7.328 16 16 16 0 0 367.956 0.002 368 0v-224c0-17.672 14.324-32 32-32h224v-496zM602.924 917.804c-51.574 37.822-76.592 42.196-90.924 42.196h-368c-44.112 0-80-35.888-80-80v-736c0-38.632 27.528-70.958 64-78.39v814.39c0 8.672 7.328 16 16 16h486.876c-9.646 7.92-19.028 15.26-27.952 21.804z" />
<glyph unicode="&#xe92c;" glyph-name="copy" d="M640 704v256h-448l-192-192v-576h384v-256h640v768h-384zM192 869.49v-101.49h-101.49l101.49 101.49zM64 256v448h192v192h320v-192l-192-192v-256h-320zM576 613.49v-101.49h-101.49l101.49 101.49zM960 0h-512v448h192v192h320v-640z" />
<glyph unicode="&#xe92e;" glyph-name="schemas" d="M1024 640l-512 256-512-256 512-256 512 256zM512 811.030l342.058-171.030-342.058-171.030-342.058 171.030 342.058 171.030zM921.444 499.278l102.556-51.278-512-256-512 256 102.556 51.278 409.444-204.722zM921.444 307.278l102.556-51.278-512-256-512 256 102.556 51.278 409.444-204.722z" />

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

BIN
src/Squidex/app/theme/icomoon/fonts/icomoon.ttf

Binary file not shown.

BIN
src/Squidex/app/theme/icomoon/fonts/icomoon.woff

Binary file not shown.

170
src/Squidex/app/theme/icomoon/selection.json

@ -1,6 +1,36 @@
{
"IcoMoonType": "selection",
"icons": [
{
"icon": {
"paths": [
"M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8-5.714-13.143 0-4.571 2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"
],
"attrs": [
{}
],
"width": 347,
"isMulticolor": false,
"isMulticolor2": false,
"tags": [
"angle-right"
],
"grid": 14
},
"attrs": [
{}
],
"properties": {
"order": 1,
"id": 0,
"prevSize": 28,
"code": 59663,
"name": "angle-right"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 0
},
{
"icon": {
"paths": [
@ -30,8 +60,8 @@
"prevSize": 32,
"code": 59661
},
"setIdx": 0,
"setId": 6,
"setIdx": 1,
"setId": 1,
"iconIdx": 0
},
{
@ -63,9 +93,9 @@
"prevSize": 32,
"code": 59652
},
"setIdx": 0,
"setId": 6,
"iconIdx": 2
"setIdx": 1,
"setId": 1,
"iconIdx": 1
},
{
"icon": {
@ -96,9 +126,9 @@
"prevSize": 32,
"code": 59654
},
"setIdx": 0,
"setId": 6,
"iconIdx": 3
"setIdx": 1,
"setId": 1,
"iconIdx": 2
},
{
"icon": {
@ -129,9 +159,9 @@
"prevSize": 32,
"code": 59655
},
"setIdx": 0,
"setId": 6,
"iconIdx": 4
"setIdx": 1,
"setId": 1,
"iconIdx": 3
},
{
"icon": {
@ -162,9 +192,9 @@
"prevSize": 32,
"code": 59656
},
"setIdx": 0,
"setId": 6,
"iconIdx": 5
"setIdx": 1,
"setId": 1,
"iconIdx": 4
},
{
"icon": {
@ -195,9 +225,9 @@
"prevSize": 32,
"code": 59657
},
"setIdx": 0,
"setId": 6,
"iconIdx": 6
"setIdx": 1,
"setId": 1,
"iconIdx": 5
},
{
"icon": {
@ -228,9 +258,9 @@
"prevSize": 32,
"code": 59658
},
"setIdx": 0,
"setId": 6,
"iconIdx": 8
"setIdx": 1,
"setId": 1,
"iconIdx": 6
},
{
"icon": {
@ -261,9 +291,9 @@
"prevSize": 32,
"code": 59659
},
"setIdx": 0,
"setId": 6,
"iconIdx": 9
"setIdx": 1,
"setId": 1,
"iconIdx": 7
},
{
"icon": {
@ -315,9 +345,9 @@
"prevSize": 32,
"code": 59660
},
"setIdx": 0,
"setId": 6,
"iconIdx": 10
"setIdx": 1,
"setId": 1,
"iconIdx": 8
},
{
"icon": {
@ -348,9 +378,9 @@
"prevSize": 32,
"code": 59648
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 12
"iconIdx": 9
},
{
"icon": {
@ -377,9 +407,9 @@
"code": 59651,
"name": "dots"
},
"setIdx": 2,
"setId": 4,
"iconIdx": 0
"setIdx": 1,
"setId": 1,
"iconIdx": 10
},
{
"icon": {
@ -408,9 +438,9 @@
"prevSize": 32,
"code": 59650
},
"setIdx": 3,
"setId": 3,
"iconIdx": 0
"setIdx": 1,
"setId": 1,
"iconIdx": 11
},
{
"icon": {
@ -435,9 +465,9 @@
"code": 59573,
"name": "time"
},
"setIdx": 4,
"setId": 2,
"iconIdx": 4
"setIdx": 1,
"setId": 1,
"iconIdx": 12
},
{
"icon": {
@ -462,9 +492,9 @@
"code": 58829,
"name": "close"
},
"setIdx": 4,
"setId": 2,
"iconIdx": 157
"setIdx": 1,
"setId": 1,
"iconIdx": 13
},
{
"icon": {
@ -489,9 +519,9 @@
"code": 59389,
"name": "person"
},
"setIdx": 4,
"setId": 2,
"iconIdx": 557
"setIdx": 1,
"setId": 1,
"iconIdx": 14
},
{
"icon": {
@ -516,9 +546,9 @@
"code": 59574,
"name": "search"
},
"setIdx": 4,
"setId": 2,
"iconIdx": 655
"setIdx": 1,
"setId": 1,
"iconIdx": 15
},
{
"icon": {
@ -545,9 +575,9 @@
"code": 59649,
"name": "plus"
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 11
"iconIdx": 16
},
{
"icon": {
@ -574,9 +604,9 @@
"prevSize": 32,
"code": 59653
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 0
"iconIdx": 17
},
{
"icon": {
@ -607,9 +637,9 @@
"prevSize": 32,
"code": 59662
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 1
"iconIdx": 18
},
{
"icon": {
@ -639,9 +669,9 @@
"prevSize": 32,
"code": 59685
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 2
"iconIdx": 19
},
{
"icon": {
@ -671,9 +701,9 @@
"prevSize": 32,
"code": 59692
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 3
"iconIdx": 20
},
{
"icon": {
@ -699,9 +729,9 @@
"prevSize": 32,
"code": 59694
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 4
"iconIdx": 21
},
{
"icon": {
@ -728,9 +758,9 @@
"prevSize": 32,
"code": 59713
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 5
"iconIdx": 22
},
{
"icon": {
@ -759,9 +789,9 @@
"prevSize": 32,
"code": 59725
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 6
"iconIdx": 23
},
{
"icon": {
@ -792,9 +822,9 @@
"prevSize": 32,
"code": 59796
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 7
"iconIdx": 24
},
{
"icon": {
@ -823,9 +853,9 @@
"prevSize": 32,
"code": 59814
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 8
"iconIdx": 25
},
{
"icon": {
@ -856,9 +886,9 @@
"prevSize": 32,
"code": 59820
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 9
"iconIdx": 26
},
{
"icon": {
@ -884,9 +914,9 @@
"prevSize": 32,
"code": 59995
},
"setIdx": 5,
"setIdx": 1,
"setId": 1,
"iconIdx": 10
"iconIdx": 27
}
],
"height": 1024,

13
src/Squidex/app/theme/icomoon/style.css

@ -1,10 +1,10 @@
@font-face {
font-family: 'icomoon';
src: url('fonts/icomoon.eot?pmbjza');
src: url('fonts/icomoon.eot?pmbjza#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?pmbjza') format('truetype'),
url('fonts/icomoon.woff?pmbjza') format('woff'),
url('fonts/icomoon.svg?pmbjza#icomoon') format('svg');
src: url('fonts/icomoon.eot?dy118g');
src: url('fonts/icomoon.eot?dy118g#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?dy118g') format('truetype'),
url('fonts/icomoon.woff?dy118g') format('woff'),
url('fonts/icomoon.svg?dy118g#icomoon') format('svg');
font-weight: normal;
font-style: normal;
}
@ -24,6 +24,9 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-angle-right:before {
content: "\e90f";
}
.icon-control-radio:before {
content: "\e90d";
}

8
src/Squidex/app/theme/theme.scss

@ -1,4 +1,4 @@
@import '_bootstrap.scss';
@import '_layout.scss';
@import '_panels.scss';
@import '_history.scss';
@import '_common';
@import '_panels';
@import '_forms';
@import '_lists';

5
src/Squidex/app/theme/vendor.scss

@ -1,7 +1,10 @@
@import '_vendor-overrides.scss';
@import '_bootstrap-vars.scss';
// Bootstrap
@import './../../node_modules/bootstrap/scss/bootstrap-flex.scss';
// Bootstrap Overrides
@import '_bootstrap.scss';
// icomoon
@import './icomoon/style.css';
Loading…
Cancel
Save