This commit is contained in:
Andras Schmelczer 2022-09-25 21:24:32 +02:00
parent b6aef2bcf8
commit 33051841f5
No known key found for this signature in database
GPG key ID: 0EA1BC97D0AB076E
10 changed files with 32 additions and 39 deletions

View file

@ -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;
};

View file

@ -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() {

View file

@ -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());
} }

View file

@ -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();

View file

@ -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;

View file

@ -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));
} }
} }

View file

@ -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;
}
} }

View file

@ -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));
} }

View file

@ -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)
); );
} }

View file

@ -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));
} }