@mccustomapps/helaui 0.1.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.
package/dist/index.cjs ADDED
@@ -0,0 +1,1026 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ BUILTIN_RAIN_IMAGES: () => BUILTIN_RAIN_IMAGES,
24
+ BUILTIN_SUN_MANDALA_IMAGE: () => BUILTIN_SUN_MANDALA_IMAGE,
25
+ Calendar: () => Calendar,
26
+ DEFAULT_RAIN_IMAGES: () => DEFAULT_RAIN_IMAGES,
27
+ RainBackground: () => RainBackground,
28
+ SINHALA_FONT_CLASS: () => SINHALA_FONT_CLASS,
29
+ SINHALA_FONT_FAMILY: () => SINHALA_FONT_FAMILY,
30
+ SINHALA_MONTH_NAMES: () => SINHALA_MONTH_NAMES,
31
+ SunMandala: () => SunMandala,
32
+ THEME_VAR_MAP: () => THEME_VAR_MAP,
33
+ TextField: () => TextField,
34
+ applySinhalaFont: () => applySinhalaFont,
35
+ applyTheme: () => applyTheme,
36
+ applyTranslations: () => applyTranslations,
37
+ createThemeStyle: () => createThemeStyle,
38
+ defaultTheme: () => defaultTheme,
39
+ defaultTranslations: () => defaultTranslations,
40
+ formatSinhalaNumeral: () => formatSinhalaNumeral,
41
+ getCalendarTranslation: () => getCalendarTranslation,
42
+ getDefaultRainImageUrls: () => getDefaultRainImageUrls,
43
+ getLocale: () => getLocale,
44
+ getTextFieldTranslation: () => getTextFieldTranslation,
45
+ resetTheme: () => resetTheme,
46
+ resetTranslations: () => resetTranslations,
47
+ setLocale: () => setLocale,
48
+ sinhalaFontStyles: () => sinhalaFontStyles,
49
+ subscribeLocaleChange: () => subscribeLocaleChange,
50
+ t: () => t
51
+ });
52
+ module.exports = __toCommonJS(index_exports);
53
+
54
+ // src/fonts/sinhala.ts
55
+ var SINHALA_FONT_FAMILY = '"Noto Sans Sinhala", "Iskoola Pota", "FM Abhaya", sans-serif';
56
+ var sinhalaFontStyles = {
57
+ fontFamily: SINHALA_FONT_FAMILY
58
+ };
59
+ var SINHALA_FONT_CLASS = "helaui-sinhala";
60
+ function applySinhalaFont(element) {
61
+ element.classList.add(SINHALA_FONT_CLASS);
62
+ element.style.fontFamily = SINHALA_FONT_FAMILY;
63
+ }
64
+
65
+ // src/i18n/defaultTranslations.ts
66
+ var defaultTranslations = {
67
+ en: {
68
+ textField: {
69
+ name: { label: "Name", placeholder: "Enter your name" },
70
+ password: { label: "Password", placeholder: "Enter your password" },
71
+ email: { label: "Email", placeholder: "example@email.com" },
72
+ disabled: {
73
+ label: "Disabled",
74
+ placeholder: "Cannot be used",
75
+ value: "Disabled value"
76
+ }
77
+ },
78
+ calendar: {
79
+ monthNames: [
80
+ "January",
81
+ "February",
82
+ "March",
83
+ "April",
84
+ "May",
85
+ "June",
86
+ "July",
87
+ "August",
88
+ "September",
89
+ "October",
90
+ "November",
91
+ "December"
92
+ ],
93
+ sinhalaMonthNames: [
94
+ "Duruthu",
95
+ "Navam",
96
+ "Meddin",
97
+ "Bak",
98
+ "Vesak",
99
+ "Poson",
100
+ "Esala",
101
+ "Nikini",
102
+ "Binara",
103
+ "Vap",
104
+ "Il",
105
+ "Unduvap"
106
+ ],
107
+ weekdayNames: [
108
+ "Sunday",
109
+ "Monday",
110
+ "Tuesday",
111
+ "Wednesday",
112
+ "Thursday",
113
+ "Friday",
114
+ "Saturday"
115
+ ],
116
+ shortWeekdayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
117
+ buddhistEra: "BE",
118
+ today: "Today",
119
+ clear: "Clear",
120
+ selectMonth: "Select Month",
121
+ poyaDay: "Poya Day"
122
+ }
123
+ },
124
+ si: {
125
+ textField: {
126
+ name: { label: "\u0DB1\u0DB8", placeholder: "\u0D94\u0DB6\u0DDA \u0DB1\u0DB8 \u0D87\u0DAD\u0DD4\u0DC5\u0DAD\u0DCA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1" },
127
+ password: { label: "\u0DB8\u0DD4\u0DBB\u0DB4\u0DAF\u0DBA", placeholder: "\u0DB8\u0DD4\u0DBB\u0DB4\u0DAF\u0DBA \u0D87\u0DAD\u0DD4\u0DC5\u0DAD\u0DCA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1" },
128
+ email: { label: "\u0DC0\u0DD2\u0DAF\u0DCA\u200D\u0DBA\u0DD4\u0DAD\u0DCA \u0DAD\u0DD0\u0DB4\u0DD1\u0DBD", placeholder: "example@email.com" },
129
+ disabled: {
130
+ label: "\u0D85\u0D9A\u0DCA\u200D\u0DBB\u0DD2\u0DBA \u0D9A\u0DC5",
131
+ placeholder: "\u0DB8\u0DD9\u0DBA \u0DB7\u0DCF\u0DC0\u0DD2\u0DAD\u0DCF \u0D9A\u0DC5 \u0DB1\u0DDC\u0DC4\u0DD0\u0D9A",
132
+ value: "\u0D85\u0D9A\u0DCA\u200D\u0DBB\u0DD2\u0DBA \u0D9A\u0DC5 \u0D85\u0D9C\u0DBA"
133
+ }
134
+ },
135
+ calendar: {
136
+ monthNames: [
137
+ "\u0DA2\u0DB1\u0DC0\u0DCF\u0DBB\u0DD2",
138
+ "\u0DB4\u0DD9\u0DB6\u0DBB\u0DC0\u0DCF\u0DBB\u0DD2",
139
+ "\u0DB8\u0DCF\u0DBB\u0DCA\u0DAD\u0DD4",
140
+ "\u0D85\u0DB4\u0DCA\u200D\u0DBB\u0DDA\u0DBD\u0DCA",
141
+ "\u0DB8\u0DD0\u0DBA\u0DD2",
142
+ "\u0DA2\u0DD6\u0DB1\u0DD2",
143
+ "\u0DA2\u0DD6\u0DBD\u0DD2",
144
+ "\u0D85\u0D9C\u0DDD\u0DC3\u0DCA\u0DAD\u0DD4",
145
+ "\u0DC3\u0DD0\u0DB4\u0DCA\u0DAD\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA",
146
+ "\u0D94\u0D9A\u0DCA\u0DAD\u0DDD\u0DB6\u0DBB\u0DCA",
147
+ "\u0DB1\u0DDC\u0DC0\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA",
148
+ "\u0DAF\u0DD9\u0DC3\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA"
149
+ ],
150
+ sinhalaMonthNames: [
151
+ "\u0DAF\u0DD4\u0DBB\u0DD4\u0DAD\u0DD4",
152
+ "\u0DB1\u0DC0\u0DB8\u0DCA",
153
+ "\u0DB8\u0DD0\u0DAF\u0DD2\u0DB1\u0DCA",
154
+ "\u0DB6\u0D9A\u0DCA",
155
+ "\u0DC0\u0DD9\u0DC3\u0D9A\u0DCA",
156
+ "\u0DB4\u0DDC\u0DC3\u0DDC\u0DB1\u0DCA",
157
+ "\u0D87\u0DC3\u0DC5",
158
+ "\u0DB1\u0DD2\u0D9A\u0DD2\u0DAB\u0DD2",
159
+ "\u0DB6\u0DD2\u0DB1\u0DBB",
160
+ "\u0DC0\u0DB4\u0DCA",
161
+ "\u0D89\u0DBD\u0DCA",
162
+ "\u0D8B\u0DB3\u0DD4\u0D85\u0DB4\u0DCA"
163
+ ],
164
+ weekdayNames: [
165
+ "\u0D89\u0DBB\u0DD2\u0DAF\u0DCF",
166
+ "\u0DC3\u0DB3\u0DD4\u0DAF\u0DCF",
167
+ "\u0D85\u0D9F\u0DC4\u0DBB\u0DD4\u0DC0\u0DCF\u0DAF\u0DCF",
168
+ "\u0DB6\u0DAF\u0DCF\u0DAF\u0DCF",
169
+ "\u0DB6\u0DCA\u200D\u0DBB\u0DC4\u0DC3\u0DCA\u0DB4\u0DAD\u0DD2\u0DB1\u0DCA\u0DAF\u0DCF",
170
+ "\u0DC3\u0DD2\u0D9A\u0DD4\u0DBB\u0DCF\u0DAF\u0DCF",
171
+ "\u0DC3\u0DD9\u0DB1\u0DC3\u0DD4\u0DBB\u0DCF\u0DAF\u0DCF"
172
+ ],
173
+ shortWeekdayNames: ["\u0D89", "\u0DC3", "\u0D85", "\u0DB6", "\u0DB6\u0DCA\u200D\u0DBB", "\u0DC3\u0DD2", "\u0DC3\u0DD9"],
174
+ buddhistEra: "\u0DB6\u0DD4\u0DAF\u0DCA\u0DB0 \u0DC0\u0DBB\u0DCA\u0DC2",
175
+ today: "\u0D85\u0DAF",
176
+ clear: "\u0DB4\u0DD2\u0DBB\u0DD2\u0DC3\u0DD2\u0DAF\u0DD4 \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",
177
+ selectMonth: "\u0DB8\u0DCF\u0DC3\u0DBA \u0DAD\u0DDD\u0DBB\u0DB1\u0DCA\u0DB1",
178
+ poyaDay: "\u0DB4\u0DDD\u0DBA \u0DAF\u0DD2\u0DB1"
179
+ }
180
+ }
181
+ };
182
+
183
+ // src/i18n/merge.ts
184
+ function deepMerge(base, overrides) {
185
+ const result = { ...base };
186
+ for (const key of Object.keys(overrides)) {
187
+ const overrideValue = overrides[key];
188
+ const baseValue = base[key];
189
+ if (overrideValue !== void 0 && typeof overrideValue === "object" && overrideValue !== null && !Array.isArray(overrideValue) && typeof baseValue === "object" && baseValue !== null && !Array.isArray(baseValue)) {
190
+ result[key] = deepMerge(baseValue, overrideValue);
191
+ } else if (overrideValue !== void 0) {
192
+ result[key] = overrideValue;
193
+ }
194
+ }
195
+ return result;
196
+ }
197
+
198
+ // src/i18n/resolve.ts
199
+ function resolvePath(source, path) {
200
+ const value = path.split(".").reduce((current, segment) => {
201
+ if (current === null || current === void 0 || typeof current !== "object") {
202
+ return void 0;
203
+ }
204
+ return current[segment];
205
+ }, source);
206
+ return typeof value === "string" ? value : void 0;
207
+ }
208
+ function getTextFieldStrings(translations, variant) {
209
+ return translations.textField[variant];
210
+ }
211
+ function resolveTranslation(translationsByLocale, path, locale) {
212
+ return resolvePath(translationsByLocale[locale], path) ?? resolvePath(translationsByLocale.en, path) ?? path;
213
+ }
214
+
215
+ // src/i18n/applyTranslations.ts
216
+ var currentLocale = "en";
217
+ var userOverrides = {};
218
+ var localeListeners = /* @__PURE__ */ new Set();
219
+ function getMergedTranslations(locale) {
220
+ const base = defaultTranslations[locale];
221
+ const overrides = userOverrides[locale];
222
+ return overrides ? deepMerge(base, overrides) : base;
223
+ }
224
+ function notifyLocaleListeners() {
225
+ localeListeners.forEach((listener) => listener());
226
+ }
227
+ function applyDocumentLang(locale) {
228
+ if (typeof document !== "undefined") {
229
+ document.documentElement.lang = locale === "si" ? "si" : "en";
230
+ }
231
+ }
232
+ function applyTranslations(options = {}) {
233
+ if (options.locale !== void 0) {
234
+ currentLocale = options.locale;
235
+ applyDocumentLang(currentLocale);
236
+ notifyLocaleListeners();
237
+ }
238
+ if (options.overrides !== void 0) {
239
+ userOverrides = deepMerge(userOverrides, options.overrides);
240
+ notifyLocaleListeners();
241
+ }
242
+ return getMergedTranslations(currentLocale);
243
+ }
244
+ function setLocale(locale) {
245
+ return applyTranslations({ locale });
246
+ }
247
+ function getLocale() {
248
+ return currentLocale;
249
+ }
250
+ function resetTranslations() {
251
+ userOverrides = {};
252
+ notifyLocaleListeners();
253
+ return getMergedTranslations(currentLocale);
254
+ }
255
+ function t(path, locale = currentLocale) {
256
+ const merged = {
257
+ en: getMergedTranslations("en"),
258
+ si: getMergedTranslations("si")
259
+ };
260
+ return resolveTranslation(merged, path, locale);
261
+ }
262
+ function getTextFieldTranslation(variant, locale = currentLocale) {
263
+ return getTextFieldStrings(getMergedTranslations(locale), variant);
264
+ }
265
+ function getCalendarTranslation(locale = currentLocale) {
266
+ return getMergedTranslations(locale).calendar ?? defaultTranslations[locale].calendar;
267
+ }
268
+ function subscribeLocaleChange(listener) {
269
+ localeListeners.add(listener);
270
+ return () => localeListeners.delete(listener);
271
+ }
272
+
273
+ // src/components/TextField.ts
274
+ var TextField = class {
275
+ element;
276
+ input;
277
+ labelEl;
278
+ unsubscribeLocale;
279
+ localeAware;
280
+ fixedLabel;
281
+ fixedPlaceholder;
282
+ fixedValue;
283
+ variant;
284
+ labelKey;
285
+ placeholderKey;
286
+ sinhalaExplicit;
287
+ sinhalaEnabled;
288
+ constructor(options = {}) {
289
+ const {
290
+ variant,
291
+ labelKey,
292
+ placeholderKey,
293
+ label,
294
+ placeholder,
295
+ type = "text",
296
+ value,
297
+ id = `helaui-field-${Math.random().toString(36).slice(2, 9)}`,
298
+ sinhala
299
+ } = options;
300
+ this.localeAware = !!(variant || labelKey || placeholderKey);
301
+ this.variant = variant;
302
+ this.labelKey = labelKey;
303
+ this.placeholderKey = placeholderKey;
304
+ this.fixedLabel = label;
305
+ this.fixedPlaceholder = placeholder;
306
+ this.fixedValue = value;
307
+ this.sinhalaExplicit = sinhala !== void 0;
308
+ this.sinhalaEnabled = sinhala ?? (this.localeAware ? getLocale() === "si" : true);
309
+ const resolved = this.resolveStrings();
310
+ this.element = document.createElement("div");
311
+ this.element.className = "helaui-textfield";
312
+ if (resolved.label) {
313
+ this.labelEl = document.createElement("label");
314
+ this.labelEl.className = "helaui-textfield__label";
315
+ this.labelEl.htmlFor = id;
316
+ this.labelEl.textContent = resolved.label;
317
+ if (this.sinhalaEnabled) this.labelEl.classList.add(SINHALA_FONT_CLASS);
318
+ this.element.appendChild(this.labelEl);
319
+ }
320
+ this.input = document.createElement("input");
321
+ this.input.className = "helaui-textfield__input";
322
+ this.input.id = id;
323
+ this.input.type = type;
324
+ this.input.placeholder = resolved.placeholder;
325
+ this.input.value = resolved.value;
326
+ if (this.sinhalaEnabled) this.input.classList.add(SINHALA_FONT_CLASS);
327
+ this.element.appendChild(this.input);
328
+ if (this.localeAware) {
329
+ this.unsubscribeLocale = subscribeLocaleChange(() => this.applyLocaleStrings());
330
+ }
331
+ }
332
+ resolveStrings() {
333
+ const fromVariant = this.variant ? getTextFieldTranslation(this.variant) : void 0;
334
+ const label = this.fixedLabel ?? (this.labelKey ? t(this.labelKey) : fromVariant?.label) ?? "";
335
+ const placeholder = this.fixedPlaceholder ?? (this.placeholderKey ? t(this.placeholderKey) : fromVariant?.placeholder) ?? "";
336
+ const value = this.fixedValue ?? fromVariant?.value ?? "";
337
+ return { label, placeholder, value };
338
+ }
339
+ applyLocaleStrings() {
340
+ const resolved = this.resolveStrings();
341
+ if (this.labelEl && !this.fixedLabel) {
342
+ this.labelEl.textContent = resolved.label;
343
+ }
344
+ if (!this.fixedPlaceholder) {
345
+ this.input.placeholder = resolved.placeholder;
346
+ }
347
+ if (this.fixedValue === void 0 && this.variant === "disabled") {
348
+ this.input.value = resolved.value;
349
+ }
350
+ if (!this.sinhalaExplicit) {
351
+ this.setSinhala(getLocale() === "si");
352
+ }
353
+ }
354
+ getValue() {
355
+ return this.input.value;
356
+ }
357
+ setValue(value) {
358
+ this.input.value = value;
359
+ }
360
+ focus() {
361
+ this.input.focus();
362
+ }
363
+ setDisabled(disabled) {
364
+ this.input.disabled = disabled;
365
+ this.element.classList.toggle("helaui-textfield--disabled", disabled);
366
+ }
367
+ setLabel(label) {
368
+ if (this.labelEl) {
369
+ this.labelEl.textContent = label;
370
+ }
371
+ }
372
+ setPlaceholder(placeholder) {
373
+ this.input.placeholder = placeholder;
374
+ }
375
+ setSinhala(enabled) {
376
+ this.input.classList.toggle(SINHALA_FONT_CLASS, enabled);
377
+ this.labelEl?.classList.toggle(SINHALA_FONT_CLASS, enabled);
378
+ }
379
+ /** Removes locale subscription. Call when discarding the field. */
380
+ destroy() {
381
+ this.unsubscribeLocale?.();
382
+ }
383
+ };
384
+
385
+ // src/assets/rain/fritter.png
386
+ var fritter_default = "./fritter-INYFVKEH.png";
387
+
388
+ // src/assets/rain/kokis.png
389
+ var kokis_default = "./kokis-R6R5HA62.png";
390
+
391
+ // src/assets/rain/leaf.png
392
+ var leaf_default = "./leaf-DEJYVWQI.png";
393
+
394
+ // src/assets/rain/swirl.png
395
+ var swirl_default = "./swirl-RVLEF6L5.png";
396
+
397
+ // src/assets/rain/builtinImages.ts
398
+ var BUILTIN_RAIN_IMAGES = [fritter_default, swirl_default, kokis_default, leaf_default];
399
+
400
+ // src/components/RainBackground.ts
401
+ function randomBetween(min, max) {
402
+ return min + Math.random() * (max - min);
403
+ }
404
+ function pick(items) {
405
+ return items[Math.floor(Math.random() * items.length)];
406
+ }
407
+ var RainBackground = class {
408
+ element;
409
+ constructor(options = {}) {
410
+ const {
411
+ images = [...BUILTIN_RAIN_IMAGES],
412
+ density = 28,
413
+ minSize = 28,
414
+ maxSize = 28,
415
+ minDuration = 8,
416
+ maxDuration = 18,
417
+ target = document.body,
418
+ zIndex = 0
419
+ } = options;
420
+ if (images.length === 0) {
421
+ throw new Error("RainBackground requires at least one image URL.");
422
+ }
423
+ this.element = document.createElement("div");
424
+ this.element.className = "helaui-rain-background";
425
+ this.element.setAttribute("aria-hidden", "true");
426
+ this.element.style.zIndex = String(zIndex);
427
+ for (let index = 0; index < density; index += 1) {
428
+ this.element.appendChild(this.createDrop(images, minSize, maxSize, minDuration, maxDuration));
429
+ }
430
+ target.prepend(this.element);
431
+ }
432
+ createDrop(images, minSize, maxSize, minDuration, maxDuration) {
433
+ const drop = document.createElement("img");
434
+ const duration = randomBetween(minDuration, maxDuration);
435
+ const size = randomBetween(minSize, maxSize);
436
+ drop.className = "helaui-rain-background__drop";
437
+ drop.src = pick(images);
438
+ drop.alt = "";
439
+ drop.decoding = "async";
440
+ drop.loading = "lazy";
441
+ drop.draggable = false;
442
+ drop.style.setProperty("--helaui-rain-x", `${randomBetween(0, 100)}%`);
443
+ drop.style.setProperty("--helaui-rain-size", `${size}px`);
444
+ drop.style.setProperty("--helaui-rain-duration", `${duration.toFixed(2)}s`);
445
+ drop.style.setProperty("--helaui-rain-delay", `-${randomBetween(0, duration).toFixed(2)}s`);
446
+ drop.style.setProperty("--helaui-rain-rotation", `${randomBetween(-35, 35).toFixed(1)}deg`);
447
+ drop.style.setProperty("--helaui-rain-spin", `${randomBetween(90, 360).toFixed(0)}deg`);
448
+ drop.style.setProperty("--helaui-rain-drift", `${randomBetween(-40, 40).toFixed(0)}px`);
449
+ return drop;
450
+ }
451
+ /** Removes the background from the DOM. */
452
+ destroy() {
453
+ this.element.remove();
454
+ }
455
+ };
456
+ var DEFAULT_RAIN_IMAGES = ["fritter.png", "swirl.png", "kokis.png", "leaf.png"];
457
+ function getDefaultRainImageUrls(basePath) {
458
+ const normalizedBase = basePath.endsWith("/") ? basePath : `${basePath}/`;
459
+ return DEFAULT_RAIN_IMAGES.map((name) => `${normalizedBase}${name}`);
460
+ }
461
+
462
+ // src/components/Calendar.ts
463
+ var SINHALA_NUMERALS = ["\u0DE6", "\u0DE7", "\u0DE8", "\u0DE9", "\u0DEA", "\u0DEB", "\u0DEC", "\u0DED", "\u0DEE", "\u0DEF"];
464
+ function formatSinhalaNumeral(num) {
465
+ return num.toString().replace(/[0-9]/g, (digit) => SINHALA_NUMERALS[parseInt(digit, 10)]);
466
+ }
467
+ var SINHALA_MONTH_NAMES = [
468
+ "\u0DAF\u0DD4\u0DBB\u0DD4\u0DAD\u0DD4",
469
+ "\u0DB1\u0DC0\u0DB8\u0DCA",
470
+ "\u0DB8\u0DD0\u0DAF\u0DD2\u0DB1\u0DCA",
471
+ "\u0DB6\u0D9A\u0DCA",
472
+ "\u0DC0\u0DD9\u0DC3\u0D9A\u0DCA",
473
+ "\u0DB4\u0DDC\u0DC3\u0DDC\u0DB1\u0DCA",
474
+ "\u0D87\u0DC3\u0DC5",
475
+ "\u0DB1\u0DD2\u0D9A\u0DD2\u0DAB\u0DD2",
476
+ "\u0DB6\u0DD2\u0DB1\u0DBB",
477
+ "\u0DC0\u0DB4\u0DCA",
478
+ "\u0D89\u0DBD\u0DCA",
479
+ "\u0D8B\u0DB3\u0DD4\u0D85\u0DB4\u0DCA"
480
+ ];
481
+ var Calendar = class {
482
+ element;
483
+ selectedDate = null;
484
+ viewYear;
485
+ viewMonth;
486
+ // 0-11
487
+ showBuddhistEra;
488
+ highlightToday;
489
+ sinhalaExplicit;
490
+ sinhalaEnabled;
491
+ minDate;
492
+ maxDate;
493
+ poyaDatesSet;
494
+ onSelectCallback;
495
+ onMonthChangeCallback;
496
+ unsubscribeLocale;
497
+ /** True when the caller passed an explicit height — prevents auto six-row adjustment */
498
+ customHeight;
499
+ // DOM Elements
500
+ monthTitleEl;
501
+ subTitleEl;
502
+ eraBadgeEl;
503
+ weekdaysEl;
504
+ daysGridEl;
505
+ footerEl;
506
+ selectedTextEl;
507
+ monthPopoverEl = null;
508
+ constructor(options = {}) {
509
+ const {
510
+ value,
511
+ initialDate,
512
+ minDate,
513
+ maxDate,
514
+ showBuddhistEra = true,
515
+ sinhala,
516
+ poyaDates = [],
517
+ highlightToday = true,
518
+ width,
519
+ height,
520
+ onSelect,
521
+ onMonthChange
522
+ } = options;
523
+ if (value) {
524
+ this.selectedDate = typeof value === "string" ? new Date(value) : new Date(value);
525
+ }
526
+ const initRef = this.selectedDate || initialDate || /* @__PURE__ */ new Date();
527
+ this.viewYear = initRef.getFullYear();
528
+ this.viewMonth = initRef.getMonth();
529
+ this.minDate = minDate;
530
+ this.maxDate = maxDate;
531
+ this.showBuddhistEra = showBuddhistEra;
532
+ this.highlightToday = highlightToday;
533
+ this.onSelectCallback = onSelect;
534
+ this.onMonthChangeCallback = onMonthChange;
535
+ this.poyaDatesSet = new Set(
536
+ poyaDates.map(
537
+ (d) => typeof d === "string" ? d : `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(
538
+ d.getDate()
539
+ ).padStart(2, "0")}`
540
+ )
541
+ );
542
+ this.sinhalaExplicit = sinhala !== void 0;
543
+ this.sinhalaEnabled = sinhala ?? getLocale() === "si";
544
+ this.customHeight = height !== void 0;
545
+ this.element = document.createElement("div");
546
+ this.element.className = "helaui-calendar";
547
+ this.element.style.width = width ?? "360px";
548
+ this.element.style.height = height ?? "420px";
549
+ if (this.sinhalaEnabled) this.element.classList.add(SINHALA_FONT_CLASS);
550
+ this.renderSkeleton();
551
+ this.render();
552
+ this.unsubscribeLocale = subscribeLocaleChange(() => {
553
+ if (!this.sinhalaExplicit) {
554
+ this.setSinhala(getLocale() === "si");
555
+ } else {
556
+ this.render();
557
+ }
558
+ });
559
+ }
560
+ renderSkeleton() {
561
+ const header = document.createElement("div");
562
+ header.className = "helaui-calendar__header";
563
+ const prevBtn = document.createElement("button");
564
+ prevBtn.type = "button";
565
+ prevBtn.className = "helaui-calendar__nav-btn";
566
+ prevBtn.innerHTML = "&#10094;";
567
+ prevBtn.ariaLabel = "Previous Month";
568
+ prevBtn.addEventListener("click", () => this.prevMonth());
569
+ const titleWrap = document.createElement("div");
570
+ titleWrap.className = "helaui-calendar__title-wrap";
571
+ titleWrap.title = "Click to choose month";
572
+ titleWrap.addEventListener("click", (e) => {
573
+ e.stopPropagation();
574
+ this.toggleMonthPopover();
575
+ });
576
+ this.monthTitleEl = document.createElement("span");
577
+ this.monthTitleEl.className = "helaui-calendar__month-name";
578
+ this.subTitleEl = document.createElement("span");
579
+ this.subTitleEl.className = "helaui-calendar__sub-name";
580
+ this.eraBadgeEl = document.createElement("span");
581
+ this.eraBadgeEl.className = "helaui-calendar__era-badge";
582
+ titleWrap.appendChild(this.monthTitleEl);
583
+ titleWrap.appendChild(this.subTitleEl);
584
+ const nextBtn = document.createElement("button");
585
+ nextBtn.type = "button";
586
+ nextBtn.className = "helaui-calendar__nav-btn";
587
+ nextBtn.innerHTML = "&#10095;";
588
+ nextBtn.ariaLabel = "Next Month";
589
+ nextBtn.addEventListener("click", () => this.nextMonth());
590
+ header.appendChild(prevBtn);
591
+ header.appendChild(titleWrap);
592
+ header.appendChild(nextBtn);
593
+ this.weekdaysEl = document.createElement("div");
594
+ this.weekdaysEl.className = "helaui-calendar__weekdays";
595
+ this.daysGridEl = document.createElement("div");
596
+ this.daysGridEl.className = "helaui-calendar__days";
597
+ this.footerEl = document.createElement("div");
598
+ this.footerEl.className = "helaui-calendar__footer";
599
+ const todayBtn = document.createElement("button");
600
+ todayBtn.type = "button";
601
+ todayBtn.className = "helaui-calendar__footer-btn";
602
+ todayBtn.dataset.action = "today";
603
+ todayBtn.addEventListener("click", () => this.goToToday());
604
+ this.selectedTextEl = document.createElement("span");
605
+ this.selectedTextEl.className = "helaui-calendar__selected-text";
606
+ const clearBtn = document.createElement("button");
607
+ clearBtn.type = "button";
608
+ clearBtn.className = "helaui-calendar__footer-btn";
609
+ clearBtn.dataset.action = "clear";
610
+ clearBtn.addEventListener("click", () => this.clear());
611
+ this.footerEl.appendChild(todayBtn);
612
+ this.footerEl.appendChild(this.selectedTextEl);
613
+ this.footerEl.appendChild(clearBtn);
614
+ this.element.appendChild(header);
615
+ this.element.appendChild(this.weekdaysEl);
616
+ this.element.appendChild(this.daysGridEl);
617
+ this.element.appendChild(this.footerEl);
618
+ document.addEventListener("click", (e) => {
619
+ if (this.monthPopoverEl && !this.element.contains(e.target)) {
620
+ this.closeMonthPopover();
621
+ }
622
+ });
623
+ }
624
+ render() {
625
+ const locale = getLocale();
626
+ const isSinhalaMode = this.sinhalaEnabled || locale === "si";
627
+ const calendarStrings = getCalendarTranslation();
628
+ const sinhalaMonthName = calendarStrings.sinhalaMonthNames?.[this.viewMonth] ?? SINHALA_MONTH_NAMES[this.viewMonth];
629
+ const englishMonthName = calendarStrings.monthNames?.[this.viewMonth] ?? "Month";
630
+ const beYear = this.viewYear + 543;
631
+ const yearDisplay = this.viewYear.toString();
632
+ const beYearDisplay = beYear.toString();
633
+ if (isSinhalaMode) {
634
+ this.monthTitleEl.textContent = sinhalaMonthName;
635
+ this.subTitleEl.textContent = yearDisplay;
636
+ if (this.showBuddhistEra) {
637
+ this.eraBadgeEl.textContent = `\u0DB6\u0DD4.\u0DC0. ${beYearDisplay}`;
638
+ this.subTitleEl.appendChild(this.eraBadgeEl);
639
+ }
640
+ } else {
641
+ this.monthTitleEl.textContent = englishMonthName;
642
+ this.subTitleEl.textContent = yearDisplay;
643
+ if (this.showBuddhistEra) {
644
+ this.eraBadgeEl.textContent = `BE ${beYearDisplay}`;
645
+ this.subTitleEl.appendChild(this.eraBadgeEl);
646
+ }
647
+ }
648
+ this.weekdaysEl.innerHTML = "";
649
+ const shortWeekdays = calendarStrings.shortWeekdayNames || ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
650
+ const fullWeekdays = calendarStrings.weekdayNames || [
651
+ "Sunday",
652
+ "Monday",
653
+ "Tuesday",
654
+ "Wednesday",
655
+ "Thursday",
656
+ "Friday",
657
+ "Saturday"
658
+ ];
659
+ shortWeekdays.forEach((shortDay, i) => {
660
+ const dayEl = document.createElement("div");
661
+ dayEl.className = "helaui-calendar__weekday";
662
+ if (i === 0 || i === 6) {
663
+ dayEl.classList.add("helaui-calendar__weekday--weekend");
664
+ }
665
+ dayEl.textContent = shortDay;
666
+ dayEl.title = fullWeekdays[i];
667
+ this.weekdaysEl.appendChild(dayEl);
668
+ });
669
+ this.daysGridEl.innerHTML = "";
670
+ const firstDayIndex = new Date(this.viewYear, this.viewMonth, 1).getDay();
671
+ const daysInMonth = new Date(this.viewYear, this.viewMonth + 1, 0).getDate();
672
+ const daysInPrevMonth = new Date(this.viewYear, this.viewMonth, 0).getDate();
673
+ const today = /* @__PURE__ */ new Date();
674
+ for (let i = firstDayIndex - 1; i >= 0; i--) {
675
+ const dayNum = daysInPrevMonth - i;
676
+ const prevDate = new Date(this.viewYear, this.viewMonth - 1, dayNum);
677
+ const dayBtn = this.createDayButton(prevDate, dayNum, true);
678
+ this.daysGridEl.appendChild(dayBtn);
679
+ }
680
+ for (let dayNum = 1; dayNum <= daysInMonth; dayNum++) {
681
+ const currDate = new Date(this.viewYear, this.viewMonth, dayNum);
682
+ const isToday = this.highlightToday && today.getFullYear() === currDate.getFullYear() && today.getMonth() === currDate.getMonth() && today.getDate() === currDate.getDate();
683
+ const isSelected = !!this.selectedDate && this.selectedDate.getFullYear() === currDate.getFullYear() && this.selectedDate.getMonth() === currDate.getMonth() && this.selectedDate.getDate() === currDate.getDate();
684
+ const dayBtn = this.createDayButton(currDate, dayNum, false, isToday, isSelected);
685
+ this.daysGridEl.appendChild(dayBtn);
686
+ }
687
+ const totalCells = firstDayIndex + daysInMonth;
688
+ const remainingCells = (7 - totalCells % 7) % 7;
689
+ for (let dayNum = 1; dayNum <= remainingCells; dayNum++) {
690
+ const nextDate = new Date(this.viewYear, this.viewMonth + 1, dayNum);
691
+ const dayBtn = this.createDayButton(nextDate, dayNum, true);
692
+ this.daysGridEl.appendChild(dayBtn);
693
+ }
694
+ const needsSixRows = firstDayIndex + daysInMonth > 35;
695
+ this.element.classList.toggle("helaui-calendar--six-rows", needsSixRows && !this.customHeight);
696
+ if (!this.customHeight) {
697
+ this.element.style.height = needsSixRows ? "468px" : "420px";
698
+ }
699
+ const todayBtn = this.footerEl.querySelector('[data-action="today"]');
700
+ if (todayBtn) todayBtn.textContent = calendarStrings.today || "Today";
701
+ const clearBtn = this.footerEl.querySelector('[data-action="clear"]');
702
+ if (clearBtn) clearBtn.textContent = calendarStrings.clear || "Clear";
703
+ this.updateSelectedText();
704
+ }
705
+ createDayButton(date, dayNum, isOutside, isToday = false, isSelected = false) {
706
+ const btn = document.createElement("button");
707
+ btn.type = "button";
708
+ btn.className = "helaui-calendar__day";
709
+ btn.textContent = dayNum.toString();
710
+ const dateKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(
711
+ 2,
712
+ "0"
713
+ )}-${String(date.getDate()).padStart(2, "0")}`;
714
+ if (isOutside) btn.classList.add("helaui-calendar__day--outside");
715
+ if (isToday) btn.classList.add("helaui-calendar__day--today");
716
+ if (isSelected) btn.classList.add("helaui-calendar__day--selected");
717
+ if (this.poyaDatesSet.has(dateKey) || date.getDate() === 15 && !isOutside) {
718
+ btn.classList.add("helaui-calendar__day--poya");
719
+ const poyaName = SINHALA_MONTH_NAMES[date.getMonth()] + " \u0DB4\u0DDD\u0DBA";
720
+ btn.title = `${dateKey} (${poyaName})`;
721
+ }
722
+ if (this.minDate && date < this.minDate || this.maxDate && date > this.maxDate) {
723
+ btn.classList.add("helaui-calendar__day--disabled");
724
+ btn.disabled = true;
725
+ } else {
726
+ btn.addEventListener("click", () => this.selectDate(date));
727
+ }
728
+ return btn;
729
+ }
730
+ updateSelectedText() {
731
+ if (!this.selectedDate) {
732
+ this.selectedTextEl.textContent = "";
733
+ return;
734
+ }
735
+ this.selectedTextEl.textContent = this.getFormattedSinhalaDate(this.selectedDate);
736
+ }
737
+ /** Gets formatted string e.g. "2026 වෙසක් 15" (Western digits) */
738
+ getFormattedSinhalaDate(date) {
739
+ const year = date.getFullYear();
740
+ const monthName = SINHALA_MONTH_NAMES[date.getMonth()];
741
+ const day = date.getDate();
742
+ return `${year} ${monthName} ${day}`;
743
+ }
744
+ selectDate(date) {
745
+ this.selectedDate = new Date(date);
746
+ this.viewYear = date.getFullYear();
747
+ this.viewMonth = date.getMonth();
748
+ this.render();
749
+ const formatted = this.getFormattedSinhalaDate(this.selectedDate);
750
+ this.onSelectCallback?.(this.selectedDate, formatted);
751
+ }
752
+ getValue() {
753
+ return this.selectedDate ? new Date(this.selectedDate) : null;
754
+ }
755
+ setValue(value) {
756
+ if (!value) {
757
+ this.selectedDate = null;
758
+ } else {
759
+ this.selectedDate = typeof value === "string" ? new Date(value) : new Date(value);
760
+ this.viewYear = this.selectedDate.getFullYear();
761
+ this.viewMonth = this.selectedDate.getMonth();
762
+ }
763
+ this.render();
764
+ }
765
+ setSinhala(enabled) {
766
+ this.sinhalaEnabled = enabled;
767
+ this.element.classList.toggle(SINHALA_FONT_CLASS, enabled);
768
+ this.render();
769
+ }
770
+ setShowBuddhistEra(show) {
771
+ this.showBuddhistEra = show;
772
+ this.render();
773
+ }
774
+ nextMonth() {
775
+ if (this.viewMonth === 11) {
776
+ this.viewMonth = 0;
777
+ this.viewYear++;
778
+ } else {
779
+ this.viewMonth++;
780
+ }
781
+ this.render();
782
+ this.onMonthChangeCallback?.(this.viewYear, this.viewMonth);
783
+ }
784
+ prevMonth() {
785
+ if (this.viewMonth === 0) {
786
+ this.viewMonth = 11;
787
+ this.viewYear--;
788
+ } else {
789
+ this.viewMonth--;
790
+ }
791
+ this.render();
792
+ this.onMonthChangeCallback?.(this.viewYear, this.viewMonth);
793
+ }
794
+ goToToday() {
795
+ const today = /* @__PURE__ */ new Date();
796
+ this.viewYear = today.getFullYear();
797
+ this.viewMonth = today.getMonth();
798
+ this.selectDate(today);
799
+ }
800
+ clear() {
801
+ this.selectedDate = null;
802
+ this.render();
803
+ }
804
+ toggleMonthPopover() {
805
+ if (this.monthPopoverEl) {
806
+ this.closeMonthPopover();
807
+ } else {
808
+ this.openMonthPopover();
809
+ }
810
+ }
811
+ openMonthPopover() {
812
+ this.closeMonthPopover();
813
+ this.monthPopoverEl = document.createElement("div");
814
+ this.monthPopoverEl.className = "helaui-calendar__month-popover";
815
+ const isSinhalaMode = this.sinhalaEnabled || getLocale() === "si";
816
+ const calendarStrings = getCalendarTranslation();
817
+ SINHALA_MONTH_NAMES.forEach((siMonth, i) => {
818
+ const item = document.createElement("button");
819
+ item.type = "button";
820
+ item.className = "helaui-calendar__month-item";
821
+ if (i === this.viewMonth) {
822
+ item.classList.add("helaui-calendar__month-item--active");
823
+ }
824
+ const engMonth = calendarStrings.monthNames ? calendarStrings.monthNames[i] : "";
825
+ item.textContent = isSinhalaMode ? siMonth : engMonth;
826
+ item.addEventListener("click", (e) => {
827
+ e.stopPropagation();
828
+ this.viewMonth = i;
829
+ this.closeMonthPopover();
830
+ this.render();
831
+ this.onMonthChangeCallback?.(this.viewYear, this.viewMonth);
832
+ });
833
+ this.monthPopoverEl.appendChild(item);
834
+ });
835
+ this.element.appendChild(this.monthPopoverEl);
836
+ }
837
+ closeMonthPopover() {
838
+ if (this.monthPopoverEl) {
839
+ this.monthPopoverEl.remove();
840
+ this.monthPopoverEl = null;
841
+ }
842
+ }
843
+ /** Cleans up subscriptions and event listeners */
844
+ destroy() {
845
+ this.unsubscribeLocale?.();
846
+ this.closeMonthPopover();
847
+ }
848
+ };
849
+
850
+ // src/assets/sun-mandala/ira-handa.png
851
+ var ira_handa_default = "./ira-handa-7DIWZWI4.png";
852
+
853
+ // src/assets/sun-mandala/builtinImage.ts
854
+ var BUILTIN_SUN_MANDALA_IMAGE = ira_handa_default;
855
+
856
+ // src/components/SunMandala.ts
857
+ var SunMandala = class {
858
+ element;
859
+ spinEl;
860
+ faceEl;
861
+ spinImg;
862
+ faceImg;
863
+ constructor(options = {}) {
864
+ const {
865
+ src = BUILTIN_SUN_MANDALA_IMAGE,
866
+ alt = "Sri Lankan Ira Handa sun mandala",
867
+ size = "280px",
868
+ duration = 36,
869
+ faceRadius = "22%",
870
+ paused = false
871
+ } = options;
872
+ this.element = document.createElement("div");
873
+ this.element.className = "helaui-sun-mandala";
874
+ this.element.style.setProperty("--helaui-sun-mandala-size", size);
875
+ this.element.style.setProperty("--helaui-sun-mandala-duration", `${duration}s`);
876
+ this.element.style.setProperty("--helaui-sun-mandala-face-radius", faceRadius);
877
+ this.element.setAttribute("role", "img");
878
+ this.element.setAttribute("aria-label", alt);
879
+ this.spinEl = document.createElement("div");
880
+ this.spinEl.className = "helaui-sun-mandala__spin";
881
+ this.spinEl.setAttribute("aria-hidden", "true");
882
+ this.spinImg = document.createElement("img");
883
+ this.spinImg.className = "helaui-sun-mandala__image";
884
+ this.spinImg.src = src;
885
+ this.spinImg.alt = "";
886
+ this.spinImg.draggable = false;
887
+ this.spinImg.decoding = "async";
888
+ this.spinEl.appendChild(this.spinImg);
889
+ this.faceEl = document.createElement("div");
890
+ this.faceEl.className = "helaui-sun-mandala__face";
891
+ this.faceEl.setAttribute("aria-hidden", "true");
892
+ this.faceImg = document.createElement("img");
893
+ this.faceImg.className = "helaui-sun-mandala__image";
894
+ this.faceImg.src = src;
895
+ this.faceImg.alt = "";
896
+ this.faceImg.draggable = false;
897
+ this.faceImg.decoding = "async";
898
+ this.faceEl.appendChild(this.faceImg);
899
+ this.element.appendChild(this.spinEl);
900
+ this.element.appendChild(this.faceEl);
901
+ if (paused) this.setPaused(true);
902
+ }
903
+ /** Pause or resume the aura rotation. */
904
+ setPaused(paused) {
905
+ this.element.classList.toggle("helaui-sun-mandala--paused", paused);
906
+ }
907
+ isPaused() {
908
+ return this.element.classList.contains("helaui-sun-mandala--paused");
909
+ }
910
+ /** Set full-circle rotation duration in seconds. */
911
+ setDuration(seconds) {
912
+ this.element.style.setProperty("--helaui-sun-mandala-duration", `${seconds}s`);
913
+ }
914
+ /** Update display size (width & height). */
915
+ setSize(size) {
916
+ this.element.style.setProperty("--helaui-sun-mandala-size", size);
917
+ }
918
+ /** Update the static face clip radius. */
919
+ setFaceRadius(radius) {
920
+ this.element.style.setProperty("--helaui-sun-mandala-face-radius", radius);
921
+ }
922
+ destroy() {
923
+ this.element.remove();
924
+ }
925
+ };
926
+
927
+ // src/theme/defaultTheme.ts
928
+ var defaultTheme = {
929
+ primary: "#8D153A",
930
+ secondary: "#FFBE00",
931
+ success: "#005B33",
932
+ accent: "#FF7A00",
933
+ black: "#000000",
934
+ white: "#FFFFFF",
935
+ grey: "#808080"
936
+ };
937
+
938
+ // src/theme/themeVars.ts
939
+ var THEME_VAR_MAP = {
940
+ primary: "--helaui-primary",
941
+ secondary: "--helaui-secondary",
942
+ success: "--helaui-success",
943
+ accent: "--helaui-accent",
944
+ black: "--helaui-black",
945
+ white: "--helaui-white",
946
+ grey: "--helaui-grey"
947
+ };
948
+
949
+ // src/theme/applyTheme.ts
950
+ function hexToRgba(hex, alpha) {
951
+ const normalized = hex.replace("#", "");
952
+ const full = normalized.length === 3 ? normalized.split("").map((char) => char + char).join("") : normalized.padStart(6, "0").slice(0, 6);
953
+ const r = Number.parseInt(full.slice(0, 2), 16);
954
+ const g = Number.parseInt(full.slice(2, 4), 16);
955
+ const b = Number.parseInt(full.slice(4, 6), 16);
956
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
957
+ }
958
+ function applySemanticTokens(theme, target) {
959
+ target.style.setProperty("--helaui-text", theme.black);
960
+ target.style.setProperty("--helaui-text-muted", theme.grey);
961
+ target.style.setProperty("--helaui-text-inverse", theme.white);
962
+ target.style.setProperty("--helaui-background", theme.white);
963
+ target.style.setProperty("--helaui-surface", theme.white);
964
+ target.style.setProperty("--helaui-focus", theme.primary);
965
+ target.style.setProperty("--helaui-focus-ring", hexToRgba(theme.primary, 0.2));
966
+ }
967
+ function applyTheme(overrides = {}, target = document.documentElement) {
968
+ const theme = { ...defaultTheme, ...overrides };
969
+ Object.keys(THEME_VAR_MAP).forEach((key) => {
970
+ target.style.setProperty(THEME_VAR_MAP[key], theme[key]);
971
+ });
972
+ applySemanticTokens(theme, target);
973
+ return theme;
974
+ }
975
+ function resetTheme(target = document.documentElement) {
976
+ Object.values(THEME_VAR_MAP).forEach((varName) => {
977
+ target.style.removeProperty(varName);
978
+ });
979
+ [
980
+ "--helaui-text",
981
+ "--helaui-text-muted",
982
+ "--helaui-text-inverse",
983
+ "--helaui-background",
984
+ "--helaui-surface",
985
+ "--helaui-focus",
986
+ "--helaui-focus-ring"
987
+ ].forEach((varName) => {
988
+ target.style.removeProperty(varName);
989
+ });
990
+ return { ...defaultTheme };
991
+ }
992
+ function createThemeStyle(theme = {}) {
993
+ const merged = { ...defaultTheme, ...theme };
994
+ return Object.keys(THEME_VAR_MAP).map((key) => `${THEME_VAR_MAP[key]}: ${merged[key]};`).join(" ");
995
+ }
996
+ // Annotate the CommonJS export names for ESM import in node:
997
+ 0 && (module.exports = {
998
+ BUILTIN_RAIN_IMAGES,
999
+ BUILTIN_SUN_MANDALA_IMAGE,
1000
+ Calendar,
1001
+ DEFAULT_RAIN_IMAGES,
1002
+ RainBackground,
1003
+ SINHALA_FONT_CLASS,
1004
+ SINHALA_FONT_FAMILY,
1005
+ SINHALA_MONTH_NAMES,
1006
+ SunMandala,
1007
+ THEME_VAR_MAP,
1008
+ TextField,
1009
+ applySinhalaFont,
1010
+ applyTheme,
1011
+ applyTranslations,
1012
+ createThemeStyle,
1013
+ defaultTheme,
1014
+ defaultTranslations,
1015
+ formatSinhalaNumeral,
1016
+ getCalendarTranslation,
1017
+ getDefaultRainImageUrls,
1018
+ getLocale,
1019
+ getTextFieldTranslation,
1020
+ resetTheme,
1021
+ resetTranslations,
1022
+ setLocale,
1023
+ sinhalaFontStyles,
1024
+ subscribeLocaleChange,
1025
+ t
1026
+ });