UNPKG

vue3-flashcards

Version:

Tinder-like flashcards component with dragging and flipping

79 lines (73 loc) 2.43 kB
import type { FlashCardsProps } from '../FlashCards.vue' import { StackDirection } from '../utils/useStackTransform' /** * Default configuration values for FlashCards */ export const flashCardsDefaults = ( { renderLimit: 3, swipeThreshold: 150, dragThreshold: 5, swipeDirection: 'horizontal', maxRotation: 20, stack: 0, stackOffset: 20, stackScale: 0.05, stackDirection: StackDirection.BOTTOM, itemKey: 'id', loop: undefined, waitAnimationEnd: undefined, resistance: null, velocity: undefined, a11y: undefined, } as const ) satisfies FlashCardsProps<any> /** * Internal tuning defaults for grouped props. These are the fallbacks used when * a grouped prop (`resistance`, `velocity`) is enabled but a field is omitted — * they are NOT public props themselves. */ export const resistanceDefaults = { threshold: 150, strength: 0.3, } as const export const velocityDefaults = { enabled: true, threshold: 0.5, } as const /** * Accessibility defaults. The `a11y` prop is on by default — these are the * fallbacks used when it's omitted or only partially specified. Labels are the * English defaults; pass an `a11y.labels` object to localize them. * * `announce` receives the deck event and the labels and returns the string read * out by the live region (or `null`/`''` to stay silent for that event). */ export const a11yDefaults = { // Master switch. `false` opts out of ALL a11y wiring (roles, live region, // keyboard, focus) for users who want to supply their own. enabled: true, // Keyboard navigation (arrows / Enter / Space / restore keys). keyboard: true, // When `true`, an arrow key first peeks the card to the full pre-swipe pose // and waits for Enter/Space (or another arrow) to confirm; Escape cancels. // When `false`, an arrow key swipes immediately. confirmOnKey: false, // Move focus to the next active card after a keyboard-driven swipe. manageFocus: true, // aria-live politeness for the announcement region. liveMode: 'polite' as 'polite' | 'assertive', labels: { deck: 'Card deck', card: 'Card', top: 'up', left: 'left', right: 'right', bottom: 'down', skip: 'skipped', restore: 'restored', empty: 'No more cards', instructions: 'Use arrow keys to swipe the card, Enter to confirm.', }, } as const export type A11yLabels = typeof a11yDefaults.labels