@lvce-editor/renderer-process 23.6.0 → 24.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.
@@ -180,328 +180,18 @@ const downloadFile = (fileName, url) => {
180
180
  a.click();
181
181
  };
182
182
 
183
- const instances = Object.create(null);
184
- const get$1$1 = viewletId => {
185
- return instances[viewletId];
183
+ const uidSymbol = Symbol('uid');
184
+ const getUidTarget = $Element => {
185
+ while ($Element) {
186
+ if ($Element[uidSymbol]) {
187
+ return $Element;
188
+ }
189
+ $Element = $Element.parentNode;
190
+ }
191
+ return undefined;
186
192
  };
187
- const set$1$1 = (viewletId, instance) => {
188
- instances[viewletId] = instance;
189
- };
190
- const Audio$2 = 'audio';
191
- const Button$2 = 'button';
192
- const Col$2 = 'col';
193
- const ColGroup$2 = 'colgroup';
194
- const Del$2 = 'del';
195
- const Div$2 = 'div';
196
- const H1$2 = 'h1';
197
- const H2$2 = 'h2';
198
- const H3$2 = 'h3';
199
- const H4$2 = 'h4';
200
- const H5$2 = 'h5';
201
- const H6$2 = 'h6';
202
- const I$2 = 'i';
203
- const Img$2 = 'img';
204
- const Input$2 = 'input';
205
- const Ins$2 = 'ins';
206
- const Kbd$2 = 'kbd';
207
- const Span$2 = 'span';
208
- const Table$2 = 'table';
209
- const TBody$2 = 'tbody';
210
- const Td$2 = 'td';
211
- const Th$2 = 'th';
212
- const THead$2 = 'thead';
213
- const Tr$2 = 'tr';
214
- const Article$2 = 'article';
215
- const Aside$2 = 'aside';
216
- const Footer$2 = 'footer';
217
- const Header$2 = 'header';
218
- const Nav$2 = 'nav';
219
- const Section$2 = 'section';
220
- const Search$2 = 'search';
221
- const Dd$2 = 'dd';
222
- const Dl$2 = 'dl';
223
- const Figcaption$2 = 'figcaption';
224
- const Figure$2 = 'figure';
225
- const Hr$2 = 'hr';
226
- const Li$2 = 'li';
227
- const Ol$2 = 'ol';
228
- const P$2 = 'p';
229
- const Pre$2 = 'pre';
230
- const A$2 = 'a';
231
- const Br$2 = 'br';
232
- const Cite$2 = 'cite';
233
- const Data$2 = 'data';
234
- const Time$2 = 'time';
235
- const Tfoot$2 = 'tfoot';
236
- const Ul$2 = 'ul';
237
- const Video$2 = 'video';
238
- const TextArea$2 = 'textarea';
239
- const Select$2 = 'select';
240
- const Option$2 = 'option';
241
- const Code$2 = 'code';
242
- const Label$2 = 'label';
243
- const Dt$2 = 'dt';
244
- const Iframe$1 = 'iframe';
245
- const Em$1 = 'em';
246
- const Strong$1 = 'strong';
247
- const Style$1 = 'style';
248
- const Html$1 = 'html';
249
- const Head$1 = 'head';
250
- const Title$1 = 'title';
251
- const Meta$1 = 'meta';
252
- const Canvas$1 = 'canvas';
253
- const Form$1 = 'form';
254
- const Quote$1$1 = 'quote';
255
- const BlockQuote$1 = 'blockquote';
256
- const Audio$1$1 = 0;
257
- const Button$1 = 1;
258
- const Col$1 = 2;
259
- const ColGroup$1 = 3;
260
- const Div$1 = 4;
261
- const H1$1 = 5;
262
- const Input$1 = 6;
263
- const Kbd$1 = 7;
264
- const Span$1 = 8;
265
- const Table$1 = 9;
266
- const TBody$1 = 10;
267
- const Td$1 = 11;
268
- const Text$1$1 = 12;
269
- const Th$1 = 13;
270
- const THead$1 = 14;
271
- const Tr$1 = 15;
272
- const I$1 = 16;
273
- const Img$1 = 17;
274
- const Ins$1 = 20;
275
- const Del$1 = 21;
276
- const H2$1 = 22;
277
- const H3$1 = 23;
278
- const H4$1 = 24;
279
- const H5$1 = 25;
280
- const H6$1 = 26;
281
- const Article$1 = 27;
282
- const Aside$1 = 28;
283
- const Footer$1 = 29;
284
- const Header$1 = 30;
285
- const Nav$1 = 40;
286
- const Section$1 = 41;
287
- const Search$1 = 42;
288
- const Dd$1 = 43;
289
- const Dl$1 = 44;
290
- const Figcaption$1 = 45;
291
- const Figure$1 = 46;
292
- const Hr$1 = 47;
293
- const Li$1 = 48;
294
- const Ol$1 = 49;
295
- const P$1 = 50;
296
- const Pre$1 = 51;
297
- const A$1 = 53;
298
- const Br$1 = 55;
299
- const Cite$1 = 56;
300
- const Data$1 = 57;
301
- const Time$1 = 58;
302
- const Tfoot$1 = 59;
303
- const Ul$1 = 60;
304
- const Video$1 = 61;
305
- const TextArea$1 = 62;
306
- const Select$1 = 63;
307
- const Option$1 = 64;
308
- const Code$1 = 65;
309
- const Label$1 = 66;
310
- const Dt$1 = 67;
311
- const Iframe = 68;
312
- const Strong = 70;
313
- const Em = 71;
314
- const Style = 72;
315
- const Html = 73;
316
- const Head = 74;
317
- const Title = 75;
318
- const Meta = 76;
319
- const Canvas = 77;
320
- const Form = 78;
321
- const BlockQuote = 79;
322
- const Quote$2 = 80;
323
- const Reference$1 = 100;
324
- const VirtualDomElements$1 = {
325
- __proto__: null,
326
- Reference: Reference$1,
327
- Text: Text$1$1};
328
- const getElementTag$1 = type => {
329
- switch (type) {
330
- case A$1:
331
- return A$2;
332
- case Article$1:
333
- return Article$2;
334
- case Aside$1:
335
- return Aside$2;
336
- case Audio$1$1:
337
- return Audio$2;
338
- case BlockQuote:
339
- return BlockQuote$1;
340
- case Br$1:
341
- return Br$2;
342
- case Button$1:
343
- return Button$2;
344
- case Canvas:
345
- return Canvas$1;
346
- case Cite$1:
347
- return Cite$2;
348
- case Code$1:
349
- return Code$2;
350
- case Col$1:
351
- return Col$2;
352
- case ColGroup$1:
353
- return ColGroup$2;
354
- case Data$1:
355
- return Data$2;
356
- case Dd$1:
357
- return Dd$2;
358
- case Del$1:
359
- return Del$2;
360
- case Div$1:
361
- return Div$2;
362
- case Dl$1:
363
- return Dl$2;
364
- case Dt$1:
365
- return Dt$2;
366
- case Em:
367
- return Em$1;
368
- case Figcaption$1:
369
- return Figcaption$2;
370
- case Figure$1:
371
- return Figure$2;
372
- case Footer$1:
373
- return Footer$2;
374
- case Form:
375
- return Form$1;
376
- case H1$1:
377
- return H1$2;
378
- case H2$1:
379
- return H2$2;
380
- case H3$1:
381
- return H3$2;
382
- case H4$1:
383
- return H4$2;
384
- case H5$1:
385
- return H5$2;
386
- case H6$1:
387
- return H6$2;
388
- case Head:
389
- return Head$1;
390
- case Header$1:
391
- return Header$2;
392
- case Hr$1:
393
- return Hr$2;
394
- case Html:
395
- return Html$1;
396
- case I$1:
397
- return I$2;
398
- case Iframe:
399
- return Iframe$1;
400
- case Img$1:
401
- return Img$2;
402
- case Input$1:
403
- return Input$2;
404
- case Ins$1:
405
- return Ins$2;
406
- case Kbd$1:
407
- return Kbd$2;
408
- case Label$1:
409
- return Label$2;
410
- case Li$1:
411
- return Li$2;
412
- case Meta:
413
- return Meta$1;
414
- case Nav$1:
415
- return Nav$2;
416
- case Ol$1:
417
- return Ol$2;
418
- case Option$1:
419
- return Option$2;
420
- case P$1:
421
- return P$2;
422
- case Pre$1:
423
- return Pre$2;
424
- case Quote$2:
425
- return Quote$1$1;
426
- case Search$1:
427
- return Search$2;
428
- case Section$1:
429
- return Section$2;
430
- case Select$1:
431
- return Select$2;
432
- case Span$1:
433
- return Span$2;
434
- case Strong:
435
- return Strong$1;
436
- case Style:
437
- return Style$1;
438
- case Table$1:
439
- return Table$2;
440
- case TBody$1:
441
- return TBody$2;
442
- case Td$1:
443
- return Td$2;
444
- case TextArea$1:
445
- return TextArea$2;
446
- case Tfoot$1:
447
- return Tfoot$2;
448
- case Th$1:
449
- return Th$2;
450
- case THead$1:
451
- return THead$2;
452
- case Time$1:
453
- return Time$2;
454
- case Title:
455
- return Title$1;
456
- case Tr$1:
457
- return Tr$2;
458
- case Ul$1:
459
- return Ul$2;
460
- case Video$1:
461
- return Video$2;
462
- default:
463
- throw new Error(`element tag not found ${type}`);
464
- }
465
- };
466
- const ElementTagMap = {
467
- __proto__: null,
468
- getElementTag: getElementTag$1
469
- };
470
- const {
471
- getElementTag
472
- } = ElementTagMap;
473
- const getEventListenerOptions$1 = (eventName, value) => {
474
- if (value.passive) {
475
- return {
476
- passive: true
477
- };
478
- }
479
- if (value.capture) {
480
- return {
481
- capture: true
482
- };
483
- }
484
- switch (eventName) {
485
- case 'wheel':
486
- return {
487
- passive: true
488
- };
489
- default:
490
- return undefined;
491
- }
492
- };
493
- const uidSymbol = Symbol('uid');
494
- const getUidTarget = $Element => {
495
- while ($Element) {
496
- if ($Element[uidSymbol]) {
497
- return $Element;
498
- }
499
- $Element = $Element.parentNode;
500
- }
501
- return undefined;
502
- };
503
- const setComponentUid = ($Element, uid) => {
504
- $Element[uidSymbol] = uid;
193
+ const setComponentUid = ($Element, uid) => {
194
+ $Element[uidSymbol] = uid;
505
195
  };
506
196
  const getComponentUid = $Element => {
507
197
  const $Target = getUidTarget($Element);
@@ -517,605 +207,954 @@ const getComponentUidFromEvent = event => {
517
207
  } = event;
518
208
  return getComponentUid(currentTarget || target);
519
209
  };
520
- const state$1$1 = {
521
- ipc: undefined
210
+ const dragInfos = Object.create(null);
211
+ const setDragInfo = (id, data) => {
212
+ dragInfos[id] = data;
522
213
  };
523
- const getIpc = () => {
524
- return state$1$1.ipc;
214
+ const getDragInfo = id => {
215
+ return dragInfos[id];
525
216
  };
526
- const setIpc = value => {
527
- state$1$1.ipc = value;
217
+ const isDragInfoOld = data => {
218
+ return Array.isArray(data);
528
219
  };
529
- const cache$1 = new Map();
530
- const has$1 = listener => {
531
- return cache$1.has(listener);
220
+ const setDragImage = (dataTransfer, label) => {
221
+ const dragImage = document.createElement('div');
222
+ dragImage.className = 'DragImage';
223
+ dragImage.textContent = label;
224
+ document.body.append(dragImage);
225
+ dataTransfer.setDragImage(dragImage, -10, -10);
226
+ const handleTimeOut = () => {
227
+ dragImage.remove();
228
+ };
229
+ setTimeout(handleTimeOut, 0);
532
230
  };
533
- const set$8 = (listener, value) => {
534
- cache$1.set(listener, value);
231
+ const applyDragInfoMaybe = event => {
232
+ const {
233
+ dataTransfer,
234
+ target
235
+ } = event;
236
+ if (dataTransfer) {
237
+ const uid = getComponentUid(target);
238
+ const dragInfo = getDragInfo(uid);
239
+ if (!dragInfo) {
240
+ return;
241
+ }
242
+ if (isDragInfoOld(dragInfo)) {
243
+ for (const item of dragInfo) {
244
+ dataTransfer.setData(item.type, item.data);
245
+ }
246
+ } else {
247
+ for (const item of dragInfo.items) {
248
+ dataTransfer.items.add(item.data, item.type);
249
+ }
250
+ if (dragInfo.label) {
251
+ setDragImage(dataTransfer, dragInfo.label);
252
+ }
253
+ }
254
+ }
535
255
  };
536
- const get$9 = listener => {
537
- return cache$1.get(listener);
256
+ const PointerMove$1 = 'pointermove';
257
+ const lostpointercapture = 'lostpointercapture';
258
+ let ignore = false;
259
+ const startIgnore = () => {
260
+ ignore = true;
538
261
  };
539
- const nameAnonymousFunction$1 = (fn, name) => {
540
- Object.defineProperty(fn, 'name', {
541
- value: name
542
- });
262
+ const stopIgnore = () => {
263
+ ignore = false;
543
264
  };
544
- const getWrappedListener$1 = (listener, returnValue) => {
545
- if (!returnValue) {
546
- return listener;
547
- }
548
- if (!has$1(listener)) {
549
- const wrapped = event => {
550
- const uid = getComponentUidFromEvent(event);
551
- const result = listener(event);
552
- // TODO check for empty array by value
553
- if (result.length === 0) {
554
- return;
555
- }
556
- const ipc = getIpc();
557
- ipc.send('Viewlet.executeViewletCommand', uid, ...result);
558
- };
559
- nameAnonymousFunction$1(wrapped, listener.name);
560
- set$8(listener, wrapped);
561
- }
562
- return get$9(listener);
265
+ const enabled = () => {
266
+ return ignore;
563
267
  };
564
- const attachedListeners = new WeakMap();
565
- const getOptions = fn => {
566
- if (fn.passive) {
567
- return {
568
- passive: true
569
- };
570
- }
571
- if (fn.capture) {
572
- return {
573
- capture: true
574
- };
575
- }
576
- return undefined;
268
+ let id$1 = 0;
269
+ const create$N = () => {
270
+ return ++id$1;
577
271
  };
578
- const attachEvent$1 = ($Node, eventMap, key, value, newEventMap) => {
579
- const keyLower = key.toLowerCase();
580
- const listenersByEvent = attachedListeners.get($Node) || new Map();
581
- const previous = listenersByEvent.get(keyLower);
582
- if (previous) {
583
- $Node.removeEventListener(keyLower, previous.listener, previous.options);
584
- }
585
- if (newEventMap && newEventMap[value]) {
586
- const fn = newEventMap[value];
587
- const options = getOptions(fn);
588
- // TODO support event listener options
589
- $Node.addEventListener(keyLower, newEventMap[value], options);
590
- listenersByEvent.set(keyLower, {
591
- listener: newEventMap[value],
592
- options
593
- });
594
- attachedListeners.set($Node, listenersByEvent);
595
- return;
596
- }
597
- const listener = eventMap[value];
598
- if (!listener) {
599
- console.warn('listener not found', value);
600
- return;
601
- }
602
- const options = getEventListenerOptions$1(key, value);
603
- const wrapped = getWrappedListener$1(listener, eventMap.returnValue);
604
- $Node.addEventListener(keyLower, wrapped, options);
605
- listenersByEvent.set(keyLower, {
606
- listener: wrapped,
607
- options
608
- });
609
- attachedListeners.set($Node, listenersByEvent);
272
+ const state$1$1 = Object.create(null);
273
+ const acquire$1 = id => {
274
+ const promise = state$1$1[id];
275
+ delete state$1$1[id];
276
+ return promise;
610
277
  };
611
- const STYLE_REGEX = /([^:;]+):\s*([^;]+)/g;
612
- const KEBAB_CASE_REGEX = /-([a-z])/g;
613
- const setStyle = ($Element, styleString) => {
614
- if (typeof styleString !== 'string') {
615
- return;
616
- }
617
- let match;
618
- while ((match = STYLE_REGEX.exec(styleString)) !== null) {
619
- const key = match[1].trim();
620
- const value = match[2].trim();
621
- // Convert kebab-case to camelCase for CSS properties with dashes
622
- const camelCaseKey = key.replaceAll(KEBAB_CASE_REGEX, (_, char) => char.toUpperCase());
623
- $Element.style[camelCaseKey] = value;
624
- }
278
+ const getFileHandles$1 = async ids => {
279
+ const promises = ids.map(acquire$1);
280
+ const handles = await Promise.all(promises);
281
+ return handles;
625
282
  };
626
- const setProp = ($Element, key, value, eventMap, newEventMap) => {
627
- switch (key) {
628
- case 'ariaActivedescendant':
629
- if (value) {
630
- $Element.setAttribute('aria-activedescendant', value);
631
- } else {
632
- $Element.removeAttribute('aria-activedescendant');
633
- }
634
- break;
635
- case 'ariaControls':
636
- $Element.setAttribute('aria-controls', value);
637
- break;
638
- case 'ariaLabelledBy':
639
- $Element.setAttribute('aria-labelledby', value);
640
- break;
641
- case 'ariaOwns':
642
- // TODO remove this once idl is supported
643
- if (value) {
644
- $Element.setAttribute('aria-owns', value);
645
- } else {
646
- $Element.removeAttribute('aria-owns');
647
- }
648
- break;
649
- case 'childCount':
650
- case 'type':
651
- break;
652
- case 'height':
653
- case 'width':
654
- if ($Element instanceof HTMLImageElement) {
655
- $Element[key] = value;
656
- } else if (typeof value === 'number') {
657
- $Element.style[key] = `${value}px`;
658
- } else {
659
- $Element.style[key] = value;
660
- }
661
- break;
662
- case 'id':
663
- if (value) {
664
- $Element[key] = value;
665
- } else {
666
- $Element.removeAttribute(key);
283
+ const add$1 = promise => {
284
+ const id = create$N();
285
+ state$1$1[id] = promise;
286
+ return id;
287
+ };
288
+ const addFileHandle$1 = fileHandle => {
289
+ const promise = Promise.resolve(fileHandle);
290
+ return add$1(promise);
291
+ };
292
+ const unwrapItemString = async item => {
293
+ const {
294
+ resolve,
295
+ promise
296
+ } = Promise.withResolvers();
297
+ item.getAsString(resolve);
298
+ const value = await promise;
299
+ return {
300
+ kind: 'string',
301
+ type: item.type,
302
+ value
303
+ };
304
+ };
305
+ const unwrapItemFile = async item => {
306
+ // @ts-ignore
307
+ const file = await item.getAsFileSystemHandle();
308
+ return {
309
+ kind: 'file',
310
+ type: item.type,
311
+ value: file
312
+ };
313
+ };
314
+ const unknownItem = {
315
+ kind: 'unknown',
316
+ type: '',
317
+ value: ''
318
+ };
319
+ const unwrapItem = item => {
320
+ switch (item.kind) {
321
+ case 'file':
322
+ return unwrapItemFile(item);
323
+ case 'string':
324
+ return unwrapItemString(item);
325
+ default:
326
+ return unknownItem;
327
+ }
328
+ };
329
+ const handleDataTransferFiles = event => {
330
+ if (!event.dataTransfer) {
331
+ return [];
332
+ }
333
+ const items = [...event.dataTransfer.items];
334
+ const promises = items.map(unwrapItem);
335
+ const ids = promises.map(promise => add$1(promise));
336
+ return ids;
337
+ };
338
+ const getEventListenerArg = (param, event) => {
339
+ switch (param) {
340
+ case 'event.altKey':
341
+ return event.altKey;
342
+ case 'event.button':
343
+ return event.button;
344
+ case 'event.clientX':
345
+ return event.clientX;
346
+ case 'event.clientY':
347
+ return event.clientY;
348
+ case 'event.ctrlKey':
349
+ return event.ctrlKey;
350
+ case 'event.data':
351
+ return event.data;
352
+ case 'event.dataTransfer.files':
353
+ return event.dataTransfer.files;
354
+ case 'event.dataTransfer.files2':
355
+ return handleDataTransferFiles(event);
356
+ case 'event.defaultPrevented':
357
+ return event.defaultPrevented;
358
+ case 'event.deltaMode':
359
+ return event.deltaMode;
360
+ case 'event.deltaX':
361
+ return event.deltaX;
362
+ case 'event.deltaY':
363
+ return event.deltaY;
364
+ case 'event.detail':
365
+ return event.detail;
366
+ case 'event.inputType':
367
+ return event.inputType;
368
+ case 'event.isTrusted':
369
+ return event.isTrusted;
370
+ case 'event.key':
371
+ return event.key;
372
+ case 'event.shiftKey':
373
+ return event.shiftKey;
374
+ case 'event.target.checked':
375
+ return event.target.checked;
376
+ case 'event.target.className':
377
+ return event.target.className;
378
+ case 'event.target.href':
379
+ return event.target.href;
380
+ case 'event.target.name':
381
+ return event.target.name || '';
382
+ case 'event.target.nodeName':
383
+ return event.target.nodeName;
384
+ case 'event.target.scrollTop':
385
+ return event.target.scrollTop;
386
+ case 'event.target.selectionEnd':
387
+ return event.target.selectionEnd;
388
+ case 'event.target.selectionStart':
389
+ return event.target.selectionStart;
390
+ case 'event.target.src':
391
+ return event.target.src;
392
+ case 'event.target.value':
393
+ return event.target.value;
394
+ case 'event.x':
395
+ return event.x;
396
+ case 'event.y':
397
+ return event.y;
398
+ default:
399
+ if (typeof param === 'string' && param.startsWith('event.currentTarget.')) {
400
+ const rest = param.slice('event.currentTarget.'.length);
401
+ const parts = rest.split('.');
402
+ let current = event.currentTarget;
403
+ for (const part of parts) {
404
+ current = current[part];
405
+ }
406
+ return current;
667
407
  }
668
- break;
669
- case 'inputType':
670
- // @ts-ignore
671
- $Element.type = value;
672
- break;
673
- case 'left':
674
- case 'marginTop':
675
- case 'paddingLeft':
676
- case 'paddingRight':
677
- case 'top':
678
- $Element.style[key] = typeof value === 'number' ? `${value}px` : value;
679
- break;
680
- case 'maskImage':
681
- $Element.style.maskImage = `url('${value}')`;
682
- $Element.style.webkitMaskImage = `url('${value}')`;
683
- break;
684
- case 'onBlur':
685
- case 'onChange':
686
- case 'onClick':
687
- case 'onContextMenu':
688
- case 'onDblClick':
689
- case 'onDragEnd':
690
- case 'onDragEnter':
691
- case 'onDragLeave':
692
- case 'onDragOver':
693
- case 'onDragStart':
694
- case 'onDrop':
695
- case 'onFocus':
696
- case 'onFocusIn':
697
- case 'onFocusOut':
698
- case 'onInput':
699
- case 'onKeydown':
700
- case 'onKeyDown':
701
- case 'onKeyUp':
702
- case 'onMouseDown':
703
- case 'onMouseMove':
704
- case 'onMouseOut':
705
- case 'onMouseOver':
706
- case 'onMouseUp':
707
- case 'onPointerDown':
708
- case 'onPointerMove':
709
- case 'onPointerOut':
710
- case 'onPointerOver':
711
- case 'onScroll':
712
- case 'onSelectionChange':
713
- case 'onSubmit':
714
- case 'onWheel':
715
- const eventName = key.slice(2).toLowerCase();
716
- if (!eventMap || !value) {
717
- return;
408
+ if (typeof param === 'string' && param.startsWith('event.target.dataset')) {
409
+ const rest = param.slice('event.target.dataset.'.length);
410
+ return event.target.dataset[rest];
718
411
  }
719
- attachEvent$1($Element, eventMap, eventName, value, newEventMap);
720
- break;
721
- case 'style':
722
- setStyle($Element, value);
723
- break;
724
- case 'translate':
725
- $Element.style[key] = value;
726
- break;
412
+ return param;
413
+ }
414
+ };
415
+ const getEventListenerArgs = (params, event) => {
416
+ const serialized = [];
417
+ for (const param of params) {
418
+ serialized.push(getEventListenerArg(param, event));
419
+ }
420
+ return serialized;
421
+ };
422
+ const state$8 = {
423
+ ipc: undefined
424
+ };
425
+ const getIpc = () => {
426
+ return state$8.ipc;
427
+ };
428
+ const setIpc = value => {
429
+ state$8.ipc = value;
430
+ };
431
+ const nameAnonymousFunction$1 = (fn, name) => {
432
+ Object.defineProperty(fn, 'name', {
433
+ value: name
434
+ });
435
+ };
436
+ const isInputElement = element => {
437
+ return element instanceof HTMLInputElement;
438
+ };
439
+ const preventEventsMaybe = (info, event) => {
440
+ if (info.preventDefault === 2) {
441
+ if (!isInputElement(event.target)) {
442
+ event.preventDefault();
443
+ }
444
+ } else if (info.preventDefault) {
445
+ event.preventDefault();
446
+ }
447
+ if (info.stopPropagation) {
448
+ event.stopPropagation();
449
+ }
450
+ };
451
+ const applyPointerTrackMaybe = (info, map, event) => {
452
+ const {
453
+ trackPointerEvents
454
+ } = info;
455
+ if (!trackPointerEvents) {
456
+ return;
457
+ }
458
+ const {
459
+ pointerId,
460
+ target
461
+ } = event;
462
+ target.setPointerCapture(pointerId);
463
+ const [pointerMoveKey, pointerUpKey] = trackPointerEvents;
464
+ target.addEventListener(PointerMove$1, map[pointerMoveKey]);
465
+ target.addEventListener(lostpointercapture, map[pointerUpKey]);
466
+ };
467
+ const createFn = (info, map) => {
468
+ const fn = event => {
469
+ if (enabled()) {
470
+ return;
471
+ }
472
+ const uid = getComponentUidFromEvent(event);
473
+ const args = getEventListenerArgs(info.params, event);
474
+ preventEventsMaybe(info, event);
475
+ applyDragInfoMaybe(event);
476
+ applyPointerTrackMaybe(info, map, event);
477
+ if (args.length === 0) {
478
+ return;
479
+ }
480
+ const ipc = getIpc();
481
+ ipc.send('Viewlet.executeViewletCommand', uid, ...args);
482
+ };
483
+ nameAnonymousFunction$1(fn, info.name);
484
+ if (info.passive) {
485
+ // TODO avoid mutating function property, maybe return an object with function and options
486
+ fn.passive = true;
487
+ }
488
+ if (info.capture) {
489
+ // TODO avoid mutating function property, maybe return an object with function and options
490
+ fn.capture = true;
491
+ }
492
+ return fn;
493
+ };
494
+ const listeners = Object.create(null);
495
+ const registerEventListeners = (id, eventListeners) => {
496
+ const map = Object.create(null);
497
+ for (const info of eventListeners) {
498
+ const fn = createFn(info, map);
499
+ map[info.name] = fn;
500
+ }
501
+ listeners[id] = map;
502
+ };
503
+ const getEventListenerMap = id => {
504
+ const map = listeners[id];
505
+ return map;
506
+ };
507
+ const clearNode = $Node => {
508
+ $Node.textContent = '';
509
+ };
510
+ const Audio$2 = 'audio';
511
+ const Button$2 = 'button';
512
+ const Col$2 = 'col';
513
+ const ColGroup$2 = 'colgroup';
514
+ const Del$2 = 'del';
515
+ const Div$2 = 'div';
516
+ const H1$2 = 'h1';
517
+ const H2$2 = 'h2';
518
+ const H3$2 = 'h3';
519
+ const H4$2 = 'h4';
520
+ const H5$2 = 'h5';
521
+ const H6$2 = 'h6';
522
+ const I$2 = 'i';
523
+ const Img$2 = 'img';
524
+ const Input$2 = 'input';
525
+ const Ins$2 = 'ins';
526
+ const Kbd$2 = 'kbd';
527
+ const Span$2 = 'span';
528
+ const Table$2 = 'table';
529
+ const TBody$2 = 'tbody';
530
+ const Td$2 = 'td';
531
+ const Th$2 = 'th';
532
+ const THead$2 = 'thead';
533
+ const Tr$2 = 'tr';
534
+ const Article$2 = 'article';
535
+ const Aside$2 = 'aside';
536
+ const Footer$2 = 'footer';
537
+ const Header$2 = 'header';
538
+ const Nav$2 = 'nav';
539
+ const Section$2 = 'section';
540
+ const Search$2 = 'search';
541
+ const Dd$2 = 'dd';
542
+ const Dl$2 = 'dl';
543
+ const Figcaption$2 = 'figcaption';
544
+ const Figure$2 = 'figure';
545
+ const Hr$2 = 'hr';
546
+ const Li$2 = 'li';
547
+ const Ol$2 = 'ol';
548
+ const P$2 = 'p';
549
+ const Pre$2 = 'pre';
550
+ const A$2 = 'a';
551
+ const Br$2 = 'br';
552
+ const Cite$2 = 'cite';
553
+ const Data$2 = 'data';
554
+ const Time$2 = 'time';
555
+ const Tfoot$2 = 'tfoot';
556
+ const Ul$2 = 'ul';
557
+ const Video$2 = 'video';
558
+ const TextArea$2 = 'textarea';
559
+ const Select$2 = 'select';
560
+ const Option$2 = 'option';
561
+ const Code$2 = 'code';
562
+ const Label$2 = 'label';
563
+ const Dt$2 = 'dt';
564
+ const Iframe$1 = 'iframe';
565
+ const Em$1 = 'em';
566
+ const Strong$1 = 'strong';
567
+ const Style$1 = 'style';
568
+ const Html$1 = 'html';
569
+ const Head$1 = 'head';
570
+ const Title$1 = 'title';
571
+ const Meta$1 = 'meta';
572
+ const Canvas$1 = 'canvas';
573
+ const Form$1 = 'form';
574
+ const Quote$1$1 = 'quote';
575
+ const BlockQuote$1 = 'blockquote';
576
+ const Audio$1$1 = 0;
577
+ const Button$1 = 1;
578
+ const Col$1 = 2;
579
+ const ColGroup$1 = 3;
580
+ const Div$1 = 4;
581
+ const H1$1 = 5;
582
+ const Input$1 = 6;
583
+ const Kbd$1 = 7;
584
+ const Span$1 = 8;
585
+ const Table$1 = 9;
586
+ const TBody$1 = 10;
587
+ const Td$1 = 11;
588
+ const Text$1$1 = 12;
589
+ const Th$1 = 13;
590
+ const THead$1 = 14;
591
+ const Tr$1 = 15;
592
+ const I$1 = 16;
593
+ const Img$1 = 17;
594
+ const Ins$1 = 20;
595
+ const Del$1 = 21;
596
+ const H2$1 = 22;
597
+ const H3$1 = 23;
598
+ const H4$1 = 24;
599
+ const H5$1 = 25;
600
+ const H6$1 = 26;
601
+ const Article$1 = 27;
602
+ const Aside$1 = 28;
603
+ const Footer$1 = 29;
604
+ const Header$1 = 30;
605
+ const Nav$1 = 40;
606
+ const Section$1 = 41;
607
+ const Search$1 = 42;
608
+ const Dd$1 = 43;
609
+ const Dl$1 = 44;
610
+ const Figcaption$1 = 45;
611
+ const Figure$1 = 46;
612
+ const Hr$1 = 47;
613
+ const Li$1 = 48;
614
+ const Ol$1 = 49;
615
+ const P$1 = 50;
616
+ const Pre$1 = 51;
617
+ const A$1 = 53;
618
+ const Br$1 = 55;
619
+ const Cite$1 = 56;
620
+ const Data$1 = 57;
621
+ const Time$1 = 58;
622
+ const Tfoot$1 = 59;
623
+ const Ul$1 = 60;
624
+ const Video$1 = 61;
625
+ const TextArea$1 = 62;
626
+ const Select$1 = 63;
627
+ const Option$1 = 64;
628
+ const Code$1 = 65;
629
+ const Label$1 = 66;
630
+ const Dt$1 = 67;
631
+ const Iframe = 68;
632
+ const Strong = 70;
633
+ const Em = 71;
634
+ const Style = 72;
635
+ const Html = 73;
636
+ const Head = 74;
637
+ const Title = 75;
638
+ const Meta = 76;
639
+ const Canvas = 77;
640
+ const Form = 78;
641
+ const BlockQuote = 79;
642
+ const Quote$2 = 80;
643
+ const Reference$1 = 100;
644
+ const VirtualDomElements$1 = {
645
+ __proto__: null,
646
+ Reference: Reference$1,
647
+ Text: Text$1$1};
648
+ const getElementTag$1 = type => {
649
+ switch (type) {
650
+ case A$1:
651
+ return A$2;
652
+ case Article$1:
653
+ return Article$2;
654
+ case Aside$1:
655
+ return Aside$2;
656
+ case Audio$1$1:
657
+ return Audio$2;
658
+ case BlockQuote:
659
+ return BlockQuote$1;
660
+ case Br$1:
661
+ return Br$2;
662
+ case Button$1:
663
+ return Button$2;
664
+ case Canvas:
665
+ return Canvas$1;
666
+ case Cite$1:
667
+ return Cite$2;
668
+ case Code$1:
669
+ return Code$2;
670
+ case Col$1:
671
+ return Col$2;
672
+ case ColGroup$1:
673
+ return ColGroup$2;
674
+ case Data$1:
675
+ return Data$2;
676
+ case Dd$1:
677
+ return Dd$2;
678
+ case Del$1:
679
+ return Del$2;
680
+ case Div$1:
681
+ return Div$2;
682
+ case Dl$1:
683
+ return Dl$2;
684
+ case Dt$1:
685
+ return Dt$2;
686
+ case Em:
687
+ return Em$1;
688
+ case Figcaption$1:
689
+ return Figcaption$2;
690
+ case Figure$1:
691
+ return Figure$2;
692
+ case Footer$1:
693
+ return Footer$2;
694
+ case Form:
695
+ return Form$1;
696
+ case H1$1:
697
+ return H1$2;
698
+ case H2$1:
699
+ return H2$2;
700
+ case H3$1:
701
+ return H3$2;
702
+ case H4$1:
703
+ return H4$2;
704
+ case H5$1:
705
+ return H5$2;
706
+ case H6$1:
707
+ return H6$2;
708
+ case Head:
709
+ return Head$1;
710
+ case Header$1:
711
+ return Header$2;
712
+ case Hr$1:
713
+ return Hr$2;
714
+ case Html:
715
+ return Html$1;
716
+ case I$1:
717
+ return I$2;
718
+ case Iframe:
719
+ return Iframe$1;
720
+ case Img$1:
721
+ return Img$2;
722
+ case Input$1:
723
+ return Input$2;
724
+ case Ins$1:
725
+ return Ins$2;
726
+ case Kbd$1:
727
+ return Kbd$2;
728
+ case Label$1:
729
+ return Label$2;
730
+ case Li$1:
731
+ return Li$2;
732
+ case Meta:
733
+ return Meta$1;
734
+ case Nav$1:
735
+ return Nav$2;
736
+ case Ol$1:
737
+ return Ol$2;
738
+ case Option$1:
739
+ return Option$2;
740
+ case P$1:
741
+ return P$2;
742
+ case Pre$1:
743
+ return Pre$2;
744
+ case Quote$2:
745
+ return Quote$1$1;
746
+ case Search$1:
747
+ return Search$2;
748
+ case Section$1:
749
+ return Section$2;
750
+ case Select$1:
751
+ return Select$2;
752
+ case Span$1:
753
+ return Span$2;
754
+ case Strong:
755
+ return Strong$1;
756
+ case Style:
757
+ return Style$1;
758
+ case Table$1:
759
+ return Table$2;
760
+ case TBody$1:
761
+ return TBody$2;
762
+ case Td$1:
763
+ return Td$2;
764
+ case TextArea$1:
765
+ return TextArea$2;
766
+ case Tfoot$1:
767
+ return Tfoot$2;
768
+ case Th$1:
769
+ return Th$2;
770
+ case THead$1:
771
+ return THead$2;
772
+ case Time$1:
773
+ return Time$2;
774
+ case Title:
775
+ return Title$1;
776
+ case Tr$1:
777
+ return Tr$2;
778
+ case Ul$1:
779
+ return Ul$2;
780
+ case Video$1:
781
+ return Video$2;
727
782
  default:
728
- if (key.startsWith('data-')) {
729
- $Element.dataset[key.slice('data-'.length)] = value;
730
- } else {
731
- $Element[key] = value;
732
- }
783
+ throw new Error(`element tag not found ${type}`);
733
784
  }
734
785
  };
735
- const setProps = ($Element, props, eventMap, newEventMap) => {
736
- for (const key in props) {
737
- setProp($Element, key, props[key], eventMap, newEventMap);
738
- }
786
+ const ElementTagMap = {
787
+ __proto__: null,
788
+ getElementTag: getElementTag$1
739
789
  };
740
790
  const {
741
- Text: Text$2,
742
- Reference} = VirtualDomElements$1;
743
- const renderDomTextNode = element => {
744
- return document.createTextNode(element.text);
745
- };
746
- const renderDomElement = (element, eventMap, newEventMap) => {
747
- const tag = getElementTag(element.type);
748
- const $Element = document.createElement(tag);
749
- setProps($Element, element, eventMap, newEventMap);
750
- return $Element;
751
- };
752
- const renderReferenceNode = element => {
753
- const instance = get$1$1(element.uid);
754
- if (!instance || !instance.state) {
755
- return document.createTextNode('Reference node not found');
756
- }
757
- const $Node = instance.state.$Viewlet;
758
- return $Node;
759
- };
760
- const render$1 = (element, eventMap, newEventMap) => {
761
- switch (element.type) {
762
- case Reference:
763
- return renderReferenceNode(element);
764
- case Text$2:
765
- return renderDomTextNode(element);
766
- default:
767
- return renderDomElement(element, eventMap, newEventMap);
768
- }
769
- };
770
- const renderInternal = ($Parent, elements, eventMap, newEventMap) => {
771
- const max = elements.length - 1;
772
- let stack = [];
773
- for (let i = max; i >= 0; i--) {
774
- const element = elements[i];
775
- const $Element = render$1(element, eventMap, newEventMap);
776
- if (element.childCount > 0) {
777
- // @ts-expect-error
778
- $Element.append(...stack.slice(0, element.childCount));
779
- stack = stack.slice(element.childCount);
780
- }
781
- stack.unshift($Element);
782
- }
783
- $Parent.append(...stack);
784
- };
785
-
786
- // Map of property names to attribute names for cases where they differ
787
- const propertyToAttribute = {
788
- className: 'class',
789
- htmlFor: 'for',
790
- ariaActivedescendant: 'aria-activedescendant',
791
- ariaControls: 'aria-controls',
792
- ariaLabelledBy: 'aria-labelledby',
793
- ariaOwns: 'aria-owns',
794
- inputType: 'type'
795
- };
796
-
797
- // Style properties that need to be set on element.style
798
- const styleProperties = new Set(['width', 'height', 'top', 'left', 'marginTop', 'paddingLeft', 'paddingRight']);
799
- const removeAttribute = ($Element, key) => {
800
- // Handle style properties
801
- if (styleProperties.has(key)) {
802
- // @ts-ignore - dynamic style property access
803
- $Element.style[key] = '';
804
- return;
805
- }
806
- const attributeName = propertyToAttribute[key] || key;
807
- $Element.removeAttribute(attributeName);
808
- };
809
- const setText$3 = ($Element, value) => {
810
- $Element.nodeValue = value;
811
- };
812
- const removeChild = ($Element, index) => {
813
- const $Child = $Element.childNodes[index];
814
- if ($Child) {
815
- $Child.remove();
816
- }
817
- };
818
- const add$1 = ($Element, nodes, eventMap = {}) => {
819
- renderInternal($Element, nodes, eventMap, eventMap);
820
- };
821
- const replace = ($Element, nodes, eventMap = {}) => {
822
- // Create a temporary container to render the new nodes
823
- const $Temp = document.createElement('div');
824
- renderInternal($Temp, nodes, eventMap, eventMap);
825
- // Replace the current element with the new node(s)
826
- const $NewNode = $Temp.firstChild;
827
- if (!$NewNode) {
828
- // No node was created, just remove the old element
829
- $Element.remove();
830
- return $Element;
831
- }
832
- $Element.replaceWith($NewNode);
833
- return $NewNode;
834
- };
835
- const SetText = 1;
836
- const Replace = 2;
837
- const SetAttribute = 3;
838
- const RemoveAttribute = 4;
839
- const Add = 6;
840
- const NavigateChild = 7;
841
- const NavigateParent = 8;
842
- const RemoveChild = 9;
843
- const NavigateSibling = 10;
844
- const SetReferenceNodeUid = 11;
845
- const dragInfos = Object.create(null);
846
- const setDragInfo = (id, data) => {
847
- dragInfos[id] = data;
848
- };
849
- const getDragInfo = id => {
850
- return dragInfos[id];
851
- };
852
- const isDragInfoOld = data => {
853
- return Array.isArray(data);
854
- };
855
- const setDragImage = (dataTransfer, label) => {
856
- const dragImage = document.createElement('div');
857
- dragImage.className = 'DragImage';
858
- dragImage.textContent = label;
859
- document.body.append(dragImage);
860
- dataTransfer.setDragImage(dragImage, -10, -10);
861
- const handleTimeOut = () => {
862
- dragImage.remove();
863
- };
864
- setTimeout(handleTimeOut, 0);
865
- };
866
- const applyDragInfoMaybe = event => {
867
- const {
868
- dataTransfer,
869
- target
870
- } = event;
871
- if (dataTransfer) {
872
- const uid = getComponentUid(target);
873
- const dragInfo = getDragInfo(uid);
874
- if (!dragInfo) {
875
- return;
876
- }
877
- if (isDragInfoOld(dragInfo)) {
878
- for (const item of dragInfo) {
879
- dataTransfer.setData(item.type, item.data);
880
- }
881
- } else {
882
- for (const item of dragInfo.items) {
883
- dataTransfer.items.add(item.data, item.type);
884
- }
885
- if (dragInfo.label) {
886
- setDragImage(dataTransfer, dragInfo.label);
887
- }
888
- }
889
- }
890
- };
891
- const PointerMove$1 = 'pointermove';
892
- const lostpointercapture = 'lostpointercapture';
893
- let ignore = false;
894
- const startIgnore = () => {
895
- ignore = true;
896
- };
897
- const stopIgnore = () => {
898
- ignore = false;
899
- };
900
- const enabled = () => {
901
- return ignore;
902
- };
903
- let id$1 = 0;
904
- const create$N = () => {
905
- return ++id$1;
791
+ getElementTag
792
+ } = ElementTagMap;
793
+ const instances = Object.create(null);
794
+ const get$1$1 = viewletId => {
795
+ return instances[viewletId];
906
796
  };
907
- const state$8 = Object.create(null);
908
- const acquire$1 = id => {
909
- const promise = state$8[id];
910
- delete state$8[id];
911
- return promise;
797
+ const set$1$1 = (viewletId, instance) => {
798
+ instances[viewletId] = instance;
912
799
  };
913
- const getFileHandles$1 = async ids => {
914
- const promises = ids.map(acquire$1);
915
- const handles = await Promise.all(promises);
916
- return handles;
800
+ const getEventListenerOptions$1 = (eventName, value) => {
801
+ if (value.passive) {
802
+ return {
803
+ passive: true
804
+ };
805
+ }
806
+ if (value.capture) {
807
+ return {
808
+ capture: true
809
+ };
810
+ }
811
+ switch (eventName) {
812
+ case 'wheel':
813
+ return {
814
+ passive: true
815
+ };
816
+ default:
817
+ return undefined;
818
+ }
917
819
  };
918
- const add = promise => {
919
- const id = create$N();
920
- state$8[id] = promise;
921
- return id;
820
+ const cache$1 = new Map();
821
+ const has$1 = listener => {
822
+ return cache$1.has(listener);
922
823
  };
923
- const addFileHandle$1 = fileHandle => {
924
- const promise = Promise.resolve(fileHandle);
925
- return add(promise);
824
+ const set$8 = (listener, value) => {
825
+ cache$1.set(listener, value);
926
826
  };
927
- const unwrapItemString = async item => {
928
- const {
929
- resolve,
930
- promise
931
- } = Promise.withResolvers();
932
- item.getAsString(resolve);
933
- const value = await promise;
934
- return {
935
- kind: 'string',
936
- type: item.type,
937
- value
938
- };
827
+ const get$9 = listener => {
828
+ return cache$1.get(listener);
939
829
  };
940
- const unwrapItemFile = async item => {
941
- // @ts-ignore
942
- const file = await item.getAsFileSystemHandle();
943
- return {
944
- kind: 'file',
945
- type: item.type,
946
- value: file
947
- };
830
+ const getWrappedListener$1 = (listener, returnValue) => {
831
+ if (!returnValue) {
832
+ return listener;
833
+ }
834
+ if (!has$1(listener)) {
835
+ const wrapped = event => {
836
+ const uid = getComponentUidFromEvent(event);
837
+ const result = listener(event);
838
+ // TODO check for empty array by value
839
+ if (result.length === 0) {
840
+ return;
841
+ }
842
+ const ipc = getIpc();
843
+ ipc.send('Viewlet.executeViewletCommand', uid, ...result);
844
+ };
845
+ nameAnonymousFunction$1(wrapped, listener.name);
846
+ set$8(listener, wrapped);
847
+ }
848
+ return get$9(listener);
948
849
  };
949
- const unknownItem = {
950
- kind: 'unknown',
951
- type: '',
952
- value: ''
850
+ const attachedListeners = new WeakMap();
851
+ const getOptions = fn => {
852
+ if (fn.passive) {
853
+ return {
854
+ passive: true
855
+ };
856
+ }
857
+ if (fn.capture) {
858
+ return {
859
+ capture: true
860
+ };
861
+ }
862
+ return undefined;
953
863
  };
954
- const unwrapItem = item => {
955
- switch (item.kind) {
956
- case 'file':
957
- return unwrapItemFile(item);
958
- case 'string':
959
- return unwrapItemString(item);
960
- default:
961
- return unknownItem;
864
+ const attachEvent$1 = ($Node, eventMap, key, value, newEventMap) => {
865
+ const keyLower = key.toLowerCase();
866
+ const listenersByEvent = attachedListeners.get($Node) || new Map();
867
+ const previous = listenersByEvent.get(keyLower);
868
+ if (previous) {
869
+ $Node.removeEventListener(keyLower, previous.listener, previous.options);
962
870
  }
871
+ if (newEventMap && newEventMap[value]) {
872
+ const fn = newEventMap[value];
873
+ const options = getOptions(fn);
874
+ // TODO support event listener options
875
+ $Node.addEventListener(keyLower, newEventMap[value], options);
876
+ listenersByEvent.set(keyLower, {
877
+ listener: newEventMap[value],
878
+ options
879
+ });
880
+ attachedListeners.set($Node, listenersByEvent);
881
+ return;
882
+ }
883
+ const listener = eventMap[value];
884
+ if (!listener) {
885
+ console.warn('listener not found', value);
886
+ return;
887
+ }
888
+ const options = getEventListenerOptions$1(key, value);
889
+ const wrapped = getWrappedListener$1(listener, eventMap.returnValue);
890
+ $Node.addEventListener(keyLower, wrapped, options);
891
+ listenersByEvent.set(keyLower, {
892
+ listener: wrapped,
893
+ options
894
+ });
895
+ attachedListeners.set($Node, listenersByEvent);
963
896
  };
964
- const handleDataTransferFiles = event => {
965
- if (!event.dataTransfer) {
966
- return [];
897
+ const STYLE_REGEX = /([^:;]+):\s*([^;]+)/g;
898
+ const KEBAB_CASE_REGEX = /-([a-z])/g;
899
+ const setStyle = ($Element, styleString) => {
900
+ if (typeof styleString !== 'string') {
901
+ return;
902
+ }
903
+ let match;
904
+ while ((match = STYLE_REGEX.exec(styleString)) !== null) {
905
+ const key = match[1].trim();
906
+ const value = match[2].trim();
907
+ // Convert kebab-case to camelCase for CSS properties with dashes
908
+ const camelCaseKey = key.replaceAll(KEBAB_CASE_REGEX, (_, char) => char.toUpperCase());
909
+ $Element.style[camelCaseKey] = value;
967
910
  }
968
- const items = [...event.dataTransfer.items];
969
- const promises = items.map(unwrapItem);
970
- const ids = promises.map(promise => add(promise));
971
- return ids;
972
911
  };
973
- const getEventListenerArg = (param, event) => {
974
- switch (param) {
975
- case 'event.altKey':
976
- return event.altKey;
977
- case 'event.button':
978
- return event.button;
979
- case 'event.clientX':
980
- return event.clientX;
981
- case 'event.clientY':
982
- return event.clientY;
983
- case 'event.ctrlKey':
984
- return event.ctrlKey;
985
- case 'event.data':
986
- return event.data;
987
- case 'event.dataTransfer.files':
988
- return event.dataTransfer.files;
989
- case 'event.dataTransfer.files2':
990
- return handleDataTransferFiles(event);
991
- case 'event.defaultPrevented':
992
- return event.defaultPrevented;
993
- case 'event.deltaMode':
994
- return event.deltaMode;
995
- case 'event.deltaX':
996
- return event.deltaX;
997
- case 'event.deltaY':
998
- return event.deltaY;
999
- case 'event.detail':
1000
- return event.detail;
1001
- case 'event.inputType':
1002
- return event.inputType;
1003
- case 'event.isTrusted':
1004
- return event.isTrusted;
1005
- case 'event.key':
1006
- return event.key;
1007
- case 'event.shiftKey':
1008
- return event.shiftKey;
1009
- case 'event.target.checked':
1010
- return event.target.checked;
1011
- case 'event.target.className':
1012
- return event.target.className;
1013
- case 'event.target.href':
1014
- return event.target.href;
1015
- case 'event.target.name':
1016
- return event.target.name || '';
1017
- case 'event.target.nodeName':
1018
- return event.target.nodeName;
1019
- case 'event.target.scrollTop':
1020
- return event.target.scrollTop;
1021
- case 'event.target.selectionEnd':
1022
- return event.target.selectionEnd;
1023
- case 'event.target.selectionStart':
1024
- return event.target.selectionStart;
1025
- case 'event.target.src':
1026
- return event.target.src;
1027
- case 'event.target.value':
1028
- return event.target.value;
1029
- case 'event.x':
1030
- return event.x;
1031
- case 'event.y':
1032
- return event.y;
912
+ const setProp = ($Element, key, value, eventMap, newEventMap) => {
913
+ switch (key) {
914
+ case 'ariaActivedescendant':
915
+ if (value) {
916
+ $Element.setAttribute('aria-activedescendant', value);
917
+ } else {
918
+ $Element.removeAttribute('aria-activedescendant');
919
+ }
920
+ break;
921
+ case 'ariaControls':
922
+ $Element.setAttribute('aria-controls', value);
923
+ break;
924
+ case 'ariaLabelledBy':
925
+ $Element.setAttribute('aria-labelledby', value);
926
+ break;
927
+ case 'ariaOwns':
928
+ // TODO remove this once idl is supported
929
+ if (value) {
930
+ $Element.setAttribute('aria-owns', value);
931
+ } else {
932
+ $Element.removeAttribute('aria-owns');
933
+ }
934
+ break;
935
+ case 'childCount':
936
+ case 'type':
937
+ break;
938
+ case 'height':
939
+ case 'width':
940
+ if ($Element instanceof HTMLImageElement) {
941
+ $Element[key] = value;
942
+ } else if (typeof value === 'number') {
943
+ $Element.style[key] = `${value}px`;
944
+ } else {
945
+ $Element.style[key] = value;
946
+ }
947
+ break;
948
+ case 'id':
949
+ if (value) {
950
+ $Element[key] = value;
951
+ } else {
952
+ $Element.removeAttribute(key);
953
+ }
954
+ break;
955
+ case 'inputType':
956
+ // @ts-ignore
957
+ $Element.type = value;
958
+ break;
959
+ case 'left':
960
+ case 'marginTop':
961
+ case 'paddingLeft':
962
+ case 'paddingRight':
963
+ case 'top':
964
+ $Element.style[key] = typeof value === 'number' ? `${value}px` : value;
965
+ break;
966
+ case 'maskImage':
967
+ $Element.style.maskImage = `url('${value}')`;
968
+ $Element.style.webkitMaskImage = `url('${value}')`;
969
+ break;
970
+ case 'onBlur':
971
+ case 'onChange':
972
+ case 'onClick':
973
+ case 'onContextMenu':
974
+ case 'onDblClick':
975
+ case 'onDragEnd':
976
+ case 'onDragEnter':
977
+ case 'onDragLeave':
978
+ case 'onDragOver':
979
+ case 'onDragStart':
980
+ case 'onDrop':
981
+ case 'onFocus':
982
+ case 'onFocusIn':
983
+ case 'onFocusOut':
984
+ case 'onInput':
985
+ case 'onKeydown':
986
+ case 'onKeyDown':
987
+ case 'onKeyUp':
988
+ case 'onMouseDown':
989
+ case 'onMouseMove':
990
+ case 'onMouseOut':
991
+ case 'onMouseOver':
992
+ case 'onMouseUp':
993
+ case 'onPointerDown':
994
+ case 'onPointerMove':
995
+ case 'onPointerOut':
996
+ case 'onPointerOver':
997
+ case 'onScroll':
998
+ case 'onSelectionChange':
999
+ case 'onSubmit':
1000
+ case 'onWheel':
1001
+ const eventName = key.slice(2).toLowerCase();
1002
+ if (!eventMap || !value) {
1003
+ return;
1004
+ }
1005
+ attachEvent$1($Element, eventMap, eventName, value, newEventMap);
1006
+ break;
1007
+ case 'style':
1008
+ setStyle($Element, value);
1009
+ break;
1010
+ case 'translate':
1011
+ $Element.style[key] = value;
1012
+ break;
1033
1013
  default:
1034
- if (typeof param === 'string' && param.startsWith('event.target.dataset')) {
1035
- const rest = param.slice('event.target.dataset.'.length);
1036
- return event.target.dataset[rest];
1014
+ if (key.startsWith('data-')) {
1015
+ $Element.dataset[key.slice('data-'.length)] = value;
1016
+ } else {
1017
+ $Element[key] = value;
1037
1018
  }
1038
- return param;
1039
1019
  }
1040
1020
  };
1041
- const getEventListenerArgs = (params, event) => {
1042
- const serialized = [];
1043
- for (const param of params) {
1044
- serialized.push(getEventListenerArg(param, event));
1021
+ const setProps = ($Element, props, eventMap, newEventMap) => {
1022
+ for (const key in props) {
1023
+ setProp($Element, key, props[key], eventMap, newEventMap);
1045
1024
  }
1046
- return serialized;
1047
1025
  };
1048
- const isInputElement = element => {
1049
- return element instanceof HTMLInputElement;
1026
+ const {
1027
+ Text: Text$2,
1028
+ Reference} = VirtualDomElements$1;
1029
+ const renderDomTextNode = element => {
1030
+ return document.createTextNode(element.text);
1050
1031
  };
1051
- const preventEventsMaybe = (info, event) => {
1052
- if (info.preventDefault === 2) {
1053
- if (!isInputElement(event.target)) {
1054
- event.preventDefault();
1055
- }
1056
- } else if (info.preventDefault) {
1057
- event.preventDefault();
1058
- }
1059
- if (info.stopPropagation) {
1060
- event.stopPropagation();
1032
+ const renderDomElement = (element, eventMap, newEventMap) => {
1033
+ const tag = getElementTag(element.type);
1034
+ const $Element = document.createElement(tag);
1035
+ setProps($Element, element, eventMap, newEventMap);
1036
+ return $Element;
1037
+ };
1038
+ const renderReferenceNode = element => {
1039
+ const instance = get$1$1(element.uid);
1040
+ if (!instance || !instance.state) {
1041
+ return document.createTextNode('Reference node not found');
1061
1042
  }
1043
+ const $Node = instance.state.$Viewlet;
1044
+ return $Node;
1062
1045
  };
1063
- const applyPointerTrackMaybe = (info, map, event) => {
1064
- const {
1065
- trackPointerEvents
1066
- } = info;
1067
- if (!trackPointerEvents) {
1068
- return;
1046
+ const render$1 = (element, eventMap, newEventMap) => {
1047
+ switch (element.type) {
1048
+ case Reference:
1049
+ return renderReferenceNode(element);
1050
+ case Text$2:
1051
+ return renderDomTextNode(element);
1052
+ default:
1053
+ return renderDomElement(element, eventMap, newEventMap);
1069
1054
  }
1070
- const {
1071
- pointerId,
1072
- target
1073
- } = event;
1074
- target.setPointerCapture(pointerId);
1075
- const [pointerMoveKey, pointerUpKey] = trackPointerEvents;
1076
- target.addEventListener(PointerMove$1, map[pointerMoveKey]);
1077
- target.addEventListener(lostpointercapture, map[pointerUpKey]);
1078
1055
  };
1079
- const createFn = (info, map) => {
1080
- const fn = event => {
1081
- if (enabled()) {
1082
- return;
1083
- }
1084
- const uid = getComponentUidFromEvent(event);
1085
- const args = getEventListenerArgs(info.params, event);
1086
- preventEventsMaybe(info, event);
1087
- applyDragInfoMaybe(event);
1088
- applyPointerTrackMaybe(info, map, event);
1089
- if (args.length === 0) {
1090
- return;
1056
+ const renderInternal = ($Parent, elements, eventMap, newEventMap) => {
1057
+ const max = elements.length - 1;
1058
+ let stack = [];
1059
+ for (let i = max; i >= 0; i--) {
1060
+ const element = elements[i];
1061
+ const $Element = render$1(element, eventMap, newEventMap);
1062
+ if (element.childCount > 0) {
1063
+ // @ts-expect-error
1064
+ $Element.append(...stack.slice(0, element.childCount));
1065
+ stack = stack.slice(element.childCount);
1091
1066
  }
1092
- const ipc = getIpc();
1093
- ipc.send('Viewlet.executeViewletCommand', uid, ...args);
1094
- };
1095
- nameAnonymousFunction$1(fn, info.name);
1096
- if (info.passive) {
1097
- // TODO avoid mutating function property, maybe return an object with function and options
1098
- fn.passive = true;
1067
+ stack.unshift($Element);
1099
1068
  }
1100
- if (info.capture) {
1101
- // TODO avoid mutating function property, maybe return an object with function and options
1102
- fn.capture = true;
1069
+ $Parent.append(...stack);
1070
+ };
1071
+ const renderInto = ($Parent, dom, eventMap = {}) => {
1072
+ clearNode($Parent);
1073
+ renderInternal($Parent, dom, eventMap);
1074
+ };
1075
+
1076
+ /**
1077
+ *
1078
+ * @param {any[]} elements
1079
+ * @returns
1080
+ */
1081
+ const render = (elements, eventMap = {}, newEventMap = {}) => {
1082
+ const $Root = document.createElement('div');
1083
+ renderInternal($Root, elements, eventMap, newEventMap);
1084
+ return $Root;
1085
+ };
1086
+ const rememberFocus2 = ($Viewlet, dom, eventMap, uid = 0) => {
1087
+ if (uid) {
1088
+ const newEventMap = getEventListenerMap(uid);
1089
+ const $New = render(dom, eventMap, newEventMap).firstChild;
1090
+ setComponentUid($New, uid);
1091
+ $Viewlet.replaceWith($New);
1092
+ $Viewlet = $New;
1093
+ } else {
1094
+ renderInto($Viewlet, dom, eventMap);
1103
1095
  }
1104
- return fn;
1096
+ return $Viewlet;
1105
1097
  };
1106
- const listeners = Object.create(null);
1107
- const registerEventListeners = (id, eventListeners) => {
1108
- const map = Object.create(null);
1109
- for (const info of eventListeners) {
1110
- const fn = createFn(info, map);
1111
- map[info.name] = fn;
1098
+
1099
+ // Map of property names to attribute names for cases where they differ
1100
+ const propertyToAttribute = {
1101
+ className: 'class',
1102
+ htmlFor: 'for',
1103
+ ariaActivedescendant: 'aria-activedescendant',
1104
+ ariaControls: 'aria-controls',
1105
+ ariaLabelledBy: 'aria-labelledby',
1106
+ ariaOwns: 'aria-owns',
1107
+ inputType: 'type'
1108
+ };
1109
+
1110
+ // Style properties that need to be set on element.style
1111
+ const styleProperties = new Set(['width', 'height', 'top', 'left', 'marginTop', 'paddingLeft', 'paddingRight']);
1112
+ const removeAttribute = ($Element, key) => {
1113
+ // Handle style properties
1114
+ if (styleProperties.has(key)) {
1115
+ // @ts-ignore - dynamic style property access
1116
+ $Element.style[key] = '';
1117
+ return;
1112
1118
  }
1113
- listeners[id] = map;
1119
+ const attributeName = propertyToAttribute[key] || key;
1120
+ $Element.removeAttribute(attributeName);
1114
1121
  };
1115
- const getEventListenerMap = id => {
1116
- const map = listeners[id];
1117
- return map;
1122
+ const setText$3 = ($Element, value) => {
1123
+ $Element.nodeValue = value;
1124
+ };
1125
+ const removeChild = ($Element, index) => {
1126
+ const $Child = $Element.childNodes[index];
1127
+ if ($Child) {
1128
+ $Child.remove();
1129
+ }
1130
+ };
1131
+ const add = ($Element, nodes, eventMap = {}) => {
1132
+ renderInternal($Element, nodes, eventMap, eventMap);
1133
+ };
1134
+ const replace = ($Element, nodes, eventMap = {}) => {
1135
+ // Create a temporary container to render the new nodes
1136
+ const $Temp = document.createElement('div');
1137
+ renderInternal($Temp, nodes, eventMap, eventMap);
1138
+ // Replace the current element with the new node(s)
1139
+ const $NewNode = $Temp.firstChild;
1140
+ if (!$NewNode) {
1141
+ // No node was created, just remove the old element
1142
+ $Element.remove();
1143
+ return $Element;
1144
+ }
1145
+ $Element.replaceWith($NewNode);
1146
+ return $NewNode;
1118
1147
  };
1148
+ const SetText = 1;
1149
+ const Replace = 2;
1150
+ const SetAttribute = 3;
1151
+ const RemoveAttribute = 4;
1152
+ const Add = 6;
1153
+ const NavigateChild = 7;
1154
+ const NavigateParent = 8;
1155
+ const RemoveChild = 9;
1156
+ const NavigateSibling = 10;
1157
+ const SetReferenceNodeUid = 11;
1119
1158
  const applyPatch = ($Element, patches, eventMap = {}, id = 0) => {
1120
1159
  const events = getEventListenerMap(id) || eventMap;
1121
1160
  let $Current = $Element;
@@ -1124,7 +1163,7 @@ const applyPatch = ($Element, patches, eventMap = {}, id = 0) => {
1124
1163
  try {
1125
1164
  switch (patch.type) {
1126
1165
  case Add:
1127
- add$1($Current, patch.nodes, events);
1166
+ add($Current, patch.nodes, events);
1128
1167
  break;
1129
1168
  case NavigateChild:
1130
1169
  {
@@ -1237,24 +1276,6 @@ const getActiveElementInside = $Viewlet => {
1237
1276
  const queryInputs = $Viewlet => {
1238
1277
  return [...$Viewlet.querySelectorAll('input, textarea, select')];
1239
1278
  };
1240
- const clearNode = $Node => {
1241
- $Node.textContent = '';
1242
- };
1243
- const renderInto = ($Parent, dom, eventMap = {}) => {
1244
- clearNode($Parent);
1245
- renderInternal($Parent, dom, eventMap);
1246
- };
1247
-
1248
- /**
1249
- *
1250
- * @param {any[]} elements
1251
- * @returns
1252
- */
1253
- const render = (elements, eventMap = {}, newEventMap = {}) => {
1254
- const $Root = document.createElement('div');
1255
- renderInternal($Root, elements, eventMap, newEventMap);
1256
- return $Root;
1257
- };
1258
1279
  const focusElement = $Element => {
1259
1280
  $Element.focus({
1260
1281
  preventScroll: true
@@ -4333,7 +4354,7 @@ const setIdentifiers = identifiers => {
4333
4354
  setIdentifiers$1(identifiers);
4334
4355
  };
4335
4356
 
4336
- const rememberFocus = rememberFocus$1;
4357
+ const rememberFocus = rememberFocus2;
4337
4358
 
4338
4359
  const handleImageLoad = event => {
4339
4360
  const $ImagePreviewImage = event.target;