Vue API रेफ़रेंस

@reelkit/vue के कंपोनेंट, composables और यूटिलिटी का पूरा रेफ़रेंस।

Reel

टैग: <Reel>

Props

ReelProps

Propटाइपडिफ़ॉल्टविवरण
countnumberज़रूरीस्लाइड की कुल संख्या
direction'vertical' | 'horizontal''vertical'स्क्रॉल की दिशा
size[number, number] | undefinedundefined[width, height] के रूप में चौड़ाई और ऊँचाई। छोड़ने पर ResizeObserver से अपने-आप नापता है
initialIndexnumber0शुरुआती स्लाइड index
loopbooleanfalseअनंत लूप चालू करता है
transitionTransitionTransformFnslideTransitionट्रांज़िशन इफ़ेक्ट का फ़ंक्शन। बिल्ट-इन: slideTransition, fadeTransition, flipTransition, cubeTransition, zoomTransition
transitionDurationnumber300ms में एनिमेशन की अवधि
swipeDistanceFactornumber0.12स्वाइप की सीमा (0-1)
enableGesturesbooleantrueटच/माउस से खींचकर नेविगेशन चालू करता है
enableNavKeysbooleantrueकीबोर्ड की तीर वाली कुंजियों से नेविगेशन चालू करता है
enableWheelbooleanfalseमाउस व्हील से नेविगेशन चालू करता है
wheelDebounceMsnumber200ms में व्हील इवेंट का debounce
rangeExtractor(index: number, count: number) => number[]defaultRangeExtractorकौन-से index रेंडर हों, यह तय करने वाला कस्टम फ़ंक्शन
keyExtractor(index: number, indexInRange: number) => stringindex => index.toString()स्लाइड रेंडरिंग के लिए कस्टम key फ़ंक्शन (loop के साथ काम का)
ariaLabelstringundefinedcarousel क्षेत्र का सुलभ लेबल
reelStyleRecord<string, string | number>undefinedroot कंटेनर एलिमेंट पर लगने वाली inline styles
reelClassstring | Array | Objectundefinedroot कंटेनर एलिमेंट पर लगने वाली CSS class(es)
onNavKeyPress(increment: -1 | 1) => voidundefinedcallback prop, जो डिफ़ॉल्ट ArrowUp/ArrowDown नेविगेशन की जगह लेता है। देने पर नेविगेशन आप खुद लिखते हैं (जैसे reelRef.value.next() कॉल करें)। डिफ़ॉल्ट व्यवहार के लिए छोड़ दें।

इवेंट

इवेंटPayloadविवरण
beforeChange(index: number, nextIndex: number, indexInRange: number)स्लाइड ट्रांज़िशन शुरू होने से पहले emit होता है
afterChange(index: number, indexInRange: number)स्लाइड ट्रांज़िशन पूरा होने के बाद emit होता है
slideDragStart(index: number)खींचने का जेस्चर शुरू होने पर emit होता है
slideDragEnd(index: number)खींचने का जेस्चर ख़त्म होने (छोड़ने) पर emit होता है
slideDragCanceled(index: number)खींचने का जेस्चर रद्द होने (वापस अपनी जगह) पर emit होता है
tap(event: GestureCommonEvent)एक टैप जेस्चर पर emit होता है
doubleTap(event: GestureCommonEvent)डबल टैप जेस्चर पर emit होता है
longPress(event: GestureCommonEvent)लंबे दबाव का जेस्चर शुरू होने पर emit होता है
longPressEnd(event: GestureEvent)लंबे दबाव का जेस्चर ख़त्म होने पर emit होता है

Slots

vue-html
<Reel :count="items.length">
  <template #item="{ index, indexInRange, size }">
    <!-- index       : number         — absolute slide index (0 to count-1) -->
    <!-- indexInRange : number         — position in the visible window (0, 1, or 2) -->
    <!-- size         : [number,number] — [width, height] of the container -->
    <MySlide :index="index" :size="size" />
  </template>

  <!-- default slot: overlay content rendered on top of the slides -->
  <ReelIndicator />
