@maas/vue-equipment 0.5.0 → 0.6.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.
Files changed (54) hide show
  1. package/dist/composables/index.js.map +1 -1
  2. package/dist/composables/index.mjs.map +1 -1
  3. package/dist/nuxt/module.json +1 -1
  4. package/dist/nuxt/module.mjs +16 -2
  5. package/dist/plugins/MagicMarquee/src/components/MagicMarquee.vue +3 -3
  6. package/dist/plugins/MagicMarquee/src/composables/{useMarquee.d.ts → useMarqueeApi.d.ts} +2 -2
  7. package/dist/plugins/MagicMarquee/src/composables/{useMarquee.mjs → useMarqueeApi.mjs} +1 -1
  8. package/dist/plugins/MagicModal/src/components/MagicModal.vue +39 -58
  9. package/dist/plugins/MagicModal/src/components/MagicModal.vue.d.ts +15 -15
  10. package/dist/plugins/MagicModal/src/composables/useModalApi.d.ts +4 -3
  11. package/dist/plugins/MagicModal/src/composables/useModalApi.mjs +4 -3
  12. package/dist/plugins/MagicModal/src/composables/useModalCallback.d.ts +22 -0
  13. package/dist/plugins/MagicModal/src/composables/useModalCallback.mjs +60 -0
  14. package/dist/plugins/MagicModal/src/types/index.d.ts +7 -5
  15. package/dist/plugins/MagicModal/src/utils/defaultOptions.d.ts +2 -2
  16. package/dist/plugins/MagicPlayer/src/composables/useControlsApi.mjs +1 -2
  17. package/dist/plugins/MagicPlayer/src/composables/useMediaApi.d.ts +1 -1
  18. package/dist/plugins/MagicPlayer/src/composables/useMediaApi.mjs +2 -2
  19. package/dist/plugins/MagicPlayer/src/composables/useRuntimeSourceProvider.mjs +1 -2
  20. package/dist/plugins/MagicPlayer/src/types/index.d.ts +1 -1
  21. package/dist/plugins/MagicScroll/index.mjs +2 -0
  22. package/dist/plugins/MagicScroll/src/components/MagicScrollMotion.vue +58 -0
  23. package/dist/plugins/MagicScroll/src/components/MagicScrollMotion.vue.d.ts +42 -0
  24. package/dist/plugins/MagicScroll/src/components/MagicScrollTransform.vue.d.ts +9 -9
  25. package/dist/plugins/MagicScroll/src/composables/useProgress.d.ts +1 -1
  26. package/dist/plugins/MagicScroll/src/composables/useProgress.mjs +1 -2
  27. package/dist/plugins/MagicScroll/src/types/injectionKeys.d.ts +1 -2
  28. package/dist/plugins/MagicToast/demo/DemoToast.vue +22 -0
  29. package/dist/plugins/MagicToast/demo/DemoToast.vue.d.ts +14 -0
  30. package/dist/plugins/MagicToast/index.d.ts +5 -0
  31. package/dist/plugins/MagicToast/index.mjs +9 -0
  32. package/dist/plugins/MagicToast/nuxt.d.ts +2 -0
  33. package/dist/plugins/MagicToast/nuxt.mjs +5 -0
  34. package/dist/plugins/MagicToast/src/components/MagicToast.vue +229 -0
  35. package/dist/plugins/MagicToast/src/components/MagicToast.vue.d.ts +28 -0
  36. package/dist/plugins/MagicToast/src/components/MagicToastComponent.vue +101 -0
  37. package/dist/plugins/MagicToast/src/components/MagicToastComponent.vue.d.ts +48 -0
  38. package/dist/plugins/MagicToast/src/composables/useToastApi.d.ts +11 -0
  39. package/dist/plugins/MagicToast/src/composables/useToastApi.mjs +60 -0
  40. package/dist/plugins/MagicToast/src/composables/useToastCallback.d.ts +21 -0
  41. package/dist/plugins/MagicToast/src/composables/useToastCallback.mjs +43 -0
  42. package/dist/plugins/MagicToast/src/composables/useToastEmitter.d.ts +15 -0
  43. package/dist/plugins/MagicToast/src/composables/useToastEmitter.mjs +9 -0
  44. package/dist/plugins/MagicToast/src/composables/useToastInternalApi.d.ts +4 -0
  45. package/dist/plugins/MagicToast/src/composables/useToastInternalApi.mjs +26 -0
  46. package/dist/plugins/MagicToast/src/composables/useToastStore.d.ts +17 -0
  47. package/dist/plugins/MagicToast/src/composables/useToastStore.mjs +41 -0
  48. package/dist/plugins/MagicToast/src/types/index.d.ts +42 -0
  49. package/dist/plugins/MagicToast/src/types/index.mjs +0 -0
  50. package/dist/plugins/MagicToast/src/utils/defaultOptions.d.ts +3 -0
  51. package/dist/plugins/MagicToast/src/utils/defaultOptions.mjs +14 -0
  52. package/dist/plugins/index.d.ts +0 -4
  53. package/dist/plugins/index.mjs +0 -4
  54. package/package.json +13 -1
