bg-name-days 2.0.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,215 @@
1
+ /** @typedef {import('../types.js').NameDayEntry} NameDayEntry */
2
+
3
+ /** @type {NameDayEntry[]} */
4
+ export const september = [
5
+ {
6
+ name: "Симеон",
7
+ variants: ["Симеонка", "Симона"],
8
+ latin: ["Simeon", "Simeonka", "Simona"],
9
+ month: 9, day: 1,
10
+ holiday: "Свети Симеон Стълпник",
11
+ holidayLatin: "Sveti Simeon Stalpnik",
12
+ tradition: "orthodox",
13
+ moveable: null,
14
+ },
15
+ {
16
+ name: "Захари",
17
+ variants: ["Захарий", "Захарина", "Елисавета"],
18
+ latin: ["Zahari", "Zahariy", "Zaharina", "Elisaveta"],
19
+ month: 9, day: 5,
20
+ holiday: "Свети Захарий и Елисавета",
21
+ holidayLatin: "Sveti Zahariy i Elisaveta",
22
+ tradition: "orthodox",
23
+ moveable: null,
24
+ },
25
+ {
26
+ name: "Мария",
27
+ variants: ["Мариан", "Мариана", "Маргарита"],
28
+ latin: ["Mariya", "Marian", "Mariana", "Margarita"],
29
+ month: 9, day: 8,
30
+ holiday: "Малка Богородица (Рождество Богородично)",
31
+ holidayLatin: "Malka Bogoroditsa (Rozhdestvo Bogorodichno)",
32
+ tradition: "orthodox",
33
+ moveable: null,
34
+ },
35
+ {
36
+ name: "Кръстьо",
37
+ variants: ["Кръстю", "Кръстинка"],
38
+ latin: ["Krastyo", "Krastyu", "Krastinka"],
39
+ month: 9, day: 14,
40
+ holiday: "Кръстовден",
41
+ holidayLatin: "Krastovden",
42
+ tradition: "orthodox",
43
+ moveable: null,
44
+ },
45
+ {
46
+ name: "Кристиан",
47
+ variants: ["Кристиана", "Кристина", "Кристин", "Кристиян", "Кристияна"],
48
+ latin: ["Kristian", "Kristiana", "Kristina", "Kristin", "Kristiyan", "Kristiyana"],
49
+ month: 9, day: 14,
50
+ holiday: "Кръстовден",
51
+ holidayLatin: "Krastovden",
52
+ tradition: "orthodox",
53
+ moveable: null,
54
+ },
55
+ {
56
+ name: "Христо",
57
+ variants: ["Христина", "Христиана", "Християн", "Християна", "Христомир", "Христофор", "Хриси"],
58
+ latin: ["Hristo", "Hristina", "Hristiana", "Hristiyan", "Hristiyana", "Hristomir", "Hristofor", "Hrisi"],
59
+ month: 9, day: 14,
60
+ holiday: "Кръстовден",
61
+ holidayLatin: "Krastovden",
62
+ tradition: "orthodox",
63
+ moveable: null,
64
+ },
65
+ {
66
+ name: "Вяра",
67
+ variants: [],
68
+ latin: ["Vyara"],
69
+ month: 9, day: 17,
70
+ holiday: "Света Вяра, Надежда и Любов",
71
+ holidayLatin: "Sveta Vyara, Nadezhda i Lyubov",
72
+ tradition: "orthodox",
73
+ moveable: null,
74
+ },
75
+ {
76
+ name: "Надежда",
77
+ variants: ["Надя"],
78
+ latin: ["Nadezhda", "Nadya"],
79
+ month: 9, day: 17,
80
+ holiday: "Света Вяра, Надежда и Любов",
81
+ holidayLatin: "Sveta Vyara, Nadezhda i Lyubov",
82
+ tradition: "orthodox",
83
+ moveable: null,
84
+ },
85
+ {
86
+ name: "Любов",
87
+ variants: ["Люба", "Любка", "Любомир", "Любомира", "Любен", "Любена", "Любослав", "Любослава"],
88
+ latin: ["Lyubov", "Lyuba", "Lyubka", "Lyubomir", "Lyubomira", "Lyuben", "Lyubena", "Lyuboslav", "Lyuboslava"],
89
+ month: 9, day: 17,
90
+ holiday: "Света Вяра, Надежда и Любов",
91
+ holidayLatin: "Sveta Vyara, Nadezhda i Lyubov",
92
+ tradition: "orthodox",
93
+ moveable: null,
94
+ },
95
+ {
96
+ name: "София",
97
+ variants: ["Софка", "Софи"],
98
+ latin: ["Sofiya", "Sofka", "Sofi"],
99
+ month: 9, day: 17,
100
+ holiday: "Света Вяра, Надежда и Любов",
101
+ holidayLatin: "Sveta Vyara, Nadezhda i Lyubov",
102
+ tradition: "orthodox",
103
+ moveable: null,
104
+ },
105
+ {
106
+ name: "Тома",
107
+ variants: ["Томислав", "Томислава"],
108
+ latin: ["Toma", "Tomislav", "Tomislava"],
109
+ month: 9, day: 22,
110
+ holiday: "Свети Тома",
111
+ holidayLatin: "Sveti Toma",
112
+ tradition: "orthodox",
113
+ moveable: null,
114
+ },
115
+ {
116
+ name: "Яким",
117
+ variants: ["Якимка"],
118
+ latin: ["Yakim", "Yakimka"],
119
+ month: 9, day: 9,
120
+ holiday: "Свети Йоаким и Анна",
121
+ holidayLatin: "Sveti Yoakim i Anna",
122
+ tradition: "orthodox",
123
+ moveable: null,
124
+ },
125
+ {
126
+ name: "Людмил",
127
+ variants: ["Людмила", "Людмилка"],
128
+ latin: ["Lyudmil", "Lyudmila", "Lyudmilka"],
129
+ month: 9, day: 16,
130
+ holiday: "Света Людмила",
131
+ holidayLatin: "Sveta Lyudmila",
132
+ tradition: "orthodox",
133
+ moveable: null,
134
+ },
135
+ {
136
+ name: "Текла",
137
+ variants: ["Теклица"],
138
+ latin: ["Tekla", "Teklitsa"],
139
+ month: 9, day: 24,
140
+ holiday: "Света Текла",
141
+ holidayLatin: "Sveta Tekla",
142
+ tradition: "orthodox",
143
+ moveable: null,
144
+ },
145
+ {
146
+ name: "Теодора",
147
+ variants: [],
148
+ latin: ["Teodora"],
149
+ month: 9, day: 11,
150
+ holiday: "Свети Теодора",
151
+ holidayLatin: "Sveti Teodora",
152
+ tradition: "orthodox",
153
+ moveable: null,
154
+ },
155
+ {
156
+ name: "Трофим",
157
+ variants: [],
158
+ latin: ["Trofim"],
159
+ month: 9, day: 19,
160
+ holiday: "Свети Трофим",
161
+ holidayLatin: "Sveti Trofim",
162
+ tradition: "orthodox",
163
+ moveable: null,
164
+ },
165
+ {
166
+ name: "Мамант",
167
+ variants: [],
168
+ latin: ["Mamant"],
169
+ month: 9, day: 2,
170
+ holiday: "Свети Мамант",
171
+ holidayLatin: "Sveti Mamant",
172
+ tradition: "orthodox",
173
+ moveable: null,
174
+ },
175
+ {
176
+ name: "Григор",
177
+ variants: ["Григорий"],
178
+ latin: ["Grigor", "Grigoriy"],
179
+ month: 9, day: 30,
180
+ holiday: "Свети Григорий",
181
+ holidayLatin: "Sveti Grigoriy",
182
+ tradition: "orthodox",
183
+ moveable: null,
184
+ },
185
+ {
186
+ name: "Михаил",
187
+ variants: ["Михаела"],
188
+ latin: ["Mihail", "Mihaela"],
189
+ month: 9, day: 6,
190
+ holiday: "Чудо на Свети Архангел Михаил",
191
+ holidayLatin: "Chudo na Sveti Arhangel Mihail",
192
+ tradition: "orthodox",
193
+ moveable: null,
194
+ },
195
+ {
196
+ name: "Никита",
197
+ variants: [],
198
+ latin: ["Nikita"],
199
+ month: 9, day: 15,
200
+ holiday: "Свети Никита",
201
+ holidayLatin: "Sveti Nikita",
202
+ tradition: "orthodox",
203
+ moveable: null,
204
+ },
205
+ {
206
+ name: "Харитон",
207
+ variants: [],
208
+ latin: ["Hariton"],
209
+ month: 9, day: 28,
210
+ holiday: "Свети Харитон",
211
+ holidayLatin: "Sveti Hariton",
212
+ tradition: "orthodox",
213
+ moveable: null,
214
+ },
215
+ ];
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Bulgarian official transliteration (Закон за транслитерацията, 2009).
3
+ * Cyrillic to Latin mapping.
4
+ */
5
+ export const cyrToLat = {
6
+ "А": "A", "Б": "B", "В": "V", "Г": "G", "Д": "D",
7
+ "Е": "E", "Ж": "Zh", "З": "Z", "И": "I", "Й": "Y",
8
+ "К": "K", "Л": "L", "М": "M", "Н": "N", "О": "O",
9
+ "П": "P", "Р": "R", "С": "S", "Т": "T", "У": "U",
10
+ "Ф": "F", "Х": "H", "Ц": "Ts", "Ч": "Ch", "Ш": "Sh",
11
+ "Щ": "Sht", "Ъ": "A", "Ь": "Y", "Ю": "Yu", "Я": "Ya",
12
+ "а": "a", "б": "b", "в": "v", "г": "g", "д": "d",
13
+ "е": "e", "ж": "zh", "з": "z", "и": "i", "й": "y",
14
+ "к": "k", "л": "l", "м": "m", "н": "n", "о": "o",
15
+ "п": "p", "р": "r", "с": "s", "т": "t", "у": "u",
16
+ "ф": "f", "х": "h", "ц": "ts", "ч": "ch", "ш": "sh",
17
+ "щ": "sht", "ъ": "a", "ь": "y", "ю": "yu", "я": "ya"
18
+ };
19
+
20
+ /**
21
+ * Latin to Cyrillic mapping (reverse).
22
+ * Multi-character sequences must come first for correct matching.
23
+ */
24
+ export const latToCyr = {
25
+ "Sht": "Щ", "sht": "щ",
26
+ "Zh": "Ж", "zh": "ж",
27
+ "Ts": "Ц", "ts": "ц",
28
+ "Ch": "Ч", "ch": "ч",
29
+ "Sh": "Ш", "sh": "ш",
30
+ "Yu": "Ю", "yu": "ю",
31
+ "Ya": "Я", "ya": "я",
32
+ "A": "А", "a": "а",
33
+ "B": "Б", "b": "б",
34
+ "V": "В", "v": "в",
35
+ "G": "Г", "g": "г",
36
+ "D": "Д", "d": "д",
37
+ "E": "Е", "e": "е",
38
+ "Z": "З", "z": "з",
39
+ "I": "И", "i": "и",
40
+ "Y": "Й", "y": "й",
41
+ "K": "К", "k": "к",
42
+ "L": "Л", "l": "л",
43
+ "M": "М", "m": "м",
44
+ "N": "Н", "n": "н",
45
+ "O": "О", "o": "о",
46
+ "P": "П", "p": "п",
47
+ "R": "Р", "r": "р",
48
+ "S": "С", "s": "с",
49
+ "T": "Т", "t": "т",
50
+ "U": "У", "u": "у",
51
+ "F": "Ф", "f": "ф",
52
+ "H": "Х", "h": "х"
53
+ };
54
+
55
+ /**
56
+ * Sorted Latin keys for reverse transliteration (longest first).
57
+ */
58
+ export const latKeys = Object.keys(latToCyr).sort((a, b) => b.length - a.length);
package/src/index.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * bg-name-days — Bulgarian name days calendar library.
3
+ * Public API exports.
4
+ */
5
+
6
+ export {
7
+ getNameDay,
8
+ getNamesByDate,
9
+ isNameDay,
10
+ getAllNameDays,
11
+ getTodayNames,
12
+ } from './lookup.js';
13
+
14
+ export { searchNames, getNamesByHoliday } from './search.js';
15
+
16
+ export { getUpcomingNameDays } from './upcoming.js';
17
+
18
+ export { transliterate } from './transliterate.js';
19
+
20
+ export { orthodoxEaster } from './moveable.js';
package/src/lookup.js ADDED
@@ -0,0 +1,137 @@
1
+ /** @typedef {import('./types.js').NameDayEntry} NameDayEntry */
2
+ /** @typedef {import('./types.js').NameDayResult} NameDayResult */
3
+
4
+ import { getIndex, getAllEntries } from './data/nameDays.js';
5
+ import { normalize, formatDate, extractYear } from './normalize.js';
6
+
7
+ /**
8
+ * Convert a NameDayEntry to a NameDayResult (public API shape).
9
+ * Returns a new object — never mutates the original.
10
+ * @param {NameDayEntry} entry
11
+ * @returns {NameDayResult}
12
+ */
13
+ function toResult(entry) {
14
+ return {
15
+ name: entry.name,
16
+ month: entry.month,
17
+ day: entry.day,
18
+ holiday: entry.holiday,
19
+ holidayLatin: entry.holidayLatin,
20
+ tradition: entry.tradition,
21
+ variants: [...entry.variants],
22
+ isMoveable: entry.moveable !== null,
23
+ };
24
+ }
25
+
26
+ /**
27
+ * Look up name day(s) for a given name.
28
+ * Searches primary names, variants, and Latin transliterations.
29
+ * Case-insensitive.
30
+ *
31
+ * @param {string} name - Name to look up (Cyrillic or Latin)
32
+ * @param {number} [year] - Year for moveable dates (default: current year)
33
+ * @returns {NameDayResult|NameDayResult[]|null} Single result, array if multiple dates, or null
34
+ */
35
+ export function getNameDay(name, year) {
36
+ if (!name || typeof name !== 'string') return null;
37
+
38
+ const key = normalize(name);
39
+ if (key.length === 0) return null;
40
+
41
+ const y = year ?? new Date().getFullYear();
42
+ const idx = getIndex(y);
43
+ const entries = idx.byName.get(key);
44
+
45
+ if (!entries || entries.length === 0) return null;
46
+
47
+ // Deduplicate by name+month+day (same entry can appear via primary & variant)
48
+ const seen = new Set();
49
+ const results = [];
50
+ for (const entry of entries) {
51
+ const dedupeKey = `${entry.name}|${entry.month}-${entry.day}`;
52
+ if (seen.has(dedupeKey)) continue;
53
+ seen.add(dedupeKey);
54
+ results.push(toResult(entry));
55
+ }
56
+
57
+ if (results.length === 1) return results[0];
58
+ return results;
59
+ }
60
+
61
+ /**
62
+ * Get all names celebrating on a specific date.
63
+ * @param {string|Date} date - "MM-DD" string or Date object
64
+ * @param {number} [year] - Year for moveable dates (only used if date is "MM-DD" string)
65
+ * @returns {string[]} Array of all celebrating names (primary + variants)
66
+ */
67
+ export function getNamesByDate(date, year) {
68
+ if (!date) return [];
69
+
70
+ const dateKey = formatDate(date);
71
+ if (!dateKey) return [];
72
+
73
+ const y = (date instanceof Date)
74
+ ? date.getFullYear()
75
+ : (year ?? new Date().getFullYear());
76
+
77
+ const idx = getIndex(y);
78
+ const entries = idx.byDate.get(dateKey);
79
+
80
+ if (!entries || entries.length === 0) return [];
81
+
82
+ const names = [];
83
+ for (const entry of entries) {
84
+ names.push(entry.name);
85
+ for (const variant of entry.variants) {
86
+ names.push(variant);
87
+ }
88
+ }
89
+
90
+ return names;
91
+ }
92
+
93
+ /**
94
+ * Check if a given name has its name day on a specific date.
95
+ * @param {string} name - Name to check (Cyrillic or Latin)
96
+ * @param {Date} date - Date to check
97
+ * @returns {boolean}
98
+ */
99
+ export function isNameDay(name, date) {
100
+ if (!name || typeof name !== 'string' || !(date instanceof Date)) return false;
101
+ if (Number.isNaN(date.getTime())) return false;
102
+
103
+ const key = normalize(name);
104
+ if (key.length === 0) return false;
105
+
106
+ const year = date.getFullYear();
107
+ const idx = getIndex(year);
108
+ const entries = idx.byName.get(key);
109
+
110
+ if (!entries || entries.length === 0) return false;
111
+
112
+ const targetMonth = date.getMonth() + 1;
113
+ const targetDay = date.getDate();
114
+
115
+ return entries.some((e) => e.month === targetMonth && e.day === targetDay);
116
+ }
117
+
118
+ /**
119
+ * Get all name day entries (fixed + moveable resolved for the given year).
120
+ * Returns a deep copy — safe to mutate.
121
+ * @param {number} [year] - Year for moveable dates (default: current year)
122
+ * @returns {NameDayResult[]}
123
+ */
124
+ export function getAllNameDays(year) {
125
+ const y = year ?? new Date().getFullYear();
126
+ const entries = getAllEntries(y);
127
+ return entries.map(toResult);
128
+ }
129
+
130
+ /**
131
+ * Get names celebrating today.
132
+ * @returns {string[]}
133
+ */
134
+ export function getTodayNames() {
135
+ const today = new Date();
136
+ return getNamesByDate(today);
137
+ }
@@ -0,0 +1,221 @@
1
+ /** @typedef {import('./types.js').MoveableHoliday} MoveableHoliday */
2
+ /** @typedef {import('./types.js').NameDayEntry} NameDayEntry */
3
+
4
+ /**
5
+ * Calculate Orthodox Easter (Pascha) date for a given year.
6
+ * Uses the Gauss algorithm for Julian Easter + Julian-to-Gregorian correction.
7
+ * Valid for years 1900-2099 (13-day offset).
8
+ * @param {number} year
9
+ * @returns {Date}
10
+ */
11
+ export function orthodoxEaster(year) {
12
+ const a = year % 19;
13
+ const b = year % 4;
14
+ const c = year % 7;
15
+ const d = (19 * a + 15) % 30;
16
+ const e = (2 * b + 4 * c + 6 * d + 6) % 7;
17
+
18
+ // Julian calendar date in March
19
+ const marchDay = d + e + 22;
20
+
21
+ // Convert from Julian to Gregorian (add 13 days for 1900-2099)
22
+ const julianOffset = 13;
23
+ const date = new Date(year, 2, marchDay + julianOffset); // month 2 = March
24
+
25
+ return date;
26
+ }
27
+
28
+ /**
29
+ * Add days to a Date (returns new Date, does not mutate).
30
+ * @param {Date} date
31
+ * @param {number} days
32
+ * @returns {Date}
33
+ */
34
+ function addDays(date, days) {
35
+ const result = new Date(date);
36
+ result.setDate(result.getDate() + days);
37
+ return result;
38
+ }
39
+
40
+ /**
41
+ * Calculate all moveable feast dates for a given year.
42
+ * @param {number} year
43
+ * @returns {Map<string, {month: number, day: number}>}
44
+ */
45
+ export function getMoveableDates(year) {
46
+ const easter = orthodoxEaster(year);
47
+ const dates = new Map();
48
+
49
+ for (const holiday of moveableHolidays) {
50
+ const d = addDays(easter, holiday.offsetFromEaster);
51
+ dates.set(holiday.id, { month: d.getMonth() + 1, day: d.getDate() });
52
+ }
53
+
54
+ return dates;
55
+ }
56
+
57
+ /**
58
+ * Resolve a moveable entry to concrete month/day for a given year.
59
+ * @param {NameDayEntry} entry
60
+ * @param {number} year
61
+ * @returns {{month: number, day: number}}
62
+ */
63
+ export function resolveMoveableDate(entry, year) {
64
+ if (!entry.moveable) return { month: entry.month, day: entry.day };
65
+
66
+ const dates = getMoveableDates(year);
67
+ const resolved = dates.get(entry.moveable);
68
+ if (!resolved) return { month: entry.month, day: entry.day };
69
+
70
+ return resolved;
71
+ }
72
+
73
+ /**
74
+ * Build NameDayEntry objects for all moveable holidays, resolved for a given year.
75
+ * @param {number} year
76
+ * @returns {NameDayEntry[]}
77
+ */
78
+ export function getMoveableEntries(year) {
79
+ const dates = getMoveableDates(year);
80
+ const entries = [];
81
+
82
+ for (const holiday of moveableHolidays) {
83
+ const resolved = dates.get(holiday.id);
84
+ if (!resolved) continue;
85
+
86
+ for (const nameEntry of holiday.entries) {
87
+ entries.push({
88
+ name: nameEntry.name,
89
+ variants: [...nameEntry.variants],
90
+ latin: [...nameEntry.latin],
91
+ month: resolved.month,
92
+ day: resolved.day,
93
+ holiday: holiday.holiday,
94
+ holidayLatin: holiday.holidayLatin,
95
+ tradition: holiday.tradition,
96
+ moveable: holiday.id,
97
+ });
98
+ }
99
+ }
100
+
101
+ return entries;
102
+ }
103
+
104
+ /** @type {MoveableHoliday[]} */
105
+ export const moveableHolidays = [
106
+ {
107
+ id: "todorovden",
108
+ holiday: "Тодоровден (Конски Великден)",
109
+ holidayLatin: "Todorovden (Konski Velikden)",
110
+ offsetFromEaster: -43,
111
+ tradition: "orthodox",
112
+ entries: [
113
+ { name: "Тодор", variants: ["Тодорка", "Тодорин", "Тошо", "Тотьо", "Тото", "Тода"], latin: ["Todor", "Todorka", "Todorin", "Tosho", "Totyo", "Toto", "Toda"] },
114
+ { name: "Теодор", variants: ["Теодора", "Теди", "Теодоси", "Теодосий", "Теодосия"], latin: ["Teodor", "Teodora", "Tedi", "Teodosi", "Teodosiy", "Teodosiya"] },
115
+ { name: "Дора", variants: ["Дорка", "Дориана", "Доротея", "Доротей"], latin: ["Dora", "Dorka", "Doriana", "Doroteya", "Dorotey"] },
116
+ { name: "Божидар", variants: ["Божидара", "Божана", "Божан", "Божил", "Божко"], latin: ["Bozhidar", "Bozhidara", "Bozhana", "Bozhan", "Bozhil", "Bozhko"] },
117
+ { name: "Дарин", variants: ["Дарина", "Дарко", "Дарка", "Дария", "Дариян", "Дарислав", "Дарислава"], latin: ["Darin", "Darina", "Darko", "Darka", "Dariya", "Dariyan", "Darislav", "Darislava"] },
118
+ ],
119
+ },
120
+ {
121
+ id: "lazarovden",
122
+ holiday: "Лазаровден",
123
+ holidayLatin: "Lazarovden",
124
+ offsetFromEaster: -8,
125
+ tradition: "orthodox",
126
+ entries: [
127
+ { name: "Лазар", variants: ["Лазарка", "Лазарина", "Лазо"], latin: ["Lazar", "Lazarka", "Lazarina", "Lazo"] },
128
+ { name: "Лъчезар", variants: ["Лъчезара"], latin: ["Lachezar", "Lachezara"] },
129
+ ],
130
+ },
131
+ {
132
+ id: "tsvetnitsa",
133
+ holiday: "Цветница (Връбница)",
134
+ holidayLatin: "Tsvetnitsa (Vrabnitsa)",
135
+ offsetFromEaster: -7,
136
+ tradition: "orthodox",
137
+ entries: [
138
+ { name: "Цветан", variants: ["Цветана", "Цветанка", "Цвете", "Цветин", "Цветина", "Цветка", "Цвятко", "Цено"], latin: ["Tsvetan", "Tsvetana", "Tsvetanka", "Tsvete", "Tsvetin", "Tsvetina", "Tsvetka", "Tsvyatko", "Tseno"] },
139
+ { name: "Цветелин", variants: ["Цветелина"], latin: ["Tsvetelin", "Tsvetelina"] },
140
+ { name: "Цветомир", variants: ["Цветомира", "Цветомила", "Цветослав", "Цветослава", "Цветимир"], latin: ["Tsvetomir", "Tsvetomira", "Tsvetomila", "Tsvetoslav", "Tsvetoslava", "Tsvetimir"] },
141
+ { name: "Виолета", variants: ["Виола"], latin: ["Violeta", "Viola"] },
142
+ { name: "Роза", variants: ["Розалия", "Розалина", "Ружа"], latin: ["Roza", "Rozaliya", "Rozalina", "Ruzha"] },
143
+ { name: "Маргарита", variants: ["Маргарет"], latin: ["Margarita", "Margaret"] },
144
+ { name: "Невен", variants: ["Невена", "Невян", "Невяна", "Ненка"], latin: ["Neven", "Nevena", "Nevyan", "Nevyana", "Nenka"] },
145
+ { name: "Росен", variants: ["Росица", "Росина"], latin: ["Rosen", "Rositsa", "Rosina"] },
146
+ { name: "Камелия", variants: [], latin: ["Kameliya"] },
147
+ { name: "Лилия", variants: ["Лиляна", "Лила", "Лили"], latin: ["Liliya", "Lilyana", "Lila", "Lili"] },
148
+ { name: "Ясен", variants: ["Ясена", "Ясмина", "Жасмина"], latin: ["Yasen", "Yasena", "Yasmina", "Zhasmina"] },
149
+ { name: "Явор", variants: ["Яворка"], latin: ["Yavor", "Yavorka"] },
150
+ { name: "Калина", variants: ["Калинка"], latin: ["Kalina", "Kalinka"] },
151
+ { name: "Здравко", variants: ["Здравка"], latin: ["Zdravko", "Zdravka"] },
152
+ { name: "Детелина", variants: ["Делян", "Делянка", "Деляна", "Дилян", "Диляна"], latin: ["Detelina", "Delyan", "Delyanka", "Delyana", "Dilyan", "Dilyana"] },
153
+ { name: "Карамфил", variants: ["Карамфила"], latin: ["Karamfil", "Karamfila"] },
154
+ { name: "Латинка", variants: ["Латин"], latin: ["Latinka", "Latin"] },
155
+ { name: "Теменужка", variants: [], latin: ["Temenushka"] },
156
+ { name: "Дафина", variants: ["Далия"], latin: ["Dafina", "Daliya"] },
157
+ { name: "Трендафил", variants: ["Трендафила"], latin: ["Trendafil", "Trendafila"] },
158
+ { name: "Божура", variants: [], latin: ["Bozhura"] },
159
+ { name: "Гроздена", variants: ["Гроздан", "Гроздана"], latin: ["Grozdena", "Grozdan", "Grozdana"] },
160
+ { name: "Ива", variants: ["Ивана"], latin: ["Iva", "Ivana"] },
161
+ { name: "Малина", variants: [], latin: ["Malina"] },
162
+ { name: "Ралица", variants: [], latin: ["Ralitsa"] },
163
+ { name: "Елица", variants: [], latin: ["Elitsa"] },
164
+ { name: "Върбан", variants: ["Върбинка", "Върба"], latin: ["Varban", "Varbinka", "Varba"] },
165
+ { name: "Магнолия", variants: [], latin: ["Magnoliya"] },
166
+ { name: "Иглика", variants: ["Иглена"], latin: ["Iglika", "Iglena"] },
167
+ { name: "Зюмбюла", variants: [], latin: ["Zyumbyula"] },
168
+ { name: "Люляна", variants: ["Люлин", "Люлина"], latin: ["Lyulyana", "Lyulin", "Lyulina"] },
169
+ { name: "Лоза", variants: ["Лозана"], latin: ["Loza", "Lozana"] },
170
+ { name: "Ренета", variants: [], latin: ["Reneta"] },
171
+ { name: "Китка", variants: [], latin: ["Kitka"] },
172
+ { name: "Орхидея", variants: [], latin: ["Orhideya"] },
173
+ { name: "Аглика", variants: [], latin: ["Aglika"] },
174
+ { name: "Гергина", variants: ["Гергинка"], latin: ["Gergina", "Gerginka"] },
175
+ ],
176
+ },
177
+ {
178
+ id: "velikden",
179
+ holiday: "Великден (Възкресение Христово)",
180
+ holidayLatin: "Velikden (Vazskresenie Hristovo)",
181
+ offsetFromEaster: 0,
182
+ tradition: "orthodox",
183
+ entries: [
184
+ { name: "Велика", variants: ["Величка", "Вела", "Велислава"], latin: ["Velika", "Velichka", "Vela", "Velislava"] },
185
+ { name: "Велико", variants: ["Велин", "Велко", "Вельо", "Велимир", "Велислав"], latin: ["Veliko", "Velin", "Velko", "Velyo", "Velimir", "Velislav"] },
186
+ { name: "Велина", variants: ["Велка", "Велимира"], latin: ["Velina", "Velka", "Velimira"] },
187
+ { name: "Паскал", variants: ["Паска", "Паскалина"], latin: ["Paskal", "Paska", "Paskalina"] },
188
+ ],
189
+ },
190
+ {
191
+ id: "spasovden",
192
+ holiday: "Спасовден (Възнесение Господне)",
193
+ holidayLatin: "Spasovden (Vaznesenie Gospodne)",
194
+ offsetFromEaster: 39,
195
+ tradition: "orthodox",
196
+ entries: [
197
+ { name: "Спас", variants: ["Спасен", "Спасимир", "Спасимира"], latin: ["Spas", "Spasen", "Spasimir", "Spasimira"] },
198
+ { name: "Спасена", variants: ["Спасия", "Спаска"], latin: ["Spasena", "Spasiya", "Spaska"] },
199
+ ],
200
+ },
201
+ {
202
+ id: "petdesetnitsa",
203
+ holiday: "Петдесетница (Света Троица)",
204
+ holidayLatin: "Petdesetnitsa (Sveta Troitsa)",
205
+ offsetFromEaster: 49,
206
+ tradition: "orthodox",
207
+ entries: [
208
+ { name: "Трайко", variants: ["Траян", "Траяна", "Троянка"], latin: ["Trayko", "Trayan", "Trayana", "Troyanka"] },
209
+ ],
210
+ },
211
+ {
212
+ id: "duhovden",
213
+ holiday: "Духов ден (Свети Дух)",
214
+ holidayLatin: "Duhov den (Sveti Duh)",
215
+ offsetFromEaster: 50,
216
+ tradition: "orthodox",
217
+ entries: [
218
+ { name: "Пламен", variants: ["Пламена"], latin: ["Plamen", "Plamena"] },
219
+ ],
220
+ },
221
+ ];