</Reel>
SlotScoped propsविवरण
#item{ index: number, indexInRange: number, size: [number, number] }हर दिखने वाली स्लाइड रेंडर करता है। वर्चुअलाइज़्ड range के हर index के लिए कॉल होता है
defaultnoneसारी स्लाइडों के ऊपर रेंडर होने वाला overlay कंटेंट (इंडिकेटर, कंट्रोल वगैरह)

ReelExpose

template ref के ज़रिए मिलने वाला imperative API:

vue
<script setup lang="ts">
import { ref } from 'vue';
import { Reel, type ReelExpose } from '@reelkit/vue';

const reelRef = ref<ReelExpose | null>(null);

function prev()  { reelRef.value?.prev(); }
function next()  { reelRef.value?.next(); }
function jump(i: number) { reelRef.value?.goTo(i, true); }
</script>

<template>
  <Reel ref="reelRef" :count="100">
    <template #item="{ index }">
      <div>Slide {{ index }}</div>
    </template>
  </Reel>
</template>
मेथडटाइपविवरण
next()() => voidअगली स्लाइड पर जाता है
prev()() => voidपिछली स्लाइड पर जाता है
goTo(index, animate?)(number, boolean?) => Promise<void>किसी खास स्लाइड index पर जाता है
adjust()() => voidस्लाइड की स्थितियाँ दोबारा निकालता है (लेआउट बदलने के बाद काम का)
observe()() => voidजेस्चर, कीबोर्ड और व्हील इवेंट सुनना शुरू करता है
unobserve()() => voidजेस्चर, कीबोर्ड और व्हील इवेंट सुनना बंद करता है

ReelIndicator

टैग: <ReelIndicator>

Props

ReelIndicatorProps

Propटाइपडिफ़ॉल्टविवरण
countnumber | undefinedautoआइटम की कुल संख्या। parent Reel के अंदर होने पर उसके context से अपने-आप जुड़ती है; अकेले इस्तेमाल करने पर साफ़ तौर पर पास करें
activenumber | undefinedautoमौजूदा सक्रिय index। parent Reel के अंदर होने पर उसके context से अपने-आप जुड़ता है; अकेले इस्तेमाल करने पर साफ़ तौर पर पास करें
direction'vertical' | 'horizontal''vertical'इंडिकेटर की दिशा
radiusnumber3पिक्सेल में बिंदु का radius
visiblenumber5एक साथ दिखने वाले सामान्य आकार के बिंदुओं की अधिकतम संख्या
gapnumber4पिक्सेल में बिंदुओं के बीच की दूरी
activeColorstring'#fff'सक्रिय बिंदु का रंग
inactiveColorstring'rgba(255, 255, 255, 0.5)'निष्क्रिय बिंदु का रंग
edgeScalenumber0.5किनारे पर overflow वाले बिंदुओं का scale
onDotClick(index: number) => voidundefinedकस्टम click हैंडलर। Reel के अंदर छोड़ने पर डिफ़ॉल्ट रूप से क्लिक किए बिंदु के index पर ले जाता है
indicatorClassstring | Array | Objectundefinedtablist root एलिमेंट पर लगने वाली CSS class(es)
indicatorStyleCSSPropertiesundefinedtablist root एलिमेंट में मिलाई जाने वाली inline styles

इवेंट

इवेंटPayloadविवरण
dotClick(index: number)बिंदु पर क्लिक होने पर emit होता है; बिंदु का index देता है

SwipeToClose

टैग: <SwipeToClose> — अपने default slot को टच समझने वाले कंटेनर में लपेटता है, जिसे स्वाइप करके हटाया जा सकता है।

Props

SwipeToCloseProps

Propटाइपडिफ़ॉल्टविवरण
direction'up' | 'down'ज़रूरीबंद करने के लिए स्वाइप की दिशा। lightbox हटाने के लिए "up", stories हटाने के लिए "down" इस्तेमाल करें
enabledbooleantrueस्वाइप करके बंद करने वाला जेस्चर चालू है या नहीं
thresholdnumber0.2बंद करने के लिए ज़रूरी viewport ऊँचाई का हिस्सा (0-1)

इवेंट

इवेंटPayloadविवरण
close()स्वाइप जेस्चर सीमा पार करने और बंद होने का एनिमेशन पूरा होने पर emit होता है

Slots

