@extclp/vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 23.3 kB
Source Map (JSON)
{"version":3,"file":"viewer.vue2.mjs","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","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"],"mappings":"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"}