@luxalgo/vela 0.6.7 → 0.6.9

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 (45) hide show
  1. package/dist/{DataProvider-BsQM2WNH.d.cts → DataProvider-8Z95Q-RJ.d.cts} +1 -1
  2. package/dist/{DataProvider-BSLlBpB9.d.ts → DataProvider-DExJrfut.d.ts} +1 -1
  3. package/dist/{chunk-2R7BANEM.js → chunk-62SVGONC.js} +2 -2
  4. package/dist/{chunk-6WFKTAT4.js → chunk-6WDDVMBJ.js} +548 -147
  5. package/dist/{chunk-L3I2CCYO.js → chunk-EQCHJZOT.js} +49 -2
  6. package/dist/{chunk-OICPLNU7.js → chunk-FCVIG7JG.js} +188 -2
  7. package/dist/{chunk-WVP4XV5A.js → chunk-STHSKXOR.js} +407 -159
  8. package/dist/{chunk-PN5KWFZ4.js → chunk-WFSZBX3R.js} +2 -2
  9. package/dist/{contributions-Z12BrWCy.d.ts → contributions-C1U2Krwg.d.cts} +112 -7
  10. package/dist/{contributions-Hv4_cOJo.d.cts → contributions-D7PVZO2i.d.ts} +112 -7
  11. package/dist/index.cjs +755 -152
  12. package/dist/index.d.cts +12 -7
  13. package/dist/index.d.ts +12 -7
  14. package/dist/index.js +4 -4
  15. package/dist/{options-BaVTMXaO.d.ts → options-FM0peknS.d.cts} +84 -7
  16. package/dist/{options-BaVTMXaO.d.cts → options-FM0peknS.d.ts} +84 -7
  17. package/dist/{plugin-9koBjc5H.d.ts → plugin-7bkF32Rk.d.ts} +3 -3
  18. package/dist/{plugin-BXhDHTYn.d.cts → plugin-DfVqBz9p.d.cts} +3 -3
  19. package/dist/plugin.cjs +18 -2
  20. package/dist/plugin.d.cts +4 -4
  21. package/dist/plugin.d.ts +4 -4
  22. package/dist/plugin.js +2 -2
  23. package/dist/providers/binance.d.cts +2 -2
  24. package/dist/providers/binance.d.ts +2 -2
  25. package/dist/providers/coinbase.d.cts +2 -2
  26. package/dist/providers/coinbase.d.ts +2 -2
  27. package/dist/providers/hyperliquid.d.cts +2 -2
  28. package/dist/providers/hyperliquid.d.ts +2 -2
  29. package/dist/{bottombar-Br4rzx_R.d.ts → statusline-DOPiT6I6.d.cts} +91 -6
  30. package/dist/{bottombar-Div5zibZ.d.cts → statusline-zdF4eZLr.d.ts} +91 -6
  31. package/dist/ui.cjs +201 -4
  32. package/dist/ui.d.cts +89 -2
  33. package/dist/ui.d.ts +89 -2
  34. package/dist/ui.js +3 -3
  35. package/dist/vela.global.js +755 -152
  36. package/dist/vela.global.min.js +93 -44
  37. package/dist/widget.cjs +1144 -271
  38. package/dist/widget.d.cts +12 -85
  39. package/dist/widget.d.ts +12 -85
  40. package/dist/widget.js +7 -7
  41. package/dist/workspace.cjs +1144 -271
  42. package/dist/workspace.d.cts +65 -11
  43. package/dist/workspace.d.ts +65 -11
  44. package/dist/workspace.js +6 -6
  45. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { svg24, NEUTRAL, BEARISH, WARNING, BULLISH, INFO, ACCENT_BRIGHT, VALID, INVALID, MARKER, ACCENT, injectStyles, iconEl } from './chunk-PN5KWFZ4.js';
1
+ import { svg24, NEUTRAL, BEARISH, WARNING, BULLISH, INFO, ACCENT_BRIGHT, VALID, INVALID, MARKER, ACCENT, injectStyles, iconEl } from './chunk-WFSZBX3R.js';
2
2
 
