diff --git a/apps/web-client-tpos-net/src/WebClientTpos.Client/Layout/CustomerLayout.razor b/apps/web-client-tpos-net/src/WebClientTpos.Client/Layout/CustomerLayout.razor
new file mode 100644
index 00000000..56f09b11
--- /dev/null
+++ b/apps/web-client-tpos-net/src/WebClientTpos.Client/Layout/CustomerLayout.razor
@@ -0,0 +1,10 @@
+@inherits LayoutComponentBase
+
+
+
+
+
+
+
+
+
+
+ @foreach (var st in new[] { ("all", "", "Tất cả"), ("pending", "clock", "Chờ"), ("confirmed", "check-circle", "Xác nhận"), ("seated", "armchair", "Đã ngồi"), ("cancelled", "x-circle", "Đã hủy"), ("no_show", "user-x", "Vắng") })
+ {
+ var count = st.Item1 == "all" ? _reservations.Count : _reservations.Count(r => r.Status == st.Item1);
+
+ }
+
+
+
+
+
+@if (_showForm)
+{
+
+ @foreach (var res in FilteredReservations)
+ {
+ var (statusColor, statusBg, statusText, statusIcon) = res.Status switch
+ {
+ "pending" => ("#F59E0B", "rgba(245,158,11,0.08)", "Chờ xác nhận", "clock"),
+ "confirmed" => ("#3B82F6", "rgba(59,130,246,0.08)", "Đã xác nhận", "check-circle"),
+ "seated" => ("#22C55E", "rgba(34,197,94,0.08)", "Đã ngồi", "armchair"),
+ "cancelled" => ("#EF4444", "rgba(239,68,68,0.08)", "Đã hủy", "x-circle"),
+ "no_show" => ("#6B6B6F", "rgba(107,107,111,0.08)", "Vắng mặt", "user-x"),
+ _ => ("#6B6B6F", "rgba(107,107,111,0.08)", res.Status, "circle")
+ };
+ var tableName = _tables.FirstOrDefault(t => t.Id == res.TableId)?.TableNumber;
+
+ @* Status badge *@
+
+ @statusText
+
+
+ @* Guest info *@
+
+
+
+
+
+
@res.GuestName
+ @if (!string.IsNullOrEmpty(res.Phone))
+ {
+
+ @res.Phone
+
+ }
+
+
+
+ @* Details *@
+
+ @res.ReservationTime.ToString("HH:mm")
+ @res.PartySize khách
+ @if (tableName != null)
+ {
+ Bàn @tableName
+ }
+
+
+ @if (!string.IsNullOrEmpty(res.Note))
+ {
+
+ @res.Note
+
+ }
+
+ @* Actions *@
+ @if (res.Status == "pending" || res.Status == "confirmed")
+ {
+
+ @if (res.Status == "pending")
+ {
+
+ }
+ @if (res.Status == "confirmed")
+ {
+
+
+ }
+
+
+ }
+
+ }
+
+}
+
+@code {
+ [Parameter] public Guid ShopId { get; set; }
+
+ private List