@heyramzi/ui 2.11.1 → 2.11.2
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/agents/helpers.js +38 -38
- package/dist/agents/page-state.js +49 -50
- package/dist/agents/vendor/color.js +146 -127
- package/dist/agents/vendor/draw.js +617 -508
- package/dist/agents/vendor/engine.js +698 -599
- package/dist/agents/vendor/mesh.js +653 -683
- package/dist/agents/vendor/plastic.js +3913 -3112
- package/dist/agents/vendor/presets.js +163 -164
- package/dist/agents/vendor/shapes.js +21 -20
- package/dist/agents/vendor/ticker.js +41 -42
- package/dist/agents/vendor/types.js +1 -0
- package/dist/agents/vendor/wear.js +1421 -1448
- package/dist/ai/confirmation/confirmation-context.svelte.js +6 -6
- package/dist/ai/confirmation/index.js +3 -1
- package/dist/ai/index.js +33 -0
- package/dist/ai/prompt-input/index.js +3 -1
- package/dist/ai/reasoning/index.js +3 -1
- package/dist/ai/reasoning/reasoning-context.svelte.js +6 -6
- package/dist/ai/suggestion/index.js +3 -1
- package/dist/ai/typing-dots/index.js +3 -1
- package/dist/animations/text-swap.js +24 -24
- package/dist/brand/index.js +54 -48
- package/dist/canvas/card/resize.js +5 -3
- package/dist/canvas/edges/edge-path.js +255 -242
- package/dist/canvas/editor/context-menu.js +39 -36
- package/dist/canvas/editor/dispatch.svelte.js +154 -151
- package/dist/canvas/editor/editor-context.js +7 -2
- package/dist/canvas/editor/editor-mode.js +1 -0
- package/dist/canvas/editor/frame.js +73 -76
- package/dist/canvas/editor/hand-context.js +5 -2
- package/dist/canvas/editor/history-core.js +163 -191
- package/dist/canvas/editor/keymap.js +95 -169
- package/dist/canvas/editor/layout-actions.js +143 -144
- package/dist/canvas/editor/lock.js +52 -51
- package/dist/canvas/editor/rebase.js +217 -240
- package/dist/canvas/editor/style.js +132 -137
- package/dist/canvas/editor/text-field-context.js +7 -2
- package/dist/canvas/editor/z-order.js +65 -70
- package/dist/canvas/headless/alignment.js +22 -16
- package/dist/canvas/headless/break-apart-find.js +286 -279
- package/dist/canvas/headless/break-apart-pieces.js +62 -58
- package/dist/canvas/headless/break-apart-plan.js +299 -325
- package/dist/canvas/headless/break-apart-style.js +75 -70
- package/dist/canvas/headless/break-apart.js +188 -181
- package/dist/canvas/headless/canvas-cleanup.js +78 -58
- package/dist/canvas/headless/edge-anchors.js +115 -116
- package/dist/canvas/headless/edge-memo.js +24 -22
- package/dist/canvas/headless/edge-serialization.js +17 -27
- package/dist/canvas/headless/figure-geometry.js +232 -264
- package/dist/canvas/headless/fit-viewport.js +84 -67
- package/dist/canvas/headless/grid.js +88 -86
- package/dist/canvas/headless/icon-node.js +44 -36
- package/dist/canvas/headless/index.js +1 -0
- package/dist/canvas/headless/linkify.js +17 -19
- package/dist/canvas/headless/pen-marks.js +101 -95
- package/dist/canvas/headless/sketch.js +231 -209
- package/dist/canvas/headless/snap-guides.js +99 -83
- package/dist/canvas/headless/svg-figure.js +133 -117
- package/dist/canvas/headless/table-layout.js +146 -107
- package/dist/canvas/index.js +2 -0
- package/dist/canvas/lod/lod-mode.svelte.js +20 -18
- package/dist/canvas/lod/render-all.svelte.js +36 -39
- package/dist/canvas/ops/arrange.js +78 -71
- package/dist/canvas/ops/ops.js +260 -255
- package/dist/canvas/pen/colors.js +37 -35
- package/dist/canvas/pen/eraser.js +28 -27
- package/dist/canvas/pen/geometry.js +120 -130
- package/dist/canvas/pen/index.js +1 -0
- package/dist/canvas/pen/ops.js +11 -11
- package/dist/canvas/pen/pen-session.js +150 -159
- package/dist/canvas/pen/plugin.js +107 -104
- package/dist/canvas/pen/shapes.js +73 -68
- package/dist/canvas/pen/stroke-path.js +32 -30
- package/dist/canvas/pen/types.js +21 -21
- package/dist/canvas/pen/ui.js +10 -8
- package/dist/canvas/plugin.js +46 -46
- package/dist/canvas/screen/glyphs.js +12 -11
- package/dist/canvas/screen/labels.js +22 -22
- package/dist/canvas/screen/parts.js +98 -111
- package/dist/canvas/screen/plugin.js +47 -56
- package/dist/canvas/screen/types.js +30 -35
- package/dist/canvas/screen/ui.js +7 -7
- package/dist/canvas/test-utils.js +14 -14
- package/dist/canvas/types.js +1 -0
- package/dist/canvas/ui/forward-wheel.js +24 -25
- package/dist/canvas/ui/icons.js +64 -131
- package/dist/canvas/ui/place-panel.js +58 -49
- package/dist/canvas/ui/shortcut-tip.js +14 -12
- package/dist/canvas/ui/tools.js +300 -385
- package/dist/charts/dashboard/chart.js +4 -0
- package/dist/charts/dashboard/data-table.js +11 -0
- package/dist/charts/dashboard/windows.js +8 -3
- package/dist/charts/edge-fade.js +10 -5
- package/dist/charts/hover-band.js +16 -11
- package/dist/charts/index.js +0 -1
- package/dist/charts/motion.js +11 -7
- package/dist/charts/primitives/chart-utils.js +12 -12
- package/dist/components/copy/clipboard.js +32 -32
- package/dist/components/copy/copied.svelte.js +31 -23
- package/dist/components/data-table/data-table.js +39 -39
- package/dist/components/docs/index.js +4 -0
- package/dist/components/docs/scroll-spy.svelte.js +73 -68
- package/dist/components/list-page/filter-section.js +4 -1
- package/dist/components/list-page/index.js +2 -0
- package/dist/components/list-page/list-table.js +7 -2
- package/dist/components/list-page/queue-rail.js +14 -0
- package/dist/components/list-page/section-host.js +4 -2
- package/dist/components/list-page/step.js +4 -3
- package/dist/components/list-page/types.js +1 -0
- package/dist/components/picker/trigger.js +48 -30
- package/dist/components/picker/types.js +1 -0
- package/dist/components/segmented/collapse.js +38 -27
- package/dist/components/segmented/index.js +8 -0
- package/dist/components/segmented/segmented.js +67 -42
- package/dist/components/star-rating-input/index.js +3 -1
- package/dist/components/table-view/types.js +1 -0
- package/dist/components/tags-input/tags.js +81 -69
- package/dist/components/theme/index.js +4 -0
- package/dist/components/toolbar/index.js +4 -0
- package/dist/components/toolbar/toolbar-trigger.js +14 -1
- package/dist/editor/anchors.js +17 -13
- package/dist/editor/block-id.js +52 -51
- package/dist/editor/block-ops.js +108 -80
- package/dist/editor/doc-blocks.js +155 -166
- package/dist/editor/extensions.js +139 -180
- package/dist/editor/index.js +4 -0
- package/dist/editor/markdown-test-helpers.js +4 -2
- package/dist/editor/markdown.js +420 -408
- package/dist/editor/serializer.js +204 -200
- package/dist/editor/slash-items.js +89 -101
- package/dist/editor/youtube-url.js +25 -20
- package/dist/effects/animated-beam/path-calculator.svelte.js +43 -38
- package/dist/effects/animated-beam/types.js +1 -0
- package/dist/effects/border-beam/css.js +92 -78
- package/dist/effects/border-beam/presets.js +1705 -1720
- package/dist/effects/border-beam/register-properties.js +43 -33
- package/dist/effects/border-beam/types.js +1 -0
- package/dist/effects/image-comparison/compare.js +3 -2
- package/dist/effects/image-reveal/types.js +1 -0
- package/dist/effects/magnetic/magnetic.js +58 -52
- package/dist/effects/reveal/observe.js +50 -40
- package/dist/effects/reveal/types.js +1 -0
- package/dist/effects/shader-gradient/color.js +36 -29
- package/dist/effects/shader-gradient/renderer.js +384 -295
- package/dist/effects/shader-gradient/shaders.js +31 -0
- package/dist/effects/shader-gradient/types.js +1 -0
- package/dist/icons/apple-symbol-exports.js +99 -124
- package/dist/icons/sf-symbols.js +357 -461
- package/dist/icons/trades.js +43 -28
- package/dist/inbox/index.js +1 -0
- package/dist/inbox/logic.js +126 -122
- package/dist/inbox/types.js +43 -43
- package/dist/lib/arrive.js +19 -12
- package/dist/lib/icon-types.js +1 -0
- package/dist/lib/initials.js +16 -10
- package/dist/lib/layout.js +5 -0
- package/dist/lib/panel.js +13 -0
- package/dist/lib/result.js +22 -22
- package/dist/lib/sliding-pill.js +59 -44
- package/dist/lib/theme-transition.js +43 -43
- package/dist/lib/tone.js +31 -24
- package/dist/lib/utils.js +3 -1
- package/dist/onboarding/define-tours.js +24 -23
- package/dist/onboarding/onboarding.svelte.js +16 -12
- package/dist/onboarding/pick.js +10 -6
- package/dist/onboarding/stores.js +40 -41
- package/dist/onboarding/wait.js +24 -23
- package/dist/panel/side-panel-types.js +1 -0
- package/dist/record/demo-data.js +459 -486
- package/dist/record/fields.js +129 -131
- package/dist/record/format.js +70 -82
- package/dist/record/gutter.js +1 -0
- package/dist/record/kinds.js +95 -105
- package/dist/record/logic.js +238 -219
- package/dist/record/types.js +49 -48
- package/dist/shadcn/accordion/index.js +3 -1
- package/dist/shadcn/alert/index.js +3 -1
- package/dist/shadcn/alert-dialog/index.js +3 -1
- package/dist/shadcn/attachment/index.js +3 -1
- package/dist/shadcn/avatar/index.js +3 -1
- package/dist/shadcn/breadcrumb/index.js +3 -1
- package/dist/shadcn/bubble/index.js +3 -1
- package/dist/shadcn/button/index.js +3 -1
- package/dist/shadcn/calendar/index.js +3 -1
- package/dist/shadcn/card/index.js +3 -1
- package/dist/shadcn/checkbox/index.js +3 -1
- package/dist/shadcn/code-block/index.js +3 -1
- package/dist/shadcn/collapsible/index.js +3 -1
- package/dist/shadcn/command/index.js +4 -1
- package/dist/shadcn/context-menu/index.js +3 -1
- package/dist/shadcn/dialog/index.js +3 -1
- package/dist/shadcn/dropdown-menu/menu-item.js +40 -20
- package/dist/shadcn/empty/index.js +3 -1
- package/dist/shadcn/field/index.js +3 -1
- package/dist/shadcn/hooks/highlighter.js +77 -75
- package/dist/shadcn/hooks/is-mobile.svelte.js +3 -3
- package/dist/shadcn/hooks/use-highlighted-code.svelte.js +62 -62
- package/dist/shadcn/input/index.js +3 -1
- package/dist/shadcn/kbd/index.js +3 -1
- package/dist/shadcn/label/index.js +3 -1
- package/dist/shadcn/marker/index.js +3 -1
- package/dist/shadcn/message/index.js +3 -1
- package/dist/shadcn/message-scroller/index.js +3 -1
- package/dist/shadcn/popover/index.js +3 -1
- package/dist/shadcn/progress/index.js +3 -1
- package/dist/shadcn/progress/tone.js +8 -7
- package/dist/shadcn/radio-group/index.js +3 -1
- package/dist/shadcn/scroll-area/index.js +3 -1
- package/dist/shadcn/select/index.js +3 -1
- package/dist/shadcn/separator/index.js +3 -1
- package/dist/shadcn/sheet/index.js +3 -1
- package/dist/shadcn/sidebar/context.svelte.js +42 -28
- package/dist/shadcn/sidebar/index.js +3 -1
- package/dist/shadcn/skeleton/index.js +3 -1
- package/dist/shadcn/slider/index.js +3 -1
- package/dist/shadcn/switch/index.js +3 -1
- package/dist/shadcn/table/index.js +3 -1
- package/dist/shadcn/tabs/index.js +3 -1
- package/dist/shadcn/textarea/index.js +3 -1
- package/dist/shadcn/toggle/index.js +3 -1
- package/dist/shadcn/toggle-group/index.js +3 -1
- package/dist/shadcn/tooltip/context.js +7 -2
- package/dist/shadcn/tooltip/index.js +3 -1
- package/dist/shadcn/trace/index.js +3 -1
- package/dist/slides/bridges.js +65 -59
- package/dist/slides/deck-controller.svelte.js +210 -207
- package/dist/slides/export/capture.js +66 -71
- package/dist/slides/export/ffmpeg.js +76 -72
- package/dist/slides/export/index.js +3 -0
- package/dist/slides/export/launch.js +9 -6
- package/dist/slides/export/pdf.js +60 -54
- package/dist/slides/export/types.js +1 -0
- package/dist/slides/labels.js +24 -24
- package/dist/slides/layout.js +39 -41
- package/dist/slides/model.js +9 -7
- package/dist/slides/navigation.js +78 -73
- package/dist/slides/types.js +2 -2
- package/dist/status/define-statuses.js +18 -14
- package/dist/status/status-types.js +1 -0
- package/dist/test-setup.js +24 -20
- package/dist/thread/logic.js +73 -77
- package/dist/thread/types.js +21 -21
- package/dist/work/board-order.js +94 -90
- package/dist/work/dates.js +16 -9
- package/dist/work/detail/detail-types.js +18 -18
- package/dist/work/docs/edited.js +32 -29
- package/dist/work/docs/index.js +4 -0
- package/dist/work/docs/labels.js +34 -34
- package/dist/work/docs/menu.js +113 -106
- package/dist/work/docs/outline.js +39 -29
- package/dist/work/gantt/logic.js +211 -235
- package/dist/work/inbox/inbox-logic.js +71 -75
- package/dist/work/inbox/inbox-statuses.js +75 -72
- package/dist/work/inbox/inbox-types.js +1 -0
- package/dist/work/kanban-drag.js +27 -22
- package/dist/work/kanban-types.js +1 -0
- package/dist/work/presets/sales.js +36 -32
- package/dist/work/reorder.js +9 -8
- package/dist/work/task-types.js +1 -0
- package/dist/work/time/duration.js +51 -46
- package/dist/work/time/time-types.js +23 -23
- package/dist/work/use-kanban-dnd.svelte.js +126 -125
- package/package.json +3 -1
- package/src/components/list-page/master-detail.svelte +3 -1
- package/src/components/list-page/rail-row.svelte +4 -4
- package/src/editor/markdown.ts +30 -35
|
@@ -1,70 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data fields that exist only at runtime and must never persist. The tree child
|
|
3
|
+
* counts are recomputed on load; saved, they froze stale values.
|
|
4
|
+
*/
|
|
1
5
|
const RUNTIME_DATA_FIELDS = new Set([
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
6
|
+
"leftChildCount",
|
|
7
|
+
"rightChildCount",
|
|
8
|
+
"locale"
|
|
5
9
|
]);
|
|
6
10
|
function persistentData(source) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const data = {};
|
|
12
|
+
for (const [key, value] of Object.entries(source ?? {})) {
|
|
13
|
+
if (RUNTIME_DATA_FIELDS.has(key)) continue;
|
|
14
|
+
if (typeof value === "function" || value === undefined) continue;
|
|
15
|
+
data[key] = value;
|
|
16
|
+
}
|
|
17
|
+
return data;
|
|
14
18
|
}
|
|
19
|
+
/** Strip runtime-only content from nodes for serialization. */
|
|
20
|
+
// Top-level fields are an allowlist, dropping SvelteFlow's runtime state. Data
|
|
21
|
+
// fields keep everything but functions and RUNTIME_DATA_FIELDS, so new fields survive saves.
|
|
15
22
|
export function stripCallbacks(nodes) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
return nodes.map((n) => {
|
|
24
|
+
// Rebuilt field-by-field; `N` is a subtype of the shape rebuilt here, so the
|
|
25
|
+
// narrowing back to `N` is the one place the type can't follow.
|
|
26
|
+
const result = {
|
|
27
|
+
id: n.id,
|
|
28
|
+
type: n.type,
|
|
29
|
+
position: n.position,
|
|
30
|
+
data: persistentData(n.data)
|
|
31
|
+
};
|
|
32
|
+
if (n.parentId) result.parentId = n.parentId;
|
|
33
|
+
if (n.extent) result.extent = n.extent;
|
|
34
|
+
if (n.style) result.style = n.style;
|
|
35
|
+
if (typeof n.width === "number") result.width = n.width;
|
|
36
|
+
if (typeof n.height === "number") result.height = n.height;
|
|
37
|
+
if (typeof n.zIndex === "number") result.zIndex = n.zIndex;
|
|
38
|
+
return result;
|
|
39
|
+
});
|
|
31
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Remove edges that reference nodes not present in the node list.
|
|
43
|
+
*/
|
|
32
44
|
export function removeOrphanedEdges(edges, nodeIds) {
|
|
33
|
-
|
|
45
|
+
return edges.filter((edge) => nodeIds.has(edge.source) && nodeIds.has(edge.target));
|
|
34
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Parents before children, as SvelteFlow needs. Roots keep their order,
|
|
49
|
+
* because array order is paint order and flipping it buries new ink.
|
|
50
|
+
*/
|
|
35
51
|
export function sortParentsFirst(nodes) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
const idSet = new Set(nodes.map((n) => n.id));
|
|
53
|
+
const roots = [];
|
|
54
|
+
const childrenOf = new Map();
|
|
55
|
+
for (const n of nodes) {
|
|
56
|
+
if (!n.parentId || !idSet.has(n.parentId)) {
|
|
57
|
+
roots.push(n);
|
|
58
|
+
} else {
|
|
59
|
+
const siblings = childrenOf.get(n.parentId) ?? [];
|
|
60
|
+
siblings.push(n);
|
|
61
|
+
childrenOf.set(n.parentId, siblings);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const sorted = [];
|
|
65
|
+
const stack = roots.toReversed();
|
|
66
|
+
for (let node = stack.pop(); node !== undefined; node = stack.pop()) {
|
|
67
|
+
sorted.push(node);
|
|
68
|
+
const children = childrenOf.get(node.id);
|
|
69
|
+
if (children) {
|
|
70
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
71
|
+
stack.push(children[i]);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return sorted;
|
|
60
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Fix broken parentId references by clearing parentId/extent
|
|
79
|
+
* when the referenced parent no longer exists.
|
|
80
|
+
*/
|
|
61
81
|
export function fixBrokenParentIds(nodes) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
82
|
+
const nodeIds = new Set(nodes.map((n) => n.id));
|
|
83
|
+
return nodes.map((node) => {
|
|
84
|
+
if (node.parentId && !nodeIds.has(node.parentId)) {
|
|
85
|
+
const { parentId: _, extent: __, ...rest } = node;
|
|
86
|
+
return rest;
|
|
87
|
+
}
|
|
88
|
+
return node;
|
|
89
|
+
});
|
|
70
90
|
}
|
|
@@ -1,134 +1,133 @@
|
|
|
1
1
|
function center(rect) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
return {
|
|
3
|
+
x: rect.x + rect.width / 2,
|
|
4
|
+
y: rect.y + rect.height / 2
|
|
5
|
+
};
|
|
6
6
|
}
|
|
7
7
|
function anchorOn(rect, side) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
y: c.y,
|
|
32
|
-
side
|
|
33
|
-
};
|
|
34
|
-
}
|
|
8
|
+
const c = center(rect);
|
|
9
|
+
switch (side) {
|
|
10
|
+
case "top": return {
|
|
11
|
+
x: c.x,
|
|
12
|
+
y: rect.y,
|
|
13
|
+
side
|
|
14
|
+
};
|
|
15
|
+
case "bottom": return {
|
|
16
|
+
x: c.x,
|
|
17
|
+
y: rect.y + rect.height,
|
|
18
|
+
side
|
|
19
|
+
};
|
|
20
|
+
case "left": return {
|
|
21
|
+
x: rect.x,
|
|
22
|
+
y: c.y,
|
|
23
|
+
side
|
|
24
|
+
};
|
|
25
|
+
case "right": return {
|
|
26
|
+
x: rect.x + rect.width,
|
|
27
|
+
y: c.y,
|
|
28
|
+
side
|
|
29
|
+
};
|
|
30
|
+
}
|
|
35
31
|
}
|
|
32
|
+
/** The side a stored handle id names, or null for an id that isn't one of the four. */
|
|
36
33
|
export function sideFromHandle(id) {
|
|
37
|
-
|
|
34
|
+
return id === "top" || id === "right" || id === "bottom" || id === "left" ? id : null;
|
|
38
35
|
}
|
|
36
|
+
/** The side of `rect` that looks at `point`: the wider pull, scaled by the box's own shape, wins. */
|
|
39
37
|
function sideFacing(rect, point) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
const c = center(rect);
|
|
39
|
+
const dx = (point.x - c.x) / rect.width;
|
|
40
|
+
const dy = (point.y - c.y) / rect.height;
|
|
41
|
+
if (Math.abs(dx) > Math.abs(dy)) return dx >= 0 ? "right" : "left";
|
|
42
|
+
return dy >= 0 ? "bottom" : "top";
|
|
45
43
|
}
|
|
44
|
+
/** The anchors when the author pinned an end, or null for a link with no pin. */
|
|
46
45
|
function pinnedAnchors(source, target, pins) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
46
|
+
if (pins.source && pins.target) {
|
|
47
|
+
return {
|
|
48
|
+
source: anchorOn(source, pins.source),
|
|
49
|
+
target: anchorOn(target, pins.target)
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (pins.source) {
|
|
53
|
+
const from = anchorOn(source, pins.source);
|
|
54
|
+
return {
|
|
55
|
+
source: from,
|
|
56
|
+
target: anchorOn(target, sideFacing(target, from))
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (pins.target) {
|
|
60
|
+
const to = anchorOn(target, pins.target);
|
|
61
|
+
return {
|
|
62
|
+
source: anchorOn(source, sideFacing(source, to)),
|
|
63
|
+
target: to
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
68
67
|
}
|
|
68
|
+
/** The sides that face each other. A pin is the dot the author dragged from: it wins, and the free end faces it. */
|
|
69
69
|
export function bestAnchors(source, target, pins = {}) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
70
|
+
const pinned = pinnedAnchors(source, target, pins);
|
|
71
|
+
if (pinned) return pinned;
|
|
72
|
+
const gapX = Math.max(target.x - (source.x + source.width), source.x - (target.x + target.width));
|
|
73
|
+
const gapY = Math.max(target.y - (source.y + source.height), source.y - (target.y + target.height));
|
|
74
|
+
if (gapX <= 0 && gapY <= 0) {
|
|
75
|
+
const side = detourSide(source, target);
|
|
76
|
+
return {
|
|
77
|
+
source: anchorOn(source, side),
|
|
78
|
+
target: anchorOn(target, side)
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (gapX > gapY) {
|
|
82
|
+
const targetIsRight = center(target).x >= center(source).x;
|
|
83
|
+
return {
|
|
84
|
+
source: anchorOn(source, targetIsRight ? "right" : "left"),
|
|
85
|
+
target: anchorOn(target, targetIsRight ? "left" : "right")
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const targetIsBelow = center(target).y >= center(source).y;
|
|
89
|
+
return {
|
|
90
|
+
source: anchorOn(source, targetIsBelow ? "bottom" : "top"),
|
|
91
|
+
target: anchorOn(target, targetIsBelow ? "top" : "bottom")
|
|
92
|
+
};
|
|
93
93
|
}
|
|
94
|
+
// Which side an overlapping pair travels on: the wider overhang wins, ties go right.
|
|
94
95
|
function detourSide(source, target) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
96
|
+
const sL = source.x;
|
|
97
|
+
const sR = source.x + source.width;
|
|
98
|
+
const tL = target.x;
|
|
99
|
+
const tR = target.x + target.width;
|
|
100
|
+
if (sL <= tL && sR >= tR) {
|
|
101
|
+
return sR - tR >= tL - sL ? "right" : "left";
|
|
102
|
+
}
|
|
103
|
+
if (tL <= sL && tR >= sR) {
|
|
104
|
+
return tR - sR >= sL - tL ? "right" : "left";
|
|
105
|
+
}
|
|
106
|
+
return "right";
|
|
106
107
|
}
|
|
108
|
+
/** The x (left, right) or y (top, bottom) a same-side path runs along: one margin past the further box edge. */
|
|
107
109
|
export function sideDetour(anchors, margin = 40) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
return Math.min(source.y, target.y) - margin;
|
|
116
|
-
case "bottom":
|
|
117
|
-
return Math.max(source.y, target.y) + margin;
|
|
118
|
-
}
|
|
110
|
+
const { source, target } = anchors;
|
|
111
|
+
switch (source.side) {
|
|
112
|
+
case "left": return Math.min(source.x, target.x) - margin;
|
|
113
|
+
case "right": return Math.max(source.x, target.x) + margin;
|
|
114
|
+
case "top": return Math.min(source.y, target.y) - margin;
|
|
115
|
+
case "bottom": return Math.max(source.y, target.y) + margin;
|
|
116
|
+
}
|
|
119
117
|
}
|
|
118
|
+
/** Where the line from this outline's centre toward `toward` crosses the outline, `gap` further out. */
|
|
120
119
|
export function outlinePoint(o, toward, gap = 0) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
120
|
+
const dx = toward.x - o.cx;
|
|
121
|
+
const dy = toward.y - o.cy;
|
|
122
|
+
const len = Math.hypot(dx, dy);
|
|
123
|
+
if (len === 0) return {
|
|
124
|
+
x: o.cx,
|
|
125
|
+
y: o.cy
|
|
126
|
+
};
|
|
127
|
+
const t = o.round ? 1 / Math.hypot(dx / o.rx, dy / o.ry) : Math.min(dx === 0 ? Infinity : o.rx / Math.abs(dx), dy === 0 ? Infinity : o.ry / Math.abs(dy));
|
|
128
|
+
const reach = t * len + gap;
|
|
129
|
+
return {
|
|
130
|
+
x: o.cx + dx / len * reach,
|
|
131
|
+
y: o.cy + dy / len * reach
|
|
132
|
+
};
|
|
134
133
|
}
|
|
@@ -1,28 +1,30 @@
|
|
|
1
|
+
/** A box as `x,y,width,height`, or "" for a card with no size yet. */
|
|
1
2
|
export function boxKey(rect) {
|
|
2
|
-
|
|
3
|
+
return rect ? `${rect.x},${rect.y},${rect.width},${rect.height}` : "";
|
|
3
4
|
}
|
|
4
5
|
export function parseBox(key) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
if (!key) return null;
|
|
7
|
+
const [x, y, width, height] = key.split(",").map(Number);
|
|
8
|
+
return {
|
|
9
|
+
x,
|
|
10
|
+
y,
|
|
11
|
+
width,
|
|
12
|
+
height
|
|
13
|
+
};
|
|
13
14
|
}
|
|
15
|
+
/** Remembers up to `limit` results by key, dropping the least recently read first. */
|
|
14
16
|
export function createMemo(limit) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
17
|
+
const seen = new Map();
|
|
18
|
+
return (key, compute) => {
|
|
19
|
+
const hit = seen.get(key);
|
|
20
|
+
if (hit !== undefined) {
|
|
21
|
+
seen.delete(key);
|
|
22
|
+
seen.set(key, hit);
|
|
23
|
+
return hit;
|
|
24
|
+
}
|
|
25
|
+
const value = compute();
|
|
26
|
+
seen.set(key, value);
|
|
27
|
+
if (seen.size > limit) seen.delete(seen.keys().next().value);
|
|
28
|
+
return value;
|
|
29
|
+
};
|
|
28
30
|
}
|
|
@@ -1,31 +1,21 @@
|
|
|
1
1
|
export function serializeFlowEdge(edge) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
...edge.targetHandle && {
|
|
19
|
-
targetHandle: edge.targetHandle
|
|
20
|
-
},
|
|
21
|
-
...edge.style && {
|
|
22
|
-
style: edge.style
|
|
23
|
-
},
|
|
24
|
-
...edge.data && {
|
|
25
|
-
data: edge.data
|
|
26
|
-
}
|
|
27
|
-
};
|
|
2
|
+
return {
|
|
3
|
+
id: edge.id,
|
|
4
|
+
source: edge.source,
|
|
5
|
+
target: edge.target,
|
|
6
|
+
...edge.type && { type: edge.type },
|
|
7
|
+
...edge.label && { label: edge.label },
|
|
8
|
+
...edge.animated && { animated: edge.animated },
|
|
9
|
+
...edge.sourceHandle && { sourceHandle: edge.sourceHandle },
|
|
10
|
+
...edge.targetHandle && { targetHandle: edge.targetHandle },
|
|
11
|
+
...edge.style && {
|
|
12
|
+
// WHY: xyflow types `Edge["style"]` as a CSS-properties object (or a
|
|
13
|
+
// string, in older shapes); the persisted `CanvasEdge` just wants the
|
|
14
|
+
// properties bag. Narrowed once here.
|
|
15
|
+
style: edge.style },
|
|
16
|
+
...edge.data && { data: edge.data }
|
|
17
|
+
};
|
|
28
18
|
}
|
|
29
19
|
export function serializeFlowEdges(edges) {
|
|
30
|
-
|
|
20
|
+
return edges.map(serializeFlowEdge);
|
|
31
21
|
}
|