data-navigator 1.2.4 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -40,9 +40,37 @@ function _object_spread(target) {
40
40
  }
41
41
  return target;
42
42
  }
43
+ function ownKeys(object, enumerableOnly) {
44
+ var keys = Object.keys(object);
45
+ if (Object.getOwnPropertySymbols) {
46
+ var symbols = Object.getOwnPropertySymbols(object);
47
+ if (enumerableOnly) {
48
+ symbols = symbols.filter(function(sym) {
49
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
50
+ });
51
+ }
52
+ keys.push.apply(keys, symbols);
53
+ }
54
+ return keys;
55
+ }
56
+ function _object_spread_props(target, source) {
57
+ source = source != null ? source : {};
58
+ if (Object.getOwnPropertyDescriptors) {
59
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
60
+ } else {
61
+ ownKeys(Object(source)).forEach(function(key) {
62
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
63
+ });
64
+ }
65
+ return target;
66
+ }
43
67
  function _to_consumable_array(arr) {
44
68
  return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
45
69
  }
70
+ function _type_of(obj) {
71
+ "@swc/helpers - typeof";
72
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
73
+ }
46
74
  function _unsupported_iterable_to_array(o, minLen) {
47
75
  if (!o) return;
48
76
  if (typeof o === "string") return _array_like_to_array(o, minLen);
@@ -106,6 +134,15 @@ __export(src_exports, {
106
134
  });
107
135
  module.exports = __toCommonJS(src_exports);
108
136
  // src/consts.ts
137
+ var SemanticKeys = {
138
+ Escape: true,
139
+ Enter: true,
140
+ Backspace: true,
141
+ ArrowLeft: true,
142
+ ArrowRight: true,
143
+ ArrowUp: true,
144
+ ArrowDown: true
145
+ };
109
146
  var defaultKeyBindings = {
110
147
  ArrowLeft: "left",
111
148
  ArrowRight: "right",
@@ -116,44 +153,96 @@ var defaultKeyBindings = {
116
153
  Escape: "parent",
117
154
  Enter: "child"
118
155
  };
156
+ var TypicallyUnreservedKeys = [
157
+ "KeyW",
158
+ "KeyJ",
159
+ "LeftBracket",
160
+ "RightBracket",
161
+ "Slash",
162
+ "Backslash"
163
+ ];
164
+ var TypicallyUnreservedKeyPairs = [
165
+ [
166
+ "LeftBracket",
167
+ "RightBracket"
168
+ ],
169
+ [
170
+ "Slash",
171
+ "Backslash"
172
+ ]
173
+ ];
119
174
  var GenericFullNavigationRules = {
120
- down: {
121
- keyCode: "ArrowDown",
122
- direction: "target"
123
- },
124
175
  left: {
125
- keyCode: "ArrowLeft",
176
+ key: "ArrowLeft",
126
177
  direction: "source"
127
178
  },
128
179
  right: {
129
- keyCode: "ArrowRight",
180
+ key: "ArrowRight",
130
181
  direction: "target"
131
182
  },
132
183
  up: {
133
- keyCode: "ArrowUp",
184
+ key: "ArrowUp",
134
185
  direction: "source"
135
186
  },
136
- backward: {
137
- keyCode: "Comma",
138
- direction: "source"
187
+ down: {
188
+ key: "ArrowDown",
189
+ direction: "target"
139
190
  },
140
191
  child: {
141
- keyCode: "Enter",
192
+ key: "Enter",
142
193
  direction: "target"
143
194
  },
144
195
  parent: {
145
- keyCode: "Backspace",
196
+ key: "Backspace",
197
+ direction: "source"
198
+ },
199
+ backward: {
200
+ key: "Comma",
146
201
  direction: "source"
147
202
  },
148
203
  forward: {
149
- keyCode: "Period",
204
+ key: "Period",
205
+ direction: "target"
206
+ },
207
+ previous: {
208
+ key: "Semicolon",
209
+ direction: "source"
210
+ },
211
+ next: {
212
+ key: "Quote",
150
213
  direction: "target"
151
214
  },
152
215
  exit: {
153
- keyCode: "Escape",
216
+ key: "Escape",
217
+ direction: "target"
218
+ },
219
+ help: {
220
+ key: "KeyY",
221
+ direction: "target"
222
+ },
223
+ undo: {
224
+ key: "KeyZ",
154
225
  direction: "target"
155
226
  }
156
227
  };
228
+ var GenericFullNavigationDimensions = [
229
+ [
230
+ "left",
231
+ "right"
232
+ ],
233
+ [
234
+ "up",
235
+ "down"
236
+ ],
237
+ [
238
+ "backward",
239
+ "forward"
240
+ ],
241
+ [
242
+ "previous",
243
+ "next"
244
+ ]
245
+ ];
157
246
  var GenericLimitedNavigationRules = {
158
247
  right: {
159
248
  key: "ArrowRight",
@@ -194,7 +283,7 @@ var GenericLimitedNavigationRules = {
194
283
  };
195
284
  var NodeElementDefaults = {
196
285
  cssClass: "",
197
- dimensions: {
286
+ spatialProperties: {
198
287
  x: 0,
199
288
  y: 0,
200
289
  width: 0,
@@ -214,8 +303,8 @@ var NodeElementDefaults = {
214
303
  attributes: void 0
215
304
  },
216
305
  existingElement: {
217
- useForDimensions: false,
218
- dimensions: void 0
306
+ useForSpatialProperties: false,
307
+ spatialProperties: void 0
219
308
  }
220
309
  };
221
310
  // src/utilities.ts
@@ -228,13 +317,15 @@ var describeNode = function(d, descriptionOptions) {
228
317
  description += descriptionOptions && descriptionOptions.semanticLabel || "Data point.";
229
318
  return description;
230
319
  };
320
+ var createValidId = function(s) {
321
+ return "_" + s.replace(/[^a-zA-Z0-9_-]+/g, "_");
322
+ };
231
323
  // src/structure.ts
232
324
  var structure_default = function(options) {
233
325
  if (options.dataType === "vega-lite" || options.dataType === "vl" || options.dataType === "Vega-Lite") {
234
326
  return buildNodeStructureFromVegaLite(options);
235
327
  } else {
236
- console.warn("Apologies, we currently only have structure scaffolding for Vega-Lite, generic scaffolding coming soon!");
237
- return;
328
+ return buildStructure(options);
238
329
  }
239
330
  };
240
331
  var buildNodeStructureFromVegaLite = function(options) {
@@ -380,11 +471,11 @@ var buildNodeStructureFromVegaLite = function(options) {
380
471
  nodes[id].parent = parent;
381
472
  elementData[renderId] = {};
382
473
  elementData[renderId].renderId = renderId;
383
- elementData[renderId].dimensions = {};
384
- elementData[renderId].dimensions.x = item.bounds.x1 + o[0];
385
- elementData[renderId].dimensions.y = item.bounds.y1 + o[1];
386
- elementData[renderId].dimensions.width = item.bounds.x2 - item.bounds.x1;
387
- elementData[renderId].dimensions.height = item.bounds.y2 - item.bounds.y1;
474
+ elementData[renderId].spatialProperties = {};
475
+ elementData[renderId].spatialProperties.x = item.bounds.x1 + o[0];
476
+ elementData[renderId].spatialProperties.y = item.bounds.y1 + o[1];
477
+ elementData[renderId].spatialProperties.width = item.bounds.x2 - item.bounds.x1;
478
+ elementData[renderId].spatialProperties.height = item.bounds.y2 - item.bounds.y1;
388
479
  elementData[renderId].cssClass = "dn-vega-lite-node";
389
480
  if (item.datum) {
390
481
  Object.keys(item.datum).forEach(function(key) {
@@ -423,6 +514,583 @@ var buildNodeStructureFromVegaLite = function(options) {
423
514
  navigationRules: navigationRules
424
515
  };
425
516
  };
517
+ var addSimpleDataIDs = function(options) {
518
+ var i = 0;
519
+ var keyCounter = {};
520
+ options.data.forEach(function(d) {
521
+ var id = typeof options.idKey === "function" ? options.idKey(d) : options.idKey;
522
+ d[id] = "_" + i;
523
+ if (options.keysForIdGeneration) {
524
+ options.keysForIdGeneration.forEach(function(k) {
525
+ if (k in d) {
526
+ if (typeof d[k] === "string") {
527
+ if (!keyCounter[k]) {
528
+ keyCounter[k] = 0;
529
+ }
530
+ if (!keyCounter[d[k]]) {
531
+ keyCounter[d[k]] = 0;
532
+ }
533
+ d[id] += "_" + k + keyCounter[k] + "_" + d[k] + keyCounter[d[k]];
534
+ keyCounter[k]++;
535
+ keyCounter[d[k]]++;
536
+ } else {
537
+ if (!keyCounter[k]) {
538
+ keyCounter[k] = 0;
539
+ }
540
+ d[id] += "_" + k + keyCounter[k];
541
+ keyCounter[k]++;
542
+ }
543
+ }
544
+ });
545
+ }
546
+ i++;
547
+ });
548
+ };
549
+ var buildNodes = function(options) {
550
+ var nodes = {};
551
+ options.data.forEach(function(d) {
552
+ if (!options.idKey) {
553
+ console.error("Building nodes. A key string must be supplied in options.idKey to specify the id keys of every node.");
554
+ }
555
+ var idKey = typeof options.idKey === "function" ? options.idKey(d) : options.idKey;
556
+ var id = d[idKey];
557
+ if (!id) {
558
+ console.error("Building nodes. Each datum in options.data must contain an id. When matching the id key string ".concat(idKey, ", this datum has no id: ").concat(JSON.stringify(d), "."));
559
+ return;
560
+ }
561
+ if (!nodes[id]) {
562
+ var renderIdKey = typeof options.renderIdKey === "function" ? options.renderIdKey(d) : options.renderIdKey;
563
+ nodes[id] = {
564
+ id: id,
565
+ edges: [],
566
+ renderId: renderIdKey ? d[renderIdKey] || "" : d.renderIdKey || "",
567
+ data: d
568
+ };
569
+ } else {
570
+ console.error("Building nodes. Each id for data in options.data must be unique. This id is not unique: ".concat(id, "."));
571
+ return;
572
+ }
573
+ });
574
+ return nodes;
575
+ };
576
+ var scaffoldDimensions = function(options, nodes) {
577
+ var _options_dimensions_parentOptions, _options_dimensions;
578
+ var dimensions = {};
579
+ if ((_options_dimensions = options.dimensions) === null || _options_dimensions === void 0 ? void 0 : (_options_dimensions_parentOptions = _options_dimensions.parentOptions) === null || _options_dimensions_parentOptions === void 0 ? void 0 : _options_dimensions_parentOptions.addLevel0) {
580
+ var level0 = options.dimensions.parentOptions.addLevel0;
581
+ nodes[level0.id] = _object_spread_props(_object_spread({}, level0), {
582
+ dimensionLevel: 0
583
+ });
584
+ }
585
+ var rules = _to_consumable_array(GenericFullNavigationDimensions);
586
+ var setExtents = function(val, dim) {
587
+ var min = dim.numericalExtents[0];
588
+ var max = dim.numericalExtents[1];
589
+ dim.numericalExtents[0] = min < val ? min : val;
590
+ dim.numericalExtents[1] = max > val ? max : val;
591
+ };
592
+ options.data.forEach(function(d) {
593
+ var ods = options.dimensions.values || [];
594
+ var i = 0;
595
+ ods.forEach(function(dim) {
596
+ if (!dim.dimensionKey) {
597
+ console.error("Building nodes, parsing dimensions. Each dimension in options.dimensions must contain a dimensionKey. This dimension has no key: ".concat(JSON.stringify(dim), "."));
598
+ return;
599
+ }
600
+ if (dim.dimensionKey in d) {
601
+ var _dim_operations;
602
+ var value = d[dim.dimensionKey];
603
+ var keepValue = typeof ((_dim_operations = dim.operations) === null || _dim_operations === void 0 ? void 0 : _dim_operations.filterFunction) === "function" ? dim.operations.filterFunction(d, dim) : true;
604
+ if (value !== void 0 && keepValue) {
605
+ if (!dim.type) {
606
+ dim.type = (typeof value === "undefined" ? "undefined" : _type_of(value)) === "bigint" || typeof value === "number" ? "numerical" : "categorical";
607
+ }
608
+ if (!dimensions[dim.dimensionKey]) {
609
+ var _dim_operations1;
610
+ var id2 = typeof dim.nodeId === "function" ? dim.nodeId(dim, options.data) : dim.nodeId || createValidId(dim.dimensionKey);
611
+ var renderId = typeof dim.renderId === "function" ? dim.renderId(dim, options.data) : dim.renderId || id2;
612
+ dimensions[dim.dimensionKey] = {
613
+ dimensionKey: dim.dimensionKey,
614
+ nodeId: id2,
615
+ divisions: {},
616
+ numericalExtents: [
617
+ Infinity,
618
+ -Infinity
619
+ ],
620
+ type: dim.type,
621
+ sortFunction: ((_dim_operations1 = dim.operations) === null || _dim_operations1 === void 0 ? void 0 : _dim_operations1.sortFunction) || void 0,
622
+ behavior: dim.behavior || {
623
+ extents: "circular"
624
+ },
625
+ navigationRules: dim.navigationRules || {
626
+ sibling_sibling: rules.length ? _to_consumable_array(rules.shift()) : [
627
+ "previous_" + dim.dimensionKey,
628
+ "next_" + dim.dimensionKey
629
+ ],
630
+ parent_child: [
631
+ "parent_" + dim.dimensionKey,
632
+ "child"
633
+ ]
634
+ }
635
+ };
636
+ nodes[id2] = {
637
+ id: id2,
638
+ renderId: renderId,
639
+ derivedNode: dim.dimensionKey,
640
+ edges: [],
641
+ dimensionLevel: 1,
642
+ data: dimensions[dim.dimensionKey],
643
+ renderingStrategy: dim.renderingStrategy || "singleSquare"
644
+ };
645
+ }
646
+ var dimension = dimensions[dim.dimensionKey];
647
+ var targetDivision = null;
648
+ if (dim.type === "categorical") {
649
+ var _dim_divisionOptions;
650
+ var divisionId = typeof ((_dim_divisionOptions = dim.divisionOptions) === null || _dim_divisionOptions === void 0 ? void 0 : _dim_divisionOptions.divisionNodeIds) === "function" ? dim.divisionOptions.divisionNodeIds(dim.dimensionKey, value, i) : createValidId(dimension.nodeId + "_" + value);
651
+ targetDivision = dimension.divisions[divisionId];
652
+ if (!targetDivision) {
653
+ var _dim_divisionOptions1, _dim_divisionOptions2, _dim_divisionOptions3;
654
+ targetDivision = dimension.divisions[divisionId] = {
655
+ id: divisionId,
656
+ sortFunction: ((_dim_divisionOptions1 = dim.divisionOptions) === null || _dim_divisionOptions1 === void 0 ? void 0 : _dim_divisionOptions1.sortFunction) || void 0,
657
+ values: {}
658
+ };
659
+ var divisionRenderId = typeof ((_dim_divisionOptions2 = dim.divisionOptions) === null || _dim_divisionOptions2 === void 0 ? void 0 : _dim_divisionOptions2.divisionRenderIds) === "function" ? dim.divisionOptions.divisionRenderIds(dim.dimensionKey, value, i) : divisionId;
660
+ nodes[divisionId] = {
661
+ id: divisionId,
662
+ renderId: divisionRenderId,
663
+ derivedNode: dim.dimensionKey,
664
+ edges: [],
665
+ dimensionLevel: 2,
666
+ data: _object_spread({}, targetDivision),
667
+ renderingStrategy: ((_dim_divisionOptions3 = dim.divisionOptions) === null || _dim_divisionOptions3 === void 0 ? void 0 : _dim_divisionOptions3.renderingStrategy) || "singleSquare"
668
+ };
669
+ nodes[divisionId].data[dim.dimensionKey] = value;
670
+ }
671
+ } else {
672
+ targetDivision = dimension.divisions[dimension.nodeId];
673
+ if (!targetDivision) {
674
+ var _dim_divisionOptions4;
675
+ targetDivision = dimension.divisions[dimension.nodeId] = {
676
+ id: dimension.nodeId,
677
+ sortFunction: ((_dim_divisionOptions4 = dim.divisionOptions) === null || _dim_divisionOptions4 === void 0 ? void 0 : _dim_divisionOptions4.sortFunction) || void 0,
678
+ values: {}
679
+ };
680
+ }
681
+ if (!dim.operations) {
682
+ dim.operations = {};
683
+ }
684
+ var subdivs = dim.operations.createNumericalSubdivisions;
685
+ dimension.subdivisions = typeof subdivs === "number" && subdivs < 1 ? 1 : subdivs || 1;
686
+ if (subdivs !== 1) {
687
+ if (!dimension.divisionOptions) {
688
+ dimension.divisionOptions = dim.divisionOptions;
689
+ }
690
+ setExtents(value, dimension);
691
+ }
692
+ }
693
+ var id = typeof options.idKey === "function" ? options.idKey(d) : options.idKey;
694
+ targetDivision.values[d[id]] = d;
695
+ }
696
+ }
697
+ i++;
698
+ });
699
+ });
700
+ Object.keys(dimensions).forEach(function(s) {
701
+ var dimension = dimensions[s];
702
+ var divisions = dimension.divisions;
703
+ if (dimension.type === "numerical") {
704
+ divisions[dimension.nodeId].values = Object.fromEntries(Object.entries(divisions[dimension.nodeId].values).sort(function(a, b) {
705
+ return typeof dimension.sortFunction === "function" ? dimension.sortFunction(a[1], b[1], dimension) : a[1][s] - b[1][s];
706
+ }));
707
+ var values = divisions[dimension.nodeId].values;
708
+ if (dimension.numericalExtents[0] !== Infinity && dimension.subdivisions !== 1) {
709
+ var valueKeys = Object.keys(values);
710
+ var subDivisions = typeof dimension.subdivisions === "function" ? dimension.subdivisions(s, values) : dimension.subdivisions;
711
+ var range = dimension.numericalExtents[1] - dimension.numericalExtents[0];
712
+ var interval = range / subDivisions;
713
+ var i = dimension.numericalExtents[0] + interval;
714
+ var divisionCount = 0;
715
+ var index = 0;
716
+ for(i = dimension.numericalExtents[0] + interval; i <= dimension.numericalExtents[1]; i += interval){
717
+ var _dimension_divisionOptions, _dimension_divisionOptions1, _dimension_divisionOptions2, _dimension_divisionOptions3;
718
+ var divisionId = typeof ((_dimension_divisionOptions = dimension.divisionOptions) === null || _dimension_divisionOptions === void 0 ? void 0 : _dimension_divisionOptions.divisionNodeIds) === "function" ? dimension.divisionOptions.divisionNodeIds(s, i, i) : dimension.nodeId + "_" + i;
719
+ dimension.divisions[divisionId] = {
720
+ id: divisionId,
721
+ sortFunction: ((_dimension_divisionOptions1 = dimension.divisionOptions) === null || _dimension_divisionOptions1 === void 0 ? void 0 : _dimension_divisionOptions1.sortFunction) || void 0,
722
+ values: {}
723
+ };
724
+ var divisionRenderId = typeof ((_dimension_divisionOptions2 = dimension.divisionOptions) === null || _dimension_divisionOptions2 === void 0 ? void 0 : _dimension_divisionOptions2.divisionRenderIds) === "function" ? dimension.divisionOptions.divisionRenderIds(s, i, i) : divisionId;
725
+ nodes[divisionId] = {
726
+ id: divisionId,
727
+ renderId: divisionRenderId,
728
+ derivedNode: s,
729
+ edges: [],
730
+ data: dimension.divisions[divisionId],
731
+ dimensionLevel: 2,
732
+ renderingStrategy: ((_dimension_divisionOptions3 = dimension.divisionOptions) === null || _dimension_divisionOptions3 === void 0 ? void 0 : _dimension_divisionOptions3.renderingStrategy) || "singleSquare"
733
+ };
734
+ var limit = false;
735
+ while(!limit && index < valueKeys.length){
736
+ var node = values[valueKeys[index]];
737
+ var value = node[s];
738
+ if (value <= i) {
739
+ dimension.divisions[divisionId].values[node.id] = node;
740
+ } else {
741
+ i += interval;
742
+ limit = true;
743
+ }
744
+ index++;
745
+ }
746
+ divisionCount++;
747
+ }
748
+ delete divisions[s];
749
+ }
750
+ } else if (typeof dimension.sortFunction === "function") {
751
+ dimension.divisions = Object.fromEntries(Object.entries(divisions).sort(function(a, b) {
752
+ return dimension.sortFunction(a[1], b[1], dimension);
753
+ }));
754
+ }
755
+ var divisionKeys = Object.keys(dimension.divisions);
756
+ divisionKeys.forEach(function(d) {
757
+ var division = dimension.divisions[d];
758
+ if (typeof division.sortFunction === "function") {
759
+ division.values = Object.fromEntries(Object.entries(division.values).sort(function(a, b) {
760
+ return dimension.sortFunction(a[1], b[1], division);
761
+ }));
762
+ }
763
+ });
764
+ });
765
+ if (options.dimensions.adjustDimensions) {
766
+ dimensions = options.dimensions.adjustDimensions(dimensions);
767
+ }
768
+ return dimensions;
769
+ };
770
+ var buildEdges = function(options, nodes, dimensions) {
771
+ var edges = {};
772
+ var addEdgeToNode = function(nodeId, edgeId) {
773
+ if (nodes[nodeId].edges.indexOf(edgeId) === -1) {
774
+ nodes[nodeId].edges.push(edgeId);
775
+ }
776
+ };
777
+ var createEdge = function(source, target, rules, addTo) {
778
+ var id = "".concat(source, "-").concat(target);
779
+ var targetId = !options.useDirectedEdges ? id : "".concat(target, "-").concat(id);
780
+ var addToSource = !addTo || addTo === "source";
781
+ var addToTarget = !addTo || addTo === "target";
782
+ var checkEdgeRules = function(eId) {
783
+ if (edges[eId]) {
784
+ var _edges_eId_navigationRules;
785
+ (_edges_eId_navigationRules = edges[eId].navigationRules).push.apply(_edges_eId_navigationRules, _to_consumable_array(rules || []));
786
+ } else {
787
+ edges[eId] = {
788
+ source: source,
789
+ target: target,
790
+ navigationRules: rules ? _to_consumable_array(rules) : []
791
+ };
792
+ }
793
+ };
794
+ checkEdgeRules(id);
795
+ if (options.useDirectedEdges && addToTarget) {
796
+ checkEdgeRules(targetId);
797
+ }
798
+ if (addToSource) {
799
+ addEdgeToNode(source, id);
800
+ }
801
+ if (addToTarget) {
802
+ addEdgeToNode(target, targetId);
803
+ }
804
+ };
805
+ if (dimensions && Object.keys(dimensions).length) {
806
+ var _options_dimensions_parentOptions_level1Options, _options_dimensions_parentOptions, _options_dimensions, _options_dimensions1, _po_level1Options_behavior, _po_level1Options, _po_level1Options_navigationRules, _po_level1Options1, _po_level1Options_navigationRules1, _po_level1Options2;
807
+ var dimensionKeys = Object.keys(dimensions);
808
+ var hasOrder = (_options_dimensions = options.dimensions) === null || _options_dimensions === void 0 ? void 0 : (_options_dimensions_parentOptions = _options_dimensions.parentOptions) === null || _options_dimensions_parentOptions === void 0 ? void 0 : (_options_dimensions_parentOptions_level1Options = _options_dimensions_parentOptions.level1Options) === null || _options_dimensions_parentOptions_level1Options === void 0 ? void 0 : _options_dimensions_parentOptions_level1Options.order;
809
+ var order = hasOrder || dimensionKeys;
810
+ var l = 0;
811
+ var po = ((_options_dimensions1 = options.dimensions) === null || _options_dimensions1 === void 0 ? void 0 : _options_dimensions1.parentOptions) || {};
812
+ var extents = ((_po_level1Options = po.level1Options) === null || _po_level1Options === void 0 ? void 0 : (_po_level1Options_behavior = _po_level1Options.behavior) === null || _po_level1Options_behavior === void 0 ? void 0 : _po_level1Options_behavior.extents) || "terminal";
813
+ var level0 = po.addLevel0;
814
+ var parentRules = level0 ? ((_po_level1Options1 = po.level1Options) === null || _po_level1Options1 === void 0 ? void 0 : (_po_level1Options_navigationRules = _po_level1Options1.navigationRules) === null || _po_level1Options_navigationRules === void 0 ? void 0 : _po_level1Options_navigationRules.parent_child) || [
815
+ "parent",
816
+ "child"
817
+ ] : [];
818
+ var siblingRules = ((_po_level1Options2 = po.level1Options) === null || _po_level1Options2 === void 0 ? void 0 : (_po_level1Options_navigationRules1 = _po_level1Options2.navigationRules) === null || _po_level1Options_navigationRules1 === void 0 ? void 0 : _po_level1Options_navigationRules1.sibling_sibling) || [
819
+ "left",
820
+ "right"
821
+ ];
822
+ var firstLevel1Node = typeof order[0] === "string" ? hasOrder ? nodes[order[0]] : nodes[dimensions[order[0]].nodeId] : order[0];
823
+ if (level0) {
824
+ createEdge(level0.id, firstLevel1Node.id, parentRules, "source");
825
+ }
826
+ order.forEach(function(n) {
827
+ var level1Node = typeof n === "string" ? hasOrder ? nodes[n] : nodes[dimensions[n].nodeId] : n;
828
+ if (level1Node === n && !nodes[level1Node.id]) {
829
+ nodes[level1Node.id] = level1Node;
830
+ }
831
+ if (level0) {
832
+ if (!options.useDirectedEdges) {
833
+ createEdge(level0.id, level1Node.id, parentRules, "target");
834
+ } else {
835
+ createEdge(level1Node.id, level0.id, parentRules, "source");
836
+ }
837
+ }
838
+ if (l === order.length - 1 && extents === "circular") {
839
+ createEdge(level1Node.id, firstLevel1Node.id, siblingRules);
840
+ } else if (l === order.length - 1 && extents === "bridgedCustom") {
841
+ createEdge(level1Node.id, po.level1Options.behavior.customBridgePost, siblingRules);
842
+ } else if (l < order.length - 1) {
843
+ var nextLevel1Node = typeof order[l + 1] === "string" ? hasOrder ? // @ts-ignore: for some reason the same use of conditional check works above for order[0] (firstLevel1Node) but not for l+1 here
844
+ nodes[order[l + 1]] : // @ts-ignore: for some reason the same use of conditional check works above for order[0] (firstLevel1Node) but not for l+1 here
845
+ nodes[dimensions[order[l + 1]].nodeId] : order[l + 1];
846
+ createEdge(level1Node.id, nextLevel1Node.id, siblingRules);
847
+ }
848
+ if (!l && extents === "bridgedCustom") {
849
+ createEdge(po.level1Options.behavior.customBridgePost, level1Node.id, siblingRules);
850
+ }
851
+ l++;
852
+ });
853
+ dimensionKeys.forEach(function(s) {
854
+ var _dimension_behavior;
855
+ var dimension = dimensions[s];
856
+ var extents2 = ((_dimension_behavior = dimension.behavior) === null || _dimension_behavior === void 0 ? void 0 : _dimension_behavior.extents) || "circular";
857
+ if (!dimension.divisions) {
858
+ console.error("Parsing dimensions. The dimension using the key ".concat(s, " is missing the divisions property. dimension.divisions should be supplied. ").concat(JSON.stringify(dimension), "."));
859
+ }
860
+ var divisionKeys = Object.keys(dimension.divisions);
861
+ var firstDivision = dimension.divisions[divisionKeys[0]];
862
+ if (divisionKeys.length !== 1) {
863
+ createEdge(dimension.nodeId, firstDivision.id, dimension.navigationRules.parent_child, "source");
864
+ } else {
865
+ var valueKeys = Object.keys(firstDivision.values);
866
+ var firstChildId = typeof options.idKey === "function" ? options.idKey(firstDivision.values[valueKeys[0]]) : options.idKey;
867
+ createEdge(dimension.nodeId, firstDivision.values[valueKeys[0]][firstChildId], dimension.navigationRules.parent_child, "source");
868
+ }
869
+ var j = 0;
870
+ divisionKeys.forEach(function(d) {
871
+ var division = dimension.divisions[d];
872
+ if (j === divisionKeys.length - 1 && (extents2 === "circular" || extents2 === "bridgedCousins" || extents2 === "bridgedCustom")) {
873
+ createEdge(division.id, dimension.divisions[divisionKeys[0]].id, dimension.navigationRules.sibling_sibling);
874
+ } else if (j < divisionKeys.length - 1) {
875
+ createEdge(division.id, dimension.divisions[divisionKeys[j + 1]].id, dimension.navigationRules.sibling_sibling);
876
+ }
877
+ var valueKeys = Object.keys(division.values);
878
+ if (!options.useDirectedEdges) {
879
+ createEdge(dimension.nodeId, division.id, dimension.navigationRules.parent_child, "target");
880
+ } else {
881
+ createEdge(division.id, dimension.nodeId, dimension.navigationRules.parent_child, "source");
882
+ }
883
+ var firstChildId = typeof options.idKey === "function" ? options.idKey(division.values[valueKeys[0]]) : options.idKey;
884
+ createEdge(division.id, division.values[valueKeys[0]][firstChildId], dimension.navigationRules.parent_child, "source");
885
+ var i = 0;
886
+ if (valueKeys.length > 1) {
887
+ valueKeys.forEach(function(vk) {
888
+ var v = division.values[vk];
889
+ var id = typeof options.idKey === "function" ? options.idKey(v) : options.idKey;
890
+ var parentId = divisionKeys.length !== 1 ? division.id : dimension.nodeId;
891
+ if (!options.useDirectedEdges) {
892
+ createEdge(parentId, v[id], dimension.navigationRules.parent_child, "target");
893
+ } else {
894
+ createEdge(v[id], parentId, dimension.navigationRules.parent_child, "source");
895
+ }
896
+ if (i === valueKeys.length - 1 && extents2 === "circular") {
897
+ var targetId = typeof options.idKey === "function" ? options.idKey(division.values[valueKeys[0]]) : options.idKey;
898
+ createEdge(v[id], division.values[valueKeys[0]][targetId], dimension.navigationRules.sibling_sibling);
899
+ } else if (i === valueKeys.length - 1 && extents2 === "bridgedCousins") {
900
+ if (j !== divisionKeys.length - 1) {
901
+ var targetId1 = typeof options.idKey === "function" ? options.idKey(dimension.divisions[divisionKeys[j + 1]].values[valueKeys[0]]) : options.idKey;
902
+ createEdge(v[id], dimension.divisions[divisionKeys[j + 1]].values[valueKeys[0]][targetId1], dimension.navigationRules.sibling_sibling);
903
+ } else {
904
+ var targetId2 = typeof options.idKey === "function" ? options.idKey(dimension.divisions[divisionKeys[0]].values[valueKeys[0]]) : options.idKey;
905
+ createEdge(v[id], dimension.divisions[divisionKeys[0]].values[valueKeys[0]][targetId2], dimension.navigationRules.sibling_sibling);
906
+ }
907
+ } else if (i === valueKeys.length - 1 && extents2 === "bridgedCustom") {
908
+ createEdge(v[id], dimension.behavior.customBridgePost, dimension.navigationRules.sibling_sibling);
909
+ } else if (i < valueKeys.length - 1) {
910
+ var targetId3 = typeof options.idKey === "function" ? options.idKey(division.values[valueKeys[i + 1]]) : options.idKey;
911
+ createEdge(v[id], division.values[valueKeys[i + 1]][targetId3], dimension.navigationRules.sibling_sibling);
912
+ }
913
+ if (!i && extents2 === "bridgedCousins") {
914
+ if (j !== 0) {
915
+ var targetId4 = typeof options.idKey === "function" ? options.idKey(dimension.divisions[divisionKeys[j - 1]].values[valueKeys[valueKeys.length - 1]]) : options.idKey;
916
+ createEdge(dimension.divisions[divisionKeys[j - 1]].values[valueKeys[valueKeys.length - 1]][targetId4], v[id], dimension.navigationRules.sibling_sibling);
917
+ } else {
918
+ var targetId5 = typeof options.idKey === "function" ? options.idKey(dimension.divisions[divisionKeys[divisionKeys.length - 1]].values[valueKeys[valueKeys.length - 1]]) : options.idKey;
919
+ createEdge(dimension.divisions[divisionKeys[divisionKeys.length - 1]].values[valueKeys[valueKeys.length - 1]][targetId5], v[id], dimension.navigationRules.sibling_sibling);
920
+ }
921
+ } else if (!i && extents2 === "bridgedCustom") {
922
+ createEdge(dimension.behavior.customBridgePrevious, v[id], dimension.navigationRules.sibling_sibling);
923
+ }
924
+ i++;
925
+ });
926
+ }
927
+ j++;
928
+ });
929
+ });
930
+ }
931
+ Object.keys(nodes).forEach(function(nodeKey) {
932
+ var _options_genericEdges;
933
+ var node = nodes[nodeKey];
934
+ if ((_options_genericEdges = options.genericEdges) === null || _options_genericEdges === void 0 ? void 0 : _options_genericEdges.length) {
935
+ options.genericEdges.forEach(function(e) {
936
+ if (!edges[e.edgeId]) {
937
+ edges[e.edgeId] = e.edge;
938
+ }
939
+ if (!e.conditional || e.conditional && e.conditional(node, e)) {
940
+ node.edges.push(e.edgeId);
941
+ }
942
+ });
943
+ }
944
+ });
945
+ return edges;
946
+ };
947
+ var buildRules = function(options, edges, dimensions) {
948
+ var rules = options.navigationRules;
949
+ if (!rules) {
950
+ var dimKeys = Object.keys(dimensions || {});
951
+ if (dimKeys.length > 6) {
952
+ console.error("Building navigationRules. Dimension count is too high to automatically generate key commands. It is recommend you reduce your dimensions to 6 or fewer for end-user experience. If not, you must provide your own navigation rules in options.navigationRules. Details: Count is ".concat(dimKeys.length, ". Dimensions counted: ").concat(dimKeys.join(", "), "."));
953
+ }
954
+ var importedRules = {};
955
+ var used = {};
956
+ var needsKeys = {};
957
+ var sparePairs = _to_consumable_array(TypicallyUnreservedKeyPairs);
958
+ var spareKeys = _to_consumable_array(TypicallyUnreservedKeys);
959
+ var checkKeys = function(k1, k2) {
960
+ var isPair = k1 && k2;
961
+ var k1Assigned = false;
962
+ var k2Assigned = false;
963
+ if (importedRules[k1] || used[k1]) {
964
+ used[k1] = _object_spread({}, importedRules[k1]);
965
+ k1Assigned = true;
966
+ }
967
+ if (k2 && (importedRules[k2] || used[k2])) {
968
+ used[k2] = _object_spread({}, importedRules[k2]);
969
+ k2Assigned = true;
970
+ }
971
+ if (isPair && !k1Assigned && !k2Assigned) {
972
+ if (!sparePairs.length) {
973
+ console.error("Building navigationRules. Dimension count is too high to automatically generate key commands, we have run out of keyboard key pairs to assign. You must either provide your own navigation rules in options.navigationRules, provide rules when generating dimensions, or reduce dimension count.");
974
+ }
975
+ var pair = _to_consumable_array(sparePairs.shift());
976
+ spareKeys.splice(spareKeys.indexOf(pair[0]), 1);
977
+ spareKeys.splice(spareKeys.indexOf(pair[1]), 1);
978
+ used[k1] = {
979
+ direction: options.useDirectedEdges ? "target" : "source",
980
+ key: pair[0]
981
+ };
982
+ used[k2] = {
983
+ direction: "target",
984
+ key: pair[1]
985
+ };
986
+ } else {
987
+ if (!used[k1] && spareKeys.length) {
988
+ var key = spareKeys.shift();
989
+ var newPairs = [];
990
+ sparePairs.forEach(function(p) {
991
+ if (key !== p[0] && key !== p[1]) {
992
+ newPairs.push(p);
993
+ }
994
+ });
995
+ sparePairs = newPairs;
996
+ used[k1] = {
997
+ direction: options.useDirectedEdges ? "target" : "source",
998
+ key: key
999
+ };
1000
+ }
1001
+ if (k2 && !used[k2] && spareKeys.length) {
1002
+ var key1 = spareKeys.shift();
1003
+ var newPairs1 = [];
1004
+ sparePairs.forEach(function(p) {
1005
+ if (key1 !== p[0] && key1 !== p[1]) {
1006
+ newPairs1.push(p);
1007
+ }
1008
+ });
1009
+ sparePairs = newPairs1;
1010
+ used[k2] = {
1011
+ direction: "target",
1012
+ key: key1
1013
+ };
1014
+ }
1015
+ if (!spareKeys.length) {
1016
+ if (!used[k1]) {
1017
+ needsKeys[k1] = k1;
1018
+ }
1019
+ if (k2 && !used[k2]) {
1020
+ needsKeys[k2] = k2;
1021
+ }
1022
+ }
1023
+ }
1024
+ };
1025
+ Object.keys(GenericFullNavigationRules).forEach(function(r) {
1026
+ var rule = _object_spread({}, GenericFullNavigationRules[r]);
1027
+ if (options.useDirectedEdges) {
1028
+ rule.direction = "target";
1029
+ }
1030
+ importedRules[r] = rule;
1031
+ });
1032
+ if (dimKeys.length) {
1033
+ var _options_dimensions_parentOptions, _options_dimensions;
1034
+ if ((_options_dimensions = options.dimensions) === null || _options_dimensions === void 0 ? void 0 : (_options_dimensions_parentOptions = _options_dimensions.parentOptions) === null || _options_dimensions_parentOptions === void 0 ? void 0 : _options_dimensions_parentOptions.addLevel0) {
1035
+ var _options_dimensions_parentOptions_level1Options_navigationRules, _options_dimensions_parentOptions_level1Options;
1036
+ var rules2 = ((_options_dimensions_parentOptions_level1Options = options.dimensions.parentOptions.level1Options) === null || _options_dimensions_parentOptions_level1Options === void 0 ? void 0 : (_options_dimensions_parentOptions_level1Options_navigationRules = _options_dimensions_parentOptions_level1Options.navigationRules) === null || _options_dimensions_parentOptions_level1Options_navigationRules === void 0 ? void 0 : _options_dimensions_parentOptions_level1Options_navigationRules.parent_child) || [
1037
+ "parent",
1038
+ "child"
1039
+ ];
1040
+ checkKeys(rules2[0], rules2[1]);
1041
+ }
1042
+ dimKeys.forEach(function(d) {
1043
+ var pc = dimensions[d].navigationRules.parent_child;
1044
+ var ss = dimensions[d].navigationRules.sibling_sibling;
1045
+ checkKeys(pc[0], pc[1]);
1046
+ checkKeys(ss[0], ss[1]);
1047
+ });
1048
+ }
1049
+ Object.keys(edges).forEach(function(e) {
1050
+ edges[e].navigationRules.forEach(function(rule) {
1051
+ if (!used[rule]) {
1052
+ checkKeys(rule);
1053
+ }
1054
+ });
1055
+ });
1056
+ if (Object.keys(needsKeys).length) {
1057
+ var usedKeys = {};
1058
+ Object.keys(used).forEach(function(k) {
1059
+ usedKeys[used[k].key] = used[k].key;
1060
+ });
1061
+ Object.keys(importedRules).forEach(function(r) {
1062
+ if (!usedKeys[importedRules[r].key] && !SemanticKeys[importedRules[r].key]) {
1063
+ spareKeys.push(importedRules[r].key);
1064
+ }
1065
+ });
1066
+ var recheckKeys = _object_spread({}, needsKeys);
1067
+ needsKeys = {};
1068
+ Object.keys(recheckKeys).forEach(function(key) {
1069
+ checkKeys(key);
1070
+ });
1071
+ if (Object.keys(needsKeys).length) {
1072
+ console.error("Building navigationRules. There are no more keys left to assign automatically. Recommended fixes: use fewer dimensions, use fewer GenericEdges, or build your own navigationRules. Rules remaining without keyboard keys: ".concat(Object.keys(needsKeys).join(", "), "."));
1073
+ }
1074
+ }
1075
+ rules = used;
1076
+ }
1077
+ return rules;
1078
+ };
1079
+ var buildStructure = function(options) {
1080
+ if (options.addIds) {
1081
+ addSimpleDataIDs(options);
1082
+ }
1083
+ var nodes = buildNodes(options);
1084
+ var dimensions = scaffoldDimensions(options, nodes);
1085
+ var edges = buildEdges(options, nodes, dimensions);
1086
+ var navigationRules = buildRules(options, edges, dimensions);
1087
+ return {
1088
+ nodes: nodes,
1089
+ edges: edges,
1090
+ dimensions: dimensions,
1091
+ navigationRules: navigationRules
1092
+ };
1093
+ };
426
1094
  // src/input.ts
427
1095
  var input_default = function(options) {
428
1096
  var inputHandler = {};
@@ -533,14 +1201,14 @@ var rendering_default = function(options) {
533
1201
  var initialized = false;
534
1202
  var defaults = {
535
1203
  cssClass: NodeElementDefaults.cssClass,
536
- dimensions: _object_spread({}, NodeElementDefaults.dimensions),
1204
+ spatialProperties: _object_spread({}, NodeElementDefaults.spatialProperties),
537
1205
  semantics: _object_spread({}, NodeElementDefaults.semantics),
538
1206
  parentSemantics: _object_spread({}, NodeElementDefaults.parentSemantics),
539
1207
  existingElement: _object_spread({}, NodeElementDefaults.existingElement)
540
1208
  };
541
1209
  if (options.defaults) {
542
1210
  defaults.cssClass = options.defaults.cssClass || defaults.cssClass;
543
- defaults.dimensions = options.defaults.dimensions ? _object_spread({}, defaults.dimensions, options.defaults.dimensions) : defaults.dimensions;
1211
+ defaults.spatialProperties = options.defaults.spatialProperties ? _object_spread({}, defaults.spatialProperties, options.defaults.spatialProperties) : defaults.spatialProperties;
544
1212
  defaults.semantics = options.defaults.semantics ? _object_spread({}, defaults.semantics, options.defaults.semantics) : defaults.semantics;
545
1213
  defaults.parentSemantics = options.defaults.parentSemantics ? _object_spread({}, defaults.parentSemantics, options.defaults.parentSemantics) : defaults.parentSemantics;
546
1214
  defaults.existingElement = options.defaults.existingElement ? _object_spread({}, defaults.existingElement, options.defaults.existingElement) : defaults.existingElement;
@@ -628,19 +1296,19 @@ var rendering_default = function(options) {
628
1296
  return;
629
1297
  }
630
1298
  var useExisting = false;
631
- var existingDimensions = {};
1299
+ var existingSpatialProperties = {};
632
1300
  var resolveProp = function(prop, subprop, checkExisting) {
633
1301
  var p1 = d[prop] || defaults[prop];
634
- var s1 = !(checkExisting && useExisting) ? p1[subprop] : existingDimensions[subprop];
1302
+ var s1 = !(checkExisting && useExisting) ? p1[subprop] : existingSpatialProperties[subprop];
635
1303
  var s2 = defaults[prop][subprop];
636
1304
  return typeof p1 === "function" ? p1(d, nodeData.datum) : typeof s1 === "function" ? s1(d, nodeData.datum) : s1 || s2 || (!subprop ? p1 : void 0);
637
1305
  };
638
- useExisting = resolveProp("existingElement", "useForDimensions");
639
- existingDimensions = resolveProp("existingElement", "dimensions");
640
- var width = parseFloat(resolveProp("dimensions", "width", true) || 0);
641
- var height = parseFloat(resolveProp("dimensions", "height", true) || 0);
642
- var x = parseFloat(resolveProp("dimensions", "x", true) || 0);
643
- var y = parseFloat(resolveProp("dimensions", "y", true) || 0);
1306
+ useExisting = resolveProp("existingElement", "useForSpatialProperties");
1307
+ existingSpatialProperties = resolveProp("existingElement", "spatialProperties");
1308
+ var width = parseFloat(resolveProp("spatialProperties", "width", true) || 0);
1309
+ var height = parseFloat(resolveProp("spatialProperties", "height", true) || 0);
1310
+ var x = parseFloat(resolveProp("spatialProperties", "x", true) || 0);
1311
+ var y = parseFloat(resolveProp("spatialProperties", "y", true) || 0);
644
1312
  var node = document.createElement(resolveProp("parentSemantics", "elementType"));
645
1313
  var wrapperAttrs = resolveProp("parentSemantics", "attributes");
646
1314
  if (typeof wrapperAttrs === "object") {
@@ -677,7 +1345,7 @@ var rendering_default = function(options) {
677
1345
  }
678
1346
  nodeText.setAttribute("aria-label", label);
679
1347
  node.appendChild(nodeText);
680
- var hasPath = resolveProp("dimensions", "path");
1348
+ var hasPath = resolveProp("spatialProperties", "path");
681
1349
  if (hasPath) {
682
1350
  var totalWidth = width + x + 10;
683
1351
  var totalHeight = height + y + 10;