@tldraw/commenting 0.0.0-bootstrap

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 (242) hide show
  1. package/README.md +11 -0
  2. package/commenting.css +832 -0
  3. package/dist-cjs/canvas/cluster-input.js +40 -0
  4. package/dist-cjs/canvas/cluster-input.js.map +7 -0
  5. package/dist-cjs/canvas/comment-body.js +31 -0
  6. package/dist-cjs/canvas/comment-body.js.map +7 -0
  7. package/dist-cjs/canvas/comment-render.js +72 -0
  8. package/dist-cjs/canvas/comment-render.js.map +7 -0
  9. package/dist-cjs/canvas/comment-store.js +48 -0
  10. package/dist-cjs/canvas/comment-store.js.map +7 -0
  11. package/dist-cjs/canvas/comment-tool.js +160 -0
  12. package/dist-cjs/canvas/comment-tool.js.map +7 -0
  13. package/dist-cjs/canvas/comments-filter-menu.js +109 -0
  14. package/dist-cjs/canvas/comments-filter-menu.js.map +7 -0
  15. package/dist-cjs/canvas/comments-menu-item.js +42 -0
  16. package/dist-cjs/canvas/comments-menu-item.js.map +7 -0
  17. package/dist-cjs/canvas/comments-overflow-menu.js +64 -0
  18. package/dist-cjs/canvas/comments-overflow-menu.js.map +7 -0
  19. package/dist-cjs/canvas/comments-overlay.js +1081 -0
  20. package/dist-cjs/canvas/comments-overlay.js.map +7 -0
  21. package/dist-cjs/canvas/comments-sidebar.js +134 -0
  22. package/dist-cjs/canvas/comments-sidebar.js.map +7 -0
  23. package/dist-cjs/canvas/hooks.js +45 -0
  24. package/dist-cjs/canvas/hooks.js.map +7 -0
  25. package/dist-cjs/canvas/license.js +28 -0
  26. package/dist-cjs/canvas/license.js.map +7 -0
  27. package/dist-cjs/canvas/options.js +45 -0
  28. package/dist-cjs/canvas/options.js.map +7 -0
  29. package/dist-cjs/canvas/region-options.js +49 -0
  30. package/dist-cjs/canvas/region-options.js.map +7 -0
  31. package/dist-cjs/canvas/rich-text.js +28 -0
  32. package/dist-cjs/canvas/rich-text.js.map +7 -0
  33. package/dist-cjs/canvas/sidebar-filters.js +30 -0
  34. package/dist-cjs/canvas/sidebar-filters.js.map +7 -0
  35. package/dist-cjs/canvas/state.js +76 -0
  36. package/dist-cjs/canvas/state.js.map +7 -0
  37. package/dist-cjs/canvas/thread-state.js +81 -0
  38. package/dist-cjs/canvas/thread-state.js.map +7 -0
  39. package/dist-cjs/clustering/computeClusterTable.js +83 -0
  40. package/dist-cjs/clustering/computeClusterTable.js.map +7 -0
  41. package/dist-cjs/clustering/mst.js +117 -0
  42. package/dist-cjs/clustering/mst.js.map +7 -0
  43. package/dist-cjs/clustering/replay.js +275 -0
  44. package/dist-cjs/clustering/replay.js.map +7 -0
  45. package/dist-cjs/clustering/runtime.js +134 -0
  46. package/dist-cjs/clustering/runtime.js.map +7 -0
  47. package/dist-cjs/clustering/schedule.js +170 -0
  48. package/dist-cjs/clustering/schedule.js.map +7 -0
  49. package/dist-cjs/clustering/types.js +17 -0
  50. package/dist-cjs/clustering/types.js.map +7 -0
  51. package/dist-cjs/index.d.ts +868 -0
  52. package/dist-cjs/index.js +126 -0
  53. package/dist-cjs/index.js.map +7 -0
  54. package/dist-cjs/ui/avatar.js +43 -0
  55. package/dist-cjs/ui/avatar.js.map +7 -0
  56. package/dist-cjs/ui/byline.js +35 -0
  57. package/dist-cjs/ui/byline.js.map +7 -0
  58. package/dist-cjs/ui/comment-card.js +37 -0
  59. package/dist-cjs/ui/comment-card.js.map +7 -0
  60. package/dist-cjs/ui/comment-composer.js +136 -0
  61. package/dist-cjs/ui/comment-composer.js.map +7 -0
  62. package/dist-cjs/ui/comment-extensions.js +37 -0
  63. package/dist-cjs/ui/comment-extensions.js.map +7 -0
  64. package/dist-cjs/ui/comment-mention.js +42 -0
  65. package/dist-cjs/ui/comment-mention.js.map +7 -0
  66. package/dist-cjs/ui/comment-pin.js +29 -0
  67. package/dist-cjs/ui/comment-pin.js.map +7 -0
  68. package/dist-cjs/ui/comment-text.js +29 -0
  69. package/dist-cjs/ui/comment-text.js.map +7 -0
  70. package/dist-cjs/ui/comment-thread.js +45 -0
  71. package/dist-cjs/ui/comment-thread.js.map +7 -0
  72. package/dist-cjs/ui/comments-list.js +106 -0
  73. package/dist-cjs/ui/comments-list.js.map +7 -0
  74. package/dist-cjs/ui/count-badge.js +28 -0
  75. package/dist-cjs/ui/count-badge.js.map +7 -0
  76. package/dist-cjs/ui/empty-state.js +31 -0
  77. package/dist-cjs/ui/empty-state.js.map +7 -0
  78. package/dist-cjs/ui/format-time.js +46 -0
  79. package/dist-cjs/ui/format-time.js.map +7 -0
  80. package/dist-cjs/ui/mention-list.js +70 -0
  81. package/dist-cjs/ui/mention-list.js.map +7 -0
  82. package/dist-cjs/ui/mention-suggestion.js +206 -0
  83. package/dist-cjs/ui/mention-suggestion.js.map +7 -0
  84. package/dist-cjs/ui/mention.js +31 -0
  85. package/dist-cjs/ui/mention.js.map +7 -0
  86. package/dist-cjs/ui/reaction.js +31 -0
  87. package/dist-cjs/ui/reaction.js.map +7 -0
  88. package/dist-cjs/ui/reactions.js +34 -0
  89. package/dist-cjs/ui/reactions.js.map +7 -0
  90. package/dist-cjs/ui/render-markdown.js +63 -0
  91. package/dist-cjs/ui/render-markdown.js.map +7 -0
  92. package/dist-cjs/ui/send-button.js +28 -0
  93. package/dist-cjs/ui/send-button.js.map +7 -0
  94. package/dist-esm/canvas/cluster-input.mjs +20 -0
  95. package/dist-esm/canvas/cluster-input.mjs.map +7 -0
  96. package/dist-esm/canvas/comment-body.mjs +11 -0
  97. package/dist-esm/canvas/comment-body.mjs.map +7 -0
  98. package/dist-esm/canvas/comment-render.mjs +52 -0
  99. package/dist-esm/canvas/comment-render.mjs.map +7 -0
  100. package/dist-esm/canvas/comment-store.mjs +28 -0
  101. package/dist-esm/canvas/comment-store.mjs.map +7 -0
  102. package/dist-esm/canvas/comment-tool.mjs +142 -0
  103. package/dist-esm/canvas/comment-tool.mjs.map +7 -0
  104. package/dist-esm/canvas/comments-filter-menu.mjs +99 -0
  105. package/dist-esm/canvas/comments-filter-menu.mjs.map +7 -0
  106. package/dist-esm/canvas/comments-menu-item.mjs +22 -0
  107. package/dist-esm/canvas/comments-menu-item.mjs.map +7 -0
  108. package/dist-esm/canvas/comments-overflow-menu.mjs +53 -0
  109. package/dist-esm/canvas/comments-overflow-menu.mjs.map +7 -0
  110. package/dist-esm/canvas/comments-overlay.mjs +1094 -0
  111. package/dist-esm/canvas/comments-overlay.mjs.map +7 -0
  112. package/dist-esm/canvas/comments-sidebar.mjs +120 -0
  113. package/dist-esm/canvas/comments-sidebar.mjs.map +7 -0
  114. package/dist-esm/canvas/hooks.mjs +25 -0
  115. package/dist-esm/canvas/hooks.mjs.map +7 -0
  116. package/dist-esm/canvas/license.mjs +8 -0
  117. package/dist-esm/canvas/license.mjs.map +7 -0
  118. package/dist-esm/canvas/options.mjs +27 -0
  119. package/dist-esm/canvas/options.mjs.map +7 -0
  120. package/dist-esm/canvas/region-options.mjs +29 -0
  121. package/dist-esm/canvas/region-options.mjs.map +7 -0
  122. package/dist-esm/canvas/rich-text.mjs +8 -0
  123. package/dist-esm/canvas/rich-text.mjs.map +7 -0
  124. package/dist-esm/canvas/sidebar-filters.mjs +10 -0
  125. package/dist-esm/canvas/sidebar-filters.mjs.map +7 -0
  126. package/dist-esm/canvas/state.mjs +60 -0
  127. package/dist-esm/canvas/state.mjs.map +7 -0
  128. package/dist-esm/canvas/thread-state.mjs +61 -0
  129. package/dist-esm/canvas/thread-state.mjs.map +7 -0
  130. package/dist-esm/clustering/computeClusterTable.mjs +63 -0
  131. package/dist-esm/clustering/computeClusterTable.mjs.map +7 -0
  132. package/dist-esm/clustering/mst.mjs +97 -0
  133. package/dist-esm/clustering/mst.mjs.map +7 -0
  134. package/dist-esm/clustering/replay.mjs +255 -0
  135. package/dist-esm/clustering/replay.mjs.map +7 -0
  136. package/dist-esm/clustering/runtime.mjs +114 -0
  137. package/dist-esm/clustering/runtime.mjs.map +7 -0
  138. package/dist-esm/clustering/schedule.mjs +150 -0
  139. package/dist-esm/clustering/schedule.mjs.map +7 -0
  140. package/dist-esm/clustering/types.mjs +1 -0
  141. package/dist-esm/clustering/types.mjs.map +7 -0
  142. package/dist-esm/index.d.mts +868 -0
  143. package/dist-esm/index.mjs +139 -0
  144. package/dist-esm/index.mjs.map +7 -0
  145. package/dist-esm/ui/avatar.mjs +23 -0
  146. package/dist-esm/ui/avatar.mjs.map +7 -0
  147. package/dist-esm/ui/byline.mjs +15 -0
  148. package/dist-esm/ui/byline.mjs.map +7 -0
  149. package/dist-esm/ui/comment-card.mjs +17 -0
  150. package/dist-esm/ui/comment-card.mjs.map +7 -0
  151. package/dist-esm/ui/comment-composer.mjs +116 -0
  152. package/dist-esm/ui/comment-composer.mjs.map +7 -0
  153. package/dist-esm/ui/comment-extensions.mjs +17 -0
  154. package/dist-esm/ui/comment-extensions.mjs.map +7 -0
  155. package/dist-esm/ui/comment-mention.mjs +22 -0
  156. package/dist-esm/ui/comment-mention.mjs.map +7 -0
  157. package/dist-esm/ui/comment-pin.mjs +9 -0
  158. package/dist-esm/ui/comment-pin.mjs.map +7 -0
  159. package/dist-esm/ui/comment-text.mjs +9 -0
  160. package/dist-esm/ui/comment-text.mjs.map +7 -0
  161. package/dist-esm/ui/comment-thread.mjs +25 -0
  162. package/dist-esm/ui/comment-thread.mjs.map +7 -0
  163. package/dist-esm/ui/comments-list.mjs +86 -0
  164. package/dist-esm/ui/comments-list.mjs.map +7 -0
  165. package/dist-esm/ui/count-badge.mjs +8 -0
  166. package/dist-esm/ui/count-badge.mjs.map +7 -0
  167. package/dist-esm/ui/empty-state.mjs +11 -0
  168. package/dist-esm/ui/empty-state.mjs.map +7 -0
  169. package/dist-esm/ui/format-time.mjs +26 -0
  170. package/dist-esm/ui/format-time.mjs.map +7 -0
  171. package/dist-esm/ui/mention-list.mjs +50 -0
  172. package/dist-esm/ui/mention-list.mjs.map +7 -0
  173. package/dist-esm/ui/mention-suggestion.mjs +186 -0
  174. package/dist-esm/ui/mention-suggestion.mjs.map +7 -0
  175. package/dist-esm/ui/mention.mjs +11 -0
  176. package/dist-esm/ui/mention.mjs.map +7 -0
  177. package/dist-esm/ui/reaction.mjs +11 -0
  178. package/dist-esm/ui/reaction.mjs.map +7 -0
  179. package/dist-esm/ui/reactions.mjs +14 -0
  180. package/dist-esm/ui/reactions.mjs.map +7 -0
  181. package/dist-esm/ui/render-markdown.mjs +45 -0
  182. package/dist-esm/ui/render-markdown.mjs.map +7 -0
  183. package/dist-esm/ui/send-button.mjs +8 -0
  184. package/dist-esm/ui/send-button.mjs.map +7 -0
  185. package/package.json +71 -0
  186. package/src/canvas/canvas.css +148 -0
  187. package/src/canvas/cluster-input.test.ts +223 -0
  188. package/src/canvas/cluster-input.ts +29 -0
  189. package/src/canvas/comment-body.tsx +21 -0
  190. package/src/canvas/comment-render.test.ts +90 -0
  191. package/src/canvas/comment-render.ts +92 -0
  192. package/src/canvas/comment-store.ts +55 -0
  193. package/src/canvas/comment-tool.tsx +200 -0
  194. package/src/canvas/comments-filter-menu.tsx +104 -0
  195. package/src/canvas/comments-menu-item.tsx +24 -0
  196. package/src/canvas/comments-overflow-menu.tsx +62 -0
  197. package/src/canvas/comments-overlay.tsx +1460 -0
  198. package/src/canvas/comments-sidebar.tsx +184 -0
  199. package/src/canvas/hooks.ts +28 -0
  200. package/src/canvas/license.ts +15 -0
  201. package/src/canvas/options.test.ts +127 -0
  202. package/src/canvas/options.ts +111 -0
  203. package/src/canvas/region-options.ts +57 -0
  204. package/src/canvas/rich-text.ts +15 -0
  205. package/src/canvas/sidebar-filters.ts +25 -0
  206. package/src/canvas/state.ts +102 -0
  207. package/src/canvas/thread-state.ts +91 -0
  208. package/src/clustering/computeClusterTable.test.ts +299 -0
  209. package/src/clustering/computeClusterTable.ts +82 -0
  210. package/src/clustering/locality.test.ts +189 -0
  211. package/src/clustering/mst.test.ts +383 -0
  212. package/src/clustering/mst.ts +134 -0
  213. package/src/clustering/replay.test.ts +547 -0
  214. package/src/clustering/replay.ts +326 -0
  215. package/src/clustering/runtime.test.ts +596 -0
  216. package/src/clustering/runtime.ts +153 -0
  217. package/src/clustering/schedule.test.ts +514 -0
  218. package/src/clustering/schedule.ts +184 -0
  219. package/src/clustering/types.ts +102 -0
  220. package/src/index.ts +96 -0
  221. package/src/ui/avatar.tsx +31 -0
  222. package/src/ui/byline.tsx +23 -0
  223. package/src/ui/comment-card.tsx +32 -0
  224. package/src/ui/comment-composer.tsx +179 -0
  225. package/src/ui/comment-extensions.ts +25 -0
  226. package/src/ui/comment-mention.ts +47 -0
  227. package/src/ui/comment-pin.tsx +21 -0
  228. package/src/ui/comment-text.tsx +12 -0
  229. package/src/ui/comment-thread.tsx +56 -0
  230. package/src/ui/comments-list.tsx +139 -0
  231. package/src/ui/comments.css +678 -0
  232. package/src/ui/count-badge.tsx +9 -0
  233. package/src/ui/empty-state.tsx +16 -0
  234. package/src/ui/format-time.ts +29 -0
  235. package/src/ui/mention-list.tsx +106 -0
  236. package/src/ui/mention-suggestion.test.ts +18 -0
  237. package/src/ui/mention-suggestion.tsx +285 -0
  238. package/src/ui/mention.tsx +9 -0
  239. package/src/ui/reaction.tsx +16 -0
  240. package/src/ui/reactions.tsx +15 -0
  241. package/src/ui/render-markdown.tsx +72 -0
  242. package/src/ui/send-button.tsx +15 -0
