vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 24.5 kB
Source Map (JSON)
{"version":3,"file":"viewer.vue2.cjs","sources":["../../../components/viewer/viewer.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Divider } from '@/components/divider'\nimport { Icon } from '@/components/icon'\nimport { Renderer } from '@/components/renderer'\n\nimport { computed, h, nextTick, onMounted, reactive, ref, toRef } from 'vue'\n\nimport { emitEvent, useIcons, useLocale, useNameHelper, useProps } from '@vexip-ui/config'\nimport { useFullScreen, useModifier, useMoving, useSetTimeout } from '@vexip-ui/hooks'\nimport { boundRange, callIfFunc, toCssSize, toFixed } from '@vexip-ui/utils'\nimport { viewerProps } from './props'\nimport { InternalActionName, viewerDefaultActionLayout } from './symbol'\n\nimport type { ViewerActionLayout, ViewerState, ViewerToolbarAction } from './symbol'\n\ndefineOptions({ name: 'Viewer' })\n\nconst _props = defineProps(viewerProps)\nconst props = useProps('viewer', _props, {\n locale: null,\n width: '100%',\n height: '100%',\n moveDisabled: false,\n zoomDisabled: false,\n zoomDelta: 0.15,\n zoomMin: 0.1,\n zoomMax: Infinity,\n rotateDisabled: false,\n rotateDelta: 90,\n flipDisabled: false,\n fullDisabled: false,\n toolbarPlacement: 'bottom',\n actions: () => [],\n toolbarFade: false,\n noTransition: false,\n centerScale: false,\n actionLayout: () => [],\n})\n\ndefineSlots<{\n default: (params: { state: ViewerState }) => any,\n [action: `action-${string}`]: (params: { state: ViewerState }) => any\n}>()\n\nconst nh = useNameHelper('viewer')\nconst locale = useLocale('viewer', toRef(props, 'locale'))\nconst icons = useIcons()\n\nconst { timer } = useSetTimeout()\nconst toolbarActive = ref(false)\n\nconst zoom = ref(1)\nconst rotate = ref(0)\nconst flipX = ref(false)\nconst flipY = ref(false)\n\nconst viewer = ref<HTMLElement>()\nconst transition = ref<HTMLElement>()\n\nconst { supported: fullSupported, full, enter: enterFull, exit: exitFull } = useFullScreen(viewer)\nconst {\n target: container,\n x: currentLeft,\n y: currentTop,\n moving,\n} = useMoving({\n onStart: (_, event) => {\n if (props.moveDisabled || event.button > 0) {\n return false\n }\n\n emitEvent(props.onMoveStart, getState())\n },\n onMove: () => {\n emitEvent(props.onMoveStart, getState())\n },\n onEnd: () => {\n emitEvent(props.onMoveStart, getState())\n },\n})\n\nconst state = reactive({\n zoom,\n rotate,\n flipX,\n flipY,\n full,\n moving,\n x: currentLeft,\n y: currentTop,\n}) as ViewerState\n\nconst zoomOrigin = {\n x: 0,\n y: 0,\n}\n\nuseModifier({\n target: viewer,\n passive: false,\n onKeyDown: (event, modifier) => {\n if (moving.value) return\n\n if (modifier.up || modifier.down || modifier.left || modifier.right) {\n event.preventDefault()\n\n const current = modifier.up || modifier.down ? currentTop : currentLeft\n const step = modifier.up || modifier.left ? -10 : 10\n\n current.value += event.ctrlKey ? 5 * step : step\n\n modifier.resetAll()\n }\n },\n})\n\nfunction getState() {\n return state\n}\n\nfunction getActionProp<\n K extends Exclude<keyof ViewerToolbarAction, 'name' | 'icon' | 'iconRenderer' | 'process'>,\n>(action: ViewerToolbarAction, prop: K) {\n return callIfFunc(action[prop] as any, state) as Exclude<\n ViewerToolbarAction[K],\n (...args: any) => any\n >\n}\n\nfunction getActionClass(name: string) {\n return nh.be(name)\n}\n\nconst internalActions: ViewerToolbarAction[] = [\n {\n name: InternalActionName.RotateRight,\n process: () => handleRotate(props.rotateDelta),\n iconRenderer: () => h(Icon, icons.value.rotateRight),\n class: getActionClass(InternalActionName.RotateRight),\n title: () => locale.value.rotateRight,\n hidden: () => props.rotateDisabled,\n },\n {\n name: InternalActionName.RotateLeft,\n process: () => handleRotate(-1 * props.rotateDelta),\n iconRenderer: () => h(Icon, icons.value.rotateLeft),\n class: getActionClass(InternalActionName.RotateLeft),\n title: () => locale.value.rotateLeft,\n hidden: () => props.rotateDisabled,\n },\n {\n name: InternalActionName.FlipX,\n process: () => toggleFlipX(),\n iconRenderer: () => h(Icon, icons.value.flipX),\n class: getActionClass(InternalActionName.FlipX),\n title: () => locale.value.flipHorizontal,\n hidden: () => props.flipDisabled,\n },\n {\n name: InternalActionName.FlipY,\n process: () => toggleFlipY(),\n iconRenderer: () => h(Icon, icons.value.flipY),\n class: getActionClass(InternalActionName.FlipY),\n title: () => locale.value.flipVertical,\n hidden: () => props.flipDisabled,\n },\n {\n name: InternalActionName.ZoomIn,\n process: () => handleZoom(props.zoomDelta),\n iconRenderer: () => h(Icon, icons.value.zoomIn),\n class: getActionClass(InternalActionName.ZoomIn),\n title: () => locale.value.zoomIn,\n hidden: () => props.zoomDisabled,\n },\n {\n name: InternalActionName.ZoomOut,\n process: () => handleZoom(-1 * props.zoomDelta),\n iconRenderer: () => h(Icon, icons.value.zoonOut),\n class: getActionClass(InternalActionName.ZoomOut),\n title: () => locale.value.zoomOut,\n hidden: () => props.zoomDisabled,\n },\n {\n name: InternalActionName.FullScreen,\n process: () => toggleFull(!full.value),\n iconRenderer: () => h(Icon, full.value ? icons.value.resetScreen : icons.value.fullScreen),\n class: getActionClass(InternalActionName.FullScreen),\n title: () => (full.value ? locale.value.fullScreenExit : locale.value.fullScreen),\n hidden: () => props.fullDisabled,\n },\n {\n name: InternalActionName.Reset,\n process: () => handleReset(),\n iconRenderer: () => h(Icon, icons.value.refresh),\n class: getActionClass(InternalActionName.Reset),\n title: () => locale.value.reset,\n },\n]\n\nconst className = computed(() => {\n return {\n [nh.b()]: true,\n [nh.bs('vars')]: true,\n [nh.bm('inherit')]: props.inherit,\n [nh.bm('draggable')]: !props.moveDisabled,\n [nh.bm('resizable')]: !props.zoomDisabled,\n [nh.bm('full')]: full.value,\n [nh.bm('moving')]: moving.value,\n [nh.bm('static')]: props.noTransition,\n }\n})\nconst style = computed(() => {\n return {\n width: toCssSize(props.width),\n height: toCssSize(props.height),\n }\n})\nconst toolbarVertical = computed(() => {\n const [layout] = props.toolbarPlacement.split('-')\n\n return layout === 'left' || layout === 'right'\n})\nconst toolbarFade = computed(() => {\n return typeof props.toolbarFade === 'number' ? props.toolbarFade : props.toolbarFade ? 1500 : 0\n})\nconst toolbarClass = computed(() => {\n return {\n [nh.be('toolbar')]: true,\n [nh.bem('toolbar', 'active')]: toolbarFade.value < 300 || toolbarActive.value,\n [nh.bem('toolbar', props.toolbarPlacement)]: true,\n [nh.bem('toolbar', 'vertical')]: toolbarVertical.value,\n }\n})\nconst contentStyle = computed(() => {\n return {\n transform: `translate3d(${currentLeft.value}px, ${currentTop.value}px, 0) scale(${zoom.value})`,\n }\n})\nconst transitionStyle = computed(() => {\n return {\n transform: `scaleX(${flipX.value ? -1 : 1}) scaleY(${flipY.value ? -1 : 1}) rotate(${\n rotate.value\n }deg)`,\n }\n})\nconst allActions = computed(() => {\n const map = new Map<string, ViewerToolbarAction>()\n const actions: ViewerToolbarAction[][] = []\n\n internalActions.concat(props.actions).forEach(action => {\n if (action.name) {\n map.set(action.name, action)\n }\n })\n\n let layout: ViewerActionLayout\n\n if (!props.actionLayout?.length) {\n layout = [...viewerDefaultActionLayout]\n\n if (props.actions.length) {\n layout.push(props.actions.map(action => action.name))\n }\n } else {\n layout = props.actionLayout\n }\n\n for (const names of layout) {\n const group = names.map(name => map.get(name)!).filter(Boolean)\n\n group.length && actions.push(group)\n }\n\n return actions\n})\n\ndefineExpose({\n moving,\n fullSupported,\n state,\n viewer,\n container,\n transition,\n handleRotate,\n toggleFlipHorizontal: toggleFlipX,\n toggleFlipVertical: toggleFlipY,\n handleZoom,\n toggleFull,\n handleReset,\n})\n\nonMounted(() => {\n if (container.value) {\n const rect = container.value.getBoundingClientRect()\n\n zoomOrigin.x = rect.left + rect.width * 0.5\n zoomOrigin.y = rect.top + rect.height * 0.5\n }\n})\n\nfunction handleWheel(event: WheelEvent) {\n event.stopPropagation()\n event.preventDefault()\n\n const sign = event.deltaY > 0 ? -1 : 1\n\n zoomOrigin.x = event.clientX\n zoomOrigin.y = event.clientY\n\n emitEvent(props.onWheel, sign, state)\n handleZoom(sign * props.zoomDelta)\n}\n\nfunction handleRotate(deg: number, emit = true) {\n if (props.rotateDisabled) return\n\n rotate.value += deg\n\n if (props.noTransition && rotate.value % 360 === 0) {\n rotate.value = 0\n }\n\n emit && emitEvent(props.onRotate, deg, state)\n\n if (props.noTransition) {\n nextTick(normalizeProps)\n }\n}\n\nfunction toggleFlipX(target = !flipX.value, emit = true) {\n if (props.flipDisabled) return\n\n flipX.value = target\n emit && emitEvent(props.onFlipX, target, state)\n}\n\nfunction toggleFlipY(target = !flipY.value, emit = true) {\n if (props.flipDisabled) return\n\n flipY.value = target\n emit && emitEvent(props.onFlipY, target, state)\n}\n\nfunction handleZoom(ratio: number, emit = true) {\n if (props.zoomDisabled || !container.value || moving.value) return\n\n const containerRect = container.value.getBoundingClientRect()\n const { x, y } = zoomOrigin\n const { offsetWidth, offsetHeight } = container.value\n const prevZoom = zoom.value\n\n zoom.value = toFixed(boundRange(zoom.value + ratio, props.zoomMin, props.zoomMax), 5)\n\n const delta = zoom.value / prevZoom - 1\n const originX = delta * offsetWidth * 0.5\n const originY = delta * offsetHeight * 0.5\n\n if (!props.centerScale) {\n currentLeft.value -= delta * (x - containerRect.left - currentLeft.value) - originX\n currentTop.value -= delta * (y - containerRect.top - currentTop.value) - originY\n }\n\n emit && emitEvent(props.onZoom, zoom.value, state)\n}\n\nasync function toggleFull(isFull = !full.value, emit = true) {\n isFull ? await enterFull() : await exitFull()\n\n emit && emitEvent(props.onFull, isFull, state)\n}\n\nfunction handleReset(emit = true) {\n currentTop.value = 0\n currentLeft.value = 0\n rotate.value = 0\n flipX.value = false\n flipY.value = false\n zoom.value = 1\n\n emit && emitEvent(props.onReset, state)\n}\n\nfunction normalizeProps() {\n if (props.noTransition) {\n if (rotate.value % 360 === 0) {\n rotate.value = 0\n }\n\n return\n }\n\n const queue: Array<() => void> = []\n\n if (rotate.value % 360 === 0) {\n queue.push(\n () => {\n if (transition.value) {\n transition.value.style.transitionDuration = '0ms'\n }\n },\n () => {\n rotate.value = 0\n },\n () => {\n if (transition.value) {\n transition.value.style.transitionDuration = ''\n }\n },\n )\n }\n\n const run = () => {\n queue.shift()?.()\n queue.length && requestAnimationFrame(run)\n }\n\n run()\n}\n\nfunction handleEnterToolbar() {\n clearTimeout(timer.toolbarFade)\n toolbarActive.value = true\n}\n\nfunction handleLeaveToolbar() {\n clearTimeout(timer.toolbarFade)\n\n if (toolbarFade.value >= 300) {\n timer.toolbarFade = setTimeout(() => {\n toolbarActive.value = false\n }, toolbarFade.value)\n }\n}\n</script>\n\n<template>\n <div\n ref=\"viewer\"\n :class=\"className\"\n tabindex=\"0\"\n :style=\"style\"\n >\n <div ref=\"container\" :class=\"nh.be('container')\" @wheel=\"handleWheel\">\n <div :class=\"nh.be('content')\" :style=\"contentStyle\">\n <div\n ref=\"transition\"\n :class=\"nh.be('transition')\"\n :style=\"transitionStyle\"\n @transitionend=\"normalizeProps\"\n >\n <slot :state=\"state\"></slot>\n </div>\n </div>\n </div>\n <div\n :class=\"toolbarClass\"\n role=\"toolbar\"\n @mouseenter=\"handleEnterToolbar\"\n @mouseleave=\"handleLeaveToolbar\"\n >\n <template v-for=\"(group, index) in allActions\" :key=\"index\">\n <template v-for=\"action in group\" :key=\"action.name\">\n <template v-if=\"!getActionProp(action, 'hidden')\">\n <button\n type=\"button\"\n :class=\"[\n {\n [nh.be('action')]: true,\n [nh.bem('action', 'disabled')]: getActionProp(action, 'disabled')\n },\n getActionProp(action, 'class')\n ]\"\n :title=\"getActionProp(action, 'title')\"\n @click.stop=\"action.process(state)\"\n >\n <slot :name=\"`action-${action.name}`\" :state=\"state\">\n <Renderer\n v-if=\"action.iconRenderer\"\n :renderer=\"action.iconRenderer\"\n :data=\"state\"\n ></Renderer>\n <Icon\n v-else-if=\"action.icon\"\n :icon=\"action.icon\"\n :style=\"getActionProp(action, 'iconStyle')\"\n :scale=\"getActionProp(action, 'iconScale') || 1\"\n ></Icon>\n <template v-else>\n {{ action.name }}\n </template>\n </slot>\n </button>\n </template>\n </template>\n <Divider\n v-if=\"index !== allActions.length - 1\"\n inherit\n :vertical=\"!toolbarVertical\"\n ></Divider>\n </template>\n </div>\n </div>\n</template>\n"],"names":["_props","__props","props","useProps","nh","useNameHelper","locale","useLocale","toRef","icons","useIcons","timer","useSetTimeout","toolbarActive","ref","zoom","rotate","flipX","flipY","viewer","transition","fullSupported","full","enterFull","exitFull","useFullScreen","container","currentLeft","currentTop","moving","useMoving","_","event","emitEvent","getState","state","reactive","zoomOrigin","useModifier","modifier","current","step","getActionProp","action","prop","callIfFunc","getActionClass","name","internalActions","InternalActionName","handleRotate","h","Icon","toggleFlipX","toggleFlipY","handleZoom","toggleFull","handleReset","className","computed","style","toCssSize","toolbarVertical","layout","toolbarFade","toolbarClass","contentStyle","transitionStyle","allActions","map","actions","_a","viewerDefaultActionLayout","names","group","__expose","onMounted","rect","handleWheel","sign","deg","emit","nextTick","normalizeProps","target","ratio","containerRect","x","y","offsetWidth","offsetHeight","prevZoom","toFixed","boundRange","delta","originX","originY","isFull","queue","run","handleEnterToolbar","handleLeaveToolbar","_createElementBlock","_createElementVNode","_normalizeClass","_unref","_renderSlot","_ctx","_openBlock","_Fragment","_renderList","index","_withModifiers","$event","_createBlock","Renderer","_normalizeStyle","_createTextVNode","_toDisplayString","Divider"],"mappings":"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"}