3
3
  // src/core/native-indicators/NativeIndicator.ts
4
4
  var REGISTRY = /* @__PURE__ */ new Map();
@@ -5863,6 +5863,53 @@ function legendActionsProviderFor(chart, context) {
5863
5863
  return legendActions().filter((d) => !d.when || d.when(info)).map((d) => ({ id: d.id, icon: d.icon, tooltip: d.tooltip, run: () => d.run(context(), info) }));
5864
5864
  };
5865
5865
  }
5866
+ var calloutRegistry = /* @__PURE__ */ new Map();
5867
+ function registerLegendCallout(desc) {
5868
+ calloutRegistry.set(desc.id, desc);
5869
+ return () => {
5870
+ if (calloutRegistry.get(desc.id) === desc) calloutRegistry.delete(desc.id);
5871
+ };
5872
+ }
5873
+ function unregisterLegendCallout(id) {
5874
+ calloutRegistry.delete(id);
5875
+ }
5876
+ function legendCallouts() {
5877
+ return [...calloutRegistry.values()].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
5878
+ }
5879
+ function legendCalloutsProviderFor(chart, context) {
5880
+ return (indicatorId) => {
5881
+ const handle = chart.indicators().find((h) => h.id === indicatorId);
5882
+ if (!handle) return [];
5883
+ const info = { id: handle.id, title: handle.title, ...handle.source !== void 0 ? { source: handle.source } : {} };
5884
+ const views = [];
5885
+ for (const d of legendCallouts()) {
5886
+ const spec = d.callout(info);
5887
+ if (!spec) continue;
5888
+ views.push({
5889
+ id: d.id,
5890
+ icon: spec.icon,
5891
+ background: spec.background,
5892
+ ...spec.color !== void 0 ? { color: spec.color } : {},
5893
+ tooltip: spec.tooltip,
5894
+ ...spec.content !== void 0 ? {
5895
+ content: {
5896
+ ...spec.content.title !== void 0 ? { title: spec.content.title } : {},
5897
+ items: spec.content.items.map(
5898
+ (item) => item.type === "text" ? item : {
5899
+ type: "button",
5900
+ label: item.label,
5901
+ ...item.primary !== void 0 ? { primary: item.primary } : {},
5902
+ ...item.close !== void 0 ? { close: item.close } : {},
5903
+ run: () => item.run(context(), info)
5904
+ }
5905
+ )
5906
+ }
5907
+ } : {}
5908
+ });
5909
+ }
5910
+ return views;
5911
+ };
5912
+ }
5866
5913
  var stateHandlers = /* @__PURE__ */ new Map();
5867
5914
  function registerStatePersistence(handler) {
5868
5915
  stateHandlers.set(handler.key, handler);
@@ -6113,4 +6160,4 @@ var SidePanel = class {
6113
6160
  }
6114
6161
  };
6115
6162
 
