feat(fe): collapse page subtitle into on-demand help toggle button for ultra-compact layout
This commit is contained in:
@@ -1,10 +1,21 @@
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
defineProps<{ title: string; subtitle?: string; status?: string; asOf?: string; version?: string; asideWidth?: string }>()
|
||||
const showHelp = ref(false)
|
||||
</script>
|
||||
<template>
|
||||
<section class="ks-page" :style="{ '--ks-aside-width': asideWidth ?? '22rem' }">
|
||||
<header class="ks-page__header">
|
||||
<div><h1>{{ title }}</h1><p v-if="subtitle">{{ subtitle }}</p><div class="ks-page__meta"><span v-if="status">상태: {{ status }}</span><span v-if="asOf">As-of: {{ asOf }}</span><span v-if="version">Version: {{ version }}</span></div></div>
|
||||
<div class="ks-page__title-box">
|
||||
<div class="ks-page__title-row">
|
||||
<h1>{{ title }}</h1>
|
||||
<button v-if="subtitle" class="ks-help-btn" :class="{ active: showHelp }" title="화면 설명 보기/닫기" aria-label="화면 설명 보기" @click="showHelp = !showHelp">
|
||||
ℹ️ 도움말
|
||||
</button>
|
||||
</div>
|
||||
<p v-if="subtitle && showHelp" class="ks-page__subtitle">{{ subtitle }}</p>
|
||||
<div class="ks-page__meta"><span v-if="status">상태: {{ status }}</span><span v-if="asOf">As-of: {{ asOf }}</span><span v-if="version">Version: {{ version }}</span></div>
|
||||
</div>
|
||||
<div class="ks-page__actions"><slot name="actions" /></div>
|
||||
</header>
|
||||
<div v-if="$slots.summary" class="ks-page__summary"><slot name="summary" /></div>
|
||||
@@ -19,8 +30,13 @@ defineProps<{ title: string; subtitle?: string; status?: string; asOf?: string;
|
||||
<style scoped>
|
||||
.ks-page { max-width: var(--ks-content-max); margin: 0 auto; height: 100%; display: flex; flex-direction: column; gap: var(--ks-space-2); }
|
||||
.ks-page__header { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--ks-space-4); flex-shrink: 0; }
|
||||
h1 { margin: 0; font-size: var(--ks-font-page); line-height: var(--ks-line-page); } p { margin: var(--ks-space-1) 0 0; color: var(--ks-color-neutral-600); }
|
||||
.ks-page__meta { display: flex; gap: var(--ks-space-3); flex-wrap: wrap; margin-top: var(--ks-space-2); color: var(--ks-color-neutral-600); font-size: var(--ks-font-caption); }
|
||||
.ks-page__title-box { display: flex; flex-direction: column; gap: var(--ks-space-1); }
|
||||
.ks-page__title-row { display: flex; align-items: center; gap: var(--ks-space-2); }
|
||||
h1 { margin: 0; font-size: var(--ks-font-page); line-height: var(--ks-line-page); }
|
||||
.ks-page__subtitle { margin: var(--ks-space-1) 0 0; color: var(--ks-color-neutral-600); font-size: var(--ks-font-body); padding: var(--ks-space-2); background: var(--ks-color-neutral-100); border-radius: var(--ks-radius-sm); border: 1px solid var(--ks-color-neutral-200); }
|
||||
.ks-help-btn { border: 1px solid var(--ks-color-neutral-300); background: #fff; border-radius: var(--ks-radius-sm); padding: 1px 6px; font-size: 11px; color: var(--ks-color-neutral-700); cursor: pointer; transition: all 0.15s ease; }
|
||||
.ks-help-btn:hover, .ks-help-btn.active { background: var(--ks-color-action); color: #fff; border-color: var(--ks-color-action); }
|
||||
.ks-page__meta { display: flex; gap: var(--ks-space-3); flex-wrap: wrap; margin-top: 2px; color: var(--ks-color-neutral-600); font-size: var(--ks-font-caption); }
|
||||
.ks-page__summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr)); gap: var(--ks-space-3); flex-shrink: 0; }
|
||||
.ks-page__filters { padding: var(--ks-space-2) var(--ks-space-3); flex-shrink: 0; }
|
||||
.ks-page__workspace { min-width: 0; flex: 1; display: grid; min-height: 0; gap: var(--ks-space-4); }
|
||||
|
||||
Reference in New Issue
Block a user