@maas/vue-equipment 0.3.0 → 0.4.0

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.
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@maas/vue-equipment",
3
3
  "configKey": "vueEquipment",
4
- "version": "0.2.0"
4
+ "version": "0.3.1"
5
5
  }
@@ -8,6 +8,7 @@
8
8
  <dialog
9
9
  ref="modal"
10
10
  class="magic-modal"
11
+ :id="toValue(id)"
11
12
  @click.self="close"
12
13
  aria-modal="true"
13
14
  >
@@ -162,9 +163,10 @@ watch(isActive, async (value) => {
162
163
  </script>
163
164
 
164
165
  <style lang="postcss">
165
- * {
166
- transition-duration: 0s;
167
- animation-duration: 0s;
166
+ :root {
167
+ --magic-modal-z-index: 999;
168
+ --magic-modal-backdrop-color: rgba(0, 0, 0, 0.5);
169
+ --magic-modal-backdrop-filter: unset;
168
170
  }
169
171
 
170
172
  .magic-modal {
@@ -175,7 +177,7 @@ watch(isActive, async (value) => {
175
177
  display: flex;
176
178
  justify-content: center;
177
179
  align-items: center;
178
- z-index: 999;
180
+ z-index: var(--magic-modal-z-index);
179
181
  background: transparent;
180
182
  color: inherit;
181
183
  padding: 0;
@@ -201,7 +203,8 @@ watch(isActive, async (value) => {
201
203
  bottom: 0;
202
204
  width: 100%;
203
205
  height: 100%;
204
- background-color: rgba(0, 0, 0, 0.5);
206
+ background-color: var(--magic-modal-backdrop-color);
207
+ backdrop-filter: var(--magic-modal-backdrop-filter);
205
208
  z-index: -1;
206
209
  }
207
210
 
@@ -8,7 +8,7 @@
8
8
  import { ref, inject, computed, onMounted } from 'vue'
9
9
  import { toValue } from '@vueuse/shared'
10
10
  import { useCollisionDetect } from '../composables/useCollisionDetect'
11
- import { WindowDimensionsKey, WindowScrollKey } from '../types'
11
+ import { ScrollPositionKey } from '../types'
12
12
 
13
13
  import type { CollisionEntry } from '../types'
14
14
 
@@ -20,16 +20,14 @@ const props = defineProps<Props>()
20
20
  const targetRef = ref<HTMLElement | undefined>(undefined)
21
21
  const colDetect = ref()
22
22
 
23
- const scrollPosition = inject(WindowScrollKey, { x: 0, y: 0 })
24
- const windowDimensions = inject(WindowDimensionsKey, { vh: 0, vw: 0 })
25
- const pageYOffset = computed(() => scrollPosition.y)
23
+ const scrollPosition = inject(ScrollPositionKey, undefined)
24
+ const pageYOffset = computed(() => toValue(scrollPosition?.y) || 0)
26
25
 
27
26
  onMounted(() => {
28
27
  colDetect.value = useCollisionDetect(
29
28
  pageYOffset,
30
- windowDimensions,
31
29
  props.collisionEntries,
32
- toValue(targetRef.value)
30
+ toValue(targetRef.value),
33
31
  )
34
32
  })
35
33
  </script>
@@ -1,34 +1,35 @@
1
1
  <template>
2
- <div ref="el" class="magic-scroll-provider">
2
+ <div class="magic-scroll-provider">
3
3
  <slot />
4
4
  </div>
5
5
  </template>
6
6
 
7
7
  <script setup lang="ts">
8
- import { ref, provide, reactive, readonly } from 'vue'
9
- import { useWindowScroll, useWindowSize, toValue } from '@vueuse/core'
10
- import { WindowScrollKey, WindowDimensionsKey } from '../types'
8
+ import { provide, computed } from 'vue'
9
+ import { useScroll } from '@vueuse/core'
10
+ import { ScrollPositionKey, ScrollParentKey } from '../types'
11
11
 
12
12
  interface Props {
13
- hasScrollListener?: Boolean
13
+ active?: Boolean
14
+ el?: HTMLElement
14
15
  }
15
16
  const props = withDefaults(defineProps<Props>(), {
16
- hasScrollListener: () => true,
17
+ active: () => true,
17
18
  })
18
19
 
19
- const el = ref()
20
-
21
- const scrollPosition = props.hasScrollListener
22
- ? useWindowScroll()
23
- : { x: 0, y: 0 }
24
- const { width, height } = useWindowSize()
20
+ // computed is used to avoid reactivity issues
21
+ const mappedEl = computed(() => {
22
+ if (props.el) return props.el
23
+ return window
24
+ })
25
25
 
26
- const windowscrollDefault = reactive(scrollPosition)
27
- const windowDimensionsDefault = reactive({
28
- vw: toValue(width),
29
- vh: toValue(height),
26
+ const mappedParent = computed(() => {
27
+ if (props.el) return props.el
28
+ return undefined
30
29
  })
31
30
 
32
- provide(WindowScrollKey, readonly(windowscrollDefault))
33
- provide(WindowDimensionsKey, readonly(windowDimensionsDefault))
31
+ const scrollPosition = useScroll(mappedEl)
32
+
33
+ provide(ScrollPositionKey, scrollPosition)
34
+ provide(ScrollParentKey, mappedParent)
34
35
  </script>
@@ -1,15 +1,21 @@
1
1
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
2
- hasScrollListener: {
2
+ el: {
3
+ type: import("vue").PropType<HTMLElement>;
4
+ };
5
+ active: {
3
6
  type: import("vue").PropType<Boolean>;
4
7
  default: () => true;
5
8
  };
6
9
  }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
7
- hasScrollListener: {
10
+ el: {
11
+ type: import("vue").PropType<HTMLElement>;
12
+ };
13
+ active: {
8
14
  type: import("vue").PropType<Boolean>;
9
15
  default: () => true;
10
16
  };
11
17
  }>>, {
12
- hasScrollListener: Boolean;
18
+ active: Boolean;
13
19
  }, {}>, {
14
20
  default?(_: {}): any;
15
21
  }>;
@@ -9,7 +9,6 @@ import {
9
9
  ref,
10
10
  provide,
11
11
  inject,
12
- computed,
13
12
  onMounted,
14
13
  watch,
15
14
  nextTick,
@@ -19,7 +18,7 @@ import {
19
18
  import { useIntersectionObserver } from '@vueuse/core'
20
19
  import { mapValue } from '../utils'
21
20
  import { useProgress } from '../composables/useProgress'
22
- import { WindowScrollKey, ScrollProgressKey } from '../types'
21
+ import { ScrollPositionKey, ScrollParentKey, ScrollProgressKey } from '../types'
23
22
 
24
23
  import type { FromTo } from '../types'
25
24
 
@@ -33,17 +32,18 @@ const props = withDefaults(defineProps<Props>(), {
33
32
  to: 'bottom-top',
34
33
  })
35
34
 
36
- const scrollPosition = inject(WindowScrollKey, { x: 0, y: 0 })
37
- const pageYOffset = computed(() => scrollPosition.y)
35
+ const scrollPosition = inject(ScrollPositionKey, undefined)
36
+ const scrollParent = inject(ScrollParentKey)
38
37
 
39
38
  const sceneRef = ref<HTMLElement | undefined>(undefined)
40
39
  const progress = ref(0)
41
40
 
42
- const { getCalculations, getProgress } = useProgress(
43
- sceneRef,
44
- props.from,
45
- props.to
46
- )
41
+ const { getCalculations, getProgress } = useProgress({
42
+ child: sceneRef,
43
+ parent: scrollParent,
44
+ from: props.from,
45
+ to: props.to,
46
+ })
47
47
 
48
48
  const calculate = () => {
49
49
  getCalculations()
@@ -57,12 +57,12 @@ onMounted(() => {
57
57
  })
58
58
 
59
59
  watch(
60
- () => pageYOffset.value,
60
+ () => scrollPosition?.y.value,
61
61
  () => {
62
62
  if (intersecting.value) {
63
63
  calculate()
64
64
  }
65
- }
65
+ },
66
66
  )
67
67
 
68
68
  const intersecting = ref()
@@ -72,7 +72,7 @@ useIntersectionObserver(
72
72
  ([{ isIntersecting }]) => {
73
73
  intersecting.value = isIntersecting
74
74
  },
75
- { rootMargin: '150% 0px 150% 0px' }
75
+ { rootMargin: '150% 0px 150% 0px' },
76
76
  )
77
77
 
78
78
  provide('mapValue', mapValue)
@@ -1,6 +1,6 @@
1
1
  import type { ComputedRef, Ref } from 'vue';
2
- import type { CollisionEntry, CollisionMappedEntry, WindowDimensions } from '../types.js';
3
- export declare function useCollisionDetect(pageYOffset: ComputedRef<number>, windowDimensions: WindowDimensions, collisionEntries: CollisionEntry[], parent: HTMLElement | undefined): {
2
+ import type { CollisionEntry, CollisionMappedEntry } from '../types.js';
3
+ export declare function useCollisionDetect(pageYOffset: ComputedRef<number>, collisionEntries: CollisionEntry[], parent: HTMLElement | undefined): {
4
4
  collisionMappedEntries: Ref<CollisionMappedEntry[]>;
5
5
  };
6
6
  export type UseCollisionDetectReturn = ReturnType<typeof useCollisionDetect>;
@@ -1,7 +1,7 @@
1
1
  import { ref, watch, unref, computed } from "vue";
2
- import { useIntersectionObserver } from "@vueuse/core";
2
+ import { useIntersectionObserver, useWindowSize } from "@vueuse/core";
3
3
  import { useCollisionEmitter } from "./useCollisionEmitter.mjs";
4
- export function useCollisionDetect(pageYOffset, windowDimensions, collisionEntries, parent) {
4
+ export function useCollisionDetect(pageYOffset, collisionEntries, parent) {
5
5
  const scrolled = ref(0);
6
6
  const intersecting = ref();
7
7
  const scrollDirection = ref();
@@ -9,10 +9,11 @@ export function useCollisionDetect(pageYOffset, windowDimensions, collisionEntri
9
9
  const oppositeScrollDirection = computed(
10
10
  () => scrollDirection.value === "up" ? "down" : "up"
11
11
  );
12
+ const windowDimensions = useWindowSize();
12
13
  function getOffset(value) {
13
14
  return typeof value === "function" ? value({
14
- vh: unref(windowDimensions.vh),
15
- vw: unref(windowDimensions.vw)
15
+ vh: unref(windowDimensions.height),
16
+ vw: unref(windowDimensions.width)
16
17
  }) : value || 0;
17
18
  }
18
19
  function initialize() {
@@ -1,7 +1,14 @@
1
- import type { MaybeRef } from '@vueuse/shared';
1
+ import type { MaybeRef, MaybeRefOrGetter } from '@vueuse/shared';
2
2
  import type { FromTo } from '../types.js';
3
- export declare function useProgress(target: MaybeRef<HTMLElement | null | undefined>, from: FromTo, to: FromTo): {
3
+ type UseProgressParams = {
4
+ child: MaybeRef<HTMLElement | null | undefined>;
5
+ parent: MaybeRefOrGetter<HTMLElement | null | undefined>;
6
+ from: FromTo;
7
+ to: FromTo;
8
+ };
9
+ export declare function useProgress(params: UseProgressParams): {
4
10
  getCalculations: () => void;
5
11
  getProgress: () => number;
6
12
  };
7
13
  export type UseProgressReturn = ReturnType<typeof useProgress>;
14
+ export {};
@@ -1,58 +1,72 @@
1
1
  import { ref, inject } from "vue";
2
+ import { useElementBounding, useWindowSize } from "@vueuse/core";
2
3
  import { toValue } from "@vueuse/shared";
3
- import { WindowDimensionsKey, WindowScrollKey } from "../types/index.mjs";
4
+ import { ScrollPositionKey } from "../types/index.mjs";
4
5
  import { clampValue } from "../utils/index.mjs";
5
- export function useProgress(target, from, to) {
6
- const dimensions = inject(WindowDimensionsKey, { vw: 0, vh: 0 });
7
- const scrollPosition = inject(WindowScrollKey, { x: 0, y: 0 });
8
- const targetRect = ref();
6
+ export function useProgress(params) {
7
+ const { child, parent, from, to } = params;
8
+ const scrollPosition = inject(ScrollPositionKey, void 0);
9
+ const childRect = ref();
10
+ const parentRect = ref();
9
11
  const start = ref(0);
10
12
  const end = ref(0);
11
13
  const splitLocation = (location) => {
12
14
  return {
13
- el: location.match(/^[a-z]+/)[0],
14
- vp: location.match(/[a-z]+$/)[0]
15
+ child: location.match(/^[a-z]+/)[0],
16
+ parent: location.match(/[a-z]+$/)[0]
15
17
  };
16
18
  };
17
19
  const getOffsetTop = (points) => {
18
20
  let y = 0;
19
- if (!targetRect.value)
21
+ if (!childRect.value)
20
22
  return y;
21
- switch (points.el) {
23
+ const scrollY = toValue(scrollPosition?.y) || 0;
24
+ if (parent)
25
+ console.log("scrollY:", scrollY);
26
+ switch (points.child) {
22
27
  case "top":
23
- y += targetRect.value.top + scrollPosition.y;
28
+ y += childRect.value.top + scrollY;
24
29
  break;
25
30
  case "center":
26
- y += targetRect.value.top + targetRect.value.height / 2 + scrollPosition.y;
31
+ y += childRect.value.top + childRect.value.height / 2 + scrollY;
27
32
  break;
28
33
  case "bottom":
29
- y += targetRect.value.top + targetRect.value.height + scrollPosition.y;
34
+ y += childRect.value.top + childRect.value.height + scrollY;
30
35
  break;
31
36
  }
32
- switch (points.vp) {
37
+ if (!parentRect.value)
38
+ return y;
39
+ const dimensions = {
40
+ width: toValue(parentRect.value.width),
41
+ height: toValue(parentRect.value.height),
42
+ top: toValue(parentRect.value.top)
43
+ };
44
+ switch (points.parent) {
33
45
  case "top":
34
- y -= 0;
46
+ y -= dimensions.top;
35
47
  break;
36
48
  case "center":
37
- y -= dimensions.vh / 2;
49
+ y -= dimensions.top + dimensions.height / 2;
38
50
  break;
39
51
  case "bottom":
40
- y -= dimensions.vh;
52
+ y -= dimensions.top + dimensions.height;
41
53
  break;
42
54
  case "initial":
43
- y -= targetRect.value.top + scrollPosition.y;
55
+ y -= childRect.value.top + scrollY;
44
56
  break;
45
57
  }
46
58
  return y;
47
59
  };
48
60
  const getCalculations = () => {
49
- targetRect.value = toValue(target)?.getBoundingClientRect();
61
+ childRect.value = toValue(child)?.getBoundingClientRect();
62
+ parentRect.value = toValue(parent) ? useElementBounding(parent) : { ...useWindowSize(), top: 0 };
50
63
  start.value = getOffsetTop(splitLocation(from));
51
64
  end.value = getOffsetTop(splitLocation(to));
52
65
  };
53
66
  const getProgress = () => {
67
+ const scrollY = toValue(scrollPosition?.y) || 0;
54
68
  const total = Math.abs(end.value - start.value);
55
- const current = scrollPosition.y - start.value;
69
+ const current = scrollY - start.value;
56
70
  return clampValue(current / total, 0, 1);
57
71
  };
58
72
  return { getCalculations, getProgress };
@@ -25,10 +25,10 @@ interface CollisionMappedEntry extends Omit<CollisionEntry, 'element'> {
25
25
  };
26
26
  element: HTMLElement;
27
27
  }
28
- type WindowDimensions = {
29
- vw: number;
30
- vh: number;
28
+ type Dimensions = {
29
+ width: number;
30
+ height: number;
31
31
  };
32
32
  type FromTo = 'top-top' | 'top-center' | 'top-bottom' | 'center-top' | 'center-center' | 'center-bottom' | 'bottom-top' | 'bottom-center' | 'bottom-bottom';
33
33
  export * from './injectionKeys.js';
34
- export type { FromTo, CollisionEvents, CollisionEntry, CollisionMappedEntry, WindowDimensions, };
34
+ export type { FromTo, CollisionEvents, CollisionEntry, CollisionMappedEntry, Dimensions, };
@@ -1,12 +1,26 @@
1
1
  import type { InjectionKey, Ref } from 'vue';
2
- import type { WindowDimensions } from './index.js';
3
- declare const WindowDimensionsKey: InjectionKey<WindowDimensions>;
4
- declare const WindowScrollKey: InjectionKey<{
5
- x: number;
6
- y: number;
7
- }>;
2
+ import type { MaybeRefOrGetter } from '@vueuse/shared';
3
+ declare const ScrollParentKey: InjectionKey<MaybeRefOrGetter<HTMLElement | undefined>>;
4
+ declare const ScrollPositionKey: InjectionKey<{
5
+ x: import("vue").WritableComputedRef<number>;
6
+ y: import("vue").WritableComputedRef<number>;
7
+ isScrolling: Ref<boolean>;
8
+ arrivedState: {
9
+ left: boolean;
10
+ right: boolean;
11
+ top: boolean;
12
+ bottom: boolean;
13
+ };
14
+ directions: {
15
+ left: boolean;
16
+ right: boolean;
17
+ top: boolean;
18
+ bottom: boolean;
19
+ };
20
+ measure(): void;
21
+ } | undefined>;
8
22
  declare const ScrollProgressKey: InjectionKey<Ref<number>>;
9
23
  declare const StoreKey: InjectionKey<{
10
24
  isNavigating: boolean;
11
25
  }>;
12
- export { WindowDimensionsKey, WindowScrollKey, ScrollProgressKey, StoreKey };
26
+ export { ScrollParentKey, ScrollPositionKey, ScrollProgressKey, StoreKey };
@@ -1,5 +1,5 @@
1
- const WindowDimensionsKey = Symbol();
2
- const WindowScrollKey = Symbol();
1
+ const ScrollParentKey = Symbol();
2
+ const ScrollPositionKey = Symbol();
3
3
  const ScrollProgressKey = Symbol();
4
4
  const StoreKey = Symbol();
5
- export { WindowDimensionsKey, WindowScrollKey, ScrollProgressKey, StoreKey };
5
+ export { ScrollParentKey, ScrollPositionKey, ScrollProgressKey, StoreKey };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@maas/vue-equipment",
3
3
  "description": "A magic collection of Vue composables, plugins, components and directives",
4
- "version": "0.3.0",
4
+ "version": "0.4.0",
5
5
  "author": "Robin Scholz <https://github.com/robinscholz>, Christoph Jeworutzki <https://github.com/ChristophJeworutzki>",
6
6
  "devDependencies": {
7
7
  "@antfu/ni": "^0.21.5",
@@ -1,4 +0,0 @@
1
- declare let modalsStore: import("vue").ShallowReactive<string[]>;
2
- declare function addIdToStore(id: string): void;
3
- declare function removeIdFromStore(id: string): void;
4
- export { modalsStore, addIdToStore, removeIdFromStore };
@@ -1,9 +0,0 @@
1
- import { shallowReactive } from "vue";
2
- let modalsStore = shallowReactive([]);
3
- function addIdToStore(id) {
4
- modalsStore.push(id);
5
- }
6
- function removeIdFromStore(id) {
7
- modalsStore = modalsStore.filter((x) => x !== id);
8
- }
9
- export { modalsStore, addIdToStore, removeIdFromStore };