@luxalgo/vela 0.7.7 → 0.8.0

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-CGa4KHRa.d.cts → DataProvider-BrlxntPN.d.cts} +1 -1
  2. package/dist/{DataProvider-CmWUtDVL.d.ts → DataProvider-DwFIoV4r.d.ts} +1 -1
  3. package/dist/{chunk-WTWGEB7K.js → chunk-2IAETM2I.js} +260 -2
  4. package/dist/{chunk-CAFCLMPF.js → chunk-BZQM2XO7.js} +1 -0
  5. package/dist/{chunk-ZA2XWTGH.js → chunk-E3GU6AUI.js} +499 -43
  6. package/dist/{chunk-BFA32GOU.js → chunk-EZ5FWVLA.js} +5 -2
  7. package/dist/{chunk-PVGWNF7V.js → chunk-KA77UTRF.js} +2 -2
  8. package/dist/{chunk-RVQWJOEE.js → chunk-QBPUT5SU.js} +2862 -1034
  9. package/dist/{contributions-DF_Ea07m.d.cts → contributions-CtlptxR8.d.cts} +187 -5
  10. package/dist/{contributions-nKOSeLy8.d.ts → contributions-tjNExo1o.d.ts} +187 -5
  11. package/dist/index.cjs +3142 -1030
  12. package/dist/index.d.cts +40 -8
  13. package/dist/index.d.ts +40 -8
  14. package/dist/index.js +28 -4
  15. package/dist/{options-D1AJKsn_.d.ts → options-BnEPUuVV.d.cts} +1 -1
  16. package/dist/{options-D1AJKsn_.d.cts → options-BnEPUuVV.d.ts} +1 -1
  17. package/dist/{plugin-DPyVJFoA.d.cts → plugin-BWxJRKzS.d.cts} +31 -25
  18. package/dist/{plugin-0oFDnexb.d.ts → plugin-e2WUEtiI.d.ts} +31 -25
  19. package/dist/plugin.cjs +1 -0
  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/{statusline-model-DAFyqVmR.d.ts → statusline-model-DFY7tuHj.d.cts} +5 -3
  30. package/dist/{statusline-model-BoWJ3cWQ.d.cts → statusline-model-zKXtGIjj.d.ts} +5 -3
  31. package/dist/ui.cjs +263 -0
  32. package/dist/ui.d.cts +75 -2
  33. package/dist/ui.d.ts +75 -2
  34. package/dist/ui.js +3 -3
  35. package/dist/vela.global.js +3144 -1032
  36. package/dist/vela.global.min.js +78 -76
  37. package/dist/widget.cjs +3627 -1081
  38. package/dist/widget.d.cts +26 -7
  39. package/dist/widget.d.ts +26 -7
  40. package/dist/widget.js +7 -7
  41. package/dist/workspace.cjs +3630 -1081
  42. package/dist/workspace.d.cts +126 -6
  43. package/dist/workspace.d.ts +126 -6
  44. package/dist/workspace.js +6 -6
  45. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { M as MarketConfig, O as OHLCV, U as Unsubscribe } from './options-D1AJKsn_.cjs';
1
+ import { M as MarketConfig, O as OHLCV, U as Unsubscribe } from './options-BnEPUuVV.cjs';
2
2
 
