routie dev init since i didn't adhere to any proper guidance up until now
This commit is contained in:
+27
@@ -0,0 +1,27 @@
|
||||
.v-pull-to-refresh {
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
.v-pull-to-refresh__pull-down {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
transition: top 0.3s ease-out;
|
||||
}
|
||||
.v-pull-to-refresh__pull-down--touching {
|
||||
transition: none;
|
||||
}
|
||||
.v-pull-to-refresh__pull-down-default {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
justify-content: center;
|
||||
align-items: flex-end;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
.v-pull-to-refresh__scroll-container {
|
||||
position: relative;
|
||||
transition: top 0.3s ease-out;
|
||||
}
|
||||
.v-pull-to-refresh__scroll-container--touching {
|
||||
transition: none;
|
||||
}
|
||||
+173
@@ -0,0 +1,173 @@
|
||||
|
||||
export type VPullToRefreshSlots = {
|
||||
default: never;
|
||||
pullDownPanel: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
};
|
||||
};
|
||||
export declare const VPullToRefresh: {
|
||||
new (...args: any[]): import("vue").CreateComponentPublicInstanceWithMixins<{
|
||||
disabled: boolean;
|
||||
pullDownThreshold: number;
|
||||
} & {} & {
|
||||
$children?: {
|
||||
default?: (() => import("vue").VNodeChild) | undefined;
|
||||
pullDownPanel?: ((arg: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
} | {
|
||||
$stable?: boolean;
|
||||
} | (() => import("vue").VNodeChild) | import("vue").VNodeChild;
|
||||
'v-slots'?: {
|
||||
default?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
pullDownPanel?: false | ((arg: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
} | undefined;
|
||||
} & {
|
||||
"v-slot:default"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:pullDownPanel"?: false | ((arg: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
} & {
|
||||
onLoad?: ((options: {
|
||||
done: () => void;
|
||||
}) => any) | undefined;
|
||||
}, void, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
load: (options: {
|
||||
done: () => void;
|
||||
}) => true;
|
||||
}, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, {
|
||||
disabled: boolean;
|
||||
pullDownThreshold: number;
|
||||
}, true, {}, import("vue").SlotsType<Partial<{
|
||||
default: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
pullDownPanel: (arg: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
}) => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
}>>, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, {}, any, import("vue").ComponentProvideOptions, {
|
||||
P: {};
|
||||
B: {};
|
||||
D: {};
|
||||
C: {};
|
||||
M: {};
|
||||
Defaults: {};
|
||||
}, {
|
||||
disabled: boolean;
|
||||
pullDownThreshold: number;
|
||||
} & {} & {
|
||||
$children?: {
|
||||
default?: (() => import("vue").VNodeChild) | undefined;
|
||||
pullDownPanel?: ((arg: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
} | {
|
||||
$stable?: boolean;
|
||||
} | (() => import("vue").VNodeChild) | import("vue").VNodeChild;
|
||||
'v-slots'?: {
|
||||
default?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
pullDownPanel?: false | ((arg: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
} | undefined;
|
||||
} & {
|
||||
"v-slot:default"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:pullDownPanel"?: false | ((arg: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
} & {
|
||||
onLoad?: ((options: {
|
||||
done: () => void;
|
||||
}) => any) | undefined;
|
||||
}, {}, {}, {}, {}, {
|
||||
disabled: boolean;
|
||||
pullDownThreshold: number;
|
||||
}>;
|
||||
__isFragment?: never;
|
||||
__isTeleport?: never;
|
||||
__isSuspense?: never;
|
||||
} & import("vue").ComponentOptionsBase<{
|
||||
disabled: boolean;
|
||||
pullDownThreshold: number;
|
||||
} & {} & {
|
||||
$children?: {
|
||||
default?: (() => import("vue").VNodeChild) | undefined;
|
||||
pullDownPanel?: ((arg: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
} | {
|
||||
$stable?: boolean;
|
||||
} | (() => import("vue").VNodeChild) | import("vue").VNodeChild;
|
||||
'v-slots'?: {
|
||||
default?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
pullDownPanel?: false | ((arg: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
} | undefined;
|
||||
} & {
|
||||
"v-slot:default"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:pullDownPanel"?: false | ((arg: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
} & {
|
||||
onLoad?: ((options: {
|
||||
done: () => void;
|
||||
}) => any) | undefined;
|
||||
}, void, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
load: (options: {
|
||||
done: () => void;
|
||||
}) => true;
|
||||
}, string, {
|
||||
disabled: boolean;
|
||||
pullDownThreshold: number;
|
||||
}, {}, string, import("vue").SlotsType<Partial<{
|
||||
default: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
pullDownPanel: (arg: {
|
||||
canRefresh: boolean;
|
||||
goingUp: boolean;
|
||||
refreshing: boolean;
|
||||
}) => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
}>>, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, import("vue").ComponentProvideOptions> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & import("../../util/index.js").FilterPropsOptions<{
|
||||
disabled: BooleanConstructor;
|
||||
pullDownThreshold: {
|
||||
type: NumberConstructor;
|
||||
default: number;
|
||||
};
|
||||
}, import("vue").ExtractPropTypes<{
|
||||
disabled: BooleanConstructor;
|
||||
pullDownThreshold: {
|
||||
type: NumberConstructor;
|
||||
default: number;
|
||||
};
|
||||
}>>;
|
||||
export type VPullToRefresh = InstanceType<typeof VPullToRefresh>;
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
import { createVNode as _createVNode, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode } from "vue";
|
||||
// Styles
|
||||
import "./VPullToRefresh.css";
|
||||
|
||||
// Components
|
||||
import { VIcon } from "../../components/VIcon/index.js";
|
||||
import { VProgressCircular } from "../../components/VProgressCircular/index.js"; // Utilities
|
||||
import { computed, onMounted, ref, shallowRef, watch } from 'vue';
|
||||
import { clamp, convertToUnit, genericComponent, getScrollParents, useRender } from "../../util/index.js";
|
||||
export const VPullToRefresh = genericComponent()({
|
||||
name: 'VPullToRefresh',
|
||||
props: {
|
||||
disabled: Boolean,
|
||||
pullDownThreshold: {
|
||||
type: Number,
|
||||
default: 64
|
||||
}
|
||||
},
|
||||
emits: {
|
||||
load: options => true
|
||||
},
|
||||
setup(props, {
|
||||
slots,
|
||||
emit
|
||||
}) {
|
||||
let touchstartY = 0;
|
||||
let scrollParents = [];
|
||||
const touchDiff = shallowRef(0);
|
||||
const containerRef = ref();
|
||||
const refreshing = shallowRef(false);
|
||||
const goingUp = shallowRef(false);
|
||||
const touching = shallowRef(false);
|
||||
const canRefresh = computed(() => touchDiff.value >= props.pullDownThreshold && !refreshing.value);
|
||||
const topOffset = computed(() => clamp(touchDiff.value, 0, props.pullDownThreshold));
|
||||
function onTouchstart(e) {
|
||||
if (refreshing.value || props.disabled) return;
|
||||
touching.value = true;
|
||||
touchstartY = 'clientY' in e ? e.clientY : e.touches[0].clientY;
|
||||
}
|
||||
function onTouchmove(e) {
|
||||
if (refreshing.value || !touching.value || props.disabled) return;
|
||||
const touchY = 'clientY' in e ? e.clientY : e.touches[0].clientY;
|
||||
if (scrollParents.length && !scrollParents[0].scrollTop) {
|
||||
touchDiff.value = touchY - touchstartY;
|
||||
}
|
||||
}
|
||||
function onTouchend(e) {
|
||||
if (refreshing.value || props.disabled) return;
|
||||
touching.value = false;
|
||||
if (canRefresh.value) {
|
||||
function done() {
|
||||
if (!refreshing.value) return;
|
||||
touchDiff.value = 0;
|
||||
refreshing.value = false;
|
||||
}
|
||||
emit('load', {
|
||||
done
|
||||
});
|
||||
refreshing.value = true;
|
||||
} else {
|
||||
touchDiff.value = 0;
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
scrollParents = getScrollParents(containerRef.value);
|
||||
});
|
||||
watch([topOffset, refreshing], () => {
|
||||
if (scrollParents.length) {
|
||||
const stopScrolling = topOffset.value && !refreshing.value;
|
||||
scrollParents.forEach(p => p.style.overflow = stopScrolling ? 'hidden' : 'auto');
|
||||
}
|
||||
});
|
||||
watch(topOffset, (newVal, oldVal) => {
|
||||
goingUp.value = newVal < oldVal;
|
||||
});
|
||||
useRender(() => {
|
||||
return _createElementVNode("div", {
|
||||
"class": _normalizeClass(['v-pull-to-refresh']),
|
||||
"onTouchstart": onTouchstart,
|
||||
"onTouchmove": onTouchmove,
|
||||
"onTouchend": onTouchend,
|
||||
"onMousedown": onTouchstart,
|
||||
"onMouseup": onTouchend,
|
||||
"onMouseleave": onTouchend,
|
||||
"onMousemove": onTouchmove,
|
||||
"ref": containerRef
|
||||
}, [_createElementVNode("div", {
|
||||
"class": _normalizeClass(['v-pull-to-refresh__pull-down', {
|
||||
'v-pull-to-refresh__pull-down--touching': touching.value
|
||||
}]),
|
||||
"style": {
|
||||
top: convertToUnit(-1 * props.pullDownThreshold + topOffset.value),
|
||||
height: convertToUnit(props.pullDownThreshold)
|
||||
}
|
||||
}, [slots.pullDownPanel ? slots.pullDownPanel({
|
||||
canRefresh: canRefresh.value,
|
||||
goingUp: goingUp.value,
|
||||
refreshing: refreshing.value
|
||||
}) : _createElementVNode("div", {
|
||||
"class": _normalizeClass(['v-pull-to-refresh__pull-down-default'])
|
||||
}, [refreshing.value ? _createVNode(VProgressCircular, {
|
||||
"indeterminate": true,
|
||||
"active": false
|
||||
}, null) : _createVNode(VIcon, {
|
||||
"icon": canRefresh.value || goingUp.value ? '$sortAsc' : '$sortDesc'
|
||||
}, null)])]), _createElementVNode("div", {
|
||||
"class": _normalizeClass(['v-pull-to-refresh__scroll-container', {
|
||||
'v-pull-to-refresh__scroll-container--touching': touching.value
|
||||
}]),
|
||||
"style": {
|
||||
top: convertToUnit(topOffset.value)
|
||||
}
|
||||
}, [slots.default?.()])]);
|
||||
});
|
||||
}
|
||||
});
|
||||
//# sourceMappingURL=VPullToRefresh.js.map
|
||||
+1
File diff suppressed because one or more lines are too long
+23
@@ -0,0 +1,23 @@
|
||||
.v-pull-to-refresh
|
||||
overflow: hidden
|
||||
position: relative
|
||||
&__pull-down
|
||||
position: absolute
|
||||
width: 100%
|
||||
transition: top .3s ease-out
|
||||
&--touching
|
||||
transition: none
|
||||
|
||||
&__pull-down-default
|
||||
display: flex
|
||||
width: 100%
|
||||
height: 100%
|
||||
justify-content: center
|
||||
align-items: flex-end
|
||||
padding-bottom: 10px
|
||||
|
||||
&__scroll-container
|
||||
position: relative
|
||||
transition: top .3s ease-out
|
||||
&--touching
|
||||
transition: none
|
||||
+1
@@ -0,0 +1 @@
|
||||
export { VPullToRefresh } from './VPullToRefresh.js';
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
export { VPullToRefresh } from "./VPullToRefresh.js";
|
||||
//# sourceMappingURL=index.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","names":["VPullToRefresh"],"sources":["../../../src/labs/VPullToRefresh/index.ts"],"sourcesContent":["export { VPullToRefresh } from './VPullToRefresh'\n"],"mappings":"SAASA,cAAc","ignoreList":[]}
|
||||
Reference in New Issue
Block a user