Skip to content

Commit 34ad1fb

Browse files
committed
chore: begin sheet breakpoints
1 parent c92ad63 commit 34ad1fb

5 files changed

Lines changed: 56 additions & 26 deletions

File tree

kitchen-sink/core/pages/sheet-modal.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,8 @@
256256
sheetSwipeToStep = $f7.sheet.create({
257257
el: '.demo-sheet-swipe-to-step',
258258
swipeToClose: true,
259-
swipeToStep: true,
259+
// swipeToStep: true,
260+
breakpoints: [0.25, 0.5, 0.75],
260261
push: true,
261262
backdrop: true,
262263
});
@@ -278,4 +279,4 @@
278279
return $render;
279280
};
280281

281-
</script>
282+
</script>

src/core/components/sheet/sheet-class.js

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ class Sheet extends Modal {
148148
return (app.height - offset * 2) / app.height;
149149
}
150150

151+
const useBreakpoints = sheet.params.breakpoints && sheet.params.breakpoints.length > 0;
151152
let isTouched = false;
152153
let startTouch;
153154
let currentTouch;
@@ -157,6 +158,7 @@ class Sheet extends Modal {
157158
let isMoved = false;
158159
let isTopSheetModal;
159160
let swipeStepTranslate;
161+
let breakpointsTranslate = [];
160162
let startTranslate;
161163
let currentTranslate;
162164
let sheetElOffsetHeight;
@@ -246,7 +248,11 @@ class Sheet extends Modal {
246248
maxTranslate = 0;
247249
} else {
248250
minTranslate = 0;
249-
maxTranslate = sheet.params.swipeToClose ? sheetElOffsetHeight : swipeStepTranslate;
251+
maxTranslate = sheet.params.swipeToClose
252+
? sheetElOffsetHeight
253+
: useBreakpoints
254+
? breakpointsTranslate[0]
255+
: swipeStepTranslate;
250256
}
251257
isMoved = true;
252258
}
@@ -418,22 +424,37 @@ class Sheet extends Modal {
418424

419425
sheet.setSwipeStep = function setSwipeStep(byResize = true) {
420426
const $swipeStepEl = $el.find('.sheet-modal-swipe-step').eq(0);
421-
if (!$swipeStepEl.length) return;
422-
if ($el.hasClass('sheet-modal-top')) {
423-
swipeStepTranslate = -(
424-
$swipeStepEl.offset().top -
425-
$el.offset().top +
426-
$swipeStepEl[0].offsetHeight
427-
);
427+
if (!useBreakpoints && !$swipeStepEl.length) return;
428+
if (useBreakpoints) {
429+
const fullSize = $el[0].offsetHeight;
430+
breakpointsTranslate = [];
431+
sheet.params.breakpoints.forEach((ratio) => {
432+
breakpointsTranslate.push(fullSize - fullSize * ratio);
433+
});
434+
console.log(breakpointsTranslate);
435+
$el[0].style.setProperty('--f7-sheet-breakpoint', `${breakpointsTranslate[0]}px`);
436+
if (!byResize) {
437+
$el.addClass('modal-in-breakpoint');
438+
sheet.emit('local::_swipeStep', true);
439+
}
428440
} else {
429-
swipeStepTranslate =
430-
$el[0].offsetHeight -
431-
($swipeStepEl.offset().top - $el.offset().top + $swipeStepEl[0].offsetHeight);
432-
}
433-
$el[0].style.setProperty('--f7-sheet-swipe-step', `${swipeStepTranslate}px`);
434-
if (!byResize) {
435-
$el.addClass('modal-in-swipe-step');
436-
sheet.emit('local::_swipeStep', true);
441+
// eslint-disable-next-line
442+
if ($el.hasClass('sheet-modal-top')) {
443+
swipeStepTranslate = -(
444+
$swipeStepEl.offset().top -
445+
$el.offset().top +
446+
$swipeStepEl[0].offsetHeight
447+
);
448+
} else {
449+
swipeStepTranslate =
450+
$el[0].offsetHeight -
451+
($swipeStepEl.offset().top - $el.offset().top + $swipeStepEl[0].offsetHeight);
452+
}
453+
$el[0].style.setProperty('--f7-sheet-swipe-step', `${swipeStepTranslate}px`);
454+
if (!byResize) {
455+
$el.addClass('modal-in-swipe-step');
456+
sheet.emit('local::_swipeStep', true);
457+
}
437458
}
438459
};
439460

@@ -442,7 +463,7 @@ class Sheet extends Modal {
442463
}
443464

444465
const passive = support.passiveListener ? { passive: true } : false;
445-
if (sheet.params.swipeToClose || sheet.params.swipeToStep) {
466+
if (sheet.params.swipeToClose || sheet.params.swipeToStep || useBreakpoints) {
446467
$el.on(app.touchEvents.start, handleTouchStart, passive);
447468
app.on('touchmove', handleTouchMove);
448469
app.on('touchend:passive', handleTouchEnd);
@@ -458,7 +479,7 @@ class Sheet extends Modal {
458479
$(document).on('keydown', onKeyDown);
459480
}
460481
$el.prevAll('.popup.modal-in').addClass('popup-behind');
461-
if (sheet.params.swipeToStep) {
482+
if (sheet.params.swipeToStep || useBreakpoints) {
462483
sheet.setSwipeStep(false);
463484
app.on('resize', onResize);
464485
}
@@ -473,7 +494,7 @@ class Sheet extends Modal {
473494
sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-offset', `${pushOffset}px`);
474495
$el.addClass('sheet-modal-push');
475496
sheet.$htmlEl.addClass('with-modal-sheet-push');
476-
if (!sheet.params.swipeToStep) {
497+
if (!sheet.params.swipeToStep && !useBreakpoints) {
477498
sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
478499
} else {
479500
$pushViewEl = app.$el.children('.view, .views');
@@ -490,8 +511,8 @@ class Sheet extends Modal {
490511
}
491512
});
492513
sheet.on('close', () => {
493-
if (sheet.params.swipeToStep) {
494-
$el.removeClass('modal-in-swipe-step');
514+
if (sheet.params.swipeToStep || useBreakpoints) {
515+
$el.removeClass('modal-in-swipe-step modal-in-breakpoint');
495516
sheet.emit('local::_swipeStep', false);
496517
app.off('resize', onResize);
497518
}

src/core/components/sheet/sheet.d.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,13 @@ export namespace Sheet {
4949
swipeToClose?: boolean;
5050
/** When enabled it will be possible to split opened sheet into two states: partially opened and fully opened that can be controlled with swipe (default false) */
5151
swipeToStep?: boolean;
52+
/** Use instead of swipeToStep to enable swipe breakpoints. Must be an array of numbers > 0 and < 1, where 0 is fully closed and 1 is fully opened */
53+
breakpoints?: number[];
54+
/** Define breakpoint point when backdrop becomes visible */
55+
backdropBreakpoint?: number;
5256
/** When enabled it will be possible to close sheet with swipe only on specified handler element (default null) */
5357
swipeHandler?: HTMLElement | CSSSelector;
58+
5459
/** When enabled it will push view behind on open. Works only when top safe area is in place. It can also be enabled by adding `sheet-modal-push` class to Sheet element. (default false) */
5560
push?: boolean;
5661
/** Element to mount modal to. (default app.el) */
@@ -87,7 +92,7 @@ export namespace Sheet {
8792
stepClose(): void;
8893
/** Toggle (open or close) sheet swipe step */
8994
stepToggle(): void;
90-
/** Update step position. Required to call after content of sheet modal has been modified manually when it is opened */
95+
/** Update (recalculate) breakpoints positions. Required to call after content of sheet modal has been modified manually when it is opened */
9196
setSwipeStep(): void;
9297
/** Destroy sheet */
9398
destroy(): void;

src/core/components/sheet/sheet.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ export default {
1616
closeOnEscape: false,
1717
swipeToClose: false,
1818
swipeToStep: false,
19+
breakpoints: [],
20+
backdropBreakpoint: null,
1921
swipeHandler: null,
2022
containerEl: null,
2123
},

src/core/components/sheet/sheet.less

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@
3131
display: block;
3232
transform: translate3d(0, 0, 0);
3333
}
34-
&.modal-in-swipe-step {
34+
&.modal-in-swipe-step,
35+
&.modal-in-breakpoint {
3536
display: block;
36-
transform: translate3d(0, var(--f7-sheet-swipe-step, 0), 0);
37+
transform: translate3d(0, var(--f7-sheet-breakpoint, var(--f7-sheet-swipe-step, 0)), 0);
3738
}
3839
&.modal-out {
3940
transform: translate3d(0, 100%, 0);

0 commit comments

Comments
 (0)