Browse Source

Rich editors

pull/1/head
Sebastian 10 years ago
parent
commit
06f91f1c00
  1. 6
      src/Squidex.Core/Schemas/StringFieldEditor.cs
  2. 2
      src/Squidex/Config/Domain/Serializers.cs
  3. 12
      src/Squidex/app/features/content/pages/content/content-field.component.html
  4. 2
      src/Squidex/app/features/content/pages/content/content-page.component.html
  5. 2
      src/Squidex/app/features/content/pages/contents/contents-page.component.html
  6. 18
      src/Squidex/app/features/schemas/pages/schema/types/string-ui.component.html
  7. 2
      src/Squidex/app/features/schemas/pages/schema/types/string-ui.component.ts
  8. 4
      src/Squidex/app/framework/angular/autocomplete.component.ts
  9. 4
      src/Squidex/app/framework/angular/date-time-editor.component.ts
  10. 2
      src/Squidex/app/framework/angular/json-editor.component.scss
  11. 49
      src/Squidex/app/framework/angular/json-editor.component.ts
  12. 1
      src/Squidex/app/framework/angular/markdown-editor.component.html
  13. 6
      src/Squidex/app/framework/angular/markdown-editor.component.scss
  14. 80
      src/Squidex/app/framework/angular/markdown-editor.component.ts
  15. 1
      src/Squidex/app/framework/angular/rich-editor.component.html
  16. 8
      src/Squidex/app/framework/angular/rich-editor.component.scss
  17. 93
      src/Squidex/app/framework/angular/rich-editor.component.ts
  18. 4
      src/Squidex/app/framework/angular/slider.component.ts
  19. 4
      src/Squidex/app/framework/angular/tag-editor.component.ts
  20. 15
      src/Squidex/app/framework/angular/user-report.component.ts
  21. 3
      src/Squidex/app/framework/declarations.ts
  22. 8
      src/Squidex/app/framework/module.ts
  23. 63
      src/Squidex/app/framework/services/resource-loader.service.ts
  24. 4
      src/Squidex/app/theme/icomoon/demo.html
  25. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.eot
  26. 2
      src/Squidex/app/theme/icomoon/fonts/icomoon.svg
  27. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.ttf
  28. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.woff
  29. 2
      src/Squidex/app/theme/icomoon/selection.json
  30. 12
      src/Squidex/app/theme/icomoon/style.css

6
src/Squidex.Core/Schemas/StringFieldEditor.cs

@ -10,9 +10,11 @@ namespace Squidex.Core.Schemas
{ {
public enum StringFieldEditor public enum StringFieldEditor
{ {
Dropdown,
Input, Input,
Textarea, Markdown,
Radio, Radio,
Dropdown RichText,
TextArea
} }
} }

2
src/Squidex/Config/Domain/Serializers.cs

@ -9,6 +9,7 @@
using System.Reflection; using System.Reflection;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
using NodaTime; using NodaTime;
using NodaTime.Serialization.JsonNet; using NodaTime.Serialization.JsonNet;
@ -35,6 +36,7 @@ namespace Squidex.Config.Domain
settings.Converters.Add(new NamedStringIdConverter()); settings.Converters.Add(new NamedStringIdConverter());
settings.Converters.Add(new PropertiesBagConverter()); settings.Converters.Add(new PropertiesBagConverter());
settings.Converters.Add(new RefTokenConverter()); settings.Converters.Add(new RefTokenConverter());
settings.Converters.Add(new StringEnumConverter());
settings.NullValueHandling = NullValueHandling.Ignore; settings.NullValueHandling = NullValueHandling.Ignore;

12
src/Squidex/app/features/content/pages/content/content-field.component.html

@ -39,14 +39,14 @@
<div *ngSwitchCase="'Input'"> <div *ngSwitchCase="'Input'">
<input class="form-control" type="text" [formControlName]="language"> <input class="form-control" type="text" [formControlName]="language">
</div> </div>
<div *ngSwitchCase="'Textarea'">
<textarea class="form-control" [formControlName]="language"></textarea>
</div>
<div *ngSwitchCase="'Dropdown'"> <div *ngSwitchCase="'Dropdown'">
<select class="form-control" [formControlName]="language"> <select class="form-control" [formControlName]="language">
<option *ngFor="let value of field.properties.allowedValues">{{value}}</option> <option *ngFor="let value of field.properties.allowedValues">{{value}}</option>
</select> </select>
</div> </div>
<div *ngSwitchCase="'Textarea'">
<textarea class="form-control" [formControlName]="language"></textarea>
</div>
<div *ngSwitchCase="'Radio'"> <div *ngSwitchCase="'Radio'">
<div class="form-check form-check-inline" *ngFor="let value of field.properties.allowedValues"> <div class="form-check form-check-inline" *ngFor="let value of field.properties.allowedValues">
<label class="form-check-label"> <label class="form-check-label">
@ -54,6 +54,12 @@
</label> </label>
</div> </div>
</div> </div>
<div *ngSwitchCase="'RichText'">
<sqx-rich-editor [formControlName]="language"></sqx-rich-editor>
</div>
<div *ngSwitchCase="'Markdown'">
<sqx-markdown-editor [formControlName]="language"></sqx-markdown-editor>
</div>
</div> </div>
</div> </div>
<div *ngSwitchCase="'Boolean'"> <div *ngSwitchCase="'Boolean'">

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

@ -1,7 +1,7 @@
<sqx-title message="{app} | Content" parameter1="app" value1="{{appName() | async}}"></sqx-title> <sqx-title message="{app} | Content" parameter1="app" value1="{{appName() | async}}"></sqx-title>
<form [formGroup]="contentForm" (ngSubmit)="saveContent()"> <form [formGroup]="contentForm" (ngSubmit)="saveContent()">
<sqx-panel panelWidth="36rem"> <sqx-panel panelWidth="46rem">
<div class="panel-header"> <div class="panel-header">
<div class="panel-title-row"> <div class="panel-title-row">
<div class="float-right"> <div class="float-right">

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

@ -1,6 +1,6 @@
<sqx-title message="{app} | Contents" parameter1="app" value1="{{appName() | async}}"></sqx-title> <sqx-title message="{app} | Contents" parameter1="app" value1="{{appName() | async}}"></sqx-title>
<sqx-panel panelWidth="61rem"> <sqx-panel panelWidth="51rem">
<div class="panel-header"> <div class="panel-header">
<div class="panel-title-row"> <div class="panel-title-row">
<div class="float-right"> <div class="float-right">

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