Slotविवरण
defaultस्वाइप करके बंद करने वाले जेस्चर से लपेटा जाने वाला कंटेंट

Observe

टैग: <Observe :signals="[…]"> — जब भी इनमें से कोई सिग्नल बदलता है, यह सिर्फ़ अपना डिफ़ॉल्ट स्लॉट दोबारा बनाता है, आसपास कुछ नहीं।

रेंडर फ़ंक्शन या टेम्पलेट में core का सिग्नल पढ़ लेने भर से उसकी सदस्यता नहीं बनती। आम जवाब toVueRef है, लेकिन वह सिग्नल को उसी कंपोनेंट से बाँध देता है जिसने उसे बुलाया, इसलिए बार-बार बदलने वाला सिग्नल पूरे कंपोनेंट को दोबारा बनवाता है। Observe उससे सँकरी सीमा है: जो हिस्सा वह मान दिखाता है उसी को लपेट दें, बाक़ी कंपोनेंट अपनी जगह बना रहता है। Stories Player इसी तरह हेडर और प्रोग्रेस बार बदलता है और दोनों स्लाइडर दोबारा नहीं बनाता।

Propटाइपविवरण
signalsreadonly Subscribable[]जिन सिग्नलों का पीछा करना है। अलग समूह देने पर सदस्यता बदल जाती है, वही समूह देने पर बनी रहती है। अनमाउंट पर सब छोड़ दिया जाता है।

प्रॉप्स का टाइप ObserveProps के रूप में एक्सपोर्ट होता है।

vue
<script setup lang="ts">
import { Observe, createTimerController, toVueRef } from '@reelkit/vue';

const timer = createTimerController({ duration: 5000 });

// toVueRef binds the signal to THIS component: every tick re-renders all of
// it. Fine for a small component, wasteful when something heavy sits beside
// the part that changes.
const progress = toVueRef(timer.progress);
</script>

<template>
  <section>
    <!-- Only the slot below re-renders on a tick; the list keeps its DOM. -->
    <Observe :signals="[timer.progress]">
      <progress :value="timer.progress.value" max="1" />
    </Observe>

    <ExpensiveList :items="items" />

    <!-- The same value through toVueRef, for comparison. -->
    <p>{{ Math.round(progress * 100) }}%</p>
  </section>
</template>

जब पूरा कंपोनेंट सिग्नल का पीछा करे तो toVueRef लें, और जब उसका सिर्फ़ एक हिस्सा करे तो Observe।

SoundProvider

टैग: <SoundProvider> — context provider, जो SoundController instance बनाता है और उसे RK_SOUND_KEY के ज़रिए descendants को देता है। अपना default slot बिना कुछ जोड़े रेंडर करता है।

vue
<template>
  <SoundProvider>
    <Reel :count="items.length">
      <template #item="{ index }">
        <VideoSlide :index="index" />
      </template>
      <MuteButton />
    </Reel>
  </SoundProvider>
</template>

RK_REEL_KEY और useReelContext

<Reel> अपने descendants को जो InjectionKey<ReelContextValue> देता है। <ReelIndicator> अपने-आप जुड़ने के लिए अंदर से इसे इस्तेमाल करता है। जिन कस्टम कंपोनेंट को स्लाइडर context चाहिए, उनमें useReelContext() इस्तेमाल करें।

vue
<script setup lang="ts">
import { useReelContext } from '@reelkit/vue';

const ctx = useReelContext();

function jump(index: number) {
  ctx?.goTo(index, true);
}
</script>
प्रॉपर्टीटाइपविवरण
indexSignal<number>मौजूदा स्लाइड का reactive index
countSignal<number>आइटम की reactive कुल गिनती
goTo(index: number, animate?: boolean) => Promise<void>प्रोग्राम से किसी स्लाइड पर ले जाता है

Composables

useBodyLock

दी गई value true होने पर document body का स्क्रॉल lock करता है। reference गिनती इस्तेमाल करता है, इसलिए एक साथ कई कॉल करने वाले अलग-अलग lock/unlock कर सकते हैं। unmount पर अपने-आप unlock होता है।

typescript
import { ref } from 'vue';
import { useBodyLock } from '@reelkit/vue';

const isOpen = ref(false);
useBodyLock(isOpen);

