@fusion.dev/helix-core 0.144.0 → 0.145.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.
@@ -827,6 +827,17 @@ export declare class HelixBeforeSplitEvent extends CustomEvent<ChangeDetail> {
827
827
  static readonly eventName = "helix-before-split";
828
828
  constructor(detail: ChangeDetail);
829
829
  }
830
+ /**
831
+ * The divider between a sandbox's panes settled somewhere new.
832
+ *
833
+ * The notification half of `helix-before-split`, sent once `split` has moved,
834
+ * with the lead pane's new share. Not cancelable: the decision was the
835
+ * request's.
836
+ */
837
+ export declare class HelixSplitEvent extends CustomEvent<ChangeDetail> {
838
+ static readonly eventName = "helix-split";
839
+ constructor(detail: ChangeDetail);
840
+ }
830
841
  /**
831
842
  * A sandbox's panel is about to change height, and can be refused.
832
843
  *
@@ -839,6 +850,17 @@ export declare class HelixBeforePanelResizeEvent extends CustomEvent<ChangeDetai
839
850
  static readonly eventName = "helix-before-panel-resize";
840
851
  constructor(detail: ChangeDetail);
841
852
  }
853
+ /**
854
+ * A sandbox's panel settled at a new height.
855
+ *
856
+ * The notification half of `helix-before-panel-resize`, sent once `panelSize`
857
+ * has moved, with the height in pixels. Not cancelable: the decision was the
858
+ * request's.
859
+ */
860
+ export declare class HelixPanelResizeEvent extends CustomEvent<ChangeDetail> {
861
+ static readonly eventName = "helix-panel-resize";
862
+ constructor(detail: ChangeDetail);
863
+ }
842
864
  /** A pane is about to collapse or reopen, and can be refused. */
