From 0918ddb5c4c3fa5171762238c06f0d8013e761db Mon Sep 17 00:00:00 2001 From: clkim Date: Thu, 20 Nov 2025 09:45:47 +0900 Subject: [PATCH 01/40] =?UTF-8?q?fix.=20/=EB=A1=9C=20=EB=A6=AC=EB=8B=A4?= =?UTF-8?q?=EC=9D=B4=EB=A0=89=ED=8A=B8=EC=8B=9C=20home=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=B4=EB=83=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/middleware/pageData.global.ts | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/layers/middleware/pageData.global.ts b/layers/middleware/pageData.global.ts index b0388c8..7add34b 100644 --- a/layers/middleware/pageData.global.ts +++ b/layers/middleware/pageData.global.ts @@ -30,21 +30,19 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { const pageUrl = getPathAfterLanguage(to.path) - // pageUrl이 빈값이거나 null이면 /brand로 리다이렉트 - // if ( - // !pageUrl || - // pageUrl === '' || - // pageUrl === '/' || - // pageUrl === `/${langCode}/` - // ) { - // return navigateTo(`/${langCode}/brand`, { external: false }) - // } + // pageUrl이 빈값이거나 null이면 /home로 리다이렉트 + if ( + !pageUrl || + pageUrl === '' || + pageUrl === '/' || + pageUrl === `/${langCode}/` + ) { + return navigateTo(`/${langCode}/home`, { external: false }) + } // error 페이지는 API 호출하지 않음 - if (pageUrl === '/error' || to.path.includes('/error')) { - console.log("🚀 ~pageData.global error 페이지는 API 호출하지 않음") - return - } + if (pageUrl === '/error' || to.path.includes('/error')) return + // 페이지 이동 시 로딩 상태 시작 loadingStore.startFullLoading() From b294b759ee742ee3c8a42a9f4548b4a3b343b688 Mon Sep 17 00:00:00 2001 From: clkim Date: Thu, 20 Nov 2025 09:57:38 +0900 Subject: [PATCH 02/40] =?UTF-8?q?fix.=20svg=20=EC=95=84=EC=9D=B4=EC=BD=98?= =?UTF-8?q?=20=EB=B2=84=ED=8A=BC=20=ED=85=8D=EC=8A=A4=ED=8A=B8=EC=99=80=20?= =?UTF-8?q?=EB=8F=99=EC=9D=BC=ED=95=9C=20=EC=BB=AC=EB=9F=AC=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/components/atoms/Button/index.vue | 9 +++++++-- layers/components/atoms/icons/LongArrowRightLine.vue | 3 +-- layers/components/atoms/icons/WebLinkLine.vue | 4 +--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/layers/components/atoms/Button/index.vue b/layers/components/atoms/Button/index.vue index da16f05..487c572 100644 --- a/layers/components/atoms/Button/index.vue +++ b/layers/components/atoms/Button/index.vue @@ -75,14 +75,19 @@ const componentProps = computed(() => { + - diff --git a/layers/components/atoms/icons/LongArrowRightLine.vue b/layers/components/atoms/icons/LongArrowRightLine.vue index 7622080..197ee49 100644 --- a/layers/components/atoms/icons/LongArrowRightLine.vue +++ b/layers/components/atoms/icons/LongArrowRightLine.vue @@ -16,11 +16,10 @@ withDefaults(defineProps(), { :width="size" :height="size" viewBox="0 0 24 24" - fill="none" + :fill="color" > diff --git a/layers/components/atoms/icons/WebLinkLine.vue b/layers/components/atoms/icons/WebLinkLine.vue index 05c3912..38d6b14 100644 --- a/layers/components/atoms/icons/WebLinkLine.vue +++ b/layers/components/atoms/icons/WebLinkLine.vue @@ -16,15 +16,13 @@ withDefaults(defineProps(), { :width="size" :height="size" viewBox="0 0 16 16" - fill="none" + :fill="color" > From c08fa0f04afe0e5f8d34f3311c3c8ec13f1898a0 Mon Sep 17 00:00:00 2001 From: clkim Date: Thu, 20 Nov 2025 09:58:04 +0900 Subject: [PATCH 03/40] =?UTF-8?q?fix.=20=EB=8B=A4=EC=9A=B4=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=EB=B2=84=ED=8A=BC=20=EB=B8=94=EB=9F=AC=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/components/blocks/Button/Launcher.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/components/blocks/Button/Launcher.vue b/layers/components/blocks/Button/Launcher.vue index bcec4f8..9514f8a 100644 --- a/layers/components/blocks/Button/Launcher.vue +++ b/layers/components/blocks/Button/Launcher.vue @@ -167,7 +167,7 @@ const handleClick = () => { /* duplication */ .btn-base.duplication { - @apply bg-[16px_50%] bg-[length:auto_28px] bg-no-repeat + @apply bg-[16px_50%] bg-[length:auto_28px] bg-no-repeat backdrop-blur-[15px] pt-[22px] pl-[47px] pr-[22px] pb-[7px] text-[11px] md:h-[64px] md:pt-[30px] md:pl-[64px] md:pr-[28px] md:pb-[11px] md:text-[12px] md:bg-[20px_50%] md:bg-[length:auto_40px]; } From f81dd8c9008548b81f6a47cd8c7722d852f5716c Mon Sep 17 00:00:00 2001 From: clkim Date: Thu, 20 Nov 2025 10:20:59 +0900 Subject: [PATCH 04/40] =?UTF-8?q?fix.=20=EC=8D=B8=EB=84=A4=EC=9D=BC=20?= =?UTF-8?q?=ED=80=84=EB=A6=AC=ED=8B=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/utils/styleUtil.ts | 2 +- layers/utils/youtubeUtil.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/layers/utils/styleUtil.ts b/layers/utils/styleUtil.ts index 5958b9e..e770844 100644 --- a/layers/utils/styleUtil.ts +++ b/layers/utils/styleUtil.ts @@ -156,7 +156,7 @@ export const getPaginationClass = ( */ export const getMediaImgSrc = ( resourceGroups: PageDataResourceGroup, - quality: 'default' | 'medium' | 'high' | 'standard' | 'maxres' = 'high' + quality ): string => { if (!resourceGroups) return '' diff --git a/layers/utils/youtubeUtil.ts b/layers/utils/youtubeUtil.ts index 8e7883b..9c0ef64 100644 --- a/layers/utils/youtubeUtil.ts +++ b/layers/utils/youtubeUtil.ts @@ -61,7 +61,7 @@ export const getYouTubeEmbedUrl = ( */ export const getYouTubeThumbnail = ( url: string, - quality: 'default' | 'medium' | 'high' | 'standard' | 'maxres' = 'high' + quality: 'default' | 'medium' | 'high' | 'standard' | 'maxres' = 'standard' ): string => { const videoId = getYouTubeId(url) if (!videoId) return '' From 924c63ec4c3e89e6b4ab8de16a243de58e7aea16 Mon Sep 17 00:00:00 2001 From: clkim Date: Thu, 20 Nov 2025 10:27:06 +0900 Subject: [PATCH 05/40] =?UTF-8?q?fix.=20=EB=B9=84=EB=94=94=EC=98=A4=20?= =?UTF-8?q?=EC=9C=A0=ED=8A=9C=EB=B8=8C=20=ED=8C=9D=EC=97=85=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/templates/FxVideo01/index.vue | 12 +++++++++--- layers/utils/styleUtil.ts | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/layers/templates/FxVideo01/index.vue b/layers/templates/FxVideo01/index.vue index 4da1f5c..aaf4e8b 100644 --- a/layers/templates/FxVideo01/index.vue +++ b/layers/templates/FxVideo01/index.vue @@ -19,6 +19,7 @@ interface Props { const props = defineProps() const pageDataStore = usePageDataStore() +const modalStore = useModalStore() const breakpoints = useResponsiveBreakpoints() const { getOperateResources } = useOperateResources() @@ -111,6 +112,10 @@ const handleSplideMove = (_splide: SplideType, newIndex: number) => { currentRecommendedIndex.value = newIndex + 1 } +const handleVideoClick = (url: string) => { + modalStore.handleOpenYoutube({ youtubeUrl: url }) +} + const handleLoadMoreRecent = () => { if (hasMore.value) { currentRecentPage.value++ @@ -144,7 +149,7 @@ const handleLoadMoreRecent = () => { v-for="(item, index) in recommendedVideos" :key="`recommended-${item.url}-${index}`" > - +
@@ -189,7 +194,8 @@ const handleLoadMoreRecent = () => {
  • { lg:left-[850px]; } .splide__slide { - @apply flex flex-col p-3 gap-4 sm:flex-row sm:gap-6 md:gap-10 md:p-4 lg:gap-[60px] lg:p-5; + @apply flex flex-col p-3 gap-4 sm:flex-row sm:gap-6 md:gap-10 md:p-4 lg:gap-[60px] lg:p-5 cursor-pointer; } .splide-pagination { @apply absolute bottom-[28px] left-[80px] right-[80px] text-center font-[500] text-[16px] leading-[24px] tracking-[-0.48px] text-[#999] diff --git a/layers/utils/styleUtil.ts b/layers/utils/styleUtil.ts index e770844..5cc9f39 100644 --- a/layers/utils/styleUtil.ts +++ b/layers/utils/styleUtil.ts @@ -156,7 +156,7 @@ export const getPaginationClass = ( */ export const getMediaImgSrc = ( resourceGroups: PageDataResourceGroup, - quality + quality? ): string => { if (!resourceGroups) return '' From 73801119374d73524830f12cdaa77996696c47de Mon Sep 17 00:00:00 2001 From: clkim Date: Thu, 20 Nov 2025 10:29:18 +0900 Subject: [PATCH 06/40] =?UTF-8?q?fix.=20=EB=B9=84=EB=94=94=EC=98=A4=20?= =?UTF-8?q?=ED=80=84=EB=A6=AC=ED=8B=B0=20=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/templates/FxVideo01/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/templates/FxVideo01/index.vue b/layers/templates/FxVideo01/index.vue index aaf4e8b..85fa956 100644 --- a/layers/templates/FxVideo01/index.vue +++ b/layers/templates/FxVideo01/index.vue @@ -154,7 +154,7 @@ const handleLoadMoreRecent = () => { class="overflow-hidden aspect-[16/9] flex-shrink-0 w-full rounded-[4px] sm:w-[60.3%] sm:rounded-[8px] md:w-[56%] lg:w-[710px] lg:rounded-[12px]" > Date: Thu, 20 Nov 2025 10:47:10 +0900 Subject: [PATCH 07/40] =?UTF-8?q?fix.=20=EC=9C=A0=ED=8A=9C=EB=B8=8C=20?= =?UTF-8?q?=EC=98=81=EC=83=81=20=EC=8D=B8=EB=84=A4=EC=9D=BC=20=ED=80=84?= =?UTF-8?q?=EB=A6=AC=ED=8B=B0=20=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/components/blocks/slide/Thumbnail.vue | 13 ++++++++----- layers/templates/GrGallery01/index.vue | 4 ++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/layers/components/blocks/slide/Thumbnail.vue b/layers/components/blocks/slide/Thumbnail.vue index 3d71845..a8a5e74 100644 --- a/layers/components/blocks/slide/Thumbnail.vue +++ b/layers/components/blocks/slide/Thumbnail.vue @@ -81,7 +81,7 @@ const thumbOptions = computed(() => ({ const getThumbnailSrc = (item: PageDataTemplateComponentSet) => { if (props.variant === 'media') { const mediaComponent = getComponentGroup(item, 'media') - return mediaComponent ? getMediaImgSrc(mediaComponent) : '' + return mediaComponent ? getMediaImgSrc(mediaComponent, 'high') : '' } const thumbnailComponent = getComponentGroup(item, 'pagenaviThumbnail') @@ -111,9 +111,12 @@ onMounted(() => { mainInst.sync(thumbsInst) // 썸네일 슬라이드의 화살표 버튼에 이벤트 리스너 추가 nextTick(() => { - removeArrowListeners = addArrowClickListeners(thumbsInst, (direction, targetIndex) => { - emit('arrowClick', direction, targetIndex) - }) + removeArrowListeners = addArrowClickListeners( + thumbsInst, + (direction, targetIndex) => { + emit('arrowClick', direction, targetIndex) + } + ) }) } }) @@ -124,7 +127,7 @@ onBeforeUnmount(() => { removeArrowListeners() removeArrowListeners = null } - + // Splide 인스턴스 정리 mainInst?.destroy?.() thumbsInst?.destroy?.() diff --git a/layers/templates/GrGallery01/index.vue b/layers/templates/GrGallery01/index.vue index 0fea0aa..d1fdf3e 100644 --- a/layers/templates/GrGallery01/index.vue +++ b/layers/templates/GrGallery01/index.vue @@ -45,7 +45,7 @@ const getMediaComponent = (item: PageDataTemplateComponentSet) => { const getMediaImgSrcFromItem = (item: PageDataTemplateComponentSet) => { const mediaComponent = getMediaComponent(item) - return mediaComponent ? getMediaImgSrc(mediaComponent) : '' + return mediaComponent ? getMediaImgSrc(mediaComponent, 'maxres') : '' } const getYouTubeEmbedUrlFromMedia = (item: PageDataTemplateComponentSet) => { @@ -95,7 +95,7 @@ const stopVideo = () => { clearTimeout(stopVideoTimeoutId) stopVideoTimeoutId = null } - + // 전환 시간 후 완전히 제거 stopVideoTimeoutId = setTimeout(() => { playingSlideIndex.value = null From 9baf024268765dd212cf67b1e8c95699a204d0a2 Mon Sep 17 00:00:00 2001 From: clkim Date: Thu, 20 Nov 2025 11:21:50 +0900 Subject: [PATCH 08/40] =?UTF-8?q?fix.=20=EA=B8=B0=EB=B3=B8=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/css/components/_base-content.css | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/layers/assets/css/components/_base-content.css b/layers/assets/css/components/_base-content.css index bbf41f9..d76c9f4 100644 --- a/layers/assets/css/components/_base-content.css +++ b/layers/assets/css/components/_base-content.css @@ -18,19 +18,20 @@ .use-base table { @apply w-full border-collapse; } - .use-base thead { - @apply bg-gray-100; + .use-base thead, + .use-base tfoot { + @apply bg-[#FAFAFA]; } .use-base th, .use-base td { - @apply border border-gray-300 px-4 py-2 text-left; + @apply border border-[#D9D9D9] px-4 py-2 text-left; } .use-base th { - @apply font-semibold bg-gray-50; + @apply font-semibold border-[#D9D9D9]; } .use-base blockquote { - @apply border-l-4 border-gray-300 pl-4 italic text-gray-700; + @apply border-l-4 border-[#D9D9D9] pl-4 italic; } .use-base h1 { @@ -68,10 +69,7 @@ } .use-base a { - @apply text-blue-600 underline; - } - .use-base a:hover { - @apply text-blue-800; + @apply text-[#3C75FF] underline; } .use-base img { @@ -79,10 +77,10 @@ } .use-base pre { - @apply bg-gray-100 p-4 rounded overflow-x-auto mb-4; + @apply bg-[#FAFAFA] p-4 rounded overflow-x-auto mb-4; } .use-base code { - @apply bg-gray-100 px-1 py-0.5 rounded text-sm; + @apply bg-[#FAFAFA] px-1 py-0.5 rounded text-sm; } .use-base pre code { @apply bg-transparent p-0; From e4182453970b4601b73c22a080c9c38ed03de3cb Mon Sep 17 00:00:00 2001 From: clkim Date: Thu, 20 Nov 2025 11:32:45 +0900 Subject: [PATCH 09/40] =?UTF-8?q?fix.=20=ED=95=98=EC=9D=B4=EB=93=9C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=85=98=20=EC=97=90=EB=9F=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/components/layouts/Header.vue | 286 ++++++++++++++------------- 1 file changed, 144 insertions(+), 142 deletions(-) diff --git a/layers/components/layouts/Header.vue b/layers/components/layouts/Header.vue index ffcc3ca..e13d271 100644 --- a/layers/components/layouts/Header.vue +++ b/layers/components/layouts/Header.vue @@ -61,8 +61,6 @@ const pathMatches = (base: string, current: string) => { /** 자식 중 활성 링크 존재 여부 */ const hasActiveChild = (children?: GameDataMenuChildren) => { - if(!import.meta.client) return false - const cur = currentPath.value return formatToArray(children).some(child => { if (!child?.url_path || !isInternalUrl(child.url_path)) return false @@ -72,8 +70,6 @@ const hasActiveChild = (children?: GameDataMenuChildren) => { /** 1Depth 활성화 여부 */ const isNavItemActive = (gnbItem: GameDataMenu): boolean => { - if(!import.meta.client) return false - const cur = currentPath.value const base = gnbItem?.url_path const selfActive = @@ -228,7 +224,7 @@ onMounted(() => { diff --git a/layers/components/layouts/EventNavigation.vue b/layers/components/layouts/EventNavigation.vue index 7cdf417..92a3217 100644 --- a/layers/components/layouts/EventNavigation.vue +++ b/layers/components/layouts/EventNavigation.vue @@ -85,6 +85,9 @@ onMounted(async () => { diff --git a/layers/components/atoms/icons/StateInfoCircleLine.vue b/layers/components/atoms/icons/StateInfoCircleLine.vue new file mode 100644 index 0000000..fbcd57e --- /dev/null +++ b/layers/components/atoms/icons/StateInfoCircleLine.vue @@ -0,0 +1,36 @@ + + + diff --git a/layers/templates/FxDownload01/index.vue b/layers/templates/FxDownload01/index.vue index 1e56131..4ea9d4c 100644 --- a/layers/templates/FxDownload01/index.vue +++ b/layers/templates/FxDownload01/index.vue @@ -1,5 +1,4 @@