@@ -1,6 +1,7 @@
1
1
  import MagicScrollProvider from "./src/components/MagicScrollProvider.vue";
2
2
  import MagicScrollScene from "./src/components/MagicScrollScene.vue";
3
3
  import MagicScrollTransform from "./src/components/MagicScrollTransform.vue";
4
+ import MagicScrollMotion from "./src/components/MagicScrollMotion.vue";
4
5
  import MagicScrollCollision from "./src/components/MagicScrollCollision.vue";
5
6
  import { magicScrollStore } from "./src/store/index.mjs";
6
7
  import { useCollisionEmitter } from "./src/composables/useCollisionEmitter.mjs";
@@ -12,6 +13,7 @@ const MagicScroll = {
12
13
  app.component("MagicScrollProvider", MagicScrollProvider);
13
14
  app.component("MagicScrollScene", MagicScrollScene);
14
15
  app.component("MagicScrollTransform", MagicScrollTransform);
16
+ app.component("MagicScrollMotion", MagicScrollMotion);
15
17
  app.component("MagicScrollCollision", MagicScrollCollision);
16
18
  app.provide(StoreKey, magicScrollStore);
17
19
  }
@@ -0,0 +1,58 @@
1
+ <template>
2
+ <div ref="el" class="m-scroll-motion">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { ref, inject, computed, onMounted, toRaw, watch } from 'vue'
9
+ import { animate, type Easing } from 'motion'
10
+ import { ScrollProgressKey } from '../types'
11
+
12
+ interface Props {
13
+ keyframes: Record<string, any> | null | undefined
14
+ offset?: number[] | undefined
15
+ easing?: Easing
16
+ }
17
+
18
+ const props = withDefaults(defineProps<Props>(), {
19
+ keyframes: undefined,
20
+ offset: undefined,
21
+ easing: 'linear',
22
+ })
23
+
24
+ const animation = ref()
25
+ const el = ref()
26
+
27
+ const progress = inject(
28
+ ScrollProgressKey,
29
+ computed(() => 0),
30
+ )
31
+
32
+ function createAnimation(currentTime: number = 0) {
33
+ if (!props.keyframes) return
34
+ animation.value = animate(toRaw(el.value), props.keyframes, {
35
+ duration: 1,
36
+ easing: props.easing || 'linear',
37
+ offset: props.offset,
38
+ })
39
+ animation.value.stop()
40
+ animation.value.currentTime = currentTime
41
+ }
42
+
43
+ onMounted(() => {
44
+ createAnimation()
45
+ })
46
+
47
+ watch(progress, (value) => {
48
+ if (!animation.value || !props.keyframes) return
49
+ animation.value.currentTime = value
50
+ })
51
+
52
+ watch(
53
+ () => props.keyframes,
54
+ () => {
55
+ createAnimation(progress.value)
56
+ },
57
+ )
58
+ </script>
@@ -0,0 +1,42 @@
1
+ import { type Easing } from 'motion';
2
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
3
+ offset: {
4
+ type: import("vue").PropType<number[]>;
5
+ default: undefined;
6
+ };
7
+ keyframes: {
8
+ type: import("vue").PropType<Record<string, any> | null | undefined>;
9
+ required: true;
10
+ default: undefined;
11
+ };
12
+ easing: {
13
+ type: import("vue").PropType<Easing>;
14
+ default: string;
15
+ };
16
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
17
+ offset: {
18
+ type: import("vue").PropType<number[]>;
19
+ default: undefined;
20
+ };
21
+ keyframes: {
22
+ type: import("vue").PropType<Record<string, any> | null | undefined>;
23
+ required: true;
24
+ default: undefined;
25
+ };
26
+ easing: {
27
+ type: import("vue").PropType<Easing>;
28
+ default: string;
29
+ };
30
+ }>>, {
31
+ offset: number[];
32
+ keyframes: Record<string, any> | null | undefined;
33
+ easing: Easing;
34
+ }, {}>, {
35
+ default?(_: {}): any;
36
+ }>;
37
+ export default _default;
38
+ type __VLS_WithTemplateSlots<T, S> = T & {
39
+ new (): {
40
+ $slots: S;
41
+ };
42
+ };
@@ -3,10 +3,6 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
3
3
  type: import("vue").PropType<number>;
