Skip to content

Instantly share code, notes, and snippets.

export default function getValidRange(current, max, min) {
return Math.min(Math.max(current, min), max);
}
<template>
<div
class="w-screen h-screen overflow-hidden"
data-vue-component-name="AppCover"
>
<transition-group
:style="{
backgroundColor: color,
width: `${(skippedBackgroundsCount + 1) * 100}vw`,
}"
/**
* Type writing effect
* @param message
* @param typingCallback
* @param doneCallback
*/
export default function typingEffect(
message,
typingCallback = () => {},
doneCallback = () => {},
<template>
<div
data-vue-component-name="OnHover"
@mouseenter="toggleHover(true)"
@mouseleave="toggleHover(false)"
>
<slot :hover="hoverState" />
</div>
</template>
import { reactive, computed } from 'vue';
export default function isScreenSize() {
const screen = reactive({
xs2: {
max: 539,
enabled: false,
},
xs: {
max: 639,
export default function excludeKeys(obj = {}, keys = []) {
return Object
.keys(obj)
.reduce(
(acc, key) => {
if (!keys.includes(key)) {
acc[key] = obj[key];
}
return acc;
<template>
<div
data-vue-component-name="ButtonBurger"
:class="{ active: isActive }"
@click="toggle"
>
<span class="top" />
<span class="middle" />
<span class="bottom" />
</div>
// подставляет в inline-styles значение высоты,
// которое можно использовать для анимации высоты с динамическим контентом
let isCollapsed = true;
type Params = {
from: string;
to: string;
};
const throtthe = () => {
let timeout = null;
return (fn, TIME) => {
if (!timeout) {
fn();
timeout = setTimeout(
() => {
clearTimeout(timeout);
// запуск функции с задержкой
async delayExecute(fn, duration = 0) {
return new Promise(
resolve => setTimeout(
() => resolve(fn()),
duration,
),
);
}