vuetify
Version:
Vue Material Component Framework
1 lines • 13.2 kB
Source Map (JSON)
{"version":3,"file":"VWindow.mjs","names":["VBtn","Touch","makeTagProps","makeThemeProps","provideTheme","useGroup","useLocale","useRtl","computed","provide","ref","watch","genericComponent","useRender","VWindowSymbol","Symbol","for","VWindowGroupSymbol","VWindow","name","directives","props","continuous","Boolean","nextIcon","type","String","Function","Object","default","prevIcon","reverse","showArrows","validator","v","touch","undefined","direction","modelValue","disabled","selectedClass","mandatory","emits","setup","slots","themeClasses","isRtl","t","group","rootRef","isRtlReverse","value","isReversed","transition","axis","transitionCount","transitionHeight","activeIndex","items","findIndex","item","selected","includes","id","newVal","oldVal","itemsLength","length","lastIndex","canMoveBack","canMoveForward","prev","next","arrows","prevProps","icon","class","onClick","ariaLabel","push","nextProps","touchOptions","options","left","right","start","originalEvent","stopPropagation","height","additional"],"sources":["../../../src/components/VWindow/VWindow.tsx"],"sourcesContent":["// Styles\nimport './VWindow.sass'\n\n// Components\nimport { VBtn } from '@/components/VBtn'\n\n// Directives\nimport { Touch } from '@/directives/touch'\n\n// Composables\nimport { makeTagProps } from '@/composables/tag'\nimport { makeThemeProps, provideTheme } from '@/composables/theme'\nimport { useGroup } from '@/composables/group'\nimport { useLocale, useRtl } from '@/composables/locale'\n\n// Utilities\nimport { computed, provide, ref, watch } from 'vue'\nimport { genericComponent, useRender } from '@/util'\n\n// Types\nimport type { ComputedRef, InjectionKey, PropType, Ref } from 'vue'\nimport type { GroupItemProvide, GroupProvide } from '@/composables/group'\nimport type { IconValue } from '@/composables/icons'\nimport type { TouchHandlers } from '@/directives/touch'\n\nexport type VWindowSlots = {\n default: [{ group: GroupProvide }]\n additional: [{ group: GroupProvide }]\n prev: [{ props: ControlProps }]\n next: [{ props: ControlProps }]\n}\n\ntype WindowProvide = {\n transition: ComputedRef<undefined | string>\n transitionCount: Ref<number>\n transitionHeight: Ref<undefined | string>\n isReversed: Ref<boolean>\n rootRef: Ref<HTMLElement | undefined>\n}\n\ntype ControlProps = {\n icon: IconValue\n class: string\n onClick: () => void\n ariaLabel: string\n}\n\nexport const VWindowSymbol: InjectionKey<WindowProvide> = Symbol.for('vuetify:v-window')\nexport const VWindowGroupSymbol: InjectionKey<GroupItemProvide> = Symbol.for('vuetify:v-window-group')\n\nexport const VWindow = genericComponent<VWindowSlots>()({\n name: 'VWindow',\n\n directives: {\n Touch,\n },\n\n props: {\n continuous: Boolean,\n nextIcon: {\n type: [Boolean, String, Function, Object] as PropType<IconValue>,\n default: '$next',\n },\n prevIcon: {\n type: [Boolean, String, Function, Object] as PropType<IconValue>,\n default: '$prev',\n },\n reverse: Boolean,\n showArrows: {\n type: [Boolean, String],\n validator: (v: any) => typeof v === 'boolean' || v === 'hover',\n },\n touch: {\n type: [Object, Boolean] as PropType<boolean | TouchHandlers>,\n default: undefined,\n },\n direction: {\n type: String,\n default: 'horizontal',\n },\n\n modelValue: null,\n disabled: Boolean,\n selectedClass: {\n type: String,\n default: 'v-window-item--active',\n },\n // TODO: mandatory should probably not be exposed but do this for now\n mandatory: {\n default: 'force' as const,\n },\n\n ...makeTagProps(),\n ...makeThemeProps(),\n },\n\n emits: {\n 'update:modelValue': (v: any) => true,\n },\n\n setup (props, { slots }) {\n const { themeClasses } = provideTheme(props)\n const { isRtl } = useRtl()\n const { t } = useLocale()\n\n const group = useGroup(props, VWindowGroupSymbol)\n\n const rootRef = ref()\n const isRtlReverse = computed(() => isRtl.value ? !props.reverse : props.reverse)\n const isReversed = ref(false)\n const transition = computed(() => {\n const axis = props.direction === 'vertical' ? 'y' : 'x'\n const reverse = isRtlReverse.value ? !isReversed.value : isReversed.value\n const direction = reverse ? '-reverse' : ''\n\n return `v-window-${axis}${direction}-transition`\n })\n const transitionCount = ref(0)\n const transitionHeight = ref<undefined | string>(undefined)\n\n const activeIndex = computed(() => {\n return group.items.value.findIndex(item => group.selected.value.includes(item.id))\n })\n\n watch(activeIndex, (newVal, oldVal) => {\n const itemsLength = group.items.value.length\n const lastIndex = itemsLength - 1\n\n if (itemsLength <= 2) {\n isReversed.value = newVal < oldVal\n } else if (newVal === lastIndex && oldVal === 0) {\n isReversed.value = true\n } else if (newVal === 0 && oldVal === lastIndex) {\n isReversed.value = false\n } else {\n isReversed.value = newVal < oldVal\n }\n })\n\n provide(VWindowSymbol, {\n transition,\n isReversed,\n transitionCount,\n transitionHeight,\n rootRef,\n })\n\n const canMoveBack = computed(() => props.continuous || activeIndex.value !== 0)\n const canMoveForward = computed(() => props.continuous || activeIndex.value !== group.items.value.length - 1)\n\n function prev () {\n canMoveBack.value && group.prev()\n }\n\n function next () {\n canMoveForward.value && group.next()\n }\n\n const arrows = computed(() => {\n const arrows = []\n\n const prevProps = {\n icon: isRtl.value ? props.nextIcon : props.prevIcon,\n class: `v-window__${isRtlReverse.value ? 'right' : 'left'}`,\n onClick: group.prev,\n ariaLabel: t('$vuetify.carousel.prev'),\n }\n\n arrows.push(canMoveBack.value\n ? slots.prev\n ? slots.prev({ props: prevProps })\n : <VBtn { ...prevProps } />\n : <div />\n )\n\n const nextProps = {\n icon: isRtl.value ? props.prevIcon : props.nextIcon,\n class: `v-window__${isRtlReverse.value ? 'left' : 'right'}`,\n onClick: group.next,\n ariaLabel: t('$vuetify.carousel.next'),\n }\n\n arrows.push(canMoveForward.value\n ? slots.next\n ? slots.next({ props: nextProps })\n : <VBtn { ...nextProps } />\n : <div />\n )\n\n return arrows\n })\n\n const touchOptions = computed(() => {\n if (props.touch === false) return props.touch\n\n const options: TouchHandlers = {\n left: () => {\n isRtlReverse.value ? prev() : next()\n },\n right: () => {\n isRtlReverse.value ? next() : prev()\n },\n start: ({ originalEvent }) => {\n originalEvent.stopPropagation()\n },\n }\n\n return {\n ...options,\n ...(props.touch === true ? {} : props.touch),\n }\n })\n\n useRender(() => (\n <props.tag\n ref={ rootRef }\n class={[\n 'v-window',\n {\n 'v-window--show-arrows-on-hover': props.showArrows === 'hover',\n },\n themeClasses.value,\n ]}\n v-touch={ touchOptions.value }\n >\n <div\n class=\"v-window__container\"\n style={{\n height: transitionHeight.value,\n }}\n >\n { slots.default?.({ group }) }\n\n { props.showArrows !== false && (\n <div class=\"v-window__controls\">\n { arrows.value }\n </div>\n )}\n </div>\n\n { slots.additional?.({ group }) }\n </props.tag>\n ))\n\n return {\n group,\n }\n },\n})\n\nexport type VWindow = InstanceType<typeof VWindow>\n"],"mappings":"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"}