@ngxsmk/cdk 1.3.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cva-base/cva-base.d.ts +34 -0
- package/cva-base/cva-base.d.ts.map +1 -0
- package/cva-base/index.d.ts +2 -0
- package/cva-base/index.d.ts.map +1 -0
- package/cva-base/ngxsmk-cdk-cva-base.d.ts.map +1 -0
- package/esm2022/cva-base/cva-base.mjs +45 -0
- package/esm2022/cva-base/index.mjs +2 -0
- package/esm2022/cva-base/ngxsmk-cdk-cva-base.mjs +5 -0
- package/esm2022/input-group/index.mjs +3 -0
- package/esm2022/input-group/input-group-engine.mjs +219 -0
- package/esm2022/input-group/models/index.mjs +2 -0
- package/esm2022/input-group/models/input-group.model.mjs +2 -0
- package/esm2022/input-group/ngxsmk-cdk-input-group.mjs +5 -0
- package/esm2022/listbox-keyboard/index.mjs +2 -0
- package/esm2022/listbox-keyboard/listbox-keyboard.mjs +145 -0
- package/esm2022/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.mjs +5 -0
- package/esm2022/public-api.mjs +10 -1
- package/esm2022/scheduler/index.mjs +5 -0
- package/esm2022/scheduler/models/date-range.mjs +2 -0
- package/esm2022/scheduler/models/event.model.mjs +2 -0
- package/esm2022/scheduler/models/index.mjs +6 -0
- package/esm2022/scheduler/models/resource.model.mjs +5 -0
- package/esm2022/scheduler/models/selection.model.mjs +7 -0
- package/esm2022/scheduler/models/view.model.mjs +7 -0
- package/esm2022/scheduler/ngxsmk-cdk-scheduler.mjs +5 -0
- package/esm2022/scheduler/plugin/drag-plugin.mjs +82 -0
- package/esm2022/scheduler/plugin/index.mjs +8 -0
- package/esm2022/scheduler/plugin/keyboard-plugin.mjs +150 -0
- package/esm2022/scheduler/plugin/plugin-host.mjs +48 -0
- package/esm2022/scheduler/plugin/plugin.types.mjs +2 -0
- package/esm2022/scheduler/plugin/resize-plugin.mjs +74 -0
- package/esm2022/scheduler/plugin/selection-plugin.mjs +84 -0
- package/esm2022/scheduler/plugin/tooltip-plugin.mjs +103 -0
- package/esm2022/scheduler/scheduler-engine.mjs +316 -0
- package/esm2022/scheduler/utils/date-utils.mjs +131 -0
- package/esm2022/scheduler/utils/index.mjs +3 -0
- package/esm2022/scheduler/utils/snap.mjs +24 -0
- package/esm2022/spreadsheet/index.mjs +5 -0
- package/esm2022/spreadsheet/models/cell.model.mjs +2 -0
- package/esm2022/spreadsheet/models/column.model.mjs +2 -0
- package/esm2022/spreadsheet/models/filter.model.mjs +2 -0
- package/esm2022/spreadsheet/models/formula.model.mjs +2 -0
- package/esm2022/spreadsheet/models/index.mjs +8 -0
- package/esm2022/spreadsheet/models/row.model.mjs +2 -0
- package/esm2022/spreadsheet/models/selection.model.mjs +2 -0
- package/esm2022/spreadsheet/models/sort.model.mjs +2 -0
- package/esm2022/spreadsheet/ngxsmk-cdk-spreadsheet.mjs +5 -0
- package/esm2022/spreadsheet/plugin/clipboard-plugin.mjs +171 -0
- package/esm2022/spreadsheet/plugin/filter-plugin.mjs +87 -0
- package/esm2022/spreadsheet/plugin/formula-plugin.mjs +456 -0
- package/esm2022/spreadsheet/plugin/index.mjs +10 -0
- package/esm2022/spreadsheet/plugin/plugin-host.mjs +188 -0
- package/esm2022/spreadsheet/plugin/plugin.types.mjs +2 -0
- package/esm2022/spreadsheet/plugin/selection-plugin.mjs +114 -0
- package/esm2022/spreadsheet/plugin/sort-plugin.mjs +63 -0
- package/esm2022/spreadsheet/plugin/undo-plugin.mjs +138 -0
- package/esm2022/spreadsheet/plugin/validation-plugin.mjs +71 -0
- package/esm2022/spreadsheet/spreadsheet-engine.mjs +547 -0
- package/esm2022/spreadsheet/utils/cell-utils.mjs +129 -0
- package/esm2022/spreadsheet/utils/index.mjs +2 -0
- package/esm2022/testing/a11y.mjs +6 -3
- package/fesm2022/ngxsmk-cdk-cva-base.mjs +52 -0
- package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-input-group.mjs +226 -0
- package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs +152 -0
- package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-scheduler.mjs +1035 -0
- package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-spreadsheet.mjs +1969 -0
- package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-testing.mjs +5 -2
- package/fesm2022/ngxsmk-cdk-testing.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk.mjs +5 -0
- package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
- package/input-group/index.d.ts +3 -0
- package/input-group/index.d.ts.map +1 -0
- package/input-group/input-group-engine.d.ts +88 -0
- package/input-group/input-group-engine.d.ts.map +1 -0
- package/input-group/models/index.d.ts +2 -0
- package/input-group/models/index.d.ts.map +1 -0
- package/input-group/models/input-group.model.d.ts +114 -0
- package/input-group/models/input-group.model.d.ts.map +1 -0
- package/input-group/ngxsmk-cdk-input-group.d.ts.map +1 -0
- package/listbox-keyboard/index.d.ts +2 -0
- package/listbox-keyboard/index.d.ts.map +1 -0
- package/listbox-keyboard/listbox-keyboard.d.ts +60 -0
- package/listbox-keyboard/listbox-keyboard.d.ts.map +1 -0
- package/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.d.ts.map +1 -0
- package/package.json +40 -1
- package/public-api.d.ts +8 -0
- package/public-api.d.ts.map +1 -1
- package/scheduler/index.d.ts +5 -0
- package/scheduler/index.d.ts.map +1 -0
- package/scheduler/models/date-range.d.ts +6 -0
- package/scheduler/models/date-range.d.ts.map +1 -0
- package/scheduler/models/event.model.d.ts +50 -0
- package/scheduler/models/event.model.d.ts.map +1 -0
- package/scheduler/models/index.d.ts +6 -0
- package/scheduler/models/index.d.ts.map +1 -0
- package/scheduler/models/resource.model.d.ts +16 -0
- package/scheduler/models/resource.model.d.ts.map +1 -0
- package/scheduler/models/selection.model.d.ts +12 -0
- package/scheduler/models/selection.model.d.ts.map +1 -0
- package/scheduler/models/view.model.d.ts +21 -0
- package/scheduler/models/view.model.d.ts.map +1 -0
- package/scheduler/ngxsmk-cdk-scheduler.d.ts.map +1 -0
- package/scheduler/plugin/drag-plugin.d.ts +28 -0
- package/scheduler/plugin/drag-plugin.d.ts.map +1 -0
- package/scheduler/plugin/index.d.ts +8 -0
- package/scheduler/plugin/index.d.ts.map +1 -0
- package/scheduler/plugin/keyboard-plugin.d.ts +24 -0
- package/scheduler/plugin/keyboard-plugin.d.ts.map +1 -0
- package/scheduler/plugin/plugin-host.d.ts +16 -0
- package/scheduler/plugin/plugin-host.d.ts.map +1 -0
- package/scheduler/plugin/plugin.types.d.ts +9 -0
- package/scheduler/plugin/plugin.types.d.ts.map +1 -0
- package/scheduler/plugin/resize-plugin.d.ts +26 -0
- package/scheduler/plugin/resize-plugin.d.ts.map +1 -0
- package/scheduler/plugin/selection-plugin.d.ts +40 -0
- package/scheduler/plugin/selection-plugin.d.ts.map +1 -0
- package/scheduler/plugin/tooltip-plugin.d.ts +41 -0
- package/scheduler/plugin/tooltip-plugin.d.ts.map +1 -0
- package/scheduler/scheduler-engine.d.ts +95 -0
- package/scheduler/scheduler-engine.d.ts.map +1 -0
- package/scheduler/utils/date-utils.d.ts +26 -0
- package/scheduler/utils/date-utils.d.ts.map +1 -0
- package/scheduler/utils/index.d.ts +3 -0
- package/scheduler/utils/index.d.ts.map +1 -0
- package/scheduler/utils/snap.d.ts +7 -0
- package/scheduler/utils/snap.d.ts.map +1 -0
- package/spreadsheet/index.d.ts +5 -0
- package/spreadsheet/index.d.ts.map +1 -0
- package/spreadsheet/models/cell.model.d.ts +44 -0
- package/spreadsheet/models/cell.model.d.ts.map +1 -0
- package/spreadsheet/models/column.model.d.ts +77 -0
- package/spreadsheet/models/column.model.d.ts.map +1 -0
- package/spreadsheet/models/filter.model.d.ts +15 -0
- package/spreadsheet/models/filter.model.d.ts.map +1 -0
- package/spreadsheet/models/formula.model.d.ts +65 -0
- package/spreadsheet/models/formula.model.d.ts.map +1 -0
- package/spreadsheet/models/index.d.ts +8 -0
- package/spreadsheet/models/index.d.ts.map +1 -0
- package/spreadsheet/models/row.model.d.ts +33 -0
- package/spreadsheet/models/row.model.d.ts.map +1 -0
- package/spreadsheet/models/selection.model.d.ts +18 -0
- package/spreadsheet/models/selection.model.d.ts.map +1 -0
- package/spreadsheet/models/sort.model.d.ts +14 -0
- package/spreadsheet/models/sort.model.d.ts.map +1 -0
- package/spreadsheet/ngxsmk-cdk-spreadsheet.d.ts.map +1 -0
- package/spreadsheet/plugin/clipboard-plugin.d.ts +24 -0
- package/spreadsheet/plugin/clipboard-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/filter-plugin.d.ts +21 -0
- package/spreadsheet/plugin/filter-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/formula-plugin.d.ts +39 -0
- package/spreadsheet/plugin/formula-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/index.d.ts +10 -0
- package/spreadsheet/plugin/index.d.ts.map +1 -0
- package/spreadsheet/plugin/plugin-host.d.ts +66 -0
- package/spreadsheet/plugin/plugin-host.d.ts.map +1 -0
- package/spreadsheet/plugin/plugin.types.d.ts +58 -0
- package/spreadsheet/plugin/plugin.types.d.ts.map +1 -0
- package/spreadsheet/plugin/selection-plugin.d.ts +28 -0
- package/spreadsheet/plugin/selection-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/sort-plugin.d.ts +18 -0
- package/spreadsheet/plugin/sort-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/undo-plugin.d.ts +40 -0
- package/spreadsheet/plugin/undo-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/validation-plugin.d.ts +29 -0
- package/spreadsheet/plugin/validation-plugin.d.ts.map +1 -0
- package/spreadsheet/spreadsheet-engine.d.ts +194 -0
- package/spreadsheet/spreadsheet-engine.d.ts.map +1 -0
- package/spreadsheet/utils/cell-utils.d.ts +26 -0
- package/spreadsheet/utils/cell-utils.d.ts.map +1 -0
- package/spreadsheet/utils/index.d.ts +2 -0
- package/spreadsheet/utils/index.d.ts.map +1 -0
- package/testing/a11y.d.ts +5 -1
- package/testing/a11y.d.ts.map +1 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/** Convert a column index to an Excel-style column letter (0=A, 25=Z, 26=AA). */
|
|
2
|
+
export function colIndexToLetter(index) {
|
|
3
|
+
let letter = '';
|
|
4
|
+
let i = index;
|
|
5
|
+
while (i >= 0) {
|
|
6
|
+
letter = String.fromCharCode(65 + (i % 26)) + letter;
|
|
7
|
+
i = Math.floor(i / 26) - 1;
|
|
8
|
+
}
|
|
9
|
+
return letter;
|
|
10
|
+
}
|
|
11
|
+
/** Convert an Excel-style column letter to a 0-based index. */
|
|
12
|
+
export function colLetterToIndex(letter) {
|
|
13
|
+
let index = 0;
|
|
14
|
+
for (let i = 0; i < letter.length; i++) {
|
|
15
|
+
index = index * 26 + (letter.charCodeAt(i) - 64);
|
|
16
|
+
}
|
|
17
|
+
return index - 1;
|
|
18
|
+
}
|
|
19
|
+
/** Build a cell reference string like "A1", "B5". */
|
|
20
|
+
export function cellRef(row, col) {
|
|
21
|
+
return `${colIndexToLetter(col)}${row + 1}`;
|
|
22
|
+
}
|
|
23
|
+
/** Parse a cell reference string like "A1" into a CellAddress. */
|
|
24
|
+
export function parseCellRef(ref) {
|
|
25
|
+
const match = ref.match(/^([A-Z]+)(\d+)$/i);
|
|
26
|
+
if (!match)
|
|
27
|
+
return null;
|
|
28
|
+
return { row: parseInt(match[2], 10) - 1, col: colLetterToIndex(match[1].toUpperCase()) };
|
|
29
|
+
}
|
|
30
|
+
/** Normalize a range so start <= end in both dimensions. */
|
|
31
|
+
export function normalizeRange(range) {
|
|
32
|
+
return {
|
|
33
|
+
start: {
|
|
34
|
+
row: Math.min(range.start.row, range.end.row),
|
|
35
|
+
col: Math.min(range.start.col, range.end.col),
|
|
36
|
+
},
|
|
37
|
+
end: {
|
|
38
|
+
row: Math.max(range.start.row, range.end.row),
|
|
39
|
+
col: Math.max(range.start.col, range.end.col),
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Check if a cell address is within a range. */
|
|
44
|
+
export function isCellInRange(address, range) {
|
|
45
|
+
const nr = normalizeRange(range);
|
|
46
|
+
return (address.row >= nr.start.row &&
|
|
47
|
+
address.row <= nr.end.row &&
|
|
48
|
+
address.col >= nr.start.col &&
|
|
49
|
+
address.col <= nr.end.col);
|
|
50
|
+
}
|
|
51
|
+
/** Get all cell addresses in a range. */
|
|
52
|
+
export function cellsInRange(range) {
|
|
53
|
+
const nr = normalizeRange(range);
|
|
54
|
+
const cells = [];
|
|
55
|
+
for (let r = nr.start.row; r <= nr.end.row; r++) {
|
|
56
|
+
for (let c = nr.start.col; c <= nr.end.col; c++) {
|
|
57
|
+
cells.push({ row: r, col: c });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return cells;
|
|
61
|
+
}
|
|
62
|
+
/** Format a cell value for display. */
|
|
63
|
+
export function formatCellValue(value, format) {
|
|
64
|
+
if (value == null || value === '')
|
|
65
|
+
return '';
|
|
66
|
+
if (typeof value === 'boolean')
|
|
67
|
+
return value ? 'TRUE' : 'FALSE';
|
|
68
|
+
if (value instanceof Date) {
|
|
69
|
+
return value.toLocaleDateString();
|
|
70
|
+
}
|
|
71
|
+
if (typeof value === 'number') {
|
|
72
|
+
if (format) {
|
|
73
|
+
return applyNumberFormat(value, format);
|
|
74
|
+
}
|
|
75
|
+
return String(value);
|
|
76
|
+
}
|
|
77
|
+
return String(value);
|
|
78
|
+
}
|
|
79
|
+
/** Apply a basic number format string. */
|
|
80
|
+
function applyNumberFormat(value, format) {
|
|
81
|
+
const isNeg = value < 0;
|
|
82
|
+
const abs = Math.abs(value);
|
|
83
|
+
// Currency format: $#,##0.00
|
|
84
|
+
if (format.includes('$')) {
|
|
85
|
+
const decimals = format.includes('.00') ? 2 : 0;
|
|
86
|
+
return `${isNeg ? '-' : ''}$${abs.toFixed(decimals).replace(/\B(?=(\d{3})+(?!\d))/g, ',')}`;
|
|
87
|
+
}
|
|
88
|
+
// Percentage format
|
|
89
|
+
if (format.includes('%')) {
|
|
90
|
+
return `${(abs * 100).toFixed(format.includes('.00') ? 2 : 0)}%`;
|
|
91
|
+
}
|
|
92
|
+
// Plain number with commas: #,##0
|
|
93
|
+
if (format.includes(',')) {
|
|
94
|
+
return `${isNeg ? '-' : ''}${abs.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ',')}`;
|
|
95
|
+
}
|
|
96
|
+
return String(value);
|
|
97
|
+
}
|
|
98
|
+
/** Create a new RowDef with empty cells for each column. */
|
|
99
|
+
export function createEmptyRow(id, columns) {
|
|
100
|
+
const cells = {};
|
|
101
|
+
for (const col of columns) {
|
|
102
|
+
cells[col.id] = {
|
|
103
|
+
value: (col.defaultValue ?? null),
|
|
104
|
+
meta: { type: col.cellType ?? 'text' },
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return { id, cells, selectable: true, editable: true };
|
|
108
|
+
}
|
|
109
|
+
/** Generate a unique row ID. */
|
|
110
|
+
export function generateRowId() {
|
|
111
|
+
return `row_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
112
|
+
}
|
|
113
|
+
/** Deep clone a row's cell data (for immutable updates). */
|
|
114
|
+
export function cloneRow(row) {
|
|
115
|
+
return {
|
|
116
|
+
...row,
|
|
117
|
+
cells: Object.fromEntries(Object.entries(row.cells).map(([k, v]) => [
|
|
118
|
+
k,
|
|
119
|
+
{ ...v, meta: v.meta ? { ...v.meta } : undefined },
|
|
120
|
+
])),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** Calculate the total width of pinned columns. */
|
|
124
|
+
export function pinnedWidth(columns, states, side) {
|
|
125
|
+
return columns
|
|
126
|
+
.filter((c) => c.pinned === side)
|
|
127
|
+
.reduce((sum, c) => sum + (states.get(c.id) ?? c.width ?? 150), 0);
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Nkay9zcHJlYWRzaGVldC91dGlscy9jZWxsLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLGlGQUFpRjtBQUNqRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBYTtJQUM1QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDaEIsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDZCxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDckQsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELCtEQUErRDtBQUMvRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBYztJQUM3QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLEtBQUssR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFFRCxxREFBcUQ7QUFDckQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBVztJQUM5QyxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FB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LENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN2RSxDQUFDO0FBRUQsNERBQTREO0FBQzVELE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBVztJQUNsQyxPQUFPO1FBQ0wsR0FBRyxHQUFHO1FBQ04sS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFO1NBQ25ELENBQUMsQ0FDSDtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsbURBQW1EO0FBQ25ELE1BQU0sVUFBVSxXQUFXLENBQ3pCLE9BQW9CLEVBQ3BCLE1BQTJCLEVBQzNCLElBQXNCO0lBRXRCLE9BQU8sT0FBTztTQUNYLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUM7U0FDaEMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDZWxsLCBDZWxsVmFsdWUsIENlbGxBZGRyZXNzLCBDZWxsUmFuZ2UsIFJvd0RlZiwgQ29sdW1uRGVmIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuLyoqIENvbnZlcnQgYSBjb2x1bW4gaW5kZXggdG8gYW4gRXhjZWwtc3R5bGUgY29sdW1uIGxldHRlciAoMD1BLCAyNT1aLCAyNj1BQSkuICovXG5leHBvcnQgZnVuY3Rpb24gY29sSW5kZXhUb0xldHRlcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IGxldHRlciA9ICcnO1xuICBsZXQgaSA9IGluZGV4O1xuICB3aGlsZSAoaSA+PSAwKSB7XG4gICAgbGV0dGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSg2NSArIChpICUgMjYpKSArIGxldHRlcjtcbiAgICBpID0gTWF0aC5mbG9vcihpIC8gMjYpIC0gMTtcbiAgfVxuICByZXR1cm4gbGV0dGVyO1xufVxuXG4vKiogQ29udmVydCBhbiBFeGNlbC1zdHlsZSBjb2x1bW4gbGV0dGVyIHRvIGEgMC1iYXNlZCBpbmRleC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xMZXR0ZXJUb0luZGV4KGxldHRlcjogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZXR0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICBpbmRleCA9IGluZGV4ICogMjYgKyAobGV0dGVyLmNoYXJDb2RlQXQoaSkgLSA2NCk7XG4gIH1cbiAgcmV0dXJuIGluZGV4IC0gMTtcbn1cblxuLyoqIEJ1aWxkIGEgY2VsbCByZWZlcmVuY2Ugc3RyaW5nIGxpa2UgXCJBMVwiLCBcIkI1XCIuICovXG5leHBvcnQgZnVuY3Rpb24gY2VsbFJlZihyb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Y29sSW5kZXhUb0xldHRlcihjb2wpfSR7cm93ICsgMX1gO1xufVxuXG4vKiogUGFyc2UgYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcgbGlrZSBcIkExXCIgaW50byBhIENlbGxBZGRyZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2VsbFJlZihyZWY6IHN0cmluZyk6IENlbGxBZGRyZXNzIHwgbnVsbCB7XG4gIGNvbnN0IG1hdGNoID0gcmVmLm1hdGNoKC9eKFtBLVpdKykoXFxkKykkL2kpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsgcm93OiBwYXJzZUludChtYXRjaFsyXSwgMTApIC0gMSwgY29sOiBjb2xMZXR0ZXJUb0luZGV4KG1hdGNoWzFdLnRvVXBwZXJDYXNlKCkpIH07XG59XG5cbi8qKiBOb3JtYWxpemUgYSByYW5nZSBzbyBzdGFydCA8PSBlbmQgaW4gYm90aCBkaW1lbnNpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJhbmdlKHJhbmdlOiBDZWxsUmFuZ2UpOiBDZWxsUmFuZ2Uge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiB7XG4gICAgICByb3c6IE1hdGgubWluKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyksXG4gICAgICBjb2w6IE1hdGgubWluKHJhbmdlLnN0YXJ0LmNvbCwgcmFuZ2UuZW5kLmNvbCksXG4gICAgfSxcbiAgICBlbmQ6IHtcbiAgICAgIHJvdzogTWF0aC5tYXgocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5lbmQucm93KSxcbiAgICAgIGNvbDogTWF0aC5tYXgocmFuZ2Uuc3RhcnQuY29sLCByYW5nZS5lbmQuY29sKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKiogQ2hlY2sgaWYgYSBjZWxsIGFkZHJlc3MgaXMgd2l0aGluIGEgcmFuZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDZWxsSW5SYW5nZShhZGRyZXNzOiBDZWxsQWRkcmVzcywgcmFuZ2U6IENlbGxSYW5nZSk6IGJvb2xlYW4ge1xuICBjb25zdCBuciA9IG5vcm1hbGl6ZVJhbmdlKHJhbmdlKTtcbiAgcmV0dXJuIChcbiAgICBhZGRyZXNzLnJvdyA+PSBuci5zdGFydC5yb3cgJiZcbiAgICBhZGRyZXNzLnJvdyA8PSBuci5lbmQucm93ICYmXG4gICAgYWRkcmVzcy5jb2wgPj0gbnIuc3RhcnQuY29sICYmXG4gICAgYWRkcmVzcy5jb2wgPD0gbnIuZW5kLmNvbFxuICApO1xufVxuXG4vKiogR2V0IGFsbCBjZWxsIGFkZHJlc3NlcyBpbiBhIHJhbmdlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNlbGxzSW5SYW5nZShyYW5nZTogQ2VsbFJhbmdlKTogQ2VsbEFkZHJlc3NbXSB7XG4gIGNvbnN0IG5yID0gbm9ybWFsaXplUmFuZ2UocmFuZ2UpO1xuICBjb25zdCBjZWxsczogQ2VsbEFkZHJlc3NbXSA9IFtdO1xuICBmb3IgKGxldCByID0gbnIuc3RhcnQucm93OyByIDw9IG5yLmVuZC5yb3c7IHIrKykge1xuICAgIGZvciAobGV0IGMgPSBuci5zdGFydC5jb2w7IGMgPD0gbnIuZW5kLmNvbDsgYysrKSB7XG4gICAgICBjZWxscy5wdXNoKHsgcm93OiByLCBjb2w6IGMgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjZWxscztcbn1cblxuLyoqIEZvcm1hdCBhIGNlbGwgdmFsdWUgZm9yIGRpc3BsYXkuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Q2VsbFZhbHVlKHZhbHVlOiBDZWxsVmFsdWUsIGZvcm1hdD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykgcmV0dXJuICcnO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZSA/ICdUUlVFJyA6ICdGQUxTRSc7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gdmFsdWUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoZm9ybWF0KSB7XG4gICAgICByZXR1cm4gYXBwbHlOdW1iZXJGb3JtYXQodmFsdWUsIGZvcm1hdCk7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG4vKiogQXBwbHkgYSBiYXNpYyBudW1iZXIgZm9ybWF0IHN0cmluZy4gKi9cbmZ1bmN0aW9uIGFwcGx5TnVtYmVyRm9ybWF0KHZhbHVlOiBudW1iZXIsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaXNOZWcgPSB2YWx1ZSA8IDA7XG4gIGNvbnN0IGFicyA9IE1hdGguYWJzKHZhbHVlKTtcblxuICAvLyBDdXJyZW5jeSBmb3JtYXQ6ICQjLCMjMC4wMFxuICBpZiAoZm9ybWF0LmluY2x1ZGVzKCckJykpIHtcbiAgICBjb25zdCBkZWNpbWFscyA9IGZvcm1hdC5pbmNsdWRlcygnLjAwJykgPyAyIDogMDtcbiAgICByZXR1cm4gYCR7aXNOZWcgPyAnLScgOiAnJ30kJHthYnMudG9GaXhlZChkZWNpbWFscykucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgJywnKX1gO1xuICB9XG5cbiAgLy8gUGVyY2VudGFnZSBmb3JtYXRcbiAgaWYgKGZvcm1hdC5pbmNsdWRlcygnJScpKSB7XG4gICAgcmV0dXJuIGAkeyhhYnMgKiAxMDApLnRvRml4ZWQoZm9ybWF0LmluY2x1ZGVzKCcuMDAnKSA/IDIgOiAwKX0lYDtcbiAgfVxuXG4gIC8vIFBsYWluIG51bWJlciB3aXRoIGNvbW1hczogIywjIzBcbiAgaWYgKGZvcm1hdC5pbmNsdWRlcygnLCcpKSB7XG4gICAgcmV0dXJuIGAke2lzTmVnID8gJy0nIDogJyd9JHthYnMudG9GaXhlZCgwKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpfWA7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cblxuLyoqIENyZWF0ZSBhIG5ldyBSb3dEZWYgd2l0aCBlbXB0eSBjZWxscyBmb3IgZWFjaCBjb2x1bW4uICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW1wdHlSb3coaWQ6IHN0cmluZywgY29sdW1uczogQ29sdW1uRGVmW10pOiBSb3dEZWYge1xuICBjb25zdCBjZWxsczogUmVjb3JkPHN0cmluZywgQ2VsbD4gPSB7fTtcbiAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xuICAgIGNlbGxzW2NvbC5pZF0gPSB7XG4gICAgICB2YWx1ZTogKGNvbC5kZWZhdWx0VmFsdWUgPz8gbnVsbCkgYXMgQ2VsbFZhbHVlLFxuICAgICAgbWV0YTogeyB0eXBlOiBjb2wuY2VsbFR5cGUgPz8gJ3RleHQnIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBpZCwgY2VsbHMsIHNlbGVjdGFibGU6IHRydWUsIGVkaXRhYmxlOiB0cnVlIH07XG59XG5cbi8qKiBHZW5lcmF0ZSBhIHVuaXF1ZSByb3cgSUQuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSb3dJZCgpOiBzdHJpbmcge1xuICByZXR1cm4gYHJvd18ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YDtcbn1cblxuLyoqIERlZXAgY2xvbmUgYSByb3cncyBjZWxsIGRhdGEgKGZvciBpbW11dGFibGUgdXBkYXRlcykuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVSb3cocm93OiBSb3dEZWYpOiBSb3dEZWYge1xuICByZXR1cm4ge1xuICAgIC4uLnJvdyxcbiAgICBjZWxsczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMocm93LmNlbGxzKS5tYXAoKFtrLCB2XSkgPT4gW1xuICAgICAgICBrLFxuICAgICAgICB7IC4uLnYsIG1ldGE6IHYubWV0YSA/IHsgLi4udi5tZXRhIH0gOiB1bmRlZmluZWQgfSxcbiAgICAgIF0pLFxuICAgICksXG4gIH07XG59XG5cbi8qKiBDYWxjdWxhdGUgdGhlIHRvdGFsIHdpZHRoIG9mIHBpbm5lZCBjb2x1bW5zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpbm5lZFdpZHRoKFxuICBjb2x1bW5zOiBDb2x1bW5EZWZbXSxcbiAgc3RhdGVzOiBNYXA8c3RyaW5nLCBudW1iZXI+LFxuICBzaWRlOiAnbGVmdCcgfCAncmlnaHQnLFxuKTogbnVtYmVyIHtcbiAgcmV0dXJuIGNvbHVtbnNcbiAgICAuZmlsdGVyKChjKSA9PiBjLnBpbm5lZCA9PT0gc2lkZSlcbiAgICAucmVkdWNlKChzdW0sIGMpID0+IHN1bSArIChzdGF0ZXMuZ2V0KGMuaWQpID8/IGMud2lkdGggPz8gMTUwKSwgMCk7XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './cell-utils';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc3ByZWFkc2hlZXQvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NlbGwtdXRpbHMnO1xuIl19
|
package/esm2022/testing/a11y.mjs
CHANGED
|
@@ -2,9 +2,12 @@ import * as axe from 'axe-core';
|
|
|
2
2
|
/**
|
|
3
3
|
* Runs axe-core analysis on the provided HTML element and throws an error if any accessibility
|
|
4
4
|
* violations are detected.
|
|
5
|
+
*
|
|
6
|
+
* Pass axe `options` to tune the run — e.g. in jsdom-based tests disable the
|
|
7
|
+
* `color-contrast` rule, which requires a real rendering engine.
|
|
5
8
|
*/
|
|
6
|
-
export async function expectNoA11yViolations(element) {
|
|
7
|
-
const results = await axe.run(element);
|
|
9
|
+
export async function expectNoA11yViolations(element, options = {}) {
|
|
10
|
+
const results = await axe.run(element, options);
|
|
8
11
|
if (results.violations.length > 0) {
|
|
9
12
|
const formatted = results.violations
|
|
10
13
|
.map((v) => `[${v.id}] ${v.help}\n - Help URL: ${v.helpUrl}\n - Nodes affected:\n${v.nodes
|
|
@@ -14,4 +17,4 @@ export async function expectNoA11yViolations(element) {
|
|
|
14
17
|
throw new Error(`Accessibility violations detected:\n\n${formatted}`);
|
|
15
18
|
}
|
|
16
19
|
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYTExeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Nkay90ZXN0aW5nL2ExMXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFFaEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsT0FBb0IsRUFDcEIsVUFBMEIsRUFBRTtJQUU1QixNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVU7YUFDakMsR0FBRyxDQUNGLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksbUJBQW1CLENBQUMsQ0FBQyxPQUFPLDBCQUEwQixDQUFDLENBQUMsS0FBSzthQUM3RSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNsQjthQUNBLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXhlIGZyb20gJ2F4ZS1jb3JlJztcblxuLyoqXG4gKiBSdW5zIGF4ZS1jb3JlIGFuYWx5c2lzIG9uIHRoZSBwcm92aWRlZCBIVE1MIGVsZW1lbnQgYW5kIHRocm93cyBhbiBlcnJvciBpZiBhbnkgYWNjZXNzaWJpbGl0eVxuICogdmlvbGF0aW9ucyBhcmUgZGV0ZWN0ZWQuXG4gKlxuICogUGFzcyBheGUgYG9wdGlvbnNgIHRvIHR1bmUgdGhlIHJ1biDigJQgZS5nLiBpbiBqc2RvbS1iYXNlZCB0ZXN0cyBkaXNhYmxlIHRoZVxuICogYGNvbG9yLWNvbnRyYXN0YCBydWxlLCB3aGljaCByZXF1aXJlcyBhIHJlYWwgcmVuZGVyaW5nIGVuZ2luZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGVjdE5vQTExeVZpb2xhdGlvbnMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBvcHRpb25zOiBheGUuUnVuT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBheGUucnVuKGVsZW1lbnQsIG9wdGlvbnMpO1xuICBpZiAocmVzdWx0cy52aW9sYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSByZXN1bHRzLnZpb2xhdGlvbnNcbiAgICAgIC5tYXAoXG4gICAgICAgICh2KSA9PlxuICAgICAgICAgIGBbJHt2LmlkfV0gJHt2LmhlbHB9XFxuICAtIEhlbHAgVVJMOiAke3YuaGVscFVybH1cXG4gIC0gTm9kZXMgYWZmZWN0ZWQ6XFxuJHt2Lm5vZGVzXG4gICAgICAgICAgICAubWFwKChuKSA9PiBgICAgICogJHtuLmh0bWx9YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKX1gLFxuICAgICAgKVxuICAgICAgLmpvaW4oJ1xcblxcbicpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQWNjZXNzaWJpbGl0eSB2aW9sYXRpb25zIGRldGVjdGVkOlxcblxcbiR7Zm9ybWF0dGVkfWApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { signal, computed } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Abstract base providing the CVA plumbing shared by every form component:
|
|
5
|
+
* `onChange` / `onTouched` storage, `formDisabled` signal, and the composite
|
|
6
|
+
* `isDisabled` computed. Sub-classes implement only `inputDisabled()` (the
|
|
7
|
+
* component's own `input()` signal value) and `writeValue()` (type-specific
|
|
8
|
+
* coercion).
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* export class NgxsmkCheckbox extends CvaBase<boolean> {
|
|
12
|
+
* readonly disabled = input(false, { transform: booleanAttribute });
|
|
13
|
+
* protected inputDisabled() { return this.disabled(); }
|
|
14
|
+
* writeValue(value: unknown) { this.checked.set(!!value); }
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
class CvaBase {
|
|
19
|
+
constructor() {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
21
|
+
this._onChange = () => { };
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
23
|
+
this._onTouched = () => { };
|
|
24
|
+
this._formDisabled = signal(false);
|
|
25
|
+
/** Composite disabled state: component's own input OR form-driven disable. */
|
|
26
|
+
this.isDisabled = computed(() => this.inputDisabled() || this._formDisabled());
|
|
27
|
+
}
|
|
28
|
+
registerOnChange(fn) {
|
|
29
|
+
this._onChange = fn;
|
|
30
|
+
}
|
|
31
|
+
registerOnTouched(fn) {
|
|
32
|
+
this._onTouched = fn;
|
|
33
|
+
}
|
|
34
|
+
setDisabledState(isDisabled) {
|
|
35
|
+
this._formDisabled.set(isDisabled);
|
|
36
|
+
}
|
|
37
|
+
/** Fire the registered onChange callback. */
|
|
38
|
+
emitChange(value) {
|
|
39
|
+
this._onChange(value);
|
|
40
|
+
}
|
|
41
|
+
/** Fire the registered onTouched callback. */
|
|
42
|
+
emitTouched() {
|
|
43
|
+
this._onTouched();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Generated bundle index. Do not edit.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
export { CvaBase };
|
|
52
|
+
//# sourceMappingURL=ngxsmk-cdk-cva-base.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-cva-base.mjs","sources":["../../../../packages/cdk/cva-base/cva-base.ts","../../../../packages/cdk/cva-base/ngxsmk-cdk-cva-base.ts"],"sourcesContent":["import { computed, signal } from '@angular/core';\nimport { ControlValueAccessor } from '@angular/forms';\n\n/**\n * Abstract base providing the CVA plumbing shared by every form component:\n * `onChange` / `onTouched` storage, `formDisabled` signal, and the composite\n * `isDisabled` computed. Sub-classes implement only `inputDisabled()` (the\n * component's own `input()` signal value) and `writeValue()` (type-specific\n * coercion).\n *\n * ```ts\n * export class NgxsmkCheckbox extends CvaBase<boolean> {\n * readonly disabled = input(false, { transform: booleanAttribute });\n * protected inputDisabled() { return this.disabled(); }\n * writeValue(value: unknown) { this.checked.set(!!value); }\n * }\n * ```\n */\nexport abstract class CvaBase<T = unknown> implements ControlValueAccessor {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onChange: (value: T) => void = () => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onTouched: () => void = () => {};\n\n private readonly _formDisabled = signal(false);\n\n /** Composite disabled state: component's own input OR form-driven disable. */\n readonly isDisabled = computed(() => this.inputDisabled() || this._formDisabled());\n\n /** Return the component's own `disabled` input signal value. */\n protected abstract inputDisabled(): boolean;\n\n abstract writeValue(value: unknown): void;\n\n registerOnChange(fn: (value: T) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._formDisabled.set(isDisabled);\n }\n\n /** Fire the registered onChange callback. */\n protected emitChange(value: T): void {\n this._onChange(value);\n }\n\n /** Fire the registered onTouched callback. */\n protected emitTouched(): void {\n this._onTouched();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;AAGA;;;;;;;;;;;;;;AAcG;MACmB,OAAO,CAAA;AAA7B,IAAA,WAAA,GAAA;;AAEU,QAAA,IAAA,CAAA,SAAS,GAAuB,MAAK,EAAE,CAAC;;AAExC,QAAA,IAAA,CAAA,UAAU,GAAe,MAAK,EAAE,CAAC;AAExB,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;;AAGrC,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;IA4BpF;AArBE,IAAA,gBAAgB,CAAC,EAAsB,EAAA;AACrC,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC;IACpC;;AAGU,IAAA,UAAU,CAAC,KAAQ,EAAA;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IACvB;;IAGU,WAAW,GAAA;QACnB,IAAI,CAAC,UAAU,EAAE;IACnB;AACD;;ACvDD;;AAEG;;;;"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { signal, computed } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* InputGroupEngine — headless, signal-based state machine for input group behaviour.
|
|
5
|
+
* Zero DOM, zero Angular template dependencies.
|
|
6
|
+
*/
|
|
7
|
+
class InputGroupEngine {
|
|
8
|
+
constructor(config = {}) {
|
|
9
|
+
this.focused = signal(false);
|
|
10
|
+
this.hovered = signal(false);
|
|
11
|
+
this.touched = signal(false);
|
|
12
|
+
this.dirty = signal(false);
|
|
13
|
+
this.status = signal('none');
|
|
14
|
+
this.message = signal('');
|
|
15
|
+
this.disabled = signal(false);
|
|
16
|
+
this.readonly = signal(false);
|
|
17
|
+
this.passwordVisible = signal(false);
|
|
18
|
+
this.loading = signal(false);
|
|
19
|
+
this.addons = signal([]);
|
|
20
|
+
this.placeholder = signal('');
|
|
21
|
+
this.label = signal('');
|
|
22
|
+
this.hint = signal('');
|
|
23
|
+
this.required = signal(false);
|
|
24
|
+
this.maxLength = signal(undefined);
|
|
25
|
+
this.minLength = signal(undefined);
|
|
26
|
+
this.showClear = signal(false);
|
|
27
|
+
this.showCounter = signal(false);
|
|
28
|
+
this.fullWidth = signal(true);
|
|
29
|
+
this.floatingLabel = signal(false);
|
|
30
|
+
this._asyncTimer = null;
|
|
31
|
+
this._config = config;
|
|
32
|
+
// Initialize config signals
|
|
33
|
+
this.value = signal(config.initialValue ?? '');
|
|
34
|
+
this.type = signal(config.type ?? 'text');
|
|
35
|
+
this.variant = signal(config.variant ?? 'outlined');
|
|
36
|
+
this.size = signal(config.size ?? 'md');
|
|
37
|
+
this.radius = signal(config.radius ?? 'md');
|
|
38
|
+
this.density = signal(config.density ?? 'comfortable');
|
|
39
|
+
this.disabled.set(config.disabled ?? false);
|
|
40
|
+
this.readonly.set(config.readonly ?? false);
|
|
41
|
+
this.placeholder.set(config.placeholder ?? '');
|
|
42
|
+
this.label.set(config.label ?? '');
|
|
43
|
+
this.hint.set(config.hint ?? '');
|
|
44
|
+
this.required.set(config.required ?? false);
|
|
45
|
+
this.maxLength.set(config.maxLength);
|
|
46
|
+
this.minLength.set(config.minLength);
|
|
47
|
+
this.showClear.set(config.showClear ?? false);
|
|
48
|
+
this.showCounter.set(config.showCounter ?? false);
|
|
49
|
+
this.fullWidth.set(config.fullWidth ?? true);
|
|
50
|
+
this.floatingLabel.set(config.floatingLabel ?? false);
|
|
51
|
+
if (config.initialValue) {
|
|
52
|
+
this.dirty.set(true);
|
|
53
|
+
this.touched.set(true);
|
|
54
|
+
}
|
|
55
|
+
// Lifecycle hooks
|
|
56
|
+
this.onFocus = signal(() => {
|
|
57
|
+
/* noop */
|
|
58
|
+
});
|
|
59
|
+
this.onBlur = signal(() => {
|
|
60
|
+
/* noop */
|
|
61
|
+
});
|
|
62
|
+
this.onChange = signal(() => {
|
|
63
|
+
/* noop */
|
|
64
|
+
});
|
|
65
|
+
this.onClear = signal(() => {
|
|
66
|
+
/* noop */
|
|
67
|
+
});
|
|
68
|
+
this.onValidationChange = signal(() => {
|
|
69
|
+
/* noop */
|
|
70
|
+
});
|
|
71
|
+
// ── Computed ──
|
|
72
|
+
this.charCount = computed(() => this.value().length);
|
|
73
|
+
this.hasContent = computed(() => this.value().length > 0);
|
|
74
|
+
this.isActive = computed(() => this.focused() || this.hasContent());
|
|
75
|
+
this.isOverLength = computed(() => {
|
|
76
|
+
const max = this.maxLength();
|
|
77
|
+
return max != null ? this.value().length > max : false;
|
|
78
|
+
});
|
|
79
|
+
this.isUnderLength = computed(() => {
|
|
80
|
+
const min = this.minLength();
|
|
81
|
+
return min != null && this.touched() ? this.value().length < min : false;
|
|
82
|
+
});
|
|
83
|
+
this.hasError = computed(() => this.status() === 'error');
|
|
84
|
+
this.hasSuccess = computed(() => this.status() === 'success');
|
|
85
|
+
this.hasWarning = computed(() => this.status() === 'warning');
|
|
86
|
+
this.isInvalid = computed(() => this.hasError() || this.isOverLength() || this.isUnderLength());
|
|
87
|
+
this.showPlaceholder = computed(() => {
|
|
88
|
+
return !this.hasContent() && !this.focused();
|
|
89
|
+
});
|
|
90
|
+
this.shouldFloat = computed(() => {
|
|
91
|
+
if (this.floatingLabel())
|
|
92
|
+
return this.isActive() || this.hasContent();
|
|
93
|
+
return false;
|
|
94
|
+
});
|
|
95
|
+
this.leadingAddons = computed(() => this.addons().filter((a) => a.position === 'leading'));
|
|
96
|
+
this.trailingAddons = computed(() => this.addons().filter((a) => a.position === 'trailing'));
|
|
97
|
+
this.hasLeading = computed(() => this.leadingAddons().length > 0);
|
|
98
|
+
this.hasTrailing = computed(() => this.trailingAddons().length > 0);
|
|
99
|
+
this.inputType = computed(() => {
|
|
100
|
+
if (this.type() === 'password') {
|
|
101
|
+
return this.passwordVisible() ? 'text' : 'password';
|
|
102
|
+
}
|
|
103
|
+
return this.type();
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// ── Value Operations ──
|
|
107
|
+
setValue(value) {
|
|
108
|
+
this.value.set(value);
|
|
109
|
+
this.dirty.set(true);
|
|
110
|
+
this._runValidation(value);
|
|
111
|
+
this.onChange()(value);
|
|
112
|
+
}
|
|
113
|
+
clear() {
|
|
114
|
+
this.setValue('');
|
|
115
|
+
this.onClear()();
|
|
116
|
+
}
|
|
117
|
+
getValue() {
|
|
118
|
+
return this.value();
|
|
119
|
+
}
|
|
120
|
+
// ── Focus Operations ──
|
|
121
|
+
focus() {
|
|
122
|
+
this.focused.set(true);
|
|
123
|
+
this.onFocus()();
|
|
124
|
+
}
|
|
125
|
+
blur() {
|
|
126
|
+
this.focused.set(false);
|
|
127
|
+
this.touched.set(true);
|
|
128
|
+
this._runValidation(this.value());
|
|
129
|
+
this.onBlur()();
|
|
130
|
+
}
|
|
131
|
+
// ── Password ──
|
|
132
|
+
togglePasswordVisibility() {
|
|
133
|
+
this.passwordVisible.update((v) => !v);
|
|
134
|
+
}
|
|
135
|
+
// ── Loading ──
|
|
136
|
+
showLoading() {
|
|
137
|
+
this.loading.set(true);
|
|
138
|
+
}
|
|
139
|
+
hideLoading() {
|
|
140
|
+
this.loading.set(false);
|
|
141
|
+
}
|
|
142
|
+
// ── Add-ons ──
|
|
143
|
+
addAddon(addon) {
|
|
144
|
+
this.addons.update((list) => [...list, addon]);
|
|
145
|
+
}
|
|
146
|
+
removeAddon(id) {
|
|
147
|
+
this.addons.update((list) => list.filter((a) => a.id !== id));
|
|
148
|
+
}
|
|
149
|
+
// ── Validation ──
|
|
150
|
+
setStatus(status, message = '') {
|
|
151
|
+
this.status.set(status);
|
|
152
|
+
this.message.set(message);
|
|
153
|
+
this.onValidationChange()(status, message);
|
|
154
|
+
}
|
|
155
|
+
_runValidation(value) {
|
|
156
|
+
const validator = this._config.validator;
|
|
157
|
+
if (validator) {
|
|
158
|
+
const result = validator(value);
|
|
159
|
+
this.status.set(result.status);
|
|
160
|
+
this.message.set(result.message);
|
|
161
|
+
this.onValidationChange()(result.status, result.message);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
// Built-in validations
|
|
165
|
+
if (this.required() && !value) {
|
|
166
|
+
this.status.set('error');
|
|
167
|
+
this.message.set('This field is required');
|
|
168
|
+
this.onValidationChange()('error', 'This field is required');
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (this.isOverLength()) {
|
|
172
|
+
this.status.set('error');
|
|
173
|
+
this.message.set(`Maximum ${this.maxLength()} characters`);
|
|
174
|
+
this.onValidationChange()('error', `Maximum ${this.maxLength()} characters`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (this.isUnderLength()) {
|
|
178
|
+
this.status.set('error');
|
|
179
|
+
this.message.set(`Minimum ${this.minLength()} characters`);
|
|
180
|
+
this.onValidationChange()('error', `Minimum ${this.minLength()} characters`);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
this.status.set('none');
|
|
184
|
+
this.message.set('');
|
|
185
|
+
this.onValidationChange()('none', '');
|
|
186
|
+
// Async validation
|
|
187
|
+
const asyncValidator = this._config.asyncValidator;
|
|
188
|
+
if (asyncValidator && value) {
|
|
189
|
+
if (this._asyncTimer)
|
|
190
|
+
clearTimeout(this._asyncTimer);
|
|
191
|
+
this.status.set('pending');
|
|
192
|
+
this.message.set('');
|
|
193
|
+
this._asyncTimer = setTimeout(async () => {
|
|
194
|
+
const result = await asyncValidator(value);
|
|
195
|
+
if (this.value() === value) {
|
|
196
|
+
this.status.set(result);
|
|
197
|
+
this.onValidationChange()(result, '');
|
|
198
|
+
}
|
|
199
|
+
}, this._config.asyncDebounce ?? 300);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// ── Reset ──
|
|
203
|
+
reset() {
|
|
204
|
+
this.value.set(this._config.initialValue ?? '');
|
|
205
|
+
this.focused.set(false);
|
|
206
|
+
this.touched.set(false);
|
|
207
|
+
this.dirty.set(false);
|
|
208
|
+
this.status.set('none');
|
|
209
|
+
this.message.set('');
|
|
210
|
+
this.passwordVisible.set(false);
|
|
211
|
+
}
|
|
212
|
+
// ── Enable/Disable ──
|
|
213
|
+
enable() {
|
|
214
|
+
this.disabled.set(false);
|
|
215
|
+
}
|
|
216
|
+
disable() {
|
|
217
|
+
this.disabled.set(true);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Generated bundle index. Do not edit.
|
|
223
|
+
*/
|
|
224
|
+
|
|
225
|
+
export { InputGroupEngine };
|
|
226
|
+
//# sourceMappingURL=ngxsmk-cdk-input-group.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-input-group.mjs","sources":["../../../../packages/cdk/input-group/input-group-engine.ts","../../../../packages/cdk/input-group/ngxsmk-cdk-input-group.ts"],"sourcesContent":["import { computed, signal, type WritableSignal, type Signal } from '@angular/core';\nimport type {\n InputGroupConfig,\n InputGroupAddon,\n InputGroupInputType,\n InputGroupVariant,\n InputGroupSize,\n InputGroupRadius,\n InputGroupDensity,\n ValidationStatus,\n} from './models';\n\nexport interface InputGroupEngineConfig extends InputGroupConfig {\n /** Initial value. */\n initialValue?: string;\n /** Async validator function. */\n asyncValidator?: (value: string) => Promise<ValidationStatus>;\n /** Sync validator function. */\n validator?: (value: string) => { status: ValidationStatus; message: string };\n /** Debounce for async validation in ms. */\n asyncDebounce?: number;\n}\n\n/**\n * InputGroupEngine — headless, signal-based state machine for input group behaviour.\n * Zero DOM, zero Angular template dependencies.\n */\nexport class InputGroupEngine {\n // ── Core State ──\n readonly value: WritableSignal<string>;\n readonly focused = signal(false);\n readonly hovered = signal(false);\n readonly touched = signal(false);\n readonly dirty = signal(false);\n readonly status = signal<ValidationStatus>('none');\n readonly message = signal('');\n readonly disabled = signal(false);\n readonly readonly = signal(false);\n readonly passwordVisible = signal(false);\n readonly loading = signal(false);\n readonly addons = signal<InputGroupAddon[]>([]);\n\n // ── Config ──\n readonly type: WritableSignal<InputGroupInputType>;\n readonly variant: WritableSignal<InputGroupVariant>;\n readonly size: WritableSignal<InputGroupSize>;\n readonly radius: WritableSignal<InputGroupRadius>;\n readonly density: WritableSignal<InputGroupDensity>;\n readonly placeholder = signal('');\n readonly label = signal('');\n readonly hint = signal('');\n readonly required = signal(false);\n readonly maxLength = signal<number | undefined>(undefined);\n readonly minLength = signal<number | undefined>(undefined);\n readonly showClear = signal(false);\n readonly showCounter = signal(false);\n readonly fullWidth = signal(true);\n readonly floatingLabel = signal(false);\n\n // ── Computed ──\n readonly charCount: Signal<number>;\n readonly hasContent: Signal<boolean>;\n readonly isActive: Signal<boolean>;\n readonly isOverLength: Signal<boolean>;\n readonly isUnderLength: Signal<boolean>;\n readonly hasError: Signal<boolean>;\n readonly hasSuccess: Signal<boolean>;\n readonly hasWarning: Signal<boolean>;\n readonly isInvalid: Signal<boolean>;\n readonly showPlaceholder: Signal<boolean>;\n readonly shouldFloat: Signal<boolean>;\n readonly leadingAddons: Signal<InputGroupAddon[]>;\n readonly trailingAddons: Signal<InputGroupAddon[]>;\n readonly hasLeading: Signal<boolean>;\n readonly hasTrailing: Signal<boolean>;\n readonly inputType: Signal<InputGroupInputType>;\n\n // ── Lifecycle Hooks ──\n readonly onFocus: WritableSignal<() => void>;\n readonly onBlur: WritableSignal<() => void>;\n readonly onChange: WritableSignal<(value: string) => void>;\n readonly onClear: WritableSignal<() => void>;\n readonly onValidationChange: WritableSignal<(status: ValidationStatus, message: string) => void>;\n\n private _config: InputGroupEngineConfig;\n private _asyncTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: InputGroupEngineConfig = {}) {\n this._config = config;\n\n // Initialize config signals\n this.value = signal(config.initialValue ?? '');\n this.type = signal(config.type ?? 'text');\n this.variant = signal(config.variant ?? 'outlined');\n this.size = signal(config.size ?? 'md');\n this.radius = signal(config.radius ?? 'md');\n this.density = signal(config.density ?? 'comfortable');\n this.disabled.set(config.disabled ?? false);\n this.readonly.set(config.readonly ?? false);\n this.placeholder.set(config.placeholder ?? '');\n this.label.set(config.label ?? '');\n this.hint.set(config.hint ?? '');\n this.required.set(config.required ?? false);\n this.maxLength.set(config.maxLength);\n this.minLength.set(config.minLength);\n this.showClear.set(config.showClear ?? false);\n this.showCounter.set(config.showCounter ?? false);\n this.fullWidth.set(config.fullWidth ?? true);\n this.floatingLabel.set(config.floatingLabel ?? false);\n\n if (config.initialValue) {\n this.dirty.set(true);\n this.touched.set(true);\n }\n\n // Lifecycle hooks\n this.onFocus = signal(() => {\n /* noop */\n });\n this.onBlur = signal(() => {\n /* noop */\n });\n this.onChange = signal(() => {\n /* noop */\n });\n this.onClear = signal(() => {\n /* noop */\n });\n this.onValidationChange = signal(() => {\n /* noop */\n });\n\n // ── Computed ──\n\n this.charCount = computed(() => this.value().length);\n\n this.hasContent = computed(() => this.value().length > 0);\n\n this.isActive = computed(() => this.focused() || this.hasContent());\n\n this.isOverLength = computed(() => {\n const max = this.maxLength();\n return max != null ? this.value().length > max : false;\n });\n\n this.isUnderLength = computed(() => {\n const min = this.minLength();\n return min != null && this.touched() ? this.value().length < min : false;\n });\n\n this.hasError = computed(() => this.status() === 'error');\n this.hasSuccess = computed(() => this.status() === 'success');\n this.hasWarning = computed(() => this.status() === 'warning');\n this.isInvalid = computed(() => this.hasError() || this.isOverLength() || this.isUnderLength());\n\n this.showPlaceholder = computed(() => {\n return !this.hasContent() && !this.focused();\n });\n\n this.shouldFloat = computed(() => {\n if (this.floatingLabel()) return this.isActive() || this.hasContent();\n return false;\n });\n\n this.leadingAddons = computed(() => this.addons().filter((a) => a.position === 'leading'));\n\n this.trailingAddons = computed(() => this.addons().filter((a) => a.position === 'trailing'));\n\n this.hasLeading = computed(() => this.leadingAddons().length > 0);\n this.hasTrailing = computed(() => this.trailingAddons().length > 0);\n\n this.inputType = computed(() => {\n if (this.type() === 'password') {\n return this.passwordVisible() ? 'text' : 'password';\n }\n return this.type();\n });\n }\n\n // ── Value Operations ──\n\n setValue(value: string): void {\n this.value.set(value);\n this.dirty.set(true);\n this._runValidation(value);\n this.onChange()(value);\n }\n\n clear(): void {\n this.setValue('');\n this.onClear()();\n }\n\n getValue(): string {\n return this.value();\n }\n\n // ── Focus Operations ──\n\n focus(): void {\n this.focused.set(true);\n this.onFocus()();\n }\n\n blur(): void {\n this.focused.set(false);\n this.touched.set(true);\n this._runValidation(this.value());\n this.onBlur()();\n }\n\n // ── Password ──\n\n togglePasswordVisibility(): void {\n this.passwordVisible.update((v) => !v);\n }\n\n // ── Loading ──\n\n showLoading(): void {\n this.loading.set(true);\n }\n\n hideLoading(): void {\n this.loading.set(false);\n }\n\n // ── Add-ons ──\n\n addAddon(addon: InputGroupAddon): void {\n this.addons.update((list) => [...list, addon]);\n }\n\n removeAddon(id: string): void {\n this.addons.update((list) => list.filter((a) => a.id !== id));\n }\n\n // ── Validation ──\n\n setStatus(status: ValidationStatus, message = ''): void {\n this.status.set(status);\n this.message.set(message);\n this.onValidationChange()(status, message);\n }\n\n private _runValidation(value: string): void {\n const validator = this._config.validator;\n if (validator) {\n const result = validator(value);\n this.status.set(result.status);\n this.message.set(result.message);\n this.onValidationChange()(result.status, result.message);\n return;\n }\n\n // Built-in validations\n if (this.required() && !value) {\n this.status.set('error');\n this.message.set('This field is required');\n this.onValidationChange()('error', 'This field is required');\n return;\n }\n\n if (this.isOverLength()) {\n this.status.set('error');\n this.message.set(`Maximum ${this.maxLength()} characters`);\n this.onValidationChange()('error', `Maximum ${this.maxLength()} characters`);\n return;\n }\n\n if (this.isUnderLength()) {\n this.status.set('error');\n this.message.set(`Minimum ${this.minLength()} characters`);\n this.onValidationChange()('error', `Minimum ${this.minLength()} characters`);\n return;\n }\n\n this.status.set('none');\n this.message.set('');\n this.onValidationChange()('none', '');\n\n // Async validation\n const asyncValidator = this._config.asyncValidator;\n if (asyncValidator && value) {\n if (this._asyncTimer) clearTimeout(this._asyncTimer);\n this.status.set('pending');\n this.message.set('');\n this._asyncTimer = setTimeout(async () => {\n const result = await asyncValidator(value);\n if (this.value() === value) {\n this.status.set(result);\n this.onValidationChange()(result, '');\n }\n }, this._config.asyncDebounce ?? 300);\n }\n }\n\n // ── Reset ──\n\n reset(): void {\n this.value.set(this._config.initialValue ?? '');\n this.focused.set(false);\n this.touched.set(false);\n this.dirty.set(false);\n this.status.set('none');\n this.message.set('');\n this.passwordVisible.set(false);\n }\n\n // ── Enable/Disable ──\n\n enable(): void {\n this.disabled.set(false);\n }\n\n disable(): void {\n this.disabled.set(true);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|