3
3
  /**
4
4
  * Symbol metadata an engine may need (e.g. Pine `syminfo.*`). Free-form beyond
@@ -1,4 +1,4 @@
1
- import { M as MarketConfig, O as OHLCV, U as Unsubscribe } from './options-D1AJKsn_.js';
1
+ import { M as MarketConfig, O as OHLCV, U as Unsubscribe } from './options-BnEPUuVV.js';
2
2
 
3
3
  /**
4
4
  * Symbol metadata an engine may need (e.g. Pine `syminfo.*`). Free-form beyond
@@ -1,4 +1,4 @@
1
- import { overlayScrollbarCss, isDarkColor, mix, HIGHLIGHT, ACCENT_BRIGHT, ACCENT, withAlpha, injectStyles, iconAt, iconEl, BULLISH, BEARISH, WARNING, NEUTRAL } from './chunk-CAFCLMPF.js';
1
+ import { overlayScrollbarCss, isDarkColor, mix, HIGHLIGHT, ACCENT_BRIGHT, ACCENT, withAlpha, injectStyles, iconAt, iconEl, BULLISH, BEARISH, WARNING, NEUTRAL } from './chunk-BZQM2XO7.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';
@@ -1505,6 +1505,264 @@ var Dialog = class {
1505
1505
  }
1506
1506
  };
1507
1507
 
1508
+ // src/ui/components/date-picker/controller.ts
1509
+ var MONTH_LABELS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
1510
+ var MONTH_SHORT = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
1511
+ var WEEKDAY_LABELS = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
1512
+ function isoDate(d) {
1513
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
1514
+ }
1515
+ function normalizeDateInput(raw) {
1516
+ const m = /^(\d{4})-(\d{1,2})-(\d{1,2})$/.exec(raw.trim());
1517
+ if (!m) return null;
1518
+ const y = Number(m[1]);
1519
+ const mo = Number(m[2]);
1520
+ const d = Number(m[3]);
1521
+ const dt = new Date(y, mo - 1, d);
1522
+ if (dt.getFullYear() !== y || dt.getMonth() !== mo - 1 || dt.getDate() !== d) return null;
1523
+ return isoDate(dt);
1524
+ }
1525
+ function parseIsoDate(raw) {
1526
+ const iso = raw ? normalizeDateInput(raw) : null;
1527
+ if (!iso) return null;
1528
+ const [y, mo, d] = iso.split("-").map(Number);
1529
+ return new Date(y, mo - 1, d);
1530
+ }
1531
+ function datePickerController(opts = {}) {
1532
+ const today = opts.today ?? /* @__PURE__ */ new Date();
1533
+ let selected = parseIsoDate(opts.value);
1534
+ let year = selected?.getFullYear() ?? today.getFullYear();
1535
+ let month = selected?.getMonth() ?? today.getMonth();
1536
+ let panel = "date";
1537
+ const decade = () => Math.floor(year / 10) * 10;
1538
+ return {
1539
+ get panel() {
1540
+ return panel;
1541
+ },
1542
+ get year() {
1543
+ return year;
1544
+ },
1545
+ get month() {
1546
+ return month;
1547
+ },
1548
+ get value() {
1549
+ return selected ? isoDate(selected) : null;
1550
+ },
1551
+ header() {
1552
+ return {
1553
+ month: MONTH_LABELS[month] ?? "",
1554
+ monthVisible: panel === "date",
1555
+ year: panel === "year" ? `${decade()}-${decade() + 9}` : String(year),
1556
+ yearDisabled: panel === "year"
1557
+ // in the decade panel the year reads as its title
1558
+ };
1559
+ },
1560
+ navLabels() {
1561
+ if (panel === "date") return { prev: "Previous month", next: "Next month" };
1562
+ if (panel === "month") return { prev: "Previous year", next: "Next year" };
1563
+ return { prev: "Previous decade", next: "Next decade" };
1564
+ },
1565
+ cells() {
1566
+ const out = [];
1567
+ if (panel === "date") {
1568
+ const startPad = new Date(year, month, 1).getDay();
1569
+ const days = new Date(year, month + 1, 0).getDate();
1570
+ const todayIso = isoDate(today);
1571
+ const selectedIso = selected ? isoDate(selected) : "";
1572
+ for (let i = 0; i < startPad; i++) out.push({ label: "", value: "", checked: false, today: false, blank: true });
1573
+ for (let day = 1; day <= days; day++) {
1574
+ const iso = `${year}-${String(month + 1).padStart(2, "0")}-${String(day).padStart(2, "0")}`;
1575
+ out.push({ label: String(day), value: iso, checked: iso === selectedIso, today: iso === todayIso });
1576
+ }
1577
+ return out;
1578
+ }
1579
+ if (panel === "month") {
1580
+ for (let m = 0; m < 12; m++) {
1581
+ out.push({
1582
+ label: MONTH_SHORT[m] ?? "",
1583
+ value: m,
1584
+ checked: selected?.getFullYear() === year && selected.getMonth() === m,
1585
+ today: today.getFullYear() === year && today.getMonth() === m
1586
+ });
1587
+ }
1588
+ return out;
1589
+ }
1590
+ const d = decade();
1591
+ for (let y = d - 1; y <= d + 10; y++) {
1592
+ out.push({ label: String(y), value: y, checked: selected?.getFullYear() === y, today: today.getFullYear() === y, outside: y < d || y > d + 9 });
1593
+ }
1594
+ return out;
1595
+ },
1596
+ step(dir) {
1597
+ if (panel === "date") {
1598
+ month += dir;
1599
+ if (month < 0) {
1600
+ month = 11;
1601
+ year -= 1;
1602
+ }
1603
+ if (month > 11) {
1604
+ month = 0;
1605
+ year += 1;
1606
+ }
1607
+ } else {
1608
+ year += panel === "month" ? dir : dir * 10;
1609
+ }
1610
+ },
1611
+ showMonths() {
1612
+ panel = "month";
1613
+ },
1614
+ showYears() {
1615
+ panel = "year";
1616
+ },
1617
+ choose(cell) {
1618
+ if (cell.blank) return null;
1619
+ if (panel === "date") {
1620
+ selected = parseIsoDate(String(cell.value));
1621
+ return selected ? isoDate(selected) : null;
1622
+ }
1623
+ if (panel === "month") {
1624
+ month = Number(cell.value);
1625
+ panel = "date";
1626
+ return null;
1627
+ }
1628
+ year = Number(cell.value);
1629
+ panel = "month";
1630
+ return null;
1631
+ },
1632
+ setValue(value) {
1633
+ selected = parseIsoDate(value);
1634
+ if (selected) {
1635
+ year = selected.getFullYear();
1636
+ month = selected.getMonth();
1637
+ }
1638
+ panel = "date";
1639
+ }
1640
+ };
1641
+ }
1642
+
1643
+ // src/ui/components/date-picker/styles.ts
1644
+ var DATE_PICKER_STYLE_ID = "vela-date-picker-styles";
1645
+ var DATE_PICKER_CSS = `
1646
+ .vela-date-picker{color:var(--vela-fg);font:14px var(--vela-font);user-select:none;}
1647
+ .vela-date-picker [hidden]{display:none !important;}
1648
+ .vela-date-picker-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px;}
1649
+ .vela-date-picker-title{flex:1;display:flex;align-items:center;justify-content:center;gap:2px;min-width:0;}
1650
+ .vela-date-picker-switch{border:none;background:transparent;color:var(--vela-fg-bright);font:inherit;font-weight:600;font-size:14px;padding:2px 6px;border-radius:4px;cursor:pointer;}
1651
+ .vela-date-picker-switch:not(:disabled):hover{background:var(--vela-hover);}
1652
+ .vela-date-picker-switch:disabled{cursor:default;}
1653
+ .vela-date-picker-nav{width:24px;height:24px;border:none;background:transparent;color:var(--vela-fg-muted);border-radius:4px;padding:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:14px;}
1654
+ .vela-date-picker-nav:hover{background:var(--vela-hover);color:var(--vela-fg-bright);}
1655
+ .vela-date-picker-week,.vela-date-picker-grid{display:grid;grid-template-columns:repeat(7,28px);gap:2px;}
1656
+ .vela-date-picker-week{margin-bottom:4px;color:var(--vela-fg-muted);font-size:11px;text-align:center;}
1657
+ .vela-date-picker-week span{line-height:20px;}
1658
+ .vela-date-picker-blank{width:28px;height:28px;}
1659
+ .vela-date-picker-day{width:28px;height:28px;border:none;background:transparent;color:inherit;border-radius:4px;padding:0;cursor:pointer;font:inherit;font-size:14px;}
1660
+ .vela-date-picker-day:hover{background:var(--vela-hover);}
1661
+ .vela-date-picker-day[data-checked]{background:var(--vela-hover-strong);color:var(--vela-fg-bright);}
1662
+ .vela-date-picker-day[data-today]:not([data-checked]){box-shadow:inset 0 0 0 1px var(--vela-border-strong);}
1663
+ .vela-date-picker-cells{display:grid;grid-template-columns:repeat(3,1fr);gap:4px;width:calc(7 * 28px + 6 * 2px);}
1664
+ .vela-date-picker-cell{height:36px;border:none;background:transparent;color:inherit;border-radius:4px;padding:0 4px;cursor:pointer;font:inherit;font-size:14px;}
1665
+ .vela-date-picker-cell:hover{background:var(--vela-hover);}
1666
+ .vela-date-picker-cell[data-checked]{background:var(--vela-hover-strong);color:var(--vela-fg-bright);}
1667
+ .vela-date-picker-cell[data-today]:not([data-checked]){box-shadow:inset 0 0 0 1px var(--vela-border-strong);}
1668
+ .vela-date-picker-cell[data-outside]{opacity:0.45;}
1669
+ `;
1670
+
1671
+ // src/ui/components/date-picker/view.ts
1672
+ var DatePicker = class {
1673
+ constructor(opts = {}) {
1674
+ this.opts = opts;
1675
+ const doc = document;
1676
+ injectStyles(DATE_PICKER_STYLE_ID, DATE_PICKER_CSS, doc);
1677
+ this.ctrl = datePickerController(opts);
1678
+ const button = (className) => {
1679
+ const b = doc.createElement("button");
1680
+ b.type = "button";
1681
+ b.className = className;
1682
+ return b;
1683
+ };
1684
+ this.prev = button("vela-date-picker-nav");
1685
+ this.prev.append(iconEl("chevron-left", doc));
1686
+ this.next = button("vela-date-picker-nav");
1687
+ this.next.append(iconEl("chevron-right", doc));
1688
+ this.monthBtn = button("vela-date-picker-switch");
1689
+ this.monthBtn.setAttribute("aria-label", "Choose month");
1690
+ this.yearBtn = button("vela-date-picker-switch");
1691
+ this.yearBtn.setAttribute("aria-label", "Choose year");
1692
+ const title = doc.createElement("div");
1693
+ title.className = "vela-date-picker-title";
1694
+ title.append(this.monthBtn, this.yearBtn);
1695
+ const head = doc.createElement("div");
1696
+ head.className = "vela-date-picker-head";
1697
+ head.append(this.prev, title, this.next);
1698
+ this.week = doc.createElement("div");
1699
+ this.week.className = "vela-date-picker-week";
1700
+ for (const d of WEEKDAY_LABELS) {
1701
+ const cell = doc.createElement("span");
1702
+ cell.textContent = d;
1703
+ this.week.appendChild(cell);
1704
+ }
1705
+ this.grid = doc.createElement("div");
1706
+ const on = (el, run) => el.addEventListener("click", (e) => {
1707
+ e.stopPropagation();
1708
+ run();
1709
+ this.paint();
1710
+ });
1711
+ on(this.prev, () => this.ctrl.step(-1));
1712
+ on(this.next, () => this.ctrl.step(1));
1713
+ on(this.monthBtn, () => this.ctrl.showMonths());
1714
+ on(this.yearBtn, () => this.ctrl.showYears());
1715
+ this.el = doc.createElement("div");
1716
+ this.el.className = "vela-date-picker";
1717
+ this.el.append(head, this.week, this.grid);
1718
+ this.paint();
1719
+ }
1720
+ get value() {
1721
+ return this.ctrl.value;
1722
+ }
1723
+ /** Rewrite the selection without emitting (the calendar opens on its month). */
1724
+ setValue(value) {
1725
+ this.ctrl.setValue(value);
1726
+ this.paint();
1727
+ }
1728
+ paint() {
1729
+ const doc = this.el.ownerDocument;
1730
+ const h = this.ctrl.header();
1731
+ this.monthBtn.hidden = !h.monthVisible;
1732
+ this.monthBtn.textContent = h.month;
1733
+ this.yearBtn.textContent = h.year;
1734
+ this.yearBtn.disabled = h.yearDisabled;
1735
+ const nav = this.ctrl.navLabels();
1736
+ this.prev.setAttribute("aria-label", nav.prev);
1737
+ this.next.setAttribute("aria-label", nav.next);
1738
+ const dates = this.ctrl.panel === "date";
1739
+ this.week.hidden = !dates;
1740
+ this.grid.className = dates ? "vela-date-picker-grid" : "vela-date-picker-cells";
1741
+ this.grid.replaceChildren(...this.ctrl.cells().map((cell) => this.cellEl(doc, cell, dates)));
1742
+ }
1743
+ cellEl(doc, cell, dates) {
1744
+ if (cell.blank) {
1745
+ const blank = doc.createElement("span");
1746
+ blank.className = "vela-date-picker-blank";
1747
+ return blank;
1748
+ }
1749
+ const b = doc.createElement("button");
1750
+ b.type = "button";
1751
+ b.className = dates ? "vela-date-picker-day" : "vela-date-picker-cell";
1752
+ b.textContent = cell.label;
1753
+ if (cell.checked) b.dataset.checked = "1";
1754
+ if (cell.today) b.dataset.today = "1";
1755
+ if (cell.outside) b.dataset.outside = "1";
1756
+ b.addEventListener("click", (e) => {
1757
+ e.stopPropagation();
1758
+ const picked = this.ctrl.choose(cell);
1759
+ if (picked) this.opts.onPick?.(picked);
1760
+ else this.paint();
1761
+ });
1762
+ return b;
1763
+ }
1764
+ };
1765
+
1508
1766
  // src/ui/components/switch/controller.ts
