@weeehaoooz/talos-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs +237 -0
- package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-button-button.mjs +93 -0
- package/fesm2022/weeehaoooz-talos-ui-button-button.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-core.mjs +438 -0
- package/fesm2022/weeehaoooz-talos-ui-core.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs +233 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs +361 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs +312 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs +235 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs +462 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs +805 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs +267 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs +351 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs +566 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs +534 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs +446 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs +376 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs +147 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs +242 -0
- package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs +514 -0
- package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs +548 -0
- package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs +692 -0
- package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs +761 -0
- package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs +896 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs +872 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs +119 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs +135 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs +666 -0
- package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs +147 -0
- package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-input.mjs +33 -0
- package/fesm2022/weeehaoooz-talos-ui-form-input.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs +455 -0
- package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs +379 -0
- package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs +297 -0
- package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs +661 -0
- package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs +346 -0
- package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs +896 -0
- package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs +252 -0
- package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs +916 -0
- package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-layout.mjs +851 -0
- package/fesm2022/weeehaoooz-talos-ui-layout.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-nav.mjs +897 -0
- package/fesm2022/weeehaoooz-talos-ui-nav.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui.mjs +17058 -0
- package/fesm2022/weeehaoooz-talos-ui.mjs.map +1 -0
- package/package.json +203 -0
- package/schematics/collection.json +10 -0
- package/schematics/ng-add/index.d.ts +3 -0
- package/schematics/ng-add/index.js +99 -0
- package/schematics/ng-add/schema.d.ts +10 -0
- package/schematics/ng-add/schema.js +2 -0
- package/schematics/ng-add/schema.json +52 -0
- package/styles/_alert.scss +56 -0
- package/styles/_badge.scss +279 -0
- package/styles/_button-group.scss +470 -0
- package/styles/_buttons.scss +442 -0
- package/styles/_card.scss +18 -0
- package/styles/_dialog.scss +116 -0
- package/styles/_drop-zone.scss +19 -0
- package/styles/_form-controls.scss +660 -0
- package/styles/_slide-toggle.scss +171 -0
- package/styles/_status-tag.scss +108 -0
- package/styles/_timeline.scss +19 -0
- package/styles/_tooltip.scss +32 -0
- package/styles/_typography.scss +279 -0
- package/styles/_variables.scss +590 -0
- package/styles/index.scss +15 -0
- package/types/weeehaoooz-talos-ui-button-button-group.d.ts +59 -0
- package/types/weeehaoooz-talos-ui-button-button-group.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-button-button.d.ts +38 -0
- package/types/weeehaoooz-talos-ui-button-button.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-core.d.ts +95 -0
- package/types/weeehaoooz-talos-ui-core.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-display-badge.d.ts +119 -0
- package/types/weeehaoooz-talos-ui-data-display-badge.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts +135 -0
- package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts +144 -0
- package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts +83 -0
- package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts +255 -0
- package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts +204 -0
- package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts +101 -0
- package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts +138 -0
- package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts +161 -0
- package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-feedback-alert.d.ts +212 -0
- package/types/weeehaoooz-talos-ui-feedback-alert.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts +259 -0
- package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts +147 -0
- package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts +32 -0
- package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-affix.d.ts +88 -0
- package/types/weeehaoooz-talos-ui-form-affix.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts +113 -0
- package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-checkbox.d.ts +165 -0
- package/types/weeehaoooz-talos-ui-form-checkbox.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-chips.d.ts +152 -0
- package/types/weeehaoooz-talos-ui-form-chips.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-color-picker.d.ts +144 -0
- package/types/weeehaoooz-talos-ui-form-color-picker.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-date-picker.d.ts +138 -0
- package/types/weeehaoooz-talos-ui-form-date-picker.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts +148 -0
- package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts +44 -0
- package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts +48 -0
- package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts +227 -0
- package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-form-field.d.ts +42 -0
- package/types/weeehaoooz-talos-ui-form-form-field.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-input.d.ts +15 -0
- package/types/weeehaoooz-talos-ui-form-input.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-otp.d.ts +111 -0
- package/types/weeehaoooz-talos-ui-form-otp.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-password-input.d.ts +145 -0
- package/types/weeehaoooz-talos-ui-form-password-input.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-radio.d.ts +84 -0
- package/types/weeehaoooz-talos-ui-form-radio.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-range-input.d.ts +181 -0
- package/types/weeehaoooz-talos-ui-form-range-input.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-rating.d.ts +110 -0
- package/types/weeehaoooz-talos-ui-form-rating.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-select-input.d.ts +195 -0
- package/types/weeehaoooz-talos-ui-form-select-input.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts +79 -0
- package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts +192 -0
- package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-layout.d.ts +286 -0
- package/types/weeehaoooz-talos-ui-layout.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-nav.d.ts +384 -0
- package/types/weeehaoooz-talos-ui-nav.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui.d.ts +5050 -0
- package/types/weeehaoooz-talos-ui.d.ts.map +1 -0
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import { isValid, format, parse } from 'date-fns';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Shared date utility helpers wrapping date-fns.
|
|
5
|
+
*
|
|
6
|
+
* All functions are pure and tree-shakeable.
|
|
7
|
+
* Moment.js tokens (YYYY, DD, etc.) are automatically normalised to the
|
|
8
|
+
* Unicode/UTS-35 tokens that date-fns expects (yyyy, dd, etc.).
|
|
9
|
+
*/
|
|
10
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
11
|
+
// Token normalisation
|
|
12
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Converts Moment.js format tokens to their date-fns UTS-35 equivalents.
|
|
15
|
+
* This lets consumers continue passing legacy strings like 'YYYY-MM-DD'
|
|
16
|
+
* without any configuration change.
|
|
17
|
+
*
|
|
18
|
+
* Key differences handled:
|
|
19
|
+
* - YYYY → yyyy (calendar year, not ISO week year)
|
|
20
|
+
* - YY → yy (2-digit year)
|
|
21
|
+
* - DD → dd (day of month, not day of year)
|
|
22
|
+
* - D → d (day of month, not day of year)
|
|
23
|
+
* - dddd → EEEE (full weekday name)
|
|
24
|
+
* - ddd → EEE (abbreviated weekday)
|
|
25
|
+
* - A → a (AM/PM)
|
|
26
|
+
*/
|
|
27
|
+
function normalizeDateFnsToken(fmt) {
|
|
28
|
+
return fmt
|
|
29
|
+
.replace(/YYYY/g, 'yyyy')
|
|
30
|
+
.replace(/YY/g, 'yy')
|
|
31
|
+
.replace(/\bDD\b/g, 'dd')
|
|
32
|
+
.replace(/\bD\b/g, 'd')
|
|
33
|
+
.replace(/dddd/g, 'EEEE')
|
|
34
|
+
.replace(/ddd/g, 'EEE')
|
|
35
|
+
.replace(/\bA\b/g, 'a');
|
|
36
|
+
}
|
|
37
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
38
|
+
// Formatting
|
|
39
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* Format a Date value with automatic Moment→date-fns token normalisation.
|
|
42
|
+
* Returns an empty string for null/undefined/invalid input.
|
|
43
|
+
*/
|
|
44
|
+
function formatDate(date, fmt) {
|
|
45
|
+
if (!date || !isValid(date))
|
|
46
|
+
return '';
|
|
47
|
+
return format(date, normalizeDateFnsToken(fmt));
|
|
48
|
+
}
|
|
49
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
50
|
+
// Parsing
|
|
51
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
52
|
+
const FALLBACK_FORMATS = [
|
|
53
|
+
'yyyy-MM-dd HH:mm:ss',
|
|
54
|
+
'yyyy-MM-dd HH:mm',
|
|
55
|
+
'yyyy-MM-dd hh:mm a',
|
|
56
|
+
'yyyy-MM-dd',
|
|
57
|
+
'MM/dd/yyyy HH:mm',
|
|
58
|
+
'MM/dd/yyyy',
|
|
59
|
+
'dd/MM/yyyy',
|
|
60
|
+
'yyyy/MM/dd',
|
|
61
|
+
'YYYY-MM-DD HH:mm:ss',
|
|
62
|
+
'YYYY-MM-DD HH:mm',
|
|
63
|
+
'YYYY-MM-DD'
|
|
64
|
+
];
|
|
65
|
+
/**
|
|
66
|
+
* Attempt to parse a value into a valid Date, trying multiple format strings.
|
|
67
|
+
* Returns null for blank/falsy input or unparseable strings.
|
|
68
|
+
*
|
|
69
|
+
* @param val Raw value from form control (string | Date | number | null | undefined)
|
|
70
|
+
* @param formats Optional array of format strings to try first (Moment tokens OK)
|
|
71
|
+
*/
|
|
72
|
+
function parseFlexibleDate(val, formats = []) {
|
|
73
|
+
if (val === null || val === undefined || val === '')
|
|
74
|
+
return null;
|
|
75
|
+
// Already a Date
|
|
76
|
+
if (val instanceof Date) {
|
|
77
|
+
return isValid(val) ? val : null;
|
|
78
|
+
}
|
|
79
|
+
// Number (unix ms timestamp)
|
|
80
|
+
if (typeof val === 'number') {
|
|
81
|
+
const d = new Date(val);
|
|
82
|
+
return isValid(d) ? d : null;
|
|
83
|
+
}
|
|
84
|
+
// String — try explicit formats first, then fallbacks
|
|
85
|
+
if (typeof val === 'string') {
|
|
86
|
+
const allFormats = [...formats, ...FALLBACK_FORMATS];
|
|
87
|
+
const referenceDate = new Date();
|
|
88
|
+
for (const fmt of allFormats) {
|
|
89
|
+
const normFmt = normalizeDateFnsToken(fmt);
|
|
90
|
+
try {
|
|
91
|
+
const parsed = parse(val, normFmt, referenceDate);
|
|
92
|
+
if (isValid(parsed) && parsed.getFullYear() > 1900) {
|
|
93
|
+
return parsed;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// try next format
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Last resort — ISO / native Date constructor
|
|
101
|
+
const native = new Date(val);
|
|
102
|
+
return isValid(native) ? native : null;
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Color math and conversion utilities for Talos UI.
|
|
109
|
+
* Zero-dependency, pure functions supporting HEX, RGB/RGBA, HSL/HSLA, and HSV/HSVA.
|
|
110
|
+
*/
|
|
111
|
+
/** Clamp a number between min and max */
|
|
112
|
+
function clamp(val, min, max) {
|
|
113
|
+
return Math.min(Math.max(val, min), max);
|
|
114
|
+
}
|
|
115
|
+
/** Round number to given precision */
|
|
116
|
+
function round(val, precision = 0) {
|
|
117
|
+
const factor = Math.pow(10, precision);
|
|
118
|
+
return Math.round(val * factor) / factor;
|
|
119
|
+
}
|
|
120
|
+
/** Convert HEX string (#fff, #ffffff, #ffffffff) to RGBA */
|
|
121
|
+
function hexToRgb(hex) {
|
|
122
|
+
if (!hex || typeof hex !== 'string')
|
|
123
|
+
return null;
|
|
124
|
+
let clean = hex.trim().replace(/^#/, '');
|
|
125
|
+
// 3-digit hex (#rgb)
|
|
126
|
+
if (clean.length === 3) {
|
|
127
|
+
clean = clean.split('').map(c => c + c).join('') + 'ff';
|
|
128
|
+
}
|
|
129
|
+
// 4-digit hex (#rgba)
|
|
130
|
+
else if (clean.length === 4) {
|
|
131
|
+
clean = clean.split('').map(c => c + c).join('');
|
|
132
|
+
}
|
|
133
|
+
// 6-digit hex (#rrggbb)
|
|
134
|
+
else if (clean.length === 6) {
|
|
135
|
+
clean = clean + 'ff';
|
|
136
|
+
}
|
|
137
|
+
if (clean.length !== 8 || !/^[0-9a-fA-F]{8}$/.test(clean)) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const r = parseInt(clean.substring(0, 2), 16);
|
|
141
|
+
const g = parseInt(clean.substring(2, 4), 16);
|
|
142
|
+
const b = parseInt(clean.substring(4, 6), 16);
|
|
143
|
+
const a = round(parseInt(clean.substring(6, 8), 16) / 255, 3);
|
|
144
|
+
return { r, g, b, a };
|
|
145
|
+
}
|
|
146
|
+
/** Convert RGBA to 6 or 8-digit HEX string */
|
|
147
|
+
function rgbToHex(rgba, includeAlpha = true) {
|
|
148
|
+
const r = clamp(Math.round(rgba.r), 0, 255).toString(16).padStart(2, '0');
|
|
149
|
+
const g = clamp(Math.round(rgba.g), 0, 255).toString(16).padStart(2, '0');
|
|
150
|
+
const b = clamp(Math.round(rgba.b), 0, 255).toString(16).padStart(2, '0');
|
|
151
|
+
if (includeAlpha && rgba.a !== undefined && rgba.a < 1) {
|
|
152
|
+
const a = clamp(Math.round(rgba.a * 255), 0, 255).toString(16).padStart(2, '0');
|
|
153
|
+
return `#${r}${g}${b}${a}`;
|
|
154
|
+
}
|
|
155
|
+
return `#${r}${g}${b}`;
|
|
156
|
+
}
|
|
157
|
+
/** Convert RGBA to HSVA */
|
|
158
|
+
function rgbToHsv(rgba) {
|
|
159
|
+
const r = rgba.r / 255;
|
|
160
|
+
const g = rgba.g / 255;
|
|
161
|
+
const b = rgba.b / 255;
|
|
162
|
+
const max = Math.max(r, g, b);
|
|
163
|
+
const min = Math.min(r, g, b);
|
|
164
|
+
const delta = max - min;
|
|
165
|
+
let h = 0;
|
|
166
|
+
if (delta !== 0) {
|
|
167
|
+
if (max === r) {
|
|
168
|
+
h = ((g - b) / delta + (g < b ? 6 : 0)) * 60;
|
|
169
|
+
}
|
|
170
|
+
else if (max === g) {
|
|
171
|
+
h = ((b - r) / delta + 2) * 60;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
h = ((r - g) / delta + 4) * 60;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const s = max === 0 ? 0 : (delta / max) * 100;
|
|
178
|
+
const v = max * 100;
|
|
179
|
+
return {
|
|
180
|
+
h: round(h, 1),
|
|
181
|
+
s: round(s, 1),
|
|
182
|
+
v: round(v, 1),
|
|
183
|
+
a: rgba.a !== undefined ? round(rgba.a, 3) : 1
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/** Convert HSVA to RGBA */
|
|
187
|
+
function hsvToRgb(hsva) {
|
|
188
|
+
const h = (hsva.h % 360 + 360) % 360;
|
|
189
|
+
const s = clamp(hsva.s, 0, 100) / 100;
|
|
190
|
+
const v = clamp(hsva.v, 0, 100) / 100;
|
|
191
|
+
const c = v * s;
|
|
192
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
193
|
+
const m = v - c;
|
|
194
|
+
let r1 = 0, g1 = 0, b1 = 0;
|
|
195
|
+
if (h >= 0 && h < 60) {
|
|
196
|
+
r1 = c;
|
|
197
|
+
g1 = x;
|
|
198
|
+
b1 = 0;
|
|
199
|
+
}
|
|
200
|
+
else if (h >= 60 && h < 120) {
|
|
201
|
+
r1 = x;
|
|
202
|
+
g1 = c;
|
|
203
|
+
b1 = 0;
|
|
204
|
+
}
|
|
205
|
+
else if (h >= 120 && h < 180) {
|
|
206
|
+
r1 = 0;
|
|
207
|
+
g1 = c;
|
|
208
|
+
b1 = x;
|
|
209
|
+
}
|
|
210
|
+
else if (h >= 180 && h < 240) {
|
|
211
|
+
r1 = 0;
|
|
212
|
+
g1 = x;
|
|
213
|
+
b1 = c;
|
|
214
|
+
}
|
|
215
|
+
else if (h >= 240 && h < 300) {
|
|
216
|
+
r1 = x;
|
|
217
|
+
g1 = 0;
|
|
218
|
+
b1 = c;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
r1 = c;
|
|
222
|
+
g1 = 0;
|
|
223
|
+
b1 = x;
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
r: Math.round((r1 + m) * 255),
|
|
227
|
+
g: Math.round((g1 + m) * 255),
|
|
228
|
+
b: Math.round((b1 + m) * 255),
|
|
229
|
+
a: hsva.a !== undefined ? round(hsva.a, 3) : 1
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/** Convert RGBA to HSLA */
|
|
233
|
+
function rgbToHsl(rgba) {
|
|
234
|
+
const r = rgba.r / 255;
|
|
235
|
+
const g = rgba.g / 255;
|
|
236
|
+
const b = rgba.b / 255;
|
|
237
|
+
const max = Math.max(r, g, b);
|
|
238
|
+
const min = Math.min(r, g, b);
|
|
239
|
+
const delta = max - min;
|
|
240
|
+
const l = (max + min) / 2;
|
|
241
|
+
let h = 0;
|
|
242
|
+
let s = 0;
|
|
243
|
+
if (delta !== 0) {
|
|
244
|
+
s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);
|
|
245
|
+
if (max === r) {
|
|
246
|
+
h = ((g - b) / delta + (g < b ? 6 : 0)) * 60;
|
|
247
|
+
}
|
|
248
|
+
else if (max === g) {
|
|
249
|
+
h = ((b - r) / delta + 2) * 60;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
h = ((r - g) / delta + 4) * 60;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
h: round(h, 1),
|
|
257
|
+
s: round(s * 100, 1),
|
|
258
|
+
l: round(l * 100, 1),
|
|
259
|
+
a: rgba.a !== undefined ? round(rgba.a, 3) : 1
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/** Convert HSLA to RGBA */
|
|
263
|
+
function hslToRgb(hsla) {
|
|
264
|
+
const h = (hsla.h % 360 + 360) % 360;
|
|
265
|
+
const s = clamp(hsla.s, 0, 100) / 100;
|
|
266
|
+
const l = clamp(hsla.l, 0, 100) / 100;
|
|
267
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
268
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
269
|
+
const m = l - c / 2;
|
|
270
|
+
let r1 = 0, g1 = 0, b1 = 0;
|
|
271
|
+
if (h >= 0 && h < 60) {
|
|
272
|
+
r1 = c;
|
|
273
|
+
g1 = x;
|
|
274
|
+
b1 = 0;
|
|
275
|
+
}
|
|
276
|
+
else if (h >= 60 && h < 120) {
|
|
277
|
+
r1 = x;
|
|
278
|
+
g1 = c;
|
|
279
|
+
b1 = 0;
|
|
280
|
+
}
|
|
281
|
+
else if (h >= 120 && h < 180) {
|
|
282
|
+
r1 = 0;
|
|
283
|
+
g1 = c;
|
|
284
|
+
b1 = x;
|
|
285
|
+
}
|
|
286
|
+
else if (h >= 180 && h < 240) {
|
|
287
|
+
r1 = 0;
|
|
288
|
+
g1 = x;
|
|
289
|
+
b1 = c;
|
|
290
|
+
}
|
|
291
|
+
else if (h >= 240 && h < 300) {
|
|
292
|
+
r1 = x;
|
|
293
|
+
g1 = 0;
|
|
294
|
+
b1 = c;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
r1 = c;
|
|
298
|
+
g1 = 0;
|
|
299
|
+
b1 = x;
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
r: Math.round((r1 + m) * 255),
|
|
303
|
+
g: Math.round((g1 + m) * 255),
|
|
304
|
+
b: Math.round((b1 + m) * 255),
|
|
305
|
+
a: hsla.a !== undefined ? round(hsla.a, 3) : 1
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
/** Convert HSVA to HSLA */
|
|
309
|
+
function hsvToHsl(hsva) {
|
|
310
|
+
return rgbToHsl(hsvToRgb(hsva));
|
|
311
|
+
}
|
|
312
|
+
/** Convert HSLA to HSVA */
|
|
313
|
+
function hslToHsv(hsla) {
|
|
314
|
+
return rgbToHsv(hslToRgb(hsla));
|
|
315
|
+
}
|
|
316
|
+
/** Parse any CSS color format (hex, rgb, rgba, hsl, hsla) into RGBA */
|
|
317
|
+
function parseColor(color) {
|
|
318
|
+
if (!color || typeof color !== 'string')
|
|
319
|
+
return null;
|
|
320
|
+
const str = color.trim().toLowerCase();
|
|
321
|
+
// Try HEX
|
|
322
|
+
if (str.startsWith('#') || /^[0-9a-fA-F]{3,8}$/.test(str)) {
|
|
323
|
+
return hexToRgb(str.startsWith('#') ? str : `#${str}`);
|
|
324
|
+
}
|
|
325
|
+
// Try RGB / RGBA
|
|
326
|
+
const rgbMatch = str.match(/^rgba?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)(?:\s*,\s*([\d.%]+))?\s*\)$/);
|
|
327
|
+
if (rgbMatch) {
|
|
328
|
+
const r = clamp(parseFloat(rgbMatch[1]), 0, 255);
|
|
329
|
+
const g = clamp(parseFloat(rgbMatch[2]), 0, 255);
|
|
330
|
+
const b = clamp(parseFloat(rgbMatch[3]), 0, 255);
|
|
331
|
+
let a = 1;
|
|
332
|
+
if (rgbMatch[4] !== undefined) {
|
|
333
|
+
if (rgbMatch[4].endsWith('%')) {
|
|
334
|
+
a = clamp(parseFloat(rgbMatch[4]) / 100, 0, 1);
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
a = clamp(parseFloat(rgbMatch[4]), 0, 1);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return { r, g, b, a: round(a, 3) };
|
|
341
|
+
}
|
|
342
|
+
// Try HSL / HSLA
|
|
343
|
+
const hslMatch = str.match(/^hsla?\s*\(\s*([\d.]+)(?:deg)?\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%(?:\s*,\s*([\d.%]+))?\s*\)$/);
|
|
344
|
+
if (hslMatch) {
|
|
345
|
+
const h = (parseFloat(hslMatch[1]) % 360 + 360) % 360;
|
|
346
|
+
const s = clamp(parseFloat(hslMatch[2]), 0, 100);
|
|
347
|
+
const l = clamp(parseFloat(hslMatch[3]), 0, 100);
|
|
348
|
+
let a = 1;
|
|
349
|
+
if (hslMatch[4] !== undefined) {
|
|
350
|
+
if (hslMatch[4].endsWith('%')) {
|
|
351
|
+
a = clamp(parseFloat(hslMatch[4]) / 100, 0, 1);
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
a = clamp(parseFloat(hslMatch[4]), 0, 1);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return hslToRgb({ h, s, l, a: round(a, 3) });
|
|
358
|
+
}
|
|
359
|
+
// Known named colors fallback
|
|
360
|
+
const NAMED_COLORS = {
|
|
361
|
+
transparent: '#00000000',
|
|
362
|
+
black: '#000000',
|
|
363
|
+
white: '#ffffff',
|
|
364
|
+
red: '#ef4444',
|
|
365
|
+
green: '#22c55e',
|
|
366
|
+
blue: '#3b82f6',
|
|
367
|
+
yellow: '#eab308',
|
|
368
|
+
orange: '#f97316',
|
|
369
|
+
purple: '#a855f7',
|
|
370
|
+
pink: '#ec4899',
|
|
371
|
+
gray: '#6b7280',
|
|
372
|
+
slate: '#64748b'
|
|
373
|
+
};
|
|
374
|
+
if (NAMED_COLORS[str]) {
|
|
375
|
+
return hexToRgb(NAMED_COLORS[str]);
|
|
376
|
+
}
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
/** Format an RGBA color into the desired string format */
|
|
380
|
+
function formatColor(rgba, format, includeAlpha = true) {
|
|
381
|
+
const hasAlpha = includeAlpha && rgba.a !== undefined && rgba.a < 1;
|
|
382
|
+
switch (format) {
|
|
383
|
+
case 'hex':
|
|
384
|
+
return rgbToHex(rgba, includeAlpha);
|
|
385
|
+
case 'rgb':
|
|
386
|
+
return hasAlpha
|
|
387
|
+
? `rgba(${Math.round(rgba.r)}, ${Math.round(rgba.g)}, ${Math.round(rgba.b)}, ${round(rgba.a, 2)})`
|
|
388
|
+
: `rgb(${Math.round(rgba.r)}, ${Math.round(rgba.g)}, ${Math.round(rgba.b)})`;
|
|
389
|
+
case 'hsl': {
|
|
390
|
+
const hsl = rgbToHsl(rgba);
|
|
391
|
+
return hasAlpha
|
|
392
|
+
? `hsla(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%, ${round(hsl.a, 2)})`
|
|
393
|
+
: `hsl(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%)`;
|
|
394
|
+
}
|
|
395
|
+
case 'hsv': {
|
|
396
|
+
const hsv = rgbToHsv(rgba);
|
|
397
|
+
return hasAlpha
|
|
398
|
+
? `hsva(${Math.round(hsv.h)}, ${Math.round(hsv.s)}%, ${Math.round(hsv.v)}%, ${round(hsv.a, 2)})`
|
|
399
|
+
: `hsv(${Math.round(hsv.h)}, ${Math.round(hsv.s)}%, ${Math.round(hsv.v)}%)`;
|
|
400
|
+
}
|
|
401
|
+
default:
|
|
402
|
+
return rgbToHex(rgba, includeAlpha);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/** Check whether a string is a valid color */
|
|
406
|
+
function isValidColor(color) {
|
|
407
|
+
return parseColor(color) !== null;
|
|
408
|
+
}
|
|
409
|
+
/** Calculate relative luminance of an RGBA color (WCAG 2.0 formula) */
|
|
410
|
+
function getLuminance(rgba) {
|
|
411
|
+
const a = [rgba.r, rgba.g, rgba.b].map(v => {
|
|
412
|
+
v /= 255;
|
|
413
|
+
return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
|
|
414
|
+
});
|
|
415
|
+
return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];
|
|
416
|
+
}
|
|
417
|
+
/** Calculate contrast ratio between two colors */
|
|
418
|
+
function getContrastRatio(color1, color2) {
|
|
419
|
+
const lum1 = getLuminance(color1);
|
|
420
|
+
const lum2 = getLuminance(color2);
|
|
421
|
+
const brightest = Math.max(lum1, lum2);
|
|
422
|
+
const darkest = Math.min(lum1, lum2);
|
|
423
|
+
return (brightest + 0.05) / (darkest + 0.05);
|
|
424
|
+
}
|
|
425
|
+
/** Check if color is light (useful for dynamic text/icon contrast) */
|
|
426
|
+
function isLightColor(rgba) {
|
|
427
|
+
// If highly transparent, assume light background
|
|
428
|
+
if (rgba.a !== undefined && rgba.a < 0.4)
|
|
429
|
+
return true;
|
|
430
|
+
return getLuminance(rgba) > 0.45;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Generated bundle index. Do not edit.
|
|
435
|
+
*/
|
|
436
|
+
|
|
437
|
+
export { clamp, formatColor, formatDate, getContrastRatio, getLuminance, hexToRgb, hslToHsv, hslToRgb, hsvToHsl, hsvToRgb, isLightColor, isValidColor, normalizeDateFnsToken, parseColor, parseFlexibleDate, rgbToHex, rgbToHsl, rgbToHsv, round };
|
|
438
|
+
//# sourceMappingURL=weeehaoooz-talos-ui-core.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weeehaoooz-talos-ui-core.mjs","sources":["../../../projects/talos-ui/core/date-utils.ts","../../../projects/talos-ui/core/color-utils.ts","../../../projects/talos-ui/core/weeehaoooz-talos-ui-core.ts"],"sourcesContent":["/**\n * Shared date utility helpers wrapping date-fns.\n *\n * All functions are pure and tree-shakeable.\n * Moment.js tokens (YYYY, DD, etc.) are automatically normalised to the\n * Unicode/UTS-35 tokens that date-fns expects (yyyy, dd, etc.).\n */\n\nimport { format as dfFormat, isValid as dfIsValid, parse as dfParse } from 'date-fns';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Token normalisation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Converts Moment.js format tokens to their date-fns UTS-35 equivalents.\n * This lets consumers continue passing legacy strings like 'YYYY-MM-DD'\n * without any configuration change.\n *\n * Key differences handled:\n * - YYYY → yyyy (calendar year, not ISO week year)\n * - YY → yy (2-digit year)\n * - DD → dd (day of month, not day of year)\n * - D → d (day of month, not day of year)\n * - dddd → EEEE (full weekday name)\n * - ddd → EEE (abbreviated weekday)\n * - A → a (AM/PM)\n */\nexport function normalizeDateFnsToken(fmt: string): string {\n return fmt\n .replace(/YYYY/g, 'yyyy')\n .replace(/YY/g, 'yy')\n .replace(/\\bDD\\b/g, 'dd')\n .replace(/\\bD\\b/g, 'd')\n .replace(/dddd/g, 'EEEE')\n .replace(/ddd/g, 'EEE')\n .replace(/\\bA\\b/g, 'a');\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Formatting\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Format a Date value with automatic Moment→date-fns token normalisation.\n * Returns an empty string for null/undefined/invalid input.\n */\nexport function formatDate(date: Date | null | undefined, fmt: string): string {\n if (!date || !dfIsValid(date)) return '';\n return dfFormat(date, normalizeDateFnsToken(fmt));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Parsing\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst FALLBACK_FORMATS = [\n 'yyyy-MM-dd HH:mm:ss',\n 'yyyy-MM-dd HH:mm',\n 'yyyy-MM-dd hh:mm a',\n 'yyyy-MM-dd',\n 'MM/dd/yyyy HH:mm',\n 'MM/dd/yyyy',\n 'dd/MM/yyyy',\n 'yyyy/MM/dd',\n 'YYYY-MM-DD HH:mm:ss',\n 'YYYY-MM-DD HH:mm',\n 'YYYY-MM-DD'\n];\n\n/**\n * Attempt to parse a value into a valid Date, trying multiple format strings.\n * Returns null for blank/falsy input or unparseable strings.\n *\n * @param val Raw value from form control (string | Date | number | null | undefined)\n * @param formats Optional array of format strings to try first (Moment tokens OK)\n */\nexport function parseFlexibleDate(\n val: unknown,\n formats: string[] = []\n): Date | null {\n if (val === null || val === undefined || val === '') return null;\n\n // Already a Date\n if (val instanceof Date) {\n return dfIsValid(val) ? val : null;\n }\n\n // Number (unix ms timestamp)\n if (typeof val === 'number') {\n const d = new Date(val);\n return dfIsValid(d) ? d : null;\n }\n\n // String — try explicit formats first, then fallbacks\n if (typeof val === 'string') {\n const allFormats = [...formats, ...FALLBACK_FORMATS];\n const referenceDate = new Date();\n\n for (const fmt of allFormats) {\n const normFmt = normalizeDateFnsToken(fmt);\n try {\n const parsed = dfParse(val, normFmt, referenceDate);\n if (dfIsValid(parsed) && parsed.getFullYear() > 1900) {\n return parsed;\n }\n } catch {\n // try next format\n }\n }\n\n // Last resort — ISO / native Date constructor\n const native = new Date(val);\n return dfIsValid(native) ? native : null;\n }\n\n return null;\n}\n","/**\n * Color math and conversion utilities for Talos UI.\n * Zero-dependency, pure functions supporting HEX, RGB/RGBA, HSL/HSLA, and HSV/HSVA.\n */\n\nexport interface RgbaColor {\n r: number; // 0 - 255\n g: number; // 0 - 255\n b: number; // 0 - 255\n a: number; // 0 - 1\n}\n\nexport interface HslaColor {\n h: number; // 0 - 360\n s: number; // 0 - 100\n l: number; // 0 - 100\n a: number; // 0 - 1\n}\n\nexport interface HsvaColor {\n h: number; // 0 - 360\n s: number; // 0 - 100\n v: number; // 0 - 100\n a: number; // 0 - 1\n}\n\nexport type ColorFormat = 'hex' | 'rgb' | 'hsl' | 'hsv';\n\n/** Clamp a number between min and max */\nexport function clamp(val: number, min: number, max: number): number {\n return Math.min(Math.max(val, min), max);\n}\n\n/** Round number to given precision */\nexport function round(val: number, precision: number = 0): number {\n const factor = Math.pow(10, precision);\n return Math.round(val * factor) / factor;\n}\n\n/** Convert HEX string (#fff, #ffffff, #ffffffff) to RGBA */\nexport function hexToRgb(hex: string): RgbaColor | null {\n if (!hex || typeof hex !== 'string') return null;\n\n let clean = hex.trim().replace(/^#/, '');\n\n // 3-digit hex (#rgb)\n if (clean.length === 3) {\n clean = clean.split('').map(c => c + c).join('') + 'ff';\n }\n // 4-digit hex (#rgba)\n else if (clean.length === 4) {\n clean = clean.split('').map(c => c + c).join('');\n }\n // 6-digit hex (#rrggbb)\n else if (clean.length === 6) {\n clean = clean + 'ff';\n }\n\n if (clean.length !== 8 || !/^[0-9a-fA-F]{8}$/.test(clean)) {\n return null;\n }\n\n const r = parseInt(clean.substring(0, 2), 16);\n const g = parseInt(clean.substring(2, 4), 16);\n const b = parseInt(clean.substring(4, 6), 16);\n const a = round(parseInt(clean.substring(6, 8), 16) / 255, 3);\n\n return { r, g, b, a };\n}\n\n/** Convert RGBA to 6 or 8-digit HEX string */\nexport function rgbToHex(rgba: RgbaColor, includeAlpha: boolean = true): string {\n const r = clamp(Math.round(rgba.r), 0, 255).toString(16).padStart(2, '0');\n const g = clamp(Math.round(rgba.g), 0, 255).toString(16).padStart(2, '0');\n const b = clamp(Math.round(rgba.b), 0, 255).toString(16).padStart(2, '0');\n\n if (includeAlpha && rgba.a !== undefined && rgba.a < 1) {\n const a = clamp(Math.round(rgba.a * 255), 0, 255).toString(16).padStart(2, '0');\n return `#${r}${g}${b}${a}`;\n }\n\n return `#${r}${g}${b}`;\n}\n\n/** Convert RGBA to HSVA */\nexport function rgbToHsv(rgba: RgbaColor): HsvaColor {\n const r = rgba.r / 255;\n const g = rgba.g / 255;\n const b = rgba.b / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let h = 0;\n if (delta !== 0) {\n if (max === r) {\n h = ((g - b) / delta + (g < b ? 6 : 0)) * 60;\n } else if (max === g) {\n h = ((b - r) / delta + 2) * 60;\n } else {\n h = ((r - g) / delta + 4) * 60;\n }\n }\n\n const s = max === 0 ? 0 : (delta / max) * 100;\n const v = max * 100;\n\n return {\n h: round(h, 1),\n s: round(s, 1),\n v: round(v, 1),\n a: rgba.a !== undefined ? round(rgba.a, 3) : 1\n };\n}\n\n/** Convert HSVA to RGBA */\nexport function hsvToRgb(hsva: HsvaColor): RgbaColor {\n const h = (hsva.h % 360 + 360) % 360;\n const s = clamp(hsva.s, 0, 100) / 100;\n const v = clamp(hsva.v, 0, 100) / 100;\n\n const c = v * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = v - c;\n\n let r1 = 0, g1 = 0, b1 = 0;\n\n if (h >= 0 && h < 60) {\n r1 = c; g1 = x; b1 = 0;\n } else if (h >= 60 && h < 120) {\n r1 = x; g1 = c; b1 = 0;\n } else if (h >= 120 && h < 180) {\n r1 = 0; g1 = c; b1 = x;\n } else if (h >= 180 && h < 240) {\n r1 = 0; g1 = x; b1 = c;\n } else if (h >= 240 && h < 300) {\n r1 = x; g1 = 0; b1 = c;\n } else {\n r1 = c; g1 = 0; b1 = x;\n }\n\n return {\n r: Math.round((r1 + m) * 255),\n g: Math.round((g1 + m) * 255),\n b: Math.round((b1 + m) * 255),\n a: hsva.a !== undefined ? round(hsva.a, 3) : 1\n };\n}\n\n/** Convert RGBA to HSLA */\nexport function rgbToHsl(rgba: RgbaColor): HslaColor {\n const r = rgba.r / 255;\n const g = rgba.g / 255;\n const b = rgba.b / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n const l = (max + min) / 2;\n\n let h = 0;\n let s = 0;\n\n if (delta !== 0) {\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n\n if (max === r) {\n h = ((g - b) / delta + (g < b ? 6 : 0)) * 60;\n } else if (max === g) {\n h = ((b - r) / delta + 2) * 60;\n } else {\n h = ((r - g) / delta + 4) * 60;\n }\n }\n\n return {\n h: round(h, 1),\n s: round(s * 100, 1),\n l: round(l * 100, 1),\n a: rgba.a !== undefined ? round(rgba.a, 3) : 1\n };\n}\n\n/** Convert HSLA to RGBA */\nexport function hslToRgb(hsla: HslaColor): RgbaColor {\n const h = (hsla.h % 360 + 360) % 360;\n const s = clamp(hsla.s, 0, 100) / 100;\n const l = clamp(hsla.l, 0, 100) / 100;\n\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n\n let r1 = 0, g1 = 0, b1 = 0;\n\n if (h >= 0 && h < 60) {\n r1 = c; g1 = x; b1 = 0;\n } else if (h >= 60 && h < 120) {\n r1 = x; g1 = c; b1 = 0;\n } else if (h >= 120 && h < 180) {\n r1 = 0; g1 = c; b1 = x;\n } else if (h >= 180 && h < 240) {\n r1 = 0; g1 = x; b1 = c;\n } else if (h >= 240 && h < 300) {\n r1 = x; g1 = 0; b1 = c;\n } else {\n r1 = c; g1 = 0; b1 = x;\n }\n\n return {\n r: Math.round((r1 + m) * 255),\n g: Math.round((g1 + m) * 255),\n b: Math.round((b1 + m) * 255),\n a: hsla.a !== undefined ? round(hsla.a, 3) : 1\n };\n}\n\n/** Convert HSVA to HSLA */\nexport function hsvToHsl(hsva: HsvaColor): HslaColor {\n return rgbToHsl(hsvToRgb(hsva));\n}\n\n/** Convert HSLA to HSVA */\nexport function hslToHsv(hsla: HslaColor): HsvaColor {\n return rgbToHsv(hslToRgb(hsla));\n}\n\n/** Parse any CSS color format (hex, rgb, rgba, hsl, hsla) into RGBA */\nexport function parseColor(color: string): RgbaColor | null {\n if (!color || typeof color !== 'string') return null;\n const str = color.trim().toLowerCase();\n\n // Try HEX\n if (str.startsWith('#') || /^[0-9a-fA-F]{3,8}$/.test(str)) {\n return hexToRgb(str.startsWith('#') ? str : `#${str}`);\n }\n\n // Try RGB / RGBA\n const rgbMatch = str.match(/^rgba?\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)(?:\\s*,\\s*([\\d.%]+))?\\s*\\)$/);\n if (rgbMatch) {\n const r = clamp(parseFloat(rgbMatch[1]), 0, 255);\n const g = clamp(parseFloat(rgbMatch[2]), 0, 255);\n const b = clamp(parseFloat(rgbMatch[3]), 0, 255);\n let a = 1;\n if (rgbMatch[4] !== undefined) {\n if (rgbMatch[4].endsWith('%')) {\n a = clamp(parseFloat(rgbMatch[4]) / 100, 0, 1);\n } else {\n a = clamp(parseFloat(rgbMatch[4]), 0, 1);\n }\n }\n return { r, g, b, a: round(a, 3) };\n }\n\n // Try HSL / HSLA\n const hslMatch = str.match(/^hsla?\\s*\\(\\s*([\\d.]+)(?:deg)?\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*([\\d.%]+))?\\s*\\)$/);\n if (hslMatch) {\n const h = (parseFloat(hslMatch[1]) % 360 + 360) % 360;\n const s = clamp(parseFloat(hslMatch[2]), 0, 100);\n const l = clamp(parseFloat(hslMatch[3]), 0, 100);\n let a = 1;\n if (hslMatch[4] !== undefined) {\n if (hslMatch[4].endsWith('%')) {\n a = clamp(parseFloat(hslMatch[4]) / 100, 0, 1);\n } else {\n a = clamp(parseFloat(hslMatch[4]), 0, 1);\n }\n }\n return hslToRgb({ h, s, l, a: round(a, 3) });\n }\n\n // Known named colors fallback\n const NAMED_COLORS: Record<string, string> = {\n transparent: '#00000000',\n black: '#000000',\n white: '#ffffff',\n red: '#ef4444',\n green: '#22c55e',\n blue: '#3b82f6',\n yellow: '#eab308',\n orange: '#f97316',\n purple: '#a855f7',\n pink: '#ec4899',\n gray: '#6b7280',\n slate: '#64748b'\n };\n\n if (NAMED_COLORS[str]) {\n return hexToRgb(NAMED_COLORS[str]);\n }\n\n return null;\n}\n\n/** Format an RGBA color into the desired string format */\nexport function formatColor(rgba: RgbaColor, format: ColorFormat, includeAlpha: boolean = true): string {\n const hasAlpha = includeAlpha && rgba.a !== undefined && rgba.a < 1;\n\n switch (format) {\n case 'hex':\n return rgbToHex(rgba, includeAlpha);\n case 'rgb':\n return hasAlpha\n ? `rgba(${Math.round(rgba.r)}, ${Math.round(rgba.g)}, ${Math.round(rgba.b)}, ${round(rgba.a, 2)})`\n : `rgb(${Math.round(rgba.r)}, ${Math.round(rgba.g)}, ${Math.round(rgba.b)})`;\n case 'hsl': {\n const hsl = rgbToHsl(rgba);\n return hasAlpha\n ? `hsla(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%, ${round(hsl.a, 2)})`\n : `hsl(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%)`;\n }\n case 'hsv': {\n const hsv = rgbToHsv(rgba);\n return hasAlpha\n ? `hsva(${Math.round(hsv.h)}, ${Math.round(hsv.s)}%, ${Math.round(hsv.v)}%, ${round(hsv.a, 2)})`\n : `hsv(${Math.round(hsv.h)}, ${Math.round(hsv.s)}%, ${Math.round(hsv.v)}%)`;\n }\n default:\n return rgbToHex(rgba, includeAlpha);\n }\n}\n\n/** Check whether a string is a valid color */\nexport function isValidColor(color: string): boolean {\n return parseColor(color) !== null;\n}\n\n/** Calculate relative luminance of an RGBA color (WCAG 2.0 formula) */\nexport function getLuminance(rgba: RgbaColor): number {\n const a = [rgba.r, rgba.g, rgba.b].map(v => {\n v /= 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];\n}\n\n/** Calculate contrast ratio between two colors */\nexport function getContrastRatio(color1: RgbaColor, color2: RgbaColor): number {\n const lum1 = getLuminance(color1);\n const lum2 = getLuminance(color2);\n const brightest = Math.max(lum1, lum2);\n const darkest = Math.min(lum1, lum2);\n return (brightest + 0.05) / (darkest + 0.05);\n}\n\n/** Check if color is light (useful for dynamic text/icon contrast) */\nexport function isLightColor(rgba: RgbaColor): boolean {\n // If highly transparent, assume light background\n if (rgba.a !== undefined && rgba.a < 0.4) return true;\n return getLuminance(rgba) > 0.45;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["dfIsValid","dfFormat","dfParse"],"mappings":"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"}
|