[폴더, 파일 구조 정리]

This commit is contained in:
2025-09-25 15:33:11 +09:00
parent 51019d7f5f
commit ded762517e
30 changed files with 644 additions and 770 deletions

View File

@@ -0,0 +1,91 @@
<template>
<div class="wrapper">
<!-- 경로 -->
<nav class="breadcrumb">{{ breadcrumb }}</nav>
<!-- 화면 + 버튼 영역 -->
<header class="header">
<h1 class="title">{{ pageTitle }}</h1>
<div class="header-actions">
<slot name="actions" />
</div>
</header>
<!-- 메인 콘텐츠 -->
<main class="content">
<slot />
</main>
</div>
</template>
<script setup lang="ts">
const route = useRoute();
// 경로(메뉴 경로)
const breadcrumb = computed(() => route.path);
// 화면명(meta.title 값)
const pageTitle = computed(() => route.meta.title || "Untitled Page");
</script>
<style scoped>
.wrapper {
display: flex;
flex-direction: column;
gap: 1rem;
padding: 16px;
background: #f9f9f9;
min-height: 100%;
}
.breadcrumb {
font-size: 14px;
color: #666;
}
/* 화면명과 버튼을 좌우 끝으로 배치 */
.header {
display: flex;
align-items: center;
justify-content: space-between;
}
.title {
margin: 0;
font-size: 20px;
font-weight: bold;
}
.header-actions {
display: flex;
gap: 8px;
}
.content {
flex: 1;
padding: 12px;
background: #fff;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
/* 버튼 공통 스타일 */
.header-actions ::v-deep button {
background-color: #4caf50;
color: white;
font-size: 14px;
padding: 6px 12px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.header-actions ::v-deep button:hover {
background-color: #45a049;
}
.header-actions ::v-deep button:disabled {
background-color: #ccc;
cursor: not-allowed;
}
</style>

View File

@@ -0,0 +1,78 @@
<template>
<CommonPopup v-model:show="show">
<div class="popup-content" :style="{ width, height }">
<!-- Top -->
<div class="popup-top">
<slot name="top"></slot>
</div>
<!-- Middle -->
<div class="popup-middle">
<slot name="middle"></slot>
</div>
<!-- Bottom -->
<div class="popup-bottom">
<button class="popup-close" @click="show = false">닫기</button>
<slot name="bottom"></slot>
</div>
</div>
</CommonPopup>
</template>
<script setup lang="ts">
defineProps<{
width?: string;
height?: string;
}>();
// defineModel + 기본값 지정
const show = defineModel("show", { type: Boolean, default: false });
</script>
<style scoped>
.popup-content {
background: white;
display: flex;
flex-direction: column;
border-radius: 8px;
overflow: hidden;
}
.popup-top {
padding: 10px 20px;
font-weight: bold;
background: #f0f0f0;
border-bottom: 1px solid #ddd;
}
.popup-middle {
flex: 1;
padding: 20px;
overflow-y: auto;
}
.popup-bottom {
padding: 10px 20px;
display: flex;
justify-content: center; /* 중앙 정렬 */
gap: 10px;
background: #f9f9f9;
border-top: 1px solid #ddd;
}
/* ⭐️ bottom 슬롯 버튼 공통 스타일 */
.popup-bottom ::v-deep(button) {
padding: 8px 16px;
border: none;
border-radius: 6px;
background: #007bff;
color: white;
cursor: pointer;
}
.popup-bottom ::v-deep(button:hover) {
background: #0056b3;
}
.popup-close {
background: #ddd !important;
color: black !important;
}
</style>