@@ -0,0 +1,114 @@
1
+ function createClusterRuntime(table) {
2
+ return new ClusterRuntimeImpl(table);
3
+ }
4
+ class ClusterRuntimeImpl {
5
+ constructor(table) {
6
+ this.table = table;
7
+ this.resetVisible();
8
+ }
9
+ table;
10
+ // mutable internally; readonly through the ClusterRuntime interface
11
+ k = 0;
12
+ visible = /* @__PURE__ */ new Map();
13
+ seeded = false;
14
+ seed(zoom) {
15
+ validateZoom(zoom);
16
+ this.k = seedCount(this.table.events, zoom);
17
+ this.resetVisible();
18
+ for (let i = 0; i < this.k; i++) {
19
+ applyEvent(this.visible, this.table.events[i]);
20
+ }
21
+ this.seeded = true;
22
+ }
23
+ seedFrom(zoom, previous) {
24
+ validateZoom(zoom);
25
+ const ownerByMember = /* @__PURE__ */ new Map();
26
+ for (const node of previous.values()) {
27
+ for (const member of node.members) {
28
+ ownerByMember.set(member, node.id);
29
+ }
30
+ }
31
+ const events = this.table.events;
32
+ let k = 0;
33
+ while (k < events.length) {
34
+ const event = events[k];
35
+ if (zoom >= event.zSplit) break;
36
+ if (zoom > event.zMerge && !wasMergedTogether(event.result.members, ownerByMember)) break;
37
+ k++;
38
+ }
39
+ this.k = k;
40
+ this.resetVisible();
41
+ for (let i = 0; i < k; i++) {
42
+ applyEvent(this.visible, events[i]);
43
+ }
44
+ this.seeded = true;
45
+ }
46
+ onCamera(zoom) {
47
+ validateZoom(zoom);
48
+ if (!this.seeded) {
49
+ throw new Error("Cluster runtime must be seeded before onCamera");
50
+ }
51
+ while (this.k < this.table.events.length && zoom <= this.table.events[this.k].zMerge) {
52
+ applyEvent(this.visible, this.table.events[this.k]);
53
+ this.k++;
54
+ }
55
+ while (this.k > 0 && zoom >= this.table.events[this.k - 1].zSplit) {
56
+ this.k--;
57
+ unapplyEvent(this.visible, this.table.events[this.k]);
58
+ }
59
+ }
60
+ getVisible() {
61
+ return this.visible;
62
+ }
63
+ resetVisible() {
64
+ this.visible = /* @__PURE__ */ new Map();
65
+ for (const leaf of this.table.leaves) {
66
+ this.visible.set(leaf.id, leaf);
67
+ }
68
+ }
69
+ }
70
+ function wasMergedTogether(members, ownerByMember) {
71
+ const owner = ownerByMember.get(members[0]);
72
+ if (owner === void 0) return false;
73
+ for (let i = 1; i < members.length; i++) {
74
+ if (ownerByMember.get(members[i]) !== owner) return false;
75
+ }
76
+ return true;
77
+ }
78
+ function seedCount(events, zoom) {
79
+ let lo = 0;
80
+ let hi = events.length;
81
+ while (lo < hi) {
82
+ const mid = lo + hi >> 1;
83
+ if (zoom <= seedThreshold(events[mid])) {
84
+ lo = mid + 1;
85
+ } else {
86
+ hi = mid;
87
+ }
88
+ }
89
+ return lo;
90
+ }
91
+ function seedThreshold(event) {
92
+ return Math.sqrt(event.zMerge * event.zSplit);
93
+ }
94
+ function applyEvent(visible, event) {
95
+ for (const child of event.children) {
96
+ visible.delete(child.id);
97
+ }
98
+ visible.set(event.result.id, event.result);
99
+ }
100
+ function unapplyEvent(visible, event) {
101
+ visible.delete(event.result.id);
102
+ for (const child of event.children) {
103
+ visible.set(child.id, child);
104
+ }
105
+ }
106
+ function validateZoom(zoom) {
107
+ if (!Number.isFinite(zoom) || zoom <= 0) {
108
+ throw new Error("zoom must be finite and greater than 0");
109
+ }
110
+ }
111
+ export {
112
+ createClusterRuntime
113
+ };
114
+ //# sourceMappingURL=runtime.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/clustering/runtime.ts"],
4
+ "sourcesContent": ["import type { ClusterNode, ClusterTable, MergeEvent } from './types'\n\n/** @public */\nexport interface ClusterRuntime {\n\t/** Events[0..k) are active. Exposed for tests and debugging. */\n\treadonly k: number\n\t/** Reset state from scratch for the given zoom (cold start / after rebuild). */\n\tseed(zoom: number): void\n\t/**\n\t * Reset state for the given zoom, carrying hysteresis state over from a previous partition\n\t * (the visible map of the model being replaced). Threshold-forced events ignore history:\n\t * zoom \\<= zMerge is always active, zoom \\>= zSplit always inactive. An event inside its band\n\t * is active iff its members were merged together in `previous`; a band event with no history\n\t * (e.g. introduced by the rebuild) stays inactive until the next zoom-out crosses its zMerge.\n\t * Active events must form a prefix of the table, so classification stops at the first\n\t * inactive event; later band-active events conservatively resolve to split.\n\t */\n\tseedFrom(zoom: number, previous: ReadonlyMap<string, ClusterNode>): void\n\t/** Advance/retreat the cursor for a camera change. No-op if zoom sits inside all bands. */\n\tonCamera(zoom: number): void\n\t/** The current partition: cluster id \u2192 node. Do not mutate. */\n\tgetVisible(): ReadonlyMap<string, ClusterNode>\n}\n\n/** @public */\nexport function createClusterRuntime(table: ClusterTable): ClusterRuntime {\n\treturn new ClusterRuntimeImpl(table)\n}\n\nclass ClusterRuntimeImpl implements ClusterRuntime {\n\t// mutable internally; readonly through the ClusterRuntime interface\n\tk = 0\n\tprivate visible = new Map<string, ClusterNode>()\n\tprivate seeded = false\n\n\tconstructor(private readonly table: ClusterTable) {\n\t\tthis.resetVisible()\n\t}\n\n\tseed(zoom: number): void {\n\t\tvalidateZoom(zoom)\n\t\tthis.k = seedCount(this.table.events, zoom)\n\t\tthis.resetVisible()\n\t\tfor (let i = 0; i < this.k; i++) {\n\t\t\tapplyEvent(this.visible, this.table.events[i])\n\t\t}\n\t\tthis.seeded = true\n\t}\n\n\tseedFrom(zoom: number, previous: ReadonlyMap<string, ClusterNode>): void {\n\t\tvalidateZoom(zoom)\n\t\tconst ownerByMember = new Map<string, string>()\n\t\tfor (const node of previous.values()) {\n\t\t\tfor (const member of node.members) {\n\t\t\t\townerByMember.set(member, node.id)\n\t\t\t}\n\t\t}\n\n\t\tconst events = this.table.events\n\t\tlet k = 0\n\t\twhile (k < events.length) {\n\t\t\tconst event = events[k]\n\t\t\tif (zoom >= event.zSplit) break\n\t\t\tif (zoom > event.zMerge && !wasMergedTogether(event.result.members, ownerByMember)) break\n\t\t\tk++\n\t\t}\n\n\t\tthis.k = k\n\t\tthis.resetVisible()\n\t\tfor (let i = 0; i < k; i++) {\n\t\t\tapplyEvent(this.visible, events[i])\n\t\t}\n\t\tthis.seeded = true\n\t}\n\n\tonCamera(zoom: number): void {\n\t\tvalidateZoom(zoom)\n\t\tif (!this.seeded) {\n\t\t\tthrow new Error('Cluster runtime must be seeded before onCamera')\n\t\t}\n\n\t\twhile (this.k < this.table.events.length && zoom <= this.table.events[this.k].zMerge) {\n\t\t\tapplyEvent(this.visible, this.table.events[this.k])\n\t\t\tthis.k++\n\t\t}\n\t\twhile (this.k > 0 && zoom >= this.table.events[this.k - 1].zSplit) {\n\t\t\tthis.k--\n\t\t\tunapplyEvent(this.visible, this.table.events[this.k])\n\t\t}\n\t}\n\n\tgetVisible(): ReadonlyMap<string, ClusterNode> {\n\t\treturn this.visible\n\t}\n\n\tprivate resetVisible() {\n\t\tthis.visible = new Map()\n\t\tfor (const leaf of this.table.leaves) {\n\t\t\tthis.visible.set(leaf.id, leaf)\n\t\t}\n\t}\n}\n\n/** True iff every member id belonged to the same node of the previous partition. */\nfunction wasMergedTogether(\n\tmembers: readonly string[],\n\townerByMember: ReadonlyMap<string, string>\n): boolean {\n\tconst owner = ownerByMember.get(members[0])\n\tif (owner === undefined) return false\n\tfor (let i = 1; i < members.length; i++) {\n\t\tif (ownerByMember.get(members[i]) !== owner) return false\n\t}\n\treturn true\n}\n\nfunction seedCount(events: readonly MergeEvent[], zoom: number): number {\n\tlet lo = 0\n\tlet hi = events.length\n\twhile (lo < hi) {\n\t\tconst mid = (lo + hi) >> 1\n\t\tif (zoom <= seedThreshold(events[mid])) {\n\t\t\tlo = mid + 1\n\t\t} else {\n\t\t\thi = mid\n\t\t}\n\t}\n\treturn lo\n}\n\nfunction seedThreshold(event: MergeEvent): number {\n\treturn Math.sqrt(event.zMerge * event.zSplit)\n}\n\nfunction applyEvent(visible: Map<string, ClusterNode>, event: MergeEvent) {\n\tfor (const child of event.children) {\n\t\tvisible.delete(child.id)\n\t}\n\tvisible.set(event.result.id, event.result)\n}\n\nfunction unapplyEvent(visible: Map<string, ClusterNode>, event: MergeEvent) {\n\tvisible.delete(event.result.id)\n\tfor (const child of event.children) {\n\t\tvisible.set(child.id, child)\n\t}\n}\n\nfunction validateZoom(zoom: number) {\n\tif (!Number.isFinite(zoom) || zoom <= 0) {\n\t\tthrow new Error('zoom must be finite and greater than 0')\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,150 @@
1
+ function contract(raw, eps) {
2
+ if (!Number.isFinite(eps) || eps < 0) {
3
+ throw new Error("eps must be finite and greater than or equal to 0");
4
+ }
5
+ const out = [];
6
+ let i = 0;
7
+ while (i < raw.length) {
8
+ const anchor = raw[i].z;
9
+ let j = i;
10
+ while (j + 1 < raw.length && raw[j + 1].z >= anchor / (1 + eps)) {
11
+ j++;
12
+ }
13
+ const chains = contractWindow(raw.slice(i, j + 1), anchor);
14
+ out.push(...chains);
15
+ i = j + 1;
16
+ }
17
+ return out;
18
+ }
19
+ function finalize(events, opts) {
20
+ validateFinalizeOptions(opts);
21
+ const r = opts.Tu / opts.Tc;
22
+ const zMergeCap = opts.maxSplitZoom / r;
23
+ const out = [];
24
+ for (const event of events) {
25
+ const zMerge = Math.min(event.zMerge, zMergeCap);
26
+ if (zMerge < opts.minZoom) break;
27
+ let zSplit = zMerge * r;
28
+ if (zMerge < opts.maxZoom) {
29
+ zSplit = Math.min(zSplit, opts.maxZoom);
30
+ }
31
+ out.push({
32
+ zMerge,
33
+ zSplit,
34
+ children: event.children,
35
+ result: event.result
36
+ });
37
+ }
38
+ return out;
39
+ }
40
+ function contractWindow(events, zMerge) {
41
+ const uf = new ComponentUnionFind(events.length);
42
+ const resultToIndex = /* @__PURE__ */ new Map();
43
+ for (let i = 0; i < events.length; i++) {
44
+ resultToIndex.set(events[i].result.id, i);
45
+ }
46
+ for (let i = 0; i < events.length; i++) {
47
+ for (const child of events[i].children) {
48
+ const producer = resultToIndex.get(child.id);
49
+ if (producer !== void 0) {
50
+ uf.union(i, producer);
51
+ }
52
+ }
53
+ }
54
+ const byRoot = /* @__PURE__ */ new Map();
55
+ for (let i = 0; i < events.length; i++) {
56
+ const root = uf.find(i);
57
+ const list = byRoot.get(root);
58
+ if (list) {
59
+ list.push(i);
60
+ } else {
61
+ byRoot.set(root, [i]);
62
+ }
63
+ }
64
+ return Array.from(byRoot.values()).map((indices) => contractChain(events, indices, zMerge)).sort((a, b) => compareNodesByMinMember(a.result, b.result));
65
+ }
66
+ function contractChain(events, indices, zMerge) {
67
+ const produced = /* @__PURE__ */ new Set();
68
+ const consumedProduced = /* @__PURE__ */ new Set();
69
+ for (const index of indices) {
70
+ produced.add(events[index].result.id);
71
+ }
72
+ for (const index of indices) {
73
+ for (const child of events[index].children) {
74
+ if (produced.has(child.id)) consumedProduced.add(child.id);
75
+ }
76
+ }
77
+ const childrenById = /* @__PURE__ */ new Map();
78
+ for (const index of indices) {
79
+ for (const child of events[index].children) {
80
+ if (!produced.has(child.id)) childrenById.set(child.id, child);
81
+ }
82
+ }
83
+ let result;
84
+ for (const index of indices) {
85
+ const candidate = events[index].result;
86
+ if (!consumedProduced.has(candidate.id)) {
87
+ if (!result || compareNodesByMinMember(candidate, result) < 0) result = candidate;
88
+ }
89
+ }
90
+ return {
91
+ zMerge,
92
+ children: Array.from(childrenById.values()).sort(compareNodesByMinMember),
93
+ result
94
+ };
95
+ }
96
+ function validateFinalizeOptions(opts) {
97
+ if (!Number.isFinite(opts.maxSplitZoom) || opts.maxSplitZoom <= 0) {
98
+ throw new Error("maxSplitZoom must be finite and greater than 0");
99
+ }
100
+ if (!Number.isFinite(opts.Tc) || opts.Tc <= 0) {
101
+ throw new Error("Tc must be finite and greater than 0");
102
+ }
103
+ if (!Number.isFinite(opts.Tu) || opts.Tu <= opts.Tc) {
104
+ throw new Error("Tu must be finite and greater than Tc");
105
+ }
106
+ if (!Number.isFinite(opts.minZoom) || opts.minZoom <= 0) {
107
+ throw new Error("minZoom must be finite and greater than 0");
108
+ }
109
+ if (!Number.isFinite(opts.maxZoom) || opts.maxZoom <= opts.minZoom) {
110
+ throw new Error("maxZoom must be finite and greater than minZoom");
111
+ }
112
+ }
113
+ function compareNodesByMinMember(a, b) {
114
+ const aMin = a.members[0];
115
+ const bMin = b.members[0];
116
+ if (aMin < bMin) return -1;
117
+ if (aMin > bMin) return 1;
118
+ return 0;
119
+ }
120
+ class ComponentUnionFind {
121
+ parent;
122
+ constructor(n) {
123
+ this.parent = new Int32Array(n);
124
+ for (let i = 0; i < n; i++) {
125
+ this.parent[i] = i;
126
+ }
127
+ }
128
+ find(index) {
129
+ let root = index;
130
+ while (this.parent[root] !== root) {
131
+ root = this.parent[root];
132
+ }
133
+ while (this.parent[index] !== index) {
134
+ const next = this.parent[index];
135
+ this.parent[index] = root;
136
+ index = next;
137
+ }
138
+ return root;
139
+ }
140
+ union(a, b) {
141
+ const rootA = this.find(a);
142
+ const rootB = this.find(b);
143
+ if (rootA !== rootB) this.parent[rootB] = rootA;
144
+ }
145
+ }
146
+ export {
147
+ contract,
148
+ finalize
149
+ };
150
+ //# sourceMappingURL=schedule.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/clustering/schedule.ts"],
4
+ "sourcesContent": ["import type { ClusterNode, ContractedEvent, MergeEvent, RawMergeEvent } from './types'\n\nexport function contract(raw: readonly RawMergeEvent[], eps: number): ContractedEvent[] {\n\tif (!Number.isFinite(eps) || eps < 0) {\n\t\tthrow new Error('eps must be finite and greater than or equal to 0')\n\t}\n\n\tconst out: ContractedEvent[] = []\n\tlet i = 0\n\twhile (i < raw.length) {\n\t\tconst anchor = raw[i].z\n\t\tlet j = i\n\t\twhile (j + 1 < raw.length && raw[j + 1].z >= anchor / (1 + eps)) {\n\t\t\tj++\n\t\t}\n\n\t\tconst chains = contractWindow(raw.slice(i, j + 1), anchor)\n\t\tout.push(...chains)\n\t\ti = j + 1\n\t}\n\n\treturn out\n}\n\nexport function finalize(\n\tevents: readonly ContractedEvent[],\n\topts: { Tc: number; Tu: number; minZoom: number; maxZoom: number; maxSplitZoom: number }\n): MergeEvent[] {\n\tvalidateFinalizeOptions(opts)\n\n\tconst r = opts.Tu / opts.Tc\n\t// Every cluster must have split by maxSplitZoom, however close (or coincident) its members.\n\t// Capping zMerge at maxSplitZoom / r keeps the whole band below the cap, preserving\n\t// zSplit > zMerge and the table's sort order (min with a constant is order-preserving).\n\tconst zMergeCap = opts.maxSplitZoom / r\n\tconst out: MergeEvent[] = []\n\tfor (const event of events) {\n\t\tconst zMerge = Math.min(event.zMerge, zMergeCap)\n\t\tif (zMerge < opts.minZoom) break\n\t\tlet zSplit = zMerge * r\n\t\tif (zMerge < opts.maxZoom) {\n\t\t\tzSplit = Math.min(zSplit, opts.maxZoom)\n\t\t}\n\t\tout.push({\n\t\t\tzMerge,\n\t\t\tzSplit,\n\t\t\tchildren: event.children,\n\t\t\tresult: event.result,\n\t\t})\n\t}\n\treturn out\n}\n\nfunction contractWindow(events: readonly RawMergeEvent[], zMerge: number): ContractedEvent[] {\n\tconst uf = new ComponentUnionFind(events.length)\n\tconst resultToIndex = new Map<string, number>()\n\tfor (let i = 0; i < events.length; i++) {\n\t\tresultToIndex.set(events[i].result.id, i)\n\t}\n\n\tfor (let i = 0; i < events.length; i++) {\n\t\tfor (const child of events[i].children) {\n\t\t\tconst producer = resultToIndex.get(child.id)\n\t\t\tif (producer !== undefined) {\n\t\t\t\tuf.union(i, producer)\n\t\t\t}\n\t\t}\n\t}\n\n\tconst byRoot = new Map<number, number[]>()\n\tfor (let i = 0; i < events.length; i++) {\n\t\tconst root = uf.find(i)\n\t\tconst list = byRoot.get(root)\n\t\tif (list) {\n\t\t\tlist.push(i)\n\t\t} else {\n\t\t\tbyRoot.set(root, [i])\n\t\t}\n\t}\n\n\treturn Array.from(byRoot.values())\n\t\t.map((indices) => contractChain(events, indices, zMerge))\n\t\t.sort((a, b) => compareNodesByMinMember(a.result, b.result))\n}\n\nfunction contractChain(\n\tevents: readonly RawMergeEvent[],\n\tindices: readonly number[],\n\tzMerge: number\n): ContractedEvent {\n\tconst produced = new Set<string>()\n\tconst consumedProduced = new Set<string>()\n\tfor (const index of indices) {\n\t\tproduced.add(events[index].result.id)\n\t}\n\tfor (const index of indices) {\n\t\tfor (const child of events[index].children) {\n\t\t\tif (produced.has(child.id)) consumedProduced.add(child.id)\n\t\t}\n\t}\n\n\tconst childrenById = new Map<string, ClusterNode>()\n\tfor (const index of indices) {\n\t\tfor (const child of events[index].children) {\n\t\t\tif (!produced.has(child.id)) childrenById.set(child.id, child)\n\t\t}\n\t}\n\n\tlet result: ClusterNode | undefined\n\tfor (const index of indices) {\n\t\tconst candidate = events[index].result\n\t\tif (!consumedProduced.has(candidate.id)) {\n\t\t\tif (!result || compareNodesByMinMember(candidate, result) < 0) result = candidate\n\t\t}\n\t}\n\n\treturn {\n\t\tzMerge,\n\t\tchildren: Array.from(childrenById.values()).sort(compareNodesByMinMember),\n\t\tresult: result!,\n\t}\n}\n\nfunction validateFinalizeOptions(opts: {\n\tTc: number\n\tTu: number\n\tminZoom: number\n\tmaxZoom: number\n\tmaxSplitZoom: number\n}) {\n\tif (!Number.isFinite(opts.maxSplitZoom) || opts.maxSplitZoom <= 0) {\n\t\tthrow new Error('maxSplitZoom must be finite and greater than 0')\n\t}\n\tif (!Number.isFinite(opts.Tc) || opts.Tc <= 0) {\n\t\tthrow new Error('Tc must be finite and greater than 0')\n\t}\n\tif (!Number.isFinite(opts.Tu) || opts.Tu <= opts.Tc) {\n\t\tthrow new Error('Tu must be finite and greater than Tc')\n\t}\n\tif (!Number.isFinite(opts.minZoom) || opts.minZoom <= 0) {\n\t\tthrow new Error('minZoom must be finite and greater than 0')\n\t}\n\tif (!Number.isFinite(opts.maxZoom) || opts.maxZoom <= opts.minZoom) {\n\t\tthrow new Error('maxZoom must be finite and greater than minZoom')\n\t}\n}\n\nfunction compareNodesByMinMember(a: ClusterNode, b: ClusterNode): number {\n\tconst aMin = a.members[0]\n\tconst bMin = b.members[0]\n\tif (aMin < bMin) return -1\n\tif (aMin > bMin) return 1\n\treturn 0\n}\n\nclass ComponentUnionFind {\n\tprivate readonly parent: Int32Array\n\n\tconstructor(n: number) {\n\t\tthis.parent = new Int32Array(n)\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tthis.parent[i] = i\n\t\t}\n\t}\n\n\tfind(index: number): number {\n\t\tlet root = index\n\t\twhile (this.parent[root] !== root) {\n\t\t\troot = this.parent[root]\n\t\t}\n\t\twhile (this.parent[index] !== index) {\n\t\t\tconst next = this.parent[index]\n\t\t\tthis.parent[index] = root\n\t\t\tindex = next\n\t\t}\n\t\treturn root\n\t}\n\n\tunion(a: number, b: number) {\n\t\tconst rootA = this.find(a)\n\t\tconst rootB = this.find(b)\n\t\tif (rootA !== rootB) this.parent[rootB] = rootA\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }