From 34a8248731e5d7d5f54aad3ca70a3b4e0cf4a1fa Mon Sep 17 00:00:00 2001 From: clkim Date: Tue, 23 Sep 2025 20:37:33 +0900 Subject: [PATCH] =?UTF-8?q?feat.=20GR=5FVISUAL=5F02=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/assets/css/app.css | 4 +- layers/assets/css/components/_splide.css | 102 ++++++++ .../css/components/_swiper-pagination.css | 73 ------ layers/components/widgets/BannerList.vue | 230 ++++++++++++++++++ layers/components/widgets/ButtonList.vue | 9 +- layers/composables/useResourcesData.ts | 41 ++++ .../middleware/{gameInfo.ts => gameData.ts} | 0 layers/templates/GrVisual01/index.vue | 45 ++-- layers/templates/GrVisual02/index.vue | 104 +++++++- layers/templates/GrVisual03/index.vue | 75 +++--- layers/types/api/pageData.ts | 4 +- layers/types/api/resourcesData.ts | 58 +++++ layers/utils/dataUtil.ts | 90 ++++++- 13 files changed, 689 insertions(+), 146 deletions(-) create mode 100644 layers/assets/css/components/_splide.css delete mode 100644 layers/assets/css/components/_swiper-pagination.css create mode 100644 layers/components/widgets/BannerList.vue create mode 100644 layers/composables/useResourcesData.ts rename layers/server/middleware/{gameInfo.ts => gameData.ts} (100%) create mode 100644 layers/types/api/resourcesData.ts diff --git a/layers/assets/css/app.css b/layers/assets/css/app.css index 86458e7..1b011e2 100644 --- a/layers/assets/css/app.css +++ b/layers/assets/css/app.css @@ -1,8 +1,10 @@ @import './base/_theme.css'; @import './base/_reset.css'; -@import './components/_swiper-pagination.css'; +@import './components/_splide.css'; @import './components/_button.css'; +@import '@splidejs/vue-splide/css'; + @tailwind base; @tailwind components; @tailwind utilities; diff --git a/layers/assets/css/components/_splide.css b/layers/assets/css/components/_splide.css new file mode 100644 index 0000000..6581cf4 --- /dev/null +++ b/layers/assets/css/components/_splide.css @@ -0,0 +1,102 @@ +/* 페이지네이션 버튼 - 모바일 퍼스트 */ +.splide-pagination-bullets { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + gap: 12px; + margin-top: 24px; + z-index: 5; +} + +.splide-pagination-bullets.type-full { + position: absolute; + bottom: 32px; + left: 0; +} + +.splide-pagination-bullet { + position: relative; + width: 8px; + height: 8px; + background: var(--primary); + border-radius: 50%; + opacity: 1; +} + +.splide-pagination-bullet:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 50%; + background: rgba(0, 0, 0, 0.5); + transition: opacity 0.3s ease; +} + +.splide-pagination-bullet.is-active:after { + opacity: 0; +} + +/* 네비게이션 버튼 - 모바일 퍼스트 */ +.splide-arrow { + display: none; + /* position: absolute; + top: 50%; + width: 40px; + height: 40px; + transform: translateY(-50%); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + cursor: pointer; + z-index: 5; + background-color: var(--primary); */ +} + +/* .type-full .arrow-prev { + left: 20px; +} +.type-full.arrow-next { + right: 20px; +} */ + +/* 데스크톱 스타일 */ +@media (min-width: 1024px) { + .splide-pagination-bullets { + gap: 24px; + margin-top: 32px; + } + + .splide-pagination-bullets.position-absolute { + bottom: 48px; + } + + .splide-pagination-bullet { + width: 12px; + height: 12px; + } + + .splide-arrow { + display: block; + position: absolute; + top: 50%; + background-size: cover; + background-position: center; + background-repeat: no-repeat; + background-color: var(--primary); + transform: translateY(-50%); + cursor: pointer; + z-index: 5; + } + + .type-full .arrow-prev { + left: 40px; + } + + .type-full .arrow-next { + right: 40px; + } +} diff --git a/layers/assets/css/components/_swiper-pagination.css b/layers/assets/css/components/_swiper-pagination.css deleted file mode 100644 index af4e031..0000000 --- a/layers/assets/css/components/_swiper-pagination.css +++ /dev/null @@ -1,73 +0,0 @@ -/* 페이지네이션 버튼 */ -main .slide-pagination.swiper-pagination-bullets { - position: absolute; - bottom: 48px; - left: 0; - width: 100%; - display: flex; - justify-content: center; - align-items: center; - gap: 24px; - z-index: 5; -} - -.slide-pagination .swiper-pagination-bullet { - position: relative; - width: 12px; - height: 12px; - background: var(--primary); - border-radius: 50%; - opacity: 1; -} - -.slide-pagination .swiper-pagination-bullet:after { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - border-radius: 50%; - background: rgba(0, 0, 0, 0.5); -} - -.slide-pagination .swiper-pagination-bullet-active:after { - display: none; -} - -/* 네비게이션 버튼 */ -.slide-prev, -.slide-next { - position: absolute; - top: 50%; - transform: translateY(-50%); - width: 48px; - height: 48px; - background-size: cover; - background-position: center; - background-repeat: no-repeat; - cursor: pointer; - z-index: 5; - - background-color: var(--primary); -} - -.slide-prev { - left: 40px; -} - -.slide-next { - right: 40px; -} - -@media (max-width: 1023px) { - main .slide-pagination.swiper-pagination-bullets { - bottom: 32px; - gap: 12px; - } - - .slide-pagination .swiper-pagination-bullet { - width: 8px; - height: 8px; - } -} diff --git a/layers/components/widgets/BannerList.vue b/layers/components/widgets/BannerList.vue new file mode 100644 index 0000000..671c405 --- /dev/null +++ b/layers/components/widgets/BannerList.vue @@ -0,0 +1,230 @@ + + + + + diff --git a/layers/components/widgets/ButtonList.vue b/layers/components/widgets/ButtonList.vue index d5d9830..c1568b7 100644 --- a/layers/components/widgets/ButtonList.vue +++ b/layers/components/widgets/ButtonList.vue @@ -1,16 +1,9 @@