6116
- export { AnchoredVwap, ArrowMark, Callout, CalloutBase, Comment, DEDEKIND_CURVATURE_OPTIONS, DEFAULT_DRAWING_COLOR, DEFAULT_PANEL_MAX_WIDTH, DEFAULT_PANEL_MIN_WIDTH, DEFAULT_PANEL_ORDER, DEFAULT_PANEL_WIDTH, DIRECTION_OPTIONS, DedekindTessellation, Drawing, FibRatios, FibSpiral, FixedRangeVolumeProfile, GANN_SQUARE_ARCS, GLYPH_OPTIONS, GannSquare, GlyphStamp, LINE_STYLE_OPTIONS, MACH_NUMBER_OPTIONS, MACH_WAVE_COUNT_OPTIONS, MachFigure, MeasureBox, Note, OVERRIDABLE_TOPBAR_IDS, PatternDrawing, PositionTool, PriceLabel, PriceNote, RadialFib, RegressionChannel, STAMP_SIZE_OPTIONS, SegmentDrawing, SidePanel, Signpost, TEXT_SIZE_OPTIONS, TOPBAR_BUILTIN_IDS, TOPBAR_DEFAULT_LEFT, TOPBAR_DEFAULT_RIGHT, TextLabel, chartType, chartTypes, clampPanelWidth, createDrawing, deserializeDrawing, drawingTypes, foldBaseModulation, formatDuration, getDrawingType, getNativeIndicator, inputVisible, legendActions, legendActionsProviderFor, lineSegmentIntersection, nativeIndicatorDescriptors, nativeIndicatorTypes, normalizeSettingsRow, pinnedTopbarActionIds, registerChartType, registerDefaultEngine, registerDrawingType, registerLegendAction, registerNativeIndicator, registerRendererDefaults, registerRendererLayer, registerSidePanel, registerStatePersistence, registerSymbolRanking, registerWidgetAction, registerWidgetAttachment, rendererDefaults, rendererLayers, resetDrawingSettings, resolveEngines, resolveTopbarComposition, settingsRowValueKeys, settingsRowVisible, sidePanels, statePersistenceHandlers, symbolRanking, tickerModifierIds, topbarActionOverride, topbarHas, unregisterChartType, unregisterDefaultEngine, unregisterLegendAction, unregisterNativeIndicator, unregisterRendererDefaults, unregisterRendererLayer, unregisterSidePanel, unregisterStatePersistence, unregisterWidgetAction, unregisterWidgetAttachment, widgetActions, widgetAttachments };
6163
+ export { AnchoredVwap, ArrowMark, Callout, CalloutBase, Comment, DEDEKIND_CURVATURE_OPTIONS, DEFAULT_DRAWING_COLOR, DEFAULT_PANEL_MAX_WIDTH, DEFAULT_PANEL_MIN_WIDTH, DEFAULT_PANEL_ORDER, DEFAULT_PANEL_WIDTH, DIRECTION_OPTIONS, DedekindTessellation, Drawing, FibRatios, FibSpiral, FixedRangeVolumeProfile, GANN_SQUARE_ARCS, GLYPH_OPTIONS, GannSquare, GlyphStamp, LINE_STYLE_OPTIONS, MACH_NUMBER_OPTIONS, MACH_WAVE_COUNT_OPTIONS, MachFigure, MeasureBox, Note, OVERRIDABLE_TOPBAR_IDS, PatternDrawing, PositionTool, PriceLabel, PriceNote, RadialFib, RegressionChannel, STAMP_SIZE_OPTIONS, SegmentDrawing, SidePanel, Signpost, TEXT_SIZE_OPTIONS, TOPBAR_BUILTIN_IDS, TOPBAR_DEFAULT_LEFT, TOPBAR_DEFAULT_RIGHT, TextLabel, chartType, chartTypes, clampPanelWidth, createDrawing, deserializeDrawing, drawingTypes, foldBaseModulation, formatDuration, getDrawingType, getNativeIndicator, inputVisible, legendActions, legendActionsProviderFor, legendCallouts, legendCalloutsProviderFor, lineSegmentIntersection, nativeIndicatorDescriptors, nativeIndicatorTypes, normalizeSettingsRow, pinnedTopbarActionIds, registerChartType, registerDefaultEngine, registerDrawingType, registerLegendAction, registerLegendCallout, registerNativeIndicator, registerRendererDefaults, registerRendererLayer, registerSidePanel, registerStatePersistence, registerSymbolRanking, registerWidgetAction, registerWidgetAttachment, rendererDefaults, rendererLayers, resetDrawingSettings, resolveEngines, resolveTopbarComposition, settingsRowValueKeys, settingsRowVisible, sidePanels, statePersistenceHandlers, symbolRanking, tickerModifierIds, topbarActionOverride, topbarHas, unregisterChartType, unregisterDefaultEngine, unregisterLegendAction, unregisterLegendCallout, unregisterNativeIndicator, unregisterRendererDefaults, unregisterRendererLayer, unregisterSidePanel, unregisterStatePersistence, unregisterWidgetAction, unregisterWidgetAttachment, widgetActions, widgetAttachments };
@@ -1,4 +1,4 @@
1
- import { overlayScrollbarCss, injectStyles, isDarkColor, mix, HIGHLIGHT, ACCENT_BRIGHT, ACCENT, withAlpha, iconEl, BULLISH, BEARISH, WARNING, NEUTRAL } from './chunk-PN5KWFZ4.js';
1
+ import { overlayScrollbarCss, injectStyles, isDarkColor, mix, HIGHLIGHT, ACCENT_BRIGHT, ACCENT, withAlpha, iconAt, iconEl, BULLISH, BEARISH, WARNING, NEUTRAL } from './chunk-WFSZBX3R.js';
2
2
  import { VanillaMachine, normalizeProps, spreadProps } from '@zag-js/vanilla';
