Refactor
This commit is contained in:
parent
b6aef2bcf8
commit
33051841f5
10 changed files with 32 additions and 39 deletions
|
|
@ -1,8 +0,0 @@
|
||||||
import { html } from '../types/html';
|
|
||||||
|
|
||||||
export const createElement = (from: html): HTMLElement => {
|
|
||||||
// won't work for all elements, eg.: <td>
|
|
||||||
const element: HTMLElement = document.createElement('div');
|
|
||||||
element.innerHTML = from;
|
|
||||||
return element.firstElementChild as HTMLElement;
|
|
||||||
};
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
import { createElement } from '../../helper/create-element';
|
|
||||||
import { getHeight } from '../../helper/get-height';
|
import { getHeight } from '../../helper/get-height';
|
||||||
import { mix } from '../../helper/mix';
|
import { mix } from '../../helper/mix';
|
||||||
import { Random } from '../../helper/random';
|
import { Random } from '../../helper/random';
|
||||||
|
|
@ -27,7 +26,7 @@ export class Background extends PageElement {
|
||||||
private readonly topOffsetElementCount: number,
|
private readonly topOffsetElementCount: number,
|
||||||
private readonly bottomOffsetElementCount: number
|
private readonly bottomOffsetElementCount: number
|
||||||
) {
|
) {
|
||||||
super(createElement(generate()));
|
super(generate());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected initialize() {
|
protected initialize() {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
import { createElement } from '../../helper/create-element';
|
|
||||||
import { ResponsiveImage } from '../../types/responsive-image';
|
import { ResponsiveImage } from '../../types/responsive-image';
|
||||||
import { Image } from '../image-viewer/image/image.html';
|
import { Image } from '../image-viewer/image/image.html';
|
||||||
import { PageElement } from '../page-element';
|
import { PageElement } from '../page-element';
|
||||||
|
|
@ -18,16 +17,14 @@ export class Header extends PageElement {
|
||||||
about: Array<string>;
|
about: Array<string>;
|
||||||
}) {
|
}) {
|
||||||
super(
|
super(
|
||||||
createElement(
|
generate({
|
||||||
generate({
|
name,
|
||||||
name,
|
about,
|
||||||
about,
|
photo: Image({
|
||||||
photo: Image({
|
image,
|
||||||
image,
|
alt: imageAltText,
|
||||||
alt: imageAltText,
|
}),
|
||||||
}),
|
})
|
||||||
})
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
this.attachElement(new ThemeSwitcher());
|
this.attachElement(new ThemeSwitcher());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
import { createElement } from '../../../helper/create-element';
|
|
||||||
import { PageElement } from '../../page-element';
|
import { PageElement } from '../../page-element';
|
||||||
import { generate } from './theme-switcher.html';
|
import { generate } from './theme-switcher.html';
|
||||||
|
|
||||||
|
|
@ -6,7 +5,7 @@ export class ThemeSwitcher extends PageElement {
|
||||||
private static readonly localStorageKey = 'dark-mode';
|
private static readonly localStorageKey = 'dark-mode';
|
||||||
|
|
||||||
public constructor() {
|
public constructor() {
|
||||||
super(createElement(generate()));
|
super(generate());
|
||||||
|
|
||||||
const storedIsDark = ThemeSwitcher.loadFromLocalStorage();
|
const storedIsDark = ThemeSwitcher.loadFromLocalStorage();
|
||||||
const isDark = storedIsDark ?? isSystemLevelDarkModeEnabled();
|
const isDark = storedIsDark ?? isSystemLevelDarkModeEnabled();
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
import { createElement } from '../../helper/create-element';
|
|
||||||
import { PageElement } from '../page-element';
|
import { PageElement } from '../page-element';
|
||||||
import { generate } from './image-viewer.html';
|
import { generate } from './image-viewer.html';
|
||||||
|
|
||||||
export class ImageViewer extends PageElement {
|
export class ImageViewer extends PageElement {
|
||||||
public constructor() {
|
public constructor() {
|
||||||
super(createElement(generate()));
|
super(generate());
|
||||||
|
|
||||||
document.body.addEventListener('click', (event: MouseEvent) => {
|
document.body.addEventListener('click', (event: MouseEvent) => {
|
||||||
const element = event.target as HTMLElement;
|
const element = event.target as HTMLElement;
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
import { createElement } from '../../helper/create-element';
|
|
||||||
import { PageElement } from '../page-element';
|
import { PageElement } from '../page-element';
|
||||||
import { generate } from './main.html';
|
import { generate } from './main.html';
|
||||||
|
|
||||||
export class Main extends PageElement {
|
export class Main extends PageElement {
|
||||||
constructor(...children: Array<PageElement | string>) {
|
constructor(...children: Array<PageElement | string>) {
|
||||||
const actualChildren = children.map((c) =>
|
const actualChildren = children.map((c) =>
|
||||||
c instanceof PageElement ? c : new PageElement(createElement(c))
|
c instanceof PageElement ? c : new PageElement(c)
|
||||||
);
|
);
|
||||||
super(createElement(generate()), actualChildren);
|
|
||||||
|
super(generate(), actualChildren);
|
||||||
actualChildren.forEach((c) => this.attachElement(c));
|
actualChildren.forEach((c) => this.attachElement(c));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,11 @@
|
||||||
|
import { html } from '../types/html';
|
||||||
|
|
||||||
export class PageElement {
|
export class PageElement {
|
||||||
public constructor(
|
public readonly htmlRoot: HTMLElement;
|
||||||
public readonly htmlRoot: HTMLElement,
|
|
||||||
protected children: Array<PageElement> = []
|
public constructor(content: html, protected children: Array<PageElement> = []) {
|
||||||
) {}
|
this.htmlRoot = PageElement.createElement(content);
|
||||||
|
}
|
||||||
|
|
||||||
public attachToDOM(target: HTMLElement) {
|
public attachToDOM(target: HTMLElement) {
|
||||||
target.appendChild(this.htmlRoot);
|
target.appendChild(this.htmlRoot);
|
||||||
|
|
@ -27,4 +30,11 @@ export class PageElement {
|
||||||
old.parentElement!.replaceChild(element.htmlRoot, old);
|
old.parentElement!.replaceChild(element.htmlRoot, old);
|
||||||
this.children.push(element);
|
this.children.push(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static createElement(from: html): HTMLElement {
|
||||||
|
// won't work for all elements, eg.: <td>
|
||||||
|
const element: HTMLElement = document.createElement('div');
|
||||||
|
element.innerHTML = from;
|
||||||
|
return element.firstElementChild as HTMLElement;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
import { createElement } from '../../helper/create-element';
|
|
||||||
import { ResponsiveImage } from '../../types/responsive-image';
|
import { ResponsiveImage } from '../../types/responsive-image';
|
||||||
import { PageElement } from '../page-element';
|
import { PageElement } from '../page-element';
|
||||||
import { generate } from './preview.html';
|
import { generate } from './preview.html';
|
||||||
|
|
||||||
export class Preview extends PageElement {
|
export class Preview extends PageElement {
|
||||||
public constructor(poster: ResponsiveImage, private readonly url: string, alt: string) {
|
public constructor(poster: ResponsiveImage, private readonly url: string, alt: string) {
|
||||||
super(createElement(generate({ poster, alt })));
|
super(generate({ poster, alt }));
|
||||||
this.url += '?portfolioView';
|
this.url += '?portfolioView';
|
||||||
this.query('.start-button').addEventListener('click', this.loadContent.bind(this));
|
this.query('.start-button').addEventListener('click', this.loadContent.bind(this));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
import { createElement } from '../../helper/create-element';
|
|
||||||
import { titleToFragment } from '../../helper/title-to-fragment';
|
import { titleToFragment } from '../../helper/title-to-fragment';
|
||||||
import { PageElement } from '../page-element';
|
import { PageElement } from '../page-element';
|
||||||
import { TimelineElementParameters } from './timeline-element-parameters';
|
import { TimelineElementParameters } from './timeline-element-parameters';
|
||||||
|
|
@ -13,7 +12,7 @@ export class TimelineElement extends PageElement {
|
||||||
private readonly showMore: string,
|
private readonly showMore: string,
|
||||||
private readonly showLess: string
|
private readonly showLess: string
|
||||||
) {
|
) {
|
||||||
super(createElement(generate(timelineElement, showMore)));
|
super(generate(timelineElement, showMore));
|
||||||
this.more = this.query('.more');
|
this.more = this.query('.more');
|
||||||
addEventListener('resize', this.handleResize.bind(this));
|
addEventListener('resize', this.handleResize.bind(this));
|
||||||
|
|
||||||
|
|
@ -23,7 +22,7 @@ export class TimelineElement extends PageElement {
|
||||||
'.figure',
|
'.figure',
|
||||||
timelineElement.figure instanceof PageElement
|
timelineElement.figure instanceof PageElement
|
||||||
? timelineElement.figure
|
? timelineElement.figure
|
||||||
: new PageElement(createElement(timelineElement.figure))
|
: new PageElement(timelineElement.figure)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
import { createElement } from '../../helper/create-element';
|
|
||||||
import { PageElement } from '../page-element';
|
import { PageElement } from '../page-element';
|
||||||
import { VideoParameters } from './video-parameters';
|
import { VideoParameters } from './video-parameters';
|
||||||
import { generate } from './video.html';
|
import { generate } from './video.html';
|
||||||
|
|
||||||
export class Video extends PageElement {
|
export class Video extends PageElement {
|
||||||
public constructor(options: VideoParameters) {
|
public constructor(options: VideoParameters) {
|
||||||
super(createElement(generate(options)));
|
super(generate(options));
|
||||||
|
|
||||||
this.query('.start-button').addEventListener('click', this.startVideo.bind(this));
|
this.query('.start-button').addEventListener('click', this.startVideo.bind(this));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue