@maas/vue-equipment 0.13.1 → 0.14.1
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/dist/nuxt/module.json +1 -1
- package/dist/nuxt/module.mjs +7 -0
- package/dist/plugins/MagicDrawer/index.d.ts +6 -0
- package/dist/plugins/MagicDrawer/index.mjs +9 -0
- package/dist/plugins/MagicDrawer/nuxt.d.ts +0 -0
- package/dist/plugins/MagicDrawer/nuxt.mjs +27 -0
- package/dist/plugins/MagicDrawer/src/components/MagicDrawer.vue +237 -0
- package/dist/plugins/MagicDrawer/src/components/MagicDrawer.vue.d.ts +52 -0
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerCallback.d.ts +22 -0
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerCallback.mjs +61 -0
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.d.ts +15 -0
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.mjs +201 -0
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerStore.d.ts +5 -0
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerStore.mjs +15 -0
- package/dist/plugins/MagicDrawer/src/composables/useDrawerApi.d.ts +19 -0
- package/dist/plugins/MagicDrawer/src/composables/useDrawerApi.mjs +75 -0
- package/dist/plugins/MagicDrawer/src/composables/useDrawerEmitter.d.ts +15 -0
- package/dist/plugins/MagicDrawer/src/composables/useDrawerEmitter.mjs +9 -0
- package/dist/plugins/MagicDrawer/src/index.d.ts +0 -0
- package/dist/plugins/MagicDrawer/src/index.mjs +0 -0
- package/dist/plugins/MagicDrawer/src/types/index.d.ts +29 -0
- package/dist/plugins/MagicDrawer/src/types/index.mjs +0 -0
- package/dist/plugins/MagicDrawer/src/utils/defaultOptions.d.ts +4 -0
- package/dist/plugins/MagicDrawer/src/utils/defaultOptions.mjs +22 -0
- package/dist/plugins/MagicModal/src/components/MagicModal.vue.d.ts +2 -2
- package/dist/plugins/MagicModal/src/composables/private/useModalCallback.d.ts +4 -4
- package/dist/plugins/MagicModal/src/composables/private/useModalCallback.mjs +14 -13
- package/dist/plugins/MagicModal/src/utils/defaultOptions.d.ts +1 -1
- package/dist/plugins/index.d.ts +1 -0
- package/dist/plugins/index.mjs +1 -0
- package/dist/utils/css/animations/slide-btt-out.css +0 -3
- package/dist/utils/css/animations/slide-ltr-out.css +0 -3
- package/dist/utils/css/animations/slide-rtl-out.css +0 -3
- package/dist/utils/css/animations/slide-ttb-out.css +0 -3
- package/dist/utils/index.js +26 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +25 -0
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/nuxt/module.json
CHANGED
package/dist/nuxt/module.mjs
CHANGED
|
@@ -8,6 +8,13 @@ const functions$1 = [
|
|
|
8
8
|
docs: "https://maas.egineering/vue-equipment/plugins/MagicConsent/",
|
|
9
9
|
description: "consent"
|
|
10
10
|
},
|
|
11
|
+
{
|
|
12
|
+
name: "MagicDrawer",
|
|
13
|
+
"package": "plugins",
|
|
14
|
+
lastUpdated: 1704735337000,
|
|
15
|
+
docs: "https://maas.egineering/vue-equipment/plugins/MagicDrawer/",
|
|
16
|
+
description: "drawer"
|
|
17
|
+
},
|
|
11
18
|
{
|
|
12
19
|
name: "MagicMarquee",
|
|
13
20
|
"package": "plugins",
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import MagicDrawer from './src/components/MagicDrawer.vue.js';
|
|
2
|
+
import { useDrawerApi } from './src/composables/useDrawerApi.js';
|
|
3
|
+
import { useDrawerEmitter } from './src/composables/useDrawerEmitter.js';
|
|
4
|
+
import type { Plugin } from 'vue';
|
|
5
|
+
declare const MagicDrawerPlugin: Plugin;
|
|
6
|
+
export { MagicDrawerPlugin, MagicDrawer, useDrawerApi, useDrawerEmitter };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import MagicDrawer from "./src/components/MagicDrawer.vue";
|
|
2
|
+
import { useDrawerApi } from "./src/composables/useDrawerApi.mjs";
|
|
3
|
+
import { useDrawerEmitter } from "./src/composables/useDrawerEmitter.mjs";
|
|
4
|
+
const MagicDrawerPlugin = {
|
|
5
|
+
install: (app) => {
|
|
6
|
+
app.component("MagicDrawer", MagicDrawer);
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
export { MagicDrawerPlugin, MagicDrawer, useDrawerApi, useDrawerEmitter };
|
|
File without changes
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineNuxtModule,
|
|
3
|
+
createResolver,
|
|
4
|
+
addComponentsDir,
|
|
5
|
+
addImports
|
|
6
|
+
} from "@nuxt/kit";
|
|
7
|
+
export default defineNuxtModule({
|
|
8
|
+
meta: {
|
|
9
|
+
name: "@maas/vue-equipment/nuxt/MagicDrawer"
|
|
10
|
+
},
|
|
11
|
+
setup() {
|
|
12
|
+
const resolver = createResolver(import.meta.url);
|
|
13
|
+
addComponentsDir({
|
|
14
|
+
path: resolver.resolve("src/components"),
|
|
15
|
+
global: true,
|
|
16
|
+
pathPrefix: false
|
|
17
|
+
});
|
|
18
|
+
addImports({
|
|
19
|
+
from: "@maas/vue-equipment/plugins/MagicDrawer",
|
|
20
|
+
name: "useDrawerApi"
|
|
21
|
+
});
|
|
22
|
+
addImports({
|
|
23
|
+
from: "@maas/vue-equipment/plugins/MagicDrawer",
|
|
24
|
+
name: "useDrawerEmitter"
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
});
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<transition :duration="5000">
|
|
3
|
+
<teleport
|
|
4
|
+
v-if="wrapperActive"
|
|
5
|
+
:to="mappedOptions.teleport?.target"
|
|
6
|
+
:disabled="mappedOptions.teleport?.disabled"
|
|
7
|
+
>
|
|
8
|
+
<component
|
|
9
|
+
:is="mappedOptions.tag"
|
|
10
|
+
ref="drawer"
|
|
11
|
+
class="magic-drawer"
|
|
12
|
+
:id="toValue(id)"
|
|
13
|
+
:class="[
|
|
14
|
+
toValue(props.class),
|
|
15
|
+
`-${mappedOptions.position}`,
|
|
16
|
+
{ '-dragging': dragging },
|
|
17
|
+
]"
|
|
18
|
+
aria-modal="true"
|
|
19
|
+
>
|
|
20
|
+
<transition
|
|
21
|
+
v-if="mappedOptions.backdrop || !!$slots.backdrop"
|
|
22
|
+
:name="mappedOptions.transitions?.backdrop"
|
|
23
|
+
>
|
|
24
|
+
<div
|
|
25
|
+
v-show="innerActive"
|
|
26
|
+
class="magic-drawer__backdrop"
|
|
27
|
+
@click.self="close"
|
|
28
|
+
>
|
|
29
|
+
<slot name="backdrop" />
|
|
30
|
+
</div>
|
|
31
|
+
</transition>
|
|
32
|
+
<div class="magic-drawer__wrapper">
|
|
33
|
+
<transition
|
|
34
|
+
:name="mappedOptions.transitions?.content"
|
|
35
|
+
@before-leave="onBeforeLeave"
|
|
36
|
+
@leave="onLeave"
|
|
37
|
+
@after-leave="onAfterLeave"
|
|
38
|
+
@before-enter="onBeforeEnter"
|
|
39
|
+
@enter="onEnter"
|
|
40
|
+
@after-enter="onAfterEnter"
|
|
41
|
+
>
|
|
42
|
+
<div
|
|
43
|
+
ref="elRef"
|
|
44
|
+
v-show="innerActive"
|
|
45
|
+
class="magic-drawer__content"
|
|
46
|
+
@pointerdown="onPointerdown"
|
|
47
|
+
:style="style"
|
|
48
|
+
>
|
|
49
|
+
<component
|
|
50
|
+
v-if="component"
|
|
51
|
+
v-bind="props"
|
|
52
|
+
:is="component"
|
|
53
|
+
@close="close"
|
|
54
|
+
/>
|
|
55
|
+
<slot v-else />
|
|
56
|
+
</div>
|
|
57
|
+
</transition>
|
|
58
|
+
</div>
|
|
59
|
+
</component>
|
|
60
|
+
</teleport>
|
|
61
|
+
</transition>
|
|
62
|
+
</template>
|
|
63
|
+
|
|
64
|
+
<script setup lang="ts">
|
|
65
|
+
import {
|
|
66
|
+
ref,
|
|
67
|
+
watch,
|
|
68
|
+
nextTick,
|
|
69
|
+
toValue,
|
|
70
|
+
type Component,
|
|
71
|
+
type MaybeRef,
|
|
72
|
+
} from 'vue'
|
|
73
|
+
import { createDefu } from 'defu'
|
|
74
|
+
import { onKeyStroke, unrefElement } from '@vueuse/core'
|
|
75
|
+
import { defaultOptions } from './../utils/defaultOptions'
|
|
76
|
+
import { useDrawerApi } from './../composables/useDrawerApi'
|
|
77
|
+
import { useDrawerCallback } from '../composables/private/useDrawerCallback'
|
|
78
|
+
import { useDrawerDrag } from '../composables/private/useDrawerDrag'
|
|
79
|
+
|
|
80
|
+
import type { RequireAll } from '@maas/vue-equipment/utils'
|
|
81
|
+
import type { DrawerOptions } from './../types/index'
|
|
82
|
+
|
|
83
|
+
import '@maas/vue-equipment/utils/css/animations/fade-in.css'
|
|
84
|
+
import '@maas/vue-equipment/utils/css/animations/fade-out.css'
|
|
85
|
+
import '@maas/vue-equipment/utils/css/animations/slide-ltr-in.css'
|
|
86
|
+
import '@maas/vue-equipment/utils/css/animations/slide-rtl-in.css'
|
|
87
|
+
import '@maas/vue-equipment/utils/css/animations/slide-ttb-in.css'
|
|
88
|
+
import '@maas/vue-equipment/utils/css/animations/slide-btt-in.css'
|
|
89
|
+
import '@maas/vue-equipment/utils/css/animations/slide-ltr-out.css'
|
|
90
|
+
import '@maas/vue-equipment/utils/css/animations/slide-rtl-out.css'
|
|
91
|
+
import '@maas/vue-equipment/utils/css/animations/slide-ttb-out.css'
|
|
92
|
+
import '@maas/vue-equipment/utils/css/animations/slide-btt-out.css'
|
|
93
|
+
|
|
94
|
+
// Prevent keys array from being merged with default
|
|
95
|
+
const customDefu = createDefu((obj, key, value) => {
|
|
96
|
+
if (key === 'keys') {
|
|
97
|
+
obj[key] = value
|
|
98
|
+
return true
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
interface MagicDrawerProps {
|
|
103
|
+
id: MaybeRef<string>
|
|
104
|
+
class?: MaybeRef<string>
|
|
105
|
+
component?: Component
|
|
106
|
+
props?: Record<string, unknown>
|
|
107
|
+
options?: DrawerOptions
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const props = withDefaults(defineProps<MagicDrawerProps>(), {
|
|
111
|
+
options: () => defaultOptions,
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
const elRef = ref<HTMLDivElement | undefined>(undefined)
|
|
115
|
+
const drawer = ref<HTMLElement | undefined>(undefined)
|
|
116
|
+
const drawerApi = useDrawerApi(props.id, { focusTarget: drawer })
|
|
117
|
+
const mappedOptions: typeof defaultOptions = customDefu(
|
|
118
|
+
props.options,
|
|
119
|
+
defaultOptions
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
const overshoot = ref(0)
|
|
123
|
+
const { position, threshold } = mappedOptions
|
|
124
|
+
|
|
125
|
+
const {
|
|
126
|
+
isActive,
|
|
127
|
+
close,
|
|
128
|
+
trapFocus,
|
|
129
|
+
releaseFocus,
|
|
130
|
+
lockScroll,
|
|
131
|
+
unlockScroll,
|
|
132
|
+
addScrollLockPadding,
|
|
133
|
+
removeScrollLockPadding,
|
|
134
|
+
} = drawerApi
|
|
135
|
+
|
|
136
|
+
const { onPointerdown, dragging, style } = useDrawerDrag({
|
|
137
|
+
position,
|
|
138
|
+
threshold,
|
|
139
|
+
overshoot,
|
|
140
|
+
elRef,
|
|
141
|
+
close,
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
// Split isActive into two values to animate drawer smoothly
|
|
145
|
+
const innerActive = ref(false)
|
|
146
|
+
const wrapperActive = ref(false)
|
|
147
|
+
|
|
148
|
+
const {
|
|
149
|
+
onBeforeEnter,
|
|
150
|
+
onEnter,
|
|
151
|
+
onAfterEnter,
|
|
152
|
+
onBeforeLeave,
|
|
153
|
+
onLeave,
|
|
154
|
+
onAfterLeave,
|
|
155
|
+
} = useDrawerCallback({
|
|
156
|
+
id: props.id,
|
|
157
|
+
mappedOptions,
|
|
158
|
+
addScrollLockPadding,
|
|
159
|
+
removeScrollLockPadding,
|
|
160
|
+
lockScroll,
|
|
161
|
+
unlockScroll,
|
|
162
|
+
trapFocus,
|
|
163
|
+
releaseFocus,
|
|
164
|
+
wrapperActive,
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
// Handle state
|
|
168
|
+
async function onOpen() {
|
|
169
|
+
wrapperActive.value = true
|
|
170
|
+
await nextTick()
|
|
171
|
+
innerActive.value = true
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function onClose() {
|
|
175
|
+
innerActive.value = false
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function convertToPixels(value: string) {
|
|
179
|
+
const regex = /^(\d*\.?\d+)\s*(rem|px)$/
|
|
180
|
+
|
|
181
|
+
const match = value.match(regex)
|
|
182
|
+
|
|
183
|
+
if (!match) {
|
|
184
|
+
console.error(
|
|
185
|
+
`--magic-drawer-drag-overshoot (${value}) needs to be specified in px or rem`
|
|
186
|
+
)
|
|
187
|
+
return 0
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const numericValue = parseFloat(match[1])
|
|
191
|
+
const unit = match[2]
|
|
192
|
+
const bodyFontSize = window.getComputedStyle(document.body).fontSize
|
|
193
|
+
const rootFontSize = parseFloat(bodyFontSize) || 16
|
|
194
|
+
|
|
195
|
+
switch (unit) {
|
|
196
|
+
case 'rem':
|
|
197
|
+
return numericValue * rootFontSize
|
|
198
|
+
case 'px':
|
|
199
|
+
return numericValue
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function saveOvershoot() {
|
|
204
|
+
const element = unrefElement(drawer)
|
|
205
|
+
const overshootVar = getComputedStyle(element!).getPropertyValue(
|
|
206
|
+
'--magic-drawer-drag-overshoot'
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
overshoot.value = convertToPixels(overshootVar) || 0
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (mappedOptions.keys) {
|
|
213
|
+
for (const key of mappedOptions.keys) {
|
|
214
|
+
onKeyStroke(key, (e) => {
|
|
215
|
+
e.preventDefault()
|
|
216
|
+
close()
|
|
217
|
+
})
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
watch(isActive, async (value) => {
|
|
222
|
+
if (value) {
|
|
223
|
+
await onOpen()
|
|
224
|
+
} else {
|
|
225
|
+
onClose()
|
|
226
|
+
}
|
|
227
|
+
})
|
|
228
|
+
|
|
229
|
+
// Save overshoot, as soon as drawer apepars in in DOM
|
|
230
|
+
watch(innerActive, () => {
|
|
231
|
+
saveOvershoot()
|
|
232
|
+
})
|
|
233
|
+
</script>
|
|
234
|
+
|
|
235
|
+
<style>
|
|
236
|
+
:root{--magic-drawer-z-index:999;--magic-drawer-justify-content:center;--magic-drawer-align-items:flex-end;--magic-drawer-backdrop-color:rgba(0,0,0,.5);--magic-drawer-backdrop-filter:unset;--magic-drawer-content-overflow-y:auto;--magic-drawer-handle-wrapper-height:2rem;--magic-drawer-handle-width:3rem;--magic-drawer-handle-height:0.375rem;--magic-drawer-handle-color:#d4d4d8;--magic-drawer-handle-border-radius:0.25rem;--magic-drawer-enter-animation:slide-btt-in 300ms ease;--magic-drawer-leave-animation:slide-btt-out 300ms ease;--magic-drawer-drag-overshoot:4rem;--magic-drawer-drag-overshoot-x:0;--magic-drawer-drag-overshoot-y:0}.magic-drawer{align-items:var(--magic-drawer-align-items);background:transparent;border:none;color:inherit;display:flex;height:100%;inset:0;justify-content:var(--magic-drawer-justify-content);padding:0;position:fixed;width:100%;z-index:var(--magic-drawer-z-index)}.magic-drawer.-bottom{--magic-drawer-drag-overshoot-y:var(--magic-drawer-drag-overshoot)}.magic-drawer.-top{--magic-drawer-enter-animation:slide-ttb-in 300ms ease;--magic-drawer-leave-animation:slide-ttb-out 300ms ease;--magic-drawer-align-items:flex-start;--magic-drawer-drag-overshoot-y:calc(var(--magic-drawer-drag-overshoot)*-1)}.magic-drawer.-right{--magic-drawer-enter-animation:slide-rtl-in 300ms ease;--magic-drawer-leave-animation:slide-rtl-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-end;--magic-drawer-drag-overshoot-x:var(--magic-drawer-drag-overshoot)}.magic-drawer.-left{--magic-drawer-enter-animation:slide-ltr-in 300ms ease;--magic-drawer-leave-animation:slide-ltr-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-start;--magic-drawer-drag-overshoot-x:calc(var(--magic-drawer-drag-overshoot)*-1)}.magic-drawer__wrapper{transform:translate(var(--magic-drawer-drag-overshoot-x),var(--magic-drawer-drag-overshoot-y));width:100%}.magic-drawer__content{-webkit-overflow-scrolling:touch;align-items:var(--magic-drawer-align-items);cursor:grab;display:flex;justify-content:var(--magic-drawer-justify-content);max-height:100%;overflow-y:var(--magic-drawer-content-overflow-y);position:relative;scroll-behavior:smooth;width:100%}.magic-drawer.-dragging .magic-drawer__content{cursor:grabbing}.magic-drawer__backdrop{-webkit-backdrop-filter:var(--magic-drawer-backdrop-filter);backdrop-filter:var(--magic-drawer-backdrop-filter);background-color:var(--magic-drawer-backdrop-color);bottom:0;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:-1}.magic-drawer--content-enter-active{animation:var(--magic-drawer-enter-animation)}.magic-drawer--content-leave-active{animation:var(--magic-drawer-leave-animation)}.magic-drawer--backdrop-enter-active{animation:fade-in .3s ease}.magic-drawer--backdrop-leave-active{animation:fade-out .3s ease}
|
|
237
|
+
</style>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type Component, type MaybeRef } from 'vue';
|
|
2
|
+
import type { DrawerOptions } from './../types/index';
|
|
3
|
+
import '@maas/vue-equipment/utils/css/animations/fade-in.css';
|
|
4
|
+
import '@maas/vue-equipment/utils/css/animations/fade-out.css';
|
|
5
|
+
import '@maas/vue-equipment/utils/css/animations/slide-ltr-in.css';
|
|
6
|
+
import '@maas/vue-equipment/utils/css/animations/slide-rtl-in.css';
|
|
7
|
+
import '@maas/vue-equipment/utils/css/animations/slide-ttb-in.css';
|
|
8
|
+
import '@maas/vue-equipment/utils/css/animations/slide-btt-in.css';
|
|
9
|
+
import '@maas/vue-equipment/utils/css/animations/slide-ltr-out.css';
|
|
10
|
+
import '@maas/vue-equipment/utils/css/animations/slide-rtl-out.css';
|
|
11
|
+
import '@maas/vue-equipment/utils/css/animations/slide-ttb-out.css';
|
|
12
|
+
import '@maas/vue-equipment/utils/css/animations/slide-btt-out.css';
|
|
13
|
+
interface MagicDrawerProps {
|
|
14
|
+
id: MaybeRef<string>;
|
|
15
|
+
class?: MaybeRef<string>;
|
|
16
|
+
component?: Component;
|
|
17
|
+
props?: Record<string, unknown>;
|
|
18
|
+
options?: DrawerOptions;
|
|
19
|
+
}
|
|
20
|
+
declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<MagicDrawerProps>, {
|
|
21
|
+
options: () => DrawerOptions;
|
|
22
|
+
}>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<MagicDrawerProps>, {
|
|
23
|
+
options: () => DrawerOptions;
|
|
24
|
+
}>>>, {
|
|
25
|
+
options: DrawerOptions;
|
|
26
|
+
}, {}>, {
|
|
27
|
+
backdrop?(_: {}): any;
|
|
28
|
+
default?(_: {}): any;
|
|
29
|
+
}>;
|
|
30
|
+
export default _default;
|
|
31
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
32
|
+
type __VLS_TypePropsToRuntimeProps<T> = {
|
|
33
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
34
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
35
|
+
} : {
|
|
36
|
+
type: import('vue').PropType<T[K]>;
|
|
37
|
+
required: true;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
type __VLS_WithDefaults<P, D> = {
|
|
41
|
+
[K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
|
|
42
|
+
default: D[K];
|
|
43
|
+
}> : P[K];
|
|
44
|
+
};
|
|
45
|
+
type __VLS_Prettify<T> = {
|
|
46
|
+
[K in keyof T]: T[K];
|
|
47
|
+
} & {};
|
|
48
|
+
type __VLS_WithTemplateSlots<T, S> = T & {
|
|
49
|
+
new (): {
|
|
50
|
+
$slots: S;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Ref, type MaybeRef } from 'vue';
|
|
2
|
+
import type { DrawerOptions } from '../../types.js';
|
|
3
|
+
type UseDrawerCallbackArgs = {
|
|
4
|
+
id: MaybeRef<string>;
|
|
5
|
+
mappedOptions: DrawerOptions;
|
|
6
|
+
addScrollLockPadding: () => void;
|
|
7
|
+
removeScrollLockPadding: () => void;
|
|
8
|
+
lockScroll: () => void;
|
|
9
|
+
unlockScroll: () => void;
|
|
10
|
+
trapFocus: () => void;
|
|
11
|
+
releaseFocus: () => void;
|
|
12
|
+
wrapperActive: Ref<boolean>;
|
|
13
|
+
};
|
|
14
|
+
export declare function useDrawerCallback(args: UseDrawerCallbackArgs): {
|
|
15
|
+
onBeforeEnter: (_el: Element) => void;
|
|
16
|
+
onEnter: (_el: Element) => void;
|
|
17
|
+
onAfterEnter: (_el: Element) => Promise<void>;
|
|
18
|
+
onBeforeLeave: (_el: Element) => void;
|
|
19
|
+
onLeave: (_el: Element) => void;
|
|
20
|
+
onAfterLeave: (_el: Element) => void;
|
|
21
|
+
};
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { toValue, nextTick } from "vue";
|
|
2
|
+
import { useDrawerEmitter } from "./../useDrawerEmitter.mjs";
|
|
3
|
+
export function useDrawerCallback(args) {
|
|
4
|
+
const {
|
|
5
|
+
id,
|
|
6
|
+
mappedOptions,
|
|
7
|
+
addScrollLockPadding,
|
|
8
|
+
removeScrollLockPadding,
|
|
9
|
+
lockScroll,
|
|
10
|
+
unlockScroll,
|
|
11
|
+
trapFocus,
|
|
12
|
+
releaseFocus,
|
|
13
|
+
wrapperActive
|
|
14
|
+
} = args;
|
|
15
|
+
function onBeforeEnter(_el) {
|
|
16
|
+
useDrawerEmitter().emit("beforeEnter", toValue(id));
|
|
17
|
+
}
|
|
18
|
+
function onEnter(_el) {
|
|
19
|
+
useDrawerEmitter().emit("enter", toValue(id));
|
|
20
|
+
}
|
|
21
|
+
async function onAfterEnter(_el) {
|
|
22
|
+
useDrawerEmitter().emit("afterEnter", toValue(id));
|
|
23
|
+
if (mappedOptions.scrollLock) {
|
|
24
|
+
if (mappedOptions.scrollLockPadding) {
|
|
25
|
+
addScrollLockPadding();
|
|
26
|
+
}
|
|
27
|
+
lockScroll();
|
|
28
|
+
}
|
|
29
|
+
if (mappedOptions.focusTrap) {
|
|
30
|
+
await nextTick();
|
|
31
|
+
trapFocus();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function onBeforeLeave(_el) {
|
|
35
|
+
useDrawerEmitter().emit("beforeLeave", toValue(id));
|
|
36
|
+
}
|
|
37
|
+
function onLeave(_el) {
|
|
38
|
+
useDrawerEmitter().emit("leave", toValue(id));
|
|
39
|
+
}
|
|
40
|
+
function onAfterLeave(_el) {
|
|
41
|
+
useDrawerEmitter().emit("afterLeave", toValue(id));
|
|
42
|
+
if (mappedOptions.scrollLock) {
|
|
43
|
+
unlockScroll();
|
|
44
|
+
if (mappedOptions.scrollLockPadding) {
|
|
45
|
+
removeScrollLockPadding();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (mappedOptions.focusTrap) {
|
|
49
|
+
releaseFocus();
|
|
50
|
+
}
|
|
51
|
+
wrapperActive.value = false;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
onBeforeEnter,
|
|
55
|
+
onEnter,
|
|
56
|
+
onAfterEnter,
|
|
57
|
+
onBeforeLeave,
|
|
58
|
+
onLeave,
|
|
59
|
+
onAfterLeave
|
|
60
|
+
};
|
|
61
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type MaybeRef } from 'vue';
|
|
2
|
+
import { defaultOptions } from '../../utils/defaultOptions.js';
|
|
3
|
+
type UseDrawerDragArgs = {
|
|
4
|
+
elRef: MaybeRef<HTMLDivElement | undefined>;
|
|
5
|
+
position: MaybeRef<typeof defaultOptions.position>;
|
|
6
|
+
threshold: MaybeRef<typeof defaultOptions.threshold>;
|
|
7
|
+
overshoot: MaybeRef<number>;
|
|
8
|
+
close: () => void;
|
|
9
|
+
};
|
|
10
|
+
export declare function useDrawerDrag(args: UseDrawerDragArgs): {
|
|
11
|
+
style: import("vue").ComputedRef<string>;
|
|
12
|
+
dragging: import("vue").Ref<boolean>;
|
|
13
|
+
onPointerdown: (e: PointerEvent) => void;
|
|
14
|
+
};
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ref,
|
|
3
|
+
computed,
|
|
4
|
+
onMounted,
|
|
5
|
+
watch,
|
|
6
|
+
onBeforeUnmount,
|
|
7
|
+
toValue
|
|
8
|
+
} from "vue";
|
|
9
|
+
import { useEventListener, unrefElement } from "@vueuse/core";
|
|
10
|
+
import { interpolate } from "@maas/vue-equipment/utils";
|
|
11
|
+
import { useDrawerEmitter } from "../useDrawerEmitter.mjs";
|
|
12
|
+
export function useDrawerDrag(args) {
|
|
13
|
+
const { elRef, position, overshoot, threshold, close } = args;
|
|
14
|
+
const dragStart = ref(void 0);
|
|
15
|
+
const originX = ref(0);
|
|
16
|
+
const originY = ref(0);
|
|
17
|
+
const dragging = ref(false);
|
|
18
|
+
const shouldClose = ref(false);
|
|
19
|
+
const elRect = ref(void 0);
|
|
20
|
+
let cancelPointermove = void 0;
|
|
21
|
+
const draggedX = ref(0);
|
|
22
|
+
const draggedY = ref(0);
|
|
23
|
+
const style = computed(
|
|
24
|
+
() => `transform: translate(${draggedX.value}px, ${draggedY.value}px)`
|
|
25
|
+
);
|
|
26
|
+
function getSizes() {
|
|
27
|
+
elRect.value = unrefElement(elRef)?.getBoundingClientRect();
|
|
28
|
+
}
|
|
29
|
+
function checkPosition() {
|
|
30
|
+
switch (position) {
|
|
31
|
+
case "bottom":
|
|
32
|
+
if (draggedY.value > toValue(threshold).distance) {
|
|
33
|
+
shouldClose.value = true;
|
|
34
|
+
}
|
|
35
|
+
break;
|
|
36
|
+
case "top":
|
|
37
|
+
if (draggedY.value < toValue(threshold).distance * -1) {
|
|
38
|
+
shouldClose.value = true;
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
case "right":
|
|
42
|
+
if (draggedX.value > toValue(threshold).distance) {
|
|
43
|
+
shouldClose.value = true;
|
|
44
|
+
}
|
|
45
|
+
break;
|
|
46
|
+
case "left":
|
|
47
|
+
if (draggedX.value < toValue(threshold).distance * -1) {
|
|
48
|
+
shouldClose.value = true;
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function checkMomentum({ x, y }) {
|
|
54
|
+
const elapsed = Date.now() - dragStart.value.getTime();
|
|
55
|
+
const velocityX = (x - originX.value) / elapsed;
|
|
56
|
+
const velocityY = (y - originY.value) / elapsed;
|
|
57
|
+
switch (position) {
|
|
58
|
+
case "bottom":
|
|
59
|
+
if (velocityY > toValue(threshold).momentum) {
|
|
60
|
+
shouldClose.value = true;
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
case "top":
|
|
64
|
+
if (velocityY < toValue(threshold).momentum * -1) {
|
|
65
|
+
shouldClose.value = true;
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
case "right":
|
|
69
|
+
if (velocityX > toValue(threshold).momentum) {
|
|
70
|
+
shouldClose.value = true;
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
case "left":
|
|
74
|
+
if (velocityX < toValue(threshold).momentum * -1) {
|
|
75
|
+
shouldClose.value = true;
|
|
76
|
+
}
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function clamp(value, from, to) {
|
|
81
|
+
if (from > to) {
|
|
82
|
+
if (value > from)
|
|
83
|
+
return value;
|
|
84
|
+
if (value < to)
|
|
85
|
+
return to;
|
|
86
|
+
else
|
|
87
|
+
return value;
|
|
88
|
+
} else if (from < to) {
|
|
89
|
+
if (value < from)
|
|
90
|
+
return value;
|
|
91
|
+
if (value > to)
|
|
92
|
+
return to;
|
|
93
|
+
else
|
|
94
|
+
return value;
|
|
95
|
+
} else {
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function setDragged({ x, y }) {
|
|
100
|
+
switch (position) {
|
|
101
|
+
case "bottom":
|
|
102
|
+
draggedY.value = clamp(y - originY.value, 0, toValue(overshoot) * -1);
|
|
103
|
+
break;
|
|
104
|
+
case "top":
|
|
105
|
+
draggedY.value = clamp(y - originY.value, 0, toValue(overshoot));
|
|
106
|
+
break;
|
|
107
|
+
case "right":
|
|
108
|
+
draggedX.value = clamp(x - originX.value, 0, toValue(overshoot) * -1);
|
|
109
|
+
break;
|
|
110
|
+
case "left":
|
|
111
|
+
draggedX.value = clamp(x - originX.value, 0, toValue(overshoot));
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function resetStateAndListeners() {
|
|
116
|
+
dragging.value = false;
|
|
117
|
+
cancelPointermove?.();
|
|
118
|
+
}
|
|
119
|
+
function resetDragged() {
|
|
120
|
+
draggedX.value = 0;
|
|
121
|
+
draggedY.value = 0;
|
|
122
|
+
}
|
|
123
|
+
function emitterCallback(event, _payload) {
|
|
124
|
+
if (event === "afterLeave") {
|
|
125
|
+
resetDragged();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function onPointerup(e) {
|
|
129
|
+
resetStateAndListeners();
|
|
130
|
+
if (shouldClose.value) {
|
|
131
|
+
close();
|
|
132
|
+
} else {
|
|
133
|
+
switch (position) {
|
|
134
|
+
case "bottom":
|
|
135
|
+
case "top":
|
|
136
|
+
interpolate({
|
|
137
|
+
from: draggedY.value,
|
|
138
|
+
to: 0,
|
|
139
|
+
duration: 50,
|
|
140
|
+
callback: (value) => {
|
|
141
|
+
draggedY.value = value;
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
break;
|
|
145
|
+
case "right":
|
|
146
|
+
case "left":
|
|
147
|
+
interpolate({
|
|
148
|
+
from: draggedX.value,
|
|
149
|
+
to: 0,
|
|
150
|
+
duration: 50,
|
|
151
|
+
callback: (value) => {
|
|
152
|
+
draggedX.value = value;
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
e.preventDefault();
|
|
159
|
+
}
|
|
160
|
+
function onPointermove(e) {
|
|
161
|
+
shouldClose.value = false;
|
|
162
|
+
checkMomentum({ x: e.screenX, y: e.screenY });
|
|
163
|
+
setDragged({ x: e.screenX, y: e.screenY });
|
|
164
|
+
checkPosition();
|
|
165
|
+
e.preventDefault();
|
|
166
|
+
}
|
|
167
|
+
function onPointerdown(e) {
|
|
168
|
+
if (dragging.value) {
|
|
169
|
+
return;
|
|
170
|
+
} else {
|
|
171
|
+
dragging.value = true;
|
|
172
|
+
}
|
|
173
|
+
;
|
|
174
|
+
e.target.setPointerCapture(e.pointerId);
|
|
175
|
+
useEventListener(document, "pointerup", onPointerup);
|
|
176
|
+
cancelPointermove = useEventListener(document, "pointermove", onPointermove);
|
|
177
|
+
originX.value = e.screenX;
|
|
178
|
+
originY.value = e.screenY;
|
|
179
|
+
dragStart.value = /* @__PURE__ */ new Date();
|
|
180
|
+
onPointermove(e);
|
|
181
|
+
e.preventDefault();
|
|
182
|
+
}
|
|
183
|
+
onMounted(() => {
|
|
184
|
+
getSizes();
|
|
185
|
+
useDrawerEmitter().on("*", emitterCallback);
|
|
186
|
+
});
|
|
187
|
+
watch(
|
|
188
|
+
() => unrefElement(elRef),
|
|
189
|
+
() => {
|
|
190
|
+
getSizes();
|
|
191
|
+
}
|
|
192
|
+
);
|
|
193
|
+
onBeforeUnmount(() => {
|
|
194
|
+
useDrawerEmitter().off("*", emitterCallback);
|
|
195
|
+
});
|
|
196
|
+
return {
|
|
197
|
+
style,
|
|
198
|
+
dragging,
|
|
199
|
+
onPointerdown
|
|
200
|
+
};
|
|
201
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ref } from "vue";
|
|
2
|
+
let drawerStore = ref([]);
|
|
3
|
+
export function useDrawerStore() {
|
|
4
|
+
function addInstance(id) {
|
|
5
|
+
drawerStore.value.push(id);
|
|
6
|
+
}
|
|
7
|
+
function removeInstance(id) {
|
|
8
|
+
drawerStore.value = drawerStore.value.filter((x) => x !== id);
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
drawerStore,
|
|
12
|
+
addInstance,
|
|
13
|
+
removeInstance
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type MaybeRef } from 'vue';
|
|
2
|
+
import type { DrawerOptions } from '../types/index.js';
|
|
3
|
+
import type { MaybeElementRef } from '@vueuse/core';
|
|
4
|
+
export type useDrawerApiOptions = Pick<DrawerOptions, 'scrollLock'> & {
|
|
5
|
+
focusTarget: MaybeElementRef;
|
|
6
|
+
};
|
|
7
|
+
export declare function useDrawerApi(id?: MaybeRef<string>, options?: useDrawerApiOptions): {
|
|
8
|
+
id: import("vue").ComputedRef<string>;
|
|
9
|
+
isActive: import("vue").ComputedRef<boolean>;
|
|
10
|
+
open: () => void;
|
|
11
|
+
close: () => void;
|
|
12
|
+
trapFocus: () => void;
|
|
13
|
+
releaseFocus: () => void;
|
|
14
|
+
lockScroll: () => void;
|
|
15
|
+
unlockScroll: () => void;
|
|
16
|
+
addScrollLockPadding: () => void;
|
|
17
|
+
removeScrollLockPadding: () => void;
|
|
18
|
+
};
|
|
19
|
+
export type UseDrawerApiReturn = ReturnType<typeof useDrawerApi>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { uuid } from "@maas/vue-equipment/utils";
|
|
2
|
+
import { ref, computed, toValue } from "vue";
|
|
3
|
+
import { defu } from "defu";
|
|
4
|
+
import { useScrollLock } from "@vueuse/core";
|
|
5
|
+
import { useFocusTrap } from "@vueuse/integrations/useFocusTrap";
|
|
6
|
+
import { useDrawerStore } from "./private/useDrawerStore.mjs";
|
|
7
|
+
const defaultOptions = {
|
|
8
|
+
focusTarget: void 0,
|
|
9
|
+
scrollLock: true
|
|
10
|
+
};
|
|
11
|
+
export function useDrawerApi(id, options) {
|
|
12
|
+
const positionFixedElements = ref([]);
|
|
13
|
+
const mappedId = computed(() => toValue(id) || uuid());
|
|
14
|
+
const mappedOptions = defu(options, defaultOptions);
|
|
15
|
+
const focusTrap = mappedOptions.focusTarget ? useFocusTrap(mappedOptions.focusTarget) : void 0;
|
|
16
|
+
const scrollLock = mappedOptions.scrollLock && typeof window !== "undefined" ? useScrollLock(document.body) : ref(false);
|
|
17
|
+
const { drawerStore, addInstance, removeInstance } = useDrawerStore();
|
|
18
|
+
const isActive = computed(() => drawerStore.value.includes(mappedId.value));
|
|
19
|
+
function open() {
|
|
20
|
+
addInstance(mappedId.value);
|
|
21
|
+
}
|
|
22
|
+
function close() {
|
|
23
|
+
removeInstance(mappedId.value);
|
|
24
|
+
}
|
|
25
|
+
function trapFocus() {
|
|
26
|
+
if (focusTrap) {
|
|
27
|
+
focusTrap.activate();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function releaseFocus() {
|
|
31
|
+
if (focusTrap) {
|
|
32
|
+
focusTrap.deactivate();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function lockScroll() {
|
|
36
|
+
scrollLock.value = true;
|
|
37
|
+
}
|
|
38
|
+
function unlockScroll() {
|
|
39
|
+
scrollLock.value = false;
|
|
40
|
+
}
|
|
41
|
+
function addScrollLockPadding() {
|
|
42
|
+
if (typeof window === "undefined")
|
|
43
|
+
return;
|
|
44
|
+
const scrollbarWidth = window.innerWidth - document.body.offsetWidth;
|
|
45
|
+
document.body.style.setProperty("--scrollbar-width", `${scrollbarWidth}px`);
|
|
46
|
+
document.body.style.paddingRight = "var(--scrollbar-width)";
|
|
47
|
+
positionFixedElements.value = [
|
|
48
|
+
...document.body.getElementsByTagName("*")
|
|
49
|
+
].filter(
|
|
50
|
+
(x) => getComputedStyle(x, null).getPropertyValue("position") === "fixed"
|
|
51
|
+
);
|
|
52
|
+
positionFixedElements.value.forEach(
|
|
53
|
+
(elem) => elem.style.paddingRight = "var(--scrollbar-width)"
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
function removeScrollLockPadding() {
|
|
57
|
+
document.body.style.paddingRight = "";
|
|
58
|
+
document.body.style.removeProperty("--scrollbar-width");
|
|
59
|
+
positionFixedElements.value.forEach(
|
|
60
|
+
(elem) => elem.style.paddingRight = ""
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
id: mappedId,
|
|
65
|
+
isActive,
|
|
66
|
+
open,
|
|
67
|
+
close,
|
|
68
|
+
trapFocus,
|
|
69
|
+
releaseFocus,
|
|
70
|
+
lockScroll,
|
|
71
|
+
unlockScroll,
|
|
72
|
+
addScrollLockPadding,
|
|
73
|
+
removeScrollLockPadding
|
|
74
|
+
};
|
|
75
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DrawerEvents } from '../types.js';
|
|
2
|
+
export declare function useDrawerEmitter(): {
|
|
3
|
+
on: {
|
|
4
|
+
<Key extends keyof DrawerEvents>(type: Key, handler: import("mitt").Handler<DrawerEvents[Key]>): void;
|
|
5
|
+
(type: "*", handler: import("mitt").WildcardHandler<DrawerEvents>): void;
|
|
6
|
+
};
|
|
7
|
+
off: {
|
|
8
|
+
<Key_1 extends keyof DrawerEvents>(type: Key_1, handler?: import("mitt").Handler<DrawerEvents[Key_1]> | undefined): void;
|
|
9
|
+
(type: "*", handler: import("mitt").WildcardHandler<DrawerEvents>): void;
|
|
10
|
+
};
|
|
11
|
+
emit: {
|
|
12
|
+
<Key_2 extends keyof DrawerEvents>(type: Key_2, event: DrawerEvents[Key_2]): void;
|
|
13
|
+
<Key_3 extends keyof DrawerEvents>(type: undefined extends DrawerEvents[Key_3] ? Key_3 : never): void;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type DrawerOptions = {
|
|
2
|
+
position?: 'top' | 'right' | 'bottom' | 'left';
|
|
3
|
+
backdrop?: boolean;
|
|
4
|
+
focusTrap?: boolean;
|
|
5
|
+
scrollLock?: boolean;
|
|
6
|
+
scrollLockPadding?: boolean;
|
|
7
|
+
teleport?: {
|
|
8
|
+
target?: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
};
|
|
11
|
+
transitions?: {
|
|
12
|
+
content?: string;
|
|
13
|
+
backdrop?: string;
|
|
14
|
+
};
|
|
15
|
+
threshold?: {
|
|
16
|
+
distance?: number;
|
|
17
|
+
momentum?: number;
|
|
18
|
+
};
|
|
19
|
+
tag?: 'dialog' | 'div';
|
|
20
|
+
keys?: string[] | false;
|
|
21
|
+
};
|
|
22
|
+
export type DrawerEvents = {
|
|
23
|
+
beforeEnter: string;
|
|
24
|
+
enter: string;
|
|
25
|
+
afterEnter: string;
|
|
26
|
+
beforeLeave: string;
|
|
27
|
+
leave: string;
|
|
28
|
+
afterLeave: string;
|
|
29
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const defaultOptions = {
|
|
2
|
+
position: "bottom",
|
|
3
|
+
backdrop: true,
|
|
4
|
+
focusTrap: true,
|
|
5
|
+
scrollLock: true,
|
|
6
|
+
scrollLockPadding: true,
|
|
7
|
+
teleport: {
|
|
8
|
+
target: "body",
|
|
9
|
+
disabled: false
|
|
10
|
+
},
|
|
11
|
+
transitions: {
|
|
12
|
+
content: "magic-drawer--content",
|
|
13
|
+
backdrop: "magic-drawer--backdrop"
|
|
14
|
+
},
|
|
15
|
+
threshold: {
|
|
16
|
+
distance: 150,
|
|
17
|
+
momentum: 1
|
|
18
|
+
},
|
|
19
|
+
tag: "dialog",
|
|
20
|
+
keys: ["Escape"]
|
|
21
|
+
};
|
|
22
|
+
export { defaultOptions };
|
|
@@ -10,9 +10,9 @@ interface MagicModalProps {
|
|
|
10
10
|
options?: ModalOptions;
|
|
11
11
|
}
|
|
12
12
|
declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<MagicModalProps>, {
|
|
13
|
-
options: () =>
|
|
13
|
+
options: () => ModalOptions;
|
|
14
14
|
}>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<MagicModalProps>, {
|
|
15
|
-
options: () =>
|
|
15
|
+
options: () => ModalOptions;
|
|
16
16
|
}>>>, {
|
|
17
17
|
options: ModalOptions;
|
|
18
18
|
}, {}>, {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Ref, type MaybeRef } from 'vue';
|
|
2
2
|
import type { ModalOptions } from '../../types.js';
|
|
3
|
-
type
|
|
3
|
+
type UseModalCallbackArgs = {
|
|
4
4
|
id: MaybeRef<string>;
|
|
5
5
|
mappedOptions: ModalOptions;
|
|
6
6
|
addScrollLockPadding: () => void;
|
|
@@ -11,12 +11,12 @@ type Args = {
|
|
|
11
11
|
releaseFocus: () => void;
|
|
12
12
|
wrapperActive: Ref<boolean>;
|
|
13
13
|
};
|
|
14
|
-
export declare function useModalCallback(
|
|
14
|
+
export declare function useModalCallback(args: UseModalCallbackArgs): {
|
|
15
15
|
onBeforeEnter: (_el: Element) => void;
|
|
16
16
|
onEnter: (_el: Element) => void;
|
|
17
|
-
onAfterEnter: (
|
|
17
|
+
onAfterEnter: (_el: Element) => Promise<void>;
|
|
18
18
|
onBeforeLeave: (_el: Element) => void;
|
|
19
|
-
onLeave: (
|
|
19
|
+
onLeave: (_el: Element) => void;
|
|
20
20
|
onAfterLeave: (_el: Element) => void;
|
|
21
21
|
};
|
|
22
22
|
export {};
|
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
import { toValue, nextTick } from "vue";
|
|
2
2
|
import { useModalEmitter } from "./../useModalEmitter.mjs";
|
|
3
|
-
export function useModalCallback({
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
export function useModalCallback(args) {
|
|
4
|
+
const {
|
|
5
|
+
id,
|
|
6
|
+
mappedOptions,
|
|
7
|
+
addScrollLockPadding,
|
|
8
|
+
removeScrollLockPadding,
|
|
9
|
+
lockScroll,
|
|
10
|
+
unlockScroll,
|
|
11
|
+
trapFocus,
|
|
12
|
+
releaseFocus,
|
|
13
|
+
wrapperActive
|
|
14
|
+
} = args;
|
|
14
15
|
function onBeforeEnter(_el) {
|
|
15
16
|
useModalEmitter().emit("beforeEnter", toValue(id));
|
|
16
17
|
}
|
|
17
18
|
function onEnter(_el) {
|
|
18
19
|
useModalEmitter().emit("enter", toValue(id));
|
|
19
20
|
}
|
|
20
|
-
async function onAfterEnter(
|
|
21
|
+
async function onAfterEnter(_el) {
|
|
21
22
|
useModalEmitter().emit("afterEnter", toValue(id));
|
|
22
23
|
if (mappedOptions.scrollLock) {
|
|
23
24
|
if (mappedOptions.scrollLockPadding) {
|
|
@@ -33,7 +34,7 @@ export function useModalCallback({
|
|
|
33
34
|
function onBeforeLeave(_el) {
|
|
34
35
|
useModalEmitter().emit("beforeLeave", toValue(id));
|
|
35
36
|
}
|
|
36
|
-
function onLeave(
|
|
37
|
+
function onLeave(_el) {
|
|
37
38
|
useModalEmitter().emit("leave", toValue(id));
|
|
38
39
|
}
|
|
39
40
|
function onAfterLeave(_el) {
|
package/dist/plugins/index.d.ts
CHANGED
package/dist/plugins/index.mjs
CHANGED
package/dist/utils/index.js
CHANGED
|
@@ -21,6 +21,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var utils_exports = {};
|
|
22
22
|
__export(utils_exports, {
|
|
23
23
|
clampValue: () => clampValue,
|
|
24
|
+
interpolate: () => interpolate,
|
|
24
25
|
isIOS: () => isIOS,
|
|
25
26
|
mapValue: () => mapValue,
|
|
26
27
|
slugify: () => slugify,
|
|
@@ -34,6 +35,30 @@ function clampValue(value, min, max) {
|
|
|
34
35
|
return value <= min ? min : value >= max ? max : value;
|
|
35
36
|
}
|
|
36
37
|
|
|
38
|
+
// src/functions/interpolate.ts
|
|
39
|
+
function interpolate(args) {
|
|
40
|
+
const {
|
|
41
|
+
from,
|
|
42
|
+
to,
|
|
43
|
+
duration,
|
|
44
|
+
callback,
|
|
45
|
+
easing = (t) => t * (2 - t),
|
|
46
|
+
interval = 1
|
|
47
|
+
} = args;
|
|
48
|
+
const steps = Math.ceil(duration / interval);
|
|
49
|
+
const stepSize = 1 / steps;
|
|
50
|
+
let currentStep = 0;
|
|
51
|
+
const intervalId = setInterval(() => {
|
|
52
|
+
const progress = currentStep * stepSize;
|
|
53
|
+
const value = from + (to - from) * easing(progress);
|
|
54
|
+
callback(value);
|
|
55
|
+
currentStep++;
|
|
56
|
+
if (currentStep >= steps) {
|
|
57
|
+
clearInterval(intervalId);
|
|
58
|
+
}
|
|
59
|
+
}, interval);
|
|
60
|
+
}
|
|
61
|
+
|
|
37
62
|
// src/functions/isIOS.ts
|
|
38
63
|
function isIOS() {
|
|
39
64
|
if (typeof window === "undefined")
|
|
@@ -98,6 +123,7 @@ function slugify(string, options) {
|
|
|
98
123
|
// Annotate the CommonJS export names for ESM import in node:
|
|
99
124
|
0 && (module.exports = {
|
|
100
125
|
clampValue,
|
|
126
|
+
interpolate,
|
|
101
127
|
isIOS,
|
|
102
128
|
mapValue,
|
|
103
129
|
slugify,
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/utils/index.ts","../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/uuid.ts","../../packages/utils/src/functions/uniq.ts","../../packages/utils/src/functions/slugify.ts"],"sourcesContent":["export * from './src/functions/clampValue'\nexport * from './src/functions/isIOS'\nexport * from './src/functions/mapValue'\nexport * from './src/functions/uuid'\nexport * from './src/functions/uniq'\nexport * from './src/functions/slugify'\n\nexport type * from './src/types'\n","export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","export function isIOS() {\n if (typeof window === 'undefined') return false\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","export function mapValue(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n}\n","// This implementation is meant for internal use only.\n// It is only used to generate a unique IDs for the `key` props.\n// It should not replace crypto.randomUUID() or window.crypto.randomUUID().\n\nexport function uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n .split('')\n .reduce(\n (c, i) =>\n c +\n (i === 'x'\n ? Math.floor(Math.random() * 0xf).toString(16)\n : i === 'y'\n ? Math.floor(Math.random() * 4 + 8).toString(16)\n : i),\n '',\n )\n}\n","export function uniq<T extends any[]>(a: T) {\n return Array.from(new Set(a))\n}\n","export interface SlugifyOptions {\n separator?: string\n trim?: boolean\n remove?: RegExp\n strict?: boolean\n lowercase?: boolean\n}\n\nconst defaultOptions: SlugifyOptions = {\n separator: '-',\n trim: true,\n remove: undefined,\n strict: true,\n lowercase: true,\n}\n\nexport function slugify(string: string, options?: SlugifyOptions): string {\n if (typeof string !== 'string') {\n throw new Error('slugify: string argument expected')\n }\n\n // Merge provided options with default options\n const _options = { ...defaultOptions, ...options }\n\n const charMap: { [key: string]: string } = {}\n\n let slug = string\n .normalize()\n .split('')\n .reduce(function (result, ch) {\n let appendChar = charMap[ch]\n if (appendChar === undefined) appendChar = ch\n if (appendChar === _options?.separator) appendChar = ' '\n return (\n result +\n appendChar.replace(_options?.remove || /[^\\w\\s$*_+~.()'\"!\\-:@]+/g, '')\n )\n }, '')\n\n if (_options.strict) {\n slug = slug.replace(/[^A-Za-z0-9\\s]/g, '')\n }\n\n if (_options.trim) {\n slug = slug.trim()\n }\n\n if (_options.separator) {\n slug = slug.replace(/ +/g, _options.separator)\n }\n\n if (_options.lowercase) {\n slug = slug.toLocaleLowerCase()\n }\n\n return slug\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,WAAW,OAAe,KAAa,KAAa;AAClE,SAAO,SAAS,MAAM,MAAM,SAAS,MAAM,MAAM;AACnD;;;
|
|
1
|
+
{"version":3,"sources":["../../packages/utils/index.ts","../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/uuid.ts","../../packages/utils/src/functions/uniq.ts","../../packages/utils/src/functions/slugify.ts"],"sourcesContent":["export * from './src/functions/clampValue'\nexport * from './src/functions/interpolate'\nexport * from './src/functions/isIOS'\nexport * from './src/functions/mapValue'\nexport * from './src/functions/uuid'\nexport * from './src/functions/uniq'\nexport * from './src/functions/slugify'\n\nexport type * from './src/types'\n","export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","export type InterpolateArgs = {\n from: number\n to: number\n duration: number\n interval?: number\n easing?: (t: number) => number\n callback: (result: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const {\n from,\n to,\n duration,\n callback,\n easing = (t: number) => t * (2 - t),\n interval = 1,\n } = args\n\n const steps = Math.ceil(duration / interval)\n const stepSize = 1 / steps\n\n let currentStep = 0\n\n const intervalId = setInterval(() => {\n const progress = currentStep * stepSize\n const value = from + (to - from) * easing(progress)\n\n callback(value)\n currentStep++\n\n if (currentStep >= steps) {\n clearInterval(intervalId)\n }\n }, interval)\n}\n","export function isIOS() {\n if (typeof window === 'undefined') return false\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","export function mapValue(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n}\n","// This implementation is meant for internal use only.\n// It is only used to generate a unique IDs for the `key` props.\n// It should not replace crypto.randomUUID() or window.crypto.randomUUID().\n\nexport function uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n .split('')\n .reduce(\n (c, i) =>\n c +\n (i === 'x'\n ? Math.floor(Math.random() * 0xf).toString(16)\n : i === 'y'\n ? Math.floor(Math.random() * 4 + 8).toString(16)\n : i),\n '',\n )\n}\n","export function uniq<T extends any[]>(a: T) {\n return Array.from(new Set(a))\n}\n","export interface SlugifyOptions {\n separator?: string\n trim?: boolean\n remove?: RegExp\n strict?: boolean\n lowercase?: boolean\n}\n\nconst defaultOptions: SlugifyOptions = {\n separator: '-',\n trim: true,\n remove: undefined,\n strict: true,\n lowercase: true,\n}\n\nexport function slugify(string: string, options?: SlugifyOptions): string {\n if (typeof string !== 'string') {\n throw new Error('slugify: string argument expected')\n }\n\n // Merge provided options with default options\n const _options = { ...defaultOptions, ...options }\n\n const charMap: { [key: string]: string } = {}\n\n let slug = string\n .normalize()\n .split('')\n .reduce(function (result, ch) {\n let appendChar = charMap[ch]\n if (appendChar === undefined) appendChar = ch\n if (appendChar === _options?.separator) appendChar = ' '\n return (\n result +\n appendChar.replace(_options?.remove || /[^\\w\\s$*_+~.()'\"!\\-:@]+/g, '')\n )\n }, '')\n\n if (_options.strict) {\n slug = slug.replace(/[^A-Za-z0-9\\s]/g, '')\n }\n\n if (_options.trim) {\n slug = slug.trim()\n }\n\n if (_options.separator) {\n slug = slug.replace(/ +/g, _options.separator)\n }\n\n if (_options.lowercase) {\n slug = slug.toLocaleLowerCase()\n }\n\n return slug\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,WAAW,OAAe,KAAa,KAAa;AAClE,SAAO,SAAS,MAAM,MAAM,SAAS,MAAM,MAAM;AACnD;;;ACOO,SAAS,YAAY,MAAuB;AACjD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,CAAC,MAAc,KAAK,IAAI;AAAA,IACjC,WAAW;AAAA,EACb,IAAI;AAEJ,QAAM,QAAQ,KAAK,KAAK,WAAW,QAAQ;AAC3C,QAAM,WAAW,IAAI;AAErB,MAAI,cAAc;AAElB,QAAM,aAAa,YAAY,MAAM;AACnC,UAAM,WAAW,cAAc;AAC/B,UAAM,QAAQ,QAAQ,KAAK,QAAQ,OAAO,QAAQ;AAElD,aAAS,KAAK;AACd;AAEA,QAAI,eAAe,OAAO;AACxB,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF,GAAG,QAAQ;AACb;;;ACnCO,SAAS,QAAQ;AACtB,MAAI,OAAO,WAAW;AAAa,WAAO;AAC1C,SAAO,mBAAmB,KAAK,uCAAW,SAAS;AACrD;;;ACHO,SAAS,SACd,OACA,OACA,OACA,QACA,QACA;AACA,UAAS,QAAQ,UAAU,SAAS,WAAY,QAAQ,SAAS;AACnE;;;ACJO,SAAS,OAAO;AACrB,SAAO,uCACJ,MAAM,EAAE,EACR;AAAA,IACC,CAAC,GAAG,MACF,KACC,MAAM,MACH,KAAK,MAAM,KAAK,OAAO,IAAI,EAAG,EAAE,SAAS,EAAE,IAC3C,MAAM,MACN,KAAK,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,SAAS,EAAE,IAC7C;AAAA,IACN;AAAA,EACF;AACJ;;;ACjBO,SAAS,KAAsB,GAAM;AAC1C,SAAO,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC;AAC9B;;;ACMA,IAAM,iBAAiC;AAAA,EACrC,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AACb;AAEO,SAAS,QAAQ,QAAgB,SAAkC;AACxE,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAGA,QAAM,WAAW,EAAE,GAAG,gBAAgB,GAAG,QAAQ;AAEjD,QAAM,UAAqC,CAAC;AAE5C,MAAI,OAAO,OACR,UAAU,EACV,MAAM,EAAE,EACR,OAAO,SAAU,QAAQ,IAAI;AAC5B,QAAI,aAAa,QAAQ,EAAE;AAC3B,QAAI,eAAe;AAAW,mBAAa;AAC3C,QAAI,gBAAe,qCAAU;AAAW,mBAAa;AACrD,WACE,SACA,WAAW,SAAQ,qCAAU,WAAU,4BAA4B,EAAE;AAAA,EAEzE,GAAG,EAAE;AAEP,MAAI,SAAS,QAAQ;AACnB,WAAO,KAAK,QAAQ,mBAAmB,EAAE;AAAA,EAC3C;AAEA,MAAI,SAAS,MAAM;AACjB,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,QAAQ,OAAO,SAAS,SAAS;AAAA,EAC/C;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,kBAAkB;AAAA,EAChC;AAEA,SAAO;AACT;","names":[]}
|
package/dist/utils/index.mjs
CHANGED
|
@@ -3,6 +3,30 @@ function clampValue(value, min, max) {
|
|
|
3
3
|
return value <= min ? min : value >= max ? max : value;
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
+
// src/functions/interpolate.ts
|
|
7
|
+
function interpolate(args) {
|
|
8
|
+
const {
|
|
9
|
+
from,
|
|
10
|
+
to,
|
|
11
|
+
duration,
|
|
12
|
+
callback,
|
|
13
|
+
easing = (t) => t * (2 - t),
|
|
14
|
+
interval = 1
|
|
15
|
+
} = args;
|
|
16
|
+
const steps = Math.ceil(duration / interval);
|
|
17
|
+
const stepSize = 1 / steps;
|
|
18
|
+
let currentStep = 0;
|
|
19
|
+
const intervalId = setInterval(() => {
|
|
20
|
+
const progress = currentStep * stepSize;
|
|
21
|
+
const value = from + (to - from) * easing(progress);
|
|
22
|
+
callback(value);
|
|
23
|
+
currentStep++;
|
|
24
|
+
if (currentStep >= steps) {
|
|
25
|
+
clearInterval(intervalId);
|
|
26
|
+
}
|
|
27
|
+
}, interval);
|
|
28
|
+
}
|
|
29
|
+
|
|
6
30
|
// src/functions/isIOS.ts
|
|
7
31
|
function isIOS() {
|
|
8
32
|
if (typeof window === "undefined")
|
|
@@ -66,6 +90,7 @@ function slugify(string, options) {
|
|
|
66
90
|
}
|
|
67
91
|
export {
|
|
68
92
|
clampValue,
|
|
93
|
+
interpolate,
|
|
69
94
|
isIOS,
|
|
70
95
|
mapValue,
|
|
71
96
|
slugify,
|
package/dist/utils/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/uuid.ts","../../packages/utils/src/functions/uniq.ts","../../packages/utils/src/functions/slugify.ts"],"sourcesContent":["export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","export function isIOS() {\n if (typeof window === 'undefined') return false\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","export function mapValue(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n}\n","// This implementation is meant for internal use only.\n// It is only used to generate a unique IDs for the `key` props.\n// It should not replace crypto.randomUUID() or window.crypto.randomUUID().\n\nexport function uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n .split('')\n .reduce(\n (c, i) =>\n c +\n (i === 'x'\n ? Math.floor(Math.random() * 0xf).toString(16)\n : i === 'y'\n ? Math.floor(Math.random() * 4 + 8).toString(16)\n : i),\n '',\n )\n}\n","export function uniq<T extends any[]>(a: T) {\n return Array.from(new Set(a))\n}\n","export interface SlugifyOptions {\n separator?: string\n trim?: boolean\n remove?: RegExp\n strict?: boolean\n lowercase?: boolean\n}\n\nconst defaultOptions: SlugifyOptions = {\n separator: '-',\n trim: true,\n remove: undefined,\n strict: true,\n lowercase: true,\n}\n\nexport function slugify(string: string, options?: SlugifyOptions): string {\n if (typeof string !== 'string') {\n throw new Error('slugify: string argument expected')\n }\n\n // Merge provided options with default options\n const _options = { ...defaultOptions, ...options }\n\n const charMap: { [key: string]: string } = {}\n\n let slug = string\n .normalize()\n .split('')\n .reduce(function (result, ch) {\n let appendChar = charMap[ch]\n if (appendChar === undefined) appendChar = ch\n if (appendChar === _options?.separator) appendChar = ' '\n return (\n result +\n appendChar.replace(_options?.remove || /[^\\w\\s$*_+~.()'\"!\\-:@]+/g, '')\n )\n }, '')\n\n if (_options.strict) {\n slug = slug.replace(/[^A-Za-z0-9\\s]/g, '')\n }\n\n if (_options.trim) {\n slug = slug.trim()\n }\n\n if (_options.separator) {\n slug = slug.replace(/ +/g, _options.separator)\n }\n\n if (_options.lowercase) {\n slug = slug.toLocaleLowerCase()\n }\n\n return slug\n}\n"],"mappings":";AAAO,SAAS,WAAW,OAAe,KAAa,KAAa;AAClE,SAAO,SAAS,MAAM,MAAM,SAAS,MAAM,MAAM;AACnD;;;
|
|
1
|
+
{"version":3,"sources":["../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/uuid.ts","../../packages/utils/src/functions/uniq.ts","../../packages/utils/src/functions/slugify.ts"],"sourcesContent":["export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","export type InterpolateArgs = {\n from: number\n to: number\n duration: number\n interval?: number\n easing?: (t: number) => number\n callback: (result: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const {\n from,\n to,\n duration,\n callback,\n easing = (t: number) => t * (2 - t),\n interval = 1,\n } = args\n\n const steps = Math.ceil(duration / interval)\n const stepSize = 1 / steps\n\n let currentStep = 0\n\n const intervalId = setInterval(() => {\n const progress = currentStep * stepSize\n const value = from + (to - from) * easing(progress)\n\n callback(value)\n currentStep++\n\n if (currentStep >= steps) {\n clearInterval(intervalId)\n }\n }, interval)\n}\n","export function isIOS() {\n if (typeof window === 'undefined') return false\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","export function mapValue(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n}\n","// This implementation is meant for internal use only.\n// It is only used to generate a unique IDs for the `key` props.\n// It should not replace crypto.randomUUID() or window.crypto.randomUUID().\n\nexport function uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n .split('')\n .reduce(\n (c, i) =>\n c +\n (i === 'x'\n ? Math.floor(Math.random() * 0xf).toString(16)\n : i === 'y'\n ? Math.floor(Math.random() * 4 + 8).toString(16)\n : i),\n '',\n )\n}\n","export function uniq<T extends any[]>(a: T) {\n return Array.from(new Set(a))\n}\n","export interface SlugifyOptions {\n separator?: string\n trim?: boolean\n remove?: RegExp\n strict?: boolean\n lowercase?: boolean\n}\n\nconst defaultOptions: SlugifyOptions = {\n separator: '-',\n trim: true,\n remove: undefined,\n strict: true,\n lowercase: true,\n}\n\nexport function slugify(string: string, options?: SlugifyOptions): string {\n if (typeof string !== 'string') {\n throw new Error('slugify: string argument expected')\n }\n\n // Merge provided options with default options\n const _options = { ...defaultOptions, ...options }\n\n const charMap: { [key: string]: string } = {}\n\n let slug = string\n .normalize()\n .split('')\n .reduce(function (result, ch) {\n let appendChar = charMap[ch]\n if (appendChar === undefined) appendChar = ch\n if (appendChar === _options?.separator) appendChar = ' '\n return (\n result +\n appendChar.replace(_options?.remove || /[^\\w\\s$*_+~.()'\"!\\-:@]+/g, '')\n )\n }, '')\n\n if (_options.strict) {\n slug = slug.replace(/[^A-Za-z0-9\\s]/g, '')\n }\n\n if (_options.trim) {\n slug = slug.trim()\n }\n\n if (_options.separator) {\n slug = slug.replace(/ +/g, _options.separator)\n }\n\n if (_options.lowercase) {\n slug = slug.toLocaleLowerCase()\n }\n\n return slug\n}\n"],"mappings":";AAAO,SAAS,WAAW,OAAe,KAAa,KAAa;AAClE,SAAO,SAAS,MAAM,MAAM,SAAS,MAAM,MAAM;AACnD;;;ACOO,SAAS,YAAY,MAAuB;AACjD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,CAAC,MAAc,KAAK,IAAI;AAAA,IACjC,WAAW;AAAA,EACb,IAAI;AAEJ,QAAM,QAAQ,KAAK,KAAK,WAAW,QAAQ;AAC3C,QAAM,WAAW,IAAI;AAErB,MAAI,cAAc;AAElB,QAAM,aAAa,YAAY,MAAM;AACnC,UAAM,WAAW,cAAc;AAC/B,UAAM,QAAQ,QAAQ,KAAK,QAAQ,OAAO,QAAQ;AAElD,aAAS,KAAK;AACd;AAEA,QAAI,eAAe,OAAO;AACxB,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF,GAAG,QAAQ;AACb;;;ACnCO,SAAS,QAAQ;AACtB,MAAI,OAAO,WAAW;AAAa,WAAO;AAC1C,SAAO,mBAAmB,KAAK,uCAAW,SAAS;AACrD;;;ACHO,SAAS,SACd,OACA,OACA,OACA,QACA,QACA;AACA,UAAS,QAAQ,UAAU,SAAS,WAAY,QAAQ,SAAS;AACnE;;;ACJO,SAAS,OAAO;AACrB,SAAO,uCACJ,MAAM,EAAE,EACR;AAAA,IACC,CAAC,GAAG,MACF,KACC,MAAM,MACH,KAAK,MAAM,KAAK,OAAO,IAAI,EAAG,EAAE,SAAS,EAAE,IAC3C,MAAM,MACN,KAAK,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,SAAS,EAAE,IAC7C;AAAA,IACN;AAAA,EACF;AACJ;;;ACjBO,SAAS,KAAsB,GAAM;AAC1C,SAAO,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC;AAC9B;;;ACMA,IAAM,iBAAiC;AAAA,EACrC,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AACb;AAEO,SAAS,QAAQ,QAAgB,SAAkC;AACxE,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAGA,QAAM,WAAW,EAAE,GAAG,gBAAgB,GAAG,QAAQ;AAEjD,QAAM,UAAqC,CAAC;AAE5C,MAAI,OAAO,OACR,UAAU,EACV,MAAM,EAAE,EACR,OAAO,SAAU,QAAQ,IAAI;AAC5B,QAAI,aAAa,QAAQ,EAAE;AAC3B,QAAI,eAAe;AAAW,mBAAa;AAC3C,QAAI,gBAAe,qCAAU;AAAW,mBAAa;AACrD,WACE,SACA,WAAW,SAAQ,qCAAU,WAAU,4BAA4B,EAAE;AAAA,EAEzE,GAAG,EAAE;AAEP,MAAI,SAAS,QAAQ;AACnB,WAAO,KAAK,QAAQ,mBAAmB,EAAE;AAAA,EAC3C;AAEA,MAAI,SAAS,MAAM;AACjB,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,QAAQ,OAAO,SAAS,SAAS;AAAA,EAC/C;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,kBAAkB;AAAA,EAChC;AAEA,SAAO;AACT;","names":[]}
|
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.
|
|
4
|
+
"version": "0.14.1",
|
|
5
5
|
"author": "Robin Scholz <https://github.com/robinscholz>, Christoph Jeworutzki <https://github.com/ChristophJeworutzki>",
|
|
6
6
|
"devDependencies": {
|
|
7
7
|
"@antfu/ni": "^0.21.12",
|