Skip to content

Commit cacbc15

Browse files
committed
Implement #202.
1 parent 415a416 commit cacbc15

File tree

150 files changed

+5866
-1125
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

150 files changed

+5866
-1125
lines changed

.github/workflows/cd.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ jobs:
2525
run: yarn build
2626

2727
- name: NPM PKG Publish 🎉
28-
run: yarn workspaces foreach -t --exclude '{embla-carousel-monorepo,embla-carousel-docs,embla-carousel-playground-vanilla,embla-carousel-playground-react,embla-carousel-playground-solid}' npm publish
28+
run: yarn workspaces foreach -t --exclude '{embla-carousel-monorepo,embla-carousel-docs,embla-carousel-playground-vanilla,embla-carousel-playground-react,embla-carousel-playground-solid,embla-carousel-playground-vue,embla-carousel-playground-svelte}' npm publish
2929
env:
3030
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

.vscode/extenstions.json

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"recommendations": [
3+
"esbenp.prettier-vscode",
4+
"unifiedjs.vscode-mdx",
5+
"Vue.volar",
6+
"svelte.svelte-vscode"
7+
]
8+
}

.vscode/settings.json

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
{
2-
"prettier.configPath": ""
2+
"prettier.configPath": "",
3+
"editor.formatOnSave": true,
4+
"editor.defaultFormatter": "esbenp.prettier-vscode",
5+
"[svelte]": {
6+
"editor.defaultFormatter": "svelte.svelte-vscode"
7+
}
38
}

package.json

