Skip to content

Commit 152a9fe

Browse files
committed
feat(esl-carousel): support for proactive container-class handling using 'esl-carousel-class-behavior' plugin
1 parent 7856145 commit 152a9fe

File tree

7 files changed

+122
-3
lines changed

7 files changed

+122
-3
lines changed

packages/esl-website/src/site.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {
4040
ESLCarouselRelateToMixin,
4141
ESLCarouselAutoplayMixin,
4242
ESLCarouselAutoplayProgressMixin,
43+
ESLCarouselClassBehaviourMixin,
4344
ESLLazyTemplate
4445
} from '@exadel/esl/modules/all';
4546

@@ -128,6 +129,7 @@ ESLCarouselRelateToMixin.register();
128129
ESLCarouselAutoplayMixin.register();
129130
ESLCarouselAutoplayProgressMixin.register();
130131
ESLCarouselWheelMixin.register();
132+
ESLCarouselClassBehaviourMixin.register();
131133

132134
ESLAnimate.register();
133135
ESLAnimateMixin.register();
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
layout: content
3+
title: ESL Carousel Container Class Behavior
4+
seoTitle: ESL Carousel Container Class Behavior - part of ESL Carousel web component to customize carousel container class behavior
5+
name: Container Class Behavior
6+
order: 2
7+
parent: 'ESL Carousel'
8+
tags: [components, new, beta]
9+
aside:
10+
source: packages/esl/src/esl-carousel
11+
examples:
12+
- carousel
13+
---
14+
15+
{% mdRender '@exadel/esl/modules/esl-carousel/plugin/class/README.md', 'intro' %}

packages/esl-website/views/components/esl-carousel/keyboard.njk

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ title: ESL Carousel Keyboard
44
seoTitle: ESL Carousel Keyboard - part of ESL Carousel web component to create carousel UX with custom plugins, rendering and out of the box popular features support
55
name: Keyboard Navigation
66
parent: 'ESL Carousel'
7-
order: 3
8-
tags: [components, draft]
7+
order: 5
8+
tags: [components]
99
aside:
1010
source: packages/esl/src/esl-carousel
1111
examples:

packages/esl-website/views/components/esl-carousel/relation.njk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ title: ESL Carousel Relation
44
seoTitle: ESL Carousel Relation - part of ESL Carousel web component to create carousel UX with custom plugins, rendering and out of the box popular features support
55
name: Linking Carousels
66
parent: 'ESL Carousel'
7-
order: 5
7+
order: 7
88
tags: [components, draft]
99
aside:
1010
source: packages/esl/src/esl-carousel

packages/esl/src/esl-carousel/core.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ export * from './plugin/relation/esl-carousel.relation.mixin';
3030
// Wheel support
3131
export * from './plugin/wheel/esl-carousel.wheel.mixin';
3232

