@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.
Files changed (179) hide show
  1. package/README.md +1 -1
  2. package/cva-base/cva-base.d.ts +34 -0
  3. package/cva-base/cva-base.d.ts.map +1 -0
  4. package/cva-base/index.d.ts +2 -0
  5. package/cva-base/index.d.ts.map +1 -0
  6. package/cva-base/ngxsmk-cdk-cva-base.d.ts.map +1 -0
  7. package/esm2022/cva-base/cva-base.mjs +45 -0
  8. package/esm2022/cva-base/index.mjs +2 -0
  9. package/esm2022/cva-base/ngxsmk-cdk-cva-base.mjs +5 -0
  10. package/esm2022/input-group/index.mjs +3 -0
  11. package/esm2022/input-group/input-group-engine.mjs +219 -0
  12. package/esm2022/input-group/models/index.mjs +2 -0
  13. package/esm2022/input-group/models/input-group.model.mjs +2 -0
  14. package/esm2022/input-group/ngxsmk-cdk-input-group.mjs +5 -0
  15. package/esm2022/listbox-keyboard/index.mjs +2 -0
  16. package/esm2022/listbox-keyboard/listbox-keyboard.mjs +145 -0
  17. package/esm2022/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.mjs +5 -0
  18. package/esm2022/public-api.mjs +10 -1
  19. package/esm2022/scheduler/index.mjs +5 -0
  20. package/esm2022/scheduler/models/date-range.mjs +2 -0
  21. package/esm2022/scheduler/models/event.model.mjs +2 -0
  22. package/esm2022/scheduler/models/index.mjs +6 -0
  23. package/esm2022/scheduler/models/resource.model.mjs +5 -0
  24. package/esm2022/scheduler/models/selection.model.mjs +7 -0
  25. package/esm2022/scheduler/models/view.model.mjs +7 -0
  26. package/esm2022/scheduler/ngxsmk-cdk-scheduler.mjs +5 -0
  27. package/esm2022/scheduler/plugin/drag-plugin.mjs +82 -0
  28. package/esm2022/scheduler/plugin/index.mjs +8 -0
  29. package/esm2022/scheduler/plugin/keyboard-plugin.mjs +150 -0
  30. package/esm2022/scheduler/plugin/plugin-host.mjs +48 -0
  31. package/esm2022/scheduler/plugin/plugin.types.mjs +2 -0
  32. package/esm2022/scheduler/plugin/resize-plugin.mjs +74 -0
  33. package/esm2022/scheduler/plugin/selection-plugin.mjs +84 -0
  34. package/esm2022/scheduler/plugin/tooltip-plugin.mjs +103 -0
  35. package/esm2022/scheduler/scheduler-engine.mjs +316 -0
  36. package/esm2022/scheduler/utils/date-utils.mjs +131 -0
  37. package/esm2022/scheduler/utils/index.mjs +3 -0
  38. package/esm2022/scheduler/utils/snap.mjs +24 -0
  39. package/esm2022/spreadsheet/index.mjs +5 -0
  40. package/esm2022/spreadsheet/models/cell.model.mjs +2 -0
  41. package/esm2022/spreadsheet/models/column.model.mjs +2 -0
  42. package/esm2022/spreadsheet/models/filter.model.mjs +2 -0
  43. package/esm2022/spreadsheet/models/formula.model.mjs +2 -0
  44. package/esm2022/spreadsheet/models/index.mjs +8 -0
  45. package/esm2022/spreadsheet/models/row.model.mjs +2 -0
  46. package/esm2022/spreadsheet/models/selection.model.mjs +2 -0
  47. package/esm2022/spreadsheet/models/sort.model.mjs +2 -0
  48. package/esm2022/spreadsheet/ngxsmk-cdk-spreadsheet.mjs +5 -0
  49. package/esm2022/spreadsheet/plugin/clipboard-plugin.mjs +171 -0
  50. package/esm2022/spreadsheet/plugin/filter-plugin.mjs +87 -0
  51. package/esm2022/spreadsheet/plugin/formula-plugin.mjs +456 -0
  52. package/esm2022/spreadsheet/plugin/index.mjs +10 -0
  53. package/esm2022/spreadsheet/plugin/plugin-host.mjs +188 -0
  54. package/esm2022/spreadsheet/plugin/plugin.types.mjs +2 -0
  55. package/esm2022/spreadsheet/plugin/selection-plugin.mjs +114 -0
  56. package/esm2022/spreadsheet/plugin/sort-plugin.mjs +63 -0
  57. package/esm2022/spreadsheet/plugin/undo-plugin.mjs +138 -0
  58. package/esm2022/spreadsheet/plugin/validation-plugin.mjs +71 -0
  59. package/esm2022/spreadsheet/spreadsheet-engine.mjs +547 -0
  60. package/esm2022/spreadsheet/utils/cell-utils.mjs +129 -0
  61. package/esm2022/spreadsheet/utils/index.mjs +2 -0
  62. package/esm2022/testing/a11y.mjs +6 -3
  63. package/fesm2022/ngxsmk-cdk-cva-base.mjs +52 -0
  64. package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -0
  65. package/fesm2022/ngxsmk-cdk-input-group.mjs +226 -0
  66. package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -0
  67. package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs +152 -0
  68. package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -0
  69. package/fesm2022/ngxsmk-cdk-scheduler.mjs +1035 -0
  70. package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -0
  71. package/fesm2022/ngxsmk-cdk-spreadsheet.mjs +1969 -0
  72. package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -0
  73. package/fesm2022/ngxsmk-cdk-testing.mjs +5 -2
  74. package/fesm2022/ngxsmk-cdk-testing.mjs.map +1 -1
  75. package/fesm2022/ngxsmk-cdk.mjs +5 -0
  76. package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
  77. package/input-group/index.d.ts +3 -0
  78. package/input-group/index.d.ts.map +1 -0
  79. package/input-group/input-group-engine.d.ts +88 -0
  80. package/input-group/input-group-engine.d.ts.map +1 -0
  81. package/input-group/models/index.d.ts +2 -0
  82. package/input-group/models/index.d.ts.map +1 -0
  83. package/input-group/models/input-group.model.d.ts +114 -0
  84. package/input-group/models/input-group.model.d.ts.map +1 -0
  85. package/input-group/ngxsmk-cdk-input-group.d.ts.map +1 -0
  86. package/listbox-keyboard/index.d.ts +2 -0
  87. package/listbox-keyboard/index.d.ts.map +1 -0
  88. package/listbox-keyboard/listbox-keyboard.d.ts +60 -0
  89. package/listbox-keyboard/listbox-keyboard.d.ts.map +1 -0
  90. package/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.d.ts.map +1 -0
  91. package/package.json +40 -1
  92. package/public-api.d.ts +8 -0
  93. package/public-api.d.ts.map +1 -1
  94. package/scheduler/index.d.ts +5 -0
  95. package/scheduler/index.d.ts.map +1 -0
  96. package/scheduler/models/date-range.d.ts +6 -0
  97. package/scheduler/models/date-range.d.ts.map +1 -0
  98. package/scheduler/models/event.model.d.ts +50 -0
  99. package/scheduler/models/event.model.d.ts.map +1 -0
  100. package/scheduler/models/index.d.ts +6 -0
  101. package/scheduler/models/index.d.ts.map +1 -0
  102. package/scheduler/models/resource.model.d.ts +16 -0
  103. package/scheduler/models/resource.model.d.ts.map +1 -0
  104. package/scheduler/models/selection.model.d.ts +12 -0
  105. package/scheduler/models/selection.model.d.ts.map +1 -0
  106. package/scheduler/models/view.model.d.ts +21 -0
  107. package/scheduler/models/view.model.d.ts.map +1 -0
  108. package/scheduler/ngxsmk-cdk-scheduler.d.ts.map +1 -0
  109. package/scheduler/plugin/drag-plugin.d.ts +28 -0
  110. package/scheduler/plugin/drag-plugin.d.ts.map +1 -0
  111. package/scheduler/plugin/index.d.ts +8 -0
  112. package/scheduler/plugin/index.d.ts.map +1 -0
  113. package/scheduler/plugin/keyboard-plugin.d.ts +24 -0
  114. package/scheduler/plugin/keyboard-plugin.d.ts.map +1 -0
  115. package/scheduler/plugin/plugin-host.d.ts +16 -0
  116. package/scheduler/plugin/plugin-host.d.ts.map +1 -0
  117. package/scheduler/plugin/plugin.types.d.ts +9 -0
  118. package/scheduler/plugin/plugin.types.d.ts.map +1 -0
  119. package/scheduler/plugin/resize-plugin.d.ts +26 -0
  120. package/scheduler/plugin/resize-plugin.d.ts.map +1 -0
  121. package/scheduler/plugin/selection-plugin.d.ts +40 -0
  122. package/scheduler/plugin/selection-plugin.d.ts.map +1 -0
  123. package/scheduler/plugin/tooltip-plugin.d.ts +41 -0
  124. package/scheduler/plugin/tooltip-plugin.d.ts.map +1 -0
  125. package/scheduler/scheduler-engine.d.ts +95 -0
  126. package/scheduler/scheduler-engine.d.ts.map +1 -0
  127. package/scheduler/utils/date-utils.d.ts +26 -0
  128. package/scheduler/utils/date-utils.d.ts.map +1 -0
  129. package/scheduler/utils/index.d.ts +3 -0
  130. package/scheduler/utils/index.d.ts.map +1 -0
  131. package/scheduler/utils/snap.d.ts +7 -0
  132. package/scheduler/utils/snap.d.ts.map +1 -0
  133. package/spreadsheet/index.d.ts +5 -0
  134. package/spreadsheet/index.d.ts.map +1 -0
  135. package/spreadsheet/models/cell.model.d.ts +44 -0
  136. package/spreadsheet/models/cell.model.d.ts.map +1 -0
  137. package/spreadsheet/models/column.model.d.ts +77 -0
  138. package/spreadsheet/models/column.model.d.ts.map +1 -0
  139. package/spreadsheet/models/filter.model.d.ts +15 -0
  140. package/spreadsheet/models/filter.model.d.ts.map +1 -0
  141. package/spreadsheet/models/formula.model.d.ts +65 -0
  142. package/spreadsheet/models/formula.model.d.ts.map +1 -0
  143. package/spreadsheet/models/index.d.ts +8 -0
  144. package/spreadsheet/models/index.d.ts.map +1 -0
  145. package/spreadsheet/models/row.model.d.ts +33 -0
  146. package/spreadsheet/models/row.model.d.ts.map +1 -0
  147. package/spreadsheet/models/selection.model.d.ts +18 -0
  148. package/spreadsheet/models/selection.model.d.ts.map +1 -0
  149. package/spreadsheet/models/sort.model.d.ts +14 -0
  150. package/spreadsheet/models/sort.model.d.ts.map +1 -0
  151. package/spreadsheet/ngxsmk-cdk-spreadsheet.d.ts.map +1 -0
  152. package/spreadsheet/plugin/clipboard-plugin.d.ts +24 -0
  153. package/spreadsheet/plugin/clipboard-plugin.d.ts.map +1 -0
  154. package/spreadsheet/plugin/filter-plugin.d.ts +21 -0
  155. package/spreadsheet/plugin/filter-plugin.d.ts.map +1 -0
  156. package/spreadsheet/plugin/formula-plugin.d.ts +39 -0
  157. package/spreadsheet/plugin/formula-plugin.d.ts.map +1 -0
  158. package/spreadsheet/plugin/index.d.ts +10 -0
  159. package/spreadsheet/plugin/index.d.ts.map +1 -0
  160. package/spreadsheet/plugin/plugin-host.d.ts +66 -0
  161. package/spreadsheet/plugin/plugin-host.d.ts.map +1 -0
  162. package/spreadsheet/plugin/plugin.types.d.ts +58 -0
  163. package/spreadsheet/plugin/plugin.types.d.ts.map +1 -0
  164. package/spreadsheet/plugin/selection-plugin.d.ts +28 -0
  165. package/spreadsheet/plugin/selection-plugin.d.ts.map +1 -0
  166. package/spreadsheet/plugin/sort-plugin.d.ts +18 -0
  167. package/spreadsheet/plugin/sort-plugin.d.ts.map +1 -0
  168. package/spreadsheet/plugin/undo-plugin.d.ts +40 -0
  169. package/spreadsheet/plugin/undo-plugin.d.ts.map +1 -0
  170. package/spreadsheet/plugin/validation-plugin.d.ts +29 -0
  171. package/spreadsheet/plugin/validation-plugin.d.ts.map +1 -0
  172. package/spreadsheet/spreadsheet-engine.d.ts +194 -0
  173. package/spreadsheet/spreadsheet-engine.d.ts.map +1 -0
  174. package/spreadsheet/utils/cell-utils.d.ts +26 -0
  175. package/spreadsheet/utils/cell-utils.d.ts.map +1 -0
  176. package/spreadsheet/utils/index.d.ts +2 -0
  177. package/spreadsheet/utils/index.d.ts.map +1 -0
  178. package/testing/a11y.d.ts +5 -1
  179. 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
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYTExeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Nkay90ZXN0aW5nL2ExMXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFFaEM7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxPQUFvQjtJQUMvRCxNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVTthQUNqQyxHQUFHLENBQ0YsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxDQUFDLE9BQU8sMEJBQTBCLENBQUMsQ0FBQyxLQUFLO2FBQzdFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ2xCO2FBQ0EsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBheGUgZnJvbSAnYXhlLWNvcmUnO1xuXG4vKipcbiAqIFJ1bnMgYXhlLWNvcmUgYW5hbHlzaXMgb24gdGhlIHByb3ZpZGVkIEhUTUwgZWxlbWVudCBhbmQgdGhyb3dzIGFuIGVycm9yIGlmIGFueSBhY2Nlc3NpYmlsaXR5XG4gKiB2aW9sYXRpb25zIGFyZSBkZXRlY3RlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGVjdE5vQTExeVZpb2xhdGlvbnMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGF4ZS5ydW4oZWxlbWVudCk7XG4gIGlmIChyZXN1bHRzLnZpb2xhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IHJlc3VsdHMudmlvbGF0aW9uc1xuICAgICAgLm1hcChcbiAgICAgICAgKHYpID0+XG4gICAgICAgICAgYFske3YuaWR9XSAke3YuaGVscH1cXG4gIC0gSGVscCBVUkw6ICR7di5oZWxwVXJsfVxcbiAgLSBOb2RlcyBhZmZlY3RlZDpcXG4ke3Yubm9kZXNcbiAgICAgICAgICAgIC5tYXAoKG4pID0+IGAgICAgKiAke24uaHRtbH1gKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpfWAsXG4gICAgICApXG4gICAgICAuam9pbignXFxuXFxuJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBY2Nlc3NpYmlsaXR5IHZpb2xhdGlvbnMgZGV0ZWN0ZWQ6XFxuXFxuJHtmb3JtYXR0ZWR9YCk7XG4gIH1cbn1cbiJdfQ==
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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"}