mirror of
https://github.com/DavidHDev/vue-bits.git
synced 2026-04-22 01:54:38 -06:00
161 lines
4.7 KiB
Vue
161 lines
4.7 KiB
Vue
<template>
|
|
<TabbedLayout>
|
|
<template #preview>
|
|
<div class="demo-container h-[400px]">
|
|
<div :key="key" class="flex flex-col justify-center items-center m-8 pl-6 w-full">
|
|
<TrueFocus :key="`${key}-${syncMode}-1`" v-bind="config" />
|
|
<br />
|
|
<TrueFocus :key="`${key}-${syncMode}-2`" v-bind="config" />
|
|
</div>
|
|
</div>
|
|
|
|
<Customize>
|
|
<PreviewColor title="Corners Color" v-model="borderColor" />
|
|
|
|
<PreviewSwitch title="Hover Mode" v-model="manualMode" />
|
|
|
|
<PreviewSwitch title="Apply Sync Group" v-model="syncMode" />
|
|
|
|
<PreviewSwitch title="Default Blur" v-model="defaultBlur" />
|
|
|
|
<PreviewSlider title="Blur Amount" v-model="blurAmount" :min="0" :max="15" :step="0.5" value-unit="px" />
|
|
|
|
<PreviewSlider
|
|
title="Animation Duration"
|
|
v-model="animationDuration"
|
|
:min="0.1"
|
|
:max="3"
|
|
:step="0.1"
|
|
value-unit="s"
|
|
:disabled="!manualMode"
|
|
/>
|
|
|
|
<PreviewSlider
|
|
title="Pause Between Animations"
|
|
v-model="pauseBetweenAnimations"
|
|
:min="0"
|
|
:max="5"
|
|
:step="0.5"
|
|
value-unit="s"
|
|
:disabled="manualMode"
|
|
/>
|
|
</Customize>
|
|
|
|
<PropTable :data="propData" />
|
|
|
|
<Dependencies :dependency-list="['motion-v']" />
|
|
</template>
|
|
|
|
<template #code>
|
|
<CodeExample :code-object="trueFocus" />
|
|
</template>
|
|
|
|
<template #cli>
|
|
<CliInstallation :command="trueFocus.cli" />
|
|
</template>
|
|
</TabbedLayout>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { ref, computed } from 'vue';
|
|
import TabbedLayout from '../../components/common/TabbedLayout.vue';
|
|
import PropTable from '../../components/common/PropTable.vue';
|
|
import CliInstallation from '../../components/code/CliInstallation.vue';
|
|
import CodeExample from '../../components/code/CodeExample.vue';
|
|
import Dependencies from '../../components/code/Dependencies.vue';
|
|
import Customize from '../../components/common/Customize.vue';
|
|
import PreviewColor from '../../components/common/PreviewColor.vue';
|
|
import PreviewSlider from '../../components/common/PreviewSlider.vue';
|
|
import PreviewSwitch from '../../components/common/PreviewSwitch.vue';
|
|
import TrueFocus from '../../content/TextAnimations/TrueFocus/TrueFocus.vue';
|
|
import { trueFocus } from '../../constants/code/TextAnimations/trueFocusCode';
|
|
import { useForceRerender } from '@/composables/useForceRerender';
|
|
|
|
const { rerenderKey: key } = useForceRerender();
|
|
|
|
const manualMode = ref(false);
|
|
const blurAmount = ref(5);
|
|
const animationDuration = ref(0.5);
|
|
const pauseBetweenAnimations = ref(1);
|
|
const borderColor = ref('#27FF64');
|
|
const syncMode = ref(false);
|
|
const defaultBlur = ref(true);
|
|
|
|
const config = computed(() => ({
|
|
sentence: 'True Focus',
|
|
manualMode: manualMode.value,
|
|
blurAmount: blurAmount.value,
|
|
borderColor: borderColor.value,
|
|
animationDuration: animationDuration.value,
|
|
pauseBetweenAnimations: pauseBetweenAnimations.value,
|
|
syncGroup: syncMode.value ? 'sync-group-demo' : undefined,
|
|
defaultBlur: defaultBlur.value
|
|
}));
|
|
|
|
const propData = [
|
|
{
|
|
name: 'sentence',
|
|
type: 'string',
|
|
default: "'True Focus'",
|
|
description: 'The text to display with the focus animation.'
|
|
},
|
|
{
|
|
name: 'manualMode',
|
|
type: 'boolean',
|
|
default: 'false',
|
|
description: 'Disables automatic animation when set to true.'
|
|
},
|
|
{
|
|
name: 'blurAmount',
|
|
type: 'number',
|
|
default: '5',
|
|
description: 'The amount of blur applied to non-active words.'
|
|
},
|
|
{
|
|
name: 'borderColor',
|
|
type: 'string',
|
|
default: "'green'",
|
|
description: 'The color of the focus borders.'
|
|
},
|
|
{
|
|
name: 'glowColor',
|
|
type: 'string',
|
|
default: "'rgba(0, 255, 0, 0.6)'",
|
|
description: 'The color of the glowing effect on the borders.'
|
|
},
|
|
{
|
|
name: 'animationDuration',
|
|
type: 'number',
|
|
default: '0.5',
|
|
description: 'The duration of the animation for each word.'
|
|
},
|
|
{
|
|
name: 'pauseBetweenAnimations',
|
|
type: 'number',
|
|
default: '1',
|
|
description: 'Time to pause between focusing on each word (in auto mode).'
|
|
},
|
|
{
|
|
name: 'index',
|
|
type: 'Array<number>',
|
|
default: 'undefined',
|
|
description:
|
|
'Maps each word to a shared index value, used to coordinate focus position across multiple instances in the same syncGroup.'
|
|
},
|
|
{
|
|
name: 'syncGroup',
|
|
type: 'string',
|
|
default: 'undefined',
|
|
description:
|
|
'A group identifier. All instances sharing the same syncGroup will stay in sync, hovering or animating one will reflect on all others.'
|
|
},
|
|
{
|
|
name: 'defaultBlur',
|
|
type: 'boolean',
|
|
default: 'true',
|
|
description:
|
|
'In manualMode, determines behavior on mouse leave: true restores focus to the last hovered word, false clears all blur.'
|
|
}
|
|
];
|
|
</script>
|