juxscript 1.1.158 → 1.1.161

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 (49) hide show
  1. package/index.d.ts +4 -0
  2. package/index.d.ts.map +1 -1
  3. package/index.js +5 -0
  4. package/lib/components/checkbox.js +4 -4
  5. package/lib/components/checkbox.ts +5 -5
  6. package/lib/components/datepicker.d.ts.map +1 -1
  7. package/lib/components/datepicker.js +5 -4
  8. package/lib/components/datepicker.ts +5 -4
  9. package/lib/components/dialog.d.ts.map +1 -1
  10. package/lib/components/dialog.js +2 -0
  11. package/lib/components/dialog.ts +2 -0
  12. package/lib/components/dropdown.d.ts +1 -0
  13. package/lib/components/dropdown.d.ts.map +1 -1
  14. package/lib/components/dropdown.js +5 -6
  15. package/lib/components/dropdown.ts +6 -9
  16. package/lib/components/fileupload.d.ts +6 -0
  17. package/lib/components/fileupload.d.ts.map +1 -1
  18. package/lib/components/fileupload.js +31 -61
  19. package/lib/components/fileupload.ts +38 -67
  20. package/lib/components/input.js +6 -6
  21. package/lib/components/input.ts +6 -6
  22. package/lib/components/modal.d.ts.map +1 -1
  23. package/lib/components/modal.js +2 -0
  24. package/lib/components/modal.ts +2 -0
  25. package/lib/components/select.d.ts.map +1 -1
  26. package/lib/components/select.js +5 -0
  27. package/lib/components/select.ts +6 -0
  28. package/lib/components/switch.js +4 -4
  29. package/lib/components/switch.ts +5 -5
  30. package/lib/components/tabs.js +4 -4
  31. package/lib/components/tabs.ts +4 -4
  32. package/lib/storage/DataFrame.d.ts +59 -0
  33. package/lib/storage/DataFrame.d.ts.map +1 -0
  34. package/lib/storage/DataFrame.js +443 -0
  35. package/lib/storage/DataFrame.ts +472 -0
  36. package/lib/storage/FileStorage.d.ts +53 -0
  37. package/lib/storage/FileStorage.d.ts.map +1 -0
  38. package/lib/storage/FileStorage.js +80 -0
  39. package/lib/storage/FileStorage.ts +95 -0
  40. package/lib/storage/IndexedDBDriver.d.ts +75 -0
  41. package/lib/storage/IndexedDBDriver.d.ts.map +1 -0
  42. package/lib/storage/IndexedDBDriver.js +177 -0
  43. package/lib/storage/IndexedDBDriver.ts +226 -0
  44. package/lib/storage/TabularDriver.d.ts +75 -0
  45. package/lib/storage/TabularDriver.d.ts.map +1 -0
  46. package/lib/storage/TabularDriver.js +399 -0
  47. package/lib/storage/TabularDriver.ts +491 -0
  48. package/machinery/errors.js +22 -5
  49. package/package.json +1 -1
@@ -1,10 +1,11 @@
1
1
  import { BaseComponent, BaseState } from './base/BaseComponent.js';
2
2
  import { renderIcon } from './icons.js';
3
- import { formatIdAsLabel } from '../utils/formatId.js'; // ✅ Import
3
+ import { formatIdAsLabel } from '../utils/formatId.js';
4
+ import { FileStorage } from '../storage/FileStorage.js';
4
5
 
5
6
  // Event definitions
6
7
  const TRIGGER_EVENTS = [] as const;
7
- const CALLBACK_EVENTS = ['change', 'filesSelected', 'clear'] as const;
8
+ const CALLBACK_EVENTS = ['change', 'filesSelected', 'clear', 'stored'] as const;
8
9
 