3
3
  export { normalizeProps, spreadProps } from '@zag-js/vanilla';
4
4
  import * as menu from '@zag-js/menu';
@@ -707,6 +707,192 @@ var Popover = class {
707
707
  }
708
708
  };
709
709
 
710
+ // src/ui/components/callout-bubble/controller.ts
711
+ function closesPanel(item) {
712
+ return item.close !== false;
713
+ }
714
+ function calloutPanelRows(items) {
715
+ const rows = [];
716
+ for (const item of items) {
717
+ if (item.type === "text") {
718
+ rows.push({ type: "text", text: item.text });
719
+ continue;
720
+ }
721
+ const last = rows[rows.length - 1];
722
+ if (last && last.type === "buttons") last.buttons.push(item);
723
+ else rows.push({ type: "buttons", buttons: [item] });
724
+ }
725
+ return rows;
726
+ }
727
+
728
+ // src/ui/components/callout-bubble/styles.ts
729
+ var CALLOUT_STYLE_ID = "vela-ui-callout-bubble";
730
+ var CALLOUT_CSS = `
731
+ .vela-callout {
732
+ display: inline-grid;
733
+ place-items: center;
734
+ border-radius: 50%;
735
+ flex: none;
736
+ line-height: 0;
737
+ box-sizing: border-box;
738
+ cursor: default;
739
+ user-select: none;
740
+ -webkit-user-select: none;
741
+ }
742
+ .vela-callout[role='button'] { cursor: pointer; }
743
+ .vela-callout svg { display: block; }
744
+ /* The deployed panel \u2014 carries the kit's elevated-card look itself (the popover
745
+ shell is bare positioning chrome). */
746
+ .vela-callout-panel {
747
+ display: flex;
748
+ flex-direction: column;
749
+ gap: 8px;
750
+ padding: 10px 12px;
751
+ max-width: 280px;
752
+ box-sizing: border-box;
753
+ background: var(--vela-surface-elev);
754
+ border: 1px solid var(--vela-border-strong);
755
+ border-radius: 6px;
756
+ box-shadow: var(--vela-shadow);
757
+ color: var(--vela-fg);
758
+ font: var(--vela-font-size-md) var(--vela-font);
759
+ }
760
+ .vela-callout-title { font-weight: 600; color: var(--vela-fg-bright); }
761
+ .vela-callout-text { color: var(--vela-fg-muted); line-height: 1.45; white-space: pre-line; }
762
+ .vela-callout-actions { display: flex; flex-wrap: wrap; gap: 8px; }
763
+ .vela-callout-btn {
764
+ cursor: pointer;
765
+ height: 26px;
766
+ padding: 0 10px;
767
+ border-radius: 5px;
768
+ border: 1px solid var(--vela-border);
769
+ background: transparent;
770
+ color: var(--vela-fg);
771
+ font-size: var(--vela-font-size-md);
772
+ font-family: inherit;
773
+ transition: background var(--vela-dur-fast) ease, color var(--vela-dur-fast) ease, opacity var(--vela-dur-fast) ease, border-color var(--vela-dur-fast) ease;
774
+ }
775
+ .vela-callout-btn:hover { background: var(--vela-hover); color: var(--vela-fg-bright); border-color: var(--vela-fg-muted); }
776
+ .vela-callout-btn-primary { border-color: var(--vela-selected-bg); background: var(--vela-selected-bg); color: var(--vela-selected-fg); }
777
+ .vela-callout-btn-primary:hover { background: var(--vela-selected-bg); color: var(--vela-selected-fg); opacity: 0.85; border-color: var(--vela-selected-bg); }
778
+ `;
779
+
780
+ // src/ui/components/callout-bubble/view.ts
781
+ var CalloutBubble = class {
782
+ constructor(opts) {
783
+ this.pop = null;
784
+ this.spec = { icon: opts.icon, background: opts.background, label: opts.label };
785
+ if (opts.color !== void 0) this.spec.color = opts.color;
786
+ if (opts.panel !== void 0) this.spec.panel = opts.panel;
787
+ this.size = opts.size ?? 16;
788
+ this.host = opts.host;
789
+ this.theme = opts.theme;
790
+ this.boundary = opts.boundary;
791
+ const doc = (opts.host ?? document.body).ownerDocument;
792
+ injectStyles(CALLOUT_STYLE_ID, CALLOUT_CSS, doc);
793
+ this.el = doc.createElement("span");
794
+ this.el.className = "vela-callout";
795
+ this.el.style.width = `${this.size}px`;
796
+ this.el.style.height = `${this.size}px`;
797
+ this.el.addEventListener("click", (e) => {
798
+ if (!this.spec.panel) return;
799
+ e.stopPropagation();
800
+ this.toggle();
801
+ });
802
+ this.el.addEventListener("dblclick", (e) => {
803
+ if (this.spec.panel) e.stopPropagation();
804
+ });
805
+ this.el.addEventListener("keydown", (e) => {
806
+ if (!this.spec.panel || e.key !== "Enter" && e.key !== " ") return;
807
+ e.preventDefault();
808
+ this.toggle();
809
+ });
810
+ this.dress();
811
+ }
812
+ /** Re-dress the bubble (a status change: new icon, tint, label, panel). */
813
+ set(spec) {
814
+ this.spec = { ...this.spec, ...spec };
815
+ if ("panel" in spec) this.pop?.hide();
816
+ this.dress();
817
+ }
818
+ /** Whether the deployed panel is currently open. */
819
+ get open() {
820
+ return this.pop?.open ?? false;
821
+ }
822
+ destroy() {
823
+ this.pop?.destroy();
824
+ this.pop = null;
825
+ this.el.remove();
826
+ }
827
+ dress() {
828
+ const clickable = this.spec.panel !== void 0;
829
+ this.el.style.background = this.spec.background;
830
+ this.el.style.color = this.spec.color ?? "";
831
+ this.el.innerHTML = iconAt(this.spec.icon, this.size - 4);
832
+ this.el.setAttribute("aria-label", this.spec.label);
833
+ if (clickable) {
834
+ this.el.setAttribute("role", "button");
835
+ this.el.tabIndex = 0;
836
+ } else {
837
+ this.el.removeAttribute("role");
838
+ this.el.removeAttribute("tabindex");
839
+ }
840
+ }
841
+ toggle() {
842
+ if (this.pop?.open) {
843
+ this.pop.hide();
844
+ return;
845
+ }
846
+ const panel = this.spec.panel;
847
+ if (!panel) return;
848
+ this.pop?.destroy();
849
+ this.pop = new Popover({
850
+ trigger: this.el,
851
+ gap: 6,
852
+ content: (body) => this.buildPanel(body, panel),
853
+ ...this.host ? { host: this.host } : {},
854
+ ...this.theme ? { theme: this.theme() } : {},
855
+ ...this.boundary ? { boundary: this.boundary } : {}
856
+ });
857
+ this.pop.show();
858
+ }
859
+ buildPanel(body, panel) {
860
+ const doc = body.ownerDocument;
861
+ const root = doc.createElement("div");
862
+ root.className = "vela-callout-panel";
863
+ if (panel.title) {
864
+ const title = doc.createElement("div");
865
+ title.className = "vela-callout-title";
866
+ title.textContent = panel.title;
867
+ root.appendChild(title);
868
+ }
869
+ for (const row of calloutPanelRows(panel.items)) {
870
+ if (row.type === "text") {
871
+ const text = doc.createElement("div");
872
+ text.className = "vela-callout-text";
873
+ text.textContent = row.text;
874
+ root.appendChild(text);
875
+ continue;
876
+ }
877
+ const actions = doc.createElement("div");
878
+ actions.className = "vela-callout-actions";
879
+ for (const item of row.buttons) {
880
+ const btn = doc.createElement("button");
881
+ btn.type = "button";
882
+ btn.className = "vela-callout-btn" + (item.primary ? " vela-callout-btn-primary" : "");
883
+ btn.textContent = item.label;
884
+ btn.addEventListener("click", () => {
885
+ item.run();
886
+ if (closesPanel(item)) this.pop?.hide();
887
+ });
888
+ actions.appendChild(btn);
889
+ }
890
+ root.appendChild(actions);
891
+ }
892
+ body.appendChild(root);
893
+ }
894
+ };
895
+
710
896
  // src/ui/components/select/controller.ts
