Merge pull request #4 from Myxelium/re-style

Re-style and re-organize
This commit is contained in:
2024-10-28 01:17:14 +01:00
committed by GitHub
25 changed files with 330 additions and 229 deletions

View File

@@ -1,5 +1,7 @@
<app-header></app-header>
<div class="main-content">
<router-outlet></router-outlet>
<div class="darkmode">
<app-header></app-header>
<div class="main-content">
<router-outlet></router-outlet>
</div>
<app-footer></app-footer>
</div>
<app-footer></app-footer>

View File

@@ -2,3 +2,21 @@
display: flex;
justify-content: center;
}
::ng-deep {
.p-panel {
border-radius: unset !important;
}
.p-panel-header {
background: unset !important;
}
.p-fileupload-header {
background: unset !important;
}
.p-fileupload {
background: unset !important;
}
}

View File

@@ -16,6 +16,9 @@ export class AppComponent {
title = 'tools';
constructor(private config: PrimeNGConfig) {
this.config.theme.set({ preset: Lara });
this.config.theme.set({
preset: Lara,
darkModeSelector: '.darkmode'
});
}
}

View File

@@ -7,7 +7,7 @@ import { TextToCronComponent } from '../tools/client-side/text-to-cron/text-to-c
import { DdsToPngComponent } from '../tools/client-side/dds-to-png/dds-to-png.component';
import { ImageConverterComponent } from '../tools/server-side/image-converter/image-converter.component';
import { WordCounterComponent } from '../tools/client-side/word-counter/word-counter.component';
import { ColorPickerComponent } from '../tools/client-side/color-picker/color-picker/color-picker.component';
import { ColorPickerComponent } from '../tools/client-side/color-picker/color-picker.component';
export const routes: Routes = [
{

View File

@@ -1,5 +1,5 @@
<p-megamenu [model]="items">
<ng-template pTemplate="start">
<img class="logotype" src="../../assets/logo-full-orange-beta.png" alt="logo" />
<img [ngClass]="{'logotype': true, 'darkMode': !isDarkMode}" src="../../assets/logo-full-orange-beta.png" alt="logo" />
</ng-template>
</p-megamenu>

View File

@@ -1,3 +1,12 @@
.logotype {
width: 140px;
}
.darkMode {
filter: invert(1);
}
::ng-deep .p-megamenu-col-12 {
flex-direction: row !important;
display: flex !important;
}

View File

@@ -8,27 +8,26 @@ import { AvatarModule } from 'primeng/avatar';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss'],
styleUrls: ['./header.component.scss'],
standalone: true,
imports: [MegaMenuModule, ButtonModule, CommonModule, AvatarModule]
})
export class HeaderComponent implements OnInit {
items: MegaMenuItem[] | undefined;
isDarkMode: boolean = true;
ngOnInit() {
this.isDarkMode = window?.matchMedia?.('(prefers-color-scheme:dark)')?.matches;
this.items = [
{
label: 'Text Tools',
icon: 'pi pi-box',
label: 'Tools',
icon: 'pi pi-wrench',
items: [
[
{
label: 'Text Tools',
items: [
{
label: 'Ascii to text',
routerLink: 'ascii-to-text',
routerLinkActiveOptions: { exact: true }
},
{
label: 'Text counter',
routerLink: 'text-counter',
@@ -39,11 +38,6 @@ export class HeaderComponent implements OnInit {
routerLink: 'guid',
routerLinkActiveOptions: { exact: true }
},
{
label: 'Base64 Converter',
routerLink: 'base64-converter',
routerLinkActiveOptions: { exact: true }
},
{
label: 'Jwt decoder',
routerLink: 'jwt-decoder',
@@ -53,14 +47,18 @@ export class HeaderComponent implements OnInit {
label: 'Text to Cron Expression',
routerLink: 'text-to-cron',
routerLinkActiveOptions: { exact: true }
},
{
label: 'Color picker',
routerLink: 'color-picker',
routerLinkActiveOptions: { exact: true }
}
],
},
{
label: 'Media Tools',
items: [
{
label: 'Color picker',
routerLink: 'color-picker',
routerLinkActiveOptions: { exact: true }
}
]
}
]
]
@@ -71,6 +69,7 @@ export class HeaderComponent implements OnInit {
items: [
[
{
label: 'Convert',
items: [
{
label: 'DDS to PNG',
@@ -81,6 +80,16 @@ export class HeaderComponent implements OnInit {
label: 'Image Converter',
routerLink: 'image-converter',
routerLinkActiveOptions: { exact: true }
},
{
label: 'Base64 Converter',
routerLink: 'base64-converter',
routerLinkActiveOptions: { exact: true }
},
{
label: 'Ascii to text',
routerLink: 'ascii-to-text',
routerLinkActiveOptions: { exact: true }
}
]
}

View File

@@ -1,24 +1,22 @@
<div class="card flex justify-center">
<p-panel [header]="title">
<ng-template pTemplate="header">
<p-tag *ngIf="isBeta" severity="warn" value="Beta"></p-tag>
</ng-template>
<textarea
(keyup)="onTopChange($event)"
[disabled]="topDisabled"
pTextarea
[value]="topValue"
[placeholder]="topPlaceholder">
</textarea>
<div class="icon">
<i class="pi pi-arrow-right-arrow-left" style="font-size: 1rem"></i>
</div>
<textarea
(keyup)="onBottomChange($event)"
[disabled]="bottomDisabled"
pTextarea
[value]="bottomValue"
[placeholder]="bottomPlaceholder">
</textarea>
</p-panel>
</div>
<page [header]="title">
<ng-template pTemplate="header">
<p-tag *ngIf="isBeta" severity="warn" value="Beta"></p-tag>
</ng-template>
<textarea
(keyup)="onTopChange($event)"
[disabled]="topDisabled"
pTextarea
[value]="topValue"
[placeholder]="topPlaceholder">
</textarea>
<div class="icon">
<i class="pi pi-arrow-right-arrow-left" style="font-size: 1rem"></i>
</div>
<textarea
(keyup)="onBottomChange($event)"
[disabled]="bottomDisabled"
pTextarea
[value]="bottomValue"
[placeholder]="bottomPlaceholder">
</textarea>
</page>

View File

@@ -1,62 +1,49 @@
:host {
.icon {
display: flex;
flex-direction: row;
justify-content: center;
padding: 5px;
background-color: var(--primary-contrast);
i {
transform: rotate(90deg);
}
}
.wrapper {
display: flex;
justify-content: center;
margin-top: 20px;
width: 96vw;
flex-direction: column;
width: 1140px;
.icon {
display: flex;
flex-direction: row;
justify-content: center;
padding: 5px;
background-color: var(--primary-contrast);
i {
transform: rotate(90deg);
}
}
.card {
.conversion {
justify-content: center;
display: flex;
flex-direction: column;
width: 1140px;
}
align-items: center;
height: 70vh;
.wrapper {
display: flex;
flex-direction: column;
width: 1140px;
.conversion {
justify-content: center;
display: flex;
align-items: center;
height: 70vh;
p-floatlabel {
width: 30vw;
}
}
}
textarea {
width: 100%;
height: 175px;
padding: 12px 20px;
box-sizing: border-box;
border-radius: 4px;
font-size: 16px;
resize: none;
background-color: var(--primary-contrast);
color: var(--text-color)
}
::ng-deep .p-panel-header {
justify-content: unset !important;
* {
margin-right: 5px;
p-floatlabel {
width: 30vw;
}
}
}
textarea {
width: 100%;
height: 175px;
padding: 12px 20px;
box-sizing: border-box;
border-radius: 4px;
font-size: 16px;
resize: none;
background-color: var(--primary-contrast);
color: var(--text-color)
}
::ng-deep .p-panel-header {
justify-content: unset !important;
* {
margin-right: 5px;
}
}

View File

@@ -5,6 +5,7 @@ import { FloatLabelModule } from 'primeng/floatlabel';
import { InputTextareaModule } from 'primeng/inputtextarea';
import { PanelModule } from 'primeng/panel';
import { TagModule } from 'primeng/tag';
import { PageComponent } from '../page/page.component';
@Component({
selector: 'app-dual-textarea',
@@ -17,7 +18,8 @@ import { TagModule } from 'primeng/tag';
FormsModule,
PanelModule,
CommonModule,
TagModule
TagModule,
PageComponent
]
})

View File

@@ -0,0 +1,5 @@
<div class="card">
<p-panel [header]="header">
<ng-content></ng-content>
</p-panel>
</div>

View File

@@ -0,0 +1,20 @@
:host {
display: flex;
justify-content: center;
margin-top: 20px;
width: 96vw;
.card {
display: flex;
flex-direction: column;
width: 1140px;
}
::ng-deep .p-panel-header {
justify-content: unset !important;
* {
margin-right: 5px;
}
}
}

View File

@@ -0,0 +1,28 @@
/* tslint:disable:no-unused-variable */
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { PageComponent } from './page.component';
describe('PageComponent', () => {
let component: PageComponent;
let fixture: ComponentFixture<PageComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ PageComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(PageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,13 @@
import { Component, Input, OnInit } from '@angular/core';
import { PanelModule } from 'primeng/panel';
@Component({
selector: 'page',
templateUrl: './page.component.html',
styleUrls: ['./page.component.scss'],
standalone: true,
imports: [PanelModule]
})
export class PageComponent {
@Input() header: string = '';
}

View File

@@ -1,76 +1,74 @@
<div class="card flex justify-center">
<p-panel [header]="title">
<ng-template pTemplate="header">
<p-tag *ngIf="isBeta" severity="warn" value="Beta"></p-tag>
</ng-template>
<page [header]="title">
<ng-template pTemplate="header">
<p-tag *ngIf="isBeta" severity="warn" value="Beta"></p-tag>
</ng-template>
<p-fileUpload
name="file"
(onSelect)="onFileSelect($event)"
[auto]="true"
[accept]="accept"
[previewWidth]="isPreview ? '50px' : '0px'"
mode="advanced"
[url]="url"
[withCredentials]="true"
[method]="method"
[headers]="requestHeaders"
>
<ng-template
*ngIf="fileTypeSelector"
pTemplate="header"
let-files
let-chooseCallback="chooseCallback"
let-clearCallback="clearCallback"
let-uploadCallback="uploadCallback"
>
<p-button
(onClick)="choose($event, chooseCallback)"
icon="pi pi-images"
[rounded]="true"
[outlined]="true"
/>
<p-autoComplete
*ngIf="fileTypeSelector"
(onSelect)="onAutoCompleteDropdownClick($event)"
[virtualScroll]="true"
[suggestions]="filteredFiles"
[virtualScrollItemSize]="34"
(completeMethod)="onAutoComplete($event)"
optionLabel="name"
[dropdown]="true"
placeholder="Select a output format"
/>
<p-button
(onClick)="onUploadEvent()"
icon="pi pi-file-arrow-up"
[rounded]="true"
[outlined]="true"
<p-fileUpload
name="file"
(onSelect)="onFileSelect($event)"
[auto]="true"
[accept]="accept"
[previewWidth]="isPreview ? '50px' : '0px'"
mode="advanced"
[url]="url"
[withCredentials]="true"
[method]="method"
[headers]="requestHeaders"
>
<ng-template
*ngIf="fileTypeSelector"
pTemplate="header"
let-files
let-chooseCallback="chooseCallback"
let-clearCallback="clearCallback"
let-uploadCallback="uploadCallback"
>
<p-button
(onClick)="choose($event, chooseCallback)"
icon="pi pi-images"
[rounded]="true"
[outlined]="true"
/>
</ng-template>
<ng-template *ngIf="fileTypeSelector" pTemplate="empty">
<div>Drag and drop files to here to upload.</div>
</ng-template>
<p-autoComplete
*ngIf="fileTypeSelector"
(onSelect)="onAutoCompleteDropdownClick($event)"
[virtualScroll]="true"
[suggestions]="filteredFiles"
[virtualScrollItemSize]="34"
(completeMethod)="onAutoComplete($event)"
optionLabel="name"
[dropdown]="true"
placeholder="Select a output format"
/>
</p-fileUpload>
<p-table [value]="processedFiles" *ngIf="processedFiles.length != 0">
<ng-template pTemplate="header">
<tr>
<th>Name</th>
<th>Format</th>
<th>Download</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-file>
<tr>
<td>{{file.name}}</td>
<td>{{file.format}}</td>
<td><a [href]="file.link" [download]="file.name">{{file.name}}</a></td>
</tr>
</ng-template>
</p-table>
</p-panel>
</div>
<p-button
(onClick)="onUploadEvent()"
icon="pi pi-file-arrow-up"
[rounded]="true"
[outlined]="true"
/>
</ng-template>
<ng-template *ngIf="fileTypeSelector" pTemplate="empty">
<div>Drag and drop files to here to upload.</div>
</ng-template>
</p-fileUpload>
<p-table [value]="processedFiles" *ngIf="processedFiles.length != 0">
<ng-template pTemplate="header">
<tr>
<th>Name</th>
<th>Format</th>
<th>Download</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-file>
<tr>
<td>{{file.name}}</td>
<td>{{file.format}}</td>
<td><a [href]="file.link" [download]="file.name">{{file.name}}</a></td>
</tr>
</ng-template>
</p-table>
</page>

View File

@@ -1,26 +1,13 @@
:host {
display: flex;
justify-content: center;
margin-top: 20px;
width: 96vw;
.card {
display: flex;
flex-direction: column;
width: 1140px;
}
.conversion {
display: flex;
justify-content: center;
margin-top: 1rem;
}
::ng-deep .p-panel-header {
justify-content: unset !important;
* {
margin-right: 5px;
}
}
.conversion {
display: flex;
justify-content: center;
margin-top: 1rem;
}
::ng-deep .p-panel-header {
justify-content: unset !important;
* {
margin-right: 5px;
}
}

View File

@@ -9,6 +9,7 @@ import { AutoCompleteCompleteEvent, AutoCompleteModule, AutoCompleteSelectEvent
import { BadgeModule } from 'primeng/badge';
import { HttpHeaders } from '@angular/common/http';
import { TagModule } from 'primeng/tag';
import { PageComponent } from '../page/page.component';
interface ProcessedFile {
name: string;
@@ -30,7 +31,8 @@ interface ProcessedFile {
TableModule,
AutoCompleteModule,
BadgeModule,
TagModule
TagModule,
PageComponent
]
})
export class FileConverterComponent implements OnInit {

View File

@@ -9,3 +9,17 @@ body .p-component
font-weight: 304;
font-style: normal;
}
* {
border-radius: unset !important;
}
.p-megamenu {
background: unset !important;
}
.p-megamenu-overlay {
background: var(--p-surface-800) !important;
border: unset !important;
border-radius: unset !important;
}

View File

@@ -0,0 +1,7 @@
<page header="Color Picker">
<div class="color-picker">
<label for="color-input">Choose Color:</label>
<input #colorPicker type="color" id="color-input" [formControl]="colorControl" (input)="onColorChange(colorPicker.value)" />
<input #colorText type="text" [formControl]="colorControl" (input)="onColorChange(colorText.value)" />
</div>
</page>

View File

@@ -0,0 +1,19 @@
.color-picker {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
.color-picker input[type="color"] {
width: 50px;
height: 50px;
border: none;
cursor: pointer;
}
.color-picker input[type="text"] {
padding: 5px;
font-size: 16px;
width: 100px;
}

View File

@@ -3,6 +3,7 @@ import { Component } from '@angular/core';
import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
import { ButtonModule } from 'primeng/button';
import { InputTextModule } from 'primeng/inputtext';
import { PageComponent } from '../../../app/shared/page/page.component';
@Component({
selector: 'app-color-picker',
@@ -12,7 +13,8 @@ import { InputTextModule } from 'primeng/inputtext';
FormsModule,
InputTextModule,
ButtonModule,
ReactiveFormsModule
ReactiveFormsModule,
PageComponent
],
templateUrl: './color-picker.component.html',
styleUrl: './color-picker.component.scss'

View File

@@ -1,5 +0,0 @@
<div class="color-picker">
<label for="color-input">Choose Color:</label>
<input #colorPicker type="color" id="color-input" [formControl]="colorControl" (input)="onColorChange(colorPicker.value)" />
<input #colorText type="text" [formControl]="colorControl" (input)="onColorChange(colorText.value)" />
</div>

View File

@@ -1,18 +0,0 @@
.color-picker {
display: flex;
align-items: center;
gap: 10px;
}
.color-picker input[type="color"] {
width: 50px;
height: 50px;
border: none;
cursor: pointer;
}
.color-picker input[type="text"] {
padding: 5px;
font-size: 16px;
width: 100px;
}

View File

@@ -1,3 +1,4 @@
<!-- Custom design, no page component -->
<p-panel header="Guid Generator">
<div>
<div *ngFor="let setting of settings" class="guid-row">