@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.
Files changed (266) hide show
  1. package/dist/agents/helpers.js +38 -38
  2. package/dist/agents/page-state.js +49 -50
  3. package/dist/agents/vendor/color.js +146 -127
  4. package/dist/agents/vendor/draw.js +617 -508
  5. package/dist/agents/vendor/engine.js +698 -599
  6. package/dist/agents/vendor/mesh.js +653 -683
  7. package/dist/agents/vendor/plastic.js +3913 -3112
  8. package/dist/agents/vendor/presets.js +163 -164
  9. package/dist/agents/vendor/shapes.js +21 -20
  10. package/dist/agents/vendor/ticker.js +41 -42
  11. package/dist/agents/vendor/types.js +1 -0
  12. package/dist/agents/vendor/wear.js +1421 -1448
  13. package/dist/ai/confirmation/confirmation-context.svelte.js +6 -6
  14. package/dist/ai/confirmation/index.js +3 -1
  15. package/dist/ai/index.js +33 -0
  16. package/dist/ai/prompt-input/index.js +3 -1
  17. package/dist/ai/reasoning/index.js +3 -1
  18. package/dist/ai/reasoning/reasoning-context.svelte.js +6 -6
  19. package/dist/ai/suggestion/index.js +3 -1
  20. package/dist/ai/typing-dots/index.js +3 -1
  21. package/dist/animations/text-swap.js +24 -24
  22. package/dist/brand/index.js +54 -48
  23. package/dist/canvas/card/resize.js +5 -3
  24. package/dist/canvas/edges/edge-path.js +255 -242
  25. package/dist/canvas/editor/context-menu.js +39 -36
  26. package/dist/canvas/editor/dispatch.svelte.js +154 -151
  27. package/dist/canvas/editor/editor-context.js +7 -2
  28. package/dist/canvas/editor/editor-mode.js +1 -0
  29. package/dist/canvas/editor/frame.js +73 -76
  30. package/dist/canvas/editor/hand-context.js +5 -2
  31. package/dist/canvas/editor/history-core.js +163 -191
  32. package/dist/canvas/editor/keymap.js +95 -169
  33. package/dist/canvas/editor/layout-actions.js +143 -144
  34. package/dist/canvas/editor/lock.js +52 -51
  35. package/dist/canvas/editor/rebase.js +217 -240
  36. package/dist/canvas/editor/style.js +132 -137
  37. package/dist/canvas/editor/text-field-context.js +7 -2
  38. package/dist/canvas/editor/z-order.js +65 -70
  39. package/dist/canvas/headless/alignment.js +22 -16
  40. package/dist/canvas/headless/break-apart-find.js +286 -279
  41. package/dist/canvas/headless/break-apart-pieces.js +62 -58
  42. package/dist/canvas/headless/break-apart-plan.js +299 -325
  43. package/dist/canvas/headless/break-apart-style.js +75 -70
  44. package/dist/canvas/headless/break-apart.js +188 -181
  45. package/dist/canvas/headless/canvas-cleanup.js +78 -58
  46. package/dist/canvas/headless/edge-anchors.js +115 -116
  47. package/dist/canvas/headless/edge-memo.js +24 -22
  48. package/dist/canvas/headless/edge-serialization.js +17 -27
  49. package/dist/canvas/headless/figure-geometry.js +232 -264
  50. package/dist/canvas/headless/fit-viewport.js +84 -67
  51. package/dist/canvas/headless/grid.js +88 -86
  52. package/dist/canvas/headless/icon-node.js +44 -36
  53. package/dist/canvas/headless/index.js +1 -0
  54. package/dist/canvas/headless/linkify.js +17 -19
  55. package/dist/canvas/headless/pen-marks.js +101 -95
  56. package/dist/canvas/headless/sketch.js +231 -209
  57. package/dist/canvas/headless/snap-guides.js +99 -83
  58. package/dist/canvas/headless/svg-figure.js +133 -117
  59. package/dist/canvas/headless/table-layout.js +146 -107
  60. package/dist/canvas/index.js +2 -0
  61. package/dist/canvas/lod/lod-mode.svelte.js +20 -18
  62. package/dist/canvas/lod/render-all.svelte.js +36 -39
  63. package/dist/canvas/ops/arrange.js +78 -71
  64. package/dist/canvas/ops/ops.js +260 -255
  65. package/dist/canvas/pen/colors.js +37 -35
  66. package/dist/canvas/pen/eraser.js +28 -27
  67. package/dist/canvas/pen/geometry.js +120 -130
  68. package/dist/canvas/pen/index.js +1 -0
  69. package/dist/canvas/pen/ops.js +11 -11
  70. package/dist/canvas/pen/pen-session.js +150 -159
  71. package/dist/canvas/pen/plugin.js +107 -104
  72. package/dist/canvas/pen/shapes.js +73 -68
  73. package/dist/canvas/pen/stroke-path.js +32 -30
  74. package/dist/canvas/pen/types.js +21 -21
  75. package/dist/canvas/pen/ui.js +10 -8
  76. package/dist/canvas/plugin.js +46 -46
  77. package/dist/canvas/screen/glyphs.js +12 -11
  78. package/dist/canvas/screen/labels.js +22 -22
  79. package/dist/canvas/screen/parts.js +98 -111
  80. package/dist/canvas/screen/plugin.js +47 -56
  81. package/dist/canvas/screen/types.js +30 -35
  82. package/dist/canvas/screen/ui.js +7 -7
  83. package/dist/canvas/test-utils.js +14 -14
  84. package/dist/canvas/types.js +1 -0
  85. package/dist/canvas/ui/forward-wheel.js +24 -25
  86. package/dist/canvas/ui/icons.js +64 -131
  87. package/dist/canvas/ui/place-panel.js +58 -49
  88. package/dist/canvas/ui/shortcut-tip.js +14 -12
  89. package/dist/canvas/ui/tools.js +300 -385
  90. package/dist/charts/dashboard/chart.js +4 -0
  91. package/dist/charts/dashboard/data-table.js +11 -0
  92. package/dist/charts/dashboard/windows.js +8 -3
  93. package/dist/charts/edge-fade.js +10 -5
  94. package/dist/charts/hover-band.js +16 -11
  95. package/dist/charts/index.js +0 -1
  96. package/dist/charts/motion.js +11 -7
  97. package/dist/charts/primitives/chart-utils.js +12 -12
  98. package/dist/components/copy/clipboard.js +32 -32
  99. package/dist/components/copy/copied.svelte.js +31 -23
  100. package/dist/components/data-table/data-table.js +39 -39
  101. package/dist/components/docs/index.js +4 -0
  102. package/dist/components/docs/scroll-spy.svelte.js +73 -68
  103. package/dist/components/list-page/filter-section.js +4 -1
  104. package/dist/components/list-page/index.js +2 -0
  105. package/dist/components/list-page/list-table.js +7 -2
  106. package/dist/components/list-page/queue-rail.js +14 -0
  107. package/dist/components/list-page/section-host.js +4 -2
  108. package/dist/components/list-page/step.js +4 -3
  109. package/dist/components/list-page/types.js +1 -0
  110. package/dist/components/picker/trigger.js +48 -30
  111. package/dist/components/picker/types.js +1 -0
  112. package/dist/components/segmented/collapse.js +38 -27
  113. package/dist/components/segmented/index.js +8 -0
  114. package/dist/components/segmented/segmented.js +67 -42
  115. package/dist/components/star-rating-input/index.js +3 -1
  116. package/dist/components/table-view/types.js +1 -0
  117. package/dist/components/tags-input/tags.js +81 -69
  118. package/dist/components/theme/index.js +4 -0
  119. package/dist/components/toolbar/index.js +4 -0
  120. package/dist/components/toolbar/toolbar-trigger.js +14 -1
  121. package/dist/editor/anchors.js +17 -13
  122. package/dist/editor/block-id.js +52 -51
  123. package/dist/editor/block-ops.js +108 -80
  124. package/dist/editor/doc-blocks.js +155 -166
  125. package/dist/editor/extensions.js +139 -180
  126. package/dist/editor/index.js +4 -0
  127. package/dist/editor/markdown-test-helpers.js +4 -2
  128. package/dist/editor/markdown.js +420 -408
  129. package/dist/editor/serializer.js +204 -200
  130. package/dist/editor/slash-items.js +89 -101
  131. package/dist/editor/youtube-url.js +25 -20
  132. package/dist/effects/animated-beam/path-calculator.svelte.js +43 -38
  133. package/dist/effects/animated-beam/types.js +1 -0
  134. package/dist/effects/border-beam/css.js +92 -78
  135. package/dist/effects/border-beam/presets.js +1705 -1720
  136. package/dist/effects/border-beam/register-properties.js +43 -33
  137. package/dist/effects/border-beam/types.js +1 -0
  138. package/dist/effects/image-comparison/compare.js +3 -2
  139. package/dist/effects/image-reveal/types.js +1 -0
  140. package/dist/effects/magnetic/magnetic.js +58 -52
  141. package/dist/effects/reveal/observe.js +50 -40
  142. package/dist/effects/reveal/types.js +1 -0
  143. package/dist/effects/shader-gradient/color.js +36 -29
  144. package/dist/effects/shader-gradient/renderer.js +384 -295
  145. package/dist/effects/shader-gradient/shaders.js +31 -0
  146. package/dist/effects/shader-gradient/types.js +1 -0
  147. package/dist/icons/apple-symbol-exports.js +99 -124
  148. package/dist/icons/sf-symbols.js +357 -461
  149. package/dist/icons/trades.js +43 -28
  150. package/dist/inbox/index.js +1 -0
  151. package/dist/inbox/logic.js +126 -122
  152. package/dist/inbox/types.js +43 -43
  153. package/dist/lib/arrive.js +19 -12
  154. package/dist/lib/icon-types.js +1 -0
  155. package/dist/lib/initials.js +16 -10
  156. package/dist/lib/layout.js +5 -0
  157. package/dist/lib/panel.js +13 -0
  158. package/dist/lib/result.js +22 -22
  159. package/dist/lib/sliding-pill.js +59 -44
  160. package/dist/lib/theme-transition.js +43 -43
  161. package/dist/lib/tone.js +31 -24
  162. package/dist/lib/utils.js +3 -1
  163. package/dist/onboarding/define-tours.js +24 -23
  164. package/dist/onboarding/onboarding.svelte.js +16 -12
  165. package/dist/onboarding/pick.js +10 -6
  166. package/dist/onboarding/stores.js +40 -41
  167. package/dist/onboarding/wait.js +24 -23
  168. package/dist/panel/side-panel-types.js +1 -0
  169. package/dist/record/demo-data.js +459 -486
  170. package/dist/record/fields.js +129 -131
  171. package/dist/record/format.js +70 -82
  172. package/dist/record/gutter.js +1 -0
  173. package/dist/record/kinds.js +95 -105
  174. package/dist/record/logic.js +238 -219
  175. package/dist/record/types.js +49 -48
  176. package/dist/shadcn/accordion/index.js +3 -1
  177. package/dist/shadcn/alert/index.js +3 -1
  178. package/dist/shadcn/alert-dialog/index.js +3 -1
  179. package/dist/shadcn/attachment/index.js +3 -1
  180. package/dist/shadcn/avatar/index.js +3 -1
  181. package/dist/shadcn/breadcrumb/index.js +3 -1
  182. package/dist/shadcn/bubble/index.js +3 -1
  183. package/dist/shadcn/button/index.js +3 -1
  184. package/dist/shadcn/calendar/index.js +3 -1
  185. package/dist/shadcn/card/index.js +3 -1
  186. package/dist/shadcn/checkbox/index.js +3 -1
  187. package/dist/shadcn/code-block/index.js +3 -1
  188. package/dist/shadcn/collapsible/index.js +3 -1
  189. package/dist/shadcn/command/index.js +4 -1
  190. package/dist/shadcn/context-menu/index.js +3 -1
  191. package/dist/shadcn/dialog/index.js +3 -1
  192. package/dist/shadcn/dropdown-menu/menu-item.js +40 -20
  193. package/dist/shadcn/empty/index.js +3 -1
  194. package/dist/shadcn/field/index.js +3 -1
  195. package/dist/shadcn/hooks/highlighter.js +77 -75
  196. package/dist/shadcn/hooks/is-mobile.svelte.js +3 -3
  197. package/dist/shadcn/hooks/use-highlighted-code.svelte.js +62 -62
  198. package/dist/shadcn/input/index.js +3 -1
  199. package/dist/shadcn/kbd/index.js +3 -1
  200. package/dist/shadcn/label/index.js +3 -1
  201. package/dist/shadcn/marker/index.js +3 -1
  202. package/dist/shadcn/message/index.js +3 -1
  203. package/dist/shadcn/message-scroller/index.js +3 -1
  204. package/dist/shadcn/popover/index.js +3 -1
  205. package/dist/shadcn/progress/index.js +3 -1
  206. package/dist/shadcn/progress/tone.js +8 -7
  207. package/dist/shadcn/radio-group/index.js +3 -1
  208. package/dist/shadcn/scroll-area/index.js +3 -1
  209. package/dist/shadcn/select/index.js +3 -1
  210. package/dist/shadcn/separator/index.js +3 -1
  211. package/dist/shadcn/sheet/index.js +3 -1
  212. package/dist/shadcn/sidebar/context.svelte.js +42 -28
  213. package/dist/shadcn/sidebar/index.js +3 -1
  214. package/dist/shadcn/skeleton/index.js +3 -1
  215. package/dist/shadcn/slider/index.js +3 -1
  216. package/dist/shadcn/switch/index.js +3 -1
  217. package/dist/shadcn/table/index.js +3 -1
  218. package/dist/shadcn/tabs/index.js +3 -1
  219. package/dist/shadcn/textarea/index.js +3 -1
  220. package/dist/shadcn/toggle/index.js +3 -1
  221. package/dist/shadcn/toggle-group/index.js +3 -1
  222. package/dist/shadcn/tooltip/context.js +7 -2
  223. package/dist/shadcn/tooltip/index.js +3 -1
  224. package/dist/shadcn/trace/index.js +3 -1
  225. package/dist/slides/bridges.js +65 -59
  226. package/dist/slides/deck-controller.svelte.js +210 -207
  227. package/dist/slides/export/capture.js +66 -71
  228. package/dist/slides/export/ffmpeg.js +76 -72
  229. package/dist/slides/export/index.js +3 -0
  230. package/dist/slides/export/launch.js +9 -6
  231. package/dist/slides/export/pdf.js +60 -54
  232. package/dist/slides/export/types.js +1 -0
  233. package/dist/slides/labels.js +24 -24
  234. package/dist/slides/layout.js +39 -41
  235. package/dist/slides/model.js +9 -7
  236. package/dist/slides/navigation.js +78 -73
  237. package/dist/slides/types.js +2 -2
  238. package/dist/status/define-statuses.js +18 -14
  239. package/dist/status/status-types.js +1 -0
  240. package/dist/test-setup.js +24 -20
  241. package/dist/thread/logic.js +73 -77
  242. package/dist/thread/types.js +21 -21
  243. package/dist/work/board-order.js +94 -90
  244. package/dist/work/dates.js +16 -9
  245. package/dist/work/detail/detail-types.js +18 -18
  246. package/dist/work/docs/edited.js +32 -29
  247. package/dist/work/docs/index.js +4 -0
  248. package/dist/work/docs/labels.js +34 -34
  249. package/dist/work/docs/menu.js +113 -106
  250. package/dist/work/docs/outline.js +39 -29
  251. package/dist/work/gantt/logic.js +211 -235
  252. package/dist/work/inbox/inbox-logic.js +71 -75
  253. package/dist/work/inbox/inbox-statuses.js +75 -72
  254. package/dist/work/inbox/inbox-types.js +1 -0
  255. package/dist/work/kanban-drag.js +27 -22
  256. package/dist/work/kanban-types.js +1 -0
  257. package/dist/work/presets/sales.js +36 -32
  258. package/dist/work/reorder.js +9 -8
  259. package/dist/work/task-types.js +1 -0
  260. package/dist/work/time/duration.js +51 -46
  261. package/dist/work/time/time-types.js +23 -23
  262. package/dist/work/use-kanban-dnd.svelte.js +126 -125
  263. package/package.json +3 -1
  264. package/src/components/list-page/master-detail.svelte +3 -1
  265. package/src/components/list-page/rail-row.svelte +4 -4
  266. 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
