@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 +24 -0
- package/README.md +8 -2
- package/cjs/index.js +11 -0
- package/cjs/index.js.map +1 -0
- package/cjs/lib/color/color.js +393 -0
- package/cjs/lib/color/color.js.map +1 -0
- package/cjs/lib/color/color.types.js +3 -0
- package/cjs/lib/color/color.types.js.map +1 -0
- package/cjs/lib/date/date.js +399 -0
- package/cjs/lib/date/date.js.map +1 -0
- package/cjs/lib/date/date.types.js +3 -0
- package/cjs/lib/date/date.types.js.map +1 -0
- package/cjs/lib/i18n/i18n.js +179 -0
- package/cjs/lib/i18n/i18n.js.map +1 -0
- package/cjs/lib/i18n/i18n.locale.js +68 -0
- package/cjs/lib/i18n/i18n.locale.js.map +1 -0
- package/cjs/lib/i18n/i18n.types.js +3 -0
- package/cjs/lib/i18n/i18n.types.js.map +1 -0
- package/cjs/package.json +3 -0
- package/package.json +12 -4
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 **
|
|
4
|
-
dependency
|
|
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
|
package/cjs/index.js.map
ADDED
|
@@ -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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.types.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/i18n/i18n.types.ts"],"names":[],"mappings":""}
|
package/cjs/package.json
ADDED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frame-kit/utils",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "Framework-agnostic
|
|
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": "./
|
|
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
|
}
|