@hbslovely/baby-feeding 2026.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hbslovely-baby-feeding.mjs","sources":["../../../projects/baby-feeding-lib/src/environments/environment.ts","../../../projects/baby-feeding-lib/src/feeding-src/services/feeding-log.service.ts","../../../projects/baby-feeding-lib/src/feeding-src/services/weight-log.service.ts","../../../projects/baby-feeding-lib/src/feeding-src/services/event-log.service.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/feeding-prediction.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/feeding-nutrition.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/nutrition/feeding-nutrition.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/nutrition/feeding-nutrition.component.html","../../../projects/baby-feeding-lib/src/feeding-src/services/explorer.service.ts","../../../projects/baby-feeding-lib/src/feeding-src/services/activity-log.service.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/documents/documents.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/documents/documents.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/postpartum-food.data.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/feeding-tips.data.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/mom-wellness.data.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/mom/feeding-mom.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/mom/feeding-mom.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/charts/feeding-charts.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/charts/feeding-charts.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/profile/feeding-profile.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/profile/feeding-profile.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/feeding-view-group.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/dialogs/feeding-dialogs.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/dialogs/feeding-dialogs.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/feeding-display.helpers.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/daily/feeding-daily.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/daily/feeding-daily.component.html","../../../projects/baby-feeding-lib/src/feeding-src/services/google-sheets.service.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/medical-history-kinds.data.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/medical-data-mapper.service.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/medical-error-handler.service.ts","../../../projects/baby-feeding-lib/src/feeding-src/services/medical-history.service.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/medical-history-vi.utils.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/medical-places.presets.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/dialog/medical-history-dialog.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/dialog/medical-history-dialog.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/filter/medical-history-filter.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/filter/medical-history-filter.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/timeline/medical-history-timeline.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/timeline/medical-history-timeline.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/preview/medical-history-preview.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/preview/medical-history-preview.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/medical-history.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/medical-history/medical-history.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/baby-timeline.data.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/baby-weight-growth.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/weight/weight-display.utils.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/weight/weight-charts/weight-charts.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/weight/weight-charts/weight-charts.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/weight/weight-header/weight-header.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/weight/weight-header/weight-header.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/weight/weight-history-list/weight-history-list.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/weight/weight-history-list/weight-history-list.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/weight/weight.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/weight/weight.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/schedule/feeding-schedule.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/schedule/feeding-schedule.component.html","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/activity-log/activity-log.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/activity-log/activity-log.component.html","../../../projects/baby-feeding-lib/src/feeding-src/services/notification-log.service.ts","../../../projects/baby-feeding-lib/src/feeding-src/app-info.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/feeding.component.ts","../../../projects/baby-feeding-lib/src/feeding-src/pages/feeding/feeding.component.html","../../../projects/baby-feeding-lib/src/public-api.ts","../../../projects/baby-feeding-lib/src/hbslovely-baby-feeding.ts"],"sourcesContent":["/**\n * Library build environment stub.\n *\n * In the SPA (baby-feeding-app), these values are injected at build time via\n * @ngx-env/builder using import.meta.env.NG_APP_* variables.\n *\n * In the npm library build (ng-packagr), build-time env vars are not available.\n * The library uses empty/false defaults; the consuming host app is expected to\n * provide its own environment by configuring the services via InjectionTokens\n * (e.g. FEEDING_CONFIG_TOKEN) or by providing its own AppConfig at bootstrap.\n *\n * Services that use environment.googleFeedingAppsScriptUrl etc. will fall back\n * to '/api/feeding-apps-script' (the Vercel proxy path) which works when the\n * SPA is deployed.\n */\nexport const environment = {\n production: false,\n googleFeedingAppsScriptUrl: '',\n googleFeedingSheetId: '',\n googleSheetsApiKey: '',\n googleClientId: '',\n enableExplorer: false,\n appsScriptDirect: false,\n};\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { from, Observable, of, throwError } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { environment } from '../../environments/environment';\n\nexport interface FeedingLog {\n /** user id / bé (multi-account trên cùng sheet) */\n user: string;\n /** YYYY-MM-DD */\n date: string;\n /** HH:mm (24h) */\n time: string;\n /** ml */\n volume: number;\n note?: string;\n /** row trong sheet (1-based, row đầu là header) — chỉ có khi load từ sheet */\n rowIndex?: number;\n}\n\nexport interface FeedingSheetResponse {\n success: boolean;\n logs?: FeedingLog[];\n rowIndex?: number;\n error?: string;\n}\n\n/** Pha sữa đọc từ `Feeding!G1:K1` (K = ISO lúc pha, do app ghi). */\nexport interface BottlePrepFromSheet {\n volumeMl: number;\n at: string;\n user: string;\n}\n\n/** Cột tab Google Sheet `Settings`: ID | Tên chỉ tiêu | Giá trị | Đơn vị | Kiểu dữ liệu */\nexport interface FeedingSettingRow {\n id: string;\n name: string;\n value: string;\n unit: string;\n dataType: string;\n}\n\n/** Giá trị đã parse — app chỉ bind theo `FEEDING_SETTING_ID`, không theo tên hiển thị. */\nexport interface FeedingSettingsResolved {\n /**\n * Ngưỡng **H** (giờ) giữa hai cữ: cảnh báo khi khoảng cách **≥ H** — ID `FEED_TIME_WARNING`.\n */\n feedTimeWarningHours: number;\n /** Cữ có dung tích < giá trị này (ml) — `FEED_WARNING_AMOUNT`. */\n feedWarningMl: number;\n /**\n * Nếu hai cữ liên tiếp cách nhau ≤ giá trị này (phút) thì gom hiển thị\n * thành một dòng (0 = tắt) — ID `FEED_GROUP_GAP_MINUTES`.\n */\n feedGroupGapMinutes: number;\n /**\n * Thông báo \"sắp tới cữ bú\" khi còn ≤ N phút — ID `FEEDING_NOTIFICATION_MINUTES`.\n */\n feedingNotificationMinutes: number;\n /**\n * Thời gian cần bế bé vỗ ợ sau mỗi cữ bú (phút) — ID `BURP_DURATION_MINUTES`.\n */\n burpDurationMinutes: number;\n /**\n * Bắt đầu nhắc sự kiện lịch trước N ngày — ID `EVENT_REMINDER_DAYS`.\n */\n eventReminderDays: number;\n /**\n * Cộng thêm giờ vào cửa sổ nhắc lịch — ID `EVENT_REMINDER_HOURS`.\n */\n eventReminderHours: number;\n /**\n * Tự động làm mới nhật ký hoạt động mỗi N phút — ID `ACTIVITY_LOG_REFRESH_MINUTES`.\n */\n activityLogRefreshMinutes: number;\n}\n\n/** ID cố định trên sheet — khi lưu chỉ gửi các key này. */\nexport const FEEDING_SETTING_ID = {\n FEED_TIME_WARNING: 'FEED_TIME_WARNING',\n FEED_WARNING_AMOUNT: 'FEED_WARNING_AMOUNT',\n FEED_GROUP_GAP_MINUTES: 'FEED_GROUP_GAP_MINUTES',\n FEEDING_NOTIFICATION_MINUTES: 'FEEDING_NOTIFICATION_MINUTES',\n BURP_DURATION_MINUTES: 'BURP_DURATION_MINUTES',\n EVENT_REMINDER_DAYS: 'EVENT_REMINDER_DAYS',\n EVENT_REMINDER_HOURS: 'EVENT_REMINDER_HOURS',\n ACTIVITY_LOG_REFRESH_MINUTES: 'ACTIVITY_LOG_REFRESH_MINUTES',\n} as const;\n\nconst DEFAULT_FEEDING_SETTINGS: FeedingSettingsResolved = {\n feedTimeWarningHours: 3,\n feedWarningMl: 40,\n feedGroupGapMinutes: 0,\n feedingNotificationMinutes: 5,\n burpDurationMinutes: 10,\n eventReminderDays: 3,\n eventReminderHours: 0,\n activityLogRefreshMinutes: 5,\n};\n\nexport function parseFeedingSettingsFromRows(rows: FeedingSettingRow[]): FeedingSettingsResolved {\n const byId = new Map(rows.map((r) => [r.id.trim(), r]));\n const timeRow = byId.get(FEEDING_SETTING_ID.FEED_TIME_WARNING) ?? byId.get('GROUP_FEEDING_TIME');\n const wRow = byId.get(FEEDING_SETTING_ID.FEED_WARNING_AMOUNT);\n const gapRow = byId.get(FEEDING_SETTING_ID.FEED_GROUP_GAP_MINUTES);\n const notifyRow = byId.get(FEEDING_SETTING_ID.FEEDING_NOTIFICATION_MINUTES);\n const burpRow = byId.get(FEEDING_SETTING_ID.BURP_DURATION_MINUTES);\n const evDaysRow = byId.get(FEEDING_SETTING_ID.EVENT_REMINDER_DAYS);\n const evHoursRow = byId.get(FEEDING_SETTING_ID.EVENT_REMINDER_HOURS);\n const activityLogRow = byId.get(FEEDING_SETTING_ID.ACTIVITY_LOG_REFRESH_MINUTES);\n\n let feedTimeWarningHours = parseFloat(\n String(timeRow?.value ?? '')\n .replace(',', '.')\n .trim()\n );\n let feedWarningMl = parseInt(String(wRow?.value ?? '').replace(/[^\\d]/g, ''), 10);\n let feedGroupGapMinutes = parseInt(String(gapRow?.value ?? '0').replace(/[^\\d]/g, ''), 10);\n let feedingNotificationMinutes = parseInt(\n String(notifyRow?.value ?? '5').replace(/[^\\d]/g, ''),\n 10\n );\n let burpDurationMinutes = parseInt(String(burpRow?.value ?? '10').replace(/[^\\d]/g, ''), 10);\n let eventReminderDays = parseInt(String(evDaysRow?.value ?? '3').replace(/[^\\d]/g, ''), 10);\n let eventReminderHours = parseInt(String(evHoursRow?.value ?? '0').replace(/[^\\d]/g, ''), 10);\n let activityLogRefreshMinutes = parseInt(\n String(activityLogRow?.value ?? '5').replace(/[^\\d]/g, ''),\n 10\n );\n\n if (!Number.isFinite(feedTimeWarningHours) || feedTimeWarningHours <= 0) {\n feedTimeWarningHours = DEFAULT_FEEDING_SETTINGS.feedTimeWarningHours;\n }\n if (!Number.isFinite(feedWarningMl) || feedWarningMl <= 0) {\n feedWarningMl = DEFAULT_FEEDING_SETTINGS.feedWarningMl;\n }\n if (!Number.isFinite(feedGroupGapMinutes) || feedGroupGapMinutes < 0) {\n feedGroupGapMinutes = DEFAULT_FEEDING_SETTINGS.feedGroupGapMinutes;\n }\n if (!Number.isFinite(feedingNotificationMinutes) || feedingNotificationMinutes <= 0) {\n feedingNotificationMinutes = DEFAULT_FEEDING_SETTINGS.feedingNotificationMinutes;\n }\n if (!Number.isFinite(burpDurationMinutes) || burpDurationMinutes <= 0) {\n burpDurationMinutes = DEFAULT_FEEDING_SETTINGS.burpDurationMinutes;\n }\n if (!Number.isFinite(eventReminderDays) || eventReminderDays < 0) {\n eventReminderDays = DEFAULT_FEEDING_SETTINGS.eventReminderDays;\n }\n if (!Number.isFinite(eventReminderHours) || eventReminderHours < 0) {\n eventReminderHours = DEFAULT_FEEDING_SETTINGS.eventReminderHours;\n }\n if (!Number.isFinite(activityLogRefreshMinutes) || activityLogRefreshMinutes <= 0) {\n activityLogRefreshMinutes = DEFAULT_FEEDING_SETTINGS.activityLogRefreshMinutes;\n }\n\n feedTimeWarningHours = Math.min(48, Math.max(0.25, feedTimeWarningHours));\n feedWarningMl = Math.min(500, Math.max(1, feedWarningMl));\n feedGroupGapMinutes = Math.min(180, Math.max(0, feedGroupGapMinutes));\n feedingNotificationMinutes = Math.min(180, Math.max(1, feedingNotificationMinutes));\n burpDurationMinutes = Math.min(30, Math.max(1, burpDurationMinutes));\n eventReminderDays = Math.min(30, Math.max(0, eventReminderDays));\n eventReminderHours = Math.min(168, Math.max(0, eventReminderHours));\n activityLogRefreshMinutes = Math.min(60, Math.max(1, activityLogRefreshMinutes));\n\n return {\n feedTimeWarningHours,\n feedWarningMl,\n feedGroupGapMinutes,\n feedingNotificationMinutes,\n burpDurationMinutes,\n eventReminderDays,\n eventReminderHours,\n activityLogRefreshMinutes,\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class FeedingLogService {\n private http = inject(HttpClient);\n\n private readonly SHEET_ID = environment.googleFeedingSheetId;\n private readonly SHEET_NAME = 'Feeding';\n private readonly SETTINGS_SHEET_NAME = 'Settings';\n private readonly API_KEY = environment.googleSheetsApiKey;\n private readonly BASE_URL = this.SHEET_ID\n ? `https://sheets.googleapis.com/v4/spreadsheets/${this.SHEET_ID}`\n : '';\n\n private readonly APPS_SCRIPT_URL = environment.appsScriptDirect\n ? environment.googleFeedingAppsScriptUrl\n : '/api/feeding-apps-script';\n\n /**\n * Columns:\n * A: User (chỉ để ghi nhận ai là người log, KHÔNG dùng để filter)\n * B: Ngày (DD/MM/YYYY)\n * C: Giờ (HH:mm)\n * D: Dung tích (ml)\n * E: Ghi chú\n *\n * Trả về TẤT CẢ cữ bú trong sheet — mọi user share chung dữ liệu của bé.\n */\n getLogs(): Observable<FeedingLog[]> {\n if (!this.BASE_URL || !this.API_KEY) {\n return throwError(\n () =>\n new Error(\n 'Thiếu cấu hình Google Sheet. Hãy set NG_APP_GOOGLE_FEEDING_SHEET_ID và API key.'\n )\n );\n }\n const range = `${this.SHEET_NAME}!A2:E`;\n const url = `${this.BASE_URL}/values/${range}?key=${this.API_KEY}&valueRenderOption=FORMATTED_VALUE`;\n\n return this.http.get<{ values?: string[][] }>(url).pipe(\n map((resp) => {\n const rows = resp.values || [];\n\n return rows\n .map((row, idx) => {\n const rowUser = (row[0] || '').trim();\n const dateStr = (row[1] || '').trim();\n const timeStr = (row[2] || '').trim();\n const volumeStr = (row[3] || '').trim();\n const note = (row[4] || '').trim();\n\n if (!dateStr || !volumeStr) return null;\n\n const date = this.parseSheetDate(dateStr);\n const volume = parseInt(volumeStr.replace(/[^\\d]/g, ''), 10) || 0;\n\n if (!date || volume <= 0) return null;\n\n const log: FeedingLog = {\n user: rowUser.toLowerCase(),\n date,\n time: this.normalizeTime(timeStr),\n volume,\n note: note || undefined,\n rowIndex: idx + 2,\n };\n return log;\n })\n .filter((l): l is FeedingLog => !!l)\n .sort((a, b) => {\n const aK = `${a.date} ${a.time}`;\n const bK = `${b.date} ${b.time}`;\n return bK.localeCompare(aK);\n });\n }),\n catchError((err) => {\n console.error('FeedingLogService.getLogs failed', err);\n return throwError(() => err);\n })\n );\n }\n\n /**\n * Đọc pha sữa từ dòng 1: G nhãn | H user | I ml | J giờ | K ISO (app).\n * Chỉ trả dữ liệu khi **H** khớp `currentUser` (`?user=`).\n * Nếu K trống (script cũ): suy ra `at` từ J + ngày gần nhất với giờ đó.\n */\n getBottlePrep(): Observable<BottlePrepFromSheet | null> {\n if (!this.BASE_URL || !this.API_KEY) {\n return of(null);\n }\n const range = `${this.SHEET_NAME}!G1:K1`;\n const url = `${this.BASE_URL}/values/${range}?key=${this.API_KEY}&valueRenderOption=FORMATTED_VALUE`;\n\n return this.http.get<{ values?: string[][] }>(url).pipe(\n map((resp) => this.parseBottlePrepRow(resp.values?.[0])),\n catchError((err) => {\n console.error('FeedingLogService.getBottlePrep failed', err);\n return of(null);\n })\n );\n }\n\n /**\n * Đọc tab `Settings` (A:E từ dòng 2). Cột A = **ID** (khóa ổn định), C = giá trị.\n * Sheet cần public read như tab Feeding.\n */\n getFeedingSettings(): Observable<FeedingSettingRow[]> {\n if (!this.BASE_URL || !this.API_KEY) {\n return of([]);\n }\n const range = `${this.SETTINGS_SHEET_NAME}!A2:E`;\n const url = `${this.BASE_URL}/values/${encodeURIComponent(range)}?key=${this.API_KEY}&valueRenderOption=FORMATTED_VALUE`;\n\n return this.http.get<{ values?: string[][] }>(url).pipe(\n map((resp) => {\n const rows = resp.values || [];\n return rows\n .map((row) => ({\n id: String(row[0] ?? '').trim(),\n name: String(row[1] ?? '').trim(),\n value: String(row[2] ?? '').trim(),\n unit: String(row[3] ?? '').trim(),\n dataType: String(row[4] ?? '').trim(),\n }))\n .filter((r) => r.id.length > 0);\n }),\n catchError((err) => {\n console.error('FeedingLogService.getFeedingSettings failed', err);\n return of([]);\n })\n );\n }\n\n /**\n * Cập nhật **cột Giá trị** theo **ID** (cột A). POST qua Apps Script\n * `action: 'updateFeedingSettings'`, body: `{ updates: [{ id, value }] }`.\n */\n saveFeedingSettings(\n updates: {\n id: string;\n value: number;\n /** Khi sheet chưa có dòng ID này — Apps Script sẽ append (cột B/D/E). */\n name?: string;\n unit?: string;\n dataType?: string;\n }[],\n meta?: { user?: string }\n ): Observable<FeedingSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n const user = String(meta?.user ?? '')\n .toLowerCase()\n .trim();\n return this.postToAppsScript({\n action: 'updateFeedingSettings',\n ...(user ? { user } : {}),\n updates: updates.map((u) => ({\n id: String(u.id || '').trim(),\n value: u.value,\n ...(u.name != null && String(u.name).trim() ? { name: String(u.name).trim() } : {}),\n ...(u.unit != null && String(u.unit).trim() ? { unit: String(u.unit).trim() } : {}),\n ...(u.dataType != null && String(u.dataType).trim()\n ? { dataType: String(u.dataType).trim() }\n : {}),\n })),\n }).pipe(\n catchError((err) => {\n console.warn(\n 'saveFeedingSettings — POST có thể đã ghi (mobile no-cors), reload để xác nhận.',\n err\n );\n return of({ success: true });\n })\n );\n }\n\n addLog(log: FeedingLog): Observable<FeedingSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n\n return this.postToAppsScript({\n action: 'addFeeding',\n log: {\n user: log.user,\n date: log.date,\n time: log.time,\n volume: log.volume,\n note: log.note || '',\n },\n }).pipe(\n catchError((err) => {\n return of({ success: true });\n })\n );\n }\n\n /**\n * Cập nhật một cữ bú hiện có. **KHÔNG** cho đổi `date` (nghiệp vụ: cữ\n * thuộc về ngày nào thì cố định, chỉ chỉnh giờ / ml / note).\n *\n * - `rowIndex` là số row 1-based trong sheet (header = row 1).\n * - Server-side Apps Script chịu trách nhiệm validate + chỉ ghi 3 cột\n * `Giờ`, `Dung tích`, `Ghi chú` để tránh nguy cơ ghi đè cột khác.\n */\n updateLog(\n rowIndex: number,\n patch: { time: string; volume: number; note?: string }\n ): Observable<FeedingSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n\n return this.postToAppsScript({\n action: 'updateFeeding',\n row: rowIndex,\n patch: {\n time: patch.time,\n volume: patch.volume,\n note: patch.note || '',\n },\n }).pipe(\n catchError(() => {\n return of({ success: true });\n })\n );\n }\n\n deleteLog(rowIndex: number): Observable<FeedingSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n\n return this.postToAppsScript({\n action: 'deleteFeeding',\n row: rowIndex,\n }).pipe(\n catchError((err) => {\n return of({ success: true });\n })\n );\n }\n\n /**\n * Ghi dòng 1 cột G–K tab Feeding: … | giờ pha | **K = ISO** (để load chính xác).\n * Apps Script: action `setBottlePrep`.\n */\n setBottlePrepOnSheet(payload: {\n user: string;\n volumeMl: number;\n time: string;\n atIso: string;\n }): Observable<FeedingSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n\n return this.postToAppsScript({\n action: 'setBottlePrep',\n user: payload.user,\n volumeMl: payload.volumeMl,\n time: payload.time,\n atIso: payload.atIso,\n }).pipe(\n catchError((err) => {\n return of({ success: true });\n })\n );\n }\n\n /**\n * Xoá H1:K1 trên tab Feeding. Apps Script: `clearBottlePrep`.\n */\n clearBottlePrepOnSheet(): Observable<FeedingSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n\n return this.postToAppsScript({\n action: 'clearBottlePrep',\n }).pipe(\n catchError((err) => {\n return of({ success: true });\n })\n );\n }\n\n /**\n * Gửi POST tới Google Apps Script web app.\n *\n * Dev (proxy): dùng HttpClient bình thường, đọc JSON response.\n *\n * Prod (mobile-safe): dùng fetch với `mode: 'no-cors'`.\n * - GAS `doPost` trả 302 redirect sang `script.googleusercontent.com`.\n * XHR (HttpClient) cố gắng đọc CORS header ở endpoint cuối, và trên\n * mobile/WebView hành vi này rất flaky ⇒ request thường fail với\n * status 0 dù GAS đã ghi thành công.\n * - `fetch` với `mode: 'no-cors'` gửi request như form thường, không\n * expect đọc response, không cần CORS header ⇒ không bao giờ fail\n * vì CORS. Opaque response cũng OK vì ta sẽ reload để verify.\n * - Content-Type `text/plain;charset=utf-8` vẫn cần để nằm trong\n * \"CORS-safelisted\" và không trigger preflight OPTIONS.\n */\n private postToAppsScript(body: Record<string, unknown>): Observable<FeedingSheetResponse> {\n const url = this.APPS_SCRIPT_URL;\n const useProxy = url.startsWith('/');\n\n if (useProxy) {\n const headers = new HttpHeaders({ 'Content-Type': 'text/plain;charset=UTF-8' });\n return this.http\n .post<FeedingSheetResponse>(url, JSON.stringify(body), { headers })\n .pipe(map((resp) => resp));\n }\n\n const payload = JSON.stringify(body);\n return from(\n fetch(url, {\n method: 'POST',\n mode: 'no-cors',\n headers: { 'Content-Type': 'text/plain;charset=utf-8' },\n body: payload,\n redirect: 'follow',\n })\n .then((): FeedingSheetResponse => ({ success: true }))\n .catch((): FeedingSheetResponse => ({ success: true }))\n ).pipe(\n catchError((err) => {\n console.warn(\n 'FeedingLogService POST (no-cors) — coi như thành công, sẽ reload để verify.',\n err\n );\n return of({ success: true });\n })\n );\n }\n\n /**\n * Chuyển \"07/04/2026\" hoặc \"2026-04-07\" → \"YYYY-MM-DD\"\n */\n private parseSheetDate(raw: string): string | null {\n if (!raw) return null;\n const m1 = raw.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (m1) {\n const [, d, mo, y] = m1;\n return `${y}-${mo.padStart(2, '0')}-${d.padStart(2, '0')}`;\n }\n const m2 = raw.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})/);\n if (m2) {\n const [, y, mo, d] = m2;\n return `${y}-${mo.padStart(2, '0')}-${d.padStart(2, '0')}`;\n }\n const parsed = new Date(raw);\n if (!isNaN(parsed.getTime())) {\n const y = parsed.getFullYear();\n const mo = (parsed.getMonth() + 1).toString().padStart(2, '0');\n const d = parsed.getDate().toString().padStart(2, '0');\n return `${y}-${mo}-${d}`;\n }\n return null;\n }\n\n private normalizeTime(raw: string): string {\n if (!raw) return '00:00';\n const m = raw.match(/(\\d{1,2})[:h](\\d{1,2})/);\n if (m) {\n return `${m[1].padStart(2, '0')}:${m[2].padStart(2, '0')}`;\n }\n return raw;\n }\n\n private parseBottlePrepRow(row: string[] | undefined): BottlePrepFromSheet | null {\n if (!row?.length) return null;\n const sheetUser = String(row[1] ?? '')\n .toLowerCase()\n .trim();\n const volRaw = String(row[2] ?? '').trim();\n const timeRaw = String(row[3] ?? '').trim();\n const isoRaw = String(row[4] ?? '').trim();\n\n const volumeMl = parseInt(volRaw.replace(/[^\\d]/g, ''), 10) || 0;\n if (volumeMl <= 0 || !timeRaw) return null;\n\n const fromK = isoRaw ? new Date(isoRaw) : null;\n const at =\n fromK && !isNaN(fromK.getTime())\n ? fromK.toISOString()\n : this.guessIsoFromClockTime(this.normalizeTime(timeRaw));\n\n return { volumeMl, at, user: sheetUser };\n }\n\n /** Khi sheet chưa có cột K: chọn ngày (hôm qua / hôm nay / mai) sao cho giờ J gần `now` nhất. */\n private guessIsoFromClockTime(hm: string): string {\n const parts = hm.split(':').map((x) => parseInt(x, 10));\n const hh = parts[0];\n const mm = parts[1];\n if (isNaN(hh) || isNaN(mm)) return new Date().toISOString();\n\n const now = new Date();\n let best = new Date(now.getFullYear(), now.getMonth(), now.getDate(), hh, mm, 0, 0);\n let bestDiff = Math.abs(now.getTime() - best.getTime());\n\n for (const delta of [-1, 1]) {\n const d = new Date(now.getFullYear(), now.getMonth(), now.getDate() + delta, hh, mm, 0, 0);\n const diff = Math.abs(now.getTime() - d.getTime());\n if (diff < bestDiff) {\n best = d;\n bestDiff = diff;\n }\n }\n\n return best.toISOString();\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable, from, throwError, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { environment } from '../../environments/environment';\n\nexport interface WeightLog {\n user: string;\n /** YYYY-MM-DD */\n date: string;\n /** kg — có thể lẻ (vd 4.25) */\n weightKg: number;\n /** cm — tuỳ chọn, thường chỉ đo khi khám định kỳ */\n heightCm?: number;\n note?: string;\n rowIndex?: number;\n}\n\nexport interface WeightSheetResponse {\n success: boolean;\n rowIndex?: number;\n error?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class WeightLogService {\n private http = inject(HttpClient);\n\n private readonly SHEET_ID = environment.googleFeedingSheetId;\n private readonly SHEET_NAME = 'Weight';\n private readonly API_KEY = environment.googleSheetsApiKey;\n private readonly BASE_URL = this.SHEET_ID\n ? `https://sheets.googleapis.com/v4/spreadsheets/${this.SHEET_ID}`\n : '';\n\n private readonly APPS_SCRIPT_URL = environment.appsScriptDirect\n ? environment.googleFeedingAppsScriptUrl\n : '/api/feeding-apps-script';\n\n /**\n * Cột:\n * A = User\n * B = Ngày (DD/MM/YYYY)\n * C = Cân nặng (kg)\n * D = Chiều cao (cm, tuỳ chọn)\n * E = Ghi chú\n */\n getLogs(): Observable<WeightLog[]> {\n if (!this.BASE_URL || !this.API_KEY) {\n return throwError(\n () =>\n new Error(\n 'Thiếu cấu hình Google Sheet. Hãy set NG_APP_GOOGLE_FEEDING_SHEET_ID và API key.'\n )\n );\n }\n const range = `${this.SHEET_NAME}!A2:E`;\n const url = `${this.BASE_URL}/values/${range}?key=${this.API_KEY}&valueRenderOption=FORMATTED_VALUE`;\n\n return this.http.get<{ values?: string[][] }>(url).pipe(\n map((resp) => {\n const rows = resp.values || [];\n return rows\n .map((row, idx) => {\n const rowUser = (row[0] || '').trim();\n const dateStr = (row[1] || '').trim();\n const weightRaw = (row[2] ?? '').toString().trim();\n const colD = (row[3] ?? '').toString().trim();\n const colE = (row[4] ?? '').toString().trim();\n\n if (!dateStr || weightRaw === '') return null;\n\n const date = this.parseSheetDate(dateStr);\n const weightKg = this.parseWeightKg(weightRaw);\n if (!date || weightKg === null || weightKg <= 0) return null;\n const { heightCm, note } = this.resolveHeightAndNote(colD, colE);\n\n const log: WeightLog = {\n user: rowUser.toLowerCase(),\n date,\n weightKg,\n ...(heightCm !== null ? { heightCm } : {}),\n note: note || undefined,\n rowIndex: idx + 2,\n };\n return log;\n })\n .filter((l): l is WeightLog => !!l)\n .sort((a, b) => {\n const ak = `${a.date}`;\n const bk = `${b.date}`;\n return bk.localeCompare(ak);\n });\n }),\n catchError((err) => {\n console.error('WeightLogService.getLogs failed', err);\n return throwError(() => err);\n })\n );\n }\n\n addLog(log: WeightLog): Observable<WeightSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n return this.postToAppsScript({\n action: 'addWeight',\n log: {\n user: log.user,\n date: log.date,\n weight_kg: log.weightKg,\n ...(log.heightCm !== undefined ? { height_cm: log.heightCm } : {}),\n note: log.note || '',\n },\n }).pipe(catchError(() => of({ success: true })));\n }\n\n updateLog(\n rowIndex: number,\n patch: { date: string; weightKg: number; heightCm?: number | null; note?: string }\n ): Observable<WeightSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n return this.postToAppsScript({\n action: 'updateWeight',\n row: rowIndex,\n patch: {\n date: patch.date,\n weight_kg: patch.weightKg,\n ...(patch.heightCm !== undefined ? { height_cm: patch.heightCm ?? '' } : {}),\n note: patch.note ?? '',\n },\n }).pipe(catchError(() => of({ success: true })));\n }\n\n deleteLog(rowIndex: number): Observable<WeightSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n return this.postToAppsScript({\n action: 'deleteWeight',\n row: rowIndex,\n }).pipe(catchError(() => of({ success: true })));\n }\n\n private postToAppsScript(body: Record<string, unknown>): Observable<WeightSheetResponse> {\n const url = this.APPS_SCRIPT_URL;\n const useProxy = url.startsWith('/');\n\n if (useProxy) {\n const headers = new HttpHeaders({ 'Content-Type': 'text/plain;charset=UTF-8' });\n return this.http.post<WeightSheetResponse>(url, JSON.stringify(body), { headers });\n }\n\n const payload = JSON.stringify(body);\n return from(\n fetch(url, {\n method: 'POST',\n mode: 'no-cors',\n headers: { 'Content-Type': 'text/plain;charset=utf-8' },\n body: payload,\n redirect: 'follow',\n }).then((): WeightSheetResponse => ({ success: true }))\n );\n }\n\n private parseSheetDate(raw: string): string | null {\n if (!raw) return null;\n const m1 = raw.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (m1) {\n const [, d, mo, y] = m1;\n return `${y}-${mo.padStart(2, '0')}-${d.padStart(2, '0')}`;\n }\n const m2 = raw.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/);\n if (m2) {\n const [, y, mo, d] = m2;\n return `${y}-${mo.padStart(2, '0')}-${d.padStart(2, '0')}`;\n }\n return null;\n }\n\n /** Chuỗi \"4,25\" hoặc \"4.25 kg\" → số */\n private parseWeightKg(raw: string): number | null {\n const s = raw.replace(/,/g, '.').replace(/[^\\d.]/g, '');\n if (!s) return null;\n const n = parseFloat(s);\n return Number.isFinite(n) ? n : null;\n }\n\n /** Chuỗi \"63,5\" hoặc \"63.5cm\" → số cm */\n private parseHeightCm(raw: string): number | null {\n const s = raw.replace(/,/g, '.').replace(/[^\\d.]/g, '');\n if (!s) return null;\n const n = parseFloat(s);\n if (!Number.isFinite(n) || n <= 0) return null;\n if (n < 30 || n > 130) return null;\n return n;\n }\n\n /**\n * Ưu tiên format mới: D=height, E=note.\n * Fallback để đọc dữ liệu cũ: D=note, E=height.\n */\n private resolveHeightAndNote(\n colD: string,\n colE: string\n ): { heightCm: number | null; note: string } {\n const dHeight = this.parseHeightCm(colD);\n const eHeight = this.parseHeightCm(colE);\n\n // Format mới (ưu tiên): D là chiều cao, E là ghi chú.\n if (dHeight !== null) {\n return { heightCm: dHeight, note: colE };\n }\n\n // Format cũ: D là ghi chú, E là chiều cao.\n if (eHeight !== null) {\n return { heightCm: eHeight, note: colD };\n }\n\n // Không có chiều cao: ưu tiên ghi chú ở E (format mới),\n // fallback về D nếu E trống (format cũ).\n if (colE) return { heightCm: null, note: colE };\n return { heightCm: null, note: colD };\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject, signal } from '@angular/core';\nimport { Observable, from, throwError, of } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport { environment } from '../../environments/environment';\n\nexport interface FeedingEventLog {\n user: string;\n /** YYYY-MM-DD */\n date: string;\n /** HH:mm 24h */\n time: string;\n title: string;\n note?: string;\n place?: string;\n acknowledged: boolean;\n rowIndex?: number;\n}\n\nexport interface EventSheetResponse {\n success: boolean;\n rowIndex?: number;\n error?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class EventLogService {\n private http = inject(HttpClient);\n\n private readonly SHEET_ID = environment.googleFeedingSheetId;\n private readonly SHEET_NAME = 'Event';\n private readonly API_KEY = environment.googleSheetsApiKey;\n private readonly BASE_URL = this.SHEET_ID\n ? `https://sheets.googleapis.com/v4/spreadsheets/${this.SHEET_ID}`\n : '';\n\n private readonly APPS_SCRIPT_URL = environment.appsScriptDirect\n ? environment.googleFeedingAppsScriptUrl\n : '/api/feeding-apps-script';\n\n /** Trạng thái dùng chung (tab Lịch + nhắc toàn cục) */\n readonly events = signal<FeedingEventLog[]>([]);\n readonly loading = signal(false);\n\n /**\n * Cột tab Event:\n * A User | B Ngày DD/MM/YYYY | C Giờ HH:mm | D Tên sự kiện | E Ghi chú | F Vị trí | G Acknowledge\n */\n loadEvents(): Observable<FeedingEventLog[]> {\n if (!this.BASE_URL || !this.API_KEY) {\n this.events.set([]);\n return of([]);\n }\n this.loading.set(true);\n const range = `${this.SHEET_NAME}!A2:G`;\n const url = `${this.BASE_URL}/values/${encodeURIComponent(\n range\n )}?key=${this.API_KEY}&valueRenderOption=FORMATTED_VALUE`;\n\n return this.http.get<{ values?: string[][] }>(url).pipe(\n map((resp) => this.mapRows(resp.values || [])),\n tap((rows) => {\n this.events.set(rows);\n this.loading.set(false);\n }),\n catchError((err) => {\n console.error('EventLogService.loadEvents failed', err);\n this.loading.set(false);\n this.events.set([]);\n return throwError(() => err);\n })\n );\n }\n\n addEvent(ev: FeedingEventLog): Observable<EventSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n return this.postToAppsScript({\n action: 'addEvent',\n log: {\n user: ev.user,\n date: ev.date,\n time: ev.time,\n title: ev.title,\n note: ev.note || '',\n place: ev.place || '',\n },\n }).pipe(catchError(() => of({ success: true })));\n }\n\n updateEvent(\n rowIndex: number,\n patch: {\n date: string;\n time: string;\n title: string;\n note?: string;\n place?: string;\n }\n ): Observable<EventSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n return this.postToAppsScript({\n action: 'updateEvent',\n row: rowIndex,\n patch: {\n date: patch.date,\n time: patch.time,\n title: patch.title,\n note: patch.note ?? '',\n place: patch.place ?? '',\n },\n }).pipe(catchError(() => of({ success: true })));\n }\n\n deleteEvent(rowIndex: number): Observable<EventSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n return this.postToAppsScript({\n action: 'deleteEvent',\n row: rowIndex,\n }).pipe(catchError(() => of({ success: true })));\n }\n\n acknowledgeEvent(rowIndex: number): Observable<EventSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n return this.postToAppsScript({\n action: 'acknowledgeEvent',\n row: rowIndex,\n }).pipe(catchError(() => of({ success: true })));\n }\n\n /** ISO `date` + `time` → Date (giờ địa phương). */\n static eventDateTime(ev: FeedingEventLog): Date | null {\n const d = ev.date?.trim();\n const t = ev.time?.trim();\n if (!d || !t) return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(d);\n const tm = /^(\\d{1,2}):(\\d{2})$/.exec(t);\n if (!m || !tm) return null;\n const y = +m[1];\n const mo = +m[2] - 1;\n const day = +m[3];\n const hh = +tm[1];\n const mm = +tm[2];\n const dt = new Date(y, mo, day, hh, mm, 0, 0);\n return isNaN(dt.getTime()) ? null : dt;\n }\n\n private mapRows(rows: string[][]): FeedingEventLog[] {\n return rows\n .map((row, idx) => {\n const rowUser = (row[0] || '').trim();\n const dateStr = (row[1] || '').trim();\n const timeStr = (row[2] || '').trim();\n const title = (row[3] || '').trim();\n const note = (row[4] || '').trim();\n const place = (row[5] || '').trim();\n const ackRaw = row[6];\n\n if (!dateStr || !timeStr || !title) return null;\n\n const date = this.parseSheetDate(dateStr);\n const time = this.normalizeTime(timeStr);\n if (!date) return null;\n\n const ev: FeedingEventLog = {\n user: rowUser.toLowerCase(),\n date,\n time,\n title,\n note: note || undefined,\n place: place || undefined,\n acknowledged: this.parseAck(ackRaw),\n rowIndex: idx + 2,\n };\n return ev;\n })\n .filter((e): e is FeedingEventLog => !!e)\n .sort((a, b) => {\n const ta = EventLogService.eventDateTime(a)?.getTime() ?? 0;\n const tb = EventLogService.eventDateTime(b)?.getTime() ?? 0;\n return ta - tb;\n });\n }\n\n private parseAck(v: unknown): boolean {\n if (v === true || v === 'TRUE') return true;\n const s = String(v ?? '')\n .trim()\n .toLowerCase();\n return s === 'true' || s === 'x' || s === '1' || s === 'yes' || s === 'có';\n }\n\n private postToAppsScript(body: Record<string, unknown>): Observable<EventSheetResponse> {\n const url = this.APPS_SCRIPT_URL;\n const useProxy = url.startsWith('/');\n\n if (useProxy) {\n const headers = new HttpHeaders({ 'Content-Type': 'text/plain;charset=UTF-8' });\n return this.http.post<EventSheetResponse>(url, JSON.stringify(body), { headers });\n }\n\n const payload = JSON.stringify(body);\n return from(\n fetch(url, {\n method: 'POST',\n mode: 'no-cors',\n headers: { 'Content-Type': 'text/plain;charset=utf-8' },\n body: payload,\n redirect: 'follow',\n }).then((): EventSheetResponse => ({ success: true }))\n );\n }\n\n private parseSheetDate(raw: string): string | null {\n if (!raw) return null;\n const m1 = raw.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (m1) {\n const [, d, mo, y] = m1;\n return `${y}-${mo.padStart(2, '0')}-${d.padStart(2, '0')}`;\n }\n const m2 = raw.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/);\n if (m2) {\n const [, y, mo, d] = m2;\n return `${y}-${mo.padStart(2, '0')}-${d.padStart(2, '0')}`;\n }\n return null;\n }\n\n private normalizeTime(raw: string): string {\n const s = String(raw || '').trim();\n const m = /^(\\d{1,2}):(\\d{2})$/.exec(s);\n if (!m) return s;\n const h = Math.min(23, Math.max(0, parseInt(m[1], 10)));\n const min = Math.min(59, Math.max(0, parseInt(m[2], 10)));\n return `${String(h).padStart(2, '0')}:${String(min).padStart(2, '0')}`;\n }\n}\n","import { FeedingLog } from '../../services/feeding-log.service';\n\nexport interface DailySummary {\n date: string;\n total: number;\n count: number;\n avg: number;\n}\n\nexport interface FeedingPrediction {\n hasData: boolean;\n samples: number;\n /** ISO time \"HH:mm\" dự đoán cữ kế tiếp */\n nextTime?: string;\n /** Date object đầy đủ của cữ dự đoán */\n nextAt?: Date;\n /** Dung tích dự đoán (ml, làm tròn 5ml) */\n nextVolume?: number;\n /** Khoảng dung tích tin cậy [low, high] */\n volumeRange?: [number, number];\n /** Phút trung vị giữa các cữ gần đây */\n medianIntervalMinutes?: number;\n /** 'low' | 'medium' | 'high' */\n confidence: 'low' | 'medium' | 'high';\n /** Giải thích ngắn gọn các yếu tố */\n reasoning: string[];\n}\n\nconst MS_PER_MIN = 60_000;\nconst MS_PER_DAY = 86_400_000;\n\n/**\n * Parse \"YYYY-MM-DD\" + \"HH:mm\" → Date object (local timezone)\n */\nfunction toDate(log: FeedingLog): Date {\n const [y, mo, d] = log.date.split('-').map((n) => parseInt(n, 10));\n const [h, mi] = log.time.split(':').map((n) => parseInt(n, 10));\n return new Date(y, (mo || 1) - 1, d || 1, h || 0, mi || 0, 0, 0);\n}\n\nfunction median(nums: number[]): number {\n if (nums.length === 0) return 0;\n const sorted = [...nums].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];\n}\n\nfunction mean(nums: number[]): number {\n return nums.length ? nums.reduce((s, n) => s + n, 0) / nums.length : 0;\n}\n\nfunction stddev(nums: number[]): number {\n if (nums.length < 2) return 0;\n const m = mean(nums);\n const v = mean(nums.map((n) => (n - m) ** 2));\n return Math.sqrt(v);\n}\n\n/** Số phút tính từ 00:00 của ngày đó */\nfunction minuteOfDay(d: Date): number {\n return d.getHours() * 60 + d.getMinutes();\n}\n\n/** Khoảng cách vòng (tính cả đêm) giữa 2 phút-trong-ngày */\nfunction circularDiff(a: number, b: number): number {\n const d = Math.abs(a - b);\n return Math.min(d, 1440 - d);\n}\n\n/**\n * Dự đoán thông minh dung tích dựa vào các cữ tương tự trong tuần qua\n */\nfunction predictVolumeBasedOnSimilarTime(\n sample: { log: FeedingLog; at: Date }[],\n currentMinute: number\n): number | null {\n const oneWeekAgo = Date.now() - 7 * MS_PER_DAY;\n\n // Lọc các cữ trong tuần qua\n const weekSamples = sample.filter((x) => x.at.getTime() >= oneWeekAgo);\n\n if (weekSamples.length < 2) {\n return null; // Không đủ dữ liệu\n }\n\n // Tìm các cữ có thời gian tương tự (sai lệch <= 60 phút)\n const similarFeedings: number[] = [];\n\n for (const feed of weekSamples) {\n const feedMinute = minuteOfDay(feed.at);\n const timeDiff = circularDiff(feedMinute, currentMinute);\n\n // Nếu thời gian tương tự (trong vòng 1 giờ)\n if (timeDiff <= 60) {\n similarFeedings.push(feed.log.volume);\n }\n }\n\n if (similarFeedings.length === 0) {\n return null;\n }\n\n // Loại bỏ các giá trị ngoại lệ (quá nhỏ hoặc quá lớn)\n const sorted = [...similarFeedings].sort((a, b) => a - b);\n const q1Index = Math.floor(sorted.length * 0.25);\n const q3Index = Math.floor(sorted.length * 0.75);\n const q1 = sorted[q1Index];\n const q3 = sorted[q3Index];\n const iqr = q3 - q1;\n\n // Loại bỏ outliers theo quy tắc IQR\n const lowerBound = q1 - 1.5 * iqr;\n const upperBound = q3 + 1.5 * iqr;\n\n const filtered = similarFeedings.filter((vol) => vol >= lowerBound && vol <= upperBound);\n\n if (filtered.length === 0) {\n // Nếu tất cả đều bị loại, dùng lại toàn bộ\n return mean(similarFeedings);\n }\n\n // Trả về trung bình của các giá trị hợp lệ\n return mean(filtered);\n}\n\n/**\n * Predict next feeding time & volume bằng **pattern-matching theo giờ trong ngày**.\n *\n * Ý tưởng: cữ cuối xảy ra lúc T (vd: hôm nay 3:00). Đi tìm các cặp\n * (cữ trước, cữ kế tiếp) trong lịch sử\n * mà \"cữ trước\" có **giờ-trong-ngày gần T**. Lấy median của:\n * - interval → dự đoán GIỜ cữ tiếp theo\n * - volume cữ kế tiếp → dự đoán DUNG TÍCH\n *\n * VD: hôm qua 3:05 bú → 4:10 bú 40ml, hôm kia 2:55 bú → 4:05 bú 45ml.\n * Hôm nay 3:00 vừa bú → pattern gợi ý ~1h5p nữa, ~40ml.\n */\nexport function predictNextFeeding(logs: FeedingLog[], now: Date = new Date()): FeedingPrediction {\n if (!logs || logs.length === 0) {\n return {\n hasData: false,\n samples: 0,\n confidence: 'low',\n reasoning: ['Chưa có dữ liệu để dự đoán.'],\n };\n }\n\n // Sort ascending by timestamp\n const withDates = logs\n .map((l) => ({ log: l, at: toDate(l) }))\n .filter((x) => !isNaN(x.at.getTime()))\n .sort((a, b) => a.at.getTime() - b.at.getTime());\n\n // Chỉ dùng 30 ngày gần nhất cho pattern\n const cutoff = now.getTime() - 30 * MS_PER_DAY;\n const recent = withDates.filter((x) => x.at.getTime() >= cutoff);\n const sample = recent.length >= 4 ? recent : withDates;\n\n if (sample.length < 2) {\n const only = sample[0];\n return {\n hasData: true,\n samples: sample.length,\n nextVolume: only ? Math.round(only.log.volume / 5) * 5 : undefined,\n volumeRange: only ? [only.log.volume, only.log.volume] : undefined,\n confidence: 'low',\n reasoning: [\n `Mới có ${sample.length} cữ bú, chưa đủ để dự đoán giờ. Sẽ tốt hơn sau khi có 4-5 cữ.`,\n ],\n };\n }\n\n const lastFeed = sample[sample.length - 1];\n const lastMinute = minuteOfDay(lastFeed.at);\n\n // ===== 1. BUILD ADJACENT PAIRS =====\n // Mỗi pair: (cữ trước, cữ kế tiếp) — chỉ giữ khi interval nằm 15p..8h\n interface Pair {\n prevMinute: number; // giờ-trong-ngày của cữ trước (phút)\n intervalMin: number; // khoảng thời gian → cữ tiếp theo\n nextVolume: number; // dung tích cữ tiếp theo\n }\n const allPairs: Pair[] = [];\n for (let i = 0; i < sample.length - 1; i++) {\n const prev = sample[i];\n const next = sample[i + 1];\n const iv = (next.at.getTime() - prev.at.getTime()) / MS_PER_MIN;\n if (iv < 15 || iv > 8 * 60) continue;\n allPairs.push({\n prevMinute: minuteOfDay(prev.at),\n intervalMin: iv,\n nextVolume: next.log.volume,\n });\n }\n\n if (allPairs.length === 0) {\n // Không có cặp hợp lệ → fallback tối thiểu\n return {\n hasData: true,\n samples: sample.length,\n nextVolume: Math.round(lastFeed.log.volume / 5) * 5,\n volumeRange: [lastFeed.log.volume, lastFeed.log.volume],\n confidence: 'low',\n reasoning: ['Chưa có cặp cữ liên tiếp trong 8 tiếng để học pattern.'],\n };\n }\n\n // ===== 2. MATCH BY TIME-OF-DAY =====\n // Mở rộng cửa sổ dần nếu không đủ mẫu: ±45p → ±75p → ±120p → full.\n const windows = [45, 75, 120, Infinity];\n let matched: Pair[] = [];\n let usedWindowMin = 0;\n for (const w of windows) {\n matched = allPairs.filter((p) => w === Infinity || circularDiff(p.prevMinute, lastMinute) <= w);\n if (matched.length >= 3 || w === Infinity) {\n usedWindowMin = w === Infinity ? 0 : w;\n break;\n }\n }\n\n // Nếu số match quá ít (<2) ta fallback về allPairs\n if (matched.length < 2) {\n matched = allPairs;\n usedWindowMin = 0;\n }\n\n const intervals = matched.map((p) => p.intervalMin);\n const vols = matched.map((p) => p.nextVolume);\n\n // Kết hợp với EMA toàn cục để tránh bị lệch do cửa sổ hẹp\n const allVolumes = sample.map((x) => x.log.volume);\n let ema = allVolumes[0];\n const alpha = 0.35;\n for (let i = 1; i < allVolumes.length; i++) {\n ema = alpha * allVolumes[i] + (1 - alpha) * ema;\n }\n\n const medIv = median(intervals);\n const medVolMatched = median(vols);\n\n // ===== 3. COMBINE =====\n // Interval: chỉ dựa trên median matched (thuần pattern theo giờ)\n const predictedAt = medIv > 0 ? new Date(lastFeed.at.getTime() + medIv * MS_PER_MIN) : undefined;\n\n // Smart volume prediction: tìm các cữ tương tự trong tuần qua\n const smartVolume = predictVolumeBasedOnSimilarTime(sample, lastMinute);\n\n // Nếu có smart prediction, dùng nó; không thì fallback về logic cũ\n let predictedVolumeRaw: number;\n if (smartVolume !== null) {\n predictedVolumeRaw = smartVolume;\n } else {\n // Volume: trộn 70% pattern + 30% EMA (để không quá bám sample hẹp)\n predictedVolumeRaw = 0.7 * medVolMatched + 0.3 * ema;\n }\n const predictedVolume = Math.max(10, Math.round(predictedVolumeRaw / 5) * 5);\n\n const stdVol = stddev(vols.length >= 2 ? vols : allVolumes);\n const low = Math.max(10, Math.round((predictedVolumeRaw - stdVol) / 5) * 5);\n const high = Math.round((predictedVolumeRaw + stdVol) / 5) * 5;\n\n const stdIv = stddev(intervals);\n const cvIv = medIv > 0 ? stdIv / medIv : 1;\n\n // ===== 4. CONFIDENCE =====\n let confidence: 'low' | 'medium' | 'high' = 'low';\n if (matched.length >= 8 && cvIv < 0.3) confidence = 'high';\n else if (matched.length >= 4 && cvIv < 0.45) confidence = 'medium';\n else confidence = 'low';\n\n // ===== 5. REASONING =====\n const reasoning: string[] = [];\n const lastH = lastFeed.at.getHours().toString().padStart(2, '0');\n const lastM = lastFeed.at.getMinutes().toString().padStart(2, '0');\n if (usedWindowMin > 0) {\n reasoning.push(\n `So khớp ${matched.length} cặp cữ trước–sau có giờ tương tự ${lastH}:${lastM} (±${usedWindowMin}p) trong ${sample.length} cữ gần đây.`\n );\n } else {\n reasoning.push(\n `Dựa trên ${matched.length} cặp cữ trong ${sample.length} cữ gần đây (pattern theo giờ chưa đủ, dùng toàn bộ).`\n );\n }\n if (medIv > 0) {\n const h = Math.floor(medIv / 60);\n const m = Math.round(medIv % 60);\n reasoning.push(`Cữ kế tiếp thường cách khoảng ${h > 0 ? `${h}h ` : ''}${m}p.`);\n }\n if (smartVolume !== null) {\n reasoning.push(\n `Dung tích dự kiến: ${Math.round(smartVolume)}ml (TB các cữ tương tự trong tuần qua, đã loại ngoại lệ).`\n );\n } else {\n reasoning.push(\n `Dung tích trong pattern: ${Math.round(medVolMatched)}ml · EMA toàn cục: ${Math.round(ema)}ml.`\n );\n }\n if (confidence === 'low') {\n reasoning.push('Dữ liệu còn ít/biến động, hãy coi đây là tham khảo.');\n }\n\n const nextTimeStr = predictedAt\n ? `${predictedAt.getHours().toString().padStart(2, '0')}:${predictedAt\n .getMinutes()\n .toString()\n .padStart(2, '0')}`\n : undefined;\n\n return {\n hasData: true,\n samples: matched.length,\n nextTime: nextTimeStr,\n nextAt: predictedAt,\n nextVolume: predictedVolume,\n volumeRange: [low, high],\n medianIntervalMinutes: Math.round(medIv),\n confidence,\n reasoning,\n };\n}\n\n/**\n * Tổng hợp theo ngày cho N ngày gần nhất (bao gồm hôm nay)\n */\nexport function getDailySummaries(\n logs: FeedingLog[],\n days: number,\n now: Date = new Date()\n): DailySummary[] {\n const result: DailySummary[] = [];\n for (let i = days - 1; i >= 0; i--) {\n const d = new Date(now);\n d.setDate(d.getDate() - i);\n const y = d.getFullYear();\n const mo = (d.getMonth() + 1).toString().padStart(2, '0');\n const da = d.getDate().toString().padStart(2, '0');\n const dateStr = `${y}-${mo}-${da}`;\n\n const dayLogs = logs.filter((l) => l.date === dateStr);\n const total = dayLogs.reduce((s, l) => s + l.volume, 0);\n const count = dayLogs.length;\n const avg = count ? Math.round(total / count) : 0;\n\n result.push({ date: dateStr, total, count, avg });\n }\n return result;\n}\n","/**\n * Nutrition target & evaluation based on baby's weight + age.\n *\n * References:\n * - AAP (American Academy of Pediatrics): 150-200 ml/kg/day for <6mo (formula)\n * - WHO: babies regulate intake themselves, but typical formula/mixed ranges\n * - Vietnam MOH pediatric guidelines\n *\n * Disclaimer: These are averages for formula/mixed feeding. EBF babies\n * self-regulate and may differ significantly. Always consult your pediatrician.\n */\n\nexport interface NutritionTarget {\n /** Min dung tích/ngày (ml) */\n dailyMlMin: number;\n /** Max dung tích/ngày (ml) */\n dailyMlMax: number;\n /** Gợi ý ml mỗi cữ (min) */\n perFeedMin: number;\n /** Gợi ý ml mỗi cữ (max) */\n perFeedMax: number;\n /** Số cữ/ngày gợi ý (min) */\n feedsPerDayMin: number;\n /** Số cữ/ngày gợi ý (max) */\n feedsPerDayMax: number;\n /** Hệ số ml/kg/ngày (trung bình) */\n perKgFactor: number;\n ageLabel: string;\n note: string;\n}\n\nexport type NutritionStatus =\n | 'no-data'\n | 'low' // thấp hơn khuyến nghị > 15%\n | 'under' // dưới khoảng khuyến nghị (nhẹ)\n | 'ok' // trong khoảng khuyến nghị\n | 'over' // hơi trên khoảng\n | 'high'; // cao hơn > 15%\n\nexport interface NutritionEvaluation {\n target: NutritionTarget;\n actualMl: number;\n actualCount: number;\n /** % so với trung điểm khoảng khuyến nghị */\n percentOfTarget: number;\n /** % so với min khuyến nghị */\n percentOfMin: number;\n status: NutritionStatus;\n statusLabel: string;\n advice: string;\n /** Dung tích còn cần để đạt min khuyến nghị */\n remainingToMin: number;\n /** Dung tích còn cần để đạt max khuyến nghị */\n remainingToMax: number;\n}\n\n/**\n * So sánh lượng đã bú với tiến độ đều trong ngày (theo thời điểm hiện tại).\n * Giả định phân bổ đều từ 0h → 24h local; KN cả ngày = min–max ml.\n */\nexport interface NutritionPaceInfo {\n /** Phần ngày đã trôi qua (0–1], từ 0h local đến `now` */\n dayFraction: number;\n /** Nếu bú đều theo mức giữa KN cả ngày, đến lúc này kỳ vọng ~bao nhiêu ml */\n expectedMidMl: number;\n expectedMinMl: number;\n expectedMaxMl: number;\n /** 100% ≈ đúng mức trung bình tại thời điểm hiện tại */\n percentOfPaceMid: number;\n paceStatus: 'ahead' | 'on-track' | 'behind';\n}\n\nexport function computeNutritionPace(\n target: NutritionTarget,\n actualMl: number,\n now: Date\n): NutritionPaceInfo {\n const dayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0);\n const elapsedMin = (now.getTime() - dayStart.getTime()) / 60000;\n const dayFraction = Math.min(1, Math.max(elapsedMin / 1440, 1 / 1440));\n\n const mid = (target.dailyMlMin + target.dailyMlMax) / 2;\n const expectedMidMl = Math.round(mid * dayFraction);\n const expectedMinMl = Math.round(target.dailyMlMin * dayFraction);\n const expectedMaxMl = Math.round(target.dailyMlMax * dayFraction);\n\n const percentOfPaceMid = expectedMidMl > 0 ? Math.round((actualMl / expectedMidMl) * 100) : 0;\n\n let paceStatus: NutritionPaceInfo['paceStatus'];\n if (actualMl >= expectedMidMl * 1.12 && dayFraction >= 0.04) {\n paceStatus = 'ahead';\n } else if (actualMl <= expectedMidMl * 0.88) {\n paceStatus = 'behind';\n } else {\n paceStatus = 'on-track';\n }\n\n return {\n dayFraction,\n expectedMidMl,\n expectedMinMl,\n expectedMaxMl,\n percentOfPaceMid,\n paceStatus,\n };\n}\n\n/**\n * Compute recommended daily milk intake based on weight (kg) and age (days).\n *\n * Week 1: linearly ramps up from day 1 (very small) to day 7 (~150ml/kg)\n * - Rule of thumb: day N × 10-15ml per feed × 8-12 feeds\n */\nexport function getNutritionTarget(weightKg: number, ageInDays: number): NutritionTarget | null {\n if (!weightKg || weightKg <= 0 || ageInDays < 0) return null;\n\n let perKgMin = 150;\n let perKgMax = 180;\n let perFeedMin = 60;\n let perFeedMax = 90;\n let feedsPerDayMin = 8;\n let feedsPerDayMax = 12;\n let ageLabel = '';\n let note = '';\n\n if (ageInDays < 7) {\n // Tuần đầu: tăng dần mỗi ngày\n const day = ageInDays + 1; // 1..7\n perKgMin = Math.min(150, 30 + (day - 1) * 20);\n perKgMax = Math.min(180, 50 + (day - 1) * 22);\n perFeedMin = Math.min(60, 10 + (day - 1) * 8);\n perFeedMax = Math.min(90, 20 + (day - 1) * 12);\n feedsPerDayMin = 8;\n feedsPerDayMax = 12;\n ageLabel = `Tuần đầu · ngày ${day}`;\n note = 'Dạ dày bé rất nhỏ, đừng lo nếu bé bú ít. Ưu tiên sữa non/sữa mẹ, bú theo nhu cầu.';\n } else if (ageInDays < 30) {\n perKgMin = 150;\n perKgMax = 180;\n perFeedMin = 60;\n perFeedMax = 120;\n feedsPerDayMin = 8;\n feedsPerDayMax = 10;\n ageLabel = 'Tuần 2-4';\n note = 'Bé nên tăng khoảng 150-200g/tuần. Kiểm tra tã ướt 6+ lần/ngày.';\n } else if (ageInDays < 90) {\n perKgMin = 150;\n perKgMax = 180;\n perFeedMin = 90;\n perFeedMax = 150;\n feedsPerDayMin = 6;\n feedsPerDayMax = 8;\n ageLabel = '1-3 tháng';\n note = 'Bé bắt đầu dài giấc đêm. Bú theo nhu cầu, không ép quá mức.';\n } else if (ageInDays < 180) {\n perKgMin = 130;\n perKgMax = 150;\n perFeedMin = 120;\n perFeedMax = 180;\n feedsPerDayMin = 5;\n feedsPerDayMax = 7;\n ageLabel = '3-6 tháng';\n note = 'Chuẩn bị ăn dặm từ ~6 tháng. Sữa vẫn là nguồn dinh dưỡng chính.';\n } else if (ageInDays < 365) {\n perKgMin = 100;\n perKgMax = 130;\n perFeedMin = 180;\n perFeedMax = 240;\n feedsPerDayMin = 4;\n feedsPerDayMax = 6;\n ageLabel = '6-12 tháng';\n note = 'Kết hợp ăn dặm 2-3 bữa/ngày + sữa. Tổng sữa khoảng 500-800ml/ngày.';\n } else {\n perKgMin = 70;\n perKgMax = 90;\n perFeedMin = 180;\n perFeedMax = 240;\n feedsPerDayMin = 2;\n feedsPerDayMax = 4;\n ageLabel = 'Trên 1 tuổi';\n note = 'Bữa ăn chính là thức ăn đặc, sữa chỉ 2-3 cữ/ngày (500-600ml).';\n }\n\n const dailyMlMin = Math.round(weightKg * perKgMin);\n const dailyMlMax = Math.round(weightKg * perKgMax);\n\n return {\n dailyMlMin,\n dailyMlMax,\n perFeedMin,\n perFeedMax,\n feedsPerDayMin,\n feedsPerDayMax,\n perKgFactor: Math.round((perKgMin + perKgMax) / 2),\n ageLabel,\n note,\n };\n}\n\n/**\n * Evaluate today's feeding progress vs target.\n *\n * Tolerance: ±15% around recommended range is still considered \"ok\" zone.\n */\nexport function evaluateNutrition(\n target: NutritionTarget | null,\n actualMl: number,\n actualCount: number\n): NutritionEvaluation | null {\n if (!target) return null;\n\n const mid = (target.dailyMlMin + target.dailyMlMax) / 2;\n const percentOfTarget = Math.round((actualMl / mid) * 100);\n const percentOfMin = Math.round((actualMl / target.dailyMlMin) * 100);\n\n let status: NutritionStatus;\n let statusLabel: string;\n let advice: string;\n\n if (actualMl === 0 && actualCount === 0) {\n status = 'no-data';\n statusLabel = 'Chưa có dữ liệu';\n advice = `Chưa ghi cữ bú nào hôm nay. Mục tiêu: ${target.dailyMlMin}-${target.dailyMlMax}ml.`;\n } else if (actualMl < target.dailyMlMin * 0.85) {\n status = 'low';\n statusLabel = 'Dưới mức khuyến nghị';\n advice = `Bé đang bú ít hơn khuyến nghị. Cần thêm khoảng ${\n target.dailyMlMin - actualMl\n }ml để đạt mức tối thiểu.`;\n } else if (actualMl < target.dailyMlMin) {\n status = 'under';\n statusLabel = 'Gần đạt mức tối thiểu';\n advice = `Chỉ còn cần ${target.dailyMlMin - actualMl}ml nữa là đạt mức khuyến nghị tối thiểu.`;\n } else if (actualMl <= target.dailyMlMax) {\n status = 'ok';\n statusLabel = 'Phù hợp với khuyến nghị';\n advice = `Bé đang bú trong khoảng khuyến nghị. Rất tốt!`;\n } else if (actualMl <= target.dailyMlMax * 1.15) {\n status = 'over';\n statusLabel = 'Hơi cao hơn khuyến nghị';\n advice =\n 'Bé bú hơi nhiều hơn khuyến nghị. Không đáng lo nếu bé không bị trớ/nôn, nhưng có thể giãn cữ ra một chút.';\n } else {\n status = 'high';\n statusLabel = 'Cao hơn khuyến nghị nhiều';\n advice =\n 'Bé bú vượt khuyến nghị khá nhiều. Theo dõi dấu hiệu quá tải: nôn trớ, đầy bụng. Có thể đang tăng trưởng bứt phá.';\n }\n\n return {\n target,\n actualMl,\n actualCount,\n percentOfTarget,\n percentOfMin,\n status,\n statusLabel,\n advice,\n remainingToMin: Math.max(0, target.dailyMlMin - actualMl),\n remainingToMax: Math.max(0, target.dailyMlMax - actualMl),\n };\n}\n\n/**\n * Đánh giá 1 cữ bú đơn lẻ so với gợi ý per-feed\n */\nexport function evaluateSingleFeed(\n target: NutritionTarget | null,\n volumeMl: number\n): { status: NutritionStatus; label: string } | null {\n if (!target) return null;\n if (volumeMl < target.perFeedMin * 0.6) {\n return { status: 'low', label: 'Cữ khá ít' };\n }\n if (volumeMl < target.perFeedMin) {\n return { status: 'under', label: 'Cữ hơi ít' };\n }\n if (volumeMl <= target.perFeedMax) {\n return { status: 'ok', label: 'Cữ phù hợp' };\n }\n if (volumeMl <= target.perFeedMax * 1.3) {\n return { status: 'over', label: 'Cữ hơi nhiều' };\n }\n return { status: 'high', label: 'Cữ nhiều' };\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n computeNutritionPace,\n evaluateNutrition,\n NutritionEvaluation,\n NutritionPaceInfo,\n NutritionTarget,\n} from '../feeding-nutrition';\n\nexport interface NutritionTodayStats {\n total: number;\n count: number;\n typicalFeedMl: number;\n}\n\nfunction nutritionPaceLabelFromStatus(status: NutritionPaceInfo['paceStatus']): string {\n switch (status) {\n case 'ahead':\n return 'Nhanh hơn mức trung bình hiện tại';\n case 'on-track':\n return 'Đúng mức trung bình hiện tại';\n case 'behind':\n default:\n return 'Chậm hơn mức trung bình hiện tại';\n }\n}\n\nfunction metricMetUi(s: 'met' | 'partial' | 'unmet'): {\n title: string;\n icon: string;\n} {\n switch (s) {\n case 'met':\n return { title: 'Đã đáp ứng', icon: 'pi-check-circle' };\n case 'partial':\n return { title: 'Gần đạt', icon: 'pi-check-circle' };\n case 'unmet':\n default:\n return { title: 'Chưa đáp ứng', icon: 'pi-times-circle' };\n }\n}\n\n@Component({\n selector: 'app-feeding-nutrition',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './feeding-nutrition.component.html',\n styleUrls: ['./feeding-nutrition.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedingNutritionComponent {\n nutritionTarget = input<NutritionTarget | null>(null);\n todayStats = input<NutritionTodayStats>({\n total: 0,\n count: 0,\n typicalFeedMl: 0,\n });\n now = input<Date>(new Date());\n latestWeightKg = input<number | undefined>(undefined);\n editing = input(false);\n\n goToWeight = output<void>();\n\n nutritionEval = computed<NutritionEvaluation | null>(() => {\n const target = this.nutritionTarget();\n if (!target) return null;\n const today = this.todayStats();\n return evaluateNutrition(target, today.total, today.count);\n });\n\n nutritionPace = computed<(NutritionPaceInfo & { paceLabelVi: string }) | null>(() => {\n const target = this.nutritionTarget();\n if (!target) return null;\n const p = computeNutritionPace(target, this.todayStats().total, this.now());\n return { ...p, paceLabelVi: nutritionPaceLabelFromStatus(p.paceStatus) };\n });\n\n nutritionMetricsStatus = computed<{\n mlPerKg: 'met' | 'partial' | 'unmet';\n perFeed: 'met' | 'partial' | 'unmet';\n remaining: 'met' | 'partial' | 'unmet';\n mlPerKgTitle: string;\n mlPerKgIcon: string;\n perFeedTitle: string;\n perFeedIcon: string;\n remainingTitle: string;\n remainingIcon: string;\n mlPerKgValue: number;\n mlPerKgMin: number;\n mlPerKgMax: number;\n perFeedValue: number;\n perFeedMin: number;\n perFeedMax: number;\n remainingPrimary: string;\n remainingSecondary: string;\n } | null>(() => {\n const ev = this.nutritionEval();\n const weightKg = this.latestWeightKg();\n if (!ev || !weightKg || weightKg <= 0) return null;\n\n const today = this.todayStats();\n const t = ev.target;\n const count = today.count || 0;\n const typicalMl = today.typicalFeedMl || 0;\n const totalMl = today.total || 0;\n\n const mlPerKgValue = count > 0 ? Math.round(totalMl / weightKg) : 0;\n const mlPerKgMin = Math.round(t.dailyMlMin / weightKg);\n const mlPerKgMax = Math.round(t.dailyMlMax / weightKg);\n\n let mlPerKg: 'met' | 'partial' | 'unmet' = 'unmet';\n if (count === 0) {\n mlPerKg = 'unmet';\n } else if (mlPerKgValue >= mlPerKgMin && mlPerKgValue <= mlPerKgMax) {\n mlPerKg = 'met';\n } else if (mlPerKgValue >= mlPerKgMin * 0.85 && mlPerKgValue <= mlPerKgMax * 1.12) {\n mlPerKg = 'partial';\n }\n\n let perFeed: 'met' | 'partial' | 'unmet' = 'unmet';\n if (count === 0) {\n perFeed = 'unmet';\n } else if (typicalMl >= t.perFeedMin && typicalMl <= t.perFeedMax) {\n perFeed = 'met';\n } else if (typicalMl >= t.perFeedMin * 0.78 && typicalMl <= t.perFeedMax * 1.22) {\n perFeed = 'partial';\n }\n\n let remaining: 'met' | 'partial' | 'unmet' = 'unmet';\n let remainingPrimary = 'Chưa có cữ';\n let remainingSecondary = `Mục tiêu tối thiểu ${ev.target.dailyMlMin}ml`;\n\n if (count > 0) {\n if (ev.remainingToMin > 0) {\n const feedSize = Math.max(typicalMl, t.perFeedMin, 1);\n const feedsLeft = Math.max(1, Math.ceil(ev.remainingToMin / feedSize));\n remainingPrimary = `${ev.remainingToMin}ml nữa`;\n remainingSecondary = `~${feedsLeft} cữ để đạt mức tối thiểu`;\n remaining = ev.remainingToMin > t.dailyMlMin * 0.25 ? 'unmet' : 'partial';\n } else if (ev.actualMl > ev.target.dailyMlMax) {\n remainingPrimary = `+${ev.actualMl - ev.target.dailyMlMax}ml`;\n remainingSecondary = 'Vượt mức tối đa khuyến nghị';\n remaining = 'partial';\n } else if (ev.remainingToMax > 0) {\n remainingPrimary = 'Đã đủ min';\n remainingSecondary = `Còn có thể bú thêm ${ev.remainingToMax}ml`;\n remaining = 'met';\n } else {\n remainingPrimary = 'Đã đạt mức max';\n remainingSecondary = 'Theo dõi dấu hiệu no';\n remaining = 'met';\n }\n }\n\n const mlUi = metricMetUi(mlPerKg);\n const feedUi = metricMetUi(perFeed);\n const remUi = metricMetUi(remaining);\n\n return {\n mlPerKg,\n perFeed,\n remaining,\n mlPerKgTitle: mlUi.title,\n mlPerKgIcon: mlUi.icon,\n perFeedTitle: feedUi.title,\n perFeedIcon: feedUi.icon,\n remainingTitle: remUi.title,\n remainingIcon: remUi.icon,\n mlPerKgValue,\n mlPerKgMin,\n mlPerKgMax,\n perFeedValue: typicalMl,\n perFeedMin: t.perFeedMin,\n perFeedMax: t.perFeedMax,\n remainingPrimary,\n remainingSecondary,\n };\n });\n\n nutritionZones = computed(() => {\n const ev = this.nutritionEval();\n if (!ev) return null;\n const min = ev.target.dailyMlMin;\n const max = ev.target.dailyMlMax;\n const scaleMax = Math.max(max * 1.2, ev.actualMl + 10);\n const roundedMax = Math.round(scaleMax);\n const pointerPct = Math.max(0, Math.min(100, (ev.actualMl / roundedMax) * 100));\n const pointerVisPct = pointerPct < 5 ? 5 : pointerPct > 95 ? 95 : pointerPct;\n return {\n minLabel: min,\n maxLabel: max,\n scaleMax: roundedMax,\n pointerPct,\n pointerVisPct,\n };\n });\n\n nutritionPaceZones = computed(() => {\n const ev = this.nutritionEval();\n const pace = this.nutritionPace();\n if (!ev || !pace) return null;\n const min = pace.expectedMinMl;\n const max = pace.expectedMaxMl;\n const actual = ev.actualMl;\n const scaleMax = Math.max(Math.round(max * 1.2), actual + 20, Math.max(min + 30, 50));\n const pointerPct = Math.max(0, Math.min(100, (actual / scaleMax) * 100));\n const pointerVisPct = pointerPct < 5 ? 5 : pointerPct > 95 ? 95 : pointerPct;\n const bandLeft = (min / scaleMax) * 100;\n const bandW = ((max - min) / scaleMax) * 100;\n const minTickPct = Math.max(0, Math.min(100, (min / scaleMax) * 100));\n const maxTickPct = Math.max(0, Math.min(100, (max / scaleMax) * 100));\n return {\n minLabel: min,\n maxLabel: max,\n scaleMax,\n bandLeftPct: Math.max(0, Math.min(100, bandLeft)),\n bandWidthPct: Math.max(0, Math.min(100 - bandLeft, bandW)),\n minTickPct,\n maxTickPct,\n pointerPct,\n pointerVisPct,\n paceStatus: pace.paceStatus,\n };\n });\n\n formatWeightKg(kg: number | undefined): string {\n if (kg === undefined || !Number.isFinite(kg) || kg <= 0) return '';\n return new Intl.NumberFormat('vi-VN', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n }).format(kg);\n }\n\n onGoToWeight(): void {\n this.goToWeight.emit();\n }\n}\n","<!-- ============ NUTRITION EVALUATION ============ -->\n@if (nutritionEval(); as ev) {\n <section class=\"card nutri-card\" [attr.data-status]=\"ev.status\">\n <header class=\"nutri-head\">\n <span class=\"nutri-head__icon\" aria-hidden=\"true\">\n <i class=\"pi pi-heart-fill\"></i>\n </span>\n <div class=\"nutri-head__text\">\n <div class=\"eyebrow\">Dinh dưỡng hôm nay</div>\n <h2>{{ ev.target.ageLabel }}</h2>\n <div class=\"nutri-head__meta\">\n @if (latestWeightKg(); as w) {\n <span> {{ formatWeightKg(w) }} kg </span>\n }\n @if (latestWeightKg()) {\n <span class=\"sep\">·</span>\n }\n <span> KN {{ ev.target.dailyMlMin }}–{{ ev.target.dailyMlMax }} ml </span>\n </div>\n </div>\n <div class=\"nutri-badge\" [attr.data-status]=\"ev.status\">\n {{ ev.statusLabel }}\n </div>\n </header>\n <!-- Hero: big progress bar with recommended range -->\n @if (nutritionZones(); as z) {\n <div class=\"nutri-hero\">\n <div class=\"nutri-hero__top\">\n <div class=\"nutri-hero__lead\">\n <span class=\"h-label\"> <i class=\"pi pi-bolt\"></i> Đã nạp hôm nay </span>\n <div class=\"h-value\">\n {{ ev.actualMl }}<em>ml</em>\n <small>· {{ ev.actualCount }} cữ</small>\n </div>\n </div>\n @if (nutritionPace(); as p) {\n <div class=\"nutri-hero__stats\">\n <div class=\"nutri-hero__pct\" [attr.data-status]=\"ev.status\">\n {{ ev.percentOfTarget }}%\n <span>so với KN cả ngày</span>\n </div>\n <div\n class=\"nutri-hero__pct nutri-hero__pct--pace\"\n [attr.data-pace]=\"p.paceStatus\"\n [title]=\"p.paceLabelVi\"\n >\n {{ p.percentOfPaceMid }}%\n <span>tiến độ hiện tại</span>\n </div>\n </div>\n }\n </div>\n @if (nutritionPace(); as pn) {\n <p class=\"nutri-hero__pace-note\">\n <i class=\"pi pi-clock\"></i>\n Đã qua {{ pn.dayFraction * 100 | number: '1.0-0' }}% ngày • Dự kiến:\n <strong>{{ pn.expectedMidMl }}ml</strong> •\n <em>{{ pn.paceLabelVi }}</em>\n </p>\n }\n <div class=\"nutri-bar-stack\">\n <div class=\"nutri-bar nutri-bar--daily\" [attr.data-status]=\"ev.status\">\n <p class=\"nutri-bar__title\">KN cả ngày</p>\n <div class=\"nutri-bar__track-area\">\n <div class=\"nb-track\">\n <div\n class=\"nb-range\"\n [style.left.%]=\"(z.minLabel / z.scaleMax) * 100\"\n [style.width.%]=\"((z.maxLabel - z.minLabel) / z.scaleMax) * 100\"\n ></div>\n <div\n class=\"nb-fill\"\n [attr.data-status]=\"ev.status\"\n [style.width.%]=\"z.pointerVisPct\"\n ></div>\n <div\n class=\"nb-tick nb-tick--min\"\n [style.left.%]=\"(z.minLabel / z.scaleMax) * 100\"\n ></div>\n <div\n class=\"nb-tick nb-tick--max\"\n [style.left.%]=\"(z.maxLabel / z.scaleMax) * 100\"\n ></div>\n <div class=\"nb-pointer\" [style.left.%]=\"z.pointerVisPct\">\n <span class=\"nb-pointer__pill\">{{ ev.actualMl }}ml</span>\n <span class=\"nb-pointer__stem\"></span>\n </div>\n </div>\n <div class=\"nb-legend\">\n <span class=\"nb-legend__edge\">0</span>\n <span class=\"nb-legend__kn\">\n KN <strong>{{ z.minLabel }}–{{ z.maxLabel }}</strong> ml\n </span>\n <span class=\"nb-legend__edge\">{{ z.scaleMax }} ml</span>\n </div>\n </div>\n </div>\n @if (nutritionPaceZones(); as zp) {\n <div class=\"nutri-bar nutri-bar--pace\" [attr.data-pace]=\"zp.paceStatus\">\n <p class=\"nutri-bar__title\">Tiến độ hiện tại</p>\n <div class=\"nutri-bar__track-area\">\n <div class=\"nb-track nb-track--pace\">\n <div\n class=\"nb-range\"\n [style.left.%]=\"zp.bandLeftPct\"\n [style.width.%]=\"zp.bandWidthPct\"\n ></div>\n <div\n class=\"nb-fill nb-fill--pace\"\n [attr.data-pace]=\"zp.paceStatus\"\n [style.width.%]=\"zp.pointerVisPct\"\n ></div>\n <div class=\"nb-tick nb-tick--min\" [style.left.%]=\"zp.minTickPct\"></div>\n <div class=\"nb-tick nb-tick--max\" [style.left.%]=\"zp.maxTickPct\"></div>\n <div class=\"nb-pointer nb-pointer--pace\" [style.left.%]=\"zp.pointerVisPct\">\n <span class=\"nb-pointer__pill\">{{ ev.actualMl }}ml</span>\n <span class=\"nb-pointer__stem\"></span>\n </div>\n </div>\n <div class=\"nb-legend\">\n <span class=\"nb-legend__edge\">0</span>\n <span class=\"nb-legend__kn\">\n KV <strong>{{ zp.minLabel }}–{{ zp.maxLabel }}</strong> ml\n </span>\n <span class=\"nb-legend__edge\">{{ zp.scaleMax }} ml</span>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Facts -->\n <div class=\"nutri-facts\">\n <div class=\"fact\">\n <span class=\"fact-label\"> <i class=\"pi pi-compass\"></i> Khuyến nghị/ngày </span>\n <strong class=\"fact-value\">\n {{ ev.target.dailyMlMin }}<em>–</em>{{ ev.target.dailyMlMax }}<em>ml</em>\n </strong>\n <span class=\"fact-sub\"> {{ ev.target.perKgFactor }} ml/kg/ngày </span>\n </div>\n @if (ev.remainingToMin > 0) {\n <div class=\"fact\">\n <span class=\"fact-label warn\"> <i class=\"pi pi-arrow-circle-down\"></i> Còn thiếu </span>\n <strong class=\"fact-value warn\"> {{ ev.remainingToMin }}<em>ml</em> </strong>\n <span class=\"fact-sub\">để đạt mức tối thiểu</span>\n </div>\n }\n @if (ev.remainingToMin === 0 && ev.remainingToMax > 0) {\n <div class=\"fact\">\n <span class=\"fact-label ok\"> <i class=\"pi pi-check-circle\"></i> Còn có thể bú </span>\n <strong class=\"fact-value ok\"> {{ ev.remainingToMax }}<em>ml</em> </strong>\n <span class=\"fact-sub\">tới mức tối đa khuyến nghị</span>\n </div>\n }\n @if (ev.actualMl > ev.target.dailyMlMax) {\n <div class=\"fact\">\n <span class=\"fact-label over\">\n <i class=\"pi pi-arrow-circle-up\"></i> Vượt mức tối đa\n </span>\n <strong class=\"fact-value over\">\n +{{ ev.actualMl - ev.target.dailyMlMax }}<em>ml</em>\n </strong>\n <span class=\"fact-sub\">theo dõi dấu hiệu đầy bụng</span>\n </div>\n }\n </div>\n <!-- Metric chips -->\n @if (nutritionMetricsStatus(); as ms) {\n <div class=\"nutri-metrics-wrap\">\n <p class=\"nutri-metrics__heading\">\n <i class=\"pi pi-sliders-h\"></i>\n Chỉ số hữu ích hôm nay\n </p>\n <ul class=\"nutri-metrics\">\n <li [attr.data-met]=\"ms.mlPerKg\">\n <span class=\"m-icon mint\" aria-hidden=\"true\"><i class=\"pi pi-chart-bar\"></i></span>\n <div class=\"m-body\">\n @if (todayStats().count > 0) {\n <strong> {{ ms.mlPerKgValue }} ml/kg </strong>\n } @else {\n <strong>— ml/kg</strong>\n }\n <span>KN {{ ms.mlPerKgMin }}–{{ ms.mlPerKgMax }} ml/kg/ngày</span>\n </div>\n <span class=\"m-status\" [attr.data-met]=\"ms.mlPerKg\" [title]=\"ms.mlPerKgTitle\">\n <i class=\"pi\" [ngClass]=\"ms.mlPerKgIcon\"></i>\n </span>\n </li>\n <li [attr.data-met]=\"ms.perFeed\">\n <span class=\"m-icon lavender\" aria-hidden=\"true\"><i class=\"pi pi-circle\"></i></span>\n <div class=\"m-body\">\n @if (todayStats().count > 0) {\n <strong> {{ ms.perFeedValue }}ml/cữ </strong>\n } @else {\n <strong>Chưa có cữ</strong>\n }\n <span>Gợi ý {{ ms.perFeedMin }}–{{ ms.perFeedMax }}ml mỗi cữ</span>\n </div>\n <span class=\"m-status\" [attr.data-met]=\"ms.perFeed\" [title]=\"ms.perFeedTitle\">\n <i class=\"pi\" [ngClass]=\"ms.perFeedIcon\"></i>\n </span>\n </li>\n <li [attr.data-met]=\"ms.remaining\">\n <span class=\"m-icon peach\" aria-hidden=\"true\"><i class=\"pi pi-flag\"></i></span>\n <div class=\"m-body\">\n <strong>{{ ms.remainingPrimary }}</strong>\n <span>{{ ms.remainingSecondary }}</span>\n </div>\n <span class=\"m-status\" [attr.data-met]=\"ms.remaining\" [title]=\"ms.remainingTitle\">\n <i class=\"pi\" [ngClass]=\"ms.remainingIcon\"></i>\n </span>\n </li>\n </ul>\n </div>\n }\n <!-- Advice banner -->\n <div class=\"nutri-advice\" [attr.data-status]=\"ev.status\">\n <span class=\"adv-icon\">\n <i\n class=\"pi\"\n [class.pi-check-circle]=\"ev.status === 'ok'\"\n [class.pi-info-circle]=\"ev.status === 'under' || ev.status === 'no-data'\"\n [class.pi-exclamation-circle]=\"ev.status === 'low' || ev.status === 'high'\"\n [class.pi-arrow-circle-up]=\"ev.status === 'over'\"\n ></i>\n </span>\n <span class=\"adv-text\">{{ ev.advice }}</span>\n </div>\n <div class=\"nutri-note\">\n <i class=\"pi pi-info-circle\"></i>\n <span>{{ ev.target.note }}</span>\n </div>\n </section>\n}\n\n<!-- Chưa có cân từ tab Weight → chưa đánh giá dinh dưỡng -->\n@if (!latestWeightKg() && !editing()) {\n <section class=\"card nutrition-empty\">\n <div class=\"empty-head\">\n <i class=\"pi pi-info-circle\"></i>\n <div>\n <h3>Ghi cân ở tab Thể trạng để đánh giá dinh dưỡng</h3>\n <p>\n Khối lượng dùng cho mục dinh dưỡng lấy từ\n <strong>lần cân mới nhất</strong> trên sheet Weight (theo ngày ghi). Cột user chỉ để biết\n ai đã log. Công thức <strong>ml/kg/ngày</strong> theo tuổi và chuẩn tham khảo.\n </p>\n </div>\n <button type=\"button\" class=\"btn primary\" (click)=\"onGoToWeight()\">\n <i class=\"pi pi-chart-line\"></i> Mở tab Thể trạng\n </button>\n </div>\n </section>\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable, from, of, throwError } from 'rxjs';\nimport { catchError, map, mergeMap, scan, switchMap, takeLast } from 'rxjs/operators';\nimport { environment } from '../../environments/environment';\n\nexport type ExplorerType = 'folder' | 'file';\n\nexport interface ExplorerEntry {\n id: number;\n name: string;\n type: ExplorerType;\n /** null = không có cha (chỉ có root) */\n parentId: number | null;\n /** base64 data URL cho file. Folder thì để trống. */\n content?: string;\n /** Google Drive file id (nếu đã migrate/saved qua Drive). */\n driveFileId?: string;\n /** MIME type gốc (image/jpeg, application/pdf...). */\n mimeType?: string;\n /** Trạng thái lưu trữ: sheet (legacy) | drive | migrated | migration_failed. */\n storageStatus?: string;\n /** Ảnh preview đã fetch lazy qua Apps Script, ưu tiên hiển thị hơn content legacy. */\n previewUrl?: string;\n /** ISO timestamp khi entry được tạo trong sheet (server-side stamp). */\n createdAt?: string;\n /**\n * Kích thước file (byte) — ước lượng từ độ dài base64 sau khi đã trừ\n * phần header `data:image/...;base64,`. base64 gấp ~4/3 lần binary nên\n * `bytes ≈ encodedLen * 3/4`. Folder = 0.\n */\n sizeBytes?: number;\n /** Row trong sheet (1-based, header = row 1) — chỉ có khi load từ sheet */\n rowIndex?: number;\n\n // Loading states for UI\n /** Đang loading preview/content từ Drive */\n isLoading?: boolean;\n /** Lỗi khi load preview/content */\n loadError?: boolean;\n}\n\nexport interface ExplorerResponse {\n success: boolean;\n entries?: ExplorerEntry[];\n entry?: ExplorerEntry;\n id?: number;\n error?: string;\n}\n\nexport interface ExplorerFileResponse {\n success: boolean;\n name?: string;\n mimeType?: string;\n sizeBytes?: number;\n dataUrl?: string;\n error?: string;\n}\n\nexport interface ExplorerMigrationResponse {\n success: boolean;\n migratedCount?: number;\n migratedFolders?: number;\n migratedFiles?: number;\n failedCount?: number;\n hasMore?: boolean;\n error?: string;\n}\n\n/**\n * ExplorerService (Drive-first):\n * - Cây thư mục và file metadata đọc qua Apps Script action `getExplorer`.\n * - Binary file lưu private trong Google Drive (account B), Apps Script account A làm proxy.\n * - Không phụ thuộc tab `Explorer` trong Google Sheet sau khi finalize migration.\n *\n * Toàn bộ service bị vô hiệu hoá khi `environment.enableExplorer === false`.\n * Các method read trả về empty observable; write method trả về no-op success.\n * Không có request nào được gửi đi khi feature bị tắt.\n */\n@Injectable({ providedIn: 'root' })\nexport class ExplorerService {\n private http = inject(HttpClient);\n\n private readonly APPS_SCRIPT_URL = environment.appsScriptDirect\n ? environment.googleFeedingAppsScriptUrl\n : '/api/feeding-apps-script';\n\n /** True when the Explorer feature is active (controlled by NG_APP_ENABLE_EXPLORER). */\n readonly isEnabled = environment.enableExplorer;\n\n getEntries(): Observable<ExplorerEntry[]> {\n if (!this.isEnabled) return of([]);\n return this.postToAppsScriptExpectResponse<ExplorerResponse>({\n action: 'getExplorer',\n }).pipe(\n map((resp) => {\n if (!resp?.success) {\n throw new Error(resp?.error || 'Không tải được danh sách Explorer');\n }\n return (resp.entries || [])\n .map((entry) => this.normalizeEntry(entry))\n .filter((entry): entry is ExplorerEntry => !!entry);\n })\n );\n }\n\n private parseDriveFileId(raw: unknown): string {\n const s = String(raw || '').trim();\n if (!s) return '';\n // Drive file id thường >= 20 ký tự gồm chữ/số/_/-\n if (!/^[A-Za-z0-9_-]{20,}$/.test(s)) return '';\n return s;\n }\n\n private parseMimeType(raw: unknown): string {\n const s = String(raw || '')\n .trim()\n .toLowerCase();\n if (!s || !s.includes('/')) return '';\n return s;\n }\n\n private parseSize(raw: unknown): number {\n if (raw === undefined || raw === null || raw === '') return 0;\n const n = Number(raw);\n if (!Number.isFinite(n) || n <= 0) return 0;\n return Math.round(n);\n }\n\n private parseStorageStatus(raw: unknown): string {\n const s = String(raw || '')\n .trim()\n .toLowerCase();\n if (!s) return '';\n return s;\n }\n\n private normalizeEntry(entry: ExplorerEntry): ExplorerEntry | null {\n const id = Number(entry?.id);\n const type = String(entry?.type || '').toLowerCase();\n const name = String(entry?.name || '').trim();\n if (!id || !name) return null;\n if (type !== 'folder' && type !== 'file') return null;\n const content = type === 'file' ? String(entry?.content || '') : undefined;\n return {\n id,\n name,\n type: type as ExplorerType,\n parentId: this.toParentId(entry?.parentId),\n content: content || undefined,\n driveFileId: this.parseDriveFileId(entry?.driveFileId),\n mimeType: this.parseMimeType(entry?.mimeType),\n storageStatus: this.parseStorageStatus(entry?.storageStatus),\n createdAt: entry?.createdAt ? String(entry.createdAt) : undefined,\n sizeBytes: this.parseSize(entry?.sizeBytes),\n rowIndex: this.parseSize(entry?.rowIndex) || undefined,\n };\n }\n\n private toParentId(raw: unknown): number | null {\n if (raw === null || raw === undefined || raw === '') return null;\n const n = Number(raw);\n return Number.isFinite(n) && n > 0 ? Math.round(n) : null;\n }\n\n addEntry(payload: {\n name: string;\n type: ExplorerType;\n parentId: number;\n content?: string;\n mimeType?: string;\n sizeBytes?: number;\n }): Observable<ExplorerResponse> {\n return this.postToAppsScript({\n action: 'addExplorer',\n entry: {\n name: payload.name,\n type: payload.type,\n parent_id: payload.parentId,\n content: payload.type === 'file' ? payload.content || '' : '',\n mimeType: payload.mimeType || '',\n sizeBytes: payload.sizeBytes || 0,\n },\n });\n }\n\n /**\n * Update tên (folder/file) hoặc nội dung (file). KHÔNG cho đổi `type` hoặc\n * `parent_id` — nếu cần thì xoá rồi thêm mới.\n */\n updateEntry(\n id: number,\n patch: { name?: string; content?: string; mimeType?: string; sizeBytes?: number }\n ): Observable<ExplorerResponse> {\n return this.postToAppsScript({\n action: 'updateExplorer',\n id,\n patch: {\n name: patch.name,\n content: patch.content,\n mimeType: patch.mimeType,\n sizeBytes: patch.sizeBytes,\n },\n });\n }\n\n /**\n * **Soft delete** entry. Server set cột `isDeleted=TRUE` thay vì xoá row\n * vật lý → có thể restore thủ công bằng cách đổi cột G về `FALSE` trong\n * Google Sheets. Nếu là folder, server cascade soft-delete toàn bộ con\n * cháu trong cùng một call.\n *\n * Phía client không cần biết khác biệt: getEntries() đã filter sẵn các\n * row đã xoá nên UI thấy biến mất ngay.\n */\n deleteEntry(id: number): Observable<ExplorerResponse> {\n return this.postToAppsScript({\n action: 'deleteExplorer',\n id,\n });\n }\n\n /**\n * Chuyển một mảng file (chỉ file, folder sẽ bị server bỏ qua) sang\n * folder cha mới. Dùng cho thao tác cut & paste nhiều file 1 lần.\n *\n * `parentId` phải là folder đã tồn tại. Server validate.\n */\n moveEntries(ids: number[], parentId: number): Observable<ExplorerResponse> {\n return this.postToAppsScript({\n action: 'moveExplorer',\n ids,\n parentId,\n });\n }\n\n /**\n * Upload ảnh medical lên Google Drive thông qua addExplorer.\n * Trả về thông tin file bao gồm driveFileId.\n */\n uploadMedicalImageToDrive(payload: {\n fileName: string;\n dataUrl: string;\n mimeType: string;\n sizeBytes: number;\n parentId: number;\n }): Observable<ExplorerResponse & { driveFileId?: string }> {\n return this.addEntry({\n name: payload.fileName,\n type: 'file',\n parentId: payload.parentId,\n content: payload.dataUrl,\n mimeType: payload.mimeType,\n sizeBytes: payload.sizeBytes,\n }).pipe(\n switchMap((response) => {\n if (!response.success || !response.id) {\n throw new Error('Upload thất bại');\n }\n\n // Lấy thông tin entry vừa tạo để có driveFileId\n return this.getEntries().pipe(\n map((entries) => {\n const createdEntry = entries.find((e) => e.id === response.id);\n return {\n ...response,\n driveFileId: createdEntry?.driveFileId,\n };\n })\n );\n })\n );\n }\n\n /**\n * Lấy nội dung file (data URL) qua Apps Script action `getExplorerFile`.\n * Dùng cho preview/download khi file đã chuyển sang Drive private.\n * Bây giờ có thể nhận cả Explorer ID hoặc Drive file ID.\n */\n getFileDataUrl(id: number | string): Observable<ExplorerFileResponse> {\n if (!this.isEnabled) return of({ success: false, error: 'Explorer disabled' });\n const body: { action: string; driveFileId?: string; id?: number } = {\n action: 'getExplorerFile',\n };\n\n // Nếu là string và không phải số, coi như driveFileId\n if (typeof id === 'string' && !/^\\d+$/.test(id)) {\n body.driveFileId = id;\n } else {\n body.id = typeof id === 'string' ? parseInt(id, 10) : id;\n }\n\n return this.postToAppsScriptExpectResponse<ExplorerFileResponse>(body).pipe(\n map((resp) => {\n if (!resp?.success) {\n throw new Error(resp?.error || 'Không lấy được nội dung file');\n }\n return resp;\n })\n );\n }\n\n /**\n * Lấy nội dung nhiều file song song để tối ưu hiệu suất.\n * Trả về Map<id, ExplorerFileResponse> để dễ dàng map với entry tương ứng.\n */\n getMultipleFileDataUrls(ids: number[]): Observable<Map<number, ExplorerFileResponse>> {\n if (!this.isEnabled || ids.length === 0) {\n return of(new Map());\n }\n\n // Tạo observable cho từng file\n const requests = ids.map((id) =>\n this.getFileDataUrl(id).pipe(\n map((response) => ({ id, response })),\n catchError((error) => {\n console.warn(`Failed to load file ${id}:`, error);\n return of({ id, response: null });\n })\n )\n );\n\n // Chạy song song và merge results\n return from(requests).pipe(\n mergeMap((request) => request, 5), // Giới hạn 5 requests đồng thời để tránh quá tải\n scan((acc, { id, response }) => {\n if (response) {\n acc.set(id, response);\n }\n return acc;\n }, new Map<number, ExplorerFileResponse>()),\n takeLast(1) // Chỉ lấy kết quả cuối cùng khi tất cả đã hoàn thành\n );\n }\n\n migrateExplorerToDrive(payload?: {\n destinationFolderId?: string;\n limit?: number;\n startAfterId?: number;\n }): Observable<ExplorerMigrationResponse> {\n return this.postToAppsScriptExpectResponse<ExplorerMigrationResponse>({\n action: 'migrateExplorerToDrive',\n ...payload,\n });\n }\n\n deleteExplorerSheetAfterMigration(): Observable<ExplorerResponse> {\n return this.postToAppsScriptExpectResponse<ExplorerResponse>({\n action: 'deleteExplorerSheetAfterMigration',\n });\n }\n\n /**\n * Gửi POST tới Google Apps Script (cùng pattern với `FeedingLogService`).\n *\n * **Lưu ý quan trọng**: Apps Script web app trả `302 Found` redirect sang\n * `script.googleusercontent.com` cho POST, kèm CORS thoáng cho GET nhưng\n * **không phản hồi CORS đúng cho POST response**. Hệ quả:\n * - Apps Script `doPost` chạy thành công, **dữ liệu đã được ghi vào sheet**.\n * - Browser/HttpClient cố theo redirect → đụng CORS / non-JSON → throw\n * error mặc dù request đã có hiệu lực.\n *\n * Vì vậy: swallow lỗi response và **luôn coi như thành công**. Component\n * sẽ tự `loadEntries()` sau ~800-1000ms để verify state thật. Cách này\n * đồng nhất với `FeedingLogService.addLog/updateLog/deleteLog` trong cùng\n * codebase.\n *\n * Trade-off: nếu Apps Script thực sự fail (quota, sai action…), UI báo\n * thành công nhưng reload sẽ không thấy thay đổi → user tự nhận biết.\n * Đổi lại: không bao giờ báo \"lỗi\" khi backend đã ghi thành công (nguyên\n * nhân của bug \"upload báo lỗi nhưng vẫn upload được\").\n */\n private postToAppsScript(body: Record<string, unknown>): Observable<ExplorerResponse> {\n const url = this.APPS_SCRIPT_URL;\n if (!url) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n\n const useProxy = this.shouldUseJsonProxy();\n\n if (useProxy) {\n const headers = new HttpHeaders({ 'Content-Type': 'text/plain;charset=UTF-8' });\n return this.http.post<ExplorerResponse>(url, JSON.stringify(body), { headers }).pipe(\n catchError((err) => {\n console.warn(\n '[ExplorerService] POST response không parse được — coi như đã ghi thành công, sẽ reload để verify.',\n err\n );\n return of({ success: true } as ExplorerResponse);\n })\n );\n }\n\n const payload = JSON.stringify(body);\n return from(\n fetch(url, {\n method: 'POST',\n mode: 'no-cors',\n headers: { 'Content-Type': 'text/plain;charset=utf-8' },\n body: payload,\n redirect: 'follow',\n }).then((): ExplorerResponse => ({ success: true }))\n ).pipe(\n catchError((err) => {\n console.warn('[ExplorerService] POST (no-cors) lỗi — coi như thành công.', err);\n return of({ success: true });\n })\n );\n }\n\n /**\n * Dùng cho action bắt buộc cần đọc JSON response (vd getExplorerFile).\n * Nếu không đi qua proxy tương thích CORS thì throw lỗi để user cấu hình lại.\n */\n private postToAppsScriptExpectResponse<T>(body: Record<string, unknown>): Observable<T> {\n const url = this.APPS_SCRIPT_URL;\n if (!url) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n\n if (!this.shouldUseJsonProxy()) {\n return throwError(\n () =>\n new Error(\n 'Endpoint hiện tại không đọc được response do CORS. Đặt NG_APP_APPS_SCRIPT_MODE khác \"direct\" để dùng proxy /api/feeding-apps-script.'\n )\n );\n }\n\n // 🚀 Mobile CORS fix: Use simple content-type only for proxy (dev)\n const isProxy = this.shouldUseJsonProxy();\n const headers = new HttpHeaders({\n 'Content-Type': isProxy ? 'text/plain;charset=UTF-8' : 'application/json',\n });\n const requestBody = isProxy ? JSON.stringify(body) : body;\n return this.http.post<T>(url, requestBody, { headers });\n }\n\n private shouldUseJsonProxy(): boolean {\n return this.APPS_SCRIPT_URL.startsWith('/');\n }\n\n /**\n * Đọc 1 file ảnh (File hoặc Blob) → resize/compress xuống tối đa\n * `maxSize`px (cạnh dài) ở chất lượng JPEG `quality`, trả về data URL\n * base64. Mục đích: né giới hạn 50.000 ký tự / cell của Google Sheets.\n *\n * Khoảng an toàn để ảnh JPEG ~30–35 KB sau base64: maxSize 720, quality 0.7.\n */\n async fileToCompressedBase64(file: File, maxSize = 720, quality = 0.7): Promise<string> {\n const dataUrl = await this.readAsDataURL(file);\n\n const img = await new Promise<HTMLImageElement>((resolve, reject) => {\n const i = new Image();\n i.onload = () => resolve(i);\n i.onerror = () => reject(new Error('Không đọc được file ảnh'));\n i.src = dataUrl;\n });\n\n let { width, height } = img;\n if (width > maxSize || height > maxSize) {\n if (width > height) {\n height = Math.round((height * maxSize) / width);\n width = maxSize;\n } else {\n width = Math.round((width * maxSize) / height);\n height = maxSize;\n }\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Không khởi tạo được canvas');\n ctx.drawImage(img, 0, 0, width, height);\n\n return canvas.toDataURL('image/jpeg', quality);\n }\n\n /** Đọc file bất kỳ thành data URL (phục vụ upload file non-image). */\n async fileToDataUrl(file: File): Promise<string> {\n return this.readAsDataURL(file);\n }\n\n private readAsDataURL(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(reader.error || new Error('FileReader failed'));\n reader.readAsDataURL(file);\n });\n }\n}\n","import { Injectable, inject, signal } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Observable, of, interval, Subject, from, throwError, Subscription } from 'rxjs';\nimport { map, catchError, tap, switchMap, startWith } from 'rxjs/operators';\nimport { environment } from '../../environments/environment';\n\n/** Event types cho logging */\nexport const ACTIVITY_EVENT = {\n // Feeding events\n FEEDING_ADDED: 'FEEDING_ADDED',\n FEEDING_UPDATED: 'FEEDING_UPDATED',\n FEEDING_DELETED: 'FEEDING_DELETED',\n BOTTLE_PREP_ADDED: 'BOTTLE_PREP_ADDED',\n /** Đổi dung tích sữa đã pha (không phải pha mới). */\n BOTTLE_PREP_UPDATED: 'BOTTLE_PREP_UPDATED',\n /** Ghi nhận cữ bú từ sữa đã pha — sheet đã xóa bình (lý do cố định). */\n BOTTLE_PREP_CLEARED_FEEDING: 'BOTTLE_PREP_CLEARED_FEEDING',\n /** Người dùng xóa thủ công lượng sữa đã pha. */\n BOTTLE_PREP_MANUAL_CLEARED: 'BOTTLE_PREP_MANUAL_CLEARED',\n /** Thay bình khi cảnh báo hết hạn / sắp hết hạn (1 giờ) — ghi trước log pha mới. */\n BOTTLE_PREP_CLEARED_EXPIRY: 'BOTTLE_PREP_CLEARED_EXPIRY',\n\n // Weight events\n WEIGHT_ADDED: 'WEIGHT_ADDED',\n WEIGHT_UPDATED: 'WEIGHT_UPDATED',\n WEIGHT_DELETED: 'WEIGHT_DELETED',\n\n // Medical events\n MEDICAL_ADDED: 'MEDICAL_ADDED',\n MEDICAL_UPDATED: 'MEDICAL_UPDATED',\n MEDICAL_DELETED: 'MEDICAL_DELETED',\n\n // Schedule events\n SCHEDULE_ADDED: 'SCHEDULE_ADDED',\n SCHEDULE_UPDATED: 'SCHEDULE_UPDATED',\n SCHEDULE_DELETED: 'SCHEDULE_DELETED',\n\n // Settings events\n SETTINGS_UPDATED: 'SETTINGS_UPDATED',\n PROFILE_UPDATED: 'PROFILE_UPDATED',\n NOTIFICATION_CREATED: 'NOTIFICATION_CREATED',\n NOTIFICATION_ACKNOWLEDGED: 'NOTIFICATION_ACKNOWLEDGED',\n NOTIFICATION_DELETED: 'NOTIFICATION_DELETED',\n\n // Document/Explorer events\n FILE_ADDED: 'FILE_ADDED',\n FILE_DELETED: 'FILE_DELETED',\n FILE_MOVED: 'FILE_MOVED',\n FILE_RENAMED: 'FILE_RENAMED',\n FOLDER_ADDED: 'FOLDER_ADDED',\n FOLDER_DELETED: 'FOLDER_DELETED',\n FOLDER_RENAMED: 'FOLDER_RENAMED',\n} as const;\n\nexport type ActivityEventType = (typeof ACTIVITY_EVENT)[keyof typeof ACTIVITY_EVENT];\n\n/** User ghi trên sheet cho thao tác tự động (trước đây là «Hệ thống»). */\nexport const ACTIVITY_SYSTEM_USER = 'System';\n\n/** Hiển thị tên actor; log cũ trên sheet có thể vẫn là «Hệ thống». */\nexport function displayActivityLogActor(user: string): string {\n const u = String(user || '').trim();\n if (/^hệ thống$/iu.test(u)) return ACTIVITY_SYSTEM_USER;\n return user;\n}\n\n/** Row data từ sheet Log */\nexport interface ActivityLogRow {\n id: string;\n user: string;\n eventType: ActivityEventType;\n content: string;\n timestamp: string;\n rowIndex?: number;\n}\n\n/** Dữ liệu để tạo log entry mới */\nexport interface ActivityLogEntry {\n user: string;\n eventType: ActivityEventType;\n content: string;\n}\n\n/** Helper để format content user-friendly */\nexport function formatLogContent(\n eventType: ActivityEventType,\n details: Record<string, string | number | undefined>\n): string {\n switch (eventType) {\n // Feeding\n case ACTIVITY_EVENT.FEEDING_ADDED:\n return `Thêm cữ bú '${details['volume']}ml' vào lúc '${details['time']}'`;\n case ACTIVITY_EVENT.FEEDING_UPDATED: {\n const oldVol = details['oldVolume'];\n const newVol = details['newVolume'];\n const time = details['time'];\n const oldTime = details['oldTime'];\n const newTime = details['newTime'];\n const timeChanged = oldTime != null && newTime != null && String(oldTime) !== String(newTime);\n const volumeChanged = oldVol != null && newVol != null && Number(oldVol) !== Number(newVol);\n\n if (timeChanged && volumeChanged) {\n return `Thay đổi cữ bú từ '${oldTime}' thành '${newTime}', dung tích từ '${oldVol}ml' thành '${newVol}ml'`;\n }\n if (timeChanged) {\n return `Thay đổi cữ bú từ '${oldTime}' thành '${newTime}'`;\n }\n if (volumeChanged) {\n return `Thay đổi cữ bú lúc '${time}' từ '${oldVol}ml' thành '${newVol}ml'`;\n }\n const vol = newVol ?? oldVol ?? details['volume'];\n return vol != null\n ? `cập nhật nội dung cữ bú ${vol}ml lúc '${time}'`\n : `cập nhật nội dung cữ bú lúc '${time}'`;\n }\n case ACTIVITY_EVENT.FEEDING_DELETED: {\n const reason = details['reason'];\n const r = reason != null && String(reason).trim() !== '' ? String(reason).trim() : '';\n return r\n ? `Xóa cữ bú '${details['volume']}ml' lúc '${details['time']}'. Lý do: '${r}'`\n : `Xóa cữ bú '${details['volume']}ml' lúc '${details['time']}'`;\n }\n case ACTIVITY_EVENT.BOTTLE_PREP_ADDED:\n return `Pha sữa '${details['volume']}ml' lúc '${details['time']}'`;\n case ACTIVITY_EVENT.BOTTLE_PREP_UPDATED: {\n const oldV = details['oldVolume'];\n const newV = details['newVolume'];\n const time = details['time'];\n const reason = details['reason'];\n const r = reason != null && String(reason).trim() !== '' ? String(reason).trim() : '';\n /** Không lặp tên user — template đã có `<user> đã`. */\n return r\n ? `Đổi sữa đã pha từ '${oldV}ml' thành '${newV}ml' lúc '${time}'. Lý do: '${r}'`\n : `Đổi sữa đã pha từ '${oldV}ml' thành '${newV}ml' lúc '${time}'`;\n }\n case ACTIVITY_EVENT.BOTTLE_PREP_CLEARED_FEEDING: {\n const vol = details['volume'];\n const consumed = details['consumed'] ?? '?';\n const remaining = details['remaining'] ?? '?';\n return `xóa '${vol}ml' sữa đã pha. Bé đã ti '${consumed}ml', còn '${remaining}ml'. Lý do: 'bé ti sữa'`;\n }\n case ACTIVITY_EVENT.BOTTLE_PREP_MANUAL_CLEARED: {\n const vol = details['volume'];\n const reason = details['reason'];\n const r = reason != null && String(reason).trim() !== '' ? String(reason).trim() : '';\n return r ? `Xóa '${vol}ml' sữa đã pha. Lý do: '${r}'` : `Xóa '${vol}ml' sữa đã pha.`;\n }\n case ACTIVITY_EVENT.BOTTLE_PREP_CLEARED_EXPIRY: {\n const vol = details['volume'];\n const m = details['minutes'];\n const variant = String(details['variant'] ?? 'expired');\n if (variant === 'expiring') {\n return `Tự động xóa '${vol}ml' sữa đã pha. Lý do: 'sữa sắp quá hạn (còn ${m} phút đến mức tối đa 1 giờ)'`;\n }\n return `Tự động xóa '${vol}ml' sữa đã pha. Lý do: 'sữa quá hạn ${m} phút'`;\n }\n\n // Weight\n case ACTIVITY_EVENT.WEIGHT_ADDED:\n return `Thêm ghi nhận cân nặng '${details['weight']}kg' ngày '${details['date']}'`;\n case ACTIVITY_EVENT.WEIGHT_UPDATED:\n return details['oldWeight'] && details['newWeight']\n ? `Thay đổi cân nặng ngày '${details['date']}' từ '${details['oldWeight']}kg' thành '${details['newWeight']}kg'`\n : `Cập nhật cân nặng ngày '${details['date']}'`;\n case ACTIVITY_EVENT.WEIGHT_DELETED:\n return `Xóa ghi nhận cân nặng '${details['weight']}kg' ngày '${details['date']}'`;\n\n // Medical\n case ACTIVITY_EVENT.MEDICAL_ADDED:\n return details['location']\n ? `Thêm sự kiện y tế '${details['title']}' tại '${details['location']}'`\n : `Thêm sự kiện y tế '${details['title']}'`;\n case ACTIVITY_EVENT.MEDICAL_UPDATED:\n return details['location']\n ? `Chỉnh sửa sự kiện y tế '${details['title']}' tại '${details['location']}'`\n : `Chỉnh sửa sự kiện y tế '${details['title']}'`;\n case ACTIVITY_EVENT.MEDICAL_DELETED:\n return `Xóa sự kiện y tế '${details['title']}'`;\n\n // Schedule\n case ACTIVITY_EVENT.SCHEDULE_ADDED:\n return `Thêm lịch mới '${details['title']}' vào ngày '${details['date']}'`;\n case ACTIVITY_EVENT.SCHEDULE_UPDATED:\n return `Chỉnh sửa lịch '${details['title']}'`;\n case ACTIVITY_EVENT.SCHEDULE_DELETED:\n return `Xóa lịch '${details['title']}'`;\n\n // Settings\n case ACTIVITY_EVENT.SETTINGS_UPDATED:\n return `Cập nhật cài đặt '${details['setting']}'`;\n case ACTIVITY_EVENT.PROFILE_UPDATED:\n return `Cập nhật thông tin '${details['field']}'`;\n case ACTIVITY_EVENT.NOTIFICATION_CREATED:\n return `Tạo thông báo '${details['content']}'`;\n case ACTIVITY_EVENT.NOTIFICATION_ACKNOWLEDGED:\n return details['owner']\n ? `Đọc thông báo '${details['content']}' của '${details['owner']}'`\n : `Đọc thông báo '${details['content']}'`;\n case ACTIVITY_EVENT.NOTIFICATION_DELETED:\n return `Xóa thông báo '${details['content']}'`;\n\n // Documents\n case ACTIVITY_EVENT.FILE_ADDED:\n return `Tải lên file '${details['name']}' vào thư mục '${details['folder']}'`;\n case ACTIVITY_EVENT.FILE_DELETED:\n return `Xóa file '${details['name']}'`;\n case ACTIVITY_EVENT.FILE_MOVED:\n return `Di chuyển file '${details['name']}' sang '${details['toFolder']}'`;\n case ACTIVITY_EVENT.FILE_RENAMED:\n return `Đổi tên file từ '${details['oldName']}' thành '${details['newName']}'`;\n case ACTIVITY_EVENT.FOLDER_ADDED:\n return `Tạo thư mục '${details['name']}'`;\n case ACTIVITY_EVENT.FOLDER_DELETED:\n return `Xóa thư mục '${details['name']}'`;\n case ACTIVITY_EVENT.FOLDER_RENAMED:\n return `Đổi tên thư mục từ '${details['oldName']}' thành '${details['newName']}'`;\n\n default:\n return `Hoạt động: ${eventType}`;\n }\n}\n\n/** Parse content để hiển thị với phần trong '' được in đậm */\nexport function parseContentWithBold(content: string): Array<{ text: string; bold: boolean }> {\n const parts: Array<{ text: string; bold: boolean }> = [];\n const regex = /'([^']+)'/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(content)) !== null) {\n if (match.index > lastIndex) {\n parts.push({ text: content.slice(lastIndex, match.index), bold: false });\n }\n parts.push({ text: match[1], bold: true });\n lastIndex = regex.lastIndex;\n }\n\n if (lastIndex < content.length) {\n let tail = content.slice(lastIndex);\n // Bỏ dấu nháy đơn thừa ở cuối (log cũ / delimiter lặp → hiển thị orphan ')\n tail = tail.replace(/'\\s*$/g, '');\n if (tail) {\n parts.push({ text: tail, bold: false });\n }\n }\n\n return parts.length > 0 ? parts : [{ text: content, bold: false }];\n}\n\nfunction escapeHtmlForActivityLog(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/** Giống UI activity log: viết thường ký tự đầu của chuỗi content. */\nexport function lowercaseFirstActivityContent(str: string): string {\n if (!str) return str;\n return str.charAt(0).toLowerCase() + str.slice(1);\n}\n\n/**\n * HTML (text đã escape) cho phần sau `<user> đã` — bind với DomSanitizer + [innerHTML].\n * Phần trong cặp '...' (formatLogContent) được bọc <strong class=\"activity-item__hl\">.\n */\nexport function buildActivityLogMessageHtml(content: string): string {\n const normalized = lowercaseFirstActivityContent(content);\n const parts = parseContentWithBold(normalized);\n let html = parts\n .map((p) =>\n p.bold\n ? `<strong class=\"activity-item__hl\">${escapeHtmlForActivityLog(p.text)}</strong>`\n : escapeHtmlForActivityLog(p.text)\n )\n .join('');\n\n const plain = parts\n .map((p) => p.text)\n .join('')\n .trimEnd();\n const hasClosingPunct = /[.!?…]\\s*$/u.test(plain);\n if (plain.length > 0 && !hasClosingPunct) {\n html += '.';\n }\n\n return html;\n}\n\n/** Map event type sang label tiếng Việt */\nexport function getEventTypeLabel(eventType: ActivityEventType): string {\n const labels: Record<ActivityEventType, string> = {\n [ACTIVITY_EVENT.FEEDING_ADDED]: 'Thêm cữ bú',\n [ACTIVITY_EVENT.FEEDING_UPDATED]: 'Sửa cữ bú',\n [ACTIVITY_EVENT.FEEDING_DELETED]: 'Xóa cữ bú',\n [ACTIVITY_EVENT.BOTTLE_PREP_ADDED]: 'Pha sữa',\n [ACTIVITY_EVENT.BOTTLE_PREP_UPDATED]: 'Sửa sữa pha',\n [ACTIVITY_EVENT.BOTTLE_PREP_CLEARED_FEEDING]: 'Xóa sữa pha (tự động)',\n [ACTIVITY_EVENT.BOTTLE_PREP_MANUAL_CLEARED]: 'Xóa sữa pha',\n [ACTIVITY_EVENT.BOTTLE_PREP_CLEARED_EXPIRY]: 'Sữa pha (hết hạn)',\n [ACTIVITY_EVENT.WEIGHT_ADDED]: 'Thêm cân nặng',\n [ACTIVITY_EVENT.WEIGHT_UPDATED]: 'Sửa cân nặng',\n [ACTIVITY_EVENT.WEIGHT_DELETED]: 'Xóa cân nặng',\n [ACTIVITY_EVENT.MEDICAL_ADDED]: 'Thêm sự kiện y tế',\n [ACTIVITY_EVENT.MEDICAL_UPDATED]: 'Sửa sự kiện y tế',\n [ACTIVITY_EVENT.MEDICAL_DELETED]: 'Xóa sự kiện y tế',\n [ACTIVITY_EVENT.SCHEDULE_ADDED]: 'Thêm lịch',\n [ACTIVITY_EVENT.SCHEDULE_UPDATED]: 'Sửa lịch',\n [ACTIVITY_EVENT.SCHEDULE_DELETED]: 'Xóa lịch',\n [ACTIVITY_EVENT.SETTINGS_UPDATED]: 'Cài đặt',\n [ACTIVITY_EVENT.PROFILE_UPDATED]: 'Hồ sơ',\n [ACTIVITY_EVENT.NOTIFICATION_CREATED]: 'Tạo thông báo',\n [ACTIVITY_EVENT.NOTIFICATION_ACKNOWLEDGED]: 'Đã đọc thông báo',\n [ACTIVITY_EVENT.NOTIFICATION_DELETED]: 'Xóa thông báo',\n [ACTIVITY_EVENT.FILE_ADDED]: 'Tải file',\n [ACTIVITY_EVENT.FILE_DELETED]: 'Xóa file',\n [ACTIVITY_EVENT.FILE_MOVED]: 'Di chuyển file',\n [ACTIVITY_EVENT.FILE_RENAMED]: 'Đổi tên file',\n [ACTIVITY_EVENT.FOLDER_ADDED]: 'Tạo thư mục',\n [ACTIVITY_EVENT.FOLDER_DELETED]: 'Xóa thư mục',\n [ACTIVITY_EVENT.FOLDER_RENAMED]: 'Đổi tên thư mục',\n };\n return labels[eventType] || eventType;\n}\n\n/** Map event type sang icon class */\nexport function getEventTypeIcon(eventType: ActivityEventType): string {\n if (isActivityDeleteEvent(eventType)) return 'pi-trash';\n if (eventType.includes('_UPDATED') || eventType.includes('_RENAMED')) return 'pi-pencil';\n if (eventType.includes('_ACKNOWLEDGED')) return 'pi-check-circle';\n if (eventType.includes('_CREATED')) return 'pi-plus-circle';\n if (eventType === ACTIVITY_EVENT.BOTTLE_PREP_ADDED) return 'pi-box';\n if (eventType.includes('_ADDED')) return 'pi-plus-circle';\n if (eventType === ACTIVITY_EVENT.FILE_MOVED) return 'pi-arrow-right';\n if (eventType.startsWith('BOTTLE_PREP_')) return 'pi-box';\n if (eventType.startsWith('FEEDING_')) return 'pi-heart';\n if (eventType.startsWith('WEIGHT_')) return 'pi-chart-line';\n if (eventType.startsWith('MEDICAL_')) return 'pi-shield';\n if (eventType.startsWith('SCHEDULE_')) return 'pi-calendar';\n if (eventType.startsWith('SETTINGS_')) return 'pi-cog';\n if (eventType.startsWith('PROFILE_')) return 'pi-user';\n if (eventType.startsWith('FILE_')) return 'pi-file';\n if (eventType.startsWith('FOLDER_')) return 'pi-folder';\n return 'pi-info-circle';\n}\n\n/** Map event type sang màu */\nexport function getEventTypeColor(eventType: ActivityEventType): string {\n if (isActivityDeleteEvent(eventType)) return 'red';\n if (eventType.includes('_ACKNOWLEDGED')) return 'green';\n if (eventType.includes('_CREATED')) return 'green';\n if (eventType.includes('_ADDED')) return 'green';\n if (eventType.includes('_UPDATED')) return 'blue';\n return 'gray';\n}\n\n/** Sự kiện xóa / gỡ sữa pha / xóa tự động — UI ưu tiên tông đỏ. */\nexport function isActivityDeleteEvent(eventType: ActivityEventType): boolean {\n if (eventType.includes('_DELETED')) return true;\n if (eventType === ACTIVITY_EVENT.BOTTLE_PREP_MANUAL_CLEARED) return true;\n if (eventType === ACTIVITY_EVENT.BOTTLE_PREP_CLEARED_FEEDING) return true;\n if (eventType === ACTIVITY_EVENT.BOTTLE_PREP_CLEARED_EXPIRY) return true;\n return false;\n}\n\ninterface LogSheetResponse {\n success: boolean;\n rowIndex?: number;\n error?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ActivityLogService {\n private http = inject(HttpClient);\n\n private readonly SHEET_ID = environment.googleFeedingSheetId;\n private readonly SHEET_NAME = 'Log';\n private readonly API_KEY = environment.googleSheetsApiKey;\n private readonly BASE_URL = this.SHEET_ID\n ? `https://sheets.googleapis.com/v4/spreadsheets/${this.SHEET_ID}`\n : '';\n private readonly STORAGE_KEY = 'activity-log-last-read-id';\n\n private readonly APPS_SCRIPT_URL = environment.appsScriptDirect\n ? environment.googleFeedingAppsScriptUrl\n : '/api/feeding-apps-script';\n\n /** Refresh interval in minutes (configurable from settings) */\n refreshIntervalMinutes = signal<number>(5);\n private autoRefreshSub?: Subscription;\n\n private logs = signal<ActivityLogRow[]>([]);\n private lastLogId = signal<string | null>(null);\n private lastReadLogId = signal<string | null>(null);\n private loading = signal<boolean>(false);\n private hasNewActivity = signal<boolean>(false);\n\n private refreshTrigger$ = new Subject<void>();\n\n readonly logs$ = this.logs.asReadonly();\n readonly loading$ = this.loading.asReadonly();\n readonly hasNewActivity$ = this.hasNewActivity.asReadonly();\n readonly lastReadLogId$ = this.lastReadLogId.asReadonly();\n\n /** Số lượng log chưa xem (mới) */\n unreadCount = signal<number>(0);\n\n constructor() {\n this.loadLastReadLogId();\n this.startAutoRefresh();\n }\n\n /** Load last read log ID from localStorage */\n private loadLastReadLogId(): void {\n try {\n const stored = localStorage.getItem(this.STORAGE_KEY);\n if (stored) {\n this.lastReadLogId.set(stored);\n }\n } catch (e) {\n console.warn('Could not load last read log ID from localStorage', e);\n }\n }\n\n /** Save last read log ID to localStorage */\n private saveLastReadLogId(logId: string | null): void {\n try {\n if (logId) {\n localStorage.setItem(this.STORAGE_KEY, logId);\n this.lastReadLogId.set(logId);\n }\n } catch (e) {\n console.warn('Could not save last read log ID to localStorage', e);\n }\n }\n\n /** Calculate unread count based on last read log ID */\n private calculateUnreadCount(logs: ActivityLogRow[]): number {\n const lastReadId = this.lastReadLogId();\n if (!lastReadId || logs.length === 0) {\n return 0;\n }\n const lastReadIndex = logs.findIndex((l) => l.id === lastReadId);\n if (lastReadIndex === -1) {\n // Last read log not found, all logs are considered new\n return logs.length;\n }\n return lastReadIndex;\n }\n\n /** Update refresh interval and restart auto-refresh */\n setRefreshInterval(minutes: number): void {\n if (minutes > 0 && minutes !== this.refreshIntervalMinutes()) {\n this.refreshIntervalMinutes.set(minutes);\n this.restartAutoRefresh();\n }\n }\n\n private restartAutoRefresh(): void {\n this.autoRefreshSub?.unsubscribe();\n this.startAutoRefresh();\n }\n\n private startAutoRefresh(): void {\n const intervalMs = this.refreshIntervalMinutes() * 60 * 1000;\n this.autoRefreshSub = interval(intervalMs)\n .pipe(\n startWith(0),\n switchMap(() => this.fetchLogs())\n )\n .subscribe({\n next: (logs) => {\n const prevLastId = this.lastLogId();\n const newLastId = logs.length > 0 ? logs[0].id : null;\n\n // Check if there are new activities since last fetch\n if (prevLastId && newLastId && prevLastId !== newLastId) {\n this.hasNewActivity.set(true);\n }\n\n // Calculate unread count based on last READ log ID (from storage)\n const unread = this.calculateUnreadCount(logs);\n this.unreadCount.set(unread);\n\n this.logs.set(logs);\n this.lastLogId.set(newLastId);\n },\n error: (err) => console.error('[ActivityLog] Auto-refresh error:', err),\n });\n }\n\n /** Trigger manual refresh */\n refresh(): void {\n this.refreshTrigger$.next();\n this.fetchLogs().subscribe({\n next: (logs) => {\n this.logs.set(logs);\n if (logs.length > 0) {\n this.lastLogId.set(logs[0].id);\n // Recalculate unread count (keep last read ID unchanged)\n const unread = this.calculateUnreadCount(logs);\n this.unreadCount.set(unread);\n }\n },\n });\n }\n\n /** Mark all as read - save last read ID to localStorage */\n markAsRead(): void {\n const logs = this.logs();\n if (logs.length > 0) {\n // Save the most recent log ID as last read\n this.saveLastReadLogId(logs[0].id);\n }\n this.unreadCount.set(0);\n this.hasNewActivity.set(false);\n }\n\n /** Check if a specific log is unread */\n isLogUnread(logId: string): boolean {\n const logs = this.logs();\n const lastReadId = this.lastReadLogId();\n if (!lastReadId) return false;\n\n const logIndex = logs.findIndex((l) => l.id === logId);\n const lastReadIndex = logs.findIndex((l) => l.id === lastReadId);\n\n if (logIndex === -1 || lastReadIndex === -1) return false;\n return logIndex < lastReadIndex;\n }\n\n /** Fetch logs from sheet */\n private fetchLogs(): Observable<ActivityLogRow[]> {\n if (!this.BASE_URL || !this.API_KEY) {\n this.loading.set(false);\n return of([]);\n }\n this.loading.set(true);\n const url = `${this.BASE_URL}/values/${encodeURIComponent(this.SHEET_NAME)}?key=${this.API_KEY}`;\n\n return this.http.get<{ values?: string[][] }>(url).pipe(\n map((res) => {\n const rows = res.values ?? [];\n if (rows.length < 2) return [];\n\n const header = rows[0].map((h) => String(h).trim().toLowerCase());\n const iId = header.indexOf('id');\n const iUser = header.indexOf('user');\n const iType = header.indexOf('type');\n const iContent = header.indexOf('content');\n const iTimestamp = header.indexOf('timestamp');\n\n return rows\n .slice(1)\n .map((r, idx) => ({\n id: r[iId] ?? `log-${idx}`,\n user: r[iUser] ?? 'unknown',\n eventType: (r[iType] ?? 'UNKNOWN') as ActivityEventType,\n content: r[iContent] ?? '',\n timestamp: r[iTimestamp] ?? '',\n rowIndex: idx + 2,\n }))\n .sort((a, b) => {\n const ta = new Date(a.timestamp).getTime();\n const tb = new Date(b.timestamp).getTime();\n return tb - ta; // Newest first\n });\n }),\n tap(() => this.loading.set(false)),\n catchError((err) => {\n console.error('[ActivityLog] Fetch error:', err);\n this.loading.set(false);\n return of([]);\n })\n );\n }\n\n /** Add a new log entry */\n addLog(entry: ActivityLogEntry): Observable<boolean> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n\n const id = `log-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const timestamp = new Date().toISOString();\n\n return this.postToAppsScript({\n action: 'addLog',\n log: {\n id,\n user: entry.user,\n type: entry.eventType,\n content: entry.content,\n timestamp,\n },\n }).pipe(\n map((res) => res.success === true),\n tap((success) => {\n if (success) {\n const newLog: ActivityLogRow = {\n id,\n user: entry.user,\n eventType: entry.eventType,\n content: entry.content,\n timestamp,\n };\n this.logs.update((logs) => [newLog, ...logs]);\n }\n }),\n catchError((err) => {\n console.error('[ActivityLog] Add error:', err);\n return of(false);\n })\n );\n }\n\n /**\n * Gửi POST tới Google Apps Script web app.\n *\n * Dev (proxy): dùng HttpClient bình thường, đọc JSON response.\n *\n * Prod (mobile-safe): dùng fetch với `mode: 'no-cors'`.\n * - GAS `doPost` trả 302 redirect sang `script.googleusercontent.com`.\n * XHR (HttpClient) cố gắng đọc CORS header ở endpoint cuối, và trên\n * mobile/WebView hành vi này rất flaky ⇒ request thường fail với\n * status 0 dù GAS đã ghi thành công.\n * - `fetch` với `mode: 'no-cors'` gửi request như form thường, không\n * expect đọc response, không cần CORS header ⇒ không bao giờ fail\n * vì CORS. Opaque response cũng OK vì ta sẽ reload để verify.\n * - Content-Type `text/plain;charset=utf-8` vẫn cần để nằm trong\n * \"CORS-safelisted\" và không trigger preflight OPTIONS.\n */\n private postToAppsScript(body: Record<string, unknown>): Observable<LogSheetResponse> {\n const url = this.APPS_SCRIPT_URL;\n const useProxy = url.startsWith('/');\n\n if (useProxy) {\n const headers = new HttpHeaders({ 'Content-Type': 'text/plain;charset=UTF-8' });\n return this.http\n .post<LogSheetResponse>(url, JSON.stringify(body), { headers })\n .pipe(map((resp) => resp));\n }\n\n const payload = JSON.stringify(body);\n return from(\n fetch(url, {\n method: 'POST',\n mode: 'no-cors',\n headers: { 'Content-Type': 'text/plain;charset=utf-8' },\n body: payload,\n redirect: 'follow',\n }).then((): LogSheetResponse => ({ success: true }))\n );\n }\n\n /** Helper: Log a feeding event */\n logFeeding(\n user: string,\n eventType: 'FEEDING_ADDED' | 'FEEDING_UPDATED' | 'FEEDING_DELETED',\n details: {\n time?: string;\n oldTime?: string;\n newTime?: string;\n volume?: number;\n oldVolume?: number;\n newVolume?: number;\n reason?: string;\n }\n ): Observable<boolean> {\n const content = formatLogContent(ACTIVITY_EVENT[eventType], {\n time: details.time,\n oldTime: details.oldTime,\n newTime: details.newTime,\n volume: details.volume,\n oldVolume: details.oldVolume,\n newVolume: details.newVolume,\n reason: details.reason,\n });\n return this.addLog({ user, eventType: ACTIVITY_EVENT[eventType], content });\n }\n\n /** Helper: Log a weight event */\n logWeight(\n user: string,\n eventType: 'WEIGHT_ADDED' | 'WEIGHT_UPDATED' | 'WEIGHT_DELETED',\n details: { date?: string; weight?: number; oldWeight?: number; newWeight?: number }\n ): Observable<boolean> {\n const content = formatLogContent(ACTIVITY_EVENT[eventType], {\n date: details.date,\n weight: details.weight,\n oldWeight: details.oldWeight,\n newWeight: details.newWeight,\n });\n return this.addLog({ user, eventType: ACTIVITY_EVENT[eventType], content });\n }\n\n /** Helper: Log a medical event */\n logMedical(\n user: string,\n eventType: 'MEDICAL_ADDED' | 'MEDICAL_UPDATED' | 'MEDICAL_DELETED',\n details: { title?: string; location?: string }\n ): Observable<boolean> {\n const content = formatLogContent(ACTIVITY_EVENT[eventType], {\n title: details.title,\n location: details.location,\n });\n return this.addLog({ user, eventType: ACTIVITY_EVENT[eventType], content });\n }\n\n /** Helper: Log a schedule event */\n logSchedule(\n user: string,\n eventType: 'SCHEDULE_ADDED' | 'SCHEDULE_UPDATED' | 'SCHEDULE_DELETED',\n details: { title?: string; date?: string }\n ): Observable<boolean> {\n const content = formatLogContent(ACTIVITY_EVENT[eventType], {\n title: details.title,\n date: details.date,\n });\n return this.addLog({ user, eventType: ACTIVITY_EVENT[eventType], content });\n }\n\n /** Helper: Log settings update */\n logSettings(user: string, settingName: string): Observable<boolean> {\n const content = formatLogContent(ACTIVITY_EVENT.SETTINGS_UPDATED, { setting: settingName });\n return this.addLog({ user, eventType: ACTIVITY_EVENT.SETTINGS_UPDATED, content });\n }\n\n /** Helper: Log a document/file event */\n logDocument(\n user: string,\n eventType:\n | 'FILE_ADDED'\n | 'FILE_DELETED'\n | 'FILE_MOVED'\n | 'FILE_RENAMED'\n | 'FOLDER_ADDED'\n | 'FOLDER_DELETED'\n | 'FOLDER_RENAMED',\n details: {\n name?: string;\n folder?: string;\n toFolder?: string;\n oldName?: string;\n newName?: string;\n }\n ): Observable<boolean> {\n const content = formatLogContent(ACTIVITY_EVENT[eventType], {\n name: details.name,\n folder: details.folder,\n toFolder: details.toFolder,\n oldName: details.oldName,\n newName: details.newName,\n });\n return this.addLog({ user, eventType: ACTIVITY_EVENT[eventType], content });\n }\n\n /** Sau khi ghi cữ bú từ sữa đã pha (tính còn lại trong bình → lưu cữ). */\n logBottlePrepClearedAfterFeed(\n volumeMl: number,\n consumedMl: number,\n remainingMl: number\n ): Observable<boolean> {\n const content = formatLogContent(ACTIVITY_EVENT.BOTTLE_PREP_CLEARED_FEEDING, {\n volume: volumeMl,\n consumed: consumedMl,\n remaining: remainingMl,\n });\n return this.addLog({\n user: ACTIVITY_SYSTEM_USER,\n eventType: ACTIVITY_EVENT.BOTTLE_PREP_CLEARED_FEEDING,\n content,\n });\n }\n\n /** Người dùng xóa thủ công lượng sữa đã pha trên sheet. */\n logBottlePrepManualClear(actor: string, volumeMl: number, reason?: string): Observable<boolean> {\n const content = formatLogContent(ACTIVITY_EVENT.BOTTLE_PREP_MANUAL_CLEARED, {\n volume: volumeMl,\n reason: reason?.trim() || undefined,\n });\n return this.addLog({\n user: actor,\n eventType: ACTIVITY_EVENT.BOTTLE_PREP_MANUAL_CLEARED,\n content,\n });\n }\n\n /**\n * Khi pha sữa mới từ cảnh báo hết hạn / sắp hết hạn (1 giờ): ghi xóa lô cũ trước log pha mới.\n * @param variant `expired` = đã quá hạn `minutes` phút; `expiring` = còn `minutes` phút trong khung 1 giờ.\n */\n logBottlePrepClearedForExpiry(\n volumeMl: number,\n minutes: number,\n variant: 'expired' | 'expiring'\n ): Observable<boolean> {\n const content = formatLogContent(ACTIVITY_EVENT.BOTTLE_PREP_CLEARED_EXPIRY, {\n volume: volumeMl,\n minutes,\n variant,\n });\n return this.addLog({\n user: ACTIVITY_SYSTEM_USER,\n eventType: ACTIVITY_EVENT.BOTTLE_PREP_CLEARED_EXPIRY,\n content,\n });\n }\n}\n","import { FormsModule } from '@angular/forms';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n HostListener,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { ExplorerEntry, ExplorerService } from '../../../services/explorer.service';\nimport { ActivityLogService } from '../../../services/activity-log.service';\n\ninterface Crumb {\n id: number;\n name: string;\n}\n\n/**\n * Draft cho modal Add / Rename.\n *\n * Dùng chung cho cả thư mục **và** file (rename). `entryType` xác định\n * UI string + icon. Mode `add` hiện chỉ áp dụng cho folder (file thêm qua\n * upload, không qua modal text).\n */\ninterface EntryDraft {\n mode: 'add' | 'rename';\n /** Loại entry đang đổi: folder hoặc file. Mặc định 'folder'. */\n entryType: 'folder' | 'file';\n /** id entry đang rename. Khi `mode === 'add'` → undefined. */\n targetId?: number;\n /**\n * Phần tên USER nhìn thấy + chỉnh trong input. Với file đang rename,\n * đây là **base name** (đã tách extension) — user khỏi phải gõ `.jpg`.\n */\n name: string;\n /**\n * Phần extension (bao gồm dấu chấm, vd `.jpg`). Chỉ set khi rename file.\n * Lúc submit sẽ được nối lại trừ khi user tự gõ extension khác.\n */\n extension?: string;\n}\n\nexport type ViewMode = 'large' | 'icons' | 'detail';\n\n/**\n * Tối đa ký tự cho content base64 sau khi nén.\n *\n * Server hỗ trợ chia content ra **100 cells** (E + H..DB) × ~49.000 ký tự/cell\n * = ~4.900.000 ký tự ≈ 3.6MB binary JPEG. Dung lượng này cho phép giữ chất\n * lượng ảnh cao hơn rất nhiều so với cấu hình cũ.\n */\nconst MAX_CELL_CHARS = 49000 * 100;\nconst MAX_UPLOAD_BYTES = 10 * 1024 * 1024; // 10MB/file (free-tier friendly)\n\nconst VIEW_MODE_KEY = 'documents:viewMode';\n\n@Component({\n selector: 'app-documents',\n standalone: true,\n imports: [FormsModule],\n templateUrl: './documents.component.html',\n styleUrls: ['./documents.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DocumentsComponent {\n private explorerService = inject(ExplorerService);\n private activityLogService = inject(ActivityLogService);\n private destroyRef = inject(DestroyRef);\n\n /** id của root folder. App giả định row đầu tiên (id=1) là root. */\n private readonly ROOT_ID = 1;\n\n // ===== State =====\n entries = signal<ExplorerEntry[]>([]);\n loading = signal<boolean>(false);\n saving = signal<boolean>(false);\n errorMsg = signal<string>('');\n successMsg = signal<string>('');\n\n /** Folder hiện tại đang xem. Mặc định = root. */\n currentFolderId = signal<number>(this.ROOT_ID);\n\n /**\n * Draft cho modal: add folder, rename folder, hoặc rename file.\n * Tên giữ là `folderDraft` để tránh churn template, nhưng kiểu giờ là\n * `EntryDraft` chứa `entryType` để phân biệt.\n */\n folderDraft = signal<EntryDraft | null>(null);\n\n /** File preview fullscreen */\n previewEntry = signal<ExplorerEntry | null>(null);\n\n /** Chế độ xem: large icons / small icons / detail list. Persist qua localStorage. */\n viewMode = signal<ViewMode>(this.loadViewMode());\n\n /** Dropdown menu thư mục (Thêm thư mục / Đổi tên thư mục hiện tại) */\n folderMenuOpen = signal<boolean>(false);\n\n /**\n * Dropdown 3-chấm trong selection action bar — gom Tải xuống / Cắt /\n * Xoá vào 1 menu để bar đỡ rối khi nhiều nút.\n */\n selectActionsMenuOpen = signal<boolean>(false);\n\n /** Entry id whose item action dropdown is open. */\n itemActionsMenuOpen = signal<number | null>(null);\n\n // ===== Search state =====\n /**\n * Toggle thanh search trong toolbar. Khi true, breadcrumb sẽ ẩn đi và\n * input chiếm chỗ; phím tắt `/` (không trong input) cũng mở search.\n */\n searchOpen = signal<boolean>(false);\n\n /** Query hiện tại — trim/lowercase được tính ở `searchResults` & highlight. */\n searchQuery = signal<string>('');\n\n /**\n * id entry vừa được click trong search result — để pulse highlight ~1.5s\n * sau khi navigate, giúp user tìm thấy item trong thư mục đông đúc.\n */\n highlightedEntryId = signal<number | null>(null);\n private highlightTimer: ReturnType<typeof setTimeout> | null = null;\n /** Token để hủy preload cũ khi có lần loadEntries mới hơn. */\n private preloadRunId = 0;\n\n // ===== Selection / clipboard state =====\n /** Khi true: click vào file/folder = toggle chọn (không mở preview/navigate). */\n selectMode = signal<boolean>(false);\n /** Tập id (file HOẶC folder) đang được tích chọn. Root không bao giờ vào. */\n selectedIds = signal<Set<number>>(new Set());\n /**\n * Clipboard cho cut & paste. Chứa cả file lẫn folder ids. Server kiểm\n * tra chu kỳ (folder không paste được vào chính nó hoặc descendant)\n * — client cũng check sớm để báo lỗi rõ ràng trước khi gọi API.\n */\n clipboard = signal<{ ids: number[] } | null>(null);\n\n /** Tiến độ upload nhiều file: hiện \"Đang tải 3/8…\". */\n uploadProgress = signal<{ done: number; total: number; failed: number } | null>(null);\n\n // ===== Image preview zoom & pan =====\n /**\n * Trạng thái zoom/pan của ảnh preview:\n * - `previewScale = 1`: ảnh fit, không cho pan.\n * - `> 1`: ảnh phóng to, có thể kéo (1 ngón / chuột) hoặc zoom toàn cục\n * (wheel / pinch / nút).\n *\n * Click vào nền KHÔNG đóng preview — user phải bấm nút × hoặc Esc. Tránh\n * tình trạng vô tình tap ra ngoài (nhất là trên mobile) làm mất ảnh.\n *\n * Transform áp dụng lên `<img>`: `translate(tx, ty) scale(s)`. Reference\n * point = tâm của stage (DIV chứa ảnh, không bị transform). Khi zoom vào\n * 1 toạ độ cụ thể, dịch chuyển translate sao cho điểm đó đứng yên trong\n * viewport (xem `applyZoom` bên dưới).\n */\n previewScale = signal<number>(1);\n previewTx = signal<number>(0);\n previewTy = signal<number>(0);\n /** True khi đang drag/pinch — tắt CSS transition để response tức thì. */\n previewInteracting = signal<boolean>(false);\n\n private readonly MIN_ZOOM = 1;\n private readonly MAX_ZOOM = 6;\n /** Hệ số zoom mỗi lần bấm nút +/-. Zoom đôi mỗi 2 lần bấm là vừa phải. */\n private readonly ZOOM_STEP = 1.4;\n\n /** Toạ độ con trỏ đang active (cho pinch & pan). pointerId → {x, y}. */\n private pointers = new Map<number, { x: number; y: number }>();\n /** Snapshot khi bắt đầu pan 1 ngón / chuột. */\n private panStart: {\n x: number;\n y: number;\n tx: number;\n ty: number;\n } | null = null;\n /** Snapshot khi bắt đầu pinch 2 ngón. */\n private pinchStart: {\n dist: number;\n scale: number;\n tx: number;\n ty: number;\n midX: number;\n midY: number;\n centerX: number;\n centerY: number;\n } | null = null;\n /** True nếu trong 1 lượt tương tác đã có drag/pinch — chặn click backdrop. */\n private didPan = false;\n\n /** CSS transform string áp lên `<img class=\"docs-preview__img\">`. */\n previewTransform = computed(\n () =>\n `translate3d(${this.previewTx()}px, ${this.previewTy()}px, 0) scale(${this.previewScale()})`\n );\n\n previewZoomPercent = computed(() => Math.round(this.previewScale() * 100));\n canZoomIn = computed(() => this.previewScale() < this.MAX_ZOOM - 0.001);\n canZoomOut = computed(() => this.previewScale() > this.MIN_ZOOM + 0.001);\n\n /**\n * Danh sách file ảnh ANH/EM trong cùng thư mục cha của entry đang preview.\n * Dùng để chuyển ảnh trước/sau bằng nút mũi tên hoặc phím ←/→ mà không\n * phải đóng preview rồi mở lại.\n *\n * Sort theo cùng thứ tự lưới hiển thị (alphabet vi locale) để index khớp.\n * Folder bị loại — chỉ điều hướng giữa các file. Soft-deleted entries đã\n * được service filter trước.\n */\n previewSiblings = computed<ExplorerEntry[]>(() => {\n const cur = this.previewEntry();\n if (!cur) return [];\n const parentId = cur.parentId;\n return this.entries()\n .filter((e) => e.parentId === parentId && e.type === 'file' && this.isPreviewableFile(e))\n .sort((a, b) => a.name.localeCompare(b.name, 'vi'));\n });\n\n previewIndex = computed<number>(() => {\n const cur = this.previewEntry();\n if (!cur) return -1;\n return this.previewSiblings().findIndex((e) => e.id === cur.id);\n });\n\n /** Tổng số ảnh trong thư mục — dùng cho counter \"3/12\". */\n previewTotal = computed<number>(() => this.previewSiblings().length);\n\n canPreviewPrev = computed<boolean>(() => this.previewIndex() > 0);\n canPreviewNext = computed<boolean>(() => {\n const idx = this.previewIndex();\n const total = this.previewSiblings().length;\n return idx >= 0 && idx < total - 1;\n });\n\n // ===== Derived =====\n entriesById = computed<Map<number, ExplorerEntry>>(() => {\n const m = new Map<number, ExplorerEntry>();\n for (const e of this.entries()) m.set(e.id, e);\n return m;\n });\n\n /** Children của folder hiện tại, sort: folder trước, file sau, theo tên. */\n currentChildren = computed<ExplorerEntry[]>(() => {\n const cid = this.currentFolderId();\n return this.entries()\n .filter((e) => e.parentId === cid)\n .sort((a, b) => {\n if (a.type !== b.type) return a.type === 'folder' ? -1 : 1;\n return a.name.localeCompare(b.name, 'vi');\n });\n });\n\n currentFolder = computed<ExplorerEntry | null>(() => {\n return this.entriesById().get(this.currentFolderId()) || null;\n });\n\n /**\n * Breadcrumb từ root → folder hiện tại. **KHÔNG bao gồm root** theo yêu\n * cầu: chỉ hiện đường dẫn dưới root.\n */\n breadcrumbs = computed<Crumb[]>(() => {\n const map = this.entriesById();\n const path: Crumb[] = [];\n let id: number | null = this.currentFolderId();\n let safety = 32;\n while (id !== null && safety-- > 0) {\n const e: ExplorerEntry | undefined = map.get(id);\n if (!e) break;\n if (e.id === this.ROOT_ID) break;\n path.unshift({ id: e.id, name: e.name });\n id = e.parentId;\n }\n return path;\n });\n\n isAtRoot = computed<boolean>(() => this.currentFolderId() === this.ROOT_ID);\n\n folderCount = computed<number>(\n () => this.currentChildren().filter((e) => e.type === 'folder').length\n );\n fileCount = computed<number>(\n () => this.currentChildren().filter((e) => e.type === 'file').length\n );\n\n selectedCount = computed<number>(() => this.selectedIds().size);\n\n /**\n * True khi mọi entry CON ở folder hiện tại đều đang được chọn (cả folder\n * lẫn file, trừ root). Dùng cho nút \"Chọn tất cả\".\n */\n allFilesSelected = computed<boolean>(() => {\n const ids = this.currentChildren()\n .filter((e) => e.id !== this.ROOT_ID)\n .map((e) => e.id);\n if (ids.length === 0) return false;\n const sel = this.selectedIds();\n return ids.every((id) => sel.has(id));\n });\n\n /** True nếu trong selection có ít nhất 1 file — dùng enable nút Download. */\n selectionHasFile = computed<boolean>(() => {\n const map = this.entriesById();\n for (const id of this.selectedIds()) {\n const e = map.get(id);\n if (e?.type === 'file') return true;\n }\n return false;\n });\n\n /**\n * Search result: filter mọi entry (folder + file) khắp cây theo\n * `searchQuery`. Loại root và soft-deleted (đã filter ở service).\n * Sort: folder trước, sau đó theo tên (vi locale).\n *\n * Empty query → mảng rỗng (UI sẽ hiện hint \"Gõ để tìm…\").\n */\n searchResults = computed<ExplorerEntry[]>(() => {\n const q = this.searchQuery().trim().toLowerCase();\n if (!q) return [];\n return this.entries()\n .filter((e) => e.id !== this.ROOT_ID && e.name.toLowerCase().includes(q))\n .sort((a, b) => {\n if (a.type !== b.type) return a.type === 'folder' ? -1 : 1;\n return a.name.localeCompare(b.name, 'vi');\n })\n .slice(0, 200);\n });\n\n constructor() {\n if (this.explorerService.isEnabled) {\n this.loadEntries();\n }\n this.destroyRef.onDestroy(() => {\n if (this.highlightTimer) {\n clearTimeout(this.highlightTimer);\n this.highlightTimer = null;\n }\n });\n }\n\n // ===== Loading =====\n loadEntries() {\n this.loading.set(true);\n this.errorMsg.set('');\n this.explorerService.getEntries().subscribe({\n next: (entries) => {\n this.entries.set(entries);\n this.loading.set(false);\n // Nếu folder hiện tại đã bị xoá ở nơi khác → fallback về root.\n if (!this.entriesById().has(this.currentFolderId())) {\n this.currentFolderId.set(this.ROOT_ID);\n }\n // Preload nội dung file previewable để thumbnail/preview có sẵn ngay.\n void this.preloadFileContents(entries);\n },\n error: (err) => {\n console.error(err);\n this.loading.set(false);\n this.errorMsg.set(\n 'Không tải được danh sách. Kiểm tra Apps Script và quyền truy cập Drive.'\n );\n },\n });\n }\n\n /**\n * Sau khi có metadata entry, preload dataUrl cho các file previewable\n * chưa có `content/previewUrl` để UI hiển thị ảnh ngay, không cần click từng file.\n *\n * Chạy song song để tăng tốc độ tải file.\n */\n private async preloadFileContents(entries: ExplorerEntry[]): Promise<void> {\n const runId = ++this.preloadRunId;\n const candidates = entries.filter(\n (e) => e.type === 'file' && this.isPreviewableFile(e) && !e.previewUrl && !e.content\n );\n\n if (candidates.length === 0) return;\n\n try {\n // Lấy tất cả IDs cần preload\n const ids = candidates.map((entry) => entry.id);\n\n // Gọi service để tải song song\n const resultsMap = await firstValueFrom(this.explorerService.getMultipleFileDataUrls(ids));\n\n // Kiểm tra nếu component đã bị hủy trong lúc loading\n if (runId !== this.preloadRunId) return;\n\n // Update tất cả entries đã có data\n this.entries.update((arr) =>\n arr.map((e) => {\n const result = resultsMap.get(e.id);\n if (!result?.dataUrl) return e;\n\n return {\n ...e,\n content: result.dataUrl,\n previewUrl: result.dataUrl,\n mimeType: e.mimeType || result.mimeType || undefined,\n sizeBytes: e.sizeBytes || result.sizeBytes || undefined,\n };\n })\n );\n } catch (err) {\n console.warn('preloadFileContents failed', err);\n }\n }\n\n refresh() {\n this.loadEntries();\n }\n\n // ===== Navigation =====\n openFolder(id: number) {\n this.currentFolderId.set(id);\n }\n\n /**\n * Gọi từ tab khác (vd Y tế): chuyển sang thư mục chứa file và mở preview.\n */\n revealFileEntry(entryId: number): void {\n const entry = this.entriesById().get(entryId);\n if (!entry || entry.type !== 'file') return;\n if (entry.parentId !== null) {\n this.currentFolderId.set(entry.parentId);\n }\n this.closeSearch();\n if (this.isPreviewableFile(entry)) {\n void this.openPreview(entry);\n }\n this.pulseHighlight(entry.id);\n }\n\n goToCrumb(id: number) {\n this.currentFolderId.set(id);\n }\n\n goRoot() {\n this.currentFolderId.set(this.ROOT_ID);\n }\n\n // ===== View mode =====\n setViewMode(mode: ViewMode) {\n this.viewMode.set(mode);\n try {\n localStorage.setItem(VIEW_MODE_KEY, mode);\n } catch {\n /* ignore quota / private mode */\n }\n }\n\n private loadViewMode(): ViewMode {\n try {\n const v = localStorage.getItem(VIEW_MODE_KEY);\n if (v === 'large' || v === 'icons' || v === 'detail') return v;\n } catch {\n /* ignore */\n }\n return 'large';\n }\n\n // ===== Folder dropdown menu =====\n toggleFolderMenu(ev?: Event) {\n ev?.stopPropagation();\n this.selectActionsMenuOpen.set(false);\n this.itemActionsMenuOpen.set(null);\n this.folderMenuOpen.update((v) => !v);\n }\n\n closeFolderMenu() {\n this.folderMenuOpen.set(false);\n }\n\n // ===== Selection actions ellipsis menu =====\n toggleSelectActionsMenu(ev?: Event) {\n ev?.stopPropagation();\n this.itemActionsMenuOpen.set(null);\n this.selectActionsMenuOpen.update((v) => !v);\n }\n\n closeSelectActionsMenu() {\n this.selectActionsMenuOpen.set(false);\n }\n\n // ===== Per-entry actions dropdown =====\n toggleItemActionsMenu(entryId: number, ev?: Event): void {\n ev?.stopPropagation();\n this.folderMenuOpen.set(false);\n this.selectActionsMenuOpen.set(false);\n this.itemActionsMenuOpen.update((id) => (id === entryId ? null : entryId));\n }\n\n closeItemActionsMenu(): void {\n this.itemActionsMenuOpen.set(null);\n }\n\n // ===== Search =====\n /**\n * Mở thanh search (hoặc đóng nếu đang mở). Khi đóng → clear query.\n * Khi mở → focus input ở chu kỳ tick kế tiếp (tránh template chưa render).\n */\n toggleSearch(ev?: Event) {\n ev?.stopPropagation();\n const next = !this.searchOpen();\n this.searchOpen.set(next);\n if (!next) {\n this.searchQuery.set('');\n } else {\n // Đóng các overlay khác đang mở để tránh xung đột.\n this.folderMenuOpen.set(false);\n this.selectActionsMenuOpen.set(false);\n this.itemActionsMenuOpen.set(null);\n // Focus input sau khi *ngIf render xong.\n setTimeout(() => {\n const el = document.querySelector('.docs-search-input') as HTMLInputElement | null;\n el?.focus();\n el?.select();\n }, 0);\n }\n }\n\n closeSearch() {\n this.searchOpen.set(false);\n this.searchQuery.set('');\n }\n\n /** Hai-way binding cho input search (dùng `[ngModel]` + change). */\n setSearchQuery(v: string) {\n this.searchQuery.set(v);\n }\n\n /**\n * Click 1 result trong list:\n * - Folder → navigate vào.\n * - File → set folder hiện tại = parent của file (để breadcrumb +\n * siblings preview đúng), sau đó mở preview.\n * Đóng search và pulse highlight trên item ~1.5s.\n */\n clickSearchResult(entry: ExplorerEntry, ev?: Event) {\n ev?.stopPropagation();\n this.closeSearch();\n if (entry.type === 'folder') {\n this.openFolder(entry.id);\n } else {\n if (entry.parentId !== null) {\n this.currentFolderId.set(entry.parentId);\n }\n if (this.isPreviewableFile(entry)) {\n void this.openPreview(entry);\n }\n }\n this.pulseHighlight(entry.id);\n }\n\n /**\n * Bật highlight ngắn hạn cho 1 entry — UI bind class `is-flash` để pulse.\n * Tự tắt sau 1.5s. Cancel timer cũ nếu user click liên tiếp nhiều result.\n */\n private pulseHighlight(id: number) {\n if (this.highlightTimer) clearTimeout(this.highlightTimer);\n this.highlightedEntryId.set(id);\n this.highlightTimer = setTimeout(() => {\n this.highlightedEntryId.set(null);\n this.highlightTimer = null;\n }, 1500);\n }\n\n /**\n * Build path string của 1 entry (vd \"docs / reports / 2026-04\") — không\n * gồm tên entry, chỉ ancestor chain (loại root). Dùng trong search result\n * để user biết item nằm ở đâu.\n */\n getEntryPath(entry: ExplorerEntry): string {\n const map = this.entriesById();\n const parts: string[] = [];\n let safety = 32;\n let cur: ExplorerEntry | undefined =\n entry.parentId !== null ? map.get(entry.parentId) : undefined;\n while (cur && safety-- > 0) {\n if (cur.id === this.ROOT_ID) break;\n parts.unshift(cur.name);\n cur = cur.parentId !== null ? map.get(cur.parentId) : undefined;\n }\n return parts.length ? parts.join(' / ') : 'Thư mục gốc';\n }\n\n /**\n * Cắt 1 string thành các segment {text, match} để render <mark> highlight\n * cho phần khớp query. Case-insensitive. Empty query → nguyên chuỗi.\n *\n * Vẫn giữ được chữ hoa/thường gốc (chỉ dùng lower để tìm vị trí). Không\n * normalize accent — user gõ có dấu hay không thì cứ match nguyên dạng,\n * giữ logic đơn giản và dự đoán được.\n */\n highlightSegments(name: string, query: string): { text: string; match: boolean }[] {\n const q = query.trim().toLowerCase();\n if (!q) return [{ text: name, match: false }];\n const lower = name.toLowerCase();\n const segments: { text: string; match: boolean }[] = [];\n let i = 0;\n while (i < name.length) {\n const idx = lower.indexOf(q, i);\n if (idx === -1) {\n segments.push({ text: name.slice(i), match: false });\n break;\n }\n if (idx > i) segments.push({ text: name.slice(i, idx), match: false });\n segments.push({ text: name.slice(idx, idx + q.length), match: true });\n i = idx + q.length;\n }\n return segments;\n }\n\n /** Đóng tất cả popover khi click ra ngoài (bỏ qua click trong `.docs-menu`). */\n @HostListener('document:click', ['$event'])\n onDocumentClick(ev: Event) {\n const t = ev.target;\n if (t instanceof Element && t.closest('.docs-menu')) return;\n if (this.folderMenuOpen()) this.folderMenuOpen.set(false);\n if (this.selectActionsMenuOpen()) this.selectActionsMenuOpen.set(false);\n if (this.itemActionsMenuOpen() !== null) this.itemActionsMenuOpen.set(null);\n }\n\n // ===== Folder + File add / rename =====\n openAddFolder() {\n this.folderMenuOpen.set(false);\n this.itemActionsMenuOpen.set(null);\n this.folderDraft.set({ mode: 'add', entryType: 'folder', name: '' });\n this.errorMsg.set('');\n }\n\n /** Đổi tên folder HIỆN TẠI (folder đang đứng trong). Disabled ở root. */\n openRenameCurrentFolder() {\n this.folderMenuOpen.set(false);\n this.itemActionsMenuOpen.set(null);\n const cur = this.currentFolder();\n if (!cur || cur.id === this.ROOT_ID) return;\n this.folderDraft.set({\n mode: 'rename',\n entryType: 'folder',\n targetId: cur.id,\n name: cur.name,\n });\n this.errorMsg.set('');\n }\n\n openRenameFolder(entry: ExplorerEntry) {\n if (entry.type !== 'folder') return;\n this.closeItemActionsMenu();\n this.folderDraft.set({\n mode: 'rename',\n entryType: 'folder',\n targetId: entry.id,\n name: entry.name,\n });\n this.errorMsg.set('');\n }\n\n /**\n * Đổi tên 1 file. Tách base name khỏi extension trước khi đặt vào input\n * — user không phải lo chuyện gõ `.jpg`. Lúc submit sẽ tự ghép lại trừ\n * khi user gõ extension khác (ví dụ chuyển `.png`).\n */\n openRenameFile(entry: ExplorerEntry, ev?: Event) {\n ev?.stopPropagation();\n if (entry.type !== 'file') return;\n this.closeItemActionsMenu();\n const ext = this.extractExtension(entry.name);\n const base = ext ? entry.name.slice(0, -ext.length) : entry.name;\n this.folderDraft.set({\n mode: 'rename',\n entryType: 'file',\n targetId: entry.id,\n name: base,\n extension: ext || '.jpg',\n });\n this.errorMsg.set('');\n }\n\n /**\n * Trích phần extension cuối tên file (bao gồm dấu chấm). Chấp nhận\n * 2-5 ký tự alphanum sau dấu chấm cuối cùng để tránh nhầm với tên có\n * dấu chấm ở giữa (vd `2026.04.29-cat.jpg` → `.jpg`).\n */\n private extractExtension(filename: string): string {\n const m = filename.match(/(\\.[a-z0-9]{2,5})$/i);\n return m ? m[1] : '';\n }\n\n closeFolderDraft() {\n this.folderDraft.set(null);\n }\n\n updateFolderDraftName(v: string) {\n this.folderDraft.update((d) => (d ? { ...d, name: v } : d));\n }\n\n submitFolderDraft() {\n const d = this.folderDraft();\n if (!d) return;\n let name = d.name.trim();\n if (!name) {\n this.errorMsg.set(\n d.entryType === 'file' ? 'Vui lòng nhập tên file.' : 'Vui lòng nhập tên thư mục.'\n );\n return;\n }\n\n // Đảm bảo file luôn có extension:\n // - Nếu user gõ tay extension khác (vd `.png`) → tôn trọng.\n // - Nếu không có extension → ghép lại extension gốc đã tách lúc mở\n // modal (`d.extension`). Fallback `.jpg` cho trường hợp file legacy\n // không có extension và đang được rename lần đầu.\n if (d.entryType === 'file' && !/\\.[a-z0-9]{2,5}$/i.test(name)) {\n name = `${name}${d.extension || '.jpg'}`;\n }\n\n if (d.mode === 'add') {\n this.saving.set(true);\n this.errorMsg.set('');\n this.explorerService\n .addEntry({\n name,\n type: 'folder',\n parentId: this.currentFolderId(),\n })\n .subscribe({\n next: () => {\n this.saving.set(false);\n this.folderDraft.set(null);\n this.flashSuccess(`Đã tạo thư mục \"${name}\"`);\n // Log activity (non-blocking)\n const folderName = this.currentFolder()?.name || 'Gốc';\n this.activityLogService\n .logDocument('System', 'FOLDER_ADDED', { name, folder: folderName })\n .subscribe();\n setTimeout(() => this.loadEntries(), 800);\n },\n error: (err) => {\n this.saving.set(false);\n this.errorMsg.set(err?.message || 'Tạo thư mục thất bại.');\n },\n });\n } else if (d.mode === 'rename' && d.targetId) {\n this.saving.set(true);\n this.errorMsg.set('');\n const targetId = d.targetId;\n const oldEntry = this.entriesById().get(targetId);\n const oldName = oldEntry?.name || '';\n this.explorerService.updateEntry(targetId, { name }).subscribe({\n next: () => {\n this.saving.set(false);\n this.folderDraft.set(null);\n // Cập nhật cục bộ entry trong preview nếu user vừa đổi tên ảnh\n // đang xem — tránh phải đợi reload mới thấy tên mới.\n this.previewEntry.update((p) => (p && p.id === targetId ? { ...p, name } : p));\n this.flashSuccess(`Đã đổi tên thành \"${name}\"`);\n // Log activity (non-blocking)\n const eventType = d.entryType === 'folder' ? 'FOLDER_RENAMED' : 'FILE_RENAMED';\n this.activityLogService\n .logDocument('System', eventType, { oldName, newName: name })\n .subscribe();\n setTimeout(() => this.loadEntries(), 800);\n },\n error: (err) => {\n this.saving.set(false);\n this.errorMsg.set(err?.message || 'Đổi tên thất bại.');\n },\n });\n }\n }\n\n // ===== Delete =====\n deleteEntry(entry: ExplorerEntry) {\n if (entry.id === this.ROOT_ID) return;\n this.closeItemActionsMenu();\n const isFolder = entry.type === 'folder';\n const childCount = this.entries().filter((e) => e.parentId === entry.id).length;\n\n let msg: string;\n if (isFolder) {\n msg =\n childCount > 0\n ? `Xoá thư mục \"${entry.name}\"?\\n\\nThư mục này chứa ${childCount} mục con — TẤT CẢ con cháu cũng sẽ bị xoá vĩnh viễn.`\n : `Xoá thư mục \"${entry.name}\"?`;\n } else {\n msg = `Xoá ảnh \"${entry.name}\"?`;\n }\n if (!confirm(msg)) return;\n\n this.errorMsg.set('');\n this.explorerService.deleteEntry(entry.id).subscribe({\n next: () => {\n this.flashSuccess(\n isFolder ? `Đã xoá thư mục \"${entry.name}\"` : `Đã xoá ảnh \"${entry.name}\"`\n );\n // Log activity (non-blocking)\n const eventType = isFolder ? 'FOLDER_DELETED' : 'FILE_DELETED';\n this.activityLogService.logDocument('System', eventType, { name: entry.name }).subscribe();\n setTimeout(() => this.loadEntries(), 800);\n },\n error: (err) => {\n this.errorMsg.set(err?.message || 'Xoá thất bại.');\n },\n });\n }\n\n // ===== File upload (multi) =====\n /**\n * Upload nhiều file ảnh tuần tự. Mỗi file:\n * 1) Compress xuống ≤ MAX_CELL_CHARS (~49.000 ký tự / cell Sheets).\n * 2) Gọi `addEntry`. Apps Script tự stamp `created_at`.\n *\n * Tuần tự (chứ không Promise.all) vì Apps Script web app chạy đơn nhiệm\n * — gửi parallel chỉ tốn time-out chứ không nhanh hơn.\n */\n async onFileSelected(input: HTMLInputElement) {\n const files = Array.from(input.files || []);\n if (files.length === 0) return;\n\n const tooLargeFiles = files.filter((f) => f.size > MAX_UPLOAD_BYTES);\n const acceptedFiles = files.filter((f) => f.size > 0 && f.size <= MAX_UPLOAD_BYTES);\n\n if (acceptedFiles.length === 0) {\n this.errorMsg.set(\n tooLargeFiles.length > 0\n ? 'Tất cả file vượt quá 10MB. Hãy chọn file nhỏ hơn.'\n : 'Không có file hợp lệ để tải lên.'\n );\n input.value = '';\n return;\n }\n\n this.saving.set(true);\n this.errorMsg.set('');\n this.uploadProgress.set({\n done: 0,\n total: acceptedFiles.length,\n failed: tooLargeFiles.length,\n });\n\n const targetParent = this.currentFolderId();\n let success = 0;\n let failed = tooLargeFiles.length;\n const failedNames: string[] = [];\n for (const f of tooLargeFiles) {\n failedNames.push(`${f.name}: vượt quá 10MB`);\n }\n\n for (let i = 0; i < acceptedFiles.length; i++) {\n const file = acceptedFiles[i];\n try {\n const safeName = this.sanitizeFilename(file.name || `file-${Date.now()}`);\n const dataUrl = this.isImageFile(file)\n ? await this.compressUntilFits(file)\n : await this.explorerService.fileToDataUrl(file);\n const mimeType = this.resolveMimeType(file, dataUrl);\n const sizeBytes = this.extractSizeFromDataUrl(dataUrl) || file.size || undefined;\n\n await firstValueFrom(\n this.explorerService.addEntry({\n name: safeName,\n type: 'file',\n parentId: targetParent,\n content: dataUrl,\n mimeType,\n sizeBytes,\n })\n );\n success++;\n // Log activity (non-blocking)\n const folderName = this.currentFolder()?.name || 'Gốc';\n this.activityLogService\n .logDocument('System', 'FILE_ADDED', { name: safeName, folder: folderName })\n .subscribe();\n } catch (e: unknown) {\n failed++;\n failedNames.push(`${file.name}: ${e instanceof Error ? e.message : 'lỗi không rõ'}`);\n } finally {\n this.uploadProgress.update((p) => (p ? { ...p, done: success } : p));\n }\n }\n\n this.saving.set(false);\n this.uploadProgress.set(null);\n input.value = '';\n\n if (success > 0 && failed === 0) {\n this.flashSuccess(success === 1 ? 'Đã tải lên 1 file' : `Đã tải lên ${success} file`);\n } else if (success > 0 && failed > 0) {\n this.flashSuccess(`Đã tải lên ${success}/${success + failed} file`);\n this.errorMsg.set(\n failedNames.length > 0\n ? `Lỗi: ${failedNames.slice(0, 3).join(' | ')}`\n : `${failed} file thất bại.`\n );\n } else {\n this.errorMsg.set(\n failedNames.length > 0\n ? `Tải lên thất bại: ${failedNames.slice(0, 3).join(' | ')}`\n : 'Tải lên thất bại.'\n );\n }\n\n if (success > 0) {\n setTimeout(() => this.loadEntries(), 1000);\n }\n }\n\n /** Safari/iOS: ảnh chụp có thể không có MIME hoặc là HEIC. */\n private isImageFile(f: File): boolean {\n const t = (f.type || '').toLowerCase();\n if (t.startsWith('image/')) return true;\n if (!t && /\\.(jpe?g|png|gif|webp|heic|heif|bmp|avif|dng)$/i.test(f.name)) {\n return true;\n }\n return false;\n }\n\n private resolveMimeType(file: File, dataUrl: string): string {\n const fromFile = (file.type || '').trim().toLowerCase();\n if (fromFile) return fromFile;\n const m = dataUrl.match(/^data:([^;]+);/i);\n if (m?.[1]) return m[1].toLowerCase();\n return 'application/octet-stream';\n }\n\n private extractSizeFromDataUrl(dataUrl: string): number {\n const commaIdx = dataUrl.indexOf(',');\n const payload = commaIdx >= 0 ? dataUrl.slice(commaIdx + 1) : dataUrl;\n if (!payload) return 0;\n const len = payload.length;\n let padding = 0;\n if (payload.endsWith('==')) padding = 2;\n else if (payload.endsWith('=')) padding = 1;\n return Math.max(0, Math.floor((len * 3) / 4) - padding);\n }\n\n /**\n * Resize-compress ảnh thử nhiều bậc tới khi <= MAX_CELL_CHARS hoặc fail.\n *\n * Server cho phép tổng ~4.9M ký tự (chia 100 cells), nên các bậc đầu giữ\n * chất lượng rất cao (2048/0.92). Chỉ rớt xuống bậc thấp khi ảnh quá khổ\n * (chụp DSLR / panorama). Bậc thấp cuối cùng (480/0.55) thường ~30-40KB\n * — gần như chắc chắn fit dù ảnh ban đầu là gì.\n */\n private async compressUntilFits(file: File): Promise<string> {\n const tries: Array<[number, number]> = [\n [2048, 0.92],\n [1920, 0.9],\n [1600, 0.88],\n [1280, 0.84],\n [1024, 0.8],\n [820, 0.74],\n [640, 0.65],\n [480, 0.55],\n ];\n let last = '';\n for (const [size, q] of tries) {\n last = await this.explorerService.fileToCompressedBase64(file, size, q);\n if (last.length <= MAX_CELL_CHARS) return last;\n }\n throw new Error(\n `Ảnh quá lớn (${Math.round(last.length / 1024)}KB sau khi nén tối đa). Thử ảnh nhỏ hơn.`\n );\n }\n\n // ===== File preview =====\n /**\n * Click vào file (file card riêng — không phải detail row):\n * - Nếu đang `selectMode` → toggle chọn.\n * - Bình thường → mở preview.\n */\n onFileClick(entry: ExplorerEntry) {\n if (entry.type !== 'file') return;\n if (this.selectMode()) {\n this.toggleSelectEntry(entry.id);\n return;\n }\n if (!this.isPreviewableFile(entry)) {\n void this.downloadEntry(entry);\n return;\n }\n void this.openPreview(entry);\n }\n\n /**\n * Click cho cả folder + file (detail row + grid):\n * - Trong `selectMode`: toggle chọn entry (folder + file đều được).\n * - Bình thường: folder → navigate, file → preview.\n *\n * Lưu ý: vì selectMode hijack click trên folder để toggle, user muốn\n * chuyển sang folder khác trong lúc đang chọn thì phải dùng breadcrumb.\n */\n onEntryClick(entry: ExplorerEntry) {\n if (this.selectMode()) {\n if (entry.id === this.ROOT_ID) return;\n this.toggleSelectEntry(entry.id);\n return;\n }\n if (entry.type === 'folder') {\n this.openFolder(entry.id);\n return;\n }\n if (!this.isPreviewableFile(entry)) {\n void this.downloadEntry(entry);\n return;\n }\n void this.openPreview(entry);\n }\n\n private async openPreview(entry: ExplorerEntry) {\n // Mỗi lần mở 1 ảnh mới → reset zoom/pan để khỏi dính state ảnh trước.\n this.resetPreviewZoom();\n const hydrated = await this.hydrateFileContent(entry);\n if (!hydrated) {\n this.errorMsg.set('Không tải được nội dung file để xem trước.');\n return;\n }\n this.previewEntry.set(hydrated);\n }\n\n closePreview() {\n this.previewEntry.set(null);\n this.resetPreviewZoom();\n this.pointers.clear();\n this.panStart = null;\n this.pinchStart = null;\n this.previewInteracting.set(false);\n this.didPan = false;\n }\n\n /**\n * Chuyển sang ảnh trước trong cùng thư mục. Reset zoom/pan trước khi\n * đổi để ảnh mới luôn fit tự nhiên. No-op khi đã ở ảnh đầu.\n */\n async prevImage(ev?: Event) {\n ev?.stopPropagation();\n if (!this.canPreviewPrev()) return;\n const siblings = this.previewSiblings();\n const idx = this.previewIndex();\n await this.openPreview(siblings[idx - 1]);\n }\n\n async nextImage(ev?: Event) {\n ev?.stopPropagation();\n if (!this.canPreviewNext()) return;\n const siblings = this.previewSiblings();\n const idx = this.previewIndex();\n await this.openPreview(siblings[idx + 1]);\n }\n\n // ===== Preview zoom + pan handlers =====\n /**\n * Đặt lại scale=1, tx=ty=0 và bỏ \"interacting\". Gọi khi mở/đóng preview\n * hoặc khi user bấm vào label \"100%\".\n */\n resetPreviewZoom() {\n this.previewScale.set(1);\n this.previewTx.set(0);\n this.previewTy.set(0);\n }\n\n zoomInPreview(ev?: Event) {\n ev?.stopPropagation();\n this.applyZoom(this.previewScale() * this.ZOOM_STEP);\n }\n\n zoomOutPreview(ev?: Event) {\n ev?.stopPropagation();\n this.applyZoom(this.previewScale() / this.ZOOM_STEP);\n }\n\n /**\n * Lõi của zoom: đặt scale mới (đã clamp), điều chỉnh translate để giữ\n * `anchor` (toạ độ viewport — ví dụ vị trí chuột / midpoint pinch) đứng\n * yên. Nếu không có anchor → zoom quanh tâm stage (giảm tỉ lệ translate\n * theo cùng `ratio` để hiệu ứng zoom-from-center).\n *\n * Công thức: với `centerX/Y` = tâm stage và điểm anchor `P`, để giữ P\n * đứng yên trong viewport sau khi đổi scale theo tỉ lệ r = newScale/oldScale:\n * newTx = (P.x - centerX) * (1 - r) + tx * r\n * newTy = (P.y - centerY) * (1 - r) + ty * r\n * Khi scale chạm về 1.0 thì snap luôn translate về 0 để ảnh tự fit.\n */\n private applyZoom(\n targetScale: number,\n anchor?: { x: number; y: number; centerX: number; centerY: number }\n ) {\n const oldScale = this.previewScale();\n const clamped = Math.min(this.MAX_ZOOM, Math.max(this.MIN_ZOOM, targetScale));\n if (Math.abs(clamped - oldScale) < 0.001) return;\n\n if (clamped <= this.MIN_ZOOM + 0.001) {\n this.resetPreviewZoom();\n return;\n }\n\n const ratio = clamped / oldScale;\n const tx = this.previewTx();\n const ty = this.previewTy();\n if (anchor) {\n const kx = anchor.x - anchor.centerX;\n const ky = anchor.y - anchor.centerY;\n this.previewTx.set(kx * (1 - ratio) + tx * ratio);\n this.previewTy.set(ky * (1 - ratio) + ty * ratio);\n } else {\n this.previewTx.set(tx * ratio);\n this.previewTy.set(ty * ratio);\n }\n this.previewScale.set(clamped);\n }\n\n /**\n * Wheel zoom: lăn lên = zoom in, lăn xuống = zoom out. Anchor = vị trí\n * con trỏ → \"zoom toward cursor\" trải nghiệm tự nhiên.\n *\n * `passive: false` cần thiết để gọi `preventDefault()` ngăn page scroll.\n * Angular template binding mặc định không passive nên `preventDefault`\n * có hiệu lực.\n */\n onPreviewWheel(ev: WheelEvent) {\n if (!this.previewEntry()) return;\n ev.preventDefault();\n const stage = ev.currentTarget as HTMLElement;\n const rect = stage.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const factor = ev.deltaY < 0 ? 1.15 : 1 / 1.15;\n this.applyZoom(this.previewScale() * factor, {\n x: ev.clientX,\n y: ev.clientY,\n centerX,\n centerY,\n });\n }\n\n /**\n * Pointerdown: track pointer + bắt đầu pan (1 pointer) hoặc pinch (2 pointer).\n * Sau khi có 2 pointer → huỷ panStart, ưu tiên pinch.\n */\n onPreviewPointerDown(ev: PointerEvent) {\n if (!this.previewEntry()) return;\n const stage = ev.currentTarget as HTMLElement;\n try {\n stage.setPointerCapture(ev.pointerId);\n } catch {\n /* ignore: 1 số browser/touch không hỗ trợ */\n }\n this.pointers.set(ev.pointerId, { x: ev.clientX, y: ev.clientY });\n this.didPan = false;\n this.previewInteracting.set(true);\n\n if (this.pointers.size >= 2) {\n this.startPinch(stage);\n this.panStart = null;\n } else if (this.previewScale() > 1.001) {\n // Chỉ cho pan khi đang zoom-in (scale=1 thì ảnh đã fit, kéo vô nghĩa).\n this.panStart = {\n x: ev.clientX,\n y: ev.clientY,\n tx: this.previewTx(),\n ty: this.previewTy(),\n };\n } else {\n this.panStart = null;\n }\n }\n\n onPreviewPointerMove(ev: PointerEvent) {\n if (!this.pointers.has(ev.pointerId)) return;\n this.pointers.set(ev.pointerId, { x: ev.clientX, y: ev.clientY });\n\n if (this.pointers.size >= 2 && this.pinchStart) {\n this.updatePinch();\n return;\n }\n\n if (this.panStart && this.pointers.size === 1) {\n const dx = ev.clientX - this.panStart.x;\n const dy = ev.clientY - this.panStart.y;\n if (!this.didPan && Math.hypot(dx, dy) > 4) this.didPan = true;\n this.previewTx.set(this.panStart.tx + dx);\n this.previewTy.set(this.panStart.ty + dy);\n }\n }\n\n onPreviewPointerUp(ev: PointerEvent) {\n this.pointers.delete(ev.pointerId);\n if (this.pointers.size < 2) this.pinchStart = null;\n if (this.pointers.size === 0) {\n this.panStart = null;\n this.previewInteracting.set(false);\n } else if (this.pointers.size === 1 && this.previewScale() > 1.001) {\n // Vừa nhả 1 ngón pinch → chuyển sang pan với ngón còn lại.\n const remaining = Array.from(this.pointers.values())[0];\n this.panStart = {\n x: remaining.x,\n y: remaining.y,\n tx: this.previewTx(),\n ty: this.previewTy(),\n };\n }\n }\n\n /**\n * Double-click / double-tap: toggle giữa 1x ↔ 2.5x quanh điểm bấm.\n * Nhanh hơn click nhiều lần nút +/-, đặc biệt trên touch.\n */\n onPreviewDblClick(ev: MouseEvent) {\n if (!this.previewEntry()) return;\n const stage = ev.currentTarget as HTMLElement;\n const rect = stage.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const target = this.previewScale() > 1.01 ? 1 : 2.5;\n this.applyZoom(target, { x: ev.clientX, y: ev.clientY, centerX, centerY });\n ev.preventDefault();\n }\n\n /**\n * Phím tắt:\n * Khi search đang mở:\n * Esc → đóng search\n * Khi đang xem preview:\n * Esc → đóng\n * +/- → zoom in / out\n * 0 → reset zoom\n * ← / → → ảnh trước / sau trong cùng thư mục\n * Khi không có overlay nào:\n * / → mở search (focus input)\n *\n * Bỏ qua nếu user đang gõ trong input/textarea/contenteditable — TRỪ khi\n * input đó là search box (Esc vẫn phải đóng được search).\n */\n @HostListener('document:keydown', ['$event'])\n onDocumentKeydown(ev: KeyboardEvent) {\n const target = ev.target as HTMLElement | null;\n const tag = target?.tagName;\n const inSearchInput = !!target?.classList?.contains('docs-search-input');\n const typing = tag === 'INPUT' || tag === 'TEXTAREA' || target?.isContentEditable;\n\n // Esc đóng search ngay cả khi đang focus search-input.\n if (this.searchOpen() && ev.key === 'Escape') {\n ev.preventDefault();\n this.closeSearch();\n return;\n }\n\n // Còn lại: nếu đang gõ trong field thường → bỏ qua (trừ search input đã xử trên).\n if (typing && !inSearchInput) return;\n\n // Phím `/` mở search khi không có overlay nào (modal/preview/search).\n if (!this.previewEntry() && !this.searchOpen() && !this.folderDraft() && ev.key === '/') {\n ev.preventDefault();\n this.toggleSearch();\n return;\n }\n\n if (!this.previewEntry()) return;\n\n if (ev.key === 'Escape') {\n ev.preventDefault();\n this.closePreview();\n } else if (ev.key === '+' || ev.key === '=') {\n ev.preventDefault();\n this.zoomInPreview();\n } else if (ev.key === '-' || ev.key === '_') {\n ev.preventDefault();\n this.zoomOutPreview();\n } else if (ev.key === '0') {\n ev.preventDefault();\n this.resetPreviewZoom();\n } else if (ev.key === 'ArrowLeft') {\n ev.preventDefault();\n this.prevImage();\n } else if (ev.key === 'ArrowRight') {\n ev.preventDefault();\n this.nextImage();\n }\n }\n\n private startPinch(stage: HTMLElement) {\n const pts = Array.from(this.pointers.values());\n if (pts.length < 2) return;\n const [a, b] = pts;\n const dist = Math.hypot(a.x - b.x, a.y - b.y);\n const midX = (a.x + b.x) / 2;\n const midY = (a.y + b.y) / 2;\n const rect = stage.getBoundingClientRect();\n this.pinchStart = {\n dist: dist || 1,\n scale: this.previewScale(),\n tx: this.previewTx(),\n ty: this.previewTy(),\n midX,\n midY,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n };\n }\n\n private updatePinch() {\n const start = this.pinchStart;\n if (!start) return;\n const pts = Array.from(this.pointers.values());\n if (pts.length < 2) return;\n const [a, b] = pts;\n const dist = Math.hypot(a.x - b.x, a.y - b.y);\n const ratio = dist / start.dist;\n const target = Math.min(this.MAX_ZOOM, Math.max(this.MIN_ZOOM, start.scale * ratio));\n const r = target / start.scale;\n const kx = start.midX - start.centerX;\n const ky = start.midY - start.centerY;\n this.previewScale.set(target);\n this.previewTx.set(kx * (1 - r) + start.tx * r);\n this.previewTy.set(ky * (1 - r) + start.ty * r);\n this.didPan = true;\n }\n\n // ===== Selection (multi-select files) =====\n toggleSelectMode() {\n if (this.selectMode()) {\n this.selectedIds.set(new Set());\n this.selectMode.set(false);\n } else {\n this.selectMode.set(true);\n }\n }\n\n /** Bật select mode rồi tích sẵn 1 entry (long-press / nút trên card). */\n startSelectionWith(id: number) {\n if (id === this.ROOT_ID) return;\n this.closeItemActionsMenu();\n const s = new Set(this.selectedIds());\n s.add(id);\n this.selectedIds.set(s);\n this.selectMode.set(true);\n }\n\n /** Toggle 1 entry (file hoặc folder). Không cho thêm root. */\n toggleSelectEntry(id: number) {\n if (id === this.ROOT_ID) return;\n const s = new Set(this.selectedIds());\n if (s.has(id)) s.delete(id);\n else s.add(id);\n this.selectedIds.set(s);\n }\n\n isSelected(id: number): boolean {\n return this.selectedIds().has(id);\n }\n\n /** Chọn / bỏ chọn tất cả entry ở folder hiện tại (cả folder + file, trừ root). */\n toggleSelectAllInCurrent() {\n const ids = this.currentChildren()\n .filter((e) => e.id !== this.ROOT_ID)\n .map((e) => e.id);\n if (ids.length === 0) return;\n\n const sel = new Set(this.selectedIds());\n const allHere = ids.every((id) => sel.has(id));\n if (allHere) {\n ids.forEach((id) => sel.delete(id));\n } else {\n ids.forEach((id) => sel.add(id));\n }\n this.selectedIds.set(sel);\n }\n\n clearSelection() {\n this.selectedIds.set(new Set());\n }\n\n exitSelectMode() {\n this.selectedIds.set(new Set());\n this.selectMode.set(false);\n }\n\n // ===== Clipboard (cut & paste files + folders) =====\n /**\n * Cắt các entry đang được tích chọn (file + folder) vào clipboard. Loại\n * root nếu lỡ lọt. Server sẽ check chu kỳ ở paste, client cũng check\n * trước để có UX tốt hơn.\n */\n cutSelection() {\n this.closeSelectActionsMenu();\n const ids = Array.from(this.selectedIds()).filter(\n (id) => id !== this.ROOT_ID && this.entriesById().has(id)\n );\n if (ids.length === 0) {\n this.errorMsg.set('Không có mục nào để cắt.');\n return;\n }\n\n this.clipboard.set({ ids });\n this.exitSelectMode();\n\n const folderCount = ids.filter((id) => this.entriesById().get(id)?.type === 'folder').length;\n const fileCount = ids.length - folderCount;\n const parts: string[] = [];\n if (folderCount > 0) parts.push(`${folderCount} thư mục`);\n if (fileCount > 0) parts.push(`${fileCount} file`);\n this.flashSuccess(`Đã cắt ${parts.join(' + ')} — vào thư mục đích rồi bấm \"Dán vào đây\"`);\n }\n\n cancelClipboard() {\n this.clipboard.set(null);\n }\n\n /**\n * Paste tại folder hiện tại. Trước khi gọi server, validate:\n * 1. Bỏ các entry đã ở target.\n * 2. Nếu trong clipboard có folder F, target không được là F hoặc bất\n * kỳ descendant nào của F (sẽ tạo chu kỳ vô hạn).\n * Server cũng check lần nữa để đảm bảo dữ liệu nhất quán.\n */\n pasteHere() {\n const cb = this.clipboard();\n if (!cb || cb.ids.length === 0) return;\n\n const target = this.currentFolderId();\n const map = this.entriesById();\n\n // [1] Bỏ entry đã ở target — không cần move.\n const candidates = cb.ids.filter((id) => {\n const e = map.get(id);\n return e && e.parentId !== target;\n });\n if (candidates.length === 0) {\n this.clipboard.set(null);\n this.flashSuccess('Các mục đã ở đúng thư mục này.');\n return;\n }\n\n // [2] Cycle check: target không được là chính folder cắt hoặc descendant.\n const targetAncestors = this.getAncestorIds(target);\n targetAncestors.add(target);\n const cycle = candidates.find((id) => {\n const e = map.get(id);\n return e?.type === 'folder' && targetAncestors.has(id);\n });\n if (cycle !== undefined) {\n const cycleEntry = map.get(cycle);\n this.errorMsg.set(\n `Không thể dán \"${cycleEntry?.name || cycle}\" vào chính nó hoặc thư mục con của nó.`\n );\n return;\n }\n\n this.saving.set(true);\n this.errorMsg.set('');\n const targetName = this.currentFolder()?.name || 'thư mục gốc';\n this.explorerService.moveEntries(candidates, target).subscribe({\n next: () => {\n this.saving.set(false);\n const count = candidates.length;\n this.clipboard.set(null);\n this.flashSuccess(`Đã chuyển ${count} mục vào \"${targetName}\"`);\n // Log activity for each moved item (non-blocking)\n for (const id of candidates) {\n const entry = map.get(id);\n if (entry) {\n this.activityLogService\n .logDocument('System', 'FILE_MOVED', { name: entry.name, toFolder: targetName })\n .subscribe();\n }\n }\n setTimeout(() => this.loadEntries(), 800);\n },\n error: (err) => {\n this.saving.set(false);\n this.errorMsg.set(err?.message || 'Chuyển mục thất bại.');\n },\n });\n }\n\n /**\n * Trả về Set chứa id của tất cả ancestor (loại trừ chính nó). Dùng cho\n * cycle check khi paste folder.\n */\n private getAncestorIds(id: number): Set<number> {\n const ancestors = new Set<number>();\n const map = this.entriesById();\n let cur: ExplorerEntry | undefined = map.get(id);\n let safety = 64;\n while (cur && safety-- > 0) {\n const pid = cur.parentId;\n if (pid === null) break;\n ancestors.add(pid);\n cur = map.get(pid);\n }\n return ancestors;\n }\n\n // ===== Download =====\n /**\n * Tải 1 ảnh về máy. Dùng cho cả trường hợp click nút download trên card,\n * trong detail row, và trong preview. Convert `data:image/...;base64,...`\n * → Blob → ObjectURL → trigger anchor click.\n *\n * Lý do dùng Blob thay vì set thẳng `<a href=\"data:...\">`: Safari + một\n * số mobile browser từ chối download data URL dài (>~2MB). Blob ổn hơn.\n */\n async downloadEntry(entry: ExplorerEntry, ev?: Event) {\n ev?.stopPropagation();\n this.closeItemActionsMenu();\n if (entry.type !== 'file') return;\n try {\n const hydrated = await this.hydrateFileContent(entry);\n if (!hydrated?.content) {\n this.errorMsg.set('File chưa có nội dung để tải xuống.');\n return;\n }\n this.triggerDownload(hydrated.content, hydrated.name);\n this.flashSuccess(`Đã tải \"${entry.name}\"`);\n } catch (e) {\n console.error('downloadEntry failed', e);\n this.errorMsg.set('Tải xuống thất bại.');\n }\n }\n\n /**\n * Tải nhiều ảnh đã chọn (multi-select). Trigger lần lượt với một\n * khoảng delay nhỏ giữa các lần để tránh browser chặn pop-up \"site này\n * muốn tải nhiều file\" — đa số trình duyệt cho phép sau khi user accept\n * 1 lần đầu trong session.\n */\n async bulkDownloadSelection() {\n this.closeSelectActionsMenu();\n const ids = Array.from(this.selectedIds()).filter((id) => {\n const e = this.entriesById().get(id);\n return e?.type === 'file';\n });\n if (ids.length === 0) {\n this.errorMsg.set('Không có file nào để tải xuống.');\n return;\n }\n\n this.errorMsg.set('');\n this.uploadProgress.set({ done: 0, total: ids.length, failed: 0 });\n\n const map = this.entriesById();\n let done = 0;\n let failed = 0;\n for (let i = 0; i < ids.length; i++) {\n const e = map.get(ids[i]);\n if (!e) {\n failed++;\n continue;\n }\n try {\n const hydrated = await this.hydrateFileContent(e);\n if (!hydrated?.content) {\n failed++;\n continue;\n }\n this.triggerDownload(hydrated.content, hydrated.name);\n done++;\n } catch (err) {\n console.warn('triggerDownload failed', e.name, err);\n failed++;\n }\n this.uploadProgress.update((p) => (p ? { ...p, done, failed } : p));\n // Delay nhỏ giữa các download để browser không nuốt request.\n if (i < ids.length - 1) {\n await new Promise((r) => setTimeout(r, 180));\n }\n }\n this.uploadProgress.set(null);\n\n if (failed === 0) {\n this.flashSuccess(`Đã tải ${done} file`);\n } else {\n this.flashSuccess(`Đã tải ${done}/${ids.length} file`);\n if (failed > 0) {\n this.errorMsg.set(`${failed} file không tải được.`);\n }\n }\n }\n\n /** Trigger tải xuống 1 file qua anchor + Blob URL. */\n private triggerDownload(dataUrl: string, rawName: string) {\n const blob = this.dataUrlToBlob(dataUrl);\n const objectUrl = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = objectUrl;\n a.download = this.sanitizeFilename(rawName);\n a.rel = 'noopener';\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n a.remove();\n // Revoke sau 1s để chắc chắn browser đã start download.\n setTimeout(() => URL.revokeObjectURL(objectUrl), 1000);\n }\n\n /**\n * Convert `data:<mime>;base64,<payload>` → Blob. Nếu không phải base64\n * data URL thì throw → caller hiển thị error.\n */\n private dataUrlToBlob(dataUrl: string): Blob {\n const commaIdx = dataUrl.indexOf(',');\n if (commaIdx < 0) throw new Error('Data URL không hợp lệ');\n const header = dataUrl.slice(0, commaIdx);\n const payload = dataUrl.slice(commaIdx + 1);\n const mimeMatch = header.match(/data:([^;]+)/);\n const mime = mimeMatch ? mimeMatch[1] : 'application/octet-stream';\n const isBase64 = /;base64/i.test(header);\n if (!isBase64) {\n // Plain text data URL — fall back to UTF-8 bytes.\n const bytes = new TextEncoder().encode(decodeURIComponent(payload));\n return new Blob([bytes], { type: mime });\n }\n const bin = atob(payload);\n const arr = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i);\n return new Blob([arr], { type: mime });\n }\n\n /**\n * Lọc bỏ ký tự không hợp lệ trong filename trên các OS chính (Windows\n * khắt khe nhất). Đảm bảo có extension; nếu thiếu thì append `.jpg`\n * vì uploads của app đều convert sang JPEG.\n */\n private sanitizeFilename(name: string): string {\n // eslint-disable-next-line no-control-regex\n const cleaned = (name || 'image').replace(/[\\\\/:*?\"<>|\\x00-\\x1f]+/g, '_').trim();\n const safe = cleaned.length > 0 ? cleaned : 'image';\n return safe.slice(0, 200);\n }\n\n isPreviewableFile(entry: ExplorerEntry): boolean {\n if (entry.type !== 'file') return false;\n const mime = (entry.mimeType || '').toLowerCase();\n if (mime.startsWith('image/')) return true;\n return /\\.(jpe?g|png|gif|webp|heic|heif|bmp|avif|dng)$/i.test(entry.name);\n }\n\n private async hydrateFileContent(entry: ExplorerEntry): Promise<ExplorerEntry | null> {\n if (entry.type !== 'file') return entry;\n if (entry.previewUrl) {\n return { ...entry, content: entry.previewUrl };\n }\n if (entry.content) return entry;\n\n try {\n const resp = await firstValueFrom(this.explorerService.getFileDataUrl(entry.id));\n const content = resp.dataUrl || '';\n if (!content) return null;\n const patched: ExplorerEntry = {\n ...entry,\n content,\n previewUrl: content,\n mimeType: entry.mimeType || resp.mimeType || undefined,\n sizeBytes: entry.sizeBytes || resp.sizeBytes || undefined,\n };\n this.entries.update((arr) =>\n arr.map((e) => (e.id === patched.id ? { ...e, ...patched } : e))\n );\n return patched;\n } catch (err) {\n console.error('hydrateFileContent failed', err);\n return null;\n }\n }\n\n // ===== Bulk delete =====\n /**\n * Xoá hàng loạt: cả folder lẫn file. Server soft-delete folder cascading\n * sang descendant. Confirm message phân biệt số lượng folder/file để\n * user nhận thức được phạm vi.\n */\n bulkDeleteSelection() {\n this.closeSelectActionsMenu();\n const ids = Array.from(this.selectedIds()).filter(\n (id) => id !== this.ROOT_ID && this.entriesById().has(id)\n );\n if (ids.length === 0) return;\n\n const map = this.entriesById();\n const folderCount = ids.filter((id) => map.get(id)?.type === 'folder').length;\n const fileCount = ids.length - folderCount;\n const parts: string[] = [];\n if (folderCount > 0) parts.push(`${folderCount} thư mục`);\n if (fileCount > 0) parts.push(`${fileCount} file`);\n const summary = parts.join(' + ');\n const warn =\n folderCount > 0 ? '\\n\\nTẤT CẢ file con & thư mục con bên trong cũng sẽ bị xoá.' : '';\n if (!confirm(`Xoá ${summary} đã chọn?${warn}`)) return;\n\n this.deleteSequentially(ids);\n }\n\n /**\n * Xoá tuần tự nhiều entry. Apps Script đơn nhiệm/sequential nên gọi\n * tuần tự an toàn hơn parallel.\n */\n private async deleteSequentially(ids: number[]) {\n this.saving.set(true);\n this.errorMsg.set('');\n let done = 0;\n let failed = 0;\n for (const id of ids) {\n try {\n await firstValueFrom(this.explorerService.deleteEntry(id));\n done++;\n } catch (e) {\n failed++;\n console.warn('deleteEntry failed', id, e);\n }\n }\n this.saving.set(false);\n this.exitSelectMode();\n if (failed === 0) {\n this.flashSuccess(`Đã xoá ${done} mục`);\n } else {\n this.errorMsg.set(`Xoá xong ${done}/${ids.length}, ${failed} lỗi.`);\n }\n setTimeout(() => this.loadEntries(), 1000);\n }\n\n // ===== Helpers =====\n private flashSuccess(msg: string) {\n this.successMsg.set(msg);\n setTimeout(() => this.successMsg.set(''), 3000);\n }\n\n isEmpty(): boolean {\n return !this.loading() && this.currentChildren().length === 0;\n }\n\n /** Số ảnh trong 1 folder (đếm con trực tiếp + con cháu type=file). */\n countFilesInFolder(folderId: number): number {\n const all = this.entries();\n const stack = [folderId];\n const visited = new Set<number>();\n let count = 0;\n while (stack.length) {\n const cur = stack.pop()!;\n if (visited.has(cur)) continue;\n visited.add(cur);\n for (const e of all) {\n if (e.parentId === cur) {\n if (e.type === 'file') count++;\n else stack.push(e.id);\n }\n }\n }\n return count;\n }\n\n // ===== Formatters =====\n /** \"12 KB\", \"1.4 MB\", v.v. */\n formatSize(bytes?: number): string {\n if (!bytes || bytes <= 0) return '—';\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(bytes < 10 * 1024 ? 1 : 0)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n }\n\n /** \"29/04/2026\" hoặc \"29/04/2026 14:30\" tuỳ độ dài input. */\n formatDate(iso?: string): string {\n if (!iso) return '—';\n const d = new Date(iso);\n if (isNaN(d.getTime())) {\n // Fallback: đôi khi sheet trả về Date object đã format sẵn (string).\n return iso;\n }\n const dd = String(d.getDate()).padStart(2, '0');\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const yy = d.getFullYear();\n const hh = String(d.getHours()).padStart(2, '0');\n const mi = String(d.getMinutes()).padStart(2, '0');\n return `${dd}/${mm}/${yy} ${hh}:${mi}`;\n }\n\n /** Label tóm tắt cho folder trong detail view: \"5 mục\" / \"trống\". */\n describeFolderContent(folderId: number): string {\n const all = this.entries();\n let folders = 0;\n let files = 0;\n for (const e of all) {\n if (e.parentId === folderId) {\n if (e.type === 'folder') folders++;\n else files++;\n }\n }\n if (folders === 0 && files === 0) return 'Trống';\n const parts: string[] = [];\n if (folders > 0) parts.push(`${folders} thư mục`);\n if (files > 0) parts.push(`${files} file`);\n return parts.join(' · ');\n }\n\n /** Label viewMode (cho aria/title) */\n viewModeLabel(mode: ViewMode): string {\n switch (mode) {\n case 'large':\n return 'Biểu tượng lớn';\n case 'icons':\n return 'Biểu tượng nhỏ';\n case 'detail':\n return 'Chi tiết';\n }\n }\n}\n","<div class=\"docs\" [attr.data-view]=\"viewMode()\" [class.is-search]=\"searchOpen()\">\n <!--\n Path bar: Home icon đứng đầu kiêm vai trò \"về root\", theo sau là\n breadcrumb. Khi đang ở root chỉ thấy mỗi icon Home (đậm) → đỡ chữ\n \"Thư mục\" thừa và mũi tên \"lên 1 cấp\" (user đã có thể bấm thẳng vào\n crumb cha hoặc Home). Refresh đặt ở header trang `feeding.component`\n cho thống nhất, reload đồng thời cả Feeds + Documents.\n -->\n <header class=\"docs-toolbar\" [class.searching]=\"searchOpen()\">\n <!-- Breadcrumb (ẩn khi search bật) -->\n @if (!searchOpen()) {\n <nav class=\"docs-crumbs\" aria-label=\"Đường dẫn thư mục\">\n <button\n type=\"button\"\n class=\"docs-crumb home\"\n [class.last]=\"breadcrumbs().length === 0\"\n (click)=\"goRoot()\"\n [disabled]=\"breadcrumbs().length === 0\"\n [title]=\"breadcrumbs().length === 0 ? 'Thư mục gốc' : 'Về thư mục gốc'\"\n aria-label=\"Thư mục gốc\"\n >\n <i class=\"pi pi-home\"></i>\n </button>\n @for (c of breadcrumbs(); track c; let last = $last; let first = $first) {\n <i class=\"pi pi-chevron-right docs-crumb-sep\"></i>\n <button\n type=\"button\"\n class=\"docs-crumb\"\n [class.last]=\"last\"\n (click)=\"goToCrumb(c.id)\"\n [disabled]=\"last\"\n >\n <i class=\"pi\" [class.pi-folder-open]=\"last\" [class.pi-folder]=\"!last\"></i>\n {{ c.name }}\n </button>\n }\n </nav>\n }\n\n <!-- Search input (chiếm chỗ breadcrumb khi mở) -->\n @if (searchOpen()) {\n <div class=\"docs-search-bar\">\n <i class=\"pi pi-search docs-search-bar__icon\"></i>\n <input\n type=\"text\"\n class=\"docs-search-input\"\n [ngModel]=\"searchQuery()\"\n (ngModelChange)=\"setSearchQuery($event)\"\n name=\"docsSearch\"\n placeholder=\"Tìm thư mục hoặc ảnh…\"\n autocomplete=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n aria-label=\"Tìm trong tài liệu\"\n />\n @if (searchQuery().length > 0) {\n <button\n type=\"button\"\n class=\"docs-search-bar__clear\"\n (click)=\"setSearchQuery('')\"\n aria-label=\"Xoá nội dung tìm\"\n title=\"Xoá\"\n >\n <i class=\"pi pi-times-circle\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Toggle button: search ↔ close -->\n <button\n type=\"button\"\n class=\"docs-icon-btn search-toggle\"\n [class.active]=\"searchOpen()\"\n (click)=\"toggleSearch($event)\"\n [attr.aria-label]=\"searchOpen() ? 'Đóng tìm kiếm' : 'Mở tìm kiếm'\"\n [title]=\"searchOpen() ? 'Đóng tìm kiếm (Esc)' : 'Tìm kiếm (/)'\"\n >\n <i class=\"pi\" [class.pi-search]=\"!searchOpen()\" [class.pi-times]=\"searchOpen()\"></i>\n </button>\n </header>\n\n <!-- ============ Search results ============ -->\n @if (searchOpen()) {\n <section class=\"docs-search-results\" aria-live=\"polite\">\n @if (searchQuery().trim().length === 0) {\n <div class=\"docs-search-results__hint\">\n <i class=\"pi pi-info-circle\"></i>\n Gõ tên thư mục hoặc ảnh để tìm. Bấm <kbd>Esc</kbd> để đóng.\n </div>\n }\n @if (searchQuery().trim().length > 0 && searchResults().length === 0) {\n <div class=\"docs-search-results__empty\">\n <i class=\"pi pi-search\"></i>\n Không tìm thấy mục nào khớp với\n <strong>\"{{ searchQuery() }}\"</strong>.\n </div>\n }\n @if (searchResults().length > 0) {\n <div class=\"docs-search-results__count\">{{ searchResults().length }} kết quả</div>\n }\n @if (searchResults().length > 0) {\n <ul class=\"docs-search-list\" role=\"list\">\n @for (r of searchResults(); track r) {\n <li>\n <button\n type=\"button\"\n class=\"docs-search-row\"\n (click)=\"clickSearchResult(r, $event)\"\n [attr.data-type]=\"r.type\"\n >\n <span class=\"docs-search-row__thumb\">\n @if (r.type === 'folder') {\n <i class=\"pi pi-folder\"></i>\n }\n @if (r.type === 'file') {\n @if (r.content) {\n <img [src]=\"r.content\" alt=\"\" />\n } @else {\n <i class=\"pi pi-image\"></i>\n }\n }\n </span>\n <span class=\"docs-search-row__body\">\n <span class=\"docs-search-row__name\">\n @for (seg of highlightSegments(r.name, searchQuery()); track seg) {\n @if (seg.match) {\n <mark>{{ seg.text }}</mark>\n }\n @if (!seg.match) {\n {{ seg.text }}\n }\n }\n </span>\n <span class=\"docs-search-row__path\">\n <i class=\"pi pi-folder\"></i>\n {{ getEntryPath(r) }}\n </span>\n </span>\n <i class=\"pi pi-arrow-right docs-search-row__go\"></i>\n </button>\n </li>\n }\n </ul>\n }\n </section>\n }\n\n <!-- ============ Action bar (folder menu + view modes) ============ -->\n <div class=\"docs-actions\">\n <!-- Folder dropdown menu -->\n <div class=\"docs-menu\" (click)=\"$event.stopPropagation()\">\n <button\n type=\"button\"\n class=\"docs-btn primary\"\n (click)=\"toggleFolderMenu($event)\"\n [class.open]=\"folderMenuOpen()\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"folderMenuOpen()\"\n >\n <i class=\"pi pi-folder\"></i>\n <span>Thư mục</span>\n <i class=\"pi pi-chevron-down docs-menu-caret\"></i>\n </button>\n\n @if (folderMenuOpen()) {\n <div class=\"docs-menu-pop\" role=\"menu\">\n <button type=\"button\" class=\"docs-menu-item\" role=\"menuitem\" (click)=\"openAddFolder()\">\n <i class=\"pi pi-plus\"></i>\n <span>Thêm thư mục</span>\n </button>\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"openRenameCurrentFolder()\"\n [disabled]=\"isAtRoot()\"\n [title]=\"isAtRoot() ? 'Không đổi tên được thư mục gốc' : 'Đổi tên thư mục hiện tại'\"\n >\n <i class=\"pi pi-pencil\"></i>\n <span>Đổi tên thư mục hiện tại</span>\n </button>\n </div>\n }\n </div>\n\n <!-- Select-mode toggle -->\n <button\n type=\"button\"\n class=\"docs-btn ghost\"\n [class.active]=\"selectMode()\"\n (click)=\"toggleSelectMode()\"\n [title]=\"selectMode() ? 'Thoát chế độ chọn' : 'Chọn nhiều ảnh'\"\n [attr.aria-pressed]=\"selectMode()\"\n >\n <i class=\"pi\" [class.pi-check-square]=\"selectMode()\" [class.pi-check]=\"!selectMode()\"></i>\n <span>{{ selectMode() ? 'Đang chọn' : 'Chọn' }}</span>\n </button>\n\n <!-- View mode toggle -->\n <div class=\"docs-views\" role=\"group\" aria-label=\"Chế độ xem\">\n <button\n type=\"button\"\n class=\"docs-view-btn\"\n [class.active]=\"viewMode() === 'large'\"\n (click)=\"setViewMode('large')\"\n [attr.aria-pressed]=\"viewMode() === 'large'\"\n title=\"Biểu tượng lớn\"\n >\n <i class=\"pi pi-th-large\"></i>\n </button>\n <button\n type=\"button\"\n class=\"docs-view-btn\"\n [class.active]=\"viewMode() === 'icons'\"\n (click)=\"setViewMode('icons')\"\n [attr.aria-pressed]=\"viewMode() === 'icons'\"\n title=\"Biểu tượng nhỏ\"\n >\n <i class=\"pi pi-table\"></i>\n </button>\n <button\n type=\"button\"\n class=\"docs-view-btn\"\n [class.active]=\"viewMode() === 'detail'\"\n (click)=\"setViewMode('detail')\"\n [attr.aria-pressed]=\"viewMode() === 'detail'\"\n title=\"Chi tiết\"\n >\n <i class=\"pi pi-list\"></i>\n </button>\n </div>\n </div>\n\n <!-- ============ Selection action bar ============ -->\n @if (selectMode()) {\n <div class=\"docs-bar selection\">\n <div class=\"docs-bar__lead\">\n <i class=\"pi pi-check-square\"></i>\n <strong>{{ selectedCount() }}</strong>\n <span class=\"docs-bar__sub\">mục đã chọn</span>\n </div>\n <div class=\"docs-bar__actions\">\n <button\n type=\"button\"\n class=\"docs-btn ghost small\"\n (click)=\"toggleSelectAllInCurrent()\"\n [disabled]=\"folderCount() + fileCount() === 0\"\n [title]=\"\n allFilesSelected() ? 'Bỏ chọn tất cả ở thư mục này' : 'Chọn tất cả mục ở thư mục này'\n \"\n >\n <i\n class=\"pi\"\n [class.pi-times-circle]=\"allFilesSelected()\"\n [class.pi-check-circle]=\"!allFilesSelected()\"\n ></i>\n <span>{{ allFilesSelected() ? 'Bỏ chọn tất cả' : 'Chọn tất cả' }}</span>\n </button>\n <!--\n Gom Tải xuống / Cắt / Xoá vào dropdown 3-chấm để bar gọn gàng,\n đặc biệt trên mobile. Disabled trigger khi chưa chọn mục nào.\n Tải xuống disabled riêng nếu selection chỉ toàn folder.\n -->\n <div class=\"docs-menu select-actions\" (click)=\"$event.stopPropagation()\">\n <button\n type=\"button\"\n class=\"docs-btn ghost small icon-only\"\n (click)=\"toggleSelectActionsMenu($event)\"\n [class.open]=\"selectActionsMenuOpen()\"\n [disabled]=\"selectedCount() === 0 || saving()\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"selectActionsMenuOpen()\"\n [title]=\"\n selectedCount() === 0 ? 'Chọn mục để xem thao tác' : 'Thao tác với các mục đã chọn'\n \"\n >\n <i class=\"pi pi-ellipsis-v\"></i>\n </button>\n @if (selectActionsMenuOpen()) {\n <div class=\"docs-menu-pop docs-menu-pop--right\" role=\"menu\">\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"bulkDownloadSelection()\"\n [disabled]=\"saving() || !selectionHasFile()\"\n [title]=\"!selectionHasFile() ? 'Không có ảnh nào trong selection để tải' : ''\"\n >\n <i class=\"pi pi-download\"></i>\n <span>Tải xuống</span>\n </button>\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"cutSelection()\"\n [disabled]=\"saving()\"\n >\n <i class=\"pi pi-clone\"></i>\n <span>Cắt</span>\n </button>\n <button\n type=\"button\"\n class=\"docs-menu-item danger\"\n role=\"menuitem\"\n (click)=\"bulkDeleteSelection()\"\n [disabled]=\"saving()\"\n >\n <i class=\"pi pi-trash\"></i>\n <span>Xoá</span>\n </button>\n </div>\n }\n </div>\n <button type=\"button\" class=\"docs-btn ghost small\" (click)=\"exitSelectMode()\">\n <i class=\"pi pi-times\"></i>\n <span>Huỷ</span>\n </button>\n </div>\n </div>\n }\n\n <!-- ============ Paste bar (clipboard active) ============ -->\n @if (clipboard(); as cb) {\n <div class=\"docs-bar paste\">\n <div class=\"docs-bar__lead\">\n <i class=\"pi pi-clone\"></i>\n <strong>{{ cb.ids.length }}</strong>\n <span class=\"docs-bar__sub\">mục đang cắt — chọn thư mục đích rồi dán</span>\n </div>\n <div class=\"docs-bar__actions\">\n <button\n type=\"button\"\n class=\"docs-btn primary small\"\n (click)=\"pasteHere()\"\n [disabled]=\"saving()\"\n >\n <i\n class=\"pi\"\n [class.pi-arrow-down]=\"!saving()\"\n [class.pi-spinner]=\"saving()\"\n [class.pi-spin]=\"saving()\"\n ></i>\n <span>{{ saving() ? 'Đang dán…' : 'Dán vào đây' }}</span>\n </button>\n <button type=\"button\" class=\"docs-btn ghost small\" (click)=\"cancelClipboard()\">\n <i class=\"pi pi-times\"></i>\n <span>Huỷ cắt</span>\n </button>\n </div>\n </div>\n }\n\n <!-- ============ Upload progress ============ -->\n @if (uploadProgress(); as up) {\n <div class=\"docs-bar progress\">\n <div class=\"docs-bar__lead\">\n <i class=\"pi pi-spin pi-spinner\"></i>\n <strong>{{ up.done }}/{{ up.total }}</strong>\n <span class=\"docs-bar__sub\">đang tải lên…</span>\n </div>\n <div class=\"docs-bar__progress-track\">\n <div\n class=\"docs-bar__progress-fill\"\n [style.width.%]=\"up.total > 0 ? (up.done * 100) / up.total : 0\"\n ></div>\n </div>\n </div>\n }\n\n <!-- ============ Toasts ============ -->\n @if (successMsg()) {\n <div class=\"docs-toast success\"><i class=\"pi pi-check-circle\"></i> {{ successMsg() }}</div>\n }\n @if (errorMsg()) {\n <div class=\"docs-toast error\"><i class=\"pi pi-exclamation-triangle\"></i> {{ errorMsg() }}</div>\n }\n\n <!-- ============ Loading ============ -->\n @if (loading() && entries().length === 0) {\n <div class=\"docs-loading\">\n <i class=\"pi pi-spin pi-spinner\"></i>\n Đang tải dữ liệu…\n </div>\n }\n\n <!-- ============ Empty ============ -->\n @if (isEmpty()) {\n <div class=\"docs-empty\">\n <div class=\"docs-empty__icon\">📁</div>\n <h3>Thư mục trống</h3>\n <p>\n Tạo thư mục con từ menu <strong>Thư mục</strong>, hoặc nhấn nút <strong>+</strong> ở góc\n dưới để tải ảnh lên.\n </p>\n </div>\n }\n\n <!-- ============ Detail view (table) ============ -->\n @if (viewMode() === 'detail' && currentChildren().length > 0) {\n <div class=\"docs-detail\">\n <div class=\"docs-detail__head\">\n <div class=\"dh-name\">Tên</div>\n <div class=\"dh-size\">Kích thước</div>\n <div class=\"dh-date\">Ngày tạo</div>\n <div class=\"dh-actions\" aria-label=\"Thao tác\"></div>\n </div>\n @for (entry of currentChildren(); track entry) {\n <button\n type=\"button\"\n class=\"docs-row\"\n [class.folder]=\"entry.type === 'folder'\"\n [class.file]=\"entry.type === 'file'\"\n [class.selected]=\"isSelected(entry.id)\"\n [class.is-flash]=\"highlightedEntryId() === entry.id\"\n (click)=\"onEntryClick(entry)\"\n >\n <div class=\"dr-name\">\n @if (selectMode() && entry.id !== 1) {\n <span class=\"dr-checkbox\" [class.checked]=\"isSelected(entry.id)\" aria-hidden=\"true\">\n @if (isSelected(entry.id)) {\n <i class=\"pi pi-check\"></i>\n }\n </span>\n }\n <span class=\"dr-thumb\">\n @if (entry.type === 'folder') {\n <i class=\"pi pi-folder-open\"></i>\n }\n @if (entry.type === 'file') {\n @if (entry.previewUrl || entry.content) {\n <img\n [src]=\"entry.previewUrl || entry.content\"\n [alt]=\"entry.name\"\n loading=\"lazy\"\n />\n } @else {\n <i class=\"pi pi-file\"></i>\n }\n }\n </span>\n <span class=\"dr-name-text\" [title]=\"entry.name\">{{ entry.name }}</span>\n </div>\n <div class=\"dr-size\">\n @if (entry.type === 'folder') {\n {{ describeFolderContent(entry.id) }}\n } @else {\n {{ formatSize(entry.sizeBytes) }}\n }\n </div>\n <div class=\"dr-date\">{{ formatDate(entry.createdAt) }}</div>\n <div class=\"dr-actions docs-menu item-actions\" (click)=\"$event.stopPropagation()\">\n <button\n type=\"button\"\n class=\"docs-icon-btn item-action-trigger\"\n (click)=\"toggleItemActionsMenu(entry.id, $event)\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"itemActionsMenuOpen() === entry.id\"\n [attr.aria-label]=\"'Mở menu thao tác cho ' + entry.name\"\n title=\"Thao tác\"\n >\n <i class=\"pi pi-ellipsis-v\"></i>\n </button>\n @if (itemActionsMenuOpen() === entry.id) {\n <div class=\"docs-menu-pop docs-menu-pop--right docs-menu-pop--item\" role=\"menu\">\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"startSelectionWith(entry.id)\"\n >\n <i class=\"pi pi-check-square\"></i>\n <span>Chọn mục này</span>\n </button>\n @if (entry.type === 'folder') {\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"openRenameFolder(entry)\"\n >\n <i class=\"pi pi-pencil\"></i>\n <span>Đổi tên thư mục</span>\n </button>\n }\n @if (entry.type === 'file') {\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"openRenameFile(entry, $event)\"\n >\n <i class=\"pi pi-pencil\"></i>\n <span>Đổi tên ảnh</span>\n </button>\n }\n @if (entry.type === 'file') {\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"downloadEntry(entry, $event)\"\n >\n <i class=\"pi pi-download\"></i>\n <span>Tải xuống</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"docs-menu-item danger\"\n role=\"menuitem\"\n (click)=\"deleteEntry(entry)\"\n >\n <i class=\"pi pi-trash\"></i>\n <span>Xoá</span>\n </button>\n </div>\n }\n </div>\n </button>\n }\n </div>\n }\n\n <!-- ============ Grid view (large / icons) ============ -->\n @if (viewMode() !== 'detail' && currentChildren().length > 0) {\n <div class=\"docs-grid\" [attr.data-mode]=\"viewMode()\">\n @for (entry of currentChildren(); track entry) {\n <!-- Folder card -->\n @if (entry.type === 'folder') {\n <article\n class=\"docs-card folder\"\n [class.selected]=\"isSelected(entry.id)\"\n [class.is-flash]=\"highlightedEntryId() === entry.id\"\n (click)=\"onEntryClick(entry)\"\n (keydown.enter)=\"onEntryClick(entry)\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"(selectMode() ? 'Chọn thư mục ' : 'Mở thư mục ') + entry.name\"\n >\n @if (selectMode()) {\n <span\n class=\"docs-card__check\"\n [class.checked]=\"isSelected(entry.id)\"\n aria-hidden=\"true\"\n >\n @if (isSelected(entry.id)) {\n <i class=\"pi pi-check\"></i>\n }\n </span>\n }\n <div class=\"docs-card__icon\">\n <i class=\"pi pi-folder-open\"></i>\n </div>\n <div class=\"docs-card__body\">\n <div class=\"docs-card__name\" [title]=\"entry.name\">{{ entry.name }}</div>\n <div class=\"docs-card__meta\">\n <span class=\"docs-card__size\">{{ describeFolderContent(entry.id) }}</span>\n @if (entry.createdAt) {\n <span class=\"docs-card__date\">\n <span class=\"docs-card__sep\">·</span>\n {{ formatDate(entry.createdAt) }}\n </span>\n }\n </div>\n </div>\n @if (!selectMode()) {\n <div\n class=\"docs-card__actions docs-menu item-actions\"\n (click)=\"$event.stopPropagation()\"\n >\n <button\n type=\"button\"\n class=\"docs-icon-btn item-action-trigger\"\n (click)=\"toggleItemActionsMenu(entry.id, $event)\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"itemActionsMenuOpen() === entry.id\"\n [attr.aria-label]=\"'Mở menu thao tác cho ' + entry.name\"\n title=\"Thao tác\"\n >\n <i class=\"pi pi-ellipsis-v\"></i>\n </button>\n @if (itemActionsMenuOpen() === entry.id) {\n <div class=\"docs-menu-pop docs-menu-pop--right docs-menu-pop--item\" role=\"menu\">\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"startSelectionWith(entry.id)\"\n >\n <i class=\"pi pi-check-square\"></i>\n <span>Chọn thư mục</span>\n </button>\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"openRenameFolder(entry)\"\n >\n <i class=\"pi pi-pencil\"></i>\n <span>Đổi tên</span>\n </button>\n <button\n type=\"button\"\n class=\"docs-menu-item danger\"\n role=\"menuitem\"\n (click)=\"deleteEntry(entry)\"\n >\n <i class=\"pi pi-trash\"></i>\n <span>Xoá thư mục</span>\n </button>\n </div>\n }\n </div>\n }\n </article>\n }\n <!-- File card -->\n @if (entry.type === 'file') {\n <article\n class=\"docs-card file\"\n [class.selected]=\"isSelected(entry.id)\"\n [class.is-flash]=\"highlightedEntryId() === entry.id\"\n (click)=\"onFileClick(entry)\"\n (keydown.enter)=\"onFileClick(entry)\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"(selectMode() ? 'Chọn file ' : 'Xem file ') + entry.name\"\n >\n @if (selectMode()) {\n <span\n class=\"docs-card__check\"\n [class.checked]=\"isSelected(entry.id)\"\n aria-hidden=\"true\"\n >\n @if (isSelected(entry.id)) {\n <i class=\"pi pi-check\"></i>\n }\n </span>\n }\n <div class=\"docs-card__thumb\">\n @if (entry.previewUrl || entry.content) {\n <img [src]=\"entry.previewUrl || entry.content\" [alt]=\"entry.name\" loading=\"lazy\" />\n } @else {\n <div class=\"docs-card__thumb-empty\">\n <i class=\"pi pi-file\"></i>\n </div>\n }\n </div>\n <div class=\"docs-card__body\">\n <div class=\"docs-card__name\" [title]=\"entry.name\">{{ entry.name }}</div>\n <div class=\"docs-card__meta\">\n <span class=\"docs-card__size\">{{ formatSize(entry.sizeBytes) }}</span>\n @if (entry.createdAt) {\n <span class=\"docs-card__date\">\n <span class=\"docs-card__sep\">·</span>\n {{ formatDate(entry.createdAt) }}\n </span>\n }\n </div>\n </div>\n @if (!selectMode()) {\n <div\n class=\"docs-card__actions docs-menu item-actions\"\n (click)=\"$event.stopPropagation()\"\n >\n <button\n type=\"button\"\n class=\"docs-icon-btn item-action-trigger\"\n (click)=\"toggleItemActionsMenu(entry.id, $event)\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"itemActionsMenuOpen() === entry.id\"\n [attr.aria-label]=\"'Mở menu thao tác cho ' + entry.name\"\n title=\"Thao tác\"\n >\n <i class=\"pi pi-ellipsis-v\"></i>\n </button>\n @if (itemActionsMenuOpen() === entry.id) {\n <div class=\"docs-menu-pop docs-menu-pop--right docs-menu-pop--item\" role=\"menu\">\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"startSelectionWith(entry.id)\"\n >\n <i class=\"pi pi-check-square\"></i>\n <span>Chọn ảnh</span>\n </button>\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"openRenameFile(entry, $event)\"\n >\n <i class=\"pi pi-pencil\"></i>\n <span>Đổi tên</span>\n </button>\n <button\n type=\"button\"\n class=\"docs-menu-item\"\n role=\"menuitem\"\n (click)=\"downloadEntry(entry, $event)\"\n >\n <i class=\"pi pi-download\"></i>\n <span>Tải xuống</span>\n </button>\n <button\n type=\"button\"\n class=\"docs-menu-item danger\"\n role=\"menuitem\"\n (click)=\"deleteEntry(entry)\"\n >\n <i class=\"pi pi-trash\"></i>\n <span>Xoá ảnh</span>\n </button>\n </div>\n }\n </div>\n }\n </article>\n }\n }\n </div>\n }\n\n <!-- ============ FAB: thêm file (ảnh + tài liệu) ============ -->\n <div class=\"docs-fab-group\" [class.disabled]=\"saving()\">\n <label\n class=\"docs-fab\"\n [class.disabled]=\"saving()\"\n [attr.aria-disabled]=\"saving()\"\n title=\"Chọn file để tải lên\"\n >\n <i\n class=\"pi\"\n [class.pi-plus]=\"!saving()\"\n [class.pi-spinner]=\"saving()\"\n [class.pi-spin]=\"saving()\"\n ></i>\n <span class=\"docs-fab__label\">{{ saving() ? 'Đang tải…' : 'Thêm file' }}</span>\n <input\n #fileInput\n type=\"file\"\n accept=\"image/*,.heic,.heif,.pdf,.txt,.doc,.docx,.xls,.xlsx,.csv\"\n multiple\n (change)=\"onFileSelected(fileInput)\"\n hidden\n [disabled]=\"saving()\"\n />\n </label>\n </div>\n\n <!-- ============ Modal: add folder / rename folder hoặc file ============ -->\n @if (folderDraft(); as draft) {\n <div class=\"docs-overlay\" (click)=\"closeFolderDraft()\">\n <div class=\"docs-modal\" (click)=\"$event.stopPropagation()\" role=\"dialog\">\n <div class=\"docs-modal__head\">\n <h3>\n <i\n class=\"pi\"\n [class.pi-folder]=\"draft.mode === 'add'\"\n [class.pi-pencil]=\"draft.mode === 'rename'\"\n ></i>\n @switch (draft.mode + ':' + draft.entryType) {\n @case ('add:folder') {\n <span>Thêm thư mục</span>\n }\n @case ('rename:folder') {\n <span>Đổi tên thư mục</span>\n }\n @case ('rename:file') {\n <span>Đổi tên ảnh</span>\n }\n @default {\n <span>Chỉnh sửa</span>\n }\n }\n </h3>\n <button\n type=\"button\"\n class=\"docs-icon-btn\"\n (click)=\"closeFolderDraft()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <form (ngSubmit)=\"submitFolderDraft()\" class=\"docs-modal__body\">\n <label class=\"docs-field\">\n <span class=\"docs-field__label\">\n {{ draft.entryType === 'file' ? 'Tên ảnh' : 'Tên thư mục' }}\n </span>\n <div\n class=\"docs-input-group\"\n [class.has-suffix]=\"draft.entryType === 'file' && !!draft.extension\"\n >\n <input\n type=\"text\"\n class=\"docs-input\"\n [ngModel]=\"draft.name\"\n (ngModelChange)=\"updateFolderDraftName($event)\"\n name=\"folderName\"\n [placeholder]=\"\n draft.entryType === 'file' ? 'VD: cat, hoa-don…' : 'VD: docs, img, hợp đồng…'\n \"\n autocomplete=\"off\"\n autofocus\n required\n maxlength=\"120\"\n />\n @if (draft.entryType === 'file' && draft.extension) {\n <span\n class=\"docs-input-suffix\"\n [title]=\"'Phần đuôi ' + draft.extension + ' được giữ tự động'\"\n >\n {{ draft.extension }}\n </span>\n }\n </div>\n @if (draft.entryType === 'file') {\n <span class=\"docs-field__hint\">\n Phần đuôi <code>{{ draft.extension || '.jpg' }}</code> được giữ tự động — bạn chỉ\n cần gõ tên.\n </span>\n }\n </label>\n @if (errorMsg()) {\n <div class=\"docs-modal__error\">\n <i class=\"pi pi-exclamation-triangle\"></i> {{ errorMsg() }}\n </div>\n }\n <div class=\"docs-modal__actions\">\n <button type=\"button\" class=\"docs-btn ghost\" (click)=\"closeFolderDraft()\">Huỷ</button>\n <button\n type=\"submit\"\n class=\"docs-btn primary\"\n [disabled]=\"saving() || !draft.name.trim()\"\n >\n <i\n class=\"pi\"\n [class.pi-check]=\"!saving()\"\n [class.pi-spinner]=\"saving()\"\n [class.pi-spin]=\"saving()\"\n ></i>\n {{ saving() ? 'Đang lưu…' : draft.mode === 'add' ? 'Tạo' : 'Lưu' }}\n </button>\n </div>\n </form>\n </div>\n </div>\n }\n\n <!-- ============ Image preview (zoom + pan) ============ -->\n @if (previewEntry(); as p) {\n <div class=\"docs-preview\">\n <button\n type=\"button\"\n class=\"docs-preview__rename\"\n (click)=\"openRenameFile(p, $event)\"\n aria-label=\"Đổi tên file\"\n title=\"Đổi tên file\"\n >\n <i class=\"pi pi-pencil\"></i>\n </button>\n <button\n type=\"button\"\n class=\"docs-preview__download\"\n (click)=\"downloadEntry(p, $event)\"\n aria-label=\"Tải file xuống máy\"\n title=\"Tải xuống\"\n >\n <i class=\"pi pi-download\"></i>\n </button>\n <button\n type=\"button\"\n class=\"docs-preview__close\"\n (click)=\"closePreview(); $event.stopPropagation()\"\n aria-label=\"Đóng (Esc)\"\n title=\"Đóng (Esc)\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n <div class=\"docs-preview__name\">\n @if (previewTotal() > 1) {\n <span class=\"docs-preview__counter\">\n {{ previewIndex() + 1 }}/{{ previewTotal() }} ·\n </span>\n }\n {{ p.name }}\n @if (p.sizeBytes || p.createdAt) {\n <span class=\"docs-preview__meta\">\n · {{ formatSize(p.sizeBytes) }}\n @if (p.createdAt) {\n · {{ formatDate(p.createdAt) }}\n }\n </span>\n }\n </div>\n <!-- Prev / Next nav: chỉ hiện khi cùng thư mục có nhiều hơn 1 ảnh.\n Disabled state vẫn render để user thấy được vị trí đầu/cuối. -->\n @if (previewTotal() > 1) {\n <button\n type=\"button\"\n class=\"docs-preview__nav prev\"\n (click)=\"prevImage($event)\"\n [disabled]=\"!canPreviewPrev()\"\n aria-label=\"Ảnh trước\"\n title=\"Ảnh trước (←)\"\n >\n <i class=\"pi pi-chevron-left\"></i>\n </button>\n }\n @if (previewTotal() > 1) {\n <button\n type=\"button\"\n class=\"docs-preview__nav next\"\n (click)=\"nextImage($event)\"\n [disabled]=\"!canPreviewNext()\"\n aria-label=\"Ảnh kế\"\n title=\"Ảnh kế (→)\"\n >\n <i class=\"pi pi-chevron-right\"></i>\n </button>\n }\n <!--\n Stage: bắt mọi gesture (wheel, pointer, dblclick). Image bên trong\n nhận transform translate+scale. KHÔNG đóng preview khi click nền —\n user phải bấm nút × hoặc nhấn Esc, tránh tình trạng vô tình tap ra\n ngoài (đặc biệt trên mobile khi đang vuốt) làm mất ảnh đang xem.\n -->\n <div\n class=\"docs-preview__stage\"\n [class.zoomed]=\"previewScale() > 1.001\"\n [class.interacting]=\"previewInteracting()\"\n (wheel)=\"onPreviewWheel($event)\"\n (pointerdown)=\"onPreviewPointerDown($event)\"\n (pointermove)=\"onPreviewPointerMove($event)\"\n (pointerup)=\"onPreviewPointerUp($event)\"\n (pointercancel)=\"onPreviewPointerUp($event)\"\n (pointerleave)=\"onPreviewPointerUp($event)\"\n (dblclick)=\"onPreviewDblClick($event)\"\n >\n @if (p.previewUrl || p.content) {\n <img\n class=\"docs-preview__img\"\n [src]=\"p.previewUrl || p.content\"\n [alt]=\"p.name\"\n [style.transform]=\"previewTransform()\"\n draggable=\"false\"\n (dragstart)=\"$event.preventDefault()\"\n />\n }\n </div>\n <!-- Zoom toolbar: hover ở dưới, hiện luôn trên touch -->\n <div class=\"docs-preview__zoom\" (click)=\"$event.stopPropagation()\">\n <button\n type=\"button\"\n class=\"docs-zoom-btn\"\n (click)=\"zoomOutPreview($event)\"\n [disabled]=\"!canZoomOut()\"\n title=\"Thu nhỏ (-)\"\n aria-label=\"Thu nhỏ\"\n >\n <i class=\"pi pi-minus\"></i>\n </button>\n <button\n type=\"button\"\n class=\"docs-zoom-btn percent\"\n (click)=\"resetPreviewZoom(); $event.stopPropagation()\"\n title=\"Đặt lại 100% (0)\"\n aria-label=\"Đặt lại zoom\"\n >\n {{ previewZoomPercent() }}%\n </button>\n <button\n type=\"button\"\n class=\"docs-zoom-btn\"\n (click)=\"zoomInPreview($event)\"\n [disabled]=\"!canZoomIn()\"\n title=\"Phóng to (+)\"\n aria-label=\"Phóng to\"\n >\n <i class=\"pi pi-plus\"></i>\n </button>\n </div>\n @if (previewScale() <= 1.001) {\n <div class=\"docs-preview__hint\">\n Cuộn hoặc bấm <i class=\"pi pi-plus\"></i> để phóng to · Nháy đôi để zoom · Esc để đóng\n </div>\n }\n </div>\n }\n\n <!--\n ============ Status bar ============\n Sticky chip ngay trên bottom-nav, hiển thị số folder + số ảnh ở\n folder hiện tại. Không bị trượt theo scroll vì position: fixed.\n Ẩn khi đang search (UI lúc đó tập trung cho list kết quả) và khi\n đang preview ảnh (tránh đè lên overlay).\n -->\n @if (!loading() && !searchOpen() && !previewEntry()) {\n <aside class=\"docs-statusbar\" aria-label=\"Tổng quan thư mục hiện tại\">\n <span class=\"docs-stat\">\n <i class=\"pi pi-folder\"></i>\n <strong>{{ folderCount() }}</strong>\n <span class=\"docs-stat__label\">thư mục</span>\n </span>\n <span class=\"docs-statusbar__sep\" aria-hidden=\"true\">·</span>\n <span class=\"docs-stat\">\n <i class=\"pi pi-image\"></i>\n <strong>{{ fileCount() }}</strong>\n <span class=\"docs-stat__label\">ảnh</span>\n </span>\n @if (currentFolder() && !isAtRoot()) {\n <span class=\"docs-statusbar__folder\" [title]=\"currentFolder()!.name\">\n <i class=\"pi pi-folder-open\"></i>\n <span>{{ currentFolder()!.name }}</span>\n </span>\n }\n </aside>\n }\n</div>\n","/**\n * Postpartum food suggestions by stage.\n *\n * Stage mốc theo ngày tuổi của bé (~ số tuần sau sinh của mẹ).\n * Nội dung tổng hợp theo tài liệu dinh dưỡng sau sinh phổ biến tại VN +\n * khuyến cáo WHO/AAP về cho con bú. Mang tính tham khảo, không thay thế\n * chỉ định của bác sĩ / chuyên gia dinh dưỡng.\n */\n\nexport interface FoodItem {\n name: string;\n note?: string;\n /** Emoji minh họa */\n emoji?: string;\n}\n\nexport interface PostpartumStage {\n id: string;\n label: string;\n /** inclusive, ngày tuổi bé */\n ageFromDays: number;\n /** exclusive */\n ageToDays: number;\n headline: string;\n description: string;\n encourage: FoodItem[];\n avoid: FoodItem[];\n tip?: string;\n accent: 'rose' | 'peach' | 'mint' | 'lavender' | 'amber';\n}\n\nexport const POSTPARTUM_STAGES: PostpartumStage[] = [\n {\n id: 'week-1-2',\n label: 'Tuần 1–2 · Hồi phục sau sinh',\n ageFromDays: 0,\n ageToDays: 14,\n headline: 'Ưu tiên dễ tiêu · ấm bụng · gọi sữa về',\n description:\n 'Dạ dày còn yếu, tập trung món ấm, lỏng, dễ tiêu. Chia nhỏ 5–6 bữa/ngày. Uống 2–2.5L nước ấm, hạn chế đồ lạnh – tanh – sống.',\n encourage: [\n { name: 'Cháo móng giò đu đủ xanh', note: 'Lợi sữa kinh điển · 1–2 bát/ngày', emoji: '🍲' },\n { name: 'Canh rau ngót thịt bằm', note: 'Giàu sắt, giúp tử cung co tốt', emoji: '🥣' },\n { name: 'Cá hồi hấp gừng', note: 'DHA cho bé, 2–3 bữa/tuần', emoji: '🐟' },\n { name: 'Trứng luộc / hấp', note: '1–2 quả/ngày', emoji: '🥚' },\n { name: 'Thịt bò kho gừng', note: 'Bổ máu, ấm bụng', emoji: '🍖' },\n { name: 'Chuối chín, đu đủ chín', note: 'Ngừa táo bón', emoji: '🍌' },\n { name: 'Nước ấm, trà gạo lứt, nước chè vằng', emoji: '🍵' },\n { name: 'Cháo yến mạch, cháo gạo lứt', note: 'Tiêu hóa nhẹ nhàng', emoji: '🥛' },\n ],\n avoid: [\n { name: 'Đồ lạnh, nước đá', note: 'Gây ê răng, lạnh bụng, ít sữa' },\n { name: 'Rau sống, gỏi, nem chua', note: 'Rủi ro nhiễm khuẩn' },\n { name: 'Hải sản tanh, mắm tôm', note: 'Có thể làm bé đầy hơi' },\n { name: 'Đồ cay nóng, tiêu ớt nhiều', note: 'Nóng sữa, bé quấy' },\n { name: 'Cà phê, trà đặc, nước ngọt có gas' },\n { name: 'Rượu, bia', note: 'Ảnh hưởng thần kinh của bé' },\n { name: 'Chiên rán ngập dầu', note: 'Khó tiêu, dễ tắc tia sữa' },\n ],\n tip: 'Ăn món còn ấm. Uống 1 cốc nước ấm trước mỗi cữ bú sẽ giúp sữa xuống nhanh hơn.',\n accent: 'rose',\n },\n {\n id: 'week-3-6',\n label: 'Tuần 3–6 · Ổn định & bứt tốc sữa',\n ageFromDays: 14,\n ageToDays: 42,\n headline: 'Đa dạng món · tăng lợi sữa · bổ máu',\n description:\n 'Tiêu hóa tốt hơn, có thể ăn đa dạng. Tập trung protein chất lượng, rau xanh đậm, hạt & ngũ cốc nguyên cám để sữa đặc, nhiều.',\n encourage: [\n { name: 'Cá chép hầm đậu đỏ', note: 'Bổ máu, lợi sữa', emoji: '🐟' },\n { name: 'Gà ác hầm thuốc bắc', note: '1–2 lần/tuần', emoji: '🍗' },\n { name: 'Canh bí đỏ đậu xanh', note: 'Vitamin A · chất xơ', emoji: '🎃' },\n { name: 'Chè vừng đen', note: 'Canxi · lợi sữa', emoji: '🖤' },\n { name: 'Yến mạch, ngũ cốc nguyên cám', emoji: '🌾' },\n { name: 'Rau lang, rau ngót, rau dền luộc', emoji: '🥬' },\n { name: 'Sữa ấm, sữa hạt (óc chó, hạnh nhân)', emoji: '🥛' },\n { name: 'Nước ép cà rốt, táo, lê', note: 'Tươi, không đá', emoji: '🥕' },\n ],\n avoid: [\n { name: 'Măng chua, dưa chua quá mặn' },\n { name: 'Đồ ăn nhanh, xúc xích, thịt hộp' },\n { name: 'Bạc hà nhiều, lá lốt quá liều', note: 'Có thể làm giảm sữa' },\n { name: 'Cà phê > 1 ly/ngày' },\n ],\n tip: 'Ăn cá béo 2–3 bữa/tuần, bổ sung 1 nắm hạt mỗi ngày. Nghỉ ngơi + skin-to-skin giúp sữa về tốt.',\n accent: 'peach',\n },\n {\n id: 'month-2-3',\n label: 'Tháng 2–3 · Dinh dưỡng cân bằng',\n ageFromDays: 42,\n ageToDays: 90,\n headline: 'Đa dạng · bổ sung canxi – DHA · đủ nước',\n description:\n 'Bé bú nhiều hơn, mẹ cần ~2200–2500 kcal/ngày. Cân bằng 4 nhóm: bột đường – đạm – béo tốt – vitamin & khoáng.',\n encourage: [\n { name: 'Cá hồi, cá thu nhỏ (cá lành)', note: '2–3 bữa/tuần (DHA)', emoji: '🐟' },\n { name: 'Thịt bò, thịt gà, trứng', note: 'Luân phiên mỗi ngày', emoji: '🥩' },\n { name: 'Sữa, sữa chua, phô mai', note: '2–3 đơn vị canxi/ngày', emoji: '🧀' },\n { name: 'Rau xanh đậm, bông cải xanh', emoji: '🥦' },\n { name: 'Trái cây: cam, kiwi, việt quất, đu đủ', emoji: '🍊' },\n { name: 'Hạt óc chó, hạnh nhân, hạt chia', note: '1 nắm/ngày', emoji: '🌰' },\n { name: 'Khoai lang, yến mạch, gạo lứt', emoji: '🍠' },\n { name: 'Đậu hũ, đậu nành (vừa phải)', emoji: '🫘' },\n ],\n avoid: [\n { name: 'Cá lớn chứa thủy ngân cao', note: 'Cá kiếm, cá ngừ đại dương' },\n { name: 'Caffeine > 200mg/ngày', note: '~1 ly cafe nhỏ' },\n { name: 'Rượu, bia', note: 'Nếu uống cần vắt bỏ cữ sau 2–3h' },\n { name: 'Đồ ăn chế biến sẵn nhiều muối' },\n ],\n tip: 'Đi vệ sinh > 6 lần/ngày và bé tăng ~150g/tuần là dấu hiệu mẹ ăn đủ, sữa đủ chất.',\n accent: 'mint',\n },\n {\n id: 'month-4-6',\n label: 'Tháng 4–6 · Duy trì sữa mẹ',\n ageFromDays: 90,\n ageToDays: 180,\n headline: 'Đa dạng · theo dõi dị ứng · giảm đường tinh',\n description:\n 'Tiếp tục ăn đủ 4 nhóm, uống 2.5–3L nước/ngày. Để ý bé có nổi mẩn/tiêu chảy sau khi mẹ ăn món lạ (trứng, hải sản, đậu phộng).',\n encourage: [\n { name: 'Cá béo 2–3 lần/tuần (DHA)', emoji: '🐠' },\n { name: 'Rau củ nhiều màu', note: 'Mỗi bữa ≥ 1 loại rau', emoji: '🌈' },\n { name: 'Trái cây đa dạng, cả trái cây chua', emoji: '🍎' },\n { name: 'Yogurt không đường, kefir', note: 'Lợi khuẩn cho mẹ & bé', emoji: '🥛' },\n { name: 'Ngũ cốc nguyên cám, khoai lang', emoji: '🌾' },\n { name: 'Thịt nạc, trứng, đậu hạt', emoji: '🥚' },\n { name: 'Nước lọc, nước dừa', note: '2.5–3L/ngày', emoji: '💧' },\n ],\n avoid: [\n { name: 'Bánh kẹo, nước ngọt', note: 'Đường tinh luyện tăng cân nhanh' },\n { name: 'Món chiên ngập dầu thường xuyên' },\n { name: 'Thực phẩm bé có biểu hiện dị ứng', note: 'Ngưng 2–4 tuần rồi thử lại' },\n { name: 'Đồ uống có cồn', note: 'Nếu bắt buộc, vắt sữa trước' },\n ],\n tip: 'Bắt đầu nghĩ đến việc giảm cân khoa học: giảm tinh bột tinh, tăng protein + rau xanh, tập đi bộ 30 phút/ngày.',\n accent: 'lavender',\n },\n {\n id: 'month-6-plus',\n label: 'Trên 6 tháng · Kết hợp ăn dặm',\n ageFromDays: 180,\n ageToDays: 999999,\n headline: 'Đa dạng · giảm dần \"khẩu phần cho 2\" · giữ sữa tốt',\n description:\n 'Bé bắt đầu ăn dặm nên sữa mẹ giảm lượng cần thiết. Mẹ có thể về chế độ ăn cân bằng cho người lớn bình thường + bổ sung canxi/omega-3.',\n encourage: [\n { name: 'Protein nạc · luân phiên nguồn', note: 'Cá, gà, đậu, trứng', emoji: '🍗' },\n { name: 'Rau xanh, trái cây ≥ 400g/ngày', emoji: '🥗' },\n { name: 'Sữa, sữa chua, phô mai', note: 'Duy trì canxi', emoji: '🧈' },\n { name: 'Dầu oliu, dầu cá, hạt', note: 'Omega-3 · béo lành', emoji: '🫒' },\n { name: 'Nước lọc · trà thảo mộc', emoji: '💧' },\n ],\n avoid: [\n { name: 'Kiêng khem cực đoan để giảm cân', note: 'Làm tụt sữa nhanh' },\n { name: 'Thực phẩm siêu chế biến, đường ẩn' },\n { name: 'Rượu, thuốc lá' },\n ],\n tip: 'Tiếp tục cho bú 2 năm theo khuyến nghị WHO. Tập thể dục 150 phút/tuần giúp giữ dáng và tinh thần tốt.',\n accent: 'amber',\n },\n];\n\n/**\n * Tìm giai đoạn phù hợp với tuổi bé (ngày).\n */\nexport function resolvePostpartumStage(ageInDays: number): PostpartumStage {\n for (const s of POSTPARTUM_STAGES) {\n if (ageInDays >= s.ageFromDays && ageInDays < s.ageToDays) return s;\n }\n return POSTPARTUM_STAGES[POSTPARTUM_STAGES.length - 1];\n}\n","export interface FeedingTip {\n category: 'feeding' | 'sleep' | 'development' | 'health' | 'mom' | 'activity';\n title: string;\n content: string;\n}\n\nexport interface PeriodGuide {\n label: string;\n summary: string;\n feedingSchedule: string;\n sleepSchedule: string;\n tips: FeedingTip[];\n}\n\nconst CAT_LABEL: Record<FeedingTip['category'], { label: string; icon: string; color: string }> = {\n feeding: { label: 'Ăn / Bú', icon: 'pi pi-apple', color: '#10b981' },\n sleep: { label: 'Ngủ', icon: 'pi pi-moon', color: '#6366f1' },\n development: { label: 'Phát triển', icon: 'pi pi-chart-line', color: '#f59e0b' },\n health: { label: 'Sức khỏe', icon: 'pi pi-heart-fill', color: '#ef4444' },\n mom: { label: 'Lưu ý cho Mẹ', icon: 'pi pi-star-fill', color: '#ec4899' },\n activity: { label: 'Hoạt động', icon: 'pi pi-sparkles', color: '#0ea5e9' },\n};\n\nexport function getCategoryMeta(cat: FeedingTip['category']) {\n return CAT_LABEL[cat];\n}\n\nexport const WEEK_GUIDES: Record<number, PeriodGuide> = {\n 1: {\n label: 'Tuần 1 – Làm quen thế giới',\n summary:\n 'Bé vừa chào đời, đang thích nghi với môi trường bên ngoài. Thời gian này bé ngủ rất nhiều và bú mẹ gần như liên tục. Sụt 5–10% cân nặng là bình thường trong 3–5 ngày đầu.',\n feedingSchedule:\n 'Bú mẹ theo nhu cầu (8–12 cữ/ngày), mỗi cữ cách nhau ~2 giờ. Ngày 1–2: sữa non 5–15ml/cữ. Ngày 3–7: 30–60ml/cữ nếu dùng sữa công thức.',\n sleepSchedule: 'Ngủ 16–18 giờ/ngày, mỗi giấc 2–3 giờ, chưa phân biệt ngày đêm.',\n tips: [\n {\n category: 'feeding',\n title: 'Cho bú sớm & da tiếp da',\n content:\n 'Cho bé bú trong vòng 1 giờ sau sinh và duy trì da tiếp da (skin-to-skin) để kích sữa non — loại \"vàng lỏng\" giàu kháng thể.',\n },\n {\n category: 'feeding',\n title: 'Đánh thức bú nếu ngủ quá 3 giờ',\n content:\n 'Trong tuần đầu bé có thể ngủ quên bú. Mẹ nhẹ nhàng đánh thức nếu cữ bú cách nhau hơn 3 giờ để tránh tụt cân.',\n },\n {\n category: 'feeding',\n title: 'Growth spurt đầu tiên (7–10 ngày)',\n content:\n 'Khoảng ngày 7–10 bé có đợt tăng trưởng nhỏ đầu tiên: đòi bú liên tục 1–2 ngày. Cho bú theo nhu cầu, không cần thêm sữa công thức.',\n },\n {\n category: 'health',\n title: 'Bổ sung Vitamin D (bú mẹ)',\n content:\n 'AAP khuyến cáo bé bú mẹ hoàn toàn cần bổ sung 400 IU vitamin D/ngày từ vài ngày sau sinh. Sữa công thức đã có sẵn nên thường không cần.',\n },\n {\n category: 'health',\n title: 'Theo dõi tã ướt',\n content:\n 'Ngày 1 ít nhất 1 tã ướt, đến ngày 5–6 nên có 6+ tã ướt/ngày. Phân chuyển từ phân su đen → vàng hoa cà hoa cải.',\n },\n {\n category: 'health',\n title: 'Vàng da sinh lý',\n content:\n 'Vàng da nhẹ thường xuất hiện ngày 2–4. Nếu da vàng đến bụng/đùi, bé bú kém hoặc ngủ li bì → đi khám ngay.',\n },\n {\n category: 'mom',\n title: 'Nghỉ ngơi song song với bé',\n content:\n 'Ngủ khi bé ngủ. Đừng cố làm việc nhà. Cơ thể mẹ cần hồi phục sau sinh — đây là tuần vàng cho việc \"ở cữ\".',\n },\n {\n category: 'mom',\n title: 'Uống đủ nước & ăn ấm',\n content:\n 'Uống 2.5–3 lít nước/ngày, ăn cháo móng giò, cá hồi, rau xanh để gọi sữa. Tránh đồ lạnh và đồ cay.',\n },\n {\n category: 'development',\n title: 'Phản xạ sơ sinh',\n content:\n 'Bé có phản xạ Moro (giật mình), phản xạ mút, nắm tay. Có thể quấn khăn (swaddle) để bé ngủ sâu hơn.',\n },\n ],\n },\n 2: {\n label: 'Tuần 2 – Hồi phục cân nặng',\n summary:\n 'Bé bắt đầu lấy lại cân nặng lúc sinh và tăng ~15–30g/ngày. Mắt bé nhìn rõ dần trong khoảng cách 20–30cm.',\n feedingSchedule: 'Bú 8–12 cữ/ngày, mỗi cữ 60–90ml sữa công thức hoặc 10–15 phút mỗi bên ngực.',\n sleepSchedule: 'Ngủ 15–17 giờ/ngày, giấc đêm có thể kéo dài 3–4 giờ.',\n tips: [\n {\n category: 'feeding',\n title: 'Kiểm tra khớp ngậm',\n content:\n 'Bé ngậm sâu (cằm chạm ngực, môi dưới lật ra, quầng vú trong miệng). Ngậm nông khiến mẹ đau và bé bú không hiệu quả.',\n },\n {\n category: 'health',\n title: 'Rụng cuống rốn',\n content:\n 'Cuống rốn thường rụng tuần 1–3. Giữ khô, không băng kín. Nếu có mùi hôi, mủ, da xung quanh đỏ → đi khám.',\n },\n {\n category: 'mom',\n title: 'Tắc tia sữa',\n content:\n 'Nếu ngực cứng, đau, có cục → chườm ấm + massage + cho bé bú bên đau trước. Không xử lý sớm có thể thành áp xe vú.',\n },\n {\n category: 'development',\n title: 'Giao tiếp bằng mắt',\n content:\n 'Bé bắt đầu nhìn chăm chú vào mặt mẹ. Hãy nói chuyện, hát ru — bé đang học ngôn ngữ từ bây giờ.',\n },\n ],\n },\n 3: {\n label: 'Tuần 3 – Growth spurt thể chất',\n summary:\n 'Đợt tăng trưởng thể chất đáng kể (growth spurt). Bé đòi bú liên tục để tăng cân 20–30g/ngày, chu vi vòng đầu tăng nhanh. KHÁC với Wonder Week (bước nhảy nhận thức — Leap 1 rơi vào tuần 5).',\n feedingSchedule:\n 'Cluster feeding (bú dồn) thường xuyên, đặc biệt buổi tối. Bé có thể đòi bú mỗi 1–1.5 giờ trong 2–3 ngày.',\n sleepSchedule:\n 'Ngủ 16–18 giờ/ngày, mỗi giấc 3–4 giờ. Có thể ngủ ít hơn chút trong đợt growth spurt.',\n tips: [\n {\n category: 'feeding',\n title: 'Growth spurt — bú theo nhu cầu',\n content:\n 'Các growth spurt xếp theo thứ tự: 7–10 ngày, tuần 3, tuần 6, tháng 3, 6, 9. Bé đòi bú liên tục — đừng nghĩ mình thiếu sữa, hãy cho bú theo nhu cầu để kích sữa.',\n },\n {\n category: 'development',\n title: 'Chưa phải Wonder Week',\n content:\n 'Growth spurt khác với Wonder Week: đợt này bé TĂNG CÂN nhanh, bú nhiều. Wonder Week đầu tiên (nhảy vọt giác quan) sẽ đến ở tuần 5.',\n },\n {\n category: 'health',\n title: 'Đau bụng colic có thể bắt đầu',\n content:\n '~15–20% trẻ sơ sinh bắt đầu có cơn colic (khóc không lý do, thường buổi tối, kéo dài 2–3 giờ) từ tuần 3. Thường hết sau 3 tháng.',\n },\n {\n category: 'mom',\n title: 'Baby blues',\n content:\n 'Nếu mẹ buồn vô cớ, khóc, lo âu → bình thường do thay đổi hormone. Nếu kéo dài > 2 tuần → cần tư vấn về trầm cảm sau sinh.',\n },\n {\n category: 'activity',\n title: 'Tummy time',\n content:\n 'Mỗi ngày 2–3 lần, mỗi lần 3–5 phút cho bé nằm sấp khi thức để cứng cổ. Luôn giám sát.',\n },\n ],\n },\n 4: {\n label: 'Tuần 4 – Nụ cười đầu tiên',\n summary:\n 'Bé có thể mỉm cười xã giao khi thấy khuôn mặt quen. Biết hóng chuyện và ê a nhẹ. Chuẩn bị cho Wonder Week 1 vào tuần 5.',\n feedingSchedule: 'Bú 7–9 cữ/ngày, mỗi cữ 90–120ml sữa công thức.',\n sleepSchedule: 'Ngủ 14–16 giờ/ngày, một giấc đêm có thể kéo dài 4–5 giờ.',\n tips: [\n {\n category: 'development',\n title: 'Kích thích giác quan',\n content: 'Treo đồ chơi đen-trắng trên nôi, cho bé nghe nhạc nhẹ, mát-xa chân tay mỗi ngày.',\n },\n {\n category: 'development',\n title: 'Sắp Wonder Week 1',\n content:\n 'Tuần 5 là leap 1 — \"World of Changing Sensations\". Dấu hiệu báo trước: bé có thể quấy hơn, bám mẹ hơn, ngủ kém vài ngày trước.',\n },\n {\n category: 'health',\n title: 'Chuẩn bị tiêm chủng',\n content:\n 'Chuẩn bị lịch tiêm 2 tháng (5in1/6in1, Rota, Phế cầu). Hỏi bác sĩ trước nếu bé có dấu hiệu bất thường.',\n },\n {\n category: 'mom',\n title: 'Đi khám hậu sản 6 tuần',\n content: 'Lên lịch khám hậu sản để kiểm tra tử cung, vết mổ/rạch và tư vấn tránh thai.',\n },\n ],\n },\n 5: {\n label: 'Tuần 5 – Wonder Week 1 (Giác quan thay đổi)',\n summary:\n 'Leap 1 — \"World of Changing Sensations\". Bước nhảy nhận thức đầu tiên: giác quan bé bỗng rõ ràng hơn, có thể quấy 3–5 ngày (\"fussy period\"). Sau leap bé nhìn – nghe – cảm nhận thế giới tinh tế hơn.',\n feedingSchedule: 'Bú 7–9 cữ/ngày, mỗi cữ 90–120ml. Có thể đòi bú dồn để tự trấn an.',\n sleepSchedule: 'Ngủ 14–16 giờ/ngày nhưng giấc ngắn, dễ tỉnh. Thường kéo dài ~1 tuần.',\n tips: [\n {\n category: 'development',\n title: 'Dấu hiệu Wonder Week 1',\n content:\n '3 chữ C: Crying (khóc nhiều hơn), Clinginess (bám mẹ), Crankiness (cáu kỉnh). Là bình thường — bé đang tập tích hợp cảm giác mới.',\n },\n {\n category: 'development',\n title: 'Sau leap bé làm được gì?',\n content:\n 'Nhìn theo đồ vật rõ hơn, phản ứng với tiếng động đa dạng, cười xã giao rõ hơn, nhận ra giọng mẹ trong nhiều giọng khác.',\n },\n {\n category: 'activity',\n title: 'Cách hỗ trợ',\n content:\n 'Ôm ấp, skin-to-skin, nói chuyện nhẹ nhàng. Tránh kích thích quá mức (đông người, đèn quá sáng). Duy trì routine ổn định.',\n },\n {\n category: 'feeding',\n title: 'Bú nhiều hơn bình thường',\n content:\n 'Không phải thiếu sữa — bé dùng bú để an tâm. Cho bú theo nhu cầu, mẹ ăn đủ, nghỉ đủ.',\n },\n {\n category: 'mom',\n title: 'Mẹ đừng lo lắng',\n content:\n 'Giai đoạn fussy chỉ kéo dài vài ngày. Sau đó bé \"nhảy\" sang kỹ năng mới. Đừng vội nghĩ bé ốm hay mình sai.',\n },\n ],\n },\n};\n\nexport const MONTH_GUIDES: Record<number, PeriodGuide> = {\n 1: {\n label: 'Tháng 1 – Tháng làm quen',\n summary:\n 'Bé dành phần lớn thời gian để ăn và ngủ. Cuối tháng bé có thể nhấc đầu vài giây khi nằm sấp.',\n feedingSchedule:\n 'Bú mẹ/sữa công thức 7–10 cữ/ngày. Đầu tháng 60–90ml/cữ, cuối tháng 90–120ml/cữ. Tổng ~600–900ml/ngày (AAP: ~2.5oz/pound cân nặng).',\n sleepSchedule: '15–17 giờ/ngày, đêm ngủ 8–9 giờ với 2–3 lần thức bú.',\n tips: [\n {\n category: 'feeding',\n title: 'Chỉ bú sữa',\n content:\n 'WHO khuyến cáo bú mẹ hoàn toàn 6 tháng đầu. Không cho uống nước, nước ép, mật ong hoặc ăn dặm sớm.',\n },\n {\n category: 'development',\n title: 'Mốc phát triển',\n content:\n 'Nhấc đầu ngắn khi nằm sấp, mắt dõi theo vật di chuyển, phản ứng với tiếng động mạnh.',\n },\n {\n category: 'health',\n title: 'Không rung lắc mạnh',\n content:\n 'Hội chứng rung lắc (Shaken Baby Syndrome) có thể gây tử vong. Dỗ bé bằng cách quấn, đung đưa nhẹ.',\n },\n {\n category: 'mom',\n title: 'Hút sữa dự trữ',\n content: 'Bắt đầu hút sữa sau 3–4 tuần để tạo kho sữa và giúp cặp vú cân đối.',\n },\n ],\n },\n 2: {\n label: 'Tháng 2 – Cười thành tiếng & Wonder Week 2',\n summary:\n 'Bé bắt đầu cười thành tiếng, hóng chuyện, ê a \"a\", \"ơ\". Nhấc đầu 45° khi nằm sấp. Leap 2 rơi vào tuần 8 — \"World of Patterns\" (nhận biết mẫu hình).',\n feedingSchedule: '7–9 cữ/ngày, mỗi cữ 120–150ml. Tổng ~700–900ml/ngày.',\n sleepSchedule: '14–16 giờ/ngày. Bắt đầu có nhịp ngày-đêm rõ hơn.',\n tips: [\n {\n category: 'development',\n title: 'Wonder Week 2 (tuần 8)',\n content:\n 'Leap 2 \"World of Patterns\": bé nhận ra mẫu hình lặp lại (ánh sáng, âm thanh, khuôn mặt). Dấu hiệu: quấy 1–2 tuần, ngắm tay mình, soi gương, chăm chú hơn.',\n },\n {\n category: 'health',\n title: 'Mũi tiêm 2 tháng',\n content:\n 'Lịch tiêm 5in1/6in1 (bạch hầu, ho gà, uốn ván, bại liệt, Hib, có thể thêm viêm gan B), Rota, Phế cầu.',\n },\n {\n category: 'development',\n title: 'Nói chuyện với bé',\n content: 'Đáp lại tiếng ê a của bé như hội thoại thật — đây là nền tảng ngôn ngữ.',\n },\n {\n category: 'activity',\n title: 'Tummy time dài hơn',\n content:\n '10–15 phút/ngày chia nhiều lần. Đặt gương hoặc đồ chơi trước mặt để bé ngẩng đầu.',\n },\n {\n category: 'mom',\n title: 'Khủng hoảng giấc ngủ',\n content: 'Có thể có \"regression\" nhẹ. Giữ routine ổn định: tắm → bú → ru ngủ.',\n },\n ],\n },\n 3: {\n label: 'Tháng 3 – Wonder Week 3 & Bé đáng yêu',\n summary:\n 'Leap 3 rơi vào tuần 12 — \"World of Smooth Transitions\" (chuyển động mượt). Sau leap là giai đoạn \"thiên thần\": bé cười nhiều, ngủ ngon hơn, ít khóc colic.',\n feedingSchedule: '6–8 cữ/ngày, mỗi cữ 120–180ml. Tổng ~800–1000ml/ngày.',\n sleepSchedule: '14–15 giờ/ngày. Giấc đêm 9–10 giờ, có thể ngủ liền 5–6 giờ.',\n tips: [\n {\n category: 'development',\n title: 'Wonder Week 3 (tuần 12)',\n content:\n 'Leap 3 \"World of Smooth Transitions\": bé nhận ra các chuyển động/âm thanh mượt, liên tục. Tiếng cười rõ ràng, giọng nói có ngữ điệu, tay chân phối hợp mượt hơn.',\n },\n {\n category: 'development',\n title: 'Cầm nắm',\n content:\n 'Đưa bé cầm lục lạc nhẹ, khăn mềm. Bé bắt đầu đưa tay vào miệng — phản xạ khám phá.',\n },\n {\n category: 'feeding',\n title: 'Chưa ăn dặm',\n content:\n 'Dù bé có thể tỏ ra thích nhìn người lớn ăn, hệ tiêu hóa chưa sẵn sàng cho đồ ăn rắn.',\n },\n {\n category: 'activity',\n title: 'Đọc sách',\n content:\n 'Sách vải, sách tương phản đen-trắng hoặc màu sắc rực rỡ. Đọc to mỗi ngày 5–10 phút.',\n },\n ],\n },\n 4: {\n label: 'Tháng 4 – Wonder Week 4 (leap lớn)',\n summary:\n 'Leap 4 rơi vào tuần 19 — \"World of Events\": bước nhảy nhận thức lớn. Kèm 4-month sleep regression: ngủ kém, bú ít, quấy nhiều.',\n feedingSchedule: '5–7 cữ/ngày, mỗi cữ 150–180ml. Tổng ~900–1100ml/ngày.',\n sleepSchedule: '13–15 giờ/ngày. Nhiều bé có \"4 month sleep regression\".',\n tips: [\n {\n category: 'sleep',\n title: 'Sleep regression',\n content:\n 'Bé thức giấc nhiều lần/đêm. Duy trì routine, cho bé học tự ngủ nhẹ (drowsy but awake).',\n },\n {\n category: 'development',\n title: 'Lật người',\n content: 'Bé bắt đầu lật từ ngửa sang sấp. Không để bé một mình trên giường/ghế sofa.',\n },\n {\n category: 'feeding',\n title: 'Chuẩn bị ăn dặm',\n content:\n 'Mua ghế ăn, yếm, thìa silicon, bát/đĩa. Tìm hiểu phương pháp: truyền thống, BLW, hoặc kết hợp.',\n },\n ],\n },\n 5: {\n label: 'Tháng 5 – Sẵn sàng khám phá',\n summary:\n 'Bé có thể lẫy thành thạo, ngồi có đỡ, với đồ vật chính xác hơn. Bắt đầu quan tâm đến thức ăn của người lớn.',\n feedingSchedule: '5–6 cữ sữa/ngày, mỗi cữ 180–210ml. Tổng ~900–1200ml/ngày.',\n sleepSchedule: '13–14 giờ/ngày, giấc ngắn ban ngày còn 2–3 giấc.',\n tips: [\n {\n category: 'feeding',\n title: 'Dấu hiệu sẵn sàng ăn dặm',\n content:\n 'Ngồi vững có đỡ, không còn phản xạ đẩy lưỡi, với đồ vào miệng, quan tâm đồ ăn người lớn.',\n },\n {\n category: 'development',\n title: 'Nhận biết tên',\n content:\n 'Bé quay đầu khi nghe gọi tên. Trò chơi \"ú òa\" rất hiệu quả cho phát triển trí nhớ.',\n },\n {\n category: 'health',\n title: 'Mọc răng',\n content:\n 'Có thể mọc răng đầu tiên (răng cửa dưới). Chảy nước dãi, cắn đồ, cáu kỉnh là bình thường.',\n },\n ],\n },\n 6: {\n label: 'Tháng 6 – Bắt đầu ăn dặm',\n summary: 'Cột mốc quan trọng: bắt đầu ăn dặm! Bé ngồi vững hơn, bò bụng, có thể có răng.',\n feedingSchedule: '5 cữ sữa + 1 bữa ăn dặm/ngày. Sữa vẫn là chính (~800–1000ml/ngày).',\n sleepSchedule: '13–14 giờ/ngày, 2 giấc ngày + 1 giấc đêm.',\n tips: [\n {\n category: 'feeding',\n title: 'Ăn dặm đúng cách',\n content:\n 'Bắt đầu bằng cháo loãng (1 gạo : 10 nước) hoặc bột ăn dặm. Thử 1 loại thực phẩm 3 ngày để phát hiện dị ứng.',\n },\n {\n category: 'feeding',\n title: 'Thực phẩm an toàn đầu tiên',\n content:\n 'Cháo gạo, khoai lang, cà rốt, bí đỏ, chuối, bơ. Tránh: muối, đường, mật ong, sữa bò tươi, hải sản có vỏ.',\n },\n {\n category: 'feeding',\n title: 'Nguyên tắc 1 mới – 3 ngày',\n content:\n 'Mỗi thực phẩm mới ăn 3 ngày liên tục trước khi thử món khác. Giúp phát hiện dị ứng/bất dung nạp.',\n },\n {\n category: 'development',\n title: 'Bò & ngồi',\n content: 'Bé bò trườn, ngồi không cần đỡ. Dọn nhà an toàn: che ổ cắm, góc bàn, cầu thang.',\n },\n {\n category: 'health',\n title: 'Tiêm 6 tháng & bổ sung sắt',\n content:\n 'Tiêm nhắc lại. Dự trữ sắt từ bào thai bắt đầu cạn — ăn dặm cần có thực phẩm giàu sắt (thịt đỏ, lòng đỏ trứng, rau lá xanh).',\n },\n {\n category: 'mom',\n title: 'Thiết lập bữa ăn gia đình',\n content:\n 'Cho bé ngồi ghế ăn cùng bàn với gia đình dù mới ăn được ít — giúp bé học văn hóa ăn uống.',\n },\n ],\n },\n 7: {\n label: 'Tháng 7 – Khám phá vị giác',\n summary: 'Bé ăn dặm 2 bữa/ngày, nhiều loại rau củ hơn. Bò thành thạo, có thể tự đứng vịn.',\n feedingSchedule: '4–5 cữ sữa (~700–900ml) + 2 bữa ăn dặm.',\n sleepSchedule: '12–14 giờ/ngày, 2 giấc ngày.',\n tips: [\n {\n category: 'feeding',\n title: 'Đa dạng thực phẩm',\n content:\n 'Thêm thịt (gà, heo), cá trắng, đậu phụ, lòng đỏ trứng. Cháo đặc hơn (1:7). Tránh cho bé ăn gia vị.',\n },\n {\n category: 'feeding',\n title: 'Finger food',\n content:\n 'Cho bé tự bốc miếng mềm: chuối, bánh gạo, súp lơ luộc mềm — phát triển kỹ năng cầm nắm và tự lập.',\n },\n {\n category: 'development',\n title: 'Bập bẹ \"ba-ba\", \"ma-ma\"',\n content: 'Lặp lại từ đơn giản rõ ràng. Không quá kỳ vọng bé hiểu — bé đang tập phát âm.',\n },\n {\n category: 'health',\n title: 'Răng đầu tiên',\n content:\n 'Vệ sinh răng bằng gạc ẩm sau bú/ăn. Không cho bé ngậm bình khi ngủ để tránh sâu răng bú bình.',\n },\n ],\n },\n 8: {\n label: 'Tháng 8 – Giai đoạn lo lạ',\n summary: 'Bé có thể bắt đầu \"sợ người lạ\" và bám mẹ. Đây là mốc gắn bó an toàn bình thường.',\n feedingSchedule: '3–4 cữ sữa (~600–800ml) + 2–3 bữa ăn dặm + 1 bữa phụ (trái cây/sữa chua).',\n sleepSchedule: '12–14 giờ/ngày.',\n tips: [\n {\n category: 'development',\n title: 'Sợ người lạ',\n content: 'Bình thường ở 8–10 tháng. Không ép bé ôm người lạ — tôn trọng cảm xúc của bé.',\n },\n {\n category: 'feeding',\n title: 'Sữa chua & phô mai',\n content:\n 'Có thể cho ăn sữa chua không đường, phô mai tươi. Vẫn tránh sữa bò tươi uống trực tiếp.',\n },\n {\n category: 'activity',\n title: 'Trò chơi tìm đồ',\n content:\n 'Giấu đồ chơi dưới khăn để bé lật tìm — phát triển nhận thức \"đồ vật tồn tại khi khuất tầm nhìn\".',\n },\n ],\n },\n 9: {\n label: 'Tháng 9 – Vịn đứng',\n summary:\n 'Bé vịn đứng, men ghế. Hiểu lệnh đơn giản (\"không\", \"vẫy tay bye-bye\"). Có thể có 4–6 răng.',\n feedingSchedule: '3 cữ sữa (~600ml) + 3 bữa ăn dặm + 1–2 bữa phụ.',\n sleepSchedule: '11–14 giờ/ngày. Giấc ngày còn 2 giấc ngắn.',\n tips: [\n {\n category: 'feeding',\n title: 'Cháo đặc & cơm nát',\n content: 'Độ đặc tăng dần (1:5). Có thể bắt đầu thử cơm nát/mì mềm cho bé tập nhai.',\n },\n {\n category: 'development',\n title: 'Chỉ tay',\n content:\n 'Dạy bé chỉ vào đồ vật gọi tên. Kỹ năng \"joint attention\" quan trọng cho ngôn ngữ.',\n },\n {\n category: 'mom',\n title: 'Kiên nhẫn với ném đồ',\n content:\n 'Bé ném đồ không phải hư mà là học nguyên lý nhân-quả. Thay vì mắng, hãy chơi trò \"cho-lấy\".',\n },\n ],\n },\n 10: {\n label: 'Tháng 10 – Sắp đi',\n summary: 'Bé men vòng, nhiều bé bắt đầu bước 1–2 bước tự tin. Hiểu nhiều từ đơn.',\n feedingSchedule: '2–3 cữ sữa (~500–600ml) + 3 bữa ăn dặm + 1–2 bữa phụ.',\n sleepSchedule: '11–13 giờ/ngày.',\n tips: [\n {\n category: 'activity',\n title: 'Khuyến khích vận động',\n content:\n 'Tạo không gian an toàn để bé men vịn. Không dùng xe tròn tập đi (có thể gây chậm biết đi).',\n },\n {\n category: 'feeding',\n title: 'Đa dạng kết cấu',\n content:\n 'Cho ăn thực phẩm có nhiều kết cấu: giòn, dai, mềm. Giúp bé tập nhai và không kén ăn sau này.',\n },\n ],\n },\n 11: {\n label: 'Tháng 11 – Sẵn sàng bước đi',\n summary: 'Nhiều bé biết đi. Nói được 1–2 từ có nghĩa (\"ba\", \"mẹ\", \"măm\").',\n feedingSchedule: '2 cữ sữa (~500ml) + 3 bữa chính + 2 bữa phụ.',\n sleepSchedule: '11–13 giờ/ngày.',\n tips: [\n {\n category: 'development',\n title: 'Khen ngợi cụ thể',\n content:\n 'Thay vì \"giỏi quá\" chung chung, hãy \"Con cầm thìa rất khéo!\" — giúp bé hiểu được khen vì điều gì.',\n },\n {\n category: 'health',\n title: 'Chuẩn bị tiêm 12 tháng',\n content: 'Sởi-Quai bị-Rubella (MMR), Thủy đậu, Viêm não Nhật Bản.',\n },\n ],\n },\n 12: {\n label: 'Tháng 12 – Sinh nhật đầu tiên',\n summary: 'Cột mốc 1 tuổi! Bé đi lững chững, nói 2–5 từ đơn. Có thể uống sữa bò nguyên kem.',\n feedingSchedule:\n '500ml sữa/ngày + 3 bữa chính + 2 bữa phụ. Có thể bắt đầu sữa bò tươi nguyên kem.',\n sleepSchedule: '11–14 giờ/ngày, 1–2 giấc ngày.',\n tips: [\n {\n category: 'feeding',\n title: 'Cai sữa hay tiếp tục?',\n content:\n 'WHO khuyến cáo bú mẹ đến 2 tuổi hoặc lâu hơn nếu mẹ con muốn. Không có áp lực phải cai.',\n },\n {\n category: 'feeding',\n title: 'Ăn cùng gia đình',\n content:\n 'Bé có thể ăn gần như mọi món (ít muối, cắt nhỏ). Hạn chế đồ ngọt, đồ chiên, nước trái cây đóng hộp.',\n },\n {\n category: 'development',\n title: 'Đọc sách mỗi ngày',\n content: '10–15 phút đọc sách với bé mỗi tối. Lợi ích gấp nhiều lần xem màn hình.',\n },\n {\n category: 'health',\n title: 'Không màn hình < 18 tháng',\n content:\n 'AAP khuyến cáo không TV/điện thoại dưới 18 tháng (trừ video call). Ảnh hưởng ngôn ngữ và giấc ngủ.',\n },\n ],\n },\n 13: {\n label: 'Tháng 13–15 – Toddler giai đoạn đầu',\n summary: 'Đi vững hơn, khám phá mọi ngóc ngách. Vốn từ 5–20 từ. Biết chỉ tay để đòi.',\n feedingSchedule: '3 bữa chính + 2 bữa phụ + ~500ml sữa/ngày.',\n sleepSchedule: '11–14 giờ/ngày, chuyển dần về 1 giấc trưa.',\n tips: [\n {\n category: 'feeding',\n title: 'Kén ăn là bình thường',\n content:\n 'Bé giai đoạn này có thể đột nhiên từ chối món cũ yêu thích. Tiếp tục bày ra, không ép ăn — bé cần 10–15 lần tiếp xúc để chấp nhận món mới.',\n },\n {\n category: 'development',\n title: 'Quy định rõ ràng',\n content:\n 'Bé cần biên giới để cảm thấy an toàn. \"Không đánh\", \"không ném\" cần nhất quán từ cả bố và mẹ.',\n },\n ],\n },\n 16: {\n label: 'Tháng 16–18 – Bùng nổ ngôn ngữ',\n summary: 'Vốn từ có thể bùng nổ (20–50 từ). Bé bắt đầu ghép 2 từ. Biết đòi tự làm.',\n feedingSchedule: '3 bữa + 2 bữa phụ + 400–500ml sữa. Khuyến khích tự xúc.',\n sleepSchedule: '11–13 giờ/ngày, 1 giấc trưa 1–2 giờ.',\n tips: [\n {\n category: 'development',\n title: 'Đặt câu hỏi',\n content:\n 'Đặt câu hỏi mở: \"Con muốn áo đỏ hay xanh?\" thay vì \"Con mặc áo đỏ nhé?\". Cho bé quyền lựa chọn nhỏ.',\n },\n {\n category: 'activity',\n title: 'Tập tự lập',\n content: 'Tự xúc ăn, tự cất giày, tự cầm cốc uống. Chấp nhận bừa bộn — đây là học.',\n },\n ],\n },\n 19: {\n label: 'Tháng 19–24 – Gần 2 tuổi',\n summary:\n 'Chạy nhảy, leo trèo. Ghép 2–3 từ thành câu. Bắt đầu \"khủng hoảng 2 tuổi\" với từ \"không\".',\n feedingSchedule: '3 bữa + 1–2 bữa phụ. Sữa ~400ml/ngày. Ăn gần như người lớn nhưng ít gia vị.',\n sleepSchedule: '11–13 giờ/ngày, 1 giấc trưa.',\n tips: [\n {\n category: 'development',\n title: 'Tantrum (ăn vạ)',\n content:\n 'Không xấu hổ khi bé ăn vạ — đây là cách bé xử lý cảm xúc. Ngồi xuống, gọi tên cảm xúc: \"Con đang buồn vì không được kẹo\".',\n },\n {\n category: 'mom',\n title: 'Tập dùng bô',\n content:\n 'Nhiều bé sẵn sàng từ 18–24 tháng. Dấu hiệu: tã khô 2 giờ, biết báo \"ị\", tò mò khi bố mẹ đi vệ sinh. Không ép nếu bé chưa sẵn sàng.',\n },\n {\n category: 'health',\n title: 'Khám 24 tháng',\n content: 'Khám tổng quát, đo chiều cao-cân nặng, đánh giá phát triển ngôn ngữ và vận động.',\n },\n ],\n },\n};\n\nexport function resolveGuide(ageInDays: number): { period: PeriodGuide; key: string } | null {\n if (ageInDays < 0) return null;\n const weeks = Math.floor(ageInDays / 7);\n const months = Math.floor(ageInDays / 30.4375);\n\n if (weeks < 6) {\n const wKey = Math.min(5, Math.max(1, weeks + 1));\n const guide = WEEK_GUIDES[wKey];\n if (guide) return { period: guide, key: `week-${wKey}` };\n }\n\n if (months <= 12) {\n const mKey = Math.max(1, months);\n const guide = MONTH_GUIDES[mKey];\n if (guide) return { period: guide, key: `month-${mKey}` };\n }\n\n let key = 13;\n if (months >= 19) key = 19;\n else if (months >= 16) key = 16;\n else if (months >= 13) key = 13;\n const guide = MONTH_GUIDES[key];\n if (guide) return { period: guide, key: `month-${key}` };\n\n return null;\n}\n","/**\n * Thẻ tham khảo nhanh cho mẹ — bổ sung nội dung động (tips tuần, món ăn).\n * Mang tính giáo dục sức khỏe, không thay cho bác sĩ.\n *\n * Tham chiếu tổng quát: AAP/HealthyChildren (cho con bú, an toàn ngủ, sàng lọc),\n * WHO (dinh dưỡng cho bà mẹ cho con bú), CDC (sức khỏe tinh thần sau sinh).\n */\n\nexport interface MomWellnessCard {\n id: string;\n icon: string;\n title: string;\n body: string;\n}\n\nexport const MOM_WELLNESS_CARDS: MomWellnessCard[] = [\n {\n id: 'hydration',\n icon: 'pi pi-tint',\n title: 'Uống đủ trước khi khát',\n body: 'Cho con bú hoặc hút sữa khiến cơ thể mất nước nhanh. Để sẵn bình nước ấm ở mọi chỗ bế bé — mục tiêu ~2–2.5 lít/ngày (điều chỉnh theo bác sĩ nếu có bệnh thận tim).',\n },\n {\n id: 'sleep-debt',\n icon: 'pi pi-moon',\n title: 'Ngủ chồng lên giấc của bé',\n body: 'Không cố gắng làm việc nhà khi bé ngủ trưa — trả “nợ ngủ” 15–30 phút cũng có ích. Tránh màn hình trước khi ngủ để dễ vào giấc hơn.',\n },\n {\n id: 'breast-comfort',\n icon: 'pi pi-heart-fill',\n title: 'Ngực căng & quầng thâm',\n body: 'Thay miếng lót thấm sữa đủ thường xuyên; áo bra rộng vừa phải, không gọng cứng cấn vào tuyến sữa. Đau kéo dài, sốt — cần khám loại trừ viêm tuyến sữa.',\n },\n {\n id: 'pelvic',\n icon: 'pi pi-bolt',\n title: 'Sàn đáy khung chậu',\n body: 'Sau ổn định vết mổ/rạch (theo chỉ định BS), kegel nhẹ giúp giảm tiểu són khi ho/cười. Nếu cảm giác “tụt” khung chậu — nên gặp phụ khoa/vật lý trị liệu sàn khung chậu.',\n },\n {\n id: 'mental',\n icon: 'pi pi-comments',\n title: 'Tâm lý & baby blues',\n body: 'Buồn, hay khóc tuần đầu — khá phổ biến. Nếu buồn kéo >2 tuần, mất ngủ hoặc có ý nghĩ làm hại bản thân/con — gọi người thân và cần hỗ trợ chuyên môn ngay.',\n },\n {\n id: 'nutrition-balance',\n icon: 'pi pi-apple',\n title: 'Ăn đủ bữa, không kiêng tuyệt đối',\n body: 'Cần protein (thịt/cá/trứng/đậu), rau xanh, tinh bột hấp/luộc. Giảm đồ chiên rán, đồ ngọt — không nhịn bữa để “lấy lại dáng” quá sớm khi đang cho bú nhiều.',\n },\n {\n id: 'support',\n icon: 'pi pi-users',\n title: 'Nhờ giúp đỡ là bình thường',\n body: 'San sẻ bế bé, rửa bình, nấu bữa… giúp mẹ phục hồi và giữ sữa. Nói rõ nhu cầu với gia đình thay vì gánh một mình.',\n },\n {\n id: 'contraception',\n icon: 'pi pi-shield',\n title: 'Tránh thai sau sinh',\n body: 'Rụng trứng có thể xảy ra trước khi có kinh lại — trao đổi với BS về thuốc tương thích cho con bú, màng ngăn, hoặc vòng nội tiết khi phù hợp.',\n },\n {\n id: 'caffeine',\n icon: 'pi pi-coffee',\n title: 'Caffeine khi cho con bú',\n body: 'Nhiều hướng dẫn (gồm AAP) cho phép caffeine vừa phải khoảng ~200–300 mg/ngày; quan sát bé có khó ngủ/quấy hơn bình thường không. Tránh năng lượng tổng hợp, trà lá không rõ nguồn.',\n },\n {\n id: 'iron-folate',\n icon: 'pi pi-tablet',\n title: 'Sắt / acid folic sau sinh',\n body: 'Nếu bác sĩ kê tiếp sắt/acid folic sau đẻ — uống đúng liều, xa giờ sắt với canxi/sữa 2–4 giờ để hấp thu tốt hơn. Ăn thịt nạc, cá, đậu, rau xanh đậm bổ sung thực phẩm.',\n },\n {\n id: 'walk-recovery',\n icon: 'pi pi-compass',\n title: 'Vận động nhẹ sau khi BS cho phép',\n body: 'Đi bộ ngắn trong nhà rồi tăng dần giúp tuần hoàn và tâm trạng. Sau mổ: chỉ tăng gắng sức theo lịch tái khám; đau bất thường, sốt, ra máu nhiều — liên hệ y tế.',\n },\n {\n id: 'pump-hygiene',\n icon: 'pi pi-sync',\n title: 'Vệ sinh máy hút / bình sữa',\n body: 'Rửa tay trước khi hút; phụ kiện tiếp xúc sữa rửa nóng hoặc theo hướng dẫn nhà sản xuất; sữa để phòng tủ lạnh đúng thời gian an toàn địa phương khuyến cáo.',\n },\n {\n id: 'dental-mom',\n icon: 'pi pi-sun',\n title: 'Răng miệng mẹ',\n body: 'Viêm nướu / sâu răng tăng nguy cơ vi khuẩn truyền sang bé. Đánh răng fluoride 2 lần/ngày, khám nha định kỳ; tránh dùng chung thìa khi mẹ đang viêm họng.',\n },\n {\n id: 'screening',\n icon: 'pi pi-heart',\n title: 'Không bỏ qua tái khám',\n body: 'Khám hậu sản và các mốc sàng lọc theo lịch địa phương (huyết áp, tiểu đường thai kỳ, tuyến giáp nếu có chỉ định). Kể cho BS về đau ngực, khó thở, nhức đầu dữ dội.',\n },\n];\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { interval } from 'rxjs';\nimport {\n POSTPARTUM_STAGES,\n PostpartumStage,\n resolvePostpartumStage,\n} from '../postpartum-food.data';\nimport { resolveGuide } from '../feeding-tips.data';\nimport { MOM_WELLNESS_CARDS } from '../mom-wellness.data';\n\nexport interface MomTabProfile {\n babyName: string;\n birthDate: string;\n gender?: 'boy' | 'girl' | '';\n}\n\ntype MomSection = 'overview' | 'care' | 'food' | 'tips';\n\n@Component({\n selector: 'app-feeding-mom',\n standalone: true,\n imports: [],\n templateUrl: './feeding-mom.component.html',\n styleUrls: ['./feeding-mom.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedingMomComponent {\n private destroyRef = inject(DestroyRef);\n\n profile = input<MomTabProfile | null>(null);\n editing = input(false);\n\n goToFeeding = output<void>();\n\n now = signal(new Date());\n activeSection = signal<MomSection>('overview');\n momFoodStageOverride = signal<number | null>(null);\n\n readonly momWellnessCards = MOM_WELLNESS_CARDS;\n readonly postpartumStages = POSTPARTUM_STAGES;\n readonly momStageTotal = POSTPARTUM_STAGES.length;\n\n constructor() {\n interval(60_000)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.now.set(new Date()));\n }\n\n ageInDays = computed(() => {\n const birthDate = this.profile()?.birthDate;\n if (!birthDate) return null;\n const birth = new Date(birthDate);\n if (isNaN(birth.getTime())) return null;\n const diffMs = this.now().getTime() - birth.getTime();\n return Math.max(0, Math.floor(diffMs / (1000 * 60 * 60 * 24)));\n });\n\n activeMomStage = computed<PostpartumStage>(() => {\n const override = this.momFoodStageOverride();\n if (override !== null) {\n const i = Math.max(0, Math.min(POSTPARTUM_STAGES.length - 1, override));\n return POSTPARTUM_STAGES[i];\n }\n return resolvePostpartumStage(this.ageInDays() ?? 0);\n });\n\n activeMomStageIndex = computed(() =>\n POSTPARTUM_STAGES.findIndex((s) => s.id === this.activeMomStage().id)\n );\n\n currentMomStage = computed(() => resolvePostpartumStage(this.ageInDays() ?? 0));\n\n isMomStageAuto = computed(() => {\n if (this.momFoodStageOverride() === null) return true;\n return this.activeMomStage().id === this.currentMomStage().id;\n });\n\n momPeriodContext = computed(() => {\n const days = this.ageInDays();\n if (days === null) return null;\n const r = resolveGuide(days);\n if (!r) return null;\n return { label: r.period.label, summary: r.period.summary };\n });\n\n momTipsThisPeriod = computed(() => {\n const days = this.ageInDays();\n if (days === null) return [];\n const r = resolveGuide(days);\n if (!r) return [];\n return r.period.tips.filter((t) => t.category === 'mom');\n });\n\n stageProgressPct = computed(() => {\n const idx = this.activeMomStageIndex();\n if (this.momStageTotal <= 1) return 100;\n return Math.round(((idx + 1) / this.momStageTotal) * 100);\n });\n\n setSection(section: MomSection): void {\n this.activeSection.set(section);\n }\n\n selectStageIndex(index: number): void {\n const i = Math.max(0, Math.min(POSTPARTUM_STAGES.length - 1, index));\n const autoIdx = POSTPARTUM_STAGES.findIndex((s) => s.id === this.currentMomStage().id);\n this.momFoodStageOverride.set(i === autoIdx ? null : i);\n this.activeSection.set('food');\n }\n\n prevMomStage(): void {\n const i = this.activeMomStageIndex();\n if (i > 0) this.momFoodStageOverride.set(i - 1);\n }\n\n nextMomStage(): void {\n const i = this.activeMomStageIndex();\n if (i < POSTPARTUM_STAGES.length - 1) {\n this.momFoodStageOverride.set(i + 1);\n }\n }\n\n resetMomStage(): void {\n this.momFoodStageOverride.set(null);\n }\n\n onGoToFeeding(): void {\n this.goToFeeding.emit();\n }\n}\n","@if (profile() && !editing()) {\n <div class=\"mom-shell\">\n <header class=\"mom-banner\" [attr.data-accent]=\"activeMomStage().accent\">\n <div class=\"mom-banner__glow\" aria-hidden=\"true\"></div>\n <div class=\"mom-banner__top\">\n <span class=\"mom-banner__emoji\" aria-hidden=\"true\">🌷</span>\n <div class=\"mom-banner__titles\">\n <p class=\"mom-banner__eyebrow\">Chăm sóc sau sinh</p>\n <h2 class=\"mom-banner__title\">\n Mẹ\n @if (profile()?.babyName) {\n <span class=\"mom-banner__baby\">{{ profile()!.babyName }}</span>\n }\n </h2>\n </div>\n @if (ageInDays() !== null) {\n <span class=\"mom-banner__age\">{{ ageInDays() }} ngày tuổi bé</span>\n }\n </div>\n\n @if (momPeriodContext(); as ctx) {\n <p class=\"mom-banner__context\">\n <i class=\"pi pi-compass\" aria-hidden=\"true\"></i>\n <span>\n <strong>{{ ctx.label }}</strong>\n — {{ ctx.summary }}\n </span>\n </p>\n } @else {\n <p class=\"mom-banner__context mom-banner__context--muted\">\n Gợi ý dinh dưỡng & chăm sóc theo giai đoạn sau sinh của bé.\n </p>\n }\n\n <div class=\"mom-stage-rail\" role=\"tablist\" aria-label=\"Giai đoạn sau sinh\">\n @for (stage of postpartumStages; track stage.id; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"mom-stage-pill\"\n [class.is-active]=\"activeMomStageIndex() === i\"\n [class.is-current]=\"currentMomStage().id === stage.id\"\n [attr.aria-selected]=\"activeMomStageIndex() === i\"\n (click)=\"selectStageIndex(i)\"\n >\n <span class=\"mom-stage-pill__num\">{{ i + 1 }}</span>\n <span class=\"mom-stage-pill__label\">{{ stage.label }}</span>\n </button>\n }\n </div>\n\n <div class=\"mom-banner__progress\" aria-hidden=\"true\">\n <span class=\"mom-banner__progress-fill\" [style.width.%]=\"stageProgressPct()\"></span>\n </div>\n </header>\n\n <nav class=\"mom-nav\" aria-label=\"Nội dung tab Mẹ\">\n <button\n type=\"button\"\n class=\"mom-nav__btn\"\n [class.is-active]=\"activeSection() === 'overview'\"\n (click)=\"setSection('overview')\"\n >\n <i class=\"pi pi-th-large\" aria-hidden=\"true\"></i>\n Tổng quan\n </button>\n <button\n type=\"button\"\n class=\"mom-nav__btn\"\n [class.is-active]=\"activeSection() === 'care'\"\n (click)=\"setSection('care')\"\n >\n <i class=\"pi pi-shield\" aria-hidden=\"true\"></i>\n Chăm sóc\n </button>\n <button\n type=\"button\"\n class=\"mom-nav__btn\"\n [class.is-active]=\"activeSection() === 'food'\"\n (click)=\"setSection('food')\"\n >\n <i class=\"pi pi-apple\" aria-hidden=\"true\"></i>\n Ăn uống\n </button>\n <button\n type=\"button\"\n class=\"mom-nav__btn\"\n [class.is-active]=\"activeSection() === 'tips'\"\n [class.has-badge]=\"momTipsThisPeriod().length > 0\"\n (click)=\"setSection('tips')\"\n >\n <i class=\"pi pi-star-fill\" aria-hidden=\"true\"></i>\n Lưu ý\n @if (momTipsThisPeriod().length > 0) {\n <span class=\"mom-nav__badge\">{{ momTipsThisPeriod().length }}</span>\n }\n </button>\n </nav>\n\n @if (activeSection() === 'overview' || activeSection() === 'care') {\n <section class=\"mom-panel\" id=\"mom-care\">\n <div class=\"mom-panel__head\">\n <h3><i class=\"pi pi-shield\"></i> Chăm sóc hằng ngày</h3>\n <p>{{ momWellnessCards.length }} mục tham khảo — không thay tư vấn y khoa.</p>\n </div>\n <div class=\"mom-care-grid\">\n @for (c of momWellnessCards; track c.id) {\n <article class=\"mom-care-card\">\n <div class=\"mom-care-card__icon\">\n <i [class]=\"c.icon\"></i>\n </div>\n <div class=\"mom-care-card__body\">\n <h4>{{ c.title }}</h4>\n <p>{{ c.body }}</p>\n </div>\n </article>\n }\n </div>\n </section>\n }\n\n @if (activeSection() === 'overview' || activeSection() === 'food') {\n @if (activeMomStage(); as ms) {\n <section class=\"mom-panel mom-food\" [attr.data-accent]=\"ms.accent\">\n <div class=\"mom-food__head\">\n <div>\n <span class=\"mom-food__eyebrow\"> <i class=\"pi pi-apple\"></i> Dinh dưỡng mẹ </span>\n <h3>{{ ms.label }}</h3>\n <p class=\"mom-food__headline\">{{ ms.headline }}</p>\n </div>\n <div class=\"mom-food__nav\">\n <button\n type=\"button\"\n class=\"mom-food__arrow\"\n (click)=\"prevMomStage()\"\n [disabled]=\"activeMomStageIndex() === 0\"\n aria-label=\"Giai đoạn trước\"\n >\n <i class=\"pi pi-chevron-left\"></i>\n </button>\n <span class=\"mom-food__step\">\n {{ activeMomStageIndex() + 1 }}<span>/{{ momStageTotal }}</span>\n </span>\n <button\n type=\"button\"\n class=\"mom-food__arrow\"\n (click)=\"nextMomStage()\"\n [disabled]=\"activeMomStageIndex() === momStageTotal - 1\"\n aria-label=\"Giai đoạn sau\"\n >\n <i class=\"pi pi-chevron-right\"></i>\n </button>\n </div>\n </div>\n\n @if (!isMomStageAuto()) {\n <button type=\"button\" class=\"mom-food__reset\" (click)=\"resetMomStage()\">\n <i class=\"pi pi-refresh\"></i>\n Về giai đoạn hiện tại của bé\n </button>\n }\n\n <p class=\"mom-food__desc\">{{ ms.description }}</p>\n\n <div class=\"mom-food__cols\">\n <div class=\"mom-food__col mom-food__col--good\">\n <h4><i class=\"pi pi-check\"></i> Nên ăn</h4>\n <ul>\n @for (item of ms.encourage; track item.name) {\n <li>\n @if (item.emoji) {\n <span class=\"mom-food__emoji\">{{ item.emoji }}</span>\n }\n <div>\n <strong>{{ item.name }}</strong>\n @if (item.note) {\n <span>{{ item.note }}</span>\n }\n </div>\n </li>\n }\n </ul>\n </div>\n <div class=\"mom-food__col mom-food__col--avoid\">\n <h4><i class=\"pi pi-ban\"></i> Hạn chế</h4>\n <ul>\n @for (item of ms.avoid; track item.name) {\n <li>\n <span class=\"mom-food__emoji mom-food__emoji--ban\">\n <i class=\"pi pi-times\"></i>\n </span>\n <div>\n <strong>{{ item.name }}</strong>\n @if (item.note) {\n <span>{{ item.note }}</span>\n }\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n\n @if (ms.tip) {\n <div class=\"mom-food__tip\">\n <i class=\"pi pi-lightbulb\"></i>\n <span>{{ ms.tip }}</span>\n </div>\n }\n </section>\n }\n }\n\n @if (\n (activeSection() === 'overview' || activeSection() === 'tips') &&\n momTipsThisPeriod().length > 0\n ) {\n <section class=\"mom-panel mom-tips\">\n <div class=\"mom-panel__head\">\n <h3><i class=\"pi pi-star-fill\"></i> Lưu ý theo tuổi bé</h3>\n <p>Gợi ý đồng bộ với giai đoạn phát triển hiện tại.</p>\n </div>\n <ul class=\"mom-tips-list\">\n @for (t of momTipsThisPeriod(); track t.title) {\n <li>\n <span class=\"mom-tips-list__mark\" aria-hidden=\"true\">\n <i class=\"pi pi-check\"></i>\n </span>\n <div>\n <strong>{{ t.title }}</strong>\n <p>{{ t.content }}</p>\n </div>\n </li>\n }\n </ul>\n </section>\n }\n\n <footer class=\"mom-disclaimer\">\n <i class=\"pi pi-info-circle\"></i>\n Tham khảo — không thay khám. Đau bất thường, sốt, ý nghĩ tự hại: liên hệ y tế ngay.\n </footer>\n </div>\n} @else {\n <section class=\"mom-empty card\">\n <span class=\"mom-empty__emoji\" aria-hidden=\"true\">👩🍼</span>\n <h2>Thêm profile bé để xem gợi ý cho Mẹ</h2>\n <p>\n Chuyển sang tab <strong>Cữ bú</strong>, nhập ngày sinh và tên bé — app khớp giai đoạn dinh\n dưỡng & mẹo theo tuổi.\n </p>\n <button type=\"button\" class=\"btn primary\" (click)=\"onGoToFeeding()\">\n <i class=\"pi pi-heart-fill\"></i> Đi tới Cữ bú\n </button>\n </section>\n}\n","import { DecimalPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, signal } from '@angular/core';\n\nimport { FeedingLog } from '../../../services/feeding-log.service';\nimport { DailySummary, getDailySummaries } from '../feeding-prediction';\nimport { NutritionTarget } from '../feeding-nutrition';\n\nexport type ChartMode = 'bar' | 'area';\n\n@Component({\n selector: 'app-feeding-charts',\n standalone: true,\n imports: [DecimalPipe],\n templateUrl: './feeding-charts.component.html',\n styleUrls: ['./feeding-charts.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedingChartsComponent {\n logs = input<FeedingLog[]>([]);\n now = input<Date>(new Date());\n nutritionTarget = input<NutritionTarget | null>(null);\n\n chartTab = signal<'volume' | 'count' | 'timeline'>('volume');\n /** Số ngày hiển thị trong biểu đồ phân tích (7 / 14 / 30) */\n chartRange = signal<7 | 14 | 30>(7);\n\n /** Bar / Area toggle cho tab \"Xu hướng sữa\" */\n chartMode = signal<ChartMode>('bar');\n\n readonly chartRangeOptions: readonly (7 | 14 | 30)[] = [7, 14, 30];\n\n /** Index của bar/dot đang được chọn (click highlight) */\n selectedIndex = signal<number | null>(null);\n\n /** Thu phóng trục thời gian — tab \"Trong ngày\" (cuộn ngang khi > 1×). */\n private static readonly TIMELINE_ZOOM_LEVELS = [1, 1.5, 2, 2.5] as const;\n timelineChartZoomIndex = signal(0);\n timelineChartZoom = computed(\n () => FeedingChartsComponent.TIMELINE_ZOOM_LEVELS[this.timelineChartZoomIndex()]\n );\n\n timelineZoomIn(): void {\n this.timelineChartZoomIndex.update((i) =>\n Math.min(FeedingChartsComponent.TIMELINE_ZOOM_LEVELS.length - 1, i + 1)\n );\n }\n\n timelineZoomOut(): void {\n this.timelineChartZoomIndex.update((i) => Math.max(0, i - 1));\n }\n\n timelineZoomReset(): void {\n this.timelineChartZoomIndex.set(0);\n }\n\n // ===== History (range selectable: 7 / 14 / 30 days) =====\n weeklySummary = computed<DailySummary[]>(() =>\n getDailySummaries(this.logs(), this.chartRange(), this.now())\n );\n\n weeklyAverage = computed(() => {\n const arr = this.weeklySummary().filter((d) => d.total > 0);\n if (arr.length === 0) return 0;\n return Math.round(arr.reduce((s, d) => s + d.total, 0) / arr.length);\n });\n\n /** Thống kê tổng quát theo dải ngày đã chọn */\n chartStats = computed(() => {\n const arr = this.weeklySummary();\n const withData = arr.filter((d) => d.total > 0);\n if (arr.length === 0) {\n return {\n rangeDays: this.chartRange(),\n daysWithData: 0,\n totalMl: 0,\n avgMl: 0,\n maxMl: 0,\n maxDate: '',\n minMl: 0,\n minDate: '',\n avgCount: 0,\n maxCount: 0,\n };\n }\n\n const totalMl = withData.reduce((s, d) => s + d.total, 0);\n const totalCount = withData.reduce((s, d) => s + d.count, 0);\n const avgMl = withData.length > 0 ? Math.round(totalMl / withData.length) : 0;\n const avgCount = withData.length > 0 ? +(totalCount / withData.length).toFixed(1) : 0;\n\n let maxDay = withData[0];\n let minDay = withData[0];\n for (const d of withData) {\n if (d.total > maxDay.total) maxDay = d;\n if (d.total < minDay.total) minDay = d;\n }\n const maxCount = Math.max(0, ...withData.map((d) => d.count));\n\n return {\n rangeDays: this.chartRange(),\n daysWithData: withData.length,\n totalMl,\n avgMl,\n maxMl: maxDay?.total || 0,\n maxDate: maxDay?.date || '',\n minMl: minDay?.total || 0,\n minDate: minDay?.date || '',\n avgCount,\n maxCount,\n };\n });\n\n /**\n * Hỗ trợ co giãn chart theo số ngày: trả viewport SVG khá rộng cho 30 ngày\n * (cho phép cuộn ngang). Đồng thời quy định mật độ label hiển thị.\n */\n private chartLayout() {\n const range = this.chartRange();\n const H = 360;\n const PAD_L = 44,\n PAD_R = 16,\n PAD_T = 28,\n PAD_B = 48;\n let W = 700;\n if (range === 14) W = 760;\n if (range === 30) W = 1320;\n\n // Mật độ label trục X: hiển thị mỗi N cột\n let labelStep = 1;\n if (range === 14) labelStep = 1;\n if (range === 30) labelStep = 3;\n\n // Chỉ hiện số trên đỉnh cột nếu không quá nhiều cột\n const showBarValueOnAll = range <= 14;\n\n return { W, H, PAD_L, PAD_R, PAD_T, PAD_B, labelStep, showBarValueOnAll };\n }\n\n /** Bar/Line chart: tổng sữa theo ngày (theo chartRange) — 30 ngày dùng line chart */\n weeklyLineChart = computed(() => {\n const data = this.weeklySummary();\n const max = Math.max(...data.map((d) => d.total), 1);\n const lay = this.chartLayout();\n const { W, H, PAD_L, PAD_R, PAD_T, PAD_B, labelStep, showBarValueOnAll } = lay;\n const chartW = W - PAD_L - PAD_R;\n const chartH = H - PAD_T - PAD_B;\n const barCount = data.length;\n const slot = chartW / barCount;\n const barW = Math.max(8, slot * (this.chartRange() === 30 ? 0.7 : 0.62));\n const isLineChart = this.chartRange() === 30;\n\n const bars = data.map((d, i) => {\n const x = PAD_L + i * slot + (slot - barW) / 2;\n const h = (d.total / max) * chartH;\n const y = PAD_T + chartH - h;\n const cx = x + barW / 2;\n const showLabel = i % labelStep === 0 || i === barCount - 1;\n const showValue = showBarValueOnAll || (d.total > 0 && i % labelStep === 0);\n return { x, y, h, barW, cx, d, showLabel, showValue };\n });\n\n const gridLines = [0.25, 0.5, 0.75, 1].map((r) => ({\n y: PAD_T + chartH - r * chartH,\n label: Math.round(max * r),\n }));\n\n let linePath = '';\n let areaPath = '';\n const points: Array<{\n x: number;\n y: number;\n d: (typeof data)[0];\n showLabel: boolean;\n showValue: boolean;\n }> = [];\n\n if (isLineChart && data.length > 0) {\n const bottomY = PAD_T + chartH;\n data.forEach((d, i) => {\n const cx = PAD_L + i * slot + slot / 2;\n const y = d.total > 0 ? PAD_T + chartH - (d.total / max) * chartH : bottomY;\n const showLabel = i % labelStep === 0 || i === barCount - 1;\n const showValue = d.total > 0 && (i % 3 === 0 || i === barCount - 1);\n points.push({ x: cx, y, d, showLabel, showValue });\n linePath += i === 0 ? `M ${cx},${y}` : ` L ${cx},${y}`;\n });\n if (points.length > 0) {\n const first = points[0];\n const last = points[points.length - 1];\n areaPath = `${linePath} L ${last.x},${bottomY} L ${first.x},${bottomY} Z`;\n }\n }\n\n return {\n bars,\n gridLines,\n W,\n H,\n PAD_L,\n PAD_B,\n PAD_T,\n max,\n isLineChart,\n linePath,\n areaPath,\n points,\n };\n });\n\n /** Bar chart: số cữ bú/ngày */\n weeklyCountChart = computed(() => {\n const data = this.weeklySummary();\n const max = Math.max(...data.map((d) => d.count), 1);\n const lay = this.chartLayout();\n const { W, H, PAD_L, PAD_R, PAD_T, PAD_B, labelStep, showBarValueOnAll } = lay;\n const chartW = W - PAD_L - PAD_R;\n const chartH = H - PAD_T - PAD_B;\n const barCount = data.length;\n const slot = chartW / barCount;\n const barW = Math.max(8, slot * (this.chartRange() === 30 ? 0.7 : 0.6));\n\n const bars = data.map((d, i) => {\n const x = PAD_L + i * slot + (slot - barW) / 2;\n const h = (d.count / max) * chartH;\n const y = PAD_T + chartH - h;\n const cx = x + barW / 2;\n const showLabel = i % labelStep === 0 || i === barCount - 1;\n const showValue = showBarValueOnAll || (d.count > 0 && i % labelStep === 0);\n return { x, y, h, barW, cx, d, showLabel, showValue };\n });\n\n const gridLines = [0.25, 0.5, 0.75, 1].map((r) => ({\n y: PAD_T + chartH - r * chartH,\n label: (max * r).toFixed(r === 1 ? 0 : 1).replace(/\\.0$/, ''),\n }));\n\n return { bars, gridLines, W, H, PAD_L, PAD_B, max };\n });\n\n /**\n * Timeline chart: cumulative ml theo thời gian trong ngày (0h → 24h)\n * 3 dataset:\n * - Hôm nay (dừng ở giờ hiện tại)\n * - Hôm qua (cả ngày)\n * - Trung bình 3 ngày trước (2 ngày + hôm qua)\n * + Dải & đường KN (phân bổ đều) khi có `nutritionTarget` (cân từ tab Cân nặng).\n * Chiều ngang scale theo `timelineChartZoom` để cuộn xem chi tiết.\n */\n timelineChart = computed(() => {\n const zoom = this.timelineChartZoom();\n const BASE_W = 700;\n const W = Math.round(BASE_W * zoom);\n const H = 300,\n PAD_L = 44,\n PAD_R = 16,\n PAD_T = 24,\n PAD_B = 44;\n const chartW = W - PAD_L - PAD_R;\n const chartH = H - PAD_T - PAD_B;\n\n const todayStr = this.todayDateStr();\n const yStr = this.yesterdayDateStr();\n\n // Group logs by date\n const logsByDate = new Map<string, FeedingLog[]>();\n for (const log of this.logs()) {\n const arr = logsByDate.get(log.date);\n if (arr) arr.push(log);\n else logsByDate.set(log.date, [log]);\n }\n\n const cumulativeAt = (dateStr: string, minute: number): number => {\n const dayLogs = logsByDate.get(dateStr);\n if (!dayLogs) return 0;\n let total = 0;\n for (const l of dayLogs) {\n const [h, m] = l.time.split(':').map((n) => parseInt(n, 10));\n const lm = (h || 0) * 60 + (m || 0);\n if (lm <= minute) total += l.volume;\n }\n return total;\n };\n\n // 3 previous days (day-1..day-3)\n const baseDate = new Date(this.now());\n baseDate.setHours(0, 0, 0, 0);\n const prev3Dates: string[] = [];\n for (let i = 1; i <= 3; i++) {\n const d = new Date(baseDate);\n d.setDate(d.getDate() - i);\n prev3Dates.push(this.toDateStr(d));\n }\n const prev3WithData = prev3Dates.filter((ds) => logsByDate.has(ds));\n\n // Sample every 10 minutes\n const STEP = 10;\n const samples: number[] = [];\n for (let m = 0; m <= 1440; m += STEP) samples.push(m);\n\n const nowMinute = this.now().getHours() * 60 + this.now().getMinutes();\n\n const todayData = samples\n .filter((m) => m <= nowMinute)\n .map((m) => ({ m, v: cumulativeAt(todayStr, m) }));\n const yesterdayData = samples.map((m) => ({\n m,\n v: cumulativeAt(yStr, m),\n }));\n const avg3Data = samples.map((m) => {\n if (prev3WithData.length === 0) return { m, v: 0 };\n let sum = 0;\n for (const ds of prev3WithData) sum += cumulativeAt(ds, m);\n return { m, v: sum / prev3WithData.length };\n });\n\n const target = this.nutritionTarget();\n const recPtsMin: { m: number; v: number }[] = [];\n const recPtsMax: { m: number; v: number }[] = [];\n const recPtsMid: { m: number; v: number }[] = [];\n let hasRecommendation = false;\n let recRangeLabel = '';\n let recMidDailyRounded = 0;\n if (target) {\n hasRecommendation = true;\n const midDaily = (target.dailyMlMin + target.dailyMlMax) / 2;\n recMidDailyRounded = Math.round(midDaily);\n recRangeLabel = `${target.dailyMlMin}–${target.dailyMlMax} ml/ngày`;\n for (const m of samples) {\n const frac = m / 1440;\n recPtsMin.push({ m, v: target.dailyMlMin * frac });\n recPtsMax.push({ m, v: target.dailyMlMax * frac });\n recPtsMid.push({ m, v: midDaily * frac });\n }\n }\n\n const allVals = [\n ...todayData.map((p) => p.v),\n ...yesterdayData.map((p) => p.v),\n ...avg3Data.map((p) => p.v),\n ];\n if (recPtsMax.length > 0) {\n for (const p of recPtsMax) allVals.push(p.v);\n for (const p of recPtsMin) allVals.push(p.v);\n }\n const max = Math.max(...allVals, 100);\n\n const xOf = (m: number) => PAD_L + (m / 1440) * chartW;\n const yOf = (v: number) => PAD_T + chartH - (v / max) * chartH;\n\n const toLinearPath = (pts: { m: number; v: number }[]) => {\n if (pts.length === 0) return '';\n let d = `M ${xOf(pts[0].m)},${yOf(pts[0].v)}`;\n for (let i = 1; i < pts.length; i++) {\n d += ` L ${xOf(pts[i].m)},${yOf(pts[i].v)}`;\n }\n return d;\n };\n\n const buildRecBand = () => {\n if (recPtsMin.length === 0) return '';\n let d = `M ${xOf(recPtsMin[0].m)},${yOf(recPtsMin[0].v)}`;\n for (let i = 1; i < recPtsMin.length; i++) {\n d += ` L ${xOf(recPtsMin[i].m)},${yOf(recPtsMin[i].v)}`;\n }\n for (let i = recPtsMax.length - 1; i >= 0; i--) {\n d += ` L ${xOf(recPtsMax[i].m)},${yOf(recPtsMax[i].v)}`;\n }\n d += ' Z';\n return d;\n };\n\n /**\n * Mượt hoá đường cong bằng monotone cubic (Fritsch–Carlson):\n * - Giữ tính đơn điệu (tích luỹ không bao giờ giảm).\n * - Gộp các điểm trùng y liên tiếp để tránh \"bậc thang\" gây cong xấu\n * tại các đoạn phẳng giữa các cữ bú.\n */\n const toPath = (pts: { m: number; v: number }[]) => {\n if (pts.length === 0) return '';\n\n // 1) Gộp các điểm có cùng y liên tiếp → chỉ giữ đầu và cuối của mỗi đoạn phẳng.\n const compacted: { m: number; v: number }[] = [];\n for (let i = 0; i < pts.length; i++) {\n const p = pts[i];\n const prev = compacted[compacted.length - 1];\n const next = pts[i + 1];\n if (prev && next && prev.v === p.v && next.v === p.v) continue;\n compacted.push(p);\n }\n\n if (compacted.length === 1) {\n const p = compacted[0];\n return `M ${xOf(p.m)},${yOf(p.v)}`;\n }\n\n const sp = compacted.map((p) => ({ x: xOf(p.m), y: yOf(p.v) }));\n const n = sp.length;\n\n // 2) Monotone cubic interpolation (Fritsch–Carlson).\n const dx: number[] = new Array(n - 1);\n const slope: number[] = new Array(n - 1);\n for (let i = 0; i < n - 1; i++) {\n dx[i] = sp[i + 1].x - sp[i].x;\n slope[i] = dx[i] === 0 ? 0 : (sp[i + 1].y - sp[i].y) / dx[i];\n }\n\n const t: number[] = new Array(n);\n t[0] = slope[0];\n t[n - 1] = slope[n - 2];\n for (let i = 1; i < n - 1; i++) {\n if (slope[i - 1] * slope[i] <= 0) {\n t[i] = 0;\n } else {\n t[i] = (slope[i - 1] + slope[i]) / 2;\n }\n }\n // Fritsch condition\n for (let i = 0; i < n - 1; i++) {\n if (slope[i] === 0) {\n t[i] = 0;\n t[i + 1] = 0;\n continue;\n }\n const a = t[i] / slope[i];\n const b = t[i + 1] / slope[i];\n const h = a * a + b * b;\n if (h > 9) {\n const s = 3 / Math.sqrt(h);\n t[i] = s * a * slope[i];\n t[i + 1] = s * b * slope[i];\n }\n }\n\n // 3) Dựng cubic bezier từ Hermite tangents.\n let d = `M ${sp[0].x},${sp[0].y}`;\n for (let i = 0; i < n - 1; i++) {\n const cp1x = sp[i].x + dx[i] / 3;\n const cp1y = sp[i].y + (t[i] * dx[i]) / 3;\n const cp2x = sp[i + 1].x - dx[i] / 3;\n const cp2y = sp[i + 1].y - (t[i + 1] * dx[i]) / 3;\n d += ` C ${cp1x},${cp1y} ${cp2x},${cp2y} ${sp[i + 1].x},${sp[i + 1].y}`;\n }\n return d;\n };\n\n const yGrid = [0.25, 0.5, 0.75, 1].map((r) => ({\n y: PAD_T + chartH - r * chartH,\n label: Math.round(max * r),\n }));\n const xTicks = [0, 4, 8, 12, 16, 20, 24].map((h) => ({\n hour: h,\n x: xOf(h * 60),\n }));\n\n const lastToday = todayData.length > 0 ? todayData[todayData.length - 1] : null;\n const todayEndPoint = lastToday\n ? { x: xOf(lastToday.m), y: yOf(lastToday.v), v: Math.round(lastToday.v) }\n : null;\n\n const yesterdayTotal =\n yesterdayData.length > 0 ? Math.round(yesterdayData[yesterdayData.length - 1].v) : 0;\n const avg3Total = avg3Data.length > 0 ? Math.round(avg3Data[avg3Data.length - 1].v) : 0;\n const todayTotal = lastToday ? Math.round(lastToday.v) : 0;\n\n return {\n W,\n H,\n PAD_L,\n PAD_B,\n yGrid,\n xTicks,\n todayPath: toPath(todayData),\n yesterdayPath: toPath(yesterdayData),\n avg3Path: toPath(avg3Data),\n hasRecommendation,\n recBandPath: hasRecommendation ? buildRecBand() : '',\n recMidPath: hasRecommendation ? toLinearPath(recPtsMid) : '',\n recRangeLabel,\n recMidDailyRounded,\n todayEndPoint,\n todayTotal,\n yesterdayTotal,\n avg3Total,\n prev3DaysCount: prev3WithData.length,\n nowMinute,\n nowX: xOf(nowMinute),\n chartTop: PAD_T,\n chartBottom: PAD_T + chartH,\n };\n });\n\n /** Tab timeline có đủ dữ liệu để vẽ đường (tránh hiện zoom/legend rỗng). */\n hasTimelineChartData = computed(() => {\n const t = this.timelineChart();\n return t.yesterdayTotal > 0 || t.avg3Total > 0 || t.todayTotal > 0;\n });\n\n // ===== New concept: bar/area chart geometry =====\n\n /** SVG geometry cho bar chart (tất cả ranges đều dùng bars) */\n barChartData = computed(() => {\n const data = this.weeklySummary();\n const n = data.length;\n const W = 560,\n H = 200,\n PL = 36,\n PR = 24,\n PT = 24,\n PB = 36;\n const cW = W - PL - PR,\n cH = H - PT - PB;\n const max = Math.max(...data.map((d) => d.total), 1);\n const active = data.filter((d) => d.total > 0);\n const avgVol = active.length\n ? Math.round(active.reduce((s, d) => s + d.total, 0) / active.length)\n : 0;\n const slotW = cW / n;\n const bW = Math.max(slotW * 0.58, 4);\n const xC = (i: number) => PL + i * slotW + slotW / 2;\n const yOf = (v: number) => PT + cH - (v / max) * cH;\n const avgY = yOf(avgVol);\n const every = n <= 7 ? 1 : n <= 14 ? 1 : 4;\n\n const bars = data.map((d, i) => {\n const h = d.total > 0 ? (d.total / max) * cH : 2;\n const bx = xC(i) - bW / 2;\n const by = d.total > 0 ? PT + cH - h : PT + cH - 2;\n const isToday = d.date === this.todayDateStr();\n const showLabel = i % every === 0 || i === n - 1;\n return { d, i, h, bx, by, cx: xC(i), bW, isToday, showLabel };\n });\n\n // trend path overlay (14d / 30d)\n const trendPath =\n n > 7\n ? data\n .map((d, i) => `${i === 0 ? 'M' : 'L'}${xC(i)},${yOf(Math.max(d.total, 1))}`)\n .join(' ')\n : '';\n\n return { W, H, PL, PR, PT, PB, cH, max, avgVol, avgY, bars, trendPath, every, xC, yOf };\n });\n\n /** SVG geometry cho area chart (smooth catmull-rom) */\n areaChartData = computed(() => {\n const data = this.weeklySummary();\n const n = data.length;\n const W = 560,\n H = 210,\n PL = 36,\n PR = 24,\n PT = 24,\n PB = 36;\n const cW = W - PL - PR,\n cH = H - PT - PB;\n const max = Math.max(...data.map((d) => d.total), 1);\n const active = data.filter((d) => d.total > 0);\n const avgVol = active.length\n ? Math.round(active.reduce((s, d) => s + d.total, 0) / active.length)\n : 0;\n const xOf = (i: number) => PL + (i / Math.max(n - 1, 1)) * cW;\n const yOf = (v: number) => PT + cH - (v / max) * cH;\n const avgY = yOf(avgVol);\n const every = n <= 7 ? 1 : n <= 14 ? 2 : 5;\n\n const pts = data.map((d, i) => ({\n x: xOf(i),\n y: d.total > 0 ? yOf(d.total) : PT + cH,\n d,\n i,\n isToday: d.date === this.todayDateStr(),\n }));\n\n const smooth = pts\n .map((p, i, arr) => {\n if (i === 0) return `M${p.x},${p.y}`;\n const prev = arr[i - 1];\n const c1x = prev.x + (p.x - prev.x) * 0.55;\n const c2x = p.x - (p.x - prev.x) * 0.55;\n return `C${c1x},${prev.y} ${c2x},${p.y} ${p.x},${p.y}`;\n })\n .join(' ');\n const areaPath =\n pts.length > 0 ? `${smooth} L${pts[n - 1].x},${PT + cH} L${pts[0].x},${PT + cH} Z` : '';\n\n const showDot = (i: number) => n <= 7 || (n <= 14 && i % 2 === 0) || i === n - 1;\n const showLabel = (i: number) => i % every === 0 || i === n - 1;\n\n return {\n W,\n H,\n PL,\n PR,\n PT,\n PB,\n cH,\n max,\n avgVol,\n avgY,\n pts,\n smooth,\n areaPath,\n showDot,\n showLabel,\n xOf,\n yOf,\n };\n });\n\n /** Tooltip info cho điểm đang được chọn */\n selectedPoint = computed(() => {\n const idx = this.selectedIndex();\n if (idx === null) return null;\n const data = this.weeklySummary();\n if (idx < 0 || idx >= data.length) return null;\n const d = data[idx];\n return {\n idx,\n total: d.total,\n count: d.count,\n date: d.date,\n dayLabel: this.formatDayLabel(d.date),\n dateLabel: this.formatDateShort(d.date),\n isToday: d.date === this.todayDateStr(),\n };\n });\n\n /** Tooltip SVG bubble geometry (tính bên TS để dùng trong template) */\n tooltipBubble = computed(() => {\n const pt = this.selectedPoint();\n const idx = this.selectedIndex();\n if (!pt || idx === null) return null;\n\n const mode = this.chartMode();\n let cx = 0,\n cy = 0,\n W = 0;\n\n if (mode === 'bar') {\n const bc = this.barChartData();\n if (idx! >= bc.bars.length) return null;\n const bar = bc.bars[idx!];\n cx = bar.cx;\n cy = bc.yOf(pt.total);\n W = bc.W;\n } else {\n const ac = this.areaChartData();\n if (idx! >= ac.pts.length) return null;\n const p = ac.pts[idx!];\n cx = p.x;\n cy = p.y;\n W = ac.W;\n }\n\n const bw = 80,\n bh = 46;\n const bx = Math.min(Math.max(cx - bw / 2, 2), W - bw - 2);\n const by = Math.max(cy - bh - 14, 2);\n const arrowX = Math.min(Math.max(cx - bx, 10), bw - 10);\n return { bx, by, bw, bh, cx, cy, arrowX };\n });\n\n /** Dot-matrix calendar data (5 weeks × 7 days) cho tab Số cữ */\n calendarData = computed(() => {\n const today = new Date(this.now());\n today.setHours(0, 0, 0, 0);\n const days: { date: string; count: number; isToday: boolean; isFuture: boolean }[] = [];\n for (let i = 34; i >= 0; i--) {\n const d = new Date(today);\n d.setDate(today.getDate() - i);\n const ds = this.toDateStr(d);\n const logs = this.logs().filter((l) => l.date === ds);\n days.push({\n date: ds,\n count: logs.length,\n isToday: ds === this.toDateStr(today),\n isFuture: false,\n });\n }\n // group into 5 rows of 7\n const weeks: (typeof days)[] = [];\n for (let w = 0; w < 5; w++) weeks.push(days.slice(w * 7, w * 7 + 7));\n return weeks;\n });\n\n /** Heatmap data (today + yesterday) cho tab Trong ngày */\n heatmapData = computed(() => {\n const todayStr = this.todayDateStr();\n const yesterdayStr = this.yesterdayDateStr();\n const todayLogs = this.logs().filter((l) => l.date === todayStr);\n const yestLogs = this.logs().filter((l) => l.date === yesterdayStr);\n\n const buildHours = (logs: FeedingLog[]) => {\n const hours = new Array<number>(24).fill(0);\n for (const l of logs) {\n const h = parseInt(l.time.split(':')[0], 10);\n if (h >= 0 && h < 24) hours[h] += l.volume;\n }\n return hours;\n };\n\n const today = buildHours(todayLogs);\n const yesterday = buildHours(yestLogs);\n const maxVal = Math.max(...today, ...yesterday, 1);\n const totalToday = today.reduce((s, v) => s + v, 0);\n const totalYest = yesterday.reduce((s, v) => s + v, 0);\n const feedCount = today.filter((v) => v > 0).length;\n const avgPerFeed = feedCount > 0 ? Math.round(totalToday / feedCount) : 0;\n const peakHour = today.reduce((best, v, i) => (v > today[best] ? i : best), 0);\n\n return { today, yesterday, maxVal, totalToday, totalYest, feedCount, avgPerFeed, peakHour };\n });\n\n /** Sessions hôm nay (sorted by time) */\n todaySessions = computed(() => {\n const todayStr = this.todayDateStr();\n return this.logs()\n .filter((l) => l.date === todayStr)\n .sort((a, b) => a.time.localeCompare(b.time))\n .map((l, i, arr) => {\n let gap = '—';\n if (i > 0) {\n const [ph, pm] = arr[i - 1].time.split(':').map(Number);\n const [ch, cm] = l.time.split(':').map(Number);\n const diffMin = ch * 60 + cm - (ph * 60 + pm);\n const gh = Math.floor(diffMin / 60);\n const gm = diffMin % 60;\n gap = gh > 0 ? `${gh}h ${gm > 0 ? gm + 'm' : ''}`.trim() : `${gm}m`;\n }\n return { ...l, gap };\n });\n });\n\n todaySessionsMaxVol = computed(() => {\n const s = this.todaySessions();\n return s.length > 0 ? Math.max(...s.map((x) => x.volume)) : 1;\n });\n\n setChartTab(tab: 'volume' | 'count' | 'timeline') {\n this.chartTab.set(tab);\n this.selectedIndex.set(null);\n if (tab !== 'timeline') {\n this.timelineChartZoomIndex.set(0);\n }\n }\n\n setChartRange(r: 7 | 14 | 30) {\n this.chartRange.set(r);\n this.selectedIndex.set(null);\n }\n\n setChartMode(m: ChartMode): void {\n this.chartMode.set(m);\n this.selectedIndex.set(null);\n }\n\n toggleSelected(i: number): void {\n this.selectedIndex.update((cur) => (cur === i ? null : i));\n }\n\n clearSelected(): void {\n this.selectedIndex.set(null);\n }\n\n todayDateStr(): string {\n return this.toDateStr(this.now());\n }\n\n yesterdayDateStr(): string {\n const d = new Date(this.now());\n d.setDate(d.getDate() - 1);\n return this.toDateStr(d);\n }\n\n formatDateShort(iso: string): string {\n const [, m, d] = iso.split('-');\n return `${d}/${m}`;\n }\n\n formatDayLabel(iso: string): string {\n const d = new Date(iso + 'T00:00:00');\n const dayNames = ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'];\n return dayNames[d.getDay()];\n }\n\n toDateStr(d: Date): string {\n const y = d.getFullYear();\n const mo = (d.getMonth() + 1).toString().padStart(2, '0');\n const day = d.getDate().toString().padStart(2, '0');\n return `${y}-${mo}-${day}`;\n }\n}\n","<!-- ============ NUTRITION DASHBOARD — new concept ============ -->\n<section class=\"nd-card\">\n <!-- ── Header ── -->\n <div class=\"nd-header\">\n <svg aria-hidden=\"true\" class=\"nd-wm\" viewBox=\"0 0 560 72\" preserveAspectRatio=\"xMidYMid slice\">\n <!-- bar chart watermark top-right -->\n <g transform=\"translate(510,8) rotate(10) scale(1.5)\" opacity=\"0.45\">\n <rect x=\"0\" y=\"9\" width=\"4\" height=\"9\" rx=\"1\" fill=\"currentColor\" />\n <rect x=\"6\" y=\"5\" width=\"4\" height=\"13\" rx=\"1\" fill=\"currentColor\" />\n <rect x=\"12\" y=\"1\" width=\"4\" height=\"17\" rx=\"1\" fill=\"currentColor\" />\n </g>\n <!-- line chart watermark top-left -->\n <g transform=\"translate(14,10) rotate(-8) scale(1.3)\" opacity=\"0.4\">\n <polyline\n points=\"0,16 5,9 11,12 17,4 23,8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </g>\n <!-- drop center -->\n <g transform=\"translate(268,6) rotate(4) scale(1.05)\" opacity=\"0.28\">\n <path d=\"M9 0 C9 0 18 10 18 15 A9 9 0 0 1 0 15 C0 10 9 0 9 0Z\" fill=\"currentColor\" />\n </g>\n <circle cx=\"420\" cy=\"14\" r=\"4\" fill=\"currentColor\" opacity=\"0.3\" />\n <circle cx=\"440\" cy=\"7\" r=\"2.5\" fill=\"currentColor\" opacity=\"0.22\" />\n <circle cx=\"140\" cy=\"58\" r=\"3.5\" fill=\"currentColor\" opacity=\"0.2\" />\n </svg>\n\n <div class=\"nd-header__inner\">\n <div class=\"nd-header__title-group\">\n <div class=\"nd-header__title\">Biểu đồ dinh dưỡng</div>\n <div class=\"nd-header__sub\">{{ chartRange() }} ngày gần nhất</div>\n </div>\n @if (weeklyAverage() > 0) {\n <div class=\"nd-header__avg\">\n <span class=\"nd-header__avg-label\">TB/ngày</span>\n <span class=\"nd-header__avg-value\">{{ weeklyAverage() }}</span>\n <span class=\"nd-header__avg-unit\">ml</span>\n </div>\n }\n </div>\n\n <!-- Segmented tab control -->\n <div class=\"nd-tabs\" role=\"tablist\">\n <button\n type=\"button\"\n class=\"nd-tab\"\n [class.active]=\"chartTab() === 'volume'\"\n (click)=\"setChartTab('volume')\"\n role=\"tab\"\n >\n Xu hướng\n </button>\n <button\n type=\"button\"\n class=\"nd-tab\"\n [class.active]=\"chartTab() === 'count'\"\n (click)=\"setChartTab('count')\"\n role=\"tab\"\n >\n Số cữ\n </button>\n <button\n type=\"button\"\n class=\"nd-tab\"\n [class.active]=\"chartTab() === 'timeline'\"\n (click)=\"setChartTab('timeline')\"\n role=\"tab\"\n >\n Trong ngày\n </button>\n </div>\n </div>\n\n <!-- ══════════════════════════════════════════════════\n TAB 1 — Xu hướng sữa\n ══════════════════════════════════════════════════ -->\n @if (chartTab() === 'volume') {\n <div class=\"nd-body\">\n <!-- toolbar -->\n <div class=\"nd-toolbar\">\n <div class=\"nd-section-title\">Sữa theo ngày</div>\n <div class=\"nd-toolbar__right\">\n <div class=\"nd-range-pills\">\n @for (r of chartRangeOptions; track r) {\n <button\n type=\"button\"\n class=\"nd-pill\"\n [class.active]=\"chartRange() === r\"\n (click)=\"setChartRange(r)\"\n >\n {{ r }}d\n </button>\n }\n </div>\n <div class=\"nd-mode-toggle\">\n <button\n type=\"button\"\n class=\"nd-mode-btn\"\n [class.active]=\"chartMode() === 'bar'\"\n (click)=\"setChartMode('bar')\"\n title=\"Bar chart\"\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"0\" y=\"7\" width=\"3\" height=\"7\" rx=\"1\" fill=\"currentColor\" />\n <rect x=\"4\" y=\"4\" width=\"3\" height=\"10\" rx=\"1\" fill=\"currentColor\" />\n <rect x=\"8\" y=\"1\" width=\"3\" height=\"13\" rx=\"1\" fill=\"currentColor\" />\n <rect x=\"12\" y=\"3\" width=\"2\" height=\"11\" rx=\"1\" fill=\"currentColor\" />\n </svg>\n Bar\n </button>\n <button\n type=\"button\"\n class=\"nd-mode-btn\"\n [class.active]=\"chartMode() === 'area'\"\n (click)=\"setChartMode('area')\"\n title=\"Area chart\"\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M0 12 C2 12 3 4 7 5 C10 6 12 2 14 2 L14 14 L0 14 Z\"\n fill=\"currentColor\"\n opacity=\"0.35\"\n />\n <path\n d=\"M0 12 C2 12 3 4 7 5 C10 6 12 2 14 2\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n />\n </svg>\n Area\n </button>\n </div>\n </div>\n </div>\n\n <!-- selected point banner -->\n @if (selectedPoint(); as pt) {\n @if (pt.total > 0) {\n <div class=\"nd-sel-banner\">\n <div class=\"nd-sel-banner__dot\" [class.today]=\"pt.isToday\"></div>\n <span class=\"nd-sel-banner__date\">{{ pt.dayLabel }}, {{ pt.dateLabel }}</span>\n <div class=\"nd-sel-banner__val\">\n <span class=\"nd-sel-banner__num\">{{ pt.total }}</span>\n <span class=\"nd-sel-banner__unit\">ml</span>\n </div>\n <button type=\"button\" class=\"nd-sel-banner__close\" (click)=\"clearSelected()\">✕</button>\n </div>\n }\n }\n\n <!-- chart area -->\n <div class=\"nd-chart-box\">\n @if (weeklyAverage() > 0) {\n <!-- BAR MODE -->\n @if (chartMode() === 'bar') {\n <svg\n class=\"nd-svg\"\n [attr.viewBox]=\"'0 0 ' + barChartData().W + ' ' + barChartData().H\"\n preserveAspectRatio=\"xMidYMid meet\"\n (click)=\"clearSelected()\"\n >\n <defs>\n <linearGradient id=\"ndBarGrad\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#7c8aff\" />\n <stop offset=\"100%\" stop-color=\"#4c5cf0\" />\n </linearGradient>\n <linearGradient id=\"ndBarGradT\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#34d399\" />\n <stop offset=\"100%\" stop-color=\"#10b981\" />\n </linearGradient>\n </defs>\n\n <!-- grid -->\n @for (r of [ 0.33, 0.66, 1 ]; track r) {\n <line\n class=\"nd-grid-line\"\n [attr.x1]=\"barChartData().PL\"\n [attr.x2]=\"barChartData().W - barChartData().PR\"\n [attr.y1]=\"barChartData().PT + barChartData().cH - r * barChartData().cH\"\n [attr.y2]=\"barChartData().PT + barChartData().cH - r * barChartData().cH\"\n />\n <text\n class=\"nd-grid-label\"\n [attr.x]=\"barChartData().PL - 5\"\n [attr.y]=\"barChartData().PT + barChartData().cH - r * barChartData().cH + 3\"\n text-anchor=\"end\"\n >\n {{ barChartData().max * r | number: '1.0-0' }}\n </text>\n }\n\n <!-- avg line -->\n <line\n class=\"nd-avg-line\"\n [attr.x1]=\"barChartData().PL\"\n [attr.x2]=\"barChartData().W - barChartData().PR - 4\"\n [attr.y1]=\"barChartData().avgY\"\n [attr.y2]=\"barChartData().avgY\"\n />\n <text\n class=\"nd-avg-label\"\n [attr.x]=\"barChartData().W - barChartData().PR + 1\"\n [attr.y]=\"barChartData().avgY + 3\"\n >\n avg\n </text>\n\n <!-- trend dashed overlay (14d/30d) -->\n @if (barChartData().trendPath) {\n <path class=\"nd-trend-line\" [attr.d]=\"barChartData().trendPath\" />\n }\n\n <!-- bars -->\n @for (b of barChartData().bars; track b.i) {\n <g class=\"nd-bar-grp\" (click)=\"$event.stopPropagation(); toggleSelected(b.i)\">\n @if (selectedIndex() === b.i) {\n <rect\n [attr.x]=\"b.bx - 4\"\n [attr.y]=\"barChartData().PT\"\n [attr.width]=\"b.bW + 8\"\n [attr.height]=\"barChartData().cH + 4\"\n rx=\"6\"\n class=\"nd-bar-halo\"\n [class.today]=\"b.isToday\"\n />\n }\n <rect\n [attr.x]=\"b.bx\"\n [attr.y]=\"b.by\"\n [attr.width]=\"b.bW\"\n [attr.height]=\"b.h\"\n [attr.rx]=\"b.d.total === 0 ? 2 : 4\"\n [attr.fill]=\"\n b.isToday\n ? 'url(#ndBarGradT)'\n : b.d.total === 0\n ? '#e2e8f0'\n : 'url(#ndBarGrad)'\n \"\n [class.nd-bar--dimmed]=\"selectedIndex() !== null && selectedIndex() !== b.i\"\n />\n <!-- value label -->\n @if (b.d.total > 0 &&\n (selectedIndex() === b.i ||\n chartRange() <= 7 ||\n (chartRange() <= 14 && b.isToday))) {\n <text\n class=\"nd-bar-val\"\n [class.today]=\"b.isToday\"\n [attr.x]=\"b.cx\"\n [attr.y]=\"b.by - 5\"\n text-anchor=\"middle\"\n >\n {{ b.d.total }}\n </text>\n }\n <!-- x labels -->\n @if (b.showLabel) {\n <text\n class=\"nd-x-label\"\n [class.today]=\"b.isToday\"\n [class.nd-x-label--sel]=\"selectedIndex() === b.i\"\n [attr.x]=\"b.cx\"\n [attr.y]=\"barChartData().H - 18\"\n text-anchor=\"middle\"\n >\n {{ formatDayLabel(b.d.date) }}\n </text>\n <text\n class=\"nd-x-sub\"\n [attr.x]=\"b.cx\"\n [attr.y]=\"barChartData().H - 4\"\n text-anchor=\"middle\"\n >\n {{ formatDateShort(b.d.date) }}\n </text>\n }\n </g>\n }\n\n <!-- tooltip -->\n @if (selectedIndex() !== null && tooltipBubble(); as tb) {\n @if (selectedPoint()!.total > 0) {\n <g class=\"nd-tooltip\" style=\"pointer-events: none\">\n <rect\n [attr.x]=\"tb.bx + 1\"\n [attr.y]=\"tb.by + 2\"\n [attr.width]=\"tb.bw\"\n [attr.height]=\"tb.bh\"\n rx=\"8\"\n class=\"nd-tooltip__shadow\"\n />\n <rect\n [attr.x]=\"tb.bx\"\n [attr.y]=\"tb.by\"\n [attr.width]=\"tb.bw\"\n [attr.height]=\"tb.bh\"\n rx=\"8\"\n class=\"nd-tooltip__bg\"\n [class.today]=\"selectedPoint()!.isToday\"\n />\n <path\n [attr.d]=\"\n 'M' +\n (tb.bx + tb.arrowX - 5) +\n ',' +\n (tb.by + tb.bh) +\n ' L' +\n (tb.bx + tb.arrowX) +\n ',' +\n (tb.by + tb.bh + 7) +\n ' L' +\n (tb.bx + tb.arrowX + 5) +\n ',' +\n (tb.by + tb.bh) +\n 'Z'\n \"\n class=\"nd-tooltip__bg\"\n [class.today]=\"selectedPoint()!.isToday\"\n />\n <line\n [attr.x1]=\"tb.bx + tb.arrowX - 4\"\n [attr.y1]=\"tb.by + tb.bh\"\n [attr.x2]=\"tb.bx + tb.arrowX + 4\"\n [attr.y2]=\"tb.by + tb.bh\"\n class=\"nd-tooltip__seal\"\n />\n <text\n [attr.x]=\"tb.bx + tb.bw / 2\"\n [attr.y]=\"tb.by + 18\"\n text-anchor=\"middle\"\n class=\"nd-tooltip__vol\"\n [class.today]=\"selectedPoint()!.isToday\"\n >\n {{ selectedPoint()!.total }}ml\n </text>\n <text\n [attr.x]=\"tb.bx + tb.bw / 2\"\n [attr.y]=\"tb.by + 33\"\n text-anchor=\"middle\"\n class=\"nd-tooltip__date\"\n >\n {{ selectedPoint()!.dayLabel }} · {{ selectedPoint()!.dateLabel }}\n </text>\n </g>\n }\n }\n </svg>\n }\n\n <!-- AREA MODE -->\n @if (chartMode() === 'area') {\n <svg\n class=\"nd-svg\"\n [attr.viewBox]=\"'0 0 ' + areaChartData().W + ' ' + areaChartData().H\"\n preserveAspectRatio=\"xMidYMid meet\"\n (click)=\"clearSelected()\"\n >\n <defs>\n <linearGradient id=\"ndAreaGrad\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#4c5cf0\" stop-opacity=\"0.18\" />\n <stop offset=\"100%\" stop-color=\"#4c5cf0\" stop-opacity=\"0.02\" />\n </linearGradient>\n </defs>\n\n <!-- grid -->\n @for (r of [ 0.33, 0.66, 1 ]; track r) {\n <line\n class=\"nd-grid-line\"\n [attr.x1]=\"areaChartData().PL\"\n [attr.x2]=\"areaChartData().W - areaChartData().PR\"\n [attr.y1]=\"areaChartData().PT + areaChartData().cH - r * areaChartData().cH\"\n [attr.y2]=\"areaChartData().PT + areaChartData().cH - r * areaChartData().cH\"\n />\n <text\n class=\"nd-grid-label\"\n [attr.x]=\"areaChartData().PL - 5\"\n [attr.y]=\"areaChartData().PT + areaChartData().cH - r * areaChartData().cH + 4\"\n text-anchor=\"end\"\n >\n {{ areaChartData().max * r | number: '1.0-0' }}\n </text>\n }\n\n <!-- avg line -->\n <line\n class=\"nd-avg-line\"\n [attr.x1]=\"areaChartData().PL\"\n [attr.x2]=\"areaChartData().W - areaChartData().PR - 4\"\n [attr.y1]=\"areaChartData().avgY\"\n [attr.y2]=\"areaChartData().avgY\"\n />\n <text\n class=\"nd-avg-label\"\n [attr.x]=\"areaChartData().W - areaChartData().PR + 1\"\n [attr.y]=\"areaChartData().avgY + 3\"\n >\n avg\n </text>\n\n <!-- selected vertical crosshair -->\n @if (selectedIndex() !== null) {\n <line\n class=\"nd-crosshair\"\n [attr.x1]=\"areaChartData().pts[selectedIndex()!].x\"\n [attr.x2]=\"areaChartData().pts[selectedIndex()!].x\"\n [attr.y1]=\"areaChartData().PT\"\n [attr.y2]=\"areaChartData().PT + areaChartData().cH\"\n />\n }\n\n <path [attr.d]=\"areaChartData().areaPath\" fill=\"url(#ndAreaGrad)\" />\n <path class=\"nd-area-line\" [attr.d]=\"areaChartData().smooth\" />\n\n <!-- dots + hit targets -->\n @for (p of areaChartData().pts; track p.i) {\n <g (click)=\"$event.stopPropagation(); toggleSelected(p.i)\" class=\"nd-dot-grp\">\n <rect\n [attr.x]=\"p.x - 12\"\n [attr.y]=\"p.y - 12\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n />\n @if (areaChartData().showDot(p.i)) {\n @if (selectedIndex() === p.i) {\n <circle\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"14\"\n [class.nd-dot-halo]=\"true\"\n [class.today]=\"p.isToday\"\n />\n }\n <circle\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n [attr.r]=\"selectedIndex() === p.i ? 7 : p.isToday ? 7 : 3.5\"\n [class.nd-dot]=\"true\"\n [class.today]=\"p.isToday\"\n [class.nd-dot--dimmed]=\"selectedIndex() !== null && selectedIndex() !== p.i\"\n />\n @if (p.isToday && selectedIndex() !== p.i) {\n <circle [attr.cx]=\"p.x\" [attr.cy]=\"p.y\" r=\"11\" class=\"nd-dot-ring today\" />\n }\n }\n @if (areaChartData().showLabel(p.i) && selectedIndex() !== p.i && p.isToday) {\n <text\n [attr.x]=\"p.x\"\n [attr.y]=\"p.y - 14\"\n text-anchor=\"middle\"\n class=\"nd-bar-val today\"\n >\n {{ p.d.total }}\n </text>\n }\n </g>\n }\n\n <!-- x labels -->\n @for (p of areaChartData().pts; track p.i) {\n @if (areaChartData().showLabel(p.i)) {\n <text\n class=\"nd-x-label\"\n [class.today]=\"p.isToday\"\n [class.nd-x-label--sel]=\"selectedIndex() === p.i\"\n [attr.x]=\"p.x\"\n [attr.y]=\"areaChartData().H - 18\"\n text-anchor=\"middle\"\n >\n {{ formatDayLabel(p.d.date) }}\n </text>\n <text\n class=\"nd-x-sub\"\n [attr.x]=\"p.x\"\n [attr.y]=\"areaChartData().H - 4\"\n text-anchor=\"middle\"\n >\n {{ formatDateShort(p.d.date) }}\n </text>\n }\n }\n\n <!-- tooltip (area mode) -->\n @if (selectedIndex() !== null && tooltipBubble(); as tb) {\n @if (selectedPoint()!.total > 0) {\n <g class=\"nd-tooltip\" style=\"pointer-events: none\">\n <rect\n [attr.x]=\"tb.bx + 1\"\n [attr.y]=\"tb.by + 2\"\n [attr.width]=\"tb.bw\"\n [attr.height]=\"tb.bh\"\n rx=\"8\"\n class=\"nd-tooltip__shadow\"\n />\n <rect\n [attr.x]=\"tb.bx\"\n [attr.y]=\"tb.by\"\n [attr.width]=\"tb.bw\"\n [attr.height]=\"tb.bh\"\n rx=\"8\"\n class=\"nd-tooltip__bg\"\n [class.today]=\"selectedPoint()!.isToday\"\n />\n <path\n [attr.d]=\"\n 'M' +\n (tb.bx + tb.arrowX - 5) +\n ',' +\n (tb.by + tb.bh) +\n ' L' +\n (tb.bx + tb.arrowX) +\n ',' +\n (tb.by + tb.bh + 7) +\n ' L' +\n (tb.bx + tb.arrowX + 5) +\n ',' +\n (tb.by + tb.bh) +\n 'Z'\n \"\n class=\"nd-tooltip__bg\"\n [class.today]=\"selectedPoint()!.isToday\"\n />\n <line\n [attr.x1]=\"tb.bx + tb.arrowX - 4\"\n [attr.y1]=\"tb.by + tb.bh\"\n [attr.x2]=\"tb.bx + tb.arrowX + 4\"\n [attr.y2]=\"tb.by + tb.bh\"\n class=\"nd-tooltip__seal\"\n />\n <text\n [attr.x]=\"tb.bx + tb.bw / 2\"\n [attr.y]=\"tb.by + 18\"\n text-anchor=\"middle\"\n class=\"nd-tooltip__vol\"\n [class.today]=\"selectedPoint()!.isToday\"\n >\n {{ selectedPoint()!.total }}ml\n </text>\n <text\n [attr.x]=\"tb.bx + tb.bw / 2\"\n [attr.y]=\"tb.by + 33\"\n text-anchor=\"middle\"\n class=\"nd-tooltip__date\"\n >\n {{ selectedPoint()!.dayLabel }} · {{ selectedPoint()!.dateLabel }}\n </text>\n </g>\n }\n }\n </svg>\n\n <!-- area legend -->\n <div class=\"nd-legend\">\n <div class=\"nd-legend__item\">\n <svg width=\"20\" height=\"4\">\n <line x1=\"0\" y1=\"2\" x2=\"20\" y2=\"2\" class=\"nd-legend-line\" />\n </svg>\n <span>Xu hướng</span>\n </div>\n <div class=\"nd-legend__item\">\n <svg width=\"8\" height=\"8\">\n <circle cx=\"4\" cy=\"4\" r=\"4\" class=\"nd-legend-dot today\" />\n </svg>\n <span>Hôm nay</span>\n </div>\n <div class=\"nd-legend__item\">\n <svg width=\"20\" height=\"4\">\n <line\n x1=\"0\"\n y1=\"2\"\n x2=\"20\"\n y2=\"2\"\n class=\"nd-legend-line--avg\"\n stroke-dasharray=\"4 3\"\n />\n </svg>\n <span>Trung bình</span>\n </div>\n </div>\n }\n } @else {\n <div class=\"nd-empty\">Chưa có dữ liệu. Hãy ghi lại vài cữ bú nhé!</div>\n }\n </div>\n\n <!-- stat chips -->\n <div class=\"nd-chips\">\n <div class=\"nd-chip nd-chip--accent\">\n <div class=\"nd-chip__label\">TB/ngày</div>\n <div class=\"nd-chip__row\">\n <span class=\"nd-chip__val\">{{ chartStats().avgMl }}</span>\n <span class=\"nd-chip__unit\">ml</span>\n </div>\n </div>\n <div class=\"nd-chip\">\n <div class=\"nd-chip__label\">Cao nhất</div>\n <div class=\"nd-chip__row\">\n <span class=\"nd-chip__val\">{{ chartStats().maxMl }}</span>\n <span class=\"nd-chip__unit\">ml</span>\n </div>\n </div>\n <div class=\"nd-chip\">\n <div class=\"nd-chip__label\">Thấp nhất</div>\n <div class=\"nd-chip__row\">\n <span class=\"nd-chip__val\">{{ chartStats().minMl }}</span>\n <span class=\"nd-chip__unit\">ml</span>\n </div>\n </div>\n <div class=\"nd-chip\">\n <div class=\"nd-chip__label\">Tổng</div>\n <div class=\"nd-chip__row\">\n <span class=\"nd-chip__val\">{{ (chartStats().totalMl / 1000).toFixed(1) }}</span>\n <span class=\"nd-chip__unit\">L</span>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════════════════════════════════════════════════\n TAB 2 — Số cữ/ngày\n ══════════════════════════════════════════════════ -->\n @if (chartTab() === 'count') {\n <div class=\"nd-body\">\n <div class=\"nd-toolbar\">\n <div class=\"nd-section-title\">Số cữ theo ngày</div>\n <div class=\"nd-range-pills\">\n @for (r of chartRangeOptions; track r) {\n <button\n type=\"button\"\n class=\"nd-pill\"\n [class.active]=\"chartRange() === r\"\n (click)=\"setChartRange(r)\"\n >\n {{ r }}d\n </button>\n }\n </div>\n </div>\n\n <!-- Bar chart: số cữ/ngày -->\n <div class=\"nd-chart-box\">\n @if (chartStats().daysWithData > 0) {\n <svg\n class=\"nd-svg\"\n [attr.viewBox]=\"'0 0 ' + weeklyCountChart().W + ' ' + weeklyCountChart().H\"\n preserveAspectRatio=\"xMidYMid meet\"\n >\n <defs>\n <linearGradient id=\"ndCountGrad\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#818cf8\" />\n <stop offset=\"100%\" stop-color=\"#4c5cf0\" />\n </linearGradient>\n <linearGradient id=\"ndCountGradT\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#34d399\" />\n <stop offset=\"100%\" stop-color=\"#10b981\" />\n </linearGradient>\n </defs>\n\n <!-- grid lines -->\n @for (g of weeklyCountChart().gridLines; track g.y) {\n <line\n class=\"nd-grid-line\"\n [attr.x1]=\"weeklyCountChart().PAD_L\"\n [attr.x2]=\"weeklyCountChart().W - 16\"\n [attr.y1]=\"g.y\"\n [attr.y2]=\"g.y\"\n />\n <text\n class=\"nd-grid-label\"\n [attr.x]=\"weeklyCountChart().PAD_L - 5\"\n [attr.y]=\"g.y + 3\"\n text-anchor=\"end\"\n >{{ g.label }}\n </text>\n }\n\n <!-- avg line omitted: use gridLines for scale reference -->\n\n <!-- bars -->\n @for (b of weeklyCountChart().bars; track b.cx) {\n <g>\n <rect\n [attr.x]=\"b.x\"\n [attr.y]=\"b.y\"\n [attr.width]=\"b.barW\"\n [attr.height]=\"b.h\"\n [attr.rx]=\"b.d.count === 0 ? 2 : 4\"\n [attr.fill]=\"\n b.d.date === todayDateStr()\n ? 'url(#ndCountGradT)'\n : b.d.count === 0\n ? '#e2e8f0'\n : 'url(#ndCountGrad)'\n \"\n />\n <!-- value on top of bar -->\n @if (b.d.count > 0 && b.showValue) {\n <text\n class=\"nd-bar-val\"\n [class.today]=\"b.d.date === todayDateStr()\"\n [attr.x]=\"b.cx\"\n [attr.y]=\"b.y - 5\"\n text-anchor=\"middle\"\n >{{ b.d.count }}\n </text>\n }\n <!-- x label -->\n @if (b.showLabel) {\n <text\n class=\"nd-x-label\"\n [class.today]=\"b.d.date === todayDateStr()\"\n [attr.x]=\"b.cx\"\n [attr.y]=\"weeklyCountChart().H - weeklyCountChart().PAD_B + 14\"\n text-anchor=\"middle\"\n >{{ formatDayLabel(b.d.date) }}\n </text>\n <text\n class=\"nd-x-sub\"\n [attr.x]=\"b.cx\"\n [attr.y]=\"weeklyCountChart().H - weeklyCountChart().PAD_B + 24\"\n text-anchor=\"middle\"\n >{{ formatDayLabel(b.d.date) }}\n </text>\n }\n </g>\n }\n </svg>\n } @else {\n <div class=\"nd-empty\">Chưa có dữ liệu để hiển thị biểu đồ.</div>\n }\n </div>\n\n <!-- stat chips -->\n <div class=\"nd-chips nd-chips--3\">\n <div class=\"nd-chip nd-chip--accent\">\n <div class=\"nd-chip__label\">TB/ngày</div>\n <div class=\"nd-chip__row\">\n <span class=\"nd-chip__val\">{{ chartStats().avgCount }}</span>\n <span class=\"nd-chip__unit\">cữ</span>\n </div>\n </div>\n <div class=\"nd-chip\">\n <div class=\"nd-chip__label\">Cao nhất</div>\n <div class=\"nd-chip__row\">\n <span class=\"nd-chip__val\">{{ chartStats().maxCount }}</span>\n <span class=\"nd-chip__unit\">cữ</span>\n </div>\n </div>\n <div class=\"nd-chip\">\n <div class=\"nd-chip__label\">Có cữ</div>\n <div class=\"nd-chip__row\">\n <span class=\"nd-chip__val\">{{ chartStats().daysWithData }}</span>\n <span class=\"nd-chip__unit\">ngày</span>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════════════════════════════════════════════════\n TAB 3 — Trong ngày\n ══════════════════════════════════════════════════ -->\n @if (chartTab() === 'timeline') {\n <div class=\"nd-body\">\n <div class=\"nd-toolbar\">\n <div class=\"nd-section-title\">Trong ngày</div>\n </div>\n\n <!-- quick stats -->\n <div class=\"nd-chips nd-chips--3\">\n <div class=\"nd-chip nd-chip--accent\">\n <div class=\"nd-chip__label\">Tổng hôm nay</div>\n <div class=\"nd-chip__row\">\n <span class=\"nd-chip__val\">{{ heatmapData().totalToday }}</span>\n <span class=\"nd-chip__unit\">ml</span>\n </div>\n </div>\n <div class=\"nd-chip\">\n <div class=\"nd-chip__label\">Số cữ</div>\n <div class=\"nd-chip__row\">\n <span class=\"nd-chip__val\">{{ heatmapData().feedCount }}</span>\n <span class=\"nd-chip__unit\">cữ</span>\n </div>\n </div>\n <div class=\"nd-chip\">\n <div class=\"nd-chip__label\">TB mỗi cữ</div>\n <div class=\"nd-chip__row\">\n <span class=\"nd-chip__val\">{{ heatmapData().avgPerFeed }}</span>\n <span class=\"nd-chip__unit\">ml</span>\n </div>\n </div>\n </div>\n\n <!-- Cumulative line chart -->\n <div class=\"nd-chart-box nd-chart-box--timeline\">\n @if (hasTimelineChartData()) {\n <!-- zoom controls -->\n <div class=\"nd-tl-zoom\">\n <button\n type=\"button\"\n class=\"nd-zoom-btn\"\n [disabled]=\"timelineChartZoom() <= 1\"\n (click)=\"timelineZoomOut()\"\n title=\"Thu nhỏ\"\n ><i class=\"pi pi-minus\"></i></button>\n <span class=\"nd-zoom-label\">{{ timelineChartZoom() }}×</span>\n <button\n type=\"button\"\n class=\"nd-zoom-btn\"\n [disabled]=\"timelineChartZoom() >= 2.5\"\n (click)=\"timelineZoomIn()\"\n title=\"Phóng to\"\n ><i class=\"pi pi-plus\"></i></button>\n </div>\n\n <div class=\"nd-tl-scroll-wrap\">\n <svg\n class=\"nd-tl-svg\"\n [attr.viewBox]=\"'0 0 ' + timelineChart().W + ' ' + timelineChart().H\"\n [attr.width]=\"timelineChart().W\"\n [attr.height]=\"timelineChart().H\"\n preserveAspectRatio=\"xMinYMid meet\"\n >\n <defs>\n <!-- today area gradient -->\n <linearGradient id=\"tlTodayGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"#4c5cf0\" stop-opacity=\"0.22\" />\n <stop offset=\"100%\" stop-color=\"#4c5cf0\" stop-opacity=\"0.02\" />\n </linearGradient>\n <!-- rec band gradient -->\n @if (timelineChart().hasRecommendation) {\n <linearGradient id=\"tlRecGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"#10b981\" stop-opacity=\"0.18\" />\n <stop offset=\"100%\" stop-color=\"#10b981\" stop-opacity=\"0.04\" />\n </linearGradient>\n }\n </defs>\n\n <!-- y grid lines -->\n @for (g of timelineChart().yGrid; track g.y) {\n <line\n class=\"nd-grid-line\"\n [attr.x1]=\"timelineChart().PAD_L\"\n [attr.x2]=\"timelineChart().W - 16\"\n [attr.y1]=\"g.y\"\n [attr.y2]=\"g.y\"\n />\n <text\n class=\"nd-grid-label\"\n [attr.x]=\"timelineChart().PAD_L - 5\"\n [attr.y]=\"g.y + 3\"\n text-anchor=\"end\"\n >{{ g.label }}\n </text>\n }\n\n <!-- x ticks (hours) -->\n @for (t of timelineChart().xTicks; track t.hour) {\n <line\n class=\"nd-grid-line\"\n [attr.x1]=\"t.x\"\n [attr.x2]=\"t.x\"\n [attr.y1]=\"timelineChart().chartTop\"\n [attr.y2]=\"timelineChart().chartBottom\"\n stroke-dasharray=\"2,3\"\n />\n <text\n class=\"nd-x-label\"\n [attr.x]=\"t.x\"\n [attr.y]=\"timelineChart().chartBottom + 13\"\n text-anchor=\"middle\"\n >{{ t.hour }}h\n </text>\n }\n\n <!-- recommendation band -->\n @if (timelineChart().hasRecommendation && timelineChart().recBandPath) {\n <path\n class=\"nd-tl-rec-band\"\n [attr.d]=\"timelineChart().recBandPath\"\n />\n <path\n class=\"nd-tl-rec-mid\"\n [attr.d]=\"timelineChart().recMidPath\"\n />\n }\n\n <!-- today area fill -->\n @if (timelineChart().todayPath) {\n <path\n class=\"nd-tl-area-today\"\n [attr.d]=\"timelineChart().todayPath + ' L' + timelineChart().nowX + ',' + timelineChart().chartBottom + ' L' + timelineChart().PAD_L + ',' + timelineChart().chartBottom + ' Z'\"\n />\n }\n\n <!-- avg 3 ngày trước line -->\n @if (timelineChart().avg3Path && timelineChart().avg3Total > 0) {\n <path\n class=\"nd-tl-path nd-tl-path--avg3\"\n [attr.d]=\"timelineChart().avg3Path\"\n />\n }\n\n <!-- hôm qua line -->\n @if (timelineChart().yesterdayPath && timelineChart().yesterdayTotal > 0) {\n <path\n class=\"nd-tl-path nd-tl-path--yest\"\n [attr.d]=\"timelineChart().yesterdayPath\"\n />\n }\n\n <!-- hôm nay line (on top) -->\n @if (timelineChart().todayPath) {\n <path\n class=\"nd-tl-path nd-tl-path--today\"\n [attr.d]=\"timelineChart().todayPath\"\n />\n }\n\n <!-- \"now\" vertical marker -->\n <line\n class=\"nd-tl-now-line\"\n [attr.x1]=\"timelineChart().nowX\"\n [attr.x2]=\"timelineChart().nowX\"\n [attr.y1]=\"timelineChart().chartTop\"\n [attr.y2]=\"timelineChart().chartBottom\"\n />\n\n <!-- today end dot + label -->\n @if (timelineChart().todayEndPoint; as ep) {\n <circle\n class=\"nd-tl-dot--today\"\n [attr.cx]=\"ep.x\"\n [attr.cy]=\"ep.y\"\n r=\"4\"\n />\n <text\n class=\"nd-tl-end-label\"\n [attr.x]=\"ep.x + 8\"\n [attr.y]=\"ep.y + 4\"\n >{{ ep.v }}ml\n </text>\n }\n </svg>\n </div>\n\n <!-- legend -->\n <div class=\"nd-tl-legend\">\n <div class=\"nd-tl-legend__item today\">\n <div class=\"nd-tl-legend__line\"></div>\n <span>Hôm nay</span>\n <strong>{{ timelineChart().todayTotal }}ml</strong>\n </div>\n @if (timelineChart().yesterdayTotal > 0) {\n <div class=\"nd-tl-legend__item yest\">\n <div class=\"nd-tl-legend__line\"></div>\n <span>Hôm qua</span>\n <strong>{{ timelineChart().yesterdayTotal }}ml</strong>\n </div>\n }\n @if (timelineChart().avg3Total > 0 && timelineChart().prev3DaysCount > 0) {\n <div class=\"nd-tl-legend__item avg3\">\n <div class=\"nd-tl-legend__line\"></div>\n <span>TB {{ timelineChart().prev3DaysCount }} ngày trước</span>\n <strong>{{ timelineChart().avg3Total }}ml</strong>\n </div>\n }\n @if (timelineChart().hasRecommendation) {\n <div class=\"nd-tl-legend__item rec\">\n <div class=\"nd-tl-legend__line\"></div>\n <span>KN {{ timelineChart().recRangeLabel }}</span>\n </div>\n }\n </div>\n } @else {\n <div class=\"nd-empty\">Chưa có đủ dữ liệu để vẽ biểu đồ.</div>\n }\n </div>\n\n <!-- session feed cards -->\n <div class=\"nd-section-title\" style=\"margin-top: 16px\">Danh sách cữ bú</div>\n @if (todaySessions().length > 0) {\n <div class=\"nd-sessions\">\n @for (s of todaySessions(); track s.time; let last = $last) {\n <div class=\"nd-session\">\n <div class=\"nd-session__spine\">\n <div class=\"nd-session__dot\"></div>\n @if (!last) {\n <div class=\"nd-session__line\"></div>\n }\n </div>\n <div class=\"nd-session__card\" [class.nd-session__card--last]=\"last\">\n <div class=\"nd-session__card-top\">\n <span class=\"nd-session__time\">{{ s.time }}</span>\n <div class=\"nd-session__vol\">\n <span class=\"nd-session__vol-num\">{{ s.volume }}</span>\n <span class=\"nd-session__vol-unit\">ml</span>\n </div>\n </div>\n <div class=\"nd-session__prog-bg\">\n <div\n class=\"nd-session__prog-fill\"\n [style.width.%]=\"(s.volume / todaySessionsMaxVol()) * 100\"\n ></div>\n </div>\n <div class=\"nd-session__meta\">\n @if (s.gap !== '—') {\n <span class=\"nd-session__gap\">+{{ s.gap }}</span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"nd-empty\">Chưa có cữ bú nào hôm nay.</div>\n }\n </div>\n }\n</section>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\n\nexport interface FeedingProfile {\n babyName: string;\n birthDate: string;\n gender?: 'boy' | 'girl' | '';\n}\n\nexport interface FeedingProfileDraft {\n babyName: string;\n birthDate: string;\n gender?: 'boy' | 'girl' | '';\n}\n\n@Component({\n selector: 'app-feeding-profile',\n standalone: true,\n imports: [FormsModule],\n templateUrl: './feeding-profile.component.html',\n styleUrls: ['./feeding-profile.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedingProfileComponent {\n user = input.required<string>();\n profile = input<FeedingProfile | null>(null);\n draft = input.required<FeedingProfileDraft>();\n editing = input(false);\n maxBirthDate = input.required<string>();\n\n save = output<void>();\n cancelEdit = output<void>();\n startEdit = output<void>();\n clearProfile = output<void>();\n draftNameChange = output<string>();\n draftBirthChange = output<string>();\n draftGenderChange = output<'boy' | 'girl' | ''>();\n\n onDraftGender(gender: 'boy' | 'girl' | ''): void {\n this.draftGenderChange.emit(gender);\n }\n}\n","<!-- Profile form -->\n@if (editing()) {\n <section class=\"card profile-card\">\n <div class=\"card-header\">\n <h2>\n <i class=\"pi pi-user\"></i>\n {{ profile() ? 'Cập nhật profile của bé' : 'Thêm profile của bé' }}\n </h2>\n <p>Thông tin được lưu cục bộ trên trình duyệt này cho user \"{{ user() }}\".</p>\n </div>\n <form class=\"form\" (ngSubmit)=\"save.emit()\">\n <label class=\"field\">\n <span class=\"label\">Tên của bé</span>\n <input\n type=\"text\"\n [ngModel]=\"draft().babyName\"\n (ngModelChange)=\"draftNameChange.emit($event)\"\n name=\"babyName\"\n placeholder=\"VD: Bin, Bông, Minh Anh...\"\n required\n autocomplete=\"off\"\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Ngày sinh của bé</span>\n <input\n type=\"date\"\n [ngModel]=\"draft().birthDate\"\n (ngModelChange)=\"draftBirthChange.emit($event)\"\n name=\"birthDate\"\n [max]=\"maxBirthDate()\"\n required\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Giới tính (tuỳ chọn)</span>\n <div class=\"radio-group\">\n <button\n type=\"button\"\n class=\"chip\"\n [class.active]=\"draft().gender === 'boy'\"\n (click)=\"onDraftGender('boy')\"\n >\n 👦 Bé trai\n </button>\n <button\n type=\"button\"\n class=\"chip\"\n [class.active]=\"draft().gender === 'girl'\"\n (click)=\"onDraftGender('girl')\"\n >\n 👧 Bé gái\n </button>\n <button\n type=\"button\"\n class=\"chip\"\n [class.active]=\"!draft().gender\"\n (click)=\"onDraftGender('')\"\n >\n Bỏ qua\n </button>\n </div>\n </label>\n <div class=\"form-actions\">\n <button\n type=\"submit\"\n class=\"btn primary\"\n [disabled]=\"!draft().babyName.trim() || !draft().birthDate\"\n >\n <i class=\"pi pi-check\"></i> Lưu profile\n </button>\n @if (profile()) {\n <button type=\"button\" class=\"btn ghost\" (click)=\"cancelEdit.emit()\">Huỷ</button>\n }\n </div>\n </form>\n </section>\n}\n","import type { FeedingLog } from '../../services/feeding-log.service';\n\n/** Một dòng hiển thị sau khi gom các cữ gần nhau (cùng sheet row vẫn tách). */\nexport interface FeedingViewGroup {\n members: FeedingLog[];\n}\n\n/**\n * Gom cữ có khoảng cách (chuỗi) ≤ `gapMinutes` phút thành một nhóm.\n * `gapMinutes` ≤ 0 → mỗi cữ một nhóm (không gom).\n * Trả về thứ tự **mới → cũ** (đồng bộ list log hiện tại).\n */\nexport function groupLogsByProximity(\n logsAnyOrder: FeedingLog[],\n gapMinutes: number,\n timestampMs: (l: FeedingLog) => number\n): FeedingViewGroup[] {\n if (!logsAnyOrder.length) return [];\n if (!gapMinutes || gapMinutes <= 0) {\n const desc = [...logsAnyOrder].sort((a, b) => timestampMs(b) - timestampMs(a));\n return desc.map((m) => ({ members: [m] }));\n }\n\n const asc = [...logsAnyOrder].sort((a, b) => timestampMs(a) - timestampMs(b));\n const clusters: FeedingLog[][] = [];\n for (const l of asc) {\n if (!clusters.length) {\n clusters.push([l]);\n continue;\n }\n const cur = clusters[clusters.length - 1];\n const last = cur[cur.length - 1];\n if ((timestampMs(l) - timestampMs(last)) / 60000 <= gapMinutes) {\n cur.push(l);\n } else {\n clusters.push([l]);\n }\n }\n return clusters.map((members) => ({ members })).reverse();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { finalize } from 'rxjs/operators';\nimport {\n BottlePrepFromSheet,\n FEEDING_SETTING_ID,\n FeedingLog,\n FeedingLogService,\n FeedingSettingsResolved,\n} from '../../../services/feeding-log.service';\nimport { ActivityLogService } from '../../../services/activity-log.service';\nimport { FeedingPrediction } from '../feeding-prediction';\nimport { FeedingViewGroup, groupLogsByProximity } from '../feeding-view-group';\n\ninterface LogDraft {\n date: string;\n time: string;\n volume: number | null;\n note: string;\n}\n\ninterface DayStatsSlice {\n total: number;\n count: number;\n}\n\ntype FeedDetailCompareKind = 'gap' | 'position' | 'average' | 'next';\n\ninterface FeedDetailCompareRow {\n label: string;\n text: string;\n warn?: boolean;\n icon: string;\n kind: FeedDetailCompareKind;\n position?: {\n index: number;\n total: number;\n totalMl: number;\n dayTotalMl: number;\n dayLabel: string;\n };\n average?: {\n refMl: number;\n diffMl: number;\n refLabel: string;\n feedCount: number;\n };\n next?: {\n time: string;\n volume: number;\n gapLabel: string;\n };\n gapPrev?: {\n prevTime: string;\n prevVolume: number;\n prevDateIso?: string;\n gapLabel: string;\n volDiffMl: number;\n };\n}\n\ninterface FeedDetailView {\n log: FeedingLog;\n ageLabel: string;\n volumeStatus: 'low' | 'high' | 'ok';\n compares: FeedDetailCompareRow[];\n note: string;\n}\n\ninterface DayStatsFull {\n date: string;\n total: number;\n count: number;\n avg: number;\n medianMl: number;\n typicalFeedMl: number;\n max: number;\n min: number;\n firstTime: string;\n lastTime: string;\n}\n\n@Component({\n selector: 'app-feeding-dialogs',\n standalone: true,\n imports: [CommonModule, FormsModule],\n templateUrl: './feeding-dialogs.component.html',\n styleUrls: ['./feeding-dialogs.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedingDialogsComponent {\n private feedingLogService = inject(FeedingLogService);\n private activityLogService = inject(ActivityLogService);\n\n logs = input.required<FeedingLog[]>();\n user = input.required<string>();\n now = input.required<Date>();\n bottlePrep = input<BottlePrepFromSheet | null>(null);\n feedingSettings = input.required<FeedingSettingsResolved>();\n prediction = input.required<FeedingPrediction>();\n todayStats = input.required<DayStatsSlice>();\n yesterdayStats = input.required<DayStatsSlice>();\n todayLogs = input.required<FeedingLog[]>();\n yesterdayLogs = input.required<FeedingLog[]>();\n maxBirthDate = input.required<string>();\n syncError = input('');\n syncMessage = input('');\n\n readonly feedingDeleteReasonQuickTags = [\n 'Nhập nhầm',\n 'Trùng cữ',\n 'Sai giờ',\n 'Sai ml',\n 'Bé không bú',\n 'Log thử',\n ] as const;\n\n logsChanged = output<void>();\n settingsChanged = output<FeedingSettingsResolved>();\n syncErrorChange = output<string>();\n syncMessageChange = output<string>();\n logDialogOpenChange = output<boolean>();\n bottlePrepClearRequested = output<void>();\n\n logDraft = signal<LogDraft>({\n date: this.toDateStr(new Date()),\n time: this.toTimeStr(new Date()),\n volume: null,\n note: '',\n });\n logDialogOpen = signal(false);\n saving = signal(false);\n\n editingLog = signal<FeedingLog | null>(null);\n editLogDraft = signal<{ time: string; volume: number | null; note: string }>({\n time: '',\n volume: null,\n note: '',\n });\n editSaving = signal(false);\n\n feedingSettingsDialogOpen = signal(false);\n settingsDraft = signal<{\n timeWarningHours: number;\n warningMl: number;\n groupGapMinutes: number;\n notificationMinutes: number;\n burpDurationMinutes: number;\n eventReminderDays: number;\n eventReminderHours: number;\n activityLogRefreshMinutes: number;\n } | null>(null);\n settingsSaving = signal(false);\n settingsFormError = signal('');\n settingsSuccess = signal('');\n\n historyDialogOpen = signal(false);\n feedDetailView = signal<FeedDetailView | null>(null);\n feedGroupDetail = signal<FeedingViewGroup | null>(null);\n feedingDeleteConfirmLog = signal<FeedingLog | null>(null);\n feedingDeleteReasonDraft = signal('');\n feedingDeleteSaving = signal(false);\n feedGroupDetailMembersDesc = computed<FeedingLog[]>(() => {\n const g = this.feedGroupDetail();\n if (!g?.members?.length) return [];\n return [...g.members].sort((a, b) => {\n const ka = `${a.date}T${a.time}`;\n const kb = `${b.date}T${b.time}`;\n return kb.localeCompare(ka);\n });\n });\n\n historyFilter = signal<'all' | 'today' | 'yesterday' | 'date'>('all');\n historyFilterDate = signal('');\n historyFeedDisplayLimit = signal(100);\n private lastHistoryInfiniteScrollAt = 0;\n\n remainingInput = signal('');\n /** Đã dùng tính từ sữa đã pha; khi lưu cữ bú thành công sẽ ghi log «System đã …» (activity log). */\n bottlePrepClearPendingLog = signal(false);\n pendingClearedPrepVolumeMl = signal<number | null>(null);\n pendingBottlePrepConsumedMl = signal<number | null>(null);\n pendingBottlePrepRemainingMl = signal<number | null>(null);\n\n calcResult = computed<number | null>(() => {\n const prep = this.bottlePrep();\n if (!prep) return null;\n const r = parseFloat(this.remainingInput());\n if (isNaN(r) || r < 0) return null;\n const consumed = prep.volumeMl - r;\n if (consumed <= 0) return null;\n return Math.round(consumed);\n });\n\n historyLogsFilteredSorted = computed(() => {\n const filter = this.historyFilter();\n const todayStr = this.todayDateStr();\n const yesterdayStr = this.yesterdayDateStr();\n const dateStr = this.historyFilterDate();\n const out: FeedingLog[] = [];\n for (const log of this.logs()) {\n if (filter === 'today' && log.date !== todayStr) continue;\n if (filter === 'yesterday' && log.date !== yesterdayStr) continue;\n if (filter === 'date' && dateStr && log.date !== dateStr) continue;\n out.push(log);\n }\n out.sort((a, b) => {\n const ka = `${a.date}T${a.time}`;\n const kb = `${b.date}T${b.time}`;\n return kb.localeCompare(ka);\n });\n return out;\n });\n\n historyFilteredFeedTotal = computed(() => this.historyLogsFilteredSorted().length);\n\n historyDisplayedFeedCount = computed(() =>\n Math.min(this.historyFeedDisplayLimit(), this.historyFilteredFeedTotal())\n );\n\n historyHasMoreFeeds = computed(\n () => this.historyFilteredFeedTotal() > this.historyFeedDisplayLimit()\n );\n\n feedingsByDate = computed(() => {\n const flat = this.historyLogsFilteredSorted();\n const limit = this.historyFeedDisplayLimit();\n const sliced = flat.slice(0, limit);\n const gap = this.feedingSettings().feedGroupGapMinutes;\n const groups = new Map<string, FeedingLog[]>();\n for (const log of sliced) {\n if (!groups.has(log.date)) groups.set(log.date, []);\n groups.get(log.date)!.push(log);\n }\n return Array.from(groups.entries())\n .map(([date, dayLogs]) => {\n const viewRows = groupLogsByProximity(dayLogs, gap, (l) => this.logTimestamp(l));\n const count = viewRows.length;\n const total = viewRows.reduce((s, g) => s + this.viewGroupDisplayVolume(g), 0);\n return {\n date,\n logs: dayLogs.sort((a, b) => b.time.localeCompare(a.time)),\n viewRows,\n total,\n count,\n avg: count > 0 ? Math.round(total / count) : 0,\n };\n })\n .sort((a, b) => b.date.localeCompare(a.date));\n });\n\n trackFeedingViewGroup = (_index: number, g: FeedingViewGroup): string => this.viewGroupKey(g);\n\n trackHistoryGroup(_index: number, g: { date: string }): string {\n return g.date;\n }\n\n trackFeedingLogRow(_index: number, l: FeedingLog): string {\n return l.rowIndex != null ? `r${l.rowIndex}` : `${l.date}|${l.time}`;\n }\n\n // —— Public API (called from parent template via template ref) ——\n\n openLogDialog(resetTime = true): void {\n if (resetTime) {\n this.bottlePrepClearPendingLog.set(false);\n this.pendingClearedPrepVolumeMl.set(null);\n this.pendingBottlePrepConsumedMl.set(null);\n this.pendingBottlePrepRemainingMl.set(null);\n const nowD = new Date();\n this.logDraft.set({\n date: this.toDateStr(nowD),\n time: this.toTimeStr(nowD),\n volume: null,\n note: '',\n });\n this.resetRemaining();\n }\n this.syncErrorChange.emit('');\n this.syncMessageChange.emit('');\n this.logDialogOpen.set(true);\n this.logDialogOpenChange.emit(true);\n }\n\n closeLogDialog(): void {\n this.logDialogOpen.set(false);\n this.logDialogOpenChange.emit(false);\n this.resetRemaining();\n }\n\n openEditDialog(log: FeedingLog): void {\n if (!log.rowIndex) return;\n this.editingLog.set(log);\n this.editLogDraft.set({\n time: log.time,\n volume: log.volume,\n note: log.note || '',\n });\n this.syncErrorChange.emit('');\n this.syncMessageChange.emit('');\n }\n\n closeEditDialog(): void {\n this.editingLog.set(null);\n this.editLogDraft.set({ time: '', volume: null, note: '' });\n }\n\n openHistoryDialog(\n filter: 'all' | 'today' | 'yesterday' | 'date' = 'all',\n dateStr?: string\n ): void {\n this.historyFilter.set(filter);\n this.historyFilterDate.set(filter === 'date' && dateStr ? dateStr : '');\n this.historyFeedDisplayLimit.set(100);\n this.historyDialogOpen.set(true);\n }\n\n closeHistoryDialog(): void {\n this.historyDialogOpen.set(false);\n }\n\n openFeedingSettingsDialog(): void {\n const s = this.feedingSettings();\n this.settingsFormError.set('');\n this.settingsSuccess.set('');\n this.settingsDraft.set({\n timeWarningHours: s.feedTimeWarningHours,\n warningMl: s.feedWarningMl,\n groupGapMinutes: s.feedGroupGapMinutes,\n notificationMinutes: s.feedingNotificationMinutes,\n burpDurationMinutes: s.burpDurationMinutes,\n eventReminderDays: s.eventReminderDays,\n eventReminderHours: s.eventReminderHours,\n activityLogRefreshMinutes: s.activityLogRefreshMinutes,\n });\n this.feedingSettingsDialogOpen.set(true);\n }\n\n closeFeedingSettingsDialog(): void {\n this.feedingSettingsDialogOpen.set(false);\n this.settingsDraft.set(null);\n this.settingsFormError.set('');\n }\n\n onFeedRowClick(g: FeedingViewGroup): void {\n if (g.members.length > 1) {\n this.openFeedGroupDetail(g);\n return;\n }\n const log = g.members[0];\n if (log) this.openFeedDetail(log);\n }\n\n openFeedGroupDetail(g: FeedingViewGroup): void {\n if (g.members.length < 2) return;\n this.closeFeedDetail();\n this.feedGroupDetail.set(g);\n }\n\n closeFeedGroupDetail(): void {\n this.feedDetailView.set(null);\n this.feedGroupDetail.set(null);\n }\n\n openFeedDetailFromGroupMember(log: FeedingLog): void {\n this.feedDetailView.set(this.buildFeedDetailView(log));\n }\n\n closeFeedDetail(): void {\n this.feedDetailView.set(null);\n }\n\n openEditFromFeedDetail(): void {\n const log = this.feedDetailView()?.log;\n if (!log?.rowIndex) return;\n this.closeFeedDetail();\n this.openEditDialog(log);\n }\n\n deleteLog(log: FeedingLog): void {\n if (!log.rowIndex) return;\n this.feedingDeleteConfirmLog.set(log);\n this.feedingDeleteReasonDraft.set('');\n this.syncErrorChange.emit('');\n this.syncMessageChange.emit('');\n }\n\n closeFeedingDeleteConfirm(): void {\n if (this.feedingDeleteSaving()) return;\n this.feedingDeleteConfirmLog.set(null);\n this.feedingDeleteReasonDraft.set('');\n }\n\n updateFeedingDeleteReason(v: string): void {\n this.feedingDeleteReasonDraft.set(v);\n }\n\n toggleFeedingDeleteReasonQuickTag(tag: string): void {\n const cur = this.feedingDeleteReasonDraft().trim();\n this.feedingDeleteReasonDraft.set(cur === tag ? '' : tag);\n }\n\n confirmDeleteFeedingLog(): void {\n const log = this.feedingDeleteConfirmLog();\n if (!log?.rowIndex || this.feedingDeleteSaving()) return;\n\n const reason = this.feedingDeleteReasonDraft().trim();\n this.feedingDeleteSaving.set(true);\n this.feedingLogService\n .deleteLog(log.rowIndex)\n .pipe(finalize(() => this.feedingDeleteSaving.set(false)))\n .subscribe({\n next: () => {\n this.feedingDeleteConfirmLog.set(null);\n this.feedingDeleteReasonDraft.set('');\n this.closeFeedGroupDetail();\n this.syncMessageChange.emit('Đã xoá cữ bú.');\n this.activityLogService\n .logFeeding(this.user(), 'FEEDING_DELETED', {\n time: log.time,\n volume: log.volume,\n reason: reason || undefined,\n })\n .subscribe();\n setTimeout(() => this.syncMessageChange.emit(''), 3000);\n this.logsChanged.emit();\n },\n error: (err) => {\n this.syncErrorChange.emit(err?.message || 'Xoá thất bại.');\n },\n });\n }\n\n usePredictionValues(): void {\n const p = this.prediction();\n if (!p?.nextTime || !p?.nextVolume) return;\n this.logDraft.update((d) => ({\n ...d,\n date: this.todayDateStr(),\n time: p.nextTime!,\n volume: p.nextVolume!,\n }));\n this.openLogDialog(false);\n }\n\n // —— Log form ——\n\n updateLogDate(v: string): void {\n this.logDraft.update((d) => ({ ...d, date: v }));\n }\n\n updateLogTime(v: string): void {\n this.logDraft.update((d) => ({ ...d, time: v }));\n }\n\n updateLogVolume(v: string): void {\n const num = parseInt(v, 10);\n this.logDraft.update((d) => ({\n ...d,\n volume: isNaN(num) ? null : num,\n }));\n }\n\n updateLogNote(v: string): void {\n this.logDraft.update((d) => ({ ...d, note: v }));\n }\n\n setLogNow(): void {\n const n = new Date();\n this.logDraft.set({\n date: this.toDateStr(n),\n time: this.toTimeStr(n),\n volume: this.logDraft().volume,\n note: this.logDraft().note,\n });\n }\n\n quickVolume(v: number): void {\n this.logDraft.update((d) => ({ ...d, volume: v }));\n }\n\n quickNote(tag: string): void {\n this.logDraft.update((d) => ({\n ...d,\n note: d.note === tag ? '' : tag,\n }));\n }\n\n hasQuickNote(tag: string): boolean {\n return this.logDraft().note === tag;\n }\n\n updateRemaining(v: string): void {\n this.remainingInput.set(String(v ?? '').replace(/[^\\d]/g, ''));\n }\n\n applyCalcVolume(): void {\n const r = this.calcResult();\n if (r === null) return;\n const prep = this.bottlePrep();\n if (prep && prep.volumeMl > 0) {\n const remainingMl = parseFloat(this.remainingInput()) || 0;\n this.bottlePrepClearPendingLog.set(true);\n this.pendingClearedPrepVolumeMl.set(prep.volumeMl);\n this.pendingBottlePrepConsumedMl.set(r);\n this.pendingBottlePrepRemainingMl.set(Math.max(0, Math.round(remainingMl)));\n }\n this.logDraft.update((d) => ({ ...d, volume: r }));\n this.bottlePrepClearRequested.emit();\n this.remainingInput.set('');\n }\n\n submitLog(): void {\n const d = this.logDraft();\n if (!d.date || !d.time || !d.volume || d.volume <= 0) {\n this.syncErrorChange.emit('Vui lòng nhập đủ ngày, giờ và dung tích sữa.');\n return;\n }\n\n const log: FeedingLog = {\n user: this.user(),\n date: d.date,\n time: d.time,\n volume: d.volume,\n note: d.note?.trim() || undefined,\n };\n\n this.saving.set(true);\n this.syncErrorChange.emit('');\n this.syncMessageChange.emit('');\n\n this.feedingLogService.addLog(log).subscribe({\n next: () => {\n this.saving.set(false);\n this.syncMessageChange.emit(\n `Đã lưu cữ ${log.volume}ml lúc ${log.time} ngày ${this.formatDateDisplay(log.date)}`\n );\n this.activityLogService\n .logFeeding(this.user(), 'FEEDING_ADDED', {\n time: log.time,\n volume: log.volume,\n })\n .subscribe();\n if (this.bottlePrepClearPendingLog()) {\n const prepVol = this.pendingClearedPrepVolumeMl();\n const consumed = this.pendingBottlePrepConsumedMl();\n const remaining = this.pendingBottlePrepRemainingMl();\n if (prepVol != null && prepVol > 0) {\n this.activityLogService\n .logBottlePrepClearedAfterFeed(\n prepVol,\n consumed ?? log.volume,\n remaining ?? Math.max(0, prepVol - log.volume)\n )\n .subscribe();\n }\n this.bottlePrepClearPendingLog.set(false);\n this.pendingClearedPrepVolumeMl.set(null);\n this.pendingBottlePrepConsumedMl.set(null);\n this.pendingBottlePrepRemainingMl.set(null);\n }\n const nowT = this.toTimeStr(new Date());\n this.logDraft.set({\n date: d.date,\n time: nowT,\n volume: null,\n note: '',\n });\n setTimeout(() => this.syncMessageChange.emit(''), 4000);\n this.closeLogDialog();\n this.logsChanged.emit();\n },\n error: (err) => {\n this.saving.set(false);\n this.syncErrorChange.emit(\n err?.message || 'Lưu thất bại. Vui lòng kiểm tra cấu hình Apps Script.'\n );\n },\n });\n }\n\n // —— Edit log ——\n\n updateEditTime(v: string): void {\n this.editLogDraft.update((d) => ({ ...d, time: v }));\n }\n\n updateEditVolume(v: string): void {\n const num = parseInt(v, 10);\n this.editLogDraft.update((d) => ({\n ...d,\n volume: isNaN(num) ? null : num,\n }));\n }\n\n updateEditNote(v: string): void {\n this.editLogDraft.update((d) => ({ ...d, note: v }));\n }\n\n quickEditVolume(v: number): void {\n this.editLogDraft.update((d) => ({ ...d, volume: v }));\n }\n\n quickEditNote(tag: string): void {\n this.editLogDraft.update((d) => ({\n ...d,\n note: d.note === tag ? '' : tag,\n }));\n }\n\n hasEditNote(tag: string): boolean {\n return this.editLogDraft().note === tag;\n }\n\n submitEditLog(): void {\n const original = this.editingLog();\n const d = this.editLogDraft();\n if (!original?.rowIndex) return;\n if (!d.time || !d.volume || d.volume <= 0) {\n this.syncErrorChange.emit('Vui lòng nhập đủ giờ và dung tích sữa.');\n return;\n }\n\n this.editSaving.set(true);\n this.syncErrorChange.emit('');\n this.syncMessageChange.emit('');\n\n this.feedingLogService\n .updateLog(original.rowIndex, {\n time: d.time,\n volume: d.volume,\n note: d.note?.trim() || '',\n })\n .subscribe({\n next: () => {\n this.editSaving.set(false);\n this.syncMessageChange.emit(\n `Đã cập nhật cữ ${d.volume}ml lúc ${d.time} ngày ${this.formatDateDisplay(original.date)}`\n );\n this.activityLogService\n .logFeeding(this.user(), 'FEEDING_UPDATED', {\n time: d.time,\n oldTime: original.time,\n newTime: d.time,\n oldVolume: original.volume,\n newVolume: d.volume ?? undefined,\n })\n .subscribe();\n setTimeout(() => this.syncMessageChange.emit(''), 4000);\n this.closeEditDialog();\n this.logsChanged.emit();\n },\n error: (err) => {\n this.editSaving.set(false);\n this.syncErrorChange.emit(\n err?.message || 'Cập nhật thất bại. Vui lòng kiểm tra cấu hình Apps Script.'\n );\n },\n });\n }\n\n // —— Settings ——\n\n updateSettingsDraftTimeWarning(v: string): void {\n const n = parseFloat(String(v).replace(',', '.'));\n this.settingsDraft.update((d) => (d && Number.isFinite(n) ? { ...d, timeWarningHours: n } : d));\n }\n\n updateSettingsDraftWarning(v: string): void {\n const n = parseInt(String(v).replace(/[^\\d]/g, ''), 10);\n this.settingsDraft.update((d) => (d && !isNaN(n) ? { ...d, warningMl: n } : d));\n }\n\n updateSettingsDraftGroupGap(v: string): void {\n const n = parseInt(String(v).replace(/[^\\d]/g, ''), 10);\n this.settingsDraft.update((d) => (d && !isNaN(n) ? { ...d, groupGapMinutes: n } : d));\n }\n\n updateSettingsDraftNotification(v: string): void {\n const n = parseInt(String(v).replace(/[^\\d]/g, ''), 10);\n this.settingsDraft.update((d) => (d && !isNaN(n) ? { ...d, notificationMinutes: n } : d));\n }\n\n updateSettingsDraftBurpDuration(v: string): void {\n const n = parseInt(String(v).replace(/[^\\d]/g, ''), 10);\n this.settingsDraft.update((d) => (d && !isNaN(n) ? { ...d, burpDurationMinutes: n } : d));\n }\n\n updateSettingsDraftEventReminderDays(v: string): void {\n const n = parseInt(String(v).replace(/[^\\d]/g, ''), 10);\n this.settingsDraft.update((d) => (d && !isNaN(n) ? { ...d, eventReminderDays: n } : d));\n }\n\n updateSettingsDraftEventReminderHours(v: string): void {\n const n = parseInt(String(v).replace(/[^\\d]/g, ''), 10);\n this.settingsDraft.update((d) => (d && !isNaN(n) ? { ...d, eventReminderHours: n } : d));\n }\n\n updateSettingsDraftActivityLogRefresh(v: string): void {\n const n = parseInt(String(v).replace(/[^\\d]/g, ''), 10);\n this.settingsDraft.update((d) => (d && !isNaN(n) ? { ...d, activityLogRefreshMinutes: n } : d));\n }\n\n submitFeedingSettings(): void {\n const d = this.settingsDraft();\n if (!d) return;\n const th = d.timeWarningHours;\n const wm = d.warningMl;\n const gap = d.groupGapMinutes;\n const notify = d.notificationMinutes;\n const burp = d.burpDurationMinutes;\n const evDays = d.eventReminderDays;\n const evHours = d.eventReminderHours;\n const actLog = d.activityLogRefreshMinutes;\n if (!Number.isFinite(th) || th < 0.25 || th > 48) {\n this.settingsFormError.set('Ngưỡng giờ (FEED_TIME_WARNING): từ 0,25 đến 48.');\n return;\n }\n if (!Number.isFinite(wm) || wm < 1 || wm > 500) {\n this.settingsFormError.set('Ngưỡng ml (FEED_WARNING_AMOUNT): từ 1 đến 500.');\n return;\n }\n if (!Number.isFinite(gap) || gap < 0 || gap > 180) {\n this.settingsFormError.set('Gom nhóm (FEED_GROUP_GAP_MINUTES): từ 0 (tắt) đến 180 phút.');\n return;\n }\n if (!Number.isFinite(notify) || notify < 1 || notify > 180) {\n this.settingsFormError.set(\n 'Thông báo sắp bú (FEEDING_NOTIFICATION_MINUTES): từ 1 đến 180 phút.'\n );\n return;\n }\n if (!Number.isFinite(burp) || burp < 1 || burp > 30) {\n this.settingsFormError.set('Thời gian vỗ ợ (BURP_DURATION_MINUTES): từ 1 đến 30 phút.');\n return;\n }\n if (!Number.isFinite(evDays) || evDays < 0 || evDays > 30) {\n this.settingsFormError.set('Nhắc lịch — ngày (EVENT_REMINDER_DAYS): từ 0 đến 30.');\n return;\n }\n if (!Number.isFinite(evHours) || evHours < 0 || evHours > 168) {\n this.settingsFormError.set('Nhắc lịch — giờ (EVENT_REMINDER_HOURS): từ 0 đến 168.');\n return;\n }\n if (!Number.isFinite(actLog) || actLog < 1 || actLog > 60) {\n this.settingsFormError.set('Tự động làm mới nhật ký: từ 1 đến 60 phút.');\n return;\n }\n this.settingsSaving.set(true);\n this.settingsFormError.set('');\n this.syncErrorChange.emit('');\n this.feedingLogService\n .saveFeedingSettings(\n [\n {\n id: FEEDING_SETTING_ID.FEED_TIME_WARNING,\n value: th,\n name: 'Ngưỡng cảnh báo khoảng cách cữ (giờ)',\n unit: 'giờ',\n dataType: 'Số',\n },\n {\n id: FEEDING_SETTING_ID.FEED_WARNING_AMOUNT,\n value: wm,\n name: 'Ngưỡng ml cữ thấp (FEED_WARNING_AMOUNT)',\n unit: 'ml',\n dataType: 'Số',\n },\n {\n id: FEEDING_SETTING_ID.FEED_GROUP_GAP_MINUTES,\n value: gap,\n name: 'Thời gian tối đa gom nhóm cữ (phút)',\n unit: 'phút',\n dataType: 'Số',\n },\n {\n id: FEEDING_SETTING_ID.FEEDING_NOTIFICATION_MINUTES,\n value: notify,\n name: 'Thông báo sắp bú trước (phút)',\n unit: 'phút',\n dataType: 'Số',\n },\n {\n id: FEEDING_SETTING_ID.BURP_DURATION_MINUTES,\n value: burp,\n name: 'Thời gian vỗ ợ sau cữ bú (phút)',\n unit: 'phút',\n dataType: 'Số',\n },\n {\n id: FEEDING_SETTING_ID.EVENT_REMINDER_DAYS,\n value: evDays,\n name: 'Nhắc sự kiện lịch trước (ngày)',\n unit: 'ngày',\n dataType: 'Số',\n },\n {\n id: FEEDING_SETTING_ID.EVENT_REMINDER_HOURS,\n value: evHours,\n name: 'Nhắc sự kiện lịch thêm (giờ)',\n unit: 'giờ',\n dataType: 'Số',\n },\n {\n id: FEEDING_SETTING_ID.ACTIVITY_LOG_REFRESH_MINUTES,\n value: actLog,\n name: 'Tự động làm mới nhật ký (phút)',\n unit: 'phút',\n dataType: 'Số',\n },\n ],\n { user: this.user() }\n )\n .pipe(finalize(() => this.settingsSaving.set(false)))\n .subscribe({\n next: (resp) => {\n if (resp && resp.success === false) {\n this.settingsFormError.set(\n resp.error ||\n 'Lưu thất bại. Cập nhật Apps Script (action updateFeedingSettings) theo docs/feeding/FEEDING_SETUP.md.'\n );\n return;\n }\n this.settingsFormError.set('');\n const resolved: FeedingSettingsResolved = {\n feedTimeWarningHours: th,\n feedWarningMl: wm,\n feedGroupGapMinutes: gap,\n feedingNotificationMinutes: notify,\n burpDurationMinutes: burp,\n eventReminderDays: evDays,\n eventReminderHours: evHours,\n activityLogRefreshMinutes: actLog,\n };\n this.settingsChanged.emit(resolved);\n this.settingsSuccess.set('Đã lưu cài đặt thành công!');\n this.activityLogService\n .logSettings(this.user(), 'Cài đặt ứng dụng')\n .subscribe({ error: () => {} });\n setTimeout(() => {\n this.closeFeedingSettingsDialog();\n this.settingsSuccess.set('');\n }, 1500);\n },\n error: (err) => {\n console.error('Settings save error:', err);\n this.settingsFormError.set(\n err?.message || 'Lưu thất bại. Kiểm tra cấu hình Apps Script.'\n );\n },\n });\n }\n\n loadMoreHistoryFeeds(): void {\n this.historyFeedDisplayLimit.update((n) => n + 100);\n }\n\n onHistoryBodyScroll(event: Event): void {\n if (!this.historyHasMoreFeeds()) return;\n const el = event.target as HTMLElement;\n if (!el) return;\n const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 180;\n if (!nearBottom) return;\n const t = Date.now();\n if (t - this.lastHistoryInfiniteScrollAt < 450) return;\n this.lastHistoryInfiniteScrollAt = t;\n this.loadMoreHistoryFeeds();\n }\n\n // —— View helpers (also used in history / detail dialogs) ——\n\n viewGroupKey(g: FeedingViewGroup): string {\n return g.members.map((m) => this.logRowKey(m)).join('>');\n }\n\n logRowKey(l: FeedingLog): string {\n return l.rowIndex != null ? `r${l.rowIndex}` : `${l.date}|${l.time}`;\n }\n\n logTimestamp(l: FeedingLog): number {\n const [y, m, d] = (l.date || '').split('-').map(Number);\n const [hh, mm] = (l.time || '').split(':').map(Number);\n if (!y || !m || !d || isNaN(hh) || isNaN(mm)) return 0;\n return new Date(y, m - 1, d, hh, mm, 0, 0).getTime();\n }\n\n viewGroupDisplayTime(g: FeedingViewGroup): string {\n const sum = g.members.reduce((s, m) => s + this.logTimestamp(m), 0);\n const avg = Math.round(sum / g.members.length);\n return this.toTimeStr(new Date(avg));\n }\n\n viewGroupDisplayVolume(g: FeedingViewGroup): number {\n return g.members.reduce((s, m) => s + (m.volume || 0), 0);\n }\n\n viewGroupNote(g: FeedingViewGroup): string {\n const parts = g.members.map((m) => (m.note || '').trim()).filter(Boolean);\n return parts.length ? parts.join(' · ') : '';\n }\n\n formatIntervalFromPrevViewGroup(g: FeedingViewGroup, listDesc: FeedingViewGroup[]): string {\n const idx = listDesc.findIndex((x) => this.viewGroupKey(x) === this.viewGroupKey(g));\n let prev: FeedingLog | undefined;\n if (idx >= 0 && idx < listDesc.length - 1) {\n const older = listDesc[idx + 1];\n prev = older.members[older.members.length - 1];\n } else {\n prev = this.globalPrevLogBefore(g);\n }\n if (!prev) return '';\n const diffMs = this.logTimestamp(g.members[0]) - this.logTimestamp(prev);\n const diff = Math.round(diffMs / 60000);\n if (diff <= 0) return '';\n const hh = Math.floor(diff / 60);\n const mm = diff % 60;\n if (hh === 0) return `${mm}p`;\n if (mm === 0) return `${hh}h`;\n return `${hh}h${mm.toString().padStart(2, '0')}p`;\n }\n\n isFeedTimeGapWarningViewGroup(g: FeedingViewGroup, listDesc: FeedingViewGroup[]): boolean {\n const idx = listDesc.findIndex((x) => this.viewGroupKey(x) === this.viewGroupKey(g));\n let prev: FeedingLog | undefined;\n if (idx >= 0 && idx < listDesc.length - 1) {\n const older = listDesc[idx + 1];\n prev = older.members[older.members.length - 1];\n } else {\n prev = this.globalPrevLogBefore(g);\n }\n if (!prev) return false;\n const diffMs = this.logTimestamp(g.members[0]) - this.logTimestamp(prev);\n const hours = diffMs / (1000 * 60 * 60);\n return hours >= this.feedingSettings().feedTimeWarningHours;\n }\n\n formatIntervalFromPrev(current: FeedingLog, listDesc: FeedingLog[]): string {\n let prev: FeedingLog | undefined;\n const idx = listDesc.findIndex(\n (l) => l.time === current.time && l.rowIndex === current.rowIndex\n );\n if (idx >= 0 && idx < listDesc.length - 1) {\n prev = listDesc[idx + 1];\n }\n if (!prev) return '';\n const diffMs = this.logTimestamp(current) - this.logTimestamp(prev);\n const diff = Math.round(diffMs / 60000);\n if (diff <= 0) return '';\n const hh = Math.floor(diff / 60);\n const mm = diff % 60;\n if (hh === 0) return `${mm}p`;\n if (mm === 0) return `${hh}h`;\n return `${hh}h${mm.toString().padStart(2, '0')}p`;\n }\n\n isFeedTimeGapWarning(current: FeedingLog, listDesc: FeedingLog[]): boolean {\n let prev: FeedingLog | undefined;\n const idx = listDesc.findIndex(\n (l) => l.time === current.time && l.rowIndex === current.rowIndex\n );\n if (idx >= 0 && idx < listDesc.length - 1) {\n prev = listDesc[idx + 1];\n }\n if (!prev) return false;\n const diffMs = this.logTimestamp(current) - this.logTimestamp(prev);\n const hours = diffMs / (1000 * 60 * 60);\n return hours >= this.feedingSettings().feedTimeWarningHours;\n }\n\n isLowVolume(volume: number): boolean {\n const max = this.feedingSettings().feedWarningMl;\n return volume > 0 && volume < max;\n }\n\n isHighVolume(volume: number): boolean {\n return volume > 200;\n }\n\n isLowVolumeViewGroup(g: FeedingViewGroup): boolean {\n return g.members.some((m) => this.isLowVolume(m.volume));\n }\n\n isHighVolumeViewGroup(g: FeedingViewGroup): boolean {\n const sum = this.viewGroupDisplayVolume(g);\n return sum > 200 || g.members.some((m) => this.isHighVolume(m.volume));\n }\n\n feedDetailStatusLabel(status: FeedDetailView['volumeStatus']): string {\n if (status === 'low') return 'Dung tích thấp';\n if (status === 'high') return 'Dung tích cao';\n return 'Trong ngưỡng';\n }\n\n feedDetailStatusIcon(status: FeedDetailView['volumeStatus']): string {\n if (status === 'low') return 'pi-exclamation-triangle';\n if (status === 'high') return 'pi-arrow-up';\n return 'pi-check-circle';\n }\n\n formatBottleAt(iso: string): string {\n const d = new Date(iso);\n if (isNaN(d.getTime())) return '';\n return this.toTimeStr(d);\n }\n\n bottlePrepUseByMax(iso: string): string {\n const d = new Date(iso);\n if (isNaN(d.getTime())) return '';\n const plus = new Date(d.getTime() + 60 * 60 * 1000);\n return this.toTimeStr(plus);\n }\n\n formatDateDisplay(iso: string): string {\n const [y, m, d] = iso.split('-');\n return `${d}/${m}/${y}`;\n }\n\n formatDateShort(iso: string): string {\n const [y, m, d] = iso.split('-');\n return `${d}/${m}`;\n }\n\n formatDayLabel(iso: string): string {\n const d = new Date(iso + 'T00:00:00');\n const dayNames = ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'];\n return dayNames[d.getDay()];\n }\n\n todayDateStr(): string {\n return this.toDateStr(this.now());\n }\n\n yesterdayDateStr(): string {\n const d = new Date(this.now());\n d.setDate(d.getDate() - 1);\n return this.toDateStr(d);\n }\n\n private openFeedDetail(log: FeedingLog): void {\n this.closeFeedGroupDetail();\n this.feedDetailView.set(this.buildFeedDetailView(log));\n }\n\n private resetRemaining(): void {\n this.remainingInput.set('');\n }\n\n private globalPrevLogBefore(group: FeedingViewGroup): FeedingLog | undefined {\n const curTs = this.logTimestamp(group.members[0]);\n const memberKey = new Set(group.members.map((m) => this.logRowKey(m)));\n const all = this.logs();\n let best: FeedingLog | undefined;\n let bestTs = -Infinity;\n for (const l of all) {\n if (memberKey.has(this.logRowKey(l))) continue;\n const t = this.logTimestamp(l);\n if (t < curTs && t > bestTs) {\n bestTs = t;\n best = l;\n }\n }\n return best;\n }\n\n private buildFeedDetailView(log: FeedingLog): FeedDetailView {\n const warnHours = this.feedingSettings().feedTimeWarningHours;\n const gap = this.feedingSettings().feedGroupGapMinutes;\n const all = this.logs();\n const dayLogs: FeedingLog[] = [];\n for (const l of all) {\n if (l.date === log.date) dayLogs.push(l);\n }\n dayLogs.sort((a, b) => a.time.localeCompare(b.time));\n\n const allGroups = groupLogsByProximity(all, gap, (l) => this.logTimestamp(l));\n const dayGroups = groupLogsByProximity(dayLogs, gap, (l) => this.logTimestamp(l));\n const currentGroup = this.findViewGroupForLog(log, allGroups);\n const currentDayGroup = this.findViewGroupForLog(log, dayGroups);\n\n const curTs = this.logTimestamp(log);\n const effectiveTs = currentGroup ? this.viewGroupEndTs(currentGroup) : curTs;\n const currentVol = currentGroup ? this.viewGroupDisplayVolume(currentGroup) : log.volume;\n\n const upToDayGroupsDesc = dayGroups.filter((g) => this.viewGroupEndTs(g) <= effectiveTs);\n const upToDayGroupsAsc = [...upToDayGroupsDesc].reverse();\n const dayToPoint = this.statsFromViewGroups(log.date, upToDayGroupsAsc);\n const dayFull =\n log.date === this.todayDateStr()\n ? dayToPoint\n : this.statsFromViewGroups(log.date, [...dayGroups].reverse());\n\n const compares: FeedDetailCompareRow[] = [];\n\n if (currentGroup) {\n const gi = allGroups.findIndex((g) => g === currentGroup);\n const prevGroup = gi >= 0 ? allGroups[gi + 1] : undefined;\n if (prevGroup) {\n const prevTs = this.viewGroupEndTs(prevGroup);\n const diffMs = effectiveTs - prevTs;\n const gapMin = Math.round(diffMs / 60000);\n const gapWarn = diffMs / (1000 * 60 * 60) >= warnHours;\n const gapText = this.formatGapMinutes(gapMin);\n const prevVol = this.viewGroupDisplayVolume(prevGroup);\n const volDiff = currentVol - prevVol;\n const prevAnchor = prevGroup.members.reduce((a, b) =>\n this.logTimestamp(a) >= this.logTimestamp(b) ? a : b\n );\n compares.push({\n label: 'So với cữ trước',\n text: `${this.viewGroupDisplayTime(prevGroup)} · ${prevVol}ml — cách ${gapText}`,\n warn: gapWarn,\n icon: 'pi-history',\n kind: 'gap',\n gapPrev: {\n prevTime: this.viewGroupDisplayTime(prevGroup),\n prevVolume: prevVol,\n ...(prevAnchor.date !== log.date ? { prevDateIso: prevAnchor.date } : {}),\n gapLabel: gapText,\n volDiffMl: volDiff,\n },\n });\n }\n }\n\n if (currentDayGroup && upToDayGroupsAsc.length > 0) {\n const idx = upToDayGroupsAsc.findIndex((g) => g === currentDayGroup) + 1;\n const totalSoFar = upToDayGroupsAsc.reduce((s, g) => s + this.viewGroupDisplayVolume(g), 0);\n const dayLabel = log.date === this.todayDateStr() ? 'hôm nay (tới lúc này)' : 'trong ngày';\n const dayTotal = dayFull.total || totalSoFar;\n compares.push({\n label: 'Vị trí trong ngày',\n text: `Cữ thứ ${idx}/${dayFull.count || upToDayGroupsAsc.length} ${dayLabel} · đã ${totalSoFar}ml`,\n icon: 'pi-th-large',\n kind: 'position',\n position: {\n index: idx,\n total: dayFull.count || upToDayGroupsAsc.length,\n totalMl: totalSoFar,\n dayTotalMl: dayTotal,\n dayLabel,\n },\n });\n }\n\n if (dayToPoint.count >= 1 && dayToPoint.avg > 0) {\n const ref = dayToPoint.count >= 3 ? dayToPoint.typicalFeedMl : dayToPoint.avg;\n const diffRef = currentVol - ref;\n const refLabel = dayToPoint.count >= 3 ? 'TB điển hình' : 'TB';\n const diffPart =\n diffRef === 0\n ? `bằng ${ref}ml/cữ`\n : `${diffRef > 0 ? '+' : ''}${diffRef}ml so với ${ref}ml/cữ`;\n compares.push({\n label: `So với ${refLabel} ngày`,\n text: `${diffPart} (${refLabel} ${dayToPoint.count} cữ)`,\n icon: 'pi-chart-line',\n kind: 'average',\n average: {\n refMl: ref,\n diffMl: diffRef,\n refLabel,\n feedCount: dayToPoint.count,\n },\n });\n }\n\n let nextDayGroup: FeedingViewGroup | undefined;\n let nextStart = Infinity;\n for (const g of dayGroups) {\n if (g === currentDayGroup) continue;\n const st = this.viewGroupStartTs(g);\n if (st > effectiveTs && st < nextStart) {\n nextStart = st;\n nextDayGroup = g;\n }\n }\n if (nextDayGroup) {\n const untilNext = Math.round((nextStart - effectiveTs) / 60000);\n const nextVol = this.viewGroupDisplayVolume(nextDayGroup);\n compares.push({\n label: 'Cữ tiếp theo trong ngày',\n text: `${this.viewGroupDisplayTime(nextDayGroup)} · ${nextVol}ml (sau ${this.formatGapMinutes(untilNext)})`,\n icon: 'pi-arrow-right',\n kind: 'next',\n next: {\n time: this.viewGroupDisplayTime(nextDayGroup),\n volume: nextVol,\n gapLabel: this.formatGapMinutes(untilNext),\n },\n });\n }\n\n const diffMsAge = this.now().getTime() - curTs;\n let ageLabel = '';\n if (diffMsAge < 0) {\n ageLabel = 'Sắp tới';\n } else {\n const diff = Math.round(diffMsAge / 60000);\n if (diff < 60) ageLabel = `Cách đây ${diff} phút`;\n else {\n const hh = Math.floor(diff / 60);\n const mm = diff % 60;\n ageLabel = mm === 0 ? `Cách đây ${hh} giờ` : `Cách đây ${hh} giờ ${mm} phút`;\n }\n }\n\n const volumeStatus: FeedDetailView['volumeStatus'] = this.isLowVolume(log.volume)\n ? 'low'\n : this.isHighVolume(log.volume)\n ? 'high'\n : 'ok';\n\n return {\n log,\n ageLabel,\n volumeStatus,\n compares,\n note: log.note?.trim() || '',\n };\n }\n\n private findViewGroupForLog(\n log: FeedingLog,\n groups: FeedingViewGroup[]\n ): FeedingViewGroup | undefined {\n const key = this.logRowKey(log);\n return groups.find((g) => g.members.some((m) => this.logRowKey(m) === key));\n }\n\n private viewGroupEndTs(g: FeedingViewGroup): number {\n return Math.max(...g.members.map((m) => this.logTimestamp(m)));\n }\n\n private viewGroupStartTs(g: FeedingViewGroup): number {\n return Math.min(...g.members.map((m) => this.logTimestamp(m)));\n }\n\n private pseudoLogsFromViewGroups(groups: FeedingViewGroup[]): FeedingLog[] {\n return groups.map((g) => {\n const anchor = g.members.reduce((a, b) =>\n this.logTimestamp(a) >= this.logTimestamp(b) ? a : b\n );\n return { ...anchor, volume: this.viewGroupDisplayVolume(g) };\n });\n }\n\n private statsFromViewGroups(date: string, groups: FeedingViewGroup[]): DayStatsFull {\n return this.statsFromList(date, this.pseudoLogsFromViewGroups(groups));\n }\n\n private statsFromList(date: string, list: FeedingLog[]): DayStatsFull {\n if (list.length === 0) {\n return {\n date,\n total: 0,\n count: 0,\n avg: 0,\n medianMl: 0,\n typicalFeedMl: 0,\n max: 0,\n min: 0,\n firstTime: '',\n lastTime: '',\n };\n }\n const total = list.reduce((s, l) => s + l.volume, 0);\n const volumes = list.map((l) => l.volume);\n const times = list.map((l) => l.time).sort();\n const sortedVol = [...volumes].sort((a, b) => a - b);\n const mid = Math.floor(sortedVol.length / 2);\n const medianMl =\n sortedVol.length % 2 === 1\n ? sortedVol[mid]\n : Math.round((sortedVol[mid - 1] + sortedVol[mid]) / 2);\n const avg = Math.round(total / list.length);\n const typicalFeedMl = list.length >= 3 ? medianMl : avg;\n return {\n date,\n total,\n count: list.length,\n avg,\n medianMl,\n typicalFeedMl,\n max: Math.max(...volumes),\n min: Math.min(...volumes),\n firstTime: times[0],\n lastTime: times[times.length - 1],\n };\n }\n\n private formatGapMinutes(diffMin: number): string {\n if (diffMin <= 0) return '0 phút';\n const hh = Math.floor(diffMin / 60);\n const mm = diffMin % 60;\n if (hh === 0) return `${mm} phút`;\n if (mm === 0) return `${hh} giờ`;\n return `${hh} giờ ${mm} phút`;\n }\n\n private toDateStr(d: Date): string {\n const y = d.getFullYear();\n const mo = (d.getMonth() + 1).toString().padStart(2, '0');\n const day = d.getDate().toString().padStart(2, '0');\n return `${y}-${mo}-${day}`;\n }\n\n private toTimeStr(d: Date): string {\n const h = d.getHours().toString().padStart(2, '0');\n const m = d.getMinutes().toString().padStart(2, '0');\n return `${h}:${m}`;\n }\n}\n","<!-- ============ DIALOG (log form) ============ -->\n@if (logDialogOpen()) {\n <div class=\"dialog-overlay\" (click)=\"closeLogDialog()\">\n <div class=\"dialog\" role=\"dialog\" aria-modal=\"true\" (click)=\"$event.stopPropagation()\">\n <div class=\"dialog-head\">\n <div>\n <div class=\"eyebrow\">Nhật ký cữ bú</div>\n <h2><i class=\"pi pi-clock\"></i> Ghi nhận lượng sữa</h2>\n </div>\n <button type=\"button\" class=\"dialog-close\" (click)=\"closeLogDialog()\" aria-label=\"Đóng\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <form class=\"log-form\" (ngSubmit)=\"submitLog()\">\n <div class=\"log-grid log-grid--date-time\">\n <label class=\"field\">\n <span class=\"label\">Ngày</span>\n <input\n type=\"date\"\n [ngModel]=\"logDraft().date\"\n (ngModelChange)=\"updateLogDate($event)\"\n name=\"logDate\"\n [max]=\"maxBirthDate()\"\n required\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Giờ</span>\n <input\n type=\"time\"\n [ngModel]=\"logDraft().time\"\n (ngModelChange)=\"updateLogTime($event)\"\n name=\"logTime\"\n required\n />\n </label>\n </div>\n <label class=\"field log-volume-field\">\n <span class=\"label\">Dung tích (ml)</span>\n <div class=\"log-volume-input-row\">\n <input\n type=\"number\"\n inputmode=\"numeric\"\n min=\"1\"\n max=\"500\"\n step=\"5\"\n [ngModel]=\"logDraft().volume\"\n (ngModelChange)=\"updateLogVolume($any($event))\"\n name=\"logVolume\"\n placeholder=\"50\"\n required\n />\n @if (prediction().hasData && prediction().nextTime) {\n <div class=\"predict-hint predict-hint--inline\">\n <i class=\"pi pi-bolt\" title=\"Gợi ý từ lịch sử cữ bú\"></i>\n <span class=\"hint-text\">\n <strong>{{ prediction().nextTime }}</strong> ·\n <strong>{{ prediction().nextVolume }}</strong> ml\n </span>\n <button type=\"button\" class=\"btn ghost small\" (click)=\"usePredictionValues()\">\n Dùng\n </button>\n </div>\n }\n </div>\n </label>\n <!-- Tính từ sữa còn lại (dùng bình đã lưu) — đặt trên ghi chú -->\n @if (bottlePrep(); as prep) {\n <div class=\"calc-block\">\n <div class=\"calc-head\">\n <div class=\"prep-info\">\n <i class=\"pi pi-inbox\"></i>\n <span class=\"prep-info-text\">\n <span class=\"bp-prep-user\">{{ prep.user }}</span> đã pha\n <strong>{{ prep.volumeMl }}ml</strong> lúc\n <span class=\"bp-prep-time\">{{ formatBottleAt(prep.at) }}</span>\n <br />\n <span class=\"muted\"\n >Thời hạn sử dụng tối đa {{ bottlePrepUseByMax(prep.at) }}</span\n >\n </span>\n </div>\n </div>\n <div class=\"calc-body\">\n <label class=\"field mini remaining-input\">\n <span class=\"label\">Sữa còn lại trong bình</span>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"4\"\n [value]=\"remainingInput()\"\n (input)=\"updateRemaining($any($event.target).value)\"\n placeholder=\"VD: 25\"\n autocomplete=\"off\"\n />\n <span class=\"suffix\">ml</span>\n </label>\n <div class=\"calc-result-row\">\n <div class=\"calc-result\">\n <span class=\"calc-label\">Đã bú:</span>\n @if (calcResult() !== null) {\n <strong>{{ calcResult() }}</strong\n ><span class=\"u\">ml</span>\n } @else {\n <span class=\"muted\">—</span>\n }\n </div>\n <button\n type=\"button\"\n class=\"btn primary small calc-apply\"\n [disabled]=\"calcResult() === null\"\n (click)=\"applyCalcVolume()\"\n >\n <i class=\"pi pi-check\"></i>\n Áp dụng\n </button>\n </div>\n </div>\n </div>\n }\n <label class=\"field full\">\n <span class=\"label\">Ghi chú (tuỳ chọn)</span>\n <input\n type=\"text\"\n [ngModel]=\"logDraft().note\"\n (ngModelChange)=\"updateLogNote($event)\"\n name=\"logNote\"\n placeholder=\"VD: bú mẹ, vắt sữa, sữa công thức...\"\n autocomplete=\"off\"\n />\n </label>\n <div class=\"quick-volumes\">\n <span class=\"quick-label\">Nhanh:</span>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickVolume(30)\">30ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickVolume(50)\">50ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickVolume(60)\">60ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickVolume(70)\">70ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickVolume(80)\">80ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickVolume(90)\">90ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickVolume(120)\">120ml</button>\n <button\n type=\"button\"\n class=\"quick-chip formula-chip\"\n [class.active]=\"hasQuickNote('Sữa công thức')\"\n (click)=\"quickNote('Sữa công thức')\"\n title=\"Gắn nhãn 'Sữa công thức' cho cữ này\"\n >\n <i class=\"pi pi-prime\"></i> Sữa công thức\n </button>\n <button type=\"button\" class=\"quick-chip now-chip\" (click)=\"setLogNow()\">\n <i class=\"pi pi-history\"></i> Bây giờ\n </button>\n </div>\n @if (syncError()) {\n <div class=\"sync-error\"><i class=\"pi pi-exclamation-triangle\"></i> {{ syncError() }}</div>\n }\n <div class=\"dialog-actions\">\n <button type=\"button\" class=\"btn ghost\" (click)=\"closeLogDialog()\">Huỷ</button>\n <button\n type=\"submit\"\n class=\"btn primary\"\n [disabled]=\"saving() || !logDraft().volume || !logDraft().date || !logDraft().time\"\n >\n <i\n class=\"pi\"\n [class.pi-save]=\"!saving()\"\n [class.pi-spin]=\"saving()\"\n [class.pi-spinner]=\"saving()\"\n ></i>\n {{ saving() ? 'Đang lưu...' : 'Lưu cữ bú' }}\n </button>\n </div>\n </form>\n </div>\n </div>\n}\n\n<!-- ============ DIALOG (delete feeding reason) ============ -->\n@if (feedingDeleteConfirmLog(); as deleteLog) {\n <div class=\"dialog-overlay dialog-overlay--front\" (click)=\"closeFeedingDeleteConfirm()\">\n <div\n class=\"dialog feed-delete-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"dialog-head\">\n <div>\n <div class=\"eyebrow\">Xác nhận xóa</div>\n <h2><i class=\"pi pi-trash\"></i> Xóa cữ bú?</h2>\n </div>\n <button\n type=\"button\"\n class=\"dialog-close\"\n [disabled]=\"feedingDeleteSaving()\"\n (click)=\"closeFeedingDeleteConfirm()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <p class=\"feed-delete-dialog__desc\">\n Bạn sắp xóa <strong>{{ deleteLog.volume }}ml</strong> lúc\n <strong>{{ deleteLog.time }}</strong> ngày\n <strong>{{ formatDateDisplay(deleteLog.date) }}</strong\n >.\n </p>\n <label class=\"feed-delete-dialog__label\" for=\"dialog-feeding-delete-reason\">\n Lý do (tuỳ chọn)\n </label>\n <div class=\"feed-delete-dialog__quick\">\n <span class=\"feed-delete-dialog__quick-label\">Gợi ý nhanh</span>\n <div class=\"feed-delete-dialog__quick-tags\">\n @for (tag of feedingDeleteReasonQuickTags; track tag) {\n <button\n type=\"button\"\n class=\"feed-delete-reason-chip\"\n [class.feed-delete-reason-chip--active]=\"feedingDeleteReasonDraft().trim() === tag\"\n [attr.aria-pressed]=\"feedingDeleteReasonDraft().trim() === tag\"\n [disabled]=\"feedingDeleteSaving()\"\n (click)=\"toggleFeedingDeleteReasonQuickTag(tag)\"\n >\n {{ tag }}\n </button>\n }\n </div>\n </div>\n <textarea\n id=\"dialog-feeding-delete-reason\"\n class=\"feed-delete-dialog__textarea\"\n rows=\"3\"\n maxlength=\"500\"\n [value]=\"feedingDeleteReasonDraft()\"\n [disabled]=\"feedingDeleteSaving()\"\n (input)=\"updateFeedingDeleteReason($any($event.target).value)\"\n placeholder=\"Ví dụ: nhập nhầm, trùng cữ, bé không bú…\"\n ></textarea>\n <div class=\"dialog-actions\">\n <button\n type=\"button\"\n class=\"btn ghost\"\n [disabled]=\"feedingDeleteSaving()\"\n (click)=\"closeFeedingDeleteConfirm()\"\n >\n Huỷ\n </button>\n <button\n type=\"button\"\n class=\"btn feed-delete-dialog__confirm\"\n [disabled]=\"feedingDeleteSaving()\"\n (click)=\"confirmDeleteFeedingLog()\"\n >\n {{ feedingDeleteSaving() ? 'Đang xóa…' : 'Xóa' }}\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- ============ EDIT LOG DIALOG ============ -->\n@if (editingLog(); as edit) {\n <div class=\"dialog-overlay dialog-overlay--front\" (click)=\"closeEditDialog()\">\n <div class=\"dialog\" role=\"dialog\" aria-modal=\"true\" (click)=\"$event.stopPropagation()\">\n <div class=\"dialog-head\">\n <div>\n <div class=\"eyebrow\">Chỉnh sửa cữ bú</div>\n <h2><i class=\"pi pi-pencil\"></i> Cập nhật thông tin</h2>\n </div>\n <button type=\"button\" class=\"dialog-close\" (click)=\"closeEditDialog()\" aria-label=\"Đóng\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <form class=\"log-form\" (ngSubmit)=\"submitEditLog()\">\n <!-- Date hiển thị nhưng KHÔNG cho edit -->\n <div class=\"edit-date-banner\">\n <i class=\"pi pi-calendar\"></i>\n <span class=\"edb-label\">Ngày</span>\n <strong class=\"edb-value\">{{ formatDateDisplay(edit.date) }}</strong>\n <span\n class=\"edb-lock\"\n title=\"Ngày của cữ này không đổi được khi sửa\"\n aria-label=\"Ngày không đổi được\"\n role=\"img\"\n >\n <i class=\"pi pi-lock\" aria-hidden=\"true\"></i>\n </span>\n </div>\n <div class=\"log-grid\">\n <label class=\"field\">\n <span class=\"label\">Giờ</span>\n <input\n type=\"time\"\n [ngModel]=\"editLogDraft().time\"\n (ngModelChange)=\"updateEditTime($event)\"\n name=\"editLogTime\"\n required\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Dung tích (ml)</span>\n <input\n type=\"number\"\n inputmode=\"numeric\"\n min=\"1\"\n max=\"500\"\n step=\"5\"\n [ngModel]=\"editLogDraft().volume\"\n (ngModelChange)=\"updateEditVolume($any($event))\"\n name=\"editLogVolume\"\n placeholder=\"50\"\n required\n />\n </label>\n <label class=\"field full\">\n <span class=\"label\">Ghi chú (tuỳ chọn)</span>\n <input\n type=\"text\"\n [ngModel]=\"editLogDraft().note\"\n (ngModelChange)=\"updateEditNote($event)\"\n name=\"editLogNote\"\n placeholder=\"VD: bú mẹ, vắt sữa, sữa công thức...\"\n autocomplete=\"off\"\n />\n </label>\n </div>\n <div class=\"quick-volumes\">\n <span class=\"quick-label\">Nhanh:</span>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickEditVolume(30)\">30ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickEditVolume(50)\">50ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickEditVolume(60)\">60ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickEditVolume(70)\">70ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickEditVolume(80)\">80ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickEditVolume(90)\">90ml</button>\n <button type=\"button\" class=\"quick-chip\" (click)=\"quickEditVolume(120)\">120ml</button>\n <button\n type=\"button\"\n class=\"quick-chip formula-chip\"\n [class.active]=\"hasEditNote('Sữa công thức')\"\n (click)=\"quickEditNote('Sữa công thức')\"\n title=\"Gắn nhãn 'Sữa công thức' cho cữ này\"\n >\n <i class=\"pi pi-prime\"></i> Sữa công thức\n </button>\n </div>\n @if (syncError()) {\n <div class=\"sync-error\"><i class=\"pi pi-exclamation-triangle\"></i> {{ syncError() }}</div>\n }\n <div class=\"dialog-actions\">\n <button type=\"button\" class=\"btn ghost\" (click)=\"closeEditDialog()\">Huỷ</button>\n <button\n type=\"submit\"\n class=\"btn primary\"\n [disabled]=\"editSaving() || !editLogDraft().volume || !editLogDraft().time\"\n >\n <i\n class=\"pi\"\n [class.pi-save]=\"!editSaving()\"\n [class.pi-spin]=\"editSaving()\"\n [class.pi-spinner]=\"editSaving()\"\n ></i>\n {{ editSaving() ? 'Đang lưu...' : 'Lưu thay đổi' }}\n </button>\n </div>\n </form>\n </div>\n </div>\n}\n\n<!-- ============ HISTORY DIALOG (all` feeds) ============ -->\n@if (historyDialogOpen()) {\n <div class=\"dialog-overlay\" (click)=\"closeHistoryDialog()\">\n <div\n class=\"dialog dialog-wide\"\n role=\"dialog\"\n aria-modal=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"dialog-head\">\n <div>\n <div class=\"eyebrow\">\n @switch (historyFilter()) {\n @case ('today') {\n Cữ bú hôm nay\n }\n @case ('yesterday') {\n Cữ bú hôm qua\n }\n @case ('date') {\n Cữ bú theo ngày\n }\n @default {\n Lịch sử đầy đủ\n }\n }\n </div>\n <h2>\n <i class=\"pi pi-list\"></i>\n @switch (historyFilter()) {\n @case ('today') {\n Hôm nay ({{ todayLogs().length }} cữ · {{ todayStats().total }}ml)\n }\n @case ('yesterday') {\n Hôm qua ({{ yesterdayLogs().length }} cữ · {{ yesterdayStats().total }}ml)\n }\n @case ('date') {\n {{ formatDateDisplay(historyFilterDate()) }}\n ({{ historyFilteredFeedTotal() }} cữ)\n }\n @default {\n Tất cả cữ bú ({{ logs().length }})\n }\n }\n </h2>\n </div>\n <button type=\"button\" class=\"dialog-close\" (click)=\"closeHistoryDialog()\" aria-label=\"Đóng\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <div class=\"history-body\" (scroll)=\"onHistoryBodyScroll($event)\">\n @if (historyHasMoreFeeds()) {\n <p class=\"history-paging-hint muted\">\n Hiển thị {{ historyDisplayedFeedCount() }} / {{ historyFilteredFeedTotal() }} cữ (cuộn\n gần cuối hoặc bấm nút bên dưới để tải thêm).\n </p>\n }\n @for (g of feedingsByDate(); track trackHistoryGroup($index, g)) {\n <div class=\"history-group\">\n <div class=\"history-group-head\">\n <div>\n <div class=\"h-date\">{{ formatDateDisplay(g.date) }}</div>\n <div class=\"h-day\">{{ formatDayLabel(g.date) }}</div>\n </div>\n <div class=\"h-total\">\n <strong>{{ g.total }}</strong\n >ml\n <span class=\"h-count\">· {{ g.count }} cữ</span>\n @if (g.avg > 0) {\n <span class=\"h-avg\">· TB {{ g.avg }}ml</span>\n }\n </div>\n </div>\n <div class=\"history-group-rows\">\n @for (vg of g.viewRows; track trackFeedingViewGroup($index, vg)) {\n <div\n class=\"feed-row feed-row--clickable\"\n [class.low-volume]=\"isLowVolumeViewGroup(vg)\"\n [class.high-volume]=\"isHighVolumeViewGroup(vg)\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onFeedRowClick(vg)\"\n (keydown.enter)=\"onFeedRowClick(vg)\"\n (keydown.space)=\"$event.preventDefault(); onFeedRowClick(vg)\"\n >\n <div class=\"feed-row-time\">\n <div class=\"time time--with-badge\">\n {{ viewGroupDisplayTime(vg) }}\n @if (vg.members.length > 1) {\n <button\n type=\"button\"\n class=\"feed-merge-badge\"\n (click)=\"openFeedGroupDetail(vg); $event.stopPropagation()\"\n title=\"Xem các cữ đã gom\"\n >\n {{ vg.members.length }} cữ\n </button>\n }\n </div>\n @if (formatIntervalFromPrevViewGroup(vg, g.viewRows); as iv) {\n <div\n class=\"feed-row-gap\"\n [class.feed-gap-warn]=\"isFeedTimeGapWarningViewGroup(vg, g.viewRows)\"\n >\n <i class=\"pi pi-clock\"></i> {{ iv }}\n </div>\n }\n </div>\n <div class=\"feed-row-volume\">\n <strong>{{ viewGroupDisplayVolume(vg) }}</strong>\n <span class=\"u\">ml</span>\n </div>\n @if (viewGroupNote(vg)) {\n <div class=\"feed-row-note\">\n {{ viewGroupNote(vg) }}\n </div>\n } @else {\n <div class=\"feed-row-note muted\">—</div>\n }\n @if (vg.members.length === 1 && vg.members[0].rowIndex) {\n <div class=\"feed-row-actions\">\n <button\n class=\"feed-row-edit\"\n (click)=\"openEditDialog(vg.members[0]); $event.stopPropagation()\"\n title=\"Sửa cữ này\"\n aria-label=\"Sửa cữ bú\"\n >\n <i class=\"pi pi-pencil\"></i>\n </button>\n <button\n class=\"feed-row-del\"\n (click)=\"deleteLog(vg.members[0]); $event.stopPropagation()\"\n title=\"Xoá cữ này\"\n aria-label=\"Xoá cữ bú\"\n >\n <i class=\"pi pi-trash\"></i>\n </button>\n </div>\n }\n @if (vg.members.length > 1) {\n <div class=\"feed-row-actions\">\n <button\n class=\"feed-row-edit\"\n (click)=\"openFeedGroupDetail(vg); $event.stopPropagation()\"\n title=\"Chi tiết các cữ đã gom\"\n aria-label=\"Chi tiết gom nhóm\"\n >\n <i class=\"pi pi-list\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (historyHasMoreFeeds()) {\n <div class=\"history-load-more\">\n <button type=\"button\" class=\"btn ghost\" (click)=\"loadMoreHistoryFeeds()\">\n <i class=\"pi pi-angle-double-down\"></i>\n Tải thêm 100 cữ\n </button>\n </div>\n }\n @if (historyFilteredFeedTotal() === 0) {\n <div class=\"empty-mini\">\n @switch (historyFilter()) {\n @case ('today') {\n Chưa có cữ bú nào trong hôm nay.\n }\n @case ('date') {\n Chưa có cữ bú nào trong ngày {{ formatDateDisplay(historyFilterDate()) }}.\n }\n @default {\n Chưa có cữ bú nào được ghi nhận.\n }\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- ============ FEEDING SETTINGS (tab Sheet Settings, key = ID) ============ -->\n@if (feedingSettingsDialogOpen()) {\n <div class=\"dialog-overlay dialog-overlay--front\" (click)=\"closeFeedingSettingsDialog()\">\n <div\n class=\"dialog feeding-settings-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"dialog-head\">\n <div>\n <h2><i class=\"pi pi-sliders-h\"></i> Cài đặt</h2>\n </div>\n <button\n type=\"button\"\n class=\"dialog-close\"\n (click)=\"closeFeedingSettingsDialog()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n @if (settingsDraft(); as sd) {\n <div class=\"log-grid feeding-settings-grid\">\n <label class=\"field full\">\n <span class=\"label\">Cảnh báo khoảng cách cữ (giờ)</span>\n <input\n type=\"number\"\n inputmode=\"decimal\"\n min=\"0.25\"\n max=\"48\"\n step=\"0.25\"\n [ngModel]=\"sd.timeWarningHours\"\n (ngModelChange)=\"updateSettingsDraftTimeWarning($event)\"\n name=\"setFeedTimeWarningHours\"\n />\n </label>\n <label class=\"field full\">\n <span class=\"label\">Ngưỡng cữ thấp (ml)</span>\n <input\n type=\"number\"\n inputmode=\"numeric\"\n min=\"1\"\n max=\"500\"\n step=\"1\"\n [ngModel]=\"sd.warningMl\"\n (ngModelChange)=\"updateSettingsDraftWarning($event)\"\n name=\"setWarningMl\"\n />\n </label>\n <label class=\"field full\">\n <span class=\"label\">Gom cữ gần nhau (phút, 0 = tắt)</span>\n <input\n type=\"number\"\n inputmode=\"numeric\"\n min=\"0\"\n max=\"180\"\n step=\"1\"\n [ngModel]=\"sd.groupGapMinutes\"\n (ngModelChange)=\"updateSettingsDraftGroupGap($event)\"\n name=\"setFeedGroupGapMinutes\"\n />\n </label>\n <label class=\"field full notification-setting-field\">\n <span class=\"label\">\n <code>FEEDING_NOTIFICATION_MINUTES</code> — Thông báo sắp bú (phút)\n </span>\n <input\n type=\"number\"\n inputmode=\"numeric\"\n min=\"1\"\n max=\"180\"\n step=\"1\"\n [ngModel]=\"sd.notificationMinutes\"\n (ngModelChange)=\"updateSettingsDraftNotification($event)\"\n name=\"setFeedingNotificationMinutes\"\n placeholder=\"5\"\n />\n <span class=\"field-hint muted\">\n Hiển thị trạng thái <strong>\"Sắp tới\"</strong> khi còn ≤ N phút đến giờ dự đoán. Giá\n trị khuyến nghị: <strong>3-10 phút</strong>.\n </span>\n </label>\n <label class=\"field full burp-setting-field\">\n <span class=\"label\"> <code>BURP_DURATION_MINUTES</code> — Thời gian vỗ ợ (phút) </span>\n <input\n type=\"number\"\n inputmode=\"numeric\"\n min=\"1\"\n max=\"30\"\n step=\"1\"\n [ngModel]=\"sd.burpDurationMinutes\"\n (ngModelChange)=\"updateSettingsDraftBurpDuration($event)\"\n name=\"setBurpDurationMinutes\"\n placeholder=\"10\"\n />\n <span class=\"field-hint muted\">\n Hiển thị nhắc nhở <strong>bế bé vỗ ợ</strong> trong N phút sau khi bú. Giá trị khuyến\n nghị: <strong>10-15 phút</strong>.\n </span>\n </label>\n <label class=\"field full\">\n <span class=\"label\">Nhắc lịch trước (ngày)</span>\n <input\n type=\"number\"\n inputmode=\"numeric\"\n min=\"0\"\n max=\"30\"\n step=\"1\"\n [ngModel]=\"sd.eventReminderDays\"\n (ngModelChange)=\"updateSettingsDraftEventReminderDays($event)\"\n name=\"eventRemDays\"\n />\n </label>\n <label class=\"field full\">\n <span class=\"label\">Nhắc lịch thêm (giờ)</span>\n <input\n type=\"number\"\n inputmode=\"numeric\"\n min=\"0\"\n max=\"168\"\n step=\"1\"\n [ngModel]=\"sd.eventReminderHours\"\n (ngModelChange)=\"updateSettingsDraftEventReminderHours($event)\"\n name=\"eventRemHours\"\n />\n </label>\n <label class=\"field full\">\n <span class=\"label\">Tự động làm mới nhật ký (phút)</span>\n <input\n type=\"number\"\n inputmode=\"numeric\"\n min=\"1\"\n max=\"60\"\n step=\"1\"\n [ngModel]=\"sd.activityLogRefreshMinutes\"\n (ngModelChange)=\"updateSettingsDraftActivityLogRefresh($event)\"\n name=\"activityLogRefresh\"\n />\n <span class=\"field-hint muted\">\n Tự động tải lại nhật ký hoạt động mỗi N phút. Mặc định: <strong>5 phút</strong>.\n </span>\n </label>\n </div>\n @if (settingsFormError()) {\n <div class=\"sync-error\">\n <i class=\"pi pi-exclamation-triangle\"></i> {{ settingsFormError() }}\n </div>\n }\n @if (settingsSuccess()) {\n <div class=\"sync-success\"><i class=\"pi pi-check-circle\"></i> {{ settingsSuccess() }}</div>\n }\n <div class=\"dialog-actions\">\n <button type=\"button\" class=\"btn ghost\" (click)=\"closeFeedingSettingsDialog()\">\n Huỷ\n </button>\n <button\n type=\"button\"\n class=\"btn primary\"\n [disabled]=\"settingsSaving()\"\n (click)=\"submitFeedingSettings()\"\n >\n <i\n class=\"pi\"\n [class.pi-save]=\"!settingsSaving()\"\n [class.pi-spin]=\"settingsSaving()\"\n [class.pi-spinner]=\"settingsSaving()\"\n ></i>\n {{ settingsSaving() ? 'Đang lưu…' : 'Lưu' }}\n </button>\n </div>\n }\n </div>\n </div>\n}\n\n<!-- Chi tiết các cữ đã gom — z-index thấp hơn chi tiết 1 cữ -->\n@if (feedGroupDetail(); as grp) {\n <div\n class=\"dialog-overlay dialog-overlay--front feed-group-detail-overlay\"\n (click)=\"closeFeedGroupDetail()\"\n >\n <div\n class=\"dialog dialog-wide feed-group-detail-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"dialog-head\">\n <div>\n <div class=\"eyebrow\">Gom nhóm hiển thị</div>\n <h2><i class=\"pi pi-layer-group\"></i> {{ grp.members.length }} cữ trên sheet</h2>\n </div>\n <button\n type=\"button\"\n class=\"dialog-close\"\n (click)=\"closeFeedGroupDetail()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <p class=\"muted feed-group-detail-summary\">\n Giờ hiển thị (trung bình): <strong>{{ viewGroupDisplayTime(grp) }}</strong>\n <span class=\"sep\">·</span>\n Tổng: <strong>{{ viewGroupDisplayVolume(grp) }}ml</strong>\n </p>\n <p class=\"muted feed-group-detail-hint\">\n <i class=\"pi pi-info-circle\"></i> Chạm một cữ để xem chi tiết & so sánh\n </p>\n <div class=\"history-group feed-group-detail-history\">\n <div class=\"history-group-rows feed-group-detail-rows\">\n @for (m of feedGroupDetailMembersDesc(); track trackFeedingLogRow($index, m)) {\n <div\n class=\"feed-row feed-row--clickable\"\n [class.low-volume]=\"isLowVolume(m.volume)\"\n [class.high-volume]=\"isHighVolume(m.volume)\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"openFeedDetailFromGroupMember(m)\"\n (keydown.enter)=\"openFeedDetailFromGroupMember(m)\"\n (keydown.space)=\"$event.preventDefault(); openFeedDetailFromGroupMember(m)\"\n >\n <div class=\"feed-row-time\">\n <div class=\"time\">{{ m.time }}</div>\n @if (formatIntervalFromPrev(m, feedGroupDetailMembersDesc()); as ivd) {\n <div\n class=\"feed-row-gap\"\n [class.feed-gap-warn]=\"isFeedTimeGapWarning(m, feedGroupDetailMembersDesc())\"\n >\n <i class=\"pi pi-clock\"></i> {{ ivd }}\n </div>\n }\n </div>\n <div class=\"feed-row-volume\">\n <strong>{{ m.volume }}</strong>\n <span class=\"u\">ml</span>\n </div>\n @if (m.note) {\n <div class=\"feed-row-note\">\n {{ m.note }}\n </div>\n } @else {\n <div class=\"feed-row-note muted\">—</div>\n }\n @if (m.rowIndex) {\n <div class=\"feed-row-actions\">\n <button\n class=\"feed-row-edit\"\n (click)=\"\n openEditDialog(m);\n closeFeedGroupDetail();\n closeFeedDetail();\n $event.stopPropagation()\n \"\n title=\"Sửa cữ này\"\n aria-label=\"Sửa cữ bú\"\n >\n <i class=\"pi pi-pencil\"></i>\n </button>\n <button\n class=\"feed-row-del\"\n (click)=\"deleteLog(m); $event.stopPropagation()\"\n title=\"Xoá cữ này\"\n aria-label=\"Xoá cữ bú\"\n >\n <i class=\"pi pi-trash\"></i>\n </button>\n <button\n type=\"button\"\n class=\"feed-row-edit\"\n (click)=\"openFeedDetailFromGroupMember(m); $event.stopPropagation()\"\n title=\"Chi tiết cữ này\"\n aria-label=\"Chi tiết cữ bú\"\n >\n <i class=\"pi pi-eye\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n <div class=\"dialog-actions\">\n <button type=\"button\" class=\"btn primary\" (click)=\"closeFeedGroupDetail()\">Đóng</button>\n </div>\n </div>\n </div>\n}\n\n<!-- Chi tiết một cữ bú — render sau dialog gom, z-index cao hơn -->\n@if (feedDetailView(); as view) {\n <div class=\"dialog-overlay dialog-overlay--front feed-detail-overlay\" (click)=\"closeFeedDetail()\">\n <div\n class=\"dialog feed-detail-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.data-status]=\"view.volumeStatus\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"feed-detail-top\">\n <button\n type=\"button\"\n class=\"feed-detail-close\"\n (click)=\"closeFeedDetail()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n <p class=\"feed-detail-eyebrow\">Chi tiết cữ bú</p>\n <div class=\"feed-detail-metric\" aria-label=\"Dung tích\">\n <span class=\"feed-detail-metric__value\">{{ view.log.volume }}</span>\n <span class=\"feed-detail-metric__unit\">ml</span>\n </div>\n <span class=\"feed-detail-status\" [attr.data-kind]=\"view.volumeStatus\">\n <i class=\"pi\" [ngClass]=\"feedDetailStatusIcon(view.volumeStatus)\"></i>\n {{ feedDetailStatusLabel(view.volumeStatus) }}\n </span>\n <div class=\"feed-detail-chips\">\n <span class=\"feed-detail-chip\">\n <i class=\"pi pi-calendar\"></i>\n <span>\n {{ formatDateDisplay(view.log.date) }}\n <em>{{ formatDayLabel(view.log.date) }}</em>\n </span>\n </span>\n <span class=\"feed-detail-chip feed-detail-chip--time\">\n <i class=\"pi pi-clock\"></i>\n <span>{{ view.log.time }}</span>\n </span>\n @if (view.ageLabel) {\n <span class=\"feed-detail-chip feed-detail-chip--muted\">\n <i class=\"pi pi-history\"></i>\n <span>{{ view.ageLabel }}</span>\n </span>\n }\n </div>\n </header>\n <div class=\"feed-detail-body\">\n @if (view.compares.length > 0) {\n <section class=\"feed-detail-section\">\n <h3 class=\"feed-detail-section__title\"><i class=\"pi pi-chart-bar\"></i> So sánh</h3>\n <ul class=\"feed-detail-cards\">\n @for (row of view.compares; track row) {\n <li\n class=\"feed-detail-card\"\n [class.feed-detail-card--warn]=\"row.warn\"\n [class.feed-detail-card--position]=\"row.kind === 'position'\"\n [class.feed-detail-card--average]=\"row.kind === 'average'\"\n [class.feed-detail-card--next]=\"row.kind === 'next'\"\n [class.feed-detail-card--gap]=\"row.kind === 'gap'\"\n >\n <span\n class=\"feed-detail-card__icon\"\n [attr.data-kind]=\"row.kind\"\n aria-hidden=\"true\"\n >\n <i class=\"pi\" [ngClass]=\"row.icon\"></i>\n </span>\n <div class=\"feed-detail-card__body\">\n <span class=\"feed-detail-card__label\">{{ row.label }}</span>\n @if (row.kind === 'position' && row.position; as pos) {\n <div class=\"fdc-position\">\n <div class=\"fdc-position__head\">\n <span class=\"fdc-position__idx\">Cữ {{ pos.index }}</span>\n <span class=\"fdc-position__of\">/ {{ pos.total }}</span>\n <span class=\"fdc-position__tag\">{{ pos.dayLabel }}</span>\n </div>\n <div\n class=\"fdc-progress\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"pos.index\"\n [attr.aria-valuemax]=\"pos.total\"\n >\n <div\n class=\"fdc-progress__fill\"\n [style.width.%]=\"(pos.index / pos.total) * 100\"\n ></div>\n </div>\n <div class=\"fdc-position__stats\">\n <span class=\"fdc-stat fdc-stat--violet\">\n <strong>{{ pos.totalMl }}</strong>\n <small>ml đến cữ này</small>\n </span>\n @if (pos.dayTotalMl > pos.totalMl) {\n <span class=\"fdc-stat fdc-stat--indigo\">\n <strong>{{ pos.dayTotalMl }}</strong>\n <small>ml cả ngày</small>\n </span>\n }\n </div>\n </div>\n }\n @if (row.kind === 'average' && row.average; as avg) {\n <div class=\"fdc-avg\">\n <span\n class=\"fdc-pill\"\n [class.fdc-pill--neutral]=\"avg.diffMl === 0\"\n [class.fdc-pill--up]=\"avg.diffMl > 0\"\n [class.fdc-pill--down]=\"avg.diffMl < 0\"\n >\n {{\n avg.diffMl === 0\n ? 'Bằng TB'\n : (avg.diffMl > 0 ? '+' : '') + avg.diffMl + 'ml'\n }}\n </span>\n <span class=\"fdc-avg__meta\">\n <strong>{{ avg.refMl }}ml</strong>/cữ · {{ avg.refLabel }} ·\n {{ avg.feedCount }} cữ\n </span>\n </div>\n }\n @if (row.kind === 'next' && row.next; as nx) {\n <div class=\"fdc-next\">\n <span class=\"fdc-next__time\">{{ nx.time }}</span>\n <span class=\"fdc-next__vol\">{{ nx.volume }}ml</span>\n <span class=\"fdc-next__gap\">\n <i class=\"pi pi-clock\"></i> sau {{ nx.gapLabel }}\n </span>\n </div>\n }\n @if (row.kind === 'gap' && row.gapPrev; as gp) {\n <div class=\"fdc-gap\">\n <div class=\"fdc-gap__prev\">\n <span class=\"fdc-gap__prev-label\">Cữ trước</span>\n <span class=\"fdc-gap__prev-time\">{{ gp.prevTime }}</span>\n <span class=\"fdc-gap__prev-vol\">{{ gp.prevVolume }}ml</span>\n @if (gp.prevDateIso) {\n <span class=\"fdc-gap__prev-date\">\n {{ formatDateShort(gp.prevDateIso) }}\n </span>\n }\n </div>\n <div class=\"fdc-gap__row\">\n <div class=\"fdc-gap__interval\" [class.fdc-gap__interval--warn]=\"row.warn\">\n <i class=\"pi pi-clock\"></i>\n <span>{{ gp.gapLabel }}</span>\n </div>\n <span\n class=\"fdc-pill fdc-gap__vol-diff\"\n [class.fdc-pill--neutral]=\"gp.volDiffMl === 0\"\n [class.fdc-pill--up]=\"gp.volDiffMl > 0\"\n [class.fdc-pill--down]=\"gp.volDiffMl < 0\"\n >\n {{\n gp.volDiffMl === 0\n ? 'Bằng cữ trước'\n : (gp.volDiffMl > 0 ? '+' : '') + gp.volDiffMl + 'ml'\n }}\n </span>\n </div>\n </div>\n }\n </div>\n </li>\n }\n </ul>\n </section>\n }\n @if (view.note) {\n <section class=\"feed-detail-section\">\n <h3 class=\"feed-detail-section__title\"><i class=\"pi pi-comment\"></i> Ghi chú</h3>\n <blockquote class=\"feed-detail-quote\">{{ view.note }}</blockquote>\n </section>\n }\n </div>\n <footer class=\"feed-detail-footer\">\n <div class=\"feed-detail-cta\">\n <button type=\"button\" class=\"btn ghost\" (click)=\"closeFeedDetail()\">Đóng</button>\n @if (view.log.rowIndex) {\n <button type=\"button\" class=\"btn primary\" (click)=\"openEditFromFeedDetail()\">\n <i class=\"pi pi-pencil\"></i> Sửa cữ\n </button>\n }\n </div>\n </footer>\n </div>\n </div>\n}\n","import type { FeedingLog, FeedingSettingsResolved } from '../../services/feeding-log.service';\nimport type { FeedingViewGroup } from './feeding-view-group';\n\nexport function logTimestamp(l: FeedingLog): number {\n const [y, m, d] = (l.date || '').split('-').map(Number);\n const [hh, mm] = (l.time || '').split(':').map(Number);\n if (!y || !m || !d || isNaN(hh) || isNaN(mm)) return 0;\n return new Date(y, m - 1, d, hh, mm, 0, 0).getTime();\n}\n\nexport function logRowKey(l: FeedingLog): string {\n return l.rowIndex != null ? `r${l.rowIndex}` : `${l.date}|${l.time}`;\n}\n\nexport function viewGroupKey(g: FeedingViewGroup): string {\n return g.members.map((m) => logRowKey(m)).join('>');\n}\n\nexport function isLowVolume(volume: number, settings: FeedingSettingsResolved): boolean {\n const max = settings.feedWarningMl;\n return volume > 0 && volume < max;\n}\n\nexport function isHighVolume(volume: number): boolean {\n return volume > 200;\n}\n\nexport function viewGroupDisplayVolume(g: FeedingViewGroup): number {\n return g.members.reduce((s, m) => s + (m.volume || 0), 0);\n}\n\nexport function viewGroupDisplayTime(g: FeedingViewGroup, toTimeStr: (d: Date) => string): string {\n const sum = g.members.reduce((s, m) => s + logTimestamp(m), 0);\n const avg = Math.round(sum / g.members.length);\n return toTimeStr(new Date(avg));\n}\n\nexport function viewGroupNote(g: FeedingViewGroup): string {\n const parts = g.members.map((m) => (m.note || '').trim()).filter(Boolean);\n return parts.length ? parts.join(' · ') : '';\n}\n\nexport function isLowVolumeViewGroup(\n g: FeedingViewGroup,\n settings: FeedingSettingsResolved\n): boolean {\n return g.members.some((m) => isLowVolume(m.volume, settings));\n}\n\nexport function isHighVolumeViewGroup(g: FeedingViewGroup): boolean {\n const sum = viewGroupDisplayVolume(g);\n return sum > 200 || g.members.some((m) => isHighVolume(m.volume));\n}\n\nfunction globalPrevLogBefore(group: FeedingViewGroup, all: FeedingLog[]): FeedingLog | undefined {\n const curTs = logTimestamp(group.members[0]);\n const memberKey = new Set(group.members.map((m) => logRowKey(m)));\n let best: FeedingLog | undefined;\n let bestTs = -Infinity;\n for (const l of all) {\n if (memberKey.has(logRowKey(l))) continue;\n const t = logTimestamp(l);\n if (t < curTs && t > bestTs) {\n bestTs = t;\n best = l;\n }\n }\n return best;\n}\n\nexport function formatIntervalFromPrevViewGroup(\n g: FeedingViewGroup,\n listDesc: FeedingViewGroup[],\n allLogs: FeedingLog[]\n): string {\n const idx = listDesc.findIndex((x) => viewGroupKey(x) === viewGroupKey(g));\n let prev: FeedingLog | undefined;\n if (idx >= 0 && idx < listDesc.length - 1) {\n const older = listDesc[idx + 1];\n prev = older.members[older.members.length - 1];\n } else {\n prev = globalPrevLogBefore(g, allLogs);\n }\n if (!prev) return '';\n const diffMs = logTimestamp(g.members[0]) - logTimestamp(prev);\n const diff = Math.round(diffMs / 60000);\n if (diff <= 0) return '';\n const hh = Math.floor(diff / 60);\n const mm = diff % 60;\n if (hh === 0) return `${mm}p`;\n if (mm === 0) return `${hh}h`;\n return `${hh}h${mm.toString().padStart(2, '0')}p`;\n}\n\nexport function isFeedTimeGapWarningViewGroup(\n g: FeedingViewGroup,\n listDesc: FeedingViewGroup[],\n allLogs: FeedingLog[],\n settings: FeedingSettingsResolved\n): boolean {\n const idx = listDesc.findIndex((x) => viewGroupKey(x) === viewGroupKey(g));\n let prev: FeedingLog | undefined;\n if (idx >= 0 && idx < listDesc.length - 1) {\n const older = listDesc[idx + 1];\n prev = older.members[older.members.length - 1];\n } else {\n prev = globalPrevLogBefore(g, allLogs);\n }\n if (!prev) return false;\n const diffMs = logTimestamp(g.members[0]) - logTimestamp(prev);\n const hours = diffMs / (1000 * 60 * 60);\n return hours >= settings.feedTimeWarningHours;\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewChild,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { of } from 'rxjs';\nimport { finalize, concatMap } from 'rxjs/operators';\nimport {\n ACTIVITY_EVENT,\n ActivityLogService,\n formatLogContent,\n} from '../../../services/activity-log.service';\nimport {\n BottlePrepFromSheet,\n FeedingLog,\n FeedingLogService,\n FeedingSettingsResolved,\n} from '../../../services/feeding-log.service';\nimport { NutritionTarget } from '../feeding-nutrition';\nimport { predictNextFeeding } from '../feeding-prediction';\nimport { FeedingViewGroup, groupLogsByProximity } from '../feeding-view-group';\nimport {\n formatIntervalFromPrevViewGroup,\n isFeedTimeGapWarningViewGroup,\n isHighVolumeViewGroup,\n isLowVolumeViewGroup,\n viewGroupDisplayTime,\n viewGroupDisplayVolume,\n viewGroupKey,\n viewGroupNote,\n} from '../feeding-display.helpers';\n\ninterface DayStats {\n date: string;\n total: number;\n count: number;\n avg: number;\n medianMl: number;\n typicalFeedMl: number;\n max: number;\n min: number;\n firstTime: string;\n lastTime: string;\n}\n\nfunction minutesToHumanShort(minutes: number): string {\n if (!minutes || minutes <= 0) return '';\n const h = Math.floor(minutes / 60);\n const m = minutes % 60;\n if (h === 0) return `${m}p`;\n if (m === 0) return `${h}h`;\n return `${h}h${m}p`;\n}\n\nfunction minutesToVietnamese(minutes: number): string {\n if (!minutes || minutes <= 0) return '';\n const h = Math.floor(minutes / 60);\n const m = minutes % 60;\n if (h === 0) return `${m} phút`;\n if (m === 0) return `${h} giờ`;\n return `${h} giờ ${m} phút`;\n}\n\n@Component({\n selector: 'app-feeding-daily',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './feeding-daily.component.html',\n styleUrls: ['./feeding-daily.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedingDailyComponent implements AfterViewInit {\n private feedingLogService = inject(FeedingLogService);\n private activityLogService = inject(ActivityLogService);\n\n @ViewChild('pastDayStripScroller')\n private pastDayStripScroller?: ElementRef<HTMLElement>;\n\n Math = Math;\n\n logs = input.required<FeedingLog[]>();\n feedingSettings = input.required<FeedingSettingsResolved>();\n now = input.required<Date>();\n nutritionTarget = input<NutritionTarget | null>(null);\n user = input.required<string>();\n syncMessage = input('');\n syncError = input('');\n logDialogOpen = input(false);\n loadingLogs = input(false);\n /** Parent increments on `refreshAll()` to reload bottle prep. */\n refreshToken = input(0);\n\n logsChanged = output<void>();\n bottlePrepChange = output<BottlePrepFromSheet | null>();\n editLog = output<FeedingLog>();\n historyOpen = output<{\n filter: 'all' | 'today' | 'yesterday' | 'date';\n dateStr?: string;\n }>();\n feedRowClick = output<FeedingViewGroup>();\n\n private static readonly PAST_DAY_STRIP_MIN_DAYS = 30;\n private static readonly PAST_DAY_STRIP_MAX_DAYS = 120;\n\n /** Gợi ý lý do khi xóa / đổi sữa đã pha (dialog). */\n readonly bottlePrepReasonQuickTags = [\n 'Sữa hỏng',\n 'Bé ói',\n 'Pha lại',\n 'Đổ đi',\n 'Hết hạn',\n 'Bé uống ít',\n 'Đổi loại sữa',\n 'Đo lại ml',\n ] as const;\n\n /** Gợi ý lý do khi xóa cữ bú. */\n readonly feedingDeleteReasonQuickTags = [\n 'Nhập nhầm',\n 'Trùng cữ',\n 'Sai giờ',\n 'Sai ml',\n 'Bé không bú',\n 'Log thử',\n ] as const;\n\n bottlePrep = signal<BottlePrepFromSheet | null>(null);\n bottlePrepDraft = signal('');\n bottlePrepEditing = signal(false);\n bottlePrepSaving = signal(false);\n pastDayViewDate = signal('');\n\n feedingDeleteConfirmLog = signal<FeedingLog | null>(null);\n feedingDeleteReasonDraft = signal('');\n feedingDeleteSaving = signal(false);\n /** Ẩn banner \"hoàn tất vỗ ợ\" cho cữ bú hiện tại đến khi có cữ mới. */\n private dismissedBurpDoneFeedKey = signal<string | null>(null);\n\n bottlePrepClearConfirmOpen = signal(false);\n bottlePrepClearReasonDraft = signal('');\n\n bottlePrepEditConfirmOpen = signal(false);\n bottlePrepEditReasonDraft = signal('');\n bottlePrepEditPending = signal<{\n newVolume: number;\n time: string;\n atIso: string;\n oldVolume: number;\n } | null>(null);\n\n bottlePrepWarning = computed(() => {\n const prep = this.bottlePrep();\n if (!prep) {\n const p = this.prediction();\n if (!p?.nextAt) return null;\n const diffMin = Math.round((p.nextAt.getTime() - this.now().getTime()) / 60000);\n const notifyMinutes = this.feedingSettings().feedingNotificationMinutes;\n const bottlePrepNotifyMinutes = notifyMinutes + 20;\n if (diffMin < 0) {\n return { type: 'no-prep-late' as const, minutes: Math.abs(diffMin) };\n }\n if (diffMin <= bottlePrepNotifyMinutes) {\n return { type: 'no-prep-soon' as const, minutes: diffMin };\n }\n return null;\n }\n const prepTime = new Date(prep.at);\n if (isNaN(prepTime.getTime())) return null;\n const expiryTime = new Date(prepTime.getTime() + 60 * 60 * 1000);\n const remainingMs = expiryTime.getTime() - this.now().getTime();\n const remainingMinutes = Math.floor(remainingMs / (60 * 1000));\n if (remainingMinutes <= 0) {\n return { type: 'expired' as const, minutes: 0 };\n }\n if (remainingMinutes <= 30) {\n return { type: 'expiring-soon' as const, minutes: remainingMinutes };\n }\n return null;\n });\n\n /** % thời gian đã trôi trong cửa sổ 1h sau khi pha (0% = mới pha, 100% = hết/ quá hạn). */\n bottlePrepBarPct = computed(() => {\n const prep = this.bottlePrep();\n if (prep) {\n const prepTime = new Date(prep.at);\n if (isNaN(prepTime.getTime())) return 0;\n const windowMs = 60 * 60 * 1000;\n const elapsed = this.now().getTime() - prepTime.getTime();\n const pct = Math.round((elapsed / windowMs) * 100);\n return Math.min(100, Math.max(0, pct));\n }\n const w = this.bottlePrepWarning();\n if (!w) return 0;\n const notifyMinutes = this.feedingSettings().feedingNotificationMinutes + 20;\n if (w.type === 'no-prep-late') return 100;\n if (w.type === 'no-prep-soon') {\n if (w.minutes <= 0) return 100;\n return Math.min(100, Math.round((1 - w.minutes / notifyMinutes) * 100));\n }\n return 0;\n });\n\n bottlePrepBarTone = computed((): 'calm' | 'soon' | 'danger' => {\n const w = this.bottlePrepWarning();\n if (!w) return 'calm';\n if (w.type === 'expired' || w.type === 'no-prep-late') return 'danger';\n if (w.type === 'expiring-soon' || w.type === 'no-prep-soon') return 'soon';\n return 'calm';\n });\n\n bottlePrepCountdownLine = computed((): string => {\n const prep = this.bottlePrep();\n const w = this.bottlePrepWarning();\n if (prep) {\n const t = new Date(prep.at);\n if (isNaN(t.getTime())) return '';\n const remMs = t.getTime() + 60 * 60 * 1000 - this.now().getTime();\n if (remMs <= 0) return 'Đã quá hạn 1 giờ — nên pha sữa mới.';\n const m = Math.max(1, Math.floor(remMs / 60000));\n return `Còn ${m} phút nữa là sữa hết hạn.`;\n }\n if (w?.type === 'no-prep-soon') {\n if (w.minutes <= 0) return 'Đến giờ bú — chưa có sữa đã pha trong bình.';\n return `Còn ${minutesToVietnamese(w.minutes)} tới cữ bú — chưa có sữa đã pha.`;\n }\n if (w?.type === 'no-prep-late') {\n if (w.minutes > 0)\n return `Đã trễ ${minutesToVietnamese(w.minutes)} so với giờ bú — chưa có sữa đã pha.`;\n return 'Đã trễ giờ bú — chưa có sữa đã pha.';\n }\n return '';\n });\n\n /** Dòng trái dưới progress (khi có sữa trong bình): cảnh báo / còn bao lâu hết hạn. */\n bottlePrepFooterLeft = computed((): string => {\n if (!this.bottlePrep()) return '';\n return this.bottlePrepCountdownLine();\n });\n\n /** Khoảng thời gian đã trôi kể từ lúc pha — căn phải dưới progress. */\n bottlePrepSincePrepLabel = computed((): string => {\n const prep = this.bottlePrep();\n if (!prep) return '';\n const t = new Date(prep.at);\n if (isNaN(t.getTime())) return '';\n const diffMs = this.now().getTime() - t.getTime();\n const diffMin = Math.max(0, Math.floor(diffMs / 60000));\n if (diffMin <= 0) return 'Cách đây dưới 1 phút';\n return `Cách đây ${minutesToVietnamese(diffMin)}`;\n });\n\n todayStats = computed<DayStats>(() => this.computeDayStats(this.todayDateStr()));\n\n todayLogs = computed(() =>\n this.logs()\n .filter((l) => l.date === this.todayDateStr())\n .sort((a, b) => b.time.localeCompare(a.time))\n );\n\n todayLogViewGroups = computed<FeedingViewGroup[]>(() =>\n groupLogsByProximity(this.todayLogs(), this.feedingSettings().feedGroupGapMinutes, (l) =>\n this.logTimestamp(l)\n )\n );\n\n private logsByDateMap = computed(() => {\n const map = new Map<string, FeedingLog[]>();\n for (const log of this.logs()) {\n let bucket = map.get(log.date);\n if (!bucket) {\n bucket = [];\n map.set(log.date, bucket);\n }\n bucket.push(log);\n }\n for (const bucket of map.values()) {\n if (bucket.length > 1) {\n bucket.sort((a, b) => b.time.localeCompare(a.time));\n }\n }\n return map;\n });\n\n pastDayViewLogs = computed(() => this.logsByDateMap().get(this.pastDayViewDate()) ?? []);\n\n pastDayViewStats = computed<DayStats>(() => {\n const date = this.pastDayViewDate();\n return this.statsFromList(date, this.pastDayViewLogs());\n });\n\n pastDayViewLogViewGroups = computed<FeedingViewGroup[]>(() =>\n groupLogsByProximity(this.pastDayViewLogs(), this.feedingSettings().feedGroupGapMinutes, (l) =>\n this.logTimestamp(l)\n )\n );\n\n pastDayStripItems = computed(() => {\n const map = this.logsByDateMap();\n const yesterday = this.yesterdayDateStr();\n const today = this.todayDateStr();\n const minStart = this.dateStrDaysAgo(FeedingDailyComponent.PAST_DAY_STRIP_MIN_DAYS);\n const maxStart = this.dateStrDaysAgo(FeedingDailyComponent.PAST_DAY_STRIP_MAX_DAYS);\n let earliest = minStart;\n for (const date of map.keys()) {\n if (date < today && date < earliest) {\n earliest = date;\n }\n }\n if (earliest < maxStart) {\n earliest = maxStart;\n }\n const items: Array<{\n date: string;\n dateLabel: string;\n mlLabel: string;\n total: number;\n }> = [];\n const cursor = new Date(earliest + 'T00:00:00');\n const end = new Date(yesterday + 'T00:00:00');\n while (cursor <= end) {\n const date = this.toDateStr(cursor);\n const dayLogs = map.get(date) ?? [];\n const total = dayLogs.reduce((sum, log) => sum + log.volume, 0);\n items.push({\n date,\n dateLabel: this.formatDateStrip(date),\n mlLabel: total > 0 ? `${total}ml` : '—',\n total,\n });\n cursor.setDate(cursor.getDate() + 1);\n }\n return items;\n });\n\n yesterdayUpToNowStats = computed<DayStats>(() => {\n const nowTime = this.toTimeStr(this.now());\n const yDate = this.yesterdayDateStr();\n const list = this.logs().filter((l) => l.date === yDate && l.time <= nowTime);\n return this.statsFromList(yDate, list);\n });\n\n priorThreeDaysUpToNowAvg = computed(() => {\n const s1 = this.statsUpToNowForDate(this.dateStrDaysAgo(1));\n const s2 = this.statsUpToNowForDate(this.dateStrDaysAgo(2));\n const s3 = this.statsUpToNowForDate(this.dateStrDaysAgo(3));\n const avgTotal = Math.round((s1.total + s2.total + s3.total) / 3);\n const avgCount = Math.round((s1.count + s2.count + s3.count) / 3);\n return { avgTotal, avgCount };\n });\n\n comparison = computed(() => {\n const t = this.todayStats();\n const y = this.yesterdayUpToNowStats();\n const totalDiff = t.total - y.total;\n const pct = y.total > 0 ? Math.round((totalDiff / y.total) * 100) : null;\n return { totalDiff, pct };\n });\n\n comparisonVsPrior3Avg = computed(() => {\n const t = this.todayStats();\n const p = this.priorThreeDaysUpToNowAvg();\n const totalDiff = t.total - p.avgTotal;\n const pct = p.avgTotal > 0 ? Math.round((totalDiff / p.avgTotal) * 100) : null;\n return { totalDiff, pct };\n });\n\n prediction = computed(() => predictNextFeeding(this.logs(), this.now()));\n\n lastFeeding = computed<FeedingLog | null>(() => {\n const all = this.logs();\n if (all.length === 0) return null;\n const sorted = [...all].sort((a, b) => {\n const ka = `${a.date}T${a.time}`;\n const kb = `${b.date}T${b.time}`;\n return kb.localeCompare(ka);\n });\n return sorted[0];\n });\n\n lastFeedingAgo = computed(() => {\n const l = this.lastFeeding();\n if (!l) return '';\n const [y, mo, d] = l.date.split('-').map((n) => parseInt(n, 10));\n const [h, mi] = l.time.split(':').map((n) => parseInt(n, 10));\n const at = new Date(y, (mo || 1) - 1, d || 1, h || 0, mi || 0);\n const diffMin = Math.round((this.now().getTime() - at.getTime()) / 60000);\n if (diffMin < 1) return 'vừa xong';\n if (diffMin < 60) return `${diffMin} phút trước`;\n const hrs = Math.floor(diffMin / 60);\n const mins = diffMin % 60;\n if (hrs < 24) return mins > 0 ? `${hrs}h${mins}p trước` : `${hrs}h trước`;\n const days = Math.floor(hrs / 24);\n return `${days} ngày trước`;\n });\n\n burpInsight = computed(() => {\n const last = this.lastFeeding();\n if (!last) return null;\n const feedKey = this.burpFeedKey(last);\n const burpDuration = this.feedingSettings().burpDurationMinutes;\n const [y, mo, d] = last.date.split('-').map((n) => parseInt(n, 10));\n const [h, mi] = last.time.split(':').map((n) => parseInt(n, 10));\n const feedAt = new Date(y, (mo || 1) - 1, d || 1, h || 0, mi || 0);\n const burpEndAt = new Date(feedAt.getTime() + burpDuration * 60 * 1000);\n const nowMs = this.now().getTime();\n const remainingMs = burpEndAt.getTime() - nowMs;\n if (remainingMs > 0) {\n return {\n state: 'active' as const,\n remainingMinutes: Math.ceil(remainingMs / 60000),\n elapsedMinutes: Math.max(0, Math.floor((nowMs - feedAt.getTime()) / 60000)),\n lastFeedTime: last.time,\n lastFeedVolume: last.volume,\n burpDuration,\n };\n }\n\n const minutesSinceBurp = Math.floor((nowMs - burpEndAt.getTime()) / 60000);\n const followupWindowMinutes = 90;\n if (minutesSinceBurp > followupWindowMinutes) return null;\n if (this.dismissedBurpDoneFeedKey() === feedKey) return null;\n return {\n state: 'done' as const,\n minutesSinceBurp,\n lastFeedTime: last.time,\n lastFeedVolume: last.volume,\n burpDuration,\n };\n });\n\n burpProgressPct = computed(() => {\n const info = this.burpInsight();\n if (!info) return 0;\n if (info.state === 'done') return 100;\n if (info.burpDuration <= 0) return 0;\n return Math.max(0, Math.min(100, Math.round((info.elapsedMinutes / info.burpDuration) * 100)));\n });\n\n closeBurpDoneBanner(): void {\n const last = this.lastFeeding();\n if (!last) return;\n this.dismissedBurpDoneFeedKey.set(this.burpFeedKey(last));\n }\n\n private burpFeedKey(log: FeedingLog): string {\n return `${log.date}|${log.time}|${log.volume}`;\n }\n\n timeUntilNext = computed(() => {\n const p = this.prediction();\n if (!p?.nextAt) return '';\n const diffMin = Math.round((p.nextAt.getTime() - this.now().getTime()) / 60000);\n const notifyMinutes = this.feedingSettings().feedingNotificationMinutes;\n if (diffMin < -5) return `đã trễ ${minutesToVietnamese(-diffMin)}`;\n if (diffMin < 0) return `đã trễ ${minutesToVietnamese(-diffMin)}`;\n if (diffMin <= notifyMinutes) return `trong ${minutesToVietnamese(diffMin)} nữa`;\n return `trong ${minutesToVietnamese(diffMin)} nữa`;\n });\n\n nextFeedingRecommendedMl = computed<number | null>(() => {\n const target = this.nutritionTarget();\n if (!target) return null;\n const avgMlPerFeed = Math.round(\n (target.dailyMlMin + target.dailyMlMax) /\n 2 /\n ((target.feedsPerDayMin + target.feedsPerDayMax) / 2)\n );\n const clampedValue = Math.max(10, Math.min(300, avgMlPerFeed));\n const remainder = clampedValue % 10;\n if (remainder === 0) return clampedValue;\n if (remainder <= 5) {\n return clampedValue - remainder + (remainder >= 1 ? 5 : 0);\n }\n return clampedValue + (10 - remainder);\n });\n\n nextFeedingRecommendation = computed(() => {\n const target = this.nutritionTarget();\n const prediction = this.prediction();\n if (!target) {\n return {\n recommendedMl: 0,\n hasNutritionData: false,\n };\n }\n const todayTotal = this.todayStats().total;\n const todayCount = this.todayStats().count;\n const remainingDaily = Math.max(0, target.dailyMlMin - todayTotal);\n const remainingFeeds = Math.max(1, target.feedsPerDayMin - todayCount);\n const recommendedMl = this.nextFeedingRecommendedMl() ?? 0;\n return {\n recommendedMl,\n predictedMl: prediction?.nextVolume ?? null,\n remainingDaily,\n remainingFeeds,\n hasNutritionData: true,\n };\n });\n\n predictionMedianIntervalHuman = computed(() =>\n minutesToHumanShort(this.prediction().medianIntervalMinutes || 0)\n );\n\n countdownStatus = computed<'late' | 'now' | 'waiting'>(() => {\n const p = this.prediction();\n if (!p?.nextAt) return 'waiting';\n const diffMin = Math.round((p.nextAt.getTime() - this.now().getTime()) / 60000);\n const notifyMinutes = this.feedingSettings().feedingNotificationMinutes;\n if (diffMin < -5) return 'late';\n if (diffMin <= notifyMinutes) return 'now';\n return 'waiting';\n });\n\n countdownProgress = computed(() => {\n const p = this.prediction();\n const last = this.lastFeeding();\n if (!p?.nextAt || !last) return 0;\n const [y, mo, d] = last.date.split('-').map((n) => parseInt(n, 10));\n const [h, mi] = last.time.split(':').map((n) => parseInt(n, 10));\n const lastAt = new Date(y, (mo || 1) - 1, d || 1, h || 0, mi || 0).getTime();\n const nextAt = p.nextAt.getTime();\n const now = this.now().getTime();\n const total = nextAt - lastAt;\n if (total <= 0) return 100;\n return Math.max(0, Math.min(100, Math.round(((now - lastAt) / total) * 100)));\n });\n\n recentFeedViewGroups = computed<FeedingViewGroup[]>(() => {\n const gap = this.feedingSettings().feedGroupGapMinutes;\n const all = groupLogsByProximity(this.logs(), gap, (l) => this.logTimestamp(l));\n return all.slice(0, 5);\n });\n\n todayLogsPreview = computed(() => this.todayLogViewGroups().slice(0, 2));\n pastDayViewLogsPreview = computed(() => this.pastDayViewLogViewGroups().slice(0, 2));\n\n constructor() {\n effect(() => {\n this.user();\n this.refreshToken();\n this.loadBottlePrepFromSheet();\n });\n effect(() => {\n const date = this.pastDayViewDate();\n if (date) {\n queueMicrotask(() => this.scrollPastDayStripIntoView(date, 'instant'));\n }\n });\n }\n\n ngAfterViewInit(): void {\n if (!this.pastDayViewDate()) {\n this.pastDayViewDate.set(this.yesterdayDateStr());\n }\n queueMicrotask(() => this.scrollPastDayStripIntoView(this.pastDayViewDate(), 'instant'));\n }\n\n trackFeedingViewGroup = (_index: number, g: FeedingViewGroup): string => viewGroupKey(g);\n\n trackPastDayStripItem(_index: number, item: { date: string }): string {\n return item.date;\n }\n\n viewGroupDisplayTime(g: FeedingViewGroup): string {\n return viewGroupDisplayTime(g, (d) => this.toTimeStr(d));\n }\n\n viewGroupDisplayVolume(g: FeedingViewGroup): number {\n return viewGroupDisplayVolume(g);\n }\n\n viewGroupNote(g: FeedingViewGroup): string {\n return viewGroupNote(g);\n }\n\n isLowVolumeViewGroup(g: FeedingViewGroup): boolean {\n return isLowVolumeViewGroup(g, this.feedingSettings());\n }\n\n isHighVolumeViewGroup(g: FeedingViewGroup): boolean {\n return isHighVolumeViewGroup(g);\n }\n\n formatIntervalFromPrevViewGroup(g: FeedingViewGroup, listDesc: FeedingViewGroup[]): string {\n return formatIntervalFromPrevViewGroup(g, listDesc, this.logs());\n }\n\n isFeedTimeGapWarningViewGroup(g: FeedingViewGroup, listDesc: FeedingViewGroup[]): boolean {\n return isFeedTimeGapWarningViewGroup(g, listDesc, this.logs(), this.feedingSettings());\n }\n\n onFeedRowClick(g: FeedingViewGroup): void {\n this.feedRowClick.emit(g);\n }\n\n openHistoryDialog(\n filter: 'all' | 'today' | 'yesterday' | 'date' = 'all',\n dateStr?: string\n ): void {\n this.historyOpen.emit({\n filter,\n dateStr: filter === 'date' ? dateStr : undefined,\n });\n }\n\n openEditDialog(log: FeedingLog): void {\n this.editLog.emit(log);\n }\n\n openFeedGroupDetail(g: FeedingViewGroup): void {\n if (g.members.length < 2) return;\n this.feedRowClick.emit(g);\n }\n\n deleteLog(log: FeedingLog): void {\n if (!log.rowIndex) return;\n this.feedingDeleteConfirmLog.set(log);\n this.feedingDeleteReasonDraft.set('');\n }\n\n closeFeedingDeleteConfirm(): void {\n if (this.feedingDeleteSaving()) return;\n this.feedingDeleteConfirmLog.set(null);\n this.feedingDeleteReasonDraft.set('');\n }\n\n updateFeedingDeleteReason(v: string): void {\n this.feedingDeleteReasonDraft.set(v);\n }\n\n toggleFeedingDeleteReasonQuickTag(tag: string): void {\n const cur = this.feedingDeleteReasonDraft().trim();\n this.feedingDeleteReasonDraft.set(cur === tag ? '' : tag);\n }\n\n confirmDeleteFeedingLog(): void {\n const log = this.feedingDeleteConfirmLog();\n if (!log?.rowIndex || this.feedingDeleteSaving()) return;\n\n const reason = this.feedingDeleteReasonDraft().trim();\n this.feedingDeleteSaving.set(true);\n this.feedingLogService\n .deleteLog(log.rowIndex)\n .pipe(finalize(() => this.feedingDeleteSaving.set(false)))\n .subscribe({\n next: () => {\n this.feedingDeleteConfirmLog.set(null);\n this.feedingDeleteReasonDraft.set('');\n this.activityLogService\n .logFeeding(this.user(), 'FEEDING_DELETED', {\n time: log.time,\n volume: log.volume,\n reason: reason || undefined,\n })\n .subscribe();\n this.logsChanged.emit();\n },\n error: () => {\n /* parent shows syncError via reload failure if needed */\n },\n });\n }\n\n private loadBottlePrepFromSheet(): void {\n this.feedingLogService.getBottlePrep().subscribe({\n next: (prep) => {\n this.bottlePrep.set(prep);\n this.bottlePrepChange.emit(prep);\n },\n });\n }\n\n editBottlePrep(): void {\n const current = this.bottlePrep();\n this.bottlePrepDraft.set(current ? String(current.volumeMl) : '');\n this.bottlePrepEditing.set(true);\n setTimeout(() => {\n const el = document.querySelector<HTMLInputElement>('.bp-input');\n el?.focus();\n el?.select();\n }, 50);\n }\n\n cancelBottlePrep(): void {\n if (this.bottlePrepSaving()) return;\n this.bottlePrepEditing.set(false);\n this.bottlePrepDraft.set('');\n }\n\n updateBottlePrepDraft(v: string): void {\n this.bottlePrepDraft.set(String(v ?? '').replace(/[^\\d]/g, ''));\n }\n\n setBottlePrepDraft(v: number): void {\n if (v <= 0) return;\n this.bottlePrepDraft.set(String(v));\n }\n\n adjustBottlePrepDraft(delta: number): void {\n const current = parseInt(this.bottlePrepDraft(), 10) || 0;\n const next = Math.max(0, Math.min(9999, current + delta));\n this.bottlePrepDraft.set(next ? String(next) : '');\n }\n\n saveBottlePrep(): void {\n if (this.bottlePrepSaving()) return;\n const n = parseInt(this.bottlePrepDraft(), 10);\n if (isNaN(n) || n <= 0) return;\n const oldPrep = this.bottlePrep();\n const warn = this.bottlePrepWarning();\n const atIso = new Date().toISOString();\n const t = this.toTimeStr(new Date(atIso));\n\n const isExpiryReplace =\n !!oldPrep && !!warn && (warn.type === 'expired' || warn.type === 'expiring-soon');\n\n if (oldPrep && n === oldPrep.volumeMl && !isExpiryReplace) {\n return;\n }\n\n const isEditVolumeOnly = !!oldPrep && n !== oldPrep.volumeMl && !isExpiryReplace;\n\n if (isEditVolumeOnly) {\n this.bottlePrepEditPending.set({\n newVolume: n,\n time: t,\n atIso,\n oldVolume: oldPrep.volumeMl,\n });\n this.bottlePrepEditReasonDraft.set('');\n this.bottlePrepEditConfirmOpen.set(true);\n return;\n }\n\n this.commitBottlePrepSheetSave(n, t, atIso, oldPrep, warn);\n }\n\n /** Lưu sheet + log pha mới / hết hạn (không qua dialog sửa ml). */\n private commitBottlePrepSheetSave(\n n: number,\n t: string,\n atIso: string,\n oldPrep: BottlePrepFromSheet | null,\n warn: { type: string; minutes: number } | null\n ): void {\n this.bottlePrepSaving.set(true);\n this.feedingLogService\n .setBottlePrepOnSheet({\n user: this.user(),\n volumeMl: n,\n time: t,\n atIso,\n })\n .pipe(finalize(() => this.bottlePrepSaving.set(false)))\n .subscribe({\n next: () => {\n this.bottlePrepEditing.set(false);\n this.bottlePrepDraft.set('');\n\n let expiryLog$ = of(true);\n if (oldPrep && warn && (warn.type === 'expired' || warn.type === 'expiring-soon')) {\n if (warn.type === 'expired') {\n const prepTime = new Date(oldPrep.at);\n const expiryTime = new Date(prepTime.getTime() + 60 * 60 * 1000);\n const overdueMin = Math.max(\n 1,\n Math.round((this.now().getTime() - expiryTime.getTime()) / 60000)\n );\n expiryLog$ = this.activityLogService.logBottlePrepClearedForExpiry(\n oldPrep.volumeMl,\n overdueMin,\n 'expired'\n );\n } else {\n const remain = Math.max(0, warn.minutes);\n expiryLog$ = this.activityLogService.logBottlePrepClearedForExpiry(\n oldPrep.volumeMl,\n remain,\n 'expiring'\n );\n }\n }\n\n expiryLog$\n .pipe(\n concatMap(() =>\n this.activityLogService.addLog({\n user: this.user(),\n eventType: ACTIVITY_EVENT.BOTTLE_PREP_ADDED,\n content: formatLogContent(ACTIVITY_EVENT.BOTTLE_PREP_ADDED, {\n volume: n,\n time: t,\n }),\n })\n )\n )\n .subscribe();\n\n setTimeout(() => this.loadBottlePrepFromSheet(), 450);\n },\n error: (err) => console.warn('Đồng bộ thông tin pha sữa lên Google Sheet thất bại', err),\n });\n }\n\n closeBottlePrepEditConfirm(): void {\n this.bottlePrepEditConfirmOpen.set(false);\n this.bottlePrepEditReasonDraft.set('');\n this.bottlePrepEditPending.set(null);\n }\n\n updateBottlePrepEditReason(v: string): void {\n this.bottlePrepEditReasonDraft.set(v);\n }\n\n confirmBottlePrepEditSave(): void {\n const p = this.bottlePrepEditPending();\n if (!p) {\n this.closeBottlePrepEditConfirm();\n return;\n }\n const reason = this.bottlePrepEditReasonDraft().trim();\n // Đóng dialog ngay — không giữ overlay chặn UI trong lúc API + log chạy.\n this.bottlePrepEditConfirmOpen.set(false);\n this.bottlePrepEditReasonDraft.set('');\n this.bottlePrepEditPending.set(null);\n\n this.bottlePrepSaving.set(true);\n this.feedingLogService\n .setBottlePrepOnSheet({\n user: this.user(),\n volumeMl: p.newVolume,\n time: p.time,\n atIso: p.atIso,\n })\n .pipe(finalize(() => this.bottlePrepSaving.set(false)))\n .subscribe({\n next: () => {\n this.bottlePrepEditing.set(false);\n this.bottlePrepDraft.set('');\n this.activityLogService\n .addLog({\n user: this.user(),\n eventType: ACTIVITY_EVENT.BOTTLE_PREP_UPDATED,\n content: formatLogContent(ACTIVITY_EVENT.BOTTLE_PREP_UPDATED, {\n oldVolume: p.oldVolume,\n newVolume: p.newVolume,\n time: p.time,\n reason: reason || undefined,\n }),\n })\n .subscribe();\n setTimeout(() => this.loadBottlePrepFromSheet(), 450);\n },\n error: (err) => console.warn('Đồng bộ thông tin pha sữa lên Google Sheet thất bại', err),\n });\n }\n\n openBottlePrepClearConfirm(): void {\n if (!this.bottlePrep()) return;\n this.bottlePrepClearReasonDraft.set('');\n this.bottlePrepClearConfirmOpen.set(true);\n }\n\n closeBottlePrepClearConfirm(): void {\n this.bottlePrepClearConfirmOpen.set(false);\n this.bottlePrepClearReasonDraft.set('');\n }\n\n updateBottlePrepClearReason(v: string): void {\n this.bottlePrepClearReasonDraft.set(v);\n }\n\n /** Gợi ý nhanh: chỉ 1 lý do; bấm lại cùng tag thì xóa; tag khác thì thay hết nội dung. */\n toggleBottlePrepClearReasonQuickTag(tag: string): void {\n const cur = this.bottlePrepClearReasonDraft().trim();\n if (cur === tag) {\n this.bottlePrepClearReasonDraft.set('');\n } else {\n this.bottlePrepClearReasonDraft.set(tag);\n }\n }\n\n toggleBottlePrepEditReasonQuickTag(tag: string): void {\n const cur = this.bottlePrepEditReasonDraft().trim();\n if (cur === tag) {\n this.bottlePrepEditReasonDraft.set('');\n } else {\n this.bottlePrepEditReasonDraft.set(tag);\n }\n }\n\n confirmClearBottlePrep(): void {\n const prep = this.bottlePrep();\n if (!prep) {\n this.closeBottlePrepClearConfirm();\n return;\n }\n const ml = prep.volumeMl;\n const reason = this.bottlePrepClearReasonDraft().trim();\n this.closeBottlePrepClearConfirm();\n this.bottlePrep.set(null);\n this.bottlePrepChange.emit(null);\n this.bottlePrepEditing.set(false);\n this.bottlePrepDraft.set('');\n this.feedingLogService.clearBottlePrepOnSheet().subscribe({\n next: () => {\n this.activityLogService\n .logBottlePrepManualClear(this.user(), ml, reason || undefined)\n .subscribe();\n setTimeout(() => this.loadBottlePrepFromSheet(), 450);\n },\n error: () => setTimeout(() => this.loadBottlePrepFromSheet(), 450),\n });\n }\n\n formatBottleAt(iso: string): string {\n const d = new Date(iso);\n if (isNaN(d.getTime())) return '';\n return this.toTimeStr(d);\n }\n\n /** Giờ:phút mốc hết hạn 1h sau khi pha — dùng cho tag. */\n formatBottlePrepExpiryClock(iso: string): string {\n const d = new Date(iso);\n if (isNaN(d.getTime())) return '';\n return this.toTimeStr(new Date(d.getTime() + 60 * 60 * 1000));\n }\n\n pastDayViewShowReset(): boolean {\n return this.pastDayViewDate() !== this.yesterdayDateStr();\n }\n\n selectPastDayView(date: string): void {\n this.pastDayViewDate.set(date);\n }\n\n pastDayViewCanSelectPrev(): boolean {\n const items = this.pastDayStripItems();\n const current = this.pastDayViewDate();\n return items.length > 0 && !!current && current > items[0].date;\n }\n\n pastDayViewCanSelectNext(): boolean {\n const current = this.pastDayViewDate();\n return !!current && current < this.yesterdayDateStr();\n }\n\n pastDayViewSelectPrev(): void {\n const current = this.pastDayViewDate();\n if (!current) return;\n const d = new Date(current + 'T00:00:00');\n d.setDate(d.getDate() - 1);\n const prev = this.toDateStr(d);\n const items = this.pastDayStripItems();\n if (!items.length || prev < items[0].date) return;\n this.pastDayViewDate.set(prev);\n this.scrollPastDayStripIntoView(prev);\n }\n\n pastDayViewSelectNext(): void {\n const current = this.pastDayViewDate();\n const yesterday = this.yesterdayDateStr();\n if (!current || current >= yesterday) return;\n const d = new Date(current + 'T00:00:00');\n d.setDate(d.getDate() + 1);\n const next = this.toDateStr(d);\n if (next > yesterday) return;\n this.pastDayViewDate.set(next);\n this.scrollPastDayStripIntoView(next);\n }\n\n pastDayViewReset(): void {\n const yesterday = this.yesterdayDateStr();\n this.pastDayViewDate.set(yesterday);\n this.scrollPastDayStripIntoView(yesterday);\n }\n\n pastDayRelativeLabel(dateStr = this.pastDayViewDate()): string {\n if (dateStr === this.yesterdayDateStr()) return 'Hôm qua';\n const d = new Date(this.todayDateStr() + 'T00:00:00');\n d.setDate(d.getDate() - 2);\n if (dateStr === this.toDateStr(d)) return 'Hôm kia';\n return `${this.formatDayLabel(dateStr)} · ${this.formatDateDisplay(dateStr)}`;\n }\n\n formatDateDisplay(iso: string): string {\n const [y, m, d] = iso.split('-');\n return `${d}/${m}/${y}`;\n }\n\n formatDateShort(iso: string): string {\n const [y, m, d] = iso.split('-');\n return `${d}/${m}`;\n }\n\n formatDateStrip(iso: string): string {\n const [, m, d] = iso.split('-').map(Number);\n return `${d}/${m}`;\n }\n\n formatDayLabel(iso: string): string {\n const d = new Date(iso + 'T00:00:00');\n const dayNames = ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'];\n return dayNames[d.getDay()];\n }\n\n todayDateStr(): string {\n return this.toDateStr(this.now());\n }\n\n yesterdayDateStr(): string {\n const d = new Date(this.now());\n d.setDate(d.getDate() - 1);\n return this.toDateStr(d);\n }\n\n dateStrDaysAgo(daysBefore: number): string {\n const d = new Date(this.now());\n d.setDate(d.getDate() - daysBefore);\n return this.toDateStr(d);\n }\n\n private logTimestamp(l: FeedingLog): number {\n const [y, m, d] = (l.date || '').split('-').map(Number);\n const [hh, mm] = (l.time || '').split(':').map(Number);\n if (!y || !m || !d || isNaN(hh) || isNaN(mm)) return 0;\n return new Date(y, m - 1, d, hh, mm, 0, 0).getTime();\n }\n\n private computeDayStats(date: string): DayStats {\n const dayLogs = this.logs().filter((l) => l.date === date);\n return this.dayLogsGroupedStats(date, dayLogs);\n }\n\n private statsUpToNowForDate(dateStr: string): DayStats {\n const nowTime = this.toTimeStr(this.now());\n const list = this.logs().filter((l) => l.date === dateStr && l.time <= nowTime);\n return this.dayLogsGroupedStats(dateStr, list);\n }\n\n private dayLogsGroupedStats(date: string, logs: FeedingLog[]): DayStats {\n const gap = this.feedingSettings().feedGroupGapMinutes;\n const groups = groupLogsByProximity(logs, gap, (l) => this.logTimestamp(l));\n return this.statsFromViewGroups(date, groups);\n }\n\n private pseudoLogsFromViewGroups(groups: FeedingViewGroup[]): FeedingLog[] {\n return groups.map((g) => {\n const anchor = g.members.reduce((a, b) =>\n this.logTimestamp(a) >= this.logTimestamp(b) ? a : b\n );\n return { ...anchor, volume: viewGroupDisplayVolume(g) };\n });\n }\n\n private statsFromViewGroups(date: string, groups: FeedingViewGroup[]): DayStats {\n return this.statsFromList(date, this.pseudoLogsFromViewGroups(groups));\n }\n\n private statsFromList(date: string, list: FeedingLog[]): DayStats {\n if (list.length === 0) {\n return {\n date,\n total: 0,\n count: 0,\n avg: 0,\n medianMl: 0,\n typicalFeedMl: 0,\n max: 0,\n min: 0,\n firstTime: '',\n lastTime: '',\n };\n }\n const total = list.reduce((s, l) => s + l.volume, 0);\n const volumes = list.map((l) => l.volume);\n const times = list.map((l) => l.time).sort();\n const sortedVol = [...volumes].sort((a, b) => a - b);\n const mid = Math.floor(sortedVol.length / 2);\n const medianMl =\n sortedVol.length % 2 === 1\n ? sortedVol[mid]\n : Math.round((sortedVol[mid - 1] + sortedVol[mid]) / 2);\n const avg = Math.round(total / list.length);\n const typicalFeedMl = list.length >= 3 ? medianMl : avg;\n return {\n date,\n total,\n count: list.length,\n avg,\n medianMl,\n typicalFeedMl,\n max: Math.max(...volumes),\n min: Math.min(...volumes),\n firstTime: times[0],\n lastTime: times[times.length - 1],\n };\n }\n\n private toDateStr(d: Date): string {\n const y = d.getFullYear();\n const mo = (d.getMonth() + 1).toString().padStart(2, '0');\n const day = d.getDate().toString().padStart(2, '0');\n return `${y}-${mo}-${day}`;\n }\n\n private toTimeStr(d: Date): string {\n const h = d.getHours().toString().padStart(2, '0');\n const m = d.getMinutes().toString().padStart(2, '0');\n return `${h}:${m}`;\n }\n\n private scrollPastDayStripIntoView(date: string, behavior: ScrollBehavior = 'smooth'): void {\n if (!date) return;\n queueMicrotask(() => {\n const scroller = this.pastDayStripScroller?.nativeElement;\n if (!scroller) return;\n const el = scroller.querySelector(`[data-past-day=\"${date}\"]`) as HTMLElement | null;\n el?.scrollIntoView({ inline: 'center', block: 'nearest', behavior });\n });\n }\n}\n","<!-- Inline sync banner (floating above FAB when present) -->\n@if (syncMessage()) {\n <div class=\"toast success\"><i class=\"pi pi-check-circle\"></i> {{ syncMessage() }}</div>\n}\n@if (syncError() && !logDialogOpen()) {\n <div class=\"toast error\"><i class=\"pi pi-exclamation-triangle\"></i> {{ syncError() }}</div>\n}\n\n<!-- ============ BOTTLE PREP (card phẳng: cảnh báo + bình + countdown) ============ -->\n<section class=\"bottle-prep\">\n @if (!bottlePrepEditing()) {\n @if (bottlePrep() || bottlePrepWarning()) {\n <div class=\"bp-card\" [ngClass]=\"'bp-card--tone-' + bottlePrepBarTone()\">\n <div class=\"bp-card__headline\">\n <div class=\"bp-card__headline-main\">\n @if (bottlePrep(); as prep) {\n <div class=\"bp-card__line\">\n <strong class=\"bp-card__name\">{{ prep.user }}</strong>\n <span class=\"bp-card__muted\"> đã pha </span>\n <span class=\"bp-card__ml\">{{ prep.volumeMl }} ml</span>\n </div>\n } @else {\n <div class=\"bp-card__empty-lead\">\n <i class=\"pi pi-inbox\" aria-hidden=\"true\"></i>\n <span>Chưa ghi nhận sữa trong bình</span>\n </div>\n }\n </div>\n @if (bottlePrep() && bottlePrepWarning()?.type === 'expired') {\n <span class=\"bp-tag bp-tag--danger bp-card__headline-tag\">Hết hạn</span>\n }\n </div>\n @if (bottlePrepWarning(); as bw) {\n @if (bw.type !== 'expired') {\n <div class=\"bp-card__tags\">\n @switch (bw.type) {\n @case ('expiring-soon') {\n <span class=\"bp-tag bp-tag--soon\">Sắp hết hạn · còn {{ bw.minutes }} phút</span>\n }\n @case ('no-prep-late') {\n <span class=\"bp-tag bp-tag--danger\">Trễ cữ bú</span>\n }\n @case ('no-prep-soon') {\n <span class=\"bp-tag bp-tag--soon\">Sắp tới cữ bú</span>\n }\n }\n </div>\n }\n }\n @if (bottlePrep(); as prep) {\n <div class=\"bp-card__timeline\">\n <div class=\"bp-card__timeline-side bp-card__timeline-side--start\">\n <span class=\"bp-card__timeline-label\">Thời gian pha</span>\n <strong class=\"bp-card__timeline-value\">{{ formatBottleAt(prep.at) }}</strong>\n </div>\n <div class=\"bp-card__timeline-line\" aria-hidden=\"true\"></div>\n <div class=\"bp-card__timeline-side bp-card__timeline-side--end\">\n <span class=\"bp-card__timeline-label\">Thời gian đến hạn</span>\n <strong class=\"bp-card__timeline-value\">{{\n formatBottlePrepExpiryClock(prep.at)\n }}</strong>\n </div>\n </div>\n }\n <div\n class=\"bp-card__bar\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"bottlePrepBarPct()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"\n bottlePrep()\n ? 'Phần cửa sổ 1 giờ sau khi pha đã trôi qua'\n : 'Mức gấp tới cữ bú khi chưa có sữa trong bình'\n \"\n >\n <div class=\"bp-card__bar-fill\" [style.width.%]=\"bottlePrepBarPct()\"></div>\n </div>\n @if (bottlePrep()) {\n <div class=\"bp-card__countdown-row\">\n @if (bottlePrepFooterLeft()) {\n <p class=\"bp-card__countdown bp-card__countdown--row-main\">\n {{ bottlePrepFooterLeft() }}\n </p>\n }\n <p class=\"bp-card__countdown bp-card__countdown--row-since\">\n {{ bottlePrepSincePrepLabel() }}\n </p>\n </div>\n } @else {\n @if (bottlePrepCountdownLine()) {\n <p class=\"bp-card__countdown\">\n {{ bottlePrepCountdownLine() }}\n </p>\n }\n }\n <div class=\"bp-card__actions\">\n <div class=\"bp-card__toolbar\">\n @if (bottlePrepWarning()) {\n <button\n type=\"button\"\n class=\"bp-card__btn bp-card__btn--primary\"\n (click)=\"editBottlePrep()\"\n [title]=\"bottlePrep() ? 'Cập nhật ml hoặc pha sữa mới' : 'Ghi nhận sữa đã pha'\"\n >\n <i class=\"pi pi-plus\" aria-hidden=\"true\"></i>\n <span>{{ bottlePrep() ? 'Cập nhật bình' : 'Pha mới' }}</span>\n </button>\n }\n @if (bottlePrep() && !bottlePrepWarning()) {\n <button\n type=\"button\"\n class=\"bp-card__icon\"\n (click)=\"editBottlePrep()\"\n title=\"Sửa ml\"\n aria-label=\"Sửa ml\"\n >\n <i class=\"pi pi-pencil\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (bottlePrep()) {\n <button\n type=\"button\"\n class=\"bp-card__icon bp-card__icon--danger\"\n (click)=\"openBottlePrepClearConfirm()\"\n title=\"Xóa bình\"\n aria-label=\"Xóa bình\"\n >\n <i class=\"pi pi-trash\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n } @else {\n <button type=\"button\" class=\"bp-add\" (click)=\"editBottlePrep()\">\n <i class=\"pi pi-inbox\" aria-hidden=\"true\"></i>\n Lưu lượng sữa đã pha vào bình\n </button>\n }\n } @else {\n <div class=\"bp-card bp-card--editing\">\n <form class=\"bp-form\">\n <div class=\"bp-form-head\">\n <i class=\"pi pi-inbox\"></i>\n <label class=\"bp-label\">Sữa pha vào bình</label>\n </div>\n <div class=\"bp-input-wrap\">\n <button\n type=\"button\"\n class=\"bp-step\"\n [disabled]=\"bottlePrepSaving()\"\n (click)=\"adjustBottlePrepDraft(-5)\"\n title=\"Giảm 5ml\"\n aria-label=\"Giảm 5ml\"\n >\n <i class=\"pi pi-minus\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"4\"\n class=\"bp-input\"\n [value]=\"bottlePrepDraft()\"\n [disabled]=\"bottlePrepSaving()\"\n (input)=\"updateBottlePrepDraft($any($event.target).value)\"\n (keydown.enter)=\"saveBottlePrep(); $event.preventDefault()\"\n placeholder=\"100\"\n autocomplete=\"off\"\n autofocus\n />\n <span class=\"bp-unit\">ml</span>\n <button\n type=\"button\"\n class=\"bp-step\"\n [disabled]=\"bottlePrepSaving()\"\n (click)=\"adjustBottlePrepDraft(5)\"\n title=\"Tăng 5ml\"\n aria-label=\"Tăng 5ml\"\n >\n <i class=\"pi pi-plus\"></i>\n </button>\n </div>\n <div class=\"bp-quick\">\n <span class=\"bp-quick-label\">Nhanh:</span>\n <button\n type=\"button\"\n class=\"bp-quick-chip\"\n [disabled]=\"bottlePrepSaving()\"\n (click)=\"setBottlePrepDraft(60)\"\n >\n 60\n </button>\n <button\n type=\"button\"\n class=\"bp-quick-chip\"\n [disabled]=\"bottlePrepSaving()\"\n (click)=\"setBottlePrepDraft(80)\"\n >\n 80\n </button>\n <button\n type=\"button\"\n class=\"bp-quick-chip\"\n [disabled]=\"bottlePrepSaving()\"\n (click)=\"setBottlePrepDraft(100)\"\n >\n 100\n </button>\n <button\n type=\"button\"\n class=\"bp-quick-chip\"\n [disabled]=\"bottlePrepSaving()\"\n (click)=\"setBottlePrepDraft(120)\"\n >\n 120\n </button>\n <button\n type=\"button\"\n class=\"bp-quick-chip\"\n [disabled]=\"bottlePrepSaving()\"\n (click)=\"setBottlePrepDraft(150)\"\n >\n 150\n </button>\n </div>\n <div class=\"bp-form-actions\">\n <button\n type=\"button\"\n class=\"bp-btn primary\"\n [disabled]=\"bottlePrepSaving() || !bottlePrepDraft()\"\n [title]=\"bottlePrepSaving() ? 'Đang lưu...' : 'Lưu'\"\n (click)=\"saveBottlePrep()\"\n >\n <i\n class=\"pi\"\n [class.pi-check]=\"!bottlePrepSaving()\"\n [class.pi-spin]=\"bottlePrepSaving()\"\n [class.pi-spinner]=\"bottlePrepSaving()\"\n ></i>\n </button>\n <button\n type=\"button\"\n class=\"bp-btn\"\n [disabled]=\"bottlePrepSaving()\"\n (click)=\"cancelBottlePrep()\"\n title=\"Huỷ\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n </form>\n </div>\n }\n</section>\n\n<!-- Xác nhận xóa sữa đã pha (thủ công) -->\n@if (bottlePrepClearConfirmOpen()) {\n <div class=\"bp-clear-dialog-overlay\" (click)=\"closeBottlePrepClearConfirm()\" role=\"presentation\">\n <div class=\"bp-clear-dialog\" role=\"dialog\" aria-modal=\"true\" (click)=\"$event.stopPropagation()\">\n <h3 class=\"bp-clear-dialog__title\">Xóa sữa đã pha?</h3>\n @if (bottlePrep(); as p) {\n <p class=\"bp-clear-dialog__desc\">\n Bạn sắp xóa <strong>{{ p.volumeMl }}ml</strong> đã pha trong bình (ghi nhận lúc\n {{ formatBottleAt(p.at) }}).\n </p>\n }\n <label class=\"bp-clear-dialog__label\" for=\"bp-clear-reason\">Lý do (tuỳ chọn)</label>\n <div class=\"bp-clear-dialog__quick\">\n <span class=\"bp-clear-dialog__quick-label\">Gợi ý nhanh</span>\n <div class=\"bp-clear-dialog__quick-tags\">\n @for (tag of bottlePrepReasonQuickTags; track tag) {\n <button\n type=\"button\"\n class=\"bp-reason-chip\"\n [class.bp-reason-chip--active]=\"bottlePrepClearReasonDraft().trim() === tag\"\n [attr.aria-pressed]=\"bottlePrepClearReasonDraft().trim() === tag\"\n (click)=\"toggleBottlePrepClearReasonQuickTag(tag)\"\n >\n {{ tag }}\n </button>\n }\n </div>\n </div>\n <textarea\n id=\"bp-clear-reason\"\n class=\"bp-clear-dialog__textarea\"\n rows=\"3\"\n maxlength=\"500\"\n [value]=\"bottlePrepClearReasonDraft()\"\n (input)=\"updateBottlePrepClearReason($any($event.target).value)\"\n placeholder=\"Ví dụ: đổ đi, pha lại, hết hạn…\"\n ></textarea>\n <div class=\"bp-clear-dialog__actions\">\n <button type=\"button\" class=\"btn ghost small\" (click)=\"closeBottlePrepClearConfirm()\">\n Huỷ\n </button>\n <button\n type=\"button\"\n class=\"btn small bp-clear-dialog__confirm\"\n (click)=\"confirmClearBottlePrep()\"\n >\n Xóa\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Xác nhận đổi dung tích sữa đã pha -->\n@if (bottlePrepEditConfirmOpen()) {\n <div class=\"bp-clear-dialog-overlay\" (click)=\"closeBottlePrepEditConfirm()\" role=\"presentation\">\n <div class=\"bp-clear-dialog\" role=\"dialog\" aria-modal=\"true\" (click)=\"$event.stopPropagation()\">\n <h3 class=\"bp-clear-dialog__title\">Đổi lượng sữa đã pha?</h3>\n @if (bottlePrepEditPending(); as ep) {\n <p class=\"bp-clear-dialog__desc\">\n Lưu <strong>{{ ep.oldVolume }}ml</strong> → <strong>{{ ep.newVolume }}ml</strong> (ghi\n nhận lúc {{ ep.time }}).\n </p>\n }\n <label class=\"bp-clear-dialog__label\" for=\"bp-edit-reason\">Lý do (tuỳ chọn)</label>\n <div class=\"bp-clear-dialog__quick\">\n <span class=\"bp-clear-dialog__quick-label\">Gợi ý nhanh</span>\n <div class=\"bp-clear-dialog__quick-tags\">\n @for (tag of bottlePrepReasonQuickTags; track tag) {\n <button\n type=\"button\"\n class=\"bp-reason-chip\"\n [class.bp-reason-chip--active]=\"bottlePrepEditReasonDraft().trim() === tag\"\n [attr.aria-pressed]=\"bottlePrepEditReasonDraft().trim() === tag\"\n (click)=\"toggleBottlePrepEditReasonQuickTag(tag)\"\n >\n {{ tag }}\n </button>\n }\n </div>\n </div>\n <textarea\n id=\"bp-edit-reason\"\n class=\"bp-clear-dialog__textarea\"\n rows=\"3\"\n maxlength=\"500\"\n [value]=\"bottlePrepEditReasonDraft()\"\n (input)=\"updateBottlePrepEditReason($any($event.target).value)\"\n placeholder=\"Ví dụ: bé uống ít hơn dự kiến, đổi loại sữa…\"\n ></textarea>\n <div class=\"bp-clear-dialog__actions\">\n <button type=\"button\" class=\"btn ghost small\" (click)=\"closeBottlePrepEditConfirm()\">\n Huỷ\n </button>\n <button type=\"button\" class=\"btn primary small\" (click)=\"confirmBottlePrepEditSave()\">\n Lưu\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Xác nhận xóa cữ bú -->\n@if (feedingDeleteConfirmLog(); as deleteLog) {\n <div class=\"bp-clear-dialog-overlay\" (click)=\"closeFeedingDeleteConfirm()\" role=\"presentation\">\n <div class=\"bp-clear-dialog\" role=\"dialog\" aria-modal=\"true\" (click)=\"$event.stopPropagation()\">\n <h3 class=\"bp-clear-dialog__title\">Xóa cữ bú?</h3>\n <p class=\"bp-clear-dialog__desc\">\n Bạn sắp xóa <strong>{{ deleteLog.volume }}ml</strong> lúc\n <strong>{{ deleteLog.time }}</strong> ngày\n <strong>{{ formatDateDisplay(deleteLog.date) }}</strong\n >.\n </p>\n <label class=\"bp-clear-dialog__label\" for=\"feeding-delete-reason\">Lý do (tuỳ chọn)</label>\n <div class=\"bp-clear-dialog__quick\">\n <span class=\"bp-clear-dialog__quick-label\">Gợi ý nhanh</span>\n <div class=\"bp-clear-dialog__quick-tags\">\n @for (tag of feedingDeleteReasonQuickTags; track tag) {\n <button\n type=\"button\"\n class=\"bp-reason-chip\"\n [class.bp-reason-chip--active]=\"feedingDeleteReasonDraft().trim() === tag\"\n [attr.aria-pressed]=\"feedingDeleteReasonDraft().trim() === tag\"\n [disabled]=\"feedingDeleteSaving()\"\n (click)=\"toggleFeedingDeleteReasonQuickTag(tag)\"\n >\n {{ tag }}\n </button>\n }\n </div>\n </div>\n <textarea\n id=\"feeding-delete-reason\"\n class=\"bp-clear-dialog__textarea\"\n rows=\"3\"\n maxlength=\"500\"\n [value]=\"feedingDeleteReasonDraft()\"\n [disabled]=\"feedingDeleteSaving()\"\n (input)=\"updateFeedingDeleteReason($any($event.target).value)\"\n placeholder=\"Ví dụ: nhập nhầm, trùng cữ, bé không bú…\"\n ></textarea>\n <div class=\"bp-clear-dialog__actions\">\n <button\n type=\"button\"\n class=\"btn ghost small\"\n [disabled]=\"feedingDeleteSaving()\"\n (click)=\"closeFeedingDeleteConfirm()\"\n >\n Huỷ\n </button>\n <button\n type=\"button\"\n class=\"btn small bp-clear-dialog__confirm\"\n [disabled]=\"feedingDeleteSaving()\"\n (click)=\"confirmDeleteFeedingLog()\"\n >\n {{ feedingDeleteSaving() ? 'Đang xóa…' : 'Xóa' }}\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- ============ BURP WARNING ============ -->\n@if (burpInsight(); as bw) {\n <div class=\"burp-warning\" [attr.data-state]=\"bw.state\">\n <div class=\"burp-warning__icon\">\n <i\n class=\"pi\"\n [class.pi-heart-fill]=\"bw.state === 'active'\"\n [class.pi-moon]=\"bw.state === 'done'\"\n ></i>\n </div>\n <div class=\"burp-warning__content\">\n @if (bw.state === 'active') {\n <div class=\"burp-warning__title\">Đang trong thời gian vỗ ợ</div>\n }\n @if (bw.state === 'done') {\n <div class=\"burp-warning__title\">Hoàn tất vỗ ợ</div>\n }\n <div class=\"burp-warning__text\">\n Bé bú <strong>{{ bw.lastFeedVolume }}ml</strong> lúc <strong>{{ bw.lastFeedTime }}</strong\n >.\n @if (bw.state === 'active') {\n Tiếp tục bế bé thêm <strong>{{ bw.remainingMinutes }} phút</strong>.\n }\n @if (bw.state === 'done') {\n Đã qua mốc vỗ ợ {{ bw.burpDuration }} phút.\n }\n </div>\n <div\n class=\"burp-warning__progress\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"burpProgressPct()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div class=\"burp-warning__progress-fill\" [style.width.%]=\"burpProgressPct()\"></div>\n </div>\n @if (bw.state === 'active') {\n <div class=\"burp-warning__footer\">\n <i class=\"pi pi-clock\"></i>\n Còn <strong>{{ bw.remainingMinutes }}</strong> phút là đủ thời gian vỗ ợ.\n </div>\n }\n @if (bw.state === 'done') {\n <div class=\"burp-warning__footer burp-warning__footer--done\">\n <i class=\"pi pi-star-fill\"></i>\n Chúc bé ngủ ngon sau cữ bú này nhé.\n <button\n type=\"button\"\n class=\"burp-warning__dismiss\"\n (click)=\"closeBurpDoneBanner()\"\n aria-label=\"Đóng thông báo hoàn tất vỗ ợ\"\n title=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n}\n\n<!-- ============ ML PREDICTION (simplified) ============ -->\n@if (logs().length > 0) {\n @if (prediction().hasData && prediction().nextTime) {\n <!-- Hero countdown -->\n <div class=\"countdown-hero\" [attr.data-status]=\"countdownStatus()\">\n <!-- Zone A — status badge (top band) -->\n <div class=\"hero-band\">\n <!-- Watermark SVG icon -->\n <svg class=\"hero-watermark\" viewBox=\"0 0 100 100\" aria-hidden=\"true\">\n @switch (countdownStatus()) {\n @case ('now') {\n <path\n d=\"M50,8 L56,35 L84,35 L62,52 L70,80 L50,63 L30,80 L38,52 L16,35 L44,35 Z\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linejoin=\"round\"\n />\n }\n @case ('late') {\n <path\n d=\"M50,10 L90,85 L10,85 Z M50,35 L50,60 M50,70 L50,75\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n }\n @default {\n <path\n d=\"M50,10 A40,40 0 1,1 49.9,10 Z M50,22 A28,28 0 1,1 49.9,22 Z M50,36 L50,50 M50,36 L62,28\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n />\n }\n }\n </svg>\n\n @switch (countdownStatus()) {\n @case ('late') {\n <span class=\"status-badge status-late\">\n <i class=\"pi pi-exclamation-circle\"></i> Đã quá giờ bú lúc\n </span>\n }\n @case ('now') {\n <span class=\"status-badge status-now\">\n <i class=\"pi pi-exclamation-triangle\"></i> Sắp tới giờ bú lúc\n </span>\n }\n @default {\n <span class=\"status-badge status-waiting\">\n <i class=\"pi pi-clock\"></i> Cữ bú tiếp theo lúc\n </span>\n }\n }\n </div>\n\n <!-- Zone B+C / Zone E — main body row -->\n <div class=\"hero-main\">\n <!-- Left: big time + countdown -->\n <div class=\"hero-time\">\n <div class=\"predicted-time\">{{ prediction().nextTime }}</div>\n <div class=\"time-remaining\">{{ timeUntilNext() || '—' }}</div>\n </div>\n\n <!-- Right: volume panel -->\n <div class=\"volume-info\" [attr.data-status]=\"countdownStatus()\">\n <div class=\"volume-item predicted-row\">\n <span class=\"volume-prefix\">Dự kiến</span>\n <span class=\"volume-amount\">{{ prediction().nextVolume }}<em>ml</em></span>\n </div>\n <div class=\"volume-item recommended-row\">\n <span class=\"volume-prefix\">Khuyến nghị</span>\n @if (nextFeedingRecommendation().hasNutritionData) {\n <span class=\"volume-amount\"\n >{{ nextFeedingRecommendation().recommendedMl }}<em>ml</em></span\n >\n } @else {\n <span class=\"volume-amount volume-empty\">—</span>\n }\n </div>\n </div>\n </div>\n\n <!-- Zone F — progress bar -->\n @if (lastFeeding(); as last) {\n <div class=\"countdown-progress\">\n <div class=\"cp-track\">\n <div\n class=\"cp-fill\"\n [attr.data-status]=\"countdownStatus()\"\n [style.width.%]=\"countdownProgress()\"\n ></div>\n <div class=\"cp-shimmer\"></div>\n </div>\n <div class=\"cp-labels\">\n <span class=\"cp-left\">\n <i class=\"pi pi-history\"></i>\n {{ last.time }} · {{ last.volume }}ml\n <span class=\"muted\">({{ lastFeedingAgo() }})</span>\n </span>\n <span class=\"cp-right\">TB {{ predictionMedianIntervalHuman() }}</span>\n </div>\n </div>\n }\n </div>\n } @else {\n @if (lastFeeding(); as last) {\n <div class=\"last-feed\">\n <div class=\"last-feed-icon\"><i class=\"pi pi-history\"></i></div>\n <div class=\"last-feed-body\">\n <div class=\"last-feed-label\">Cữ gần nhất</div>\n <div class=\"last-feed-value\">\n <strong>{{ last.volume }}ml</strong>\n <span class=\"sep\">·</span>\n <span>{{ last.time }}</span>\n <span class=\"sep\">·</span>\n <span class=\"ago\">{{ lastFeedingAgo() }}</span>\n </div>\n </div>\n </div>\n }\n <div class=\"predict-empty\">\n <i class=\"pi pi-info-circle\"></i>\n Cần thêm vài cữ bú nữa để dự đoán giờ/dung tích tiếp theo.\n </div>\n }\n}\n\n<!-- ============ COMPARISON ============ -->\n<section class=\"compare-grid\">\n <div class=\"card day-card today\">\n <div class=\"day-head\">\n <div>\n <div class=\"eyebrow\">Hôm nay</div>\n <h3>{{ formatDateDisplay(todayDateStr()) }}</h3>\n </div>\n <div class=\"big-total\">\n <span class=\"num\">{{ todayStats().total }}</span>\n <span class=\"unit\">ml</span>\n </div>\n </div>\n\n <div class=\"day-stats\">\n <div><i class=\"pi pi-th-list\"></i> {{ todayStats().count }} cữ</div>\n @if (todayStats().count > 0) {\n <div><i class=\"pi pi-chart-bar\"></i> TB {{ todayStats().avg }}ml</div>\n }\n @if (todayStats().count > 0) {\n <div><i class=\"pi pi-arrow-up\"></i> Cao nhất {{ todayStats().max }}ml</div>\n }\n @if (todayStats().firstTime) {\n <div><i class=\"pi pi-clock\"></i> Lần đầu {{ todayStats().firstTime }}</div>\n }\n </div>\n\n @if (\n todayStats().count > 0 &&\n (yesterdayUpToNowStats().total > 0 || priorThreeDaysUpToNowAvg().avgTotal > 0)\n ) {\n <div class=\"compare-banner\">\n <!-- So sánh với hôm qua -->\n @if (yesterdayUpToNowStats().total > 0) {\n <div class=\"compare-row\">\n <div class=\"compare-stats\">\n <span class=\"label\">Hôm qua:</span>\n <strong>{{ yesterdayUpToNowStats().total }}ml</strong>\n <span class=\"count\">({{ yesterdayUpToNowStats().count }} cữ)</span>\n </div>\n @if (comparison().totalDiff !== 0) {\n <div class=\"compare-change\">\n <i\n class=\"pi\"\n [class.pi-arrow-up]=\"comparison().totalDiff > 0\"\n [class.pi-arrow-down]=\"comparison().totalDiff < 0\"\n [class.up]=\"comparison().totalDiff > 0\"\n [class.down]=\"comparison().totalDiff < 0\"\n ></i>\n <strong>{{ Math.abs(comparison().totalDiff) }}ml</strong>\n @if (comparison().pct !== null) {\n <span>({{ Math.abs(comparison().pct!) }}%)</span>\n }\n </div>\n }\n </div>\n }\n <!-- So sánh với TB 3 ngày -->\n @if (priorThreeDaysUpToNowAvg().avgTotal > 0) {\n <div class=\"compare-row\">\n <div class=\"compare-stats\">\n <span class=\"label\">TB 3 ngày:</span>\n <strong>{{ priorThreeDaysUpToNowAvg().avgTotal }}ml</strong>\n <span class=\"count\">({{ priorThreeDaysUpToNowAvg().avgCount }} cữ)</span>\n </div>\n @if (comparisonVsPrior3Avg().totalDiff !== 0) {\n <div class=\"compare-change\">\n <i\n class=\"pi\"\n [class.pi-arrow-up]=\"comparisonVsPrior3Avg().totalDiff > 0\"\n [class.pi-arrow-down]=\"comparisonVsPrior3Avg().totalDiff < 0\"\n [class.up]=\"comparisonVsPrior3Avg().totalDiff > 0\"\n [class.down]=\"comparisonVsPrior3Avg().totalDiff < 0\"\n ></i>\n <strong>{{ Math.abs(comparisonVsPrior3Avg().totalDiff) }}ml</strong>\n @if (comparisonVsPrior3Avg().pct !== null) {\n <span>({{ Math.abs(comparisonVsPrior3Avg().pct!) }}%)</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Today's logs (collapsed) -->\n @if (todayLogs().length > 0) {\n <div class=\"today-logs\">\n <div class=\"logs-header\">\n <span>Các cữ bú hôm nay</span>\n @if (todayLogs().length > 2) {\n <button type=\"button\" class=\"logs-more\" (click)=\"openHistoryDialog('today')\">\n Xem tất cả {{ todayLogs().length }}\n <i class=\"pi pi-chevron-right\"></i>\n </button>\n }\n </div>\n <div class=\"log-list\">\n @for (g of todayLogsPreview(); track trackFeedingViewGroup($index, g)) {\n <div\n class=\"log-row log-row--clickable\"\n [class.low-volume]=\"isLowVolumeViewGroup(g)\"\n [class.high-volume]=\"isHighVolumeViewGroup(g)\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onFeedRowClick(g)\"\n (keydown.enter)=\"onFeedRowClick(g)\"\n (keydown.space)=\"$event.preventDefault(); onFeedRowClick(g)\"\n >\n <span class=\"log-time log-time--with-badge\">\n {{ viewGroupDisplayTime(g) }}\n @if (g.members.length > 1) {\n <button\n type=\"button\"\n class=\"log-merge-badge\"\n (click)=\"openFeedGroupDetail(g); $event.stopPropagation()\"\n title=\"Xem các cữ đã gom\"\n >\n {{ g.members.length }} cữ\n </button>\n }\n </span>\n <span class=\"log-volume\">{{ viewGroupDisplayVolume(g) }}ml</span>\n @if (formatIntervalFromPrevViewGroup(g, todayLogViewGroups()); as iv) {\n <span\n class=\"log-gap\"\n [class.feed-gap-warn]=\"isFeedTimeGapWarningViewGroup(g, todayLogViewGroups())\"\n >\n <i class=\"pi pi-clock\"></i> {{ iv }}\n </span>\n }\n @if (viewGroupNote(g); as vn) {\n <span class=\"log-note\">· {{ vn }}</span>\n }\n @if (g.members.length === 1 && g.members[0].rowIndex) {\n <div class=\"log-actions\">\n <button\n class=\"log-edit\"\n (click)=\"openEditDialog(g.members[0]); $event.stopPropagation()\"\n title=\"Sửa cữ bú này\"\n aria-label=\"Sửa cữ bú\"\n >\n <i class=\"pi pi-pencil\"></i>\n </button>\n <button\n class=\"log-del\"\n (click)=\"deleteLog(g.members[0]); $event.stopPropagation()\"\n title=\"Xoá cữ bú này\"\n aria-label=\"Xoá cữ bú\"\n >\n <i class=\"pi pi-trash\"></i>\n </button>\n </div>\n }\n @if (g.members.length > 1) {\n <div class=\"log-actions\">\n <button\n class=\"log-edit\"\n (click)=\"openFeedGroupDetail(g); $event.stopPropagation()\"\n title=\"Chi tiết các cữ đã gom\"\n aria-label=\"Chi tiết gom nhóm\"\n >\n <i class=\"pi pi-list\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (todayLogs().length === 0 && !loadingLogs()) {\n <div class=\"empty-mini\">Chưa có cữ bú nào hôm nay. Ghi lại cữ đầu tiên ở form trên nhé!</div>\n }\n </div>\n\n <div class=\"card day-card yesterday\">\n <div class=\"day-date-nav-wrap\">\n @if (pastDayViewShowReset()) {\n <button\n type=\"button\"\n class=\"day-date-nav-reset\"\n (click)=\"pastDayViewReset()\"\n aria-label=\"Về hôm qua\"\n title=\"Về hôm qua\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n }\n <nav class=\"day-date-strip\" aria-label=\"Chọn ngày xem lịch sử\">\n <button\n type=\"button\"\n class=\"day-date-strip-arrow\"\n (click)=\"pastDayViewSelectPrev()\"\n [disabled]=\"!pastDayViewCanSelectPrev()\"\n aria-label=\"Chọn ngày trước\"\n >\n <i class=\"pi pi-chevron-left\"></i>\n </button>\n <div class=\"day-date-strip-scroller\" #pastDayStripScroller>\n @for (d of pastDayStripItems(); track trackPastDayStripItem($index, d)) {\n <button\n type=\"button\"\n class=\"day-date-strip-day\"\n [class.active]=\"d.date === pastDayViewDate()\"\n [attr.data-past-day]=\"d.date\"\n (click)=\"selectPastDayView(d.date)\"\n [attr.aria-label]=\"'Ngày ' + d.dateLabel + ', ' + d.mlLabel\"\n [attr.aria-current]=\"d.date === pastDayViewDate() ? 'date' : null\"\n >\n <span class=\"day-date-strip-date\">{{ d.dateLabel }}</span>\n <span class=\"day-date-strip-ml\" [class.empty]=\"d.total === 0\">{{ d.mlLabel }}</span>\n </button>\n }\n </div>\n <button\n type=\"button\"\n class=\"day-date-strip-arrow\"\n (click)=\"pastDayViewSelectNext()\"\n [disabled]=\"!pastDayViewCanSelectNext()\"\n aria-label=\"Chọn ngày sau\"\n >\n <i class=\"pi pi-chevron-right\"></i>\n </button>\n </nav>\n </div>\n\n <div class=\"day-head\">\n <div>\n <div class=\"eyebrow\">{{ pastDayRelativeLabel() }}</div>\n <h3>\n {{ formatDayLabel(pastDayViewDate()) }} · {{ formatDateDisplay(pastDayViewDate()) }}\n </h3>\n </div>\n <div class=\"big-total\">\n <span class=\"num\">{{ pastDayViewStats().total }}</span>\n <span class=\"unit\">ml</span>\n </div>\n </div>\n\n <div class=\"day-stats\">\n <div><i class=\"pi pi-th-list\"></i> {{ pastDayViewStats().count }} cữ</div>\n @if (pastDayViewStats().count > 0) {\n <div><i class=\"pi pi-chart-bar\"></i> TB {{ pastDayViewStats().avg }}ml</div>\n }\n @if (pastDayViewStats().count > 0) {\n <div><i class=\"pi pi-arrow-up\"></i> Cao nhất {{ pastDayViewStats().max }}ml</div>\n }\n @if (pastDayViewStats().firstTime) {\n <div>\n <i class=\"pi pi-clock\"></i> {{ pastDayViewStats().firstTime }} →\n {{ pastDayViewStats().lastTime }}\n </div>\n }\n </div>\n\n <!-- Past day logs (collapsed) -->\n @if (pastDayViewLogs().length > 0) {\n <div class=\"today-logs\">\n <div class=\"logs-header\">\n <span>Các cữ bú {{ formatDateDisplay(pastDayViewDate()) }}</span>\n @if (pastDayViewLogs().length > 2) {\n <button\n type=\"button\"\n class=\"logs-more\"\n (click)=\"openHistoryDialog('date', pastDayViewDate())\"\n >\n Xem tất cả {{ pastDayViewLogs().length }}\n <i class=\"pi pi-chevron-right\"></i>\n </button>\n }\n </div>\n @if (pastDayViewLogViewGroups(); as pastDayGroups) {\n <div class=\"log-list\">\n @for (g of pastDayViewLogsPreview(); track trackFeedingViewGroup($index, g)) {\n <div\n class=\"log-row log-row--clickable\"\n [class.low-volume]=\"isLowVolumeViewGroup(g)\"\n [class.high-volume]=\"isHighVolumeViewGroup(g)\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onFeedRowClick(g)\"\n (keydown.enter)=\"onFeedRowClick(g)\"\n (keydown.space)=\"$event.preventDefault(); onFeedRowClick(g)\"\n >\n <span class=\"log-time log-time--with-badge\">\n {{ viewGroupDisplayTime(g) }}\n @if (g.members.length > 1) {\n <button\n type=\"button\"\n class=\"log-merge-badge\"\n (click)=\"openFeedGroupDetail(g); $event.stopPropagation()\"\n title=\"Xem các cữ đã gom\"\n >\n {{ g.members.length }} cữ\n </button>\n }\n </span>\n <span class=\"log-volume\">{{ viewGroupDisplayVolume(g) }}ml</span>\n @if (formatIntervalFromPrevViewGroup(g, pastDayGroups); as iv) {\n <span\n class=\"log-gap\"\n [class.feed-gap-warn]=\"isFeedTimeGapWarningViewGroup(g, pastDayGroups)\"\n >\n <i class=\"pi pi-clock\"></i> {{ iv }}\n </span>\n }\n @if (viewGroupNote(g); as vn) {\n <span class=\"log-note\">· {{ vn }}</span>\n }\n @if (g.members.length === 1 && g.members[0].rowIndex) {\n <div class=\"log-actions\">\n <button\n class=\"log-edit\"\n (click)=\"openEditDialog(g.members[0]); $event.stopPropagation()\"\n title=\"Sửa cữ bú này\"\n aria-label=\"Sửa cữ bú\"\n >\n <i class=\"pi pi-pencil\"></i>\n </button>\n <button\n class=\"log-del\"\n (click)=\"deleteLog(g.members[0]); $event.stopPropagation()\"\n title=\"Xoá cữ bú này\"\n aria-label=\"Xoá cữ bú\"\n >\n <i class=\"pi pi-trash\"></i>\n </button>\n </div>\n }\n @if (g.members.length > 1) {\n <div class=\"log-actions\">\n <button\n class=\"log-edit\"\n (click)=\"openFeedGroupDetail(g); $event.stopPropagation()\"\n title=\"Chi tiết các cữ đã gom\"\n aria-label=\"Chi tiết gom nhóm\"\n >\n <i class=\"pi pi-list\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n @if (pastDayViewStats().count === 0) {\n <div class=\"empty-mini\">Chưa có dữ liệu cho ngày này.</div>\n }\n </div>\n</section>\n<ng-content select=\"[data-feeding-charts]\"></ng-content>\n<!-- ============ RECENT FEEDINGS (collapsed) ============ -->\n@if (logs().length > 0) {\n <section class=\"card feed-list-card\">\n <div class=\"feed-list-head\">\n <div>\n <div class=\"eyebrow\"><i class=\"pi pi-list\"></i> Lịch sử cữ bú</div>\n <h2>Cữ bú gần đây</h2>\n </div>\n <button type=\"button\" class=\"btn ghost small\" (click)=\"openHistoryDialog()\">\n <i class=\"pi pi-external-link\"></i>\n Xem tất cả ({{ logs().length }})\n </button>\n </div>\n <div class=\"feed-list-compact\">\n @for (g of recentFeedViewGroups(); track trackFeedingViewGroup($index, g)) {\n <div\n class=\"feed-row feed-row--clickable\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onFeedRowClick(g)\"\n (keydown.enter)=\"onFeedRowClick(g)\"\n (keydown.space)=\"$event.preventDefault(); onFeedRowClick(g)\"\n >\n <div class=\"feed-row-time\">\n <div class=\"time time--with-badge\">\n {{ viewGroupDisplayTime(g) }}\n @if (g.members.length > 1) {\n <button\n type=\"button\"\n class=\"feed-merge-badge\"\n (click)=\"openFeedGroupDetail(g); $event.stopPropagation()\"\n title=\"Xem các cữ đã gom\"\n >\n {{ g.members.length }} cữ\n </button>\n }\n </div>\n <div class=\"date\">\n {{ formatDateShort(g.members[g.members.length - 1].date) }}\n </div>\n @if (formatIntervalFromPrevViewGroup(g, recentFeedViewGroups()); as ivR) {\n <div\n class=\"feed-row-gap\"\n [class.feed-gap-warn]=\"isFeedTimeGapWarningViewGroup(g, recentFeedViewGroups())\"\n >\n <i class=\"pi pi-clock\"></i> {{ ivR }}\n </div>\n }\n </div>\n <div class=\"feed-row-volume\">\n <strong>{{ viewGroupDisplayVolume(g) }}</strong>\n <span class=\"u\">ml</span>\n </div>\n @if (viewGroupNote(g)) {\n <div class=\"feed-row-note\">\n {{ viewGroupNote(g) }}\n </div>\n } @else {\n <div class=\"feed-row-note muted\">—</div>\n }\n @if (g.members.length === 1 && g.members[0].rowIndex) {\n <div class=\"feed-row-actions\">\n <button\n class=\"feed-row-edit\"\n (click)=\"openEditDialog(g.members[0]); $event.stopPropagation()\"\n title=\"Sửa cữ này\"\n aria-label=\"Sửa cữ bú\"\n >\n <i class=\"pi pi-pencil\"></i>\n </button>\n <button\n class=\"feed-row-del\"\n (click)=\"deleteLog(g.members[0]); $event.stopPropagation()\"\n title=\"Xoá cữ này\"\n aria-label=\"Xoá cữ bú\"\n >\n <i class=\"pi pi-trash\"></i>\n </button>\n </div>\n }\n @if (g.members.length > 1) {\n <div class=\"feed-row-actions\">\n <button\n class=\"feed-row-edit\"\n (click)=\"openFeedGroupDetail(g); $event.stopPropagation()\"\n title=\"Chi tiết các cữ đã gom\"\n aria-label=\"Chi tiết gom nhóm\"\n >\n <i class=\"pi pi-list\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n </section>\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { map, catchError, switchMap } from 'rxjs/operators';\nimport { environment } from '../../environments/environment';\n\nexport interface GoogleSheetConfig {\n spreadsheetId: string;\n sheetName?: string;\n sheetGid?: string;\n range?: string;\n}\n\nexport interface GoogleSheetMetadata {\n sheets: Array<{\n properties: {\n sheetId: number;\n title: string;\n index: number;\n };\n }>;\n}\n\nexport interface GoogleSheetValuesResponse {\n range: string;\n majorDimension: string;\n values: string[][];\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GoogleSheetsService {\n private http = inject(HttpClient);\n private readonly API_KEY = environment.googleSheetsApiKey;\n\n /**\n * Get values from a Google Sheet with flexible configuration\n */\n getSheetValues(config: GoogleSheetConfig): Observable<string[][]> {\n if (!this.API_KEY) {\n return throwError(() => new Error('Google Sheets API key not configured'));\n }\n\n const baseUrl = `https://sheets.googleapis.com/v4/spreadsheets/${config.spreadsheetId}`;\n\n // If we have a sheet name, use it directly\n if (config.sheetName) {\n const range = config.range || 'A:Z';\n const fullRange = `'${config.sheetName}'!${range}`;\n return this.fetchValues(baseUrl, fullRange);\n }\n\n // If we have a GID, find the sheet name first\n if (config.sheetGid) {\n return this.getSheetNameByGid(baseUrl, config.sheetGid).pipe(\n switchMap((sheetName) => {\n const range = config.range || 'A:Z';\n const fullRange = `'${sheetName}'!${range}`;\n return this.fetchValues(baseUrl, fullRange);\n })\n );\n }\n\n return throwError(() => new Error('Either sheetName or sheetGid must be provided'));\n }\n\n /**\n * Get sheet metadata including all sheet names and IDs\n */\n getSheetMetadata(spreadsheetId: string): Observable<GoogleSheetMetadata> {\n if (!this.API_KEY) {\n return throwError(() => new Error('Google Sheets API key not configured'));\n }\n\n const url = `https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}?key=${this.API_KEY}&fields=sheets(properties(sheetId,title,index))`;\n\n return this.http.get<GoogleSheetMetadata>(url).pipe(catchError(this.handleError));\n }\n\n /**\n * Find sheet name by GID\n */\n private getSheetNameByGid(baseUrl: string, gid: string): Observable<string> {\n const metadataUrl = `${baseUrl}?key=${this.API_KEY}&fields=sheets(properties(sheetId,title))`;\n\n return this.http.get<GoogleSheetMetadata>(metadataUrl).pipe(\n map((metadata) => {\n const targetSheet = metadata.sheets.find(\n (sheet) => sheet.properties.sheetId.toString() === gid\n );\n\n if (!targetSheet) {\n throw new Error(`Sheet with GID ${gid} not found`);\n }\n\n return targetSheet.properties.title;\n }),\n catchError(this.handleError)\n );\n }\n\n /**\n * Fetch values from a specific range\n */\n private fetchValues(baseUrl: string, range: string): Observable<string[][]> {\n const url = `${baseUrl}/values/${encodeURIComponent(range)}?key=${this.API_KEY}&valueRenderOption=FORMATTED_VALUE`;\n\n return this.http.get<GoogleSheetValuesResponse>(url).pipe(\n map((response) => response.values || []),\n catchError(this.handleError)\n );\n }\n\n /**\n * Handle HTTP errors with user-friendly messages\n */\n private handleError = (error: HttpErrorResponse) => {\n let errorMessage = 'An error occurred while accessing Google Sheets';\n\n if (error.status === 400) {\n errorMessage = 'Invalid request to Google Sheets API';\n } else if (error.status === 403) {\n errorMessage = 'Access denied to Google Sheets. Check API key permissions.';\n } else if (error.status === 404) {\n errorMessage = 'Google Sheet not found or does not exist';\n } else if (error.error?.error?.message) {\n errorMessage = error.error.error.message;\n }\n\n console.error('GoogleSheetsService error:', error);\n return throwError(() => new Error(errorMessage));\n };\n}\n","/** Metadữ loại sự kiện — nguồn duy nhất cho union `MedicalEventKind` */\nexport const MEDICAL_KINDS = [\n {\n id: 'vaccine',\n label: 'Tiêm chủng / vaccine',\n shortLabel: 'Tiêm',\n icon: 'pi pi-shield',\n color: '#0ea5e9',\n },\n {\n id: 'checkup',\n label: 'Khám định kỳ / soi chiếu',\n shortLabel: 'Khám',\n icon: 'pi pi-user-plus',\n color: '#22c55e',\n },\n {\n id: 'medication',\n label: 'Thuốc / kê đơn',\n shortLabel: 'Thuốc',\n icon: 'pi pi-tablet',\n color: '#a855f7',\n },\n {\n id: 'illness',\n label: 'Ốm / sốt / triệu chứng',\n shortLabel: 'Ốm',\n icon: 'pi pi-exclamation-circle',\n color: '#f97316',\n },\n {\n id: 'lab',\n label: 'Xét nghiệm / kết quả',\n shortLabel: 'Xét nghiệm',\n icon: 'pi pi-chart-bar',\n color: '#6366f1',\n },\n {\n id: 'allergy',\n label: 'Dị ứng / phản ứng thuốc',\n shortLabel: 'Dị ứng',\n icon: 'pi pi-ban',\n color: '#dc2626',\n },\n {\n id: 'dental',\n label: 'Răng miệng / nha khoa',\n shortLabel: 'Nha',\n icon: 'pi pi-circle-fill',\n color: '#14b8a6',\n },\n {\n id: 'ent',\n label: 'Tai — Mũi — Họng',\n shortLabel: 'TMH',\n icon: 'pi pi-volume-up',\n color: '#0891b2',\n },\n {\n id: 'dermatology',\n label: 'Da liễu',\n shortLabel: 'Da',\n icon: 'pi pi-heart-fill',\n color: '#db2777',\n },\n {\n id: 'vision',\n label: 'Mắt / nhãn khoa',\n shortLabel: 'Mắt',\n icon: 'pi pi-eye',\n color: '#2563eb',\n },\n {\n id: 'hearing',\n label: 'Thính lực',\n shortLabel: 'Thính',\n icon: 'pi pi-volume-down',\n color: '#7c3aed',\n },\n {\n id: 'emergency',\n label: 'Cấp cứu / ER',\n shortLabel: 'Cấp cứu',\n icon: 'pi pi-bolt',\n color: '#b91c1c',\n },\n {\n id: 'surgery',\n label: 'Phẫu thuật / tiểu phẫu',\n shortLabel: 'PT',\n icon: 'pi pi-cog',\n color: '#475569',\n },\n {\n id: 'therapy',\n label: 'Vật lý trị liệu / PHCN',\n shortLabel: 'VLTL',\n icon: 'pi pi-replay',\n color: '#059669',\n },\n {\n id: 'nutrition',\n label: 'Dinh dưỡng / tư vấn sữa',\n shortLabel: 'Dinh dưỡng',\n icon: 'pi pi-apple',\n color: '#65a30d',\n },\n {\n id: 'screening',\n label: 'Sàng lọc / khám lưới',\n shortLabel: 'Sàng lọc',\n icon: 'pi pi-list-check',\n color: '#0284c7',\n },\n {\n id: 'mental',\n label: 'Tâm lý / thần kinh',\n shortLabel: 'Tâm lý',\n icon: 'pi pi-comments',\n color: '#8b5cf6',\n },\n {\n id: 'home_care',\n label: 'Chăm sóc tại nhà / điều dưỡng',\n shortLabel: 'Tại nhà',\n icon: 'pi pi-home',\n color: '#ca8a04',\n },\n {\n id: 'follow_up',\n label: 'Tái khám / theo dõi',\n shortLabel: 'Tái khám',\n icon: 'pi pi-calendar-plus',\n color: '#ea580c',\n },\n {\n id: 'other',\n label: 'Khác',\n shortLabel: 'Khác',\n icon: 'pi pi-bookmark',\n color: '#64748b',\n },\n] as const;\n\nexport type MedicalEventKind = (typeof MEDICAL_KINDS)[number]['id'];\nexport type MedicalKindMeta = (typeof MEDICAL_KINDS)[number];\n\nexport function kindMeta(kind: MedicalEventKind): MedicalKindMeta {\n const found = MEDICAL_KINDS.find((k) => k.id === kind);\n return found ?? MEDICAL_KINDS[MEDICAL_KINDS.length - 1];\n}\n","import { Injectable } from '@angular/core';\nimport { MedicalEventKind, MedicalHistoryEntry } from '../../../services/medical-history.service';\nimport { MEDICAL_KINDS } from './medical-history-kinds.data';\n\n/**\n * Service to map Google Sheets raw data to MedicalHistoryEntry objects\n * Handles data validation, date parsing, and type mapping\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class MedicalDataMapperService {\n private readonly KIND_SET = new Set<string>(MEDICAL_KINDS.map((k) => k.id as string));\n\n /**\n * Map Google Sheets row data to MedicalHistoryEntry\n * Expected columns:\n * A: User\n * B: Ngày (Date in DD/MM/YYYY format)\n * C: Loại (Type/Kind)\n * D: Tiêu đề (Title)\n * E: Chi tiết (Details)\n * F: Nơi khám (Place)\n * G: Google Drive file ID (Attachment ID)\n */\n mapRowToEntry(row: string[], rowIndex: number): MedicalHistoryEntry | null {\n if (!row || row.length < 4) {\n return null;\n }\n\n const rowUser = (row[0] || '').trim();\n const dateStr = (row[1] || '').trim();\n const kindRaw = (row[2] || '').trim();\n const title = (row[3] || '').trim();\n const detail = (row[4] || '').trim();\n const place = (row[5] || '').trim();\n const attachRaw = (row[6] || '').toString().trim();\n\n // Validate required fields\n if (!dateStr || !title) {\n return null;\n }\n\n // Parse date\n const date = this.parseSheetDate(dateStr);\n if (!date) {\n console.warn(`Invalid date format in row ${rowIndex + 2}: ${dateStr}`);\n return null;\n }\n\n return {\n user: rowUser.toLowerCase() || 'guest',\n date,\n kind: this.parseKind(kindRaw),\n title,\n detail,\n place: place || undefined,\n driveFileId: attachRaw || undefined,\n rowIndex: rowIndex + 2, // +2 because we start from row 2 in sheets (1-indexed + skip header)\n };\n }\n\n /**\n * Map multiple rows to entries, filtering out invalid ones\n */\n mapRowsToEntries(rows: string[][]): MedicalHistoryEntry[] {\n return rows\n .map((row, index) => this.mapRowToEntry(row, index))\n .filter((entry): entry is MedicalHistoryEntry => entry !== null)\n .sort((a, b) => b.date.localeCompare(a.date)); // Sort by date descending (newest first)\n }\n\n /**\n * Parse date from DD/MM/YYYY format to YYYY-MM-DD\n */\n private parseSheetDate(dateStr: string): string | null {\n const trimmed = dateStr.trim();\n\n // Handle DD/MM/YYYY format\n const ddmmyyyyMatch = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/.exec(trimmed);\n if (ddmmyyyyMatch) {\n const day = ddmmyyyyMatch[1].padStart(2, '0');\n const month = ddmmyyyyMatch[2].padStart(2, '0');\n const year = ddmmyyyyMatch[3];\n\n // Validate date values\n const dayNum = parseInt(day, 10);\n const monthNum = parseInt(month, 10);\n const yearNum = parseInt(year, 10);\n\n if (dayNum >= 1 && dayNum <= 31 && monthNum >= 1 && monthNum <= 12 && yearNum >= 1900) {\n return `${year}-${month}-${day}`;\n }\n }\n\n // Handle YYYY-MM-DD format (already correct)\n const yyyymmddMatch = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(trimmed);\n if (yyyymmddMatch) {\n return trimmed;\n }\n\n // Handle other common formats\n const dateObj = new Date(trimmed);\n if (!isNaN(dateObj.getTime())) {\n const year = dateObj.getFullYear();\n const month = String(dateObj.getMonth() + 1).padStart(2, '0');\n const day = String(dateObj.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n return null;\n }\n\n /**\n * Parse and validate medical event kind\n */\n private parseKind(raw: string): MedicalEventKind {\n const normalized = String(raw ?? '')\n .trim()\n .toLowerCase();\n\n return this.KIND_SET.has(normalized) ? (normalized as MedicalEventKind) : 'other';\n }\n\n /**\n * Validate entry data before saving\n */\n validateEntry(entry: Partial<MedicalHistoryEntry>): string[] {\n const errors: string[] = [];\n\n if (!entry.user || entry.user.trim() === '') {\n errors.push('User is required');\n }\n\n if (!entry.date || entry.date.trim() === '') {\n errors.push('Date is required');\n } else if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(entry.date)) {\n errors.push('Date must be in YYYY-MM-DD format');\n }\n\n if (!entry.title || entry.title.trim() === '') {\n errors.push('Title is required');\n }\n\n if (!entry.kind) {\n errors.push('Medical event kind is required');\n } else if (!this.KIND_SET.has(entry.kind)) {\n errors.push('Invalid medical event kind');\n }\n\n return errors;\n }\n\n /**\n * Get available medical event kinds with labels\n */\n getAvailableKinds() {\n return MEDICAL_KINDS.map((kind) => ({\n id: kind.id,\n label: kind.label,\n shortLabel: kind.shortLabel,\n icon: kind.icon,\n color: kind.color,\n }));\n }\n}\n","import { Injectable } from '@angular/core';\n\nexport interface MedicalHistoryError {\n type: 'network' | 'validation' | 'permission' | 'data' | 'unknown';\n message: string;\n userMessage: string;\n actionable: boolean;\n retryable: boolean;\n}\n\n/**\n * Service to handle and categorize medical history related errors\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class MedicalErrorHandlerService {\n /**\n * Convert generic errors to user-friendly medical history errors\n */\n handleError(error: any): MedicalHistoryError {\n const errorMessage = error?.message || error?.toString() || 'Unknown error';\n\n // Network/API errors\n if (errorMessage.includes('Google Sheets API key not configured')) {\n return {\n type: 'permission',\n message: errorMessage,\n userMessage:\n 'Ứng dụng chưa được cấu hình để truy cập Google Sheets. Vui lòng liên hệ quản trị viên.',\n actionable: false,\n retryable: false,\n };\n }\n\n if (errorMessage.includes('Access denied to Google Sheets')) {\n return {\n type: 'permission',\n message: errorMessage,\n userMessage: 'Không có quyền truy cập Google Sheets. Vui lòng kiểm tra quyền chia sẻ.',\n actionable: true,\n retryable: true,\n };\n }\n\n if (errorMessage.includes('Google Sheet not found')) {\n return {\n type: 'data',\n message: errorMessage,\n userMessage: 'Không tìm thấy bảng dữ liệu y tế. Vui lòng kiểm tra liên kết Google Sheets.',\n actionable: true,\n retryable: true,\n };\n }\n\n if (errorMessage.includes('Sheet with GID') && errorMessage.includes('not found')) {\n return {\n type: 'data',\n message: errorMessage,\n userMessage:\n 'Không tìm thấy trang dữ liệu y tế trong Google Sheets. Vui lòng kiểm tra cấu hình.',\n actionable: false,\n retryable: false,\n };\n }\n\n if (errorMessage.includes('Invalid request to Google Sheets API')) {\n return {\n type: 'network',\n message: errorMessage,\n userMessage: 'Yêu cầu không hợp lệ tới Google Sheets. Vui lòng thử lại sau.',\n actionable: false,\n retryable: true,\n };\n }\n\n // Validation errors\n if (errorMessage.includes('Validation failed:')) {\n return {\n type: 'validation',\n message: errorMessage,\n userMessage:\n 'Dữ liệu không hợp lệ: ' + errorMessage.replace('Validation failed:', '').trim(),\n actionable: true,\n retryable: false,\n };\n }\n\n if (errorMessage.includes('Date must be in YYYY-MM-DD format')) {\n return {\n type: 'validation',\n message: errorMessage,\n userMessage: 'Định dạng ngày không đúng. Vui lòng nhập theo định dạng DD/MM/YYYY.',\n actionable: true,\n retryable: false,\n };\n }\n\n // Network connectivity errors\n if (\n errorMessage.includes('Failed to fetch') ||\n errorMessage.includes('Network error') ||\n errorMessage.includes('ERR_NETWORK')\n ) {\n return {\n type: 'network',\n message: errorMessage,\n userMessage: 'Lỗi kết nối mạng. Vui lòng kiểm tra kết nối Internet và thử lại.',\n actionable: true,\n retryable: true,\n };\n }\n\n // Timeout errors\n if (errorMessage.includes('timeout') || errorMessage.includes('timed out')) {\n return {\n type: 'network',\n message: errorMessage,\n userMessage: 'Yêu cầu bị hết thời gian chờ. Vui lòng thử lại sau.',\n actionable: false,\n retryable: true,\n };\n }\n\n // Generic fallback\n return {\n type: 'unknown',\n message: errorMessage,\n userMessage: 'Đã xảy ra lỗi không xác định. Vui lòng thử lại sau hoặc liên hệ hỗ trợ.',\n actionable: false,\n retryable: true,\n };\n }\n\n /**\n * Get user-friendly suggestions based on error type\n */\n getErrorSuggestions(error: MedicalHistoryError): string[] {\n const suggestions: string[] = [];\n\n switch (error.type) {\n case 'network':\n suggestions.push('Kiểm tra kết nối Internet');\n suggestions.push('Thử tải lại trang');\n if (error.retryable) {\n suggestions.push('Thử lại sau vài phút');\n }\n break;\n\n case 'permission':\n suggestions.push('Đảm bảo Google Sheets được chia sẻ công khai hoặc với ứng dụng');\n suggestions.push('Kiểm tra quyền truy cập của tài khoản');\n break;\n\n case 'validation':\n suggestions.push('Kiểm tra lại thông tin đã nhập');\n suggestions.push('Đảm bảo tất cả trường bắt buộc đã được điền');\n break;\n\n case 'data':\n suggestions.push('Kiểm tra liên kết Google Sheets');\n suggestions.push('Đảm bảo cấu trúc dữ liệu đúng định dạng');\n break;\n\n default:\n suggestions.push('Tải lại trang và thử lại');\n suggestions.push('Liên hệ hỗ trợ kỹ thuật nếu vấn đề tiếp tục');\n break;\n }\n\n return suggestions;\n }\n\n /**\n * Check if error is recoverable through user action\n */\n isRecoverable(error: MedicalHistoryError): boolean {\n return error.actionable && (error.type === 'validation' || error.type === 'permission');\n }\n\n /**\n * Get appropriate retry delay based on error type\n */\n getRetryDelay(error: MedicalHistoryError, attemptCount: number): number {\n if (!error.retryable) return 0;\n\n const baseDelay = {\n network: 2000,\n permission: 5000,\n data: 3000,\n validation: 0,\n unknown: 3000,\n };\n\n // Exponential backoff with jitter\n const delay = baseDelay[error.type] * Math.pow(1.5, attemptCount - 1);\n const jitter = Math.random() * 1000;\n\n return Math.min(delay + jitter, 30000); // Max 30 seconds\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable, from, throwError, of } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\nimport { environment } from '../../environments/environment';\nimport { GoogleSheetsService } from './google-sheets.service';\nimport { MedicalDataMapperService } from '../pages/feeding/medical-history/medical-data-mapper.service';\nimport { MedicalErrorHandlerService } from '../pages/feeding/medical-history/medical-error-handler.service';\nimport {\n MEDICAL_KINDS,\n type MedicalEventKind,\n} from '../pages/feeding/medical-history/medical-history-kinds.data';\n\nexport type { MedicalEventKind };\n\nexport interface MedicalHistoryEntry {\n user: string;\n /** YYYY-MM-DD */\n date: string;\n kind: MedicalEventKind;\n title: string;\n detail: string;\n place?: string;\n /** Google Drive file ID for medical image attachments */\n driveFileId?: string;\n rowIndex?: number;\n}\n\nexport interface MedicalSheetResponse {\n success: boolean;\n rowIndex?: number;\n error?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MedicalHistoryService {\n private http = inject(HttpClient);\n private googleSheets = inject(GoogleSheetsService);\n private dataMapper = inject(MedicalDataMapperService);\n private errorHandler = inject(MedicalErrorHandlerService);\n\n private readonly SHEET_ID = environment.googleFeedingSheetId;\n private readonly SHEET_GID = '836488919'; // Medical History tab GID\n private readonly SHEET_NAME = 'MedicalHistory'; // Will fallback to GID if name doesn't work\n\n private readonly APPS_SCRIPT_URL = environment.appsScriptDirect\n ? environment.googleFeedingAppsScriptUrl\n : '/api/feeding-apps-script';\n\n /**\n * Cột:\n * A = User\n * B = Ngày (DD/MM/YYYY)\n * C = Loại (slug)\n * D = Tiêu đề\n * E = Chi tiết\n * F = Nơi khám / ghi chú ngắn\n * G = Google Drive file ID cho ảnh đính kèm, có thể để trống\n */\n getEntries(): Observable<MedicalHistoryEntry[]> {\n if (!this.SHEET_ID) {\n return throwError(\n () => new Error('Thiếu cấu hình Google Sheet. Hãy set NG_APP_GOOGLE_FEEDING_SHEET_ID.')\n );\n }\n const config = {\n spreadsheetId: this.SHEET_ID,\n sheetGid: this.SHEET_GID,\n range: 'A2:H', // Include column H for id file Explorer\n };\n\n return this.googleSheets.getSheetValues(config).pipe(\n map((rows) => {\n console.log(`Fetched ${rows.length} rows from Google Sheets`);\n const entries = this.dataMapper.mapRowsToEntries(rows);\n console.log(`Mapped to ${entries.length} valid medical history entries`);\n return entries;\n }),\n catchError((err) => {\n const handledError = this.errorHandler.handleError(err);\n console.error('MedicalHistoryService.getEntries failed', {\n original: err,\n handled: handledError,\n });\n return throwError(() => handledError);\n })\n );\n }\n\n /**\n * Test method to verify Google Sheets connection and data format\n */\n testConnection(): Observable<{ success: boolean; message: string; rowCount: number }> {\n if (!this.SHEET_ID) {\n return of({\n success: false,\n message: 'Thiếu cấu hình NG_APP_GOOGLE_FEEDING_SHEET_ID',\n rowCount: 0,\n });\n }\n const config = {\n spreadsheetId: this.SHEET_ID,\n sheetGid: this.SHEET_GID,\n range: 'A1:H10', // Test with first 10 rows including header\n };\n\n return this.googleSheets.getSheetValues(config).pipe(\n map((rows) => {\n const hasHeader = rows.length > 0;\n const headerRow = hasHeader ? rows[0] : [];\n const dataRows = rows.slice(1);\n const entries = this.dataMapper.mapRowsToEntries(dataRows);\n\n return {\n success: true,\n message: `Connected successfully. Header: [${headerRow.join(', ')}]. Found ${entries.length} valid entries.`,\n rowCount: dataRows.length,\n };\n }),\n catchError((err) => {\n return of({\n success: false,\n message: `Connection failed: ${err.message}`,\n rowCount: 0,\n });\n })\n );\n }\n\n addEntry(entry: MedicalHistoryEntry): Observable<MedicalSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n\n // Validate entry data before sending\n const validationErrors = this.dataMapper.validateEntry(entry);\n if (validationErrors.length > 0) {\n return throwError(() => new Error(`Validation failed: ${validationErrors.join(', ')}`));\n }\n\n return this.postToAppsScript({\n action: 'addMedicalHistory',\n log: {\n user: entry.user,\n date: entry.date,\n kind: entry.kind,\n title: entry.title,\n detail: entry.detail || '',\n place: entry.place || '',\n attachment_id: entry.driveFileId || '',\n },\n }).pipe(catchError(() => of({ success: true })));\n }\n\n updateEntry(\n rowIndex: number,\n patch: {\n date?: string;\n kind?: MedicalEventKind;\n title?: string;\n detail?: string;\n place?: string;\n /** Gửi `null` hoặc `''` để xoá đính kèm */\n driveFileId?: string | null | '';\n }\n ): Observable<MedicalSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n const bodyPatch: Record<string, unknown> = {};\n if (patch.date !== undefined) bodyPatch['date'] = patch.date;\n if (patch.kind !== undefined) bodyPatch['kind'] = patch.kind;\n if (patch.title !== undefined) bodyPatch['title'] = patch.title;\n if (patch.detail !== undefined) bodyPatch['detail'] = patch.detail;\n if (patch.place !== undefined) bodyPatch['place'] = patch.place;\n if (Object.prototype.hasOwnProperty.call(patch, 'driveFileId')) {\n const v = patch.driveFileId;\n bodyPatch['attachment_id'] = v === null || v === '' ? '' : v;\n }\n\n return this.postToAppsScript({\n action: 'updateMedicalHistory',\n row: rowIndex,\n patch: bodyPatch,\n }).pipe(catchError(() => of({ success: true })));\n }\n\n deleteEntry(rowIndex: number): Observable<MedicalSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n return this.postToAppsScript({\n action: 'deleteMedicalHistory',\n row: rowIndex,\n }).pipe(catchError(() => of({ success: true })));\n }\n\n private postToAppsScript(body: Record<string, unknown>): Observable<MedicalSheetResponse> {\n const url = this.APPS_SCRIPT_URL;\n const useProxy = url.startsWith('/');\n\n if (useProxy) {\n const headers = new HttpHeaders({ 'Content-Type': 'text/plain;charset=UTF-8' });\n return this.http.post<MedicalSheetResponse>(url, JSON.stringify(body), { headers });\n }\n\n const payload = JSON.stringify(body);\n return from(\n fetch(url, {\n method: 'POST',\n mode: 'no-cors',\n headers: { 'Content-Type': 'text/plain;charset=utf-8' },\n body: payload,\n redirect: 'follow',\n }).then((): MedicalSheetResponse => ({ success: true }))\n );\n }\n\n private parseSheetDate(raw: string): string | null {\n if (!raw) return null;\n const m1 = raw.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (m1) {\n const [, d, mo, y] = m1;\n return `${y}-${mo.padStart(2, '0')}-${d.padStart(2, '0')}`;\n }\n const m2 = raw.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/);\n if (m2) {\n const [, y, mo, d] = m2;\n return `${y}-${mo.padStart(2, '0')}-${d.padStart(2, '0')}`;\n }\n return null;\n }\n}\n","/** Bỏ dấu + đ → d để so khớp tiếng Việt (ô≈o, ă≈a…) */\nexport function foldViKey(s: string): string {\n return String(s ?? '')\n .normalize('NFD')\n .replace(/\\p{M}/gu, '')\n .replace(/\\u0111/g, 'd')\n .replace(/\\u0110/g, 'd')\n .toLowerCase();\n}\n\n/** So khớp chuỗi con sau khi gộp dấu — gõ \"o\" hay \"ô\" đều được */\nexport function viFoldIncludes(haystack: string, needle: string): boolean {\n const n = foldViKey(needle);\n if (!n) return true;\n return foldViKey(haystack).includes(n);\n}\n","/**\n * Gợi ý nơi khám — có thể chọn nhanh hoặc gõ thêm (lưu cục bộ theo user).\n */\nexport const DEFAULT_PLACES_VI: readonly string[] = [\n 'Bệnh viện Quốc tế City',\n 'Bệnh viện Nhi Đồng 1',\n 'Bệnh viện Nhi Đồng 2',\n 'Bệnh viện Từ Dũ',\n 'Bệnh viện Hùng Vương',\n 'Bệnh viện Đại học Y Dược TP.HCM',\n 'Phòng khám đa khoa',\n 'Trạm y tế phường / xã',\n 'Tại nhà',\n];\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n EventEmitter,\n HostListener,\n Output,\n computed,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { FormsModule } from '@angular/forms';\nimport { firstValueFrom } from 'rxjs';\nimport {\n ExplorerEntry,\n ExplorerService,\n ExplorerType,\n} from '../../../../services/explorer.service';\nimport {\n MedicalEventKind,\n MedicalHistoryEntry,\n MedicalHistoryService,\n} from '../../../../services/medical-history.service';\nimport { MEDICAL_KINDS, MedicalKindMeta, kindMeta } from '../medical-history-kinds.data';\nimport { DEFAULT_PLACES_VI } from '../medical-places.presets';\nimport { viFoldIncludes } from '../medical-history-vi.utils';\nimport { ActivityLogService } from '../../../../services/activity-log.service';\n\nexport interface EntryDraft {\n date: string;\n kind: MedicalEventKind;\n title: string;\n detail: string;\n place: string;\n}\n\nconst EXPLORER_ROOT_ID = 1;\nconst MEDICAL_FOLDER_NAME = 'Y tế';\nconst MAX_ATTACH_CHARS = 49000 * 100;\n\n@Component({\n selector: 'app-medical-history-dialog',\n standalone: true,\n imports: [FormsModule],\n templateUrl: './medical-history-dialog.component.html',\n styleUrls: ['./medical-history-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MedicalHistoryDialogComponent {\n private medicalService = inject(MedicalHistoryService);\n private explorerService = inject(ExplorerService);\n private destroyRef = inject(DestroyRef);\n private activityLogService = inject(ActivityLogService);\n\n user = input<string>('guest');\n explorerEntries = input<ExplorerEntry[]>([]);\n medicalFolderId = input<number | null>(null);\n /** Tiền sử hiện có — gợi ý nơi khám từ mục đã lưu */\n entries = input<MedicalHistoryEntry[]>([]);\n\n @Output() closed = new EventEmitter<void>();\n @Output() saved = new EventEmitter<void>();\n\n dialogOpen = signal<boolean>(false);\n draft = signal<EntryDraft>(this.emptyDraft());\n editingEntry = signal<MedicalHistoryEntry | null>(null);\n\n pendingAttachment = signal<File | null>(null);\n pendingAttachmentPreviewUrl = signal<string | null>(null);\n stripExistingAttachment = signal<boolean>(false);\n\n kindPickerOpen = signal<boolean>(false);\n kindSearch = signal<string>('');\n\n placePickerOpen = signal<boolean>(false);\n customPlaces = signal<string[]>([]);\n\n saving = signal<boolean>(false);\n errorMsg = signal<string>('');\n\n readonly kindCatalog: readonly MedicalKindMeta[] = MEDICAL_KINDS;\n readonly defaultPlaces = DEFAULT_PLACES_VI;\n\n explorerById = computed(() => {\n const m = new Map<number, ExplorerEntry>();\n for (const e of this.explorerEntries()) {\n m.set(e.id, e);\n }\n return m;\n });\n\n userNorm = computed(\n () =>\n String(this.user() || 'guest')\n .toLowerCase()\n .trim() || 'guest'\n );\n\n filteredKindCatalog = computed(() => {\n const q = this.kindSearch().trim();\n if (!q) return this.kindCatalog;\n return this.kindCatalog.filter(\n (km) =>\n viFoldIncludes(km.label, q) || viFoldIncludes(km.shortLabel, q) || viFoldIncludes(km.id, q)\n );\n });\n\n placesFromEntries = computed(() => {\n const set = new Set<string>();\n for (const e of this.entries()) {\n const p = this.normalizePlace(e.place || '');\n if (p) set.add(p);\n }\n return [...set];\n });\n\n filteredPlaceSuggestions = computed(() => {\n const raw = [...this.defaultPlaces, ...this.customPlaces(), ...this.placesFromEntries()];\n const seen = new Set<string>();\n const uniq: string[] = [];\n for (const p of raw) {\n const t = this.normalizePlace(p);\n if (!t || seen.has(t)) continue;\n seen.add(t);\n uniq.push(t);\n }\n const q = this.normalizePlace(this.draft().place).toLowerCase();\n const filtered = !q ? uniq : uniq.filter((p) => p.toLowerCase().includes(q));\n filtered.sort((a, b) => a.localeCompare(b, 'vi'));\n return filtered;\n });\n\n placeSuggestionsUnion = computed(() => {\n const set = new Set<string>();\n for (const p of this.defaultPlaces) {\n set.add(this.normalizePlace(p));\n }\n for (const p of this.customPlaces()) {\n set.add(this.normalizePlace(p));\n }\n for (const e of this.entries()) {\n if (e.place) set.add(this.normalizePlace(e.place));\n }\n return set;\n });\n\n canAddCustomPlace = computed(() => {\n const t = this.normalizePlace(this.draft().place);\n if (!t) return false;\n return !this.placeSuggestionsUnion().has(t);\n });\n\n constructor() {\n effect(\n () => {\n this.userNorm();\n this.loadCustomPlacesFromStorage();\n },\n { allowSignalWrites: true }\n );\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(ev: Event): void {\n const path = ev.composedPath?.() ?? [];\n const inCombo = path.some((n) => n instanceof HTMLElement && n.classList.contains('mh-combo'));\n if (!inCombo) {\n this.kindPickerOpen.set(false);\n this.placePickerOpen.set(false);\n }\n }\n\n metaFor(kind: MedicalEventKind): MedicalKindMeta {\n return kindMeta(kind);\n }\n\n attachmentFor(entry: MedicalHistoryEntry): ExplorerEntry | undefined {\n // Ưu tiên driveFileId trực tiếp từ medical entry\n if (entry.driveFileId) {\n // Create a minimal ExplorerEntry object for the driveFileId\n return {\n id: -1, // Fake ID for Drive-only files\n name: `med-attachment-${entry.driveFileId}`,\n type: 'file' as ExplorerType,\n parentId: null,\n driveFileId: entry.driveFileId,\n mimeType: 'image/jpeg',\n storageStatus: 'drive',\n };\n }\n\n // Fallback: tìm trong Explorer entries (để tương thích với data cũ)\n const legacyId = (entry as any).attachmentExplorerId;\n if (legacyId) {\n const numericId = typeof legacyId === 'string' ? parseInt(legacyId, 10) : legacyId;\n if (!isNaN(numericId)) {\n const explorerEntry = this.explorerById().get(numericId);\n if (explorerEntry?.driveFileId) {\n return explorerEntry;\n }\n }\n }\n\n return undefined;\n }\n\n get maxDateToday(): string {\n return new Date().toISOString().split('T')[0];\n }\n\n openAdd(): void {\n this.editingEntry.set(null);\n this.draft.set(this.emptyDraft());\n this.resetAttachmentDraft();\n this.errorMsg.set('');\n this.kindPickerOpen.set(false);\n this.placePickerOpen.set(false);\n this.kindSearch.set('');\n this.dialogOpen.set(true);\n }\n\n openEdit(entry: MedicalHistoryEntry): void {\n if (!entry.rowIndex) return;\n this.editingEntry.set(entry);\n this.draft.set({\n date: entry.date,\n kind: entry.kind,\n title: entry.title,\n detail: entry.detail,\n place: entry.place || '',\n });\n this.resetAttachmentDraft();\n this.errorMsg.set('');\n this.kindPickerOpen.set(false);\n this.placePickerOpen.set(false);\n this.kindSearch.set('');\n this.dialogOpen.set(true);\n }\n\n closeDialog(): void {\n this.dialogOpen.set(false);\n this.kindPickerOpen.set(false);\n this.placePickerOpen.set(false);\n this.kindSearch.set('');\n this.resetAttachmentDraft();\n this.closed.emit();\n }\n\n updateDraft(partial: Partial<EntryDraft>): void {\n this.draft.update((d) => ({ ...d, ...partial }));\n }\n\n toggleKindPicker(): void {\n const next = !this.kindPickerOpen();\n this.kindPickerOpen.set(next);\n if (next) {\n this.placePickerOpen.set(false);\n this.kindSearch.set('');\n }\n }\n\n onPlaceFieldFocus(): void {\n this.kindPickerOpen.set(false);\n this.placePickerOpen.set(true);\n }\n\n selectKind(kind: MedicalEventKind): void {\n this.updateDraft({ kind });\n this.kindPickerOpen.set(false);\n this.kindSearch.set('');\n }\n\n selectPlace(place: string): void {\n this.updateDraft({ place: this.normalizePlace(place) });\n this.placePickerOpen.set(false);\n }\n\n addCustomPlaceFromDraft(): void {\n const t = this.normalizePlace(this.draft().place);\n if (!t) return;\n if (this.placeSuggestionsUnion().has(t)) return;\n this.customPlaces.update((arr) => {\n if (arr.some((x) => this.normalizePlace(x) === t)) return arr;\n return [...arr, t];\n });\n this.persistCustomPlaces();\n }\n\n onAttachmentInput(input: HTMLInputElement): void {\n const files = Array.from(input.files || []);\n input.value = '';\n if (files.length === 0) return;\n const file = files[0];\n if (!this.isImageFile(file)) {\n this.errorMsg.set('Chỉ hỗ trợ ảnh (jpg, png, heic…). Thử chụp lại hoặc chọn từ thư viện.');\n return;\n }\n this.errorMsg.set('');\n this.stripExistingAttachment.set(false);\n this.clearPendingOnly();\n this.pendingAttachment.set(file);\n this.pendingAttachmentPreviewUrl.set(URL.createObjectURL(file));\n }\n\n clearPendingAttachment(): void {\n this.clearPendingOnly();\n }\n\n removeSavedAttachment(): void {\n this.clearPendingOnly();\n this.stripExistingAttachment.set(true);\n }\n\n async submitDialog(): Promise<void> {\n const d = this.draft();\n const title = d.title.trim();\n if (!d.date || !title) {\n this.errorMsg.set('Vui lòng nhập ngày và tiêu đề.');\n return;\n }\n\n const edit = this.editingEntry();\n const pending = this.pendingAttachment();\n\n this.saving.set(true);\n this.errorMsg.set('');\n\n try {\n let driveFileId: string | undefined = edit?.driveFileId;\n\n if (this.stripExistingAttachment()) {\n driveFileId = undefined;\n }\n if (pending) {\n driveFileId = await this.uploadAttachmentToDrive(pending);\n }\n\n const base: MedicalHistoryEntry = {\n user: this.userNorm(),\n date: d.date,\n kind: d.kind,\n title,\n detail: d.detail.trim(),\n place: d.place.trim() || undefined,\n driveFileId,\n };\n\n if (edit?.rowIndex) {\n const patch: {\n date: string;\n kind: MedicalEventKind;\n title: string;\n detail: string;\n place: string;\n driveFileId?: string | null;\n } = {\n date: base.date,\n kind: base.kind,\n title: base.title,\n detail: base.detail,\n place: base.place ?? '',\n };\n if (pending || this.stripExistingAttachment()) {\n patch.driveFileId = driveFileId ?? null;\n }\n await firstValueFrom(this.medicalService.updateEntry(edit.rowIndex, patch));\n this.activityLogService\n .logMedical(this.userNorm(), 'MEDICAL_UPDATED', {\n title: base.title,\n location: base.place,\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n } else {\n await firstValueFrom(this.medicalService.addEntry(base));\n this.activityLogService\n .logMedical(this.userNorm(), 'MEDICAL_ADDED', {\n title: base.title,\n location: base.place,\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n\n this.dialogOpen.set(false);\n this.kindPickerOpen.set(false);\n this.placePickerOpen.set(false);\n this.kindSearch.set('');\n this.resetAttachmentDraft();\n this.saved.emit();\n } catch (err: unknown) {\n this.errorMsg.set(err instanceof Error ? err.message : 'Thao tác thất bại.');\n } finally {\n this.saving.set(false);\n }\n }\n\n private normalizePlace(s: string): string {\n return String(s ?? '')\n .trim()\n .replace(/\\s+/g, ' ');\n }\n\n private placesStorageKey(): string {\n return `medicalCustomPlaces:${this.userNorm()}`;\n }\n\n private loadCustomPlacesFromStorage(): void {\n try {\n const raw = localStorage.getItem(this.placesStorageKey());\n if (!raw) {\n this.customPlaces.set([]);\n return;\n }\n const arr = JSON.parse(raw) as unknown;\n if (!Array.isArray(arr)) {\n this.customPlaces.set([]);\n return;\n }\n this.customPlaces.set(\n arr.filter((x): x is string => typeof x === 'string').map((x) => this.normalizePlace(x))\n );\n } catch {\n this.customPlaces.set([]);\n }\n }\n\n private persistCustomPlaces(): void {\n try {\n localStorage.setItem(this.placesStorageKey(), JSON.stringify(this.customPlaces()));\n } catch {\n /* ignore quota */\n }\n }\n\n private clearPendingOnly(): void {\n const url = this.pendingAttachmentPreviewUrl();\n if (url) {\n URL.revokeObjectURL(url);\n }\n this.pendingAttachment.set(null);\n this.pendingAttachmentPreviewUrl.set(null);\n }\n\n private resetAttachmentDraft(): void {\n this.clearPendingOnly();\n this.stripExistingAttachment.set(false);\n }\n\n private isImageFile(f: File): boolean {\n const t = (f.type || '').toLowerCase();\n if (t.startsWith('image/')) return true;\n if (!t && /\\.(jpe?g|png|gif|webp|heic|heif|bmp|avif)$/i.test(f.name)) {\n return true;\n }\n return false;\n }\n\n private emptyDraft(): EntryDraft {\n const t = new Date();\n const y = t.getFullYear();\n const mo = String(t.getMonth() + 1).padStart(2, '0');\n const d = String(t.getDate()).padStart(2, '0');\n return {\n date: `${y}-${mo}-${d}`,\n kind: 'checkup',\n title: '',\n detail: '',\n place: '',\n };\n }\n\n private async compressMedicalImage(file: File): Promise<string> {\n const tries: Array<[number, number]> = [\n [2048, 0.92],\n [1920, 0.9],\n [1600, 0.88],\n [1280, 0.84],\n [1024, 0.8],\n [820, 0.74],\n [640, 0.65],\n [480, 0.55],\n ];\n let last = '';\n for (const [size, q] of tries) {\n last = await this.explorerService.fileToCompressedBase64(file, size, q);\n if (last.length <= MAX_ATTACH_CHARS) return last;\n }\n throw new Error(\n `Ảnh quá lớn sau khi nén (~${Math.round(last.length / 1024)}KB). Chọn ảnh nhỏ hơn.`\n );\n }\n\n private async uploadAttachmentToDrive(file: File): Promise<string> {\n const parentId = await this.ensureMedicalFolderId();\n const dataUrl = await this.compressMedicalImage(file);\n const safeName = `med-${Date.now()}-${Math.random().toString(36).slice(2, 9)}.jpg`;\n\n const response = await firstValueFrom(\n this.explorerService.uploadMedicalImageToDrive({\n fileName: safeName,\n dataUrl,\n mimeType: 'image/jpeg',\n sizeBytes: this.estimateBase64Bytes(dataUrl),\n parentId,\n })\n );\n\n if (!response.driveFileId) {\n throw new Error('Không nhận được Drive file ID sau khi upload ảnh.');\n }\n\n return response.driveFileId;\n }\n\n private async ensureMedicalFolderId(): Promise<number> {\n const cached = this.medicalFolderId();\n if (cached != null) return cached;\n\n let all =\n this.explorerEntries().length > 0\n ? this.explorerEntries()\n : await firstValueFrom(this.explorerService.getEntries());\n\n let folder = all.find(\n (e) =>\n e.type === 'folder' && e.parentId === EXPLORER_ROOT_ID && e.name === MEDICAL_FOLDER_NAME\n );\n if (folder?.id) {\n return folder.id;\n }\n\n await firstValueFrom(\n this.explorerService.addEntry({\n name: MEDICAL_FOLDER_NAME,\n type: 'folder',\n parentId: EXPLORER_ROOT_ID,\n })\n );\n\n all = await firstValueFrom(this.explorerService.getEntries());\n folder = all.find(\n (e) =>\n e.type === 'folder' && e.parentId === EXPLORER_ROOT_ID && e.name === MEDICAL_FOLDER_NAME\n );\n if (!folder?.id) {\n throw new Error('Không tạo được thư mục « Y tế » trong tab Tài liệu.');\n }\n return folder.id;\n }\n\n private estimateBase64Bytes(dataUrl: string): number {\n const commaIdx = dataUrl.indexOf(',');\n const payload = commaIdx >= 0 ? dataUrl.slice(commaIdx + 1) : dataUrl;\n if (!payload) return 0;\n let padding = 0;\n if (payload.endsWith('==')) padding = 2;\n else if (payload.endsWith('=')) padding = 1;\n return Math.max(0, Math.floor((payload.length * 3) / 4) - padding);\n }\n}\n","@if (dialogOpen()) {\n <div class=\"dialog-overlay\" (click)=\"closeDialog()\">\n <div\n class=\"dialog medical-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"dialog-head\">\n <div>\n <h2>\n <i class=\"pi pi-pencil\"></i>\n {{ editingEntry() ? 'Sửa sự kiện' : 'Thêm sự kiện' }}\n </h2>\n </div>\n <button type=\"button\" class=\"dialog-close\" (click)=\"closeDialog()\" aria-label=\"Đóng\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n @if (errorMsg()) {\n <div class=\"alert error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n {{ errorMsg() }}\n </div>\n }\n <form class=\"medical-form\" (ngSubmit)=\"submitDialog()\">\n <label class=\"field\">\n <span class=\"label\">Ngày</span>\n <input\n type=\"date\"\n [ngModel]=\"draft().date\"\n (ngModelChange)=\"updateDraft({ date: $event })\"\n name=\"mhDate\"\n [max]=\"maxDateToday\"\n required\n />\n </label>\n <div class=\"field mh-combo-field\">\n <span class=\"label\">Loại</span>\n <div class=\"mh-combo\" [class.open]=\"kindPickerOpen()\">\n <button\n type=\"button\"\n class=\"mh-combo-trigger\"\n (click)=\"toggleKindPicker(); $event.stopPropagation()\"\n >\n <span class=\"mh-combo-trigger__icon\"\n ><i [class]=\"metaFor(draft().kind).icon\"></i\n ></span>\n <span class=\"mh-combo-trigger__text\">{{ metaFor(draft().kind).label }}</span>\n <i class=\"pi pi-chevron-down mh-combo-chev\"></i>\n </button>\n @if (kindPickerOpen()) {\n <div class=\"mh-combo-panel\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"search\"\n class=\"mh-combo-search\"\n placeholder=\"Tìm loại…\"\n [ngModel]=\"kindSearch()\"\n (ngModelChange)=\"kindSearch.set($event)\"\n name=\"mhKindSearch\"\n autocomplete=\"off\"\n (click)=\"$event.stopPropagation()\"\n />\n <ul class=\"mh-combo-list\" role=\"listbox\">\n @for (km of filteredKindCatalog(); track km) {\n <li\n role=\"option\"\n [class.active]=\"draft().kind === km.id\"\n (click)=\"selectKind(km.id)\"\n >\n <i [class]=\"km.icon\"></i> {{ km.label }}\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n <label class=\"field\">\n <span class=\"label\">Tiêu đề</span>\n <input\n type=\"text\"\n [ngModel]=\"draft().title\"\n (ngModelChange)=\"updateDraft({ title: $event })\"\n name=\"mhTitle\"\n placeholder=\"VD: Mũi 2 Pentaxim — BV Nhi\"\n required\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Chi tiết</span>\n <textarea\n [ngModel]=\"draft().detail\"\n (ngModelChange)=\"updateDraft({ detail: $event })\"\n name=\"mhDetail\"\n rows=\"3\"\n placeholder=\"Phản ứng, chỉ định BS, liều…\"\n ></textarea>\n </label>\n <div class=\"field mh-combo-field\">\n <span class=\"label\">Nơi khám</span>\n <div class=\"mh-combo mh-place-combo\" [class.open]=\"placePickerOpen()\">\n <input\n type=\"text\"\n class=\"mh-combo-input\"\n [ngModel]=\"draft().place\"\n (ngModelChange)=\"\n updateDraft({ place: $event }); kindPickerOpen.set(false); placePickerOpen.set(true)\n \"\n (focus)=\"onPlaceFieldFocus()\"\n name=\"mhPlace\"\n placeholder=\"Chọn hoặc gõ tên cơ sở…\"\n autocomplete=\"off\"\n />\n @if (placePickerOpen()) {\n <div class=\"mh-combo-panel\" (click)=\"$event.stopPropagation()\">\n @if (canAddCustomPlace()) {\n <button type=\"button\" class=\"mh-combo-add\" (click)=\"addCustomPlaceFromDraft()\">\n <i class=\"pi pi-plus\"></i> Thêm «{{ draft().place.trim() }}» vào danh sách\n </button>\n }\n <ul class=\"mh-combo-list mh-combo-list--places\">\n @for (p of filteredPlaceSuggestions(); track p) {\n <li (click)=\"selectPlace(p)\">\n {{ p }}\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n <div class=\"field med-attach-field\">\n <span class=\"label\">Ảnh đính kèm</span>\n @if (\n editingEntry() &&\n !pendingAttachmentPreviewUrl() &&\n !stripExistingAttachment() &&\n attachmentFor(editingEntry()!);\n as sav\n ) {\n <div class=\"med-preview med-preview--saved\">\n @if (sav.content || sav.previewUrl) {\n <img [src]=\"sav.previewUrl || sav.content\" alt=\"Đính kèm hiện tại\" />\n }\n <button type=\"button\" class=\"btn ghost sm\" (click)=\"removeSavedAttachment()\">\n <i class=\"pi pi-times\"></i> Gỡ ảnh đã lưu\n </button>\n </div>\n }\n @if (pendingAttachmentPreviewUrl(); as prevUrl) {\n <div class=\"med-preview med-preview--new\">\n <img [src]=\"prevUrl\" alt=\"Xem trước\" />\n <button type=\"button\" class=\"btn ghost sm\" (click)=\"clearPendingAttachment()\">\n Huỷ ảnh mới\n </button>\n </div>\n }\n <label class=\"med-upload-card\">\n <input\n type=\"file\"\n accept=\"image/*,.heic,.heif\"\n class=\"sr-only\"\n (change)=\"onAttachmentInput($any($event.target))\"\n />\n <span class=\"med-upload-card__icon\" aria-hidden=\"true\">\n <i class=\"pi pi-images\"></i>\n </span>\n <span class=\"med-upload-card__text\">\n <strong class=\"med-upload-card__title\">{{\n pendingAttachment() ? 'Đổi ảnh' : 'Chọn ảnh'\n }}</strong>\n </span>\n <span class=\"med-upload-card__arrow\" aria-hidden=\"true\">\n <i class=\"pi pi-angle-right\"></i>\n </span>\n </label>\n </div>\n <div class=\"dialog-actions\">\n <button type=\"button\" class=\"btn ghost\" (click)=\"closeDialog()\" [disabled]=\"saving()\">\n Huỷ\n </button>\n <button type=\"submit\" class=\"btn primary\" [disabled]=\"saving()\">\n @if (!saving()) {\n <i class=\"pi pi-check\"></i>\n }\n @if (saving()) {\n <i class=\"pi pi-spin pi-spinner\"></i>\n }\n {{ editingEntry() ? 'Cập nhật' : 'Lưu' }}\n </button>\n </div>\n </form>\n </div>\n </div>\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MedicalEventKind } from '../../../../services/medical-history.service';\nimport { MedicalKindMeta } from '../medical-history-kinds.data';\n\n@Component({\n selector: 'app-medical-history-filter',\n standalone: true,\n imports: [FormsModule],\n templateUrl: './medical-history-filter.component.html',\n styleUrls: ['./medical-history-filter.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MedicalHistoryFilterComponent {\n loading = input(false);\n myEntriesCount = input(0);\n visibleCount = input(0);\n textSearchQuery = input('');\n filterPanelOpen = input(false);\n filterPanelKindSearch = input('');\n timelineSort = input<'newest' | 'oldest'>('newest');\n kindListSort = input<'count' | 'alpha'>('count');\n kindFilterKinds = input<MedicalEventKind[]>([]);\n kindFilterSummary = input('Tất cả loại');\n kindsInFilterPanel = input<readonly MedicalKindMeta[]>([]);\n kindCounts = input<Record<MedicalEventKind, number>>({} as Record<MedicalEventKind, number>);\n kindFilterKindSet = input<Set<MedicalEventKind>>(new Set());\n\n textSearchQueryChange = output<string>();\n filterPanelOpenChange = output<boolean>();\n toggleFilterPanel = output<void>();\n resetFilterPanel = output<void>();\n clearTextSearch = output<void>();\n clearKindFilters = output<void>();\n toggleKindFilter = output<MedicalEventKind>();\n timelineSortChange = output<'newest' | 'oldest'>();\n kindListSortChange = output<'count' | 'alpha'>();\n filterPanelKindSearchChange = output<string>();\n\n onTextSearchChange(value: string): void {\n this.textSearchQueryChange.emit(value);\n }\n\n onFilterPanelKindSearchChange(value: string): void {\n this.filterPanelKindSearchChange.emit(value);\n }\n\n onTimelineSort(sort: 'newest' | 'oldest'): void {\n this.timelineSortChange.emit(sort);\n }\n\n onKindListSort(sort: 'count' | 'alpha'): void {\n this.kindListSortChange.emit(sort);\n }\n}\n","<!-- Tìm kiếm free-text trên tiêu đề, chi tiết, nơi khám, loại… -->\n@if (!loading() && myEntriesCount() > 0) {\n <div class=\"mh-text-search card\">\n <label class=\"mh-text-search__label\" for=\"mhFreeTextSearch\">\n <i class=\"pi pi-search\" aria-hidden=\"true\"></i>\n Tìm trong tiền sử\n </label>\n <div class=\"mh-text-search__row\">\n <input\n id=\"mhFreeTextSearch\"\n type=\"search\"\n class=\"mh-text-search__input\"\n placeholder=\"Tìm trong tiêu đề, chi tiết, nơi khám…\"\n [ngModel]=\"textSearchQuery()\"\n (ngModelChange)=\"onTextSearchChange($event)\"\n name=\"mhFreeTextSearch\"\n autocomplete=\"off\"\n enterkeyhint=\"search\"\n />\n @if (textSearchQuery().trim()) {\n <button\n type=\"button\"\n class=\"mh-text-search__clear btn ghost sm\"\n (click)=\"clearTextSearch.emit()\"\n aria-label=\"Xoá ô tìm\"\n title=\"Xoá ô tìm\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n}\n\n<!-- V2: bộ lọc dạng panel (search + sort) -->\n<div class=\"mh-filter\" [class.mh-filter--open]=\"filterPanelOpen()\">\n <button\n type=\"button\"\n class=\"mh-filter-trigger\"\n (click)=\"toggleFilterPanel.emit(); $event.stopPropagation()\"\n [attr.aria-expanded]=\"filterPanelOpen()\"\n aria-controls=\"medical-filter-panel\"\n id=\"medical-filter-trigger\"\n >\n <i class=\"pi pi-sliders-h\" aria-hidden=\"true\"></i>\n <span class=\"mh-filter-trigger__text\">\n <span class=\"mh-filter-trigger__label\">{{ kindFilterSummary() }}</span>\n <span class=\"mh-filter-trigger__meta\">\n <span class=\"mh-filter-trigger__count\">{{ visibleCount() }}</span>\n @if (timelineSort() === 'oldest') {\n <span class=\"mh-filter-trigger__hint\"> · cũ → mới </span>\n }\n </span>\n </span>\n <i\n class=\"pi mh-filter-trigger__chev\"\n [class.pi-chevron-up]=\"filterPanelOpen()\"\n [class.pi-chevron-down]=\"!filterPanelOpen()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n @if (filterPanelOpen()) {\n <div\n class=\"mh-filter-panel\"\n id=\"medical-filter-panel\"\n role=\"region\"\n aria-labelledby=\"medical-filter-trigger\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"mh-filter-panel__headrow\">\n <div class=\"mh-filter-panel__title\">Lọc & sắp xếp</div>\n <button\n type=\"button\"\n class=\"mh-filter-panel__reset btn ghost sm\"\n (click)=\"resetFilterPanel.emit()\"\n title=\"Xóa lọc loại, ô tìm chữ, đặt thời gian và thứ tự danh sách về mặc định\"\n >\n <i class=\"pi pi-replay\" aria-hidden=\"true\"></i>\n Đặt lại\n </button>\n </div>\n <div class=\"mh-filter-panel__field\">\n <span class=\"mh-filter-panel__label\">Thời gian hiển thị</span>\n <div class=\"mh-filter-panel__seg\" role=\"group\" aria-label=\"Sắp xếp timeline\">\n <button\n type=\"button\"\n [class.active]=\"timelineSort() === 'newest'\"\n (click)=\"onTimelineSort('newest')\"\n >\n Mới nhất trước\n </button>\n <button\n type=\"button\"\n [class.active]=\"timelineSort() === 'oldest'\"\n (click)=\"onTimelineSort('oldest')\"\n >\n Cũ nhất trước\n </button>\n </div>\n </div>\n <div class=\"mh-filter-panel__field\">\n <label class=\"mh-filter-panel__label\" for=\"mhFilterKindSearch\"\n >Tìm loại (gõ o hoặc ô đều khớp)</label\n >\n <input\n id=\"mhFilterKindSearch\"\n type=\"search\"\n class=\"mh-filter-panel__search\"\n placeholder=\"VD: tiem, xet nghiem, kham, o / ô…\"\n [ngModel]=\"filterPanelKindSearch()\"\n (ngModelChange)=\"onFilterPanelKindSearchChange($event)\"\n name=\"mhFilterKindSearch\"\n autocomplete=\"off\"\n />\n </div>\n <div class=\"mh-filter-panel__field\">\n <span class=\"mh-filter-panel__label\">Sắp danh sách loại</span>\n <div class=\"mh-filter-panel__seg\" role=\"group\" aria-label=\"Sắp loại\">\n <button\n type=\"button\"\n [class.active]=\"kindListSort() === 'count'\"\n (click)=\"onKindListSort('count')\"\n >\n Nhiều sự kiện trước\n </button>\n <button\n type=\"button\"\n [class.active]=\"kindListSort() === 'alpha'\"\n (click)=\"onKindListSort('alpha')\"\n >\n A → Z\n </button>\n </div>\n </div>\n <div\n class=\"mh-filter-panel__kinds\"\n role=\"listbox\"\n aria-label=\"Chọn loại sự kiện\"\n aria-multiselectable=\"true\"\n >\n <button\n type=\"button\"\n class=\"kind-chip mh-filter-kind\"\n [class.active]=\"kindFilterKinds().length === 0\"\n (click)=\"clearKindFilters.emit()\"\n role=\"option\"\n [attr.aria-selected]=\"kindFilterKinds().length === 0\"\n >\n Tất cả\n <span class=\"kind-chip__count\">{{ myEntriesCount() }}</span>\n </button>\n @for (km of kindsInFilterPanel(); track km) {\n <button\n type=\"button\"\n class=\"kind-chip mh-filter-kind\"\n [class.active]=\"kindFilterKindSet().has(km.id)\"\n [style.--chip-color]=\"km.color\"\n (click)=\"toggleKindFilter.emit(km.id)\"\n [attr.title]=\"km.label\"\n role=\"option\"\n [attr.aria-selected]=\"kindFilterKindSet().has(km.id)\"\n >\n <i [class]=\"km.icon\" aria-hidden=\"true\"></i>\n <span class=\"mh-filter-kind__name\">{{ km.shortLabel }}</span>\n <span class=\"kind-chip__count\">{{ kindCounts()[km.id] }}</span>\n </button>\n }\n @if (filterPanelKindSearch().trim() && kindsInFilterPanel().length === 0) {\n <p class=\"mh-filter-panel__empty\">\n Không thấy loại nào — thử từ ngắn hơn (o/ô, a/ă tương đương).\n </p>\n }\n </div>\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\n\nimport { ExplorerEntry } from '../../../../services/explorer.service';\nimport {\n MedicalEventKind,\n MedicalHistoryEntry,\n} from '../../../../services/medical-history.service';\nimport { MedicalKindMeta, kindMeta } from '../medical-history-kinds.data';\n\nexport interface MedicalTimelineGroup {\n key: string;\n monthLabel: string;\n entries: MedicalHistoryEntry[];\n}\n\n@Component({\n selector: 'app-medical-history-timeline',\n standalone: true,\n imports: [],\n templateUrl: './medical-history-timeline.component.html',\n styleUrls: ['./medical-history-timeline.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MedicalHistoryTimelineComponent {\n timelineGroups = input<MedicalTimelineGroup[]>([]);\n resolveAttachment = input<(entry: MedicalHistoryEntry) => ExplorerEntry | undefined>(\n () => undefined\n );\n explorerEnabled = input<boolean>(true);\n\n editEntry = output<MedicalHistoryEntry>();\n deleteEntry = output<MedicalHistoryEntry>();\n openPreview = output<MedicalHistoryEntry>();\n openInDocuments = output<MedicalHistoryEntry>();\n\n // Placeholder SVG as computed property\n readonly placeholderSvg =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSIjZjNmNGY2Ii8+CjxwYXRoIGQ9Im0xMiAxMiAyIDJoNXYtNXoiIGZpbGw9IiM5Y2EzYWYiLz4KPC9zdmc+';\n\n metaFor(kind: MedicalEventKind): MedicalKindMeta {\n return kindMeta(kind);\n }\n\n formatDateDisplay(iso: string): string {\n const [y, m, d] = iso.split('-');\n return `${d}/${m}/${y}`;\n }\n\n attachmentFor(entry: MedicalHistoryEntry): ExplorerEntry | undefined {\n return this.resolveAttachment()(entry);\n }\n\n onOpenPreview(entry: MedicalHistoryEntry): void {\n this.openPreview.emit(entry);\n }\n\n onOpenInDocuments(entry: MedicalHistoryEntry): void {\n this.openInDocuments.emit(entry);\n }\n\n onImageError(event: Event, att: ExplorerEntry): void {\n const img = event.target as HTMLImageElement;\n // Mark as error and set fallback image\n att.loadError = true;\n img.src = this.placeholderSvg;\n }\n}\n","<div class=\"mh-timeline\">\n @for (g of timelineGroups(); track g) {\n <section class=\"mh-month\">\n <div class=\"mh-month__layout\">\n <div class=\"mh-month__content\">\n <header class=\"mh-month__header\">\n <div class=\"mh-month__header-text\">\n <h3 class=\"mh-month__title\">{{ g.monthLabel }}</h3>\n <p class=\"mh-month__subtitle\">{{ g.entries.length }} sự kiện trong tháng</p>\n </div>\n <span class=\"mh-month__chip\">{{ g.entries.length }}</span>\n </header>\n <ul class=\"mh-month__entries\">\n @for (e of g.entries; track e) {\n <li class=\"mh-card\">\n <span\n class=\"mh-card__accent\"\n [style.--k]=\"metaFor(e.kind).color\"\n aria-hidden=\"true\"\n ></span>\n <div class=\"mh-card__inner\">\n <div class=\"mh-card__top\">\n <span class=\"mh-kind-badge\" [style.--k]=\"metaFor(e.kind).color\">\n <i [class]=\"metaFor(e.kind).icon\" aria-hidden=\"true\"></i>\n {{ metaFor(e.kind).shortLabel }}\n </span>\n <time class=\"mh-card__date\" [attr.datetime]=\"e.date\">{{\n formatDateDisplay(e.date)\n }}</time>\n </div>\n <h4 class=\"mh-card__title\">{{ e.title }}</h4>\n @if (attachmentFor(e); as att) {\n <div class=\"mh-card__photo\">\n @if (explorerEnabled()) {\n @if (att.content || att.previewUrl || att.driveFileId) {\n <button\n type=\"button\"\n class=\"mh-card__photo-open\"\n (click)=\"onOpenPreview(e)\"\n >\n <span class=\"mh-card__photo-frame\">\n @if (att.isLoading) {\n <div class=\"mh-card__photo-loading\">\n <i class=\"pi pi-spin pi-spinner\"></i>\n <span>Đang tải...</span>\n </div>\n }\n @if (!att.isLoading) {\n <img\n class=\"mh-card__photo-img\"\n [src]=\"att.previewUrl || att.content || placeholderSvg\"\n alt=\"Ảnh đính kèm\"\n (error)=\"onImageError($event, att)\"\n />\n }\n </span>\n <span class=\"mh-card__photo-cap\">\n <i class=\"pi pi-search-plus\"></i> Xem ảnh\n </span>\n </button>\n }\n } @else {\n <div class=\"mh-card__photo-unavailable\">\n <i class=\"pi pi-lock\"></i>\n <span>Tệp đính kèm không khả dụng</span>\n </div>\n }\n </div>\n }\n @if (e.detail) {\n <p class=\"mh-card__detail\">{{ e.detail }}</p>\n }\n @if (e.place) {\n <p class=\"mh-card__place\">\n <i class=\"pi pi-map-marker\" aria-hidden=\"true\"></i>{{ e.place }}\n </p>\n }\n <div class=\"mh-card__actions\">\n <button\n type=\"button\"\n class=\"btn ghost sm\"\n (click)=\"editEntry.emit(e)\"\n [disabled]=\"!e.rowIndex\"\n >\n <i class=\"pi pi-pencil\"></i> Sửa\n </button>\n <button\n type=\"button\"\n class=\"btn ghost sm danger\"\n (click)=\"deleteEntry.emit(e)\"\n [disabled]=\"!e.rowIndex\"\n >\n <i class=\"pi pi-trash\"></i>\n </button>\n </div>\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n </section>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n HostListener,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\n\nexport interface MedicalImagePreviewState {\n src: string;\n title: string;\n driveFileId?: string;\n}\n\n@Component({\n selector: 'app-medical-history-preview',\n standalone: true,\n imports: [],\n templateUrl: './medical-history-preview.component.html',\n styleUrls: ['./medical-history-preview.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MedicalHistoryPreviewComponent {\n preview = input<MedicalImagePreviewState | null>(null);\n\n closed = output<void>();\n openInDocuments = output<string>();\n\n private readonly minZoom = 1;\n private readonly maxZoom = 6;\n private readonly zoomStep = 1.4;\n\n scale = signal(1);\n tx = signal(0);\n ty = signal(0);\n interacting = signal(false);\n\n transform = computed(\n () => `translate3d(${this.tx()}px, ${this.ty()}px, 0) scale(${this.scale()})`\n );\n\n zoomPercent = computed(() => Math.round(this.scale() * 100));\n canZoomIn = computed(() => this.scale() < this.maxZoom - 0.001);\n canZoomOut = computed(() => this.scale() > this.minZoom + 0.001);\n\n private pointers = new Map<number, { x: number; y: number }>();\n private panStart: { x: number; y: number; tx: number; ty: number } | null = null;\n private pinchStart: {\n dist: number;\n scale: number;\n tx: number;\n ty: number;\n midX: number;\n midY: number;\n centerX: number;\n centerY: number;\n } | null = null;\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(ev: KeyboardEvent): void {\n if (!this.preview()) return;\n const target = ev.target as HTMLElement | null;\n const tag = target?.tagName;\n const typing = tag === 'INPUT' || tag === 'TEXTAREA' || target?.isContentEditable;\n if (typing) return;\n if (ev.key === 'Escape') {\n ev.preventDefault();\n this.close();\n } else if (ev.key === '+' || ev.key === '=') {\n ev.preventDefault();\n this.zoomIn();\n } else if (ev.key === '-' || ev.key === '_') {\n ev.preventDefault();\n this.zoomOut();\n } else if (ev.key === '0') {\n ev.preventDefault();\n this.resetZoom();\n }\n }\n\n close(): void {\n this.resetZoom();\n this.pointers.clear();\n this.panStart = null;\n this.pinchStart = null;\n this.interacting.set(false);\n this.closed.emit();\n }\n\n onOpenInDocuments(driveFileId: string): void {\n this.close();\n this.openInDocuments.emit(driveFileId);\n }\n\n resetZoom(): void {\n this.scale.set(1);\n this.tx.set(0);\n this.ty.set(0);\n }\n\n zoomIn(ev?: Event): void {\n ev?.stopPropagation();\n this.applyZoom(this.scale() * this.zoomStep);\n }\n\n zoomOut(ev?: Event): void {\n ev?.stopPropagation();\n this.applyZoom(this.scale() / this.zoomStep);\n }\n\n onWheel(ev: WheelEvent): void {\n if (!this.preview()) return;\n ev.preventDefault();\n const stage = ev.currentTarget as HTMLElement;\n const rect = stage.getBoundingClientRect();\n const factor = ev.deltaY < 0 ? 1.15 : 1 / 1.15;\n this.applyZoom(this.scale() * factor, {\n x: ev.clientX,\n y: ev.clientY,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n });\n }\n\n onPointerDown(ev: PointerEvent): void {\n if (!this.preview()) return;\n const stage = ev.currentTarget as HTMLElement;\n try {\n stage.setPointerCapture(ev.pointerId);\n } catch {\n /* ignore */\n }\n this.pointers.set(ev.pointerId, { x: ev.clientX, y: ev.clientY });\n this.interacting.set(true);\n\n if (this.pointers.size >= 2) {\n this.startPinch(stage);\n this.panStart = null;\n } else if (this.scale() > 1.001) {\n this.panStart = {\n x: ev.clientX,\n y: ev.clientY,\n tx: this.tx(),\n ty: this.ty(),\n };\n } else {\n this.panStart = null;\n }\n }\n\n onPointerMove(ev: PointerEvent): void {\n if (!this.pointers.has(ev.pointerId)) return;\n this.pointers.set(ev.pointerId, { x: ev.clientX, y: ev.clientY });\n\n if (this.pointers.size >= 2 && this.pinchStart) {\n this.updatePinch();\n return;\n }\n\n if (this.panStart && this.pointers.size === 1) {\n const dx = ev.clientX - this.panStart.x;\n const dy = ev.clientY - this.panStart.y;\n this.tx.set(this.panStart.tx + dx);\n this.ty.set(this.panStart.ty + dy);\n }\n }\n\n onPointerUp(ev: PointerEvent): void {\n this.pointers.delete(ev.pointerId);\n if (this.pointers.size < 2) this.pinchStart = null;\n if (this.pointers.size === 0) {\n this.panStart = null;\n this.interacting.set(false);\n } else if (this.pointers.size === 1 && this.scale() > 1.001) {\n const remaining = Array.from(this.pointers.values())[0];\n this.panStart = {\n x: remaining.x,\n y: remaining.y,\n tx: this.tx(),\n ty: this.ty(),\n };\n }\n }\n\n onDblClick(ev: MouseEvent): void {\n if (!this.preview()) return;\n const stage = ev.currentTarget as HTMLElement;\n const rect = stage.getBoundingClientRect();\n const target = this.scale() > 1.01 ? 1 : 2.5;\n this.applyZoom(target, {\n x: ev.clientX,\n y: ev.clientY,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n });\n ev.preventDefault();\n }\n\n private applyZoom(\n targetScale: number,\n anchor?: { x: number; y: number; centerX: number; centerY: number }\n ): void {\n const oldScale = this.scale();\n const clamped = Math.min(this.maxZoom, Math.max(this.minZoom, targetScale));\n if (Math.abs(clamped - oldScale) < 0.001) return;\n\n if (clamped <= this.minZoom + 0.001) {\n this.resetZoom();\n return;\n }\n\n const ratio = clamped / oldScale;\n const tx = this.tx();\n const ty = this.ty();\n if (anchor) {\n const kx = anchor.x - anchor.centerX;\n const ky = anchor.y - anchor.centerY;\n this.tx.set(kx * (1 - ratio) + tx * ratio);\n this.ty.set(ky * (1 - ratio) + ty * ratio);\n } else {\n this.tx.set(tx * ratio);\n this.ty.set(ty * ratio);\n }\n this.scale.set(clamped);\n }\n\n private startPinch(stage: HTMLElement): void {\n const pts = Array.from(this.pointers.values());\n if (pts.length < 2) return;\n const [a, b] = pts;\n const dist = Math.hypot(a.x - b.x, a.y - b.y);\n const midX = (a.x + b.x) / 2;\n const midY = (a.y + b.y) / 2;\n const rect = stage.getBoundingClientRect();\n this.pinchStart = {\n dist: dist || 1,\n scale: this.scale(),\n tx: this.tx(),\n ty: this.ty(),\n midX,\n midY,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n };\n }\n\n private updatePinch(): void {\n const start = this.pinchStart;\n if (!start) return;\n const pts = Array.from(this.pointers.values());\n if (pts.length < 2) return;\n const [a, b] = pts;\n const dist = Math.hypot(a.x - b.x, a.y - b.y);\n const ratio = dist / start.dist;\n const target = Math.min(this.maxZoom, Math.max(this.minZoom, start.scale * ratio));\n const r = target / start.scale;\n const kx = start.midX - start.centerX;\n const ky = start.midY - start.centerY;\n this.scale.set(target);\n this.tx.set(kx * (1 - r) + start.tx * r);\n this.ty.set(ky * (1 - r) + start.ty * r);\n }\n}\n","@if (preview(); as pv) {\n <div\n class=\"mh-preview\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"'Xem ảnh: ' + pv.title\"\n >\n <button\n type=\"button\"\n class=\"mh-preview__close\"\n (click)=\"close(); $event.stopPropagation()\"\n aria-label=\"Đóng (Esc)\"\n title=\"Đóng (Esc)\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n <div class=\"mh-preview__name\">{{ pv.title }}</div>\n <div\n class=\"mh-preview__stage\"\n [class.zoomed]=\"scale() > 1.001\"\n [class.interacting]=\"interacting()\"\n (wheel)=\"onWheel($event)\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n (pointerleave)=\"onPointerUp($event)\"\n (dblclick)=\"onDblClick($event)\"\n >\n <img\n class=\"mh-preview__img\"\n [src]=\"pv.src\"\n [alt]=\"pv.title\"\n [style.transform]=\"transform()\"\n draggable=\"false\"\n (dragstart)=\"$event.preventDefault()\"\n />\n </div>\n <div class=\"mh-preview__zoom\" (click)=\"$event.stopPropagation()\">\n <button\n type=\"button\"\n class=\"mh-zoom-btn\"\n (click)=\"zoomOut($event)\"\n [disabled]=\"!canZoomOut()\"\n title=\"Thu nhỏ (-)\"\n aria-label=\"Thu nhỏ\"\n >\n <i class=\"pi pi-minus\"></i>\n </button>\n <button\n type=\"button\"\n class=\"mh-zoom-btn percent\"\n (click)=\"resetZoom(); $event.stopPropagation()\"\n title=\"Đặt lại 100% (0)\"\n aria-label=\"Đặt lại zoom\"\n >\n {{ zoomPercent() }}%\n </button>\n <button\n type=\"button\"\n class=\"mh-zoom-btn\"\n (click)=\"zoomIn($event)\"\n [disabled]=\"!canZoomIn()\"\n title=\"Phóng to (+)\"\n aria-label=\"Phóng to\"\n >\n <i class=\"pi pi-plus\"></i>\n </button>\n </div>\n @if (scale() <= 1.001) {\n <p class=\"mh-preview__hint\">\n Cuộn hoặc bấm <i class=\"pi pi-plus\"></i> để phóng to · Nháy đôi để zoom · Esc đóng\n </p>\n }\n @if (pv.driveFileId) {\n <button type=\"button\" class=\"mh-preview__docs\" (click)=\"onOpenInDocuments(pv.driveFileId)\">\n <i class=\"pi pi-folder-open\"></i> Mở trong tab mới\n </button>\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n EventEmitter,\n HostListener,\n Output,\n computed,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { ExplorerEntry, ExplorerService, ExplorerType } from '../../../services/explorer.service';\nimport {\n MedicalEventKind,\n MedicalHistoryEntry,\n MedicalHistoryService,\n} from '../../../services/medical-history.service';\nimport { MEDICAL_KINDS, MedicalKindMeta, kindMeta } from './medical-history-kinds.data';\nimport { ActivityLogService } from '../../../services/activity-log.service';\nimport { viFoldIncludes } from './medical-history-vi.utils';\nimport { MedicalHistoryDialogComponent } from './dialog/medical-history-dialog.component';\nimport { MedicalHistoryFilterComponent } from './filter/medical-history-filter.component';\nimport { MedicalHistoryTimelineComponent } from './timeline/medical-history-timeline.component';\nimport {\n MedicalHistoryPreviewComponent,\n MedicalImagePreviewState,\n} from './preview/medical-history-preview.component';\n\nconst EXPLORER_ROOT_ID = 1;\nconst MEDICAL_FOLDER_NAME = 'Y tế';\n\n@Component({\n selector: 'app-medical-history',\n standalone: true,\n imports: [\n MedicalHistoryDialogComponent,\n MedicalHistoryFilterComponent,\n MedicalHistoryTimelineComponent,\n MedicalHistoryPreviewComponent,\n ],\n templateUrl: './medical-history.component.html',\n styleUrls: ['./medical-history.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MedicalHistoryComponent {\n private medicalService = inject(MedicalHistoryService);\n private explorerService = inject(ExplorerService);\n readonly explorerEnabled = this.explorerService.isEnabled;\n private destroyRef = inject(DestroyRef);\n private activityLogService = inject(ActivityLogService);\n private cdr = inject(ChangeDetectorRef);\n\n /** Cùng `?user=` với trang feeding */\n user = input<string>('guest');\n\n /** Cha (`feeding`) chuyển tab Tài liệu + `DocumentsComponent.revealFileEntry`. */\n @Output() openExplorerFile = new EventEmitter<number>();\n\n entries = signal<MedicalHistoryEntry[]>([]);\n explorerEntries = signal<ExplorerEntry[]>([]);\n medicalFolderId = signal<number | null>(null);\n\n loading = signal<boolean>(false);\n errorMsg = signal<string>('');\n successMsg = signal<string>('');\n\n kindFilterKinds = signal<MedicalEventKind[]>([]);\n filterPanelOpen = signal<boolean>(false);\n filterPanelKindSearch = signal<string>('');\n timelineSort = signal<'newest' | 'oldest'>('newest');\n kindListSort = signal<'count' | 'alpha'>('count');\n textSearchQuery = signal<string>('');\n\n imagePreview = signal<MedicalImagePreviewState | null>(null);\n\n readonly kindCatalog: readonly MedicalKindMeta[] = MEDICAL_KINDS;\n\n explorerById = computed(() => {\n const m = new Map<number, ExplorerEntry>();\n for (const e of this.explorerEntries()) {\n m.set(e.id, e);\n }\n return m;\n });\n\n kindsInFilterPanel = computed(() => {\n const q = this.filterPanelKindSearch().trim();\n const filtered = !q\n ? [...this.kindCatalog]\n : this.kindCatalog.filter(\n (km) =>\n viFoldIncludes(km.label, q) ||\n viFoldIncludes(km.shortLabel, q) ||\n viFoldIncludes(km.id.replace(/_/g, ' '), q)\n );\n const counts = this.kindCounts();\n const mode = this.kindListSort();\n if (mode === 'alpha') {\n filtered.sort((a, b) => a.label.localeCompare(b.label, 'vi'));\n } else {\n filtered.sort((a, b) => {\n const d = (counts[b.id] ?? 0) - (counts[a.id] ?? 0);\n if (d !== 0) return d;\n return a.label.localeCompare(b.label, 'vi');\n });\n }\n return filtered;\n });\n\n kindFilterKindSet = computed(() => new Set(this.kindFilterKinds()));\n\n kindFilterSummary = computed(() => {\n const sel = this.kindFilterKinds();\n if (sel.length === 0) return 'Tất cả loại';\n if (sel.length === 1) return kindMeta(sel[0]).label;\n if (sel.length <= 3) {\n return sel.map((id) => kindMeta(id).shortLabel).join(' · ');\n }\n return `${sel.length} loại`;\n });\n\n constructor() {\n this.load();\n effect(\n () => {\n this.userNorm();\n },\n { allowSignalWrites: true }\n );\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(ev: Event): void {\n const path = ev.composedPath?.() ?? [];\n const inFilter = path.some(\n (n) => n instanceof HTMLElement && n.classList.contains('mh-filter')\n );\n if (!inFilter) {\n this.filterPanelOpen.set(false);\n }\n }\n\n refresh() {\n this.load();\n }\n\n userNorm = computed(\n () =>\n String(this.user() || 'guest')\n .toLowerCase()\n .trim() || 'guest'\n );\n\n myEntries = computed(() => {\n return this.entries();\n });\n\n filteredEntries = computed(() => {\n const rows = this.myEntries();\n const sel = this.kindFilterKinds();\n if (sel.length === 0) return rows;\n const allow = new Set(sel);\n return rows.filter((e) => allow.has(e.kind));\n });\n\n visibleEntries = computed(() => {\n const rows = this.filteredEntries();\n const q = this.textSearchQuery().trim();\n if (!q) return rows;\n return rows.filter((e) => this.entryMatchesFreeText(e, q));\n });\n\n timelineGroups = computed(() => {\n const list = this.visibleEntries();\n const order = this.timelineSort();\n const map = new Map<string, MedicalHistoryEntry[]>();\n for (const e of list) {\n const ym = e.date.slice(0, 7);\n if (!map.has(ym)) map.set(ym, []);\n map.get(ym)!.push(e);\n }\n for (const arr of map.values()) {\n arr.sort((a, b) => {\n const cmp = a.date.localeCompare(b.date);\n return order === 'newest' ? -cmp : cmp;\n });\n }\n const keys = [...map.keys()].sort((a, b) =>\n order === 'newest' ? b.localeCompare(a) : a.localeCompare(b)\n );\n return keys.map((key) => ({\n key,\n monthLabel: this.formatMonthHeading(key),\n entries: map.get(key)!,\n }));\n });\n\n kindCounts = computed(() => {\n const rows = this.myEntries();\n const counts = {} as Record<MedicalEventKind, number>;\n for (const km of MEDICAL_KINDS) {\n counts[km.id] = 0;\n }\n for (const e of rows) {\n const k = counts[e.kind] !== undefined ? e.kind : 'other';\n counts[k]++;\n }\n return counts;\n });\n\n load() {\n this.loading.set(true);\n this.errorMsg.set('');\n\n // Track completion của từng API call\n let medicalLoaded = false;\n let explorerLoaded = false;\n let medicalData: any[] = [];\n let explorerData: any[] = [];\n\n const checkAndFinalize = () => {\n if (medicalLoaded && explorerLoaded) {\n // Cả 2 APIs đã hoàn thành, finalize\n const folder = explorerData.find(\n (e) =>\n e.type === 'folder' && e.parentId === EXPLORER_ROOT_ID && e.name === MEDICAL_FOLDER_NAME\n );\n this.medicalFolderId.set(folder?.id ?? null);\n this.loading.set(false);\n\n // 🚀 Pre-load all medical attachments\n this.preloadAttachments(medicalData);\n }\n };\n\n // 🚀 Load Medical History - độc lập\n this.medicalService\n .getEntries()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (medical) => {\n this.entries.set(medical);\n medicalData = medical;\n medicalLoaded = true;\n checkAndFinalize();\n },\n error: (err) => {\n console.error('Medical load failed:', err);\n this.errorMsg.set('Không tải được Medical History data.');\n this.loading.set(false);\n },\n });\n\n // 🚀 Load Explorer - độc lập, không block medical\n this.explorerService\n .getEntries()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (explorer) => {\n this.explorerEntries.set(explorer);\n explorerData = explorer;\n explorerLoaded = true;\n checkAndFinalize();\n },\n error: (err) => {\n console.error('Explorer load failed:', err);\n // Explorer fail không block medical data\n explorerLoaded = true; // Set true để không block finalization\n explorerData = []; // Empty fallback\n checkAndFinalize();\n },\n });\n }\n\n onDialogSaved(): void {\n this.successMsg.set('Đã lưu.');\n setTimeout(() => this.successMsg.set(''), 3000);\n setTimeout(() => this.load(), 600);\n }\n\n // Cache để lưu trữ các attachment đã enriched với previewUrl/content\n private attachmentCache = new Map<string, ExplorerEntry>();\n\n attachmentFor(entry: MedicalHistoryEntry): ExplorerEntry | undefined {\n // Ưu tiên driveFileId trực tiếp từ medical entry\n if (entry.driveFileId) {\n // Kiểm tra cache trước\n const cached = this.attachmentCache.get(entry.driveFileId);\n if (cached) {\n return cached;\n }\n\n // Create a minimal ExplorerEntry object for the driveFileId\n const attachment: ExplorerEntry = {\n id: -1, // Fake ID for Drive-only files\n name: `med-attachment-${entry.driveFileId}`,\n type: 'file' as ExplorerType,\n parentId: null,\n driveFileId: entry.driveFileId,\n mimeType: 'image/jpeg',\n storageStatus: 'drive',\n // Add loading state properties\n previewUrl: undefined, // Will be populated when loaded\n isLoading: true, // Custom property để track loading state\n loadError: false,\n };\n\n // Cache ngay lập tức để tránh multiple requests\n this.attachmentCache.set(entry.driveFileId, attachment);\n\n return attachment;\n }\n\n // Fallback: tìm trong Explorer entries (để tương thích với data cũ)\n // Giả sử attachmentExplorerId có thể còn trong data cũ\n const legacyId = (entry as any).attachmentExplorerId;\n if (legacyId) {\n const numericId = typeof legacyId === 'string' ? parseInt(legacyId, 10) : legacyId;\n if (!isNaN(numericId)) {\n const explorerEntry = this.explorerById().get(numericId);\n if (explorerEntry?.driveFileId) {\n return explorerEntry;\n }\n }\n }\n\n return undefined;\n }\n\n readonly resolveAttachment = (entry: MedicalHistoryEntry) => this.attachmentFor(entry);\n\n private preloadAttachments(entries: MedicalHistoryEntry[]): void {\n // Collect tất cả driveFileIds cần load (bao gồm cả những item đã có trong cache nhưng chưa load xong)\n const driveFileIds = entries\n .map((entry) => entry.driveFileId)\n .filter((id): id is string => {\n if (!id) return false;\n\n const cached = this.attachmentCache.get(id);\n // Load nếu: chưa có trong cache HOẶC đang loading HOẶC chưa có previewUrl\n return !cached || cached.isLoading || !cached.previewUrl;\n });\n\n if (driveFileIds.length === 0) {\n return;\n }\n\n // 🚀 Load each attachment independently - API nào về trước complete trước\n driveFileIds.forEach((driveFileId) => {\n this.explorerService\n .getFileDataUrl(driveFileId)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n catchError((error) => {\n return of({\n success: false,\n error: error.message || 'Load failed',\n dataUrl: undefined,\n });\n })\n )\n .subscribe({\n next: (response) => {\n const attachment = this.attachmentCache.get(driveFileId);\n\n if (attachment && response.success && (response as any).dataUrl) {\n // ✅ Update cached attachment với loaded data\n const dataUrl = (response as any).dataUrl;\n attachment.previewUrl = dataUrl;\n attachment.content = dataUrl; // Fallback\n attachment.isLoading = false;\n\n // 🔄 Update UI ngay lập tức cho attachment này (không đợi others)\n const currentEntries = this.entries();\n this.entries.set([...currentEntries]);\n } else if (attachment) {\n // ❌ Mark as failed to load\n attachment.isLoading = false;\n attachment.loadError = true;\n\n // 🔄 Update UI ngay cả khi fail\n const currentEntries = this.entries();\n this.entries.set([...currentEntries]);\n }\n },\n error: (error) => {\n const attachment = this.attachmentCache.get(driveFileId);\n if (attachment) {\n attachment.isLoading = false;\n attachment.loadError = true;\n }\n\n // Check for Drive authorization errors\n const isDriveAuthError =\n error.message && error.message.includes('DriveApp.getFileById');\n if (isDriveAuthError) {\n this.errorMsg.set(\n '🚨 Apps Script chưa có quyền truy cập Google Drive. Hãy authorize Apps Script.'\n );\n }\n\n // 🔄 Update UI ngay cả khi error\n const currentEntries = this.entries();\n this.entries.set([...currentEntries]);\n },\n });\n });\n }\n\n openAttachmentInDocuments(entry: MedicalHistoryEntry): void {\n // Ưu tiên mở trong Explorer nếu có legacy ID\n const legacyId = (entry as any).attachmentExplorerId;\n if (legacyId) {\n const numericId = typeof legacyId === 'string' ? parseInt(legacyId, 10) : legacyId;\n if (!isNaN(numericId)) {\n const explorerEntry = this.explorerById().get(numericId);\n if (explorerEntry?.id) {\n this.openExplorerFile.emit(explorerEntry.id);\n return;\n }\n }\n }\n\n // Fallback: fetch từ Drive và mở tab mới\n const att = this.attachmentFor(entry);\n if (!att?.driveFileId) return;\n\n this.explorerService\n .getFileDataUrl(att.driveFileId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.dataUrl) {\n window.open(response.dataUrl, '_blank', 'noopener,noreferrer');\n }\n },\n error: (err) => {\n console.error('Failed to load attachment:', err);\n this.errorMsg.set('Không tải được ảnh đính kèm.');\n },\n });\n }\n\n openImagePreview(entry: MedicalHistoryEntry): void {\n const att = this.attachmentFor(entry);\n if (!att?.driveFileId) return;\n\n // Use cached data if available, otherwise fetch from Drive\n if (att.previewUrl || att.content) {\n // ⚡ Fast path: Use cached image data\n this.imagePreview.set({\n src: att.previewUrl || att.content || '',\n title: entry.title || 'Ảnh đính kèm',\n driveFileId: att.driveFileId,\n });\n } else {\n // 🔄 Fallback: Fetch from Drive if not cached\n this.explorerService\n .getFileDataUrl(att.driveFileId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.dataUrl) {\n // Update cache for future use\n att.previewUrl = response.dataUrl;\n att.content = response.dataUrl;\n att.isLoading = false;\n\n this.imagePreview.set({\n src: response.dataUrl,\n title: entry.title || 'Ảnh đính kèm',\n driveFileId: att.driveFileId,\n });\n }\n },\n error: () => {\n this.errorMsg.set('Không tải được ảnh đính kèm.');\n },\n });\n }\n }\n\n closeImagePreview(): void {\n this.imagePreview.set(null);\n }\n\n openInDocumentsFromPreview(driveFileId: string): void {\n this.closeImagePreview();\n\n // Since we no longer have Explorer integration, we'll just open the Drive file directly\n this.explorerService\n .getFileDataUrl(driveFileId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.dataUrl) {\n window.open(response.dataUrl, '_blank', 'noopener,noreferrer');\n }\n },\n error: (err) => {\n console.error('Failed to open file:', err);\n this.errorMsg.set('Không mở được file.');\n },\n });\n }\n\n toggleFilterPanel(): void {\n this.filterPanelOpen.update((v) => !v);\n }\n\n clearKindFilters(): void {\n this.kindFilterKinds.set([]);\n }\n\n resetFilterPanel(): void {\n this.kindFilterKinds.set([]);\n this.timelineSort.set('newest');\n this.kindListSort.set('count');\n this.filterPanelKindSearch.set('');\n this.textSearchQuery.set('');\n }\n\n clearTextSearch(): void {\n this.textSearchQuery.set('');\n }\n\n private entryMatchesFreeText(e: MedicalHistoryEntry, query: string): boolean {\n const m = kindMeta(e.kind);\n return (\n viFoldIncludes(e.title, query) ||\n viFoldIncludes(e.detail, query) ||\n viFoldIncludes(e.place || '', query) ||\n viFoldIncludes(m.label, query) ||\n viFoldIncludes(m.shortLabel, query) ||\n viFoldIncludes(e.kind.replace(/_/g, ' '), query)\n );\n }\n\n toggleKindFilter(kind: MedicalEventKind): void {\n this.kindFilterKinds.update((arr) => {\n const next = new Set(arr);\n if (next.has(kind)) next.delete(kind);\n else next.add(kind);\n return [...next];\n });\n }\n\n metaFor(kind: MedicalEventKind): MedicalKindMeta {\n return kindMeta(kind);\n }\n\n deleteEntry(entry: MedicalHistoryEntry) {\n if (!entry.rowIndex) return;\n if (!confirm(`Xoá \"${entry.title}\" (${this.formatDateDisplay(entry.date)})?`)) {\n return;\n }\n this.medicalService.deleteEntry(entry.rowIndex).subscribe({\n next: () => {\n this.successMsg.set('Đã xoá.');\n\n this.activityLogService\n .logMedical(this.userNorm(), 'MEDICAL_DELETED', {\n title: entry.title,\n })\n .subscribe();\n\n setTimeout(() => this.successMsg.set(''), 3000);\n setTimeout(() => this.load(), 600);\n },\n error: (err) => {\n this.errorMsg.set(err?.message || 'Xoá thất bại.');\n },\n });\n }\n\n formatDateDisplay(iso: string): string {\n const [y, m, d] = iso.split('-');\n return `${d}/${m}/${y}`;\n }\n\n private formatMonthHeading(ym: string): string {\n const [y, m] = ym.split('-');\n const mi = parseInt(m, 10);\n return `Tháng ${mi}/${y}`;\n }\n}\n","<div class=\"medical-page\">\n <header class=\"medical-hero\">\n <div class=\"medical-hero__glow\" aria-hidden=\"true\"></div>\n <div class=\"medical-hero__row\">\n <div class=\"medical-hero__icon\" aria-hidden=\"true\">\n <i class=\"pi pi-heart-fill\"></i>\n </div>\n <div class=\"medical-hero__text\">\n <p class=\"medical-hero__eyebrow\">Nhật ký sức khỏe · V2</p>\n <h1 class=\"medical-hero__title\">Tiền sử y tế</h1>\n <p class=\"medical-hero__subtitle\">\n Tiêm chủng, khám, thuốc và ảnh đính kèm — lọc theo loại hoặc tìm nhanh trong nội dung.\n </p>\n </div>\n </div>\n @if (!loading() && myEntries().length > 0) {\n <div class=\"medical-hero__stats\" role=\"status\">\n <span class=\"medical-stat\">\n <strong>{{ visibleEntries().length }}</strong>\n <span class=\"medical-stat__label\">mục hiển thị</span>\n </span>\n @if (visibleEntries().length !== myEntries().length) {\n <span class=\"medical-stat medical-stat--dim\">\n <span class=\"medical-stat__sep\">·</span>\n {{ myEntries().length }} trong sổ\n </span>\n }\n </div>\n }\n </header>\n\n @if (errorMsg() || successMsg()) {\n <div class=\"medical-alerts\">\n @if (errorMsg()) {\n <div class=\"alert error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n {{ errorMsg() }}\n </div>\n }\n @if (successMsg()) {\n <div class=\"alert ok\">\n <i class=\"pi pi-check-circle\"></i>\n {{ successMsg() }}\n </div>\n }\n </div>\n }\n\n <app-medical-history-filter\n [loading]=\"loading()\"\n [myEntriesCount]=\"myEntries().length\"\n [visibleCount]=\"visibleEntries().length\"\n [textSearchQuery]=\"textSearchQuery()\"\n [filterPanelOpen]=\"filterPanelOpen()\"\n [filterPanelKindSearch]=\"filterPanelKindSearch()\"\n [timelineSort]=\"timelineSort()\"\n [kindListSort]=\"kindListSort()\"\n [kindFilterKinds]=\"kindFilterKinds()\"\n [kindFilterSummary]=\"kindFilterSummary()\"\n [kindsInFilterPanel]=\"kindsInFilterPanel()\"\n [kindCounts]=\"kindCounts()\"\n [kindFilterKindSet]=\"kindFilterKindSet()\"\n (textSearchQueryChange)=\"textSearchQuery.set($event)\"\n (filterPanelKindSearchChange)=\"filterPanelKindSearch.set($event)\"\n (timelineSortChange)=\"timelineSort.set($event)\"\n (kindListSortChange)=\"kindListSort.set($event)\"\n (toggleFilterPanel)=\"toggleFilterPanel()\"\n (resetFilterPanel)=\"resetFilterPanel()\"\n (clearTextSearch)=\"clearTextSearch()\"\n (clearKindFilters)=\"clearKindFilters()\"\n (toggleKindFilter)=\"toggleKindFilter($event)\"\n />\n\n @if (loading()) {\n <section class=\"card medical-state medical-state--loading\">\n <div class=\"medical-state__icon\" aria-hidden=\"true\">\n <i class=\"pi pi-spin pi-spinner\"></i>\n </div>\n <p class=\"medical-state__title\">Đang tải tiền sử…</p>\n <p class=\"medical-state__hint\">Đồng bộ từ bảng tiền sử trên Google Sheet.</p>\n </section>\n }\n\n @if (!loading() && myEntries().length === 0) {\n <section class=\"card medical-state medical-state--empty\">\n <div class=\"medical-state__icon medical-state__icon--heart\" aria-hidden=\"true\">\n <i class=\"pi pi-heart\"></i>\n </div>\n <p class=\"medical-state__title\">Chưa có sự kiện nào</p>\n <p class=\"medical-state__hint\">\n Bấm <strong>Ghi sự kiện</strong> để thêm tiêm chủng, khám, thuốc hoặc ghi chú khác.\n </p>\n </section>\n }\n\n @if (!loading() && myEntries().length > 0 && filteredEntries().length === 0) {\n <section class=\"card medical-state medical-state--soft\">\n <div class=\"medical-state__icon\" aria-hidden=\"true\">\n <i class=\"pi pi-filter-slash\"></i>\n </div>\n <p class=\"medical-state__title\">Không khớp bộ lọc loại</p>\n <p class=\"medical-state__hint\">\n Mở panel lọc và bấm <strong>Tất cả</strong>, hoặc bật lại từng loại bạn cần xem.\n </p>\n </section>\n }\n\n @if (\n !loading() &&\n myEntries().length > 0 &&\n filteredEntries().length > 0 &&\n visibleEntries().length === 0 &&\n textSearchQuery().trim()\n ) {\n <section class=\"card medical-state medical-state--soft\">\n <div class=\"medical-state__icon\" aria-hidden=\"true\">\n <i class=\"pi pi-search\"></i>\n </div>\n <p class=\"medical-state__title\">Không tìm thấy «{{ textSearchQuery().trim() }}»</p>\n <p class=\"medical-state__hint\">\n Thử từ khác hoặc\n <button type=\"button\" class=\"mh-inline-link\" (click)=\"clearTextSearch()\">xoá ô tìm</button>.\n </p>\n </section>\n }\n\n @if (!loading() && visibleEntries().length > 0) {\n <app-medical-history-timeline\n [timelineGroups]=\"timelineGroups()\"\n [resolveAttachment]=\"resolveAttachment\"\n [explorerEnabled]=\"explorerEnabled\"\n (editEntry)=\"medicalDialog.openEdit($event)\"\n (deleteEntry)=\"deleteEntry($event)\"\n (openPreview)=\"openImagePreview($event)\"\n (openInDocuments)=\"openAttachmentInDocuments($event)\"\n />\n }\n\n <button\n type=\"button\"\n class=\"fab medical-fab\"\n (click)=\"medicalDialog.openAdd()\"\n aria-label=\"Ghi sự kiện y tế\"\n title=\"Ghi sự kiện y tế\"\n >\n <i class=\"pi pi-plus\"></i>\n <span class=\"fab-label\">Ghi sự kiện</span>\n </button>\n\n <app-medical-history-dialog\n #medicalDialog\n [user]=\"user()\"\n [entries]=\"entries()\"\n [explorerEntries]=\"explorerEntries()\"\n [medicalFolderId]=\"medicalFolderId()\"\n (saved)=\"onDialogSaved()\"\n />\n\n <app-medical-history-preview\n [preview]=\"imagePreview()\"\n (closed)=\"closeImagePreview()\"\n (openInDocuments)=\"openInDocumentsFromPreview($event)\"\n />\n</div>\n","/**\n * Dòng thời gian phát triển của trẻ — tổng hợp từ các nguồn y khoa:\n * - AAP HealthyChildren.org (developmental milestones)\n * - CDC \"Learn the Signs. Act Early.\" milestones (gồm mốc ~30 tháng và ~36 tháng)\n * - WHO Child Growth Standards\n * - The Wonder Weeks (Dr. Hetty van de Rijt & Dr. Frans Plooij)\n * - La Leche League / AAP (stomach size by age)\n * - Vinmec Vietnam (bài tuần tuổi)\n *\n * Khoảng ngày tuổi (ageFromDays/ageToDays) là xấp xỉ; bé sinh non nên dùng tuổi hiệu chỉnh theo BS.\n */\n\nexport type MoodType =\n | 'calm' // Bình thường, học thích nghi\n | 'happy' // Giai đoạn \"thiên thần\"\n | 'growth' // Growth spurt — bú nhiều, tăng cân\n | 'leap' // Wonder Week — quấy, nhảy vọt nhận thức\n | 'milestone'; // Cột mốc lớn (nụ cười, ngồi, đi, nói...)\n\nexport interface StomachSize {\n /** Mô tả so sánh: \"quả anh đào\", \"quả óc chó\"... */\n compareTo: string;\n /** \"5–7ml\", \"22–27ml\"... */\n volumeMl: string;\n /** Emoji trực quan (hoa quả tương tự) */\n emoji: string;\n /** Scale vòng tròn visualization (0.2 → 1.5) */\n scale: number;\n}\n\nexport interface TimelineMilestone {\n id: string;\n /** \"Tuần 1\", \"Tuần 5\", \"Tháng 4\"... */\n periodLabel: string;\n /** Tóm tắt 1 dòng (hiển thị cạnh period label) */\n tagline: string;\n /** Ngày tuổi bắt đầu (inclusive) */\n ageFromDays: number;\n /** Ngày tuổi kết thúc (inclusive) */\n ageToDays: number;\n /** Emoji chủ đạo cho giai đoạn */\n heroEmoji: string;\n /** Kích thước dạ dày */\n stomach: StomachSize;\n /** Tâm trạng chung */\n mood: MoodType;\n /** Nhãn tâm trạng (hiện trên badge) */\n moodLabel: string;\n /** 2-4 sự thật thú vị */\n funFacts: string[];\n /** Kỹ năng bé có/đang học (optional) */\n skills?: string[];\n /** 2-3 lưu ý cho ba mẹ */\n parentNotes: string[];\n /** Tone màu */\n accent: 'rose' | 'peach' | 'mint' | 'lavender' | 'amber' | 'sky' | 'coral' | 'plum';\n}\n\nexport interface TimelineCareGuide {\n /** Checklist ngắn cho giai đoạn này — ưu tiên việc có thể làm ngay. */\n todos: string[];\n /** Những việc nên tránh ở đúng độ tuổi này. */\n notToDo: string[];\n /** Dấu hiệu nên hỏi bác sĩ / chuyên viên y tế, không dùng để tự chẩn đoán. */\n watchFor: string[];\n}\n\nexport const BABY_TIMELINE: TimelineMilestone[] = [\n {\n id: 'w1',\n periodLabel: 'Tuần 1',\n tagline: 'Làm quen thế giới',\n ageFromDays: 0,\n ageToDays: 6,\n heroEmoji: '👶',\n stomach: { compareTo: 'quả anh đào → óc chó', volumeMl: '5–27ml', emoji: '🍒', scale: 0.25 },\n mood: 'calm',\n moodLabel: 'Bình yên • Tuần ở cữ',\n funFacts: [\n 'Dạ dày chỉ bằng quả anh đào ngày đầu — sữa non 5–7ml là vừa đủ.',\n 'Bé nhận ra giọng mẹ ngay từ trong bụng; thính giác gần như hoàn chỉnh.',\n 'Sụt 5–10% cân nặng trong 3–5 ngày đầu là bình thường — lấy lại sau ~10–14 ngày.',\n 'Nước mắt chưa chảy dù khóc: tuyến lệ chỉ mở hoàn toàn sau 3 tuần.',\n ],\n skills: ['Phản xạ Moro, mút, nắm tay', 'Nhìn rõ khoảng cách 20–30cm'],\n parentNotes: [\n 'Bú theo nhu cầu 8–12 cữ/ngày, đánh thức nếu ngủ >3 giờ.',\n 'Da kề da để ổn định nhịp tim bé + kích sữa non.',\n 'Bú mẹ: bổ sung vitamin D 400 IU/ngày cho bé.',\n ],\n accent: 'rose',\n },\n {\n id: 'w2',\n periodLabel: 'Tuần 2',\n tagline: 'Hồi phục cân nặng',\n ageFromDays: 7,\n ageToDays: 13,\n heroEmoji: '🌱',\n stomach: { compareTo: 'quả mơ', volumeMl: '45–60ml', emoji: '🍑', scale: 0.4 },\n mood: 'calm',\n moodLabel: 'Bình yên',\n funFacts: [\n 'Rụng cuống rốn thường xảy ra tuần này (5–15 ngày sau sinh).',\n 'Bé có thể mỉm cười \"phản xạ\" khi ngủ — chưa phải cười xã giao.',\n 'Tăng 20–30g/ngày, chu vi đầu tăng rõ.',\n 'Growth spurt nhỏ ngày 7–10: đòi bú liên tục 1–2 ngày.',\n ],\n skills: ['Nhìn theo vật chuyển động ngắn', 'Giao tiếp bằng mắt với mẹ'],\n parentNotes: [\n 'Kiểm tra khớp ngậm: cằm chạm ngực, môi dưới lật ra.',\n 'Giữ cuống rốn khô — không băng kín, quan sát dấu hiệu nhiễm trùng.',\n 'Mẹ theo dõi tắc tia sữa (ngực cứng đau) → chườm ấm + cho bé bú bên đau trước.',\n ],\n accent: 'peach',\n },\n {\n id: 'w3',\n periodLabel: 'Tuần 3',\n tagline: 'Growth spurt thể chất',\n ageFromDays: 14,\n ageToDays: 20,\n heroEmoji: '🌸',\n stomach: { compareTo: 'quả trứng gà', volumeMl: '80–100ml', emoji: '🥚', scale: 0.5 },\n mood: 'growth',\n moodLabel: 'Growth spurt • Cluster feeding',\n funFacts: [\n 'Đợt tăng trưởng đáng kể: bé đòi bú mỗi 1–1.5 giờ.',\n 'Khoảng 15–20% trẻ bắt đầu có cơn colic (khóc không rõ nguyên nhân, thường buổi tối).',\n 'Bắt đầu nhấc đầu vài giây khi nằm sấp.',\n 'Nhận biết khuôn mặt quen — thường nhìn chăm chú mẹ hơn.',\n ],\n skills: ['Nhấc đầu 1–3 giây', 'Nhìn theo vật di chuyển'],\n parentNotes: [\n 'Cluster feeding là bình thường — KHÔNG phải \"mẹ thiếu sữa\".',\n 'Chưa phải Wonder Week: growth spurt = TĂNG CÂN nhanh; Wonder Week (bước nhảy nhận thức) đến tuần 5.',\n 'Mẹ coi chừng baby blues — nếu buồn >2 tuần, tìm tư vấn.',\n ],\n accent: 'coral',\n },\n {\n id: 'w4',\n periodLabel: 'Tuần 4',\n tagline: 'Nụ cười xã giao đầu tiên',\n ageFromDays: 21,\n ageToDays: 27,\n heroEmoji: '😊',\n stomach: { compareTo: 'quả trứng lớn', volumeMl: '90–120ml', emoji: '🥚', scale: 0.55 },\n mood: 'happy',\n moodLabel: 'Happy • Nụ cười đầu tiên',\n funFacts: [\n '🎉 Nụ cười xã giao đầu tiên — KHÔNG phải phản xạ, bé cười khi thấy mặt mẹ!',\n 'Ê a nguyên âm: \"a-a\", \"ơ-ơ\".',\n 'Một giấc đêm có thể dài 4–5 giờ.',\n 'Mắt bắt đầu phối hợp — hết \"lác sinh lý\".',\n ],\n skills: ['Cười xã giao', 'Ê a âm nguyên', 'Nhấc đầu 45° ngắn'],\n parentNotes: [\n 'Đáp lại tiếng bé như hội thoại thật — nền tảng ngôn ngữ.',\n 'Chuẩn bị lịch tiêm 2 tháng: 6in1, Rota, PCV.',\n 'Mẹ đi khám hậu sản 6 tuần.',\n ],\n accent: 'amber',\n },\n {\n id: 'w5',\n periodLabel: 'Tuần 5',\n tagline: 'Wonder Week 1 — Giác quan thay đổi',\n ageFromDays: 28,\n ageToDays: 34,\n heroEmoji: '🌩️',\n stomach: { compareTo: 'quả trứng to', volumeMl: '120–150ml', emoji: '🥚', scale: 0.6 },\n mood: 'leap',\n moodLabel: 'Leap 1 • Tuần khủng hoảng',\n funFacts: [\n 'Leap 1 \"World of Changing Sensations\" — bước nhảy nhận thức đầu tiên.',\n '3 chữ C: Crying (khóc), Clinginess (bám), Crankiness (cáu) — kéo dài 1–2 tuần.',\n 'Sau leap: giác quan nhạy hơn, phản ứng đa dạng với âm thanh + ánh sáng.',\n 'Nhận ra giọng mẹ trong đám đông.',\n ],\n skills: ['Phối hợp mắt-tai', 'Phản ứng chi tiết với ngoại cảnh'],\n parentNotes: [\n 'Đừng hoảng: giai đoạn fussy chỉ vài ngày → vài tuần.',\n 'Ôm ấp nhiều hơn, giảm kích thích mạnh (đám đông, đèn chói).',\n 'Bé bú nhiều hơn để tự trấn an — không phải thiếu sữa.',\n ],\n accent: 'plum',\n },\n {\n id: 'w6',\n periodLabel: 'Tuần 6',\n tagline: 'Post-leap glow + Growth spurt',\n ageFromDays: 35,\n ageToDays: 48,\n heroEmoji: '✨',\n stomach: { compareTo: 'quả chanh', volumeMl: '120–150ml', emoji: '🍋', scale: 0.65 },\n mood: 'growth',\n moodLabel: 'Growth spurt #2 • Cười nhiều',\n funFacts: [\n 'Đợt tăng trưởng tiếp theo (tuần 6) — đòi bú tăng đột ngột.',\n 'Tiếng cười thành âm thanh, không chỉ cười mắt.',\n 'Theo dõi bằng mắt chính xác hơn, thích đồ đen-trắng tương phản.',\n 'Nhiều bé bắt đầu ngủ đêm liền mạch 5 giờ.',\n ],\n skills: ['Cười thành tiếng nhẹ', 'Nhấc đầu khi nằm sấp vài giây'],\n parentNotes: [\n 'Cho bú theo nhu cầu — đừng hoảng vì bú tăng đột ngột.',\n 'Tummy time 2–3 lần/ngày, mỗi lần 3–5 phút.',\n 'Bắt đầu routine ngủ nhẹ: tắm → bú → ru.',\n ],\n accent: 'sky',\n },\n {\n id: 'w8',\n periodLabel: 'Tuần 8',\n tagline: 'Wonder Week 2 — Mẫu hình',\n ageFromDays: 49,\n ageToDays: 62,\n heroEmoji: '🧩',\n stomach: { compareTo: 'quả chanh', volumeMl: '150ml', emoji: '🍋', scale: 0.7 },\n mood: 'leap',\n moodLabel: 'Leap 2 • World of Patterns',\n funFacts: [\n 'Leap 2 \"World of Patterns\" — bé nhận ra mẫu hình lặp lại.',\n 'Bắt đầu ngắm tay mình như khám phá đồ vật mới.',\n 'Soi gương, chú ý khuôn mặt lâu hơn.',\n 'Nhấc đầu 45° khi nằm sấp.',\n ],\n skills: ['Nhận diện mẫu hình', 'Hóng chuyện chăm chú', 'Cầm lục lạc ngắn'],\n parentNotes: [\n '⚠️ Tiêm chủng 2 tháng: 6in1 (bạch hầu/ho gà/uốn ván/bại liệt/Hib/viêm gan B), Rota, PCV.',\n 'Đọc sách tương phản, treo di động trên nôi.',\n 'Routine ngủ ổn định hơn.',\n ],\n accent: 'lavender',\n },\n {\n id: 'w10',\n periodLabel: 'Tuần 10',\n tagline: 'Giai đoạn thiên thần',\n ageFromDays: 63,\n ageToDays: 76,\n heroEmoji: '🌈',\n stomach: { compareTo: 'quả chanh to', volumeMl: '150–180ml', emoji: '🍋', scale: 0.75 },\n mood: 'happy',\n moodLabel: 'Happy • Ít colic hơn',\n funFacts: [\n 'Colic thường dịu đi sau 10 tuần — mẹ thở phào!',\n 'Với tay chạm đồ chơi, đưa tay vào miệng khám phá.',\n 'Ngủ đêm dài hơn, nhịp ngày-đêm rõ ràng.',\n 'Bắt đầu \"hội thoại\" với mẹ: ê a → chờ phản hồi → ê a tiếp.',\n ],\n skills: ['Phối hợp tay-mắt sơ khai', 'Ê a đa âm'],\n parentNotes: [\n 'Cho bé cầm khăn mềm, đồ chơi chất liệu khác nhau.',\n 'Đọc sách to mỗi ngày 5–10 phút.',\n 'Routine tắm-bú-ngủ buổi tối.',\n ],\n accent: 'mint',\n },\n {\n id: 'w12',\n periodLabel: 'Tuần 12',\n tagline: 'Wonder Week 3 — Chuyển động mượt',\n ageFromDays: 77,\n ageToDays: 104,\n heroEmoji: '🎶',\n stomach: { compareTo: 'quả cam nhỏ', volumeMl: '150–180ml', emoji: '🍊', scale: 0.8 },\n mood: 'leap',\n moodLabel: 'Leap 3 • Smooth Transitions',\n funFacts: [\n 'Leap 3 \"World of Smooth Transitions\" — nhận ra chuyển động và âm thanh mượt.',\n 'Tiếng cười to rõ ràng — \"giggle\".',\n 'Giọng nói có ngữ điệu, tay chân phối hợp mượt hơn.',\n 'Một số bé ngủ liền 6 giờ đêm.',\n ],\n skills: ['Cười thành tiếng', 'Xoay đầu theo âm thanh', 'Cầm nắm chắc hơn'],\n parentNotes: [\n 'Dành thời gian chơi tương tác: ú òa, đùa nhẹ.',\n 'Chuẩn bị tâm lý cho 4-month sleep regression (sắp tới).',\n 'Hệ tiêu hóa CHƯA sẵn sàng ăn dặm — kiên nhẫn tới 6 tháng.',\n ],\n accent: 'lavender',\n },\n {\n id: 'm4',\n periodLabel: 'Tháng 4',\n tagline: 'Leap 4 + Sleep regression',\n ageFromDays: 105,\n ageToDays: 135,\n heroEmoji: '🔄',\n stomach: { compareTo: 'quả cam', volumeMl: '180ml', emoji: '🍊', scale: 0.85 },\n mood: 'leap',\n moodLabel: 'Leap 4 • 4-month regression',\n funFacts: [\n 'Leap 4 \"World of Events\" (tuần 19) — bước nhảy lớn nhất giai đoạn sơ sinh.',\n '\"4-month sleep regression\": bé thức dậy nhiều lần/đêm, ngủ ngắn ban ngày.',\n 'Bắt đầu lẫy từ ngửa sang sấp — không để bé một mình trên giường cao.',\n 'Chảy nước dãi, cắn đồ: mọc răng có thể đến.',\n ],\n skills: ['Lật người', 'Cầm đồ 2 tay', 'Phản ứng cảm xúc đa dạng'],\n parentNotes: [\n 'Giữ routine ổn định, cho bé học \"drowsy but awake\".',\n 'Chưa ép ăn dặm — đợi dấu hiệu sẵn sàng + 6 tháng tuổi.',\n 'Tiêm chủng 4 tháng (nhắc lại 6in1, Rota, PCV).',\n ],\n accent: 'plum',\n },\n {\n id: 'm5',\n periodLabel: 'Tháng 5',\n tagline: 'Sẵn sàng khám phá',\n ageFromDays: 136,\n ageToDays: 166,\n heroEmoji: '🧸',\n stomach: { compareTo: 'quả cam lớn', volumeMl: '180–210ml', emoji: '🍊', scale: 0.9 },\n mood: 'happy',\n moodLabel: 'Happy • Tò mò mãnh liệt',\n funFacts: [\n 'Lẫy cả 2 chiều thành thạo, ngồi có đỡ.',\n 'Với đồ vật chính xác, chuyển đồ giữa 2 tay.',\n 'Nhận biết tên riêng — quay đầu khi gọi tên.',\n 'Có thể mọc răng đầu tiên (thường răng cửa dưới).',\n ],\n skills: ['Nhận biết tên', 'Ngồi có đỡ', 'Kéo đồ về mình'],\n parentNotes: [\n 'Quan sát dấu hiệu sẵn sàng ăn dặm: ngồi vững có đỡ, hết phản xạ đẩy lưỡi, quan tâm thức ăn người lớn.',\n 'Chơi \"ú òa\" — phát triển \"object permanence\".',\n 'Mua ghế ăn, yếm, thìa silicon.',\n ],\n accent: 'mint',\n },\n {\n id: 'm6',\n periodLabel: 'Tháng 6',\n tagline: 'Leap 5 + Ăn dặm!',\n ageFromDays: 167,\n ageToDays: 197,\n heroEmoji: '🥄',\n stomach: { compareTo: 'quả cam', volumeMl: '200–240ml', emoji: '🍊', scale: 1.0 },\n mood: 'milestone',\n moodLabel: 'Cột mốc • Bắt đầu ăn dặm',\n funFacts: [\n '🎉 Leap 5 \"World of Relationships\" (tuần 26) — nhận ra khoảng cách, quan hệ.',\n 'BẮT ĐẦU ĂN DẶM — cột mốc lớn! WHO: 6 tháng đầu bú sữa hoàn toàn.',\n 'Ngồi không cần đỡ, bò trườn, có thể đổi đồ giữa 2 tay.',\n 'Dự trữ sắt từ thai kỳ bắt đầu cạn — ăn dặm cần thực phẩm giàu sắt.',\n ],\n skills: ['Ngồi vững', 'Bò/trườn', 'Bắt đầu ăn dặm'],\n parentNotes: [\n 'Nguyên tắc 3 ngày 1 món mới để phát hiện dị ứng.',\n 'Thực phẩm an toàn: cháo loãng, khoai lang, bí đỏ, chuối, bơ.',\n '🚫 Tránh: muối, đường, mật ong, sữa bò tươi.',\n ],\n accent: 'amber',\n },\n {\n id: 'm7',\n periodLabel: 'Tháng 7',\n tagline: 'Đa dạng vị giác',\n ageFromDays: 198,\n ageToDays: 228,\n heroEmoji: '🍽️',\n stomach: { compareTo: 'quả cam', volumeMl: '~250ml', emoji: '🍊', scale: 1.05 },\n mood: 'happy',\n moodLabel: 'Happy • Khám phá',\n funFacts: [\n 'Ăn dặm 2 bữa/ngày, nhiều loại rau củ hơn.',\n 'Bò thành thạo, có thể tự đứng vịn.',\n 'Bập bẹ \"ba-ba\", \"ma-ma\" chưa có nghĩa.',\n 'Răng đầu tiên thường xuất hiện.',\n ],\n skills: ['Finger food', 'Đứng vịn', 'Bập bẹ đa âm'],\n parentNotes: [\n 'Finger food: chuối mềm, bánh gạo, súp lơ luộc — phát triển cầm nắm.',\n 'Vệ sinh răng bằng gạc ẩm sau bú/ăn.',\n 'Không cho ngậm bình khi ngủ — sâu răng bú bình.',\n ],\n accent: 'peach',\n },\n {\n id: 'm8',\n periodLabel: 'Tháng 8',\n tagline: 'Sợ người lạ',\n ageFromDays: 229,\n ageToDays: 258,\n heroEmoji: '🫂',\n stomach: { compareTo: 'quả cam lớn', volumeMl: '~250ml', emoji: '🍊', scale: 1.1 },\n mood: 'calm',\n moodLabel: 'Calm • Gắn bó an toàn',\n funFacts: [\n 'Bắt đầu \"sợ người lạ\" (stranger anxiety) — bám mẹ. Bình thường 8–10 tháng.',\n 'Hiểu object permanence: đồ vẫn tồn tại khi khuất tầm nhìn.',\n 'Có thể bò thành thạo, đứng vịn lâu hơn.',\n 'Ăn sữa chua, phô mai tươi được rồi.',\n ],\n skills: ['Bò thành thạo', 'Đứng vịn', 'Hiểu object permanence'],\n parentNotes: [\n 'Không ép bé ôm người lạ — tôn trọng cảm xúc.',\n 'Chơi trò tìm đồ dưới khăn — phát triển trí nhớ.',\n 'Bữa phụ: trái cây, sữa chua không đường.',\n ],\n accent: 'mint',\n },\n {\n id: 'm9',\n periodLabel: 'Tháng 9',\n tagline: 'Leap 6 + Vịn đứng',\n ageFromDays: 259,\n ageToDays: 289,\n heroEmoji: '🧠',\n stomach: { compareTo: 'quả cam to', volumeMl: '~250ml', emoji: '🍊', scale: 1.1 },\n mood: 'leap',\n moodLabel: 'Leap 6 • Categories',\n funFacts: [\n 'Leap 6 \"World of Categories\" (tuần 37) — bé phân loại đồ vật.',\n 'Vịn đứng, men ghế — sắp đi!',\n 'Hiểu lệnh đơn giản: \"không\", \"vẫy tay bye\".',\n 'Có thể có 4–6 răng.',\n ],\n skills: ['Vịn đứng', 'Men ghế', 'Hiểu lệnh đơn giản'],\n parentNotes: [\n 'Dọn nhà an toàn: che ổ cắm, góc bàn, cầu thang.',\n '9-month well visit — khám tổng quát + tiêm nhắc.',\n 'Bữa ăn đa dạng: 3 bữa chính + 1–2 bữa phụ.',\n ],\n accent: 'sky',\n },\n {\n id: 'm10',\n periodLabel: 'Tháng 10',\n tagline: 'Leap 7 — Chuỗi hành động',\n ageFromDays: 290,\n ageToDays: 319,\n heroEmoji: '🎯',\n stomach: { compareTo: 'quả cam to', volumeMl: '250–300ml', emoji: '🍊', scale: 1.15 },\n mood: 'leap',\n moodLabel: 'Leap 7 • Sequences',\n funFacts: [\n 'Leap 7 \"World of Sequences\" (tuần 46) — hiểu chuỗi hành động.',\n 'Chỉ vào đồ vật để yêu cầu (pointing).',\n 'Có thể đi vài bước có đỡ.',\n 'Mô phỏng: vẫy tay, vỗ tay theo mẹ.',\n ],\n skills: ['Pointing', 'Đi vịn', 'Mô phỏng hành động'],\n parentNotes: [\n 'Khen ngợi khi bé cố gắng — củng cố tự tin.',\n 'Chưa nên cho xem màn hình (AAP khuyến cáo <18 tháng).',\n 'Cho bé tự xúc, chấp nhận bừa bộn.',\n ],\n accent: 'coral',\n },\n {\n id: 'm11',\n periodLabel: 'Tháng 11',\n tagline: 'Sắp biết đi',\n ageFromDays: 320,\n ageToDays: 349,\n heroEmoji: '🚶',\n stomach: { compareTo: 'quả cam', volumeMl: '~300ml', emoji: '🍊', scale: 1.2 },\n mood: 'happy',\n moodLabel: 'Happy • Tiền vận động',\n funFacts: [\n 'Cruising: đi vịn quanh đồ đạc.',\n 'Từ đơn đầu tiên có thể xuất hiện: \"ba\", \"mẹ\".',\n 'Cầm đồ bằng ngón cái + ngón trỏ (pincer grasp).',\n 'Thức dậy vui vẻ, vẫy tay chào.',\n ],\n skills: ['Pincer grasp', 'Cruising', 'Từ đơn đầu tiên'],\n parentNotes: [\n 'Cho bé đi chân đất ở nơi an toàn — tốt cho phát triển bàn chân.',\n 'Giảm lượng sữa, tăng bữa ăn.',\n 'Duy trì giấc ngủ trưa 2 giấc.',\n ],\n accent: 'amber',\n },\n {\n id: 'm12',\n periodLabel: 'Tháng 12',\n tagline: '🎂 Cột mốc 1 tuổi',\n ageFromDays: 350,\n ageToDays: 410,\n heroEmoji: '🎂',\n stomach: { compareTo: 'quả bưởi nhỏ', volumeMl: '~300ml', emoji: '🍈', scale: 1.25 },\n mood: 'milestone',\n moodLabel: 'Cột mốc • Sinh nhật 1 tuổi',\n funFacts: [\n 'Leap 8 \"World of Programs\" (tuần 55) thường rơi vào tháng 13.',\n '🎉 Bước đi đầu tiên (hầu hết bé 9–15 tháng).',\n 'Từ có nghĩa đầu tiên, hiểu ~50 từ.',\n 'Có thể chuyển dần sang sữa bò tươi nguyên kem (AAP).',\n ],\n skills: ['Bước đi đầu tiên', '1–3 từ có nghĩa', 'Uống bằng cốc'],\n parentNotes: [\n 'Khám 12 tháng: tiêm sởi-quai bị-rubella (MMR), thủy đậu, viêm não Nhật Bản.',\n 'Chuyển từ bình sang cốc tập uống.',\n 'Bắt đầu đọc sách có cốt truyện đơn giản.',\n ],\n accent: 'rose',\n },\n {\n id: 'm15',\n periodLabel: 'Tháng 15',\n tagline: 'Leap 9 + Đi vững',\n ageFromDays: 411,\n ageToDays: 532,\n heroEmoji: '🏃',\n stomach: { compareTo: 'quả bưởi', volumeMl: '~350ml', emoji: '🍈', scale: 1.3 },\n mood: 'milestone',\n moodLabel: 'Phát triển ngôn ngữ',\n funFacts: [\n 'Leap 9 \"World of Principles\" (tuần 64) — hiểu nguyên tắc.',\n 'Đi vững, thử chạy nhẹ.',\n 'Vốn từ 3–10 từ, hiểu hàng chục từ khác.',\n 'Bắt đầu \"nói không\" — khẳng định bản thân.',\n ],\n skills: ['Đi vững', 'Xếp khối 2–3 tầng', 'Chỉ bộ phận cơ thể'],\n parentNotes: [\n 'Cho bé tự chọn 2 option để phát triển tự lập.',\n 'Đọc sách tranh mỗi ngày, lặp lại từ mới.',\n 'Kiên nhẫn với tantrum — bé chưa đủ ngôn ngữ để diễn đạt.',\n ],\n accent: 'lavender',\n },\n {\n id: 'm18',\n periodLabel: 'Tháng 18',\n tagline: 'Bùng nổ ngôn ngữ',\n ageFromDays: 533,\n ageToDays: 653,\n heroEmoji: '💬',\n stomach: { compareTo: 'quả bưởi', volumeMl: '~400ml', emoji: '🍈', scale: 1.35 },\n mood: 'happy',\n moodLabel: 'Happy • Ngôn ngữ bùng nổ',\n funFacts: [\n 'Vốn từ 10–25+ (từng bé rất khác nhau).',\n 'Chạy, leo trèo, đá bóng.',\n 'Bắt đầu chơi tưởng tượng (cho búp bê ăn).',\n 'Thích \"tự làm\" — kéo khóa, đi giày.',\n ],\n skills: ['Chạy', 'Câu 2 từ', 'Chơi tưởng tượng'],\n parentNotes: [\n 'Hạn chế màn hình: AAP <1 giờ/ngày, chất lượng cao, xem cùng bé.',\n 'Cho bé giúp việc nhỏ: dọn đồ chơi, bỏ rác.',\n 'Kiểm tra 18 tháng: tầm soát tự kỷ (M-CHAT).',\n ],\n accent: 'sky',\n },\n {\n id: 'm24',\n periodLabel: 'Tháng 24',\n tagline: 'Leap 10 + Câu đơn',\n ageFromDays: 654,\n ageToDays: 730,\n heroEmoji: '🌟',\n stomach: { compareTo: 'bưởi lớn', volumeMl: '~500ml', emoji: '🍈', scale: 1.45 },\n mood: 'milestone',\n moodLabel: 'Cột mốc • 2 tuổi',\n funFacts: [\n 'Leap 10 \"World of Systems\" (tuần 75) — leap cuối trong The Wonder Weeks.',\n 'Vốn từ 50–100+, nói câu 2–3 từ; CDC 24 tháng: chạy, lên cầu thang có đỡ, xếp cọc 6 khối.',\n 'Chạy, nhảy 2 chân, đạp xe 3 bánh (một số bé).',\n 'Giai đoạn \"terrible twos\" — tantrum là cách bé xử lý cảm xúc.',\n ],\n skills: ['Câu 2–3 từ', 'Nhảy 2 chân', 'Tập dùng bô'],\n parentNotes: [\n 'Gọi tên cảm xúc của bé — giúp bé học điều tiết.',\n 'Khám 24 tháng: tầm soát tự kỷ lần 2, đánh giá ngôn ngữ.',\n 'Có thể bắt đầu tập bô — không ép nếu bé chưa sẵn sàng.',\n ],\n accent: 'plum',\n },\n {\n id: 'm30',\n periodLabel: 'Tháng 30',\n tagline: 'Ngôn hội thoại + giả vờ',\n ageFromDays: 731,\n ageToDays: 912,\n heroEmoji: '🧸',\n stomach: {\n compareTo: 'cốc nhỏ / bát',\n volumeMl: '180–240ml sữa hoặc bữa',\n emoji: '🥛',\n scale: 1.35,\n },\n mood: 'happy',\n moodLabel: 'Happy • 2.5 tuổi',\n funFacts: [\n 'CDC ~30 tháng: dùng cụm 2–3 từ; chơi giả vừa đơn giản; làm theo chỉ dẫn 2 bước; xếp ~6 khối.',\n 'Đi lên cầu thang có người đỡ từng bậc; nhảy chỗ tại chỗ.',\n 'Bắt đầu hiểu “của em / của bạn”, thích lặp lại câu chuyện quen.',\n ],\n skills: ['Cụm 2–3 từ', 'Giả vờ ăn/uống', 'Chỉ dẫn 2 bước'],\n parentNotes: [\n 'Đặt giới hạn rõ, lặp lại ngắn gọn; khen hành vi mong muốn cụ thể.',\n 'Tiếp tục hạn chế màn hình; đọc sách, hát, chơi ngoài trời.',\n 'Khám định kỳ + tiêm nhắc theo lịch địa phương.',\n ],\n accent: 'sky',\n },\n {\n id: 'm36',\n periodLabel: 'Tháng 36',\n tagline: '3 tuổi — giao tiếp 2 chiều',\n ageFromDays: 913,\n ageToDays: 1200,\n heroEmoji: '🎈',\n stomach: {\n compareTo: 'bữa + sữa',\n volumeMl: '~200–300ml sữa/ngày (tùy bé)',\n emoji: '🍼',\n scale: 1.4,\n },\n mood: 'milestone',\n moodLabel: 'Cột mốc • 3 tuổi',\n funFacts: [\n 'CDC ~36 tháng: trò chuyện 2–3 lượt đổi thoại; nói tên khi được hỏi; làm dịu trong ~10 phút ở chỗ quen.',\n 'Đi cầu thang xen kẽ chân, đạp xe 3 bánh tốt hơn, vẽ nét xiên.',\n 'Chơi gần bạn; chia sẻ vẫn đang học — bình thường ở lứa này.',\n ],\n skills: ['Hội thoại ngắn', 'Tên bản thân', 'Vẽ / xếp hình'],\n parentNotes: [\n 'Chuẩn bị môi trường mẫu giáo: giao tiếp xã hội, vệ sinh, ngủ trưa.',\n 'Kiểm tra thị lực/nha khoa theo khuyến cáo địa phương.',\n 'Duy trì ngủ đủ; màn hình trước ngủ làm khó vào giấc.',\n ],\n accent: 'mint',\n },\n];\n\n/**\n * Checklist chăm sóc theo từng mốc.\n *\n * Tóm tắt thực hành từ AAP/HealthyChildren, CDC \"Learn the Signs. Act Early\",\n * WHO/CDC complementary feeding và khuyến nghị an toàn ngủ AAP 2022.\n * Nội dung là nhắc việc trong app, không thay thế tư vấn y khoa cá nhân.\n */\nexport const BABY_TIMELINE_CARE_GUIDES: Record<string, TimelineCareGuide> = {\n w1: {\n todos: [\n 'Ghi lại số cữ bú, tã ướt/bẩn và cân nặng sau xuất viện.',\n 'Cho bé nằm ngửa khi ngủ, mặt phẳng cứng, không gối/chăn/thú bông.',\n 'Đặt lịch/nhớ lịch tái khám sơ sinh và kiểm tra vàng da nếu bé vàng tăng.',\n ],\n notToDo: [\n 'Không cho uống nước, mật ong, trà, nước lá hoặc tự ý pha loãng sữa.',\n 'Không để bé ngủ trên ghế rung, sofa, gối chống trào ngược hoặc bề mặt nghiêng.',\n 'Không lắc bé khi khóc; nếu quá mệt, đặt bé an toàn vào nôi và gọi người hỗ trợ.',\n ],\n watchFor: [\n 'Sốt từ 38°C, bú kém, li bì, thở rút lõm hoặc tím tái.',\n 'Ít tã ướt, nước tiểu sẫm, vàng da lan xuống bụng/chân hoặc khó đánh thức.',\n ],\n },\n w2: {\n todos: [\n 'Tiếp tục theo dõi bé lấy lại cân nặng sinh trong khoảng 10–14 ngày.',\n 'Giữ cuống rốn khô thoáng, gấp mép tã xuống dưới rốn.',\n 'Mỗi ngày vài phút tummy time khi bé thức và có người quan sát.',\n ],\n notToDo: [\n 'Không bôi thuốc, cồn, lá hoặc phấn lên rốn nếu bác sĩ không dặn.',\n 'Không ép bé theo lịch bú cứng khi bé đang có dấu hiệu đói.',\n 'Không để người đang bệnh hôn mặt/tay bé.',\n ],\n watchFor: [\n 'Rốn đỏ lan, sưng, mủ, hôi hoặc bé sốt.',\n 'Không tăng cân, bú rất yếu hoặc nôn xanh/nôn vọt nhiều lần.',\n ],\n },\n w3: {\n todos: [\n 'Chuẩn bị kế hoạch chống quá tải: thay phiên bế, địu, white noise, phòng tối.',\n 'Kiểm tra khớp ngậm hoặc bình sữa nếu bé bú lâu nhưng vẫn đói.',\n 'Tăng tummy time ngắn nhiều lần trong ngày thay vì một lần dài.',\n ],\n notToDo: [\n 'Không kết luận thiếu sữa chỉ vì cluster feeding vài ngày.',\n 'Không tự dùng thuốc trị colic, men, lá tắm/uống nếu chưa hỏi bác sĩ.',\n 'Không cho bé ngủ sấp để đỡ đầy hơi.',\n ],\n watchFor: [\n 'Khóc thét kèm sốt, bụng chướng, nôn xanh, phân máu hoặc bỏ bú.',\n 'Ba mẹ kiệt sức, buồn bã kéo dài, có ý nghĩ làm hại bản thân hoặc bé.',\n ],\n },\n w4: {\n todos: [\n 'Nói chuyện mặt đối mặt, chờ bé ê a rồi đáp lại như một cuộc hội thoại.',\n 'Bắt đầu routine ngủ rất ngắn: ánh sáng dịu, bú, vỗ ợ, đặt ngủ.',\n 'Rà lịch tiêm 2 tháng và chuẩn bị câu hỏi cho lần khám tới.',\n ],\n notToDo: [\n 'Không để TV/điện thoại chạy nền gần bé; bé học tốt nhất từ người thật.',\n 'Không dùng gối/chăn chèn quanh người để giữ tư thế.',\n 'Không để bé một mình trên giường, sofa hoặc bàn thay tã.',\n ],\n watchFor: [\n 'Không nhìn mặt người chăm sóc hoặc không phản ứng với âm thanh lớn.',\n 'Cử động tay/chân rất ít, mềm nhũn hoặc gồng cứng bất thường.',\n ],\n },\n w5: {\n todos: [\n 'Giảm kích thích: ánh sáng dịu, ít khách, ôm/địu nhiều hơn nếu bé cần.',\n 'Dùng checklist đói-buồn ngủ-tã-ợ hơi trước khi kết luận bé khó.',\n 'Ghi lại thời điểm quấy để nhận diện pattern buổi chiều/tối.',\n ],\n notToDo: [\n 'Không sleep-train khắc nghiệt ở giai đoạn còn quá nhỏ.',\n 'Không cố kéo dài cữ bú/ngủ bằng nước, núm vú tẩm mật ong hoặc cereal trong bình.',\n 'Không so sánh leap theo ngày tuyệt đối; bé sinh non cần tính tuổi hiệu chỉnh.',\n ],\n watchFor: [\n 'Quấy không dỗ được kèm sốt, bỏ bú hoặc khó thở.',\n 'Bé không nhìn theo mặt/đồ vật gần hoặc không có khoảnh khắc tỉnh táo tương tác.',\n ],\n },\n w6: {\n todos: [\n 'Tummy time 2–3 lần/ngày, tăng dần theo sức bé.',\n 'Cho bé nhìn tranh tương phản, lục lạc mềm, nghe giọng ba mẹ.',\n 'Đi khám hậu sản cho mẹ và trao đổi nếu có triệu chứng trầm cảm sau sinh.',\n ],\n notToDo: [\n 'Không để bé nằm lâu một tư thế; đổi hướng đầu khi ngủ để giảm bẹt đầu.',\n 'Không cho bé ngủ trong địu/car seat khi không được theo dõi.',\n 'Không tự tăng nồng độ sữa công thức để bé no lâu.',\n ],\n watchFor: [\n 'Không bắt đầu cười xã giao hoặc không dịu khi được nói chuyện/ôm ấp.',\n 'Đầu luôn nghiêng một bên, cổ cứng hoặc bú khó do quay cổ kém.',\n ],\n },\n w8: {\n todos: [\n 'Hoàn tất mũi tiêm 2 tháng theo lịch địa phương và ghi phản ứng sau tiêm.',\n 'Đọc sách tương phản 5–10 phút/ngày, gọi tên vật bé đang nhìn.',\n 'Tập đặt bé xuống khi buồn ngủ nhưng còn tỉnh nếu bé hợp tác.',\n ],\n notToDo: [\n 'Không trì hoãn vaccine chỉ vì bé hơi sổ mũi nhẹ nếu bác sĩ vẫn cho tiêm.',\n 'Không dùng thuốc hạ sốt dự phòng trước tiêm nếu chưa được hướng dẫn.',\n 'Không để bé ngủ với bình sữa trong miệng.',\n ],\n watchFor: [\n 'Không cười, không nhìn mặt, không phản ứng với tiếng động lớn.',\n 'Sau tiêm: sốt cao, khó thở, phát ban lan nhanh hoặc li bì.',\n ],\n },\n w10: {\n todos: [\n 'Cho bé chạm chất liệu an toàn: khăn mềm, vòng silicon, đồ chơi nhẹ.',\n 'Duy trì lịch ngày-đêm: sáng có ánh sáng, tối giảm kích thích.',\n 'Bắt đầu nói “đến lượt mẹ/ba” khi bé ê a để luyện turn-taking.',\n ],\n notToDo: [\n 'Không đưa đồ nhỏ, dây dài, túi nylon hoặc hạt/nút gần bé.',\n 'Không bật màn hình để giữ bé yên; dưới 18 tháng nên tránh màn hình trừ video call.',\n 'Không để bé tự bú bình không có người quan sát.',\n ],\n watchFor: ['Không đưa tay lên miệng, không nhìn theo vật hoặc không tạo âm ngoài tiếng khóc.'],\n },\n w12: {\n todos: [\n 'Chơi ú òa, hát lặp lại, đổi nhịp nhanh/chậm để bé nhận ra chuyển động mượt.',\n 'Tăng tummy time và đặt đồ chơi lệch bên để khuyến khích xoay đầu/với tay.',\n 'Chuẩn bị kiến thức 4-month regression: thức đêm tăng không đồng nghĩa bé đói mãi.',\n ],\n notToDo: [\n 'Không bắt đầu ăn dặm chỉ vì bé nhìn miệng người lớn ăn.',\n 'Không dùng gối định vị, chăn quấn khi bé bắt đầu có dấu hiệu lẫy.',\n 'Không ép bé tập ngồi lâu nếu cổ/lưng chưa vững.',\n ],\n watchFor: [\n 'Không giữ đầu tốt hơn, không cười thành tiếng hoặc không quay về phía âm thanh.',\n 'Mất kỹ năng đã có như không còn nhìn theo/cười/ê a.',\n ],\n },\n m4: {\n todos: [\n 'Dọn mặt phẳng thấp để bé lẫy an toàn; luôn đặt một tay khi thay tã.',\n 'Duy trì routine ngủ, phân biệt bú để ngủ và bú vì đói khi có thể.',\n 'Hoàn tất mũi tiêm 4 tháng và hỏi bác sĩ về tăng trưởng/giấc ngủ.',\n ],\n notToDo: [\n 'Không để bé trên giường/sofa không có người sát bên dù chưa biết lẫy nhiều.',\n 'Không cho ăn dặm trước 4 tháng; thường nên đợi khoảng 6 tháng và đủ dấu hiệu sẵn sàng.',\n 'Không dùng vòng hổ phách, gel mọc răng gây tê hoặc đồ ngậm nhỏ.',\n ],\n watchFor: [\n 'Không giữ đầu vững, không đưa tay vào miệng, không phát âm đáp lại.',\n 'Ngủ xấu kèm bú kém, sụt cân, nôn nhiều hoặc khó thở.',\n ],\n },\n m5: {\n todos: [\n 'Cho bé ngồi có đỡ ngắn, chơi với đồ hai tay và gọi tên bé thường xuyên.',\n 'Chuẩn bị ghế ăn, yếm, thìa mềm; học dấu hiệu sẵn sàng ăn dặm.',\n 'Baby-proof sớm: ổ điện, dây kéo rèm, cạnh bàn, đồ nhỏ dưới sàn.',\n ],\n notToDo: [\n 'Không cho mật ong, nước trái cây, muối/đường hoặc thức ăn nguyên miếng cứng.',\n 'Không dùng xe tập đi có bánh; tăng nguy cơ tai nạn cầu thang.',\n 'Không so ép cân nặng từng ngày; nhìn xu hướng theo biểu đồ.',\n ],\n watchFor: [\n 'Không lẫy/hầu như không với đồ, không đáp lại âm thanh hoặc không nhận ra người quen.',\n 'Nuốt nghẹn, ho tím khi bú/ăn thử hoặc chậm tăng cân.',\n ],\n },\n m6: {\n todos: [\n 'Bắt đầu ăn dặm khi bé ngồi có đỡ, kiểm soát đầu cổ và hết phản xạ đẩy lưỡi.',\n 'Ưu tiên thực phẩm giàu sắt: thịt nghiền, cá phù hợp, trứng chín, đậu, ngũ cốc tăng cường sắt.',\n 'Tập uống nước ít bằng cốc mở/cốc tập uống trong bữa ăn dặm.',\n ],\n notToDo: [\n 'Không thay sữa mẹ/sữa công thức bằng bữa ăn dặm quá nhanh.',\n 'Không cho mật ong, sữa bò tươi làm đồ uống chính, muối/đường thêm vào món.',\n 'Không để bé ăn một mình; luôn ngồi thẳng và có người quan sát.',\n ],\n watchFor: [\n 'Không thể ngồi có đỡ, không đưa đồ vào miệng hoặc không quan tâm tương tác.',\n 'Dị ứng: nổi mề đay, sưng môi/mặt, khò khè, nôn nhiều sau món mới.',\n ],\n },\n m7: {\n todos: [\n 'Tăng texture từ mịn sang nghiền lợn cợn/mềm, cho bé tự bốc món dễ tan.',\n 'Vệ sinh răng/nướu 2 lần/ngày bằng gạc/khăn mềm hoặc bàn chải phù hợp.',\n 'Dạy ký hiệu đơn giản như “thêm”, “xong” nếu gia đình thích.',\n ],\n notToDo: [\n 'Không cho nho nguyên quả, hạt, bỏng ngô, xúc xích khoanh tròn, miếng táo/cà rốt sống cứng.',\n 'Không lau sạch tay/mặt quá mức trong bữa; bừa bộn là một phần học ăn.',\n 'Không ép ăn hết chén; tôn trọng dấu hiệu no.',\n ],\n watchFor: [\n 'Thường xuyên sặc, không chịu texture mới kéo dài hoặc nôn ói nhiều khi ăn.',\n 'Không bập bẹ, không cười/không tương tác hai chiều.',\n ],\n },\n m8: {\n todos: [\n 'Chơi giấu đồ dưới khăn, ú òa, gọi tên đồ vật để luyện object permanence.',\n 'Tạo góc bò an toàn mỗi ngày, bỏ đồ nhỏ khỏi sàn.',\n 'Cho bé gặp người mới từ từ, để bé quan sát trong vòng tay người quen.',\n ],\n notToDo: [\n 'Không ép bé chuyền tay/ôm người lạ khi bé sợ.',\n 'Không để cửa cầu thang, nhà tắm, bếp mở khi bé bắt đầu di chuyển nhanh.',\n 'Không cho ăn khi bé đang bò/chơi; ăn phải ngồi yên.',\n ],\n watchFor: [\n 'Không ngồi dù có hỗ trợ, không chuyển đồ giữa hai tay hoặc không phản ứng với tên.',\n 'Mất kỹ năng bò/trườn/với tay đã có.',\n ],\n },\n m9: {\n todos: [\n 'Rà soát an toàn nhà ở tầm đứng vịn: dây điện, khăn trải bàn, ngăn kéo, cạnh sắc.',\n 'Tăng bữa ăn 3 bữa chính nhỏ + 1–2 bữa phụ tùy nhu cầu sữa.',\n 'Dạy “không” bằng giọng bình tĩnh, chuyển hướng sang lựa chọn an toàn.',\n ],\n notToDo: [\n 'Không dùng xe tập đi có bánh hoặc để bé đứng vịn gần cầu thang.',\n 'Không cho thức ăn tròn/cứng/nguyên hạt; cắt dọc và nấu mềm.',\n 'Không phạt khi bé ném đồ; đó là khám phá nhân-quả.',\n ],\n watchFor: [\n 'Không ngồi vững, không bập bẹ phụ âm, không đáp lại tên hoặc không nhìn theo hướng chỉ.',\n 'Ăn rất ít kèm sụt cân, táo bón nặng hoặc tiêu chảy kéo dài.',\n ],\n },\n m10: {\n todos: [\n 'Khuyến khích chỉ trỏ: “Con muốn cái nào?” rồi gọi tên đồ vật.',\n 'Cho bé tự xúc bằng thìa dày, cốc tập uống, finger food mềm cắt nhỏ.',\n 'Tập chuỗi hành động vui: bỏ đồ vào hộp, lấy ra, vẫy tay chào.',\n ],\n notToDo: [\n 'Không dùng màn hình làm phần thưởng/đổi lấy ăn; dưới 18 tháng nên tránh trừ video call.',\n 'Không để bé cầm túi đồ ăn bóp khi nằm/ngồi xe không quan sát.',\n 'Không la mắng khi bé thử ném/đổ; đặt giới hạn ngắn và lặp lại.',\n ],\n watchFor: [\n 'Không chỉ trỏ/không dùng cử chỉ, không bắt chước vẫy tay/vỗ tay.',\n 'Không chịu lực chân hoặc lệch rõ một bên cơ thể.',\n ],\n },\n m11: {\n todos: [\n 'Cho bé đi chân đất trên bề mặt an toàn để cảm nhận thăng bằng.',\n 'Luyện pincer grasp bằng đồ ăn mềm cỡ nhỏ phù hợp và đồ chơi nhặt-thả.',\n 'Chuẩn bị chuyển dần từ bình sang cốc sau 12 tháng.',\n ],\n notToDo: [\n 'Không mua giày cứng để tập đi; giày chỉ cần khi ra ngoài.',\n 'Không cho bé vừa đi vừa cầm đồ ăn nguy cơ hóc.',\n 'Không tự ý giảm mạnh sữa nếu bữa ăn chưa ổn định.',\n ],\n watchFor: [\n 'Không bò/trườn/di chuyển bằng cách nào, không đứng có đỡ hoặc không tìm đồ bị giấu.',\n 'Không có âm bập bẹ đa dạng hoặc không giao tiếp bằng mắt/cử chỉ.',\n ],\n },\n m12: {\n todos: [\n 'Khám 12 tháng, tiêm theo lịch; hỏi về xét nghiệm thiếu máu/chì nếu thuộc nhóm nguy cơ.',\n 'Chuyển dần từ bình sang cốc, ăn cùng gia đình với món cắt nhỏ, ít muối.',\n 'Đọc sách hằng ngày, chỉ hình và chờ bé phản ứng/chỉ lại.',\n ],\n notToDo: [\n 'Không cho mật ong trước sinh nhật 1 tuổi; sau 12 tháng vẫn hạn chế đồ ngọt.',\n 'Không để bé ngủ với bình sữa; tăng nguy cơ sâu răng.',\n 'Không để TV nền trong bữa ăn/chơi.',\n ],\n watchFor: [\n 'Không đứng có đỡ, không chỉ trỏ, không tìm đồ bạn giấu trước mặt bé.',\n 'Không nói mama/dada hoặc âm tương tự có ý nghĩa/cử chỉ giao tiếp.',\n ],\n },\n m15: {\n todos: [\n 'Cho bé chọn giữa 2 lựa chọn an toàn: áo xanh/đỏ, chuối/sữa chua.',\n 'Dạy từ qua hoạt động thật: rửa tay, cất giày, bỏ đồ vào hộp.',\n 'Duy trì lịch ăn-ngủ ổn định để giảm tantrum vì quá đói/quá mệt.',\n ],\n notToDo: [\n 'Không dùng điện thoại để dập mọi tantrum; giúp bé gọi tên cảm xúc trước.',\n 'Không cho đồ ăn nguy cơ hóc như hạt, kẹo cứng, nho nguyên, xúc xích khoanh.',\n 'Không ép chia sẻ đồ chơi; kỹ năng này còn đang phát triển.',\n ],\n watchFor: [\n 'Không đi vài bước độc lập hoặc không dùng ít nhất vài từ/cử chỉ để giao tiếp.',\n 'Không bắt chước hành động đơn giản hoặc mất kỹ năng đã có.',\n ],\n },\n m18: {\n todos: [\n 'Hoàn tất khám 18 tháng và tầm soát tự kỷ M-CHAT nếu bác sĩ áp dụng.',\n 'Cho bé giúp việc nhỏ: bỏ tã vào thùng, lau bàn, cất sách.',\n 'Đặt giới hạn ngắn gọn: “Không đánh. Tay dùng để vuốt nhẹ.”',\n ],\n notToDo: [\n 'Không kỳ vọng bé tự điều tiết như người lớn; tantrum cần bình tĩnh và nhất quán.',\n 'Không để màn hình quá 1 giờ/ngày; nếu xem, chọn nội dung chất lượng và xem cùng.',\n 'Không dùng đồ uống ngọt/nước trái cây như thức uống thường ngày.',\n ],\n watchFor: [\n 'Không đi độc lập, không nói ít nhất 3 từ ngoài ba/mẹ, không chỉ để cho bạn xem.',\n 'Không hiểu lệnh 1 bước như “đưa mẹ bóng”.',\n ],\n },\n m24: {\n todos: [\n 'Khám 24 tháng, đánh giá ngôn ngữ, hành vi và tầm soát tự kỷ lần 2 nếu theo lịch.',\n 'Đọc sách có cốt truyện ngắn, hỏi “ai/cái gì/ở đâu” và chờ bé trả lời.',\n 'Tập bô nếu bé có dấu hiệu sẵn sàng: báo ướt/bẩn, ngồi được, tò mò toilet.',\n ],\n notToDo: [\n 'Không ép tập bô bằng phạt/xấu hổ; lùi lại nếu bé chống đối mạnh.',\n 'Không dùng màn hình trong phòng ngủ hoặc trước giờ ngủ.',\n 'Không cho chạy/đùa khi đang ăn; vẫn cần ngồi yên để tránh hóc.',\n ],\n watchFor: [\n 'Không dùng cụm 2 từ, không bắt chước hành động/từ, không chạy hoặc đi không vững.',\n 'Mất kỹ năng ngôn ngữ/xã hội, ít giao tiếp mắt hoặc không chơi giả vờ.',\n ],\n },\n m30: {\n todos: [\n 'Luyện chỉ dẫn 2 bước (“lấy giày rồi đưa mẹ”), khen cụ thể khi bé làm đúng.',\n 'Khuyến khích chơi giả đơn giản (búp bê, xe, nấu ăn) và mở rộng từ vựng khi chơi.',\n 'An toàn cầu thang/kệ: khóa cửa, neo tủ, đồ nhỏ và pin cất xa tầm tay.',\n ],\n notToDo: [\n 'Không trông bé một mình gần bể bơi/hồ nước dù nông — nguy cơ đuối nước rất nhanh.',\n 'Không dùng màn hình thay cho tương tác khi bé cáu; giúp bé đặt tên cảm xúc trước.',\n 'Không ép chia sẻ đồ chơi; kỹ năng này phát triển dần tới 3–4 tuổi.',\n ],\n watchFor: [\n 'Không làm theo chỉ 2 bước đơn giản, không chơi giả vờ, không cụm 2–3 từ.',\n 'Không xếp được vài khối, không chạy/chỉ dùng một tay kéo lê chân rõ rệt.',\n ],\n },\n m36: {\n todos: [\n 'Khám 3 tuổi theo lịch; nhắc tiêm/nha khoa/thị lực theo hướng dẫn địa phương.',\n 'Tập hội thoại 2–3 lượt: hỏi → chờ bé → đáp lại → hỏi tiếp.',\n 'Chuẩn bị giấc ngủ ổn định trước khi vào môi trường nhóm đông trẻ.',\n ],\n notToDo: [\n 'Không bỏ qua dấu hiệu nghe/khó hiểu lời — cần sàng lọc thính lực/ngôn ngữ nếu lo ngại.',\n 'Không để bé không có người lớn khi ở gần đường, bãi đỗ xe, cửa ra vào.',\n 'Không dùng điện thoại làm “dụng cụ dỗ” cho mọi tantrum.',\n ],\n watchFor: [\n 'Không trò chuyện qua lại ngắn, không nói tên khi được hỏi, không chơi gần bạn.',\n 'Hồi quy rõ kỹ năng đã có, mất ngôn ngữ/cử chỉ, giao tiếp mắt giảm mạnh.',\n ],\n },\n};\n\nexport function getTimelineCareGuide(milestoneId: string): TimelineCareGuide | null {\n return BABY_TIMELINE_CARE_GUIDES[milestoneId] || null;\n}\n\n/** Trả về milestone hiện tại dựa theo ngày tuổi */\nexport function getCurrentMilestone(ageInDays: number): TimelineMilestone | null {\n if (ageInDays < 0) return null;\n return BABY_TIMELINE.find((m) => ageInDays >= m.ageFromDays && ageInDays <= m.ageToDays) || null;\n}\n\n/** Trạng thái của milestone so với ngày tuổi hiện tại */\nexport function getMilestoneState(\n milestone: TimelineMilestone,\n ageInDays: number | null\n): 'past' | 'current' | 'future' {\n if (ageInDays === null) return 'future';\n if (ageInDays > milestone.ageToDays) return 'past';\n if (ageInDays >= milestone.ageFromDays) return 'current';\n return 'future';\n}\n","/**\n * Đánh giá cân nặng theo tuần tuổi — dựa trên chuẩn tăng trưởng WHO (0–10 tuổi).\n *\n * Việt Nam: chương trình quốc gia áp dụng Chuẩn tăng trưởng trẻ em của WHO.\n * App được cập nhật theo bảng chuẩn WHO 2024 và dữ liệu tham khảo từ Bibomart.\n *\n * Phạm vi hỗ trợ:\n * - 0-24 tháng: Theo tuần tuổi (độ chính xác cao)\n * - 2.5-10 tuổi: Theo năm tuổi (mở rộng hỗ trợ)\n *\n * Lưu ý: Chỉ mang tính tham khảo, không thay cho đo đạc và tư vấn tại cơ sở y tế.\n *\n * Nguồn tham khảo:\n * - WHO Child Growth Standards 2024\n * - Bảng chiều cao cân nặng chuẩn Bibomart (https://bibomart.com.vn/camnang/bang-chieu-cao-can-nang-cua-tre/)\n * - Chương trình quốc gia theo dõi tăng trưởng trẻ em Việt Nam\n */\n\n/** Mã vùng — dữ liệu chuẩn WHO được áp dụng rộng rãi tại Việt Nam */\nexport const GROWTH_REFERENCE_REGION_VN = 'VN' as const;\n\nexport const GROWTH_REFERENCE_CAPTION_VI =\n 'Chuẩn WHO 2024 (cập nhật từ Bibomart & khuyến nghị quốc gia VN)';\n\nexport type WeightGrowthSex = 'male' | 'female';\n\nexport type WeightGrowthStatus = 'very_low' | 'low' | 'normal' | 'high' | 'very_high' | 'unknown';\n\nexport interface WeightGrowthEvaluation {\n weeks: number;\n /** Tuần đầy đủ hiển thị */\n weeksLabel: string;\n medianKg: number;\n sdKg: number;\n zScore: number;\n status: WeightGrowthStatus;\n statusLabel: string;\n detail: string;\n estimate: WeightWeekEstimate;\n}\n\nexport interface WeightWeekEstimate {\n weekAge: number;\n currentWeightKg: number;\n medianKg: number;\n severeUnderweightMaxKg: number; // < -2SD\n underweightMaxKg: number; // < -1SD\n standardMinKg: number; // >= -1SD\n standardMaxKg: number; // <= +1SD\n overweightMinKg: number; // > +1SD\n highWeightMinKg: number; // > +2SD\n deltaFromMedianKg: number;\n}\n\n/**\n * Trục tuần (0 → 104) — trung vị cân (kg), nam — cập nhật theo WHO Child Growth Standards\n * Nguồn tham khảo: WHO Growth Standards và bảng chuẩn Bibomart (2024)\n */\nconst BOY_MEDIAN_WEEKS: readonly [number, number][] = [\n [0, 3.3], // Sơ sinh: 3.3kg (theo bảng WHO chuẩn VN)\n [4, 4.5], // 1 tháng: 4.5kg\n [8, 5.6], // 2 tháng: 5.6kg\n [12, 6.4], // 3 tháng: 6.4kg\n [16, 7.0], // 4 tháng: 7.0kg\n [20, 7.5], // 5 tháng: 7.5kg\n [24, 7.9], // 6 tháng: 7.9kg\n [28, 8.3], // 7 tháng: 8.3kg\n [32, 8.6], // 8 tháng: 8.6kg\n [36, 8.9], // 9 tháng: 8.9kg\n [40, 9.2], // 10 tháng: 9.2kg\n [44, 9.4], // 11 tháng: 9.4kg\n [48, 9.6], // 12 tháng (1 tuổi): 9.6kg\n [52, 9.8], // 13 tháng\n [56, 10.0], // 14 tháng\n [60, 10.3], // 15 tháng: 10.3kg (theo bảng)\n [64, 10.5], // 16 tháng\n [68, 10.7], // 17 tháng\n [72, 10.9], // 18 tháng: 10.9kg (theo bảng)\n [76, 11.1], // 19 tháng\n [80, 11.3], // 20 tháng\n [84, 11.5], // 21 tháng: 11.5kg (theo bảng)\n [88, 11.8], // 22 tháng\n [92, 12.0], // 23 tháng\n [96, 12.2], // 24 tháng (2 tuổi): 12.2kg (theo bảng)\n [100, 12.5], // 2.5 tuổi\n [104, 12.8], // Ngoại suy cho giai đoạn sau 2 tuổi\n];\n\n/**\n * Trục tuần (0 → 104) — trung vị cân (kg), nữ — cập nhật theo WHO Child Growth Standards\n * Nguồn tham khảo: WHO Growth Standards và bảng chuẩn Bibomart (2024)\n */\nconst GIRL_MEDIAN_WEEKS: readonly [number, number][] = [\n [0, 3.2], // Sơ sinh: 3.2kg (theo bảng WHO chuẩn VN)\n [4, 4.2], // 1 tháng: 4.2kg\n [8, 5.1], // 2 tháng: 5.1kg\n [12, 5.8], // 3 tháng: 5.8kg\n [16, 6.4], // 4 tháng: 6.4kg\n [20, 6.9], // 5 tháng: 6.9kg\n [24, 7.3], // 6 tháng: 7.3kg\n [28, 7.6], // 7 tháng: 7.6kg\n [32, 7.9], // 8 tháng: 7.9kg\n [36, 8.2], // 9 tháng: 8.2kg\n [40, 8.5], // 10 tháng: 8.5kg\n [44, 8.7], // 11 tháng: 8.7kg\n [48, 8.9], // 12 tháng (1 tuổi): 8.9kg\n [52, 9.1], // 13 tháng\n [56, 9.3], // 14 tháng\n [60, 9.6], // 15 tháng: 9.6kg (theo bảng)\n [64, 9.8], // 16 tháng\n [68, 10.0], // 17 tháng\n [72, 10.2], // 18 tháng: 10.2kg (theo bảng)\n [76, 10.4], // 19 tháng\n [80, 10.6], // 20 tháng\n [84, 10.9], // 21 tháng: 10.9kg (theo bảng)\n [88, 11.1], // 22 tháng\n [92, 11.3], // 23 tháng\n [96, 11.5], // 24 tháng (2 tuổi): 11.5kg (theo bảng)\n [100, 11.8], // 2.5 tuổi\n [104, 12.0], // Ngoại suy cho giai đoạn sau 2 tuổi\n];\n\nfunction tableForSex(sex: WeightGrowthSex): readonly [number, number][] {\n return sex === 'male' ? BOY_MEDIAN_WEEKS : GIRL_MEDIAN_WEEKS;\n}\n\n/** Nội suy tuyến tính median (kg) theo tuần hoàn chỉnh */\nexport interface WhoWeightBandSample {\n daysSinceBirth: number;\n weeksAge: number;\n medianKg: number;\n minus2SdKg: number;\n plus2SdKg: number;\n}\n\n/**\n * Mẫu điểm đường chuẩn (trung vị, ±2SD) theo ngày tuổi — để vẽ biểu đồ.\n * maxDaysInclusive tối đa 728 (104 tuần).\n */\nexport function sampleWhoWeightBandByDay(\n maxDaysInclusive: number,\n sex: WeightGrowthSex,\n maxSamples = 140\n): WhoWeightBandSample[] {\n const cap = Math.min(728, Math.max(7, Math.floor(maxDaysInclusive)));\n const step = Math.max(1, Math.ceil(cap / maxSamples));\n const out: WhoWeightBandSample[] = [];\n\n const push = (d: number) => {\n const w = Math.min(104, d / 7);\n const m = medianWeightKgAtWeeks(w, sex);\n const sd = approxSdKgAtWeeks(w, sex);\n out.push({\n daysSinceBirth: d,\n weeksAge: w,\n medianKg: m,\n minus2SdKg: Math.max(0.1, m - 2 * sd),\n plus2SdKg: m + 2 * sd,\n });\n };\n\n for (let d = 0; d < cap; d += step) {\n push(d);\n }\n if (out.length === 0 || out[out.length - 1].daysSinceBirth !== cap) {\n push(cap);\n }\n return out;\n}\n\n/**\n * Bảng cân nặng mở rộng cho trẻ lớn hơn 2 tuổi (theo năm tuổi)\n * Nguồn: WHO Growth Standards và bảng chuẩn VN 2024\n */\nconst BOY_EXTENDED_YEARS: readonly [number, number][] = [\n [2.5, 13.3], // 2.5 tuổi: 13.3kg\n [3.0, 14.3], // 3 tuổi: 14.3kg\n [3.5, 15.3], // 3.5 tuổi: 15.3kg\n [4.0, 16.3], // 4 tuổi: 16.3kg\n [4.5, 17.3], // 4.5 tuổi: 17.3kg\n [5.0, 18.3], // 5 tuổi: 18.3kg\n [5.5, 19.4], // 5.5 tuổi: 19.4kg\n [6.0, 20.5], // 6 tuổi: 20.5kg\n [6.5, 21.7], // 6.5 tuổi: 21.7kg\n [7.0, 22.9], // 7 tuổi: 22.9kg\n [7.5, 24.1], // 7.5 tuổi: 24.1kg\n [8.0, 25.4], // 8 tuổi: 25.4kg\n [8.5, 26.7], // 8.5 tuổi: 26.7kg\n [9.0, 28.1], // 9 tuổi: 28.1kg\n [9.5, 29.6], // 9.5 tuổi: 29.6kg\n [10.0, 31.2], // 10 tuổi: 31.2kg\n];\n\nconst GIRL_EXTENDED_YEARS: readonly [number, number][] = [\n [2.5, 12.7], // 2.5 tuổi: 12.7kg\n [3.0, 13.9], // 3 tuổi: 13.9kg\n [3.5, 15.0], // 3.5 tuổi: 15.0kg\n [4.0, 16.1], // 4 tuổi: 16.1kg\n [4.5, 17.2], // 4.5 tuổi: 17.2kg (sửa từ 16.2 trong bảng gốc)\n [5.0, 18.2], // 5 tuổi: 18.2kg\n [5.5, 19.1], // 5.5 tuổi: 19.1kg\n [6.0, 20.2], // 6 tuổi: 20.2kg\n [6.5, 21.2], // 6.5 tuổi: 21.2kg\n [7.0, 22.4], // 7 tuổi: 22.4kg\n [7.5, 23.6], // 7.5 tuổi: 23.6kg\n [8.0, 25.0], // 8 tuổi: 25.0kg\n [8.5, 26.6], // 8.5 tuổi: 26.6kg\n [9.0, 28.2], // 9 tuổi: 28.2kg\n [9.5, 30.0], // 9.5 tuổi: 30.0kg\n [10.0, 31.9], // 10 tuổi: 31.9kg\n];\n\n/**\n * Tính cân nặng trung vị theo tuổi, hỗ trợ cả tuần (0-104) và năm (2.5-10)\n */\nexport function medianWeightKgAtWeeks(weeks: number, sex: WeightGrowthSex): number {\n if (sex === 'female') {\n const months = (Math.max(0, weeks) * 7) / 30.4375;\n return interpolateGirlReferenceByMonths(months, (row) => row.weightMedianKg);\n }\n\n // Nếu dưới 104 tuần (2 tuổi), dùng bảng tuần\n if (weeks <= 104) {\n const t = tableForSex(sex);\n const w = Math.max(0, Math.min(104, weeks));\n if (w <= t[0][0]) return t[0][1];\n if (w >= t[t.length - 1][0]) return t[t.length - 1][1];\n\n let i = 0;\n while (i < t.length - 1 && t[i + 1][0] < w) i++;\n const [w0, k0] = t[i];\n const [w1, k1] = t[i + 1];\n const r = (w - w0) / (w1 - w0);\n return k0 + r * (k1 - k0);\n }\n\n // Trên 104 tuần, chuyển sang bảng năm tuổi\n const years = weeks / 52.1775; // Chính xác hơn 52 tuần/năm\n const yearTable = sex === 'male' ? BOY_EXTENDED_YEARS : GIRL_EXTENDED_YEARS;\n\n if (years <= yearTable[0][0]) return yearTable[0][1];\n if (years >= yearTable[yearTable.length - 1][0]) return yearTable[yearTable.length - 1][1];\n\n let i = 0;\n while (i < yearTable.length - 1 && yearTable[i + 1][0] < years) i++;\n const [y0, k0] = yearTable[i];\n const [y1, k1] = yearTable[i + 1];\n const r = (years - y0) / (y1 - y0);\n return k0 + r * (k1 - k0);\n}\n\n/**\n * Ước lượng độ lệch chuẩn (kg) — điều chỉnh theo độ tuổi\n * Sơ sinh: ~10%, sau đó tăng dần theo tuổi\n */\nexport function approxSdKgAtWeeks(weeks: number, sex: WeightGrowthSex): number {\n if (sex === 'female') {\n const months = (Math.max(0, weeks) * 7) / 30.4375;\n const min = interpolateGirlReferenceByMonths(months, (row) => row.weightMinus2SdKg);\n const max = interpolateGirlReferenceByMonths(months, (row) => row.weightPlus2SdKg);\n return Math.max(0.12, (max - min) / 4);\n }\n\n const m = medianWeightKgAtWeeks(weeks, sex);\n let factor: number;\n\n if (weeks <= 8) {\n factor = 0.1; // Sơ sinh - 2 tháng: 10%\n } else if (weeks <= 52) {\n factor = 0.11; // 2 tháng - 1 tuổi: 11%\n } else if (weeks <= 104) {\n factor = 0.12; // 1-2 tuổi: 12%\n } else {\n factor = 0.13; // Trên 2 tuổi: 13% (độ biến thiên lớn hơn)\n }\n\n return Math.max(0.12, m * factor);\n}\n\nexport function ageDaysAtDate(birthIso: string, dateIso: string): number | null {\n const b = parseIsoLocal(birthIso);\n const e = parseIsoLocal(dateIso);\n if (!b || !e) return null;\n const ms = e.getTime() - b.getTime();\n if (ms < 0) return null;\n return Math.floor(ms / (24 * 60 * 60 * 1000));\n}\n\nexport function weeksFromDays(days: number): number {\n return Math.floor(days / 7);\n}\n\nexport function weeksFromDaysPrecise(days: number): number {\n return Math.max(0, days / 7);\n}\n\nfunction round2(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nfunction formatWeeksLabel(weeks: number): string {\n if (weeks > 104) {\n return `${Math.floor(weeks / 52.1775)} tuổi`;\n }\n const rounded = Math.round(weeks * 10) / 10;\n return Number.isInteger(rounded) ? `${rounded} tuần` : `${rounded} tuần`;\n}\n\nexport function estimateWeightByWeek(\n weeks: number,\n currentWeightKg: number,\n sex: WeightGrowthSex\n): WeightWeekEstimate | null {\n if (\n !Number.isFinite(weeks) ||\n weeks < 0 ||\n !Number.isFinite(currentWeightKg) ||\n currentWeightKg <= 0\n ) {\n return null;\n }\n\n const median = medianWeightKgAtWeeks(weeks, sex);\n const sd = approxSdKgAtWeeks(weeks, sex);\n\n const minus2 = median - 2 * sd;\n const minus1 = median - sd;\n const plus1 = median + sd;\n const plus2 = median + 2 * sd;\n\n return {\n weekAge: round2(weeks),\n currentWeightKg: round2(currentWeightKg),\n medianKg: round2(median),\n severeUnderweightMaxKg: round2(minus2),\n underweightMaxKg: round2(minus1),\n standardMinKg: round2(minus1),\n standardMaxKg: round2(plus1),\n overweightMinKg: round2(plus1),\n highWeightMinKg: round2(plus2),\n deltaFromMedianKg: round2(currentWeightKg - median),\n };\n}\n\nfunction parseIsoLocal(iso: string): Date | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(String(iso).trim());\n if (!m) return null;\n const y = +m[1];\n const mo = +m[2];\n const d = +m[3];\n const dt = new Date(y, mo - 1, d, 12, 0, 0, 0);\n return isNaN(dt.getTime()) ? null : dt;\n}\n\nexport function evaluateWeightForAge(\n weeks: number,\n weightKg: number,\n sex: WeightGrowthSex\n): WeightGrowthEvaluation | null {\n if (!Number.isFinite(weeks) || !Number.isFinite(weightKg) || weightKg <= 0) {\n return null;\n }\n\n const estimate = estimateWeightByWeek(weeks, weightKg, sex);\n if (!estimate) return null;\n\n // Mở rộng hỗ trợ tới 10 tuổi (khoảng 520 tuần)\n if (weeks > 520) {\n return {\n weeks,\n weeksLabel: formatWeeksLabel(weeks),\n medianKg: medianWeightKgAtWeeks(520, sex),\n sdKg: approxSdKgAtWeeks(520, sex),\n zScore: 0,\n status: 'unknown',\n statusLabel: 'Ngoài độ tuổi hỗ trợ',\n detail:\n 'App hỗ trợ đánh giá tới 10 tuổi. Với trẻ lớn hơn, hãy tham khảo bác sĩ nhi khoa để có biểu đồ tăng trưởng phù hợp.',\n estimate,\n };\n }\n\n const median = medianWeightKgAtWeeks(weeks, sex);\n const sd = approxSdKgAtWeeks(weeks, sex);\n const z = sd > 0 ? (weightKg - median) / sd : 0;\n\n let status: WeightGrowthStatus;\n let statusLabel: string;\n let detail: string;\n\n if (z < -2) {\n status = 'very_low';\n statusLabel = 'Thấp đáng lưu ý';\n detail =\n 'Cân nặng thấp hơn nhiều so với trung vị cùng tuần tuổi (ước lượng theo WHO). Nên trao đổi với bác sĩ/nhi khoa.';\n } else if (z < -1) {\n status = 'low';\n statusLabel = 'Hơi thấp';\n detail =\n 'Dưới mức trung bình nhẹ. Theo dõi cữ bú và cân định kỳ; nếu bé bú kém hoặc có dấu hiệu bất thường, khám sớm.';\n } else if (z <= 1) {\n status = 'normal';\n statusLabel = 'Phù hợp tuần tuổi';\n detail =\n 'Cân nặng nằm trong vùng phổ biến so với trung vị cùng tuần tuổi (ước lượng). Tiếp tục theo dõi định kỳ.';\n } else if (z <= 2) {\n status = 'high';\n statusLabel = 'Hơi cao';\n detail = 'Trên mức trung bình. Thường là biến thể lành tính; theo dõi xu hướng dài hạn.';\n } else {\n status = 'very_high';\n statusLabel = 'Cao đáng lưu ý';\n detail =\n 'Cân nặng cao hơn rõ so với trung vị cùng tuần. Trao đổi khi khám để loại trừ bệnh lý hoặc điều chỉnh dinh dưỡng.';\n }\n\n const weeksLabel = formatWeeksLabel(weeks);\n\n return {\n weeks,\n weeksLabel,\n medianKg: Math.round(median * 100) / 100,\n sdKg: Math.round(sd * 1000) / 1000,\n zScore: Math.round(z * 100) / 100,\n status,\n statusLabel,\n detail,\n estimate,\n };\n}\n\n/** Điểm cho đường trung vị trên biểu đồ (theo ngày đo) */\nexport function medianCurvePoints(\n birthIso: string,\n datesIso: readonly string[],\n sex: WeightGrowthSex\n): Array<{ date: string; kg: number; weeks: number }> {\n const out: Array<{ date: string; kg: number; weeks: number }> = [];\n for (const d of datesIso) {\n const days = ageDaysAtDate(birthIso, d);\n if (days === null) continue;\n const w = weeksFromDays(days);\n if (w > 104) continue;\n out.push({\n date: d,\n kg: Math.round(medianWeightKgAtWeeks(w, sex) * 100) / 100,\n weeks: w,\n });\n }\n return out;\n}\n\n/**\n * Chiều dài/chiều cao trung vị WHO theo tháng đầy đủ (0-24).\n * Nguồn tham khảo: WHO Child Growth Standards (length/height-for-age, P50).\n */\nconst BOY_LENGTH_MEDIAN_CM_BY_MONTH: readonly number[] = [\n 49.9, 54.7, 58.4, 61.4, 63.9, 65.9, 67.6, 69.2, 70.6, 72.0, 73.3, 74.5, 75.7, 76.9, 78.0, 79.2,\n 80.3, 81.3, 82.3, 83.3, 84.2, 85.1, 86.0, 86.9, 87.8,\n];\n\n/**\n * Bé gái (P50) theo tháng đầy đủ (0-24).\n */\nconst GIRL_LENGTH_MEDIAN_CM_BY_MONTH: readonly number[] = [\n 49.1, 53.7, 57.1, 59.8, 62.1, 64.0, 65.7, 67.3, 68.7, 70.1, 71.5, 72.8, 74.0, 75.2, 76.3, 77.5,\n 78.6, 79.7, 80.7, 81.7, 82.7, 83.7, 84.6, 85.5, 86.4,\n];\n\nexport interface WhoGirlVnReferenceRow {\n /** 0 = sơ sinh, 1…24 = tháng đầy đủ */\n monthIndex: number;\n monthLabelVi: string;\n weightMedianKg: number;\n heightMedianCm: number;\n}\n\nexport interface WhoGirlRangeReferenceRow {\n /** tuổi theo tháng; 2.5 tuổi = 30 tháng */\n monthsAge: number;\n ageLabelVi: string;\n weightMinus2SdKg: number;\n weightMedianKg: number;\n weightPlus2SdKg: number;\n heightMinus2SdCm: number;\n heightMedianCm: number;\n heightPlus2SdCm: number;\n}\n\nconst GIRL_WHO_RANGE_REFERENCE_TABLE: readonly WhoGirlRangeReferenceRow[] = [\n {\n monthsAge: 0,\n ageLabelVi: 'Sơ sinh',\n weightMinus2SdKg: 2.4,\n weightMedianKg: 3.2,\n weightPlus2SdKg: 4.2,\n heightMinus2SdCm: 45.4,\n heightMedianCm: 49.1,\n heightPlus2SdCm: 52.9,\n },\n {\n monthsAge: 1,\n ageLabelVi: '1 tháng',\n weightMinus2SdKg: 3.2,\n weightMedianKg: 4.2,\n weightPlus2SdKg: 5.5,\n heightMinus2SdCm: 49.8,\n heightMedianCm: 53.7,\n heightPlus2SdCm: 57.6,\n },\n {\n monthsAge: 2,\n ageLabelVi: '2 tháng',\n weightMinus2SdKg: 3.9,\n weightMedianKg: 5.1,\n weightPlus2SdKg: 6.6,\n heightMinus2SdCm: 53.0,\n heightMedianCm: 57.1,\n heightPlus2SdCm: 61.1,\n },\n {\n monthsAge: 3,\n ageLabelVi: '3 tháng',\n weightMinus2SdKg: 4.5,\n weightMedianKg: 5.8,\n weightPlus2SdKg: 7.5,\n heightMinus2SdCm: 55.6,\n heightMedianCm: 59.8,\n heightPlus2SdCm: 64.0,\n },\n {\n monthsAge: 4,\n ageLabelVi: '4 tháng',\n weightMinus2SdKg: 5.0,\n weightMedianKg: 6.4,\n weightPlus2SdKg: 8.2,\n heightMinus2SdCm: 57.8,\n heightMedianCm: 62.1,\n heightPlus2SdCm: 66.4,\n },\n {\n monthsAge: 5,\n ageLabelVi: '5 tháng',\n weightMinus2SdKg: 5.4,\n weightMedianKg: 6.9,\n weightPlus2SdKg: 8.8,\n heightMinus2SdCm: 59.6,\n heightMedianCm: 64.0,\n heightPlus2SdCm: 68.5,\n },\n {\n monthsAge: 6,\n ageLabelVi: '6 tháng',\n weightMinus2SdKg: 5.7,\n weightMedianKg: 7.3,\n weightPlus2SdKg: 9.3,\n heightMinus2SdCm: 61.2,\n heightMedianCm: 65.7,\n heightPlus2SdCm: 70.3,\n },\n {\n monthsAge: 7,\n ageLabelVi: '7 tháng',\n weightMinus2SdKg: 6.0,\n weightMedianKg: 7.6,\n weightPlus2SdKg: 9.8,\n heightMinus2SdCm: 62.7,\n heightMedianCm: 67.3,\n heightPlus2SdCm: 71.9,\n },\n {\n monthsAge: 8,\n ageLabelVi: '8 tháng',\n weightMinus2SdKg: 6.3,\n weightMedianKg: 7.9,\n weightPlus2SdKg: 10.2,\n heightMinus2SdCm: 64.0,\n heightMedianCm: 68.7,\n heightPlus2SdCm: 73.5,\n },\n {\n monthsAge: 9,\n ageLabelVi: '9 tháng',\n weightMinus2SdKg: 6.5,\n weightMedianKg: 8.2,\n weightPlus2SdKg: 10.5,\n heightMinus2SdCm: 65.3,\n heightMedianCm: 70.1,\n heightPlus2SdCm: 75.0,\n },\n {\n monthsAge: 10,\n ageLabelVi: '10 tháng',\n weightMinus2SdKg: 6.7,\n weightMedianKg: 8.5,\n weightPlus2SdKg: 10.9,\n heightMinus2SdCm: 66.5,\n heightMedianCm: 71.5,\n heightPlus2SdCm: 76.4,\n },\n {\n monthsAge: 11,\n ageLabelVi: '11 tháng',\n weightMinus2SdKg: 6.9,\n weightMedianKg: 8.7,\n weightPlus2SdKg: 11.2,\n heightMinus2SdCm: 67.7,\n heightMedianCm: 72.8,\n heightPlus2SdCm: 77.8,\n },\n {\n monthsAge: 12,\n ageLabelVi: '12 tháng',\n weightMinus2SdKg: 7.0,\n weightMedianKg: 8.9,\n weightPlus2SdKg: 11.5,\n heightMinus2SdCm: 68.9,\n heightMedianCm: 74.0,\n heightPlus2SdCm: 79.2,\n },\n {\n monthsAge: 15,\n ageLabelVi: '15 tháng',\n weightMinus2SdKg: 7.6,\n weightMedianKg: 9.6,\n weightPlus2SdKg: 12.4,\n heightMinus2SdCm: 72.0,\n heightMedianCm: 77.5,\n heightPlus2SdCm: 83.0,\n },\n {\n monthsAge: 18,\n ageLabelVi: '18 tháng',\n weightMinus2SdKg: 8.1,\n weightMedianKg: 10.2,\n weightPlus2SdKg: 13.2,\n heightMinus2SdCm: 74.9,\n heightMedianCm: 80.7,\n heightPlus2SdCm: 86.5,\n },\n {\n monthsAge: 21,\n ageLabelVi: '21 tháng',\n weightMinus2SdKg: 8.6,\n weightMedianKg: 10.9,\n weightPlus2SdKg: 14.0,\n heightMinus2SdCm: 77.5,\n heightMedianCm: 83.7,\n heightPlus2SdCm: 89.8,\n },\n {\n monthsAge: 24,\n ageLabelVi: '24 tháng',\n weightMinus2SdKg: 9.0,\n weightMedianKg: 11.5,\n weightPlus2SdKg: 14.8,\n heightMinus2SdCm: 80.0,\n heightMedianCm: 86.4,\n heightPlus2SdCm: 92.9,\n },\n {\n monthsAge: 30,\n ageLabelVi: '2.5 tuổi',\n weightMinus2SdKg: 10.0,\n weightMedianKg: 12.7,\n weightPlus2SdKg: 16.5,\n heightMinus2SdCm: 83.6,\n heightMedianCm: 90.7,\n heightPlus2SdCm: 97.7,\n },\n {\n monthsAge: 36,\n ageLabelVi: '3 tuổi',\n weightMinus2SdKg: 10.8,\n weightMedianKg: 13.9,\n weightPlus2SdKg: 18.1,\n heightMinus2SdCm: 87.4,\n heightMedianCm: 95.1,\n heightPlus2SdCm: 102.7,\n },\n {\n monthsAge: 42,\n ageLabelVi: '3.5 tuổi',\n weightMinus2SdKg: 11.6,\n weightMedianKg: 15.0,\n weightPlus2SdKg: 19.8,\n heightMinus2SdCm: 90.9,\n heightMedianCm: 99.0,\n heightPlus2SdCm: 107.2,\n },\n {\n monthsAge: 48,\n ageLabelVi: '4 tuổi',\n weightMinus2SdKg: 12.3,\n weightMedianKg: 16.1,\n weightPlus2SdKg: 21.5,\n heightMinus2SdCm: 94.1,\n heightMedianCm: 102.7,\n heightPlus2SdCm: 111.3,\n },\n {\n monthsAge: 54,\n ageLabelVi: '4.5 tuổi',\n weightMinus2SdKg: 13.0,\n weightMedianKg: 17.2,\n weightPlus2SdKg: 23.2,\n heightMinus2SdCm: 97.1,\n heightMedianCm: 106.2,\n heightPlus2SdCm: 115.2,\n },\n {\n monthsAge: 60,\n ageLabelVi: '5 tuổi',\n weightMinus2SdKg: 13.7,\n weightMedianKg: 18.2,\n weightPlus2SdKg: 24.9,\n heightMinus2SdCm: 99.9,\n heightMedianCm: 109.4,\n heightPlus2SdCm: 118.9,\n },\n {\n monthsAge: 66,\n ageLabelVi: '5.5 tuổi',\n weightMinus2SdKg: 14.6,\n weightMedianKg: 19.1,\n weightPlus2SdKg: 26.2,\n heightMinus2SdCm: 102.3,\n heightMedianCm: 112.2,\n heightPlus2SdCm: 122.0,\n },\n {\n monthsAge: 72,\n ageLabelVi: '6 tuổi',\n weightMinus2SdKg: 15.3,\n weightMedianKg: 20.2,\n weightPlus2SdKg: 27.8,\n heightMinus2SdCm: 104.9,\n heightMedianCm: 115.1,\n heightPlus2SdCm: 125.4,\n },\n {\n monthsAge: 78,\n ageLabelVi: '6.5 tuổi',\n weightMinus2SdKg: 16.0,\n weightMedianKg: 21.2,\n weightPlus2SdKg: 29.6,\n heightMinus2SdCm: 107.4,\n heightMedianCm: 118.0,\n heightPlus2SdCm: 128.6,\n },\n {\n monthsAge: 84,\n ageLabelVi: '7 tuổi',\n weightMinus2SdKg: 16.8,\n weightMedianKg: 22.4,\n weightPlus2SdKg: 31.4,\n heightMinus2SdCm: 109.9,\n heightMedianCm: 120.8,\n heightPlus2SdCm: 131.7,\n },\n {\n monthsAge: 90,\n ageLabelVi: '7.5 tuổi',\n weightMinus2SdKg: 17.6,\n weightMedianKg: 23.6,\n weightPlus2SdKg: 33.5,\n heightMinus2SdCm: 112.4,\n heightMedianCm: 123.7,\n heightPlus2SdCm: 134.9,\n },\n {\n monthsAge: 96,\n ageLabelVi: '8 tuổi',\n weightMinus2SdKg: 18.6,\n weightMedianKg: 25.0,\n weightPlus2SdKg: 35.8,\n heightMinus2SdCm: 115.0,\n heightMedianCm: 126.6,\n heightPlus2SdCm: 138.2,\n },\n {\n monthsAge: 102,\n ageLabelVi: '8.5 tuổi',\n weightMinus2SdKg: 19.6,\n weightMedianKg: 26.6,\n weightPlus2SdKg: 38.3,\n heightMinus2SdCm: 117.6,\n heightMedianCm: 129.5,\n heightPlus2SdCm: 141.4,\n },\n {\n monthsAge: 108,\n ageLabelVi: '9 tuổi',\n weightMinus2SdKg: 20.8,\n weightMedianKg: 28.2,\n weightPlus2SdKg: 41.1,\n heightMinus2SdCm: 120.3,\n heightMedianCm: 132.5,\n heightPlus2SdCm: 144.7,\n },\n {\n monthsAge: 114,\n ageLabelVi: '9.5 tuổi',\n weightMinus2SdKg: 20.0,\n weightMedianKg: 30.0,\n weightPlus2SdKg: 43.8,\n heightMinus2SdCm: 123.0,\n heightMedianCm: 135.5,\n heightPlus2SdCm: 148.1,\n },\n {\n monthsAge: 120,\n ageLabelVi: '10 tuổi',\n weightMinus2SdKg: 23.3,\n weightMedianKg: 31.9,\n weightPlus2SdKg: 46.9,\n heightMinus2SdCm: 125.8,\n heightMedianCm: 138.6,\n heightPlus2SdCm: 151.4,\n },\n];\n\nexport function whoGirlRangeReferenceTable(): WhoGirlRangeReferenceRow[] {\n return GIRL_WHO_RANGE_REFERENCE_TABLE.map((r) => ({ ...r }));\n}\n\nfunction interpolateGirlReferenceByMonths(\n months: number,\n pick: (row: WhoGirlRangeReferenceRow) => number\n): number {\n const rows = GIRL_WHO_RANGE_REFERENCE_TABLE;\n const m = Math.max(rows[0].monthsAge, Math.min(rows[rows.length - 1].monthsAge, months));\n if (m <= rows[0].monthsAge) return pick(rows[0]);\n if (m >= rows[rows.length - 1].monthsAge) return pick(rows[rows.length - 1]);\n let i = 0;\n while (i < rows.length - 1 && rows[i + 1].monthsAge < m) i++;\n const r0 = rows[i];\n const r1 = rows[i + 1];\n const ratio = (m - r0.monthsAge) / (r1.monthsAge - r0.monthsAge);\n return pick(r0) + ratio * (pick(r1) - pick(r0));\n}\n\nexport interface HeightGrowthEvaluation {\n monthsAge: number;\n monthsLabel: string;\n medianCm: number;\n sdCm: number;\n zScore: number;\n percentile: number;\n status: WeightGrowthStatus;\n statusLabel: string;\n detail: string;\n}\n\nexport interface WhoHeightBandSample {\n daysSinceBirth: number;\n monthsAge: number;\n medianCm: number;\n minus2SdCm: number;\n plus2SdCm: number;\n}\n\nfunction heightMedianTableForSex(sex: WeightGrowthSex): readonly number[] {\n return sex === 'male' ? BOY_LENGTH_MEDIAN_CM_BY_MONTH : GIRL_LENGTH_MEDIAN_CM_BY_MONTH;\n}\n\nfunction interpolateSeries(x: number, values: readonly number[]): number {\n if (!values.length) return 0;\n const clampedX = Math.max(0, Math.min(values.length - 1, x));\n const i0 = Math.floor(clampedX);\n const i1 = Math.min(values.length - 1, i0 + 1);\n const ratio = clampedX - i0;\n return values[i0] + (values[i1] - values[i0]) * ratio;\n}\n\nexport function monthsFromDays(days: number): number {\n return Math.max(0, days / 30.4375);\n}\n\nexport function medianHeightCmAtMonths(months: number, sex: WeightGrowthSex): number {\n if (sex === 'female') {\n return interpolateGirlReferenceByMonths(Math.max(0, months), (row) => row.heightMedianCm);\n }\n return interpolateSeries(months, heightMedianTableForSex(sex));\n}\n\nexport function approxSdHeightCmAtMonths(months: number, sex: WeightGrowthSex): number {\n if (sex === 'female') {\n const m = Math.max(0, months);\n const min = interpolateGirlReferenceByMonths(m, (row) => row.heightMinus2SdCm);\n const max = interpolateGirlReferenceByMonths(m, (row) => row.heightPlus2SdCm);\n return Math.max(1.2, (max - min) / 4);\n }\n\n const median = medianHeightCmAtMonths(months, sex);\n // WHO spread tăng dần theo tuổi; xấp xỉ đủ dùng cho cảnh báo tham khảo.\n const factor = months <= 6 ? 0.028 : months <= 12 ? 0.029 : months <= 24 ? 0.03 : 0.031;\n return Math.max(1.2, median * factor);\n}\n\nfunction erf(x: number): number {\n const sign = x < 0 ? -1 : 1;\n const ax = Math.abs(x);\n const a1 = 0.254829592;\n const a2 = -0.284496736;\n const a3 = 1.421413741;\n const a4 = -1.453152027;\n const a5 = 1.061405429;\n const p = 0.3275911;\n const t = 1 / (1 + p * ax);\n const y = 1 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp(-ax * ax);\n return sign * y;\n}\n\nexport function percentileFromZScore(z: number): number {\n const p = 0.5 * (1 + erf(z / Math.SQRT2));\n return Math.round(Math.max(0, Math.min(1, p)) * 100);\n}\n\nexport function evaluateHeightForAge(\n days: number,\n heightCm: number,\n sex: WeightGrowthSex\n): HeightGrowthEvaluation | null {\n if (!Number.isFinite(days) || days < 0) return null;\n if (!Number.isFinite(heightCm) || heightCm <= 0) return null;\n const months = monthsFromDays(days);\n if (months > 24) {\n return {\n monthsAge: months,\n monthsLabel: `${Math.floor(months)} tháng`,\n medianCm: Math.round(medianHeightCmAtMonths(24, sex) * 10) / 10,\n sdCm: Math.round(approxSdHeightCmAtMonths(24, sex) * 100) / 100,\n zScore: 0,\n percentile: 50,\n status: 'unknown',\n statusLabel: 'Ngoài độ tuổi hỗ trợ',\n detail:\n 'Đánh giá chiều cao trong app đang tối ưu cho 0-24 tháng. Khi bé lớn hơn, nên theo dõi bằng biểu đồ chuyên khoa.',\n };\n }\n const median = medianHeightCmAtMonths(months, sex);\n const sd = approxSdHeightCmAtMonths(months, sex);\n const z = sd > 0 ? (heightCm - median) / sd : 0;\n const pct = percentileFromZScore(z);\n let status: WeightGrowthStatus;\n let statusLabel: string;\n let detail: string;\n if (z < -2) {\n status = 'very_low';\n statusLabel = 'Chiều cao thấp đáng lưu ý';\n detail =\n 'Chiều cao đang thấp hơn nhiều so với trung vị WHO theo tuổi. Nên trao đổi thêm khi đi khám định kỳ.';\n } else if (z < -1) {\n status = 'low';\n statusLabel = 'Chiều cao hơi thấp';\n detail =\n 'Chiều cao thấp hơn trung bình nhẹ. Theo dõi xu hướng dài hạn và cập nhật sau mỗi lần đo tại bệnh viện.';\n } else if (z <= 1) {\n status = 'normal';\n statusLabel = 'Chiều cao phù hợp tuổi';\n detail =\n 'Chiều cao nằm trong vùng phổ biến theo chuẩn WHO. Tiếp tục theo dõi đều mỗi lần khám.';\n } else if (z <= 2) {\n status = 'high';\n statusLabel = 'Chiều cao hơi cao';\n detail =\n 'Chiều cao nhỉnh hơn trung bình. Đây thường là biến thiên bình thường, nên xem xu hướng theo nhiều mốc đo.';\n } else {\n status = 'very_high';\n statusLabel = 'Chiều cao cao đáng lưu ý';\n detail =\n 'Chiều cao cao hơn rõ so với trung vị WHO theo tuổi. Có thể trao đổi thêm với bác sĩ nếu có băn khoăn.';\n }\n const roundedMonths = Math.round(months * 10) / 10;\n return {\n monthsAge: roundedMonths,\n monthsLabel:\n roundedMonths < 1 ? `${Math.max(1, Math.floor(days))} ngày` : `${roundedMonths} tháng`,\n medianCm: Math.round(median * 10) / 10,\n sdCm: Math.round(sd * 100) / 100,\n zScore: Math.round(z * 100) / 100,\n percentile: pct,\n status,\n statusLabel,\n detail,\n };\n}\n\nexport function sampleWhoHeightBandByDay(\n maxDaysInclusive: number,\n sex: WeightGrowthSex,\n maxSamples = 120\n): WhoHeightBandSample[] {\n const cap = Math.min(731, Math.max(7, Math.floor(maxDaysInclusive)));\n const step = Math.max(1, Math.ceil(cap / maxSamples));\n const out: WhoHeightBandSample[] = [];\n const push = (d: number) => {\n const months = monthsFromDays(d);\n const median = medianHeightCmAtMonths(months, sex);\n const sd = approxSdHeightCmAtMonths(months, sex);\n out.push({\n daysSinceBirth: d,\n monthsAge: months,\n medianCm: Math.round(median * 10) / 10,\n minus2SdCm: Math.round(Math.max(30, median - 2 * sd) * 10) / 10,\n plus2SdCm: Math.round((median + 2 * sd) * 10) / 10,\n });\n };\n for (let d = 0; d < cap; d += step) {\n push(d);\n }\n if (out.length === 0 || out[out.length - 1].daysSinceBirth !== cap) {\n push(cap);\n }\n return out;\n}\n\nexport function whoVnReferenceTable(sex: WeightGrowthSex): WhoGirlVnReferenceRow[] {\n const hTable = heightMedianTableForSex(sex);\n return hTable.map((heightCm, monthIndex) => {\n const weeksApprox = monthIndex * (52 / 12);\n const wKg = medianWeightKgAtWeeks(weeksApprox, sex);\n return {\n monthIndex,\n monthLabelVi: monthIndex === 0 ? 'Sơ sinh' : `${monthIndex} tháng`,\n weightMedianKg: Math.round(wKg * 100) / 100,\n heightMedianCm: Math.round(heightCm * 10) / 10,\n };\n });\n}\n\n/**\n * Bảng tham chiếu cân nặng + chiều cao (trung vị) cho bé gái — chuẩn WHO,\n * cột cân nội suy từ bảng tuần tuổi trong app (cùng nguồn với biểu đồ).\n */\nexport function whoGirlVnReferenceTable(): WhoGirlVnReferenceRow[] {\n return whoVnReferenceTable('female');\n}\n","/** Shared formatters for weight tab UI (list + charts). */\n\nexport function formatWeightDateDisplay(iso: string): string {\n const [y, m, d] = iso.split('-');\n return `${d}/${m}/${y}`;\n}\n\nexport function formatWeightDateShort(iso: string): string {\n const [y, m, d] = iso.split('-');\n return `${d}/${m}`;\n}\n\nexport function formatWeightKg(n: number): string {\n return new Intl.NumberFormat('vi-VN', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n }).format(n);\n}\n\nexport function formatWeightGPerDay(n: number): string {\n const s = new Intl.NumberFormat('vi-VN', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 1,\n }).format(n);\n return `${n > 0 ? '+' : ''}${s}`;\n}\n\nexport function formatWeightCm(n: number): string {\n return new Intl.NumberFormat('vi-VN', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 1,\n }).format(n);\n}\n\n/** Nhãn tuổi trên trục ngang biểu đồ so sánh */\nexport function formatAgeShortVi(days: number): string {\n const w = Math.floor(days / 7);\n const d = days % 7;\n if (w === 0) {\n return `${days} ngày`;\n }\n return d === 0 ? `${w} tuần` : `${w}t${d}n`;\n}\n\nexport function growthStatusClass(status: string): string {\n switch (status) {\n case 'very_low':\n case 'very_high':\n return 'warn';\n case 'low':\n case 'high':\n return 'mid';\n case 'normal':\n return 'ok';\n default:\n return 'neutral';\n }\n}\n\n/** Map WHO z-score (-2…+2) to horizontal position on the growth scale track. */\nexport function growthMarkerPosition(zScore: number): number {\n const z = Math.max(-2, Math.min(2, zScore));\n const pct = ((z + 2) / 4) * 100;\n return pct < 3 ? 3 : pct > 97 ? 97 : pct;\n}\n\nexport function formatGrowthZScore(zScore: number): string {\n const sign = zScore >= 0 ? '+' : '';\n return `${sign}${zScore.toFixed(1)}`;\n}\n","import { ChangeDetectionStrategy, Component, computed, input, signal } from '@angular/core';\n\nimport {\n formatWeightCm,\n formatWeightDateShort,\n formatWeightGPerDay,\n formatWeightKg,\n} from '../weight-display.utils';\nimport type {\n HeightVsStandardChartVm,\n WeightTrendChartVm,\n WeightVelocityChartVm,\n WeightVsStandardChartVm,\n} from '../weight-chart.vm';\n\n@Component({\n selector: 'app-weight-charts',\n standalone: true,\n imports: [],\n templateUrl: './weight-charts.component.html',\n styleUrls: ['./weight-charts.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WeightChartsComponent {\n readonly spanPreset = signal<'30d' | '90d' | '180d' | 'all'>('90d');\n readonly pinLatestPoint = signal(true);\n\n weightVsStandardChart = input<WeightVsStandardChartVm | null>(null);\n heightVsStandardChart = input<HeightVsStandardChartVm | null>(null);\n weightTrendChart = input<WeightTrendChartVm | null>(null);\n simpleTrendMode = input<boolean>(false);\n weightVelocityLineChart = input<WeightVelocityChartVm | null>(null);\n\n readonly spanDays = computed(() => {\n const preset = this.spanPreset();\n if (preset === '30d') return 30;\n if (preset === '90d') return 90;\n if (preset === '180d') return 180;\n return null;\n });\n\n formatKg(n: number): string {\n return formatWeightKg(n);\n }\n\n formatCm(n: number): string {\n return formatWeightCm(n);\n }\n\n formatDateShort(iso: string): string {\n return formatWeightDateShort(iso);\n }\n\n formatGPerDay(n: number): string {\n return formatWeightGPerDay(n);\n }\n\n setSpanPreset(preset: '30d' | '90d' | '180d' | 'all'): void {\n this.spanPreset.set(preset);\n }\n\n togglePinLatest(): void {\n this.pinLatestPoint.update((v) => !v);\n }\n\n private spanStartX(maxDays: number, width: number, left: number, right: number): number {\n const span = this.spanDays();\n if (span === null || maxDays <= 0) return left - 8;\n const visibleStartDays = Math.max(0, maxDays - span);\n const ratio = visibleStartDays / maxDays;\n return left + ratio * (width - left - right) - 8;\n }\n\n weightSpanStartX(cmp: WeightVsStandardChartVm): number {\n const maxDays = cmp.pts.length > 0 ? Math.max(...cmp.pts.map((p) => p.days)) : 0;\n return this.spanStartX(maxDays, cmp.W, cmp.PAD_L, cmp.PAD_R);\n }\n\n heightSpanStartX(cmp: HeightVsStandardChartVm): number {\n const maxDays = cmp.pts.length > 0 ? Math.max(...cmp.pts.map((p) => p.days)) : 0;\n return this.spanStartX(maxDays, cmp.W, cmp.PAD_L, cmp.PAD_R);\n }\n\n showWeightPointLabel(\n p: WeightVsStandardChartVm['pts'][number],\n list: WeightVsStandardChartVm['pts']\n ): boolean {\n if (!this.pinLatestPoint()) return p.showKgLabel;\n return list.length > 0 && p === list[list.length - 1];\n }\n\n showHeightPointLabel(\n p: HeightVsStandardChartVm['pts'][number],\n list: HeightVsStandardChartVm['pts']\n ): boolean {\n if (!this.pinLatestPoint()) return p.showLabel;\n return list.length > 0 && p === list[list.length - 1];\n }\n}\n","<section class=\"wg-controls\">\n <div class=\"wg-controls__group\">\n <span class=\"wg-controls__label\">Span</span>\n <button\n type=\"button\"\n class=\"wg-chip\"\n [class.active]=\"spanPreset() === '30d'\"\n (click)=\"setSpanPreset('30d')\"\n >\n 30 ngày\n </button>\n <button\n type=\"button\"\n class=\"wg-chip\"\n [class.active]=\"spanPreset() === '90d'\"\n (click)=\"setSpanPreset('90d')\"\n >\n 90 ngày\n </button>\n <button\n type=\"button\"\n class=\"wg-chip\"\n [class.active]=\"spanPreset() === '180d'\"\n (click)=\"setSpanPreset('180d')\"\n >\n 180 ngày\n </button>\n <button\n type=\"button\"\n class=\"wg-chip\"\n [class.active]=\"spanPreset() === 'all'\"\n (click)=\"setSpanPreset('all')\"\n >\n Toàn bộ\n </button>\n </div>\n <button\n type=\"button\"\n class=\"wg-pin\"\n [class.active]=\"pinLatestPoint()\"\n (click)=\"togglePinLatest()\"\n >\n <i class=\"pi pi-map-marker\"></i>\n {{ pinLatestPoint() ? 'Pin điểm mới nhất' : 'Hiện nhiều nhãn' }}\n </button>\n</section>\n\n<!-- Cân nặng vs WHO -->\n@if (weightVsStandardChart(); as cmp) {\n <section class=\"wg-card wg-card--compare\">\n <header class=\"wg-card__head\">\n <h3><i class=\"pi pi-chart-line\"></i> Cân nặng so với chuẩn</h3>\n <p class=\"wg-meta\">\n <span class=\"wg-pill\">\n <i class=\"pi pi-globe\"></i> {{ cmp.regionCode }} · WHO · {{ cmp.sexLabelVi }}\n </span>\n <span class=\"wg-pill wg-pill--accent\" [title]=\"cmp.referenceCaption\">\n <i class=\"pi pi-database\"></i>\n <strong>{{ cmp.birthRecordLine }}</strong>\n </span>\n </p>\n </header>\n <div class=\"wg-legend\" aria-hidden=\"false\">\n <span><i class=\"wg-dot wg-dot--violet\"></i> Bé</span>\n <span><i class=\"wg-line wg-line--median\"></i> Trung vị</span>\n <span><i class=\"wg-band\"></i> ±2SD</span>\n </div>\n <div class=\"wg-scroll\" [style.--wg-min-x.px]=\"cmp.W\">\n <svg\n class=\"wg-svg wg-svg--compare\"\n [attr.viewBox]=\"'0 0 ' + cmp.W + ' ' + cmp.H\"\n preserveAspectRatio=\"xMidYMid meet\"\n >\n <defs>\n <clipPath id=\"wgWClip\">\n <rect\n [attr.x]=\"weightSpanStartX(cmp)\"\n [attr.y]=\"cmp.PAD_T - 4\"\n [attr.width]=\"cmp.W - weightSpanStartX(cmp) - cmp.PAD_R + 20\"\n [attr.height]=\"cmp.bottomY - cmp.PAD_T + 8\"\n rx=\"12\"\n ry=\"12\"\n />\n </clipPath>\n <linearGradient id=\"wCmpBandGrad\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#22c55e\" stop-opacity=\"0.2\" />\n <stop offset=\"100%\" stop-color=\"#22c55e\" stop-opacity=\"0.05\" />\n </linearGradient>\n <linearGradient id=\"wCmpActualGrad\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stop-color=\"#a5b4fc\" />\n <stop offset=\"100%\" stop-color=\"#4f46e5\" />\n </linearGradient>\n <filter id=\"wgWGlow\" x=\"-8%\" y=\"-8%\" width=\"116%\" height=\"116%\">\n <feGaussianBlur stdDeviation=\"1.4\" result=\"b\" />\n <feMerge>\n <feMergeNode in=\"b\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n <g clip-path=\"url(#wgWClip)\">\n <rect\n class=\"wg-plot-fill\"\n [attr.x]=\"weightSpanStartX(cmp)\"\n [attr.y]=\"cmp.PAD_T - 4\"\n [attr.width]=\"cmp.W - weightSpanStartX(cmp) - cmp.PAD_R + 20\"\n [attr.height]=\"cmp.bottomY - cmp.PAD_T + 8\"\n rx=\"12\"\n ry=\"12\"\n />\n <g class=\"wg-grid\">\n @for (g of cmp.gridLines; track g) {\n <line\n [attr.x1]=\"cmp.PAD_L\"\n [attr.x2]=\"cmp.W - cmp.PAD_R + 4\"\n [attr.y1]=\"g.y\"\n [attr.y2]=\"g.y\"\n />\n }\n @for (g of cmp.gridLines; track g) {\n <text\n [attr.x]=\"cmp.PAD_L - 10\"\n [attr.y]=\"g.y + 4\"\n text-anchor=\"end\"\n class=\"wg-grid-label\"\n >\n {{ g.label }}\n </text>\n }\n </g>\n <path class=\"wg-band\" [attr.d]=\"cmp.bandPath\" fill=\"url(#wCmpBandGrad)\" />\n <path class=\"wg-ref\" [attr.d]=\"cmp.pathLow\" fill=\"none\" />\n <path class=\"wg-ref\" [attr.d]=\"cmp.pathHigh\" fill=\"none\" />\n <path class=\"wg-median\" [attr.d]=\"cmp.pathMedian\" fill=\"none\" />\n <path\n class=\"wg-actual\"\n [attr.d]=\"cmp.pathActual\"\n stroke=\"url(#wCmpActualGrad)\"\n filter=\"url(#wgWGlow)\"\n />\n </g>\n <line\n class=\"wg-axis\"\n [attr.x1]=\"cmp.PAD_L - 2\"\n [attr.y1]=\"cmp.bottomY\"\n [attr.x2]=\"cmp.W - cmp.PAD_R + 6\"\n [attr.y2]=\"cmp.bottomY\"\n />\n <g class=\"wg-x-ticks\">\n @for (t of cmp.xTicks; track t) {\n <g>\n <line\n [attr.x1]=\"t.x\"\n [attr.x2]=\"t.x\"\n [attr.y1]=\"cmp.H - cmp.PAD_B\"\n [attr.y2]=\"cmp.H - cmp.PAD_B + 5\"\n class=\"wg-x-tick\"\n />\n <text [attr.x]=\"t.x\" [attr.y]=\"cmp.H - 22\" text-anchor=\"middle\" class=\"wg-x-main\">\n {{ t.label }}\n </text>\n @if (t.subLabel) {\n <text [attr.x]=\"t.x\" [attr.y]=\"cmp.H - 8\" text-anchor=\"middle\" class=\"wg-x-sub\">\n {{ t.subLabel }}\n </text>\n }\n </g>\n }\n </g>\n @for (p of cmp.pts; track p) {\n <g>\n <circle [attr.cx]=\"p.x\" [attr.cy]=\"p.y\" r=\"7\" class=\"wg-node\" />\n <circle [attr.cx]=\"p.x\" [attr.cy]=\"p.y\" r=\"3.5\" class=\"wg-node-core\" />\n @if (showWeightPointLabel(p, cmp.pts)) {\n <text [attr.x]=\"p.x\" [attr.y]=\"p.y - 14\" text-anchor=\"middle\" class=\"wg-value-label\">\n {{ formatKg(p.log.weightKg) }}\n </text>\n }\n @if (p.showXLabel) {\n <text\n [attr.x]=\"p.x\"\n [attr.y]=\"cmp.H - 48\"\n [attr.transform]=\"'rotate(-34 ' + p.x + ',' + (cmp.H - 48) + ')'\"\n text-anchor=\"end\"\n class=\"wg-age-label\"\n >\n {{ p.ageLabel }}\n </text>\n }\n </g>\n }\n </svg>\n </div>\n </section>\n}\n\n<!-- Chiều cao vs WHO -->\n@if (heightVsStandardChart(); as hCmp) {\n <section class=\"wg-card wg-card--compare\">\n <header class=\"wg-card__head\">\n <h3><i class=\"pi pi-arrows-v\"></i> Chiều cao so với chuẩn</h3>\n <p class=\"wg-meta\">\n <span class=\"wg-pill\">\n <i class=\"pi pi-globe\"></i> {{ hCmp.regionCode }} · WHO · {{ hCmp.sexLabelVi }}\n </span>\n </p>\n </header>\n <div class=\"wg-legend\" aria-hidden=\"false\">\n <span><i class=\"wg-dot wg-dot--cyan\"></i> Bé</span>\n <span><i class=\"wg-line wg-line--median\"></i> Trung vị</span>\n <span><i class=\"wg-band wg-band--cyan\"></i> ±2SD</span>\n </div>\n <div class=\"wg-scroll\" [style.--wg-min-x.px]=\"hCmp.W\">\n <svg\n class=\"wg-svg wg-svg--compare\"\n [attr.viewBox]=\"'0 0 ' + hCmp.W + ' ' + hCmp.H\"\n preserveAspectRatio=\"xMidYMid meet\"\n >\n <defs>\n <clipPath id=\"wgHClip\">\n <rect\n [attr.x]=\"heightSpanStartX(hCmp)\"\n [attr.y]=\"hCmp.PAD_T - 4\"\n [attr.width]=\"hCmp.W - heightSpanStartX(hCmp) - hCmp.PAD_R + 20\"\n [attr.height]=\"hCmp.bottomY - hCmp.PAD_T + 8\"\n rx=\"12\"\n ry=\"12\"\n />\n </clipPath>\n <linearGradient id=\"hCmpBandGrad\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#06b6d4\" stop-opacity=\"0.22\" />\n <stop offset=\"100%\" stop-color=\"#06b6d4\" stop-opacity=\"0.06\" />\n </linearGradient>\n <linearGradient id=\"hCmpActualGrad\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stop-color=\"#67e8f9\" />\n <stop offset=\"100%\" stop-color=\"#0284c7\" />\n </linearGradient>\n <filter id=\"wgHGlow\" x=\"-8%\" y=\"-8%\" width=\"116%\" height=\"116%\">\n <feGaussianBlur stdDeviation=\"1.4\" result=\"b\" />\n <feMerge>\n <feMergeNode in=\"b\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n <g clip-path=\"url(#wgHClip)\">\n <rect\n class=\"wg-plot-fill wg-plot-fill--cyan\"\n [attr.x]=\"heightSpanStartX(hCmp)\"\n [attr.y]=\"hCmp.PAD_T - 4\"\n [attr.width]=\"hCmp.W - heightSpanStartX(hCmp) - hCmp.PAD_R + 20\"\n [attr.height]=\"hCmp.bottomY - hCmp.PAD_T + 8\"\n rx=\"12\"\n ry=\"12\"\n />\n <g class=\"wg-grid\">\n @for (g of hCmp.gridLines; track g) {\n <line\n [attr.x1]=\"hCmp.PAD_L\"\n [attr.x2]=\"hCmp.W - hCmp.PAD_R + 4\"\n [attr.y1]=\"g.y\"\n [attr.y2]=\"g.y\"\n />\n }\n @for (g of hCmp.gridLines; track g) {\n <text\n [attr.x]=\"hCmp.PAD_L - 10\"\n [attr.y]=\"g.y + 4\"\n text-anchor=\"end\"\n class=\"wg-grid-label\"\n >\n {{ g.label }}\n </text>\n }\n </g>\n <path class=\"wg-band wg-band--cyan\" [attr.d]=\"hCmp.bandPath\" fill=\"url(#hCmpBandGrad)\" />\n <path class=\"wg-ref\" [attr.d]=\"hCmp.pathLow\" fill=\"none\" />\n <path class=\"wg-ref\" [attr.d]=\"hCmp.pathHigh\" fill=\"none\" />\n <path class=\"wg-median\" [attr.d]=\"hCmp.pathMedian\" fill=\"none\" />\n <path\n class=\"wg-actual wg-actual--height\"\n [attr.d]=\"hCmp.pathActual\"\n stroke=\"url(#hCmpActualGrad)\"\n filter=\"url(#wgHGlow)\"\n />\n </g>\n <line\n class=\"wg-axis\"\n [attr.x1]=\"hCmp.PAD_L - 2\"\n [attr.y1]=\"hCmp.bottomY\"\n [attr.x2]=\"hCmp.W - hCmp.PAD_R + 6\"\n [attr.y2]=\"hCmp.bottomY\"\n />\n <g class=\"wg-x-ticks\">\n @for (t of hCmp.xTicks; track t) {\n <g>\n <line\n [attr.x1]=\"t.x\"\n [attr.x2]=\"t.x\"\n [attr.y1]=\"hCmp.H - hCmp.PAD_B\"\n [attr.y2]=\"hCmp.H - hCmp.PAD_B + 5\"\n class=\"wg-x-tick\"\n />\n <text [attr.x]=\"t.x\" [attr.y]=\"hCmp.H - 20\" text-anchor=\"middle\" class=\"wg-x-main\">\n {{ t.label }}\n </text>\n </g>\n }\n </g>\n @for (p of hCmp.pts; track p) {\n <g>\n <circle [attr.cx]=\"p.x\" [attr.cy]=\"p.y\" r=\"7\" class=\"wg-node wg-node--cyan\" />\n <circle\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"3.5\"\n class=\"wg-node-core wg-node-core--cyan\"\n />\n @if (showHeightPointLabel(p, hCmp.pts)) {\n <text [attr.x]=\"p.x\" [attr.y]=\"p.y - 14\" text-anchor=\"middle\" class=\"wg-value-label\">\n {{ formatCm(p.heightCm) }}\n </text>\n }\n @if (p.showXLabel) {\n <text\n [attr.x]=\"p.x\"\n [attr.y]=\"hCmp.H - 48\"\n [attr.transform]=\"'rotate(-34 ' + p.x + ',' + (hCmp.H - 48) + ')'\"\n text-anchor=\"end\"\n class=\"wg-age-label\"\n >\n {{ p.ageLabel }}\n </text>\n }\n </g>\n }\n </svg>\n </div>\n </section>\n}\n\n<!-- Xu hướng đơn (không có birth + WHO compare) -->\n@if (simpleTrendMode() && weightTrendChart(); as ch) {\n <section class=\"wg-card\">\n <header class=\"wg-card__head wg-card__head--solo\">\n <h3><i class=\"pi pi-chart-line\"></i> Xu hướng cân nặng</h3>\n <p class=\"wg-card__hint\">Theo từng lần cân trên sheet</p>\n </header>\n <div class=\"wg-scroll\" [style.--wg-min-x.px]=\"ch.W\">\n <svg\n class=\"wg-svg\"\n [attr.viewBox]=\"'0 0 ' + ch.W + ' ' + ch.H\"\n preserveAspectRatio=\"xMidYMid meet\"\n >\n <defs>\n <clipPath id=\"wgTrendClip\">\n <rect\n [attr.x]=\"ch.PAD_L - 8\"\n [attr.y]=\"ch.PAD_T - 4\"\n [attr.width]=\"ch.W - ch.PAD_L - ch.PAD_R + 20\"\n [attr.height]=\"ch.bottomY - ch.PAD_T + 8\"\n rx=\"12\"\n ry=\"12\"\n />\n </clipPath>\n <linearGradient id=\"wAreaGrad\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#6366f1\" stop-opacity=\"0.28\" />\n <stop offset=\"100%\" stop-color=\"#6366f1\" stop-opacity=\"0.04\" />\n </linearGradient>\n <linearGradient id=\"wLineGrad\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stop-color=\"#a5b4fc\" />\n <stop offset=\"100%\" stop-color=\"#4338ca\" />\n </linearGradient>\n <filter id=\"wgTrendGlow\" x=\"-8%\" y=\"-8%\" width=\"116%\" height=\"116%\">\n <feGaussianBlur stdDeviation=\"1.2\" result=\"b\" />\n <feMerge>\n <feMergeNode in=\"b\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n <g clip-path=\"url(#wgTrendClip)\">\n <rect\n class=\"wg-plot-fill\"\n [attr.x]=\"ch.PAD_L - 8\"\n [attr.y]=\"ch.PAD_T - 4\"\n [attr.width]=\"ch.W - ch.PAD_L - ch.PAD_R + 20\"\n [attr.height]=\"ch.bottomY - ch.PAD_T + 8\"\n rx=\"12\"\n ry=\"12\"\n />\n <g class=\"wg-grid\">\n @for (g of ch.gridLines; track g) {\n <line\n [attr.x1]=\"ch.PAD_L\"\n [attr.x2]=\"ch.W - ch.PAD_R + 4\"\n [attr.y1]=\"g.y\"\n [attr.y2]=\"g.y\"\n />\n }\n @for (g of ch.gridLines; track g) {\n <text\n [attr.x]=\"ch.PAD_L - 10\"\n [attr.y]=\"g.y + 4\"\n text-anchor=\"end\"\n class=\"wg-grid-label\"\n >\n {{ g.label }}\n </text>\n }\n </g>\n <path class=\"wg-area\" [attr.d]=\"ch.areaPath\" fill=\"url(#wAreaGrad)\" />\n <path\n class=\"wg-actual\"\n [attr.d]=\"ch.pathActual\"\n stroke=\"url(#wLineGrad)\"\n filter=\"url(#wgTrendGlow)\"\n />\n </g>\n <line\n class=\"wg-axis\"\n [attr.x1]=\"ch.PAD_L - 2\"\n [attr.y1]=\"ch.bottomY\"\n [attr.x2]=\"ch.W - ch.PAD_R + 6\"\n [attr.y2]=\"ch.bottomY\"\n />\n @for (p of ch.pts; track p) {\n <g>\n <circle [attr.cx]=\"p.x\" [attr.cy]=\"p.y\" r=\"7\" class=\"wg-node\" />\n <circle [attr.cx]=\"p.x\" [attr.cy]=\"p.y\" r=\"3.5\" class=\"wg-node-core\" />\n @if (p.showKgLabel) {\n <text [attr.x]=\"p.x\" [attr.y]=\"p.y - 14\" text-anchor=\"middle\" class=\"wg-value-label\">\n {{ formatKg(p.log.weightKg) }}\n </text>\n }\n @if (p.showXLabel) {\n <text\n [attr.x]=\"p.x\"\n [attr.y]=\"ch.H - 40\"\n [attr.transform]=\"'rotate(-36 ' + p.x + ',' + (ch.H - 40) + ')'\"\n text-anchor=\"end\"\n class=\"wg-age-label\"\n >\n {{ formatDateShort(p.log.date) }}\n </text>\n }\n </g>\n }\n </svg>\n </div>\n </section>\n}\n\n<!-- Tốc độ -->\n@if (weightVelocityLineChart(); as ln) {\n <section class=\"wg-suite\">\n <header class=\"wg-suite__head\">\n <h3><i class=\"pi pi-bolt\"></i> Tốc độ tăng cân</h3>\n <p class=\"wg-suite__sub\">Ước lượng g/ngày giữa hai lần cân liên tiếp</p>\n </header>\n <div class=\"wg-scroll\" [style.--wg-min-x.px]=\"ln.W\">\n <svg\n class=\"wg-svg wg-svg--velocity\"\n [attr.viewBox]=\"'0 0 ' + ln.W + ' ' + ln.H\"\n preserveAspectRatio=\"xMidYMid meet\"\n >\n <defs>\n <linearGradient id=\"wVelLineGrad\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stop-color=\"#34d399\" />\n <stop offset=\"100%\" stop-color=\"#0d9488\" />\n </linearGradient>\n <filter id=\"wgVelGlow\" x=\"-6%\" y=\"-6%\" width=\"112%\" height=\"112%\">\n <feGaussianBlur stdDeviation=\"1\" result=\"b\" />\n <feMerge>\n <feMergeNode in=\"b\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n <g class=\"wg-grid\">\n @for (gl of ln.gridLines; track gl) {\n <line\n [attr.x1]=\"ln.PAD_L\"\n [attr.x2]=\"ln.PAD_L + ln.innerW + 4\"\n [attr.y1]=\"gl.y\"\n [attr.y2]=\"gl.y\"\n />\n }\n @for (gl of ln.gridLines; track gl) {\n <text\n [attr.x]=\"ln.PAD_L - 6\"\n [attr.y]=\"gl.y + 4\"\n text-anchor=\"end\"\n class=\"wg-grid-label\"\n >\n {{ gl.label }}\n </text>\n }\n </g>\n <line\n class=\"wg-axis\"\n [attr.x1]=\"ln.PAD_L - 2\"\n [attr.y1]=\"ln.PAD_T + ln.H - ln.PAD_B\"\n [attr.x2]=\"ln.PAD_L + ln.innerW + 4\"\n [attr.y2]=\"ln.PAD_T + ln.H - ln.PAD_B\"\n />\n @if (ln.showZeroLine) {\n <line\n class=\"wg-zero\"\n [attr.x1]=\"ln.PAD_L\"\n [attr.x2]=\"ln.PAD_L + ln.innerW\"\n [attr.y1]=\"ln.zeroY\"\n [attr.y2]=\"ln.zeroY\"\n />\n }\n <path\n class=\"wg-velocity\"\n [attr.d]=\"ln.pathLine\"\n fill=\"none\"\n stroke=\"url(#wVelLineGrad)\"\n filter=\"url(#wgVelGlow)\"\n />\n @for (p of ln.pts; track p) {\n <g>\n <circle [attr.cx]=\"p.x\" [attr.cy]=\"p.y\" r=\"6\" class=\"wg-node wg-node--vel\" />\n <circle [attr.cx]=\"p.x\" [attr.cy]=\"p.y\" r=\"3\" class=\"wg-node-core wg-node-core--vel\" />\n @if (p.showValue) {\n <text [attr.x]=\"p.x\" [attr.y]=\"p.y - 12\" text-anchor=\"middle\" class=\"wg-value-label\">\n {{ formatGPerDay(p.gPerDay) }}\n </text>\n }\n @if (p.showXLabel) {\n <text\n [attr.x]=\"p.x\"\n [attr.y]=\"ln.H - 36\"\n [attr.transform]=\"'rotate(-36 ' + p.x + ',' + (ln.H - 36) + ')'\"\n text-anchor=\"end\"\n class=\"wg-age-label\"\n >\n {{ p.label }}\n </text>\n }\n </g>\n }\n </svg>\n </div>\n </section>\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\n\nimport type { TimelineMilestone } from '../../baby-timeline.data';\nimport type { HeightGrowthEvaluation, WeightGrowthEvaluation } from '../../baby-weight-growth';\nimport type { WeightLog } from '../../../../services/weight-log.service';\nimport {\n formatWeightCm,\n formatWeightDateDisplay,\n formatWeightKg,\n formatGrowthZScore,\n growthMarkerPosition,\n growthStatusClass,\n} from '../weight-display.utils';\n\n@Component({\n selector: 'app-weight-header',\n standalone: true,\n imports: [],\n templateUrl: './weight-header.component.html',\n styleUrls: ['./weight-header.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WeightHeaderComponent {\n errorMsg = input<string>('');\n successMsg = input<string>('');\n birthDate = input<string | undefined>(undefined);\n\n currentTimelineMilestone = input<TimelineMilestone | null>(null);\n timelineStats = input<{ total: number; past: number }>({ total: 0, past: 0 });\n\n latestGrowthEval = input<WeightGrowthEvaluation | null>(null);\n latestHeightEval = input<HeightGrowthEvaluation | null>(null);\n sortedLogsDesc = input<WeightLog[]>([]);\n latestHeightLog = input<WeightLog | null>(null);\n\n openWhoTable = output<void>();\n openTimeline = output<void>();\n\n statusClass(status: string): string {\n return growthStatusClass(status);\n }\n\n formatDate(iso: string): string {\n return formatWeightDateDisplay(iso);\n }\n\n formatKg(n: number): string {\n return formatWeightKg(n);\n }\n\n formatCm(n: number): string {\n return formatWeightCm(n);\n }\n\n formatSigned(n: number, digits = 1): string {\n const abs = Math.abs(n).toFixed(digits);\n return `${n >= 0 ? '+' : '-'}${abs}`;\n }\n\n weightDeltaLabel(ev: WeightGrowthEvaluation): string {\n const e = ev.estimate;\n return `${this.formatSigned(e.deltaFromMedianKg, 2)} kg`;\n }\n\n heightDeltaLabel(ev: HeightGrowthEvaluation, currentHeightCm: number): string {\n const diff = Math.round((currentHeightCm - ev.medianCm) * 10) / 10;\n return `${this.formatSigned(diff, 1)} cm`;\n }\n\n growthMarkerPosition(zScore: number): number {\n return growthMarkerPosition(zScore);\n }\n\n formatZScore(zScore: number): string {\n return formatGrowthZScore(zScore);\n }\n\n friendlyHeightDetail(ev: HeightGrowthEvaluation, currentHeightCm: number): string {\n const diff = Math.round((currentHeightCm - ev.medianCm) * 10) / 10;\n const absDiff = this.formatCm(Math.abs(diff));\n if (Math.abs(diff) < 0.5) {\n return 'Chiều cao hiện tại gần mốc tham chiếu theo tuổi, tiếp tục theo dõi đều mỗi lần khám.';\n }\n if (diff < 0) {\n return `Hiện tại bé thấp hơn mốc tham chiếu khoảng ${absDiff} cm. Theo dõi thêm qua các lần đo tiếp theo.`;\n }\n return `Hiện tại bé cao hơn mốc tham chiếu khoảng ${absDiff} cm. Thường là khác biệt cá thể, tiếp tục theo dõi xu hướng.`;\n }\n}\n","<div class=\"wh-root\">\n <div class=\"wh-alerts\">\n @if (errorMsg()) {\n <div class=\"alert error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n {{ errorMsg() }}\n </div>\n }\n @if (successMsg()) {\n <div class=\"alert ok\">\n <i class=\"pi pi-check-circle\"></i>\n {{ successMsg() }}\n </div>\n }\n </div>\n\n <div class=\"wh-toolbar\">\n @if (!birthDate()) {\n <p class=\"wh-hint\">\n <i class=\"pi pi-calendar\"></i>\n Thêm <strong>ngày sinh</strong> (tab Cữ bú) để có chuẩn WHO và timeline.\n </p>\n }\n <button\n type=\"button\"\n class=\"wh-pill-btn\"\n (click)=\"openWhoTable.emit()\"\n title=\"Bảng cân nặng chuẩn WHO theo tuổi\"\n >\n <i class=\"pi pi-table\"></i>\n Bảng chuẩn WHO\n </button>\n </div>\n\n @if (birthDate() && currentTimelineMilestone(); as cur) {\n <button\n type=\"button\"\n class=\"wh-timeline-cta\"\n (click)=\"openTimeline.emit()\"\n [title]=\"'Xem dòng thời gian phát triển của bé'\"\n >\n <span class=\"wh-timeline-cta__emoji\">{{ cur.heroEmoji }}</span>\n <span class=\"wh-timeline-cta__body\">\n <span class=\"wh-timeline-cta__label\">\n <i class=\"pi pi-chart-line\"></i>\n Timeline phát triển\n </span>\n <span class=\"wh-timeline-cta__sub\">{{ cur.periodLabel }} · {{ cur.tagline }}</span>\n </span>\n <span class=\"wh-timeline-cta__stat\">\n {{ timelineStats().past }}/{{ timelineStats().total }}\n </span>\n <i class=\"pi pi-chevron-right\"></i>\n </button>\n }\n\n @if (latestGrowthEval() || latestHeightEval()) {\n <section class=\"wh-assessment\">\n <header class=\"wh-assessment__head\">\n <div class=\"wh-assessment__eyebrow\">\n <i class=\"pi pi-heart\"></i>\n Đánh giá tăng trưởng gần nhất\n </div>\n <p class=\"wh-assessment__sub\">Theo chuẩn WHO (0-24 tháng) · dùng để tham khảo</p>\n </header>\n <div class=\"wh-assessment__grid\">\n @if (latestGrowthEval(); as ev) {\n <article class=\"wh-eval-card\" [attr.data-status]=\"statusClass(ev.status)\">\n <div class=\"wh-eval-card__head\">\n <h3 class=\"wh-eval-card__title\">\n <i class=\"pi pi-heart-fill\"></i>\n Cân nặng theo tuổi\n </h3>\n <span class=\"wh-eval-card__badge\" [attr.data-status]=\"statusClass(ev.status)\">\n {{ ev.statusLabel }}\n </span>\n </div>\n @if (sortedLogsDesc()[0]; as last) {\n <p class=\"wh-eval-card__meta\">\n {{ formatDate(last.date) }} · {{ formatKg(last.weightKg) }} kg · {{ ev.weeksLabel }}\n </p>\n }\n <div class=\"wh-score-grid\">\n <div class=\"wh-score\">\n <span class=\"wh-score__label\">Hiện tại</span>\n <strong class=\"wh-score__value\"\n >{{ formatKg(ev.estimate.currentWeightKg) }} kg</strong\n >\n </div>\n <div class=\"wh-score\">\n <span class=\"wh-score__label\">Chuẩn</span>\n <strong class=\"wh-score__value\"\n >{{ formatKg(ev.estimate.standardMinKg) }}-{{\n formatKg(ev.estimate.standardMaxKg)\n }}\n kg</strong\n >\n </div>\n <div class=\"wh-score\">\n <span class=\"wh-score__label\">Lệch</span>\n <strong class=\"wh-score__value\">{{ weightDeltaLabel(ev) }}</strong>\n </div>\n </div>\n <p class=\"wh-eval-card__detail wh-eval-card__detail--muted\">\n Thiếu cân < {{ formatKg(ev.estimate.underweightMaxKg) }} kg · Thừa cân >\n {{ formatKg(ev.estimate.overweightMinKg) }} kg\n </p>\n <div class=\"wh-eval-card__scale\" aria-hidden=\"true\">\n <div class=\"wh-eval-card__scale-labels\">\n <span class=\"wh-eval-card__scale-zone\">Thấp</span>\n <span class=\"wh-eval-card__scale-zone wh-eval-card__scale-zone--mid\">Phù hợp</span>\n <span class=\"wh-eval-card__scale-zone\">Cao</span>\n </div>\n <div class=\"wh-eval-card__scale-track\">\n <span class=\"wh-eval-card__scale-band wh-eval-card__scale-band--low\"></span>\n <span class=\"wh-eval-card__scale-band wh-eval-card__scale-band--mid\"></span>\n <span class=\"wh-eval-card__scale-band wh-eval-card__scale-band--high\"></span>\n <span\n class=\"wh-eval-card__scale-marker\"\n [attr.data-status]=\"statusClass(ev.status)\"\n [style.left.%]=\"growthMarkerPosition(ev.zScore)\"\n ></span>\n </div>\n <div class=\"wh-eval-card__scale-legend\">\n <span>−2 SD</span>\n <span class=\"wh-eval-card__scale-z\">z {{ formatZScore(ev.zScore) }}</span>\n <span>+2 SD</span>\n </div>\n </div>\n </article>\n }\n @if (latestHeightEval(); as hv) {\n <article\n class=\"wh-eval-card wh-eval-card--height\"\n [attr.data-status]=\"statusClass(hv.status)\"\n >\n <div class=\"wh-eval-card__head\">\n <h3 class=\"wh-eval-card__title\">\n <i class=\"pi pi-arrows-v\"></i>\n Chiều cao theo tuổi\n </h3>\n <span class=\"wh-eval-card__badge\" [attr.data-status]=\"statusClass(hv.status)\">\n {{ hv.statusLabel }}\n </span>\n </div>\n @if (latestHeightLog(); as last) {\n <p class=\"wh-eval-card__meta\">\n {{ formatDate(last.date) }} · {{ formatCm(last.heightCm || 0) }} cm ·\n {{ hv.monthsLabel }}\n </p>\n }\n @if (latestHeightLog(); as last) {\n <div class=\"wh-score-grid\">\n <div class=\"wh-score\">\n <span class=\"wh-score__label\">Hiện tại</span>\n <strong class=\"wh-score__value\">{{ formatCm(last.heightCm || 0) }} cm</strong>\n </div>\n <div class=\"wh-score\">\n <span class=\"wh-score__label\">Mốc tham chiếu</span>\n <strong class=\"wh-score__value\">{{ formatCm(hv.medianCm) }} cm</strong>\n </div>\n <div class=\"wh-score\">\n <span class=\"wh-score__label\">Lệch</span>\n <strong class=\"wh-score__value\">{{\n heightDeltaLabel(hv, last.heightCm || 0)\n }}</strong>\n </div>\n </div>\n }\n <div class=\"wh-eval-card__scale\" aria-hidden=\"true\">\n <div class=\"wh-eval-card__scale-labels\">\n <span class=\"wh-eval-card__scale-zone\">Thấp</span>\n <span class=\"wh-eval-card__scale-zone wh-eval-card__scale-zone--mid\">Phù hợp</span>\n <span class=\"wh-eval-card__scale-zone\">Cao</span>\n </div>\n <div class=\"wh-eval-card__scale-track\">\n <span class=\"wh-eval-card__scale-band wh-eval-card__scale-band--low\"></span>\n <span class=\"wh-eval-card__scale-band wh-eval-card__scale-band--mid\"></span>\n <span class=\"wh-eval-card__scale-band wh-eval-card__scale-band--high\"></span>\n <span\n class=\"wh-eval-card__scale-marker\"\n [attr.data-status]=\"statusClass(hv.status)\"\n [style.left.%]=\"growthMarkerPosition(hv.zScore)\"\n ></span>\n </div>\n <div class=\"wh-eval-card__scale-legend\">\n <span>−2 SD</span>\n <span class=\"wh-eval-card__scale-z\"\n >P{{ hv.percentile }} · z {{ formatZScore(hv.zScore) }}</span\n >\n <span>+2 SD</span>\n </div>\n </div>\n @if (latestHeightLog(); as last) {\n <p class=\"wh-eval-card__detail\">\n {{ friendlyHeightDetail(hv, last.heightCm || 0) }}\n </p>\n }\n </article>\n }\n </div>\n </section>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output, signal } from '@angular/core';\n\nimport type { WeightLog } from '../../../../services/weight-log.service';\nimport { formatWeightCm, formatWeightDateDisplay, formatWeightKg } from '../weight-display.utils';\n\n@Component({\n selector: 'app-weight-history-list',\n standalone: true,\n imports: [],\n templateUrl: './weight-history-list.component.html',\n styleUrls: ['./weight-history-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WeightHistoryListComponent {\n private readonly previewLimit = 10;\n\n loading = input<boolean>(false);\n logs = input<WeightLog[]>([]);\n fullHistoryOpen = signal(false);\n\n edit = output<WeightLog>();\n remove = output<WeightLog>();\n\n previewLogs = computed(() => this.logs().slice(0, this.previewLimit));\n hasMoreLogs = computed(() => this.logs().length > this.previewLimit);\n hiddenLogsCount = computed(() => Math.max(0, this.logs().length - this.previewLimit));\n\n formatDate(iso: string): string {\n return formatWeightDateDisplay(iso);\n }\n\n formatKg(n: number): string {\n return formatWeightKg(n);\n }\n\n formatCm(n: number): string {\n return formatWeightCm(n);\n }\n\n openFullHistory(): void {\n this.fullHistoryOpen.set(true);\n }\n\n closeFullHistory(): void {\n this.fullHistoryOpen.set(false);\n }\n}\n","<section class=\"whl-card\">\n <div class=\"whl-head\">\n <h3>Lịch sử cân</h3>\n @if (loading()) {\n <span class=\"whl-loading\"> <i class=\"pi pi-spin pi-spinner\"></i> Đang tải… </span>\n }\n </div>\n\n @if (!loading() && logs().length === 0) {\n <p class=\"whl-empty\">\n Chưa có dòng nào trên sheet Weight. Nhấn <strong>Ghi cân</strong> để thêm.\n </p>\n }\n\n @if (logs().length > 0) {\n <ul class=\"whl-list\">\n @for (log of previewLogs(); track log) {\n <li class=\"whl-row\">\n <div class=\"whl-main\">\n <div class=\"whl-line\">\n <span class=\"whl-date\">{{ formatDate(log.date) }}</span>\n <span class=\"whl-sep\" aria-hidden=\"true\">·</span>\n <span class=\"whl-kg\">{{ formatKg(log.weightKg) }} kg</span>\n @if (log.heightCm !== undefined) {\n <span class=\"whl-sep\" aria-hidden=\"true\">·</span>\n <span class=\"whl-height\">{{ formatCm(log.heightCm) }} cm</span>\n }\n </div>\n @if (log.note) {\n <span class=\"whl-note\">{{ log.note }}</span>\n }\n </div>\n <div class=\"whl-actions\">\n <button\n type=\"button\"\n class=\"whl-btn\"\n (click)=\"edit.emit(log)\"\n [disabled]=\"!log.rowIndex\"\n title=\"Sửa\"\n >\n <i class=\"pi pi-pencil\"></i>\n </button>\n <button\n type=\"button\"\n class=\"whl-btn whl-btn--danger\"\n (click)=\"remove.emit(log)\"\n [disabled]=\"!log.rowIndex\"\n title=\"Xoá\"\n >\n <i class=\"pi pi-trash\"></i>\n </button>\n </div>\n </li>\n }\n </ul>\n }\n\n @if (hasMoreLogs()) {\n <div class=\"whl-more\">\n <button type=\"button\" class=\"whl-more__btn\" (click)=\"openFullHistory()\">\n Xem thêm {{ hiddenLogsCount() }} bản ghi\n <i class=\"pi pi-chevron-right\"></i>\n </button>\n </div>\n }\n</section>\n\n@if (fullHistoryOpen()) {\n <div class=\"whl-dialog-overlay\" (click)=\"closeFullHistory()\">\n <section class=\"whl-dialog\" role=\"dialog\" aria-modal=\"true\" (click)=\"$event.stopPropagation()\">\n <header class=\"whl-dialog__head\">\n <h3>Toàn bộ lịch sử cân ({{ logs().length }})</h3>\n <button\n type=\"button\"\n class=\"whl-btn whl-btn--icon\"\n (click)=\"closeFullHistory()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </header>\n <ul class=\"whl-list whl-list--dialog\">\n @for (log of logs(); track log) {\n <li class=\"whl-row\">\n <div class=\"whl-main\">\n <div class=\"whl-line\">\n <span class=\"whl-date\">{{ formatDate(log.date) }}</span>\n <span class=\"whl-sep\" aria-hidden=\"true\">·</span>\n <span class=\"whl-kg\">{{ formatKg(log.weightKg) }} kg</span>\n @if (log.heightCm !== undefined) {\n <span class=\"whl-sep\" aria-hidden=\"true\">·</span>\n <span class=\"whl-height\">{{ formatCm(log.heightCm) }} cm</span>\n }\n </div>\n @if (log.note) {\n <span class=\"whl-note\">{{ log.note }}</span>\n }\n </div>\n <div class=\"whl-actions\">\n <button\n type=\"button\"\n class=\"whl-btn\"\n (click)=\"edit.emit(log)\"\n [disabled]=\"!log.rowIndex\"\n title=\"Sửa\"\n >\n <i class=\"pi pi-pencil\"></i>\n </button>\n <button\n type=\"button\"\n class=\"whl-btn whl-btn--danger\"\n (click)=\"remove.emit(log)\"\n [disabled]=\"!log.rowIndex\"\n title=\"Xoá\"\n >\n <i class=\"pi pi-trash\"></i>\n </button>\n </div>\n </li>\n }\n </ul>\n </section>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n HostListener,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { interval } from 'rxjs';\nimport { WeightLog, WeightLogService } from '../../../services/weight-log.service';\nimport {\n BABY_TIMELINE,\n TimelineMilestone,\n MoodType,\n getCurrentMilestone,\n getMilestoneState,\n getTimelineCareGuide,\n} from '../baby-timeline.data';\nimport {\n GROWTH_REFERENCE_CAPTION_VI,\n GROWTH_REFERENCE_REGION_VN,\n HeightGrowthEvaluation,\n WeightGrowthSex,\n ageDaysAtDate,\n approxSdKgAtWeeks,\n evaluateHeightForAge,\n evaluateWeightForAge,\n medianHeightCmAtMonths,\n medianWeightKgAtWeeks,\n approxSdHeightCmAtMonths,\n sampleWhoHeightBandByDay,\n sampleWhoWeightBandByDay,\n weeksFromDays,\n weeksFromDaysPrecise,\n whoGirlRangeReferenceTable,\n whoVnReferenceTable,\n} from '../baby-weight-growth';\nimport { ActivityLogService } from '../../../services/activity-log.service';\nimport {\n formatAgeShortVi,\n formatWeightCm,\n formatWeightDateDisplay,\n formatWeightDateShort,\n formatWeightGPerDay,\n formatWeightKg,\n growthStatusClass as growthStatusClassUtil,\n} from './weight-display.utils';\nimport { WeightChartsComponent } from './weight-charts/weight-charts.component';\nimport { WeightHeaderComponent } from './weight-header/weight-header.component';\nimport { WeightHistoryListComponent } from './weight-history-list/weight-history-list.component';\n\ninterface WeightDraft {\n date: string;\n weightInput: string;\n heightInput: string;\n note: string;\n}\n\ninterface WhoStandardRow {\n weeks: number;\n label: string;\n minKg: number;\n medianKg: number;\n maxKg: number;\n minCm: number;\n medianCm: number;\n maxCm: number;\n isCurrent: boolean;\n currentWeight: number | null;\n currentHeight: number | null;\n}\n\n@Component({\n selector: 'app-weight',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n WeightHeaderComponent,\n WeightChartsComponent,\n WeightHistoryListComponent,\n ],\n templateUrl: './weight.component.html',\n styleUrls: ['./weight.component.scss', '../development-timeline.dialog.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WeightComponent {\n private weightLogService = inject(WeightLogService);\n private destroyRef = inject(DestroyRef);\n private activityLogService = inject(ActivityLogService);\n\n /** Bảng tham chiếu WHO (cân + chiều cao) theo giới tính profile */\n readonly whoReferenceRows = computed(() => whoVnReferenceTable(this.growthSex()));\n\n /** Cùng user với trang feeding (`?user=`) */\n user = input<string>('guest');\n /** Ngày sinh (YYYY-MM-DD) — để tính tuần tuổi & timeline */\n birthDate = input<string | undefined>(undefined);\n gender = input<'boy' | 'girl' | '' | undefined>(undefined);\n babyName = input<string | undefined>(undefined);\n\n BABY_TIMELINE = BABY_TIMELINE;\n\n logs = signal<WeightLog[]>([]);\n loading = signal<boolean>(false);\n saving = signal<boolean>(false);\n errorMsg = signal<string>('');\n successMsg = signal<string>('');\n\n draft = signal<WeightDraft>(this.defaultDraft());\n addDialogOpen = signal<boolean>(false);\n\n editingLog = signal<WeightLog | null>(null);\n editDraft = signal<WeightDraft>(this.defaultDraft());\n\n now = signal<Date>(new Date());\n\n timelineDialogOpen = signal<boolean>(false);\n timelineView = signal<'list' | 'chart'>('list');\n selectedTimelineId = signal<string | null>(null);\n\n whoTableDialogOpen = signal<boolean>(false);\n /** Bảng tham chiếu WHO bé gái (VN) — dialog thông tin */\n whoGirlReferenceDialogOpen = signal<boolean>(false);\n\n /** Alias cho template (WHO dialog + đánh giá). */\n readonly growthStatusClass = growthStatusClassUtil;\n\n constructor() {\n this.load();\n interval(60_000)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.now.set(new Date()));\n }\n\n refresh() {\n this.load();\n }\n\n growthSex = computed<WeightGrowthSex>(() => (this.gender() === 'girl' ? 'female' : 'male'));\n\n ageInDays = computed<number | null>(() => {\n const b = this.birthDate();\n if (!b) return null;\n const birth = new Date(b);\n if (isNaN(birth.getTime())) return null;\n const diffMs = this.now().getTime() - birth.getTime();\n return Math.max(0, Math.floor(diffMs / (1000 * 60 * 60 * 24)));\n });\n\n sortedLogsAsc = computed(() => [...this.logs()].sort((a, b) => a.date.localeCompare(b.date)));\n\n sortedLogsDesc = computed(() => [...this.logs()].sort((a, b) => b.date.localeCompare(a.date)));\n\n latestHeightLog(): WeightLog | null {\n for (const l of this.sortedLogsDesc()) {\n if (l.heightCm !== undefined && l.heightCm > 0) return l;\n }\n return null;\n }\n\n /** Khoảng cách ngày giữa hai mốc ISO (YYYY-MM-DD), làm tròn theo ngày. */\n private diffDaysIso(earlierIso: string, laterIso: string): number {\n const a = new Date(`${earlierIso}T12:00:00`);\n const b = new Date(`${laterIso}T12:00:00`);\n return Math.round((b.getTime() - a.getTime()) / 86_400_000);\n }\n\n /** Các đoạn giữa hai lần cân liên tiếp (theo ngày tăng dần). */\n weightLogIntervals = computed(() => {\n const logs = this.sortedLogsAsc();\n const segs: Array<{\n fromDate: string;\n toDate: string;\n days: number;\n deltaKg: number;\n gPerDay: number | null;\n labelShort: string;\n }> = [];\n for (let i = 1; i < logs.length; i++) {\n const prev = logs[i - 1];\n const cur = logs[i];\n const days = this.diffDaysIso(prev.date, cur.date);\n const deltaKg = cur.weightKg - prev.weightKg;\n segs.push({\n fromDate: prev.date,\n toDate: cur.date,\n days,\n deltaKg,\n gPerDay: days > 0 ? Math.round(((1000 * deltaKg) / days) * 10) / 10 : null,\n labelShort: `${this.formatDateShort(prev.date)}→${this.formatDateShort(cur.date)}`,\n });\n }\n return segs;\n });\n\n latestGrowthEval = computed(() => {\n const birth = this.birthDate();\n const latest = this.sortedLogsDesc()[0];\n if (!birth || !latest) return null;\n const days = ageDaysAtDate(birth, latest.date);\n if (days === null) return null;\n const w = weeksFromDaysPrecise(days);\n return evaluateWeightForAge(w, latest.weightKg, this.growthSex());\n });\n\n latestHeightEval = computed<HeightGrowthEvaluation | null>(() => {\n const birth = this.birthDate();\n const latest = this.latestHeightLog();\n if (!birth || !latest || latest.heightCm === undefined) return null;\n const days = ageDaysAtDate(birth, latest.date);\n if (days === null) return null;\n return evaluateHeightForAge(days, latest.heightCm, this.growthSex());\n });\n\n /**\n * Bảng chuẩn WHO với min/max/median theo tuần tuổi.\n * Highlight dòng tuần hiện tại của bé.\n */\n whoStandardTable = computed<WhoStandardRow[]>(() => {\n const sex = this.growthSex();\n const currentWeeks = this.ageInDays() !== null ? Math.floor(this.ageInDays()! / 7) : null;\n const latestWeight = this.sortedLogsDesc()[0]?.weightKg ?? null;\n const latestHeight = this.latestHeightLog()?.heightCm ?? null;\n\n if (sex === 'female') {\n const rows = whoGirlRangeReferenceTable();\n return rows.map((r, idx) => {\n const weeks = Math.round((r.monthsAge * 30.4375) / 7);\n const next = rows[idx + 1];\n const nextWeeks = next\n ? Math.round((next.monthsAge * 30.4375) / 7)\n : Number.MAX_SAFE_INTEGER;\n const isCurrent =\n currentWeeks !== null && currentWeeks >= weeks && currentWeeks < nextWeeks;\n return {\n weeks,\n label: r.ageLabelVi,\n minKg: r.weightMinus2SdKg,\n medianKg: r.weightMedianKg,\n maxKg: r.weightPlus2SdKg,\n minCm: r.heightMinus2SdCm,\n medianCm: r.heightMedianCm,\n maxCm: r.heightPlus2SdCm,\n isCurrent,\n currentWeight: isCurrent ? latestWeight : null,\n currentHeight: isCurrent ? latestHeight : null,\n };\n });\n }\n\n const milestones = [\n { weeks: 0, label: 'Sơ sinh' },\n { weeks: 4, label: '1 tháng' },\n { weeks: 8, label: '2 tháng' },\n { weeks: 12, label: '3 tháng' },\n { weeks: 16, label: '4 tháng' },\n { weeks: 20, label: '5 tháng' },\n { weeks: 24, label: '6 tháng' },\n { weeks: 32, label: '8 tháng' },\n { weeks: 40, label: '10 tháng' },\n { weeks: 48, label: '12 tháng' },\n { weeks: 60, label: '15 tháng' },\n { weeks: 72, label: '18 tháng' },\n { weeks: 84, label: '21 tháng' },\n { weeks: 96, label: '24 tháng' },\n ];\n\n return milestones.map((m) => {\n const median = medianWeightKgAtWeeks(m.weeks, sex);\n const sd = approxSdKgAtWeeks(m.weeks, sex);\n const isCurrent =\n currentWeeks !== null &&\n currentWeeks >= m.weeks &&\n (milestones.findIndex((x) => x.weeks === m.weeks) === milestones.length - 1 ||\n currentWeeks < milestones[milestones.findIndex((x) => x.weeks === m.weeks) + 1].weeks);\n\n return {\n weeks: m.weeks,\n label: m.label,\n minKg: Math.round((median - 2 * sd) * 100) / 100,\n medianKg: Math.round(median * 100) / 100,\n maxKg: Math.round((median + 2 * sd) * 100) / 100,\n minCm:\n Math.round(\n (this.medianHeightByWeeks(m.weeks, sex) - 2 * this.sdHeightByWeeks(m.weeks, sex)) * 10\n ) / 10,\n medianCm: Math.round(this.medianHeightByWeeks(m.weeks, sex) * 10) / 10,\n maxCm:\n Math.round(\n (this.medianHeightByWeeks(m.weeks, sex) + 2 * this.sdHeightByWeeks(m.weeks, sex)) * 10\n ) / 10,\n isCurrent,\n currentWeight: isCurrent ? latestWeight : null,\n currentHeight: isCurrent ? latestHeight : null,\n };\n });\n });\n\n whoCurrentWeightLevel(row: WhoStandardRow): 'ok' | 'mid' | 'warn' {\n return this.whoMetricLevel(row.currentWeight, row.minKg, row.medianKg, row.maxKg);\n }\n\n whoCurrentHeightLevel(row: WhoStandardRow): 'ok' | 'mid' | 'warn' {\n return this.whoMetricLevel(row.currentHeight, row.minCm, row.medianCm, row.maxCm);\n }\n\n openWhoTableDialog() {\n this.whoTableDialogOpen.set(true);\n }\n\n closeWhoTableDialog() {\n this.whoTableDialogOpen.set(false);\n }\n\n readonly noteQuickTags = [\n 'Có tã',\n 'Không tã',\n 'Sau khi thức dậy',\n 'Trước khi bú',\n 'Buổi sáng',\n 'Buổi tối',\n ] as const;\n\n /** Xu hướng đơn khi không có biểu đồ so sánh WHO (thiếu ngày sinh hoặc tương đương). */\n simpleTrendForCharts = computed(() => !this.weightVsStandardChart() && !!this.weightTrendChart());\n\n weightTrendChart = computed(() => {\n const logs = this.sortedLogsAsc();\n if (logs.length === 0) return null;\n\n const PAD_L = 48;\n const PAD_R = 20;\n const PAD_T = 20;\n const PAD_B = 72;\n const H = 288;\n const n = logs.length;\n\n const kgVals = logs.map((l) => l.weightKg);\n let minKg = Math.min(...kgVals);\n let maxKg = Math.max(...kgVals);\n const span = maxKg - minKg;\n const pad = span < 0.05 ? 0.25 : Math.max(0.08, span * 0.15);\n minKg = Math.max(0.1, minKg - pad);\n maxKg = maxKg + pad;\n const range = Math.max(0.2, maxKg - minKg);\n\n const innerW = Math.max(340, Math.max(n - 1, 1) * 80);\n const W = PAD_L + innerW + PAD_R;\n const chartH = H - PAD_T - PAD_B;\n const bottomY = PAD_T + chartH;\n\n const xOf = (i: number) => PAD_L + (n === 1 ? innerW / 2 : (i / Math.max(1, n - 1)) * innerW);\n const yOf = (kg: number) => PAD_T + chartH - ((kg - minKg) / range) * chartH;\n\n let pathActual = '';\n const pts: Array<{\n log: WeightLog;\n x: number;\n y: number;\n showXLabel: boolean;\n showKgLabel: boolean;\n }> = [];\n\n const labelStep = n <= 8 ? 1 : Math.max(1, Math.ceil(n / 7));\n\n logs.forEach((l, i) => {\n const x = xOf(i);\n const y = yOf(l.weightKg);\n pathActual += i === 0 ? `M ${x},${y}` : ` L ${x},${y}`;\n pts.push({\n log: l,\n x,\n y,\n showXLabel: i === 0 || i === n - 1 || i % labelStep === 0,\n showKgLabel: true,\n });\n });\n\n let areaPath = '';\n if (pts.length > 0) {\n const first = pts[0];\n const last = pts[pts.length - 1];\n areaPath = `${pathActual} L ${last.x},${bottomY} L ${first.x},${bottomY} Z`;\n }\n\n const gridLines = [0, 1 / 3, 2 / 3, 1].map((r) => ({\n y: PAD_T + chartH - r * chartH,\n label: (minKg + r * range).toFixed(2).replace('.', ','),\n }));\n\n return {\n W,\n H,\n PAD_L,\n PAD_R,\n PAD_T,\n PAD_B,\n bottomY,\n pathActual,\n areaPath,\n pts,\n gridLines,\n minKg,\n maxKg,\n };\n });\n\n /**\n * Biểu đồ theo tuổi (ngày): so sánh đường bé với chuẩn WHO (VN).\n * Cân “lúc sinh” = bản ghi cân đầu tiên (ngày sớm nhất) trong bảng.\n */\n weightVsStandardChart = computed(() => {\n const birthIso = this.birthDate();\n const logs = this.sortedLogsAsc();\n if (!birthIso || logs.length === 0) return null;\n\n const sex = this.growthSex();\n type DayPt = { log: WeightLog; days: number };\n const raw: DayPt[] = [];\n for (const log of logs) {\n const days = ageDaysAtDate(birthIso, log.date);\n if (days !== null) raw.push({ log, days });\n }\n if (raw.length === 0) return null;\n\n const maxDaysData = Math.max(...raw.map((p) => p.days));\n const maxDays = Math.min(728, Math.max(7, maxDaysData));\n\n const ref = sampleWhoWeightBandByDay(maxDays, sex, 140);\n\n const kgFromLogs = raw.map((p) => p.log.weightKg);\n const kgFromRef = ref.flatMap((r) => [r.medianKg, r.minus2SdKg, r.plus2SdKg]);\n let minKg = Math.min(...kgFromLogs, ...kgFromRef);\n let maxKg = Math.max(...kgFromLogs, ...kgFromRef);\n const span = maxKg - minKg;\n const pad = span < 0.05 ? 0.25 : Math.max(0.08, span * 0.12);\n minKg = Math.max(0.1, minKg - pad);\n maxKg = maxKg + pad;\n const range = Math.max(0.2, maxKg - minKg);\n\n const PAD_L = 52;\n const PAD_R = 18;\n const PAD_T = 20;\n const PAD_B = 92;\n const H = 318;\n const innerW = Math.max(360, Math.min(780, 320 + maxDays * 0.85));\n const W = PAD_L + innerW + PAD_R;\n const chartH = H - PAD_T - PAD_B;\n const bottomY = PAD_T + chartH;\n\n const minD = 0;\n const maxD = maxDays;\n const spanD = Math.max(1, maxD - minD);\n const xOfDays = (d: number) => PAD_L + ((d - minD) / spanD) * innerW;\n const yOfKg = (kg: number) => PAD_T + chartH - ((kg - minKg) / range) * chartH;\n\n let pathMedian = '';\n let pathLow = '';\n let pathHigh = '';\n ref.forEach((r, i) => {\n const x = xOfDays(r.daysSinceBirth);\n const ym = yOfKg(r.medianKg);\n const yl = yOfKg(r.minus2SdKg);\n const yh = yOfKg(r.plus2SdKg);\n pathMedian += i === 0 ? `M ${x},${ym}` : ` L ${x},${ym}`;\n pathLow += i === 0 ? `M ${x},${yl}` : ` L ${x},${yl}`;\n pathHigh += i === 0 ? `M ${x},${yh}` : ` L ${x},${yh}`;\n });\n\n let bandPath = '';\n if (ref.length > 0) {\n let d = `M ${xOfDays(ref[0].daysSinceBirth)},${yOfKg(ref[0].plus2SdKg)}`;\n for (let i = 1; i < ref.length; i++) {\n const r = ref[i];\n d += ` L ${xOfDays(r.daysSinceBirth)},${yOfKg(r.plus2SdKg)}`;\n }\n for (let i = ref.length - 1; i >= 0; i--) {\n const r = ref[i];\n d += ` L ${xOfDays(r.daysSinceBirth)},${yOfKg(r.minus2SdKg)}`;\n }\n d += ' Z';\n bandPath = d;\n }\n\n const sorted = [...raw].sort((a, b) => {\n if (a.days !== b.days) return a.days - b.days;\n return a.log.date.localeCompare(b.log.date);\n });\n\n let pathActual = '';\n const n = sorted.length;\n const labelStep = n <= 8 ? 1 : Math.max(1, Math.ceil(n / 6));\n\n const pts: Array<{\n log: WeightLog;\n days: number;\n x: number;\n y: number;\n showKgLabel: boolean;\n showXLabel: boolean;\n ageLabel: string;\n }> = [];\n\n sorted.forEach((p, i) => {\n const x = xOfDays(p.days);\n const y = yOfKg(p.log.weightKg);\n pathActual += i === 0 ? `M ${x},${y}` : ` L ${x},${y}`;\n pts.push({\n ...p,\n x,\n y,\n showKgLabel: true,\n showXLabel: i === 0 || i === n - 1 || i % labelStep === 0,\n ageLabel: formatAgeShortVi(p.days),\n });\n });\n\n const gridLines = [0, 1 / 3, 2 / 3, 1].map((r) => ({\n y: PAD_T + chartH - r * chartH,\n label: (minKg + r * range).toFixed(2).replace('.', ','),\n }));\n\n const weekStep = maxDays > 180 ? 8 : maxDays > 90 ? 4 : 2;\n const xTicks: Array<{ x: number; label: string; subLabel?: string; tickY: number }> = [];\n for (let w = 0; w * 7 <= maxD; w += weekStep) {\n const d = w * 7;\n let label: string;\n let subLabel: string | undefined;\n if (w === 0) {\n label = 'Sinh';\n } else if (w >= 52) {\n const years = Math.floor(w / 52);\n const remainWeeks = w % 52;\n label = `${years} năm`;\n if (remainWeeks > 0) subLabel = `+${remainWeeks}t`;\n } else if (w >= 12) {\n const months = Math.floor(w / 4);\n const remainWeeks = w % 4;\n label = `${months} tháng`;\n if (remainWeeks > 0) subLabel = `+${remainWeeks}t`;\n } else {\n label = `${w}t`;\n subLabel = `${d} ngày`;\n }\n xTicks.push({ x: xOfDays(d), label, subLabel, tickY: H - 22 });\n }\n\n const firstLog = logs[0];\n const birthRecordLine = `${this.formatKg(firstLog.weightKg)} kg — ${this.formatDateDisplay(firstLog.date)}`;\n\n return {\n regionCode: GROWTH_REFERENCE_REGION_VN,\n referenceCaption: GROWTH_REFERENCE_CAPTION_VI,\n W,\n H,\n PAD_L,\n PAD_R,\n PAD_T,\n PAD_B,\n bottomY,\n pathMedian,\n pathLow,\n pathHigh,\n bandPath,\n pathActual,\n pts,\n gridLines,\n xTicks,\n minKg,\n maxKg,\n birthRecordLine,\n sexLabelVi:\n this.gender() === 'girl'\n ? 'Nữ (theo profile)'\n : this.gender() === 'boy'\n ? 'Nam (theo profile)'\n : 'Nam (mặc định khi chưa chọn)',\n };\n });\n\n heightVsStandardChart = computed(() => {\n const birthIso = this.birthDate();\n const logs = this.sortedLogsAsc().filter((l) => l.heightCm !== undefined && l.heightCm > 0);\n if (!birthIso || logs.length === 0) return null;\n\n const sex = this.growthSex();\n type DayPt = { log: WeightLog; days: number; heightCm: number };\n const raw: DayPt[] = [];\n for (const log of logs) {\n const days = ageDaysAtDate(birthIso, log.date);\n if (days === null || log.heightCm === undefined) continue;\n raw.push({ log, days, heightCm: log.heightCm });\n }\n if (raw.length === 0) return null;\n\n const maxDaysData = Math.max(...raw.map((p) => p.days));\n const maxDays = Math.min(731, Math.max(7, maxDaysData));\n const ref = sampleWhoHeightBandByDay(maxDays, sex, 120);\n\n const cmFromLogs = raw.map((p) => p.heightCm);\n const cmFromRef = ref.flatMap((r) => [r.medianCm, r.minus2SdCm, r.plus2SdCm]);\n let minCm = Math.min(...cmFromLogs, ...cmFromRef);\n let maxCm = Math.max(...cmFromLogs, ...cmFromRef);\n const span = maxCm - minCm;\n const pad = span < 0.5 ? 1.5 : Math.max(0.8, span * 0.12);\n minCm = Math.max(30, minCm - pad);\n maxCm = maxCm + pad;\n const range = Math.max(5, maxCm - minCm);\n\n const PAD_L = 52;\n const PAD_R = 18;\n const PAD_T = 20;\n const PAD_B = 92;\n const H = 318;\n const innerW = Math.max(360, Math.min(780, 320 + maxDays * 0.85));\n const W = PAD_L + innerW + PAD_R;\n const chartH = H - PAD_T - PAD_B;\n const bottomY = PAD_T + chartH;\n const spanD = Math.max(1, maxDays);\n const xOfDays = (d: number) => PAD_L + (d / spanD) * innerW;\n const yOfCm = (cm: number) => PAD_T + chartH - ((cm - minCm) / range) * chartH;\n\n let pathMedian = '';\n let pathLow = '';\n let pathHigh = '';\n ref.forEach((r, i) => {\n const x = xOfDays(r.daysSinceBirth);\n const ym = yOfCm(r.medianCm);\n const yl = yOfCm(r.minus2SdCm);\n const yh = yOfCm(r.plus2SdCm);\n pathMedian += i === 0 ? `M ${x},${ym}` : ` L ${x},${ym}`;\n pathLow += i === 0 ? `M ${x},${yl}` : ` L ${x},${yl}`;\n pathHigh += i === 0 ? `M ${x},${yh}` : ` L ${x},${yh}`;\n });\n\n let bandPath = '';\n if (ref.length > 0) {\n let d = `M ${xOfDays(ref[0].daysSinceBirth)},${yOfCm(ref[0].plus2SdCm)}`;\n for (let i = 1; i < ref.length; i++) {\n const r = ref[i];\n d += ` L ${xOfDays(r.daysSinceBirth)},${yOfCm(r.plus2SdCm)}`;\n }\n for (let i = ref.length - 1; i >= 0; i--) {\n const r = ref[i];\n d += ` L ${xOfDays(r.daysSinceBirth)},${yOfCm(r.minus2SdCm)}`;\n }\n d += ' Z';\n bandPath = d;\n }\n\n let pathActual = '';\n const n = raw.length;\n const labelStep = n <= 8 ? 1 : Math.max(1, Math.ceil(n / 6));\n const pts = [...raw]\n .sort((a, b) => a.days - b.days)\n .map((p, i) => {\n const x = xOfDays(p.days);\n const y = yOfCm(p.heightCm);\n pathActual += i === 0 ? `M ${x},${y}` : ` L ${x},${y}`;\n return {\n ...p,\n x,\n y,\n showLabel: true,\n showXLabel: i === 0 || i === n - 1 || i % labelStep === 0,\n ageLabel: formatAgeShortVi(p.days),\n };\n });\n\n const gridLines = [0, 1 / 3, 2 / 3, 1].map((r) => ({\n y: PAD_T + chartH - r * chartH,\n label: (minCm + r * range).toFixed(1).replace('.', ','),\n }));\n\n const monthStep = maxDays > 365 ? 3 : 2;\n const xTicks: Array<{ x: number; label: string; subLabel?: string }> = [];\n for (let month = 0; month * 30.4375 <= maxDays; month += monthStep) {\n const days = Math.round(month * 30.4375);\n xTicks.push({\n x: xOfDays(days),\n label: month === 0 ? 'Sinh' : `${month} tháng`,\n });\n }\n\n return {\n regionCode: GROWTH_REFERENCE_REGION_VN,\n referenceCaption: GROWTH_REFERENCE_CAPTION_VI,\n W,\n H,\n PAD_L,\n PAD_R,\n PAD_T,\n PAD_B,\n bottomY,\n pathMedian,\n pathLow,\n pathHigh,\n bandPath,\n pathActual,\n pts,\n gridLines,\n xTicks,\n sexLabelVi:\n this.gender() === 'girl'\n ? 'Nữ (theo profile)'\n : this.gender() === 'boy'\n ? 'Nam (theo profile)'\n : 'Nam (mặc định khi chưa chọn)',\n };\n });\n\n /**\n * Đường tốc độ tăng (g/ngày) giữa các cặp lần cân liên tiếp (chỉ khoảng ≥1 ngày).\n */\n weightVelocityLineChart = computed(() => {\n const intervals = this.weightLogIntervals().filter((s) => s.gPerDay !== null);\n if (intervals.length === 0) return null;\n\n const vals = intervals.map((s) => s.gPerDay as number);\n let minV = Math.min(...vals);\n let maxV = Math.max(...vals);\n minV = Math.min(minV, 0);\n maxV = Math.max(maxV, 0);\n const span = maxV - minV;\n const pad = span < 1 ? 8 : Math.max(4, span * 0.14);\n minV -= pad;\n maxV += pad;\n const range = Math.max(12, maxV - minV);\n\n const PAD_L = 46;\n const PAD_R = 12;\n const PAD_T = 14;\n const PAD_B = 58;\n const H = 220;\n const n = intervals.length;\n const innerW = Math.max(300, Math.max(n - 1, 1) * 64);\n const W = PAD_L + innerW + PAD_R;\n const chartH = H - PAD_T - PAD_B;\n const yOf = (v: number) => PAD_T + chartH - ((v - minV) / range) * chartH;\n const xOf = (i: number) => PAD_L + (n === 1 ? innerW / 2 : (i / Math.max(1, n - 1)) * innerW);\n const zeroY = yOf(0);\n const bottomY = PAD_T + chartH;\n const showZeroLine = zeroY >= PAD_T - 0.5 && zeroY <= bottomY + 0.5;\n\n let pathLine = '';\n const pts = intervals.map((seg, i) => {\n const g = seg.gPerDay as number;\n const x = xOf(i);\n const y = yOf(g);\n pathLine += i === 0 ? `M ${x},${y}` : ` L ${x},${y}`;\n const labelStep = n <= 8 ? 1 : Math.max(1, Math.ceil(n / 6));\n return {\n x,\n y,\n gPerDay: g,\n label: seg.labelShort,\n showValue: true,\n showXLabel: i === 0 || i === n - 1 || i % labelStep === 0,\n };\n });\n\n const gridLines = [0, 0.5, 1].map((t) => ({\n y: PAD_T + chartH - t * chartH,\n label: `${Math.round(minV + (1 - t) * range)} g/ngày`,\n }));\n\n return {\n W,\n H,\n PAD_L,\n innerW,\n PAD_T,\n PAD_B,\n pathLine,\n pts,\n gridLines,\n zeroY,\n showZeroLine,\n };\n });\n\n // ===== Timeline phát triển =====\n currentTimelineMilestone = computed<TimelineMilestone | null>(() => {\n const days = this.ageInDays();\n if (days === null) return null;\n return getCurrentMilestone(days);\n });\n\n timelineEntries = computed<\n Array<{ milestone: TimelineMilestone; state: 'past' | 'current' | 'future' }>\n >(() => {\n const days = this.ageInDays();\n return BABY_TIMELINE.map((m) => ({\n milestone: m,\n state: getMilestoneState(m, days),\n }));\n });\n\n timelineStats = computed(() => {\n const entries = this.timelineEntries();\n return {\n total: entries.length,\n past: entries.filter((e) => e.state === 'past').length,\n };\n });\n\n timelineChartData = computed(() => {\n const entries = this.timelineEntries();\n const n = entries.length;\n const SPACING = 58;\n const PAD_L = 36;\n const PAD_R = 36;\n const PAD_T = 40;\n const PAD_B = 60;\n const PLOT_H = 160;\n const H = PAD_T + PLOT_H + PAD_B;\n const W = PAD_L + PAD_R + (n - 1) * SPACING;\n\n const moodRatio: Record<MoodType, number> = {\n happy: 0.12,\n milestone: 0.22,\n calm: 0.45,\n growth: 0.7,\n leap: 0.88,\n };\n\n const points = entries.map((e, i) => {\n const x = PAD_L + i * SPACING;\n const y = PAD_T + moodRatio[e.milestone.mood] * PLOT_H;\n return { x, y, entry: e, index: i };\n });\n\n let linePath = '';\n if (points.length > 0) {\n linePath = `M ${points[0].x},${points[0].y}`;\n const tension = 0.22;\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i - 1] || points[i];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[i + 2] || p2;\n const cp1x = p1.x + (p2.x - p0.x) * tension;\n const cp1y = p1.y + (p2.y - p0.y) * tension;\n const cp2x = p2.x - (p3.x - p1.x) * tension;\n const cp2y = p2.y - (p3.y - p1.y) * tension;\n linePath += ` C ${cp1x},${cp1y} ${cp2x},${cp2y} ${p2.x},${p2.y}`;\n }\n }\n\n const areaPath =\n linePath && points.length > 0\n ? `${linePath} L ${points[points.length - 1].x},${PAD_T + PLOT_H} L ${points[0].x},${PAD_T + PLOT_H} Z`\n : '';\n\n const moodGuides: Array<{ y: number; label: string; mood: MoodType }> = [\n { mood: 'happy', label: 'Vui vẻ', y: PAD_T + moodRatio.happy * PLOT_H },\n { mood: 'calm', label: 'Bình yên', y: PAD_T + moodRatio.calm * PLOT_H },\n {\n mood: 'growth',\n label: 'Tăng trưởng',\n y: PAD_T + moodRatio.growth * PLOT_H,\n },\n { mood: 'leap', label: 'Leap / WW', y: PAD_T + moodRatio.leap * PLOT_H },\n ];\n\n return {\n W,\n H,\n PAD_L,\n PAD_R,\n PAD_T,\n PAD_B,\n PLOT_H,\n points,\n linePath,\n areaPath,\n moodGuides,\n };\n });\n\n selectedTimelineEntry = computed(() => {\n const id = this.selectedTimelineId();\n const entries = this.timelineEntries();\n if (id) {\n const found = entries.find((e) => e.milestone.id === id);\n if (found) return found;\n }\n return entries.find((e) => e.state === 'current') || entries[0] || null;\n });\n\n selectedTimelineCareGuide = computed(() => {\n const entry = this.selectedTimelineEntry();\n return entry ? getTimelineCareGuide(entry.milestone.id) : null;\n });\n\n selectedTimelineIndex = computed(() => {\n const id = this.selectedTimelineId();\n const entries = this.timelineEntries();\n if (!id) {\n const curIdx = entries.findIndex((e) => e.state === 'current');\n return curIdx >= 0 ? curIdx : 0;\n }\n const idx = entries.findIndex((e) => e.milestone.id === id);\n return idx >= 0 ? idx : 0;\n });\n\n setTimelineView(view: 'list' | 'chart') {\n this.timelineView.set(view);\n }\n\n selectTimelineNode(id: string) {\n this.selectedTimelineId.set(id);\n }\n\n prevTimeline() {\n const entries = this.timelineEntries();\n const idx = this.selectedTimelineIndex();\n if (idx > 0) {\n this.selectedTimelineId.set(entries[idx - 1].milestone.id);\n }\n }\n\n nextTimeline() {\n const entries = this.timelineEntries();\n const idx = this.selectedTimelineIndex();\n if (idx < entries.length - 1) {\n this.selectedTimelineId.set(entries[idx + 1].milestone.id);\n }\n }\n\n goToCurrentTimeline() {\n const cur = this.currentTimelineMilestone();\n if (cur) this.selectedTimelineId.set(cur.id);\n }\n\n @HostListener('document:keydown', ['$event'])\n onTimelineKey(ev: KeyboardEvent) {\n if (!this.timelineDialogOpen()) return;\n if (ev.key === 'ArrowLeft') {\n ev.preventDefault();\n this.prevTimeline();\n } else if (ev.key === 'ArrowRight') {\n ev.preventDefault();\n this.nextTimeline();\n } else if (ev.key === 'Escape') {\n this.closeTimelineDialog();\n }\n }\n\n openTimelineDialog() {\n this.timelineDialogOpen.set(true);\n const cur = this.currentTimelineMilestone();\n if (cur) this.selectedTimelineId.set(cur.id);\n setTimeout(() => {\n if (this.timelineView() === 'list') {\n const el = document.getElementById('timeline-current');\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n } else {\n const el = document.querySelector('.tl-chart-scroll [data-current=\"true\"]');\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n }, 150);\n }\n\n closeTimelineDialog() {\n this.timelineDialogOpen.set(false);\n }\n\n openWhoGirlReferenceDialog() {\n this.whoGirlReferenceDialogOpen.set(true);\n }\n\n closeWhoGirlReferenceDialog() {\n this.whoGirlReferenceDialogOpen.set(false);\n }\n\n get maxBirthDate(): string {\n return new Date().toISOString().split('T')[0];\n }\n\n load() {\n this.loading.set(true);\n this.errorMsg.set('');\n\n this.weightLogService.getLogs().subscribe({\n next: (rows) => {\n this.logs.set(rows);\n this.loading.set(false);\n },\n error: (err) => {\n console.error(err);\n this.loading.set(false);\n this.errorMsg.set(\n 'Không tải được dữ liệu. Kiểm tra Sheet có tab \"Weight\" và quyền đọc public.'\n );\n },\n });\n }\n\n openAddDialog() {\n this.draft.set(this.defaultDraft());\n this.errorMsg.set('');\n this.successMsg.set('');\n this.addDialogOpen.set(true);\n }\n\n closeAddDialog() {\n this.addDialogOpen.set(false);\n }\n\n updateDraftDate(v: string) {\n this.draft.update((d) => ({ ...d, date: v }));\n }\n\n updateDraftWeight(v: string) {\n const cleaned = String(v ?? '').replace(/,/g, '.');\n this.draft.update((d) => ({ ...d, weightInput: cleaned }));\n }\n\n updateDraftHeight(v: string) {\n const cleaned = String(v ?? '').replace(/,/g, '.');\n this.draft.update((d) => ({ ...d, heightInput: cleaned }));\n }\n\n updateDraftNote(v: string) {\n this.draft.update((d) => ({ ...d, note: v }));\n }\n\n private parseDraftKg(raw: string): number | null {\n const s = raw.trim().replace(/,/g, '.');\n if (!s) return null;\n const n = parseFloat(s);\n return Number.isFinite(n) && n > 0 ? n : null;\n }\n\n private parseDraftHeightCm(raw: string): number | null {\n const s = raw.trim().replace(/,/g, '.');\n if (!s) return null;\n const n = parseFloat(s);\n if (!Number.isFinite(n)) return null;\n if (n < 30 || n > 130) return Number.NaN;\n return n;\n }\n\n submitAdd() {\n const d = this.draft();\n const kg = this.parseDraftKg(d.weightInput);\n const h = this.parseDraftHeightCm(d.heightInput);\n if (!d.date || kg === null) {\n this.errorMsg.set('Vui lòng nhập ngày và cân nặng (kg) hợp lệ.');\n return;\n }\n if (Number.isNaN(h)) {\n this.errorMsg.set('Chiều cao hợp lệ trong khoảng 30–130 cm (hoặc để trống).');\n return;\n }\n\n const log: WeightLog = {\n user:\n String(this.user() || 'guest')\n .toLowerCase()\n .trim() || 'guest',\n date: d.date,\n weightKg: kg,\n ...(h !== null ? { heightCm: Math.round(h * 10) / 10 } : {}),\n note: d.note.trim() || undefined,\n };\n\n this.saving.set(true);\n this.errorMsg.set('');\n this.successMsg.set('');\n\n this.weightLogService.addLog(log).subscribe({\n next: () => {\n this.saving.set(false);\n this.successMsg.set(\n `Đã lưu ${this.formatKg(kg)} kg${log.heightCm ? ` · ${this.formatCm(log.heightCm)} cm` : ''} ngày ${this.formatDateDisplay(log.date)}`\n );\n\n // Log activity\n this.activityLogService\n .logWeight(this.user(), 'WEIGHT_ADDED', {\n date: this.formatDateDisplay(log.date),\n weight: kg,\n })\n .subscribe();\n\n setTimeout(() => this.successMsg.set(''), 4000);\n this.closeAddDialog();\n setTimeout(() => this.load(), 900);\n },\n error: (err) => {\n this.saving.set(false);\n this.errorMsg.set(\n err?.message || 'Lưu thất bại. Kiểm tra Apps Script đã có action addWeight.'\n );\n },\n });\n }\n\n openEdit(log: WeightLog) {\n if (!log.rowIndex) return;\n this.editingLog.set(log);\n this.editDraft.set({\n date: log.date,\n weightInput: this.formatKg(log.weightKg),\n heightInput: log.heightCm ? this.formatCm(log.heightCm) : '',\n note: log.note || '',\n });\n this.errorMsg.set('');\n }\n\n cancelEdit() {\n this.editingLog.set(null);\n this.editDraft.set(this.defaultDraft());\n }\n\n updateEditDate(v: string) {\n this.editDraft.update((d) => ({ ...d, date: v }));\n }\n\n updateEditWeight(v: string) {\n const cleaned = String(v ?? '').replace(/,/g, '.');\n this.editDraft.update((d) => ({ ...d, weightInput: cleaned }));\n }\n\n updateEditHeight(v: string) {\n const cleaned = String(v ?? '').replace(/,/g, '.');\n this.editDraft.update((d) => ({ ...d, heightInput: cleaned }));\n }\n\n updateEditNote(v: string) {\n this.editDraft.update((d) => ({ ...d, note: v }));\n }\n\n noteHasTag(note: string, tag: string): boolean {\n return note\n .split(/[,;]\\s*/)\n .map((s) => s.trim())\n .includes(tag);\n }\n\n private toggleTagInNote(note: string, tag: string): string {\n const parts = note\n .split(/[,;]\\s*/)\n .map((s) => s.trim())\n .filter(Boolean);\n const i = parts.indexOf(tag);\n if (i >= 0) {\n parts.splice(i, 1);\n } else {\n parts.push(tag);\n }\n return parts.join(', ');\n }\n\n toggleDraftNoteTag(tag: string) {\n this.draft.update((d) => ({\n ...d,\n note: this.toggleTagInNote(d.note, tag),\n }));\n }\n\n toggleEditNoteTag(tag: string) {\n this.editDraft.update((d) => ({\n ...d,\n note: this.toggleTagInNote(d.note, tag),\n }));\n }\n\n submitEdit() {\n const orig = this.editingLog();\n if (!orig?.rowIndex) return;\n\n const d = this.editDraft();\n const kg = this.parseDraftKg(d.weightInput);\n const h = this.parseDraftHeightCm(d.heightInput);\n if (!d.date || kg === null) {\n this.errorMsg.set('Vui lòng nhập ngày và cân nặng hợp lệ.');\n return;\n }\n if (Number.isNaN(h)) {\n this.errorMsg.set('Chiều cao hợp lệ trong khoảng 30–130 cm (hoặc để trống).');\n return;\n }\n\n this.saving.set(true);\n this.errorMsg.set('');\n\n this.weightLogService\n .updateLog(orig.rowIndex, {\n date: d.date,\n weightKg: kg,\n heightCm: h !== null ? Math.round(h * 10) / 10 : null,\n note: d.note.trim(),\n })\n .subscribe({\n next: () => {\n this.saving.set(false);\n this.successMsg.set('Đã cập nhật.');\n\n // Log activity\n this.activityLogService\n .logWeight(this.user(), 'WEIGHT_UPDATED', {\n date: this.formatDateDisplay(d.date),\n oldWeight: orig.weightKg,\n newWeight: kg,\n })\n .subscribe();\n\n setTimeout(() => this.successMsg.set(''), 3000);\n this.cancelEdit();\n setTimeout(() => this.load(), 900);\n },\n error: (err) => {\n this.saving.set(false);\n this.errorMsg.set(\n err?.message || 'Cập nhật thất bại. Kiểm tra Apps Script đã có action updateWeight.'\n );\n },\n });\n }\n\n deleteLog(log: WeightLog) {\n if (!log.rowIndex) return;\n if (\n !confirm(\n `Xoá ghi nhận ${this.formatKg(log.weightKg)} kg ngày ${this.formatDateDisplay(log.date)}?`\n )\n ) {\n return;\n }\n\n this.weightLogService.deleteLog(log.rowIndex).subscribe({\n next: () => {\n this.successMsg.set('Đã xoá.');\n\n // Log activity\n this.activityLogService\n .logWeight(this.user(), 'WEIGHT_DELETED', {\n date: this.formatDateDisplay(log.date),\n weight: log.weightKg,\n })\n .subscribe();\n\n setTimeout(() => this.successMsg.set(''), 3000);\n if (this.editingLog()?.rowIndex === log.rowIndex) this.cancelEdit();\n setTimeout(() => this.load(), 900);\n },\n error: (err) => {\n this.errorMsg.set(err?.message || 'Xoá thất bại.');\n },\n });\n }\n\n formatDateDisplay(iso: string): string {\n return formatWeightDateDisplay(iso);\n }\n\n formatDateShort(iso: string): string {\n return formatWeightDateShort(iso);\n }\n\n formatKg(n: number): string {\n return formatWeightKg(n);\n }\n\n formatGPerDay(n: number): string {\n return formatWeightGPerDay(n);\n }\n\n formatCm(n: number): string {\n return formatWeightCm(n);\n }\n\n private medianHeightByWeeks(weeks: number, sex: WeightGrowthSex): number {\n return medianHeightCmAtMonths((weeks * 7) / 30.4375, sex);\n }\n\n private sdHeightByWeeks(weeks: number, sex: WeightGrowthSex): number {\n return approxSdHeightCmAtMonths((weeks * 7) / 30.4375, sex);\n }\n\n private whoMetricLevel(\n value: number | null,\n min: number,\n median: number,\n max: number\n ): 'ok' | 'mid' | 'warn' {\n if (value === null || !Number.isFinite(value)) return 'mid';\n const p = this.estimatePercentileFromBand(value, min, median, max);\n if (p >= 40 && p <= 60) return 'ok';\n if (p < 3 || p > 97) return 'warn';\n return 'mid';\n }\n\n /**\n * Nội suy percentile xấp xỉ từ 3 mốc WHO:\n * -2SD ~ P3, median ~ P50, +2SD ~ P97.\n */\n private estimatePercentileFromBand(\n value: number,\n min: number,\n median: number,\n max: number\n ): number {\n if (max <= min) return 50;\n if (value <= median) {\n const span = Math.max(0.001, median - min);\n const ratio = (value - min) / span;\n return this.clamp(3 + ratio * (50 - 3), 0, 100);\n }\n const span = Math.max(0.001, max - median);\n const ratio = (value - median) / span;\n return this.clamp(50 + ratio * (97 - 50), 0, 100);\n }\n\n private clamp(n: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, n));\n }\n\n private defaultDraft(): WeightDraft {\n const t = new Date();\n const y = t.getFullYear();\n const m = String(t.getMonth() + 1).padStart(2, '0');\n const d = String(t.getDate()).padStart(2, '0');\n return {\n date: `${y}-${m}-${d}`,\n weightInput: '',\n heightInput: '',\n note: '',\n };\n }\n}\n","<div class=\"weight-page\">\n <app-weight-header\n [errorMsg]=\"errorMsg()\"\n [successMsg]=\"successMsg()\"\n [birthDate]=\"birthDate()\"\n [currentTimelineMilestone]=\"currentTimelineMilestone()\"\n [timelineStats]=\"timelineStats()\"\n [latestGrowthEval]=\"latestGrowthEval()\"\n [latestHeightEval]=\"latestHeightEval()\"\n [sortedLogsDesc]=\"sortedLogsDesc()\"\n [latestHeightLog]=\"latestHeightLog()\"\n (openWhoTable)=\"openWhoTableDialog()\"\n (openTimeline)=\"openTimelineDialog()\"\n />\n\n <app-weight-charts\n [weightVsStandardChart]=\"weightVsStandardChart()\"\n [heightVsStandardChart]=\"heightVsStandardChart()\"\n [weightTrendChart]=\"weightTrendChart()\"\n [simpleTrendMode]=\"simpleTrendForCharts()\"\n [weightVelocityLineChart]=\"weightVelocityLineChart()\"\n />\n\n <app-weight-history-list\n [loading]=\"loading()\"\n [logs]=\"sortedLogsDesc()\"\n (edit)=\"openEdit($event)\"\n (remove)=\"deleteLog($event)\"\n />\n\n <button\n type=\"button\"\n class=\"fab\"\n (click)=\"openAddDialog()\"\n aria-label=\"Ghi nhận cân nặng\"\n title=\"Ghi nhận cân nặng mới\"\n >\n <i class=\"pi pi-plus\"></i>\n <span class=\"fab-label\">Ghi cân</span>\n </button>\n\n <!-- Dialog thêm (giống cữ bú) -->\n @if (addDialogOpen()) {\n <div class=\"dialog-overlay\" (click)=\"closeAddDialog()\">\n <div class=\"dialog\" role=\"dialog\" aria-modal=\"true\" (click)=\"$event.stopPropagation()\">\n <div class=\"dialog-head\">\n <div>\n <div class=\"eyebrow\">Nhật ký cân nặng</div>\n <h2><i class=\"pi pi-chart-line\"></i> Thêm lần cân</h2>\n </div>\n <button type=\"button\" class=\"dialog-close\" (click)=\"closeAddDialog()\" aria-label=\"Đóng\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <form class=\"log-form\" (ngSubmit)=\"submitAdd()\">\n <div class=\"log-grid weight-log-grid\">\n <label class=\"field\">\n <span class=\"label\">Ngày cân</span>\n <input\n type=\"date\"\n class=\"input\"\n [value]=\"draft().date\"\n (input)=\"updateDraftDate($any($event.target).value)\"\n [max]=\"maxBirthDate\"\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Cân nặng (kg)</span>\n <input\n type=\"text\"\n class=\"input\"\n inputmode=\"decimal\"\n placeholder=\"VD: 4,25\"\n [value]=\"draft().weightInput\"\n (input)=\"updateDraftWeight($any($event.target).value)\"\n autocomplete=\"off\"\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Chiều cao (cm) · tuỳ chọn</span>\n <input\n type=\"text\"\n class=\"input\"\n inputmode=\"decimal\"\n placeholder=\"VD: 63,5\"\n [value]=\"draft().heightInput\"\n (input)=\"updateDraftHeight($any($event.target).value)\"\n autocomplete=\"off\"\n />\n </label>\n <label class=\"field full\">\n <span class=\"label\">Ghi chú cân nặng</span>\n <input\n type=\"text\"\n class=\"input\"\n placeholder=\"Tuỳ chọn — hoặc chọn gợi ý bên dưới\"\n [value]=\"draft().note\"\n (input)=\"updateDraftNote($any($event.target).value)\"\n />\n </label>\n </div>\n <div class=\"note-quick-tags\">\n <span class=\"note-quick-label\">Ghi nhanh:</span>\n @for (t of noteQuickTags; track t) {\n <button\n type=\"button\"\n class=\"note-chip\"\n [class.active]=\"noteHasTag(draft().note, t)\"\n (click)=\"toggleDraftNoteTag(t)\"\n >\n {{ t }}\n </button>\n }\n </div>\n <div class=\"dialog-actions\">\n <button type=\"button\" class=\"btn ghost\" (click)=\"closeAddDialog()\">Huỷ</button>\n <button type=\"submit\" class=\"btn btn-primary\" [disabled]=\"saving() || loading()\">\n <i class=\"pi\" [ngClass]=\"saving() ? 'pi-spin pi-spinner' : 'pi-save'\"></i>\n {{ saving() ? 'Đang lưu…' : 'Lưu' }}\n </button>\n </div>\n </form>\n </div>\n </div>\n }\n\n @if (editingLog()) {\n <div class=\"edit-overlay\" (click)=\"cancelEdit()\"></div>\n }\n @if (editingLog()) {\n <aside class=\"edit-sheet\" role=\"dialog\" aria-modal=\"true\">\n <header class=\"edit-sheet-head\">\n <h3>Sửa ghi nhận</h3>\n <button type=\"button\" class=\"btn icon ghost\" (click)=\"cancelEdit()\" aria-label=\"Đóng\">\n <i class=\"pi pi-times\"></i>\n </button>\n </header>\n <form class=\"form\" (ngSubmit)=\"submitEdit()\">\n <label class=\"field\">\n <span class=\"label\">Ngày</span>\n <input\n type=\"date\"\n class=\"input\"\n [value]=\"editDraft().date\"\n (input)=\"updateEditDate($any($event.target).value)\"\n [max]=\"maxBirthDate\"\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Cân (kg)</span>\n <input\n type=\"text\"\n class=\"input\"\n inputmode=\"decimal\"\n [value]=\"editDraft().weightInput\"\n (input)=\"updateEditWeight($any($event.target).value)\"\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Chiều cao (cm) · tuỳ chọn</span>\n <input\n type=\"text\"\n class=\"input\"\n inputmode=\"decimal\"\n [value]=\"editDraft().heightInput\"\n (input)=\"updateEditHeight($any($event.target).value)\"\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Ghi chú cân nặng</span>\n <input\n type=\"text\"\n class=\"input\"\n [value]=\"editDraft().note\"\n (input)=\"updateEditNote($any($event.target).value)\"\n />\n </label>\n <div class=\"note-quick-tags\">\n <span class=\"note-quick-label\">Ghi nhanh:</span>\n @for (t of noteQuickTags; track t) {\n <button\n type=\"button\"\n class=\"note-chip\"\n [class.active]=\"noteHasTag(editDraft().note, t)\"\n (click)=\"toggleEditNoteTag(t)\"\n >\n {{ t }}\n </button>\n }\n </div>\n <div class=\"edit-actions\">\n <button type=\"button\" class=\"btn ghost\" (click)=\"cancelEdit()\">Huỷ</button>\n <button type=\"submit\" class=\"btn btn-primary\" [disabled]=\"saving()\">\n <i class=\"pi\" [ngClass]=\"saving() ? 'pi-spin pi-spinner' : 'pi-check'\"></i>\n Cập nhật\n </button>\n </div>\n </form>\n </aside>\n }\n\n <!-- Timeline phát triển -->\n @if (timelineDialogOpen()) {\n <div class=\"dialog-overlay\" (click)=\"closeTimelineDialog()\">\n <div\n class=\"dialog dialog-wide timeline-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"dialog-head\">\n <div>\n <div class=\"eyebrow\">\n <i class=\"pi pi-chart-line\"></i>\n Dòng thời gian phát triển\n </div>\n <h2>🌱 Hành trình của {{ babyName() || 'bé' }}</h2>\n @if (ageInDays() !== null) {\n <p class=\"dialog-lead\">\n {{ ageInDays() }} ngày tuổi ·\n <span class=\"tl-head-stat\"\n >{{ timelineStats().past }}/{{ timelineStats().total }} cột mốc đã qua</span\n >\n </p>\n }\n </div>\n <button\n type=\"button\"\n class=\"dialog-close\"\n (click)=\"closeTimelineDialog()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <div class=\"tl-tabs\" role=\"tablist\">\n <button\n type=\"button\"\n role=\"tab\"\n class=\"tl-tab\"\n [class.active]=\"timelineView() === 'list'\"\n (click)=\"setTimelineView('list')\"\n >\n <i class=\"pi pi-list\"></i>\n <span>Danh sách</span>\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n class=\"tl-tab\"\n [class.active]=\"timelineView() === 'chart'\"\n (click)=\"setTimelineView('chart')\"\n >\n <i class=\"pi pi-chart-line\"></i>\n <span>Biểu đồ tâm trạng</span>\n </button>\n </div>\n @if (timelineView() === 'chart') {\n <div class=\"tl-chart-view\">\n <div class=\"tl-chart-mood-legend\">\n <span class=\"tl-mood-badge\" data-mood=\"happy\">\n <i class=\"pi pi-heart-fill\"></i> Vui\n </span>\n <span class=\"tl-mood-badge\" data-mood=\"milestone\">\n <i class=\"pi pi-star-fill\"></i> Cột mốc\n </span>\n <span class=\"tl-mood-badge\" data-mood=\"calm\">\n <i class=\"pi pi-circle-fill\"></i> Bình yên\n </span>\n <span class=\"tl-mood-badge\" data-mood=\"growth\">\n <i class=\"pi pi-arrow-up\"></i> Tăng trưởng\n </span>\n <span class=\"tl-mood-badge\" data-mood=\"leap\">\n <i class=\"pi pi-bolt\"></i> Leap/WW\n </span>\n </div>\n @if (timelineChartData(); as cd) {\n <div class=\"tl-chart-scroll\">\n <svg\n [attr.viewBox]=\"'0 0 ' + cd.W + ' ' + cd.H\"\n [attr.width]=\"cd.W\"\n [attr.height]=\"cd.H\"\n class=\"tl-chart-svg\"\n preserveAspectRatio=\"xMinYMid meet\"\n >\n <defs>\n <linearGradient id=\"tlMoodGradientW\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"#22c55e\" stop-opacity=\"0.20\" />\n <stop offset=\"45%\" stop-color=\"#eab308\" stop-opacity=\"0.14\" />\n <stop offset=\"100%\" stop-color=\"#ef4444\" stop-opacity=\"0.08\" />\n </linearGradient>\n <linearGradient id=\"tlMoodLineW\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"#16a34a\" />\n <stop offset=\"45%\" stop-color=\"#eab308\" />\n <stop offset=\"100%\" stop-color=\"#dc2626\" />\n </linearGradient>\n </defs>\n <g class=\"tl-chart-guides\">\n @for (g of cd.moodGuides; track g) {\n <line\n [attr.x1]=\"cd.PAD_L\"\n [attr.x2]=\"cd.W - cd.PAD_R\"\n [attr.y1]=\"g.y\"\n [attr.y2]=\"g.y\"\n stroke=\"#e5e7eb\"\n stroke-dasharray=\"2 4\"\n stroke-width=\"1\"\n />\n }\n @for (g of cd.moodGuides; track g) {\n <text\n [attr.x]=\"cd.PAD_L - 6\"\n [attr.y]=\"g.y + 3\"\n [attr.data-mood]=\"g.mood\"\n text-anchor=\"end\"\n class=\"tl-chart-guide-label\"\n >\n {{ g.label }}\n </text>\n }\n </g>\n <path [attr.d]=\"cd.areaPath\" fill=\"url(#tlMoodGradientW)\" />\n <path\n [attr.d]=\"cd.linePath\"\n fill=\"none\"\n stroke=\"url(#tlMoodLineW)\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <g class=\"tl-chart-x-labels\">\n @for (p of cd.points; track p) {\n <text\n [attr.x]=\"p.x\"\n [attr.y]=\"cd.PAD_T + cd.PLOT_H + 38\"\n text-anchor=\"middle\"\n class=\"tl-chart-x-label\"\n [class.past]=\"p.entry.state === 'past'\"\n [class.current]=\"p.entry.state === 'current'\"\n >\n {{ p.entry.milestone.periodLabel }}\n </text>\n }\n </g>\n <g class=\"tl-chart-nodes\">\n @for (p of cd.points; track p) {\n <g\n class=\"tl-chart-node\"\n [attr.data-state]=\"p.entry.state\"\n [attr.data-mood]=\"p.entry.milestone.mood\"\n [attr.data-accent]=\"p.entry.milestone.accent\"\n [attr.data-current]=\"p.entry.state === 'current' ? 'true' : null\"\n [attr.data-selected]=\"\n selectedTimelineId() === p.entry.milestone.id ? 'true' : null\n \"\n [attr.transform]=\"'translate(' + p.x + ',' + p.y + ')'\"\n (click)=\"selectTimelineNode(p.entry.milestone.id)\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"\n p.entry.milestone.periodLabel + ' - ' + p.entry.milestone.tagline\n \"\n >\n @if (p.entry.state === 'current') {\n <circle\n class=\"tl-chart-pulse\"\n r=\"22\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n />\n }\n @if (selectedTimelineId() === p.entry.milestone.id) {\n <circle\n class=\"tl-chart-halo\"\n r=\"20\"\n fill=\"currentColor\"\n fill-opacity=\"0.18\"\n />\n }\n <circle class=\"tl-chart-dot\" r=\"15\" />\n <text\n class=\"tl-chart-emoji\"\n text-anchor=\"middle\"\n dominant-baseline=\"central\"\n y=\"1\"\n >\n {{ p.entry.milestone.heroEmoji }}\n </text>\n @if (p.entry.state === 'past') {\n <g transform=\"translate(11,-11)\">\n <circle r=\"6.5\" fill=\"#10b981\" />\n <text\n text-anchor=\"middle\"\n dominant-baseline=\"central\"\n fill=\"#ffffff\"\n font-size=\"8\"\n font-weight=\"700\"\n y=\"0.5\"\n >\n ✓\n </text>\n </g>\n }\n </g>\n }\n </g>\n </svg>\n </div>\n }\n @if (selectedTimelineEntry(); as sel) {\n <div class=\"tl-chart-detail\">\n <article\n class=\"tl-item tl-item--detail\"\n [attr.data-accent]=\"sel.milestone.accent\"\n [attr.data-mood]=\"sel.milestone.mood\"\n [attr.data-state]=\"sel.state\"\n >\n <div class=\"tl-card\">\n <header class=\"tl-card-head\">\n <div class=\"tl-marker\">\n <span class=\"tl-hero-emoji\">{{ sel.milestone.heroEmoji }}</span>\n @if (sel.state === 'past') {\n <i class=\"pi pi-check tl-check\"></i>\n }\n @if (sel.state === 'current') {\n <span class=\"tl-now-pulse\"></span>\n }\n </div>\n <div class=\"tl-period\">\n <span class=\"tl-period-label\">{{ sel.milestone.periodLabel }}</span>\n <span class=\"tl-tagline\">{{ sel.milestone.tagline }}</span>\n </div>\n <span class=\"tl-mood-badge\" [attr.data-mood]=\"sel.milestone.mood\">\n <i\n class=\"pi\"\n [class.pi-heart-fill]=\"sel.milestone.mood === 'happy'\"\n [class.pi-circle-fill]=\"sel.milestone.mood === 'calm'\"\n [class.pi-arrow-up]=\"sel.milestone.mood === 'growth'\"\n [class.pi-bolt]=\"sel.milestone.mood === 'leap'\"\n [class.pi-star-fill]=\"sel.milestone.mood === 'milestone'\"\n ></i>\n {{ sel.milestone.moodLabel }}\n </span>\n </header>\n <div class=\"tl-stomach\">\n <div class=\"tl-stomach-visual\">\n <span\n class=\"tl-stomach-circle\"\n [style.transform]=\"'scale(' + sel.milestone.stomach.scale + ')'\"\n ></span>\n <span class=\"tl-stomach-emoji\">{{ sel.milestone.stomach.emoji }}</span>\n </div>\n <div class=\"tl-stomach-text\">\n <div class=\"tl-stomach-title\">\n <i class=\"pi pi-apple\"></i>\n Dạ dày bằng {{ sel.milestone.stomach.compareTo }}\n </div>\n <div class=\"tl-stomach-vol\">{{ sel.milestone.stomach.volumeMl }}</div>\n </div>\n </div>\n @if (sel.state === 'current') {\n <div class=\"tl-now-banner\">\n <i class=\"pi pi-compass\"></i>\n Bé của bạn đang ở đây 🎯\n </div>\n }\n @if (sel.milestone.skills?.length) {\n <div class=\"tl-skills\">\n <span class=\"tl-skills-label\">\n <i class=\"pi pi-sparkles\"></i> Kỹ năng:\n </span>\n @for (s of sel.milestone.skills; track s) {\n <span class=\"tl-skill-chip\">{{ s }}</span>\n }\n </div>\n }\n <div class=\"tl-section\">\n <div class=\"tl-section-label\">\n <i class=\"pi pi-lightbulb\"></i> Điều thú vị\n </div>\n <ul class=\"tl-list\">\n @for (f of sel.milestone.funFacts; track f) {\n <li>{{ f }}</li>\n }\n </ul>\n </div>\n <div class=\"tl-section\">\n <div class=\"tl-section-label\">\n <i class=\"pi pi-bookmark-fill\"></i> Ba mẹ lưu ý\n </div>\n <ul class=\"tl-list\">\n @for (n of sel.milestone.parentNotes | slice: 0 : 2; track n) {\n <li>\n {{ n }}\n </li>\n }\n </ul>\n </div>\n @if (selectedTimelineCareGuide(); as care) {\n <div class=\"tl-care-grid\">\n <div class=\"tl-section tl-section-care tl-section-care--todo\">\n <div class=\"tl-section-label\">\n <i class=\"pi pi-check-circle\"></i> Todo list\n </div>\n <ul class=\"tl-list\">\n @for (item of care.todos; track item) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n <div class=\"tl-section tl-section-care tl-section-care--avoid\">\n <div class=\"tl-section-label\">\n <i class=\"pi pi-ban\"></i> Not-to-do list\n </div>\n <ul class=\"tl-list\">\n @for (item of care.notToDo; track item) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n <div class=\"tl-section tl-section-care tl-section-care--watch\">\n <div class=\"tl-section-label\">\n <i class=\"pi pi-exclamation-triangle\"></i> Hỏi bác sĩ nếu\n </div>\n <ul class=\"tl-list\">\n @for (item of care.watchFor; track item) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n </div>\n }\n </div>\n </article>\n </div>\n }\n </div>\n }\n @if (timelineView() === 'list') {\n <div class=\"tl-nav-view\">\n <div class=\"tl-nav-bar\">\n <button\n type=\"button\"\n class=\"tl-nav-btn\"\n (click)=\"prevTimeline()\"\n [disabled]=\"selectedTimelineIndex() === 0\"\n aria-label=\"Cột mốc trước\"\n >\n <i class=\"pi pi-chevron-left\"></i>\n @if (selectedTimelineIndex() > 0) {\n <span class=\"tl-nav-btn-label\">\n {{ timelineEntries()[selectedTimelineIndex() - 1].milestone.periodLabel }}\n </span>\n }\n </button>\n <div class=\"tl-nav-position\">\n @if (currentTimelineMilestone()) {\n <button\n type=\"button\"\n class=\"tl-nav-today\"\n (click)=\"goToCurrentTimeline()\"\n [class.active]=\"\n selectedTimelineEntry() && selectedTimelineEntry()!.state === 'current'\n \"\n title=\"Về cột mốc hiện tại\"\n >\n <i class=\"pi pi-compass\"></i>\n Hiện tại\n </button>\n }\n <span class=\"tl-nav-count\">\n {{ selectedTimelineIndex() + 1 }}/{{ timelineEntries().length }}\n </span>\n </div>\n <button\n type=\"button\"\n class=\"tl-nav-btn tl-nav-btn--right\"\n (click)=\"nextTimeline()\"\n [disabled]=\"selectedTimelineIndex() >= timelineEntries().length - 1\"\n aria-label=\"Cột mốc tiếp theo\"\n >\n @if (selectedTimelineIndex() < timelineEntries().length - 1) {\n <span class=\"tl-nav-btn-label\">\n {{ timelineEntries()[selectedTimelineIndex() + 1].milestone.periodLabel }}\n </span>\n }\n <i class=\"pi pi-chevron-right\"></i>\n </button>\n </div>\n <div class=\"tl-progress-rail\">\n @for (e of timelineEntries(); track e; let i = $index) {\n <button\n type=\"button\"\n class=\"tl-rail-dot\"\n [attr.data-state]=\"e.state\"\n [attr.data-selected]=\"selectedTimelineIndex() === i ? 'true' : null\"\n (click)=\"selectTimelineNode(e.milestone.id)\"\n [attr.aria-label]=\"e.milestone.periodLabel\"\n [title]=\"e.milestone.periodLabel + ' · ' + e.milestone.tagline\"\n ></button>\n }\n </div>\n @if (selectedTimelineEntry(); as sel) {\n <div class=\"tl-nav-body\">\n <article\n class=\"tl-item tl-item--nav\"\n [attr.data-accent]=\"sel.milestone.accent\"\n [attr.data-mood]=\"sel.milestone.mood\"\n [attr.data-state]=\"sel.state\"\n >\n <div class=\"tl-card\">\n <header class=\"tl-card-head\">\n <div class=\"tl-marker\">\n <span class=\"tl-hero-emoji\">{{ sel.milestone.heroEmoji }}</span>\n @if (sel.state === 'past') {\n <i class=\"pi pi-check tl-check\"></i>\n }\n @if (sel.state === 'current') {\n <span class=\"tl-now-pulse\"></span>\n }\n </div>\n <div class=\"tl-period\">\n <span class=\"tl-period-label\">{{ sel.milestone.periodLabel }}</span>\n <span class=\"tl-tagline\">{{ sel.milestone.tagline }}</span>\n </div>\n <span class=\"tl-mood-badge\" [attr.data-mood]=\"sel.milestone.mood\">\n <i\n class=\"pi\"\n [class.pi-heart-fill]=\"sel.milestone.mood === 'happy'\"\n [class.pi-circle-fill]=\"sel.milestone.mood === 'calm'\"\n [class.pi-arrow-up]=\"sel.milestone.mood === 'growth'\"\n [class.pi-bolt]=\"sel.milestone.mood === 'leap'\"\n [class.pi-star-fill]=\"sel.milestone.mood === 'milestone'\"\n ></i>\n {{ sel.milestone.moodLabel }}\n </span>\n </header>\n <div class=\"tl-stomach\">\n <div class=\"tl-stomach-visual\">\n <span\n class=\"tl-stomach-circle\"\n [style.transform]=\"'scale(' + sel.milestone.stomach.scale + ')'\"\n ></span>\n <span class=\"tl-stomach-emoji\">{{ sel.milestone.stomach.emoji }}</span>\n </div>\n <div class=\"tl-stomach-text\">\n <div class=\"tl-stomach-title\">\n <i class=\"pi pi-apple\"></i>\n Dạ dày bằng {{ sel.milestone.stomach.compareTo }}\n </div>\n <div class=\"tl-stomach-vol\">{{ sel.milestone.stomach.volumeMl }}</div>\n </div>\n </div>\n @if (sel.state === 'current') {\n <div class=\"tl-now-banner\">\n <i class=\"pi pi-compass\"></i>\n Bé của bạn đang ở đây 🎯\n </div>\n }\n @if (sel.milestone.skills?.length) {\n <div class=\"tl-skills\">\n <span class=\"tl-skills-label\">\n <i class=\"pi pi-sparkles\"></i> Kỹ năng:\n </span>\n @for (s of sel.milestone.skills; track s) {\n <span class=\"tl-skill-chip\">{{ s }}</span>\n }\n </div>\n }\n <div class=\"tl-section\">\n <div class=\"tl-section-label\">\n <i class=\"pi pi-lightbulb\"></i> Điều thú vị\n </div>\n <ul class=\"tl-list\">\n @for (f of sel.milestone.funFacts; track f) {\n <li>{{ f }}</li>\n }\n </ul>\n </div>\n <div class=\"tl-section\">\n <div class=\"tl-section-label\">\n <i class=\"pi pi-bookmark-fill\"></i> Ba mẹ lưu ý\n </div>\n <ul class=\"tl-list\">\n @for (n of sel.milestone.parentNotes | slice: 0 : 2; track n) {\n <li>\n {{ n }}\n </li>\n }\n </ul>\n </div>\n @if (selectedTimelineCareGuide(); as care) {\n <div class=\"tl-care-grid\">\n <div class=\"tl-section tl-section-care tl-section-care--todo\">\n <div class=\"tl-section-label\">\n <i class=\"pi pi-check-circle\"></i> Todo list\n </div>\n <ul class=\"tl-list\">\n @for (item of care.todos; track item) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n <div class=\"tl-section tl-section-care tl-section-care--avoid\">\n <div class=\"tl-section-label\">\n <i class=\"pi pi-ban\"></i> Not-to-do list\n </div>\n <ul class=\"tl-list\">\n @for (item of care.notToDo; track item) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n <div class=\"tl-section tl-section-care tl-section-care--watch\">\n <div class=\"tl-section-label\">\n <i class=\"pi pi-exclamation-triangle\"></i> Hỏi bác sĩ nếu\n </div>\n <ul class=\"tl-list\">\n @for (item of care.watchFor; track item) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n </div>\n }\n </div>\n </article>\n </div>\n }\n </div>\n }\n <div class=\"tl-sources\">\n <i class=\"pi pi-info-circle\"></i>\n Tổng hợp từ: AAP HealthyChildren, CDC Milestones, WHO, The Wonder Weeks (Plooij), Vinmec.\n </div>\n </div>\n </div>\n }\n\n <!-- WHO Standards Table Dialog -->\n @if (whoTableDialogOpen()) {\n <div class=\"dialog-overlay\" (click)=\"closeWhoTableDialog()\">\n <div\n class=\"dialog dialog-wide who-table-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"dialog-head\">\n <div>\n <div class=\"eyebrow\">\n <i class=\"pi pi-globe\"></i>\n WHO 0-24 tháng\n </div>\n <h2>Bảng cân nặng & chiều cao theo tuổi</h2>\n <p class=\"dialog-lead\">{{ gender() === 'girl' ? 'Bé gái' : 'Bé trai' }} · 0-24 tháng</p>\n </div>\n <button\n type=\"button\"\n class=\"dialog-close\"\n (click)=\"closeWhoTableDialog()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <div class=\"who-table-legend\">\n <span class=\"who-legend-item who-legend-item--min\">\n <i class=\"pi pi-arrow-down\"></i> Min (−2SD)\n </span>\n <span class=\"who-legend-item who-legend-item--median\">\n <i class=\"pi pi-minus\"></i> Trung vị (P50)\n </span>\n <span class=\"who-legend-item who-legend-item--max\">\n <i class=\"pi pi-arrow-up\"></i> Max (+2SD)\n </span>\n </div>\n <div class=\"who-table-scroll\">\n <table class=\"who-table\">\n <thead>\n <tr>\n <th class=\"who-th-age\">Tuổi</th>\n <th class=\"who-th-value who-th-merged\">\n <span class=\"who-th-title\">Cân nặng</span>\n <span class=\"who-th-unit\">kg</span>\n </th>\n <th class=\"who-th-value who-th-merged\">\n <span class=\"who-th-title\">Chiều cao</span>\n <span class=\"who-th-unit\">cm</span>\n </th>\n @if (sortedLogsDesc().length > 0 || latestHeightLog()) {\n <th class=\"who-th-current\">Bé</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of whoStandardTable(); track row) {\n <tr [class.who-row-current]=\"row.isCurrent\">\n <td class=\"who-td-age\">\n <span class=\"who-age-label\">{{ row.label }}</span>\n @if (row.weeks > 0) {\n <span class=\"who-age-weeks\">{{ row.weeks }} tuần</span>\n }\n </td>\n <td class=\"who-td-value who-td-merged\">\n <div class=\"who-range-line who-range-line--min\">\n <strong>{{ formatKg(row.minKg) }}</strong>\n </div>\n <div class=\"who-range-line who-range-line--median\">\n <strong>{{ formatKg(row.medianKg) }}</strong>\n </div>\n <div class=\"who-range-line who-range-line--max\">\n <strong>{{ formatKg(row.maxKg) }}</strong>\n </div>\n </td>\n <td class=\"who-td-value who-td-merged\">\n <div class=\"who-range-line who-range-line--min\">\n <strong>{{ formatCm(row.minCm) }}</strong>\n </div>\n <div class=\"who-range-line who-range-line--median\">\n <strong>{{ formatCm(row.medianCm) }}</strong>\n </div>\n <div class=\"who-range-line who-range-line--max\">\n <strong>{{ formatCm(row.maxCm) }}</strong>\n </div>\n </td>\n @if (sortedLogsDesc().length > 0 || latestHeightLog()) {\n <td class=\"who-td-current who-td-current--stack\">\n <div class=\"who-current-stack\">\n @if (row.currentWeight !== null) {\n <div\n class=\"who-current-row\"\n [attr.data-level]=\"whoCurrentWeightLevel(row)\"\n >\n <strong>{{ formatKg(row.currentWeight) }}</strong>\n <span class=\"who-current-unit\">kg</span>\n </div>\n }\n @if (row.currentHeight !== null) {\n <div\n class=\"who-current-row\"\n [attr.data-level]=\"whoCurrentHeightLevel(row)\"\n >\n <strong>{{ formatCm(row.currentHeight) }}</strong>\n <span class=\"who-current-unit\">cm</span>\n </div>\n }\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n <div class=\"who-table-footer\">\n <p class=\"who-footer-note\">\n <i class=\"pi pi-info-circle\"></i>\n Mốc <strong>-2SD</strong>: có thể gợi ý suy dinh dưỡng, thiếu chất hoặc thấp còi. Mốc\n <strong>+2SD</strong>: có thể gợi ý thừa cân, béo phì hoặc rất cao.\n </p>\n <p class=\"who-footer-note who-footer-note--muted\">\n Số liệu theo Chuẩn tăng trưởng trẻ em WHO 2024 (áp dụng tại Việt Nam), chỉ mang tính\n tham khảo và không thay cho tư vấn y tế.\n </p>\n @if (whoReferenceRows()[0]; as r0) {\n <p class=\"who-footer-note who-footer-note--muted\">\n P50 tham khảo: sơ sinh ~{{ formatKg(r0.weightMedianKg) }} kg,\n {{ formatCm(r0.heightMedianCm) }} cm.\n </p>\n }\n </div>\n </div>\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n HostListener,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { interval } from 'rxjs';\nimport { EventLogService, FeedingEventLog } from '../../../services/event-log.service';\nimport { ActivityLogService } from '../../../services/activity-log.service';\n\ninterface EventDraft {\n date: string;\n time: string;\n title: string;\n note: string;\n place: string;\n}\n\nexport interface ScheduleDayGroup {\n dateIso: string;\n dateLabel: string;\n dateSubLabel?: string;\n dateBadge?: string;\n events: FeedingEventLog[];\n}\n\nexport interface ScheduleTimeSection {\n id: 'today' | 'soon' | 'nextMonth' | 'later' | 'past';\n title: string;\n subtitle: string;\n icon: string;\n eventCount: number;\n dayGroups: ScheduleDayGroup[];\n}\n\n@Component({\n selector: 'app-feeding-schedule',\n standalone: true,\n imports: [CommonModule, FormsModule],\n templateUrl: './feeding-schedule.component.html',\n styleUrls: ['./feeding-schedule.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedingScheduleComponent {\n private static readonly PREVIEW_EVENT_LIMIT = 3;\n\n private eventLogService = inject(EventLogService);\n private activityLogService = inject(ActivityLogService);\n private destroyRef = inject(DestroyRef);\n\n private placePickerOrigin: HTMLInputElement | null = null;\n private reopenCalendarAfterAdd = false;\n\n user = input<string>('guest');\n\n expandedSections = signal<Set<ScheduleTimeSection['id']>>(new Set());\n\n saving = signal(false);\n errorMsg = signal('');\n successMsg = signal('');\n\n addOpen = signal(false);\n draft = signal<EventDraft>(this.emptyDraft());\n\n editing = signal<FeedingEventLog | null>(null);\n editDraft = signal<EventDraft>(this.emptyDraft());\n\n now = signal<Date>(new Date());\n calendarDialogOpen = signal(false);\n calendarCursor = signal<Date>(new Date(new Date().getFullYear(), new Date().getMonth(), 1));\n selectedCalendarDate = signal<string>('');\n\n placePickerOpen = signal<'add' | 'edit' | null>(null);\n placeMenuRect = signal<{ top: number; left: number; width: number } | null>(null);\n\n placeMenuView = computed(() => {\n const ctx = this.placePickerOpen();\n const pos = this.placeMenuRect();\n if (!ctx || !pos) {\n return null;\n }\n const places = this.filteredPlaces(ctx);\n if (places.length === 0) {\n return null;\n }\n return { ctx, pos, places };\n });\n\n readonly calendarWeekdays = ['T2', 'T3', 'T4', 'T5', 'T6', 'T7', 'CN'];\n\n monthCalendarCells = computed(() => {\n const cursor = this.calendarCursor();\n const year = cursor.getFullYear();\n const month = cursor.getMonth();\n const firstDay = new Date(year, month, 1);\n const startOffset = (firstDay.getDay() + 6) % 7;\n const gridStart = new Date(year, month, 1 - startOffset);\n\n const eventsByDate = new Map<string, FeedingEventLog[]>();\n for (const ev of this.events()) {\n const bucket = eventsByDate.get(ev.date) ?? [];\n bucket.push(ev);\n eventsByDate.set(ev.date, bucket);\n }\n\n const cells: Array<{\n dateIso: string;\n day: number;\n inMonth: boolean;\n isToday: boolean;\n eventCount: number;\n hasFutureEvent: boolean;\n }> = [];\n\n const todayIso = this.toDateStr(this.now());\n for (let i = 0; i < 42; i++) {\n const d = new Date(gridStart.getFullYear(), gridStart.getMonth(), gridStart.getDate() + i);\n const dateIso = this.toDateStr(d);\n const dayEvents = eventsByDate.get(dateIso) ?? [];\n const hasFutureEvent = dayEvents.some((ev) => this.isFuture(ev));\n cells.push({\n dateIso,\n day: d.getDate(),\n inMonth: d.getMonth() === month,\n isToday: dateIso === todayIso,\n eventCount: dayEvents.length,\n hasFutureEvent,\n });\n }\n\n return cells;\n });\n\n /**\n * Xác định màu sắc cho indicator số sự kiện dựa trên loại và trạng thái sự kiện\n */\n getEventIndicatorColor(dateIso: string): string {\n const events = this.events().filter((ev) => ev.date === dateIso);\n if (events.length === 0) return '#4f46e5';\n\n // Ưu tiên màu theo loại sự kiện\n const hasFuture = events.some((ev) => this.isFuture(ev));\n const hasPast = events.some((ev) => !this.isFuture(ev));\n\n // Phân loại theo nội dung sự kiện\n const hasVaccine = events.some(\n (ev) =>\n ev.title.toLowerCase().includes('tiêm') ||\n ev.title.toLowerCase().includes('vaccine') ||\n ev.title.toLowerCase().includes('chích')\n );\n\n const hasCheckup = events.some(\n (ev) =>\n ev.title.toLowerCase().includes('khám') ||\n ev.title.toLowerCase().includes('check') ||\n ev.title.toLowerCase().includes('xét nghiệm')\n );\n\n const hasImportant = events.some(\n (ev) =>\n ev.title.toLowerCase().includes('quan trọng') ||\n ev.title.toLowerCase().includes('emergency') ||\n ev.title.toLowerCase().includes('khẩn')\n );\n\n // Màu sắc theo mức độ ưu tiên\n if (hasImportant) return '#dc2626'; // Đỏ - quan trọng/khẩn cấp\n if (hasVaccine) return '#7c3aed'; // Tím - tiêm chủng\n if (hasCheckup) return '#2563eb'; // Xanh dương - khám bệnh\n if (hasFuture) return '#059669'; // Xanh lá - sự kiện sắp tới\n if (hasPast) return '#6b7280'; // Xám - sự kiện đã qua\n\n return '#4f46e5'; // Màu mặc định\n }\n\n selectedCalendarEvents = computed(() => {\n const date = this.selectedCalendarDate();\n if (!date) return [] as FeedingEventLog[];\n return this.events()\n .filter((ev) => ev.date === date)\n .sort(\n (a, b) =>\n (EventLogService.eventDateTime(a)?.getTime() ?? 0) -\n (EventLogService.eventDateTime(b)?.getTime() ?? 0)\n );\n });\n\n calendarMonthLabel = computed(() => {\n const d = this.calendarCursor();\n return `Tháng ${d.getMonth() + 1}/${d.getFullYear()}`;\n });\n\n constructor() {\n this.refresh();\n interval(30_000)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.now.set(new Date()));\n\n // Listen to visual viewport changes (keyboard show/hide on mobile)\n if (typeof window !== 'undefined' && window.visualViewport) {\n window.visualViewport.addEventListener('resize', () => this.syncPlaceMenuPosition());\n window.visualViewport.addEventListener('scroll', () => this.syncPlaceMenuPosition());\n }\n }\n\n @HostListener('window:scroll')\n @HostListener('window:resize')\n onPlaceMenuViewportChange(): void {\n this.syncPlaceMenuPosition();\n }\n\n events = computed(() => this.eventLogService.events());\n loading = computed(() => this.eventLogService.loading());\n\n /** Vị trí đã dùng — gợi ý combobox khi thêm/sửa. */\n placeOptions = computed(() => {\n const places = new Set<string>();\n for (const ev of this.events()) {\n const p = ev.place?.trim();\n if (p) places.add(p);\n }\n return [...places].sort((a, b) => a.localeCompare(b, 'vi'));\n });\n\n hasFutureEvents = computed(() => this.futureSections().some((s) => s.dayGroups.length > 0));\n\n futureSections = computed<ScheduleTimeSection[]>(() => {\n const now = this.now();\n const buckets: Record<'today' | 'soon' | 'nextMonth' | 'later', FeedingEventLog[]> = {\n today: [],\n soon: [],\n nextMonth: [],\n later: [],\n };\n\n const nowMs = now.getTime();\n for (const ev of this.events()) {\n const dt = EventLogService.eventDateTime(ev);\n if (!dt || dt.getTime() <= nowMs) continue;\n const days = this.daysUntil(ev, now);\n if (days === null) continue;\n if (days === 0) buckets.today.push(ev);\n else if (days <= 7) buckets.soon.push(ev);\n else if (days <= 30) buckets.nextMonth.push(ev);\n else buckets.later.push(ev);\n }\n\n const sortAsc = (a: FeedingEventLog, b: FeedingEventLog) =>\n (EventLogService.eventDateTime(a)?.getTime() ?? 0) -\n (EventLogService.eventDateTime(b)?.getTime() ?? 0);\n\n const todayGroups = this.groupByDate(buckets.today, now, sortAsc, false);\n const soonGroups = this.groupByDate(buckets.soon, now, sortAsc, false);\n const nextMonthGroups = this.groupByDate(buckets.nextMonth, now, sortAsc, false);\n const laterGroups = this.groupByDate(buckets.later, now, sortAsc, false);\n\n return [\n {\n id: 'today',\n title: 'Hôm nay',\n subtitle: 'Sự kiện hôm nay',\n icon: 'pi-sun',\n dayGroups: todayGroups,\n eventCount: this.countEventsInGroups(todayGroups),\n },\n {\n id: 'soon',\n title: 'Tuần này',\n subtitle: 'Sự kiện trong tuần',\n icon: 'pi-bolt',\n dayGroups: soonGroups,\n eventCount: this.countEventsInGroups(soonGroups),\n },\n {\n id: 'nextMonth',\n title: 'Tháng sau',\n subtitle: 'Sự kiện tháng sau',\n icon: 'pi-calendar',\n dayGroups: nextMonthGroups,\n eventCount: this.countEventsInGroups(nextMonthGroups),\n },\n {\n id: 'later',\n title: 'Khác',\n subtitle: 'Sự kiện xa hơn',\n icon: 'pi-compass',\n dayGroups: laterGroups,\n eventCount: this.countEventsInGroups(laterGroups),\n },\n ];\n });\n\n pastSection = computed<ScheduleTimeSection | null>(() => {\n const now = this.now();\n const nowMs = now.getTime();\n const past = this.events().filter((e) => {\n const dt = EventLogService.eventDateTime(e);\n return dt !== null && dt.getTime() <= nowMs;\n });\n\n if (past.length === 0) return null;\n\n const sortDesc = (a: FeedingEventLog, b: FeedingEventLog) =>\n (EventLogService.eventDateTime(b)?.getTime() ?? 0) -\n (EventLogService.eventDateTime(a)?.getTime() ?? 0);\n\n const dayGroups = this.groupByDate(past, now, sortDesc, true);\n return {\n id: 'past',\n title: 'Đã qua',\n subtitle: 'Sự kiện đã qua',\n icon: 'pi-history',\n dayGroups,\n eventCount: this.countEventsInGroups(dayGroups),\n };\n });\n\n refresh() {\n this.errorMsg.set('');\n this.eventLogService.loadEvents().subscribe({\n error: () => {\n this.errorMsg.set('Không tải được lịch. Vui lòng thử lại sau.');\n },\n });\n }\n\n openCalendarDialog(targetDateIso?: string): void {\n const targetDate = this.parseIsoDate(targetDateIso) ?? new Date(this.now());\n this.calendarCursor.set(new Date(targetDate.getFullYear(), targetDate.getMonth(), 1));\n this.selectedCalendarDate.set(this.toDateStr(targetDate));\n this.calendarDialogOpen.set(true);\n }\n\n closeCalendarDialog(): void {\n this.calendarDialogOpen.set(false);\n }\n\n calendarPrevMonth(): void {\n const d = this.calendarCursor();\n this.calendarCursor.set(new Date(d.getFullYear(), d.getMonth() - 1, 1));\n }\n\n calendarNextMonth(): void {\n const d = this.calendarCursor();\n this.calendarCursor.set(new Date(d.getFullYear(), d.getMonth() + 1, 1));\n }\n\n calendarGoToToday(): void {\n const today = new Date();\n this.calendarCursor.set(new Date(today.getFullYear(), today.getMonth(), 1));\n this.selectedCalendarDate.set(this.toDateStr(today));\n }\n\n calendarChangeMonth(monthIndex: number): void {\n const current = this.calendarCursor();\n this.calendarCursor.set(new Date(current.getFullYear(), monthIndex, 1));\n }\n\n calendarChangeYear(year: number): void {\n const current = this.calendarCursor();\n this.calendarCursor.set(new Date(year, current.getMonth(), 1));\n }\n\n getCalendarYearRange(): number[] {\n const currentYear = new Date().getFullYear();\n const startYear = currentYear - 10;\n const endYear = currentYear + 10;\n const years: number[] = [];\n\n for (let year = startYear; year <= endYear; year++) {\n years.push(year);\n }\n\n return years;\n }\n\n selectCalendarDate(dateIso: string): void {\n this.selectedCalendarDate.set(dateIso);\n }\n\n openAddFromCalendar(): void {\n const selectedDate = this.selectedCalendarDate();\n this.reopenCalendarAfterAdd = true;\n this.closeCalendarDialog();\n this.openAdd();\n if (selectedDate) {\n this.updateDraft({ date: selectedDate });\n }\n }\n\n isFuture(ev: FeedingEventLog): boolean {\n const dt = EventLogService.eventDateTime(ev);\n return dt !== null && dt.getTime() > this.now().getTime();\n }\n\n openAdd() {\n this.draft.set(this.emptyDraft());\n this.errorMsg.set('');\n this.addOpen.set(true);\n }\n\n closeAdd(keepCalendarReturn = false) {\n this.addOpen.set(false);\n this.closePlacePicker();\n\n // Nếu được mở từ calendar và cần quay lại\n if (this.reopenCalendarAfterAdd && !keepCalendarReturn) {\n this.openCalendarDialog();\n this.reopenCalendarAfterAdd = false;\n } else if (!keepCalendarReturn) {\n this.reopenCalendarAfterAdd = false;\n }\n }\n\n openEdit(ev: FeedingEventLog) {\n if (!ev.rowIndex || !this.isFuture(ev)) return;\n this.editing.set(ev);\n this.editDraft.set({\n date: ev.date,\n time: ev.time,\n title: ev.title,\n note: ev.note || '',\n place: ev.place || '',\n });\n this.errorMsg.set('');\n }\n\n cancelEdit() {\n this.editing.set(null);\n this.editDraft.set(this.emptyDraft());\n this.closePlacePicker();\n }\n\n openPlacePicker(context: 'add' | 'edit', origin: HTMLInputElement): void {\n this.placePickerOpen.set(context);\n this.placePickerOrigin = origin;\n requestAnimationFrame(() => this.syncPlaceMenuPosition());\n }\n\n private closePlacePicker(): void {\n this.placePickerOpen.set(null);\n this.placeMenuRect.set(null);\n this.placePickerOrigin = null;\n }\n\n private measurePlaceMenuRect(origin: HTMLInputElement): {\n top: number;\n left: number;\n width: number;\n } {\n const rect = origin.getBoundingClientRect();\n let top = rect.bottom + 4;\n const left = rect.left;\n\n // On mobile, when keyboard is shown, adjust for visual viewport offset\n if (typeof window !== 'undefined' && window.visualViewport) {\n const vv = window.visualViewport;\n // Check if dropdown would go below visible area\n const dropdownHeight = 200; // max-height of dropdown\n const visibleBottom = vv.height;\n\n if (top + dropdownHeight > visibleBottom) {\n // Position above the input instead\n top = rect.top - dropdownHeight - 4;\n if (top < 0) {\n // If still doesn't fit, just position at top of visible area\n top = Math.max(4, rect.bottom + 4 - (rect.bottom + dropdownHeight - visibleBottom));\n }\n }\n }\n\n return {\n top,\n left,\n width: Math.max(rect.width, 200),\n };\n }\n\n private syncPlaceMenuPosition(): void {\n const origin = this.placePickerOrigin;\n const context = this.placePickerOpen();\n if (!origin || !context) {\n return;\n }\n if (this.filteredPlaces(context).length === 0) {\n this.placeMenuRect.set(null);\n return;\n }\n this.placeMenuRect.set(this.measurePlaceMenuRect(origin));\n }\n\n filteredPlaces(context: 'add' | 'edit'): string[] {\n const query = (context === 'add' ? this.draft().place : this.editDraft().place)\n .trim()\n .toLowerCase();\n const all = this.placeOptions();\n if (!query) return all;\n return all.filter((p) => p.toLowerCase().includes(query));\n }\n\n onPlaceInput(value: string, context: 'add' | 'edit', origin: HTMLInputElement): void {\n if (context === 'add') {\n this.updateDraft({ place: value });\n } else {\n this.updateEditDraft({ place: value });\n }\n this.placePickerOpen.set(context);\n this.placePickerOrigin = origin;\n this.syncPlaceMenuPosition();\n }\n\n selectPlace(place: string, context: 'add' | 'edit'): void {\n if (context === 'add') {\n this.updateDraft({ place });\n } else {\n this.updateEditDraft({ place });\n }\n this.closePlacePicker();\n }\n\n onPlaceBlur(context: 'add' | 'edit'): void {\n window.setTimeout(() => {\n if (this.placePickerOpen() === context) {\n this.closePlacePicker();\n }\n }, 160);\n }\n\n submitAdd() {\n const d = this.draft();\n const title = d.title.trim();\n if (!d.date || !d.time || !title) {\n this.errorMsg.set('Ngày, giờ và tên sự kiện là bắt buộc.');\n return;\n }\n const ev: FeedingEventLog = {\n user:\n String(this.user() || 'guest')\n .toLowerCase()\n .trim() || 'guest',\n date: d.date,\n time: this.normalizeTimeInput(d.time),\n title,\n note: d.note.trim() || undefined,\n place: d.place.trim() || undefined,\n acknowledged: false,\n };\n this.saving.set(true);\n this.errorMsg.set('');\n this.eventLogService.addEvent(ev).subscribe({\n next: () => {\n this.saving.set(false);\n this.successMsg.set('Đã thêm sự kiện.');\n // Log activity\n this.activityLogService\n .logSchedule(String(this.user() || 'guest'), 'SCHEDULE_ADDED', {\n title: ev.title,\n date: this.formatEventDate(ev.date),\n })\n .subscribe();\n setTimeout(() => this.successMsg.set(''), 3000);\n this.closeAdd(true);\n if (this.reopenCalendarAfterAdd) {\n this.openCalendarDialog(ev.date);\n this.reopenCalendarAfterAdd = false;\n }\n setTimeout(() => this.refresh(), 700);\n },\n error: (err) => {\n this.saving.set(false);\n this.errorMsg.set(err?.message || 'Lưu thất bại.');\n },\n });\n }\n\n submitEdit() {\n const orig = this.editing();\n if (!orig?.rowIndex) return;\n const d = this.editDraft();\n const title = d.title.trim();\n if (!d.date || !d.time || !title) {\n this.errorMsg.set('Ngày, giờ và tên sự kiện là bắt buộc.');\n return;\n }\n this.saving.set(true);\n this.errorMsg.set('');\n this.eventLogService\n .updateEvent(orig.rowIndex, {\n date: d.date,\n time: this.normalizeTimeInput(d.time),\n title,\n note: d.note.trim(),\n place: d.place.trim(),\n })\n .subscribe({\n next: () => {\n this.saving.set(false);\n this.successMsg.set('Đã cập nhật.');\n // Log activity\n this.activityLogService\n .logSchedule(String(this.user() || 'guest'), 'SCHEDULE_UPDATED', { title })\n .subscribe();\n setTimeout(() => this.successMsg.set(''), 3000);\n this.cancelEdit();\n setTimeout(() => this.refresh(), 700);\n },\n error: (err) => {\n this.saving.set(false);\n this.errorMsg.set(err?.message || 'Cập nhật thất bại.');\n },\n });\n }\n\n deleteEv(ev: FeedingEventLog) {\n if (!ev.rowIndex || !this.isFuture(ev)) return;\n if (!confirm(`Xoá sự kiện «${ev.title}»?`)) return;\n this.eventLogService.deleteEvent(ev.rowIndex).subscribe({\n next: () => {\n this.successMsg.set('Đã xoá.');\n // Log activity\n this.activityLogService\n .logSchedule(String(this.user() || 'guest'), 'SCHEDULE_DELETED', { title: ev.title })\n .subscribe();\n setTimeout(() => this.successMsg.set(''), 3000);\n if (this.editing()?.rowIndex === ev.rowIndex) this.cancelEdit();\n setTimeout(() => this.refresh(), 700);\n },\n error: (err) => {\n this.errorMsg.set(err?.message || 'Xoá thất bại.');\n },\n });\n }\n\n formatTime(time: string): string {\n return time;\n }\n\n formatEventDate(iso: string): string {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(iso);\n if (!m) return iso;\n return `ngày ${+m[3]} tháng ${+m[2]} năm ${m[1]}`;\n }\n\n formatEventCount(count: number): string {\n return `${count} sự kiện`;\n }\n\n isSectionExpanded(id: ScheduleTimeSection['id']): boolean {\n return this.expandedSections().has(id);\n }\n\n toggleSectionExpand(id: ScheduleTimeSection['id']): void {\n this.expandedSections.update((set) => {\n const next = new Set(set);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }\n\n hasMoreEvents(section: ScheduleTimeSection): boolean {\n return section.eventCount > FeedingScheduleComponent.PREVIEW_EVENT_LIMIT;\n }\n\n visibleDayGroups(section: ScheduleTimeSection): ScheduleDayGroup[] {\n if (this.isSectionExpanded(section.id)) {\n return section.dayGroups;\n }\n return this.limitDayGroups(section.dayGroups, FeedingScheduleComponent.PREVIEW_EVENT_LIMIT);\n }\n\n hiddenEventCount(section: ScheduleTimeSection): number {\n return Math.max(0, section.eventCount - FeedingScheduleComponent.PREVIEW_EVENT_LIMIT);\n }\n\n trackSection(_: number, s: ScheduleTimeSection): string {\n return s.id;\n }\n\n trackDay(_: number, d: ScheduleDayGroup): string {\n return d.dateIso;\n }\n\n trackEvent(_: number, ev: FeedingEventLog): string {\n return String(ev.rowIndex ?? `${ev.date}-${ev.time}-${ev.title}`);\n }\n\n private countEventsInGroups(groups: ScheduleDayGroup[]): number {\n return groups.reduce((total, group) => total + group.events.length, 0);\n }\n\n private daysUntil(ev: FeedingEventLog, now: Date): number | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(ev.date);\n if (!m) return null;\n return this.calendarDayDiff(+m[1], +m[2], +m[3], now);\n }\n\n private calendarDayDiff(y: number, mo: number, d: number, now: Date): number {\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const target = new Date(y, mo - 1, d);\n return Math.round((target.getTime() - today.getTime()) / 86_400_000);\n }\n\n private limitDayGroups(groups: ScheduleDayGroup[], limit: number): ScheduleDayGroup[] {\n let count = 0;\n const result: ScheduleDayGroup[] = [];\n for (const day of groups) {\n if (count >= limit) break;\n const take = Math.min(day.events.length, limit - count);\n if (take <= 0) continue;\n result.push({ ...day, events: day.events.slice(0, take) });\n count += take;\n }\n return result;\n }\n\n private groupByDate(\n events: FeedingEventLog[],\n now: Date,\n sortEvents: (a: FeedingEventLog, b: FeedingEventLog) => number,\n datesDesc = false\n ): ScheduleDayGroup[] {\n const byDate = new Map<string, FeedingEventLog[]>();\n for (const ev of events) {\n const list = byDate.get(ev.date) ?? [];\n list.push(ev);\n byDate.set(ev.date, list);\n }\n\n return [...byDate.entries()]\n .sort(([a], [b]) => (datesDesc ? b.localeCompare(a) : a.localeCompare(b)))\n .map(([dateIso, dayEvents]) => {\n const sorted = [...dayEvents].sort(sortEvents);\n const header = this.formatDateHeader(dateIso, now);\n return {\n dateIso,\n dateLabel: header.label,\n dateSubLabel: header.subLabel,\n events: sorted,\n };\n });\n }\n\n private formatDateHeader(iso: string, now: Date): { label: string; subLabel: string } {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(iso);\n if (!m) return { label: iso, subLabel: '' };\n\n const y = +m[1];\n const mo = +m[2];\n const d = +m[3];\n return {\n label: this.formatScheduleRelativeLabel(y, mo, d, now),\n subLabel: this.formatFullDateLabel(y, mo, d),\n };\n }\n\n private formatFullDateLabel(y: number, mo: number, d: number): string {\n const date = new Date(y, mo - 1, d, 12, 0, 0, 0);\n const weekdays = ['Chủ nhật', 'Thứ 2', 'Thứ 3', 'Thứ 4', 'Thứ 5', 'Thứ 6', 'Thứ 7'];\n return `${weekdays[date.getDay()]}, ngày ${d} tháng ${mo} năm ${y}`;\n }\n\n private formatScheduleRelativeLabel(y: number, mo: number, d: number, now: Date): string {\n const startNow = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const startEv = new Date(y, mo - 1, d);\n const diff = this.calendarDayDiff(y, mo, d, now);\n\n if (diff === 0) return 'Hôm nay';\n if (diff === 1) return 'Ngày mai';\n if (diff === 2) return 'Ngày mốt';\n if (diff === -1) return 'Hôm qua';\n\n if (diff > 0) {\n if (diff <= 30) return `${diff} ngày tới`;\n return this.formatFutureSpanLabel(startNow, startEv);\n }\n\n const abs = Math.abs(diff);\n if (abs <= 30) return `Đã qua ${abs} ngày`;\n return this.formatPastSpanLabel(startEv, startNow);\n }\n\n private formatFutureSpanLabel(from: Date, to: Date): string {\n const { years, months, days } = this.calendarSpan(from, to);\n if (years > 0 && months === 0 && days === 0) return `${years} năm tới`;\n if (years === 0 && months > 0 && days === 0) return `${months} tháng tới`;\n if (years === 0 && months === 0 && days > 0) return `${days} ngày tới`;\n\n const parts: string[] = [];\n if (years > 0) parts.push(`${years} năm`);\n if (months > 0) parts.push(`${months} tháng`);\n if (days > 0) parts.push(`${days} ngày`);\n return parts.length > 0 ? `${parts.join(' ')} tới` : 'Sắp tới';\n }\n\n private formatPastSpanLabel(from: Date, to: Date): string {\n const { years, months, days } = this.calendarSpan(from, to);\n const parts: string[] = [];\n if (years > 0) parts.push(`${years} năm`);\n if (months > 0) parts.push(`${months} tháng`);\n if (days > 0) parts.push(`${days} ngày`);\n if (parts.length === 0) return 'Đã qua';\n return `Đã qua ${parts.join(' ')}`;\n }\n\n private calendarSpan(start: Date, end: Date): { years: number; months: number; days: number } {\n let years = end.getFullYear() - start.getFullYear();\n let months = end.getMonth() - start.getMonth();\n let days = end.getDate() - start.getDate();\n\n if (days < 0) {\n months -= 1;\n days += new Date(end.getFullYear(), end.getMonth(), 0).getDate();\n }\n if (months < 0) {\n years -= 1;\n months += 12;\n }\n\n return { years: Math.max(0, years), months: Math.max(0, months), days: Math.max(0, days) };\n }\n\n private emptyDraft(): EventDraft {\n const t = new Date();\n return {\n date: this.toDateStr(t),\n time: this.toTimeStr(t),\n title: '',\n note: '',\n place: '',\n };\n }\n\n private toDateStr(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n }\n\n private toTimeStr(d: Date): string {\n const h = String(d.getHours()).padStart(2, '0');\n const m = String(d.getMinutes()).padStart(2, '0');\n return `${h}:${m}`;\n }\n\n private normalizeTimeInput(raw: string): string {\n const s = String(raw || '').trim();\n const m = /^(\\d{1,2}):(\\d{2})$/.exec(s);\n if (!m) return s;\n const hh = Math.min(23, Math.max(0, parseInt(m[1], 10)));\n const mm = Math.min(59, Math.max(0, parseInt(m[2], 10)));\n return `${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`;\n }\n\n private parseIsoDate(dateIso?: string): Date | null {\n if (!dateIso) return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(dateIso);\n if (!m) return null;\n const y = Number(m[1]);\n const mo = Number(m[2]);\n const d = Number(m[3]);\n if (!Number.isFinite(y) || !Number.isFinite(mo) || !Number.isFinite(d)) {\n return null;\n }\n return new Date(y, mo - 1, d, 12, 0, 0, 0);\n }\n\n updateDraft(partial: Partial<EventDraft>) {\n this.draft.update((d) => ({ ...d, ...partial }));\n }\n\n updateEditDraft(partial: Partial<EventDraft>) {\n this.editDraft.update((d) => ({ ...d, ...partial }));\n }\n}\n","<div class=\"schedule-page\">\n @if (errorMsg()) {\n <div class=\"alert error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n {{ errorMsg() }}\n </div>\n }\n @if (successMsg()) {\n <div class=\"alert ok\">\n <i class=\"pi pi-check-circle\"></i>\n {{ successMsg() }}\n </div>\n }\n\n <div class=\"schedule-topbar\">\n <button type=\"button\" class=\"btn btn-primary sm\" (click)=\"openCalendarDialog()\">\n <i class=\"pi pi-calendar\"></i>\n Lịch tháng\n </button>\n </div>\n\n @if (!loading() || hasFutureEvents()) {\n @for (section of futureSections(); track trackSection($index, section)) {\n <section\n class=\"schedule-section\"\n [attr.data-section]=\"section.id\"\n [hidden]=\"section.eventCount === 0\"\n >\n <div class=\"schedule-section__head\">\n <span class=\"schedule-section__icon\" aria-hidden=\"true\">\n <i class=\"pi\" [ngClass]=\"section.icon\"></i>\n </span>\n <div class=\"schedule-section__titles\">\n <h2>{{ section.title }}</h2>\n <p class=\"schedule-section__sub\">{{ section.subtitle }}</p>\n </div>\n @if (section.eventCount; as n) {\n <span class=\"schedule-section__count\">\n {{ formatEventCount(n) }}\n </span>\n }\n </div>\n <div class=\"schedule-section__body\">\n <div class=\"schedule-days\">\n @for (day of visibleDayGroups(section); track trackDay($index, day)) {\n <article class=\"schedule-day schedule-day--relative\">\n <header class=\"schedule-day__date\">\n <span class=\"schedule-day__label schedule-day__label--relative\">\n {{ day.dateLabel }}\n </span>\n @if (day.dateSubLabel) {\n <span class=\"schedule-day__sub\">\n {{ day.dateSubLabel }}\n </span>\n }\n </header>\n <div class=\"schedule-day__cards\">\n @for (ev of day.events; track trackEvent($index, ev)) {\n <ng-container\n [ngTemplateOutlet]=\"eventCardTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: ev, isPast: false }\"\n ></ng-container>\n }\n </div>\n </article>\n }\n </div>\n @if (hasMoreEvents(section)) {\n <button\n type=\"button\"\n class=\"schedule-view-more\"\n (click)=\"toggleSectionExpand(section.id)\"\n >\n @if (!isSectionExpanded(section.id)) {\n Xem thêm {{ hiddenEventCount(section) }} sự kiện\n <i class=\"pi pi-chevron-down\" aria-hidden=\"true\"></i>\n }\n @if (isSectionExpanded(section.id)) {\n Thu gọn\n <i class=\"pi pi-chevron-up\" aria-hidden=\"true\"></i>\n }\n </button>\n }\n </div>\n </section>\n }\n }\n\n @if (!loading() && !hasFutureEvents()) {\n <section class=\"schedule-empty\">\n <i class=\"pi pi-calendar-plus\"></i>\n <p>Chưa có sự kiện sắp tới.</p>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"openAdd()\">\n <i class=\"pi pi-plus\"></i> Thêm sự kiện\n </button>\n </section>\n }\n\n @if (pastSection(); as past) {\n <section class=\"schedule-section schedule-section--past\">\n <div class=\"schedule-section__head\">\n <span class=\"schedule-section__icon\" aria-hidden=\"true\">\n <i class=\"pi\" [ngClass]=\"past.icon\"></i>\n </span>\n <div class=\"schedule-section__titles\">\n <h2>{{ past.title }}</h2>\n @if (past.subtitle) {\n <p class=\"schedule-section__sub\">{{ past.subtitle }}</p>\n }\n </div>\n @if (past.eventCount; as n) {\n <span class=\"schedule-section__count\">\n {{ formatEventCount(n) }}\n </span>\n }\n </div>\n <div class=\"schedule-section__body\">\n <div class=\"schedule-days\">\n @for (day of visibleDayGroups(past); track trackDay($index, day)) {\n <article class=\"schedule-day schedule-day--relative\">\n <header class=\"schedule-day__date\">\n <span class=\"schedule-day__label schedule-day__label--relative\">\n {{ day.dateLabel }}\n </span>\n @if (day.dateSubLabel) {\n <span class=\"schedule-day__sub\">\n {{ day.dateSubLabel }}\n </span>\n }\n </header>\n <div class=\"schedule-day__cards\">\n @for (ev of day.events; track trackEvent($index, ev)) {\n <ng-container\n [ngTemplateOutlet]=\"eventCardTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: ev, isPast: true }\"\n ></ng-container>\n }\n </div>\n </article>\n }\n </div>\n @if (hasMoreEvents(past)) {\n <button type=\"button\" class=\"schedule-view-more\" (click)=\"toggleSectionExpand(past.id)\">\n @if (!isSectionExpanded(past.id)) {\n Xem thêm {{ hiddenEventCount(past) }} sự kiện\n <i class=\"pi pi-chevron-down\" aria-hidden=\"true\"></i>\n }\n @if (isSectionExpanded(past.id)) {\n Thu gọn\n <i class=\"pi pi-chevron-up\" aria-hidden=\"true\"></i>\n }\n </button>\n }\n </div>\n </section>\n }\n\n <ng-template #eventCardTpl let-ev let-isPast=\"isPast\">\n <article class=\"ev-card\" [class.ev-card--past]=\"isPast\">\n <h3 class=\"ev-card__title\">{{ ev.title }}</h3>\n <p class=\"ev-card__datetime\">\n <span class=\"ev-card__date\">{{ formatEventDate(ev.date) }}</span>\n <span class=\"ev-card__datetime-sep\" aria-hidden=\"true\"> – </span>\n <span class=\"ev-card__hour\">{{ formatTime(ev.time) }}</span>\n </p>\n @if (ev.place) {\n <p class=\"ev-card__place\">\n <i class=\"pi pi-map-marker\" aria-hidden=\"true\"></i>\n <span>{{ ev.place }}</span>\n </p>\n }\n @if (ev.note) {\n <div class=\"ev-card__content-wrap\">\n <span class=\"ev-card__content-label\">Nội dung</span>\n <p class=\"ev-card__content\">{{ ev.note }}</p>\n </div>\n }\n @if (!isPast && ev.rowIndex) {\n <div class=\"ev-card__actions\">\n <button\n type=\"button\"\n class=\"btn ghost sm icon-only\"\n (click)=\"openEdit(ev)\"\n [disabled]=\"!isFuture(ev)\"\n title=\"Sửa\"\n aria-label=\"Sửa\"\n >\n <i class=\"pi pi-pencil\"></i>\n </button>\n <button\n type=\"button\"\n class=\"btn ghost sm icon-only danger\"\n (click)=\"deleteEv(ev)\"\n [disabled]=\"!isFuture(ev)\"\n title=\"Xoá\"\n aria-label=\"Xoá\"\n >\n <i class=\"pi pi-trash\"></i>\n </button>\n </div>\n }\n </article>\n </ng-template>\n\n <button\n type=\"button\"\n class=\"fab\"\n (click)=\"openAdd()\"\n aria-label=\"Thêm sự kiện\"\n title=\"Thêm sự kiện\"\n >\n <i class=\"pi pi-plus\" aria-hidden=\"true\"></i>\n <span class=\"fab-label\">Thêm sự kiện</span>\n </button>\n\n @if (calendarDialogOpen()) {\n <div class=\"dialog-overlay dialog-overlay--top\" (click)=\"closeCalendarDialog()\">\n <div\n class=\"dialog dialog--calendar\"\n role=\"dialog\"\n aria-modal=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"dialog-head\">\n <div>\n <h2><i class=\"pi pi-calendar\"></i> {{ calendarMonthLabel() }}</h2>\n </div>\n <button\n type=\"button\"\n class=\"dialog-close\"\n (click)=\"closeCalendarDialog()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <div class=\"calendar-nav\">\n <button\n type=\"button\"\n class=\"btn ghost sm icon-only\"\n (click)=\"calendarPrevMonth()\"\n aria-label=\"Tháng trước\"\n >\n <i class=\"pi pi-chevron-left\"></i>\n </button>\n <div class=\"calendar-nav-center\">\n <div class=\"calendar-nav-dropdowns\">\n <select\n class=\"calendar-month-select\"\n [value]=\"calendarCursor().getMonth()\"\n (change)=\"calendarChangeMonth(+$any($event.target).value)\"\n >\n <option value=\"0\">Tháng 1</option>\n <option value=\"1\">Tháng 2</option>\n <option value=\"2\">Tháng 3</option>\n <option value=\"3\">Tháng 4</option>\n <option value=\"4\">Tháng 5</option>\n <option value=\"5\">Tháng 6</option>\n <option value=\"6\">Tháng 7</option>\n <option value=\"7\">Tháng 8</option>\n <option value=\"8\">Tháng 9</option>\n <option value=\"9\">Tháng 10</option>\n <option value=\"10\">Tháng 11</option>\n <option value=\"11\">Tháng 12</option>\n </select>\n <select\n class=\"calendar-year-select\"\n [value]=\"calendarCursor().getFullYear()\"\n (change)=\"calendarChangeYear(+$any($event.target).value)\"\n >\n @for (year of getCalendarYearRange(); track year) {\n <option [value]=\"year\">{{ year }}</option>\n }\n </select>\n </div>\n <button\n type=\"button\"\n class=\"btn ghost sm calendar-today-btn\"\n (click)=\"calendarGoToToday()\"\n title=\"Về hôm nay\"\n >\n <i class=\"pi pi-home\"></i>\n <span>Hôm nay</span>\n </button>\n </div>\n <button\n type=\"button\"\n class=\"btn ghost sm icon-only\"\n (click)=\"calendarNextMonth()\"\n aria-label=\"Tháng sau\"\n >\n <i class=\"pi pi-chevron-right\"></i>\n </button>\n </div>\n <div class=\"calendar-weekdays\">\n @for (wd of calendarWeekdays; track wd) {\n <span>{{ wd }}</span>\n }\n </div>\n <div class=\"calendar-grid\">\n @for (c of monthCalendarCells(); track c) {\n <button\n type=\"button\"\n class=\"calendar-cell\"\n [class.is-out-month]=\"!c.inMonth\"\n [class.is-today]=\"c.isToday\"\n [class.is-selected]=\"selectedCalendarDate() === c.dateIso\"\n [class.has-event]=\"c.eventCount > 0\"\n [class.has-future-event]=\"c.hasFutureEvent\"\n (click)=\"selectCalendarDate(c.dateIso)\"\n >\n <div class=\"calendar-cell__content\">\n <span class=\"calendar-cell__day\">{{ c.day }}</span>\n @if (c.eventCount > 0) {\n <span\n class=\"calendar-cell__event-indicator\"\n [style.background-color]=\"getEventIndicatorColor(c.dateIso)\"\n >\n {{ c.eventCount }}\n </span>\n }\n </div>\n </button>\n }\n </div>\n <div class=\"calendar-events\">\n <div class=\"calendar-events__head\">\n <h3>\n Sự kiện ngày {{ selectedCalendarDate() || '—' }}\n @if (selectedCalendarEvents().length > 0) {\n <span>({{ selectedCalendarEvents().length }})</span>\n }\n </h3>\n <button\n type=\"button\"\n class=\"btn btn-primary sm\"\n (click)=\"openAddFromCalendar()\"\n [disabled]=\"!selectedCalendarDate()\"\n >\n <i class=\"pi pi-plus\" aria-hidden=\"true\"></i>\n Thêm sự kiện\n </button>\n </div>\n @if (selectedCalendarEvents().length === 0) {\n <p class=\"calendar-events__empty\">Không có sự kiện trong ngày này.</p>\n }\n @if (selectedCalendarEvents().length > 0) {\n <div class=\"calendar-events__list\">\n @for (ev of selectedCalendarEvents(); track trackEvent($index, ev)) {\n <ng-container\n [ngTemplateOutlet]=\"eventCardTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: ev, isPast: !isFuture(ev) }\"\n ></ng-container>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n @if (addOpen()) {\n <div class=\"dialog-overlay dialog-overlay--top\" (click)=\"closeAdd()\">\n <div class=\"dialog\" role=\"dialog\" aria-modal=\"true\" (click)=\"$event.stopPropagation()\">\n <div class=\"dialog-head\">\n <div>\n <h2><i class=\"pi pi-plus-circle\"></i> Thêm sự kiện</h2>\n </div>\n <button type=\"button\" class=\"dialog-close\" (click)=\"closeAdd()\" aria-label=\"Đóng\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n @if (draft(); as dr) {\n <div class=\"form-grid\">\n <label class=\"field\">\n <span class=\"label\">Ngày *</span>\n <input\n type=\"date\"\n class=\"input\"\n [ngModel]=\"dr.date\"\n (ngModelChange)=\"updateDraft({ date: $event })\"\n name=\"evd\"\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Giờ *</span>\n <input\n type=\"time\"\n class=\"input\"\n [ngModel]=\"dr.time\"\n (ngModelChange)=\"updateDraft({ time: $event })\"\n name=\"evt\"\n />\n </label>\n <label class=\"field full\">\n <span class=\"label\">Tên sự kiện *</span>\n <input\n type=\"text\"\n class=\"input\"\n placeholder=\"VD: Tiêm chủng 6in1\"\n [ngModel]=\"dr.title\"\n (ngModelChange)=\"updateDraft({ title: $event })\"\n name=\"evti\"\n />\n </label>\n <label class=\"field full\">\n <span class=\"label\">Ghi chú</span>\n <textarea\n class=\"input input--textarea\"\n rows=\"3\"\n placeholder=\"Ghi chú thêm…\"\n [ngModel]=\"dr.note\"\n (ngModelChange)=\"updateDraft({ note: $event })\"\n name=\"evn\"\n ></textarea>\n </label>\n <label class=\"field full field--place\">\n <span class=\"label\">Vị trí</span>\n <div class=\"place-combobox\">\n <input\n #placeInputAdd\n type=\"text\"\n class=\"input\"\n placeholder=\"Chọn hoặc nhập vị trí mới…\"\n [ngModel]=\"dr.place\"\n (ngModelChange)=\"onPlaceInput($event, 'add', placeInputAdd)\"\n (focus)=\"openPlacePicker('add', placeInputAdd)\"\n (blur)=\"onPlaceBlur('add')\"\n name=\"evp\"\n autocomplete=\"off\"\n />\n </div>\n </label>\n </div>\n }\n <div class=\"dialog-actions\">\n <button type=\"button\" class=\"btn ghost\" (click)=\"closeAdd()\">Huỷ</button>\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"saving()\" (click)=\"submitAdd()\">\n <i class=\"pi\" [ngClass]=\"saving() ? 'pi-spin pi-spinner' : 'pi-save'\"></i>\n {{ saving() ? 'Đang lưu…' : 'Lưu' }}\n </button>\n </div>\n </div>\n </div>\n }\n\n @if (editing(); as ed) {\n <div class=\"dialog-overlay dialog-overlay--top\" (click)=\"cancelEdit()\">\n <div class=\"dialog\" role=\"dialog\" aria-modal=\"true\" (click)=\"$event.stopPropagation()\">\n <div class=\"dialog-head\">\n <div>\n <h2><i class=\"pi pi-pencil\"></i> Sửa sự kiện</h2>\n </div>\n <button type=\"button\" class=\"dialog-close\" (click)=\"cancelEdit()\" aria-label=\"Đóng\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n @if (editDraft(); as dr) {\n <div class=\"form-grid\">\n <label class=\"field\">\n <span class=\"label\">Ngày *</span>\n <input\n type=\"date\"\n class=\"input\"\n [ngModel]=\"dr.date\"\n (ngModelChange)=\"updateEditDraft({ date: $event })\"\n name=\"eed\"\n />\n </label>\n <label class=\"field\">\n <span class=\"label\">Giờ *</span>\n <input\n type=\"time\"\n class=\"input\"\n [ngModel]=\"dr.time\"\n (ngModelChange)=\"updateEditDraft({ time: $event })\"\n name=\"eet\"\n />\n </label>\n <label class=\"field full\">\n <span class=\"label\">Tên *</span>\n <input\n type=\"text\"\n class=\"input\"\n [ngModel]=\"dr.title\"\n (ngModelChange)=\"updateEditDraft({ title: $event })\"\n name=\"eeti\"\n />\n </label>\n <label class=\"field full\">\n <span class=\"label\">Ghi chú</span>\n <textarea\n class=\"input input--textarea\"\n rows=\"3\"\n placeholder=\"Ghi chú thêm…\"\n [ngModel]=\"dr.note\"\n (ngModelChange)=\"updateEditDraft({ note: $event })\"\n name=\"een\"\n ></textarea>\n </label>\n <label class=\"field full field--place\">\n <span class=\"label\">Vị trí</span>\n <div class=\"place-combobox\">\n <input\n #placeInputEdit\n type=\"text\"\n class=\"input\"\n placeholder=\"Chọn hoặc nhập vị trí mới…\"\n [ngModel]=\"dr.place\"\n (ngModelChange)=\"onPlaceInput($event, 'edit', placeInputEdit)\"\n (focus)=\"openPlacePicker('edit', placeInputEdit)\"\n (blur)=\"onPlaceBlur('edit')\"\n name=\"eep\"\n autocomplete=\"off\"\n />\n </div>\n </label>\n </div>\n }\n <div class=\"dialog-actions\">\n <button type=\"button\" class=\"btn ghost\" (click)=\"cancelEdit()\">Huỷ</button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"saving()\"\n (click)=\"submitEdit()\"\n >\n <i class=\"pi\" [ngClass]=\"saving() ? 'pi-spin pi-spinner' : 'pi-check'\"></i>\n Cập nhật\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n\n@if (placeMenuView(); as vm) {\n <ul\n class=\"place-combobox__menu place-combobox__menu--portal\"\n role=\"listbox\"\n [style.top.px]=\"vm.pos.top\"\n [style.left.px]=\"vm.pos.left\"\n [style.width.px]=\"vm.pos.width\"\n (mousedown)=\"$event.preventDefault()\"\n >\n @for (place of vm.places; track place) {\n <li>\n <button\n type=\"button\"\n class=\"place-combobox__option\"\n (mousedown)=\"selectPlace(place, vm.ctx)\"\n >\n {{ place }}\n </button>\n </li>\n }\n </ul>\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n inject,\n signal,\n computed,\n output,\n OnInit,\n OnDestroy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { Subscription, interval } from 'rxjs';\nimport {\n ActivityLogService,\n ActivityLogRow,\n ActivityEventType,\n buildActivityLogMessageHtml,\n getEventTypeLabel,\n getEventTypeIcon,\n getEventTypeColor,\n isActivityDeleteEvent,\n displayActivityLogActor,\n ACTIVITY_SYSTEM_USER,\n} from '../../../services/activity-log.service';\n\ntype SortOrder = 'desc' | 'asc';\ntype FilterCategory =\n | 'all'\n | 'feeding'\n | 'weight'\n | 'medical'\n | 'schedule'\n | 'document'\n | 'settings';\n\n@Component({\n selector: 'app-activity-log',\n standalone: true,\n imports: [CommonModule, FormsModule],\n templateUrl: './activity-log.component.html',\n styleUrl: './activity-log.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ActivityLogComponent implements OnInit, OnDestroy {\n private activityLogService = inject(ActivityLogService);\n private sanitizer = inject(DomSanitizer);\n private checkSub?: Subscription;\n\n /** Emit when new activity detected - parent can reload data */\n activityChanged = output<void>();\n\n dialogOpen = signal(false);\n lastRefreshTime = signal<Date>(new Date());\n private nowTick = signal<number>(Date.now());\n\n private rawLogs = this.activityLogService.logs$;\n loading = this.activityLogService.loading$;\n unreadCount = this.activityLogService.unreadCount;\n hasNewActivity = this.activityLogService.hasNewActivity$;\n lastReadLogId = this.activityLogService.lastReadLogId$;\n\n /** Pagination */\n private readonly PAGE_SIZE = 20;\n displayCount = signal(this.PAGE_SIZE);\n\n /** Sort order */\n sortOrder: SortOrder = 'desc';\n private sortOrderSignal = signal<SortOrder>('desc');\n\n /** Filter category */\n filterCategory: FilterCategory = 'all';\n private filterCategorySignal = signal<FilterCategory>('all');\n /** Tìm kiếm tự do (user, nội dung, loại sự kiện). */\n textSearchQuery = signal('');\n /** Dialog activity: hiển thị giờ chính xác cho toàn bộ list. */\n private activityShowExactTime = signal(false);\n\n /** Category mapping for filter */\n private readonly categoryPrefixes: Record<FilterCategory, string[]> = {\n all: [],\n feeding: ['FEEDING_', 'BOTTLE_PREP_'],\n weight: ['WEIGHT_'],\n medical: ['MEDICAL_'],\n schedule: ['SCHEDULE_'],\n document: ['FILE_', 'FOLDER_'],\n settings: ['SETTINGS_', 'PROFILE_'],\n };\n\n /** All logs (sorted) */\n allLogs = computed(() => {\n const logs = [...this.rawLogs()];\n const order = this.sortOrderSignal();\n return logs.sort((a, b) => {\n const ta = new Date(a.timestamp).getTime();\n const tb = new Date(b.timestamp).getTime();\n return order === 'desc' ? tb - ta : ta - tb;\n });\n });\n\n /** Filtered logs (danh mục + text). */\n filteredLogs = computed(() => {\n const logs = this.allLogs();\n const category = this.filterCategorySignal();\n const list =\n category === 'all'\n ? logs\n : logs.filter((log) =>\n this.categoryPrefixes[category].some((p) => log.eventType.startsWith(p))\n );\n\n const q = this.normalizeSearchText(this.textSearchQuery());\n if (!q) return list;\n\n return list.filter((log) => {\n const label = getEventTypeLabel(log.eventType as any);\n const haystack = this.normalizeSearchText(\n [displayActivityLogActor(log.user), log.content, String(log.eventType), label].join(' ')\n );\n return haystack.includes(q);\n });\n });\n\n /** Displayed logs (limited by displayCount) */\n displayedLogs = computed(() => {\n return this.filteredLogs().slice(0, this.displayCount());\n });\n\n /**\n * Một dòng list: log + HTML đã build (parse + escape một lần khi logs / slice đổi).\n * Render bằng [innerHTML] thay vì *ngFor từng part.\n */\n parsedDisplayRows = computed(() => {\n return this.displayedLogs().map((log) => ({\n log,\n contentHtml: this.sanitizer.bypassSecurityTrustHtml(buildActivityLogMessageHtml(log.content)),\n }));\n });\n\n /** Has more logs to load? */\n hasMore = computed(() => {\n return this.displayCount() < this.filteredLogs().length;\n });\n\n /** Remaining count */\n remainingCount = computed(() => {\n return Math.max(0, this.filteredLogs().length - this.displayCount());\n });\n\n /** Có chuỗi tìm kiếm (sau trim) — dùng cho empty state. */\n hasTextFilter = computed(() => this.textSearchQuery().trim().length > 0);\n\n /** Có bộ lọc / sắp xếp khác mặc định — bật nút reset. */\n hasActiveFilters = computed(\n () =>\n this.filterCategorySignal() !== 'all' ||\n this.sortOrderSignal() !== 'desc' ||\n this.textSearchQuery().trim().length > 0\n );\n\n private lastCheckHasNew = false;\n\n ngOnInit(): void {\n this.checkSub = interval(1000).subscribe(() => {\n const hasNew = this.hasNewActivity();\n if (hasNew && !this.lastCheckHasNew) {\n this.activityChanged.emit();\n }\n this.lastCheckHasNew = hasNew;\n // Chỉ bump nowTick khi dialog mở — tránh parse / render lại toàn list mỗi giây khi đóng.\n if (this.dialogOpen()) {\n this.nowTick.set(Date.now());\n }\n });\n }\n\n ngOnDestroy(): void {\n this.checkSub?.unsubscribe();\n // Restore body scroll if dialog was open\n if (this.dialogOpen()) {\n document.body.style.overflow = '';\n document.body.style.position = '';\n document.body.style.width = '';\n document.body.style.top = '';\n }\n }\n\n openDialog(): void {\n this.dialogOpen.set(true);\n this.nowTick.set(Date.now());\n this.resetFilters();\n this.activityShowExactTime.set(false);\n this.refreshLogs();\n this.activityLogService.markAsRead();\n // Lock body scroll on mobile\n document.body.style.overflow = 'hidden';\n document.body.style.position = 'fixed';\n document.body.style.width = '100%';\n document.body.style.top = `-${window.scrollY}px`;\n }\n\n closeDialog(): void {\n // Restore body scroll\n const scrollY = document.body.style.top;\n document.body.style.overflow = '';\n document.body.style.position = '';\n document.body.style.width = '';\n document.body.style.top = '';\n window.scrollTo(0, parseInt(scrollY || '0', 10) * -1);\n this.activityShowExactTime.set(false);\n this.dialogOpen.set(false);\n }\n\n refreshLogs(): void {\n this.displayCount.set(this.PAGE_SIZE);\n this.activityLogService.refresh();\n this.lastRefreshTime.set(new Date());\n }\n\n loadMore(): void {\n this.displayCount.update((c) => c + this.PAGE_SIZE);\n }\n\n onSortChange(): void {\n this.sortOrderSignal.set(this.sortOrder);\n this.displayCount.set(this.PAGE_SIZE);\n }\n\n toggleSortOrder(): void {\n this.sortOrder = this.sortOrder === 'desc' ? 'asc' : 'desc';\n this.onSortChange();\n }\n\n sortOrderToggleTitle(): string {\n return this.sortOrder === 'desc'\n ? 'Đang xếp mới nhất — bấm để xem cũ nhất'\n : 'Đang xếp cũ nhất — bấm để xem mới nhất';\n }\n\n onFilterChange(): void {\n this.filterCategorySignal.set(this.filterCategory);\n this.displayCount.set(this.PAGE_SIZE);\n }\n\n onTextSearchChange(value: string): void {\n this.textSearchQuery.set(value);\n this.displayCount.set(this.PAGE_SIZE);\n }\n\n resetFilters(): void {\n this.filterCategory = 'all';\n this.filterCategorySignal.set('all');\n this.sortOrder = 'desc';\n this.sortOrderSignal.set('desc');\n this.textSearchQuery.set('');\n this.displayCount.set(this.PAGE_SIZE);\n }\n\n /** So khớp tìm kiếm: bỏ dấu + lowercase để dễ gõ tiếng Việt. */\n private normalizeSearchText(s: string): string {\n const t = String(s || '')\n .trim()\n .toLowerCase();\n if (!t) return '';\n try {\n return t.normalize('NFD').replace(/\\p{M}/gu, '');\n } catch {\n return t;\n }\n }\n\n trackByParsedRow(_: number, row: { log: ActivityLogRow }): string {\n return row.log.id;\n }\n\n getEventLabel(eventType: string) {\n return getEventTypeLabel(eventType as any);\n }\n\n getEventIcon(eventType: string) {\n return getEventTypeIcon(eventType as any);\n }\n\n getEventColor(eventType: string) {\n return getEventTypeColor(eventType as any);\n }\n\n /** Sheet cũ có thể còn chữ «Hệ thống» — hiển thị thống nhất «System». */\n displayActivityUser(user: string): string {\n return displayActivityLogActor(user);\n }\n\n isDeleteActivity(eventType: string): boolean {\n return isActivityDeleteEvent(eventType as ActivityEventType);\n }\n\n isSystemActor(user: string): boolean {\n return displayActivityLogActor(user) === ACTIVITY_SYSTEM_USER;\n }\n\n /** Check if a log entry is unread */\n isUnread(logId: string): boolean {\n return this.activityLogService.isLogUnread(logId);\n }\n\n activityTimeText(timestamp: string): string {\n return this.isActivityTimeExact()\n ? this.formatExactTime(timestamp)\n : this.formatRelativeTime(timestamp);\n }\n\n activityTimeToggleTitle(): string {\n return this.isActivityTimeExact()\n ? 'Bấm để xem thời gian tương đối'\n : 'Bấm để xem giờ chính xác';\n }\n\n activityTimeToggleAriaLabel(): string {\n return this.isActivityTimeExact()\n ? 'Đang hiển thị giờ chính xác. Bấm để đổi sang thời gian tương đối.'\n : 'Đang hiển thị thời gian tương đối. Bấm để đổi sang giờ chính xác.';\n }\n\n toggleActivityTimeDisplay(event?: Event): void {\n event?.stopPropagation();\n this.activityShowExactTime.update((v) => !v);\n }\n\n private isActivityTimeExact(): boolean {\n return this.activityShowExactTime();\n }\n\n private formatRelativeTime(timestamp: string): string {\n if (!timestamp) return '';\n const date = new Date(timestamp);\n if (isNaN(date.getTime())) return timestamp;\n\n const diffMs = this.nowTick() - date.getTime();\n const diffMin = Math.floor(diffMs / 60000);\n const diffHr = Math.floor(diffMs / 3600000);\n const diffDay = Math.floor(diffMs / 86400000);\n\n if (diffMin < 1) return 'Vừa xong';\n if (diffMin < 60) return `${diffMin} phút trước`;\n if (diffHr < 24) return `${diffHr} giờ trước`;\n return `${diffDay} ngày trước`;\n }\n\n private formatExactTime(timestamp: string): string {\n if (!timestamp) return '';\n const date = new Date(timestamp);\n if (isNaN(date.getTime())) return timestamp;\n const d = String(date.getDate()).padStart(2, '0');\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const y = date.getFullYear();\n const h = String(date.getHours()).padStart(2, '0');\n const mi = String(date.getMinutes()).padStart(2, '0');\n return `${d}/${m}/${y} ${h}:${mi}`;\n }\n}\n","<!-- Activity Log Icon Button -->\n<button\n type=\"button\"\n class=\"activity-log-btn\"\n [class.has-unread]=\"unreadCount() > 0\"\n (click)=\"openDialog()\"\n title=\"Lịch sử hoạt động\"\n>\n <i class=\"pi pi-bell\"></i>\n @if (unreadCount() > 0) {\n <span class=\"activity-badge\">\n {{ unreadCount() > 9 ? '9+' : unreadCount() }}\n </span>\n }\n</button>\n\n<!-- Dialog Overlay -->\n@if (dialogOpen()) {\n <div\n class=\"activity-dialog-overlay\"\n (click)=\"closeDialog()\"\n (touchmove)=\"$event.preventDefault()\"\n >\n <div class=\"activity-dialog\" role=\"dialog\" aria-modal=\"true\" (click)=\"$event.stopPropagation()\">\n <header class=\"activity-dialog__header\">\n <div class=\"activity-dialog__header-main\">\n <div class=\"activity-dialog__title-mark\" aria-hidden=\"true\">\n <i class=\"pi pi-history\"></i>\n </div>\n <div class=\"activity-dialog__title-copy\">\n <h2 class=\"activity-dialog__heading\">Lịch sử hoạt động</h2>\n <p class=\"activity-dialog__subtitle\">Theo dõi mọi thay đổi quan trọng</p>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"activity-dialog__close\"\n (click)=\"closeDialog()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </header>\n <div class=\"activity-dialog__toolbar\" role=\"search\">\n <button\n type=\"button\"\n class=\"activity-toolbar__icon-btn activity-toolbar__reload\"\n (click)=\"refreshLogs()\"\n [disabled]=\"loading()\"\n title=\"Làm mới\"\n aria-label=\"Làm mới danh sách\"\n >\n <i class=\"pi\" [ngClass]=\"loading() ? 'pi-spin pi-spinner' : 'pi-refresh'\"></i>\n </button>\n <button\n type=\"button\"\n class=\"activity-toolbar__icon-btn activity-toolbar__reset\"\n (click)=\"resetFilters()\"\n [disabled]=\"!hasActiveFilters()\"\n title=\"Đặt lại bộ lọc\"\n aria-label=\"Đặt lại bộ lọc\"\n >\n <i class=\"pi pi-filter-slash\"></i>\n </button>\n <label class=\"activity-toolbar__search\">\n <i class=\"pi pi-search\" aria-hidden=\"true\"></i>\n <input\n type=\"search\"\n name=\"activityLogSearch\"\n autocomplete=\"off\"\n placeholder=\"Tìm kiếm…\"\n [ngModel]=\"textSearchQuery()\"\n (ngModelChange)=\"onTextSearchChange($event)\"\n />\n </label>\n <label class=\"activity-toolbar__select\" aria-label=\"Danh mục\">\n <select [(ngModel)]=\"filterCategory\" (ngModelChange)=\"onFilterChange()\">\n <option value=\"all\">Tất cả</option>\n <option value=\"feeding\">Cữ bú</option>\n <option value=\"weight\">Cân nặng</option>\n <option value=\"medical\">Y tế</option>\n <option value=\"schedule\">Lịch hẹn</option>\n <option value=\"document\">Tài liệu</option>\n <option value=\"settings\">Cài đặt</option>\n </select>\n </label>\n <button\n type=\"button\"\n class=\"activity-toolbar__icon-btn activity-toolbar__sort\"\n (click)=\"toggleSortOrder()\"\n [title]=\"sortOrderToggleTitle()\"\n [attr.aria-label]=\"sortOrderToggleTitle()\"\n >\n <i\n class=\"pi\"\n [ngClass]=\"sortOrder === 'desc' ? 'pi-sort-amount-down' : 'pi-sort-amount-up-alt'\"\n ></i>\n </button>\n @if (filteredLogs().length > 0) {\n <span class=\"activity-toolbar__count\" aria-live=\"polite\">\n <span class=\"activity-toolbar__count-num\">{{ displayedLogs().length }}</span>\n <span class=\"activity-toolbar__count-sep\">/</span>\n <span class=\"activity-toolbar__count-total\">{{ filteredLogs().length }}</span>\n </span>\n }\n </div>\n <div class=\"activity-dialog__content\" (touchmove)=\"$event.stopPropagation()\">\n @if (loading()) {\n <div class=\"activity-loading\">\n <i class=\"pi pi-spin pi-spinner\"></i>\n <span>Đang tải...</span>\n </div>\n }\n @if (!loading() && filteredLogs().length === 0) {\n <div class=\"activity-empty\">\n <i class=\"pi pi-inbox\"></i>\n @if (hasTextFilter()) {\n <p>Không có mục nào khớp tìm kiếm.</p>\n }\n @if (!hasTextFilter() && filterCategory === 'all') {\n <p>Chưa có hoạt động nào được ghi nhận</p>\n }\n @if (!hasTextFilter() && filterCategory !== 'all') {\n <p>Không có hoạt động nào trong danh mục này</p>\n }\n </div>\n }\n @if (!loading() && displayedLogs().length > 0) {\n <ul class=\"activity-list\">\n @for (row of parsedDisplayRows(); track trackByParsedRow($index, row)) {\n <li\n class=\"activity-item\"\n [class.activity-item--unread]=\"isUnread(row.log.id)\"\n [class.activity-item--delete]=\"isDeleteActivity(row.log.eventType)\"\n [attr.data-color]=\"getEventColor(row.log.eventType)\"\n >\n <div class=\"activity-item__rail\" aria-hidden=\"true\"></div>\n <div class=\"activity-item__body\">\n <div class=\"activity-item__meta\">\n <span class=\"activity-item__type-group\">\n <i\n class=\"pi activity-item__icon\"\n [ngClass]=\"getEventIcon(row.log.eventType)\"\n aria-hidden=\"true\"\n ></i>\n <span class=\"activity-item__type\">{{\n getEventLabel(row.log.eventType)\n }}</span>\n </span>\n <button\n type=\"button\"\n class=\"activity-item__time activity-item__time-toggle\"\n (click)=\"toggleActivityTimeDisplay($event)\"\n [title]=\"activityTimeToggleTitle()\"\n [attr.aria-label]=\"activityTimeToggleAriaLabel()\"\n >\n {{ activityTimeText(row.log.timestamp) }}\n </button>\n </div>\n <p class=\"activity-item__content\">\n <span class=\"activity-item__actor\">\n <strong\n class=\"activity-item__author\"\n [class.activity-item__author--system]=\"isSystemActor(row.log.user)\"\n >{{ displayActivityUser(row.log.user) }}</strong\n >\n <span class=\"activity-item__verb\">đã</span>\n </span>\n <span class=\"activity-item__html\" [innerHTML]=\"row.contentHtml\"></span>\n </p>\n </div>\n </li>\n }\n </ul>\n }\n @if (hasMore()) {\n <div class=\"activity-load-more\">\n <button type=\"button\" class=\"load-more-btn\" (click)=\"loadMore()\">\n <i class=\"pi pi-angle-down\"></i>\n Tải thêm ({{ remainingCount() }} còn lại)\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject, signal } from '@angular/core';\nimport { Observable, from, throwError, of } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport { environment } from '../../environments/environment';\n\nexport interface NotificationLog {\n user: string;\n content: string;\n acknowledgeUsers: string[];\n createdAt?: string;\n rowIndex?: number;\n}\n\nexport interface NotificationSheetResponse {\n success: boolean;\n rowIndex?: number;\n error?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class NotificationLogService {\n private http = inject(HttpClient);\n\n private readonly SHEET_ID = environment.googleFeedingSheetId;\n private readonly SHEET_NAME = 'Notification';\n private readonly API_KEY = environment.googleSheetsApiKey;\n private readonly BASE_URL = this.SHEET_ID\n ? `https://sheets.googleapis.com/v4/spreadsheets/${this.SHEET_ID}`\n : '';\n private readonly APPS_SCRIPT_URL = environment.appsScriptDirect\n ? environment.googleFeedingAppsScriptUrl\n : '/api/feeding-apps-script';\n\n readonly notifications = signal<NotificationLog[]>([]);\n readonly loading = signal(false);\n\n loadNotifications(): Observable<NotificationLog[]> {\n if (!this.BASE_URL || !this.API_KEY) {\n this.notifications.set([]);\n return of([]);\n }\n this.loading.set(true);\n const range = `${this.SHEET_NAME}!A2:D`;\n const url = `${this.BASE_URL}/values/${encodeURIComponent(\n range\n )}?key=${this.API_KEY}&valueRenderOption=FORMATTED_VALUE`;\n\n return this.http.get<{ values?: string[][] }>(url).pipe(\n map((resp) => this.mapRows(resp.values || [])),\n tap((rows) => {\n this.notifications.set(rows);\n this.loading.set(false);\n }),\n catchError((err) => {\n console.error('NotificationLogService.loadNotifications failed', err);\n this.notifications.set([]);\n this.loading.set(false);\n return throwError(() => err);\n })\n );\n }\n\n addNotification(payload: {\n user: string;\n content: string;\n }): Observable<NotificationSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n return this.postToAppsScript({\n action: 'addNotification',\n notification: {\n user: payload.user,\n content: payload.content,\n createdAt: new Date().toISOString(),\n },\n }).pipe(catchError(() => of({ success: true })));\n }\n\n acknowledgeNotification(rowIndex: number, user: string): Observable<NotificationSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n return this.postToAppsScript({\n action: 'acknowledgeNotification',\n row: rowIndex,\n user,\n }).pipe(catchError(() => of({ success: true })));\n }\n\n deleteNotification(rowIndex: number, user: string): Observable<NotificationSheetResponse> {\n if (!this.APPS_SCRIPT_URL) {\n return throwError(() => new Error('Chưa cấu hình Google Apps Script URL'));\n }\n return this.postToAppsScript({\n action: 'deleteNotification',\n row: rowIndex,\n user,\n }).pipe(catchError(() => of({ success: true })));\n }\n\n private mapRows(rows: string[][]): NotificationLog[] {\n return rows\n .map((row, idx) => {\n const rowUser = String(row[0] || '')\n .trim()\n .toLowerCase();\n const content = String(row[1] || '').trim();\n const acknowledgeListRaw = String(row[2] || '').trim();\n const createdAtRaw = String(row[3] || '').trim();\n if (!rowUser || !content) return null;\n const acknowledgeUsers = acknowledgeListRaw\n .split(',')\n .map((v) => v.trim().toLowerCase())\n .filter((v) => v.length > 0);\n const createdAt = createdAtRaw || undefined;\n const item: NotificationLog = {\n user: rowUser,\n content,\n acknowledgeUsers,\n createdAt,\n rowIndex: idx + 2,\n };\n return item;\n })\n .filter((item): item is NotificationLog => !!item)\n .sort((a, b) => (b.rowIndex ?? 0) - (a.rowIndex ?? 0));\n }\n\n private postToAppsScript(body: Record<string, unknown>): Observable<NotificationSheetResponse> {\n const url = this.APPS_SCRIPT_URL;\n const useProxy = url.startsWith('/');\n\n if (useProxy) {\n const headers = new HttpHeaders({ 'Content-Type': 'text/plain;charset=UTF-8' });\n return this.http.post<NotificationSheetResponse>(url, JSON.stringify(body), { headers });\n }\n\n const payload = JSON.stringify(body);\n return from(\n fetch(url, {\n method: 'POST',\n mode: 'no-cors',\n headers: { 'Content-Type': 'text/plain;charset=utf-8' },\n body: payload,\n redirect: 'follow',\n }).then((): NotificationSheetResponse => ({ success: true }))\n );\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/** Display name shown in About (feeding app). */\nexport const APP_NAME = 'Life with baby';\n\n/**\n * Application version — keep in sync with package.json \"version\".\n * Scheme: YYYY.MM (monthly), YYYY.MM.N (daily patch), <base>-rc.NN (commit RC).\n * Updated automatically by GitHub release workflows.\n */\nexport const APP_VERSION = '2026.6.2-rc.04';\n\nexport interface AppInfo {\n name: string;\n version: string;\n}\n\nexport const APP_INFO: AppInfo = {\n name: APP_NAME,\n version: APP_VERSION,\n};\n\nexport const APP_INFO_TOKEN = new InjectionToken<AppInfo>('APP_INFO');\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewChild,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute } from '@angular/router';\nimport { finalize, catchError } from 'rxjs/operators';\nimport { forkJoin, of } from 'rxjs';\nimport {\n BottlePrepFromSheet,\n FeedingLog,\n FeedingLogService,\n FeedingSettingsResolved,\n parseFeedingSettingsFromRows,\n} from '../../services/feeding-log.service';\nimport { WeightLogService } from '../../services/weight-log.service';\nimport { EventLogService } from '../../services/event-log.service';\nimport { predictNextFeeding } from './feeding-prediction';\nimport { getNutritionTarget, NutritionTarget } from './feeding-nutrition';\nimport { FeedingNutritionComponent } from './nutrition/feeding-nutrition.component';\nimport { DocumentsComponent } from './documents/documents.component';\nimport { FeedingMomComponent } from './mom/feeding-mom.component';\nimport { FeedingChartsComponent } from './charts/feeding-charts.component';\nimport { FeedingProfileComponent } from './profile/feeding-profile.component';\nimport { FeedingDialogsComponent } from './dialogs/feeding-dialogs.component';\nimport { FeedingDailyComponent } from './daily/feeding-daily.component';\nimport { MedicalHistoryComponent } from './medical-history/medical-history.component';\nimport { WeightComponent } from './weight/weight.component';\nimport { FeedingScheduleComponent } from './schedule/feeding-schedule.component';\nimport { groupLogsByProximity } from './feeding-view-group';\nimport { ActivityLogComponent } from './activity-log/activity-log.component';\nimport {\n ActivityLogService,\n formatLogContent,\n ACTIVITY_EVENT,\n} from '../../services/activity-log.service';\nimport { NotificationLog, NotificationLogService } from '../../services/notification-log.service';\nimport { APP_INFO_TOKEN } from '../../app-info';\nimport { environment } from '../../../environments/environment';\n\ninterface Profile {\n babyName: string;\n birthDate: string;\n gender?: 'boy' | 'girl' | '';\n}\n\ninterface DayStats {\n date: string;\n total: number;\n count: number;\n /** Trung bình số học (ml/cữ). */\n avg: number;\n /** Trung vị thể tích một cữ (ml) — ổn định hơn khi có cữ rất nhỏ. */\n medianMl: number;\n /**\n * Giá trị dùng khi so khuyến nghị: trung vị nếu ≥3 cữ (ít nhạy cữ “lắt nhắt”),\n * ngược lại trùng TB.\n */\n typicalFeedMl: number;\n max: number;\n min: number;\n firstTime: string;\n lastTime: string;\n}\n\nconst STORAGE_PREFIX = 'feeding-profile::';\nconst INITIAL_NOTIFICATION_VISIBLE = 2;\n\n@Component({\n selector: 'app-feeding',\n standalone: true,\n imports: [\n CommonModule,\n DocumentsComponent,\n MedicalHistoryComponent,\n WeightComponent,\n ActivityLogComponent,\n FeedingScheduleComponent,\n FeedingMomComponent,\n FeedingChartsComponent,\n FeedingNutritionComponent,\n FeedingProfileComponent,\n FeedingDialogsComponent,\n FeedingDailyComponent,\n ],\n templateUrl: './feeding.component.html',\n styleUrls: ['./feeding.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedingComponent {\n private route = inject(ActivatedRoute);\n private destroyRef = inject(DestroyRef);\n private feedingLogService = inject(FeedingLogService);\n private weightLogService = inject(WeightLogService);\n private activityLogService = inject(ActivityLogService);\n private eventLogService = inject(EventLogService);\n private notificationLogService = inject(NotificationLogService);\n readonly appInfo = inject(APP_INFO_TOKEN);\n\n /** Controlled by NG_APP_ENABLE_EXPLORER env var. When false, the Documents\n * tab is hidden and no Drive/Apps Script calls are made. */\n readonly explorerEnabled = environment.enableExplorer;\n\n aboutDialogOpen = signal(false);\n\n /** Vùng cuộn thật của trang (`.feeding-page`), không phải `document`. */\n @ViewChild('feedingPage', { static: true })\n private feedingPageRef?: ElementRef<HTMLElement>;\n\n Math = Math;\n\n /** Tab nav phía dưới: feeding | weight | schedule | mom | medical | documents. */\n bottomTab = signal<'feeding' | 'weight' | 'schedule' | 'mom' | 'medical' | 'documents'>(\n 'feeding'\n );\n\n readonly navTabs = computed(() => [\n { id: 'feeding' as const, icon: 'pi-heart-fill', label: 'Cữ bú' },\n { id: 'weight' as const, icon: 'pi-chart-line', label: 'Thể trạng' },\n { id: 'schedule' as const, icon: 'pi-calendar', label: 'Lịch' },\n { id: 'mom' as const, icon: 'pi-sun', label: 'Mẹ' },\n { id: 'medical' as const, icon: 'pi-book', label: 'Y tế' },\n ...(this.explorerEnabled\n ? [{ id: 'documents' as const, icon: 'pi-folder', label: 'Tài liệu' }]\n : []),\n ]);\n\n readonly activeTabIndex = computed(() =>\n this.navTabs().findIndex((t) => t.id === this.bottomTab())\n );\n\n setBottomTab(tab: 'feeding' | 'weight' | 'schedule' | 'mom' | 'medical' | 'documents') {\n this.bottomTab.set(tab);\n this.scrollFeedingShellToTop();\n if (tab === 'feeding') {\n this.loadWeightLogs();\n }\n }\n\n /** Đưa cuộn về đầu khi đổi tab (shell `.feeding-page` + window dự phòng). */\n private scrollFeedingShellToTop(): void {\n if (typeof window === 'undefined') return;\n const el = this.feedingPageRef?.nativeElement;\n if (el) {\n el.scrollTo({ top: 0, left: 0, behavior: 'auto' });\n el.scrollTop = 0;\n }\n document.documentElement.scrollTop = 0;\n document.body.scrollTop = 0;\n window.scrollTo({ top: 0, left: 0, behavior: 'auto' });\n }\n\n user = signal<string>('guest');\n profile = signal<Profile | null>(null);\n draft = signal<Profile>({\n babyName: '',\n birthDate: '',\n gender: '',\n });\n /**\n * Cân mới nhất từ sheet Weight (bản ghi ngày mới nhất toàn sheet).\n * Cột user chỉ để biết ai log — không lọc theo user khi lấy giá trị này.\n */\n latestWeightKgFromSheet = signal<number | undefined>(undefined);\n\n editing = signal<boolean>(true);\n\n now = signal<Date>(new Date());\n\n // ===== Feeding log state =====\n logs = signal<FeedingLog[]>([]);\n loadingLogs = signal<boolean>(false);\n syncError = signal<string>('');\n lastContentLoadTime = signal<Date | null>(null);\n syncMessage = signal<string>('');\n\n /** Đồng bộ từ `app-feeding-dialogs` — ẩn toast lỗi khi dialog log đang mở. */\n logDialogOpen = signal<boolean>(false);\n\n /** Bumped on `refreshAll()` so daily reloads bottle prep. */\n dailyRefreshToken = signal(0);\n\n /** Đọc từ tab Sheet `Settings` — key theo `FEEDING_SETTING_ID`. */\n feedingSettings = signal<FeedingSettingsResolved>(\n parseFeedingSettingsFromRows([]) // This will use DEFAULT_FEEDING_SETTINGS as fallback\n );\n\n /** Nhắc sự kiện lịch (toàn cục) — trong cửa sổ Settings + sheet Event */\n eventReminderDialogOpen = signal(false);\n eventReminderAckSaving = signal(false);\n /** Đã bấm «Đã hiểu» — chỉ ẩn đến khi tải lại trang (F5 mở lại dialog). */\n private eventReminderSessionDismissed = signal(false);\n /** Đã hiện/đóng dialog trong phiên tải trang — tránh mở lại khi `now` tick. */\n private eventReminderHandledThisLoad = signal(false);\n /** Synced from daily + dialogs (log calc). */\n bottlePrep = signal<BottlePrepFromSheet | null>(null);\n notificationDraft = signal('');\n notificationSaving = signal(false);\n notificationListDialogOpen = signal(false);\n notificationError = signal('');\n notificationComposerDialogOpen = signal(false);\n acknowledgeAllConfirmDialogOpen = signal(false);\n\n /** Ngày đang xem trên card lịch sử (mặc định: hôm qua). */\n ageInDays = computed<number | null>(() => {\n const p = this.profile();\n if (!p?.birthDate) return null;\n const birth = new Date(p.birthDate);\n if (isNaN(birth.getTime())) return null;\n const diffMs = this.now().getTime() - birth.getTime();\n return Math.max(0, Math.floor(diffMs / (1000 * 60 * 60 * 24)));\n });\n\n /**\n * Sự kiện trong cửa sổ nhắc: từ (now) đã vào khoảng [T - lead, T), chưa Acknowledge, T > now.\n */\n scheduleReminderEvents = computed(() => {\n const s = this.feedingSettings();\n const leadMs = (s.eventReminderDays * 24 + s.eventReminderHours) * 3600 * 1000;\n const nowMs = this.now().getTime();\n return this.eventLogService.events().filter((e) => {\n if (e.acknowledged) return false;\n const dt = EventLogService.eventDateTime(e)?.getTime();\n if (dt === undefined || dt === null || Number.isNaN(dt)) return false;\n if (dt <= nowMs) return false;\n const windowStart = dt - leadMs;\n return nowMs >= windowStart;\n });\n });\n\n visibleNotifications = computed<NotificationLog[]>(() => {\n const currentUser = this.user().trim().toLowerCase();\n if (!currentUser) return [];\n return this.notificationLogService\n .notifications()\n .filter((item) => !item.acknowledgeUsers.includes(currentUser));\n });\n\n displayedNotifications = computed<NotificationLog[]>(() => {\n return this.visibleNotifications().slice(0, INITIAL_NOTIFICATION_VISIBLE);\n });\n\n hiddenNotificationCount = computed<number>(() => {\n const hidden = this.visibleNotifications().length - this.displayedNotifications().length;\n return hidden > 0 ? hidden : 0;\n });\n\n /** Hero gộp tóm tắt profile (bỏ card overview riêng). */\n profileHeroWeightLabel = computed(() => {\n const s = this.formatSheetWeightKg(this.latestWeightKgFromSheet());\n return s ? `${s} kg` : null;\n });\n\n ageBreakdown = computed(() => {\n const days = this.ageInDays();\n if (days === null) return null;\n\n const p = this.profile();\n const birth = p?.birthDate ? new Date(p.birthDate) : null;\n const now = this.now();\n\n let years = 0;\n let months = 0;\n let remDaysInMonth = days; // fallback nếu không parse được birthDate\n\n if (birth && !isNaN(birth.getTime())) {\n // Calendar-aware: đếm theo tháng dương lịch\n years = now.getFullYear() - birth.getFullYear();\n months = now.getMonth() - birth.getMonth();\n let d = now.getDate() - birth.getDate();\n if (d < 0) {\n // Mượn ngày từ tháng trước\n const prevMonth = new Date(now.getFullYear(), now.getMonth(), 0);\n d += prevMonth.getDate();\n months -= 1;\n }\n if (months < 0) {\n months += 12;\n years -= 1;\n }\n remDaysInMonth = d;\n }\n\n // Tách tuần/ngày trong phần dư sau tháng\n const weeksInMonth = Math.floor(remDaysInMonth / 7);\n const remainingDays = remDaysInMonth - weeksInMonth * 7;\n const totalWeeks = Math.floor(days / 7);\n\n return {\n days,\n weeks: totalWeeks,\n months: years * 12 + months,\n remainingMonths: months,\n years,\n weeksInMonth,\n remainingDays,\n };\n });\n\n // ===== Stats =====\n todayStats = computed<DayStats>(() => this.computeDayStats(this.todayDateStr()));\n yesterdayStats = computed<DayStats>(() => this.computeDayStats(this.yesterdayDateStr()));\n\n todayLogs = computed<FeedingLog[]>(() =>\n this.logs()\n .filter((l) => l.date === this.todayDateStr())\n .sort((a, b) => b.time.localeCompare(a.time))\n );\n\n yesterdayLogs = computed<FeedingLog[]>(() =>\n this.logs()\n .filter((l) => l.date === this.yesterdayDateStr())\n .sort((a, b) => b.time.localeCompare(a.time))\n );\n\n // ===== ML prediction =====\n prediction = computed(() => predictNextFeeding(this.logs(), this.now()));\n\n /** Cữ bú gần nhất (toàn bộ lịch sử, không chỉ hôm nay) */\n // ===== Nutrition target & evaluation (weight + age based) =====\n nutritionTarget = computed<NutritionTarget | null>(() => {\n const w = this.latestWeightKgFromSheet();\n const days = this.ageInDays();\n if (w === undefined || w <= 0 || days === null) return null;\n return getNutritionTarget(w, days);\n });\n\n lastActivityTime = computed(() => {\n const date = this.lastContentLoadTime();\n if (!date) return 'đang tải...';\n const now = this.now();\n const diffMs = now.getTime() - date.getTime();\n const diffMin = Math.floor(diffMs / 60000);\n const diffHr = Math.floor(diffMs / 3600000);\n if (diffMin < 1) return 'vừa xong';\n if (diffMin < 60) return `${diffMin} phút trước`;\n if (diffHr < 24) return `${diffHr} giờ trước`;\n const h = String(date.getHours()).padStart(2, '0');\n const m = String(date.getMinutes()).padStart(2, '0');\n return `lúc ${h}:${m}`;\n });\n\n constructor() {\n try {\n localStorage.removeItem('feeding:bottle-prep');\n } catch {\n /* ignore */\n }\n\n // Load settings immediately with default values\n this.loadFeedingSettings();\n\n this.route.queryParamMap.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((qp) => {\n const user = (qp.get('user') || 'guest').toLowerCase().trim() || 'guest';\n this.user.set(user);\n this.loadProfile(user);\n this.loadLogs();\n this.loadFeedingSettings(); // Load again with user context\n this.loadWeightLogs();\n this.loadScheduleEvents();\n this.loadNotifications();\n });\n\n const clockId = window.setInterval(() => this.now.set(new Date()), 60_000);\n this.destroyRef.onDestroy(() => window.clearInterval(clockId));\n\n effect(\n () => {\n this.eventLogService.events();\n this.eventLogService.loading();\n this.feedingSettings();\n this.tryOpenEventReminderAfterLoad();\n },\n { allowSignalWrites: true }\n );\n }\n\n // ===== Profile management =====\n private loadProfile(user: string) {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + user);\n if (raw) {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const g = parsed['gender'];\n const profile: Profile = {\n babyName: String(parsed['babyName'] ?? '').trim(),\n birthDate: String(parsed['birthDate'] ?? '').trim(),\n gender: g === 'boy' || g === 'girl' || g === '' ? (g as Profile['gender']) : '',\n };\n this.profile.set(profile);\n this.draft.set({ ...profile });\n this.editing.set(false);\n return;\n }\n } catch (e) {\n console.warn('Could not load feeding profile', e);\n }\n this.profile.set(null);\n this.draft.set({ babyName: '', birthDate: '', gender: '' });\n this.editing.set(true);\n }\n\n startEdit() {\n const p = this.profile();\n this.draft.set(p ? { ...p } : { babyName: '', birthDate: '', gender: '' });\n this.editing.set(true);\n }\n\n cancelEdit() {\n if (this.profile()) {\n this.editing.set(false);\n }\n }\n\n save() {\n const d = this.draft();\n if (!d.babyName?.trim() || !d.birthDate) return;\n\n const clean: Profile = {\n babyName: d.babyName.trim(),\n birthDate: d.birthDate,\n gender: d.gender || '',\n };\n\n localStorage.setItem(STORAGE_PREFIX + this.user(), JSON.stringify(clean));\n this.profile.set(clean);\n this.draft.set({ ...clean });\n this.editing.set(false);\n }\n\n clearProfile() {\n if (!confirm('Bạn có chắc muốn xóa profile của bé?')) return;\n localStorage.removeItem(STORAGE_PREFIX + this.user());\n this.profile.set(null);\n this.draft.set({ babyName: '', birthDate: '', gender: '' });\n this.editing.set(true);\n }\n\n /** Đóng menu bánh răng trên hero merged (dùng sau khi chọn mục). */\n closeProfileActionsMenu(menu: HTMLDetailsElement): void {\n menu.removeAttribute('open');\n }\n\n openAboutDialog(): void {\n this.aboutDialogOpen.set(true);\n }\n\n closeAboutDialog(): void {\n this.aboutDialogOpen.set(false);\n }\n\n updateDraftName(value: string) {\n this.draft.update((d) => ({ ...d, babyName: value }));\n }\n updateDraftBirth(value: string) {\n this.draft.update((d) => ({ ...d, birthDate: value }));\n }\n setDraftGender(gender: Profile['gender']) {\n this.draft.update((d) => ({ ...d, gender }));\n }\n // ===== Feeding log management =====\n loadLogs() {\n this.loadingLogs.set(true);\n this.syncError.set('');\n\n this.feedingLogService.getLogs().subscribe({\n next: (logs) => {\n this.logs.set(logs);\n this.loadingLogs.set(false);\n this.lastContentLoadTime.set(new Date());\n },\n error: (err) => {\n console.error(err);\n this.loadingLogs.set(false);\n this.syncError.set(\n 'Không tải được dữ liệu từ Google Sheet. Kiểm tra Sheet có tab \"Feeding\" và quyền truy cập.'\n );\n },\n });\n }\n\n /** Đọc tab Google Sheet `Settings` (cột A = ID) và áp dụng vào UI. */\n loadFeedingSettings(): void {\n this.feedingLogService.getFeedingSettings().subscribe({\n next: (rows) => {\n const settings = parseFeedingSettingsFromRows(rows);\n this.feedingSettings.set(settings);\n // Update activity log refresh interval\n this.activityLogService.setRefreshInterval(settings.activityLogRefreshMinutes);\n },\n error: (err) => {\n console.error(err);\n },\n });\n }\n\n onFeedingLogsChanged(): void {\n setTimeout(() => this.loadLogs(), 900);\n }\n\n onFeedingSettingsChanged(s: FeedingSettingsResolved): void {\n this.feedingSettings.set(s);\n this.activityLogService.setRefreshInterval(s.activityLogRefreshMinutes);\n setTimeout(() => this.loadFeedingSettings(), 600);\n }\n\n /** Tải cân mới nhất từ sheet Weight (cùng nguồn với tab Cân nặng). */\n loadWeightLogs(): void {\n this.weightLogService.getLogs().subscribe({\n next: (rows) => {\n const latest = rows[0];\n this.latestWeightKgFromSheet.set(latest?.weightKg);\n },\n error: (err) => {\n console.error(err);\n this.latestWeightKgFromSheet.set(undefined);\n },\n });\n }\n\n loadScheduleEvents(options?: { checkReminder?: boolean }): void {\n const checkReminder = options?.checkReminder ?? true;\n this.eventLogService.loadEvents().subscribe({\n next: () => {\n if (checkReminder) {\n this.tryOpenEventReminderAfterLoad({ markHandledIfEmpty: true });\n }\n },\n error: () => {\n /* Sheet/Event có thể chưa tồn tại — không chặn app */\n },\n });\n }\n\n loadNotifications(): void {\n this.notificationError.set('');\n this.notificationLogService.loadNotifications().subscribe({\n next: () => {},\n error: () => {\n this.notificationError.set(\n 'Không tải được tab Notification. Kiểm tra tên tab và quyền truy cập.'\n );\n },\n });\n }\n\n updateNotificationDraft(value: string): void {\n this.notificationDraft.set(value);\n }\n\n openNotificationComposerDialog(): void {\n this.notificationError.set('');\n this.notificationComposerDialogOpen.set(true);\n }\n\n closeNotificationComposerDialog(): void {\n if (this.notificationSaving()) return;\n this.notificationComposerDialogOpen.set(false);\n }\n\n openNotificationListDialog(): void {\n this.notificationListDialogOpen.set(true);\n }\n\n closeNotificationListDialog(): void {\n if (this.notificationSaving()) return;\n this.notificationListDialogOpen.set(false);\n }\n\n createNotification(): void {\n const content = this.notificationDraft().trim();\n if (!content || this.notificationSaving()) return;\n\n this.notificationSaving.set(true);\n this.notificationError.set('');\n const actor = this.user().trim().toLowerCase() || 'guest';\n\n this.notificationLogService\n .addNotification({ user: actor, content })\n .pipe(finalize(() => this.notificationSaving.set(false)))\n .subscribe({\n next: (res) => {\n if (res.success === false) {\n this.notificationError.set(res.error || 'Tạo thông báo thất bại.');\n return;\n }\n this.notificationDraft.set('');\n this.logNotificationAction('create', content);\n this.notificationComposerDialogOpen.set(false);\n this.loadNotifications();\n },\n error: () => {\n this.notificationError.set('Tạo thông báo thất bại. Vui lòng thử lại.');\n },\n });\n }\n\n acknowledgeNotification(item: NotificationLog): void {\n if (!item.rowIndex || this.notificationSaving()) return;\n const actor = this.user().trim().toLowerCase() || 'guest';\n const previous = this.notificationLogService.notifications();\n\n // Optimistic UI: ẩn thông báo ngay khi user bấm acknowledge.\n this.notificationLogService.notifications.update((rows) =>\n rows.map((row) => {\n if (row.rowIndex !== item.rowIndex) return row;\n if (row.acknowledgeUsers.includes(actor)) return row;\n return { ...row, acknowledgeUsers: [...row.acknowledgeUsers, actor] };\n })\n );\n\n this.notificationSaving.set(true);\n this.notificationError.set('');\n this.notificationLogService\n .acknowledgeNotification(item.rowIndex, actor)\n .pipe(finalize(() => this.notificationSaving.set(false)))\n .subscribe({\n next: (res) => {\n if (res.success === false) {\n this.notificationLogService.notifications.set(previous);\n this.notificationError.set(res.error || 'Không thể xác nhận đã đọc thông báo.');\n return;\n }\n this.logNotificationAction('ack', item.content, item.user);\n this.loadNotifications();\n },\n error: () => {\n this.notificationLogService.notifications.set(previous);\n this.notificationError.set('Không thể xác nhận đã đọc thông báo.');\n },\n });\n }\n\n deleteNotification(item: NotificationLog): void {\n if (!item.rowIndex || !this.canDeleteNotification(item) || this.notificationSaving()) return;\n if (!confirm('Bạn có chắc muốn xóa thông báo này?')) return;\n\n const actor = this.user().trim().toLowerCase() || 'guest';\n this.notificationSaving.set(true);\n this.notificationError.set('');\n\n this.notificationLogService\n .deleteNotification(item.rowIndex, actor)\n .pipe(finalize(() => this.notificationSaving.set(false)))\n .subscribe({\n next: (res) => {\n if (res.success === false) {\n this.notificationError.set(\n res.error || 'Chỉ người tạo thông báo mới được phép xóa thông báo.'\n );\n return;\n }\n this.logNotificationAction('delete', item.content, item.user);\n this.loadNotifications();\n },\n error: () => {\n this.notificationError.set('Xóa thông báo thất bại.');\n },\n });\n }\n\n canDeleteNotification(item: NotificationLog): boolean {\n return item.user === (this.user().trim().toLowerCase() || 'guest');\n }\n\n openAcknowledgeAllConfirmDialog(): void {\n if (this.visibleNotifications().length === 0 || this.notificationSaving()) return;\n this.acknowledgeAllConfirmDialogOpen.set(true);\n }\n\n closeAcknowledgeAllConfirmDialog(): void {\n if (this.notificationSaving()) return;\n this.acknowledgeAllConfirmDialogOpen.set(false);\n }\n\n confirmAcknowledgeAll(): void {\n this.acknowledgeAllConfirmDialogOpen.set(false);\n this.acknowledgeAllNotifications();\n }\n\n acknowledgeAllNotifications(): void {\n const actor = this.user().trim().toLowerCase() || 'guest';\n const rows = this.visibleNotifications().filter((item) => !!item.rowIndex);\n if (rows.length === 0 || this.notificationSaving()) return;\n\n const previous = this.notificationLogService.notifications();\n this.notificationError.set('');\n this.notificationSaving.set(true);\n\n // Optimistic UI: ẩn toàn bộ thông báo ngay khi user bấm \"đã đọc tất cả\".\n this.notificationLogService.notifications.update((allRows) =>\n allRows.map((row) => {\n if (!row.rowIndex) return row;\n const target = rows.find((item) => item.rowIndex === row.rowIndex);\n if (!target) return row;\n if (row.acknowledgeUsers.includes(actor)) return row;\n return { ...row, acknowledgeUsers: [...row.acknowledgeUsers, actor] };\n })\n );\n\n forkJoin(\n rows.map((item) =>\n this.notificationLogService\n .acknowledgeNotification(item.rowIndex as number, actor)\n .pipe(catchError(() => of({ success: false })))\n )\n )\n .pipe(finalize(() => this.notificationSaving.set(false)))\n .subscribe((results) => {\n const hasFailed = results.some((res) => res.success === false);\n if (hasFailed) {\n this.notificationLogService.notifications.set(previous);\n this.notificationError.set('Không thể đánh dấu tất cả đã đọc. Vui lòng thử lại.');\n return;\n }\n\n rows.forEach((item) => this.logNotificationAction('ack', item.content, item.user));\n this.loadNotifications();\n });\n }\n\n formatNotificationCreatedAt(value?: string): string {\n if (!value) return '';\n const dt = new Date(value);\n if (Number.isNaN(dt.getTime())) return value;\n return dt.toLocaleString('vi-VN', {\n hour12: false,\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n }\n\n private logNotificationAction(\n action: 'create' | 'ack' | 'delete',\n content: string,\n owner?: string\n ): void {\n const actor = this.user().trim().toLowerCase() || 'guest';\n if (!content) return;\n\n let eventType: (typeof ACTIVITY_EVENT)[keyof typeof ACTIVITY_EVENT] =\n ACTIVITY_EVENT.NOTIFICATION_CREATED;\n if (action === 'ack') eventType = ACTIVITY_EVENT.NOTIFICATION_ACKNOWLEDGED;\n if (action === 'delete') eventType = ACTIVITY_EVENT.NOTIFICATION_DELETED;\n\n const message = formatLogContent(eventType, { content, owner });\n this.activityLogService\n .addLog({\n user: actor,\n eventType,\n content: message,\n })\n .subscribe();\n }\n\n /** Giống F5 — cho phép kiểm tra và mở lại dialog nhắc sự kiện. */\n private resetEventReminderSessionForReload(): void {\n this.eventReminderHandledThisLoad.set(false);\n this.eventReminderSessionDismissed.set(false);\n this.eventReminderDialogOpen.set(false);\n }\n\n private tryOpenEventReminderAfterLoad(options?: { markHandledIfEmpty?: boolean }): void {\n if (this.eventReminderHandledThisLoad()) return;\n if (this.eventReminderSessionDismissed()) return;\n if (this.eventLogService.loading()) return;\n\n const pending = this.scheduleReminderEvents();\n if (pending.length > 0) {\n this.eventReminderHandledThisLoad.set(true);\n this.eventReminderDialogOpen.set(true);\n return;\n }\n\n if (options?.markHandledIfEmpty) {\n this.eventReminderHandledThisLoad.set(true);\n }\n }\n\n closeEventReminderDialog(): void {\n this.eventReminderDialogOpen.set(false);\n this.eventReminderHandledThisLoad.set(true);\n }\n\n skipEventReminderSession(): void {\n this.eventReminderSessionDismissed.set(true);\n this.eventReminderHandledThisLoad.set(true);\n this.closeEventReminderDialog();\n }\n\n acknowledgeEventReminderRow(rowIndex: number): void {\n if (!rowIndex) return;\n this.eventReminderAckSaving.set(true);\n this.eventLogService\n .acknowledgeEvent(rowIndex)\n .pipe(\n catchError(() => of({ success: false })),\n finalize(() => this.eventReminderAckSaving.set(false))\n )\n .subscribe(() => {\n this.eventLogService.loadEvents().subscribe({\n next: () => {\n if (this.scheduleReminderEvents().length === 0) {\n this.closeEventReminderDialog();\n }\n },\n });\n });\n }\n\n acknowledgeAllEventReminders(): void {\n const rows = this.scheduleReminderEvents()\n .map((e) => e.rowIndex)\n .filter((r): r is number => typeof r === 'number' && r >= 2);\n\n this.eventReminderHandledThisLoad.set(true);\n this.closeEventReminderDialog();\n\n if (rows.length === 0) return;\n\n // 🚀 Acknowledge each event independently - không đợi nhau\n let completedCount = 0;\n const totalCount = rows.length;\n\n rows.forEach((row) => {\n this.eventLogService\n .acknowledgeEvent(row)\n .pipe(catchError(() => of(null)))\n .subscribe(() => {\n completedCount++;\n\n // Reload events after all completed (hoặc có thể reload ngay sau từng cái)\n if (completedCount === totalCount) {\n this.eventLogService.loadEvents().subscribe();\n }\n });\n });\n }\n\n formatReminderEventWhen(ev: { date: string; time: string }): string {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(ev.date);\n if (!m) return ev.date;\n\n const y = +m[1];\n const mo = +m[2];\n const d = +m[3];\n const hour = this.parseReminderHour(ev.time);\n const period = this.reminderTimePeriod(hour);\n\n const now = new Date();\n const startNow = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const startEv = new Date(y, mo - 1, d);\n const diff = Math.round((startEv.getTime() - startNow.getTime()) / 86_400_000);\n\n if (diff === 0) {\n if (period === 'sáng') return 'Sáng nay';\n if (period === 'trưa') return 'Trưa nay';\n if (period === 'chiều') return 'Chiều nay';\n if (period === 'tối') return 'Tối nay';\n return 'Hôm nay';\n }\n\n if (diff === 1) {\n if (period === 'sáng') return 'Sáng mai';\n if (period === 'trưa') return 'Trưa mai';\n if (period === 'chiều') return 'Chiều mai';\n if (period === 'tối') return 'Tối mai';\n return 'Ngày mai';\n }\n\n if (diff === 2) {\n if (period === 'sáng') return 'Sáng mốt';\n if (period === 'trưa') return 'Trưa mốt';\n if (period === 'chiều') return 'Chiều mốt';\n if (period === 'tối') return 'Tối mốt';\n return 'Ngày mốt';\n }\n\n if (diff > 2) return `${diff} ngày nữa`;\n\n return `ngày ${d} tháng ${mo} năm ${y}`;\n }\n\n formatReminderEventTime(time: string): string {\n return time;\n }\n\n private parseReminderHour(time: string): number {\n const m = /^(\\d{1,2}):(\\d{2})/.exec(String(time || '').trim());\n if (!m) return 12;\n return Math.min(23, Math.max(0, parseInt(m[1], 10)));\n }\n\n private reminderTimePeriod(hour: number): 'sáng' | 'trưa' | 'chiều' | 'tối' | null {\n if (hour >= 5 && hour < 12) return 'sáng';\n if (hour >= 12 && hour < 13) return 'trưa';\n if (hour >= 13 && hour < 18) return 'chiều';\n if (hour >= 18 && hour < 23) return 'tối';\n return null;\n }\n\n /** Dialog log calc — clear sheet prep; daily reloads via `dailyRefreshToken`. */\n clearBottlePrep(): void {\n this.bottlePrep.set(null);\n this.feedingLogService.clearBottlePrepOnSheet().subscribe({\n next: () => this.dailyRefreshToken.update((n) => n + 1),\n error: () => this.dailyRefreshToken.update((n) => n + 1),\n });\n }\n\n /**\n * Tham chiếu tới `<app-documents>` đang render trong tab Documents.\n * `*ngIf` của template khiến component có thể không tồn tại (khi đang ở\n * tab Cữ bú) → ViewChild sẽ trả `undefined`. Với `static: false` (mặc\n * định), Angular sẽ resolve lại sau mỗi change detection nên ViewChild\n * tự cập nhật khi user chuyển tab.\n */\n @ViewChild(DocumentsComponent) private documentsCmp?: DocumentsComponent;\n @ViewChild(MedicalHistoryComponent) private medicalCmp?: MedicalHistoryComponent;\n @ViewChild(WeightComponent) private weightCmp?: WeightComponent;\n\n /**\n * Reload đồng thời nhật ký bú, cân nặng, tiền sử y tế **và** documents.\n * Các child tab dùng `[hidden]` nên component có thể chưa mount —\n * `?.refresh()` bỏ qua an toàn.\n */\n refreshAll() {\n this.loadLogs();\n this.loadFeedingSettings();\n this.loadWeightLogs();\n this.dailyRefreshToken.update((n) => n + 1);\n this.weightCmp?.refresh();\n this.medicalCmp?.refresh();\n this.documentsCmp?.refresh();\n this.resetEventReminderSessionForReload();\n this.loadScheduleEvents({ checkReminder: true });\n this.loadNotifications();\n }\n\n /** Khi có activity mới từ user khác — reload toàn bộ dữ liệu */\n onActivityChanged() {\n this.refreshAll();\n }\n\n /** Ảnh đính kèm trên timeline Y tế → tab Tài liệu + preview file Explorer. */\n openMedicalAttachmentInDocuments(explorerEntryId: number): void {\n this.setBottomTab('documents');\n setTimeout(() => {\n this.documentsCmp?.revealFileEntry(explorerEntryId);\n }, 0);\n }\n\n /** True khi một nguồn dữ liệu đang load — dùng cho icon spin. */\n isAnyLoading = computed<boolean>(\n () =>\n this.loadingLogs() ||\n (this.weightCmp?.loading() ?? false) ||\n (this.medicalCmp?.loading() ?? false) ||\n (this.documentsCmp?.loading() ?? false) ||\n (this.eventLogService.loading() ?? false)\n );\n\n // ===== Helpers =====\n private logTimestamp(l: FeedingLog): number {\n const [y, m, d] = (l.date || '').split('-').map(Number);\n const [hh, mm] = (l.time || '').split(':').map(Number);\n if (!y || !m || !d || isNaN(hh) || isNaN(mm)) return 0;\n return new Date(y, m - 1, d, hh, mm, 0, 0).getTime();\n }\n\n private dayLogsGroupedStats(date: string, logs: FeedingLog[]): DayStats {\n const gap = this.feedingSettings().feedGroupGapMinutes;\n const groups = groupLogsByProximity(logs, gap, (l) => this.logTimestamp(l));\n const pseudo = groups.map((g) => {\n const anchor = g.members.reduce((a, b) =>\n this.logTimestamp(a) >= this.logTimestamp(b) ? a : b\n );\n const volume = g.members.reduce((s, m) => s + (m.volume || 0), 0);\n return { ...anchor, volume };\n });\n return this.statsFromList(date, pseudo);\n }\n\n private computeDayStats(date: string): DayStats {\n const logs = this.logs().filter((l) => l.date === date);\n return this.dayLogsGroupedStats(date, logs);\n }\n\n /** ISO yyyy-mm-dd, `daysBefore` ngày so với «hôm nay» theo đồng hồ app. */\n dateStrDaysAgo(daysBefore: number): string {\n const d = new Date(this.now());\n d.setDate(d.getDate() - daysBefore);\n return this.toDateStr(d);\n }\n\n /** Tổng/cữ của 1 ngày chỉ tính tới cùng giờ hiện tại (so «ngang giờ»). */\n private statsUpToNowForDate(dateStr: string): DayStats {\n const nowTime = this.toTimeStr(this.now());\n const list = this.logs().filter((l) => l.date === dateStr && l.time <= nowTime);\n return this.dayLogsGroupedStats(dateStr, list);\n }\n\n private statsFromList(date: string, list: FeedingLog[]): DayStats {\n if (list.length === 0) {\n return {\n date,\n total: 0,\n count: 0,\n avg: 0,\n medianMl: 0,\n typicalFeedMl: 0,\n max: 0,\n min: 0,\n firstTime: '',\n lastTime: '',\n };\n }\n const total = list.reduce((s, l) => s + l.volume, 0);\n const volumes = list.map((l) => l.volume);\n const times = list.map((l) => l.time).sort();\n const sortedVol = [...volumes].sort((a, b) => a - b);\n const mid = Math.floor(sortedVol.length / 2);\n const medianMl =\n sortedVol.length % 2 === 1\n ? sortedVol[mid]\n : Math.round((sortedVol[mid - 1] + sortedVol[mid]) / 2);\n const avg = Math.round(total / list.length);\n const typicalFeedMl = list.length >= 3 ? medianMl : avg;\n return {\n date,\n total,\n count: list.length,\n avg,\n medianMl,\n typicalFeedMl,\n max: Math.max(...volumes),\n min: Math.min(...volumes),\n firstTime: times[0],\n lastTime: times[times.length - 1],\n };\n }\n\n private toDateStr(d: Date): string {\n const y = d.getFullYear();\n const mo = (d.getMonth() + 1).toString().padStart(2, '0');\n const day = d.getDate().toString().padStart(2, '0');\n return `${y}-${mo}-${day}`;\n }\n\n private toTimeStr(d: Date): string {\n const h = d.getHours().toString().padStart(2, '0');\n const m = d.getMinutes().toString().padStart(2, '0');\n return `${h}:${m}`;\n }\n\n todayDateStr(): string {\n return this.toDateStr(this.now());\n }\n\n yesterdayDateStr(): string {\n const d = new Date(this.now());\n d.setDate(d.getDate() - 1);\n return this.toDateStr(d);\n }\n\n /** Thứ (tiếng Việt) — hero */\n get heroWeekday(): string {\n return this.now().toLocaleDateString('vi-VN', { weekday: 'long' });\n }\n\n /** Ngày dd/mm/yyyy — hero, dễ quét */\n get heroDateNumeric(): string {\n const d = this.now();\n const dd = String(d.getDate()).padStart(2, '0');\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const yyyy = d.getFullYear();\n return `${dd}/${mm}/${yyyy}`;\n }\n\n /** Giờ hiện tại dạng HH:MM — dùng cho live clock ở hero */\n get currentTimeStr(): string {\n return this.toTimeStr(this.now());\n }\n\n get maxBirthDate(): string {\n return new Date().toISOString().split('T')[0];\n }\n\n /** Cân sheet Weight — hiển thị trong hero (cùng logic feeding-profile). */\n formatSheetWeightKg(kg: number | undefined): string {\n if (kg === undefined || !Number.isFinite(kg) || kg <= 0) return '';\n return new Intl.NumberFormat('vi-VN', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n }).format(kg);\n }\n}\n","<div class=\"feeding-root\">\n <div class=\"feeding-page\" #feedingPage>\n <div class=\"backdrop\"></div>\n\n <header class=\"hero\" [class.hero--profile-merged]=\"profile() && !editing() && ageBreakdown()\">\n <div class=\"hero-inner\">\n <div class=\"hero-brand\">\n <div class=\"hero-title-row\">\n @if (profile() && !editing() && ageBreakdown(); as age) {\n <div class=\"hero-title hero-title--merged\">\n <div class=\"emoji\" aria-hidden=\"true\">\n {{\n profile()!.gender === 'boy' ? '👦' : profile()!.gender === 'girl' ? '👧' : '🍼'\n }}\n </div>\n <div class=\"hero-text\">\n <div class=\"hero-merged-head\">\n <h1>{{ profile()!.babyName }}</h1>\n <span class=\"hero-age-chip\">\n @if (age.years > 0) {\n {{ age.years }}y\n }\n {{ age.years > 0 ? age.remainingMonths : age.months }}m\n @if (age.weeksInMonth > 0) {\n {{ age.weeksInMonth }}w\n }\n @if (\n age.remainingDays > 0 ||\n (age.weeksInMonth === 0 && age.months === 0 && age.years === 0)\n ) {\n {{ age.remainingDays }}d\n }\n </span>\n <span class=\"hero-merged-stat\">\n <i class=\"pi pi-calendar\" aria-hidden=\"true\"></i>\n {{ profile()!.birthDate | date: 'dd/MM/yyyy' }}\n </span>\n @if (profileHeroWeightLabel(); as wLabel) {\n <span class=\"hero-merged-stat hero-merged-stat--weight\">\n <i class=\"pi pi-heart-fill\" aria-hidden=\"true\"></i>\n {{ wLabel }}\n </span>\n }\n </div>\n <p class=\"hero-merged-meta\">\n <span>{{ age.days }} ngày</span>\n <span class=\"dot\">·</span>\n <span class=\"hero-merged-user\"\n ><i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <strong>{{ user() }}</strong></span\n >\n <span class=\"dot\">·</span>\n <span class=\"hero-merged-sync\">Cập nhật {{ lastActivityTime() }}</span>\n </p>\n </div>\n </div>\n <div class=\"hero-actions hero-actions--merged\">\n <app-activity-log (activityChanged)=\"onActivityChanged()\"></app-activity-log>\n @if (bottomTab() !== 'schedule') {\n <button\n class=\"btn icon-btn\"\n type=\"button\"\n (click)=\"refreshAll()\"\n [disabled]=\"isAnyLoading()\"\n [title]=\"\n isAnyLoading() ? 'Đang tải…' : 'Tải lại Cữ bú, Cân, Lịch, Y tế, Tài liệu'\n \"\n aria-label=\"Tải lại Cữ bú, Thể trạng, Lịch, Tiền sử y tế và Tài liệu\"\n >\n <i class=\"pi pi-refresh\" [class.spin]=\"isAnyLoading()\"></i>\n </button>\n }\n <details class=\"hero-profile-menu\" #profileActionsMenu>\n <summary\n class=\"btn icon-btn hero-profile-menu__trigger\"\n title=\"Thao tác profile\"\n aria-label=\"Menu thao tác profile\"\n >\n <i class=\"pi pi-cog\" aria-hidden=\"true\"></i>\n </summary>\n <div class=\"hero-profile-menu__panel\" role=\"menu\">\n <button\n type=\"button\"\n class=\"hero-profile-menu__item\"\n role=\"menuitem\"\n (click)=\"closeProfileActionsMenu(profileActionsMenu); startEdit()\"\n >\n <i class=\"pi pi-pencil\" aria-hidden=\"true\"></i>\n <span>Sửa profile</span>\n </button>\n <button\n type=\"button\"\n class=\"hero-profile-menu__item hero-profile-menu__item--danger\"\n role=\"menuitem\"\n (click)=\"closeProfileActionsMenu(profileActionsMenu); clearProfile()\"\n >\n <i class=\"pi pi-trash\" aria-hidden=\"true\"></i>\n <span>Xoá profile</span>\n </button>\n <button\n type=\"button\"\n class=\"hero-profile-menu__item\"\n role=\"menuitem\"\n (click)=\"\n closeProfileActionsMenu(profileActionsMenu);\n feedingDialogs.openFeedingSettingsDialog()\n \"\n >\n <i class=\"pi pi-sliders-h\" aria-hidden=\"true\"></i>\n <span>Cài đặt</span>\n </button>\n <button\n type=\"button\"\n class=\"hero-profile-menu__item\"\n role=\"menuitem\"\n (click)=\"closeProfileActionsMenu(profileActionsMenu); openAboutDialog()\"\n >\n <i class=\"pi pi-info-circle\" aria-hidden=\"true\"></i>\n <span>About</span>\n </button>\n </div>\n </details>\n </div>\n } @else {\n <div class=\"hero-title\">\n <div class=\"emoji\" aria-hidden=\"true\">👶</div>\n <div class=\"hero-text\">\n <h1>Bé yêu của bạn</h1>\n <p class=\"hero-userline\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <strong>{{ user() }}</strong>\n <span class=\"hero-last-update\">· Cập nhật {{ lastActivityTime() }}</span>\n </p>\n </div>\n </div>\n @if (profile() && !editing()) {\n <div class=\"hero-actions\">\n <app-activity-log (activityChanged)=\"onActivityChanged()\"></app-activity-log>\n <button\n class=\"btn icon-btn\"\n type=\"button\"\n (click)=\"feedingDialogs.openFeedingSettingsDialog()\"\n title=\"Cài đặt\"\n aria-label=\"Cài đặt cữ bú\"\n >\n <i class=\"pi pi-sliders-h\"></i>\n </button>\n @if (bottomTab() !== 'schedule') {\n <button\n class=\"btn icon-btn\"\n type=\"button\"\n (click)=\"refreshAll()\"\n [disabled]=\"isAnyLoading()\"\n [title]=\"\n isAnyLoading() ? 'Đang tải…' : 'Tải lại Cữ bú, Cân, Lịch, Y tế, Tài liệu'\n \"\n aria-label=\"Tải lại Cữ bú, Thể trạng, Lịch, Tiền sử y tế và Tài liệu\"\n >\n <i class=\"pi pi-refresh\" [class.spin]=\"isAnyLoading()\"></i>\n </button>\n }\n </div>\n }\n }\n </div>\n </div>\n\n <div class=\"hero-datetime\" aria-live=\"polite\">\n <div class=\"hero-datetime-strip\">\n <div class=\"hero-datetime-strip__block hero-datetime-strip__block--date\">\n <i class=\"pi pi-calendar\" aria-hidden=\"true\"></i>\n <span class=\"hero-datetime-strip__wd\">{{ heroWeekday }}</span>\n <time class=\"hero-datetime-strip__date\" [attr.datetime]=\"todayDateStr()\">{{\n heroDateNumeric\n }}</time>\n </div>\n <span class=\"hero-datetime-strip__divider\" aria-hidden=\"true\"></span>\n <div class=\"hero-datetime-strip__block hero-datetime-strip__block--time\">\n <i class=\"pi pi-clock\" aria-hidden=\"true\"></i>\n <span class=\"hero-datetime-strip__clock\">{{ currentTimeStr }}</span>\n </div>\n </div>\n </div>\n\n <section class=\"hero-notification\" aria-label=\"Thông báo nội bộ\">\n <!-- watermark background icons -->\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--bell\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-bell\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--megaphone\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-megaphone\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--comments\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-comments\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--send\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-send\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--star\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-star\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--bolt\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-bolt\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--heart\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-heart\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--info\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--check\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-check-circle\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--eye\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-eye\"></i>\n </span>\n\n <div class=\"hero-notification__head\">\n <label class=\"hero-notification__composer-label\" for=\"hero-notification-input\">\n <i class=\"pi pi-megaphone\" aria-hidden=\"true\"></i>\n <span>Thông báo</span>\n @if (visibleNotifications().length > 0) {\n <span class=\"hero-notification__unread-badge\">{{\n visibleNotifications().length\n }}</span>\n }\n </label>\n <div class=\"hero-notification__head-actions\">\n <button\n type=\"button\"\n class=\"hero-notification__mark-all\"\n (click)=\"openAcknowledgeAllConfirmDialog()\"\n [disabled]=\"notificationSaving() || visibleNotifications().length === 0\"\n title=\"Đánh dấu tất cả đã đọc\"\n >\n <i class=\"pi pi-check\" aria-hidden=\"true\"></i>\n Đã đọc tất cả\n </button>\n <button\n type=\"button\"\n class=\"hero-notification__add\"\n (click)=\"openNotificationComposerDialog()\"\n aria-label=\"Tạo thông báo\"\n title=\"Tạo thông báo\"\n >\n <i class=\"pi pi-plus\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n @if (displayedNotifications().length > 0) {\n <ul class=\"hero-notification__list\">\n @for (notice of displayedNotifications(); track notice) {\n <li class=\"hero-notification__item\">\n <div class=\"hero-notification__avatar\" aria-hidden=\"true\">\n {{ notice.user | slice: 0 : 2 | uppercase }}\n </div>\n <div class=\"hero-notification__body\">\n <div class=\"hero-notification__body-head\">\n <span class=\"hero-notification__author\">{{ notice.user }}</span>\n </div>\n <p class=\"hero-notification__content\">{{ notice.content }}</p>\n @if (notice.createdAt) {\n <span class=\"hero-notification__created\">{{\n formatNotificationCreatedAt(notice.createdAt)\n }}</span>\n }\n </div>\n <div class=\"hero-notification__item-actions\">\n <button\n type=\"button\"\n class=\"hero-notification__ack-top\"\n (click)=\"acknowledgeNotification(notice)\"\n [disabled]=\"notificationSaving()\"\n aria-label=\"Đã đọc thông báo\"\n title=\"Đã đọc\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n @if (canDeleteNotification(notice)) {\n <button\n type=\"button\"\n class=\"hero-notification__delete\"\n (click)=\"deleteNotification(notice)\"\n [disabled]=\"notificationSaving()\"\n aria-label=\"Xóa thông báo\"\n title=\"Xóa thông báo\"\n >\n <i class=\"pi pi-trash\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </li>\n }\n </ul>\n } @else {\n <div class=\"hero-notification__empty\">\n <i class=\"pi pi-bell hero-notification__empty-icon\" aria-hidden=\"true\"></i>\n <span class=\"hero-notification__empty-title\">Không có thông báo mới</span>\n <span class=\"hero-notification__empty-sub\"\n >Mọi thứ đều ổn. Thông báo mới sẽ xuất hiện ở đây.</span\n >\n </div>\n }\n\n @if (hiddenNotificationCount() > 0) {\n <button\n type=\"button\"\n class=\"hero-notification__more\"\n (click)=\"openNotificationListDialog()\"\n >\n Xem thêm {{ hiddenNotificationCount() }} thông báo →\n </button>\n }\n </section>\n\n @if (notificationComposerDialogOpen()) {\n <div\n class=\"dialog-overlay dialog-overlay--front\"\n (click)=\"closeNotificationComposerDialog()\"\n >\n <div\n class=\"dialog hero-notification-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Tạo thông báo\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- watermark background icons -->\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--bell\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-bell\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--megaphone\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-megaphone\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--send\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-send\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--star\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-star\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--comments\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-comments\"></i>\n </span>\n\n <div class=\"dialog-head hero-notification-dialog__head\">\n <div class=\"hero-notification-dialog__title-group\">\n <div class=\"hero-notification-dialog__icon-wrap\">\n <i class=\"pi pi-megaphone\" aria-hidden=\"true\"></i>\n </div>\n <div>\n <h2 class=\"hero-notification-dialog__title\">Tạo thông báo</h2>\n <p class=\"hero-notification-dialog__subtitle\">\n Thông báo sẽ hiển thị cho toàn bộ thành viên\n </p>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"dialog-close\"\n (click)=\"closeNotificationComposerDialog()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <div class=\"hero-notification__composer-panel\">\n <div class=\"hero-notification__composer-row\">\n <div class=\"hero-notification__input-wrap\">\n <textarea\n id=\"hero-notification-input\"\n class=\"hero-notification__input\"\n [value]=\"notificationDraft()\"\n (input)=\"updateNotificationDraft($any($event.target).value)\"\n [disabled]=\"notificationSaving()\"\n maxlength=\"300\"\n placeholder=\"Nhập nội dung thông báo cho mọi người...\"\n aria-label=\"Nội dung thông báo\"\n ></textarea>\n <div class=\"hero-notification__char-ring\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 36 36\">\n <circle class=\"hero-notification__char-ring-track\" cx=\"18\" cy=\"18\" r=\"15\" />\n <circle\n class=\"hero-notification__char-ring-fill\"\n cx=\"18\"\n cy=\"18\"\n r=\"15\"\n [style.stroke-dashoffset]=\"\n 94 - (notificationDraft().trim().length / 300) * 94\n \"\n />\n </svg>\n <span class=\"hero-notification__char-count\">{{\n notificationDraft().trim().length\n }}</span>\n </div>\n </div>\n </div>\n <div class=\"hero-notification__composer-actions\">\n <button\n type=\"button\"\n class=\"btn ghost hero-notification__cancel\"\n (click)=\"closeNotificationComposerDialog()\"\n [disabled]=\"notificationSaving()\"\n >\n Hủy\n </button>\n <button\n type=\"button\"\n class=\"btn hero-notification__send\"\n (click)=\"createNotification()\"\n [disabled]=\"notificationSaving() || !notificationDraft().trim()\"\n >\n <i class=\"pi pi-send\"></i>\n <span>Gửi thông báo</span>\n </button>\n </div>\n </div>\n @if (notificationError()) {\n <p class=\"hero-notification__error\">\n {{ notificationError() }}\n </p>\n }\n </div>\n </div>\n }\n\n @if (notificationListDialogOpen()) {\n <div class=\"dialog-overlay dialog-overlay--front\" (click)=\"closeNotificationListDialog()\">\n <div\n class=\"dialog hero-notification-list-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Danh sách thông báo\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- watermark background icons -->\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--bell\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-bell\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--megaphone\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-megaphone\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--comments\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-comments\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--star\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-star\"></i>\n </span>\n <span\n class=\"hero-notification__bg-icon hero-notification__bg-icon--check\"\n aria-hidden=\"true\"\n >\n <i class=\"pi pi-check-circle\"></i>\n </span>\n\n <div class=\"dialog-head hero-notification-list-dialog__head\">\n <div class=\"hero-notification-dialog__title-group\">\n <div class=\"hero-notification-dialog__icon-wrap\">\n <i class=\"pi pi-megaphone\" aria-hidden=\"true\"></i>\n </div>\n <div>\n <h2 class=\"hero-notification-list-dialog__title\">Toàn bộ thông báo</h2>\n <p class=\"hero-notification-dialog__subtitle\">\n {{ visibleNotifications().length }} thông báo\n </p>\n </div>\n </div>\n <div class=\"hero-notification-list-dialog__head-actions\">\n <button\n type=\"button\"\n class=\"hero-notification__mark-all\"\n (click)=\"openAcknowledgeAllConfirmDialog()\"\n [disabled]=\"notificationSaving() || visibleNotifications().length === 0\"\n title=\"Đánh dấu tất cả đã đọc\"\n >\n <i class=\"pi pi-check\" aria-hidden=\"true\"></i>\n Đã đọc tất cả\n </button>\n <button\n type=\"button\"\n class=\"dialog-close\"\n (click)=\"closeNotificationListDialog()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"hero-notification-list-dialog__body\">\n @if (visibleNotifications().length > 0) {\n <ul class=\"hero-notification__list\">\n @for (notice of visibleNotifications(); track notice) {\n <li class=\"hero-notification__item\">\n <div class=\"hero-notification__avatar\" aria-hidden=\"true\">\n {{ notice.user | slice: 0 : 2 | uppercase }}\n </div>\n <div class=\"hero-notification__body\">\n <div class=\"hero-notification__body-head\">\n <span class=\"hero-notification__author\">{{ notice.user }}</span>\n </div>\n <p class=\"hero-notification__content\">{{ notice.content }}</p>\n @if (notice.createdAt) {\n <span class=\"hero-notification__created\">{{\n formatNotificationCreatedAt(notice.createdAt)\n }}</span>\n }\n </div>\n <div class=\"hero-notification__item-actions\">\n <button\n type=\"button\"\n class=\"hero-notification__ack-top\"\n (click)=\"acknowledgeNotification(notice)\"\n [disabled]=\"notificationSaving()\"\n aria-label=\"Đã đọc thông báo\"\n title=\"Đã đọc\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n @if (canDeleteNotification(notice)) {\n <button\n type=\"button\"\n class=\"hero-notification__delete\"\n (click)=\"deleteNotification(notice)\"\n [disabled]=\"notificationSaving()\"\n aria-label=\"Xóa thông báo\"\n title=\"Xóa thông báo\"\n >\n <i class=\"pi pi-trash\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </li>\n }\n </ul>\n } @else {\n <div class=\"hero-notification__empty\">\n <i class=\"pi pi-bell hero-notification__empty-icon\" aria-hidden=\"true\"></i>\n <span class=\"hero-notification__empty-title\">Không có thông báo mới</span>\n <span class=\"hero-notification__empty-sub\"\n >Mọi thứ đều ổn. Thông báo mới sẽ xuất hiện ở đây.</span\n >\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n @if (acknowledgeAllConfirmDialogOpen()) {\n <div\n class=\"dialog-overlay dialog-overlay--front\"\n (click)=\"closeAcknowledgeAllConfirmDialog()\"\n >\n <div\n class=\"dialog ack-all-confirm-dialog\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"ack-all-confirm-title\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"ack-all-confirm-dialog__icon-wrap\" aria-hidden=\"true\">\n <i class=\"pi pi-check-circle\"></i>\n </div>\n <h2 id=\"ack-all-confirm-title\" class=\"ack-all-confirm-dialog__title\">\n Đánh dấu tất cả đã đọc?\n </h2>\n <p class=\"ack-all-confirm-dialog__desc\">\n Tất cả {{ visibleNotifications().length }} thông báo sẽ được đánh dấu đã đọc và ẩn\n khỏi danh sách.\n </p>\n <div class=\"ack-all-confirm-dialog__actions\">\n <button\n type=\"button\"\n class=\"btn ghost\"\n (click)=\"closeAcknowledgeAllConfirmDialog()\"\n [disabled]=\"notificationSaving()\"\n >\n Hủy\n </button>\n <button\n type=\"button\"\n class=\"btn ack-all-confirm-dialog__confirm-btn\"\n (click)=\"confirmAcknowledgeAll()\"\n [disabled]=\"notificationSaving()\"\n >\n <i class=\"pi pi-check\" aria-hidden=\"true\"></i>\n Xác nhận\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n </header>\n\n <main\n class=\"content\"\n [class.is-documents]=\"bottomTab() === 'documents'\"\n [class.is-weight]=\"bottomTab() === 'weight'\"\n [class.is-schedule]=\"bottomTab() === 'schedule'\"\n [class.is-mom]=\"bottomTab() === 'mom'\"\n [class.is-medical]=\"bottomTab() === 'medical'\"\n >\n <!--\n ============ TAB PANES ============\n Dùng `[hidden]` thay vì `*ngIf` để các tab cùng giữ trạng thái khi\n user qua lại: scroll position, search query đang gõ, viewMode, folder\n đang đứng, file đang chọn, draft đang nhập… đều không bị reset. Hệ\n quả: `<app-documents>` được mount 1 lần ở app load — `loadEntries()`\n chạy 1 lần, các lần switch tab kế tiếp không gọi API thêm.\n -->\n <!-- ============ TAB: DOCUMENTS ============ -->\n @if (explorerEnabled) {\n <div class=\"tab-pane tab-pane--documents\" [hidden]=\"bottomTab() !== 'documents'\">\n <app-documents></app-documents>\n </div>\n }\n\n <!-- ============ TAB: WEIGHT ============ -->\n <div class=\"tab-pane tab-pane--weight\" [hidden]=\"bottomTab() !== 'weight'\">\n <app-weight\n [user]=\"user()\"\n [birthDate]=\"profile()?.birthDate\"\n [gender]=\"profile()?.gender\"\n [babyName]=\"profile()?.babyName\"\n ></app-weight>\n </div>\n\n <!-- ============ TAB: LỊCH — Google Sheet tab \"Event\" ============ -->\n <div class=\"tab-pane tab-pane--schedule\" [hidden]=\"bottomTab() !== 'schedule'\">\n <app-feeding-schedule [user]=\"user()\"></app-feeding-schedule>\n </div>\n\n <!-- ============ TAB: TIỀN SỬ Y TẾ — Medical history V2 ============ -->\n <div class=\"tab-pane tab-pane--medical\" [hidden]=\"bottomTab() !== 'medical'\">\n <app-medical-history\n [user]=\"user()\"\n (openExplorerFile)=\"openMedicalAttachmentInDocuments($event)\"\n ></app-medical-history>\n </div>\n\n <!-- ============ TAB: MẸ ============ -->\n <div class=\"tab-pane tab-pane--mom\" [hidden]=\"bottomTab() !== 'mom'\">\n <app-feeding-mom\n [profile]=\"profile()\"\n [editing]=\"editing()\"\n (goToFeeding)=\"setBottomTab('feeding')\"\n ></app-feeding-mom>\n </div>\n\n <!-- ============ TAB: FEEDING ============ -->\n <div class=\"tab-pane tab-pane--feeding\" [hidden]=\"bottomTab() !== 'feeding'\">\n <app-feeding-profile\n [user]=\"user()\"\n [profile]=\"profile()\"\n [draft]=\"draft()\"\n [editing]=\"editing()\"\n [maxBirthDate]=\"maxBirthDate\"\n (save)=\"save()\"\n (cancelEdit)=\"cancelEdit()\"\n (startEdit)=\"startEdit()\"\n (clearProfile)=\"clearProfile()\"\n (draftNameChange)=\"updateDraftName($event)\"\n (draftBirthChange)=\"updateDraftBirth($event)\"\n (draftGenderChange)=\"setDraftGender($event)\"\n />\n\n @if (profile() && !editing() && ageBreakdown()) {\n <app-feeding-daily\n [logs]=\"logs()\"\n [feedingSettings]=\"feedingSettings()\"\n [now]=\"now()\"\n [nutritionTarget]=\"nutritionTarget()\"\n [user]=\"user()\"\n [syncMessage]=\"syncMessage()\"\n [syncError]=\"syncError()\"\n [logDialogOpen]=\"logDialogOpen()\"\n [loadingLogs]=\"loadingLogs()\"\n [refreshToken]=\"dailyRefreshToken()\"\n (logsChanged)=\"onFeedingLogsChanged()\"\n (bottlePrepChange)=\"bottlePrep.set($event)\"\n (editLog)=\"feedingDialogs.openEditDialog($event)\"\n (historyOpen)=\"feedingDialogs.openHistoryDialog($event.filter, $event.dateStr)\"\n (feedRowClick)=\"feedingDialogs.onFeedRowClick($event)\"\n >\n <app-feeding-charts\n data-feeding-charts\n [logs]=\"logs()\"\n [now]=\"now()\"\n [nutritionTarget]=\"nutritionTarget()\"\n />\n </app-feeding-daily>\n <app-feeding-nutrition\n [nutritionTarget]=\"nutritionTarget()\"\n [todayStats]=\"todayStats()\"\n [now]=\"now()\"\n [latestWeightKg]=\"latestWeightKgFromSheet()\"\n [editing]=\"editing()\"\n (goToWeight)=\"setBottomTab('weight')\"\n />\n <footer class=\"disclaimer\">\n <i class=\"pi pi-info-circle\"></i>\n Thông tin trong app chỉ mang tính tham khảo, không thay thế cho tư vấn của bác sĩ. Nếu\n bé có bất kỳ dấu hiệu bất thường nào, hãy đi khám ngay.\n </footer>\n }\n\n <!-- ============ FAB (add feeding log) ============ -->\n @if (profile() && !editing()) {\n <button\n type=\"button\"\n class=\"fab\"\n (click)=\"feedingDialogs.openLogDialog()\"\n aria-label=\"Ghi nhận cữ bú\"\n title=\"Ghi nhận cữ bú mới\"\n >\n <i class=\"pi pi-plus\"></i>\n <span class=\"fab-label\">Ghi cữ bú</span>\n </button>\n }\n </div>\n <!-- /.tab-pane--feeding -->\n </main>\n </div>\n <!-- /.feeding-page -->\n\n <!-- ============ BOTTOM NAVIGATION ============ -->\n <nav\n class=\"bottom-nav\"\n role=\"tablist\"\n aria-label=\"Điều hướng chính\"\n [style.--bn-cols]=\"navTabs().length\"\n [style.--active-index]=\"activeTabIndex()\"\n >\n @for (tab of navTabs(); track tab.id) {\n <button\n type=\"button\"\n class=\"bn-item\"\n role=\"tab\"\n [attr.aria-selected]=\"bottomTab() === tab.id\"\n [class.active]=\"bottomTab() === tab.id\"\n (click)=\"setBottomTab(tab.id)\"\n >\n <span class=\"bn-icon-wrap\">\n <i class=\"pi {{ tab.icon }} bn-icon\" aria-hidden=\"true\"></i>\n </span>\n <span class=\"bn-label\">{{ tab.label }}</span>\n </button>\n }\n </nav>\n\n <!-- About -->\n @if (aboutDialogOpen()) {\n <div class=\"dialog-overlay dialog-overlay--front\" (click)=\"closeAboutDialog()\">\n <div\n class=\"dialog about-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"feeding-about-title\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"dialog-head about-dialog__head\">\n <h2 id=\"feeding-about-title\" class=\"about-dialog__title\">\n <i class=\"pi pi-info-circle\" aria-hidden=\"true\"></i>\n About\n </h2>\n <button type=\"button\" class=\"dialog-close\" (click)=\"closeAboutDialog()\" aria-label=\"Đóng\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <dl class=\"about-dialog__meta\">\n <div class=\"about-dialog__row\">\n <dt>Ứng dụng</dt>\n <dd>{{ appInfo.name }}</dd>\n </div>\n <div class=\"about-dialog__row\">\n <dt>Phiên bản</dt>\n <dd>\n <code>{{ appInfo.version }}</code>\n </dd>\n </div>\n </dl>\n <div class=\"dialog-actions\">\n <button type=\"button\" class=\"btn primary\" (click)=\"closeAboutDialog()\">Đóng</button>\n </div>\n </div>\n </div>\n }\n\n <!-- Nhắc sự kiện lịch (sheet Event + Settings) -->\n @if (eventReminderDialogOpen() && scheduleReminderEvents().length > 0) {\n <div\n class=\"dialog-overlay dialog-overlay--front dialog-overlay--event-reminder\"\n (click)=\"closeEventReminderDialog()\"\n >\n <div\n class=\"dialog event-reminder-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"dialog-head event-reminder-dialog__head\">\n <h2 class=\"event-reminder-dialog__title\">\n <i class=\"pi pi-bell\" aria-hidden=\"true\"></i>\n Bạn có lịch sắp tới\n </h2>\n <button\n type=\"button\"\n class=\"dialog-close\"\n (click)=\"closeEventReminderDialog()\"\n aria-label=\"Đóng\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n <ul class=\"event-reminder-list\">\n @for (ev of scheduleReminderEvents(); track ev) {\n <li>\n <article class=\"event-reminder-card\">\n <h3 class=\"event-reminder-card__title\">{{ ev.title }}</h3>\n <p class=\"event-reminder-card__datetime\">\n <span class=\"event-reminder-card__date\">{{ formatReminderEventWhen(ev) }}</span>\n <span class=\"event-reminder-card__sep\" aria-hidden=\"true\"> – </span>\n <span class=\"event-reminder-card__hour\">{{\n formatReminderEventTime(ev.time)\n }}</span>\n </p>\n @if (ev.place) {\n <p class=\"event-reminder-card__place\">\n <i class=\"pi pi-map-marker\" aria-hidden=\"true\"></i>\n <span>{{ ev.place }}</span>\n </p>\n }\n @if (ev.note) {\n <div class=\"event-reminder-card__content-wrap\">\n <span class=\"event-reminder-card__content-label\">Nội dung</span>\n <p class=\"event-reminder-card__content\">{{ ev.note }}</p>\n </div>\n }\n </article>\n </li>\n }\n </ul>\n <div class=\"dialog-actions event-reminder-actions\">\n <button\n type=\"button\"\n class=\"event-reminder-actions__link\"\n (click)=\"acknowledgeAllEventReminders()\"\n >\n Không nhắc lại\n </button>\n <button\n type=\"button\"\n class=\"btn primary event-reminder-actions__primary\"\n (click)=\"skipEventReminderSession()\"\n >\n Đã hiểu\n </button>\n </div>\n </div>\n </div>\n }\n\n <app-feeding-dialogs\n #feedingDialogs\n [logs]=\"logs()\"\n [user]=\"user()\"\n [now]=\"now()\"\n [bottlePrep]=\"bottlePrep()\"\n [feedingSettings]=\"feedingSettings()\"\n [prediction]=\"prediction()\"\n [todayStats]=\"todayStats()\"\n [yesterdayStats]=\"yesterdayStats()\"\n [todayLogs]=\"todayLogs()\"\n [yesterdayLogs]=\"yesterdayLogs()\"\n [maxBirthDate]=\"maxBirthDate\"\n [syncError]=\"syncError()\"\n [syncMessage]=\"syncMessage()\"\n (logsChanged)=\"onFeedingLogsChanged()\"\n (settingsChanged)=\"onFeedingSettingsChanged($event)\"\n (syncErrorChange)=\"syncError.set($event)\"\n (syncMessageChange)=\"syncMessage.set($event)\"\n (logDialogOpenChange)=\"logDialogOpen.set($event)\"\n (bottlePrepClearRequested)=\"clearBottlePrep()\"\n />\n</div>\n<!-- /.feeding-root -->\n","/*\n * Public API Surface of @hbslovely/baby-feeding\n *\n * Re-export everything that consumers of the npm package need.\n * FeedingComponent is the primary entry point (the full journey).\n * Supporting services are exported so host apps can inject them and\n * share data with the journey.\n */\n\n// ── Root journey component ────────────────────────────────────────────────────\nexport { FeedingComponent } from './feeding-src/pages/feeding/feeding.component';\n\n// ── Tab / sub-components (for selective use) ─────────────────────────────────\nexport { FeedingDailyComponent } from './feeding-src/pages/feeding/daily/feeding-daily.component';\nexport { FeedingScheduleComponent } from './feeding-src/pages/feeding/schedule/feeding-schedule.component';\nexport { FeedingMomComponent } from './feeding-src/pages/feeding/mom/feeding-mom.component';\nexport { FeedingNutritionComponent } from './feeding-src/pages/feeding/nutrition/feeding-nutrition.component';\nexport { WeightComponent } from './feeding-src/pages/feeding/weight/weight.component';\nexport { MedicalHistoryComponent } from './feeding-src/pages/feeding/medical-history/medical-history.component';\nexport { DocumentsComponent } from './feeding-src/pages/feeding/documents/documents.component';\nexport { ActivityLogComponent } from './feeding-src/pages/feeding/activity-log/activity-log.component';\n\n// ── Data services ─────────────────────────────────────────────────────────────\nexport { FeedingLogService } from './feeding-src/services/feeding-log.service';\nexport { WeightLogService } from './feeding-src/services/weight-log.service';\nexport { EventLogService } from './feeding-src/services/event-log.service';\nexport { MedicalHistoryService } from './feeding-src/services/medical-history.service';\nexport { ActivityLogService } from './feeding-src/services/activity-log.service';\nexport { NotificationLogService } from './feeding-src/services/notification-log.service';\nexport { ExplorerService } from './feeding-src/services/explorer.service';\nexport { GoogleSheetsService } from './feeding-src/services/google-sheets.service';\n\n// ── Key model types ───────────────────────────────────────────────────────────\nexport type {\n FeedingLog,\n FeedingSettingsResolved,\n FeedingSettingRow,\n BottlePrepFromSheet,\n} from './feeding-src/services/feeding-log.service';\nexport { parseFeedingSettingsFromRows } from './feeding-src/services/feeding-log.service';\n\nexport type { WeightLog } from './feeding-src/services/weight-log.service';\nexport type { FeedingEventLog } from './feeding-src/services/event-log.service';\nexport type { MedicalHistoryEntry } from './feeding-src/services/medical-history.service';\nexport type {\n ActivityLogRow,\n ActivityLogEntry,\n} from './feeding-src/services/activity-log.service';\nexport {\n ACTIVITY_EVENT,\n formatLogContent,\n buildActivityLogMessageHtml,\n} from './feeding-src/services/activity-log.service';\nexport type { NotificationLog } from './feeding-src/services/notification-log.service';\n\n// ── Business logic utilities ──────────────────────────────────────────────────\nexport {\n predictNextFeeding,\n getDailySummaries,\n} from './feeding-src/pages/feeding/feeding-prediction';\nexport type { DailySummary } from './feeding-src/pages/feeding/feeding-prediction';\nexport { getNutritionTarget } from './feeding-src/pages/feeding/feeding-nutrition';\nexport type { NutritionTarget } from './feeding-src/pages/feeding/feeding-nutrition';\nexport { evaluateWeightForAge } from './feeding-src/pages/feeding/baby-weight-growth';\nexport { groupLogsByProximity } from './feeding-src/pages/feeding/feeding-view-group';\nexport type { FeedingViewGroup } from './feeding-src/pages/feeding/feeding-view-group';\n\n// ── App info token (for host app injection) ────────────────────────────────────\nexport { APP_INFO_TOKEN } from './feeding-src/app-info';\nexport type { AppInfo } from './feeding-src/app-info';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","EXPLORER_ROOT_ID","MEDICAL_FOLDER_NAME","growthStatusClassUtil"],"mappings":"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"}
|