4
4
  default: number;
5
5
  };
6
- as: {
7
- type: import("vue").PropType<string>;
8
- default: string;
9
- };
10
6
  scaleX: {
11
7
  type: import("vue").PropType<number>;
12
8
  default: number;
@@ -23,6 +19,10 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
23
19
  type: import("vue").PropType<number>;
24
20
  default: number;
25
21
  };
22
+ as: {
23
+ type: import("vue").PropType<string>;
24
+ default: string;
25
+ };
26
26
  translateX: {
27
27
  type: import("vue").PropType<number>;
28
28
  default: number;
@@ -36,10 +36,6 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
36
36
  type: import("vue").PropType<number>;
37
37
  default: number;
38
38
  };
39
- as: {
40
- type: import("vue").PropType<string>;
41
- default: string;
42
- };
43
39
  scaleX: {
44
40
  type: import("vue").PropType<number>;
45
41
  default: number;
@@ -56,6 +52,10 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
56
52
  type: import("vue").PropType<number>;
57
53
  default: number;
58
54
  };
55
+ as: {
56
+ type: import("vue").PropType<string>;
57
+ default: string;
58
+ };
59
59
  translateX: {
60
60
  type: import("vue").PropType<number>;
61
61
  default: number;
@@ -66,11 +66,11 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
66
66
  };
