@luxalgo/vela 0.7.8 → 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 (46) hide show
  1. package/NOTICE +28 -28
  2. package/dist/{DataProvider-CGa4KHRa.d.cts → DataProvider-BrlxntPN.d.cts} +1 -1
  3. package/dist/{DataProvider-CmWUtDVL.d.ts → DataProvider-DwFIoV4r.d.ts} +1 -1
  4. package/dist/{chunk-WTWGEB7K.js → chunk-2IAETM2I.js} +260 -2
  5. package/dist/{chunk-CAFCLMPF.js → chunk-BZQM2XO7.js} +1 -0
  6. package/dist/{chunk-M6GP7DAX.js → chunk-E3GU6AUI.js} +459 -37
  7. package/dist/{chunk-BFA32GOU.js → chunk-EZ5FWVLA.js} +5 -2
  8. package/dist/{chunk-PVGWNF7V.js → chunk-KA77UTRF.js} +2 -2
  9. package/dist/{chunk-N4ZZYLMP.js → chunk-QBPUT5SU.js} +686 -251
  10. package/dist/{contributions-DF_Ea07m.d.cts → contributions-CtlptxR8.d.cts} +187 -5
  11. package/dist/{contributions-nKOSeLy8.d.ts → contributions-tjNExo1o.d.ts} +187 -5
  12. package/dist/index.cjs +966 -247
  13. package/dist/index.d.cts +24 -8
  14. package/dist/index.d.ts +24 -8
  15. package/dist/index.js +28 -4
  16. package/dist/{options-D1AJKsn_.d.ts → options-BnEPUuVV.d.cts} +1 -1
  17. package/dist/{options-D1AJKsn_.d.cts → options-BnEPUuVV.d.ts} +1 -1
  18. package/dist/{plugin-6F04gjQe.d.cts → plugin-BWxJRKzS.d.cts} +10 -4
  19. package/dist/{plugin-BLsNipkc.d.ts → plugin-e2WUEtiI.d.ts} +10 -4
  20. package/dist/plugin.cjs +1 -0
  21. package/dist/plugin.d.cts +4 -4
  22. package/dist/plugin.d.ts +4 -4
  23. package/dist/plugin.js +2 -2
  24. package/dist/providers/binance.d.cts +2 -2
  25. package/dist/providers/binance.d.ts +2 -2
  26. package/dist/providers/coinbase.d.cts +2 -2
  27. package/dist/providers/coinbase.d.ts +2 -2
  28. package/dist/providers/hyperliquid.d.cts +2 -2
  29. package/dist/providers/hyperliquid.d.ts +2 -2
  30. package/dist/{statusline-model-DAFyqVmR.d.ts → statusline-model-DFY7tuHj.d.cts} +5 -3
  31. package/dist/{statusline-model-BoWJ3cWQ.d.cts → statusline-model-zKXtGIjj.d.ts} +5 -3
  32. package/dist/ui.cjs +263 -0
  33. package/dist/ui.d.cts +75 -2
  34. package/dist/ui.d.ts +75 -2
  35. package/dist/ui.js +3 -3
  36. package/dist/vela.global.js +968 -249
  37. package/dist/vela.global.min.js +73 -71
  38. package/dist/widget.cjs +1411 -292
  39. package/dist/widget.d.cts +26 -7
  40. package/dist/widget.d.ts +26 -7
  41. package/dist/widget.js +7 -7
  42. package/dist/workspace.cjs +1414 -292
  43. package/dist/workspace.d.cts +124 -6
  44. package/dist/workspace.d.ts +124 -6
  45. package/dist/workspace.js +6 -6
  46. package/package.json +1 -1
package/NOTICE CHANGED
@@ -1,28 +1,28 @@
1
- Vela
2
- Copyright (c) 2026 LuxAlgo
3
- https://luxalgo.com/vela
4
-
5
- This product includes the Vela charting library, developed by LuxAlgo.
6
-
7
- ATTRIBUTION REQUIREMENT
8
-
9
- Any product, website, or application that displays charts rendered by this
10
- software must show a visible attribution to the Vela project on every page or
11
- screen where such a chart is displayed.
12
-
13
- The library satisfies this requirement automatically: it renders an attribution
14
- mark (the project logomark linking to the Vela project page) on the chart
15
- itself, enabled by default. You may restyle or reposition this mark to fit your
16
- design.
17
-
18
- You may disable the built-in mark (renderer feature `attribution`) ONLY if you
19
- display an equivalent visible attribution — the name "Vela" together with a
20
- link to the project page above — elsewhere on the same page or screen, in a
21
- place available to your users.
22
-
23
- Removing, hiding, or obscuring the attribution without providing the
24
- equivalent notice described above is not permitted.
25
-
26
- This file constitutes the NOTICE file described in Section 4(d) of the Apache
27
- License, Version 2.0: redistributions of this software, in source or binary
28
- form, must include a readable copy of these attribution notices.
1
+ Vela
2
+ Copyright (c) 2026 LuxAlgo
3
+ https://luxalgo.com/vela
4
+
5
+ This product includes the Vela charting library, developed by LuxAlgo.
6
+
7
+ ATTRIBUTION REQUIREMENT
8
+
9
+ Any product, website, or application that displays charts rendered by this
10
+ software must show a visible attribution to the Vela project on every page or
11
+ screen where such a chart is displayed.
12
+
13
+ The library satisfies this requirement automatically: it renders an attribution
14
+ mark (the project logomark linking to the Vela project page) on the chart
15
+ itself, enabled by default. You may restyle or reposition this mark to fit your
16
+ design.
17
+
18
+ You may disable the built-in mark (renderer feature `attribution`) ONLY if you
19
+ display an equivalent visible attribution — the name "Vela" together with a
20
+ link to the project page above — elsewhere on the same page or screen, in a
21
+ place available to your users.
22
+
23
+ Removing, hiding, or obscuring the attribution without providing the
24
+ equivalent notice described above is not permitted.
25
+
26
+ This file constitutes the NOTICE file described in Section 4(d) of the Apache
27
+ License, Version 2.0: redistributions of this software, in source or binary
28
+ form, must include a readable copy of these attribution notices.
@@ -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"/>'));