@studiometa/ui 0.2.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/atoms/AnchorScrollTo/AnchorScrollTo.cjs +52 -0
- package/atoms/AnchorScrollTo/AnchorScrollTo.d.ts +31 -0
- package/atoms/AnchorScrollTo/AnchorScrollTo.js +26 -0
- package/atoms/LargeText/LargeText.cjs +90 -0
- package/atoms/LargeText/LargeText.d.ts +94 -0
- package/atoms/LargeText/LargeText.js +64 -0
- package/atoms/LazyInclude/LazyInclude.cjs +72 -0
- package/atoms/LazyInclude/LazyInclude.d.ts +64 -0
- package/atoms/LazyInclude/LazyInclude.js +46 -0
- package/atoms/Prefetch/AbstractPrefetch.cjs +84 -0
- package/atoms/Prefetch/AbstractPrefetch.d.ts +52 -0
- package/atoms/Prefetch/AbstractPrefetch.js +58 -0
- package/atoms/Prefetch/PrefetchWhenOver.cjs +65 -0
- package/atoms/Prefetch/PrefetchWhenOver.d.ts +21 -0
- package/atoms/Prefetch/PrefetchWhenOver.js +35 -0
- package/atoms/Prefetch/PrefetchWhenVisible.cjs +66 -0
- package/atoms/Prefetch/PrefetchWhenVisible.d.ts +21 -0
- package/atoms/Prefetch/PrefetchWhenVisible.js +36 -0
- package/atoms/Prefetch/index.cjs +40 -0
- package/atoms/Prefetch/index.d.ts +3 -0
- package/atoms/Prefetch/index.js +8 -0
- package/atoms/index.cjs +9 -2
- package/atoms/index.d.ts +5 -1
- package/atoms/index.js +9 -2
- package/molecules/Accordion/AccordionItem.cjs +1 -1
- package/molecules/Accordion/AccordionItem.d.ts +8 -10
- package/molecules/Accordion/AccordionItem.js +1 -1
- package/molecules/Modal/Modal.cjs +4 -5
- package/molecules/Modal/Modal.d.ts +9 -9
- package/molecules/Modal/Modal.js +4 -5
- package/molecules/Modal/ModalWithTransition.cjs +100 -0
- package/molecules/Modal/ModalWithTransition.d.ts +29 -0
- package/molecules/Modal/ModalWithTransition.js +69 -0
- package/molecules/Panel/Panel.cjs +148 -0
- package/molecules/Panel/Panel.d.ts +42 -0
- package/molecules/Panel/Panel.js +117 -0
- package/molecules/Slider/AbstractSliderChild.cjs +74 -0
- package/molecules/Slider/AbstractSliderChild.d.ts +55 -0
- package/molecules/Slider/AbstractSliderChild.js +43 -0
- package/molecules/Slider/Slider.cjs +240 -0
- package/molecules/Slider/Slider.d.ts +245 -0
- package/molecules/Slider/Slider.js +209 -0
- package/molecules/Slider/SliderBtn.cjs +65 -0
- package/molecules/Slider/SliderBtn.d.ts +31 -0
- package/molecules/Slider/SliderBtn.js +34 -0
- package/molecules/Slider/SliderCount.cjs +50 -0
- package/molecules/Slider/SliderCount.d.ts +21 -0
- package/molecules/Slider/SliderCount.js +19 -0
- package/molecules/Slider/SliderDots.cjs +55 -0
- package/molecules/Slider/SliderDots.d.ts +33 -0
- package/molecules/Slider/SliderDots.js +24 -0
- package/molecules/Slider/SliderDrag.cjs +45 -0
- package/molecules/Slider/SliderDrag.d.ts +16 -0
- package/molecules/Slider/SliderDrag.js +19 -0
- package/molecules/Slider/SliderItem.cjs +130 -0
- package/molecules/Slider/SliderItem.d.ts +106 -0
- package/molecules/Slider/SliderItem.js +105 -0
- package/molecules/Slider/SliderProgress.cjs +54 -0
- package/molecules/Slider/SliderProgress.d.ts +27 -0
- package/molecules/Slider/SliderProgress.js +23 -0
- package/molecules/Slider/index.cjs +50 -0
- package/molecules/Slider/index.d.ts +8 -0
- package/molecules/Slider/index.js +18 -0
- package/molecules/TableOfContent/TableOfContent.cjs +73 -0
- package/molecules/TableOfContent/TableOfContent.d.ts +59 -0
- package/molecules/TableOfContent/TableOfContent.js +42 -0
- package/molecules/TableOfContent/TableOfContentAnchor.cjs +65 -0
- package/molecules/TableOfContent/TableOfContentAnchor.d.ts +36 -0
- package/molecules/TableOfContent/TableOfContentAnchor.js +39 -0
- package/molecules/TableOfContent/index.cjs +38 -0
- package/molecules/TableOfContent/index.d.ts +2 -0
- package/molecules/TableOfContent/index.js +6 -0
- package/molecules/Tabs/Tabs.d.ts +2 -4
- package/molecules/index.cjs +7 -1
- package/molecules/index.d.ts +5 -1
- package/molecules/index.js +10 -4
- package/organisms/Frame/Frame.cjs +202 -0
- package/organisms/Frame/Frame.d.ts +119 -0
- package/organisms/Frame/Frame.js +171 -0
- package/organisms/Frame/FrameAnchor.cjs +48 -0
- package/organisms/Frame/FrameAnchor.d.ts +35 -0
- package/organisms/Frame/FrameAnchor.js +22 -0
- package/organisms/Frame/FrameForm.cjs +48 -0
- package/organisms/Frame/FrameForm.d.ts +32 -0
- package/organisms/Frame/FrameForm.js +22 -0
- package/organisms/Frame/FrameTarget.cjs +134 -0
- package/organisms/Frame/FrameTarget.d.ts +47 -0
- package/organisms/Frame/FrameTarget.js +109 -0
- package/organisms/Frame/index.cjs +42 -0
- package/organisms/Frame/index.d.ts +4 -0
- package/organisms/Frame/index.js +10 -0
- package/organisms/index.cjs +1 -0
- package/organisms/index.d.ts +1 -1
- package/organisms/index.js +1 -0
- package/package.json +2 -2
- package/primitives/Transition/Transition.cjs +71 -0
- package/primitives/Transition/Transition.d.ts +69 -0
- package/primitives/Transition/Transition.js +45 -0
- package/primitives/index.cjs +3 -1
- package/primitives/index.d.ts +1 -0
- package/primitives/index.js +3 -1
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __reExport = (target, module2, copyDefault, desc) => {
|
|
14
|
+
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(module2))
|
|
16
|
+
if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default"))
|
|
17
|
+
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return target;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (module2, isNodeMode) => {
|
|
22
|
+
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
|
23
|
+
};
|
|
24
|
+
var __toCommonJS = /* @__PURE__ */ ((cache) => {
|
|
25
|
+
return (module2, temp) => {
|
|
26
|
+
return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
|
|
27
|
+
};
|
|
28
|
+
})(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);
|
|
29
|
+
var __publicField = (obj, key, value) => {
|
|
30
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
31
|
+
return value;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// packages/ui/molecules/Slider/Slider.js
|
|
35
|
+
var Slider_exports = {};
|
|
36
|
+
__export(Slider_exports, {
|
|
37
|
+
default: () => Slider
|
|
38
|
+
});
|
|
39
|
+
var import_js_toolkit = require("@studiometa/js-toolkit");
|
|
40
|
+
var import_utils = require("@studiometa/js-toolkit/utils");
|
|
41
|
+
var import_SliderDrag = __toESM(require("./SliderDrag.cjs"), 1);
|
|
42
|
+
var import_SliderItem = __toESM(require("./SliderItem.cjs"), 1);
|
|
43
|
+
var Slider = class extends import_js_toolkit.Base {
|
|
44
|
+
constructor() {
|
|
45
|
+
super(...arguments);
|
|
46
|
+
__publicField(this, "__distanceX", 0);
|
|
47
|
+
__publicField(this, "__initialX", 0);
|
|
48
|
+
__publicField(this, "__currentIndex", 0);
|
|
49
|
+
__publicField(this, "states", []);
|
|
50
|
+
}
|
|
51
|
+
get currentIndex() {
|
|
52
|
+
return this.__currentIndex;
|
|
53
|
+
}
|
|
54
|
+
set currentIndex(value) {
|
|
55
|
+
this.currentSliderItem.disactivate();
|
|
56
|
+
this.$emit("index", value);
|
|
57
|
+
this.__currentIndex = value;
|
|
58
|
+
this.currentSliderItem.activate();
|
|
59
|
+
}
|
|
60
|
+
get currentState() {
|
|
61
|
+
return this.states[this.currentIndex];
|
|
62
|
+
}
|
|
63
|
+
get firstState() {
|
|
64
|
+
return this.states[0];
|
|
65
|
+
}
|
|
66
|
+
get lastState() {
|
|
67
|
+
return this.states[this.states.length - 1];
|
|
68
|
+
}
|
|
69
|
+
get containMinState() {
|
|
70
|
+
return this.getStateValueByMode(this.firstState.x, "left");
|
|
71
|
+
}
|
|
72
|
+
get containMaxState() {
|
|
73
|
+
return this.getStateValueByMode(this.lastState.x, "right");
|
|
74
|
+
}
|
|
75
|
+
get indexMax() {
|
|
76
|
+
return this.$children.SliderItem.length - 1;
|
|
77
|
+
}
|
|
78
|
+
get currentSliderItem() {
|
|
79
|
+
return this.$children.SliderItem[this.currentIndex];
|
|
80
|
+
}
|
|
81
|
+
getStates() {
|
|
82
|
+
const { wrapper } = this.$refs;
|
|
83
|
+
const originRect = wrapper.getBoundingClientRect();
|
|
84
|
+
const origins = {
|
|
85
|
+
left: originRect.left,
|
|
86
|
+
center: originRect.x + originRect.width / 2,
|
|
87
|
+
right: originRect.x + originRect.width
|
|
88
|
+
};
|
|
89
|
+
return this.$children.SliderItem.map((item) => {
|
|
90
|
+
return {
|
|
91
|
+
x: {
|
|
92
|
+
left: (item.rect.x - origins.left) * -1,
|
|
93
|
+
center: (item.rect.x + item.rect.width / 2 - origins.center) * -1,
|
|
94
|
+
right: (item.rect.x + item.rect.width - origins.right) * -1
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
getStateValueByMode(state, mode) {
|
|
100
|
+
return state[mode != null ? mode : this.$options.mode];
|
|
101
|
+
}
|
|
102
|
+
mounted() {
|
|
103
|
+
this.states = this.getStates();
|
|
104
|
+
this.prepareInvisibleItems();
|
|
105
|
+
this.goTo(this.currentIndex);
|
|
106
|
+
}
|
|
107
|
+
resized() {
|
|
108
|
+
(0, import_utils.nextFrame)(() => {
|
|
109
|
+
this.states = this.getStates();
|
|
110
|
+
(0, import_utils.nextFrame)(() => {
|
|
111
|
+
this.prepareInvisibleItems();
|
|
112
|
+
this.goTo(this.currentIndex);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
goNext() {
|
|
117
|
+
if (this.currentIndex + 1 > this.indexMax) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
this.goTo(this.currentIndex + 1);
|
|
121
|
+
}
|
|
122
|
+
goPrev() {
|
|
123
|
+
if (this.currentIndex - 1 < 0) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
this.goTo(this.currentIndex - 1);
|
|
127
|
+
}
|
|
128
|
+
goTo(index) {
|
|
129
|
+
if (index < 0 || index > this.indexMax) {
|
|
130
|
+
throw new Error("Index out of bound.");
|
|
131
|
+
}
|
|
132
|
+
let state = this.getStateValueByMode(this.states[index].x);
|
|
133
|
+
if (this.$options.contain) {
|
|
134
|
+
if (this.$children.SliderItem[this.indexMax].willBeFullyVisible(state)) {
|
|
135
|
+
state = this.getStateValueByMode(this.lastState.x, "right");
|
|
136
|
+
} else if (this.$children.SliderItem[0].willBeFullyVisible(state)) {
|
|
137
|
+
state = this.getStateValueByMode(this.firstState.x, "left");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const itemsToMove = this.getVisibleItems(state);
|
|
141
|
+
if (index < this.currentIndex) {
|
|
142
|
+
itemsToMove.reverse();
|
|
143
|
+
}
|
|
144
|
+
itemsToMove.forEach((item) => {
|
|
145
|
+
(0, import_utils.nextFrame)(() => item.move(state));
|
|
146
|
+
});
|
|
147
|
+
this.currentIndex = index;
|
|
148
|
+
this.$emit("goto", index);
|
|
149
|
+
}
|
|
150
|
+
onSliderDragStart() {
|
|
151
|
+
this.__initialX = this.currentSliderItem ? this.currentSliderItem.x : 0;
|
|
152
|
+
}
|
|
153
|
+
onSliderDragDrag(props) {
|
|
154
|
+
if (Math.abs(props.delta.y) > Math.abs(props.delta.x)) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
this.__distanceX = this.__initialX + props.distance.x * this.$options.sensitivity;
|
|
158
|
+
this.getVisibleItems(this.__distanceX).forEach((item) => {
|
|
159
|
+
item.moveInstantly(this.__distanceX);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
onSliderDragDrop(props) {
|
|
163
|
+
if (Math.abs(props.delta.y) > Math.abs(props.delta.x)) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
let finalX = (0, import_utils.clamp)((0, import_utils.inertiaFinalValue)(this.__distanceX, props.delta.x * this.$options.sensitivity), 0, this.getStateValueByMode(this.lastState.x));
|
|
167
|
+
const absoluteDifferencesBetweenDistanceAndState = this.states.map((state) => Math.abs(finalX - this.getStateValueByMode(state.x)));
|
|
168
|
+
const minimumDifference = Math.min(...absoluteDifferencesBetweenDistanceAndState);
|
|
169
|
+
const closestIndex = absoluteDifferencesBetweenDistanceAndState.findIndex((number) => number === minimumDifference);
|
|
170
|
+
if (this.$options.fitBounds) {
|
|
171
|
+
this.goTo(closestIndex);
|
|
172
|
+
} else {
|
|
173
|
+
if (this.$options.contain) {
|
|
174
|
+
finalX = Math.min(this.containMinState, finalX);
|
|
175
|
+
finalX = Math.max(this.containMaxState, finalX);
|
|
176
|
+
}
|
|
177
|
+
this.$children.SliderItem.forEach((item) => {
|
|
178
|
+
item.move(finalX);
|
|
179
|
+
});
|
|
180
|
+
this.currentIndex = closestIndex;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
prepareInvisibleItems() {
|
|
184
|
+
const state = this.states[this.currentIndex];
|
|
185
|
+
const nextItemsToPrepare = [];
|
|
186
|
+
const previousItemsToPrepare = [];
|
|
187
|
+
this.getInvisibleItems(this.getStateValueByMode(state.x)).forEach((item, i) => {
|
|
188
|
+
if (i > this.currentIndex) {
|
|
189
|
+
nextItemsToPrepare.push(item);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (i < this.currentIndex) {
|
|
193
|
+
previousItemsToPrepare.push(item);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
nextItemsToPrepare.forEach((item) => {
|
|
197
|
+
const invisibleState = this.getStateWhereItemWillBeInvisible(item);
|
|
198
|
+
if (invisibleState) {
|
|
199
|
+
item.moveInstantly(this.getStateValueByMode(invisibleState.x));
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
previousItemsToPrepare.forEach((item) => {
|
|
203
|
+
const invisibleState = this.getStateWhereItemWillBeInvisible(item, { reversed: true });
|
|
204
|
+
if (invisibleState) {
|
|
205
|
+
item.moveInstantly(this.getStateValueByMode(invisibleState.x));
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
getStateWhereItemWillBeInvisible(item, { reversed = false } = {}) {
|
|
210
|
+
const visibleStates = this.states.filter((state) => item.willBeVisible(this.getStateValueByMode(state.x)));
|
|
211
|
+
const firstVisibleState = visibleStates[0];
|
|
212
|
+
const lastVisibleState = visibleStates[visibleStates.length - 1];
|
|
213
|
+
const firstVisibleStateIndex = this.states.findIndex((state) => this.getStateValueByMode(state.x) === this.getStateValueByMode(firstVisibleState.x));
|
|
214
|
+
const lastVisibleStateIndex = this.states.findIndex((state) => state.x === lastVisibleState.x);
|
|
215
|
+
return reversed ? this.states[lastVisibleStateIndex + 1] : this.states[firstVisibleStateIndex - 1];
|
|
216
|
+
}
|
|
217
|
+
getVisibleItems(target) {
|
|
218
|
+
return this.$children.SliderItem.filter((item) => item.isVisible || item.willBeVisible(target));
|
|
219
|
+
}
|
|
220
|
+
getInvisibleItems(target) {
|
|
221
|
+
return this.$children.SliderItem.filter((item) => !item.isVisible && !item.willBeVisible(target));
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
__publicField(Slider, "config", {
|
|
225
|
+
name: "Slider",
|
|
226
|
+
refs: ["wrapper"],
|
|
227
|
+
emits: ["goto", "index"],
|
|
228
|
+
components: {
|
|
229
|
+
SliderItem: import_SliderItem.default,
|
|
230
|
+
SliderDrag: import_SliderDrag.default
|
|
231
|
+
},
|
|
232
|
+
options: {
|
|
233
|
+
mode: { type: String, default: "left" },
|
|
234
|
+
fitBounds: Boolean,
|
|
235
|
+
contain: Boolean,
|
|
236
|
+
sensitivity: { type: Number, default: 1 }
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
module.exports = __toCommonJS(Slider_exports);
|
|
240
|
+
if (module.exports.default) module.exports = module.exports.default;
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {'left'|'center'|'right'} SliderModes
|
|
3
|
+
* @typedef {{ x: Record<SliderModes, number> }} SliderState
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {Object} SliderChildren
|
|
7
|
+
* @property {SliderItem[]} SliderItem
|
|
8
|
+
* @property {SliderDrag[]} SliderDrag
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* @typedef {Object} SliderOptions
|
|
12
|
+
* @property {SliderModes} mode
|
|
13
|
+
* @property {boolean} fitBounds
|
|
14
|
+
* @property {number} sensitivity
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* @typedef {Object} SliderPrivateInterface
|
|
18
|
+
* @property {{ wrapper: HTMLElement }} $refs
|
|
19
|
+
* @property {SliderChildren} $children
|
|
20
|
+
* @property {SliderOptions} $options
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* @typedef {Slider & SliderPrivateInterface} SliderInterface
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Orchestrate the slider items state transition.
|
|
27
|
+
* @todo a11y
|
|
28
|
+
* @todo better state management with `mode` option
|
|
29
|
+
*/
|
|
30
|
+
export default class Slider extends Base {
|
|
31
|
+
/**
|
|
32
|
+
* Config.
|
|
33
|
+
*/
|
|
34
|
+
static config: {
|
|
35
|
+
name: string;
|
|
36
|
+
refs: string[];
|
|
37
|
+
emits: string[];
|
|
38
|
+
components: {
|
|
39
|
+
SliderItem: typeof SliderItem;
|
|
40
|
+
SliderDrag: typeof SliderDrag;
|
|
41
|
+
};
|
|
42
|
+
options: {
|
|
43
|
+
mode: {
|
|
44
|
+
type: StringConstructor;
|
|
45
|
+
default: string;
|
|
46
|
+
};
|
|
47
|
+
fitBounds: BooleanConstructor;
|
|
48
|
+
contain: BooleanConstructor;
|
|
49
|
+
sensitivity: {
|
|
50
|
+
type: NumberConstructor;
|
|
51
|
+
default: number;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
__distanceX: number;
|
|
56
|
+
__initialX: number;
|
|
57
|
+
/**
|
|
58
|
+
* Index of the current active slide.
|
|
59
|
+
* @type {number}
|
|
60
|
+
*/
|
|
61
|
+
__currentIndex: number;
|
|
62
|
+
/**
|
|
63
|
+
* Set the current index and emit the `index` event.
|
|
64
|
+
* @param {number} value
|
|
65
|
+
* @returns {void}
|
|
66
|
+
*/
|
|
67
|
+
set currentIndex(arg: number);
|
|
68
|
+
/**
|
|
69
|
+
* Get the current index.
|
|
70
|
+
* @returns {number}
|
|
71
|
+
*/
|
|
72
|
+
get currentIndex(): number;
|
|
73
|
+
/**
|
|
74
|
+
* Store all the states.
|
|
75
|
+
* @type {SliderState[]}
|
|
76
|
+
*/
|
|
77
|
+
states: SliderState[];
|
|
78
|
+
/**
|
|
79
|
+
* Get the current state.
|
|
80
|
+
* @returns {SliderState}
|
|
81
|
+
*/
|
|
82
|
+
get currentState(): SliderState;
|
|
83
|
+
/**
|
|
84
|
+
* Get the first state.
|
|
85
|
+
* @returns {SliderState}
|
|
86
|
+
*/
|
|
87
|
+
get firstState(): SliderState;
|
|
88
|
+
/**
|
|
89
|
+
* Get the last state.
|
|
90
|
+
* @returns {SliderState}
|
|
91
|
+
*/
|
|
92
|
+
get lastState(): SliderState;
|
|
93
|
+
/**
|
|
94
|
+
* Get the minimal contain state value.
|
|
95
|
+
* @returns {number} [description]
|
|
96
|
+
*/
|
|
97
|
+
get containMinState(): number;
|
|
98
|
+
/**
|
|
99
|
+
* Get the maximal contain state value.
|
|
100
|
+
* @returns {number} [description]
|
|
101
|
+
*/
|
|
102
|
+
get containMaxState(): number;
|
|
103
|
+
/**
|
|
104
|
+
* Get the last index.
|
|
105
|
+
*
|
|
106
|
+
* @this {SliderInterface}
|
|
107
|
+
* @returns {number}
|
|
108
|
+
*/
|
|
109
|
+
get indexMax(): number;
|
|
110
|
+
/**
|
|
111
|
+
* Get the current SliderItem
|
|
112
|
+
*
|
|
113
|
+
* @this {SliderInterface}
|
|
114
|
+
* @returns {SliderItem}
|
|
115
|
+
*/
|
|
116
|
+
get currentSliderItem(): SliderItem;
|
|
117
|
+
/**
|
|
118
|
+
* Get the states for each SliderItem.
|
|
119
|
+
*
|
|
120
|
+
* @todo save value for every available modes to avoid recalculation when switching
|
|
121
|
+
* @this {SliderInterface}
|
|
122
|
+
*/
|
|
123
|
+
getStates(): {
|
|
124
|
+
x: {
|
|
125
|
+
left: number;
|
|
126
|
+
center: number;
|
|
127
|
+
right: number;
|
|
128
|
+
};
|
|
129
|
+
}[];
|
|
130
|
+
/**
|
|
131
|
+
* Get a state value according to the given mode.
|
|
132
|
+
*
|
|
133
|
+
* @this {SliderInterface}
|
|
134
|
+
* @param {SliderState['x']} state
|
|
135
|
+
* @param {SliderOptions['mode']} [mode]
|
|
136
|
+
* @returns {number}
|
|
137
|
+
*/
|
|
138
|
+
getStateValueByMode(state: SliderState['x'], mode?: SliderOptions['mode']): number;
|
|
139
|
+
/**
|
|
140
|
+
* Mounted hook.
|
|
141
|
+
*
|
|
142
|
+
* @returns {void}
|
|
143
|
+
*/
|
|
144
|
+
mounted(): void;
|
|
145
|
+
/**
|
|
146
|
+
* Resized hook.
|
|
147
|
+
* @returns {void}
|
|
148
|
+
*/
|
|
149
|
+
resized(): void;
|
|
150
|
+
/**
|
|
151
|
+
* Go to the next slide.
|
|
152
|
+
*
|
|
153
|
+
* @returns {void}
|
|
154
|
+
*/
|
|
155
|
+
goNext(): void;
|
|
156
|
+
/**
|
|
157
|
+
* Go to the previous slide.
|
|
158
|
+
*
|
|
159
|
+
* @returns {void}
|
|
160
|
+
*/
|
|
161
|
+
goPrev(): void;
|
|
162
|
+
/**
|
|
163
|
+
* Go to the given index.
|
|
164
|
+
*
|
|
165
|
+
* @this {SliderInterface}
|
|
166
|
+
* @param {number} index
|
|
167
|
+
* @returns {void}
|
|
168
|
+
*/
|
|
169
|
+
goTo(index: number): void;
|
|
170
|
+
/**
|
|
171
|
+
* Listen to the Draggable `start` event.
|
|
172
|
+
*
|
|
173
|
+
* @returns {void}
|
|
174
|
+
*/
|
|
175
|
+
onSliderDragStart(): void;
|
|
176
|
+
/**
|
|
177
|
+
* Listen to the Draggable `drag` event.
|
|
178
|
+
*
|
|
179
|
+
* @param {import('@studiometa/js-toolkit/services/drag').DragServiceProps} props
|
|
180
|
+
* @returns {void}
|
|
181
|
+
*/
|
|
182
|
+
onSliderDragDrag(props: import('@studiometa/js-toolkit/services/drag').DragServiceProps): void;
|
|
183
|
+
/**
|
|
184
|
+
* Listen to the Draggable `drop` event and find the new active slide.
|
|
185
|
+
*
|
|
186
|
+
* @this {SliderInterface}
|
|
187
|
+
* @param {import('@studiometa/js-toolkit/services/drag').DragServiceProps} props
|
|
188
|
+
* @returns {void}
|
|
189
|
+
*/
|
|
190
|
+
onSliderDragDrop(props: import('@studiometa/js-toolkit/services/drag').DragServiceProps): void;
|
|
191
|
+
/**
|
|
192
|
+
* Prepare invisible items.
|
|
193
|
+
* @returns {void}
|
|
194
|
+
*/
|
|
195
|
+
prepareInvisibleItems(): void;
|
|
196
|
+
/**
|
|
197
|
+
* Get the state where the given item will be visible.
|
|
198
|
+
*
|
|
199
|
+
* @param {SliderItem} item
|
|
200
|
+
* @returns {SliderState}
|
|
201
|
+
*/
|
|
202
|
+
getStateWhereItemWillBeInvisible(item: SliderItem, { reversed }?: {
|
|
203
|
+
reversed?: boolean;
|
|
204
|
+
}): SliderState;
|
|
205
|
+
/**
|
|
206
|
+
* Get the visible slides for the given position.
|
|
207
|
+
*
|
|
208
|
+
* @this {SliderInterface}
|
|
209
|
+
* @param {number} target
|
|
210
|
+
* @returns {SliderItem[]}
|
|
211
|
+
*/
|
|
212
|
+
getVisibleItems(target: number): SliderItem[];
|
|
213
|
+
/**
|
|
214
|
+
* Get the invisible slides for the given position.
|
|
215
|
+
*
|
|
216
|
+
* @this {SliderInterface}
|
|
217
|
+
* @param {number} target
|
|
218
|
+
* @returns {SliderItem[]}
|
|
219
|
+
*/
|
|
220
|
+
getInvisibleItems(target: number): SliderItem[];
|
|
221
|
+
}
|
|
222
|
+
export type SliderModes = 'left' | 'center' | 'right';
|
|
223
|
+
export type SliderState = {
|
|
224
|
+
x: Record<SliderModes, number>;
|
|
225
|
+
};
|
|
226
|
+
export type SliderChildren = {
|
|
227
|
+
SliderItem: SliderItem[];
|
|
228
|
+
SliderDrag: SliderDrag[];
|
|
229
|
+
};
|
|
230
|
+
export type SliderOptions = {
|
|
231
|
+
mode: SliderModes;
|
|
232
|
+
fitBounds: boolean;
|
|
233
|
+
sensitivity: number;
|
|
234
|
+
};
|
|
235
|
+
export type SliderPrivateInterface = {
|
|
236
|
+
$refs: {
|
|
237
|
+
wrapper: HTMLElement;
|
|
238
|
+
};
|
|
239
|
+
$children: SliderChildren;
|
|
240
|
+
$options: SliderOptions;
|
|
241
|
+
};
|
|
242
|
+
export type SliderInterface = Slider & SliderPrivateInterface;
|
|
243
|
+
import { Base } from "@studiometa/js-toolkit";
|
|
244
|
+
import SliderItem from "./SliderItem.js";
|
|
245
|
+
import SliderDrag from "./SliderDrag.js";
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => {
|
|
4
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
+
return value;
|
|
6
|
+
};
|
|
7
|
+
import { Base } from "@studiometa/js-toolkit";
|
|
8
|
+
import { clamp, inertiaFinalValue, nextFrame } from "@studiometa/js-toolkit/utils";
|
|
9
|
+
import SliderDrag from "./SliderDrag.js";
|
|
10
|
+
import SliderItem from "./SliderItem.js";
|
|
11
|
+
class Slider extends Base {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
__publicField(this, "__distanceX", 0);
|
|
15
|
+
__publicField(this, "__initialX", 0);
|
|
16
|
+
__publicField(this, "__currentIndex", 0);
|
|
17
|
+
__publicField(this, "states", []);
|
|
18
|
+
}
|
|
19
|
+
get currentIndex() {
|
|
20
|
+
return this.__currentIndex;
|
|
21
|
+
}
|
|
22
|
+
set currentIndex(value) {
|
|
23
|
+
this.currentSliderItem.disactivate();
|
|
24
|
+
this.$emit("index", value);
|
|
25
|
+
this.__currentIndex = value;
|
|
26
|
+
this.currentSliderItem.activate();
|
|
27
|
+
}
|
|
28
|
+
get currentState() {
|
|
29
|
+
return this.states[this.currentIndex];
|
|
30
|
+
}
|
|
31
|
+
get firstState() {
|
|
32
|
+
return this.states[0];
|
|
33
|
+
}
|
|
34
|
+
get lastState() {
|
|
35
|
+
return this.states[this.states.length - 1];
|
|
36
|
+
}
|
|
37
|
+
get containMinState() {
|
|
38
|
+
return this.getStateValueByMode(this.firstState.x, "left");
|
|
39
|
+
}
|
|
40
|
+
get containMaxState() {
|
|
41
|
+
return this.getStateValueByMode(this.lastState.x, "right");
|
|
42
|
+
}
|
|
43
|
+
get indexMax() {
|
|
44
|
+
return this.$children.SliderItem.length - 1;
|
|
45
|
+
}
|
|
46
|
+
get currentSliderItem() {
|
|
47
|
+
return this.$children.SliderItem[this.currentIndex];
|
|
48
|
+
}
|
|
49
|
+
getStates() {
|
|
50
|
+
const { wrapper } = this.$refs;
|
|
51
|
+
const originRect = wrapper.getBoundingClientRect();
|
|
52
|
+
const origins = {
|
|
53
|
+
left: originRect.left,
|
|
54
|
+
center: originRect.x + originRect.width / 2,
|
|
55
|
+
right: originRect.x + originRect.width
|
|
56
|
+
};
|
|
57
|
+
return this.$children.SliderItem.map((item) => {
|
|
58
|
+
return {
|
|
59
|
+
x: {
|
|
60
|
+
left: (item.rect.x - origins.left) * -1,
|
|
61
|
+
center: (item.rect.x + item.rect.width / 2 - origins.center) * -1,
|
|
62
|
+
right: (item.rect.x + item.rect.width - origins.right) * -1
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
getStateValueByMode(state, mode) {
|
|
68
|
+
return state[mode != null ? mode : this.$options.mode];
|
|
69
|
+
}
|
|
70
|
+
mounted() {
|
|
71
|
+
this.states = this.getStates();
|
|
72
|
+
this.prepareInvisibleItems();
|
|
73
|
+
this.goTo(this.currentIndex);
|
|
74
|
+
}
|
|
75
|
+
resized() {
|
|
76
|
+
nextFrame(() => {
|
|
77
|
+
this.states = this.getStates();
|
|
78
|
+
nextFrame(() => {
|
|
79
|
+
this.prepareInvisibleItems();
|
|
80
|
+
this.goTo(this.currentIndex);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
goNext() {
|
|
85
|
+
if (this.currentIndex + 1 > this.indexMax) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.goTo(this.currentIndex + 1);
|
|
89
|
+
}
|
|
90
|
+
goPrev() {
|
|
91
|
+
if (this.currentIndex - 1 < 0) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
this.goTo(this.currentIndex - 1);
|
|
95
|
+
}
|
|
96
|
+
goTo(index) {
|
|
97
|
+
if (index < 0 || index > this.indexMax) {
|
|
98
|
+
throw new Error("Index out of bound.");
|
|
99
|
+
}
|
|
100
|
+
let state = this.getStateValueByMode(this.states[index].x);
|
|
101
|
+
if (this.$options.contain) {
|
|
102
|
+
if (this.$children.SliderItem[this.indexMax].willBeFullyVisible(state)) {
|
|
103
|
+
state = this.getStateValueByMode(this.lastState.x, "right");
|
|
104
|
+
} else if (this.$children.SliderItem[0].willBeFullyVisible(state)) {
|
|
105
|
+
state = this.getStateValueByMode(this.firstState.x, "left");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const itemsToMove = this.getVisibleItems(state);
|
|
109
|
+
if (index < this.currentIndex) {
|
|
110
|
+
itemsToMove.reverse();
|
|
111
|
+
}
|
|
112
|
+
itemsToMove.forEach((item) => {
|
|
113
|
+
nextFrame(() => item.move(state));
|
|
114
|
+
});
|
|
115
|
+
this.currentIndex = index;
|
|
116
|
+
this.$emit("goto", index);
|
|
117
|
+
}
|
|
118
|
+
onSliderDragStart() {
|
|
119
|
+
this.__initialX = this.currentSliderItem ? this.currentSliderItem.x : 0;
|
|
120
|
+
}
|
|
121
|
+
onSliderDragDrag(props) {
|
|
122
|
+
if (Math.abs(props.delta.y) > Math.abs(props.delta.x)) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.__distanceX = this.__initialX + props.distance.x * this.$options.sensitivity;
|
|
126
|
+
this.getVisibleItems(this.__distanceX).forEach((item) => {
|
|
127
|
+
item.moveInstantly(this.__distanceX);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
onSliderDragDrop(props) {
|
|
131
|
+
if (Math.abs(props.delta.y) > Math.abs(props.delta.x)) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
let finalX = clamp(inertiaFinalValue(this.__distanceX, props.delta.x * this.$options.sensitivity), 0, this.getStateValueByMode(this.lastState.x));
|
|
135
|
+
const absoluteDifferencesBetweenDistanceAndState = this.states.map((state) => Math.abs(finalX - this.getStateValueByMode(state.x)));
|
|
136
|
+
const minimumDifference = Math.min(...absoluteDifferencesBetweenDistanceAndState);
|
|
137
|
+
const closestIndex = absoluteDifferencesBetweenDistanceAndState.findIndex((number) => number === minimumDifference);
|
|
138
|
+
if (this.$options.fitBounds) {
|
|
139
|
+
this.goTo(closestIndex);
|
|
140
|
+
} else {
|
|
141
|
+
if (this.$options.contain) {
|
|
142
|
+
finalX = Math.min(this.containMinState, finalX);
|
|
143
|
+
finalX = Math.max(this.containMaxState, finalX);
|
|
144
|
+
}
|
|
145
|
+
this.$children.SliderItem.forEach((item) => {
|
|
146
|
+
item.move(finalX);
|
|
147
|
+
});
|
|
148
|
+
this.currentIndex = closestIndex;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
prepareInvisibleItems() {
|
|
152
|
+
const state = this.states[this.currentIndex];
|
|
153
|
+
const nextItemsToPrepare = [];
|
|
154
|
+
const previousItemsToPrepare = [];
|
|
155
|
+
this.getInvisibleItems(this.getStateValueByMode(state.x)).forEach((item, i) => {
|
|
156
|
+
if (i > this.currentIndex) {
|
|
157
|
+
nextItemsToPrepare.push(item);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (i < this.currentIndex) {
|
|
161
|
+
previousItemsToPrepare.push(item);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
nextItemsToPrepare.forEach((item) => {
|
|
165
|
+
const invisibleState = this.getStateWhereItemWillBeInvisible(item);
|
|
166
|
+
if (invisibleState) {
|
|
167
|
+
item.moveInstantly(this.getStateValueByMode(invisibleState.x));
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
previousItemsToPrepare.forEach((item) => {
|
|
171
|
+
const invisibleState = this.getStateWhereItemWillBeInvisible(item, { reversed: true });
|
|
172
|
+
if (invisibleState) {
|
|
173
|
+
item.moveInstantly(this.getStateValueByMode(invisibleState.x));
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
getStateWhereItemWillBeInvisible(item, { reversed = false } = {}) {
|
|
178
|
+
const visibleStates = this.states.filter((state) => item.willBeVisible(this.getStateValueByMode(state.x)));
|
|
179
|
+
const firstVisibleState = visibleStates[0];
|
|
180
|
+
const lastVisibleState = visibleStates[visibleStates.length - 1];
|
|
181
|
+
const firstVisibleStateIndex = this.states.findIndex((state) => this.getStateValueByMode(state.x) === this.getStateValueByMode(firstVisibleState.x));
|
|
182
|
+
const lastVisibleStateIndex = this.states.findIndex((state) => state.x === lastVisibleState.x);
|
|
183
|
+
return reversed ? this.states[lastVisibleStateIndex + 1] : this.states[firstVisibleStateIndex - 1];
|
|
184
|
+
}
|
|
185
|
+
getVisibleItems(target) {
|
|
186
|
+
return this.$children.SliderItem.filter((item) => item.isVisible || item.willBeVisible(target));
|
|
187
|
+
}
|
|
188
|
+
getInvisibleItems(target) {
|
|
189
|
+
return this.$children.SliderItem.filter((item) => !item.isVisible && !item.willBeVisible(target));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
__publicField(Slider, "config", {
|
|
193
|
+
name: "Slider",
|
|
194
|
+
refs: ["wrapper"],
|
|
195
|
+
emits: ["goto", "index"],
|
|
196
|
+
components: {
|
|
197
|
+
SliderItem,
|
|
198
|
+
SliderDrag
|
|
199
|
+
},
|
|
200
|
+
options: {
|
|
201
|
+
mode: { type: String, default: "left" },
|
|
202
|
+
fitBounds: Boolean,
|
|
203
|
+
contain: Boolean,
|
|
204
|
+
sensitivity: { type: Number, default: 1 }
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
export {
|
|
208
|
+
Slider as default
|
|
209
|
+
};
|