1509
1767
  function switchController(opts = {}) {
1510
1768
  let checked = opts.checked ?? false;
@@ -2888,4 +3146,4 @@ function buildFieldControl(desc) {
2888
3146
  return { el };
2889
3147
  }
2890
3148
 
2891
- 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 };
3149
+ export { CALLOUT_CSS, CALLOUT_STYLE_ID, CalloutBubble, ColorField, DatePicker, 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, datePickerController, decorateSelectScroll, dialogController, ensureUIHost, eventDismissedPopover, fieldGrid, fieldGridColumns, fieldRow, fieldSection, fieldSeparator, fillSelectList, glyphSelectController, hslHex, insetRect, intersectRects, isPopoverOpen, isoDate, lineWidthGlyph, menuController, nextUid, normalizeDateInput, numberInputController, openPopoverTrigger, openSelectList, placePopover, popoverController, runMachine, selectController, snapToStep, splitColor, switchController, textAreaController, textFieldController, themeTokens, toggleSelectList, transparencyChecker, viewportRect, widthField, widthFieldOptions };
@@ -120,6 +120,7 @@ registerIcon("chevron-down", S('<path d="M3.5 6 8 10.5 12.5 6"/>'));
120
120
  registerIcon("chevron-up", S('<path d="M3.5 10 8 5.5 12.5 10"/>'));
121
121
  registerIcon("chevrons-right", S('<path d="m4 3.5 4.5 4.5L4 12.5"/><path d="m8.5 3.5 4.5 4.5-4.5 4.5"/>'));
122
122
  registerIcon("chevrons-left", S('<path d="M12 3.5 7.5 8l4.5 4.5"/><path d="M7.5 3.5 3 8l4.5 4.5"/>'));
123
+ registerIcon("replay", S('<path d="M14 4.2v7.6L8.6 8z"/><path d="M7.4 4.2v7.6L2 8z"/>'));
123
124
  registerIcon("check", S('<path d="m2.8 8.4 3.4 3.4 7-7.6"/>'));
124
125
  registerIcon("close", S('<path d="m3.8 3.8 8.4 8.4M12.2 3.8l-8.4 8.4"/>'));
125
126
  registerIcon("pin", S('<path d="M5.6 2.5h4.8M6.4 2.5v3.6L4.4 8.4v.9h7.2v-.9L9.6 6.1V2.5M8 9.3v4.2"/>'));