Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.

Commit bc133bb

Browse files
doc(#36): add slide QR code
1 parent acf90a1 commit bc133bb

File tree

3 files changed

+154
-0
lines changed

3 files changed

+154
-0
lines changed

src/components.d.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,17 @@ export namespace Components {
198198
'src'?: string;
199199
}
200200

201+
interface DeckgoSlideQrcode {
202+
'afterSwipe': () => Promise<void>;
203+
'beforeSwipe': (_swipeLeft: boolean) => Promise<boolean>;
204+
'content': string;
205+
'lazyLoadContent': () => Promise<void>;
206+
}
207+
interface DeckgoSlideQrcodeAttributes extends StencilHTMLAttributes {
208+
'content'?: string;
209+
'onSlideDidLoad'?: (event: CustomEvent<void>) => void;
210+
}
211+
201212
interface DeckgoSlideSplit {
202213
'afterSwipe': () => Promise<void>;
203214
'beforeSwipe': (_swipeLeft: boolean) => Promise<boolean>;
@@ -254,6 +265,7 @@ declare global {
254265
'DeckgoSlideCode': Components.DeckgoSlideCode;
255266
'DeckgoSlideContent': Components.DeckgoSlideContent;
256267
'DeckgoSlideGif': Components.DeckgoSlideGif;
268+
'DeckgoSlideQrcode': Components.DeckgoSlideQrcode;
257269
'DeckgoSlideSplit': Components.DeckgoSlideSplit;
258270
'DeckgoSlideTitle': Components.DeckgoSlideTitle;
259271
'DeckgoSlideYoutube': Components.DeckgoSlideYoutube;
@@ -270,6 +282,7 @@ declare global {
270282
'deckgo-slide-code': Components.DeckgoSlideCodeAttributes;
271283
'deckgo-slide-content': Components.DeckgoSlideContentAttributes;
272284
'deckgo-slide-gif': Components.DeckgoSlideGifAttributes;
285+
'deckgo-slide-qrcode': Components.DeckgoSlideQrcodeAttributes;
273286
'deckgo-slide-split': Components.DeckgoSlideSplitAttributes;
274287
'deckgo-slide-title': Components.DeckgoSlideTitleAttributes;
275288
'deckgo-slide-youtube': Components.DeckgoSlideYoutubeAttributes;
@@ -336,6 +349,12 @@ declare global {
336349
new (): HTMLDeckgoSlideGifElement;
337350
};
338351

352+
interface HTMLDeckgoSlideQrcodeElement extends Components.DeckgoSlideQrcode, HTMLStencilElement {}
353+
var HTMLDeckgoSlideQrcodeElement: {
354+
prototype: HTMLDeckgoSlideQrcodeElement;
355+
new (): HTMLDeckgoSlideQrcodeElement;
356+
};
357+
339358
interface HTMLDeckgoSlideSplitElement extends Components.DeckgoSlideSplit, HTMLStencilElement {}
340359
var HTMLDeckgoSlideSplitElement: {
341360
prototype: HTMLDeckgoSlideSplitElement;
@@ -365,6 +384,7 @@ declare global {
365384
'deckgo-slide-code': HTMLDeckgoSlideCodeElement
366385
'deckgo-slide-content': HTMLDeckgoSlideContentElement
367386
'deckgo-slide-gif': HTMLDeckgoSlideGifElement
387+
'deckgo-slide-qrcode': HTMLDeckgoSlideQrcodeElement
368388
'deckgo-slide-split': HTMLDeckgoSlideSplitElement
369389
'deckgo-slide-title': HTMLDeckgoSlideTitleElement
370390
'deckgo-slide-youtube': HTMLDeckgoSlideYoutubeElement
@@ -381,6 +401,7 @@ declare global {
381401
'deckgo-slide-code': HTMLDeckgoSlideCodeElement;
382402
'deckgo-slide-content': HTMLDeckgoSlideContentElement;
383403
'deckgo-slide-gif': HTMLDeckgoSlideGifElement;
404+
'deckgo-slide-qrcode': HTMLDeckgoSlideQrcodeElement;
384405
'deckgo-slide-split': HTMLDeckgoSlideSplitElement;
385406
'deckgo-slide-title': HTMLDeckgoSlideTitleElement;
386407
'deckgo-slide-youtube': HTMLDeckgoSlideYoutubeElement;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
@import "../deckdeckgo-slide";
2+
3+
div.deckgo-slide {
4+
flex-direction: column;
5+
align-items: flex-start;
6+
justify-content: flex-start;
7+
}
8+
9+
div.deckgo-slide-qrcode {
10+
height: 100%;
11+
width: 100%;
12+
13+
display: flex;
14+
flex-flow: row wrap;
15+
16+
align-items: var(--slide-qrcode-align, center);
17+
text-align: var(--slide-qrcode-text-align, center);
18+
19+
> * {
20+
flex: 1 50%;
21+
}
22+
23+
deckgo-qrcode {
24+
background: var(--slide-qrcode-background);
25+
}
26+
}
27+
28+
::slotted([slot="title"]) {
29+
display: var(--slide-qrcode-title-display, inherit);
30+
}
31+
32+
::slotted([slot="content"]) {
33+
flex: 1 50%;
34+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import {Component, Element, Event, EventEmitter, Method, Prop} from '@stencil/core';
2+
3+
import {DeckdeckgoSlide, DeckdeckgoSlideUtils} from '../deckdeckgo-slide';
4+
import {DeckdeckgoUtils} from '../../utils/deckdeckgo-utils';
5+
6+
@Component({
7+
tag: 'deckgo-slide-qrcode',
8+
styleUrl: 'deckdeckgo-slide-qrcode.scss',
9+
shadow: true
10+
})
11+
export class DeckdeckgoSlideQrcode implements DeckdeckgoSlide {
12+
13+
@Element() el: HTMLElement;
14+
15+
@Event() slideDidLoad: EventEmitter<void>;
16+
17+
@Prop() content: string;
18+
19+
async componentDidLoad() {
20+
await DeckdeckgoUtils.hideLazyLoadImages(this.el);
21+
22+
this.initWindowResize();
23+
24+
await this.initQRCodeSize();
25+
26+
this.slideDidLoad.emit();
27+
}
28+
29+
private initWindowResize() {
30+
if (window) {
31+
window.addEventListener('resize', DeckdeckgoUtils.debounce(this.onResizeContent));
32+
}
33+
}
34+
35+
private onResizeContent = async () => {
36+
await this.initQRCodeSize();
37+
38+
const element: HTMLElement = this.el.shadowRoot.querySelector('deckgo-qrcode');
39+
40+
if (element) {
41+
await (element as any).generate();
42+
}
43+
};
44+
45+
private initQRCodeSize(): Promise<void> {
46+
return new Promise<void>((resolve) => {
47+
const container: HTMLElement = this.el.shadowRoot.querySelector('div.deckgo-slide-qrcode');
48+
49+
if (container) {
50+
const width: number = container.clientWidth;
51+
const height: number = container.clientHeight;
52+
53+
const qrCode: HTMLElement = container.querySelector('deckgo-qrcode');
54+
55+
if (qrCode) {
56+
qrCode.style.setProperty('--deckgo-qrcode-size', (width > height ? height : width) + 'px');
57+
}
58+
}
59+
60+
resolve();
61+
});
62+
}
63+
64+
@Method()
65+
beforeSwipe(_swipeLeft: boolean): Promise<boolean> {
66+
return new Promise<boolean>((resolve) => {
67+
resolve(true)
68+
});
69+
}
70+
71+
@Method()
72+
afterSwipe(): Promise<void> {
73+
return DeckdeckgoSlideUtils.afterSwipe();
74+
}
75+
76+
@Method()
77+
lazyLoadContent(): Promise<void> {
78+
return DeckdeckgoSlideUtils.lazyLoadContent(this.el);
79+
}
80+
81+
render() {
82+
return <div class="deckgo-slide">
83+
<slot name="title"></slot>
84+
<div class="deckgo-slide-qrcode">
85+
<slot name="content"></slot>
86+
<deckgo-qrcode content={this.content}></deckgo-qrcode>
87+
</div>
88+
</div>;
89+
}
90+
91+
hostData() {
92+
return {
93+
class: {
94+
'deckgo-slide-container': true
95+
}
96+
}
97+
}
98+
99+
}

0 commit comments

Comments
 (0)