// Also accepts a static boolean
useBodyLock(true);
पैरामीटरटाइपविवरण
lockedRef<boolean> | booleanbody का स्क्रॉल lock होना चाहिए या नहीं। reactive ref या स्थिर boolean लेता है

useFullscreen

UseFullscreenOptions → UseFullscreenReturn

सभी ब्राउज़र के सपोर्ट के साथ Fullscreen API संभालने वाला composable। unmount पर अपने-आप फ़ुलस्क्रीन से बाहर आता है।

typescript
import { ref } from 'vue';
import { useFullscreen } from '@reelkit/vue';

const containerRef = ref<HTMLElement | null>(null);
const { isFullscreen, request, exit, toggle } = useFullscreen({
  elementRef: containerRef,
});
लौटाया गया मानटाइपविवरण
isFullscreenSignal<boolean>मौजूदा फ़ुलस्क्रीन स्टेट दिखाने वाला core signal (.value पढ़ें)
request() => Promise<void>जुड़े हुए एलिमेंट पर फ़ुलस्क्रीन माँगता है। अगर कोई दूसरा एलिमेंट पहले से फ़ुलस्क्रीन है, तो पहले उससे बाहर आता है (इंतज़ार करके)।
exit() => Promise<void>फ़ुलस्क्रीन से बाहर आता है
toggle() => Promise<void>फ़ुलस्क्रीन स्टेट टॉगल करता है

useSoundState

context से मौजूदा SoundController तक पहुँचें। <SoundProvider> के अंदर ही कॉल करना ज़रूरी है। बाहर कॉल करने पर error फेंकता है।

typescript
import { useSoundState } from '@reelkit/vue';

// Inside a SoundProvider descendant
const sound = useSoundState();

sound.muted;    // Signal<boolean>
sound.toggle(); // Toggle muted state

useOverlayUrlState

OverlayUrlStateOptions

किसी overlay के लिए URL-स्टेट कंट्रोलर बनाता है, जिसे आप <LightboxUrlOverlay> को उसके :controller prop के रूप में देते हैं।

पूरी जानकारी और उदाहरणों के लिए Vue गाइड में URL स्टेट देखें।

विकल्पटाइपडिफ़ॉल्टविवरण
paramstringज़रूरीसक्रिय स्लाइड रखने वाला query parameter, जैसे "photo"।
adapterUrlAdapterHistory APIपढ़ने और लिखने के लिए नेविगेशन सिस्टम। routing वाले ऐप में router पर आधारित adapter पास करें, ताकि router की अपनी location पुरानी न पड़े।
codec{ decode(raw) => Id | null; encode(id) => string }ज़रूरीwire का रूप: parameter का टेक्स्ट ↔ स्थिर पहचान, collection से बेख़बर। एक ही Id साझा करने वाली मेल खाती जोड़ी के रूप में locator के साथ चलता है — डिफ़ॉल्ट ?photo=3 index गैलरी के लिए ...urlIndexKey(() => props.images.length) spread करें, या अपना (base64, slug) दें ताकि गैलरी का क्रम बदलने पर भी bookmark काम करे।
locator{ locate(id) => number | null; locateAsync?(id) => Promise<number | null>; identify(index) => id }ज़रूरीपहचान को स्थिति से जोड़ता है और उसकी वैधता खुद संभालता है: locate (sync), locateAsync (पेज वाली गैलरी के लिए async विकल्प), identify (writes)। साधारण index गैलरी के लिए ...urlIndexKey(() => props.images.length) spread करें — यह यह locator और मेल खाता codec देता है और ?photo=3 को मौजूदा गिनती तक सीमित रखता है, इसलिए पुराना ?photo=99 कभी नाम न ली गई स्लाइड खोलने के बजाय URL से अपने-आप हट जाता है। संख्या नहीं, getter पास करें, क्योंकि Vue का setup एक ही बार चलता है और पकड़ी गई लंबाई पेज वाली फ़ीड बढ़ने पर पुरानी पड़ जाएगी। पेज वाली फ़ीड या पहचान से key होने वाली गैलरी इसकी जगह अपनी मेल खाती codec + locator जोड़ी देती है।

useVueRouterUrlAdapter

