UNPKG

@extclp/vexip-ui

Version:

A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good

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