diff --git a/layers/assets/css/components/_splide.css b/layers/assets/css/components/_splide.css index dbda97b..f1147fb 100644 --- a/layers/assets/css/components/_splide.css +++ b/layers/assets/css/components/_splide.css @@ -18,27 +18,25 @@ background-color: var(--pagination-active); } - .splide-arrows { + .splide__arrows { @apply hidden md:block; } - .splide-arrow { + .splide__arrows .splide-arrow.btn-circle { @apply absolute top-1/2 w-[40px] h-[40px] bg-cover bg-center bg-no-repeat -translate-y-1/2 cursor-pointer z-[5] - md:w-[48px] md:h-[48px] - after:content-[''] after:absolute after:top-0 after:left-0 after:w-full after:h-full after:rounded-full after:bg-white after:transition-opacity after:duration-300 after:ease-in-out after:opacity-0 - hover:after:opacity-10; + md:w-[48px] md:h-[48px]; } - .arrow-prev { + .splide__arrow--prev { @apply bg-[image:var(--arrow-prev)]; } - .arrow-next { + .splide__arrow--next { @apply bg-[image:var(--arrow-next)]; } - .type-full .arrow-prev { + .type-full .splide__arrow--prev { @apply left-10; } - .type-full .arrow-next { + .type-full .splide__arrow--next { @apply right-10; } diff --git a/layers/components/atoms/Button/Play.vue b/layers/components/atoms/Button/Play.vue index fd9ffdb..65f85ab 100644 --- a/layers/components/atoms/Button/Play.vue +++ b/layers/components/atoms/Button/Play.vue @@ -1,11 +1,22 @@ diff --git a/layers/components/blocks/CardNews.vue b/layers/components/blocks/CardNews.vue index b1f7b40..e663eea 100644 --- a/layers/components/blocks/CardNews.vue +++ b/layers/components/blocks/CardNews.vue @@ -3,6 +3,7 @@ interface Props { title: string description: string | number imgPath: string | null + analyticsSarea: string linkTarget?: '_blank' | '_self' url?: string alt?: string @@ -10,8 +11,9 @@ interface Props { } const props = defineProps() + const { locale } = useI18n() -const { sendLog, useAnalyticsLogDataDirect } = useAnalytics() +const { sendLog, useAnalyticsData } = useAnalytics() const isNoImage = computed(() => { return !props.imgPath || props.imgPath === null @@ -21,14 +23,12 @@ const isShowOverlay = computed(() => { }) const handleLinkClick = (title: string) => { - const trackingData = { - tracking: { - click_item: title, - action_type: 'click', - click_sarea: '', - }, + const analytics = { + click_item: title, + action_type: 'click', + click_sarea: props.analyticsSarea, } - sendLog(locale.value, useAnalyticsLogDataDirect(trackingData, 1)) + sendLog(locale.value, useAnalyticsData(analytics)) } diff --git a/layers/components/blocks/slide/Arrows.vue b/layers/components/blocks/slide/Arrows.vue new file mode 100644 index 0000000..704575a --- /dev/null +++ b/layers/components/blocks/slide/Arrows.vue @@ -0,0 +1,37 @@ + + + diff --git a/layers/components/layouts/Header.vue b/layers/components/layouts/Header.vue index 9bb5291..f7e1a3d 100644 --- a/layers/components/layouts/Header.vue +++ b/layers/components/layouts/Header.vue @@ -9,15 +9,16 @@ import type { } from '#layers/types/api/gameData' const MORE_WIDTH = 72 -const START_WIDTH_MARGIN = 40 +const START_MARGIN = 40 const route = useRoute() -const { tm } = useI18n() +const { locale, tm } = useI18n() const { width } = useWindowSize() const gameDataStore = useGameDataStore() const pageDataStore = usePageDataStore() const scrollStore = useScrollStore() const breakpoints = useResponsiveBreakpoints() +const { sendLog, useAnalyticsData } = useAnalytics() const { gameData } = storeToRefs(gameDataStore) const { pageLayoutType } = storeToRefs(pageDataStore) @@ -95,7 +96,7 @@ const calculateOverflow = () => { } const screenWidth = width.value - const totalNavWidth = navWidth.value + startWidth.value + START_WIDTH_MARGIN + const totalNavWidth = navWidth.value + startWidth.value + START_MARGIN // 해상도가 navWidth + startWidth보다 작은 경우 if (screenWidth < totalNavWidth) { @@ -120,18 +121,6 @@ const calculateOverflow = () => { // 100ms마다 최대 1회 실행 const throttledCalculateOverflow = useThrottleFn(calculateOverflow, 100) -const handleMenuOpen = () => { - isMenuOpen.value = true - scrollStore.controlScrollLock(true) -} - -const handleMenuClose = (isPassing: boolean = false) => { - if (isPassing) return - - isMenuOpen.value = false - scrollStore.controlScrollLock(false) -} - const isNotClickable = (gnbItem: GameDataMenu) => { return gnbItem.click_action_type === 0 } @@ -140,6 +129,32 @@ const has2depthButton = (gnbItem: GameDataMenu) => { return gnbItem.children && Object.keys(gnbItem.children).length > 0 } +const handleMenuOpen = () => { + isMenuOpen.value = true + scrollStore.controlScrollLock(true) +} + +const handleMenuClose = () => { + isMenuOpen.value = false + scrollStore.controlScrollLock(false) +} + +const handleSendLog = (item: string) => { + const analytics = { + action_type: 'click', + click_item: item, + click_sarea: 'GNB', + } + sendLog(locale.value, useAnalyticsData(analytics)) +} + +const handleGnbItemClick = (gnbItem: GameDataMenu) => { + if (isNotClickable(gnbItem)) return + + handleMenuClose() + sendLog(locale.value, useAnalyticsData(gnbItem.tracking_json)) +} + onMounted(() => { overflowCount.value = 0 isMounted.value = true @@ -170,7 +185,11 @@ onMounted(() => { v-if="gnbData" :class="['game-wrap', { 'is-fixed': isPassedStoveGnb }]" > - + {
diff --git a/layers/components/widgets/ButtonList.vue b/layers/components/widgets/ButtonList.vue index 92c7eb5..31d65bc 100644 --- a/layers/components/widgets/ButtonList.vue +++ b/layers/components/widgets/ButtonList.vue @@ -7,7 +7,6 @@ import type { ButtonType } from '#layers/types/components/button' interface Props { resourcesData: PageDataResourceGroup[] - pageVerTmplSeq: number } const props = defineProps() @@ -16,7 +15,7 @@ const { locale } = useI18n() const modalStore = useModalStore() const scrollStore = useScrollStore() const breakpoints = useResponsiveBreakpoints() -const { sendLog, useAnalyticsLogDataDirect } = useAnalytics() +const { sendLog, useAnalyticsData } = useAnalytics() const { tm } = useI18n() const device = useDevice() @@ -92,8 +91,7 @@ const downloadFile = async (url: string = '', osType: number = 0) => { } const handleButtonClick = (button: PageDataResourceGroup) => { - // 로그 - sendLog(locale.value, useAnalyticsLogDataDirect(button, props.pageVerTmplSeq)) + sendLog(locale.value, useAnalyticsData(button.tracking)) const btnDetail = button.btn_info?.detail diff --git a/layers/components/widgets/VideoPlay.vue b/layers/components/widgets/VideoPlay.vue index 6baddc8..c43fbad 100644 --- a/layers/components/widgets/VideoPlay.vue +++ b/layers/components/widgets/VideoPlay.vue @@ -3,27 +3,22 @@ import type { PageDataResourceGroup } from '#layers/types/api/pageData' const props = defineProps<{ resourcesData: PageDataResourceGroup - pageVerTmplSeq: number }>() const modalStore = useModalStore() -const { locale } = useI18n() -const { sendLog, useAnalyticsLogDataDirect } = useAnalytics() // 비디오 플레이 버튼 클릭 핸들러 const handleVideoPlayClick = () => { const youtubeUrl = props.resourcesData?.display?.text ?? '' if (youtubeUrl) { modalStore.handleOpenYoutube({ youtubeUrl }) - - sendLog( - locale.value, - useAnalyticsLogDataDirect(props.resourcesData, props.pageVerTmplSeq) - ) } } diff --git a/layers/components/blocks/slide/CenterFocus.vue b/layers/components/widgets/slide/CenterFocus.vue similarity index 87% rename from layers/components/blocks/slide/CenterFocus.vue rename to layers/components/widgets/slide/CenterFocus.vue index e1382d7..9ffa7a8 100644 --- a/layers/components/blocks/slide/CenterFocus.vue +++ b/layers/components/widgets/slide/CenterFocus.vue @@ -1,8 +1,8 @@