33+
// Class management
34+
export * from './plugin/class/esl-carousel.class-behaviour.mixin';
35+
3336
// Renderer Default
3437
import './renderers/esl-carousel.none.renderer';
3538
import './renderers/esl-carousel.default.renderer';
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# ESL Carousel Container Class Plugin <i class="badge badge-sup badge-warning">beta</i>
2+
3+
<a name="intro"></a>
4+
5+
The `esl-carousel-class-behavior` is a plugin (mixin) for `ESLCarousel` that provides advanced control over the `container-class` feature.
6+
By default, the `container-class` attribute works out-of-the-box in `default` mode, where classes are updated on the container after the slide change.
7+
The plugin enables a `proactive` mode, where classes are updated as soon as the slide change starts, which can be useful for certain animation types.
8+
9+
**Note:** The plugin is currently in beta and only supports the `mode` configuration.
10+
11+
## Configuration
12+
The `esl-carousel-class-behavior` plugin uses the ESLMediaQuery syntax for configuration.
13+
The only supported configuration option is `mode`, which can be set to either `default` or `proactive`.
14+
- `default`: The container's classes are updated after the slide change completes. THis is the default ESLCarousel behavior, the plugin is not needed if you use only this mode.
15+
- `proactive`: The container's classes are updated as soon as the slide change starts, before the transition begins. This mode is useful for animations that require the container class to be updated immediately.
16+
17+
NOTE: As was previously mentioned, the plugin value supports the ESLMediaQuery syntax, which allows you to switch between different modes based on animation and renderer you use.
18+
19+
NOTE: Plugin does not change target for the `container-class` attribute, so if behaves exactly like ESLCarousel's API defines it (based on `container` attribute).
20+
21+
## Usage
22+
To use the mixin, register the `ESLCarouselContainerClassMixin`:
23+
24+
```javascript
25+
EslCarouselClassBehaviourMixin.register();
26+
```
27+
28+
Then use the mixin on any `esl-carousel` element where you want to control container classes:
29+
```html
30+
<esl-carousel esl-carousel-class-behavior="proactive">
31+
<ul esl-carousel-slides>
32+
<li esl-carousel-slide container-class="my-slide-class-1">Slide 1</li>
33+
<li esl-carousel-slide container-class="my-slide-class-2">Slide 2</li>
34+
</ul>
35+
</esl-carousel>
36+
```
37+
38+
To use different modes for different renderers/media conditions:
39+
```html
40+
<esl-carousel media="@XS|@+SM" type="css-slide|css-fade" esl-carousel-class-behavior="default|proactive">
41+
...
42+
</esl-carousel>
43+
```
44+
or
45+
```html
46+
<esl-carousel media="@XS|@+SM" type="css-slide|css-fade" esl-carousel-class-behavior="default | @+SM => proactive">
47+
...
48+
</esl-carousel>
49+
```
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import {ESLCarouselPlugin} from '../esl-carousel.plugin';
2+
import {listen} from '../../../esl-utils/decorators/listen';
3+
import {CSSClassUtils} from '../../../esl-utils/dom/class';
4+
import {ESLCarouselSlide} from '../../core/esl-carousel.slide';
5+
import {ESLCarouselSlideEvent} from '../../core/esl-carousel.events';
6+
7+
export interface ESLCarouselClassBehaviourConfig {
8+
mode?: 'default' | 'proactive';
9+
}
10+
11+
/**
12+
* Plugin for {@link ESLCarousel} that allows to control the `container-class` feature behavior.
13+
*
14+
* Supports two modes:
15+
* - `default`: do not change default behavior - adds/removes classes on the container element after slides changed
16+
* - `proactive`: adds/removes classes on the container element proactively as soon as change starts
17+
*/
18+
export class ESLCarouselClassBehaviourMixin extends ESLCarouselPlugin<ESLCarouselClassBehaviourConfig> {
19+
public static override is = 'esl-carousel-class-behavior';
20+
public static override DEFAULT_CONFIG: ESLCarouselClassBehaviourConfig = {
21+
mode: 'default'
22+
};
23+
public static override DEFAULT_CONFIG_KEY: keyof ESLCarouselClassBehaviourConfig = 'mode';
24+
25+
@listen({inherit: true})
26+
protected override onConfigChange(): void {
27+
super.onConfigChange();
28+
this.$$on(this.onSlideChange);
29+
}
30+
31+
/** Resolves the container classes from given slide element */
32+
protected getClasses($slide: HTMLElement): string | undefined {
33+
return ESLCarouselSlide.get($slide)?.containerClass;
34+
}
35+
36+
@listen({
37+
event: ESLCarouselSlideEvent.CHANGE,
38+
condition: ($this: ESLCarouselClassBehaviourMixin) => $this.config.mode === 'proactive',
39+
})
40+
protected onSlideChange({$slidesBefore, $slidesAfter}: ESLCarouselSlideEvent): void {
41+
const {$container} = this.$host;
42+
if (!$container) return;
43+
for (const $slide of $slidesBefore) {
44+
CSSClassUtils.remove($container, this.getClasses($slide), $slide);
45+
}
46+
for (const $slide of $slidesAfter) {
47+
CSSClassUtils.add($container, this.getClasses($slide), $slide);
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)