@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,221 +1,193 @@
|
|
|
1
1
|
import { sortParentsFirst } from "../headless/canvas-cleanup.js";
|
|
2
|
+
// Fields that churn without changing the document. Stripped, so selecting isn't
|
|
3
|
+
// an undo step and undo doesn't restore a stale selection.
|
|
2
4
|
const VOLATILE_NODE_FIELDS = new Set([
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
]);
|
|
8
|
-
const VOLATILE_EDGE_FIELDS = new Set([
|
|
9
|
-
"selected"
|
|
5
|
+
"selected",
|
|
6
|
+
"dragging",
|
|
7
|
+
"measured",
|
|
8
|
+
"resizing"
|
|
10
9
|
]);
|
|
10
|
+
const VOLATILE_EDGE_FIELDS = new Set(["selected"]);
|
|
11
11
|
function stripVolatile(record, volatile) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
const out = {};
|
|
13
|
+
for (const [key, value] of Object.entries(record)) {
|
|
14
|
+
if (volatile.has(key) || value === undefined) continue;
|
|
15
|
+
out[key] = value;
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
18
|
}
|
|
19
19
|
function clone(value) {
|
|
20
|
-
|
|
20
|
+
return JSON.parse(JSON.stringify(value));
|
|
21
21
|
}
|
|
22
22
|
function signature(record, volatile) {
|
|
23
|
-
|
|
23
|
+
return JSON.stringify(stripVolatile(record, volatile));
|
|
24
24
|
}
|
|
25
|
+
/** True when two versions of a card differ only in fields that churn without changing the document. */
|
|
25
26
|
export function isSameNode(a, b) {
|
|
26
|
-
|
|
27
|
+
return a === b || signature(a, VOLATILE_NODE_FIELDS) === signature(b, VOLATILE_NODE_FIELDS);
|
|
27
28
|
}
|
|
28
29
|
export function isSameEdge(a, b) {
|
|
29
|
-
|
|
30
|
+
return a === b || signature(a, VOLATILE_EDGE_FIELDS) === signature(b, VOLATILE_EDGE_FIELDS);
|
|
30
31
|
}
|
|
31
32
|
function diffOrder(base, current) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
const before = base.map((item) => item.id);
|
|
34
|
+
const after = current.map((item) => item.id);
|
|
35
|
+
const same = before.length === after.length && before.every((id, i) => id === after[i]);
|
|
36
|
+
return same ? undefined : {
|
|
37
|
+
before,
|
|
38
|
+
after
|
|
39
|
+
};
|
|
39
40
|
}
|
|
40
41
|
function diffCollection(base, current, volatile) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
42
|
+
const baseById = new Map(base.map((item) => [item.id, item]));
|
|
43
|
+
const currentById = new Map(current.map((item) => [item.id, item]));
|
|
44
|
+
const before = [];
|
|
45
|
+
const after = [];
|
|
46
|
+
for (const item of base) {
|
|
47
|
+
const counterpart = currentById.get(item.id);
|
|
48
|
+
if (!counterpart) {
|
|
49
|
+
before.push(clone(stripVolatile(item, volatile)));
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
// The same object is the same card: an untouched card costs nothing, however big the board.
|
|
53
|
+
if (item !== counterpart && signature(item, volatile) !== signature(counterpart, volatile)) {
|
|
54
|
+
before.push(clone(stripVolatile(item, volatile)));
|
|
55
|
+
after.push(clone(stripVolatile(counterpart, volatile)));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
for (const item of current) {
|
|
59
|
+
if (!baseById.has(item.id)) {
|
|
60
|
+
after.push(clone(stripVolatile(item, volatile)));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
before,
|
|
65
|
+
after
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Diff two flow states into a history entry, or null when nothing changed. An order change
|
|
70
|
+
* alone is no step, so a bare reshuffle adds no undo entry.
|
|
71
|
+
*/
|
|
72
72
|
export function diffFlowState(base, current) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
}
|
|
73
|
+
const nodes = diffCollection(base.nodes, current.nodes, VOLATILE_NODE_FIELDS);
|
|
74
|
+
const edges = diffCollection(base.edges, current.edges, VOLATILE_EDGE_FIELDS);
|
|
75
|
+
if (nodes.before.length === 0 && nodes.after.length === 0 && edges.before.length === 0 && edges.after.length === 0) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const nodeOrder = diffOrder(base.nodes, current.nodes);
|
|
79
|
+
const edgeOrder = diffOrder(base.edges, current.edges);
|
|
80
|
+
return {
|
|
81
|
+
nodesBefore: nodes.before,
|
|
82
|
+
nodesAfter: nodes.after,
|
|
83
|
+
edgesBefore: edges.before,
|
|
84
|
+
edgesAfter: edges.after,
|
|
85
|
+
...nodeOrder && { nodeOrder },
|
|
86
|
+
...edgeOrder && { edgeOrder }
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** Stable sort into `order`. An id the entry never saw keeps its place after the known ones. */
|
|
93
90
|
function sortByOrder(items, order) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
]));
|
|
99
|
-
const at = (item)=>rank.get(item.id) ?? order.length;
|
|
100
|
-
return items.toSorted((a, b)=>at(a) - at(b));
|
|
91
|
+
if (!order) return items;
|
|
92
|
+
const rank = new Map(order.map((id, index) => [id, index]));
|
|
93
|
+
const at = (item) => rank.get(item.id) ?? order.length;
|
|
94
|
+
return items.toSorted((a, b) => at(a) - at(b));
|
|
101
95
|
}
|
|
96
|
+
/** Only a child ahead of its parent breaks SvelteFlow, so a valid order is never regrouped. */
|
|
102
97
|
function parentsFirst(nodes) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
98
|
+
const seen = new Set();
|
|
99
|
+
const ids = new Set(nodes.map((node) => node.id));
|
|
100
|
+
for (const node of nodes) {
|
|
101
|
+
if (node.parentId && ids.has(node.parentId) && !seen.has(node.parentId)) {
|
|
102
|
+
return sortParentsFirst(nodes);
|
|
103
|
+
}
|
|
104
|
+
seen.add(node.id);
|
|
105
|
+
}
|
|
106
|
+
return nodes;
|
|
112
107
|
}
|
|
113
108
|
function applyCollection(items, restore, discard) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
109
|
+
const restoreById = new Map(restore.map((item) => [item.id, item]));
|
|
110
|
+
const discardIds = new Set(discard.map((item) => item.id));
|
|
111
|
+
// Drop pure additions of the direction being reverted.
|
|
112
|
+
let next = items.filter((item) => !(discardIds.has(item.id) && !restoreById.has(item.id)));
|
|
113
|
+
// Restore changed items in place.
|
|
114
|
+
const present = new Set(next.map((item) => item.id));
|
|
115
|
+
next = next.map((item) => {
|
|
116
|
+
const restored = restoreById.get(item.id);
|
|
117
|
+
if (!restored) return item;
|
|
118
|
+
// Selection is where you are, not what the document held, so an undo leaves it be.
|
|
119
|
+
const selected = item.selected;
|
|
120
|
+
return {
|
|
121
|
+
...clone(restored),
|
|
122
|
+
...selected !== undefined && { selected }
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
// Re-add items that were removed in the direction being reverted.
|
|
126
|
+
for (const item of restore) {
|
|
127
|
+
if (!present.has(item.id)) next.push(clone(item));
|
|
128
|
+
}
|
|
129
|
+
return next;
|
|
130
|
+
}
|
|
131
|
+
/** Apply a history entry to a state: "undo" restores the before side, "redo" the after side. */
|
|
137
132
|
export function applyHistoryEntry(state, entry, direction) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
entry.edgesAfter,
|
|
150
|
-
entry.edgesBefore
|
|
151
|
-
];
|
|
152
|
-
const side = direction === "undo" ? "before" : "after";
|
|
153
|
-
return {
|
|
154
|
-
nodes: parentsFirst(sortByOrder(applyCollection(state.nodes, restoreNodes, discardNodes), entry.nodeOrder?.[side])),
|
|
155
|
-
edges: sortByOrder(applyCollection(state.edges, restoreEdges, discardEdges), entry.edgeOrder?.[side])
|
|
156
|
-
};
|
|
157
|
-
}
|
|
133
|
+
const [restoreNodes, discardNodes] = direction === "undo" ? [entry.nodesBefore, entry.nodesAfter] : [entry.nodesAfter, entry.nodesBefore];
|
|
134
|
+
const [restoreEdges, discardEdges] = direction === "undo" ? [entry.edgesBefore, entry.edgesAfter] : [entry.edgesAfter, entry.edgesBefore];
|
|
135
|
+
const side = direction === "undo" ? "before" : "after";
|
|
136
|
+
return {
|
|
137
|
+
// WHY parentsFirst: SvelteFlow requires parents before children; a
|
|
138
|
+
// re-added container must land ahead of the children it re-adopts.
|
|
139
|
+
nodes: parentsFirst(sortByOrder(applyCollection(state.nodes, restoreNodes, discardNodes), entry.nodeOrder?.[side])),
|
|
140
|
+
edges: sortByOrder(applyCollection(state.edges, restoreEdges, discardEdges), entry.edgeOrder?.[side])
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/** An id's earliest before and latest after, so a node touched by both steps keeps its outer states. */
|
|
158
144
|
function mergeSides(first, second) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
const before = [
|
|
168
|
-
...first.before,
|
|
169
|
-
...second.before.filter((item)=>!firstTouched.has(item.id))
|
|
170
|
-
];
|
|
171
|
-
const after = [
|
|
172
|
-
...first.after.filter((item)=>!secondTouched.has(item.id)),
|
|
173
|
-
...second.after
|
|
174
|
-
];
|
|
175
|
-
return {
|
|
176
|
-
before,
|
|
177
|
-
after
|
|
178
|
-
};
|
|
145
|
+
const firstTouched = new Set([...first.before, ...first.after].map((item) => item.id));
|
|
146
|
+
const secondTouched = new Set([...second.before, ...second.after].map((item) => item.id));
|
|
147
|
+
const before = [...first.before, ...second.before.filter((item) => !firstTouched.has(item.id))];
|
|
148
|
+
const after = [...first.after.filter((item) => !secondTouched.has(item.id)), ...second.after];
|
|
149
|
+
return {
|
|
150
|
+
before,
|
|
151
|
+
after
|
|
152
|
+
};
|
|
179
153
|
}
|
|
180
154
|
function sameIds(a, b) {
|
|
181
|
-
|
|
155
|
+
return a.length === b.length && a.every((id, i) => id === b[i]);
|
|
182
156
|
}
|
|
157
|
+
/** No order change on one side means that step left the order alone, so the other side's end stands in. */
|
|
183
158
|
function mergeOrder(first, second) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
159
|
+
const before = first?.before ?? second?.before;
|
|
160
|
+
const after = second?.after ?? first?.after;
|
|
161
|
+
if (!before || !after) return undefined;
|
|
162
|
+
return sameIds(before, after) ? undefined : {
|
|
163
|
+
before,
|
|
164
|
+
after
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/** Fold two consecutive steps into one: undoing it restores the state before `first`. */
|
|
192
168
|
export function mergeHistoryEntries(first, second) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
...edgeOrder && {
|
|
218
|
-
edgeOrder
|
|
219
|
-
}
|
|
220
|
-
};
|
|
169
|
+
const nodes = mergeSides({
|
|
170
|
+
before: first.nodesBefore,
|
|
171
|
+
after: first.nodesAfter
|
|
172
|
+
}, {
|
|
173
|
+
before: second.nodesBefore,
|
|
174
|
+
after: second.nodesAfter
|
|
175
|
+
});
|
|
176
|
+
const edges = mergeSides({
|
|
177
|
+
before: first.edgesBefore,
|
|
178
|
+
after: first.edgesAfter
|
|
179
|
+
}, {
|
|
180
|
+
before: second.edgesBefore,
|
|
181
|
+
after: second.edgesAfter
|
|
182
|
+
});
|
|
183
|
+
const nodeOrder = mergeOrder(first.nodeOrder, second.nodeOrder);
|
|
184
|
+
const edgeOrder = mergeOrder(first.edgeOrder, second.edgeOrder);
|
|
185
|
+
return {
|
|
186
|
+
nodesBefore: nodes.before,
|
|
187
|
+
nodesAfter: nodes.after,
|
|
188
|
+
edgesBefore: edges.before,
|
|
189
|
+
edgesAfter: edges.after,
|
|
190
|
+
...nodeOrder && { nodeOrder },
|
|
191
|
+
...edgeOrder && { edgeOrder }
|
|
192
|
+
};
|
|
221
193
|
}
|