@ -21,13 +21,27 @@
<span class="radio-label">Input</span> <span class="radio-label">Input</span>
</label> </label>
<label class="btn btn-radio" [class.active]="editForm.controls.editor.value === 'Textarea'"> <label class="btn btn-radio" [class.active]="editForm.controls.editor.value === 'TextArea'">
<input type="radio" class="radio-input" formControlName="editor" value="TextArea" /> <input type="radio" class="radio-input" formControlName="editor" value="TextArea" />
<i class="icon-control-Textarea"></i> <i class="icon-control-TextArea"></i>
<span class="radio-label">TextArea</span> <span class="radio-label">TextArea</span>
</label> </label>
<label class="btn btn-radio" [class.active]="editForm.controls.editor.value === 'RichText'">
<input type="radio" class="radio-input" formControlName="editor" value="RichText" />
<i class="icon-control-RichText"></i>
<span class="radio-label">RichText</span>
</label>
<label class="btn btn-radio" [class.active]="editForm.controls.editor.value === 'Markdown'">
<input type="radio" class="radio-input" formControlName="editor" value="Markdown" />
<i class="icon-control-Markdown"></i>
<span class="radio-label">Markdown</span>
</label>
<label class="btn btn-radio" [class.active]="editForm.controls.editor.value === 'Dropdown'"> <label class="btn btn-radio" [class.active]="editForm.controls.editor.value === 'Dropdown'">
<input type="radio" class="radio-input" formControlName="editor" value="Dropdown" /> <input type="radio" class="radio-input" formControlName="editor" value="Dropdown" />

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

