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

Commit dc02802

Browse files
feat: new pager style
1 parent 77c141e commit dc02802

File tree

6 files changed

+58
-35
lines changed

6 files changed

+58
-35
lines changed

src/components.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export namespace Components {
2020
'isEnd': () => Promise<boolean>;
2121
'keyboard': boolean;
2222
'pager': boolean;
23+
'pagerPercentage': boolean;
2324
'slideNext': () => Promise<void>;
2425
'slidePrev': () => Promise<void>;
2526
'slideTo': (index: number, speed?: number) => Promise<void>;
@@ -28,15 +29,18 @@ export namespace Components {
2829
interface DeckgoDeckAttributes extends StencilHTMLAttributes {
2930
'keyboard'?: boolean;
3031
'pager'?: boolean;
32+
'pagerPercentage'?: boolean;
3133
}
3234

3335
interface DeckgoPager {
3436
'activeIndex': number;
3537
'length': number;
38+
'percentage': boolean;
3639
}
3740
interface DeckgoPagerAttributes extends StencilHTMLAttributes {
3841
'activeIndex'?: number;
3942
'length'?: number;
43+
'percentage'?: boolean;
4044
}
4145

4246
interface DeckgoSlideCode {

src/components/deck/deckdeckgo-deck/deckdeckgo-deck.scss

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ div.deckgo-deck {
1818
div.deckgo-pager {
1919
position: fixed;
2020
bottom: 0;
21-
left: 50%;
22-
transform: translate(-50%, 0);
21+
left: 0;
2322
}
2423

2524
@media print {

src/components/deck/deckdeckgo-deck/deckdeckgo-deck.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export class DeckdeckgoDeck {
1818
@Prop() keyboard: boolean = true;
1919

2020
@Prop() pager: boolean = true;
21+
@Prop() pagerPercentage: boolean = true;
2122

2223
private startX: number = null;
2324
private deckTranslateX: number = 0;
@@ -378,7 +379,7 @@ export class DeckdeckgoDeck {
378379
render() {
379380
return [
380381
<div class="deckgo-deck"><slot/></div>,
381-
<div class="deckgo-pager">{this.pager ? <deckgo-pager active-index={this.activeIndex} length={this.length}></deckgo-pager> : ''}</div>
382+
<div class="deckgo-pager">{this.pager ? <deckgo-pager active-index={this.activeIndex} length={this.length} percentage={this.pagerPercentage}></deckgo-pager> : ''}</div>
382383
]
383384
}
384385

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,33 @@
1-
div.deckgo-pager-container {
2-
width: 30vw;
3-
margin-bottom: 8px;
1+
.deckgo-pager-circular-chart {
2+
height: var(--pager-size, 56px);
3+
width: var(--pager-size, 56px);
4+
margin: var(--pager-margin-top, 8px) var(--pager-margin-end, 8px) var(--pager-margin-bottom, 8px) var(--pager-margin-start, 8px);
5+
display: block;
6+
}
47

5-
display: flex;
6-
justify-content: flex-start;
8+
.deckgo-pager-circle-bg {
9+
fill: none;
10+
stroke: var(--pager-background, #eee);
11+
stroke-width: var(--pager-stroke-outter-width, 2.8);
12+
}
713

8-
div.deckgo-pager-step {
9-
background: lightgrey;
10-
height: 2px;
14+
.deckgo-pager-circle {
15+
stroke: var(--pager-color, #4c8dff);
16+
fill: none;
17+
stroke-width: var(--pager-stroke-inner-width, 1.8);
18+
stroke-linecap: round;
19+
}
1120

12-
&:not(:last-child) {
13-
margin-right: 2px;
14-
}
21+
.deckgo-pager-percentage {
22+
fill: var(--pager-text-color, #4c8dff);
23+
font-family: sans-serif;
24+
font-size: 0.5em;
25+
text-anchor: middle;
26+
font-weight: 300;
27+
}
1528

16-
&.deckgo-pager-current {
17-
background: black;
18-
}
29+
@media print {
30+
.deckgo-pager-circular-chart {
31+
display: none;
1932
}
2033
}

src/components/pager/deckdeckgo-pager/deckdeckgo-pager.tsx

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,40 @@ export class DeckdeckgoPager {
1111
@Prop() activeIndex: number;
1212
@Prop() length: number;
1313

14+
@Prop() percentage: boolean = false;
15+
1416
@State()
15-
private steps: number[] = [];
1617
private progression: number = 0;
1718

1819
@Watch('length')
20+
@Watch('activeIndex')
1921
calculateProgression() {
20-
this.steps = Array.from({ length: this.length }, (_v, i) => i);
2122
this.progression = Math.round(((this.activeIndex + 1) / this.length) * 100);
2223
}
2324

25+
// Nice circular percentage chart from the article of Sergio Pedercini
26+
// https://medium.com/@pppped/how-to-code-a-responsive-circular-percentage-chart-with-svg-and-css-3632f8cd7705
2427
render() {
25-
return <div class="deckgo-pager-container">
26-
{this.renderSteps()}
27-
</div>
28+
const ratio: string = '' + this.progression + ', 100';
29+
30+
return <svg viewBox="0 0 36 36" class="deckgo-pager-circular-chart">
31+
<path class="deckgo-pager-circle-bg"
32+
d="M18 2.0845
33+
a 15.9155 15.9155 0 0 1 0 31.831
34+
a 15.9155 15.9155 0 0 1 0 -31.831"
35+
/>
36+
<path class="deckgo-pager-circle"
37+
stroke-dasharray={ratio}
38+
d="M18 2.0845
39+
a 15.9155 15.9155 0 0 1 0 31.831
40+
a 15.9155 15.9155 0 0 1 0 -31.831"
41+
/>
42+
{this.renderText()}
43+
</svg>
2844
}
2945

30-
private renderSteps() {
31-
const style = {
32-
width: this.progression + '%'
33-
};
34-
35-
return (
36-
this.steps.map((i: number) => {
37-
return <div
38-
class={i === this.activeIndex ? 'deckgo-pager-current deckgo-pager-step' : 'deckgo-pager-step'}
39-
style={style}></div>
40-
})
41-
);
46+
private renderText() {
47+
return this.percentage ? <text x="18" y="20.35" className="deckgo-pager-percentage">{this.progression}%</text> : undefined;
4248
}
4349

4450
}

src/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ <h1 slot="title">Code</h1>
122122
}
123123
</script>
124124

125-
<div style="position: fixed; bottom: 0;">
125+
<div style="position: fixed; bottom: 0; right: 0;">
126126
<button onclick="slidePrev()">Prev</button>
127127
<button onclick="slideNext()">Next</button>
128128
<button onclick="slideTo()">Slide to</button>

0 commit comments

Comments
 (0)