67
67
  }>>, {
68
68
  scale: number;
69
- as: string;
70
69
  scaleX: number;
71
70
  scaleY: number;
72
71
  skewX: number;
73
72
  skewY: number;
73
+ as: string;
74
74
  translateX: number;
75
75
  translateY: number;
76
76
  }, {}>, {
@@ -1,4 +1,4 @@
1
- import type { MaybeRef, MaybeRefOrGetter } from '@vueuse/core';
1
+ import { type MaybeRef, type MaybeRefOrGetter } from 'vue';
2
2
  import type { FromTo } from '../types.js';
3
3
  type UseProgressParams = {
4
4
  child: MaybeRef<HTMLElement | null | undefined>;
@@ -1,6 +1,5 @@
1
- import { ref, inject } from "vue";
1
+ import { ref, inject, toValue } from "vue";
2
2
  import { useElementBounding, useWindowSize } from "@vueuse/core";
3
- import { toValue } from "@vueuse/core";
4
3
  import { ScrollPositionKey } from "../types/index.mjs";
5
4
  import { clampValue } from "../utils/index.mjs";
6
5
  export function useProgress(params) {
@@ -1,5 +1,4 @@
1
- import type { InjectionKey, Ref } from 'vue';
2
- import type { MaybeRefOrGetter } from '@vueuse/core';
1
+ import type { InjectionKey, Ref, MaybeRefOrGetter } from 'vue';
3
2
  declare const ScrollParentKey: InjectionKey<MaybeRefOrGetter<HTMLElement | undefined>>;
4
3
  declare const ScrollPositionKey: InjectionKey<{
5
4
  x: import("vue").WritableComputedRef<number>;
@@ -0,0 +1,22 @@
1
+ <template>
2
+ <div
3
+ class="bg-gray-300 text-black rounded-md p-3 w-[250px] max-w-sm text-sm pointer-events-auto cursor-pointer flex items-center"
4
+ >
5
+ {{ message }}
6
+ <button
7
+ @click="emit('close')"
8
+ class="text-xs bg-gray-900/5 ml-auto p-2 rounded-full"
9
+ >
10
+ Close
11
+ </button>
12
+ </div>
13
+ </template>
14
+
15
+ <script setup lang="ts">
16
+ interface Props {
17
+ message: string
18
+ }
19
+
20
+ const emit = defineEmits(['close'])
21
+ const props = defineProps<Props>()
22
+ </script>
@@ -0,0 +1,14 @@
1
+ declare const _default: import("vue").DefineComponent<{
2
+ message: {
3
+ type: import("vue").PropType<string>;
4
+ required: true;
5
+ };
6
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "close"[], "close", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
7
+ message: {
8
+ type: import("vue").PropType<string>;
9
+ required: true;
10
+ };
11
+ }>> & {
12
+ onClose?: ((...args: any[]) => any) | undefined;
13
+ }, {}, {}>;
14
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import { useToastApi } from './src/composables/useToastApi.js';
2
+ import { useToastEmitter } from './src/composables/useToastEmitter.js';
3
+ import type { Plugin } from 'vue';
4
+ declare const MagicToast: Plugin;
5
+ export { MagicToast, useToastApi, useToastEmitter };
@@ -0,0 +1,9 @@
1
+ import MagicToastComponent from "./src/components/MagicToast.vue";
2
+ import { useToastApi } from "./src/composables/useToastApi.mjs";
3
+ import { useToastEmitter } from "./src/composables/useToastEmitter.mjs";
4
+ const MagicToast = {
5
+ install: (app) => {
6
+ app.component("MagicToast", MagicToastComponent);
7
+ }
8
+ };
9
+ export { MagicToast, useToastApi, useToastEmitter };
@@ -0,0 +1,2 @@
1
+ declare const _default: import("nuxt/app").Plugin<Record<string, unknown>>;
2
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import { defineNuxtPlugin } from "nuxt/app";
2
+ import { MagicToast } from "./index.mjs";
3
+ export default defineNuxtPlugin((nuxtApp) => {
4
+ nuxtApp.vueApp.use(MagicToast);
5
+ });
@@ -0,0 +1,229 @@
1
+ <template>
2
+ <Teleport
3
+ :to="mappedOptions.teleport?.target"
4
+ :disabled="mappedOptions.teleport?.disabled"
5
+ >
6
+ <div class="magic-toast" :id="toValue(id)" :class="toValue(props.class)">
7
+ <transition-group
8
+ tag="ol"
9
+ ref="listRef"
10
+ class="magic-toast__inner"
11
+ :name="mappedOptions.transitions!.list"
12
+ :on-before-enter="onBeforeEnter"
13
+ :on-enter="onEnter"
14
+ :on-after-enter="onAfterEnter"
15
+ :on-before-leave="onBeforeLeave"
16
+ :on-leave="onLeave"
17
+ :on-after-leave="onAfterLeave"
18
+ >
19
+ <magic-toast-component
20
+ v-for="(toast, index) in toasts"
21
+ :id="toast.id"
22
+ :key="toast.id"
23
+ :index="index"
24
+ :total="count || 0"
25
+ :siblings="activeElements"
26
+ :class="{
27
+ expanded: isExpanded,
28
+ }"
29
+ @mouseenter="onMouseenter"
30
+ @mouseleave="onMouseleave"
31
+ >
32
+ <component
33
+ :is="toast.component"
34
+ v-bind="toast.props"
35
+ @close="toast.remove"
36
+ @click.self="onClick"
37
+ />
38
+ </magic-toast-component>
39
+ </transition-group>
40
+ </div>
41
+ </Teleport>
42
+ </template>
43
+
44
+ <script setup lang="ts">
45
+ import { defu } from 'defu'
46
+ import { toValue, ref, type MaybeRef } from 'vue'
47
+ import { onClickOutside, type MaybeElement } from '@vueuse/core'
48
+ import { defaultOptions } from './../utils/defaultOptions'
49
+ import { useToastApi } from './../composables/useToastApi'
50
+ import { useToastCallback } from './../composables/useToastCallback'
51
+
52
+ import MagicToastComponent from './MagicToastComponent.vue'
53
+
54
+ import type { Options } from './../types/index'
55
+
56
+ interface MagicToastProps {
57
+ id: MaybeRef<string>
58
+ class: MaybeRef<string>
59
+ options?: Options
60
+ }
61
+
62
+ const props = defineProps<MagicToastProps>()
63
+
64
+ const { toasts, count, oldest } = useToastApi(props.id)
65
+
66
+ const mappedOptions = defu(props.options, defaultOptions)
67
+ const isExpanded = ref(mappedOptions.layout?.expand === true)
68
+ const listRef = ref<MaybeElement>()
69
+
70
+ const {
71
+ onBeforeEnter,
72
+ onEnter,
73
+ onAfterEnter,
74
+ onBeforeLeave,
75
+ onLeave,
76
+ onAfterLeave,
77
+ activeElements,
78
+ } = useToastCallback({ id: props.id, mappedOptions, count, oldest })
79
+
80
+ function onMouseenter() {
81
+ if (mappedOptions.layout?.expand === 'hover') {
82
+ isExpanded.value = true
83
+ }
84
+ }
85
+
86
+ function onMouseleave() {
87
+ if (mappedOptions.layout?.expand === 'hover') {
88
+ isExpanded.value = false
89
+ }
90
+ }
91
+
92
+ function onClick() {
93
+ if (mappedOptions.layout?.expand === 'click') {
94
+ isExpanded.value = true
95
+ }
96
+ }
97
+
98
+ function outsideClickCallback() {
99
+ if (mappedOptions.layout?.expand === 'click') {
100
+ isExpanded.value = false
101
+ }
102
+ }
103
+
104
+ onClickOutside(listRef, outsideClickCallback)
105
+ </script>
106
+
107
+ <style lang="css">
108
+ :root {
109
+ --magic-toast-enter-x: 0;
110
+ --magic-toast-enter-y: 0;
111
+ --magic-toast-scale: 0.1;
112
+ --magic-toast-transform-x: 0;
113
+ --magic-toast-transform-y: 0;
114
+ --magic-toast-transition: transform 300ms ease-out;
115
+ --magic-toast-z-index: 999;
116
+ --magic-toast-gap: 0.75rem;
117
+ --magic-toast-padding: 1rem;
118
+
119
+ --mt-multiplier: 1;
120
+ --mt-transform-x: -50%;
121
+ --mt-transform-y: -50%;
122
+ }
123
+
124
+ .magic-toast {
125
+ position: fixed;
126
+ inset: 0;
127
+ width: 100%;
128
+ height: 100%;
129
+ display: flex;
130
+ flex-direction: column;
131
+ justify-content: center;
132
+ align-items: center;
133
+ z-index: var(--magic-toast-z-index, 999);
134
+ background: transparent;
135
+ color: inherit;
136
+ pointer-events: none;
137
+ }
138
+
139
+ .magic-toast__inner {
140
+ position: relative;
141
+ overflow: scroll;
142
+ max-height: 100%;
143
+ width: 100%;
144
+ height: 100%;
145
+ & .magic-toast-component {
146
+ left: 50%;
147
+ top: 50%;
148
+ transform: translateX(var(--mt-transform-x, -50%))
149
+ translateY(var(--mt-transform-y, -50%));
150
+ }
151
+ }
152
+
153
+ .magic-toast__inner * {
154
+ pointer-events: all;
155
+ }
156
+
157
+ .magic-toast.-top-left,
158
+ .magic-toast.-top-center,
159
+ .magic-toast.-top-right {
160
+ --magic-toast-transform-y: 10;
161
+ --magic-toast-enter-y: -100%;
162
+ --mt-multiplier: 1;
163
+ & .magic-toast-component {
164
+ top: var(--magic-toast-padding, 1rem);
165
+ --mt-transform-y: 0;
166
+ }
167
+ }
168
+
169
+ .magic-toast.-bottom-left,
170
+ .magic-toast.-bottom-center,
171
+ .magic-toast.-bottom-right {
172
+ --magic-toast-transform-y: 10;
173
+ --magic-toast-enter-y: 100%;
174
+ --mt-multiplier: -1;
175
+ & .magic-toast-component {
176
+ top: unset;
177
+ bottom: var(--magic-toast-padding, 1rem);
178
+ --mt-transform-y: 0;
179
+ }
180
+ }
181
+
182
+ .magic-toast.-top-left,
183
+ .magic-toast.-bottom-left {
184
+ & .magic-toast-component {
185
+ left: var(--magic-toast-padding, 1rem);
186
+ --mt-transform-x: 0;
187
+ }
188
+ }
189
+
190
+ .magic-toast.-top-right,
191
+ .magic-toast.-bottom-right {
192
+ & .magic-toast-component {
193
+ left: unset;
194
+ right: var(--magic-toast-padding, 1rem);
195
+ --mt-transform-x: 0;
196
+ }
197
+ }
198
+
199
+ .magic-toast.-from-left {
200
+ --magic-toast-enter-x: -100%;
201
+ --magic-toast-enter-y: 0;
202
+ --magic-toast-transform-y: 0;
203
+ --magic-toast-transform-x: -30;
204
+ }
205
+
206
+ .magic-toast.-from-right {
207
+ --magic-toast-enter-x: 100%;
208
+ --magic-toast-enter-y: 0;
209
+ --magic-toast-transform-y: 0;
210
+ --magic-toast-transform-x: 30;
211
+ }
212
+
213
+ .magic-toast--list-enter-active * {
214
+ transition: all 300ms ease-out;
215
+ }
216
+
217
+ .magic-toast--list-enter-from * {
218
+ transform: translateY(var(--magic-toast-enter-y, 0))
219
+ translateX(var(--magic-toast-enter-x, 0));
220
+ }
221
+
222
+ .magic-toast--list-leave-active {
223
+ transition: all 150ms ease-out;
224
+ }
225
+
226
+ .magic-toast--list-leave-to {
227
+ opacity: 0;
228
+ }
229
+ </style>
@@ -0,0 +1,28 @@
1
+ import { type MaybeRef } from 'vue';
2
+ import type { Options } from './../types/index';
3
+ declare const _default: import("vue").DefineComponent<{
4
+ id: {
5
+ type: import("vue").PropType<MaybeRef<string>>;
6
+ required: true;
7
+ };
8
+ class: {
9
+ type: import("vue").PropType<MaybeRef<string>>;
10
+ required: true;
11
+ };
12
+ options: {
13
+ type: import("vue").PropType<Options>;
14
+ };
15
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
16
+ id: {
17
+ type: import("vue").PropType<MaybeRef<string>>;
18
+ required: true;
19
+ };
20
+ class: {
21
+ type: import("vue").PropType<MaybeRef<string>>;
22
+ required: true;
23
+ };
24
+ options: {
25
+ type: import("vue").PropType<Options>;
26
+ };
27
+ }>>, {}, {}>;
28
+ export default _default;
@@ -0,0 +1,101 @@
1
+ <template>
2
+ <li
3
+ class="magic-toast-component"
4
+ ref="elRef"
5
+ @mouseenter="onMouseenter"
6
+ :id="id"
7
+ >
8
+ <div class="magic-toast-component__inner">
9
+ <slot />
10
+ </div>
11
+ </li>
12
+ </template>
13
+
14
+ <script lang="ts" setup>
15
+ import { ref, computed, onMounted, watchEffect } from 'vue'
16
+ import { type ActiveElement } from './../types'
17
+
18
+ interface Props {
19
+ index: number
20
+ total: number
21
+ id: string
22
+ siblings: ActiveElement[]
23
+ }
24
+
25
+ const props = defineProps<Props>()
26
+ const emit = defineEmits<{
27
+ mouseenter: [event: Event]
28
+ }>()
29
+
30
+ const elRef = ref<HTMLElement | undefined>(undefined)
31
+ const newerSiblings = computed(() => {
32
+ return props.siblings.slice(props.index + 1)
33
+ })
34
+
35
+ function setIndex() {
36
+ const index = (props.total - props.index - 1).toString()
37
+ elRef.value?.style.setProperty('--mt-index', index)
38
+ }
39
+
40
+ function setOffset() {
41
+ const offset = newerSiblings.value.reduce((acc, curr) => {
42
+ return acc + curr.height
43
+ }, 0)
44
+ elRef.value?.style.setProperty('--mt-offset', `${offset}`)
45
+ }
46
+
47
+ function onMouseenter(event: Event) {
48
+ emit('mouseenter', event)
49
+ }
50
+
51
+ onMounted(() => {
52
+ setIndex()
53
+ setOffset()
54
+ })
55
+
56
+ watchEffect(() => {
57
+ setIndex()
58
+ setOffset()
59
+ })
60
+ </script>
61
+
62
+ <style lang="css">
63
+ .magic-toast-component {
64
+ --mt-index: 0;
65
+ --mt-offset: 0;
66
+ --mt-matrix-scale: calc(1 - (var(--magic-toast-scale) * var(--mt-index, 0)));
67
+ --mt-matrix-transform-x: calc(
68
+ var(--magic-toast-transform-x) * var(--mt-index, 0) * var(--mt-multiplier)
69
+ );
70
+ --mt-matrix-transform-y: calc(
71
+ var(--magic-toast-transform-y) * var(--mt-index, 0) * var(--mt-multiplier)
72
+ );
73
+ position: absolute;
74
+ }
75
+
76
+ .magic-toast-component__inner {
77
+ position: relative;
78
+ width: 100%;
79
+ height: 100%;
80
+ transition: var(--magic-toast-transition, transform 300ms ease-out);
81
+ transform: matrix(
82
+ var(--mt-matrix-scale),
83
+ 0,
84
+ 0,
85
+ var(--mt-matrix-scale),
86
+ var(--mt-matrix-transform-x),
87
+ var(--mt-matrix-transform-y)
88
+ );
89
+ }
90
+
91
+ .magic-toast-component.expanded {
92
+ --mt-matrix-scale: 1;
93
+ --mt-matrix-transform-y: calc(((var(--mt-offset)) * var(--mt-multiplier)));
94
+ --mt-matrix-transform-x: 0;
95
+ &:not(:last-child) {
96
+ & .magic-toast-component__inner {
97
+ padding-bottom: calc(var(--magic-toast-gap) * var(--mt-index));
98
+ }
99
+ }
100
+ }
101
+ </style>
@@ -0,0 +1,48 @@
1
+ import { type ActiveElement } from './../types';
2
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
3
+ index: {
4
+ type: import("vue").PropType<number>;
5
+ required: true;
6
+ };
7
+ total: {
8
+ type: import("vue").PropType<number>;
9
+ required: true;
10
+ };
11
+ id: {
12
+ type: import("vue").PropType<string>;
13
+ required: true;
14
+ };
15
+ siblings: {
16
+ type: import("vue").PropType<ActiveElement[]>;
17
+ required: true;
18
+ };
19
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
20
+ mouseenter: (event: Event) => void;
21
+ }, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
22
+ index: {
23
+ type: import("vue").PropType<number>;
24
+ required: true;
25
+ };
26
+ total: {
27
+ type: import("vue").PropType<number>;
28
+ required: true;
29
+ };
30
+ id: {
31
+ type: import("vue").PropType<string>;
32
+ required: true;
33
+ };
34
+ siblings: {
35
+ type: import("vue").PropType<ActiveElement[]>;
36
+ required: true;
37
+ };
38
+ }>> & {
39
+ onMouseenter?: ((event: Event) => any) | undefined;
40
+ }, {}, {}>, {
41
+ default?(_: {}): any;
42
+ }>;
43
+ export default _default;
44
+ type __VLS_WithTemplateSlots<T, S> = T & {
45
+ new (): {
46
+ $slots: S;
47
+ };
48
+ };
@@ -0,0 +1,11 @@
1
+ import { type MaybeRef, type ComputedRef } from 'vue';
2
+ import type { AddArgs } from './../types.js';
3
+ export declare function useToastApi(id?: MaybeRef<string>): {
4
+ toasts: ComputedRef<import("./../types").Toast[] | undefined>;
5
+ count: ComputedRef<number | undefined>;
6
+ oldest: ComputedRef<import("./../types").Toast | undefined>;
7
+ add: (options: Pick<AddArgs, 'component' | 'props' | 'duration'>) => Promise<string | undefined>;
8
+ remove: (id: string) => void;
9
+ clear: () => void;
10
+ };
11
+ export type UseToastApiReturn = ReturnType<typeof useToastApi>;