@ -48,7 +48,7 @@ export class StringUIComponent implements OnDestroy, OnInit {
this.hideAllowedValues = this.hideAllowedValues =
Observable.of(this.properties.editor) Observable.of(this.properties.editor)
.merge(this.editForm.get('editor').valueChanges) .merge(this.editForm.get('editor').valueChanges)
.map(x => !x || x === 'Input' || x === 'TextArea'); .map(x => !x || x === 'Input' || x === 'TextArea' || x === 'RichText' || x === 'Markdown');
this.editorSubscription = this.editorSubscription =
this.hideAllowedValues.subscribe(isSelection => { this.hideAllowedValues.subscribe(isSelection => {

4
src/Squidex/app/framework/angular/autocomplete.component.ts

@ -30,9 +30,7 @@ const KEY_DOWN = 40;
const NOOP = () => { }; const NOOP = () => { };
export const SQX_AUTOCOMPLETE_CONTROL_VALUE_ACCESSOR: any = { export const SQX_AUTOCOMPLETE_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR, provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AutocompleteComponent), multi: true
useExisting: forwardRef(() => AutocompleteComponent),
multi: true
}; };
@Component({ @Component({

4
src/Squidex/app/framework/angular/date-time-editor.component.ts

@ -15,9 +15,7 @@ let Pikaday = require('pikaday/pikaday');
const NOOP = () => { }; const NOOP = () => { };
export const SQX_DATE_TIME_EDITOR_CONTROL_VALUE_ACCESSOR: any = { export const SQX_DATE_TIME_EDITOR_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR, provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateTimeEditorComponent), multi: true
useExisting: forwardRef(() => DateTimeEditorComponent),
multi: true
}; };
@Component({ @Component({

2
src/Squidex/app/framework/angular/json-editor.component.scss

@ -4,5 +4,5 @@
.editor { .editor {
background: $color-accent-dark; background: $color-accent-dark;
border: 1px solid $color-input; border: 1px solid $color-input;
height: 20rem; height: 30rem;
} }

49
src/Squidex/app/framework/angular/json-editor.component.ts

@ -7,7 +7,8 @@
import { AfterViewInit, Component, forwardRef, ElementRef, ViewChild } from '@angular/core'; import { AfterViewInit, Component, forwardRef, ElementRef, ViewChild } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { ReplaySubject } from 'rxjs';
import { ResourceLoaderService } from './../services/resource-loader.service';
declare var ace: any; declare var ace: any;
@ -15,9 +16,7 @@ declare var ace: any;
const NOOP = () => { }; const NOOP = () => { };
export const SQX_JSON_EDITOR_CONTROL_VALUE_ACCESSOR: any = { export const SQX_JSON_EDITOR_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR, provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => JsonEditorComponent), multi: true
useExisting: forwardRef(() => JsonEditorComponent),
multi: true
}; };
@Component({ @Component({
@ -27,9 +26,6 @@ export const SQX_JSON_EDITOR_CONTROL_VALUE_ACCESSOR: any = {
providers: [SQX_JSON_EDITOR_CONTROL_VALUE_ACCESSOR] providers: [SQX_JSON_EDITOR_CONTROL_VALUE_ACCESSOR]
}) })
export class JsonEditorComponent implements ControlValueAccessor, AfterViewInit { export class JsonEditorComponent implements ControlValueAccessor, AfterViewInit {
private static loaderCallback: ReplaySubject<any>;
private static isLoaded: boolean;
private changeCallback: (value: any) => void = NOOP; private changeCallback: (value: any) => void = NOOP;
private touchedCallback: () => void = NOOP; private touchedCallback: () => void = NOOP;
private aceEditor: any; private aceEditor: any;
@ -39,6 +35,11 @@ export class JsonEditorComponent implements ControlValueAccessor, AfterViewInit
@ViewChild('editor') @ViewChild('editor')
public editor: ElementRef; public editor: ElementRef;
constructor(
private readonly resourceLoader: ResourceLoaderService
) {
}
public writeValue(value: any) { public writeValue(value: any) {
this.value = value; this.value = value;
@ -64,7 +65,7 @@ export class JsonEditorComponent implements ControlValueAccessor, AfterViewInit
} }
public ngAfterViewInit() { public ngAfterViewInit() {
JsonEditorComponent.loadScript(() => { this.resourceLoader.loadScript('https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/ace.js').then(() => {
this.aceEditor = ace.edit(this.editor.nativeElement); this.aceEditor = ace.edit(this.editor.nativeElement);
this.aceEditor.getSession().setMode('ace/mode/javascript'); this.aceEditor.getSession().setMode('ace/mode/javascript');
@ -104,36 +105,4 @@ export class JsonEditorComponent implements ControlValueAccessor, AfterViewInit
this.aceEditor.clearSelection(); this.aceEditor.clearSelection();
} }
private static loadScript(callback: () => void) {
if (JsonEditorComponent.isLoaded) {
callback();
return;
}
if (JsonEditorComponent.loaderCallback) {
JsonEditorComponent.loaderCallback.subscribe(callback);
return;
}
JsonEditorComponent.loaderCallback = new ReplaySubject(1);
JsonEditorComponent.loaderCallback.subscribe(callback);
const url = 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/ace.js';
const script = document.createElement('script');
script.src = url;
script.async = true;
script.onload = () => {
JsonEditorComponent.loaderCallback.next(null);
JsonEditorComponent.loaderCallback = null;
JsonEditorComponent.isLoaded = true;
};
const node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(script, node);
}
} }

1
src/Squidex/app/framework/angular/markdown-editor.component.html

@ -0,0 +1 @@
<textarea class="form-control" #editor></textarea>

6
src/Squidex/app/framework/angular/markdown-editor.component.scss

@ -0,0 +1,6 @@
@import '_mixins';
@import '_vars';
.editor {
height: 30rem;
}

80
src/Squidex/app/framework/angular/markdown-editor.component.ts

@ -0,0 +1,80 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
import { AfterViewInit, Component, forwardRef, ElementRef, ViewChild } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { ResourceLoaderService } from './../services/resource-loader.service';
declare var SimpleMDE: any;
/* tslint:disable:no-empty */
const NOOP = () => { };
export const SQX_MARKDOWN_EDITOR_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MarkdownEditorComponent), multi: true
};
@Component({
selector: 'sqx-markdown-editor',
styleUrls: ['./markdown-editor.component.scss'],
templateUrl: './markdown-editor.component.html',
providers: [SQX_MARKDOWN_EDITOR_CONTROL_VALUE_ACCESSOR]
})
export class MarkdownEditorComponent implements ControlValueAccessor, AfterViewInit {
private changeCallback: (value: any) => void = NOOP;
private touchedCallback: () => void = NOOP;
private simplemde: any;
private value: any;
private isDisabled = false;
@ViewChild('editor')
public editor: ElementRef;
constructor(
private readonly resourceLoader: ResourceLoaderService
) {
this.resourceLoader.loadStyle('https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css');
}
public writeValue(value: any) {
this.value = value;
if (this.simplemde) {
this.simplemde.value(this.value || '');
}
}
public setDisabledState(isDisabled: boolean): void {
this.isDisabled = isDisabled;
if (this.simplemde) {
this.simplemde.setOption('readOnly', isDisabled);
}
}
public registerOnChange(fn: any) {
this.changeCallback = fn;
}
public registerOnTouched(fn: any) {
this.touchedCallback = fn;
}
public ngAfterViewInit() {
this.resourceLoader.loadScript('https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.js').then(() => {
this.simplemde = new SimpleMDE({ element: this.editor.nativeElement });
this.simplemde.value(this.value || '');
this.simplemde.codemirror.on('blur', () => {
const value = this.simplemde.value();
this.changeCallback(value);
});
});
}
}

1
src/Squidex/app/framework/angular/rich-editor.component.html

@ -0,0 +1 @@
<div class="editor" #editor></div>

8
src/Squidex/app/framework/angular/rich-editor.component.scss

@ -0,0 +1,8 @@
@import '_mixins';
@import '_vars';
.editor {
background: $color-accent-dark;
border: 1px solid $color-input;
height: 30rem;
}

93
src/Squidex/app/framework/angular/rich-editor.component.ts

@ -0,0 +1,93 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
import { AfterViewInit, Component, forwardRef, ElementRef, OnDestroy, ViewChild } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { ResourceLoaderService } from './../services/resource-loader.service';
declare var tinymce: any;
/* tslint:disable:no-empty */
const NOOP = () => { };
export const SQX_RICH_EDITOR_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RichEditorComponent), multi: true
};
@Component({
selector: 'sqx-rich-editor',
styleUrls: ['./rich-editor.component.scss'],
templateUrl: './rich-editor.component.html',
providers: [SQX_RICH_EDITOR_CONTROL_VALUE_ACCESSOR]
})
export class RichEditorComponent implements ControlValueAccessor, AfterViewInit, OnDestroy {
private changeCallback: (value: any) => void = NOOP;
private touchedCallback: () => void = NOOP;
private tinyEditor: any;
private value: any;
private isDisabled = false;
@ViewChild('editor')
public editor: ElementRef;
constructor(
private readonly resourceLoader: ResourceLoaderService
) {
}
public writeValue(value: any) {
this.value = value;
if (this.tinyEditor) {
this.tinyEditor.setContent(value);
}
}
public setDisabledState(isDisabled: boolean): void {
this.isDisabled = isDisabled;
if (this.tinyEditor) {
this.tinyEditor.setMode(isDisabled ? 'readonly' : 'design');
}
}
public registerOnChange(fn: any) {
this.changeCallback = fn;
}
public registerOnTouched(fn: any) {
this.touchedCallback = fn;
}
public ngAfterViewInit() {
const self = this;
this.resourceLoader.loadScript('https://cdnjs.cloudflare.com/ajax/libs/tinymce/4.5.4/tinymce.min.js').then(() => {
tinymce.init({
setup: (editor: any) => {
self.tinyEditor = editor;
self.tinyEditor.on('blur', () => {
const value = editor.getContent();
self.changeCallback(value);
});
setTimeout(() => {
self.tinyEditor.setContent(this.value || '');
}, 500);
},
target: this.editor.nativeElement
});
});
}
public ngOnDestroy() {
tinymce.remove(this.editor);
}
}

4
src/Squidex/app/framework/angular/slider.component.ts

@ -12,9 +12,7 @@ import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
const NOOP = () => { }; const NOOP = () => { };
export const SQX_SLIDER_CONTROL_VALUE_ACCESSOR: any = { export const SQX_SLIDER_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR, provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SliderComponent), multi: true
useExisting: forwardRef(() => SliderComponent),
multi: true
}; };
@Component({ @Component({

4
src/Squidex/app/framework/angular/tag-editor.component.ts

@ -49,9 +49,7 @@ export class NoopConverter implements Converter {
} }
export const SQX_TAG_EDITOR_CONTROL_VALUE_ACCESSOR: any = { export const SQX_TAG_EDITOR_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR, provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TagEditorComponent), multi: true
useExisting: forwardRef(() => TagEditorComponent),
multi: true
}; };
@Component({ @Component({

15
src/Squidex/app/framework/angular/user-report.component.ts

@ -7,6 +7,7 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { ResourceLoaderService } from './../services/resource-loader.service';
import { UserReportConfig } from './../configurations'; import { UserReportConfig } from './../configurations';
@Component({ @Component({
@ -14,22 +15,16 @@ import { UserReportConfig } from './../configurations';
template: '' template: ''
}) })
export class UserReportComponent implements OnInit { export class UserReportComponent implements OnInit {
constructor(config: UserReportConfig) { constructor(config: UserReportConfig,
private readonly resourceLoader: ResourceLoaderService
) {
window['_urq'] = window['_urq'] || []; window['_urq'] = window['_urq'] || [];
window['_urq'].push(['initSite', config.siteId]); window['_urq'].push(['initSite', config.siteId]);
} }
public ngOnInit() { public ngOnInit() {
setTimeout(() => { setTimeout(() => {
const url = 'https://cdn.userreport.com/userreport.js'; this.resourceLoader.loadScript('https://cdn.userreport.com/userreport.js');
const script = document.createElement('script');
script.src = url;
script.async = true;
const node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(script, node);
}, 4000); }, 4000);
} }
} }

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

@ -17,11 +17,13 @@ export * from './angular/focus-on-change.directive';
export * from './angular/focus-on-init.directive'; export * from './angular/focus-on-init.directive';
export * from './angular/http-utils'; export * from './angular/http-utils';
export * from './angular/json-editor.component'; export * from './angular/json-editor.component';
export * from './angular/markdown-editor.component';
export * from './angular/modal-view.directive'; export * from './angular/modal-view.directive';
export * from './angular/money.pipe'; export * from './angular/money.pipe';
export * from './angular/name.pipe'; export * from './angular/name.pipe';
export * from './angular/panel.component'; export * from './angular/panel.component';
export * from './angular/panel-container.directive'; export * from './angular/panel-container.directive';
export * from './angular/rich-editor.component';
export * from './angular/scroll-active.directive'; export * from './angular/scroll-active.directive';
export * from './angular/shortcut.component'; export * from './angular/shortcut.component';
export * from './angular/slider.component'; export * from './angular/slider.component';
@ -35,6 +37,7 @@ export * from './services/local-store.service';
export * from './services/message-bus'; export * from './services/message-bus';
export * from './services/notification.service'; export * from './services/notification.service';
export * from './services/panel.service'; export * from './services/panel.service';
export * from './services/resource-loader.service';
export * from './services/shortcut.service'; export * from './services/shortcut.service';
export * from './services/title.service'; export * from './services/title.service';

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

@ -27,6 +27,7 @@ import {
FromNowPipe, FromNowPipe,
JsonEditorComponent, JsonEditorComponent,
LocalStoreService, LocalStoreService,
MarkdownEditorComponent,
MessageBus, MessageBus,
ModalViewDirective, ModalViewDirective,
MoneyPipe, MoneyPipe,
@ -35,6 +36,8 @@ import {
PanelContainerDirective, PanelContainerDirective,
PanelComponent, PanelComponent,
PanelService, PanelService,
ResourceLoaderService,
RichEditorComponent,
ScrollActiveDirective, ScrollActiveDirective,
ShortcutComponent, ShortcutComponent,
ShortcutService, ShortcutService,
@ -69,11 +72,13 @@ import {
FocusOnInitDirective, FocusOnInitDirective,
FromNowPipe, FromNowPipe,
JsonEditorComponent, JsonEditorComponent,
MarkdownEditorComponent,
ModalViewDirective, ModalViewDirective,
MoneyPipe, MoneyPipe,
MonthPipe, MonthPipe,
PanelContainerDirective, PanelContainerDirective,
PanelComponent, PanelComponent,
RichEditorComponent,
ScrollActiveDirective, ScrollActiveDirective,
ShortcutComponent, ShortcutComponent,
ShortDatePipe, ShortDatePipe,
@ -97,11 +102,13 @@ import {
FocusOnInitDirective, FocusOnInitDirective,
FromNowPipe, FromNowPipe,
JsonEditorComponent, JsonEditorComponent,
MarkdownEditorComponent,
ModalViewDirective, ModalViewDirective,
MoneyPipe, MoneyPipe,
MonthPipe, MonthPipe,
PanelContainerDirective, PanelContainerDirective,
PanelComponent, PanelComponent,
RichEditorComponent,
ScrollActiveDirective, ScrollActiveDirective,
ShortcutComponent, ShortcutComponent,
ShortDatePipe, ShortDatePipe,
@ -127,6 +134,7 @@ export class SqxFrameworkModule {
MessageBus, MessageBus,
NotificationService, NotificationService,
PanelService, PanelService,
ResourceLoaderService,
ShortcutService, ShortcutService,
TitleService TitleService
] ]

63
src/Squidex/app/framework/services/resource-loader.service.ts

@ -0,0 +1,63 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
export class ResourceLoaderService {
private cache: { [path: string]: Promise<any> } = {};
public loadStyle(url: string): Promise<any> {
const key = url.toUpperCase();
let result = this.cache[key];
if (!result) {
result = new Promise((resolve, reject) => {
const style = document.createElement('link');
style.rel = 'stylesheet';
style.href = url;
style.type = 'text/css';
style.onload = () => {
resolve();
};
const head = document.getElementsByTagName('head')[0];
head.appendChild(style);
});
this.cache[key] = result;
}
return result;
}
public loadScript(url: string): Promise<any> {
const key = url.toUpperCase();
let result = this.cache[key];
if (!result) {
result = new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = url;
script.async = true;
script.onload = () => {
resolve();
};
const node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(script, node);
});
this.cache[key] = result;
}
return result;
}
}

4
src/Squidex/app/theme/icomoon/demo.html

@ -536,10 +536,10 @@
</div> </div>
<div class="glyph fs4"> <div class="glyph fs4">
<div class="clearfix bshadow0 pbs"> <div class="clearfix bshadow0 pbs">
<span class="icon-control-Textarea"> <span class="icon-control-TextArea">
</span> </span>
<span class="mls"> icon-control-Textarea</span> <span class="mls"> icon-control-TextArea</span>
</div> </div>
<fieldset class="fs0 size1of1 clearfix hidden-false"> <fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e90e" class="unit size1of2" /> <input type="text" readonly value="e90e" class="unit size1of2" />

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

Binary file not shown.

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

@ -21,7 +21,7 @@
<glyph unicode="&#xe90b;" glyph-name="control-Dropdown" d="M51.2 960c-28.262 0-51.2-22.938-51.2-51.2v-281.6c0-28.262 22.938-51.2 51.2-51.2h921.6c28.262 0 51.2 22.938 51.2 51.2v281.6c0 28.262-22.938 51.2-51.2 51.2h-921.6zM76.8 908.8h512v-281.6h-512c-14.157 0-25.6 11.443-25.6 25.6v230.4c0 14.157 11.443 25.6 25.6 25.6zM640 908.8h307.2c14.157 0 25.6-11.443 25.6-25.6v-230.4c0-14.157-11.443-25.6-25.6-25.6h-307.2v281.6zM716.8 806.4c-0.41-0.358 89.139-102.938 89.6-102.4 0.512 0 89.6 95.36 89.6 102.4 0-0.384-172.16 0-179.2 0zM128 524.8c-42.394 0-76.8-34.406-76.8-76.8s34.406-76.8 76.8-76.8c42.394 0 76.8 34.406 76.8 76.8s-34.406 76.8-76.8 76.8zM128 473.6c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6zM307.2 473.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h640c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-640zM128 320c-42.394 0-76.8-34.381-76.8-76.8s34.406-76.8 76.8-76.8c42.394 0 76.8 34.381 76.8 76.8s-34.406 76.8-76.8 76.8zM128 268.8c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6zM307.2 268.8c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h640c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-640zM128 115.2c-42.394 0-76.8-34.381-76.8-76.8s34.406-76.8 76.8-76.8c42.394 0 76.8 34.381 76.8 76.8s-34.406 76.8-76.8 76.8zM128 64c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6zM307.2 64c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h640c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-640z" /> <glyph unicode="&#xe90b;" glyph-name="control-Dropdown" d="M51.2 960c-28.262 0-51.2-22.938-51.2-51.2v-281.6c0-28.262 22.938-51.2 51.2-51.2h921.6c28.262 0 51.2 22.938 51.2 51.2v281.6c0 28.262-22.938 51.2-51.2 51.2h-921.6zM76.8 908.8h512v-281.6h-512c-14.157 0-25.6 11.443-25.6 25.6v230.4c0 14.157 11.443 25.6 25.6 25.6zM640 908.8h307.2c14.157 0 25.6-11.443 25.6-25.6v-230.4c0-14.157-11.443-25.6-25.6-25.6h-307.2v281.6zM716.8 806.4c-0.41-0.358 89.139-102.938 89.6-102.4 0.512 0 89.6 95.36 89.6 102.4 0-0.384-172.16 0-179.2 0zM128 524.8c-42.394 0-76.8-34.406-76.8-76.8s34.406-76.8 76.8-76.8c42.394 0 76.8 34.406 76.8 76.8s-34.406 76.8-76.8 76.8zM128 473.6c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6zM307.2 473.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h640c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-640zM128 320c-42.394 0-76.8-34.381-76.8-76.8s34.406-76.8 76.8-76.8c42.394 0 76.8 34.381 76.8 76.8s-34.406 76.8-76.8 76.8zM128 268.8c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6zM307.2 268.8c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h640c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-640zM128 115.2c-42.394 0-76.8-34.381-76.8-76.8s34.406-76.8 76.8-76.8c42.394 0 76.8 34.381 76.8 76.8s-34.406 76.8-76.8 76.8zM128 64c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6zM307.2 64c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h640c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-640z" />
<glyph unicode="&#xe90c;" glyph-name="control-Input" d="M512 960c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h128v-870.4h-128c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h307.2c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-128v870.4h128c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-307.2zM51.2 755.2c-28.262 0-51.2-22.938-51.2-51.2v-460.8c0-28.262 22.938-51.2 51.2-51.2h537.6v51.2h-512c-14.131 0-25.6 11.443-25.6 25.6v409.6c0 14.157 11.469 25.6 25.6 25.6h512v51.2h-537.6zM742.4 755.2v-51.2h204.8c14.157 0 25.6-11.443 25.6-25.6v-409.6c0-14.157-11.443-25.6-25.6-25.6h-204.8v-51.2h230.4c28.262 0 51.2 22.938 51.2 51.2v460.8c0 28.262-22.938 51.2-51.2 51.2h-230.4zM285.9 653c-0.589-0.051-1.161-0.048-1.75-0.15-8.243-0.051-16.396-4.474-20.85-13.050l-132.55-306.25c-6.656-12.749-2.866-28.981 8.5-36.2 11.341-7.219 25.97-2.749 32.6 10l27.65 63.85h170.5c0.512 0 0.914 0.224 1.4 0.25l27.45-64.050c6.63-12.749 21.136-17.269 32.4-10.050s15.005 23.451 8.4 36.2l-131.3 306.25c-4.454 8.576-12.432 12.973-20.65 13.050-0.614 0.102-1.211 0.099-1.8 0.15zM285.9 570.85l63.65-148.45h-127.9l64.25 148.45z" /> <glyph unicode="&#xe90c;" glyph-name="control-Input" d="M512 960c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h128v-870.4h-128c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h307.2c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-128v870.4h128c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-307.2zM51.2 755.2c-28.262 0-51.2-22.938-51.2-51.2v-460.8c0-28.262 22.938-51.2 51.2-51.2h537.6v51.2h-512c-14.131 0-25.6 11.443-25.6 25.6v409.6c0 14.157 11.469 25.6 25.6 25.6h512v51.2h-537.6zM742.4 755.2v-51.2h204.8c14.157 0 25.6-11.443 25.6-25.6v-409.6c0-14.157-11.443-25.6-25.6-25.6h-204.8v-51.2h230.4c28.262 0 51.2 22.938 51.2 51.2v460.8c0 28.262-22.938 51.2-51.2 51.2h-230.4zM285.9 653c-0.589-0.051-1.161-0.048-1.75-0.15-8.243-0.051-16.396-4.474-20.85-13.050l-132.55-306.25c-6.656-12.749-2.866-28.981 8.5-36.2 11.341-7.219 25.97-2.749 32.6 10l27.65 63.85h170.5c0.512 0 0.914 0.224 1.4 0.25l27.45-64.050c6.63-12.749 21.136-17.269 32.4-10.050s15.005 23.451 8.4 36.2l-131.3 306.25c-4.454 8.576-12.432 12.973-20.65 13.050-0.614 0.102-1.211 0.099-1.8 0.15zM285.9 570.85l63.65-148.45h-127.9l64.25 148.45z" />
<glyph unicode="&#xe90d;" glyph-name="control-Radio" d="M153.6 243.2c-84.787 0-153.6-68.813-153.6-153.6s68.813-153.6 153.6-153.6c84.787 0 153.6 68.813 153.6 153.6s-68.813 153.6-153.6 153.6zM153.6-12.8c-56.55 0-102.4 45.85-102.4 102.4s45.85 102.4 102.4 102.4c56.55 0 102.4-45.85 102.4-102.4s-45.85-102.4-102.4-102.4zM384 780.8h614.4c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-614.4c-14.131 0-25.6-11.443-25.6-25.6s11.469-25.6 25.6-25.6zM998.4 473.6h-614.4c-14.131 0-25.6-11.443-25.6-25.6s11.469-25.6 25.6-25.6h614.4c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6zM153.6 960c-84.787 0-153.6-68.787-153.6-153.6s68.813-153.6 153.6-153.6c84.787 0 153.6 68.787 153.6 153.6s-68.813 153.6-153.6 153.6zM153.6 704c-56.55 0-102.4 45.85-102.4 102.4s45.85 102.4 102.4 102.4c56.55 0 102.4-45.85 102.4-102.4s-45.85-102.4-102.4-102.4zM153.6 601.6c-84.787 0-153.6-68.787-153.6-153.6 0-84.787 68.813-153.6 153.6-153.6s153.6 68.813 153.6 153.6c0 84.813-68.813 153.6-153.6 153.6zM153.6 345.6c-56.55 0-102.4 45.85-102.4 102.4s45.85 102.4 102.4 102.4c56.55 0 102.4-45.85 102.4-102.4s-45.85-102.4-102.4-102.4zM153.6 857.6c-28.262 0-51.2-22.938-51.2-51.2s22.938-51.2 51.2-51.2c28.262 0 51.2 22.938 51.2 51.2s-22.938 51.2-51.2 51.2zM998.4 115.2h-614.4c-14.131 0-25.6-11.443-25.6-25.6s11.469-25.6 25.6-25.6h614.4c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6z" /> <glyph unicode="&#xe90d;" glyph-name="control-Radio" d="M153.6 243.2c-84.787 0-153.6-68.813-153.6-153.6s68.813-153.6 153.6-153.6c84.787 0 153.6 68.813 153.6 153.6s-68.813 153.6-153.6 153.6zM153.6-12.8c-56.55 0-102.4 45.85-102.4 102.4s45.85 102.4 102.4 102.4c56.55 0 102.4-45.85 102.4-102.4s-45.85-102.4-102.4-102.4zM384 780.8h614.4c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-614.4c-14.131 0-25.6-11.443-25.6-25.6s11.469-25.6 25.6-25.6zM998.4 473.6h-614.4c-14.131 0-25.6-11.443-25.6-25.6s11.469-25.6 25.6-25.6h614.4c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6zM153.6 960c-84.787 0-153.6-68.787-153.6-153.6s68.813-153.6 153.6-153.6c84.787 0 153.6 68.787 153.6 153.6s-68.813 153.6-153.6 153.6zM153.6 704c-56.55 0-102.4 45.85-102.4 102.4s45.85 102.4 102.4 102.4c56.55 0 102.4-45.85 102.4-102.4s-45.85-102.4-102.4-102.4zM153.6 601.6c-84.787 0-153.6-68.787-153.6-153.6 0-84.787 68.813-153.6 153.6-153.6s153.6 68.813 153.6 153.6c0 84.813-68.813 153.6-153.6 153.6zM153.6 345.6c-56.55 0-102.4 45.85-102.4 102.4s45.85 102.4 102.4 102.4c56.55 0 102.4-45.85 102.4-102.4s-45.85-102.4-102.4-102.4zM153.6 857.6c-28.262 0-51.2-22.938-51.2-51.2s22.938-51.2 51.2-51.2c28.262 0 51.2 22.938 51.2 51.2s-22.938 51.2-51.2 51.2zM998.4 115.2h-614.4c-14.131 0-25.6-11.443-25.6-25.6s11.469-25.6 25.6-25.6h614.4c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6z" />
<glyph unicode="&#xe90e;" glyph-name="control-Textarea" d="M0 960v-204.8h76.8v-76.8h51.2v76.8h76.8v204.8h-204.8zM819.2 960v-204.8h204.8v204.8h-204.8zM51.2 908.8h102.4v-102.4h-102.4v102.4zM870.4 908.8h102.4v-102.4h-102.4v102.4zM281.6 883.2v-51.2h102.4v51.2h-102.4zM486.4 883.2v-51.2h102.4v51.2h-102.4zM691.2 883.2v-51.2h102.4v51.2h-102.4zM333.25 755.2c-7.091 0.307-14.348-2.097-19.75-7.55l-74.75-74.75c-10.317-10.291-10.317-27.083 0-37.4s27.059-10.317 37.35 0l68.45 68.5h141.85v-486.4h-50.7c-7.117 0.307-14.348-2.097-19.75-7.55l-23.6-23.55c-10.317-10.317-10.317-27.083 0-37.4 10.291-10.317 27.109-10.317 37.4 0l17.25 17.3h129.75l18.050-18c10.394-10.368 27.181-10.368 37.6 0 10.368 10.394 10.368 27.181 0 37.6l-24 24c-5.478 5.478-12.682 7.907-19.85 7.6h-50.95v486.4h141.55l69.25-69.2c10.394-10.368 27.155-10.368 37.6 0 10.368 10.368 10.368 27.181 0 37.6l-75.2 75.2c-5.478 5.478-12.706 7.907-19.9 7.6h-357.65zM896 678.4v-102.4h51.2v102.4h-51.2zM76.8 576v-102.4h51.2v102.4h-51.2zM896 473.6v-102.4h51.2v102.4h-51.2zM76.8 371.2v-102.4h51.2v102.4h-51.2zM896 268.8v-102.4h51.2v102.4h-51.2zM76.8 166.4v-25.6h-76.8v-204.8h204.8v76.8h76.8v51.2h-76.8v76.8h-76.8v25.6h-51.2zM819.2 140.8v-76.8h-25.6v-51.2h25.6v-76.8h204.8v204.8h-204.8zM51.2 89.6h102.4v-102.4h-102.4v102.4zM870.4 89.6h102.4v-102.4h-102.4v102.4zM384 64v-51.2h102.4v51.2h-102.4zM588.8 64v-51.2h102.4v51.2h-102.4z" /> <glyph unicode="&#xe90e;" glyph-name="control-TextArea" d="M0 960v-204.8h76.8v-76.8h51.2v76.8h76.8v204.8h-204.8zM819.2 960v-204.8h204.8v204.8h-204.8zM51.2 908.8h102.4v-102.4h-102.4v102.4zM870.4 908.8h102.4v-102.4h-102.4v102.4zM281.6 883.2v-51.2h102.4v51.2h-102.4zM486.4 883.2v-51.2h102.4v51.2h-102.4zM691.2 883.2v-51.2h102.4v51.2h-102.4zM333.25 755.2c-7.091 0.307-14.348-2.097-19.75-7.55l-74.75-74.75c-10.317-10.291-10.317-27.083 0-37.4s27.059-10.317 37.35 0l68.45 68.5h141.85v-486.4h-50.7c-7.117 0.307-14.348-2.097-19.75-7.55l-23.6-23.55c-10.317-10.317-10.317-27.083 0-37.4 10.291-10.317 27.109-10.317 37.4 0l17.25 17.3h129.75l18.050-18c10.394-10.368 27.181-10.368 37.6 0 10.368 10.394 10.368 27.181 0 37.6l-24 24c-5.478 5.478-12.682 7.907-19.85 7.6h-50.95v486.4h141.55l69.25-69.2c10.394-10.368 27.155-10.368 37.6 0 10.368 10.368 10.368 27.181 0 37.6l-75.2 75.2c-5.478 5.478-12.706 7.907-19.9 7.6h-357.65zM896 678.4v-102.4h51.2v102.4h-51.2zM76.8 576v-102.4h51.2v102.4h-51.2zM896 473.6v-102.4h51.2v102.4h-51.2zM76.8 371.2v-102.4h51.2v102.4h-51.2zM896 268.8v-102.4h51.2v102.4h-51.2zM76.8 166.4v-25.6h-76.8v-204.8h204.8v76.8h76.8v51.2h-76.8v76.8h-76.8v25.6h-51.2zM819.2 140.8v-76.8h-25.6v-51.2h25.6v-76.8h204.8v204.8h-204.8zM51.2 89.6h102.4v-102.4h-102.4v102.4zM870.4 89.6h102.4v-102.4h-102.4v102.4zM384 64v-51.2h102.4v51.2h-102.4zM588.8 64v-51.2h102.4v51.2h-102.4z" />
<glyph unicode="&#xe90f;" glyph-name="control-Toggle" d="M332.8 934.4c-127.258 0-230.4-103.142-230.4-230.4s103.142-230.4 230.4-230.4h358.4c127.258 0 230.4 103.142 230.4 230.4s-103.142 230.4-230.4 230.4h-358.4zM332.8 883.2h358.4c98.97 0 179.2-80.23 179.2-179.2s-80.23-179.2-179.2-179.2h-358.4c-98.97 0-179.2 80.23-179.2 179.2s80.23 179.2 179.2 179.2zM332.8 832c-70.707 0-128-57.293-128-128s57.293-128 128-128c70.707 0 128 57.293 128 128s-57.293 128-128 128zM332.8 780.8c42.419 0 76.8-34.381 76.8-76.8s-34.381-76.8-76.8-76.8c-42.419 0-76.8 34.381-76.8 76.8s34.381 76.8 76.8 76.8zM332.8 422.4c-127.258 0-230.4-103.142-230.4-230.4s103.142-230.4 230.4-230.4h358.4c127.258 0 230.4 103.142 230.4 230.4s-103.142 230.4-230.4 230.4h-358.4zM332.8 371.2h358.4c98.97 0 179.2-80.23 179.2-179.2s-80.23-179.2-179.2-179.2h-358.4c-98.97 0-179.2 80.23-179.2 179.2s80.23 179.2 179.2 179.2zM691.2 320c-70.707 0-128-57.293-128-128s57.293-128 128-128c70.707 0 128 57.293 128 128s-57.293 128-128 128zM691.2 268.8c42.419 0 76.8-34.381 76.8-76.8s-34.381-76.8-76.8-76.8c-42.419 0-76.8 34.381-76.8 76.8s34.381 76.8 76.8 76.8z" /> <glyph unicode="&#xe90f;" glyph-name="control-Toggle" d="M332.8 934.4c-127.258 0-230.4-103.142-230.4-230.4s103.142-230.4 230.4-230.4h358.4c127.258 0 230.4 103.142 230.4 230.4s-103.142 230.4-230.4 230.4h-358.4zM332.8 883.2h358.4c98.97 0 179.2-80.23 179.2-179.2s-80.23-179.2-179.2-179.2h-358.4c-98.97 0-179.2 80.23-179.2 179.2s80.23 179.2 179.2 179.2zM332.8 832c-70.707 0-128-57.293-128-128s57.293-128 128-128c70.707 0 128 57.293 128 128s-57.293 128-128 128zM332.8 780.8c42.419 0 76.8-34.381 76.8-76.8s-34.381-76.8-76.8-76.8c-42.419 0-76.8 34.381-76.8 76.8s34.381 76.8 76.8 76.8zM332.8 422.4c-127.258 0-230.4-103.142-230.4-230.4s103.142-230.4 230.4-230.4h358.4c127.258 0 230.4 103.142 230.4 230.4s-103.142 230.4-230.4 230.4h-358.4zM332.8 371.2h358.4c98.97 0 179.2-80.23 179.2-179.2s-80.23-179.2-179.2-179.2h-358.4c-98.97 0-179.2 80.23-179.2 179.2s80.23 179.2 179.2 179.2zM691.2 320c-70.707 0-128-57.293-128-128s57.293-128 128-128c70.707 0 128 57.293 128 128s-57.293 128-128 128zM691.2 268.8c42.419 0 76.8-34.381 76.8-76.8s-34.381-76.8-76.8-76.8c-42.419 0-76.8 34.381-76.8 76.8s34.381 76.8 76.8 76.8z" />
<glyph unicode="&#xe910;" glyph-name="copy" d="M204.8 908.8c-56.525 0-102.4-45.875-102.4-102.4v-512c0-56.525 45.875-102.4 102.4-102.4h409.6c56.525 0 102.4 45.875 102.4 102.4v512c0 56.525-45.875 102.4-102.4 102.4h-409.6zM204.8 857.6h409.6c28.262 0 51.2-22.886 51.2-51.2v-512c0-28.314-22.938-51.2-51.2-51.2h-409.6c-28.262 0-51.2 22.886-51.2 51.2v512c0 28.314 22.938 51.2 51.2 51.2zM768 755.2v-51.2c28.262 0 51.2-22.886 51.2-51.2v-512c0-28.314-22.938-51.2-51.2-51.2h-409.6c-28.262 0-51.2 22.886-51.2 51.2h-51.2c0-56.525 45.875-102.4 102.4-102.4h409.6c56.525 0 102.4 45.875 102.4 102.4v512c0 56.525-45.875 102.4-102.4 102.4z" /> <glyph unicode="&#xe910;" glyph-name="copy" d="M204.8 908.8c-56.525 0-102.4-45.875-102.4-102.4v-512c0-56.525 45.875-102.4 102.4-102.4h409.6c56.525 0 102.4 45.875 102.4 102.4v512c0 56.525-45.875 102.4-102.4 102.4h-409.6zM204.8 857.6h409.6c28.262 0 51.2-22.886 51.2-51.2v-512c0-28.314-22.938-51.2-51.2-51.2h-409.6c-28.262 0-51.2 22.886-51.2 51.2v512c0 28.314 22.938 51.2 51.2 51.2zM768 755.2v-51.2c28.262 0 51.2-22.886 51.2-51.2v-512c0-28.314-22.938-51.2-51.2-51.2h-409.6c-28.262 0-51.2 22.886-51.2 51.2h-51.2c0-56.525 45.875-102.4 102.4-102.4h409.6c56.525 0 102.4 45.875 102.4 102.4v512c0 56.525-45.875 102.4-102.4 102.4z" />
<glyph unicode="&#xe911;" glyph-name="dashboard" d="M882.534 89.6h-792.243c-56.653 79.514-90.291 176.538-90.291 281.6 0 268.621 217.779 486.4 486.4 486.4s486.4-217.779 486.4-486.4c0-105.062-33.638-202.086-90.266-281.6zM512 805.146v-49.946h-51.2v49.946c-219.827-12.826-395.494-188.493-408.32-408.346h49.92v-51.2h-50.278c4.429-75.008 27.981-144.742 65.664-204.8h737.203c37.709 60.058 61.261 129.792 65.664 204.8h-50.253v51.2h49.894c-12.826 219.853-188.467 395.52-408.294 408.346zM486.4 243.2c-42.419 0-76.8 34.381-76.8 76.8s34.381 332.8 76.8 332.8c42.419 0 76.8-290.381 76.8-332.8s-34.381-76.8-76.8-76.8zM486.4 448c-14.131 0-25.6-113.843-25.6-128s11.469-25.6 25.6-25.6c14.157 0 25.6 11.443 25.6 25.6s-11.443 128-25.6 128z" /> <glyph unicode="&#xe911;" glyph-name="dashboard" d="M882.534 89.6h-792.243c-56.653 79.514-90.291 176.538-90.291 281.6 0 268.621 217.779 486.4 486.4 486.4s486.4-217.779 486.4-486.4c0-105.062-33.638-202.086-90.266-281.6zM512 805.146v-49.946h-51.2v49.946c-219.827-12.826-395.494-188.493-408.32-408.346h49.92v-51.2h-50.278c4.429-75.008 27.981-144.742 65.664-204.8h737.203c37.709 60.058 61.261 129.792 65.664 204.8h-50.253v51.2h49.894c-12.826 219.853-188.467 395.52-408.294 408.346zM486.4 243.2c-42.419 0-76.8 34.381-76.8 76.8s34.381 332.8 76.8 332.8c42.419 0 76.8-290.381 76.8-332.8s-34.381-76.8-76.8-76.8zM486.4 448c-14.131 0-25.6-113.843-25.6-128s11.469-25.6 25.6-25.6c14.157 0 25.6 11.443 25.6 25.6s-11.443 128-25.6 128z" />

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 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.

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

@ -905,7 +905,7 @@
"properties": { "properties": {
"order": 17, "order": 17,
"id": 26, "id": 26,
"name": "control-Textarea", "name": "control-TextArea",
"prevSize": 32, "prevSize": 32,
"code": 59662 "code": 59662
}, },

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

@ -1,10 +1,10 @@
@font-face { @font-face {
font-family: 'icomoon'; font-family: 'icomoon';
src: url('fonts/icomoon.eot?8vtvuo'); src: url('fonts/icomoon.eot?y0t7c1');
src: url('fonts/icomoon.eot?8vtvuo#iefix') format('embedded-opentype'), src: url('fonts/icomoon.eot?y0t7c1#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?8vtvuo') format('truetype'), url('fonts/icomoon.ttf?y0t7c1') format('truetype'),
url('fonts/icomoon.woff?8vtvuo') format('woff'), url('fonts/icomoon.woff?y0t7c1') format('woff'),
url('fonts/icomoon.svg?8vtvuo#icomoon') format('svg'); url('fonts/icomoon.svg?y0t7c1#icomoon') format('svg');
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }
@ -120,7 +120,7 @@
.icon-control-Radio:before { .icon-control-Radio:before {
content: "\e90d"; content: "\e90d";
} }
.icon-control-Textarea:before { .icon-control-TextArea:before {
content: "\e90e"; content: "\e90e";
} }
.icon-control-Toggle:before { .icon-control-Toggle:before {

Loading…
Cancel
Save