Files
vue-bits/src/demo/TextAnimations/TrueFocusDemo.vue
T

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>