gloomberb 0.16.0 → 0.16.1

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 (167) hide show
  1. package/package.json +1 -1
  2. package/src/api-client/data.ts +18 -3
  3. package/src/api-client/index.ts +3 -0
  4. package/src/api-client/members.ts +26 -0
  5. package/src/api-client/perps.ts +4 -0
  6. package/src/api-client/types.ts +7 -1
  7. package/src/app/global-shortcuts.ts +14 -6
  8. package/src/app/keybindings/actions.ts +1 -1
  9. package/src/app/runtime/update.ts +38 -2
  10. package/src/app.tsx +10 -6
  11. package/src/cli/pane-functions/function-help.ts +9 -2
  12. package/src/components/command-bar/commands/collection.ts +5 -1
  13. package/src/components/command-bar/routes/root/command-items.ts +9 -2
  14. package/src/components/command-bar/routes/root/plugin-install.ts +2 -2
  15. package/src/components/command-bar/routes/root/provider-search.ts +19 -5
  16. package/src/components/command-bar/routes/root/runtime.ts +14 -5
  17. package/src/components/command-bar/routes/ticker-search/results.ts +31 -5
  18. package/src/components/command-bar/routes/ticker-search/route.ts +2 -2
  19. package/src/components/command-bar/routing/actions.ts +2 -0
  20. package/src/components/command-bar/selection-runtime.ts +38 -0
  21. package/src/components/command-bar/surface/index.tsx +7 -2
  22. package/src/components/index.ts +2 -2
  23. package/src/components/layout/floating-pane.tsx +6 -0
  24. package/src/components/layout/header.tsx +24 -7
  25. package/src/components/layout/missing-pane.tsx +2 -2
  26. package/src/components/layout/pane/header.tsx +63 -30
  27. package/src/components/layout/pane/index.tsx +6 -0
  28. package/src/components/layout/pane/title.ts +31 -7
  29. package/src/components/layout/shell/drag/index.ts +6 -5
  30. package/src/components/layout/shell/drag/runtime.ts +3 -0
  31. package/src/components/layout/shell/index.tsx +6 -0
  32. package/src/components/layout/shell/pane/layers.tsx +15 -7
  33. package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -3
  34. package/src/components/layout/shell/ticker-link-menu.ts +23 -9
  35. package/src/components/metric-treemap/heat-surface.tsx +718 -0
  36. package/src/components/metric-treemap/heat-tiles.ts +210 -0
  37. package/src/components/metric-treemap/index.tsx +2 -0
  38. package/src/components/metric-treemap/layout.ts +6 -0
  39. package/src/components/metric-treemap/scene.ts +432 -0
  40. package/src/components/pane-settings-dialog/field-dialogs.tsx +1 -0
  41. package/src/components/toggle-list.tsx +38 -12
  42. package/src/components/ui/country-flag-art.tsx +449 -0
  43. package/src/components/ui/country-flag.tsx +41 -0
  44. package/src/components/ui/data-table/types.ts +13 -0
  45. package/src/components/ui/icon.tsx +2 -0
  46. package/src/components/ui/index.ts +4 -0
  47. package/src/components/ui/multi-select/dialog.tsx +108 -22
  48. package/src/components/ui/range-track.tsx +46 -0
  49. package/src/components/ui/tabs.tsx +4 -0
  50. package/src/core/state/app/types.ts +10 -1
  51. package/src/i18n/es.ts +5 -3
  52. package/src/i18n/ja.ts +5 -3
  53. package/src/i18n/ko.ts +5 -3
  54. package/src/i18n/zh-cn.ts +5 -3
  55. package/src/i18n/zh-tw.ts +5 -3
  56. package/src/layout/ticker-navigation.ts +28 -2
  57. package/src/market-data/quotes/contributions.ts +6 -0
  58. package/src/market-data/quotes/freshness.ts +36 -0
  59. package/src/market-data/quotes/resolution.ts +22 -8
  60. package/src/market-data/quotes/time.ts +16 -0
  61. package/src/plugins/builtin/analytics/risk-client.ts +185 -59
  62. package/src/plugins/builtin/analytics/risk-headless.ts +55 -49
  63. package/src/plugins/builtin/analytics/risk-math.ts +33 -13
  64. package/src/plugins/builtin/analytics/risk-model.ts +250 -60
  65. package/src/plugins/builtin/analytics/risk-pane.tsx +61 -30
  66. package/src/plugins/builtin/analytics/risk-test-data.ts +182 -0
  67. package/src/plugins/builtin/buildout/cells.tsx +15 -12
  68. package/src/plugins/builtin/buildout/detail/company.tsx +3 -3
  69. package/src/plugins/builtin/buildout/detail/index.tsx +0 -1
  70. package/src/plugins/builtin/buildout/detail/intel.tsx +6 -6
  71. package/src/plugins/builtin/buildout/detail/site.tsx +4 -7
  72. package/src/plugins/builtin/buildout/detail/ui.tsx +0 -19
  73. package/src/plugins/builtin/catalysts/index.tsx +2 -2
  74. package/src/plugins/builtin/catalysts/pane.tsx +3 -1
  75. package/src/plugins/builtin/cds/index.tsx +1 -0
  76. package/src/plugins/builtin/debt-maturities/wall-bar.tsx +14 -41
  77. package/src/plugins/builtin/dividend-yield/client.ts +4 -2
  78. package/src/plugins/builtin/earnings/client.ts +2 -2
  79. package/src/plugins/builtin/earnings-calls/index.tsx +1 -0
  80. package/src/plugins/builtin/fx-matrix/direction.ts +81 -0
  81. package/src/plugins/builtin/fx-matrix/index.tsx +71 -33
  82. package/src/plugins/builtin/fx-matrix/live-legs.ts +17 -0
  83. package/src/plugins/builtin/fx-matrix/pairs.ts +68 -14
  84. package/src/plugins/builtin/fx-matrix/settings.ts +62 -0
  85. package/src/plugins/builtin/jobs/index.tsx +1 -0
  86. package/src/plugins/builtin/jobs/share-bars.tsx +5 -28
  87. package/src/plugins/builtin/market-heatmap/data.ts +28 -2
  88. package/src/plugins/builtin/market-heatmap/index.tsx +250 -79
  89. package/src/plugins/builtin/market-heatmap/live.ts +88 -0
  90. package/src/plugins/builtin/market-heatmap/portfolio.ts +27 -7
  91. package/src/plugins/builtin/market-movers/client.ts +3 -2
  92. package/src/plugins/builtin/market-movers/headless.ts +8 -1
  93. package/src/plugins/builtin/market-movers/screener.ts +18 -5
  94. package/src/plugins/builtin/members/client.ts +36 -0
  95. package/src/plugins/builtin/members/headless.ts +33 -0
  96. package/src/plugins/builtin/members/index.tsx +20 -0
  97. package/src/plugins/builtin/members/model.ts +60 -0
  98. package/src/plugins/builtin/members/pane.tsx +168 -0
  99. package/src/plugins/builtin/mna/index.tsx +2 -1
  100. package/src/plugins/builtin/mna/pane.tsx +5 -2
  101. package/src/plugins/builtin/options/index.tsx +2 -1
  102. package/src/plugins/builtin/pe-band/client.ts +29 -2
  103. package/src/plugins/builtin/pe-band/headless.ts +2 -2
  104. package/src/plugins/builtin/pe-band/model.ts +11 -7
  105. package/src/plugins/builtin/pe-band/pane.tsx +2 -1
  106. package/src/plugins/builtin/pe-band/report-dates.ts +78 -0
  107. package/src/plugins/builtin/perps/client.ts +17 -3
  108. package/src/plugins/builtin/perps/equity-identity.ts +16 -0
  109. package/src/plugins/builtin/perps/equity-row.tsx +6 -4
  110. package/src/plugins/builtin/plugin-marketplace/activation.ts +19 -0
  111. package/src/plugins/builtin/plugin-marketplace/pane.tsx +2 -2
  112. package/src/plugins/builtin/plugin-marketplace/store.ts +2 -0
  113. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +43 -2
  114. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +48 -5
  115. package/src/plugins/builtin/scanner/hilo-bars.tsx +12 -70
  116. package/src/plugins/builtin/scanner/hilo-model.ts +0 -18
  117. package/src/plugins/builtin/sectors/move-bar.tsx +10 -32
  118. package/src/plugins/builtin/social-mentions/index.tsx +1 -1
  119. package/src/plugins/builtin/thirteenf/index.tsx +2 -1
  120. package/src/plugins/builtin/ticker-detail/overview/components.tsx +5 -60
  121. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +1 -1
  122. package/src/plugins/builtin/ticker-detail/pane.tsx +1 -1
  123. package/src/plugins/builtin/ticker-detail/quote-footer.ts +7 -1
  124. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +20 -4
  125. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +2 -2
  126. package/src/plugins/builtin/vol-surface/index.tsx +1 -1
  127. package/src/plugins/catalog-browser.ts +2 -0
  128. package/src/plugins/catalog-manifest.ts +1 -0
  129. package/src/plugins/catalog-ui.ts +3 -1
  130. package/src/plugins/catalog.ts +1 -1
  131. package/src/plugins/host-link.ts +33 -1
  132. package/src/plugins/installer.ts +48 -12
  133. package/src/plugins/loader.ts +18 -3
  134. package/src/plugins/manager-node.ts +15 -5
  135. package/src/plugins/registry/index.ts +1 -1
  136. package/src/plugins/registry/pane-settings.ts +25 -7
  137. package/src/public/__snapshots__/public-api.test.ts.snap +2 -0
  138. package/src/renderers/dom/data-table/row.tsx +50 -16
  139. package/src/renderers/dom/desktop/icons.tsx +1 -0
  140. package/src/renderers/dom/host/box.tsx +69 -26
  141. package/src/renderers/dom/host/tabs.tsx +37 -1
  142. package/src/renderers/dom/styles.css +40 -5
  143. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +11 -6
  144. package/src/renderers/electrobun/bun/desktop/backend.ts +1 -0
  145. package/src/renderers/electrobun/bun/desktop/update.ts +181 -87
  146. package/src/renderers/electrobun/bun/index.ts +73 -6
  147. package/src/renderers/electrobun/bun/window/remembered-frame.ts +122 -0
  148. package/src/renderers/electrobun/shared/protocol.ts +3 -0
  149. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +2 -1
  150. package/src/renderers/electrobun/view/main.tsx +7 -1
  151. package/src/renderers/electrobun/view/renderer-window-error.ts +18 -0
  152. package/src/renderers/electrobun/view/update-host.ts +45 -21
  153. package/src/sources/gloomberb-cloud/normalizers.ts +9 -2
  154. package/src/sources/provider-router/financials.ts +3 -1
  155. package/src/telemetry/benign-window-error.ts +7 -0
  156. package/src/telemetry/crash-reports-dom.ts +2 -0
  157. package/src/test-support/daily-nav.ts +25 -0
  158. package/src/theme/heat-colors.ts +174 -1
  159. package/src/tickers/instrument-kind.ts +34 -7
  160. package/src/tickers/search/asset-classes.ts +24 -9
  161. package/src/tickers/search/index.ts +44 -11
  162. package/src/tickers/search/ranking.ts +23 -3
  163. package/src/types/financials.ts +2 -0
  164. package/src/types/plugin.ts +18 -5
  165. package/src/ui/context-menu.tsx +1 -0
  166. package/src/ui/host.tsx +2 -0
  167. package/src/updater/index.ts +29 -2