9
10
  export interface FileUploadOptions {
10
11
  label?: string;
@@ -17,6 +18,8 @@ export interface FileUploadOptions {
17
18
  style?: string;
18
19
  class?: string;
19
20
  onValidate?: (files: File[]) => boolean | string;
21
+ storage?: FileStorage;
22
+ metadata?: Record<string, any>;
20
23
  }
21
24
 
22
25
  interface FileUploadState extends BaseState {
@@ -28,6 +31,8 @@ interface FileUploadState extends BaseState {
28
31
 
29
32
  export class FileUpload extends BaseComponent<FileUploadState> {
30
33
  private _fileListElement: HTMLElement | null = null;
34
+ private _storage: FileStorage | null = null;
35
+ private _metadata: Record<string, any> | undefined;
31
36
 
32
37
  constructor(id: string, options: FileUploadOptions = {}) {
33
38
  super(id, {
@@ -37,7 +42,7 @@ export class FileUpload extends BaseComponent<FileUploadState> {
37
42
  class: options.class ?? '',
38
43
  style: options.style ?? '',
39
44
  attributes: {},
40
- label: options.label ?? formatIdAsLabel(id), // ✅ Auto-generate
45
+ label: options.label ?? formatIdAsLabel(id),
41
46
  required: options.required ?? false,
42
47
  name: options.name ?? id,
43
48
  errorMessage: undefined,
@@ -50,6 +55,9 @@ export class FileUpload extends BaseComponent<FileUploadState> {
50
55
  if (options.onValidate) {
51
56
  this._onValidate = options.onValidate;
52
57
  }
58
+
59
+ this._storage = options.storage ?? null;
60
+ this._metadata = options.metadata;
53
61
  }
54
62
 
55
63
  protected getTriggerEvents(): readonly string[] {
@@ -79,6 +87,12 @@ export class FileUpload extends BaseComponent<FileUploadState> {
79
87
  return this;
80
88
  }
81
89
 
90
+ storage(store: FileStorage, metadata?: Record<string, any>): this {
91
+ this._storage = store;
92
+ this._metadata = metadata;
93
+ return this;
94
+ }
95
+
82
96
  clear(): this {
83
97
  this.state.files = [];
84
98
  if (this._inputElement) {
@@ -87,7 +101,7 @@ export class FileUpload extends BaseComponent<FileUploadState> {
87
101
  if (this._fileListElement) {
88
102
  this._fileListElement.innerHTML = '';
89
103
  }
90
- this._triggerCallback('clear');
104
+ this._triggerCallback('clear', null, null, this);
91
105
  return this;
92
106
  }
93
107
 
@@ -153,13 +167,13 @@ export class FileUpload extends BaseComponent<FileUploadState> {
153
167
  input.multiple = multiple;
154
168
  input.required = required!;
155
169
  input.disabled = disabled!;
156
- input.style.display = 'none'; // Hidden, triggered by button
170
+ input.style.display = 'none';
157
171
 
158
172
  return input;
159
173
  }
160
174
 
161
175
  private _updateFileList(): void {
162
- if (!this._fileListElement) return; // Safety check
176
+ if (!this._fileListElement) return;
163
177
 
164
178
  this._fileListElement.innerHTML = '';
165
179
 
@@ -180,10 +194,10 @@ export class FileUpload extends BaseComponent<FileUploadState> {
180
194
  removeBtn?.addEventListener('click', () => {
181
195
  this.state.files = this.state.files.filter((_, i) => i !== index);
182
196
  this._updateFileList();
183
- this._triggerCallback('change', this.state.files);
197
+ this._triggerCallback('change', this.state.files, null, this);
184
198
  });
185
199
 
186
- this._fileListElement!.appendChild(fileItem); // ✅ Non-null assertion safe here
200
+ this._fileListElement!.appendChild(fileItem);
187
201
  });
188
202
  }
189
203
 
@@ -204,24 +218,20 @@ export class FileUpload extends BaseComponent<FileUploadState> {
204
218
 
205
219
  const { icon, style, class: className } = this.state;
206
220
 
207
- // Build wrapper
208
221
  const wrapper = document.createElement('div');
209
222
  wrapper.className = 'jux-input jux-fileupload';
210
223
  wrapper.id = this._id;
211
224
  if (className) wrapper.className += ` ${className}`;
212
225
  if (style) wrapper.setAttribute('style', style);
213
226
 
214
- // Label
215
227
  if (this.state.label) {
216
228
  wrapper.appendChild(this._renderLabel());
217
229
  }
218
230
 
219
- // Hidden file input
220
231
  const inputEl = this._buildInputElement() as HTMLInputElement;
221
232
  this._inputElement = inputEl;
222
233
  wrapper.appendChild(inputEl);
223
234
 
224
- // Button container
225
235
  const buttonContainer = document.createElement('div');
226
236
  buttonContainer.className = 'jux-fileupload-button-container';
227
237
 
@@ -241,80 +251,41 @@ export class FileUpload extends BaseComponent<FileUploadState> {
241
251
  buttonContainer.appendChild(button);
242
252
  wrapper.appendChild(buttonContainer);
243
253
 
244
- // File list
245
254
  const fileList = document.createElement('div');
246
255
  fileList.className = 'jux-fileupload-list';
247
256
  this._fileListElement = fileList;
248
257
  wrapper.appendChild(fileList);
249
258
 
250
- // Error element
251
259
  wrapper.appendChild(this._renderError());
252
260
 
253
- // Button click triggers file input
254
261
  button.addEventListener('click', () => inputEl.click());
255
262
 
256
- // Wire events
257
- this._wireStandardEvents(wrapper);
258
-
259
- // Wire file-specific sync
260
- const filesSync = this._syncBindings.find(b => b.property === 'files' || b.property === 'value');
261
-
262
- if (filesSync) {
263
- const { stateObj, toState, toComponent } = filesSync;
264
-
265
- const transformToState = toState || ((v: File[]) => v);
266
- const transformToComponent = toComponent || ((v: any) => v);
267
-
268
- let isUpdating = false;
269
-
270
- // State → Component
271
- stateObj.subscribe((val: any) => {
272
- if (isUpdating) return;
273
- const transformed = transformToComponent(val);
274
- this.setValue(transformed);
275
- });
276
-
277
- // Component → State
278
- inputEl.addEventListener('change', () => {
279
- if (isUpdating) return;
280
- isUpdating = true;
281
-
282
- const files = Array.from(inputEl.files || []);
283
- this.state.files = files;
284
- this._updateFileList();
285
- this._clearError();
286
-
287
- const transformed = transformToState(files);
288
- stateObj.set(transformed);
263
+ inputEl.addEventListener('change', (e) => {
264
+ const files = Array.from(inputEl.files || []);
265
+ this.state.files = files;
266
+ this._updateFileList();
267
+ this._clearError();
289
268
 
290
- // 🎯 Fire the callback events
291
- this._triggerCallback('change', files);
292
- this._triggerCallback('filesSelected', files);
269
+ this._triggerCallback('change', files, e, this);
270
+ this._triggerCallback('filesSelected', files, e, this);
293
271
 
294
- setTimeout(() => { isUpdating = false; }, 0);
295
- });
296
- } else {
297
- // Default behavior without sync
298
- inputEl.addEventListener('change', () => {
299
- const files = Array.from(inputEl.files || []);
300
- this.state.files = files;
301
- this._updateFileList();
302
- this._clearError();
272
+ if (this._storage && files.length > 0) {
273
+ this._storage.storeAll(files, this._metadata).then((stored) => {
274
+ this._triggerCallback('stored', stored, e, this);
275
+ }).catch((err) => {
276
+ console.error('[FileUpload] Storage error:', err);
277
+ });
278
+ }
279
+ });
303
280
 
304
- // 🎯 Fire the callback events
305
- this._triggerCallback('change', files);
306
- this._triggerCallback('filesSelected', files);
307
- });
308
- }
281
+ this._wireStandardEvents(wrapper);
309
282
 
310
- // Always add blur validation
311
283
  inputEl.addEventListener('blur', () => {
312
284
  if (this._hasBeenValidated) {
313
285
  this.validate();
314
286
  }
315
287
  });
316
288
 
317
- // Sync label changes
318
289
  const labelSync = this._syncBindings.find(b => b.property === 'label');
319
290
  if (labelSync) {
320
291
  const transform = labelSync.toComponent || ((v: any) => String(v));
@@ -245,24 +245,24 @@ export class Input extends BaseComponent {
245
245
  counterEl.id = `${this._id}-counter`;
246
246
  counterEl.textContent = `${this.state.value.length}/${maxLength}`;
247
247
  wrapper.appendChild(counterEl);
248
- inputEl.addEventListener('input', () => {
248
+ inputEl.addEventListener('input', (e) => {
249
249
  const input = inputEl;
250
250
  counterEl.textContent = `${input.value.length}/${maxLength}`;
251
251
  this.state.value = input.value;
252
- this._triggerCallback('input', input.value);
252
+ this._triggerCallback('input', input.value, e, this);
253
253
  });
254
254
  }
255
255
  else {
256
- inputEl.addEventListener('input', () => {
256
+ inputEl.addEventListener('input', (e) => {
257
257
  const input = inputEl;
258
258
  this.state.value = input.value;
259
- this._triggerCallback('input', input.value);
259
+ this._triggerCallback('input', input.value, e, this);
260
260
  });
261
261
  }
262
262
  // Fire change event on blur
263
- inputEl.addEventListener('change', () => {
263
+ inputEl.addEventListener('change', (e) => {
264
264
  const input = inputEl;
265
- this._triggerCallback('change', input.value);
265
+ this._triggerCallback('change', input.value, e, this);
266
266
  });
267
267
  // Wire events
268
268
  this._wireStandardEvents(wrapper);
@@ -324,24 +324,24 @@ export class Input extends BaseComponent<InputState> {
324
324
  counterEl.textContent = `${this.state.value.length}/${maxLength}`;
325
325
  wrapper.appendChild(counterEl);
326
326
 
327
- inputEl.addEventListener('input', () => {
327
+ inputEl.addEventListener('input', (e) => {
328
328
  const input = inputEl as HTMLInputElement | HTMLTextAreaElement;
329
329
  counterEl.textContent = `${input.value.length}/${maxLength}`;
330
330
  this.state.value = input.value;
331
- this._triggerCallback('input', input.value);
331
+ this._triggerCallback('input', input.value, e, this);
332
332
  });
333
333
  } else {
334
- inputEl.addEventListener('input', () => {
334
+ inputEl.addEventListener('input', (e) => {
335
335
  const input = inputEl as HTMLInputElement | HTMLTextAreaElement;
336
336
  this.state.value = input.value;
337
- this._triggerCallback('input', input.value);
337
+ this._triggerCallback('input', input.value, e, this);
338
338
  });
339
339
  }
340
340
 
341
341
  // Fire change event on blur
342
- inputEl.addEventListener('change', () => {
342
+ inputEl.addEventListener('change', (e) => {
343
343
  const input = inputEl as HTMLInputElement | HTMLTextAreaElement;
344
- this._triggerCallback('change', input.value);
344
+ this._triggerCallback('change', input.value, e, this);
345
345
  });
346
346
 
347
347
  // Wire events
@@ -1 +1 @@
1
- {"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["modal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["modal.ts"],"names":[],"mappings":"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"}
@@ -214,10 +214,12 @@ export class Modal extends BaseComponent {
214
214
  }
215
215
  open() {
216
216
  this.state.open = true;
217
+ this._triggerCallback('open', true, null, this);
217
218
  return this;
218
219
  }
219
220
  closeModal() {
220
221
  this.state.open = false;
222
+ this._triggerCallback('close', false, null, this);
221
223
  return this;
222
224
  }
223
225
  toggle() {
@@ -285,11 +285,13 @@ export class Modal extends BaseComponent<ModalState> {
285
285
 
286
286
  open(): this {
287
287
  this.state.open = true;
288
+ this._triggerCallback('open', true, null, this);
288
289
  return this;
289
290
  }
290
291
 
291
292
  closeModal(): this {
292
293
  this.state.open = false;
294
+ this._triggerCallback('close', false, null, this);
293
295
  return this;
294
296
  }
295
297
 
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAOnE,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAAC;CACpD;AAED,UAAU,WAAY,SAAQ,SAAS;IACnC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,MAAO,SAAQ,aAAa,CAAC,WAAW,CAAC;gBACtC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;IAsBnD,SAAS,CAAC,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAI/C,SAAS,CAAC,iBAAiB,IAAI,SAAS,MAAM,EAAE;IAehD,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI;IAKpC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI1B,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKhC,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IASrC,QAAQ,IAAI,MAAM;IAIlB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAU7B,QAAQ,IAAI,OAAO;IAcnB,OAAO,IAAI,OAAO;IAKlB,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM;IAsBzD,SAAS,CAAC,kBAAkB,IAAI,WAAW;IAqC3C,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI;CAiFrE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAEtE"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAOnE,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAAC;CACpD;AAED,UAAU,WAAY,SAAQ,SAAS;IACnC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,MAAO,SAAQ,aAAa,CAAC,WAAW,CAAC;gBACtC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;IAsBnD,SAAS,CAAC,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAI/C,SAAS,CAAC,iBAAiB,IAAI,SAAS,MAAM,EAAE;IAehD,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI;IAKpC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI1B,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKhC,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IASrC,QAAQ,IAAI,MAAM;IAIlB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAU7B,QAAQ,IAAI,OAAO;IAcnB,OAAO,IAAI,OAAO;IAKlB,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM;IAsBzD,SAAS,CAAC,kBAAkB,IAAI,WAAW;IAqC3C,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI;CAuFrE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAEtE"}
@@ -157,6 +157,11 @@ export class Select extends BaseComponent {
157
157
  wrapper.appendChild(selectContainer);
158
158
  // Error element
159
159
  wrapper.appendChild(this._renderError());
160
+ // Wire change callback with (value, event, component)
161
+ selectEl.addEventListener('change', (e) => {
162
+ this.state.value = selectEl.value;
163
+ this._triggerCallback('change', selectEl.value, e, this);
164
+ });
160
165
  // Wire events
161
166
  this._wireStandardEvents(wrapper);
162
167
  this._wireFormSync(selectEl, 'change');
@@ -217,6 +217,12 @@ export class Select extends BaseComponent<SelectState> {
217
217
  // Error element
218
218
  wrapper.appendChild(this._renderError());
219
219
 
220
+ // Wire change callback with (value, event, component)
221
+ selectEl.addEventListener('change', (e) => {
222
+ this.state.value = selectEl.value;
223
+ this._triggerCallback('change', selectEl.value, e, this);
224
+ });
225
+
220
226
  // Wire events
221
227
  this._wireStandardEvents(wrapper);
222
228
  this._wireFormSync(selectEl, 'change');
@@ -159,7 +159,7 @@ export class Switch extends BaseComponent {
159
159
  this.setValue(transformed);
160
160
  });
161
161
  // Component → State
162
- inputEl.addEventListener('change', () => {
162
+ inputEl.addEventListener('change', (e) => {
163
163
  if (isUpdating)
164
164
  return;
165
165
  isUpdating = true;
@@ -169,17 +169,17 @@ export class Switch extends BaseComponent {
169
169
  const transformed = transformToState(checked);
170
170
  stateObj.set(transformed);
171
171
  // 🎯 Fire the change callback event
172
- this._triggerCallback('change', checked);
172
+ this._triggerCallback('change', checked, e, this);
173
173
  setTimeout(() => { isUpdating = false; }, 0);
174
174
  });
175
175
  }
176
176
  else {
177
177
  // Default behavior without sync
178
- inputEl.addEventListener('change', () => {
178
+ inputEl.addEventListener('change', (e) => {
179
179
  this.state.checked = inputEl.checked;
180
180
  this._clearError();
181
181
  // 🎯 Fire the change callback event
182
- this._triggerCallback('change', inputEl.checked);
182
+ this._triggerCallback('change', inputEl.checked, e, this);
183
183
  });
184
184
  }
185
185
  // Always add blur validation
@@ -212,11 +212,11 @@ export class Switch extends BaseComponent<SwitchState> {
212
212
  });
213
213
 
214
214
  // Component → State
215
- inputEl.addEventListener('change', () => {
215
+ inputEl.addEventListener('change', (e) => {
216
216
  if (isUpdating) return;
217
217
  isUpdating = true;
218
218
 
219
- const checked = inputEl.checked;
219
+ const checked = (inputEl as HTMLInputElement).checked;
220
220
  this.state.checked = checked;
221
221
  this._clearError();
222
222
 
@@ -224,18 +224,18 @@ export class Switch extends BaseComponent<SwitchState> {
224
224
  stateObj.set(transformed);
225
225
 
226
226
  // 🎯 Fire the change callback event
227
- this._triggerCallback('change', checked);
227
+ this._triggerCallback('change', checked, e, this);
228
228
 
229
229
  setTimeout(() => { isUpdating = false; }, 0);
230
230
  });
231
231
  } else {
232
232
  // Default behavior without sync
233
- inputEl.addEventListener('change', () => {
233
+ inputEl.addEventListener('change', (e) => {
234
234
  this.state.checked = inputEl.checked;
235
235
  this._clearError();
236
236
 
237
237
  // 🎯 Fire the change callback event
238
- this._triggerCallback('change', inputEl.checked);
238
+ this._triggerCallback('change', inputEl.checked, e, this);
239
239
  });
240
240
  }
241
241
 
@@ -88,9 +88,9 @@ export class Tabs extends BaseComponent {
88
88
  tabButton.appendChild(icon);
89
89
  }
90
90
  tabButton.appendChild(document.createTextNode(tab.label));
91
- tabButton.addEventListener('click', () => {
91
+ tabButton.addEventListener('click', (e) => {
92
92
  this.state.activeTab = tab.id;
93
- this._triggerCallback('tabChange', tab.id);
93
+ this._triggerCallback('tabChange', tab.id, e, this);
94
94
  });
95
95
  tabList.appendChild(tabButton);
96
96
  // Panel with unique ID
@@ -240,9 +240,9 @@ export class Tabs extends BaseComponent {
240
240
  tabButton.appendChild(icon);
241
241
  }
242
242
  tabButton.appendChild(document.createTextNode(tab.label));
243
- tabButton.addEventListener('click', () => {
243
+ tabButton.addEventListener('click', (e) => {
244
244
  this.state.activeTab = tab.id;
245
- this._triggerCallback('tabChange', tab.id);
245
+ this._triggerCallback('tabChange', tab.id, e, this);
246
246
  });
247
247
  tabList.appendChild(tabButton);
248
248
  // Tab panel with unique ID
@@ -128,9 +128,9 @@ export class Tabs extends BaseComponent<TabsState> {
128
128
 
129
129
  tabButton.appendChild(document.createTextNode(tab.label));
130
130
 
131
- tabButton.addEventListener('click', () => {
131
+ tabButton.addEventListener('click', (e) => {
132
132
  this.state.activeTab = tab.id;
133
- this._triggerCallback('tabChange', tab.id);
133
+ this._triggerCallback('tabChange', tab.id, e, this);
134
134
  });
135
135
 
136
136
  tabList.appendChild(tabButton);
@@ -308,9 +308,9 @@ export class Tabs extends BaseComponent<TabsState> {
308
308
 
309
309
  tabButton.appendChild(document.createTextNode(tab.label));
310
310
 
311
- tabButton.addEventListener('click', () => {
311
+ tabButton.addEventListener('click', (e) => {
312
312
  this.state.activeTab = tab.id;
313
- this._triggerCallback('tabChange', tab.id);
313
+ this._triggerCallback('tabChange', tab.id, e, this);
314
314
  });
315
315
 
316
316
  tabList.appendChild(tabButton);
@@ -0,0 +1,59 @@
1
+ export type DType = 'string' | 'number' | 'boolean' | 'date' | 'null';
2
+ export interface Series {
3
+ name: string;
4
+ dtype: DType;
5
+ values: any[];
6
+ }
7
+ export declare class DataFrame {
8
+ private _columns;
9
+ private _height;
10
+ constructor(data?: Record<string, any[]> | Array<Record<string, any>>);
11
+ private _fromRows;
12
+ private _fromColumns;
13
+ private _inferDtype;
14
+ get height(): number;
15
+ get width(): number;
16
+ get columns(): string[];
17
+ get dtypes(): Record<string, DType>;
18
+ get shape(): [number, number];
19
+ select(...cols: string[]): DataFrame;
20
+ drop(...cols: string[]): DataFrame;
21
+ col(name: string): any[];
22
+ row(index: number): Record<string, any>;
23
+ head(n?: number): DataFrame;
24
+ tail(n?: number): DataFrame;
25
+ slice(start: number, end?: number): DataFrame;
26
+ private _sliceRows;
27
+ filter(predicate: (row: Record<string, any>, index: number) => boolean): DataFrame;
28
+ where(col: string, op: '==' | '!=' | '>' | '<' | '>=' | '<=' | 'contains' | 'startsWith' | 'endsWith', value: any): DataFrame;
29
+ private _takeIndices;
30
+ sort(col: string, descending?: boolean): DataFrame;
31
+ groupBy(col: string): GroupedDataFrame;
32
+ sum(col: string): number;
33
+ mean(col: string): number;
34
+ min(col: string): number;
35
+ max(col: string): number;
36
+ count(): number;
37
+ unique(col: string): any[];
38
+ nunique(col: string): number;
39
+ private _numericValues;
40
+ withColumn(name: string, fn: (row: Record<string, any>, index: number) => any): DataFrame;
41
+ rename(mapping: Record<string, string>): DataFrame;
42
+ cast(col: string, dtype: DType): DataFrame;
43
+ private _castValue;
44
+ join(other: DataFrame, on: string, how?: 'inner' | 'left'): DataFrame;
45
+ describe(): Record<string, any>;
46
+ toRows(): Record<string, any>[];
47
+ toColumns(): Record<string, any[]>;
48
+ toCSV(delimiter?: string): string;
49
+ toString(): string;
50
+ }
51
+ export declare class GroupedDataFrame {
52
+ private _groups;
53
+ private _groupCol;
54
+ constructor(df: DataFrame, col: string);
55
+ agg(aggregations: Record<string, 'sum' | 'mean' | 'min' | 'max' | 'count' | 'first' | 'last'>): DataFrame;
56
+ count(): DataFrame;
57
+ get groups(): Map<any, DataFrame>;
58
+ }
59
+ //# sourceMappingURL=DataFrame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataFrame.d.ts","sourceRoot":"","sources":["DataFrame.ts"],"names":[],"mappings":"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"}