@mappoh/nova 0.2.3 → 0.3.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/dist/a11y/index.d.ts +40 -0
- package/dist/a11y/index.d.ts.map +1 -0
- package/dist/a11y/index.js +162 -0
- package/dist/a11y/index.js.map +1 -0
- package/dist/animation/flip.d.ts +28 -0
- package/dist/animation/flip.d.ts.map +1 -0
- package/dist/animation/flip.js +106 -0
- package/dist/animation/flip.js.map +1 -0
- package/dist/animation/spring.d.ts +34 -0
- package/dist/animation/spring.d.ts.map +1 -0
- package/dist/animation/spring.js +86 -0
- package/dist/animation/spring.js.map +1 -0
- package/dist/chart/chart.d.ts +27 -0
- package/dist/chart/chart.d.ts.map +1 -0
- package/dist/chart/chart.js +289 -0
- package/dist/chart/chart.js.map +1 -0
- package/dist/chart/index.d.ts +3 -0
- package/dist/chart/index.d.ts.map +1 -0
- package/dist/chart/index.js +2 -0
- package/dist/chart/index.js.map +1 -0
- package/dist/color-picker/color-picker.d.ts +18 -0
- package/dist/color-picker/color-picker.d.ts.map +1 -0
- package/dist/color-picker/color-picker.js +243 -0
- package/dist/color-picker/color-picker.js.map +1 -0
- package/dist/color-picker/index.d.ts +3 -0
- package/dist/color-picker/index.d.ts.map +1 -0
- package/dist/color-picker/index.js +2 -0
- package/dist/color-picker/index.js.map +1 -0
- package/dist/combobox/combobox.d.ts +26 -0
- package/dist/combobox/combobox.d.ts.map +1 -0
- package/dist/combobox/combobox.js +262 -0
- package/dist/combobox/combobox.js.map +1 -0
- package/dist/combobox/index.d.ts +3 -0
- package/dist/combobox/index.d.ts.map +1 -0
- package/dist/combobox/index.js +2 -0
- package/dist/combobox/index.js.map +1 -0
- package/dist/data-table/data-table.d.ts +34 -0
- package/dist/data-table/data-table.d.ts.map +1 -0
- package/dist/data-table/data-table.js +256 -0
- package/dist/data-table/data-table.js.map +1 -0
- package/dist/data-table/index.d.ts +3 -0
- package/dist/data-table/index.d.ts.map +1 -0
- package/dist/data-table/index.js +2 -0
- package/dist/data-table/index.js.map +1 -0
- package/dist/date-picker/date-picker.d.ts +22 -0
- package/dist/date-picker/date-picker.d.ts.map +1 -0
- package/dist/date-picker/date-picker.js +282 -0
- package/dist/date-picker/date-picker.js.map +1 -0
- package/dist/date-picker/index.d.ts +3 -0
- package/dist/date-picker/index.d.ts.map +1 -0
- package/dist/date-picker/index.js +2 -0
- package/dist/date-picker/index.js.map +1 -0
- package/dist/file-upload/file-upload.d.ts +24 -0
- package/dist/file-upload/file-upload.d.ts.map +1 -0
- package/dist/file-upload/file-upload.js +177 -0
- package/dist/file-upload/file-upload.js.map +1 -0
- package/dist/file-upload/index.d.ts +3 -0
- package/dist/file-upload/index.d.ts.map +1 -0
- package/dist/file-upload/index.js +2 -0
- package/dist/file-upload/index.js.map +1 -0
- package/dist/forms/form-engine.d.ts +19 -6
- package/dist/forms/form-engine.d.ts.map +1 -1
- package/dist/forms/form-engine.js +97 -11
- package/dist/forms/form-engine.js.map +1 -1
- package/dist/forms/validators.d.ts +4 -0
- package/dist/forms/validators.d.ts.map +1 -1
- package/dist/forms/validators.js +6 -0
- package/dist/forms/validators.js.map +1 -1
- package/dist/router/index.d.ts +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +1 -1
- package/dist/router/index.js.map +1 -1
- package/dist/router/router.d.ts +14 -0
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +44 -6
- package/dist/router/router.js.map +1 -1
- package/dist/state/store.d.ts +4 -0
- package/dist/state/store.d.ts.map +1 -1
- package/dist/state/store.js +27 -7
- package/dist/state/store.js.map +1 -1
- package/dist/tree-view/index.d.ts +3 -0
- package/dist/tree-view/index.d.ts.map +1 -0
- package/dist/tree-view/index.js +2 -0
- package/dist/tree-view/index.js.map +1 -0
- package/dist/tree-view/tree-view.d.ts +29 -0
- package/dist/tree-view/tree-view.d.ts.map +1 -0
- package/dist/tree-view/tree-view.js +273 -0
- package/dist/tree-view/tree-view.js.map +1 -0
- package/package.json +51 -2
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Date Picker
|
|
3
|
+
*
|
|
4
|
+
* Accessible calendar-based date picker with locale support and keyboard navigation.
|
|
5
|
+
*/
|
|
6
|
+
export interface DatePickerOptions {
|
|
7
|
+
value?: Date;
|
|
8
|
+
min?: Date;
|
|
9
|
+
max?: Date;
|
|
10
|
+
locale?: string;
|
|
11
|
+
/** First day of week: 0 = Sunday, 1 = Monday. Default: 0 */
|
|
12
|
+
firstDay?: 0 | 1;
|
|
13
|
+
format?: (date: Date) => string;
|
|
14
|
+
onChange?: (date: Date) => void;
|
|
15
|
+
}
|
|
16
|
+
export interface DatePickerInstance {
|
|
17
|
+
getValue(): Date | null;
|
|
18
|
+
setValue(date: Date): void;
|
|
19
|
+
destroy(): void;
|
|
20
|
+
}
|
|
21
|
+
export declare function createDatePicker(container: HTMLElement, options?: DatePickerOptions): DatePickerInstance;
|
|
22
|
+
//# sourceMappingURL=date-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../src/date-picker/date-picker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,IAAI,IAAI,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAsCD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,WAAW,EACtB,OAAO,GAAE,iBAAsB,GAC9B,kBAAkB,CA8OpB"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Date Picker
|
|
3
|
+
*
|
|
4
|
+
* Accessible calendar-based date picker with locale support and keyboard navigation.
|
|
5
|
+
*/
|
|
6
|
+
const STYLE_ID = 'nova-datepicker-styles';
|
|
7
|
+
function injectStyles() {
|
|
8
|
+
if (document.getElementById(STYLE_ID))
|
|
9
|
+
return;
|
|
10
|
+
const style = document.createElement('style');
|
|
11
|
+
style.id = STYLE_ID;
|
|
12
|
+
style.textContent = `
|
|
13
|
+
.nova-dp{position:relative;display:inline-block;font-family:inherit}
|
|
14
|
+
.nova-dp-input{padding:0.5rem;border:1px solid #d1d5db;border-radius:6px;font-size:inherit;width:100%;box-sizing:border-box;outline:none;cursor:pointer}
|
|
15
|
+
.nova-dp-input:focus{border-color:#3b82f6;box-shadow:0 0 0 2px rgba(59,130,246,0.2)}
|
|
16
|
+
.nova-dp-cal{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #d1d5db;border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,0.1);padding:0.75rem;z-index:1000;display:none;min-width:280px}
|
|
17
|
+
.nova-dp-cal[data-open]{display:block}
|
|
18
|
+
.nova-dp-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:0.5rem}
|
|
19
|
+
.nova-dp-header button{background:none;border:none;cursor:pointer;padding:0.25rem 0.5rem;border-radius:4px;font-size:1rem}
|
|
20
|
+
.nova-dp-header button:hover{background:#f3f4f6}
|
|
21
|
+
.nova-dp-title{font-weight:600;font-size:0.875rem}
|
|
22
|
+
.nova-dp-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;text-align:center}
|
|
23
|
+
.nova-dp-weekday{font-size:0.75rem;font-weight:600;color:#6b7280;padding:4px}
|
|
24
|
+
.nova-dp-day{padding:6px;border-radius:6px;cursor:pointer;font-size:0.875rem;border:none;background:none;width:100%}
|
|
25
|
+
.nova-dp-day:hover{background:#f3f4f6}
|
|
26
|
+
.nova-dp-day[data-today]{font-weight:700}
|
|
27
|
+
.nova-dp-day[aria-current="date"]{background:#3b82f6;color:#fff}
|
|
28
|
+
.nova-dp-day[aria-current="date"]:hover{background:#2563eb}
|
|
29
|
+
.nova-dp-day[data-outside]{color:#d1d5db}
|
|
30
|
+
.nova-dp-day:disabled{opacity:0.3;cursor:default}`;
|
|
31
|
+
document.head.appendChild(style);
|
|
32
|
+
}
|
|
33
|
+
function sameDay(a, b) {
|
|
34
|
+
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
35
|
+
}
|
|
36
|
+
function formatDefault(d) {
|
|
37
|
+
return d.toLocaleDateString();
|
|
38
|
+
}
|
|
39
|
+
export function createDatePicker(container, options = {}) {
|
|
40
|
+
injectStyles();
|
|
41
|
+
const locale = options.locale ?? navigator.language;
|
|
42
|
+
const firstDay = options.firstDay ?? 0;
|
|
43
|
+
const formatFn = options.format ?? formatDefault;
|
|
44
|
+
let selected = options.value ?? null;
|
|
45
|
+
let viewYear = selected?.getFullYear() ?? new Date().getFullYear();
|
|
46
|
+
let viewMonth = selected?.getMonth() ?? new Date().getMonth();
|
|
47
|
+
let open = false;
|
|
48
|
+
const root = document.createElement('div');
|
|
49
|
+
root.className = 'nova-dp';
|
|
50
|
+
const input = document.createElement('input');
|
|
51
|
+
input.type = 'text';
|
|
52
|
+
input.className = 'nova-dp-input';
|
|
53
|
+
input.readOnly = true;
|
|
54
|
+
input.placeholder = 'Select date...';
|
|
55
|
+
input.setAttribute('aria-label', 'Date picker');
|
|
56
|
+
if (selected)
|
|
57
|
+
input.value = formatFn(selected);
|
|
58
|
+
const cal = document.createElement('div');
|
|
59
|
+
cal.className = 'nova-dp-cal';
|
|
60
|
+
cal.setAttribute('role', 'dialog');
|
|
61
|
+
cal.setAttribute('aria-label', 'Calendar');
|
|
62
|
+
root.appendChild(input);
|
|
63
|
+
root.appendChild(cal);
|
|
64
|
+
container.appendChild(root);
|
|
65
|
+
function getMonthName(year, month) {
|
|
66
|
+
return new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }).format(new Date(year, month));
|
|
67
|
+
}
|
|
68
|
+
function getWeekdays() {
|
|
69
|
+
const days = [];
|
|
70
|
+
const formatter = new Intl.DateTimeFormat(locale, { weekday: 'short' });
|
|
71
|
+
for (let i = 0; i < 7; i++) {
|
|
72
|
+
const d = new Date(2024, 0, firstDay + i); // Jan 2024 starts on Monday
|
|
73
|
+
days.push(formatter.format(d));
|
|
74
|
+
}
|
|
75
|
+
return days;
|
|
76
|
+
}
|
|
77
|
+
function getDays() {
|
|
78
|
+
const days = [];
|
|
79
|
+
const firstOfMonth = new Date(viewYear, viewMonth, 1);
|
|
80
|
+
let startDay = firstOfMonth.getDay() - firstDay;
|
|
81
|
+
if (startDay < 0)
|
|
82
|
+
startDay += 7;
|
|
83
|
+
// Fill in days from previous month
|
|
84
|
+
for (let i = startDay - 1; i >= 0; i--) {
|
|
85
|
+
days.push({ date: new Date(viewYear, viewMonth, -i), outside: true });
|
|
86
|
+
}
|
|
87
|
+
// Days in current month
|
|
88
|
+
const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate();
|
|
89
|
+
for (let i = 1; i <= daysInMonth; i++) {
|
|
90
|
+
days.push({ date: new Date(viewYear, viewMonth, i), outside: false });
|
|
91
|
+
}
|
|
92
|
+
// Fill remaining cells to complete grid (6 rows)
|
|
93
|
+
const remaining = 42 - days.length;
|
|
94
|
+
for (let i = 1; i <= remaining; i++) {
|
|
95
|
+
days.push({ date: new Date(viewYear, viewMonth + 1, i), outside: true });
|
|
96
|
+
}
|
|
97
|
+
return days;
|
|
98
|
+
}
|
|
99
|
+
function isDisabled(date) {
|
|
100
|
+
if (options.min && date < options.min)
|
|
101
|
+
return true;
|
|
102
|
+
if (options.max && date > options.max)
|
|
103
|
+
return true;
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
function renderCal() {
|
|
107
|
+
while (cal.firstChild)
|
|
108
|
+
cal.removeChild(cal.firstChild);
|
|
109
|
+
// Header
|
|
110
|
+
const header = document.createElement('div');
|
|
111
|
+
header.className = 'nova-dp-header';
|
|
112
|
+
const prevBtn = document.createElement('button');
|
|
113
|
+
prevBtn.textContent = '\u2190';
|
|
114
|
+
prevBtn.setAttribute('aria-label', 'Previous month');
|
|
115
|
+
prevBtn.addEventListener('click', () => {
|
|
116
|
+
viewMonth--;
|
|
117
|
+
if (viewMonth < 0) {
|
|
118
|
+
viewMonth = 11;
|
|
119
|
+
viewYear--;
|
|
120
|
+
}
|
|
121
|
+
renderCal();
|
|
122
|
+
});
|
|
123
|
+
const title = document.createElement('span');
|
|
124
|
+
title.className = 'nova-dp-title';
|
|
125
|
+
title.textContent = getMonthName(viewYear, viewMonth);
|
|
126
|
+
const nextBtn = document.createElement('button');
|
|
127
|
+
nextBtn.textContent = '\u2192';
|
|
128
|
+
nextBtn.setAttribute('aria-label', 'Next month');
|
|
129
|
+
nextBtn.addEventListener('click', () => {
|
|
130
|
+
viewMonth++;
|
|
131
|
+
if (viewMonth > 11) {
|
|
132
|
+
viewMonth = 0;
|
|
133
|
+
viewYear++;
|
|
134
|
+
}
|
|
135
|
+
renderCal();
|
|
136
|
+
});
|
|
137
|
+
header.appendChild(prevBtn);
|
|
138
|
+
header.appendChild(title);
|
|
139
|
+
header.appendChild(nextBtn);
|
|
140
|
+
cal.appendChild(header);
|
|
141
|
+
// Grid
|
|
142
|
+
const grid = document.createElement('div');
|
|
143
|
+
grid.className = 'nova-dp-grid';
|
|
144
|
+
grid.setAttribute('role', 'grid');
|
|
145
|
+
// Weekday headers
|
|
146
|
+
for (const day of getWeekdays()) {
|
|
147
|
+
const wd = document.createElement('div');
|
|
148
|
+
wd.className = 'nova-dp-weekday';
|
|
149
|
+
wd.textContent = day;
|
|
150
|
+
grid.appendChild(wd);
|
|
151
|
+
}
|
|
152
|
+
// Day cells
|
|
153
|
+
const today = new Date();
|
|
154
|
+
const days = getDays();
|
|
155
|
+
for (const { date, outside } of days) {
|
|
156
|
+
const btn = document.createElement('button');
|
|
157
|
+
btn.className = 'nova-dp-day';
|
|
158
|
+
btn.textContent = String(date.getDate());
|
|
159
|
+
btn.setAttribute('aria-label', date.toLocaleDateString(locale, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }));
|
|
160
|
+
if (outside)
|
|
161
|
+
btn.setAttribute('data-outside', '');
|
|
162
|
+
if (sameDay(date, today))
|
|
163
|
+
btn.setAttribute('data-today', '');
|
|
164
|
+
if (selected && sameDay(date, selected))
|
|
165
|
+
btn.setAttribute('aria-current', 'date');
|
|
166
|
+
if (isDisabled(date)) {
|
|
167
|
+
btn.disabled = true;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
btn.addEventListener('click', () => {
|
|
171
|
+
selected = date;
|
|
172
|
+
input.value = formatFn(date);
|
|
173
|
+
options.onChange?.(date);
|
|
174
|
+
closeCal();
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
grid.appendChild(btn);
|
|
178
|
+
}
|
|
179
|
+
// Keyboard nav
|
|
180
|
+
grid.addEventListener('keydown', (e) => {
|
|
181
|
+
const current = document.activeElement;
|
|
182
|
+
const buttons = Array.from(grid.querySelectorAll('.nova-dp-day:not(:disabled)'));
|
|
183
|
+
const idx = buttons.indexOf(current);
|
|
184
|
+
if (idx === -1)
|
|
185
|
+
return;
|
|
186
|
+
let next = idx;
|
|
187
|
+
switch (e.key) {
|
|
188
|
+
case 'ArrowRight':
|
|
189
|
+
next = idx + 1;
|
|
190
|
+
break;
|
|
191
|
+
case 'ArrowLeft':
|
|
192
|
+
next = idx - 1;
|
|
193
|
+
break;
|
|
194
|
+
case 'ArrowDown':
|
|
195
|
+
next = idx + 7;
|
|
196
|
+
break;
|
|
197
|
+
case 'ArrowUp':
|
|
198
|
+
next = idx - 7;
|
|
199
|
+
break;
|
|
200
|
+
case 'PageDown':
|
|
201
|
+
e.preventDefault();
|
|
202
|
+
viewMonth++;
|
|
203
|
+
if (viewMonth > 11) {
|
|
204
|
+
viewMonth = 0;
|
|
205
|
+
viewYear++;
|
|
206
|
+
}
|
|
207
|
+
renderCal();
|
|
208
|
+
return;
|
|
209
|
+
case 'PageUp':
|
|
210
|
+
e.preventDefault();
|
|
211
|
+
viewMonth--;
|
|
212
|
+
if (viewMonth < 0) {
|
|
213
|
+
viewMonth = 11;
|
|
214
|
+
viewYear--;
|
|
215
|
+
}
|
|
216
|
+
renderCal();
|
|
217
|
+
return;
|
|
218
|
+
default: return;
|
|
219
|
+
}
|
|
220
|
+
e.preventDefault();
|
|
221
|
+
if (next >= 0 && next < buttons.length)
|
|
222
|
+
buttons[next].focus();
|
|
223
|
+
});
|
|
224
|
+
cal.appendChild(grid);
|
|
225
|
+
}
|
|
226
|
+
function openCal() {
|
|
227
|
+
if (open)
|
|
228
|
+
return;
|
|
229
|
+
open = true;
|
|
230
|
+
if (selected) {
|
|
231
|
+
viewYear = selected.getFullYear();
|
|
232
|
+
viewMonth = selected.getMonth();
|
|
233
|
+
}
|
|
234
|
+
renderCal();
|
|
235
|
+
cal.setAttribute('data-open', '');
|
|
236
|
+
}
|
|
237
|
+
function closeCal() {
|
|
238
|
+
open = false;
|
|
239
|
+
cal.removeAttribute('data-open');
|
|
240
|
+
}
|
|
241
|
+
input.addEventListener('click', () => {
|
|
242
|
+
if (open)
|
|
243
|
+
closeCal();
|
|
244
|
+
else
|
|
245
|
+
openCal();
|
|
246
|
+
});
|
|
247
|
+
input.addEventListener('keydown', (e) => {
|
|
248
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
249
|
+
e.preventDefault();
|
|
250
|
+
if (open)
|
|
251
|
+
closeCal();
|
|
252
|
+
else
|
|
253
|
+
openCal();
|
|
254
|
+
}
|
|
255
|
+
else if (e.key === 'Escape') {
|
|
256
|
+
closeCal();
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
function handleOutsideClick(e) {
|
|
260
|
+
if (!root.contains(e.target))
|
|
261
|
+
closeCal();
|
|
262
|
+
}
|
|
263
|
+
document.addEventListener('click', handleOutsideClick);
|
|
264
|
+
return {
|
|
265
|
+
getValue() {
|
|
266
|
+
return selected;
|
|
267
|
+
},
|
|
268
|
+
setValue(date) {
|
|
269
|
+
selected = date;
|
|
270
|
+
input.value = formatFn(date);
|
|
271
|
+
viewYear = date.getFullYear();
|
|
272
|
+
viewMonth = date.getMonth();
|
|
273
|
+
if (open)
|
|
274
|
+
renderCal();
|
|
275
|
+
},
|
|
276
|
+
destroy() {
|
|
277
|
+
document.removeEventListener('click', handleOutsideClick);
|
|
278
|
+
root.remove();
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=date-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-picker.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/date-picker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — File Upload
|
|
3
|
+
*
|
|
4
|
+
* Drag-and-drop file upload zone with validation and file list.
|
|
5
|
+
*/
|
|
6
|
+
export interface FileUploadOptions {
|
|
7
|
+
/** MIME type filter (e.g. 'image/*,.pdf'). */
|
|
8
|
+
accept?: string;
|
|
9
|
+
/** Allow multiple files. Default: false */
|
|
10
|
+
multiple?: boolean;
|
|
11
|
+
/** Max file size in bytes. */
|
|
12
|
+
maxSize?: number;
|
|
13
|
+
/** Max number of files. */
|
|
14
|
+
maxFiles?: number;
|
|
15
|
+
onSelect?: (files: File[]) => void;
|
|
16
|
+
onError?: (error: string) => void;
|
|
17
|
+
}
|
|
18
|
+
export interface FileUploadInstance {
|
|
19
|
+
getFiles(): File[];
|
|
20
|
+
clear(): void;
|
|
21
|
+
destroy(): void;
|
|
22
|
+
}
|
|
23
|
+
export declare function createFileUpload(container: HTMLElement, options?: FileUploadOptions): FileUploadInstance;
|
|
24
|
+
//# sourceMappingURL=file-upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-upload.d.ts","sourceRoot":"","sources":["../../src/file-upload/file-upload.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,IAAI,IAAI,EAAE,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CACjB;AA4BD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,WAAW,EACtB,OAAO,GAAE,iBAAsB,GAC9B,kBAAkB,CAgKpB"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — File Upload
|
|
3
|
+
*
|
|
4
|
+
* Drag-and-drop file upload zone with validation and file list.
|
|
5
|
+
*/
|
|
6
|
+
const STYLE_ID = 'nova-file-upload-styles';
|
|
7
|
+
function injectStyles() {
|
|
8
|
+
if (document.getElementById(STYLE_ID))
|
|
9
|
+
return;
|
|
10
|
+
const style = document.createElement('style');
|
|
11
|
+
style.id = STYLE_ID;
|
|
12
|
+
style.textContent = `
|
|
13
|
+
.nova-fu{font-family:inherit}
|
|
14
|
+
.nova-fu-zone{border:2px dashed #d1d5db;border-radius:8px;padding:2rem;text-align:center;cursor:pointer;transition:border-color 0.2s,background 0.2s}
|
|
15
|
+
.nova-fu-zone:hover,.nova-fu-zone[data-dragover]{border-color:#3b82f6;background:#eff6ff}
|
|
16
|
+
.nova-fu-zone-text{color:#6b7280;font-size:0.875rem}
|
|
17
|
+
.nova-fu-zone-text strong{color:#3b82f6}
|
|
18
|
+
.nova-fu-list{margin-top:0.5rem;display:flex;flex-direction:column;gap:0.25rem}
|
|
19
|
+
.nova-fu-item{display:flex;align-items:center;justify-content:space-between;padding:0.5rem;background:#f9fafb;border-radius:6px;font-size:0.875rem}
|
|
20
|
+
.nova-fu-item-info{display:flex;align-items:center;gap:0.5rem}
|
|
21
|
+
.nova-fu-item-size{color:#9ca3af;font-size:0.75rem}
|
|
22
|
+
.nova-fu-remove{background:none;border:none;cursor:pointer;color:#ef4444;font-weight:bold;font-size:1rem;padding:0 0.25rem}`;
|
|
23
|
+
document.head.appendChild(style);
|
|
24
|
+
}
|
|
25
|
+
function formatSize(bytes) {
|
|
26
|
+
if (bytes < 1024)
|
|
27
|
+
return `${bytes} B`;
|
|
28
|
+
if (bytes < 1024 * 1024)
|
|
29
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
30
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
31
|
+
}
|
|
32
|
+
export function createFileUpload(container, options = {}) {
|
|
33
|
+
injectStyles();
|
|
34
|
+
let files = [];
|
|
35
|
+
const root = document.createElement('div');
|
|
36
|
+
root.className = 'nova-fu';
|
|
37
|
+
// Drop zone
|
|
38
|
+
const zone = document.createElement('div');
|
|
39
|
+
zone.className = 'nova-fu-zone';
|
|
40
|
+
zone.setAttribute('role', 'button');
|
|
41
|
+
zone.setAttribute('tabindex', '0');
|
|
42
|
+
zone.setAttribute('aria-label', 'Upload files');
|
|
43
|
+
const text = document.createElement('div');
|
|
44
|
+
text.className = 'nova-fu-zone-text';
|
|
45
|
+
const strong = document.createElement('strong');
|
|
46
|
+
strong.textContent = 'Click to browse';
|
|
47
|
+
text.appendChild(strong);
|
|
48
|
+
text.appendChild(document.createTextNode(' or drag and drop'));
|
|
49
|
+
zone.appendChild(text);
|
|
50
|
+
// Hidden file input
|
|
51
|
+
const fileInput = document.createElement('input');
|
|
52
|
+
fileInput.type = 'file';
|
|
53
|
+
fileInput.style.display = 'none';
|
|
54
|
+
if (options.accept)
|
|
55
|
+
fileInput.accept = options.accept;
|
|
56
|
+
if (options.multiple)
|
|
57
|
+
fileInput.multiple = true;
|
|
58
|
+
// File list
|
|
59
|
+
const fileList = document.createElement('div');
|
|
60
|
+
fileList.className = 'nova-fu-list';
|
|
61
|
+
root.appendChild(zone);
|
|
62
|
+
root.appendChild(fileInput);
|
|
63
|
+
root.appendChild(fileList);
|
|
64
|
+
container.appendChild(root);
|
|
65
|
+
function validate(newFiles) {
|
|
66
|
+
const valid = [];
|
|
67
|
+
for (const file of newFiles) {
|
|
68
|
+
if (options.maxSize && file.size > options.maxSize) {
|
|
69
|
+
options.onError?.(`"${file.name}" exceeds max size of ${formatSize(options.maxSize)}`);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (options.accept) {
|
|
73
|
+
const types = options.accept.split(',').map((t) => t.trim());
|
|
74
|
+
const matches = types.some((type) => {
|
|
75
|
+
if (type.startsWith('.'))
|
|
76
|
+
return file.name.toLowerCase().endsWith(type.toLowerCase());
|
|
77
|
+
if (type.endsWith('/*'))
|
|
78
|
+
return file.type.startsWith(type.slice(0, -1));
|
|
79
|
+
return file.type === type;
|
|
80
|
+
});
|
|
81
|
+
if (!matches) {
|
|
82
|
+
options.onError?.(`"${file.name}" is not an accepted file type`);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
valid.push(file);
|
|
87
|
+
}
|
|
88
|
+
return valid;
|
|
89
|
+
}
|
|
90
|
+
function addFiles(newFiles) {
|
|
91
|
+
const validated = validate(newFiles);
|
|
92
|
+
if (validated.length === 0)
|
|
93
|
+
return;
|
|
94
|
+
if (options.multiple) {
|
|
95
|
+
files = [...files, ...validated];
|
|
96
|
+
if (options.maxFiles && files.length > options.maxFiles) {
|
|
97
|
+
files = files.slice(0, options.maxFiles);
|
|
98
|
+
options.onError?.(`Maximum ${options.maxFiles} files allowed`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
files = [validated[0]];
|
|
103
|
+
}
|
|
104
|
+
renderList();
|
|
105
|
+
options.onSelect?.([...files]);
|
|
106
|
+
}
|
|
107
|
+
function renderList() {
|
|
108
|
+
while (fileList.firstChild)
|
|
109
|
+
fileList.removeChild(fileList.firstChild);
|
|
110
|
+
for (let i = 0; i < files.length; i++) {
|
|
111
|
+
const file = files[i];
|
|
112
|
+
const item = document.createElement('div');
|
|
113
|
+
item.className = 'nova-fu-item';
|
|
114
|
+
const info = document.createElement('div');
|
|
115
|
+
info.className = 'nova-fu-item-info';
|
|
116
|
+
const name = document.createElement('span');
|
|
117
|
+
name.textContent = file.name;
|
|
118
|
+
const size = document.createElement('span');
|
|
119
|
+
size.className = 'nova-fu-item-size';
|
|
120
|
+
size.textContent = formatSize(file.size);
|
|
121
|
+
info.appendChild(name);
|
|
122
|
+
info.appendChild(size);
|
|
123
|
+
const removeBtn = document.createElement('button');
|
|
124
|
+
removeBtn.className = 'nova-fu-remove';
|
|
125
|
+
removeBtn.textContent = '\u00D7';
|
|
126
|
+
removeBtn.setAttribute('aria-label', `Remove ${file.name}`);
|
|
127
|
+
removeBtn.addEventListener('click', () => {
|
|
128
|
+
files.splice(i, 1);
|
|
129
|
+
renderList();
|
|
130
|
+
options.onSelect?.([...files]);
|
|
131
|
+
});
|
|
132
|
+
item.appendChild(info);
|
|
133
|
+
item.appendChild(removeBtn);
|
|
134
|
+
fileList.appendChild(item);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Click to browse
|
|
138
|
+
zone.addEventListener('click', () => fileInput.click());
|
|
139
|
+
zone.addEventListener('keydown', (e) => {
|
|
140
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
141
|
+
e.preventDefault();
|
|
142
|
+
fileInput.click();
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
fileInput.addEventListener('change', () => {
|
|
146
|
+
if (fileInput.files)
|
|
147
|
+
addFiles(Array.from(fileInput.files));
|
|
148
|
+
fileInput.value = '';
|
|
149
|
+
});
|
|
150
|
+
// Drag events
|
|
151
|
+
zone.addEventListener('dragover', (e) => {
|
|
152
|
+
e.preventDefault();
|
|
153
|
+
zone.setAttribute('data-dragover', '');
|
|
154
|
+
});
|
|
155
|
+
zone.addEventListener('dragleave', () => {
|
|
156
|
+
zone.removeAttribute('data-dragover');
|
|
157
|
+
});
|
|
158
|
+
zone.addEventListener('drop', (e) => {
|
|
159
|
+
e.preventDefault();
|
|
160
|
+
zone.removeAttribute('data-dragover');
|
|
161
|
+
if (e.dataTransfer?.files)
|
|
162
|
+
addFiles(Array.from(e.dataTransfer.files));
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
getFiles() {
|
|
166
|
+
return [...files];
|
|
167
|
+
},
|
|
168
|
+
clear() {
|
|
169
|
+
files = [];
|
|
170
|
+
renderList();
|
|
171
|
+
},
|
|
172
|
+
destroy() {
|
|
173
|
+
root.remove();
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=file-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-upload.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/file-upload/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { Validator, AsyncValidator } from './validators';
|
|
8
8
|
export interface FieldSchema {
|
|
9
|
-
type?: 'text' | 'email' | 'password' | 'number' | 'textarea' | 'select' | 'checkbox';
|
|
9
|
+
type?: 'text' | 'email' | 'password' | 'number' | 'textarea' | 'select' | 'checkbox' | 'array';
|
|
10
10
|
label?: string;
|
|
11
11
|
placeholder?: string;
|
|
12
12
|
required?: boolean;
|
|
@@ -17,6 +17,8 @@ export interface FieldSchema {
|
|
|
17
17
|
label: string;
|
|
18
18
|
value: string;
|
|
19
19
|
}[];
|
|
20
|
+
/** Schema for each item in a field array (only used when type is 'array') */
|
|
21
|
+
itemSchema?: Record<string, FieldSchema>;
|
|
20
22
|
}
|
|
21
23
|
export interface StepSchema {
|
|
22
24
|
title?: string;
|
|
@@ -49,6 +51,7 @@ export declare class NovaForm {
|
|
|
49
51
|
private submitting;
|
|
50
52
|
private submitError;
|
|
51
53
|
private listeners;
|
|
54
|
+
private asyncTimers;
|
|
52
55
|
constructor(schema: FormSchema);
|
|
53
56
|
/** Initialize field states from schema */
|
|
54
57
|
private initFields;
|
|
@@ -60,22 +63,32 @@ export declare class NovaForm {
|
|
|
60
63
|
setValue(name: string, value: unknown): void;
|
|
61
64
|
/** Mark a field as touched (blurred) */
|
|
62
65
|
touch(name: string): void;
|
|
63
|
-
/**
|
|
64
|
-
|
|
66
|
+
/** Run sync validators for a single field */
|
|
67
|
+
private validateFieldSync;
|
|
68
|
+
/** Run async validators for a field */
|
|
69
|
+
private runAsyncValidators;
|
|
70
|
+
/** Validate a single field (sync + async) */
|
|
71
|
+
validateField(name: string): Promise<string | null>;
|
|
65
72
|
/** Validate all fields in the current step */
|
|
66
|
-
validateStep(): boolean
|
|
73
|
+
validateStep(): Promise<boolean>;
|
|
67
74
|
/** Validate all fields across all steps */
|
|
68
|
-
validateAll(): boolean
|
|
75
|
+
validateAll(): Promise<boolean>;
|
|
69
76
|
/** Check if form is valid (no errors) */
|
|
70
77
|
isValid(): boolean;
|
|
71
78
|
/** Go to next step (validates current step first) */
|
|
72
|
-
nextStep(): boolean
|
|
79
|
+
nextStep(): Promise<boolean>;
|
|
73
80
|
/** Go to previous step */
|
|
74
81
|
prevStep(): boolean;
|
|
75
82
|
/** Go to specific step */
|
|
76
83
|
goToStep(index: number): void;
|
|
77
84
|
/** Submit the form */
|
|
78
85
|
submit(): Promise<boolean>;
|
|
86
|
+
/** Add an item to a field array */
|
|
87
|
+
addItem(fieldName: string, defaults?: Record<string, unknown>): void;
|
|
88
|
+
/** Remove an item from a field array by index */
|
|
89
|
+
removeItem(fieldName: string, index: number): void;
|
|
90
|
+
/** Get items from a field array */
|
|
91
|
+
getItems(fieldName: string): unknown[];
|
|
79
92
|
/** Get all form data */
|
|
80
93
|
getData(): Record<string, unknown>;
|
|
81
94
|
/** Reset form to initial state */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-engine.d.ts","sourceRoot":"","sources":["../../src/forms/form-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"form-engine.d.ts","sourceRoot":"","sources":["../../src/forms/form-engine.ts"],"names":[],"mappings":"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"}
|