843
865
  export declare class HelixBeforeCollapseEvent extends CustomEvent<ChangeDetail> {
844
866
  static readonly eventName = "helix-before-collapse";
@@ -860,6 +882,17 @@ export declare class HelixBeforeEditEvent extends CustomEvent<ChangeDetail> {
860
882
  static readonly eventName = "helix-before-edit";
861
883
  constructor(detail: ChangeDetail);
862
884
  }
885
+ /**
886
+ * Source was edited.
887
+ *
888
+ * The notification half of `helix-before-edit`, sent once the pane holds the
889
+ * new source, with that source. Not cancelable: the decision was the
890
+ * request's.
891
+ */
892
+ export declare class HelixEditEvent extends CustomEvent<ChangeDetail> {
893
+ static readonly eventName = "helix-edit";
894
+ constructor(detail: ChangeDetail);
895
+ }
863
896
  /**
864
897
  * A value is about to change, and the change can be refused.
865
898
  *
@@ -942,6 +975,145 @@ export declare class HelixCreateEvent extends CustomEvent<CreateDetail> {
942
975
  static readonly eventName = "helix-create";
943
976
  constructor(detail: CreateDetail);
944
977
  }
978
+ /** Detail carried by `helix-aura-fallback`. */
979
+ export interface AuraFallbackDetail {
980
+ /**
981
+ * Why the gradient shows: `software` for a renderer that draws on the CPU,
982
+ * `unavailable` for no WebGL or a shader the browser refused, and `lost` for
983
+ * a context the browser took back, on a GPU reset or past its limit of about
984
+ * sixteen.
985
+ */
986
+ reason: 'lost' | 'software' | 'unavailable';
987
+ }
988
+ /**
989
+ * An aura stopped drawing its shader and shows its gradient, and says why.
990
+ *
991
+ * Sent each time it falls back, from the aura, which then matches
992
+ * `:state(fallback)` until it draws again. Not cancelable: there is nothing
993
+ * left to refuse.
994
+ */
995
+ export declare class HelixAuraFallbackEvent extends CustomEvent<AuraFallbackDetail> {
996
+ static readonly eventName = "helix-aura-fallback";
997
+ constructor(detail: AuraFallbackDetail);
998
+ }
999
+ /**
1000
+ * A reader cleared the value: an input's clear button emptied the field, or a
1001
+ * clearable rating went back to unrated.
1002
+ *
1003
+ * Sent after the value is cleared, and after the `input` and `change` the
1004
+ * clear sends. Carries nothing, because the value is the cleared one.
1005
+ */
1006
+ export declare class HelixClearEvent extends Event {
1007
+ static readonly eventName = "helix-clear";
1008
+ constructor();
1009
+ }
1010
+ /**
1011
+ * A press put nothing on the clipboard: the browser did not allow the write,
1012
+ * such as on a page without the clipboard permission, or there was nothing to
1013
+ * copy.
1014
+ */
1015
+ export declare class HelixCopyErrorEvent extends Event {
1016
+ static readonly eventName = "helix-copy-error";
1017
+ constructor();
1018
+ }
1019
+ /**
1020
+ * A reader asked for more items: a feed's or a table's `load-more` button, or
1021
+ * a list scrolled near its end. Append them, and set `loading` while they are
1022
+ * on their way.
1023
+ *
1024
+ * Carries nothing, because what comes next is the consumer's to know. Not
1025
+ * cancelable: nothing is loaded until the consumer loads it.
1026
+ */
1027
+ export declare class HelixLoadMoreEvent extends Event {
1028
+ static readonly eventName = "helix-load-more";
1029
+ constructor();
1030
+ }
1031
+ /**
1032
+ * A lazy branch opened and asks for its children: a tree item with `lazy`.
1033
+ * Sent from the item, so `target` is the branch to fill.
1034
+ *
1035
+ * Carries nothing, because the children are the consumer's to fetch. Not
1036
+ * cancelable: the branch is already open, and says it is busy until children
1037
+ * arrive.
1038
+ */
1039
+ export declare class HelixLoadEvent extends Event {
1040
+ static readonly eventName = "helix-load";
1041
+ constructor();
1042
+ }
1043
+ /** Detail carried by `helix-range-change`. */
1044
+ export interface RangeDetail {
1045
+ /** The index of the first item on screen. */
1046
+ first: number;
1047
+ /** One past the index of the last item on screen. */
1048
+ last: number;
1049
+ }
1050
+ /**
1051
+ * The items on screen changed: a virtual list was scrolled or resized, or its
1052
+ * items changed. Carries the new range, which the list's `range` also holds.
1053
+ * Not cancelable: the list has already moved.
1054
+ */
1055
+ export declare class HelixRangeChangeEvent extends CustomEvent<RangeDetail> {
1056
+ static readonly eventName = "helix-range-change";
1057
+ constructor(detail: RangeDetail);
1058
+ }
1059
+ /**
1060
+ * Rows opened or closed in place: a data table's tree of rows. Carries every
1061
+ * open row's key, separated by commas, which the table's `expanded` also
1062
+ * holds. Not cancelable: the rows have already moved.
1063
+ */
1064
+ export declare class HelixExpandEvent extends CustomEvent<ChangeDetail> {
1065
+ static readonly eventName = "helix-expand";
1066
+ constructor(detail: ChangeDetail);
1067
+ }
1068
+ /**
1069
+ * A sequence played to its last entry and stopped there: a video playlist
1070
+ * with no `repeat`. Carries nothing, because the playlist still holds the last
1071
+ * entry. Not cancelable: playback has already ended.
1072
+ */
1073
+ export declare class HelixEndEvent extends Event {
1074
+ static readonly eventName = "helix-end";
1075
+ constructor();
1076
+ }
1077
+ /** Detail carried by `helix-typing`. */
1078
+ export interface TypingDetail {
1079
+ /** Whether the user is writing now, as a boolean and not a word that reads like one. */
1080
+ typing: boolean;
1081
+ }
1082
+ /**
1083
+ * The user started or stopped writing: a chat composer, for a typing
1084
+ * indicator on the other side. Carries which, as the composer's `typing` does.
1085
+ * Not cancelable: it reports what the user did.
1086
+ */
1087
+ export declare class HelixTypingEvent extends CustomEvent<TypingDetail> {
1088
+ static readonly eventName = "helix-typing";
1089
+ constructor(detail: TypingDetail);
1090
+ }
1091
+ /**
1092
+ * A reader acted on a row: Enter on a list row, or a press in a list that
1093
+ * selects nothing. Sent from the row, so `target` is the row acted on.
1094
+ *
1095
+ * Carries nothing, because the row is the whole of the answer. Not cancelable:
1096
+ * a row with a link follows it and sends nothing, so there is no default left
1097
+ * to refuse.
1098
+ */
1099
+ export declare class HelixActionEvent extends Event {
1100
+ static readonly eventName = "helix-action";
1101
+ constructor();
1102
+ }
1103
+ /**
1104
+ * A checked state changed after `helix-before-toggle` let it: a map layer
1105
+ * shown or hidden from the layers menu. Sent from what changed, with the state
1106
+ * it now holds.
1107
+ *
1108
+ * **Not the native `toggle`.** That one is a `ToggleEvent` saying a popover or
1109
+ * a `<details>` opened or closed, with `newState` of `open` or `closed`, and a
1110
+ * layer shown on a map is neither: it is the request's own verb without
1111
+ * `before`, carrying the same `checked` the request did.
1112
+ */
1113
+ export declare class HelixToggleEvent extends CustomEvent<ToggleDetail> {
1114
+ static readonly eventName = "helix-toggle";
1115
+ constructor(detail: ToggleDetail);
1116
+ }
945
1117
  /** Detail carried by `helix-copy`. */
946
1118
  export interface CopyDetail {
947
1119
  /** What was put on the clipboard. */
@@ -1319,7 +1491,9 @@ export declare class HelixHistoryEvent extends CustomEvent<Record<string, never>
1319
1491
  * forgotten.
1320
1492
  */
1321
1493
  declare const registry: {
1494
+ readonly HelixActionEvent: typeof HelixActionEvent;
1322
1495
  readonly HelixActivateEvent: typeof HelixActivateEvent;
1496
+ readonly HelixAuraFallbackEvent: typeof HelixAuraFallbackEvent;
1323
1497
  readonly HelixBeforeActivateEvent: typeof HelixBeforeActivateEvent;
1324
1498
  readonly HelixBeforeChangeEvent: typeof HelixBeforeChangeEvent;
1325
1499
  readonly HelixBeforeCloseEvent: typeof HelixBeforeCloseEvent;
@@ -1339,13 +1513,18 @@ declare const registry: {
1339
1513
  readonly HelixCanvasViewEvent: typeof HelixCanvasViewEvent;
1340
1514
  readonly HelixCanvasZoomEvent: typeof HelixCanvasZoomEvent;
1341
1515
  readonly HelixCaretEvent: typeof HelixCaretEvent;
1516
+ readonly HelixClearEvent: typeof HelixClearEvent;
1342
1517
  readonly HelixCollapseEvent: typeof HelixCollapseEvent;
1343
1518
  readonly HelixCompleteEvent: typeof HelixCompleteEvent;
1344
1519
  readonly HelixConnectEvent: typeof HelixConnectEvent;
1345
1520
  readonly HelixConsoleEvent: typeof HelixConsoleEvent;
1521
+ readonly HelixCopyErrorEvent: typeof HelixCopyErrorEvent;
1346
1522
  readonly HelixCopyEvent: typeof HelixCopyEvent;
1347
1523
  readonly HelixCreateEvent: typeof HelixCreateEvent;
1348
1524
  readonly HelixDismissEvent: typeof HelixDismissEvent;
1525
+ readonly HelixEditEvent: typeof HelixEditEvent;
1526
+ readonly HelixEndEvent: typeof HelixEndEvent;
1527
+ readonly HelixExpandEvent: typeof HelixExpandEvent;
1349
1528
  readonly HelixFacetEvent: typeof HelixFacetEvent;
1350
1529
  readonly HelixFilterEvent: typeof HelixFilterEvent;
1351
1530
  readonly HelixFilteredEvent: typeof HelixFilteredEvent;
@@ -1357,6 +1536,8 @@ declare const registry: {
1357
1536
  readonly HelixGraphSignalEvent: typeof HelixGraphSignalEvent;
1358
1537
  readonly HelixGraphZoomEvent: typeof HelixGraphZoomEvent;
1359
1538
  readonly HelixHistoryEvent: typeof HelixHistoryEvent;
1539
+ readonly HelixLoadEvent: typeof HelixLoadEvent;
1540
+ readonly HelixLoadMoreEvent: typeof HelixLoadMoreEvent;
1360
1541
  readonly HelixMapClusterEvent: typeof HelixMapClusterEvent;
1361
1542
  readonly HelixMapPanEvent: typeof HelixMapPanEvent;
1362
1543
  readonly HelixMapPartChangeEvent: typeof HelixMapPartChangeEvent;
@@ -1367,8 +1548,10 @@ declare const registry: {
1367
1548
  readonly HelixMoveEvent: typeof HelixMoveEvent;
1368
1549
  readonly HelixNavigateEvent: typeof HelixNavigateEvent;
1369
1550
  readonly HelixNextEvent: typeof HelixNextEvent;
1551
+ readonly HelixPanelResizeEvent: typeof HelixPanelResizeEvent;
1370
1552
  readonly HelixPinEvent: typeof HelixPinEvent;
1371
1553
  readonly HelixPreviousEvent: typeof HelixPreviousEvent;
1554
+ readonly HelixRangeChangeEvent: typeof HelixRangeChangeEvent;
1372
1555
  readonly HelixReadEvent: typeof HelixReadEvent;
1373
1556
  readonly HelixReconnectEvent: typeof HelixReconnectEvent;
1374
1557
  readonly HelixRejectEvent: typeof HelixRejectEvent;
@@ -1387,7 +1570,10 @@ declare const registry: {
1387
1570
  readonly HelixShortcutEvent: typeof HelixShortcutEvent;
1388
1571
  readonly HelixSortEvent: typeof HelixSortEvent;
1389
1572
  readonly HelixSortedEvent: typeof HelixSortedEvent;
1573
+ readonly HelixSplitEvent: typeof HelixSplitEvent;
1574
+ readonly HelixToggleEvent: typeof HelixToggleEvent;
1390
1575
  readonly HelixTourAskEvent: typeof HelixTourAskEvent;
1576
+ readonly HelixTypingEvent: typeof HelixTypingEvent;
1391
1577
  };
1392
1578
  /**
1393
1579
  * Every name this library dispatches.
@@ -440,6 +440,17 @@ export class HelixBeforeSplitEvent extends CustomEvent {
440
440
  });
441
441
  }
442
442
  }
443
+ export class HelixSplitEvent extends CustomEvent {
444
+ static { this.eventName = 'helix-split'; }
445
+ constructor(detail) {
446
+ super(HelixSplitEvent.eventName, {
447
+ bubbles: true,
448
+ cancelable: false,
449
+ composed: true,
450
+ detail,
451
+ });
452
+ }
453
+ }
443
454
  export class HelixBeforePanelResizeEvent extends CustomEvent {
444
455
  static { this.eventName = 'helix-before-panel-resize'; }
445
456
  constructor(detail) {
@@ -451,6 +462,17 @@ export class HelixBeforePanelResizeEvent extends CustomEvent {
451
462
  });
452
463
  }
453
464
  }
465
+ export class HelixPanelResizeEvent extends CustomEvent {
466
+ static { this.eventName = 'helix-panel-resize'; }
467
+ constructor(detail) {
468
+ super(HelixPanelResizeEvent.eventName, {
469
+ bubbles: true,
470
+ cancelable: false,
471
+ composed: true,
472
+ detail,
473
+ });
474
+ }
475
+ }
454
476
  export class HelixBeforeCollapseEvent extends CustomEvent {
455
477
  static { this.eventName = 'helix-before-collapse'; }
456
478
  constructor(detail) {
@@ -484,6 +506,17 @@ export class HelixBeforeEditEvent extends CustomEvent {
484
506
  });
485
507
  }
486
508
  }
509
+ export class HelixEditEvent extends CustomEvent {
510
+ static { this.eventName = 'helix-edit'; }
511
+ constructor(detail) {
512
+ super(HelixEditEvent.eventName, {
513
+ bubbles: true,
514
+ cancelable: false,
515
+ composed: true,
516
+ detail,
517
+ });
518
+ }
519
+ }
487
520
  export class HelixBeforeChangeEvent extends CustomEvent {
488
521
  static { this.eventName = 'helix-before-change'; }
489
522
  constructor(detail) {
@@ -517,6 +550,97 @@ export class HelixCreateEvent extends CustomEvent {
517
550
  });
518
551
  }
519
552
  }
553
+ export class HelixAuraFallbackEvent extends CustomEvent {
554
+ static { this.eventName = 'helix-aura-fallback'; }
555
+ constructor(detail) {
556
+ super(HelixAuraFallbackEvent.eventName, {
557
+ bubbles: true,
558
+ cancelable: false,
559
+ composed: true,
560
+ detail,
561
+ });
562
+ }
563
+ }
564
+ export class HelixClearEvent extends Event {
565
+ static { this.eventName = 'helix-clear'; }
566
+ constructor() {
567
+ super(HelixClearEvent.eventName, { bubbles: true, cancelable: false, composed: true });
568
+ }
569
+ }
570
+ export class HelixCopyErrorEvent extends Event {
571
+ static { this.eventName = 'helix-copy-error'; }
572
+ constructor() {
573
+ super(HelixCopyErrorEvent.eventName, { bubbles: true, cancelable: false, composed: true });
574
+ }
575
+ }
576
+ export class HelixLoadMoreEvent extends Event {
577
+ static { this.eventName = 'helix-load-more'; }
578
+ constructor() {
579
+ super(HelixLoadMoreEvent.eventName, { bubbles: true, cancelable: false, composed: true });
580
+ }
581
+ }
582
+ export class HelixLoadEvent extends Event {
583
+ static { this.eventName = 'helix-load'; }
584
+ constructor() {
585
+ super(HelixLoadEvent.eventName, { bubbles: true, cancelable: false, composed: true });
586
+ }
587
+ }
588
+ export class HelixRangeChangeEvent extends CustomEvent {
589
+ static { this.eventName = 'helix-range-change'; }
590
+ constructor(detail) {
591
+ super(HelixRangeChangeEvent.eventName, {
592
+ bubbles: true,
593
+ cancelable: false,
594
+ composed: true,
595
+ detail,
596
+ });
597
+ }
598
+ }
599
+ export class HelixExpandEvent extends CustomEvent {
600
+ static { this.eventName = 'helix-expand'; }
601
+ constructor(detail) {
602
+ super(HelixExpandEvent.eventName, {
603
+ bubbles: true,
604
+ cancelable: false,
605
+ composed: true,
606
+ detail,
607
+ });
608
+ }
609
+ }
610
+ export class HelixEndEvent extends Event {
611
+ static { this.eventName = 'helix-end'; }
612
+ constructor() {
613
+ super(HelixEndEvent.eventName, { bubbles: true, cancelable: false, composed: true });
614
+ }
615
+ }
616
+ export class HelixTypingEvent extends CustomEvent {
617
+ static { this.eventName = 'helix-typing'; }
618
+ constructor(detail) {
619
+ super(HelixTypingEvent.eventName, {
620
+ bubbles: true,
621
+ cancelable: false,
622
+ composed: true,
623
+ detail,
624
+ });
625
+ }
626
+ }
627
+ export class HelixActionEvent extends Event {
628
+ static { this.eventName = 'helix-action'; }
629
+ constructor() {
630
+ super(HelixActionEvent.eventName, { bubbles: true, cancelable: false, composed: true });
631
+ }
632
+ }
633
+ export class HelixToggleEvent extends CustomEvent {
634
+ static { this.eventName = 'helix-toggle'; }
635
+ constructor(detail) {
636
+ super(HelixToggleEvent.eventName, {
637
+ bubbles: true,
638
+ cancelable: false,
639
+ composed: true,
640
+ detail,
641
+ });
642
+ }
643
+ }
520
644
  export class HelixCopyEvent extends CustomEvent {
521
645
  static { this.eventName = 'helix-copy'; }
522
646
  constructor(detail) {
@@ -737,7 +861,9 @@ export class HelixHistoryEvent extends CustomEvent {
737
861
  }
738
862
  }
739
863
  const registry = {
864
+ HelixActionEvent,
740
865
  HelixActivateEvent,
866
+ HelixAuraFallbackEvent,
741
867
  HelixBeforeActivateEvent,
742
868
  HelixBeforeChangeEvent,
743
869
  HelixBeforeCloseEvent,
@@ -757,13 +883,18 @@ const registry = {
757
883
  HelixCanvasViewEvent,
758
884
  HelixCanvasZoomEvent,
759
885
  HelixCaretEvent,
886
+ HelixClearEvent,
760
887
  HelixCollapseEvent,
761
888
  HelixCompleteEvent,
762
889
  HelixConnectEvent,
763
890
  HelixConsoleEvent,
891
+ HelixCopyErrorEvent,
764
892
  HelixCopyEvent,
765
893
  HelixCreateEvent,
766
894
  HelixDismissEvent,
895
+ HelixEditEvent,
896
+ HelixEndEvent,
897
+ HelixExpandEvent,
767
898
  HelixFacetEvent,
768
899
  HelixFilterEvent,
769
900
  HelixFilteredEvent,
@@ -775,6 +906,8 @@ const registry = {
775
906
  HelixGraphSignalEvent,
776
907
  HelixGraphZoomEvent,
777
908
  HelixHistoryEvent,
909
+ HelixLoadEvent,
910
+ HelixLoadMoreEvent,
778
911
  HelixMapClusterEvent,
779
912
  HelixMapPanEvent,
780
913
  HelixMapPartChangeEvent,
@@ -785,8 +918,10 @@ const registry = {
785
918
  HelixMoveEvent,
786
919
  HelixNavigateEvent,
787
920
  HelixNextEvent,
921
+ HelixPanelResizeEvent,
788
922
  HelixPinEvent,
789
923
  HelixPreviousEvent,
924
+ HelixRangeChangeEvent,
790
925
  HelixReadEvent,
791
926
  HelixReconnectEvent,
792
927
  HelixRejectEvent,
@@ -805,6 +940,9 @@ const registry = {
805
940
  HelixShortcutEvent,
806
941
  HelixSortEvent,
807
942
  HelixSortedEvent,
943
+ HelixSplitEvent,
944
+ HelixToggleEvent,
808
945
  HelixTourAskEvent,
946
+ HelixTypingEvent,
809
947
  };
810
948
  export const helixEventNames = new Set(Object.values(registry).map((event) => event.eventName));
@@ -20,6 +20,11 @@ const SCROLLER = css `
20
20
  overflow: auto;
21
21
  }
22
22
  `;
23
+ const VIRTUAL = css `
24
+ [data-virtual] {
25
+ overflow-anchor: none;
26
+ }
27
+ `;
23
28
  const MIRROR = css `
24
29
  :host(:dir(rtl)) [data-mirror] {
25
30
  scale: -1 1;
@@ -112,7 +117,15 @@ export class HelixElement extends LitElement {
112
117
  }));
113
118
  }
114
119
  static finalizeStyles(styles) {
115
- return [BOX_SIZING, HIDDEN, SCROLLER, MIRROR, SETTLED, ...LitElement.finalizeStyles(styles)];
120
+ return [
121
+ BOX_SIZING,
122
+ HIDDEN,
123
+ SCROLLER,
124
+ VIRTUAL,
125
+ MIRROR,
126
+ SETTLED,
127
+ ...LitElement.finalizeStyles(styles),
128
+ ];
116
129
  }
117
130
  performUpdate() {
118
131
  if (this.hasUpdated || !measuring()) {
@@ -52,12 +52,17 @@ export declare const auditReactProps: (host: EventTarget, props: Record<string,
52
52
  * declared public API and all of them otherwise silent in React.
53
53
  *
54
54
  * The name is React's own casing, `onError` rather than `onerror`, because that
55
- * is what a consumer writes and therefore what is in the props bag. Every
56
- * native we relay is a single word, so capitalising the first letter is the
57
- * whole of the rule; a two-word name like `loadeddata` would be `onLoadedData`
58
- * and needs the list extending rather than the rule generalising.
55
+ * is what a consumer writes and therefore what is in the props bag. See
56
+ * `reactNativeProp`.
59
57
  */
60
58
  export declare const reactPropFor: (event: Event) => string | undefined;
59
+ /**
60
+ * The prop React reads for a native event: `onError` for `error`, and
61
+ * `onTimeUpdate` for `timeupdate`.
62
+ *
63
+ * The JSX typings name the same props, so a consumer writes what this binds.
64
+ */
65
+ export declare const reactNativeProp: (type: string) => string;
61
66
  export declare const bindReactHandler: (host: EventTarget, event: Event) => void;
62
67
  /**
63
68
  * Assigns the object and function properties React is holding and never applied.
@@ -76,8 +76,21 @@ export const reactPropFor = (event) => {
76
76
  if (event.bubbles || REACT_WIRES.has(event.type)) {
77
77
  return undefined;
78
78
  }
79
- return `on${event.type.charAt(0).toUpperCase()}${event.type.slice(1)}`;
79
+ return reactNativeProp(event.type);
80
80
  };
81
+ const REACT_CASING = {
82
+ canplay: 'onCanPlay',
83
+ canplaythrough: 'onCanPlayThrough',
84
+ durationchange: 'onDurationChange',
85
+ loadeddata: 'onLoadedData',
86
+ loadedmetadata: 'onLoadedMetadata',
87
+ loadstart: 'onLoadStart',
88
+ ratechange: 'onRateChange',
89
+ scrollend: 'onScrollEnd',
90
+ timeupdate: 'onTimeUpdate',
91
+ volumechange: 'onVolumeChange',
92
+ };
93
+ export const reactNativeProp = (type) => REACT_CASING[type] ?? `on${type.charAt(0).toUpperCase()}${type.slice(1)}`;
81
94
  const lowercasePropFor = (event) => event.type.includes('-') || REACT_WIRES.has(event.type) ? undefined : `on${event.type}`;
82
95
  export const bindReactHandler = (host, event) => {
83
96
  const props = reactPropsOf(host);
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export { ArrivalController, type ArrivalOptions, } from './controllers/arrival-c
3
3
  export { ChartPointerController, type ChartPointerHost, } from './controllers/chart-pointer-controller/chart-pointer-controller.js';
4
4
  export { CommandController, type CommandOptions, HelixFallbackCommandEvent, supportsInvokers, } from './controllers/command-controller/command-controller.js';
5
5
  export { CopyController, type CopyOptions, } from './controllers/copy-controller/copy-controller.js';
6
+ export { CountdownController, type CountdownOptions, } from './controllers/countdown-controller/countdown-controller.js';
6
7
  export { activeCue, adoptTrack, type Caption, CueController, captionsAmong, captionTracks, showCaption, } from './controllers/cue-controller/cue-controller.js';
7
8
  export { DelayController, type DelayOptions, } from './controllers/delay-controller/delay-controller.js';
8
9
  export { DisabledCascadeController, type DisabledCascadeOptions, } from './controllers/disabled-cascade-controller/disabled-cascade-controller.js';
@@ -14,7 +15,7 @@ export { FullscreenController } from './controllers/fullscreen-controller/fullsc
14
15
  export { HostClickController } from './controllers/host-click-controller/host-click-controller.js';
15
16
  export { IdleController } from './controllers/idle-controller/idle-controller.js';
16
17
  export { IndicatorController, type IndicatorOptions, } from './controllers/indicator-controller/indicator-controller.js';
17
- export { KeyboardNavigationController, type KeyboardNavigationOptions, type NavigableItem, Typeahead, typesCharacter, } from './controllers/keyboard-navigation-controller/keyboard-navigation-controller.js';
18
+ export { KeyboardNavigationController, type KeyboardNavigationOptions, type KeyboardOrigin, type NavigableItem, Typeahead, typesCharacter, } from './controllers/keyboard-navigation-controller/keyboard-navigation-controller.js';
18
19
  export { MediaSessionController, type SessionHandlers, SKIP_SECONDS, } from './controllers/media-session-controller/media-session-controller.js';
19
20
  export { animationsSettled, type OpenPhase, OpenPhaseController, type OpenPhaseOptions, } from './controllers/open-phase-controller/open-phase-controller.js';
20
21
  export { MAX_FRAME_STEP, PaintGateController, type PaintGateOptions, } from './controllers/paint-gate-controller/paint-gate-controller.js';
@@ -27,7 +28,7 @@ export { SwipeController, type SwipeOptions, } from './controllers/swipe-control
27
28
  export { type TokenColor, TokenColorController, } from './controllers/token-color-controller/token-color-controller.js';
28
29
  export { type Rendered, VirtualizeController, type VirtualizeOptions, type Window as VirtualizeWindow, } from './controllers/virtualize-controller/virtualize-controller.js';
29
30
  export { eventsForTag, registerElementEvents } from './events/element-events.js';
30
- export { type CanvasView, type CaretDetail, type ChangeDetail, type CompleteDetail, type ConnectDetail, type ConsoleDetail, type CopyDetail, type CreateDetail, type DismissDetail, type FacetDetail, type FilterDetail, type GraphFilterDetail, type GraphLayoutDetail, type GraphPartChangeDetail, type GraphSignalDetail, HelixActivateEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPinEvent, HelixPreviousEvent, HelixReadEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixTourAskEvent, type MapClusterDetail, type MapPanDetail, type MapPartChangeDetail, type MapRotateDetail, type MapTiltDetail, type MapZoomDetail, type MoveDetail, type NavigateDetail, type OpenDetail, type ReadDetail, type ReconnectDetail, type Refusal, type RefusedFile, type RejectDetail, type RelabelDetail, type RemoveDetail, type ResizeDetail, type ScrolledDetail, type SelectDetail, type SendDetail, type ShortcutDetail, type SkipDetail, type SortDetail, type ToggleDetail, type ViewportPanDetail, type ViewportZoomDetail, } from './events/events.js';
31
+ export { type AuraFallbackDetail, type CanvasView, type CaretDetail, type ChangeDetail, type CompleteDetail, type ConnectDetail, type ConsoleDetail, type CopyDetail, type CreateDetail, type DismissDetail, type FacetDetail, type FilterDetail, type GraphFilterDetail, type GraphLayoutDetail, type GraphPartChangeDetail, type GraphSignalDetail, HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPinEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixToggleEvent, HelixTourAskEvent, HelixTypingEvent, type MapClusterDetail, type MapPanDetail, type MapPartChangeDetail, type MapRotateDetail, type MapTiltDetail, type MapZoomDetail, type MoveDetail, type NavigateDetail, type OpenDetail, type RangeDetail, type ReadDetail, type ReconnectDetail, type Refusal, type RefusedFile, type RejectDetail, type RelabelDetail, type RemoveDetail, type ResizeDetail, type ScrolledDetail, type SelectDetail, type SendDetail, type ShortcutDetail, type SkipDetail, type SortDetail, type ToggleDetail, type TypingDetail, type ViewportPanDetail, type ViewportZoomDetail, } from './events/events.js';
31
32
  export { HelixElement, whenHydrated } from './helix-element/helix-element.js';
32
33
  export { HelixFormElement } from './helix-form-element/helix-form-element.js';
33
34
  export { MixinChartSource, type MixinChartSourceInterface, PALETTE, PLOT_HEIGHT, PLOT_WIDTH, seriesIndex, seriesNames, } from './mixins/mixin-chart-source/mixin-chart-source.js';
@@ -77,6 +78,7 @@ export { copiesOf, type MediaCopy, sameCopies, } from './utils/media-copy/media-
77
78
  export { formatNumber, parseNumber } from './utils/number-format/number-format.js';
78
79
  export { onUnlessFalse } from './utils/on-unless-false/on-unless-false.js';
79
80
  export { appleTouch, onApple, type Platform } from './utils/platform/platform.js';
81
+ export { rangeAdd } from './utils/range-add/range-add.js';
80
82
  export { type ColorBytes, readColor, rgbOf } from './utils/read-color/read-color.js';
81
83
  export { byRow, type Row, type RowCell, readRows, readSeries, type Series, type SeriesPoint, seriesKey, unbroken, } from './utils/read-series/read-series.js';
82
84
  export { type ElementsProperty, linkDescription, reflectElements, unlinkDescription, } from './utils/reflect-elements/reflect-elements.js';
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ export { ArrivalController, } from './controllers/arrival-controller/arrival-con
3
3
  export { ChartPointerController, } from './controllers/chart-pointer-controller/chart-pointer-controller.js';
4
4
  export { CommandController, HelixFallbackCommandEvent, supportsInvokers, } from './controllers/command-controller/command-controller.js';
5
5
  export { CopyController, } from './controllers/copy-controller/copy-controller.js';
6
+ export { CountdownController, } from './controllers/countdown-controller/countdown-controller.js';
6
7
  export { activeCue, adoptTrack, CueController, captionsAmong, captionTracks, showCaption, } from './controllers/cue-controller/cue-controller.js';
7
8
  export { DelayController, } from './controllers/delay-controller/delay-controller.js';
8
9
  export { DisabledCascadeController, } from './controllers/disabled-cascade-controller/disabled-cascade-controller.js';
@@ -27,7 +28,7 @@ export { SwipeController, } from './controllers/swipe-controller/swipe-controlle
27
28
  export { TokenColorController, } from './controllers/token-color-controller/token-color-controller.js';
28
29
  export { VirtualizeController, } from './controllers/virtualize-controller/virtualize-controller.js';
29
30
  export { eventsForTag, registerElementEvents } from './events/element-events.js';
30
- export { HelixActivateEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPinEvent, HelixPreviousEvent, HelixReadEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixTourAskEvent, } from './events/events.js';
31
+ export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPinEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixToggleEvent, HelixTourAskEvent, HelixTypingEvent, } from './events/events.js';
31
32
  export { HelixElement, whenHydrated } from './helix-element/helix-element.js';
32
33
  export { HelixFormElement } from './helix-form-element/helix-form-element.js';
33
34
  export { MixinChartSource, PALETTE, PLOT_HEIGHT, PLOT_WIDTH, seriesIndex, seriesNames, } from './mixins/mixin-chart-source/mixin-chart-source.js';
@@ -77,6 +78,7 @@ export { copiesOf, sameCopies, } from './utils/media-copy/media-copy.js';
77
78
  export { formatNumber, parseNumber } from './utils/number-format/number-format.js';
78
79
  export { onUnlessFalse } from './utils/on-unless-false/on-unless-false.js';
79
80
  export { appleTouch, onApple } from './utils/platform/platform.js';
81
+ export { rangeAdd } from './utils/range-add/range-add.js';
80
82
  export { readColor, rgbOf } from './utils/read-color/read-color.js';
81
83
  export { byRow, readRows, readSeries, seriesKey, unbroken, } from './utils/read-series/read-series.js';
82
84
  export { linkDescription, reflectElements, unlinkDescription, } from './utils/reflect-elements/reflect-elements.js';
@@ -10,16 +10,17 @@ export interface DrawIconOptions {
10
10
  /**
11
11
  * Draws an icon that was imported by name, rather than looked up by string.
12
12
  *
13
- * **`<helix-icon name="play">` indexes the whole icon set at runtime.** Its
14
- * render is `icons[this.name]`, and no bundler can shake a dynamic index, so
15
- * every consumer of any component that renders one ships all of the generated
16
- * path data: measured at 50,814 bytes raw and 15,010 gzipped for 102 icons, and
13
+ * **`<helix-icon name="play">` looks its glyph up in a registry at runtime.**
14
+ * The registry holds the whole set once `@fusion.dev/helix-headless/icon`
15
+ * registers it, and no bundler can shake a lookup by string, so every consumer
16
+ * of any component that renders one ships all of the generated path data: measured at 50,814 bytes raw and 15,010 gzipped for 102 icons, and
17
17
  * growing about 147 gzipped bytes per icon added. A named import ships one path
18
18
  * and is checked when the package compiles rather than by a name lookup later.
19
19
  *
20
20
  * That element still earns its place as *public* API, where a consumer writes a
21
- * name in markup and a lookup is the only thing that can work. What it should
22
- * not be is how this library draws its own marks.
21
+ * name in markup and a lookup is the only thing that can work, and
22
+ * `@fusion.dev/helix-headless/icon/root` names glyphs without registering the
23
+ * set. What it should not be is how this library draws its own marks.
23
24
  *
24
25
  * **There is no `part` option, and there cannot be.** A part name behind an
25
26
  * interpolation is a part the manifest cannot see, so the component's own
@@ -0,0 +1,19 @@
1
+ /**
2
+ * What a range adds to a selection of many, as arithmetic over the items on
3
+ * show.
4
+ *
5
+ * Pure and in core, because Listbox (Shift with Home or End) and Data Table
6
+ * (Shift with an arrow, Home or End, over rows) take in a range the same way,
7
+ * and a spec can hold it without a page.
8
+ */
9
+ /**
10
+ * The selection after Shift with Home or End: every option shown from the
11
+ * highlight to the end the key went to, added after what was selected, or
12
+ * `null` where nothing new is taken in.
13
+ *
14
+ * `from` is where the highlight was, as an index into `shown`, or `-1` for no
15
+ * highlight, which takes in the end alone. `to` is the end the key went to.
16
+ * APG's multiple-selection listbox, and the same rule over a data table's
17
+ * rows.
18
+ */
19
+ export declare const rangeAdd: (values: readonly string[], shown: readonly string[], from: number, to: number) => string[] | null;
@@ -0,0 +1,5 @@
1
+ export const rangeAdd = (values, shown, from, to) => {
2
+ const [start, end] = from < 0 ? [to, to] : [Math.min(from, to), Math.max(from, to)];
3
+ const added = shown.slice(start, end + 1).filter((value) => !values.includes(value));
4
+ return added.length > 0 ? [...values, ...added] : null;
5
+ };