- "leftChildCount",
3
- "rightChildCount",
4
- "locale"
6
+ "leftChildCount",
7
+ "rightChildCount",
8
+ "locale"
5
9
  ]);
6
10
  function persistentData(source) {
7
- const data = {};
8
- for (const [key, value] of Object.entries(source ?? {})){
9
- if (RUNTIME_DATA_FIELDS.has(key)) continue;
10
- if (typeof value === "function" || value === undefined) continue;
11
- data[key] = value;
12
- }
13
- return data;
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
- return nodes.map((n)=>{
17
- const result = {
18
- id: n.id,
19
- type: n.type,
20
- position: n.position,
21
- data: persistentData(n.data)
22
- };
23
- if (n.parentId) result.parentId = n.parentId;
24
- if (n.extent) result.extent = n.extent;
25
- if (n.style) result.style = n.style;
26
- if (typeof n.width === "number") result.width = n.width;
27
- if (typeof n.height === "number") result.height = n.height;
28
- if (typeof n.zIndex === "number") result.zIndex = n.zIndex;
29
- return result;
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
- return edges.filter((edge)=>nodeIds.has(edge.source) && nodeIds.has(edge.target));
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
- const idSet = new Set(nodes.map((n)=>n.id));
37
- const roots = [];
38
- const childrenOf = new Map();
39
- for (const n of nodes){
40
- if (!n.parentId || !idSet.has(n.parentId)) {
41
- roots.push(n);
42
- } else {
43
- const siblings = childrenOf.get(n.parentId) ?? [];
44
- siblings.push(n);
45
- childrenOf.set(n.parentId, siblings);
46
- }
47
- }
48
- const sorted = [];
49
- const stack = roots.toReversed();
50
- for(let node = stack.pop(); node !== undefined; node = stack.pop()){
51
- sorted.push(node);
52
- const children = childrenOf.get(node.id);
53
- if (children) {
54
- for(let i = children.length - 1; i >= 0; i--){
55
- stack.push(children[i]);
56
- }
57
- }
58
- }
59
- return sorted;
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
- const nodeIds = new Set(nodes.map((n)=>n.id));
63
- return nodes.map((node)=>{
64
- if (node.parentId && !nodeIds.has(node.parentId)) {
65
- const { parentId: _, extent: __, ...rest } = node;
66
- return rest;
67
- }
68
- return node;
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
- return {
3
- x: rect.x + rect.width / 2,
4
- y: rect.y + rect.height / 2
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
- const c = center(rect);
9
- switch(side){
10
- case "top":
11
- return {
12
- x: c.x,
13
- y: rect.y,
14
- side
15
- };
16
- case "bottom":
17
- return {
18
- x: c.x,
19
- y: rect.y + rect.height,
20
- side
21
- };
22
- case "left":
23
- return {
24
- x: rect.x,
25
- y: c.y,
26
- side
27
- };
28
- case "right":
29
- return {
30
- x: rect.x + rect.width,
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
- return id === "top" || id === "right" || id === "bottom" || id === "left" ? id : null;
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
- const c = center(rect);
41
- const dx = (point.x - c.x) / rect.width;
42
- const dy = (point.y - c.y) / rect.height;
43
- if (Math.abs(dx) > Math.abs(dy)) return dx >= 0 ? "right" : "left";
44
- return dy >= 0 ? "bottom" : "top";
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
- if (pins.source && pins.target) {
48
- return {
49
- source: anchorOn(source, pins.source),
50
- target: anchorOn(target, pins.target)
51
- };
52
- }
53
- if (pins.source) {
54
- const from = anchorOn(source, pins.source);
55
- return {
56
- source: from,
57
- target: anchorOn(target, sideFacing(target, from))
58
- };
59
- }
60
- if (pins.target) {
61
- const to = anchorOn(target, pins.target);
62
- return {
63
- source: anchorOn(source, sideFacing(source, to)),
64
- target: to
65
- };
66
- }
67
- return null;
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
- 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
- };
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
- const sL = source.x;
96
- const sR = source.x + source.width;
97
- const tL = target.x;
98
- const tR = target.x + target.width;
99
- if (sL <= tL && sR >= tR) {
100
- return sR - tR >= tL - sL ? "right" : "left";
101
- }
102
- if (tL <= sL && tR >= sR) {
103
- return tR - sR >= sL - tL ? "right" : "left";
104
- }
105
- return "right";
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
- const { source, target } = anchors;
109
- switch(source.side){
110
- case "left":
111
- return Math.min(source.x, target.x) - margin;
112
- case "right":
113
- return Math.max(source.x, target.x) + margin;
114
- case "top":
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
- const dx = toward.x - o.cx;
122
- const dy = toward.y - o.cy;
123
- const len = Math.hypot(dx, dy);
124
- if (len === 0) return {
125
- x: o.cx,
126
- y: o.cy
127
- };
128
- 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));
129
- const reach = t * len + gap;
130
- return {
131
- x: o.cx + dx / len * reach,
132
- y: o.cy + dy / len * reach
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
- return rect ? `${rect.x},${rect.y},${rect.width},${rect.height}` : "";
3
+ return rect ? `${rect.x},${rect.y},${rect.width},${rect.height}` : "";
3
4
  }
4
5
  export function parseBox(key) {
5
- if (!key) return null;
6
- const [x, y, width, height] = key.split(",").map(Number);
7
- return {
8
- x,
9
- y,
10
- width,
11
- height
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
- const seen = new Map();
16
- return (key, compute)=>{
17
- const hit = seen.get(key);
18
- if (hit !== undefined) {
19
- seen.delete(key);
20
- seen.set(key, hit);
21
- return hit;
22
- }
23
- const value = compute();
24
- seen.set(key, value);
25
- if (seen.size > limit) seen.delete(seen.keys().next().value);
26
- return value;
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
- return {
3
- id: edge.id,
4
- source: edge.source,
5
- target: edge.target,
6
- ...edge.type && {
7
- type: edge.type
8
- },
9
- ...edge.label && {
10
- label: edge.label
11
- },
12
- ...edge.animated && {
13
- animated: edge.animated
14
- },
15
- ...edge.sourceHandle && {
16
- sourceHandle: edge.sourceHandle
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
- return edges.map(serializeFlowEdge);
20
+ return edges.map(serializeFlowEdge);
31
21
  }