@frame-kit/utils 0.2.10 → 0.2.12

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/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ ## 0.2.11 (2026-09-14)
2
+
3
+ ### 🩹 Fixes
4
+
5
+ - **utils:** ship CommonJS alongside ESM ([#93](https://github.com/frame-kit/packages/pull/93), [#81](https://github.com/frame-kit/packages/issues/81), [#80](https://github.com/frame-kit/packages/issues/80), [#77](https://github.com/frame-kit/packages/issues/77), [#79](https://github.com/frame-kit/packages/issues/79), [#83](https://github.com/frame-kit/packages/issues/83), [#85](https://github.com/frame-kit/packages/issues/85), [#86](https://github.com/frame-kit/packages/issues/86), [#88](https://github.com/frame-kit/packages/issues/88), [#90](https://github.com/frame-kit/packages/issues/90), [#92](https://github.com/frame-kit/packages/issues/92))
6
+
7
+ ### ❤️ Thank You
8
+
9
+ - Aaron Balthaser
10
+ - abalthaser
11
+ - Claude Opus 5
12
+
13
+ ## 0.2.10 (2026-09-14)
14
+
15
+ ### 🚀 Features
16
+
17
+ - **ui-ng:** reactive i18n service and framework-agnostic core ([#91](https://github.com/frame-kit/packages/pull/91), [#81](https://github.com/frame-kit/packages/issues/81), [#80](https://github.com/frame-kit/packages/issues/80), [#77](https://github.com/frame-kit/packages/issues/77), [#79](https://github.com/frame-kit/packages/issues/79), [#83](https://github.com/frame-kit/packages/issues/83), [#85](https://github.com/frame-kit/packages/issues/85), [#86](https://github.com/frame-kit/packages/issues/86), [#88](https://github.com/frame-kit/packages/issues/88), [#90](https://github.com/frame-kit/packages/issues/90))
18
+
19
+ ### ❤️ Thank You
20
+
21
+ - Aaron Balthaser
22
+ - abalthaser
23
+ - Claude Opus 5
24
+
1
25
  ## 0.2.9 (2026-09-13)
2
26
 
3
27
  This was a version bump only for utils to align it with other projects, there were no code changes.
package/README.md CHANGED
@@ -1,7 +1,13 @@
1
1
  # @frame-kit/utils
2
2
 
3
- Framework-agnostic **color** and **date** utilities for FrameKit — no Angular, no framework
4
- dependency. Pure ESM, fully tree-shakeable.
3
+ Framework-agnostic **color**, **date** and **i18n** utilities for FrameKit — no Angular, no
4
+ framework dependency, fully tree-shakeable.
5
+
6
+ Ships **both ESM and CommonJS**. That matters because these run outside the browser as well as
7
+ in it: the i18n engine renders server-side auth pages in a NestJS app, and a CommonJS project —
8
+ most notably one testing through ts-jest — has to be able to `require` this package without
9
+ adding `transformIgnorePatterns` to work around it. `import` gets the ESM build, `require` gets
10
+ the CommonJS one, and the build fails if either stops loading.
5
11
 
6
12
  ## Install
7
13
 
package/cjs/index.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./lib/color/color.js"), exports);
5
+ tslib_1.__exportStar(require("./lib/color/color.types.js"), exports);
6
+ tslib_1.__exportStar(require("./lib/date/date.js"), exports);
7
+ tslib_1.__exportStar(require("./lib/date/date.types.js"), exports);
8
+ tslib_1.__exportStar(require("./lib/i18n/i18n.js"), exports);
9
+ tslib_1.__exportStar(require("./lib/i18n/i18n.locale.js"), exports);
10
+ tslib_1.__exportStar(require("./lib/i18n/i18n.types.js"), exports);
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/utils/src/index.ts"],"names":[],"mappings":";;;AAAA,+DAAqC;AACrC,qEAA2C;AAC3C,6DAAmC;AACnC,mEAAyC;AACzC,6DAAmC;AACnC,oEAA0C;AAC1C,mEAAyC"}
@@ -0,0 +1,393 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Color = void 0;
4
+ /**
5
+ * Lightweight, dependency-free color utility class.
6
+ *
7
+ * Supports parsing hex, rgb, hsl, and object formats.
8
+ * All manipulation methods return new instances (immutable).
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const base = new Color("#3498db");
13
+ * const darker = base.darken(0.15).toHex();
14
+ * const palette = base.palette();
15
+ * const shades = base.shades(7);
16
+ * ```
17
+ */
18
+ class Color {
19
+ constructor(input) {
20
+ var _c;
21
+ const parsed = Color.parse(input);
22
+ this._r = parsed.r;
23
+ this._g = parsed.g;
24
+ this._b = parsed.b;
25
+ this._a = (_c = parsed.a) !== null && _c !== void 0 ? _c : 1;
26
+ }
27
+ // ---------------------------------------------------------------------------
28
+ // Static factory
29
+ // ---------------------------------------------------------------------------
30
+ static random() {
31
+ return new Color({
32
+ r: Math.floor(Math.random() * 256),
33
+ g: Math.floor(Math.random() * 256),
34
+ b: Math.floor(Math.random() * 256),
35
+ });
36
+ }
37
+ static mix(color1, color2, amount = 0.5) {
38
+ const c1 = color1 instanceof Color ? color1 : new Color(color1);
39
+ const c2 = color2 instanceof Color ? color2 : new Color(color2);
40
+ return c1.mix(c2, amount);
41
+ }
42
+ static scale(colors, steps) {
43
+ if (colors.length < 2 || steps < 2) {
44
+ return colors.map((c) => (c instanceof Color ? c : new Color(c)).toHex());
45
+ }
46
+ const result = [];
47
+ const segments = colors.length - 1;
48
+ const stepsPerSegment = Math.max(1, Math.floor((steps - 1) / segments));
49
+ for (let i = 0; i < segments; i++) {
50
+ const c1 = colors[i] instanceof Color
51
+ ? colors[i]
52
+ : new Color(colors[i]);
53
+ const c2 = colors[i + 1] instanceof Color
54
+ ? colors[i + 1]
55
+ : new Color(colors[i + 1]);
56
+ const count = i === segments - 1 ? steps - result.length : stepsPerSegment;
57
+ for (let j = 0; j < count; j++) {
58
+ const t = count === 1 ? 0 : j / (count - 1);
59
+ result.push(c1.mix(c2, t).toHex());
60
+ }
61
+ }
62
+ return result;
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Parsing
66
+ // ---------------------------------------------------------------------------
67
+ static parse(input) {
68
+ if (typeof input === 'string') {
69
+ return Color.parseString(input);
70
+ }
71
+ if ('r' in input) {
72
+ return {
73
+ r: Color.clamp(input.r, 0, 255),
74
+ g: Color.clamp(input.g, 0, 255),
75
+ b: Color.clamp(input.b, 0, 255),
76
+ a: input.a != null ? Color.clamp(input.a, 0, 1) : 1,
77
+ };
78
+ }
79
+ if ('h' in input) {
80
+ const rgb = Color.hslToRgb(input.h, input.s, input.l);
81
+ return Object.assign(Object.assign({}, rgb), { a: input.a != null ? Color.clamp(input.a, 0, 1) : 1 });
82
+ }
83
+ throw new Error(`Invalid color input: ${JSON.stringify(input)}`);
84
+ }
85
+ static parseString(str) {
86
+ const s = str.trim();
87
+ // Hex
88
+ if (s.startsWith('#')) {
89
+ return Color.parseHex(s);
90
+ }
91
+ // RGB/RGBA
92
+ const rgbMatch = s.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)/);
93
+ if (rgbMatch) {
94
+ return {
95
+ r: Color.clamp(parseInt(rgbMatch[1], 10), 0, 255),
96
+ g: Color.clamp(parseInt(rgbMatch[2], 10), 0, 255),
97
+ b: Color.clamp(parseInt(rgbMatch[3], 10), 0, 255),
98
+ a: rgbMatch[4] != null ? Color.clamp(parseFloat(rgbMatch[4]), 0, 1) : 1,
99
+ };
100
+ }
101
+ // HSL/HSLA
102
+ const hslMatch = s.match(/hsla?\(\s*([\d.]+)\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%\s*(?:,\s*([\d.]+))?\s*\)/);
103
+ if (hslMatch) {
104
+ const h = parseFloat(hslMatch[1]);
105
+ const sat = parseFloat(hslMatch[2]) / 100;
106
+ const l = parseFloat(hslMatch[3]) / 100;
107
+ const a = hslMatch[4] != null ? Color.clamp(parseFloat(hslMatch[4]), 0, 1) : 1;
108
+ const rgb = Color.hslToRgb(h, sat, l);
109
+ return Object.assign(Object.assign({}, rgb), { a });
110
+ }
111
+ throw new Error(`Cannot parse color string: "${str}"`);
112
+ }
113
+ static parseHex(hex) {
114
+ let h = hex.replace('#', '');
115
+ if (h.length === 3) {
116
+ h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
117
+ }
118
+ if (h.length === 8) {
119
+ return {
120
+ r: parseInt(h.substring(0, 2), 16),
121
+ g: parseInt(h.substring(2, 4), 16),
122
+ b: parseInt(h.substring(4, 6), 16),
123
+ a: parseInt(h.substring(6, 8), 16) / 255,
124
+ };
125
+ }
126
+ if (h.length !== 6) {
127
+ throw new Error(`Invalid hex color: "${hex}"`);
128
+ }
129
+ return {
130
+ r: parseInt(h.substring(0, 2), 16),
131
+ g: parseInt(h.substring(2, 4), 16),
132
+ b: parseInt(h.substring(4, 6), 16),
133
+ a: 1,
134
+ };
135
+ }
136
+ // ---------------------------------------------------------------------------
137
+ // Conversion outputs
138
+ // ---------------------------------------------------------------------------
139
+ toHex() {
140
+ const r = Color.toHexPart(this._r);
141
+ const g = Color.toHexPart(this._g);
142
+ const b = Color.toHexPart(this._b);
143
+ return `#${r}${g}${b}`;
144
+ }
145
+ toRgb() {
146
+ return { r: this._r, g: this._g, b: this._b, a: this._a };
147
+ }
148
+ toRgbString() {
149
+ if (this._a < 1) {
150
+ return `rgba(${this._r}, ${this._g}, ${this._b}, ${this._a})`;
151
+ }
152
+ return `rgb(${this._r}, ${this._g}, ${this._b})`;
153
+ }
154
+ toHsl() {
155
+ const hsl = Color.rgbToHsl(this._r, this._g, this._b);
156
+ return Object.assign(Object.assign({}, hsl), { a: this._a });
157
+ }
158
+ toHslString() {
159
+ const hsl = this.toHsl();
160
+ const h = Math.round(hsl.h);
161
+ const s = Math.round(hsl.s * 100);
162
+ const l = Math.round(hsl.l * 100);
163
+ if (this._a < 1) {
164
+ return `hsla(${h}, ${s}%, ${l}%, ${this._a})`;
165
+ }
166
+ return `hsl(${h}, ${s}%, ${l}%)`;
167
+ }
168
+ // ---------------------------------------------------------------------------
169
+ // Manipulation (immutable — returns new Color)
170
+ // ---------------------------------------------------------------------------
171
+ lighten(amount) {
172
+ const hsl = this.toHsl();
173
+ return Color.fromHsl(hsl.h, hsl.s, Color.clamp(hsl.l + amount, 0, 1), hsl.a);
174
+ }
175
+ darken(amount) {
176
+ const hsl = this.toHsl();
177
+ return Color.fromHsl(hsl.h, hsl.s, Color.clamp(hsl.l - amount, 0, 1), hsl.a);
178
+ }
179
+ saturate(amount) {
180
+ const hsl = this.toHsl();
181
+ return Color.fromHsl(hsl.h, Color.clamp(hsl.s + amount, 0, 1), hsl.l, hsl.a);
182
+ }
183
+ desaturate(amount) {
184
+ const hsl = this.toHsl();
185
+ return Color.fromHsl(hsl.h, Color.clamp(hsl.s - amount, 0, 1), hsl.l, hsl.a);
186
+ }
187
+ alpha(value) {
188
+ return new Color({
189
+ r: this._r,
190
+ g: this._g,
191
+ b: this._b,
192
+ a: Color.clamp(value, 0, 1),
193
+ });
194
+ }
195
+ // ---------------------------------------------------------------------------
196
+ // Shade system
197
+ // ---------------------------------------------------------------------------
198
+ /**
199
+ * Step-based shading.
200
+ * Positive steps = lighter, negative steps = darker.
201
+ */
202
+ shade(steps, stepSize = 0.1) {
203
+ const amount = steps * stepSize;
204
+ if (amount > 0) {
205
+ return this.lighten(amount);
206
+ }
207
+ return this.darken(Math.abs(amount));
208
+ }
209
+ /**
210
+ * Generate an array of shades — lighter on one end, darker on the other.
211
+ * The original color sits in the middle.
212
+ */
213
+ shades(count) {
214
+ if (count <= 0) {
215
+ return [];
216
+ }
217
+ if (count === 1) {
218
+ return [this.toHex()];
219
+ }
220
+ const result = [];
221
+ const half = Math.floor(count / 2);
222
+ for (let i = half; i > 0; i--) {
223
+ result.push(this.lighten(i * 0.08).toHex());
224
+ }
225
+ result.push(this.toHex());
226
+ for (let i = 1; i <= count - half - 1; i++) {
227
+ result.push(this.darken(i * 0.08).toHex());
228
+ }
229
+ return result;
230
+ }
231
+ /**
232
+ * Generate a Tailwind-style 10-step palette.
233
+ * 50 = lightest, 900 = darkest, 500 = base color.
234
+ */
235
+ palette() {
236
+ const hsl = this.toHsl();
237
+ return {
238
+ 50: Color.fromHsl(hsl.h, hsl.s, Color.clamp(hsl.l + 0.4, 0, 0.97), hsl.a).toHex(),
239
+ 100: Color.fromHsl(hsl.h, hsl.s, Color.clamp(hsl.l + 0.34, 0, 0.95), hsl.a).toHex(),
240
+ 200: Color.fromHsl(hsl.h, hsl.s, Color.clamp(hsl.l + 0.26, 0, 0.9), hsl.a).toHex(),
241
+ 300: Color.fromHsl(hsl.h, hsl.s, Color.clamp(hsl.l + 0.18, 0, 0.85), hsl.a).toHex(),
242
+ 400: Color.fromHsl(hsl.h, hsl.s, Color.clamp(hsl.l + 0.09, 0, 0.8), hsl.a).toHex(),
243
+ 500: this.toHex(),
244
+ 600: Color.fromHsl(hsl.h, hsl.s, Color.clamp(hsl.l - 0.08, 0.05, 1), hsl.a).toHex(),
245
+ 700: Color.fromHsl(hsl.h, hsl.s, Color.clamp(hsl.l - 0.16, 0.05, 1), hsl.a).toHex(),
246
+ 800: Color.fromHsl(hsl.h, hsl.s, Color.clamp(hsl.l - 0.24, 0.05, 1), hsl.a).toHex(),
247
+ 900: Color.fromHsl(hsl.h, hsl.s, Color.clamp(hsl.l - 0.32, 0.05, 1), hsl.a).toHex(),
248
+ };
249
+ }
250
+ // ---------------------------------------------------------------------------
251
+ // Mixing & blending
252
+ // ---------------------------------------------------------------------------
253
+ mix(other, amount = 0.5) {
254
+ const c2 = other instanceof Color ? other : new Color(other);
255
+ const t = Color.clamp(amount, 0, 1);
256
+ return new Color({
257
+ r: Math.round(this._r + (c2._r - this._r) * t),
258
+ g: Math.round(this._g + (c2._g - this._g) * t),
259
+ b: Math.round(this._b + (c2._b - this._b) * t),
260
+ a: this._a + (c2._a - this._a) * t,
261
+ });
262
+ }
263
+ // ---------------------------------------------------------------------------
264
+ // Analysis
265
+ // ---------------------------------------------------------------------------
266
+ /**
267
+ * Relative luminance (WCAG).
268
+ * Returns 0 (darkest) to 1 (lightest).
269
+ */
270
+ luminance() {
271
+ const rLin = Color.linearize(this._r / 255);
272
+ const gLin = Color.linearize(this._g / 255);
273
+ const bLin = Color.linearize(this._b / 255);
274
+ return 0.2126 * rLin + 0.7152 * gLin + 0.0722 * bLin;
275
+ }
276
+ isLight() {
277
+ return this.luminance() > 0.5;
278
+ }
279
+ isDark() {
280
+ return !this.isLight();
281
+ }
282
+ // ---------------------------------------------------------------------------
283
+ // Accessibility
284
+ // ---------------------------------------------------------------------------
285
+ /**
286
+ * WCAG contrast ratio between two colors.
287
+ * Returns a value between 1 and 21.
288
+ */
289
+ contrast(other) {
290
+ const c2 = other instanceof Color ? other : new Color(other);
291
+ const l1 = this.luminance();
292
+ const l2 = c2.luminance();
293
+ const lighter = Math.max(l1, l2);
294
+ const darker = Math.min(l1, l2);
295
+ return (lighter + 0.05) / (darker + 0.05);
296
+ }
297
+ /**
298
+ * Check if text is readable against a background.
299
+ * Default threshold is WCAG AA (4.5:1).
300
+ */
301
+ isReadable(other, threshold = 4.5) {
302
+ return this.contrast(other) >= threshold;
303
+ }
304
+ // ---------------------------------------------------------------------------
305
+ // Internal helpers
306
+ // ---------------------------------------------------------------------------
307
+ static fromHsl(h, s, l, a = 1) {
308
+ const rgb = Color.hslToRgb(h, s, l);
309
+ return new Color(Object.assign(Object.assign({}, rgb), { a }));
310
+ }
311
+ static hslToRgb(h, s, l) {
312
+ const hNorm = ((h % 360) + 360) % 360;
313
+ const c = (1 - Math.abs(2 * l - 1)) * s;
314
+ const x = c * (1 - Math.abs(((hNorm / 60) % 2) - 1));
315
+ const m = l - c / 2;
316
+ let r = 0;
317
+ let g = 0;
318
+ let b = 0;
319
+ if (hNorm < 60) {
320
+ r = c;
321
+ g = x;
322
+ b = 0;
323
+ }
324
+ else if (hNorm < 120) {
325
+ r = x;
326
+ g = c;
327
+ b = 0;
328
+ }
329
+ else if (hNorm < 180) {
330
+ r = 0;
331
+ g = c;
332
+ b = x;
333
+ }
334
+ else if (hNorm < 240) {
335
+ r = 0;
336
+ g = x;
337
+ b = c;
338
+ }
339
+ else if (hNorm < 300) {
340
+ r = x;
341
+ g = 0;
342
+ b = c;
343
+ }
344
+ else {
345
+ r = c;
346
+ g = 0;
347
+ b = x;
348
+ }
349
+ return {
350
+ r: Math.round((r + m) * 255),
351
+ g: Math.round((g + m) * 255),
352
+ b: Math.round((b + m) * 255),
353
+ };
354
+ }
355
+ static rgbToHsl(r, g, b) {
356
+ const rNorm = r / 255;
357
+ const gNorm = g / 255;
358
+ const bNorm = b / 255;
359
+ const max = Math.max(rNorm, gNorm, bNorm);
360
+ const min = Math.min(rNorm, gNorm, bNorm);
361
+ const delta = max - min;
362
+ let h = 0;
363
+ let s = 0;
364
+ const l = (max + min) / 2;
365
+ if (delta !== 0) {
366
+ s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);
367
+ if (max === rNorm) {
368
+ h = ((gNorm - bNorm) / delta + (gNorm < bNorm ? 6 : 0)) * 60;
369
+ }
370
+ else if (max === gNorm) {
371
+ h = ((bNorm - rNorm) / delta + 2) * 60;
372
+ }
373
+ else {
374
+ h = ((rNorm - gNorm) / delta + 4) * 60;
375
+ }
376
+ }
377
+ return { h, s, l };
378
+ }
379
+ static linearize(channel) {
380
+ return channel <= 0.03928
381
+ ? channel / 12.92
382
+ : Math.pow((channel + 0.055) / 1.055, 2.4);
383
+ }
384
+ static clamp(value, min, max) {
385
+ return Math.min(max, Math.max(min, value));
386
+ }
387
+ static toHexPart(n) {
388
+ const hex = Math.round(Color.clamp(n, 0, 255)).toString(16);
389
+ return hex.length === 1 ? `0${hex}` : hex;
390
+ }
391
+ }
392
+ exports.Color = Color;
393
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/color/color.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=color.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.types.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/color/color.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,399 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DateUtil = void 0;
4
+ const date_fns_1 = require("date-fns");
5
+ /**
6
+ * Lightweight date utility class built on date-fns.
7
+ *
8
+ * All methods accept flexible input (Date, string, number, null) and
9
+ * return a safe fallback for invalid values. No Angular dependency —
10
+ * can be used standalone or via the DateService injectable wrapper.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const d = new DateUtil("2026-03-28T14:45:00Z");
15
+ *
16
+ * d.shortDate(); // "Mar 28, 2026"
17
+ * d.longDate(); // "March 28, 2026"
18
+ * d.shortDateTime(); // "Mar 28, 2026, 2:45 PM"
19
+ * d.timeAgo(); // "3 hours ago"
20
+ * d.smartRelative(); // "3 hours ago" or "Mar 25, 2026"
21
+ * d.sinceDate(); // "Member since Mar 2026"
22
+ * d.expiryStatus(); // { label: "Expires in 5 days", severity: "warning", expired: false }
23
+ *
24
+ * // Static helpers
25
+ * DateUtil.isToday(someDate);
26
+ * DateUtil.isPast(someDate);
27
+ * DateUtil.parse("2026-03-28");
28
+ * ```
29
+ */
30
+ class DateUtil {
31
+ constructor(input) {
32
+ this._date = DateUtil.parse(input);
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // Static parsing & validation
36
+ // ---------------------------------------------------------------------------
37
+ /**
38
+ * Parse any date-like input into a Date object.
39
+ * Returns null for invalid/null/undefined values.
40
+ */
41
+ static parse(input) {
42
+ if (input == null) {
43
+ return null;
44
+ }
45
+ if (input instanceof Date) {
46
+ return (0, date_fns_1.isValid)(input) ? input : null;
47
+ }
48
+ if (typeof input === 'number') {
49
+ const d = new Date(input);
50
+ return (0, date_fns_1.isValid)(d) ? d : null;
51
+ }
52
+ if (typeof input === 'string') {
53
+ const d = (0, date_fns_1.parseISO)(input);
54
+ if ((0, date_fns_1.isValid)(d)) {
55
+ return d;
56
+ }
57
+ const fallback = new Date(input);
58
+ return (0, date_fns_1.isValid)(fallback) ? fallback : null;
59
+ }
60
+ return null;
61
+ }
62
+ /**
63
+ * Check if a value is a valid, parseable date.
64
+ */
65
+ static isValidDate(input) {
66
+ return DateUtil.parse(input) !== null;
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Static boolean checks
70
+ // ---------------------------------------------------------------------------
71
+ static isToday(input) {
72
+ const d = DateUtil.parse(input);
73
+ return d !== null && (0, date_fns_1.isToday)(d);
74
+ }
75
+ static isYesterday(input) {
76
+ const d = DateUtil.parse(input);
77
+ return d !== null && (0, date_fns_1.isYesterday)(d);
78
+ }
79
+ static isTomorrow(input) {
80
+ const d = DateUtil.parse(input);
81
+ return d !== null && (0, date_fns_1.isTomorrow)(d);
82
+ }
83
+ static isPast(input) {
84
+ const d = DateUtil.parse(input);
85
+ return d !== null && (0, date_fns_1.isPast)(d);
86
+ }
87
+ static isFuture(input) {
88
+ const d = DateUtil.parse(input);
89
+ return d !== null && (0, date_fns_1.isFuture)(d);
90
+ }
91
+ static isWithinDays(input, days) {
92
+ const d = DateUtil.parse(input);
93
+ if (!d) {
94
+ return false;
95
+ }
96
+ return Math.abs((0, date_fns_1.differenceInDays)(new Date(), d)) <= days;
97
+ }
98
+ // ---------------------------------------------------------------------------
99
+ // Static boundary helpers
100
+ // ---------------------------------------------------------------------------
101
+ static startOfDay(input) {
102
+ const d = DateUtil.parse(input);
103
+ return d ? (0, date_fns_1.startOfDay)(d) : null;
104
+ }
105
+ static endOfDay(input) {
106
+ const d = DateUtil.parse(input);
107
+ return d ? (0, date_fns_1.endOfDay)(d) : null;
108
+ }
109
+ static toISOString(input) {
110
+ const d = DateUtil.parse(input);
111
+ return d ? d.toISOString() : '';
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // Instance — absolute formats
115
+ // ---------------------------------------------------------------------------
116
+ /**
117
+ * "Mar 28, 2026"
118
+ */
119
+ shortDate() {
120
+ return this._date ? (0, date_fns_1.format)(this._date, 'MMM d, yyyy') : DateUtil.FALLBACK;
121
+ }
122
+ /**
123
+ * "March 28, 2026"
124
+ */
125
+ longDate() {
126
+ return this._date ? (0, date_fns_1.format)(this._date, 'MMMM d, yyyy') : DateUtil.FALLBACK;
127
+ }
128
+ /**
129
+ * "03/28/2026"
130
+ */
131
+ numericDate() {
132
+ return this._date ? (0, date_fns_1.format)(this._date, 'MM/dd/yyyy') : DateUtil.FALLBACK;
133
+ }
134
+ /**
135
+ * "2026-03-28"
136
+ */
137
+ isoDate() {
138
+ return this._date ? (0, date_fns_1.format)(this._date, 'yyyy-MM-dd') : DateUtil.FALLBACK;
139
+ }
140
+ /**
141
+ * "Mar 28, 2026, 2:45 PM"
142
+ */
143
+ shortDateTime() {
144
+ return this._date
145
+ ? (0, date_fns_1.format)(this._date, 'MMM d, yyyy, h:mm a')
146
+ : DateUtil.FALLBACK;
147
+ }
148
+ /**
149
+ * "March 28, 2026 at 2:45:30 PM"
150
+ */
151
+ longDateTime() {
152
+ return this._date
153
+ ? (0, date_fns_1.format)(this._date, "MMMM d, yyyy 'at' h:mm:ss a")
154
+ : DateUtil.FALLBACK;
155
+ }
156
+ /**
157
+ * "2:45 PM"
158
+ */
159
+ time() {
160
+ return this._date ? (0, date_fns_1.format)(this._date, 'h:mm a') : DateUtil.FALLBACK;
161
+ }
162
+ /**
163
+ * "2:45:30 PM"
164
+ */
165
+ timePrecise() {
166
+ return this._date ? (0, date_fns_1.format)(this._date, 'h:mm:ss a') : DateUtil.FALLBACK;
167
+ }
168
+ /**
169
+ * Format using a preset name.
170
+ */
171
+ format(preset) {
172
+ switch (preset) {
173
+ case 'shortDate':
174
+ return this.shortDate();
175
+ case 'longDate':
176
+ return this.longDate();
177
+ case 'numericDate':
178
+ return this.numericDate();
179
+ case 'isoDate':
180
+ return this.isoDate();
181
+ case 'shortDateTime':
182
+ return this.shortDateTime();
183
+ case 'longDateTime':
184
+ return this.longDateTime();
185
+ case 'time':
186
+ return this.time();
187
+ case 'timePrecise':
188
+ return this.timePrecise();
189
+ }
190
+ }
191
+ /**
192
+ * Format using a custom date-fns format string.
193
+ */
194
+ custom(formatStr) {
195
+ return this._date ? (0, date_fns_1.format)(this._date, formatStr) : DateUtil.FALLBACK;
196
+ }
197
+ // ---------------------------------------------------------------------------
198
+ // Instance — relative formats
199
+ // ---------------------------------------------------------------------------
200
+ /**
201
+ * "3 hours ago", "2 days ago", "about 1 month ago"
202
+ */
203
+ timeAgo() {
204
+ return this._date
205
+ ? (0, date_fns_1.formatDistanceToNow)(this._date, { addSuffix: true })
206
+ : DateUtil.FALLBACK;
207
+ }
208
+ /**
209
+ * "3h", "2d", "1mo" — compact relative time.
210
+ */
211
+ timeAgoShort() {
212
+ if (!this._date) {
213
+ return DateUtil.FALLBACK;
214
+ }
215
+ const now = new Date();
216
+ const mins = Math.abs((0, date_fns_1.differenceInMinutes)(now, this._date));
217
+ if (mins < 1) {
218
+ return 'now';
219
+ }
220
+ if (mins < 60) {
221
+ return `${mins}m`;
222
+ }
223
+ const hours = Math.abs((0, date_fns_1.differenceInHours)(now, this._date));
224
+ if (hours < 24) {
225
+ return `${hours}h`;
226
+ }
227
+ const days = Math.abs((0, date_fns_1.differenceInDays)(now, this._date));
228
+ if (days < 30) {
229
+ return `${days}d`;
230
+ }
231
+ if (days < 365) {
232
+ return `${Math.floor(days / 30)}mo`;
233
+ }
234
+ return `${Math.floor(days / 365)}y`;
235
+ }
236
+ /**
237
+ * "in 5 days", "in 2 hours"
238
+ */
239
+ timeUntil() {
240
+ return this._date
241
+ ? (0, date_fns_1.formatDistanceToNow)(this._date, { addSuffix: true })
242
+ : DateUtil.FALLBACK;
243
+ }
244
+ /**
245
+ * Auto-switches from relative to absolute after a threshold.
246
+ * Recent: "3 hours ago" | Older: "Mar 25, 2026"
247
+ */
248
+ smartRelative(thresholdDays = DateUtil.RELATIVE_THRESHOLD_DAYS) {
249
+ if (!this._date) {
250
+ return DateUtil.FALLBACK;
251
+ }
252
+ const days = Math.abs((0, date_fns_1.differenceInDays)(new Date(), this._date));
253
+ if (days <= thresholdDays) {
254
+ return this.timeAgo();
255
+ }
256
+ return this.shortDate();
257
+ }
258
+ // ---------------------------------------------------------------------------
259
+ // Instance — contextual formats
260
+ // ---------------------------------------------------------------------------
261
+ /**
262
+ * "Today", "Yesterday", "Tomorrow", "Last Tuesday", "Mar 20, 2026"
263
+ */
264
+ calendarDate() {
265
+ if (!this._date) {
266
+ return DateUtil.FALLBACK;
267
+ }
268
+ if ((0, date_fns_1.isToday)(this._date)) {
269
+ return 'Today';
270
+ }
271
+ if ((0, date_fns_1.isYesterday)(this._date)) {
272
+ return 'Yesterday';
273
+ }
274
+ if ((0, date_fns_1.isTomorrow)(this._date)) {
275
+ return 'Tomorrow';
276
+ }
277
+ const days = (0, date_fns_1.differenceInDays)(new Date(), this._date);
278
+ if (days > 0 && days < 7) {
279
+ return (0, date_fns_1.format)(this._date, "'Last' EEEE");
280
+ }
281
+ return this.shortDate();
282
+ }
283
+ /**
284
+ * "Member since Mar 2026"
285
+ */
286
+ sinceDate(prefix = 'Member since') {
287
+ return this._date
288
+ ? `${prefix} ${(0, date_fns_1.format)(this._date, 'MMM yyyy')}`
289
+ : DateUtil.FALLBACK;
290
+ }
291
+ /**
292
+ * Expiry status with label and severity.
293
+ */
294
+ expiryStatus(warningDays = 7) {
295
+ if (!this._date) {
296
+ return { label: DateUtil.FALLBACK, severity: 'default', expired: false };
297
+ }
298
+ if ((0, date_fns_1.isPast)(this._date)) {
299
+ const ago = (0, date_fns_1.formatDistanceToNow)(this._date, { addSuffix: true });
300
+ return { label: `Expired ${ago}`, severity: 'danger', expired: true };
301
+ }
302
+ const days = (0, date_fns_1.differenceInDays)(this._date, new Date());
303
+ if (days <= warningDays) {
304
+ const until = (0, date_fns_1.formatDistanceToNow)(this._date, { addSuffix: true });
305
+ return { label: `Expires ${until}`, severity: 'warning', expired: false };
306
+ }
307
+ return { label: 'Active', severity: 'success', expired: false };
308
+ }
309
+ // ---------------------------------------------------------------------------
310
+ // Instance — range & duration
311
+ // ---------------------------------------------------------------------------
312
+ /**
313
+ * "Mar 15 – Mar 28, 2026" or "Mar 15 – Jun 30, 2026"
314
+ */
315
+ rangeTo(endInput) {
316
+ if (!this._date) {
317
+ return DateUtil.FALLBACK;
318
+ }
319
+ const end = DateUtil.parse(endInput);
320
+ if (!end) {
321
+ return this.shortDate();
322
+ }
323
+ const sameYear = this._date.getFullYear() === end.getFullYear();
324
+ const sameMonth = sameYear && this._date.getMonth() === end.getMonth();
325
+ if (sameMonth) {
326
+ return `${(0, date_fns_1.format)(this._date, 'MMM d')} – ${(0, date_fns_1.format)(end, 'd, yyyy')}`;
327
+ }
328
+ if (sameYear) {
329
+ return `${(0, date_fns_1.format)(this._date, 'MMM d')} – ${(0, date_fns_1.format)(end, 'MMM d, yyyy')}`;
330
+ }
331
+ return `${(0, date_fns_1.format)(this._date, 'MMM d, yyyy')} – ${(0, date_fns_1.format)(end, 'MMM d, yyyy')}`;
332
+ }
333
+ /**
334
+ * "13 days", "2 hours", "45 minutes"
335
+ */
336
+ durationTo(endInput) {
337
+ if (!this._date) {
338
+ return DateUtil.FALLBACK;
339
+ }
340
+ const end = DateUtil.parse(endInput);
341
+ if (!end) {
342
+ return DateUtil.FALLBACK;
343
+ }
344
+ return (0, date_fns_1.formatDistance)(this._date, end);
345
+ }
346
+ /**
347
+ * "13d", "2h 15m"
348
+ */
349
+ durationToShort(endInput) {
350
+ if (!this._date) {
351
+ return DateUtil.FALLBACK;
352
+ }
353
+ const end = DateUtil.parse(endInput);
354
+ if (!end) {
355
+ return DateUtil.FALLBACK;
356
+ }
357
+ const mins = Math.abs((0, date_fns_1.differenceInMinutes)(this._date, end));
358
+ if (mins < 60) {
359
+ return `${mins}m`;
360
+ }
361
+ const hours = Math.abs((0, date_fns_1.differenceInHours)(this._date, end));
362
+ if (hours < 24) {
363
+ const remainMins = mins % 60;
364
+ return remainMins > 0 ? `${hours}h ${remainMins}m` : `${hours}h`;
365
+ }
366
+ const days = Math.abs((0, date_fns_1.differenceInDays)(this._date, end));
367
+ return `${days}d`;
368
+ }
369
+ // ---------------------------------------------------------------------------
370
+ // Instance — access underlying Date
371
+ // ---------------------------------------------------------------------------
372
+ /**
373
+ * The underlying Date object, or null if input was invalid.
374
+ */
375
+ toDate() {
376
+ return this._date;
377
+ }
378
+ /**
379
+ * ISO string, or empty string if invalid.
380
+ */
381
+ toISOString() {
382
+ return this._date ? this._date.toISOString() : '';
383
+ }
384
+ /**
385
+ * Unix timestamp in milliseconds, or 0 if invalid.
386
+ */
387
+ valueOf() {
388
+ return this._date ? this._date.getTime() : 0;
389
+ }
390
+ toString() {
391
+ return this.shortDateTime();
392
+ }
393
+ }
394
+ exports.DateUtil = DateUtil;
395
+ /** Default fallback string for null/invalid dates. */
396
+ DateUtil.FALLBACK = '—';
397
+ /** Threshold in days for switching from relative to absolute in smartRelative. */
398
+ DateUtil.RELATIVE_THRESHOLD_DAYS = 7;
399
+ //# sourceMappingURL=date.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/date/date.ts"],"names":[],"mappings":";;;AAAA,uCAgBkB;AAQlB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAa,QAAQ;IASnB,YAAY,KAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,8EAA8E;IAC9E,8BAA8B;IAC9B,8EAA8E;IAE9E;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,KAAgB;QAC3B,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,OAAO,IAAA,kBAAO,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACvC,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;YAE1B,OAAO,IAAA,kBAAO,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/B,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,IAAA,mBAAQ,EAAC,KAAK,CAAC,CAAC;YAE1B,IAAI,IAAA,kBAAO,EAAC,CAAC,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,CAAC;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;YAEjC,OAAO,IAAA,kBAAO,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAgB;QACjC,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;IACxC,CAAC;IAED,8EAA8E;IAC9E,wBAAwB;IACxB,8EAA8E;IAE9E,MAAM,CAAC,OAAO,CAAC,KAAgB;QAC7B,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhC,OAAO,CAAC,KAAK,IAAI,IAAI,IAAA,kBAAQ,EAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,KAAgB;QACjC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhC,OAAO,CAAC,KAAK,IAAI,IAAI,IAAA,sBAAY,EAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,KAAgB;QAChC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhC,OAAO,CAAC,KAAK,IAAI,IAAI,IAAA,qBAAW,EAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,KAAgB;QAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhC,OAAO,CAAC,KAAK,IAAI,IAAI,IAAA,iBAAO,EAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,KAAgB;QAC9B,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhC,OAAO,CAAC,KAAK,IAAI,IAAI,IAAA,mBAAS,EAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,KAAgB,EAAE,IAAY;QAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,IAAA,2BAAgB,EAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC3D,CAAC;IAED,8EAA8E;IAC9E,0BAA0B;IAC1B,8EAA8E;IAE9E,MAAM,CAAC,UAAU,CAAC,KAAgB;QAChC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAA,qBAAW,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,KAAgB;QAC9B,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAA,mBAAS,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,KAAgB;QACjC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,CAAC;IAED,8EAA8E;IAC9E,8BAA8B;IAC9B,8EAA8E;IAE9E;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,KAAK;YACf,CAAC,CAAC,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,qBAAqB,CAAC;YAC3C,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,KAAK;YACf,CAAC,CAAC,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,6BAA6B,CAAC;YACnD,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAwB;QAC7B,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5B,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,KAAK,eAAe;gBAClB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9B,KAAK,cAAc;gBACjB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7B,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAiB;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACxE,CAAC;IAED,8EAA8E;IAC9E,8BAA8B;IAC9B,8EAA8E;IAE9E;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,KAAK;YACf,CAAC,CAAC,IAAA,8BAAmB,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACtD,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAA,8BAAmB,EAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAE5D,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;YACd,OAAO,GAAG,IAAI,GAAG,CAAC;QACpB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAA,4BAAiB,EAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAE3D,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YACf,OAAO,GAAG,KAAK,GAAG,CAAC;QACrB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAA,2BAAgB,EAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAEzD,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;YACd,OAAO,GAAG,IAAI,GAAG,CAAC;QACpB,CAAC;QAED,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;YACf,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;QACtC,CAAC;QAED,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,KAAK;YACf,CAAC,CAAC,IAAA,8BAAmB,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACtD,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,aAAa,GAAG,QAAQ,CAAC,uBAAuB;QAC5D,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAA,2BAAgB,EAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAEhE,IAAI,IAAI,IAAI,aAAa,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAED,8EAA8E;IAC9E,gCAAgC;IAChC,8EAA8E;IAE9E;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAED,IAAI,IAAA,kBAAQ,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,IAAA,sBAAY,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,IAAI,IAAA,qBAAW,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,IAAI,GAAG,IAAA,2BAAgB,EAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtD,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAM,GAAG,cAAc;QAC/B,OAAO,IAAI,CAAC,KAAK;YACf,CAAC,CAAC,GAAG,MAAM,IAAI,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE;YAC/C,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,WAAW,GAAG,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3E,CAAC;QAED,IAAI,IAAA,iBAAO,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAA,8BAAmB,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEjE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACxE,CAAC;QAED,MAAM,IAAI,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAEtD,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAA,8BAAmB,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEnE,OAAO,EAAE,KAAK,EAAE,WAAW,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5E,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAClE,CAAC;IAED,8EAA8E;IAC9E,8BAA8B;IAC9B,8EAA8E;IAE9E;;OAEG;IACH,OAAO,CAAC,QAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAErC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1B,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;QAChE,MAAM,SAAS,GAAG,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;QAEvE,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,GAAG,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,IAAA,iBAAM,EAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;QACtE,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,GAAG,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,IAAA,iBAAM,EAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC;QAC1E,CAAC;QAED,OAAO,GAAG,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,IAAA,iBAAM,EAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAmB;QAC5B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAErC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAED,OAAO,IAAA,yBAAc,EAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAmB;QACjC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAErC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAA,8BAAmB,EAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAE5D,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;YACd,OAAO,GAAG,IAAI,GAAG,CAAC;QACpB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAA,4BAAiB,EAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAE3D,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;YAE7B,OAAO,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,UAAU,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAEzD,OAAO,GAAG,IAAI,GAAG,CAAC;IACpB,CAAC;IAED,8EAA8E;IAC9E,oCAAoC;IACpC,8EAA8E;IAE9E;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;;AAzdH,4BA0dC;AAvdC,sDAAsD;AACtC,iBAAQ,GAAG,GAAG,CAAC;AAE/B,kFAAkF;AAClE,gCAAuB,GAAG,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=date.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.types.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/date/date.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.I18nService = void 0;
4
+ /**
5
+ * Dot-path message lookup with `{{var}}` interpolation, a minimal ICU plural
6
+ * subset, and deep merge across several sources.
7
+ *
8
+ * Deliberately free of any framework or DOM dependency, so the same instance
9
+ * works in a browser app, in server-side rendering, and in a backend that
10
+ * renders emails or hosted pages — the three places a product's copy has to
11
+ * agree. The Angular wrapper that adds signal reactivity and browser locale
12
+ * detection lives in `@frame-kit/ui-ng/services/i18n`.
13
+ */
14
+ class I18nService {
15
+ constructor(config) {
16
+ var _a, _b, _c, _d, _e;
17
+ this.supportedLocaleList = (_a = config.supportedLocales) !== null && _a !== void 0 ? _a : ['en'];
18
+ this.localeMaps = (_b = config.localeMaps) !== null && _b !== void 0 ? _b : [];
19
+ this.staticSources = (_c = config.sources) !== null && _c !== void 0 ? _c : [];
20
+ // No detection here: the caller passes an explicit locale. A browser app
21
+ // resolves it from storage or `navigator`, a backend from `Accept-Language`
22
+ // — neither of which this base should know about.
23
+ this.localeValue = (_e = (_d = config.locale) !== null && _d !== void 0 ? _d : this.supportedLocaleList[0]) !== null && _e !== void 0 ? _e : 'en';
24
+ this.messages = this.buildMessages(this.localeValue);
25
+ }
26
+ getLocale() {
27
+ return this.localeValue;
28
+ }
29
+ getSupportedLocales() {
30
+ return [...this.supportedLocaleList];
31
+ }
32
+ /**
33
+ * A message by dot-path, with optional interpolation.
34
+ *
35
+ * Returns the key itself when nothing is found. That is deliberate: a missing
36
+ * message renders as `auth.signIn.title` rather than as an empty space, so it
37
+ * is visible in review instead of silently disappearing.
38
+ */
39
+ get(key, vars) {
40
+ const value = getByPath(this.currentMessages(), key);
41
+ if (value === undefined) {
42
+ return key;
43
+ }
44
+ const str = String(value);
45
+ if (!vars || Object.keys(vars).length === 0) {
46
+ return str;
47
+ }
48
+ return interpolate(str, vars);
49
+ }
50
+ /**
51
+ * A non-string value by dot-path — a list of steps, a table of rows.
52
+ *
53
+ * With `vars`, every string reachable inside is interpolated and the shape is
54
+ * preserved. Content of this kind mixes strings, arrays and objects, and a
55
+ * placeholder left in any one of them renders literally, so substitution has
56
+ * to follow the data rather than assume a shape.
57
+ */
58
+ getRaw(path, vars) {
59
+ const value = getByPath(this.currentMessages(), path);
60
+ if (value === undefined || !vars || Object.keys(vars).length === 0) {
61
+ return value;
62
+ }
63
+ return interpolateDeep(value, vars);
64
+ }
65
+ /** No-ops on an unsupported locale rather than rendering keys. */
66
+ setLocale(locale) {
67
+ if (!this.supportedLocaleList.includes(locale)) {
68
+ return;
69
+ }
70
+ this.localeValue = locale;
71
+ this.messages = this.buildMessages(locale);
72
+ this.onLocaleChanged();
73
+ }
74
+ /**
75
+ * Add a locale map after construction — for a lazily loaded feature that
76
+ * ships its own copy and should not be paid for at boot.
77
+ */
78
+ registerLocaleMap(map) {
79
+ this.localeMaps.push(map);
80
+ this.messages = this.buildMessages(this.localeValue);
81
+ this.onLocaleChanged();
82
+ }
83
+ /** Overridden by the reactive subclass to read from a signal. */
84
+ currentMessages() {
85
+ return this.messages;
86
+ }
87
+ /** Fires after messages are rebuilt; the reactive subclass syncs signals. */
88
+ onLocaleChanged() {
89
+ // no-op in the framework-agnostic base
90
+ }
91
+ buildMessages(locale) {
92
+ const sources = [];
93
+ for (const map of this.localeMaps) {
94
+ if (map[locale]) {
95
+ sources.push(map[locale]);
96
+ }
97
+ }
98
+ for (const source of this.staticSources) {
99
+ sources.push(source);
100
+ }
101
+ return mergeMessages(...sources);
102
+ }
103
+ }
104
+ exports.I18nService = I18nService;
105
+ // ── internals ────────────────────────────────────────────────────────────
106
+ function getByPath(obj, path) {
107
+ let current = obj;
108
+ for (const key of path.split('.')) {
109
+ if (current === null ||
110
+ current === undefined ||
111
+ typeof current !== 'object') {
112
+ return undefined;
113
+ }
114
+ current = current[key];
115
+ }
116
+ return current;
117
+ }
118
+ function interpolateDeep(value, vars) {
119
+ if (typeof value === 'string') {
120
+ return interpolate(value, vars);
121
+ }
122
+ if (Array.isArray(value)) {
123
+ return value.map((entry) => interpolateDeep(entry, vars));
124
+ }
125
+ if (value !== null && typeof value === 'object') {
126
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
127
+ key,
128
+ interpolateDeep(entry, vars),
129
+ ]));
130
+ }
131
+ return value;
132
+ }
133
+ function interpolate(str, vars) {
134
+ // An unknown placeholder is left as written rather than blanked: `{{name}}`
135
+ // on the page says which variable was not passed.
136
+ return applyPlurals(str, vars).replace(/\{\{(\w+)}}/g, (match, key) => (key in vars ? String(vars[key]) : match));
137
+ }
138
+ /**
139
+ * A minimal ICU plural subset: `{count, plural, =0 {none} other {# items}}`.
140
+ *
141
+ * Exact selectors plus `other`, with no nested braces in branch bodies. Enough
142
+ * for the counts copy actually contains, without pulling in a full ICU parser.
143
+ */
144
+ function applyPlurals(str, vars) {
145
+ const PLURAL = /\{(\w+),\s*plural,\s*((?:[^{}]+|\{[^{}]*\})*)\}/g;
146
+ return str.replace(PLURAL, (match, name, cases) => {
147
+ if (!(name in vars)) {
148
+ return match;
149
+ }
150
+ const count = Number(vars[name]);
151
+ const exact = new RegExp(`=${count}\\s*\\{([^{}]*)\\}`).exec(cases);
152
+ if (exact) {
153
+ return exact[1].replace(/#/g, String(count));
154
+ }
155
+ const other = /other\s*\{([^{}]*)\}/.exec(cases);
156
+ return other ? other[1].replace(/#/g, String(count)) : match;
157
+ });
158
+ }
159
+ function isObject(value) {
160
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
161
+ }
162
+ function deepMerge(target, source) {
163
+ const result = Object.assign({}, target);
164
+ for (const key of Object.keys(source)) {
165
+ result[key] =
166
+ isObject(result[key]) && isObject(source[key])
167
+ ? deepMerge(result[key], source[key])
168
+ : source[key];
169
+ }
170
+ return result;
171
+ }
172
+ function mergeMessages(...sources) {
173
+ let merged = {};
174
+ for (const source of sources) {
175
+ merged = deepMerge(merged, source);
176
+ }
177
+ return merged;
178
+ }
179
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/i18n/i18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * Locale detection and persistence.
4
+ *
5
+ * Browser concerns, but no framework: the same functions serve an Angular SPA
6
+ * and any other client. Every access is guarded, so importing this on a server
7
+ * (SSR, Node) is safe — detection simply falls through to the default.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.normalizeLocale = normalizeLocale;
11
+ exports.readStoredLocale = readStoredLocale;
12
+ exports.saveLocale = saveLocale;
13
+ exports.detectLocale = detectLocale;
14
+ /** Reduce a locale tag to its language subtag: `en-US` → `en`. */
15
+ function normalizeLocale(locale) {
16
+ return locale.split('-')[0].toLowerCase();
17
+ }
18
+ /** The persisted locale, or `null` when there is none or storage is unavailable. */
19
+ function readStoredLocale(storageKey) {
20
+ if (typeof localStorage === 'undefined') {
21
+ return null;
22
+ }
23
+ try {
24
+ return localStorage.getItem(storageKey);
25
+ }
26
+ catch (_a) {
27
+ // Private-mode and blocked-cookie browsers throw on access rather than
28
+ // returning null. A remembered locale is a convenience, never a hard
29
+ // requirement, so failing to read one is not an error.
30
+ return null;
31
+ }
32
+ }
33
+ /** Persist the visitor's locale. Silently no-ops when storage is unavailable. */
34
+ function saveLocale(storageKey, locale) {
35
+ if (typeof localStorage === 'undefined') {
36
+ return;
37
+ }
38
+ try {
39
+ localStorage.setItem(storageKey, locale);
40
+ }
41
+ catch (_a) {
42
+ // See readStoredLocale: storage is best-effort.
43
+ }
44
+ }
45
+ /**
46
+ * Resolve the active locale: stored preference, then browser language, then
47
+ * the default. Each candidate is normalized and must be in `supportedLocales`
48
+ * to win, so an unsupported language falls through rather than rendering keys.
49
+ */
50
+ function detectLocale(options) {
51
+ var _a, _b;
52
+ const { supportedLocales, storageKey } = options;
53
+ const fallback = (_b = (_a = options.defaultLocale) !== null && _a !== void 0 ? _a : supportedLocales[0]) !== null && _b !== void 0 ? _b : 'en';
54
+ if (storageKey) {
55
+ const stored = readStoredLocale(storageKey);
56
+ if (stored && supportedLocales.includes(normalizeLocale(stored))) {
57
+ return normalizeLocale(stored);
58
+ }
59
+ }
60
+ if (typeof navigator !== 'undefined' && navigator.language) {
61
+ const fromBrowser = normalizeLocale(navigator.language);
62
+ if (supportedLocales.includes(fromBrowser)) {
63
+ return fromBrowser;
64
+ }
65
+ }
66
+ return fallback;
67
+ }
68
+ //# sourceMappingURL=i18n.locale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.locale.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/i18n/i18n.locale.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAqBH,0CAEC;AAGD,4CAaC;AAGD,gCAUC;AAOD,oCAqBC;AA5DD,kEAAkE;AAClE,SAAgB,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED,oFAAoF;AACpF,SAAgB,gBAAgB,CAAC,UAAkB;IACjD,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAAC,WAAM,CAAC;QACP,uEAAuE;QACvE,qEAAqE;QACrE,uDAAuD;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,SAAgB,UAAU,CAAC,UAAkB,EAAE,MAAc;IAC3D,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,WAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,OAA+B;;IAC1D,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAA,MAAA,OAAO,CAAC,aAAa,mCAAI,gBAAgB,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAC;IAEtE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAE5C,IAAI,MAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACjE,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC3D,MAAM,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAExD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=i18n.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.types.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/i18n/i18n.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@frame-kit/utils",
3
- "version": "0.2.10",
4
- "description": "Framework-agnostic color and date utilities for FrameKit.",
3
+ "version": "0.2.12",
4
+ "description": "Framework-agnostic colour, date and i18n utilities for FrameKit. Ships both ESM and CommonJS.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -11,7 +11,7 @@
11
11
  "homepage": "https://github.com/frame-kit/packages/tree/main/packages/utils#readme",
12
12
  "bugs": "https://github.com/frame-kit/packages/issues",
13
13
  "type": "module",
14
- "main": "./src/index.js",
14
+ "main": "./cjs/index.js",
15
15
  "types": "./src/index.d.ts",
16
16
  "sideEffects": false,
17
17
  "dependencies": {
@@ -21,5 +21,13 @@
21
21
  "publishConfig": {
22
22
  "access": "public"
23
23
  },
24
- "module": "./src/index.js"
24
+ "module": "./src/index.js",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./src/index.d.ts",
28
+ "import": "./src/index.js",
29
+ "require": "./cjs/index.js"
30
+ },
31
+ "./package.json": "./package.json"
32
+ }
25
33
  }