@lichta/core 2.1.0 → 2.2.1

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.
package/dist/index.d.mts CHANGED
@@ -15,22 +15,14 @@ interface SolarDate {
15
15
  month: number;
16
16
  year: number;
17
17
  }
18
+ /** Một lần xuất hiện Tiết Khí (Solar Term) trong năm dương lịch */
19
+ interface SolarTerm {
20
+ index: number;
21
+ name: string;
22
+ date: SolarDate;
23
+ jd: number;
24
+ }
18
25
 
19
- /**
20
- * Chuyển ngày Gregorian sang Julian Day Number.
21
- *
22
- * @param dd - Ngày (1-31)
23
- * @param mm - Tháng (1-12)
24
- * @param yy - Năm
25
- */
26
- declare function jdFromDate(dd: number, mm: number, yy: number): number;
27
- /**
28
- * Chuyển Julian Day Number sang ngày Gregorian.
29
- *
30
- * @param jd - Julian Day Number
31
- * @returns Tuple [day, month, year]
32
- */
33
- declare function jdToDate(jd: number): [number, number, number];
34
26
  declare class LichTa {
35
27
  /**
36
28
  * Chuyển đổi ngày Dương lịch sang Âm lịch.
@@ -72,6 +64,62 @@ declare class LichTa {
72
64
  static toSolar(lunarDay: number, lunarMonth: number, lunarYear: number, isLeap?: boolean, timeZone?: number): SolarDate;
73
65
  }
74
66
 
67
+ /**
68
+ * Thuật toán thiên văn nền tảng cho chuyển đổi Dương lịch ↔ Âm lịch Việt Nam
69
+ * Dựa trên công trình của Hồ Ngọc Đức (Đại học Leipzig)
70
+ * Tham khảo: Jean Meeus, "Astronomical Algorithms" (1998)
71
+ *
72
+ * Copyright (c) 2006 Ho Ngoc Duc. All Rights Reserved.
73
+ * TypeScript adaptation for Lichta library.
74
+ */
75
+ /**
76
+ * Chuyển ngày Gregorian sang Julian Day Number.
77
+ *
78
+ * @param dd - Ngày (1-31)
79
+ * @param mm - Tháng (1-12)
80
+ * @param yy - Năm
81
+ */
82
+ declare function jdFromDate(dd: number, mm: number, yy: number): number;
83
+ /**
84
+ * Chuyển Julian Day Number sang ngày Gregorian.
85
+ *
86
+ * @param jd - Julian Day Number
87
+ * @returns Tuple [day, month, year]
88
+ */
89
+ declare function jdToDate(jd: number): [number, number, number];
90
+
91
+ /** Một ô ngày trong lưới lịch tháng. */
92
+ interface CalendarDayCell {
93
+ solar: Date;
94
+ lunar: LunarDate;
95
+ isToday: boolean;
96
+ isSelected: boolean;
97
+ isCurrentMonth: boolean;
98
+ /** Số tuần trong năm (ISO-8601) của hàng chứa ô này — giống nhau cho cả 7 ô trong hàng. */
99
+ weekNumber: number;
100
+ }
101
+ /** Ngày bắt đầu tuần: 0 = Chủ Nhật (mặc định, giống `Date.getDay()`), 1 = Thứ Hai. */
102
+ type FirstDayOfWeek = 0 | 1;
103
+ /**
104
+ * Tính số tuần theo chuẩn ISO-8601: tuần bắt đầu Thứ Hai, tuần 1 của năm là
105
+ * tuần chứa Thứ Năm đầu tiên (tương đương: tuần chứa ngày 4/1).
106
+ */
107
+ declare function getISOWeekNumber(date: Date): number;
108
+ /**
109
+ * Dựng lưới 42 ô (6 tuần x 7 ngày) cho 1 tháng dương lịch, gồm ngày tràn từ
110
+ * tháng trước/sau để lấp đầy tuần đầu/cuối, mỗi ô kèm ngày âm tương ứng.
111
+ *
112
+ * Logic này trước đây bị lặp lại độc lập ở Calendar.tsx/vue/svelte — tách ra
113
+ * đây để có 1 nguồn tính toán duy nhất (tránh 3 bản có thể lệch nhau khi sửa
114
+ * riêng lẻ), dùng chung cho cả Calendar và DatePicker ở mọi framework.
115
+ *
116
+ * @param month - Tháng dương lịch (1-12)
117
+ * @param year - Năm dương lịch
118
+ * @param selectedDate - Ngày đang được chọn (nếu có), dùng để đánh dấu `isSelected`
119
+ * @param firstDayOfWeek - Ngày bắt đầu tuần: 0 = Chủ Nhật (mặc định), 1 = Thứ Hai
120
+ */
121
+ declare function getCalendarGrid(month: number, year: number, selectedDate?: Date | null, firstDayOfWeek?: FirstDayOfWeek): CalendarDayCell[];
122
+
75
123
  /**
76
124
  * Internationalization — Hỗ trợ song ngữ Việt-Anh
77
125
  */
@@ -93,6 +141,10 @@ declare function t(locale: Locale): {
93
141
  readonly yearLabel: "Năm";
94
142
  readonly monthLabel: "Tháng";
95
143
  readonly destiny: "Mệnh";
144
+ readonly solarTermNames: readonly ["Xuân Phân", "Thanh Minh", "Cốc Vũ", "Lập Hạ", "Tiểu Mãn", "Mang Chủng", "Hạ Chí", "Tiểu Thử", "Đại Thử", "Lập Thu", "Xử Thử", "Bạch Lộ", "Thu Phân", "Hàn Lộ", "Sương Giáng", "Lập Đông", "Tiểu Tuyết", "Đại Tuyết", "Đông Chí", "Tiểu Hàn", "Đại Hàn", "Lập Xuân", "Vũ Thủy", "Kinh Trập"];
145
+ readonly trucNames: readonly ["Kiến", "Trừ", "Mãn", "Bình", "Định", "Chấp", "Phá", "Nguy", "Thành", "Thu", "Khai", "Bế"];
146
+ readonly elementRelationNames: readonly ["Tương sinh", "Được sinh", "Tương khắc", "Bị khắc", "Tương hòa"];
147
+ readonly trucQualityNames: readonly ["Xấu", "Trung bình", "Tốt"];
96
148
  } | {
97
149
  readonly heavenlyStems: readonly ["Giáp", "Ất", "Bính", "Đinh", "Mậu", "Kỷ", "Canh", "Tân", "Nhâm", "Quý"];
98
150
  readonly earthlyBranches: readonly ["Tý", "Sửu", "Dần", "Mão", "Thìn", "Tỵ", "Ngọ", "Mùi", "Thân", "Dậu", "Tuất", "Hợi"];
@@ -106,6 +158,10 @@ declare function t(locale: Locale): {
106
158
  readonly yearLabel: "Year";
107
159
  readonly monthLabel: "Month";
108
160
  readonly destiny: "Destiny";
161
+ readonly solarTermNames: readonly ["Spring Equinox", "Clear and Bright", "Grain Rain", "Start of Summer", "Grain Full", "Grain in Ear", "Summer Solstice", "Minor Heat", "Major Heat", "Start of Autumn", "End of Heat", "White Dew", "Autumn Equinox", "Cold Dew", "Frost's Descent", "Start of Winter", "Minor Snow", "Major Snow", "Winter Solstice", "Minor Cold", "Major Cold", "Start of Spring", "Rain Water", "Awakening of Insects"];
162
+ readonly trucNames: readonly ["Kiến", "Trừ", "Mãn", "Bình", "Định", "Chấp", "Phá", "Nguy", "Thành", "Thu", "Khai", "Bế"];
163
+ readonly elementRelationNames: readonly ["Generates", "Generated By", "Overcomes", "Overcome By", "Same Element"];
164
+ readonly trucQualityNames: readonly ["Bad", "Neutral", "Good"];
109
165
  } | {
110
166
  readonly heavenlyStems: readonly ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"];
111
167
  readonly earthlyBranches: readonly ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"];
@@ -119,6 +175,10 @@ declare function t(locale: Locale): {
119
175
  readonly yearLabel: "年";
120
176
  readonly monthLabel: "月";
121
177
  readonly destiny: "命";
178
+ readonly solarTermNames: readonly ["春分", "清明", "穀雨", "立夏", "小満", "芒種", "夏至", "小暑", "大暑", "立秋", "処暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至", "小寒", "大寒", "立春", "雨水", "啓蟄"];
179
+ readonly trucNames: readonly ["建", "除", "満", "平", "定", "執", "破", "危", "成", "収", "開", "閉"];
180
+ readonly elementRelationNames: readonly ["相生", "被生", "相克", "被克", "比和"];
181
+ readonly trucQualityNames: readonly ["凶", "普通", "吉"];
122
182
  } | {
123
183
  readonly heavenlyStems: readonly ["갑", "을", "병", "정", "무", "기", "경", "신", "임", "계"];
124
184
  readonly earthlyBranches: readonly ["자", "축", "인", "묘", "진", "사", "오", "미", "신", "유", "술", "해"];
@@ -132,6 +192,10 @@ declare function t(locale: Locale): {
132
192
  readonly yearLabel: "년";
133
193
  readonly monthLabel: "월";
134
194
  readonly destiny: "명";
195
+ readonly solarTermNames: readonly ["춘분", "청명", "곡우", "입하", "소만", "망종", "하지", "소서", "대서", "입추", "처서", "백로", "추분", "한로", "상강", "입동", "소설", "대설", "동지", "소한", "대한", "입춘", "우수", "경칩"];
196
+ readonly trucNames: readonly ["건", "제", "만", "평", "정", "집", "파", "위", "성", "수", "개", "폐"];
197
+ readonly elementRelationNames: readonly ["상생", "피생", "상극", "피극", "비화"];
198
+ readonly trucQualityNames: readonly ["흉", "보통", "길"];
135
199
  };
136
200
  /**
137
201
  * Lấy tên con giáp theo locale
@@ -139,32 +203,13 @@ declare function t(locale: Locale): {
139
203
  * @param locale - Ngôn ngữ
140
204
  */
141
205
  declare function getZodiacAnimal(branchIndex: number, locale?: Locale): string;
142
-
143
- /** Kết quả trả về của {@link getYearDetails}. */
144
- interface YearDetails {
145
- can: string;
146
- chi: string;
147
- menh: string;
148
- fullString: string;
149
- }
150
206
  /**
151
- * Lấy ra chuỗi tả toàn bộ Can, Chi Mệnh dựa vào số năm (Ví dụ: 2024)
152
- * Theo quy ước: Năm 4 (sau CN) là năm Giáp Tý (Can index 0, Chi index 0)
153
- *
154
- * Công thức Can Chi là chu kỳ 60 năm lặp lại vô hạn nên nhận mọi số năm nguyên,
155
- * kể cả năm 0 hoặc âm (trước Công Nguyên) — không giới hạn phạm vi như
156
- * {@link LichTa.toLunar} (phạm vi đó là do thuật toán tìm Điểm Sóc, không áp
157
- * dụng cho công thức Can Chi thuần).
158
- *
159
- * @param year - Năm (số nguyên bất kỳ, kể cả 0 hoặc âm)
160
- *
161
- * @example
162
- * ```typescript
163
- * getYearDetails(2024);
164
- * // → { can: 'Giáp', chi: 'Thìn', menh: 'Thủy', fullString: 'Giáp Thìn - Mệnh Thủy' }
165
- * ```
207
+ * Lấy nhãn thứ trong tuần theo locale, xoay vòng theo ngày bắt đầu tuần.
208
+ * @param locale - Ngôn ngữ
209
+ * @param firstDayOfWeek - Ngày bắt đầu tuần: 0 = Chủ Nhật (mặc định), 1 = Thứ Hai
166
210
  */
167
- declare function getYearDetails(year: number): YearDetails;
211
+ declare function getWeekDayLabels(locale: Locale, firstDayOfWeek?: FirstDayOfWeek): string[];
212
+
168
213
  /**
169
214
  * Tính Can Chi ngày từ Julian Day Number.
170
215
  *
@@ -205,6 +250,247 @@ declare function getMonthCanChi(lunarMonth: number, lunarYear: number, locale?:
205
250
  * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi', giữ nguyên hành vi cũ)
206
251
  */
207
252
  declare function getHourCanChi(hour: number, dayJd: number, locale?: Locale): string;
253
+
254
+ /**
255
+ * Lấy tên Ngũ Hành theo index và locale.
256
+ *
257
+ * @param index - Index Ngũ Hành (0-4, vào FIVE_ELEMENTS: Kim, Mộc, Thủy, Hỏa, Thổ)
258
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
259
+ */
260
+ declare function getElementName(index: number, locale?: Locale): string;
261
+ /**
262
+ * Tính index Ngũ Hành Nạp Âm (0-4, vào FIVE_ELEMENTS) của ngày, dùng chung bảng
263
+ * Nạp Âm 60 Hoa Giáp với `getYearDetails` (almanac.ts). Chỉ số Can/Chi tính giống hệt
264
+ * {@link import('./can-chi.js').getDayCanChi}.
265
+ *
266
+ * @param jd - Julian Day Number
267
+ */
268
+ declare function getDayElementIndex(jd: number): number;
269
+ /**
270
+ * Tính Mệnh (Ngũ Hành Nạp Âm) của ngày theo locale (xem {@link getDayElementIndex}).
271
+ *
272
+ * @param jd - Julian Day Number
273
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
274
+ */
275
+ declare function getDayElement(jd: number, locale?: Locale): string;
276
+ /**
277
+ * Tính index Ngũ Hành Nạp Âm (0-4, vào FIVE_ELEMENTS) của tháng âm lịch. Chỉ số
278
+ * Can/Chi tính giống hệt {@link import('./can-chi.js').getMonthCanChi}.
279
+ *
280
+ * @param lunarMonth - Tháng âm lịch (1-12)
281
+ * @param lunarYear - Năm âm lịch
282
+ */
283
+ declare function getMonthElementIndex(lunarMonth: number, lunarYear: number): number;
284
+ /**
285
+ * Tính Mệnh (Ngũ Hành Nạp Âm) của tháng âm lịch theo locale (xem {@link getMonthElementIndex}).
286
+ *
287
+ * @param lunarMonth - Tháng âm lịch (1-12)
288
+ * @param lunarYear - Năm âm lịch
289
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
290
+ */
291
+ declare function getMonthElement(lunarMonth: number, lunarYear: number, locale?: Locale): string;
292
+ /**
293
+ * Tính index Ngũ Hành Nạp Âm (0-4, vào FIVE_ELEMENTS) của giờ. Chỉ số Can/Chi tính
294
+ * giống hệt {@link import('./can-chi.js').getHourCanChi}.
295
+ *
296
+ * @param hour - Giờ (0-23)
297
+ * @param dayJd - Julian Day Number của ngày
298
+ */
299
+ declare function getHourElementIndex(hour: number, dayJd: number): number;
300
+ /**
301
+ * Tính Mệnh (Ngũ Hành Nạp Âm) của giờ theo locale (xem {@link getHourElementIndex}).
302
+ *
303
+ * @param hour - Giờ (0-23)
304
+ * @param dayJd - Julian Day Number của ngày
305
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
306
+ */
307
+ declare function getHourElement(hour: number, dayJd: number, locale?: Locale): string;
308
+ /**
309
+ * Tính quan hệ Ngũ Hành từ `fromIndex` tới `toIndex`, trả về index 0-4:
310
+ * 0 = sinh (from sinh to) 2 = khắc (from khắc to) 4 = hòa (cùng hành)
311
+ * 1 = được sinh (to sinh from) 3 = bị khắc (to khắc from)
312
+ *
313
+ * Với 5 hành, 2 hành khác nhau bất kỳ luôn rơi vào đúng 1 trong 4 quan hệ trên
314
+ * (mỗi hành có đúng 1 hành sinh nó, 1 hành nó sinh, 1 hành khắc nó, 1 hành nó khắc)
315
+ * — không có trường hợp mơ hồ.
316
+ *
317
+ * @param fromIndex - Index Ngũ Hành thứ nhất (0-4, vào FIVE_ELEMENTS)
318
+ * @param toIndex - Index Ngũ Hành thứ hai (0-4, vào FIVE_ELEMENTS)
319
+ */
320
+ declare function getElementRelationIndex(fromIndex: number, toIndex: number): number;
321
+ /**
322
+ * Lấy tên quan hệ Ngũ Hành giữa 2 hành theo locale (xem {@link getElementRelationIndex}).
323
+ *
324
+ * @param fromIndex - Index Ngũ Hành thứ nhất (0-4, vào FIVE_ELEMENTS)
325
+ * @param toIndex - Index Ngũ Hành thứ hai (0-4, vào FIVE_ELEMENTS)
326
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
327
+ *
328
+ * @example
329
+ * ```typescript
330
+ * // Mộc (1) và Hỏa (3): Mộc sinh Hỏa
331
+ * getElementRelation(1, 3); // → 'Tương sinh'
332
+ * getElementRelation(3, 1); // → 'Được sinh' (từ góc nhìn của Hỏa: được Mộc sinh)
333
+ * ```
334
+ */
335
+ declare function getElementRelation(fromIndex: number, toIndex: number, locale?: Locale): string;
336
+
337
+ /**
338
+ * Tính index Trực (0-11: Kiến, Trừ, Mãn, Bình, Định, Chấp, Phá, Nguy, Thành, Thu, Khai, Bế)
339
+ * tại một ngày dương lịch (Julian Day Number).
340
+ *
341
+ * Theo đúng phép Kiến Trừ thập nhị khách truyền thống, mỗi Tiết trong 12 Tiết (Lập
342
+ * Xuân, Kinh Trập, Thanh Minh, ... — tức các index lẻ trong 24 Tiết Khí, xem
343
+ * {@link import('./tiet-khi.js').getSolarTermsInYear}) ứng với một Chi "Kiến" CỐ ĐỊNH
344
+ * (Lập Xuân → Kiến Dần, Kinh Trập → Kiến Mão, Thanh Minh → Kiến Thìn, ..., Tiểu Hàn →
345
+ * Kiến Sửu). Trực của một ngày = độ lệch giữa Chi của chính ngày đó và Chi Kiến của
346
+ * Tiết đang hiệu lực — KHÔNG phải số ngày đã trôi qua kể từ khi Tiết bắt đầu.
347
+ *
348
+ * Hai cách tính chỉ trùng nhau khi ngày bắt đầu Tiết tình cờ có đúng Chi Kiến của Tiết
349
+ * đó (không phải lúc nào cũng vậy — ví dụ Tiểu Thử 2026 rơi vào ngày Nhâm Ngọ chứ không
350
+ * phải ngày Mùi). Vì vậy KHÔNG được gán "Kiến" (index 0) cho chính ngày bắt đầu Tiết
351
+ * một cách mặc định.
352
+ *
353
+ * Cũng dùng Tiết (không dùng số tháng âm lịch) để neo, vì tháng nhuận âm lịch không
354
+ * tương ứng với một Tiết mới (dùng số tháng âm lịch sẽ cho kết quả sai trong các
355
+ * tháng nhuận).
356
+ *
357
+ * Dùng `getSolarTermOccurrencesInYear` (dữ liệu thô, có cache theo năm+timeZone)
358
+ * thay vì `getSolarTermsInYear` công khai — tránh tính tên/locale không cần dùng
359
+ * tới, và tránh quét lại kinh độ Mặt Trời mỗi lần gọi khi hàm này được gọi lặp lại
360
+ * cho nhiều ngày cùng năm (vd. dựng lịch Trực cho cả tháng/năm).
361
+ *
362
+ * @param jd - Julian Day Number của ngày cần tra
363
+ * @param timeZone - Múi giờ (mặc định: 7 cho GMT+7 Việt Nam)
364
+ */
365
+ declare function getTrucIndex(jd: number, timeZone?: number): number;
366
+ /**
367
+ * Lấy tên Trực theo index và locale.
368
+ *
369
+ * @param index - Index Trực (0-11, xem {@link getTrucIndex})
370
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
371
+ */
372
+ declare function getTrucName(index: number, locale?: Locale): string;
373
+ /**
374
+ * Lấy tên Trực tại một ngày dương lịch (Julian Day Number).
375
+ *
376
+ * @param jd - Julian Day Number của ngày cần tra
377
+ * @param timeZone - Múi giờ (mặc định: 7 cho GMT+7 Việt Nam)
378
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
379
+ */
380
+ declare function getTruc(jd: number, timeZone?: number, locale?: Locale): string;
381
+ /**
382
+ * Lấy index mức tốt/xấu (0-2) của một Trực — xem giải thích độ tin cậy ở
383
+ * {@link TRUC_QUALITY_INDEX}.
384
+ *
385
+ * @param trucIndex - Index Trực (0-11, xem {@link getTrucIndex})
386
+ */
387
+ declare function getTrucQualityIndex(trucIndex: number): number;
388
+ /**
389
+ * Lấy tên mức tốt/xấu của một Trực theo locale (xem {@link getTrucQualityIndex}).
390
+ *
391
+ * @param trucIndex - Index Trực (0-11, xem {@link getTrucIndex})
392
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
393
+ */
394
+ declare function getTrucQuality(trucIndex: number, locale?: Locale): string;
395
+ /**
396
+ * Lấy Chi đối xung (Lục Xung) với một Chi cho trước — 2 Chi cách nhau đúng 6 vị
397
+ * trí trong vòng tròn 12 Chi: Tý-Ngọ, Sửu-Mùi, Dần-Thân, Mão-Dậu, Thìn-Tuất, Tỵ-Hợi.
398
+ *
399
+ * @param branchIndex - Index Địa Chi (0-11, vào EARTHLY_BRANCHES)
400
+ * @returns Index Địa Chi đối xung
401
+ */
402
+ declare function getXungBranchIndex(branchIndex: number): number;
403
+ /**
404
+ * Kiểm tra 2 Chi (tuổi) có phạm Lục Xung với nhau không.
405
+ *
406
+ * @param branchIndexA - Index Địa Chi thứ nhất (0-11)
407
+ * @param branchIndexB - Index Địa Chi thứ hai (0-11)
408
+ */
409
+ declare function isXung(branchIndexA: number, branchIndexB: number): boolean;
410
+ /**
411
+ * Lấy Chi bị Lục Hại với một Chi cho trước (xem {@link HAI_BRANCH_TARGET}).
412
+ *
413
+ * @param branchIndex - Index Địa Chi (0-11, vào EARTHLY_BRANCHES)
414
+ * @returns Index Địa Chi bị hại
415
+ */
416
+ declare function getHaiBranchIndex(branchIndex: number): number;
417
+ /**
418
+ * Kiểm tra 2 Chi (tuổi) có phạm Lục Hại với nhau không.
419
+ *
420
+ * @param branchIndexA - Index Địa Chi thứ nhất (0-11)
421
+ * @param branchIndexB - Index Địa Chi thứ hai (0-11)
422
+ */
423
+ declare function isHai(branchIndexA: number, branchIndexB: number): boolean;
424
+ /**
425
+ * Lấy nhóm Tứ Hành Xung (0-2) chứa một Chi cho trước.
426
+ *
427
+ * @param branchIndex - Index Địa Chi (0-11, vào EARTHLY_BRANCHES)
428
+ * @returns Index nhóm (0-2, xem {@link getTuHanhXungGroupMembers})
429
+ */
430
+ declare function getTuHanhXungGroupIndex(branchIndex: number): number;
431
+ /**
432
+ * Lấy 4 Chi thuộc cùng nhóm Tứ Hành Xung với một Chi cho trước (bao gồm cả chính nó).
433
+ *
434
+ * @param branchIndex - Index Địa Chi (0-11, vào EARTHLY_BRANCHES)
435
+ * @returns Mảng 4 index Địa Chi cùng nhóm
436
+ */
437
+ declare function getTuHanhXungGroupMembers(branchIndex: number): number[];
438
+ /**
439
+ * Kiểm tra 2 Chi (tuổi) khác nhau có cùng nhóm Tứ Hành Xung không.
440
+ *
441
+ * @param branchIndexA - Index Địa Chi thứ nhất (0-11)
442
+ * @param branchIndexB - Index Địa Chi thứ hai (0-11)
443
+ */
444
+ declare function isTuHanhXung(branchIndexA: number, branchIndexB: number): boolean;
445
+ /** Kết quả trả về của {@link getZodiacConflicts}. */
446
+ interface ZodiacConflicts {
447
+ xung: boolean;
448
+ hai: boolean;
449
+ tuHanhXung: boolean;
450
+ }
451
+ /**
452
+ * Kiểm tra toàn bộ quan hệ "kỵ tuổi" (Lục Xung, Lục Hại, Tứ Hành Xung) giữa 2 tuổi
453
+ * (Chi năm sinh). Không loại trừ lẫn nhau — 1 cặp Chi có thể vừa Lục Xung vừa cùng
454
+ * nhóm Tứ Hành Xung (vd. Tý-Ngọ là cả 2).
455
+ *
456
+ * @param branchIndexA - Index Địa Chi (con giáp) thứ nhất (0-11)
457
+ * @param branchIndexB - Index Địa Chi (con giáp) thứ hai (0-11)
458
+ *
459
+ * @example
460
+ * ```typescript
461
+ * getZodiacConflicts(0, 6); // Tý (0) và Ngọ (6)
462
+ * // → { xung: true, hai: false, tuHanhXung: true }
463
+ * ```
464
+ */
465
+ declare function getZodiacConflicts(branchIndexA: number, branchIndexB: number): ZodiacConflicts;
466
+
467
+ /** Kết quả trả về của {@link getYearDetails}. */
468
+ interface YearDetails {
469
+ can: string;
470
+ chi: string;
471
+ menh: string;
472
+ /** Index Ngũ Hành của `menh` (0-4, vào FIVE_ELEMENTS) — dùng cho `getElementRelation` (ngu-hanh.ts). */
473
+ menhIndex: number;
474
+ fullString: string;
475
+ }
476
+ /**
477
+ * Lấy ra chuỗi mô tả toàn bộ Can, Chi và Mệnh dựa vào số năm (Ví dụ: 2024)
478
+ * Theo quy ước: Năm 4 (sau CN) là năm Giáp Tý (Can index 0, Chi index 0)
479
+ *
480
+ * Công thức Can Chi là chu kỳ 60 năm lặp lại vô hạn nên nhận mọi số năm nguyên,
481
+ * kể cả năm 0 hoặc âm (trước Công Nguyên) — không giới hạn phạm vi như
482
+ * `LichTa.toLunar` (phạm vi đó là do thuật toán tìm Điểm Sóc, không áp
483
+ * dụng cho công thức Can Chi thuần).
484
+ *
485
+ * @param year - Năm (số nguyên bất kỳ, kể cả 0 hoặc âm)
486
+ *
487
+ * @example
488
+ * ```typescript
489
+ * getYearDetails(2024);
490
+ * // → { can: 'Giáp', chi: 'Thìn', menh: 'Hỏa', menhIndex: 3, fullString: 'Giáp Thìn - Mệnh Hỏa' }
491
+ * ```
492
+ */
493
+ declare function getYearDetails(year: number): YearDetails;
208
494
  /**
209
495
  * Lấy danh sách 6 giờ Hoàng Đạo trong ngày.
210
496
  * Giờ Hoàng Đạo phụ thuộc vào Địa Chi của ngày.
@@ -226,6 +512,65 @@ declare function getAuspiciousHours(dayJd: number, locale?: Locale): string[];
226
512
  * @returns Mảng 6 index Địa Chi (ví dụ: [0, 1, 3, 6, 7, 9])
227
513
  */
228
514
  declare function getAuspiciousHourIndices(dayJd: number): number[];
515
+ /**
516
+ * Lấy index (0-11, theo thứ tự Địa Chi Tý→Hợi) của 6 giờ Hắc Đạo (giờ xấu) trong
517
+ * ngày — phần bù của {@link getAuspiciousHourIndices} trong 12 canh giờ (6 giờ
518
+ * Hoàng Đạo + 6 giờ Hắc Đạo = đủ 12 canh).
519
+ *
520
+ * @param dayJd - Julian Day Number của ngày
521
+ * @returns Mảng 6 index Địa Chi, tăng dần
522
+ */
523
+ declare function getInauspiciousHourIndices(dayJd: number): number[];
524
+ /**
525
+ * Lấy danh sách 6 giờ Hắc Đạo (giờ xấu) trong ngày theo locale (xem
526
+ * {@link getInauspiciousHourIndices}).
527
+ *
528
+ * @param dayJd - Julian Day Number của ngày
529
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
530
+ * @returns Mảng 6 chuỗi tên Địa Chi
531
+ */
532
+ declare function getInauspiciousHours(dayJd: number, locale?: Locale): string[];
533
+
534
+ /**
535
+ * Lấy tên Tiết Khí theo index và locale.
536
+ *
537
+ * @param index - Index Tiết Khí (0-23, xem {@link getSolarTermIndex} trong astronomical.ts;
538
+ * 0 = Xuân Phân, 18 = Đông Chí, 21 = Lập Xuân, ...)
539
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
540
+ */
541
+ declare function getSolarTermName(index: number, locale?: Locale): string;
542
+ /**
543
+ * Lấy Tiết Khí đang hiệu lực tại một ngày dương lịch cho trước.
544
+ *
545
+ * `getSolarTermIndex` (astronomical.ts) trả về kinh độ Mặt Trời tại thời điểm 00:00 (đầu
546
+ * ngày) của `jdn`. Theo quy ước almanac truyền thống, một ngày được tính là "ngày
547
+ * Tiết Khí X" nếu thời điểm chuyển Tiết Khí rơi vào bất kỳ lúc nào trong ngày đó —
548
+ * tức là dùng giá trị tại 00:00 của ngày **kế tiếp** mới phản ánh đúng Tiết Khí đã
549
+ * "chốt" cho ngày hiện tại. Vì vậy hàm này tra cứu tại `jd + 1`, không phải `jd`.
550
+ *
551
+ * @param day - Ngày dương lịch (1-31)
552
+ * @param month - Tháng dương lịch (1-12)
553
+ * @param year - Năm dương lịch
554
+ * @param timeZone - Múi giờ (mặc định: 7 cho GMT+7 Việt Nam)
555
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
556
+ *
557
+ * @example
558
+ * ```typescript
559
+ * getSolarTerm(21, 6, 2024);
560
+ * // → { index: 6, name: 'Hạ Chí', date: { day: 21, month: 6, year: 2024 }, jd: ... }
561
+ * ```
562
+ */
563
+ declare function getSolarTerm(day: number, month: number, year: number, timeZone?: number, locale?: Locale): SolarTerm;
564
+ /**
565
+ * Liệt kê toàn bộ Tiết Khí bắt đầu trong một năm dương lịch (thường 24 hoặc 25 lần
566
+ * xuất hiện tùy năm, do các Tiết Khí không rơi đúng vào ranh giới năm).
567
+ *
568
+ * @param year - Năm dương lịch
569
+ * @param timeZone - Múi giờ (mặc định: 7 cho GMT+7 Việt Nam)
570
+ * @param locale - Ngôn ngữ hiển thị (mặc định: 'vi')
571
+ * @returns Mảng {@link SolarTerm} theo thứ tự thời gian tăng dần
572
+ */
573
+ declare function getSolarTermsInYear(year: number, timeZone?: number, locale?: Locale): SolarTerm[];
229
574
 
230
575
  /**
231
576
  * Lấy tên tháng âm lịch dạng chữ truyền thống.
@@ -302,26 +647,4 @@ declare function formatLunarDate(lunar: LunarDate, pattern: string, locale?: Loc
302
647
  */
303
648
  declare function formatTraditional(lunar: LunarDate): string;
304
649
 
305
- /** Một ô ngày trong lưới lịch tháng. */
306
- interface CalendarDayCell {
307
- solar: Date;
308
- lunar: LunarDate;
309
- isToday: boolean;
310
- isSelected: boolean;
311
- isCurrentMonth: boolean;
312
- }
313
- /**
314
- * Dựng lưới 42 ô (6 tuần x 7 ngày) cho 1 tháng dương lịch, gồm ngày tràn từ
315
- * tháng trước/sau để lấp đầy tuần đầu/cuối, mỗi ô kèm ngày âm tương ứng.
316
- *
317
- * Logic này trước đây bị lặp lại độc lập ở Calendar.tsx/vue/svelte — tách ra
318
- * đây để có 1 nguồn tính toán duy nhất (tránh 3 bản có thể lệch nhau khi sửa
319
- * riêng lẻ), dùng chung cho cả Calendar và DatePicker ở mọi framework.
320
- *
321
- * @param month - Tháng dương lịch (1-12)
322
- * @param year - Năm dương lịch
323
- * @param selectedDate - Ngày đang được chọn (nếu có), dùng để đánh dấu `isSelected`
324
- */
325
- declare function getCalendarGrid(month: number, year: number, selectedDate?: Date | null): CalendarDayCell[];
326
-
327
- export { type CalendarDayCell, LichTa, type Locale, type LunarDate, type SolarDate, type YearDetails, formatLunarDate, formatTraditional, getAuspiciousHourIndices, getAuspiciousHours, getCalendarGrid, getDayCanChi, getDayName, getHourCanChi, getMonthCanChi, getMonthName, getYearDetails, getZodiacAnimal, jdFromDate, jdToDate, t };
650
+ export { type CalendarDayCell, type FirstDayOfWeek, LichTa, type Locale, type LunarDate, type SolarDate, type SolarTerm, type YearDetails, type ZodiacConflicts, formatLunarDate, formatTraditional, getAuspiciousHourIndices, getAuspiciousHours, getCalendarGrid, getDayCanChi, getDayElement, getDayElementIndex, getDayName, getElementName, getElementRelation, getElementRelationIndex, getHaiBranchIndex, getHourCanChi, getHourElement, getHourElementIndex, getISOWeekNumber, getInauspiciousHourIndices, getInauspiciousHours, getMonthCanChi, getMonthElement, getMonthElementIndex, getMonthName, getSolarTerm, getSolarTermName, getSolarTermsInYear, getTruc, getTrucIndex, getTrucName, getTrucQuality, getTrucQualityIndex, getTuHanhXungGroupIndex, getTuHanhXungGroupMembers, getWeekDayLabels, getXungBranchIndex, getYearDetails, getZodiacAnimal, getZodiacConflicts, isHai, isTuHanhXung, isXung, jdFromDate, jdToDate, t };