enhance(client): better marquee component
This commit is contained in:
		
							parent
							
								
									949dbb3918
								
							
						
					
					
						commit
						ef83670716
					
				
					 5 changed files with 100 additions and 17 deletions
				
			
		|  | @ -76,7 +76,6 @@ | ||||||
| 		"vanilla-tilt": "1.7.2", | 		"vanilla-tilt": "1.7.2", | ||||||
| 		"vite": "3.0.0-beta.5", | 		"vite": "3.0.0-beta.5", | ||||||
| 		"vue": "3.2.37", | 		"vue": "3.2.37", | ||||||
| 		"vue-marquee-text-component": "2.0.1", |  | ||||||
| 		"vue-prism-editor": "2.0.0-alpha.2", | 		"vue-prism-editor": "2.0.0-alpha.2", | ||||||
| 		"vuedraggable": "4.0.1", | 		"vuedraggable": "4.0.1", | ||||||
| 		"websocket": "1.0.34", | 		"websocket": "1.0.34", | ||||||
|  |  | ||||||
							
								
								
									
										97
									
								
								packages/client/src/components/marquee.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								packages/client/src/components/marquee.vue
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,97 @@ | ||||||
|  | <script lang="ts"> | ||||||
|  | import { h, onMounted, onUnmounted, ref } from 'vue'; | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  | 	name: 'MarqueeText', | ||||||
|  | 	props: { | ||||||
|  | 		duration: { | ||||||
|  | 			type: Number, | ||||||
|  | 			default: 15, | ||||||
|  | 		}, | ||||||
|  | 		repeat: { | ||||||
|  | 			type: Number, | ||||||
|  | 			default: 2, | ||||||
|  | 		}, | ||||||
|  | 		paused: { | ||||||
|  | 			type: Boolean, | ||||||
|  | 			default: false, | ||||||
|  | 		}, | ||||||
|  | 		reverse: { | ||||||
|  | 			type: Boolean, | ||||||
|  | 			default: false, | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	setup(props) { | ||||||
|  | 		const contentEl = ref(); | ||||||
|  | 
 | ||||||
|  | 		function calc() { | ||||||
|  | 			const eachLength = contentEl.value.offsetWidth / props.repeat; | ||||||
|  | 			const factor = 3000; | ||||||
|  | 			const duration = props.duration / ((1 / eachLength) * factor); | ||||||
|  | 
 | ||||||
|  | 			contentEl.value.style.animationDuration = `${duration}s`; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		onMounted(() => { | ||||||
|  | 			calc(); | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		onUnmounted(() => { | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		return { | ||||||
|  | 			contentEl, | ||||||
|  | 		}; | ||||||
|  | 	}, | ||||||
|  | 	render({ | ||||||
|  | 		$slots, $style, $props: { | ||||||
|  | 			duration, repeat, paused, reverse, | ||||||
|  | 		}, | ||||||
|  | 	}) { | ||||||
|  | 		return h('div', { class: [$style.wrap] }, [ | ||||||
|  | 			h('span', { | ||||||
|  | 				ref: 'contentEl', | ||||||
|  | 				class: [ | ||||||
|  | 					paused | ||||||
|  | 						? $style.paused | ||||||
|  | 						: undefined, | ||||||
|  | 					$style.content, | ||||||
|  | 				], | ||||||
|  | 			}, Array(repeat).fill( | ||||||
|  | 				h('span', { | ||||||
|  | 					class: $style.text, | ||||||
|  | 					style: { | ||||||
|  | 						animationDirection: reverse | ||||||
|  | 							? 'reverse' | ||||||
|  | 							: undefined, | ||||||
|  | 					}, | ||||||
|  | 				}, $slots.default()), | ||||||
|  | 			)), | ||||||
|  | 		]); | ||||||
|  | 	}, | ||||||
|  | }; | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style lang="scss" module> | ||||||
|  | .wrap { | ||||||
|  | 	overflow: clip; | ||||||
|  | } | ||||||
|  | .content { | ||||||
|  | 	display: inline-block; | ||||||
|  | 	white-space: nowrap; | ||||||
|  | } | ||||||
|  | .text { | ||||||
|  | 	display: inline-block; | ||||||
|  | 	animation-name: marquee; | ||||||
|  | 	animation-timing-function: linear; | ||||||
|  | 	animation-iteration-count: infinite; | ||||||
|  | 	animation-duration: inherit; | ||||||
|  | } | ||||||
|  | .paused .text { | ||||||
|  | 	animation-play-state: paused; | ||||||
|  | } | ||||||
|  | @keyframes marquee { | ||||||
|  | 	0% { transform:translateX(0); } | ||||||
|  | 	100% { transform:translateX(-100%); } | ||||||
|  | } | ||||||
|  | </style> | ||||||
|  | @ -47,8 +47,8 @@ | ||||||
| <script lang="ts" setup> | <script lang="ts" setup> | ||||||
| import { } from 'vue'; | import { } from 'vue'; | ||||||
| import { toUnicode } from 'punycode/'; | import { toUnicode } from 'punycode/'; | ||||||
| import MarqueeText from 'vue-marquee-text-component'; |  | ||||||
| import XTimeline from './welcome.timeline.vue'; | import XTimeline from './welcome.timeline.vue'; | ||||||
|  | import MarqueeText from '@/components/marquee.vue'; | ||||||
| import XSigninDialog from '@/components/signin-dialog.vue'; | import XSigninDialog from '@/components/signin-dialog.vue'; | ||||||
| import XSignupDialog from '@/components/signup-dialog.vue'; | import XSignupDialog from '@/components/signup-dialog.vue'; | ||||||
| import MkButton from '@/components/ui/button.vue'; | import MkButton from '@/components/ui/button.vue'; | ||||||
|  |  | ||||||
|  | @ -18,8 +18,8 @@ | ||||||
| 
 | 
 | ||||||
| <script lang="ts" setup> | <script lang="ts" setup> | ||||||
| import { onMounted, onUnmounted, ref, watch } from 'vue'; | import { onMounted, onUnmounted, ref, watch } from 'vue'; | ||||||
| import MarqueeText from 'vue-marquee-text-component'; |  | ||||||
| import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget'; | import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget'; | ||||||
|  | import MarqueeText from '@/components/marquee.vue'; | ||||||
| import { GetFormResultType } from '@/scripts/form'; | import { GetFormResultType } from '@/scripts/form'; | ||||||
| import * as os from '@/os'; | import * as os from '@/os'; | ||||||
| import MkContainer from '@/components/ui/container.vue'; | import MkContainer from '@/components/ui/container.vue'; | ||||||
|  |  | ||||||
|  | @ -1221,11 +1221,6 @@ content-disposition@0.5.4: | ||||||
|   dependencies: |   dependencies: | ||||||
|     safe-buffer "5.2.1" |     safe-buffer "5.2.1" | ||||||
| 
 | 
 | ||||||
| core-js@^3.18.0: |  | ||||||
|   version "3.23.3" |  | ||||||
|   resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.23.3.tgz#3b977612b15da6da0c9cc4aec487e8d24f371112" |  | ||||||
|   integrity sha512-oAKwkj9xcWNBAvGbT//WiCdOMpb9XQG92/Fe3ABFM/R16BsHgePG00mFOgKf7IsCtfj8tA1kHtf/VwErhriz5Q== |  | ||||||
| 
 |  | ||||||
| core-util-is@1.0.2: | core-util-is@1.0.2: | ||||||
|   version "1.0.2" |   version "1.0.2" | ||||||
|   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" |   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" | ||||||
|  | @ -4250,20 +4245,12 @@ vue-eslint-parser@^9.0.1: | ||||||
|     lodash "^4.17.21" |     lodash "^4.17.21" | ||||||
|     semver "^7.3.6" |     semver "^7.3.6" | ||||||
| 
 | 
 | ||||||
| vue-marquee-text-component@2.0.1: |  | ||||||
|   version "2.0.1" |  | ||||||
|   resolved "https://registry.yarnpkg.com/vue-marquee-text-component/-/vue-marquee-text-component-2.0.1.tgz#62691df195f755471fa9bdc9b1969f836a922b9a" |  | ||||||
|   integrity sha512-dbeRwDY5neOJcWZrDFU2tJMhPSsxN25ZpNYeZdt0jkseg1MbyGKzrfEH9nrCFZRkEfqhxG+ukyzwVwR9US5sTQ== |  | ||||||
|   dependencies: |  | ||||||
|     core-js "^3.18.0" |  | ||||||
|     vue "^3.2.19" |  | ||||||
| 
 |  | ||||||
| vue-prism-editor@2.0.0-alpha.2: | vue-prism-editor@2.0.0-alpha.2: | ||||||
|   version "2.0.0-alpha.2" |   version "2.0.0-alpha.2" | ||||||
|   resolved "https://registry.yarnpkg.com/vue-prism-editor/-/vue-prism-editor-2.0.0-alpha.2.tgz#aa53a88efaaed628027cbb282c2b1d37fc7c5c69" |   resolved "https://registry.yarnpkg.com/vue-prism-editor/-/vue-prism-editor-2.0.0-alpha.2.tgz#aa53a88efaaed628027cbb282c2b1d37fc7c5c69" | ||||||
|   integrity sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w== |   integrity sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w== | ||||||
| 
 | 
 | ||||||
| vue@3.2.37, vue@^3.2.19: | vue@3.2.37: | ||||||
|   version "3.2.37" |   version "3.2.37" | ||||||
|   resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.37.tgz#da220ccb618d78579d25b06c7c21498ca4e5452e" |   resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.37.tgz#da220ccb618d78579d25b06c7c21498ca4e5452e" | ||||||
|   integrity sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ== |   integrity sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ== | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue