Skip to content

Commit 5b84d85

Browse files
authored
feat(ui5-carousel): initial implementation (#1159)
1 parent b84b9d8 commit 5b84d85

21 files changed

+1031
-4
lines changed

packages/base/src/delegate/ScrollEnablement.js

+27-1
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import EventProvider from "../EventProvider.js";
22
import scroll from "../animations/scroll.js";
33

44
const scrollEventName = "scroll";
5+
const touchEndEventName = "touchend";
56

67
class ScrollEnablement extends EventProvider {
78
constructor(containerComponent) {
89
super();
910
containerComponent.addEventListener("touchstart", this.ontouchstart.bind(this), { passive: true });
1011
containerComponent.addEventListener("touchmove", this.ontouchmove.bind(this), { passive: true });
12+
containerComponent.addEventListener("touchend", this.ontouchend.bind(this), { passive: true });
1113
}
1214

1315
set scrollContainer(container) {
@@ -70,7 +72,31 @@ class ScrollEnablement extends EventProvider {
7072
container.scrollLeft += this._prevDragX - dragX;
7173
container.scrollTop += this._prevDragY - dragY;
7274

73-
this.fireEvent(scrollEventName, {});
75+
this.fireEvent(scrollEventName, {
76+
isLeft: dragX > this._prevDragX,
77+
isRight: dragX < this._prevDragX,
78+
});
79+
80+
this._prevDragX = dragX;
81+
this._prevDragY = dragY;
82+
}
83+
84+
ontouchend(event) {
85+
if (!this._canScroll) {
86+
return;
87+
}
88+
89+
const container = this._container;
90+
const dragX = event.pageX;
91+
const dragY = event.pageY;
92+
93+
container.scrollLeft += this._prevDragX - dragX;
94+
container.scrollTop += this._prevDragY - dragY;
95+
96+
this.fireEvent(touchEndEventName, {
97+
isLeft: dragX > this._prevDragX,
98+
isRight: dragX < this._prevDragX,
99+
});
74100

75101
this._prevDragX = dragX;
76102
this._prevDragY = dragY;

packages/main/bundle.esm.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ import Avatar from "./dist/Avatar.js";
1919
import Badge from "./dist/Badge.js";
2020
import BusyIndicator from "./dist/BusyIndicator.js";
2121
import Button from "./dist/Button.js";
22-
import CheckBox from "./dist/CheckBox.js";
2322
import Card from "./dist/Card.js";
23+
import Carousel from "./dist/Carousel.js";
24+
import CheckBox from "./dist/CheckBox.js";
25+
import ComboBox from "./dist/ComboBox.js";
26+
import ComboBoxItem from "./dist/ComboBoxItem.js";
2427
import DatePicker from "./dist/DatePicker.js";
2528
import Dialog from "./dist/Dialog.js";
2629
import Icon from "./dist/Icon.js";
@@ -50,8 +53,7 @@ import TimelineItem from "./dist/TimelineItem.js";
5053
import Title from "./dist/Title.js";
5154
import Toast from "./dist/Toast.js";
5255
import ToggleButton from "./dist/ToggleButton.js";
53-
import ComboBox from "./dist/ComboBox.js";
54-
import ComboBoxItem from "./dist/ComboBoxItem.js";
56+
5557

5658
import List from "./dist/List.js";
5759
import StandardListItem from "./dist/StandardListItem.js";

packages/main/src/Carousel.hbs

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<section
2+
class="ui5-carousel-root"
3+
tabindex="0"
4+
@keydown={{_onkeydown}}
5+
>
6+
<div class="ui5-carousel-overflow-hidden">
7+
<div class="{{classes.content}}" style="{{styles.content}}">
8+
{{#each items}}
9+
<div class="{{../classes.item}}">
10+
{{#each this}}
11+
{{#if this.item}}
12+
<slot name="{{this.item._individualSlot}}" tabindex="{{this.tabIndex}}"></slot>
13+
{{/if}}
14+
{{/each}}
15+
</div>
16+
{{/each}}
17+
</div>
18+
19+
{{#if arrows.content}}
20+
<div class="ui5-carousel-navigation-arrows">
21+
<ui5-button
22+
class="ui5-carousel-navigation-button"
23+
icon="slim-arrow-left"
24+
tabindex="-1"
25+
@click={{navigateLeft}}
26+
@keydown={{_onbuttonkeydown}}
27+
></ui5-button>
28+
<ui5-button
29+
class="ui5-carousel-navigation-button"
30+
icon="slim-arrow-right"
31+
tabindex="-1"
32+
@click={{navigateRight}}
33+
@keydown={{_onbuttonkeydown}}
34+
></ui5-button>
35+
</div>
36+
{{/if}}
37+
38+
{{#unless hideNavigation}}
39+
<div class="{{classes.navigation}}">
40+
{{#if arrows.navigation}}
41+
<ui5-button
42+
class="ui5-carousel-navigation-button"
43+
icon="slim-arrow-left"
44+
tabindex="-1"
45+
@click={{navigateLeft}}
46+
@keydown={{_onbuttonkeydown}}
47+
></ui5-button>
48+
{{/if}}
49+
50+
<div class="ui5-carousel-navigation">
51+
{{#if isPageTypeDots}}
52+
{{#each dots}}
53+
<div
54+
?active="{{this.active}}"
55+
class="ui5-carousel-navigation-dot"
56+
></div>
57+
{{/each}}
58+
{{else}}
59+
<ui5-label>{{currenlySelectedIndexToShow}}&nbsp;{{ofText}}&nbsp;{{items.length}}</ui5-label>
60+
{{/if}}
61+
</div>
62+
63+
{{#if arrows.navigation}}
64+
<ui5-button
65+
class="ui5-carousel-navigation-button"
66+
icon="slim-arrow-right"
67+
tabindex="-1"
68+
@click={{navigateRight}}
69+
@keydown={{_onbuttonkeydown}}
70+
></ui5-button>
71+
{{/if}}
72+
</div>
73+
{{/unless}}
74+
</div>
75+
</section>

0 commit comments

Comments
 (0)