+12-4
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,34 @@
2828
"packages/embla-carousel-reactive-utils",
2929
"playgrounds/embla-carousel-playground-vanilla",
3030
"playgrounds/embla-carousel-playground-react",
31-
"playgrounds/embla-carousel-playground-solid"
31+
"playgrounds/embla-carousel-playground-solid",
32+
"playgrounds/embla-carousel-playground-vue",
33+
"playgrounds/embla-carousel-playground-svelte"
3234
],
3335
"scripts": {
34-
"eslint:report": "yarn workspaces foreach -v --exclude \"{embla-carousel-monorepo,embla-carousel-playground-vanilla,embla-carousel-playground-react}\" run eslint:report",
36+
"eslint:report": "yarn workspaces foreach -v --exclude \"{embla-carousel-monorepo,embla-carousel-playground-vanilla,embla-carousel-playground-react,embla-carousel-playground-solid,embla-carousel-playground-vue,embla-carousel-playground-svelte}\" run eslint:report",
3537
"prettier:report": "prettier \"**/*.{js,jsx,tsx,ts,scss,json}\" --check",
3638
"lint": "npm-run-all prettier:report eslint:report",
3739
"format": "prettier \"**/*.{js,jsx,tsx,ts,scss,json}\" --write",
38-
"test": "yarn workspaces foreach -v --exclude \"{embla-carousel-monorepo,embla-carousel-playground-vanilla,embla-carousel-playground-react}\" run test",
40+
"test": "yarn workspaces foreach -v --exclude \"{embla-carousel-monorepo,embla-carousel-playground-vanilla,embla-carousel-playground-react,embla-carousel-playground-solid,embla-carousel-playground-vue,embla-carousel-playground-svelte}\" run test",
3941
"watch:package-vanilla": "yarn workspace embla-carousel run start",
4042
"watch:package-react": "yarn workspace embla-carousel-react run start",
4143
"watch:package-solid": "yarn workspace embla-carousel-solid run start",
44+
"watch:package-vue": "yarn workspace embla-carousel-vue run start",
45+
"watch:package-svelte": "yarn workspace embla-carousel-svelte run start",
4246
"watch:playground-vanilla": "yarn workspace embla-carousel-playground-vanilla run dev",
4347
"watch:playground-react": "yarn workspace embla-carousel-playground-react run dev",
4448
"watch:playground-solid": "yarn workspace embla-carousel-playground-solid run dev",
49+
"watch:playground-vue": "yarn workspace embla-carousel-playground-vue run dev",
50+
"watch:playground-svelte": "yarn workspace embla-carousel-playground-svelte run dev",
4551
"start": "yarn workspace embla-carousel-docs run start",
4652
"start:vanilla": "npm-run-all --parallel watch:package-vanilla watch:playground-vanilla",
4753
"start:react": "npm-run-all --parallel watch:package-vanilla watch:package-react watch:playground-react",
4854
"start:solid": "npm-run-all --parallel watch:package-vanilla watch:package-solid watch:playground-solid",
55+
"start:vue": "npm-run-all --parallel watch:package-vanilla watch:package-vue watch:playground-vue",
56+
"start:svelte": "npm-run-all --parallel watch:package-vanilla watch:package-svelte watch:playground-svelte",
4957
"build": "npm-run-all build:packages build:package-readmes format",
50-
"build:packages": "yarn workspaces foreach -vt --exclude \"{embla-carousel-monorepo,embla-carousel-playground-vanilla,embla-carousel-playground-react}\" run build",
58+
"build:packages": "yarn workspaces foreach -vt --exclude \"{embla-carousel-monorepo,embla-carousel-playground-vanilla,embla-carousel-playground-react,embla-carousel-playground-solid,embla-carousel-playground-vue,embla-carousel-playground-svelte}\" run build",
5159
"build:package-readmes": "npx ts-node --project scripts/tsconfig.node.json scripts/create-readmes/index.ts --templatePath=scripts/create-readmes/readme-template.md",
5260
"build:docs": "yarn workspace embla-carousel-docs run predeploy",
5361
"version:patch": "yarn workspaces foreach version patch && yarn version:push",

packages/embla-carousel-auto-height/src/components/AutoHeight.ts

+30-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import { OptionsType } from './Options'
1+
import { defaultOptions, OptionsType } from './Options'
22
import {
33
EmblaEventType,
44
CreatePluginType,
5-
EmblaCarouselType
5+
EmblaCarouselType,
6+
OptionsHandlerType
67
} from 'embla-carousel'
78

89
declare module 'embla-carousel' {
@@ -16,18 +17,40 @@ export type AutoHeightType = CreatePluginType<{}, OptionsType>
1617
export type AutoHeightOptionsType = AutoHeightType['options']
1718

1819
function AutoHeight(userOptions: AutoHeightOptionsType = {}): AutoHeightType {
20+
let options: OptionsType
1921
let emblaApi: EmblaCarouselType
22+
let isSsr = false
23+
let destroyed = false
24+
2025
let slideHeights: number[] = []
2126
const heightEvents: EmblaEventType[] = ['select', 'slidefocus']
2227

23-
function init(emblaApiInstance: EmblaCarouselType): void {
28+
function pluginIsActive(): boolean {
29+
if (isSsr) return false
30+
if (destroyed) return false
31+
return options.active
32+
}
33+
34+
function init(
35+
emblaApiInstance: EmblaCarouselType,
36+
optionsHandler: OptionsHandlerType
37+
): void {
2438
emblaApi = emblaApiInstance
2539

40+
const { mergeOptions, optionsAtMedia } = optionsHandler
41+
const optionsBase = mergeOptions(defaultOptions, AutoHeight.globalOptions)
42+
const allOptions = mergeOptions(optionsBase, userOptions)
43+
44+
destroyed = false
45+
options = optionsAtMedia(allOptions)
46+
isSsr = emblaApi.internalEngine().isSsr
47+
2648
const {
2749
options: { axis },
2850
slideRects
2951
} = emblaApi.internalEngine()
3052

53+
if (!pluginIsActive()) return
3154
if (axis === 'y') return
3255

3356
slideHeights = slideRects.map((slideRect) => slideRect.height)
@@ -37,10 +60,13 @@ function AutoHeight(userOptions: AutoHeightOptionsType = {}): AutoHeightType {
3760
}
3861

3962
function destroy(): void {
63+
if (!pluginIsActive()) return
64+
4065
heightEvents.forEach((evt) => emblaApi.off(evt, setContainerHeight))
4166
const container = emblaApi.containerNode()
4267
container.style.height = ''
43-
if (!container.getAttribute('style')) container.removeAttribute('style')
68+
69+
destroyed = true
4470
}
4571

4672
function highestInView(): number | null {
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
import { CreateOptionsType } from 'embla-carousel'
22

33
export type OptionsType = CreateOptionsType<{}>
4+
5+
export const defaultOptions: OptionsType = {
6+
active: true,
7+
breakpoints: {}
8+
}

packages/embla-carousel-auto-scroll/src/components/AutoScroll.ts

+34-16
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,21 @@ export type AutoScrollOptionsType = AutoScrollType['options']
3939
function AutoScroll(userOptions: AutoScrollOptionsType = {}): AutoScrollType {
4040
let options: OptionsType
4141
let emblaApi: EmblaCarouselType
42-
let destroyed: boolean
42+
let isSsr = false
43+
let destroyed = false
44+
4345
let startDelay: number
4446
let timerId = 0
45-
let autoScrollActive = false
47+
let autoScrollRunning = false
4648
let mouseIsOver = false
4749
let defaultScrollBehaviour: ScrollBodyType
4850

51+
function pluginIsActive(): boolean {
52+
if (isSsr) return false
53+
if (destroyed) return false
54+
return options.active
55+
}
56+
4957
function init(
5058
emblaApiInstance: EmblaCarouselType,
5159
optionsHandler: OptionsHandlerType
@@ -55,8 +63,12 @@ function AutoScroll(userOptions: AutoScrollOptionsType = {}): AutoScrollType {
5563
const { mergeOptions, optionsAtMedia } = optionsHandler
5664
const optionsBase = mergeOptions(defaultOptions, AutoScroll.globalOptions)
5765
const allOptions = mergeOptions(optionsBase, userOptions)
66+
67+
destroyed = false
5868
options = optionsAtMedia(allOptions)
69+
isSsr = emblaApi.internalEngine().isSsr
5970

71+
if (!pluginIsActive()) return
6072
if (emblaApi.snapList().length <= 1) return
6173

6274
startDelay = options.startDelay
@@ -95,6 +107,8 @@ function AutoScroll(userOptions: AutoScrollOptionsType = {}): AutoScrollType {
95107
}
96108

97109
function destroy(): void {
110+
if (!pluginIsActive()) return
111+
98112
emblaApi
99113
.off('pointerdown', onPointerDown)
100114
.off('pointerup', onPointerUp)
@@ -103,38 +117,42 @@ function AutoScroll(userOptions: AutoScrollOptionsType = {}): AutoScrollType {
103117

104118
stopAutoScroll()
105119
destroyed = true
106-
autoScrollActive = false
120+
autoScrollRunning = false
107121
}
108122

109123
function startAutoScroll(): void {
110-
if (destroyed) return
111-
if (autoScrollActive) return
112-
emblaApi.emit('autoscroll:play', null)
124+
if (!pluginIsActive()) return
113125

114126
const engine = emblaApi.internalEngine()
115-
const { ownerWindow } = engine
127+
const { ownerWindow } = engine.nodeHandler
128+
129+
if (!ownerWindow) return
130+
if (autoScrollRunning) return
131+
emblaApi.emit('autoscroll:play', null)
116132

117133
timerId = ownerWindow.setTimeout(() => {
118134
engine.scrollBody = createAutoScrollBehaviour(engine)
119135
engine.animation.start()
120136
}, startDelay)
121137

122-
autoScrollActive = true
138+
autoScrollRunning = true
123139
}
124140

125141
function stopAutoScroll(): void {
126-
if (destroyed) return
127-
if (!autoScrollActive) return
128-
emblaApi.emit('autoscroll:stop', null)
142+
if (!pluginIsActive()) return
129143

130144
const engine = emblaApi.internalEngine()
131-
const { ownerWindow } = engine
145+
const { ownerWindow } = engine.nodeHandler
146+
147+
if (!ownerWindow) return
148+
if (!autoScrollRunning) return
149+
emblaApi.emit('autoscroll:stop', null)
132150

133151
engine.scrollBody = defaultScrollBehaviour
134152
ownerWindow.clearTimeout(timerId)
135153
timerId = 0
136154

137-
autoScrollActive = false
155+
autoScrollRunning = false
138156
}
139157

140158
function createAutoScrollBehaviour(engine: EngineType): ScrollBodyType {
@@ -245,18 +263,18 @@ function AutoScroll(userOptions: AutoScrollOptionsType = {}): AutoScrollType {
245263
}
246264

247265
function stop(): void {
248-
if (autoScrollActive) stopAutoScroll()
266+
if (autoScrollRunning) stopAutoScroll()
249267
}
250268

251269
function reset(): void {
252-
if (autoScrollActive) {
270+
if (autoScrollRunning) {
253271
stopAutoScroll()
254272
startAutoScrollOnSettle()
255273
}
256274
}
257275

258276
function isPlaying(): boolean {
259-
return autoScrollActive
277+
return autoScrollRunning
260278
}
261279

262280
const self: AutoScrollType = {

0 commit comments

Comments
 (0)