711
897
  function selectController(opts) {
712
898
  const options = opts.options;
@@ -2645,4 +2831,4 @@ function buildFieldControl(desc) {
2645
2831
  return { el };
2646
2832
  }
2647
2833
 
2648
- export { ColorField, Dialog, FIELD_GAP_PX, GlyphSelect, Menu, NumberInput, Popover, STATIC_TOKENS, Select, Switch, TextArea, TextField, WIDTH_FIELD_OPTIONS, applyPlotOverlayTokens, applyThemeTokens, blendOver, buildColorPicker, buildFieldControl, buildPalette, clampNumber, closeColorPopover, closeOpenPopovers, closeWidthPopover, colorField, colorPickerController, combineColor, decorateSelectScroll, dialogController, ensureUIHost, eventDismissedPopover, fieldGrid, fieldGridColumns, fieldRow, fieldSection, fieldSeparator, fillSelectList, glyphSelectController, hslHex, insetRect, intersectRects, isPopoverOpen, lineWidthGlyph, menuController, nextUid, numberInputController, openPopoverTrigger, openSelectList, placePopover, popoverController, runMachine, selectController, snapToStep, splitColor, switchController, textAreaController, textFieldController, themeTokens, toggleSelectList, transparencyChecker, viewportRect, widthField, widthFieldOptions };
2834
+ export { CALLOUT_CSS, CALLOUT_STYLE_ID, CalloutBubble, ColorField, Dialog, FIELD_GAP_PX, GlyphSelect, Menu, NumberInput, Popover, STATIC_TOKENS, Select, Switch, TextArea, TextField, WIDTH_FIELD_OPTIONS, applyPlotOverlayTokens, applyThemeTokens, blendOver, buildColorPicker, buildFieldControl, buildPalette, calloutPanelRows, clampNumber, closeColorPopover, closeOpenPopovers, closeWidthPopover, closesPanel, colorField, colorPickerController, combineColor, decorateSelectScroll, dialogController, ensureUIHost, eventDismissedPopover, fieldGrid, fieldGridColumns, fieldRow, fieldSection, fieldSeparator, fillSelectList, glyphSelectController, hslHex, insetRect, intersectRects, isPopoverOpen, lineWidthGlyph, menuController, nextUid, numberInputController, openPopoverTrigger, openSelectList, placePopover, popoverController, runMachine, selectController, snapToStep, splitColor, switchController, textAreaController, textFieldController, themeTokens, toggleSelectList, transparencyChecker, viewportRect, widthField, widthFieldOptions };