@@ -37,6 +37,7 @@ interface ShellPaneLayersProps {
37
37
  getPaneQuickSettings: (paneId: string) => PaneHeaderQuickSetting[];
38
38
  handleFloatingClose: (paneId: string) => void;
39
39
  handleFloatingCloseMouseDown: (paneId: string, event: any) => void;
40
+ handleRestoreFullscreen: ShellMouseHandler;
40
41
  handleNativeDrag: ShellMouseHandler;
41
42
  handleNativePaneContextMenu: (paneId: string, rect: LayoutBounds, event: any) => void;
42
43
  handleNativePaneMouseDown: (paneId: string, event: any) => void;
@@ -73,6 +74,7 @@ export function ShellPaneLayers({
73
74
  getPaneQuickSettings,
74
75
  handleFloatingClose,
75
76
  handleFloatingCloseMouseDown,
77
+ handleRestoreFullscreen,
76
78
  handleNativeDrag,
77
79
  handleNativePaneContextMenu,
78
80
  handleNativePaneMouseDown,
@@ -125,6 +127,7 @@ export function ShellPaneLayers({
125
127
  const rect = transientFocusActive
126
128
  ? { x: 0, y: 0, width, height: contentHeight }
127
129
  : leaf.rect;
130
+ const isFullscreenBase = transientFocusActive && leaf.instanceId === transientFocusPaneId;
128
131
  const focused = focusedPaneId === leaf.instanceId && (!overlayOpen || menuPaneId === leaf.instanceId);
129
132
  const windowModeSelected = windowModePaneId === leaf.instanceId;
130
133
  const showActions = focused || hoveredPaneId === leaf.instanceId || menuPaneId === leaf.instanceId;
@@ -170,6 +173,8 @@ export function ShellPaneLayers({
170
173
  onHeaderMouseDragEnd={nativePaneChrome && !transientFocusActive ? handleNativeDrag : undefined}
171
174
  onHeaderContextMenu={nativePaneChrome && nativeContextMenu === true ? (event) => handleNativePaneContextMenu(leaf.instanceId, rect, event) : undefined}
172
175
  onActionMouseDown={(event) => handlePaneAction(leaf.instanceId, rect, event)}
176
+ fullscreen={isFullscreenBase}
177
+ onRestoreMouseDown={isFullscreenBase ? handleRestoreFullscreen : undefined}
173
178
  >
174
179
  <PaneFooterKeys paneId={leaf.instanceId} footer={footer} focused={focused} />
175
180
  <PaneContent
@@ -191,6 +196,7 @@ export function ShellPaneLayers({
191
196
 
192
197
  {visibleFloatingPanes.map(({ pane, rect }) => {
193
198
  if (transientFocusActive && pane.instance.instanceId !== transientFocusPaneId) return null;
199
+ const isFullscreenBase = transientFocusActive && pane.instance.instanceId === transientFocusPaneId;
194
200
  const preview = transientFocusActive
195
201
  ? { x: 0, y: 0, width, height: contentHeight }
196
202
  : dragFloatingRect?.paneId === pane.instance.instanceId
@@ -230,15 +236,17 @@ export function ShellPaneLayers({
230
236
  footer={footer}
231
237
  onMouseDownCapture={nativePaneChrome ? (event) => handleNativePaneMouseDown(pane.instance.instanceId, event) : undefined}
232
238
  onHeaderMouseMove={() => setHoveredPaneIfChanged(pane.instance.instanceId)}
233
- onHeaderMouseDown={nativePaneChrome ? (event) => startNativeFloatingDrag(pane.instance.instanceId, preview, event) : undefined}
234
- onHeaderMouseDrag={nativePaneChrome ? handleNativeDrag : undefined}
235
- onHeaderMouseDragEnd={nativePaneChrome ? handleNativeDrag : undefined}
239
+ onHeaderMouseDown={nativePaneChrome && !isFullscreenBase ? (event) => startNativeFloatingDrag(pane.instance.instanceId, preview, event) : undefined}
240
+ onHeaderMouseDrag={nativePaneChrome && !isFullscreenBase ? handleNativeDrag : undefined}
241
+ onHeaderMouseDragEnd={nativePaneChrome && !isFullscreenBase ? handleNativeDrag : undefined}
236
242
  onHeaderContextMenu={nativePaneChrome && nativeContextMenu === true ? (event) => handleNativePaneContextMenu(pane.instance.instanceId, preview, event) : undefined}
237
243
  onActionMouseDown={(event) => handlePaneAction(pane.instance.instanceId, preview, event)}
238
- onCloseMouseDown={(event) => handleFloatingCloseMouseDown(pane.instance.instanceId, event)}
239
- onResizeMouseDown={nativePaneChrome ? (event) => startNativeFloatResize(pane.instance.instanceId, preview, event) : undefined}
240
- onResizeMouseDrag={nativePaneChrome ? handleNativeDrag : undefined}
241
- onResizeMouseDragEnd={nativePaneChrome ? handleNativeDrag : undefined}
244
+ onCloseMouseDown={isFullscreenBase ? undefined : (event) => handleFloatingCloseMouseDown(pane.instance.instanceId, event)}
245
+ onRestoreMouseDown={isFullscreenBase ? handleRestoreFullscreen : undefined}
246
+ fullscreen={isFullscreenBase}
247
+ onResizeMouseDown={nativePaneChrome && !isFullscreenBase ? (event) => startNativeFloatResize(pane.instance.instanceId, preview, event) : undefined}
248
+ onResizeMouseDrag={nativePaneChrome && !isFullscreenBase ? handleNativeDrag : undefined}
249
+ onResizeMouseDragEnd={nativePaneChrome && !isFullscreenBase ? handleNativeDrag : undefined}
242
250
  >
243
251
  <PaneFooterKeys paneId={pane.instance.instanceId} footer={footer} focused={focused} />
244
252
  <PaneContent
@@ -30,6 +30,7 @@ interface UseShellTerminalPointerRuntimeOptions {
30
30
  focusedPaneId: string | null;
31
31
  handleActiveDrag: (event: ShellMouseEvent) => void;
32
32
  handleFloatingClose: (paneId: string) => void;
33
+ restoreFullscreen: () => void;
33
34
  menuState: ActionMenuState | null;
34
35
  openPaneMenu: (
35
36
  paneId: string,
@@ -73,6 +74,7 @@ export function useShellTerminalPointerRuntime({
73
74
  focusedPaneId,
74
75
  handleActiveDrag,
75
76
  handleFloatingClose,
77
+ restoreFullscreen,
76
78
  menuState,
77
79
  openPaneMenu,
78
80
  paneMap,
@@ -185,6 +187,7 @@ export function useShellTerminalPointerRuntime({
185
187
  const headerAreas = resolveHeaderHitAreas(rect.width, {
186
188
  floating: true,
187
189
  focused: isFocused,
190
+ fullscreen: transientFocusActive,
188
191
  });
189
192
  focusPane(paneId);
190
193
  if (event.button === 2 && relativeY === 0) {
@@ -192,7 +195,8 @@ export function useShellTerminalPointerRuntime({
192
195
  return;
193
196
  }
194
197
  if (relativeY === 0 && headerAreas.closeStart != null && relativeX >= headerAreas.closeStart && relativeX < rect.width) {
195
- handleFloatingClose(paneId);
198
+ if (transientFocusActive) restoreFullscreen();
199
+ else handleFloatingClose(paneId);
196
200
  event.stopPropagation();
197
201
  event.preventDefault();
198
202
  return;
@@ -207,7 +211,7 @@ export function useShellTerminalPointerRuntime({
207
211
  event.preventDefault();
208
212
  return;
209
213
  }
210
- if (relativeX >= rect.width - 2 && relativeY >= rect.height - 1) {
214
+ if (!transientFocusActive && relativeX >= rect.width - 2 && relativeY >= rect.height - 1) {
211
215
  dragRef.current = {
212
216
  type: "float-resize",
213
217
  paneId,
@@ -220,6 +224,11 @@ export function useShellTerminalPointerRuntime({
220
224
  event.preventDefault();
221
225
  return;
222
226
  }
227
+ if (relativeY === 0 && transientFocusActive) {
228
+ event.stopPropagation();
229
+ event.preventDefault();
230
+ return;
231
+ }
223
232
  if (relativeY === 0) {
224
233
  dragRef.current = {
225
234
  type: "pane-drag",
@@ -268,15 +277,26 @@ export function useShellTerminalPointerRuntime({
268
277
  const headerAreas = resolveHeaderHitAreas(leaf.rect.width, {
269
278
  floating: false,
270
279
  focused: isFocused,
280
+ fullscreen: transientFocusActive,
271
281
  });
272
282
  focusPane(leaf.instanceId);
273
283
  if (event.button === 2 && relativeY === 0) {
274
284
  openPaneMenu(leaf.instanceId, leaf.rect, event);
275
285
  return;
276
286
  }
287
+ if (relativeY === 0
288
+ && transientFocusActive
289
+ && headerAreas.closeStart != null
290
+ && relativeX >= headerAreas.closeStart) {
291
+ restoreFullscreen();
292
+ event.stopPropagation();
293
+ event.preventDefault();
294
+ return;
295
+ }
277
296
  if (relativeY === 0
278
297
  && headerAreas.actionStart != null
279
- && relativeX >= headerAreas.actionStart) {
298
+ && relativeX >= headerAreas.actionStart
299
+ && (headerAreas.closeStart == null || relativeX < headerAreas.closeStart)) {
280
300
  openPaneMenu(leaf.instanceId, leaf.rect, event);
281
301
  event.stopPropagation();
282
302
  event.preventDefault();
@@ -319,6 +339,7 @@ export function useShellTerminalPointerRuntime({
319
339
  focusedPaneId,
320
340
  handleActiveDrag,
321
341
  handleFloatingClose,
342
+ restoreFullscreen,
322
343
  menuState,
323
344
  openPaneMenu,
324
345
  paneMap,
@@ -1,6 +1,11 @@
1
1
  import { tf } from "../../../i18n";
2
2
  import { updatePaneInstance } from "../../../pane-settings";
3
- import { canFollowTickerSource, listVisibleTickerSourcePanes } from "../../../layout/ticker-navigation";
3
+ import {
4
+ canFollowTickerSource,
5
+ followBindingReaches,
6
+ isTickerLinkPeer,
7
+ } from "../../../layout/ticker-navigation";
8
+ import { isPaneInLayout } from "../../../layout/pane-manager";
4
9
  import { resolveTickerForPane, type AppState } from "../../../state/app/context";
5
10
  import { resolveInstrumentForPane } from "../../../core/state/app/instrument";
6
11
  import { paneTitleMnemonic, pinFollowingPane } from "../../../layout/pane-follow";
@@ -11,13 +16,13 @@ import {
11
16
  } from "../../../types/config";
12
17
  import type { ContextMenuItem } from "../../../types/context-menu";
13
18
  import type { PaneDef } from "../../../types/plugin";
14
- import { getBasePaneDisplayTitle } from "../pane/title";
19
+ import { getTickerLinkSourceTitle } from "../pane/title";
15
20
 
16
21
  /**
17
22
  * Flat link controls for a pane that shows one ticker (Ticker Research, or a pane that sets
18
- * `PaneDef.tickerFollower`): one "Link to" entry per visible ticker source, plus an unlink entry
19
- * that pins the pane on the symbol it currently shows. Only list panes and scanners are targets;
20
- * a pane following anything else (a desk's OMON following OVDV) gets no rows.
23
+ * `PaneDef.tickerFollower`): one "Link to" entry per visible list, scanner, or other single-ticker
24
+ * pane, plus an unlink entry that pins the pane on the symbol it currently shows. A target whose
25
+ * follow chain already reaches this pane is left out, so two panes cannot point at each other.
21
26
  */
22
27
  export function tickerLinkMenuItems({
23
28
  instance,
@@ -72,10 +77,19 @@ export function tickerLinkMenuItems({
72
77
  });
73
78
  };
74
79
 
75
- return listVisibleTickerSourcePanes(layout, panes).flatMap((source): ContextMenuItem[] => {
76
- const paneDef = panes.get(source.paneId);
77
- if (!paneDef || source.instanceId === instance.instanceId) return [];
78
- const title = getBasePaneDisplayTitle(state, source, paneDef);
80
+ return layout.instances.flatMap((source): ContextMenuItem[] => {
81
+ if (source.instanceId === instance.instanceId || !isPaneInLayout(layout, source.instanceId)) return [];
82
+ const sourceDef = panes.get(source.paneId);
83
+ if (!sourceDef) return [];
84
+ const list = sourceDef.tickerSource === true;
85
+ const peer = isTickerLinkPeer(source, panes);
86
+ if (!list && !peer) return [];
87
+ if (
88
+ source.instanceId !== sourceInstanceId
89
+ && followBindingReaches(layout, source.instanceId, instance.instanceId)
90
+ ) return [];
91
+ if (peer && !list && !resolveTickerForPane(state as AppState, source.instanceId)) return [];
92
+ const title = getTickerLinkSourceTitle(state, source, sourceDef, panes, "menu");
79
93
 
80
94
  if (source.instanceId !== sourceInstanceId) {
81
95
  return linkable