diff --git a/package.json b/package.json
index 254f9e5..974adc9 100644
--- a/package.json
+++ b/package.json
@@ -29,5 +29,8 @@
"typescript": "^4.0.2",
"webpack": "^4.44.1",
"webpack-cli": "^3.3.12"
+ },
+ "dependencies": {
+ "lit-element": "~/.local2.4.0"
}
}
diff --git a/src/base.scss b/src/base.scss
index d9a2f2b..31e21b1 100644
--- a/src/base.scss
+++ b/src/base.scss
@@ -44,7 +44,7 @@ header {
display: flex;
justify-content: space-between;
align-items: center;
- a {
+ &>a {
padding: 0px 2px;
&:link,&:visited {
color: var(--text-opposite-4);
@@ -62,7 +62,7 @@ header {
display: flex;
justify-content: space-between;
align-items: center;
- img {
+ &>img {
max-width: 100%;
max-height: 100%;
padding: 1em;
@@ -76,7 +76,7 @@ nav {
align-items: center;
color: var(--text-opposite-1);
background-color: var(--green-1);
- a {
+ &>a {
border-left: 1px solid var(--text-color-1);
&:first-child {
border-left: 0px;
diff --git a/src/index.scss b/src/index.scss
index 5fd54ca..98287fc 100644
--- a/src/index.scss
+++ b/src/index.scss
@@ -1,4 +1,6 @@
.gallery {
- width: 100%;
- height: 10em;
+ margin: 1em;
+ height: 30em;
+ display: flex;
+ justify-content: center;
}
diff --git a/src/index.ts b/src/index.ts
index aaec3fc..483270f 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,4 +1,5 @@
-import { cyclicArray, rotateArray } from "./utils";
+import { css, html, LitElement } from "lit-element";
+import { cyclicArray } from "./utils";
const items = [
{
@@ -22,132 +23,53 @@ const items = [
},
];
-class Item extends HTMLElement {
- shadow: ShadowRoot = this.attachShadow({ mode: "open" });
- private _item!: { img: string; name: string };
-
- public get item(): { img: string; name: string } {
- return this._item;
- }
- public set item(value: { img: string; name: string }) {
- this._item = value;
- this.img.src = value.img;
- this.p.innerText = value.name;
- }
- img;
- p;
+class Carousel extends LitElement {
+ currentIndex = 0;
+ currentItem = items[this.currentIndex];
constructor() {
super();
- this.img = document.createElement("img") as HTMLImageElement;
- this.p = document.createElement("p") as HTMLParagraphElement;
}
- connectedCallback() {
- this.shadow.appendChild(this.img);
- this.shadow.appendChild(this.p);
-
- const style = document.createElement("style");
- style.innerHTML = `
- :host {
- margin: 0.3em;
- }
- img {
- height: 100%;
- max-width: 100%;
- object-fit: scale-down;
- }
+ render() {
+ return html`
+
+
+
`;
- this.shadow.appendChild(style);
}
-}
-customElements.define("x-item", Item);
-class Carousel extends HTMLElement {
- items: Item[] = [];
- shadow: ShadowRoot = this.attachShadow({ mode: "open" });
- forSale = cyclicArray(items);
- leftButton!: HTMLButtonElement;
- rightButton!: HTMLButtonElement;
-
- constructor() {
- super();
- const style = document.createElement("style");
- style.innerHTML = `
+ static get styles() {
+ return css`
:host {
+ max-width: 100%;
+ height: 100%;
+ height: 100%;
display: flex;
align-items: center;
- height: 100%;
}
+
button {
- z-index: 2;
- }
-
- div {
- display: flex;
- height: 100%;
- margin: 0 -10%;
- }
-
- x-item {
- max-height: 100%;
- width: 33%;
- transition: 3s ease;
- flex-grow: 1;
- }
-
- .item-1, .item-3 {
- transform: scale(0.8, 0.8);
- opacity: 0.7;
- }
- .item-1 {
- order: 1;
- }
- .item-2 {
- order: 2;
- margin: 0 -10em;
z-index: 1;
+ margin: -6em;
}
- .item-3 {
- order: 3;
+
+ img {
+ max-height: 100%;
+ box-shadow: 0px 0px 5px 0px var(--background-opposite-1);
+ transition: 0.2s;
+ }
+
+ img:hover {
+ transform: scale(1.1);
+ }
+
+ button {
+ border: 1px solid var(--background-opposite-2);
+ border-radius: 50%;
+ background-color: var(--background-primary-2);
}
`;
- this.shadow.appendChild(style);
- }
-
- connectedCallback() {
- this.leftButton = document.createElement("button") as HTMLButtonElement;
- this.leftButton.innerHTML = "Next";
- this.leftButton.addEventListener("click", () => this.rotate());
- this.shadow.appendChild(this.leftButton);
-
- const container = document.createElement("div") as HTMLDivElement;
- this.shadow.appendChild(container);
- for (let i = 0; i < 3; i++) {
- const elm = document.createElement("x-item") as Item;
- elm.classList.add(`item-${i + 1}`);
- elm.item = items[i];
- container.appendChild(elm);
- this.items.push(elm);
- }
- this.rightButton = document.createElement("button") as HTMLButtonElement;
- this.rightButton.innerHTML = "Prev";
- this.rightButton.addEventListener("click", () => this.rotate(true));
- this.shadow.appendChild(this.rightButton);
- }
- rotate(backwards = false) {
- this.items.forEach((item) => item.classList.remove(`item-1`));
- this.items.forEach((item) => item.classList.remove(`item-2`));
- this.items.forEach((item) => item.classList.remove(`item-3`));
-
- this.items = rotateArray(this.items, backwards);
- this.items.forEach((item, i) => item.classList.add(`item-${i + 1}`));
-
- const val = this.forSale.next(backwards).value;
- if (val) {
- if (backwards) this.items[0].item = val;
- else this.items[2].item = val;
- }
}
}
customElements.define("x-carousel", Carousel);
diff --git a/src/utils.ts b/src/utils.ts
index 37a677b..cd9b3ab 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -35,38 +35,28 @@ export const newPromise = (): [
return [promise, resolve!, reject!];
};
-declare global {
- interface Window {
- alarmsMap?: Map, rejectCallback]>;
- }
-}
-
//Clone of the https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/alarms
export namespace Alarms {
- const getMap = () => {
- window.alarmsMap ??= new Map();
- return window.alarmsMap;
- };
+ const alarmsMap = new Map, rejectCallback]>();
export const create = (delay: number, name?: any) => {
- const map = getMap();
- const alrm = map.get(name);
+ const alrm = alarmsMap.get(name);
if (alrm) alrm[1]();
const [promise, resolve, reject] = newPromise();
const timeout = setTimeout(resolve, delay);
promise.catch(() => window.clearTimeout(timeout));
- if (name != undefined) map.set(name, [promise, reject]);
+ if (name != undefined) alarmsMap.set(name, [promise, reject]);
return promise;
};
- export const get = (name: any) => (getMap().get(name) ?? [])[0];
- export const getAll = () => Array.from(getMap().entries()).map((a) => a[0]);
+ export const get = (name: any) => (alarmsMap.get(name) ?? [])[0];
+ export const getAll = () => Array.from(alarmsMap.entries()).map((a) => a[0]);
export const clear = (name: any) => {
- const alrm = getMap().get(name);
+ const alrm = alarmsMap.get(name);
if (alrm) alrm[1]();
};
- export const clearAll = () => getMap().forEach((a) => a[1]());
+ export const clearAll = () => alarmsMap.forEach((a) => a[1]());
}
diff --git a/yarn.lock b/yarn.lock
index 5b1dd8f..2ebaa1e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2528,6 +2528,18 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
+lit-element@~/.local2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-2.4.0.tgz#b22607a037a8fc08f5a80736dddf7f3f5d401452"
+ integrity sha512-pBGLglxyhq/Prk2H91nA0KByq/hx/wssJBQFiYqXhGDvEnY31PRGYf1RglVzyLeRysu0IHm2K0P196uLLWmwFg==
+ dependencies:
+ lit-html "^1.1.1"
+
+lit-html@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-1.3.0.tgz#c80f3cc5793a6dea6c07172be90a70ab20e56034"
+ integrity sha512-0Q1bwmaFH9O14vycPHw8C/IeHMk/uSDldVLIefu/kfbTBGIc44KGH6A8p1bDfxUfHdc8q6Ct7kQklWoHgr4t1Q==
+
live-server@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/live-server/-/live-server-1.2.1.tgz#670630dd409d22fe9c513ab1c1894686c757153e"