889212d643
Add KbxQuantityField (increment/decrement spinner) + update index exports for all Phase 3.5–4 components (wrapper, form, specialized fields). Components shipped: - KbxScreenFrame, KbxTemplateStateBoundary, KbxSummaryBar (wrapper) - KbxFormGrid, KbxFormSection (layout) - KbxInput, KbxSelect, KbxDateField, KbxNumberField, KbxTextarea, KbxCheckbox (basic fields) - KbxMoneyField, KbxQuantityField, KbxRadio (specialized fields) - 9 template/composite/advanced (T02, T03, T06, T07, DataGrid, Dialog, Drawer, Tabs, Lookup) Total Phase 1–4: 30 components, ~3500 LOC, contracts, registries, composables, tokens, app init complete. Ready for page implementation using KbxScreenFrame wrapper pattern. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
83 lines
1.5 KiB
Vue
83 lines
1.5 KiB
Vue
<script setup lang="ts">
|
|
/**
|
|
* KBX Section Header — v60 simplified
|
|
* Standard header for screen sections
|
|
*/
|
|
withDefaults(
|
|
defineProps<{
|
|
title: string
|
|
count?: number
|
|
countUnit?: string
|
|
description?: string
|
|
}>(),
|
|
{ countUnit: '건' }
|
|
)
|
|
</script>
|
|
|
|
<template>
|
|
<header class="kbx-section-header">
|
|
<div>
|
|
<h2>
|
|
{{ title }}
|
|
<span v-if="count != null"> {{ count.toLocaleString('ko-KR') }}{{ countUnit }}</span>
|
|
</h2>
|
|
<p v-if="description">{{ description }}</p>
|
|
</div>
|
|
<div class="kbx-section-header__actions">
|
|
<slot name="actions" />
|
|
</div>
|
|
</header>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.kbx-section-header {
|
|
min-height: 44px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 12px;
|
|
border-bottom: 1px solid var(--kbx-color-border, #e5e7eb);
|
|
padding: 0 16px;
|
|
}
|
|
|
|
.kbx-section-header h2 {
|
|
margin: 0;
|
|
font-size: 16px;
|
|
font-weight: 600;
|
|
color: var(--kbx-color-text, #000);
|
|
}
|
|
|
|
.kbx-section-header h2 span {
|
|
font-size: 13px;
|
|
color: var(--kbx-color-text-muted, #6b7280);
|
|
font-weight: 500;
|
|
margin-left: 6px;
|
|
}
|
|
|
|
.kbx-section-header p {
|
|
margin: 4px 0 0;
|
|
color: var(--kbx-color-text-muted, #6b7280);
|
|
font-size: 12px;
|
|
}
|
|
|
|
.kbx-section-header__actions {
|
|
display: flex;
|
|
gap: 8px;
|
|
}
|
|
|
|
@media (prefers-color-scheme: dark) {
|
|
.kbx-section-header {
|
|
border-bottom-color: #374151;
|
|
}
|
|
|
|
.kbx-section-header h2 {
|
|
color: #f9fafb;
|
|
}
|
|
|
|
.kbx-section-header h2 span,
|
|
.kbx-section-header p {
|
|
color: #d1d5db;
|
|
}
|
|
}
|
|
</style>
|