lichta 1.0.0-beta
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/README.md +245 -0
- package/dist/components/Calendar.svelte +437 -0
- package/dist/components/Calendar.svelte.d.ts +33 -0
- package/dist/components/Formatter.svelte +57 -0
- package/dist/components/Formatter.svelte.d.ts +8 -0
- package/dist/constants/earthly-branches.d.ts +31 -0
- package/dist/constants/earthly-branches.js +42 -0
- package/dist/constants/five-elements.d.ts +9 -0
- package/dist/constants/five-elements.js +9 -0
- package/dist/constants/heavenly-stems.d.ts +19 -0
- package/dist/constants/heavenly-stems.js +24 -0
- package/dist/constants/i18n.d.ts +59 -0
- package/dist/constants/i18n.js +65 -0
- package/dist/core/feng-shui.d.ts +55 -0
- package/dist/core/feng-shui.js +116 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +4 -0
- package/dist/core/lunar.d.ts +73 -0
- package/dist/core/lunar.js +335 -0
- package/dist/core/types.d.ts +17 -0
- package/dist/core/types.js +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +14 -0
- package/dist/utils/format.d.ts +74 -0
- package/dist/utils/format.js +150 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +2 -0
- package/package.json +94 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { LichTa } from '../core/lunar.js';
|
|
3
|
+
import type { LunarDate } from '../core/types.js';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
|
|
6
|
+
// Props nhận vào từ consumer ứng dụng
|
|
7
|
+
interface Props {
|
|
8
|
+
date?: Date;
|
|
9
|
+
children?: Snippet;
|
|
10
|
+
}
|
|
11
|
+
let { date = new Date(), children }: Props = $props();
|
|
12
|
+
|
|
13
|
+
// Khai báo biến reactive tự động tính toán lại khi `date` thay đổi
|
|
14
|
+
let lunar: LunarDate = $derived.by(() => {
|
|
15
|
+
const d = date.getDate();
|
|
16
|
+
const m = date.getMonth() + 1; // Tháng trong JS tính từ 0
|
|
17
|
+
const y = date.getFullYear();
|
|
18
|
+
return LichTa.toLunar(d, m, y);
|
|
19
|
+
});
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<div class="lich-ta-formatter">
|
|
23
|
+
<div class="lunar-display-banner">
|
|
24
|
+
<span class="lunar-date">Ngày {lunar.day} tháng {lunar.month} (Âm lịch)</span>
|
|
25
|
+
<span class="can-chi-details">Năm {lunar.yearCanChi}</span>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div class="control-slot-wrapper">
|
|
29
|
+
{@render children?.()}
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<style>
|
|
34
|
+
.lich-ta-formatter {
|
|
35
|
+
display: block;
|
|
36
|
+
width: 100%;
|
|
37
|
+
box-sizing: border-box;
|
|
38
|
+
}
|
|
39
|
+
.lunar-display-banner {
|
|
40
|
+
padding: 12px;
|
|
41
|
+
background-color: #fcfaf7;
|
|
42
|
+
border-left: 4px solid #d4a373;
|
|
43
|
+
margin-bottom: 16px;
|
|
44
|
+
}
|
|
45
|
+
.lunar-date {
|
|
46
|
+
display: block;
|
|
47
|
+
font-weight: bold;
|
|
48
|
+
font-size: 1.1rem;
|
|
49
|
+
color: #1a1a1a;
|
|
50
|
+
}
|
|
51
|
+
.can-chi-details {
|
|
52
|
+
display: block;
|
|
53
|
+
font-size: 0.9rem;
|
|
54
|
+
color: #666666;
|
|
55
|
+
margin-top: 4px;
|
|
56
|
+
}
|
|
57
|
+
</style>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Earthly Branches (Địa Chi - 12 con giáp)
|
|
3
|
+
* Tý | Rat (Chuột)
|
|
4
|
+
* Sửu | Ox (Trâu)
|
|
5
|
+
* Dần | Tiger (Cọp)
|
|
6
|
+
* Mão | Rabbit (Thỏ)
|
|
7
|
+
* Thìn | Dragon (Rồng)
|
|
8
|
+
* Tỵ | Snake (Rắn)
|
|
9
|
+
* Ngọ | Horse (Ngựa)
|
|
10
|
+
* Mùi | Goat (Dê)
|
|
11
|
+
* Thân | Monkey (Khỉ)
|
|
12
|
+
* Dậu | Rooster (Gà)
|
|
13
|
+
* Tuất | Dog (Chó)
|
|
14
|
+
* Hợi | Pig (Heo)
|
|
15
|
+
*/
|
|
16
|
+
export declare const EARTHLY_BRANCHES: readonly ["Tý", "Sửu", "Dần", "Mão", "Thìn", "Tỵ", "Ngọ", "Mùi", "Thân", "Dậu", "Tuất", "Hợi"];
|
|
17
|
+
/**
|
|
18
|
+
* Tính trọng số của Địa Chi (dùng để tính Ngũ Hành)
|
|
19
|
+
* Chu kỳ lặp lại sau mỗi 6 Chi (index % 6)
|
|
20
|
+
*/
|
|
21
|
+
export declare function getBranchWeight(index: number): number;
|
|
22
|
+
/**
|
|
23
|
+
* Tính Dương - Âm (Yin - Yang) cho Địa Chi
|
|
24
|
+
* Index: 0 -> 1 (Dương) | 1 -> 0 (Âm) | ...
|
|
25
|
+
*/
|
|
26
|
+
export declare function getBranchYinYang(index: number): 1 | 0;
|
|
27
|
+
/**
|
|
28
|
+
* Tính Ngũ Hành cho Địa Chi
|
|
29
|
+
* Tý: 1 (Thủy Dương), Sửu: 12 (Thổ Âm), Dần: 3 (Mộc Dương), ...
|
|
30
|
+
*/
|
|
31
|
+
export declare function getBranchElement(index: number): number;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Earthly Branches (Địa Chi - 12 con giáp)
|
|
3
|
+
* Tý | Rat (Chuột)
|
|
4
|
+
* Sửu | Ox (Trâu)
|
|
5
|
+
* Dần | Tiger (Cọp)
|
|
6
|
+
* Mão | Rabbit (Thỏ)
|
|
7
|
+
* Thìn | Dragon (Rồng)
|
|
8
|
+
* Tỵ | Snake (Rắn)
|
|
9
|
+
* Ngọ | Horse (Ngựa)
|
|
10
|
+
* Mùi | Goat (Dê)
|
|
11
|
+
* Thân | Monkey (Khỉ)
|
|
12
|
+
* Dậu | Rooster (Gà)
|
|
13
|
+
* Tuất | Dog (Chó)
|
|
14
|
+
* Hợi | Pig (Heo)
|
|
15
|
+
*/
|
|
16
|
+
export const EARTHLY_BRANCHES = [
|
|
17
|
+
'Tý', 'Sửu', 'Dần', 'Mão', 'Thìn', 'Tỵ',
|
|
18
|
+
'Ngọ', 'Mùi', 'Thân', 'Dậu', 'Tuất', 'Hợi'
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Tính trọng số của Địa Chi (dùng để tính Ngũ Hành)
|
|
22
|
+
* Chu kỳ lặp lại sau mỗi 6 Chi (index % 6)
|
|
23
|
+
*/
|
|
24
|
+
export function getBranchWeight(index) {
|
|
25
|
+
const normalizedIndex = index % 6;
|
|
26
|
+
return Math.floor(normalizedIndex / 2);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Tính Dương - Âm (Yin - Yang) cho Địa Chi
|
|
30
|
+
* Index: 0 -> 1 (Dương) | 1 -> 0 (Âm) | ...
|
|
31
|
+
*/
|
|
32
|
+
export function getBranchYinYang(index) {
|
|
33
|
+
return (index % 2 === 0) ? 1 : 0;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Tính Ngũ Hành cho Địa Chi
|
|
37
|
+
* Tý: 1 (Thủy Dương), Sửu: 12 (Thổ Âm), Dần: 3 (Mộc Dương), ...
|
|
38
|
+
*/
|
|
39
|
+
export function getBranchElement(index) {
|
|
40
|
+
const weight = Math.floor(index / 2) + 1;
|
|
41
|
+
return weight === 5 ? 1 : weight;
|
|
42
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heavenly Stems (Thiên Can)
|
|
3
|
+
* Giáp (Dương) | Wood
|
|
4
|
+
* Ất (Âm) | Wood
|
|
5
|
+
* Bính (Dương) | Fire
|
|
6
|
+
* Đinh (Âm) | Fire
|
|
7
|
+
* Mậu (Dương) | Earth
|
|
8
|
+
* Kỷ (Âm) | Earth
|
|
9
|
+
* Canh (Dương) | Metal
|
|
10
|
+
* Tân (Âm) | Metal
|
|
11
|
+
* Nhâm (Dương) | Water
|
|
12
|
+
* Quý (Âm) | Water
|
|
13
|
+
*/
|
|
14
|
+
export declare const HEAVENLY_STEMS: readonly ["Giáp", "Ất", "Bính", "Đinh", "Mậu", "Kỷ", "Canh", "Tân", "Nhâm", "Quý"];
|
|
15
|
+
/**
|
|
16
|
+
* Tính trọng số của Thiên Can (dùng để tính Ngũ Hành)
|
|
17
|
+
* Index: 0, 1 -> 1 | 2, 3 -> 2 | ... | 8, 9 -> 5
|
|
18
|
+
*/
|
|
19
|
+
export declare function getStemWeight(index: number): number;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heavenly Stems (Thiên Can)
|
|
3
|
+
* Giáp (Dương) | Wood
|
|
4
|
+
* Ất (Âm) | Wood
|
|
5
|
+
* Bính (Dương) | Fire
|
|
6
|
+
* Đinh (Âm) | Fire
|
|
7
|
+
* Mậu (Dương) | Earth
|
|
8
|
+
* Kỷ (Âm) | Earth
|
|
9
|
+
* Canh (Dương) | Metal
|
|
10
|
+
* Tân (Âm) | Metal
|
|
11
|
+
* Nhâm (Dương) | Water
|
|
12
|
+
* Quý (Âm) | Water
|
|
13
|
+
*/
|
|
14
|
+
export const HEAVENLY_STEMS = [
|
|
15
|
+
'Giáp', 'Ất', 'Bính', 'Đinh', 'Mậu',
|
|
16
|
+
'Kỷ', 'Canh', 'Tân', 'Nhâm', 'Quý'
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Tính trọng số của Thiên Can (dùng để tính Ngũ Hành)
|
|
20
|
+
* Index: 0, 1 -> 1 | 2, 3 -> 2 | ... | 8, 9 -> 5
|
|
21
|
+
*/
|
|
22
|
+
export function getStemWeight(index) {
|
|
23
|
+
return Math.floor(index / 2) + 1;
|
|
24
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internationalization — Hỗ trợ song ngữ Việt-Anh
|
|
3
|
+
*/
|
|
4
|
+
export type Locale = 'vi' | 'en' | 'ja' | 'ko';
|
|
5
|
+
/**
|
|
6
|
+
* Lấy bộ dịch theo locale
|
|
7
|
+
* @param locale - Ngôn ngữ ('vi' | 'en' | 'ja' | 'ko')
|
|
8
|
+
*/
|
|
9
|
+
export declare function t(locale: Locale): {
|
|
10
|
+
readonly heavenlyStems: readonly ["Giáp", "Ất", "Bính", "Đinh", "Mậu", "Kỷ", "Canh", "Tân", "Nhâm", "Quý"];
|
|
11
|
+
readonly earthlyBranches: readonly ["Tý", "Sửu", "Dần", "Mão", "Thìn", "Tỵ", "Ngọ", "Mùi", "Thân", "Dậu", "Tuất", "Hợi"];
|
|
12
|
+
readonly fiveElements: readonly ["Kim", "Mộc", "Thủy", "Hỏa", "Thổ"];
|
|
13
|
+
readonly zodiacAnimals: readonly ["Chuột", "Trâu", "Cọp", "Thỏ", "Rồng", "Rắn", "Ngựa", "Dê", "Khỉ", "Gà", "Chó", "Heo"];
|
|
14
|
+
readonly monthNames: readonly ["Giêng", "Hai", "Ba", "Tư", "Năm", "Sáu", "Bảy", "Tám", "Chín", "Mười", "Một", "Chạp"];
|
|
15
|
+
readonly weekDays: readonly ["CN", "T2", "T3", "T4", "T5", "T6", "T7"];
|
|
16
|
+
readonly leapLabel: "Nhuận";
|
|
17
|
+
readonly yearLabel: "Năm";
|
|
18
|
+
readonly monthLabel: "Tháng";
|
|
19
|
+
readonly destiny: "Mệnh";
|
|
20
|
+
} | {
|
|
21
|
+
readonly heavenlyStems: readonly ["Giáp", "Ất", "Bính", "Đinh", "Mậu", "Kỷ", "Canh", "Tân", "Nhâm", "Quý"];
|
|
22
|
+
readonly earthlyBranches: readonly ["Tý", "Sửu", "Dần", "Mão", "Thìn", "Tỵ", "Ngọ", "Mùi", "Thân", "Dậu", "Tuất", "Hợi"];
|
|
23
|
+
readonly fiveElements: readonly ["Metal", "Wood", "Water", "Fire", "Earth"];
|
|
24
|
+
readonly zodiacAnimals: readonly ["Rat", "Ox", "Tiger", "Rabbit", "Dragon", "Snake", "Horse", "Goat", "Monkey", "Rooster", "Dog", "Pig"];
|
|
25
|
+
readonly monthNames: readonly ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
26
|
+
readonly weekDays: readonly ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
27
|
+
readonly leapLabel: "Leap";
|
|
28
|
+
readonly yearLabel: "Year";
|
|
29
|
+
readonly monthLabel: "Month";
|
|
30
|
+
readonly destiny: "Destiny";
|
|
31
|
+
} | {
|
|
32
|
+
readonly heavenlyStems: readonly ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"];
|
|
33
|
+
readonly earthlyBranches: readonly ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"];
|
|
34
|
+
readonly fiveElements: readonly ["金", "木", "水", "火", "土"];
|
|
35
|
+
readonly zodiacAnimals: readonly ["鼠", "牛", "虎", "兎", "竜", "蛇", "馬", "羊", "猿", "鶏", "犬", "猪"];
|
|
36
|
+
readonly monthNames: readonly ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"];
|
|
37
|
+
readonly weekDays: readonly ["日", "月", "火", "水", "木", "金", "土"];
|
|
38
|
+
readonly leapLabel: "閏";
|
|
39
|
+
readonly yearLabel: "年";
|
|
40
|
+
readonly monthLabel: "月";
|
|
41
|
+
readonly destiny: "命";
|
|
42
|
+
} | {
|
|
43
|
+
readonly heavenlyStems: readonly ["갑", "을", "병", "정", "무", "기", "경", "신", "임", "계"];
|
|
44
|
+
readonly earthlyBranches: readonly ["자", "축", "인", "묘", "진", "사", "오", "미", "신", "유", "술", "해"];
|
|
45
|
+
readonly fiveElements: readonly ["금", "목", "수", "화", "토"];
|
|
46
|
+
readonly zodiacAnimals: readonly ["쥐", "소", "호랑이", "토끼", "용", "뱀", "말", "양", "원숭이", "닭", "개", "돼지"];
|
|
47
|
+
readonly monthNames: readonly ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"];
|
|
48
|
+
readonly weekDays: readonly ["일", "월", "화", "수", "목", "금", "토"];
|
|
49
|
+
readonly leapLabel: "윤";
|
|
50
|
+
readonly yearLabel: "년";
|
|
51
|
+
readonly monthLabel: "월";
|
|
52
|
+
readonly destiny: "명";
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Lấy tên con giáp theo locale
|
|
56
|
+
* @param branchIndex - Index Địa Chi (0-11)
|
|
57
|
+
* @param locale - Ngôn ngữ
|
|
58
|
+
*/
|
|
59
|
+
export declare function getZodiacAnimal(branchIndex: number, locale?: Locale): string;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const translations = {
|
|
2
|
+
vi: {
|
|
3
|
+
heavenlyStems: ['Giáp', 'Ất', 'Bính', 'Đinh', 'Mậu', 'Kỷ', 'Canh', 'Tân', 'Nhâm', 'Quý'],
|
|
4
|
+
earthlyBranches: ['Tý', 'Sửu', 'Dần', 'Mão', 'Thìn', 'Tỵ', 'Ngọ', 'Mùi', 'Thân', 'Dậu', 'Tuất', 'Hợi'],
|
|
5
|
+
fiveElements: ['Kim', 'Mộc', 'Thủy', 'Hỏa', 'Thổ'],
|
|
6
|
+
zodiacAnimals: ['Chuột', 'Trâu', 'Cọp', 'Thỏ', 'Rồng', 'Rắn', 'Ngựa', 'Dê', 'Khỉ', 'Gà', 'Chó', 'Heo'],
|
|
7
|
+
monthNames: ['Giêng', 'Hai', 'Ba', 'Tư', 'Năm', 'Sáu', 'Bảy', 'Tám', 'Chín', 'Mười', 'Một', 'Chạp'],
|
|
8
|
+
weekDays: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
|
|
9
|
+
leapLabel: 'Nhuận',
|
|
10
|
+
yearLabel: 'Năm',
|
|
11
|
+
monthLabel: 'Tháng',
|
|
12
|
+
destiny: 'Mệnh',
|
|
13
|
+
},
|
|
14
|
+
en: {
|
|
15
|
+
heavenlyStems: ['Giáp', 'Ất', 'Bính', 'Đinh', 'Mậu', 'Kỷ', 'Canh', 'Tân', 'Nhâm', 'Quý'],
|
|
16
|
+
earthlyBranches: ['Tý', 'Sửu', 'Dần', 'Mão', 'Thìn', 'Tỵ', 'Ngọ', 'Mùi', 'Thân', 'Dậu', 'Tuất', 'Hợi'],
|
|
17
|
+
fiveElements: ['Metal', 'Wood', 'Water', 'Fire', 'Earth'],
|
|
18
|
+
zodiacAnimals: ['Rat', 'Ox', 'Tiger', 'Rabbit', 'Dragon', 'Snake', 'Horse', 'Goat', 'Monkey', 'Rooster', 'Dog', 'Pig'],
|
|
19
|
+
monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
|
|
20
|
+
weekDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
|
21
|
+
leapLabel: 'Leap',
|
|
22
|
+
yearLabel: 'Year',
|
|
23
|
+
monthLabel: 'Month',
|
|
24
|
+
destiny: 'Destiny',
|
|
25
|
+
},
|
|
26
|
+
ja: {
|
|
27
|
+
heavenlyStems: ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'],
|
|
28
|
+
earthlyBranches: ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'],
|
|
29
|
+
fiveElements: ['金', '木', '水', '火', '土'],
|
|
30
|
+
zodiacAnimals: ['鼠', '牛', '虎', '兎', '竜', '蛇', '馬', '羊', '猿', '鶏', '犬', '猪'],
|
|
31
|
+
monthNames: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
|
|
32
|
+
weekDays: ['日', '月', '火', '水', '木', '金', '土'],
|
|
33
|
+
leapLabel: '閏',
|
|
34
|
+
yearLabel: '年',
|
|
35
|
+
monthLabel: '月',
|
|
36
|
+
destiny: '命',
|
|
37
|
+
},
|
|
38
|
+
ko: {
|
|
39
|
+
heavenlyStems: ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계'],
|
|
40
|
+
earthlyBranches: ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해'],
|
|
41
|
+
fiveElements: ['금', '목', '수', '화', '토'],
|
|
42
|
+
zodiacAnimals: ['쥐', '소', '호랑이', '토끼', '용', '뱀', '말', '양', '원숭이', '닭', '개', '돼지'],
|
|
43
|
+
monthNames: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
|
|
44
|
+
weekDays: ['일', '월', '화', '수', '목', '금', '토'],
|
|
45
|
+
leapLabel: '윤',
|
|
46
|
+
yearLabel: '년',
|
|
47
|
+
monthLabel: '월',
|
|
48
|
+
destiny: '명',
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Lấy bộ dịch theo locale
|
|
53
|
+
* @param locale - Ngôn ngữ ('vi' | 'en' | 'ja' | 'ko')
|
|
54
|
+
*/
|
|
55
|
+
export function t(locale) {
|
|
56
|
+
return translations[locale];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Lấy tên con giáp theo locale
|
|
60
|
+
* @param branchIndex - Index Địa Chi (0-11)
|
|
61
|
+
* @param locale - Ngôn ngữ
|
|
62
|
+
*/
|
|
63
|
+
export function getZodiacAnimal(branchIndex, locale = 'vi') {
|
|
64
|
+
return translations[locale].zodiacAnimals[branchIndex % 12];
|
|
65
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 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)
|
|
3
|
+
* Theo quy ước: Năm 4 (sau CN) là năm Giáp Tý (Can index 0, Chi index 0)
|
|
4
|
+
*/
|
|
5
|
+
export declare function getYearDetails(year: number): {
|
|
6
|
+
can: "Giáp" | "Ất" | "Bính" | "Đinh" | "Mậu" | "Kỷ" | "Canh" | "Tân" | "Nhâm" | "Quý";
|
|
7
|
+
chi: "Tý" | "Sửu" | "Dần" | "Mão" | "Thìn" | "Tỵ" | "Ngọ" | "Mùi" | "Thân" | "Dậu" | "Tuất" | "Hợi";
|
|
8
|
+
menh: string;
|
|
9
|
+
fullString: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Tính Can Chi ngày từ Julian Day Number.
|
|
13
|
+
*
|
|
14
|
+
* @param jd - Julian Day Number
|
|
15
|
+
* @returns Chuỗi Can Chi (ví dụ: "Giáp Tý")
|
|
16
|
+
*/
|
|
17
|
+
export declare function getDayCanChi(jd: number): string;
|
|
18
|
+
/**
|
|
19
|
+
* Tính Can Chi tháng từ tháng và năm âm lịch.
|
|
20
|
+
* Can tháng phụ thuộc vào Can của năm (quy tắc Ngũ Hổ Độn):
|
|
21
|
+
* - Năm Giáp/Kỷ → Tháng Giêng bắt đầu bằng Bính (index 2)
|
|
22
|
+
* - Năm Ất/Canh → Tháng Giêng bắt đầu bằng Mậu (index 4)
|
|
23
|
+
* - Năm Bính/Tân → Tháng Giêng bắt đầu bằng Canh (index 6)
|
|
24
|
+
* - Năm Đinh/Nhâm → Tháng Giêng bắt đầu bằng Nhâm (index 8)
|
|
25
|
+
* - Năm Mậu/Quý → Tháng Giêng bắt đầu bằng Giáp (index 0)
|
|
26
|
+
*
|
|
27
|
+
* @param lunarMonth - Tháng âm lịch (1-12)
|
|
28
|
+
* @param lunarYear - Năm âm lịch
|
|
29
|
+
*/
|
|
30
|
+
export declare function getMonthCanChi(lunarMonth: number, lunarYear: number): string;
|
|
31
|
+
/**
|
|
32
|
+
* Tính Can Chi giờ từ giờ (0-23) và Julian Day Number của ngày.
|
|
33
|
+
*
|
|
34
|
+
* 12 canh giờ (mỗi canh = 2 tiếng):
|
|
35
|
+
* Tý: 23h-01h, Sửu: 01h-03h, Dần: 03h-05h, ...
|
|
36
|
+
*
|
|
37
|
+
* Can giờ Tý phụ thuộc Can ngày (quy tắc Ngũ Thử Độn):
|
|
38
|
+
* - Ngày Giáp/Kỷ → Giờ Tý bắt đầu bằng Giáp
|
|
39
|
+
* - Ngày Ất/Canh → Giờ Tý bắt đầu bằng Bính
|
|
40
|
+
* - Ngày Bính/Tân → Giờ Tý bắt đầu bằng Mậu
|
|
41
|
+
* - Ngày Đinh/Nhâm → Giờ Tý bắt đầu bằng Canh
|
|
42
|
+
* - Ngày Mậu/Quý → Giờ Tý bắt đầu bằng Nhâm
|
|
43
|
+
*
|
|
44
|
+
* @param hour - Giờ (0-23)
|
|
45
|
+
* @param dayJd - Julian Day Number của ngày
|
|
46
|
+
*/
|
|
47
|
+
export declare function getHourCanChi(hour: number, dayJd: number): string;
|
|
48
|
+
/**
|
|
49
|
+
* Lấy danh sách 6 giờ Hoàng Đạo trong ngày.
|
|
50
|
+
* Giờ Hoàng Đạo phụ thuộc vào Địa Chi của ngày.
|
|
51
|
+
*
|
|
52
|
+
* @param dayJd - Julian Day Number của ngày
|
|
53
|
+
* @returns Mảng 6 chuỗi tên Địa Chi (ví dụ: ["Tý", "Sửu", "Mão", "Ngọ", "Mùi", "Dậu"])
|
|
54
|
+
*/
|
|
55
|
+
export declare function getAuspiciousHours(dayJd: number): string[];
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { HEAVENLY_STEMS, getStemWeight } from '../constants/heavenly-stems.js';
|
|
2
|
+
import { EARTHLY_BRANCHES, getBranchWeight } from '../constants/earthly-branches.js';
|
|
3
|
+
import { FIVE_ELEMENTS } from '../constants/five-elements.js';
|
|
4
|
+
/**
|
|
5
|
+
* 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)
|
|
6
|
+
* Theo quy ước: Năm 4 (sau CN) là năm Giáp Tý (Can index 0, Chi index 0)
|
|
7
|
+
*/
|
|
8
|
+
export function getYearDetails(year) {
|
|
9
|
+
// Tính index của Can và Chi dựa trên mốc năm gốc
|
|
10
|
+
// Năm 1984, 2044 là Giáp Tý -> Offset để tính toán dễ nhất là lấy (year - 4) % hệ cơ số
|
|
11
|
+
const stemIndex = (year - 4) % 10;
|
|
12
|
+
const branchIndex = (year - 4) % 12;
|
|
13
|
+
// Công thức vàng tính Ngũ Hành
|
|
14
|
+
const stemWeight = getStemWeight(stemIndex);
|
|
15
|
+
const branchWeight = getBranchWeight(branchIndex);
|
|
16
|
+
let elementValue = stemWeight + branchWeight;
|
|
17
|
+
if (elementValue > 5) {
|
|
18
|
+
elementValue -= 5;
|
|
19
|
+
}
|
|
20
|
+
// Value ra từ 1-5, nên trừ 1 để lấy index của mảng FIVE_ELEMENTS (0-4)
|
|
21
|
+
const elementIndex = elementValue - 1;
|
|
22
|
+
return {
|
|
23
|
+
can: HEAVENLY_STEMS[stemIndex],
|
|
24
|
+
chi: EARTHLY_BRANCHES[branchIndex],
|
|
25
|
+
menh: FIVE_ELEMENTS[elementIndex],
|
|
26
|
+
fullString: `${HEAVENLY_STEMS[stemIndex]} ${EARTHLY_BRANCHES[branchIndex]} - Mệnh ${FIVE_ELEMENTS[elementIndex]}`
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// ============================================================
|
|
30
|
+
// Can Chi cho Ngày, Tháng, Giờ
|
|
31
|
+
// ============================================================
|
|
32
|
+
/**
|
|
33
|
+
* Tính Can Chi ngày từ Julian Day Number.
|
|
34
|
+
*
|
|
35
|
+
* @param jd - Julian Day Number
|
|
36
|
+
* @returns Chuỗi Can Chi (ví dụ: "Giáp Tý")
|
|
37
|
+
*/
|
|
38
|
+
export function getDayCanChi(jd) {
|
|
39
|
+
const stemIndex = (jd + 9) % 10;
|
|
40
|
+
const branchIndex = (jd + 1) % 12;
|
|
41
|
+
return `${HEAVENLY_STEMS[stemIndex]} ${EARTHLY_BRANCHES[branchIndex]}`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Tính Can Chi tháng từ tháng và năm âm lịch.
|
|
45
|
+
* Can tháng phụ thuộc vào Can của năm (quy tắc Ngũ Hổ Độn):
|
|
46
|
+
* - Năm Giáp/Kỷ → Tháng Giêng bắt đầu bằng Bính (index 2)
|
|
47
|
+
* - Năm Ất/Canh → Tháng Giêng bắt đầu bằng Mậu (index 4)
|
|
48
|
+
* - Năm Bính/Tân → Tháng Giêng bắt đầu bằng Canh (index 6)
|
|
49
|
+
* - Năm Đinh/Nhâm → Tháng Giêng bắt đầu bằng Nhâm (index 8)
|
|
50
|
+
* - Năm Mậu/Quý → Tháng Giêng bắt đầu bằng Giáp (index 0)
|
|
51
|
+
*
|
|
52
|
+
* @param lunarMonth - Tháng âm lịch (1-12)
|
|
53
|
+
* @param lunarYear - Năm âm lịch
|
|
54
|
+
*/
|
|
55
|
+
export function getMonthCanChi(lunarMonth, lunarYear) {
|
|
56
|
+
const yearStemIndex = (lunarYear + 6) % 10;
|
|
57
|
+
const monthStemOffset = (yearStemIndex % 5) * 2 + 2;
|
|
58
|
+
const monthStemIndex = (monthStemOffset + lunarMonth - 1) % 10;
|
|
59
|
+
const monthBranchIndex = (lunarMonth + 1) % 12;
|
|
60
|
+
return `${HEAVENLY_STEMS[monthStemIndex]} ${EARTHLY_BRANCHES[monthBranchIndex]}`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Tính Can Chi giờ từ giờ (0-23) và Julian Day Number của ngày.
|
|
64
|
+
*
|
|
65
|
+
* 12 canh giờ (mỗi canh = 2 tiếng):
|
|
66
|
+
* Tý: 23h-01h, Sửu: 01h-03h, Dần: 03h-05h, ...
|
|
67
|
+
*
|
|
68
|
+
* Can giờ Tý phụ thuộc Can ngày (quy tắc Ngũ Thử Độn):
|
|
69
|
+
* - Ngày Giáp/Kỷ → Giờ Tý bắt đầu bằng Giáp
|
|
70
|
+
* - Ngày Ất/Canh → Giờ Tý bắt đầu bằng Bính
|
|
71
|
+
* - Ngày Bính/Tân → Giờ Tý bắt đầu bằng Mậu
|
|
72
|
+
* - Ngày Đinh/Nhâm → Giờ Tý bắt đầu bằng Canh
|
|
73
|
+
* - Ngày Mậu/Quý → Giờ Tý bắt đầu bằng Nhâm
|
|
74
|
+
*
|
|
75
|
+
* @param hour - Giờ (0-23)
|
|
76
|
+
* @param dayJd - Julian Day Number của ngày
|
|
77
|
+
*/
|
|
78
|
+
export function getHourCanChi(hour, dayJd) {
|
|
79
|
+
// Tính Địa Chi của giờ: Tý từ 23h, mỗi canh 2 tiếng
|
|
80
|
+
const hourBranchIndex = Math.floor((hour + 1) / 2) % 12;
|
|
81
|
+
// Tính Thiên Can của giờ dựa vào Can ngày
|
|
82
|
+
const dayStemIndex = (dayJd + 9) % 10;
|
|
83
|
+
const hourStemOffset = (dayStemIndex % 5) * 2;
|
|
84
|
+
const hourStemIndex = (hourStemOffset + hourBranchIndex) % 10;
|
|
85
|
+
return `${HEAVENLY_STEMS[hourStemIndex]} ${EARTHLY_BRANCHES[hourBranchIndex]}`;
|
|
86
|
+
}
|
|
87
|
+
// ============================================================
|
|
88
|
+
// Giờ Hoàng Đạo
|
|
89
|
+
// ============================================================
|
|
90
|
+
/**
|
|
91
|
+
* Bảng giờ Hoàng Đạo theo Chi của ngày.
|
|
92
|
+
* Mỗi hàng tương ứng với 2 Chi (Tý-Ngọ, Sửu-Mùi, ...) → 6 nhóm.
|
|
93
|
+
* Giá trị là index các Địa Chi tốt (6 giờ tốt trong 12 canh).
|
|
94
|
+
*/
|
|
95
|
+
const AUSPICIOUS_HOURS_TABLE = [
|
|
96
|
+
[0, 1, 3, 6, 7, 9], // Ngày Tý (0) / Ngọ (6)
|
|
97
|
+
[2, 3, 5, 8, 9, 11], // Ngày Sửu (1) / Mùi (7)
|
|
98
|
+
[0, 1, 4, 5, 7, 10], // Ngày Dần (2) / Thân (8)
|
|
99
|
+
[1, 2, 4, 7, 8, 10], // Ngày Mão (3) / Dậu (9)
|
|
100
|
+
[0, 3, 4, 6, 9, 10], // Ngày Thìn (4) / Tuất (10)
|
|
101
|
+
[2, 5, 6, 8, 11, 0], // Ngày Tỵ (5) / Hợi (11)
|
|
102
|
+
];
|
|
103
|
+
/**
|
|
104
|
+
* Lấy danh sách 6 giờ Hoàng Đạo trong ngày.
|
|
105
|
+
* Giờ Hoàng Đạo phụ thuộc vào Địa Chi của ngày.
|
|
106
|
+
*
|
|
107
|
+
* @param dayJd - Julian Day Number của ngày
|
|
108
|
+
* @returns Mảng 6 chuỗi tên Địa Chi (ví dụ: ["Tý", "Sửu", "Mão", "Ngọ", "Mùi", "Dậu"])
|
|
109
|
+
*/
|
|
110
|
+
export function getAuspiciousHours(dayJd) {
|
|
111
|
+
const branchIndex = (dayJd + 1) % 12;
|
|
112
|
+
// Nhóm theo 2 Chi (Tý-Ngọ, Sửu-Mùi, ...)
|
|
113
|
+
const groupIndex = branchIndex % 6;
|
|
114
|
+
const hourIndices = AUSPICIOUS_HOURS_TABLE[groupIndex];
|
|
115
|
+
return hourIndices.map((i) => EARTHLY_BRANCHES[i]);
|
|
116
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Xuất bản phần lõi TypeScript — KHÔNG có Svelte dependencies
|
|
2
|
+
// Dành cho React, Vue, Angular, vanilla JS consumers
|
|
3
|
+
export { LichTa, jdFromDate, jdToDate, getNewMoonDay, getSunLongitude } from './lunar.js';
|
|
4
|
+
export { getYearDetails, getDayCanChi, getMonthCanChi, getHourCanChi, getAuspiciousHours, } from './feng-shui.js';
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { LunarDate, SolarDate } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Chuyển ngày Gregorian sang Julian Day Number.
|
|
4
|
+
*
|
|
5
|
+
* @param dd - Ngày (1-31)
|
|
6
|
+
* @param mm - Tháng (1-12)
|
|
7
|
+
* @param yy - Năm
|
|
8
|
+
*/
|
|
9
|
+
export declare function jdFromDate(dd: number, mm: number, yy: number): number;
|
|
10
|
+
/**
|
|
11
|
+
* Chuyển Julian Day Number sang ngày Gregorian.
|
|
12
|
+
*
|
|
13
|
+
* @param jd - Julian Day Number
|
|
14
|
+
* @returns Tuple [day, month, year]
|
|
15
|
+
*/
|
|
16
|
+
export declare function jdToDate(jd: number): [number, number, number];
|
|
17
|
+
/**
|
|
18
|
+
* Tính ngày Julian (integer) của điểm Sóc thứ k theo múi giờ.
|
|
19
|
+
*
|
|
20
|
+
* @param k - Số thứ tự New Moon
|
|
21
|
+
* @param timeZone - Múi giờ (7 = GMT+7)
|
|
22
|
+
*/
|
|
23
|
+
export declare function getNewMoonDay(k: number, timeZone: number): number;
|
|
24
|
+
/**
|
|
25
|
+
* Tính kinh độ Mặt Trời tại ngày Julian cho trước.
|
|
26
|
+
* Trả về index 0-11 (mỗi 30°), dùng để xác định Trung khí.
|
|
27
|
+
*
|
|
28
|
+
* Index 9 = Đông Chí (270°-300°)
|
|
29
|
+
*
|
|
30
|
+
* @param jdn - Julian Day Number
|
|
31
|
+
* @param timeZone - Múi giờ
|
|
32
|
+
*/
|
|
33
|
+
export declare function getSunLongitude(jdn: number, timeZone: number): number;
|
|
34
|
+
export declare class LichTa {
|
|
35
|
+
/**
|
|
36
|
+
* Chuyển đổi ngày Dương lịch sang Âm lịch.
|
|
37
|
+
*
|
|
38
|
+
* Sử dụng thuật toán Hồ Ngọc Đức để tìm Điểm Sóc và Tiết Khí,
|
|
39
|
+
* từ đó xác định ngày, tháng, năm âm lịch tương ứng.
|
|
40
|
+
*
|
|
41
|
+
* @param day - Ngày dương lịch (1-31)
|
|
42
|
+
* @param month - Tháng dương lịch (1-12)
|
|
43
|
+
* @param year - Năm dương lịch (1800-2199)
|
|
44
|
+
* @param timeZone - Múi giờ (mặc định: 7 cho GMT+7 Việt Nam)
|
|
45
|
+
* @returns Đối tượng LunarDate chứa thông tin ngày âm lịch
|
|
46
|
+
* @throws {RangeError} Khi input ngoài phạm vi hợp lệ
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const lunar = LichTa.toLunar(10, 2, 2024);
|
|
51
|
+
* // → { day: 1, month: 1, year: 2024, isLeap: false, yearCanChi: 'Giáp Thìn' }
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
static toLunar(day: number, month: number, year: number, timeZone?: number): LunarDate;
|
|
55
|
+
/**
|
|
56
|
+
* Chuyển đổi ngày Âm lịch sang Dương lịch.
|
|
57
|
+
*
|
|
58
|
+
* @param lunarDay - Ngày âm lịch
|
|
59
|
+
* @param lunarMonth - Tháng âm lịch
|
|
60
|
+
* @param lunarYear - Năm âm lịch
|
|
61
|
+
* @param isLeap - Có phải tháng nhuận không
|
|
62
|
+
* @param timeZone - Múi giờ (mặc định: 7 cho GMT+7 Việt Nam)
|
|
63
|
+
* @returns Đối tượng SolarDate
|
|
64
|
+
* @throws {RangeError} Khi năm ngoài phạm vi 1800-2199
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const solar = LichTa.toSolar(1, 1, 2024, false);
|
|
69
|
+
* // → { day: 10, month: 2, year: 2024 }
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
static toSolar(lunarDay: number, lunarMonth: number, lunarYear: number, isLeap?: boolean, timeZone?: number): SolarDate;
|
|
73
|
+
}
|