@fusion.dev/helix-headless 0.110.3 → 0.110.5
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/custom-elements.json +31 -11
- package/dist/canvas/root/canvas-root.d.ts +16 -3
- package/dist/canvas/root/canvas-root.js +85 -34
- package/package.json +5 -5
- package/types/jsx.d.ts +2 -2
package/custom-elements.json
CHANGED
|
@@ -11386,16 +11386,6 @@
|
|
|
11386
11386
|
"description": "A card's geometry by its name.",
|
|
11387
11387
|
"readonly": true
|
|
11388
11388
|
},
|
|
11389
|
-
{
|
|
11390
|
-
"kind": "field",
|
|
11391
|
-
"name": "groups",
|
|
11392
|
-
"type": {
|
|
11393
|
-
"text": "CanvasNode[]"
|
|
11394
|
-
},
|
|
11395
|
-
"privacy": "private",
|
|
11396
|
-
"description": "The groups alone, which is all a card's group is chosen from.",
|
|
11397
|
-
"readonly": true
|
|
11398
|
-
},
|
|
11399
11389
|
{
|
|
11400
11390
|
"kind": "field",
|
|
11401
11391
|
"name": "cache",
|
|
@@ -12196,6 +12186,26 @@
|
|
|
12196
12186
|
],
|
|
12197
12187
|
"description": "The element behind a connection's key, for what only the element knows."
|
|
12198
12188
|
},
|
|
12189
|
+
{
|
|
12190
|
+
"kind": "field",
|
|
12191
|
+
"name": "keying",
|
|
12192
|
+
"type": {
|
|
12193
|
+
"text": "| {\n byElement: Map<HelixHeadlessCanvasEdge, string>\n byKey: Map<string, HelixHeadlessCanvasEdge>\n }\n | undefined"
|
|
12194
|
+
},
|
|
12195
|
+
"privacy": "private",
|
|
12196
|
+
"default": "undefined",
|
|
12197
|
+
"description": "Every connection's key and every key's element, worked out once for the\nrender that asks for them.\n\n**One pass, where each asked alone walked them all.** A connection with no\n`name` counts its twins to be told apart, and a render asks every\nconnection's element by key, so four hundred unnamed connections cost 53\nms a render and 4.7 seconds with them all chosen, every step of a drag.\nKept from `willUpdate` to `updated` only: outside a render a handler may\nhave just moved a connection's ends, and its key is worked out afresh."
|
|
12198
|
+
},
|
|
12199
|
+
{
|
|
12200
|
+
"kind": "method",
|
|
12201
|
+
"name": "keyAll",
|
|
12202
|
+
"privacy": "private",
|
|
12203
|
+
"return": {
|
|
12204
|
+
"type": {
|
|
12205
|
+
"text": "{\n byElement: Map<HelixHeadlessCanvasEdge, string>\n byKey: Map<string, HelixHeadlessCanvasEdge>\n }"
|
|
12206
|
+
}
|
|
12207
|
+
}
|
|
12208
|
+
},
|
|
12199
12209
|
{
|
|
12200
12210
|
"kind": "field",
|
|
12201
12211
|
"name": "edgeElements",
|
|
@@ -12766,6 +12776,16 @@
|
|
|
12766
12776
|
},
|
|
12767
12777
|
"description": "The board's current view: the document's point at the middle of the view,\nand the zoom.\n\n**Read to save a view and written to restore one**, which a consumer keeping\na minimap in step, or putting a reader back where they were, had no way to\ndo: where the board sat was private, and the events said only which way a\ncontrol had moved it. The middle rather than a corner, so a view saved in\none box shows the same thing in the middle of a box of another size.\nWriting one counts as the reader choosing a view, so a later resize keeps\nit rather than fitting the board again."
|
|
12768
12778
|
},
|
|
12779
|
+
{
|
|
12780
|
+
"kind": "field",
|
|
12781
|
+
"name": "waiting",
|
|
12782
|
+
"type": {
|
|
12783
|
+
"text": "CanvasView | undefined"
|
|
12784
|
+
},
|
|
12785
|
+
"privacy": "private",
|
|
12786
|
+
"default": "undefined",
|
|
12787
|
+
"description": "A view written before the board could place it, placed once it can."
|
|
12788
|
+
},
|
|
12769
12789
|
{
|
|
12770
12790
|
"kind": "field",
|
|
12771
12791
|
"name": "reported",
|
|
@@ -14109,7 +14129,7 @@
|
|
|
14109
14129
|
"name": "holding"
|
|
14110
14130
|
},
|
|
14111
14131
|
{
|
|
14112
|
-
"description": "The user has been still
|
|
14132
|
+
"description": "The user has been still for `idle-delay` milliseconds. The board's own controls stay; select on it to hide chrome of your own.",
|
|
14113
14133
|
"name": "idle"
|
|
14114
14134
|
},
|
|
14115
14135
|
{
|
|
@@ -119,7 +119,7 @@ declare const HelixHeadlessCanvas_base: (new (...args: any[]) => import("@fusion
|
|
|
119
119
|
* @cssstate empty - While the document has no nodes.
|
|
120
120
|
* @cssstate fullscreen - While the board fills the screen.
|
|
121
121
|
* @cssstate holding - An item picked up with a click follows the pointer until the next press puts it down.
|
|
122
|
-
* @cssstate idle - The user has been still
|
|
122
|
+
* @cssstate idle - The user has been still for `idle-delay` milliseconds. The board's own controls stay; select on it to hide chrome of your own.
|
|
123
123
|
* @cssstate pressing - While a press on the board, its cards or its connections is under way.
|
|
124
124
|
*/
|
|
125
125
|
export declare class HelixHeadlessCanvas extends HelixHeadlessCanvas_base {
|
|
@@ -320,8 +320,6 @@ export declare class HelixHeadlessCanvas extends HelixHeadlessCanvas_base {
|
|
|
320
320
|
private get byName();
|
|
321
321
|
/** A card's geometry by its name. */
|
|
322
322
|
private get byId();
|
|
323
|
-
/** The groups alone, which is all a card's group is chosen from. */
|
|
324
|
-
private get groups();
|
|
325
323
|
/**
|
|
326
324
|
* What the board reads from its children, kept for the rest of the turn.
|
|
327
325
|
*
|
|
@@ -549,6 +547,19 @@ export declare class HelixHeadlessCanvas extends HelixHeadlessCanvas_base {
|
|
|
549
547
|
private fixed;
|
|
550
548
|
/** The element behind a connection's key, for what only the element knows. */
|
|
551
549
|
private edgeElement;
|
|
550
|
+
/**
|
|
551
|
+
* Every connection's key and every key's element, worked out once for the
|
|
552
|
+
* render that asks for them.
|
|
553
|
+
*
|
|
554
|
+
* **One pass, where each asked alone walked them all.** A connection with no
|
|
555
|
+
* `name` counts its twins to be told apart, and a render asks every
|
|
556
|
+
* connection's element by key, so four hundred unnamed connections cost 53
|
|
557
|
+
* ms a render and 4.7 seconds with them all chosen, every step of a drag.
|
|
558
|
+
* Kept from `willUpdate` to `updated` only: outside a render a handler may
|
|
559
|
+
* have just moved a connection's ends, and its key is worked out afresh.
|
|
560
|
+
*/
|
|
561
|
+
private keying;
|
|
562
|
+
private keyAll;
|
|
552
563
|
/** The connections declared, in the order they were written. */
|
|
553
564
|
private get edgeElements();
|
|
554
565
|
/**
|
|
@@ -784,6 +795,8 @@ export declare class HelixHeadlessCanvas extends HelixHeadlessCanvas_base {
|
|
|
784
795
|
*/
|
|
785
796
|
get view(): CanvasView;
|
|
786
797
|
set view(next: CanvasView);
|
|
798
|
+
/** A view written before the board could place it, placed once it can. */
|
|
799
|
+
private waiting;
|
|
787
800
|
/** The view last reported, so a render that did not move the board says nothing. */
|
|
788
801
|
private reported?;
|
|
789
802
|
/**
|
|
@@ -9,7 +9,7 @@ import { html, nothing, svg } from 'lit';
|
|
|
9
9
|
import { property, state } from 'lit/decorators.js';
|
|
10
10
|
import { HelixHeadlessCanvasEdge } from '../edge/canvas-edge.js';
|
|
11
11
|
import { HelixHeadlessCanvasNode } from '../node/canvas-node.js';
|
|
12
|
-
import { colorOf, connector, ends, extent,
|
|
12
|
+
import { colorOf, connector, ends, extent, inside, port, reading, sideNear, } from './canvas-document.js';
|
|
13
13
|
export { fromJsonCanvas } from './canvas-document.js';
|
|
14
14
|
const MARGIN = 32;
|
|
15
15
|
const ARROW = 'canvas-arrow';
|
|
@@ -65,6 +65,7 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
65
65
|
this.sides = new Map();
|
|
66
66
|
this.pressing = false;
|
|
67
67
|
this.pointing = false;
|
|
68
|
+
this.keying = undefined;
|
|
68
69
|
this.edgeKeys = new WeakMap();
|
|
69
70
|
this.handlePointerDown = (event) => {
|
|
70
71
|
const path = event.composedPath();
|
|
@@ -379,6 +380,7 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
379
380
|
const key = edge ?? card.name;
|
|
380
381
|
const along = inlineStep(this, event.key);
|
|
381
382
|
const down = event.key === 'ArrowDown' ? 1 : event.key === 'ArrowUp' ? -1 : 0;
|
|
383
|
+
const plain = !event.metaKey && !event.ctrlKey && !event.altKey;
|
|
382
384
|
if (card && event.shiftKey && (along !== 0 || down !== 0)) {
|
|
383
385
|
event.preventDefault();
|
|
384
386
|
if (this.fixed(card)) {
|
|
@@ -432,7 +434,7 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
432
434
|
this.partNamed('region')?.focus();
|
|
433
435
|
return;
|
|
434
436
|
}
|
|
435
|
-
if (!this.linking && (event.key === 'F2' || (card && event.key === 'Enter'))) {
|
|
437
|
+
if (plain && !this.linking && (event.key === 'F2' || (card && event.key === 'Enter'))) {
|
|
436
438
|
event.preventDefault();
|
|
437
439
|
this.editStop(key);
|
|
438
440
|
return;
|
|
@@ -450,7 +452,11 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
450
452
|
}
|
|
451
453
|
return;
|
|
452
454
|
}
|
|
453
|
-
if (
|
|
455
|
+
if (plain &&
|
|
456
|
+
card &&
|
|
457
|
+
!this.fixed(card) &&
|
|
458
|
+
!this.linking &&
|
|
459
|
+
(event.key === 'c' || event.key === 'C')) {
|
|
454
460
|
event.preventDefault();
|
|
455
461
|
this.startLinking(card.name);
|
|
456
462
|
return;
|
|
@@ -459,12 +465,13 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
459
465
|
!this.linking &&
|
|
460
466
|
!this.readOnly &&
|
|
461
467
|
!this.edgeElement(edge)?.readOnly &&
|
|
468
|
+
plain &&
|
|
462
469
|
(event.key === 'c' || event.key === 'C')) {
|
|
463
470
|
event.preventDefault();
|
|
464
471
|
this.startReconnect(edge, 'to');
|
|
465
472
|
return;
|
|
466
473
|
}
|
|
467
|
-
if (event.key === 'Delete' || event.key === 'Backspace') {
|
|
474
|
+
if (plain && !this.linking && (event.key === 'Delete' || event.key === 'Backspace')) {
|
|
468
475
|
const picked = this.picked;
|
|
469
476
|
const keys = picked.includes(key) ? picked : [key];
|
|
470
477
|
const loose = keys.filter((one) => one.startsWith('edge:')
|
|
@@ -477,7 +484,8 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
477
484
|
return;
|
|
478
485
|
}
|
|
479
486
|
const walk = this.linking ? this.walk.filter((one) => one.kind === 'node') : this.walk;
|
|
480
|
-
const
|
|
487
|
+
const found = walk.findIndex((one) => one.key === key);
|
|
488
|
+
const at = found === -1 && this.linking ? walk.findIndex((one) => one.key === this.linking?.from) : found;
|
|
481
489
|
const to = event.key === 'Home'
|
|
482
490
|
? 0
|
|
483
491
|
: event.key === 'End'
|
|
@@ -506,7 +514,9 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
506
514
|
if (this.linking) {
|
|
507
515
|
this.linking = { ...this.linking, to: this.arrival(card.name) };
|
|
508
516
|
}
|
|
509
|
-
this.
|
|
517
|
+
if (!this.pointing) {
|
|
518
|
+
this.reveal(card.name);
|
|
519
|
+
}
|
|
510
520
|
}
|
|
511
521
|
};
|
|
512
522
|
this.handleFocusOut = (event) => {
|
|
@@ -548,6 +558,7 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
548
558
|
this.handleEditorBlur = (event) => {
|
|
549
559
|
this.finishEditing(event.currentTarget, true);
|
|
550
560
|
};
|
|
561
|
+
this.waiting = undefined;
|
|
551
562
|
this.handleSlotChange = () => {
|
|
552
563
|
this.requestUpdate();
|
|
553
564
|
};
|
|
@@ -568,9 +579,6 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
568
579
|
get byId() {
|
|
569
580
|
return this.remember('byId', () => new Map(this.nodes.map((node) => [node.id, node])));
|
|
570
581
|
}
|
|
571
|
-
get groups() {
|
|
572
|
-
return this.remember('groups', () => this.nodes.filter((node) => node.type === 'group'));
|
|
573
|
-
}
|
|
574
582
|
remember(key, compute) {
|
|
575
583
|
const cache = this.cache;
|
|
576
584
|
if (Object.keys(cache).length === 0) {
|
|
@@ -862,6 +870,12 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
862
870
|
element.toSide = detail.toSide;
|
|
863
871
|
this.rekey(linking.edge, this.keyOfElement(element));
|
|
864
872
|
}
|
|
873
|
+
if (linking.pointer === undefined) {
|
|
874
|
+
this.said = fillTemplate(this.connectedLabel, {
|
|
875
|
+
from: this.nameOf(detail.from),
|
|
876
|
+
to: this.nameOf(detail.to),
|
|
877
|
+
});
|
|
878
|
+
}
|
|
865
879
|
this.dispatchEvent(new HelixReconnectEvent(detail));
|
|
866
880
|
}
|
|
867
881
|
rekey(was, now) {
|
|
@@ -967,12 +981,38 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
967
981
|
return this.readOnly || card === undefined || card.readOnly;
|
|
968
982
|
}
|
|
969
983
|
edgeElement(key) {
|
|
984
|
+
if (this.keying) {
|
|
985
|
+
return this.keying.byKey.get(key);
|
|
986
|
+
}
|
|
970
987
|
return this.edgeElements.find((child) => this.keyOfElement(child) === key);
|
|
971
988
|
}
|
|
989
|
+
keyAll() {
|
|
990
|
+
const byElement = new Map();
|
|
991
|
+
const byKey = new Map();
|
|
992
|
+
const twins = new Map();
|
|
993
|
+
for (const element of this.edgeElements) {
|
|
994
|
+
const base = keyBase({ fromNode: element.from, id: element.name, toNode: element.to });
|
|
995
|
+
let key = base;
|
|
996
|
+
if (!element.name) {
|
|
997
|
+
const count = (twins.get(base) ?? 0) + 1;
|
|
998
|
+
twins.set(base, count);
|
|
999
|
+
key = count > 1 ? `${base}#${count}` : base;
|
|
1000
|
+
}
|
|
1001
|
+
byElement.set(element, key);
|
|
1002
|
+
if (!byKey.has(key)) {
|
|
1003
|
+
byKey.set(key, element);
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
return { byElement, byKey };
|
|
1007
|
+
}
|
|
972
1008
|
get edgeElements() {
|
|
973
1009
|
return this.knownChildren.filter((child) => child instanceof HelixHeadlessCanvasEdge);
|
|
974
1010
|
}
|
|
975
1011
|
keyOfElement(element) {
|
|
1012
|
+
const known = this.keying?.byElement.get(element);
|
|
1013
|
+
if (known !== undefined) {
|
|
1014
|
+
return known;
|
|
1015
|
+
}
|
|
976
1016
|
const base = keyBase({ fromNode: element.from, id: element.name, toNode: element.to });
|
|
977
1017
|
if (element.name) {
|
|
978
1018
|
return base;
|
|
@@ -1302,6 +1342,9 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
1302
1342
|
return whole;
|
|
1303
1343
|
}
|
|
1304
1344
|
get view() {
|
|
1345
|
+
if (this.waiting) {
|
|
1346
|
+
return this.waiting;
|
|
1347
|
+
}
|
|
1305
1348
|
const origin = this.origin ?? { x: 0, y: 0 };
|
|
1306
1349
|
const { height, width } = this.box;
|
|
1307
1350
|
return {
|
|
@@ -1311,10 +1354,18 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
1311
1354
|
};
|
|
1312
1355
|
}
|
|
1313
1356
|
set view(next) {
|
|
1314
|
-
|
|
1357
|
+
if (![next.x, next.y, next.zoom].every(Number.isFinite)) {
|
|
1358
|
+
return;
|
|
1359
|
+
}
|
|
1360
|
+
this.touched = true;
|
|
1361
|
+
if (!this.hasUpdated || !this.origin) {
|
|
1362
|
+
this.waiting = next;
|
|
1363
|
+
return;
|
|
1364
|
+
}
|
|
1365
|
+
this.waiting = undefined;
|
|
1315
1366
|
const { height, width } = this.box;
|
|
1367
|
+
const origin = this.origin;
|
|
1316
1368
|
const zoom = Math.min(Math.max(next.zoom, ZOOM_MIN), ZOOM_MAX);
|
|
1317
|
-
this.touched = true;
|
|
1318
1369
|
this.direct = false;
|
|
1319
1370
|
this.at = {
|
|
1320
1371
|
x: width / 2 - (next.x - origin.x) * zoom,
|
|
@@ -1324,11 +1375,19 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
1324
1375
|
}
|
|
1325
1376
|
toJsonCanvas() {
|
|
1326
1377
|
const taken = new Set(this.edges.map((edge) => edge.id).filter(Boolean));
|
|
1327
|
-
const edges = this.edges.map((
|
|
1378
|
+
const edges = this.edges.map((read) => {
|
|
1379
|
+
const { fromSide: _from, toSide: _to, ...rest } = read;
|
|
1380
|
+
const key = this.keyOf(read);
|
|
1381
|
+
const element = this.edgeElement(key);
|
|
1382
|
+
const edge = {
|
|
1383
|
+
...rest,
|
|
1384
|
+
...(element?.fromSide ? { fromSide: element.fromSide } : {}),
|
|
1385
|
+
...(element?.toSide ? { toSide: element.toSide } : {}),
|
|
1386
|
+
};
|
|
1328
1387
|
if (edge.id) {
|
|
1329
|
-
return
|
|
1388
|
+
return edge;
|
|
1330
1389
|
}
|
|
1331
|
-
const base = this.publicName(
|
|
1390
|
+
const base = this.publicName(key);
|
|
1332
1391
|
let id = base;
|
|
1333
1392
|
for (let count = 2; taken.has(id); count++) {
|
|
1334
1393
|
id = `${base}-${count}`;
|
|
@@ -1366,8 +1425,13 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
1366
1425
|
firstUpdated(changed) {
|
|
1367
1426
|
super.firstUpdated(changed);
|
|
1368
1427
|
this.finishHydration();
|
|
1428
|
+
if (this.waiting) {
|
|
1429
|
+
this.measured = this.box;
|
|
1430
|
+
this.view = this.waiting;
|
|
1431
|
+
}
|
|
1369
1432
|
}
|
|
1370
1433
|
updated(changed) {
|
|
1434
|
+
this.keying = undefined;
|
|
1371
1435
|
super.updated(changed);
|
|
1372
1436
|
if (this.holding && !this.held) {
|
|
1373
1437
|
this.letGo();
|
|
@@ -1502,6 +1566,7 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
1502
1566
|
this.removeEventListener('pointerup', this.handlePointerUp);
|
|
1503
1567
|
}
|
|
1504
1568
|
willUpdate(changed) {
|
|
1569
|
+
this.keying = this.keyAll();
|
|
1505
1570
|
super.willUpdate(changed);
|
|
1506
1571
|
const drawn = extent(this.nodes);
|
|
1507
1572
|
const origin = { x: drawn.x - MARGIN, y: drawn.y - MARGIN };
|
|
@@ -1528,18 +1593,7 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
1528
1593
|
const stop = this.stop !== undefined && this.keyNamed(this.stop) === this.stop
|
|
1529
1594
|
? this.stop
|
|
1530
1595
|
: reading(all, this.edges, this.order ?? 'spatial')[0]?.id;
|
|
1531
|
-
const groups = this.groups;
|
|
1532
1596
|
for (const card of this.cards) {
|
|
1533
|
-
const group = card.group
|
|
1534
|
-
? undefined
|
|
1535
|
-
: groupOf({
|
|
1536
|
-
height: card.height,
|
|
1537
|
-
id: card.name,
|
|
1538
|
-
type: 'text',
|
|
1539
|
-
width: card.width,
|
|
1540
|
-
x: card.x,
|
|
1541
|
-
y: card.y,
|
|
1542
|
-
}, groups);
|
|
1543
1597
|
const x = finite(card.x) - origin.x;
|
|
1544
1598
|
const y = finite(card.y) - origin.y;
|
|
1545
1599
|
const placed = `${x} ${y} ${finite(card.width)} ${finite(card.height)}`;
|
|
@@ -1550,12 +1604,6 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
1550
1604
|
size(card, '--_canvas-card-inline-size', finite(card.width));
|
|
1551
1605
|
size(card, '--_canvas-card-block-size', finite(card.height));
|
|
1552
1606
|
}
|
|
1553
|
-
if (group) {
|
|
1554
|
-
card.setAttribute('data-group', group.id);
|
|
1555
|
-
}
|
|
1556
|
-
else {
|
|
1557
|
-
card.removeAttribute('data-group');
|
|
1558
|
-
}
|
|
1559
1607
|
const node = this.byId.get(card.name);
|
|
1560
1608
|
card.links = node ? this.linksOf(node) : '';
|
|
1561
1609
|
card.current = card.name === stop;
|
|
@@ -1616,7 +1664,8 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
1616
1664
|
const key = this.keyOf(edge);
|
|
1617
1665
|
const element = elements.get(key);
|
|
1618
1666
|
const drawn = this.geometryOf(edge, origin);
|
|
1619
|
-
|
|
1667
|
+
const lifted = this.linking?.edge === key && !this.linking.pressed;
|
|
1668
|
+
if (!drawn || (lifted && this.linking?.pointer !== undefined)) {
|
|
1620
1669
|
return nothing;
|
|
1621
1670
|
}
|
|
1622
1671
|
const { from, to } = drawn;
|
|
@@ -1632,7 +1681,9 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
1632
1681
|
role="button"
|
|
1633
1682
|
tabindex=${key === stop ? '0' : '-1'}
|
|
1634
1683
|
/>
|
|
1635
|
-
|
|
1684
|
+
${lifted
|
|
1685
|
+
? nothing
|
|
1686
|
+
: svg `<path
|
|
1636
1687
|
part="edge"
|
|
1637
1688
|
aria-hidden="true"
|
|
1638
1689
|
d=${drawn.d}
|
|
@@ -1643,7 +1694,7 @@ let HelixHeadlessCanvas = class HelixHeadlessCanvas extends MixinViewport(HelixE
|
|
|
1643
1694
|
marker-end=${ends.end ? `url(#${ARROW})` : nothing}
|
|
1644
1695
|
marker-start=${ends.start ? `url(#${ARROW})` : nothing}
|
|
1645
1696
|
style=${custom(element, '--canvas-edge-color') ? `--_canvas-edge-color: ${custom(element, '--canvas-edge-color')}` : nothing}
|
|
1646
|
-
|
|
1697
|
+
/>`}
|
|
1647
1698
|
`;
|
|
1648
1699
|
})}
|
|
1649
1700
|
${this.renderDraft(origin)}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fusion.dev/helix-headless",
|
|
3
3
|
"description": "Headless component tier. Structure, accessibility, state, and form participation. No styling.",
|
|
4
|
-
"version": "0.110.
|
|
4
|
+
"version": "0.110.5",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ross Sheppard <ross.sheppard@fusion.dev>",
|
|
7
7
|
"repository": {
|
|
@@ -46,13 +46,13 @@
|
|
|
46
46
|
},
|
|
47
47
|
"bugs": "https://github.com/project-fusion/fusion/issues",
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@fusion.dev/helix-core": "0.110.
|
|
50
|
-
"@fusion.dev/helix-icons": "0.110.
|
|
49
|
+
"@fusion.dev/helix-core": "0.110.5",
|
|
50
|
+
"@fusion.dev/helix-icons": "0.110.5",
|
|
51
51
|
"uqr": "^0.1.3"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@fusion.dev/helix-cem": "0.110.
|
|
55
|
-
"@fusion.dev/helix-testing": "0.110.
|
|
54
|
+
"@fusion.dev/helix-cem": "0.110.5",
|
|
55
|
+
"@fusion.dev/helix-testing": "0.110.5",
|
|
56
56
|
"@fusion.dev/scripts": "0.0.0-dev",
|
|
57
57
|
"@happy-dom/global-registrator": "^20.0.0",
|
|
58
58
|
"@lit-labs/ssr": "^4.1.0",
|
package/types/jsx.d.ts
CHANGED
|
@@ -24856,7 +24856,7 @@ export type CustomElements = {
|
|
|
24856
24856
|
* - `empty`: While the document has no nodes.
|
|
24857
24857
|
* - `fullscreen`: While the board fills the screen.
|
|
24858
24858
|
* - `holding`: An item picked up with a click follows the pointer until the next press puts it down.
|
|
24859
|
-
* - `idle`: The user has been still
|
|
24859
|
+
* - `idle`: The user has been still for `idle-delay` milliseconds. The board's own controls stay; select on it to hide chrome of your own.
|
|
24860
24860
|
* - `pressing`: While a press on the board, its cards or its connections is under way.
|
|
24861
24861
|
* - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
|
|
24862
24862
|
*/
|
|
@@ -44789,7 +44789,7 @@ export type CustomElementsSolidJs = {
|
|
|
44789
44789
|
* - `empty`: While the document has no nodes.
|
|
44790
44790
|
* - `fullscreen`: While the board fills the screen.
|
|
44791
44791
|
* - `holding`: An item picked up with a click follows the pointer until the next press puts it down.
|
|
44792
|
-
* - `idle`: The user has been still
|
|
44792
|
+
* - `idle`: The user has been still for `idle-delay` milliseconds. The board's own controls stay; select on it to hide chrome of your own.
|
|
44793
44793
|
* - `pressing`: While a press on the board, its cards or its connections is under way.
|
|
44794
44794
|
* - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
|
|
44795
44795
|
*/
|