From a2da1fc93c25b5abab3deafcc5eeb7fd4b88aca6 Mon Sep 17 00:00:00 2001 From: clkim Date: Thu, 22 Jan 2026 14:22:38 +0900 Subject: [PATCH] =?UTF-8?q?feat.[SWV-806]=20=ED=85=9C=ED=94=8C=EB=A6=BF=20?= =?UTF-8?q?=EB=AA=A8=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/components/atoms/Button/Circle.vue | 9 +- layers/components/atoms/Button/Play.vue | 10 +- layers/components/atoms/Button/index.vue | 27 ++- layers/components/blocks/Button/Home.vue | 3 + layers/components/blocks/Button/ScrollTop.vue | 3 + .../components/blocks/Button/SlideArrows.vue | 10 + layers/components/layouts/EventNavigation.vue | 4 + layers/components/widgets/ButtonList.vue | 3 +- layers/components/widgets/Description.vue | 2 +- layers/components/widgets/MainTitle.vue | 2 +- layers/components/widgets/SubTitle.vue | 2 +- layers/components/widgets/VideoPlay.vue | 1 + layers/plugins/motion-stagger.client.ts | 199 ++++++++++++++++++ layers/templates/FxPreregist01/index.vue | 8 +- layers/templates/GrBoard01/index.vue | 1 + layers/templates/GrContents01/index.vue | 8 +- layers/templates/GrDetail03/index.vue | 1 + layers/templates/GrGallery01/index.vue | 1 + layers/templates/GrGallery02/index.vue | 1 + layers/templates/GrGallery03/index.vue | 1 + layers/templates/GrVisual02/index.vue | 1 + nuxt.config.ts | 1 + package.json | 1 + pnpm-lock.yaml | 58 +++++ tailwind.config.ts | 4 +- 25 files changed, 341 insertions(+), 20 deletions(-) create mode 100644 layers/plugins/motion-stagger.client.ts diff --git a/layers/components/atoms/Button/Circle.vue b/layers/components/atoms/Button/Circle.vue index 0c76db0..6b143a6 100644 --- a/layers/components/atoms/Button/Circle.vue +++ b/layers/components/atoms/Button/Circle.vue @@ -21,7 +21,6 @@ const componentTag = computed((): string => { return 'button' } }) - const componentProps = computed(() => { switch (props.type) { case 'link': @@ -34,7 +33,9 @@ const componentProps = computed(() => { @@ -51,4 +52,8 @@ const componentProps = computed(() => { .btn-circle:deep(svg) { @apply w-[20px] h-[20px] md:w-[24px] md:h-[24px]; } + +.icon { + @apply transition-transform duration-300 ease-spring; +} diff --git a/layers/components/atoms/Button/Play.vue b/layers/components/atoms/Button/Play.vue index eedc27d..946a705 100644 --- a/layers/components/atoms/Button/Play.vue +++ b/layers/components/atoms/Button/Play.vue @@ -22,7 +22,9 @@ const handlePlayClick = () => { :style="{ backgroundColor: props.bgColor }" @click="handlePlayClick" > - + + + Play @@ -34,4 +36,10 @@ const handlePlayClick = () => { after:content-[''] after:absolute after:top-0 after:left-0 after:w-full after:h-full after:bg-white after:rounded-[50%] after:opacity-0 after:transition-opacity after:duration-300 after:ease-in-out hover:after:opacity-10; } +.btn-play:hover .icon { + @apply scale-[1.08]; +} +.icon { + @apply transition-transform duration-300 ease-spring; +} diff --git a/layers/components/atoms/Button/index.vue b/layers/components/atoms/Button/index.vue index 07b8b7c..146ead8 100644 --- a/layers/components/atoms/Button/index.vue +++ b/layers/components/atoms/Button/index.vue @@ -29,7 +29,7 @@ const componentTag = computed((): string => { case 'download': return props.href ? 'a' : 'button' case 'internal': - return 'AtomsLocaleLink' + return props.href ? 'AtomsLocaleLink' : 'button' default: return 'button' } @@ -49,9 +49,12 @@ const componentProps = computed(() => { } if (props.type === 'internal') { - return { - to: props.href, + if (props.href) { + return { + to: props.href, + } } + return {} } if (props.type === 'download') { @@ -87,17 +90,17 @@ const componentProps = computed(() => { @@ -121,6 +124,18 @@ const componentProps = computed(() => { @apply before:border-[rgba(0,0,0,0.1)] hover:before:border-[#999]; } +.icon { + @apply transition-transform duration-300 ease-spring; +} +.btn-base:hover .icon-internal { + @apply translate-x-[3px]; +} +.btn-base:hover .icon-external { + @apply scale-[1.08]; +} +.btn-base:hover .icon-download { + @apply translate-y-[3px]; +} .btn-base.disabled .btn-content { @apply opacity-50; diff --git a/layers/components/blocks/Button/Home.vue b/layers/components/blocks/Button/Home.vue index bad5983..cfd9293 100644 --- a/layers/components/blocks/Button/Home.vue +++ b/layers/components/blocks/Button/Home.vue @@ -31,4 +31,7 @@ const analytics = { @apply fixed top-3 right-3 mt-[calc(var(--scroll-position,48px)+48px)] bg-black/20 shadow-[0_1.667px_3.333px_0_rgba(0,0,0,0.06)] backdrop-blur-[12.5px] z-[100] sm:top-5 md:top-6 md:right-8 md:mt-[calc(var(--scroll-position,64px)+64px)]; } +.btn-home:hover :deep(.icon) { + @apply scale-[1.08]; +} diff --git a/layers/components/blocks/Button/ScrollTop.vue b/layers/components/blocks/Button/ScrollTop.vue index 94fef90..7e73f0d 100644 --- a/layers/components/blocks/Button/ScrollTop.vue +++ b/layers/components/blocks/Button/ScrollTop.vue @@ -36,4 +36,7 @@ const handleScrollToTop = () => { .btn-top { @apply bg-[image:var(--button-top)] bg-center bg-cover bg-no-repeat; } +.btn-top:hover :deep(.icon) { + @apply -translate-y-[3px]; +} diff --git a/layers/components/blocks/Button/SlideArrows.vue b/layers/components/blocks/Button/SlideArrows.vue index b96e7a9..9acdba9 100644 --- a/layers/components/blocks/Button/SlideArrows.vue +++ b/layers/components/blocks/Button/SlideArrows.vue @@ -45,3 +45,13 @@ const handleArrowClick = (direction: 'prev' | 'next') => { + + diff --git a/layers/components/layouts/EventNavigation.vue b/layers/components/layouts/EventNavigation.vue index d6120a8..f023273 100644 --- a/layers/components/layouts/EventNavigation.vue +++ b/layers/components/layouts/EventNavigation.vue @@ -9,6 +9,7 @@ const { locale } = useI18n() const { sendLog } = useAnalytics() const gameDomain = getGameDomain() + const analytics = { action_type: 'click', click_sarea: 'EventNavigation', @@ -132,6 +133,9 @@ onMounted(async () => { @apply absolute top-3 right-[-40px] bg-black/20 shadow-[0_1.667px_3.333px_0_rgba(0,0,0,0.06)] backdrop-blur-[12.5px] rotate-180 sm:top-5 md:top-6 md:right-[-48px]; } +.btn-control:hover :deep(.icon) { + @apply translate-x-[3px]; +} .event-navigation.is-closed { @apply translate-x-[calc(-100%+20px)] sm:translate-x-[calc(-100%+40px)]; diff --git a/layers/components/widgets/ButtonList.vue b/layers/components/widgets/ButtonList.vue index faf9e51..ab5b7ee 100644 --- a/layers/components/widgets/ButtonList.vue +++ b/layers/components/widgets/ButtonList.vue @@ -122,7 +122,8 @@ const handleButtonClick = (button: PageDataResourceGroup) => {