Vue Router पर आधारित UrlAdapter। routing वाले ऐप में इसे useOverlayUrlState के adapter विकल्प के रूप में पास करें, ताकि नेविगेशन की सच्चाई का अकेला स्रोत router ही रहे — router के पीछे history.pushState लिखने से उसकी location पुरानी पड़ जाती है और उसका अगला नेविगेशन parameter गिरा देता है। Writes सिर्फ़ query को छूते हैं, इसलिए path, hash और ?tag=a&tag=b जैसी दोहराई गई keys बिना बदले साथ चलती हैं। हर बदलाव बताता है कि router ने उसी पेज पर push किया, replace किया या history में आगे-पीछे गया, इसलिए <router-link> से खुली गैलरी back के एक कदम से बंद होती है।

यह अपने अलग subpath से आता है, इसलिए बिना router वाला ऐप vue-router को कभी अपने बंडल में नहीं खींचता। vue-router एक वैकल्पिक peer dependency है, 4.1 या उसके बाद का: adapter अपनी पहचान की मुहर router के state नेविगेशन विकल्प से ले जाता है, जिसे पुराने रिलीज़ अनदेखा करते हैं। पुराने router पर कुछ नहीं टूटता — बंद करना बस एक कदम पीछे जाने के बजाय parameter को उसी जगह साफ़ कर देता है।

typescript
import { useVueRouterUrlAdapter } from '@reelkit/vue/vue-router-url-adapter';

const adapter = useVueRouterUrlAdapter();
const photo = useOverlayUrlState({
  param: 'photo',
  adapter,
  ...urlIndexKey(() => props.images.length),
});

toVueRef

core के Subscribable (@reelkit/core का कोई भी Signal) को read-only Vue Ref से जोड़ता है। जब भी core signal की value से Vue को दोबारा रेंडर करवाना हो, इसे इस्तेमाल करें — render फ़ंक्शन या templates में सीधे signal.value पढ़ना अपने-आप में reactive नहीं है।

subscription onScopeDispose से अपने-आप हट जाता है, इसलिए इसे Vue के setup() या effect scope समझने वाले किसी दूसरे context के अंदर ही कॉल करें।

typescript
import { defineComponent, h } from 'vue';
import { toVueRef, useSoundState } from '@reelkit/vue';

export const MuteIcon = defineComponent({
  setup() {
    const sound = useSoundState();
    const muted = toVueRef(sound.muted); // Readonly<Ref<boolean>>

    return () => h('span', muted.value ? '🔇' : '🔊');
  },
});

asGenericPropKeys

ऐसा कंपोनेंट बनाता है जो मिलने वाले आइटम पर जेनेरिक हो, जैसे ReelPlayerOverlay और StoriesOverlay हैं। Vue 3.3 टाइप पैरामीटर वाला setup फ़ंक्शन defineComponent(<T>(props: Props<T>) => …, options) स्वीकार करता है, पर वह पैरामीटर तभी बचता है जब options.props में prop के नाम हों। props ऑब्जेक्ट देने पर Vue ऑब्जेक्ट से ही prop के टाइप पढ़ लेता है, और T खो जाता है। asGenericPropKeys props ऑब्जेक्ट को बिना बदले आगे देता है, जबकि टाइप चेकर उसे नामों की सूची के रूप में देखता है: T पैरेंट के bind किए मान से निकलता है, और runtime पर default, validation और boolean casting पहले की तरह काम करते हैं।

टाइप आर्ग्युमेंट बेस आइटम वाला props टाइप है, और कंपोनेंट को Vue 3.3 या नया चाहिए। स्लॉट और events T का इस्तेमाल नहीं कर सकते: स्लॉट के स्कोप को टाइप करने के लिए टेम्पलेट में उस पर टाइप लिखें।

typescript
import { defineComponent, h, type PropType } from 'vue';
import { asGenericPropKeys } from '@reelkit/vue';

interface Item {
  id: string;
}

interface FeedProps<T extends Item> {
  items: T[];
  loop?: boolean;
}

const feedProps = {
  items: { type: Array as PropType<Item[]>, required: true as const },
  loop: { type: Boolean, default: false },
};

export const Feed = defineComponent(
  <T extends Item = Item>(props: FeedProps<T>) =>
    () =>
      h('ul', props.items.map((item) => h('li', item.id))),
  { name: 'Feed', props: asGenericPropKeys<FeedProps<Item>>(feedProps) },
);

hasRenderedNodes

hasRenderedNodes(nodes) बताता है कि किसी स्लॉट का नतीजा पेज पर कुछ रखेगा या नहीं। यह उस कंपोनेंट के लिए है जो पैरेंट के स्लॉट खाली छोड़ने पर अपनी रेंडरिंग पर लौट आता है, जैसा ओवरले करते हैं। जिस स्लॉट का कंटेंट किसी false v-if के पीछे है, वह फिर भी एक comment node लौटाता है, इसलिए array की लंबाई जाँचने से वह भरा हुआ लगेगा और फ़ॉलबैक हट जाएगा। hasRenderedNodes fragments को खोलता है, comment nodes को अनदेखा करता है, और null या undefined के लिए false लौटाता है, इसलिए शाखा बनाने के लिए सही जाँच hasRenderedNodes(slots.controls?.(scope)) है।

सुलभता

<Reel> aria-roledescription="carousel" के साथ role="region" के रूप में रेंडर होता है। क्षेत्र को स्क्रीन रीडर के लिए नाम देने के लिए aria-label पास करें (TS में prop का नाम ariaLabel है)। एक polite live region हर स्लाइड बदलने पर "Slide N of M" बोलता है। निष्क्रिय स्लाइडों को inert attribute मिलता है, ताकि फ़ोकस और सहायक तकनीक का नेविगेशन उन्हें छोड़ दे।

<ReelIndicator> बिंदुओं पर roving tabindex के साथ role="tablist" के रूप में रेंडर होता है; तीर वाली कुंजियाँ फ़ोकस खिसकाती हैं और Enter या Space स्लाइड सक्रिय करता है।

<Reel> के आसपास अपना modal बना रहे हैं? फ़ोकस लौटाने और रोकने के लिए captureFocusForReturn, createFocusTrap और getFocusableElements @reelkit/vue से भी export होते हैं।

पैकेज exports

@reelkit/vue के सारे सार्वजनिक exports:

typescript
// Components
import {
  Reel,
  ReelIndicator,
  SwipeToClose,
  SoundProvider,
  Observe,
} from '@reelkit/vue';

// Types
import type {
  ReelExpose,
  ReelContextValue,
  SwipeToCloseDirection,
  SwipeToCloseProps,
  UseFullscreenOptions,
  UseFullscreenReturn,
} from '@reelkit/vue';

// Context & composables
import {
  RK_REEL_KEY,
  useReelContext,
  RK_SOUND_KEY,
  useBodyLock,
  useFullscreen,
  useSoundState,
  toVueRef,
} from '@reelkit/vue';

// Generic components
import { asGenericPropKeys } from '@reelkit/vue';

// Utilities (re-exported from @reelkit/core)
import {
  createDefaultKeyExtractorForLoop,
  defaultRangeExtractor,
} from '@reelkit/vue';

// Core re-exports
import {
  // Signals & reactivity
  createSignal, createComputed, reaction, batch, createDeferred,

  // Transitions
  slideTransition, fadeTransition, flipTransition,
  cubeTransition, zoomTransition, getSlideProgress,

  // Content loading & preloading
  createContentLoadingController, createContentPreloader,
  observeMediaLoading,

  // Sound
  createSoundController, syncMutedToVideo,

  // Fullscreen
  fullscreenSignal, requestFullscreen, exitFullscreen,

  // DOM & cleanup
  observeDomEvent, createDisposableList, createBodyLock, sharedBodyLock,

  // Size detection
  observeElementSize, getViewportSize, observeViewportSize,
  isMobileWidth, fitAspectRatio, isTouchDevice,

  // Autoplay & download
  createTimerController, createSlideshowController, downloadFile,

  // Focus management
  captureFocusForReturn, createFocusTrap, getFocusableElements,

  // Gestures
  createGestureController,

  // Video
  captureFrame, createSharedVideo,

  // Animation
  animate,

  // Utilities
  noop, clamp, abs, first, last, extractRange,
  lerp, isNegative, generate,
} from '@reelkit/vue';