Files
fanuzu/app/lib/core/ui/tab_placeholder.dart
T

73 lines
2.7 KiB
Dart

import 'package:flutter/material.dart';
import '../theme/tokens.dart';
/// 탭 루트 화면의 플레이스홀더.
///
/// 2주차 범위는 「앱 골격 · 5탭 네비게이션 · 소셜 로그인 · 디자인시스템」이다(별첨2).
/// 각 탭의 실제 화면은 3주차 이후이므로, 여기서는 어느 화면이 들어올 자리인지와
/// 다음 구현 시점을 보여 준다. 빈 화면을 두면 검수 때 무엇이 빠진 건지 알 수 없다.
class TabPlaceholder extends StatelessWidget {
const TabPlaceholder({
super.key,
required this.tab,
required this.screenId,
required this.screenName,
this.footer,
});
/// 계약 고정 탭 라벨(견적서 v2.1 5탭).
final String tab;
final String screenId;
final String screenName;
/// 자리표시 아래에 붙는 동작(예: MY 의 로그아웃). 없으면 그리지 않는다.
final Widget? footer;
@override
Widget build(BuildContext context) {
final text = Theme.of(context).textTheme;
return Scaffold(
appBar: AppBar(title: Text(screenName)),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(AppSpace.s5),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(tab, style: text.labelMedium),
const SizedBox(height: AppSpace.s2),
Text(screenName, style: text.displayMedium),
const SizedBox(height: AppSpace.s4),
Text(screenId, style: text.titleMedium),
const SizedBox(height: AppSpace.s5),
Container(
padding: const EdgeInsets.all(AppSpace.s4),
decoration: BoxDecoration(
color: AppColors.cosmicSurfaceContainer,
border: Border.all(color: AppColors.cosmicOutline),
borderRadius: BorderRadius.circular(AppRadius.md),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('2주차 범위: 탭 골격까지', style: text.bodyMedium),
const SizedBox(height: AppSpace.s2),
Text('화면 구현은 3주차 이후', style: text.bodySmall),
const SizedBox(height: AppSpace.s3),
Text('승인된 화면 정의를 기준으로 구현합니다.', style: text.bodySmall),
],
),
),
if (footer != null) ...[
const SizedBox(height: AppSpace.s5),
footer!,
],
],
),
),
),
);
}
}