@luxalgo/vela 0.5.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 (61) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +28 -0
  3. package/README.md +135 -0
  4. package/dist/DataProvider-DKNDHpNv.d.cts +134 -0
  5. package/dist/DataProvider-Dzd-Erlk.d.ts +134 -0
  6. package/dist/chunk-7UFX5ZIG.js +5976 -0
  7. package/dist/chunk-GYD2THPV.js +252 -0
  8. package/dist/chunk-KCCZNKH7.js +19137 -0
  9. package/dist/chunk-KM6LHB3Y.js +76 -0
  10. package/dist/chunk-OVQKKXLZ.js +3978 -0
  11. package/dist/chunk-Q3XQHLIH.js +7 -0
  12. package/dist/chunk-RHIDOUFL.js +698 -0
  13. package/dist/contributions-hX3EUyjG.d.ts +1528 -0
  14. package/dist/contributions-o1GRKPI_.d.cts +1528 -0
  15. package/dist/history-Dzxz-MQj.d.ts +298 -0
  16. package/dist/history-LJkz4-sS.d.cts +298 -0
  17. package/dist/icons-BZYbJXSV.d.cts +10 -0
  18. package/dist/icons-BZYbJXSV.d.ts +10 -0
  19. package/dist/index.cjs +25294 -0
  20. package/dist/index.d.cts +1189 -0
  21. package/dist/index.d.ts +1189 -0
  22. package/dist/index.js +5 -0
  23. package/dist/keymap-CGOz5F5f.d.cts +64 -0
  24. package/dist/keymap-CGOz5F5f.d.ts +64 -0
  25. package/dist/options-Q-576hIi.d.cts +1545 -0
  26. package/dist/options-Q-576hIi.d.ts +1545 -0
  27. package/dist/plugin-D94muTV-.d.cts +405 -0
  28. package/dist/plugin-aGUD1epn.d.ts +405 -0
  29. package/dist/plugin.cjs +5967 -0
  30. package/dist/plugin.d.cts +7 -0
  31. package/dist/plugin.d.ts +7 -0
  32. package/dist/plugin.js +3 -0
  33. package/dist/providers/binance.cjs +390 -0
  34. package/dist/providers/binance.d.cts +62 -0
  35. package/dist/providers/binance.d.ts +62 -0
  36. package/dist/providers/binance.js +388 -0
  37. package/dist/providers/coinbase.cjs +462 -0
  38. package/dist/providers/coinbase.d.cts +59 -0
  39. package/dist/providers/coinbase.d.ts +59 -0
  40. package/dist/providers/coinbase.js +460 -0
  41. package/dist/providers/hyperliquid.cjs +361 -0
  42. package/dist/providers/hyperliquid.d.cts +54 -0
  43. package/dist/providers/hyperliquid.d.ts +54 -0
  44. package/dist/providers/hyperliquid.js +359 -0
  45. package/dist/side-panel-CT9ZwIGz.d.cts +63 -0
  46. package/dist/side-panel-CT9ZwIGz.d.ts +63 -0
  47. package/dist/ui.cjs +1030 -0
  48. package/dist/ui.d.cts +188 -0
  49. package/dist/ui.d.ts +188 -0
  50. package/dist/ui.js +3 -0
  51. package/dist/vela.global.js +26509 -0
  52. package/dist/vela.global.min.js +230 -0
  53. package/dist/widget.cjs +31178 -0
  54. package/dist/widget.d.cts +799 -0
  55. package/dist/widget.d.ts +799 -0
  56. package/dist/widget.js +1060 -0
  57. package/dist/workspace.cjs +31692 -0
  58. package/dist/workspace.d.cts +579 -0
  59. package/dist/workspace.d.ts +579 -0
  60. package/dist/workspace.js +1694 -0
  61. package/package.json +95 -0
@@ -0,0 +1,405 @@
1
+ import { u as DrawingTypeKey, a3 as DrawingStyle, S as SerializedDrawing, D as Drawing, av as SeriesKind, O as OHLCV, c as VelaTheme } from './options-Q-576hIi.cjs';
2
+ import { b as DataControl } from './contributions-o1GRKPI_.cjs';
3
+ import './side-panel-CT9ZwIGz.cjs';
4
+ import './icons-BZYbJXSV.cjs';
5
+ import './keymap-CGOz5F5f.cjs';
6
+ import './DataProvider-DKNDHpNv.cjs';
7
+
8
+ /** What a drawing type contributes to the toolbar + factory (renderer-neutral). */
9
+ interface DrawingTypeMeta {
10
+ type: DrawingTypeKey;
11
+ /** Toolbar group id (e.g. `'lines'`, `'shapes'`, `'annotations'`). */
12
+ group: string;
13
+ label: string;
14
+ /** Inline SVG markup for the toolbar button — no DOM, renderer paints it. */
15
+ icon: string;
16
+ defaultStyle: DrawingStyle;
17
+ /** Build an instance from a (partial) serialized record. Serves create + deserialize. */
18
+ create(init: Partial<SerializedDrawing> & {
19
+ paneId: string;
20
+ }): Drawing;
21
+ }
22
+ /** Register (or replace) a drawing type. Built-ins register at module load; new
23
+ * types (fibs/patterns) call this — no base/port/facade change. */
24
+ declare function registerDrawingType(meta: DrawingTypeMeta): void;
25
+ declare function getDrawingType(type: string): DrawingTypeMeta | undefined;
26
+ declare function drawingTypes(): DrawingTypeMeta[];
27
+ /** Build a fresh drawing of `type` on `paneId`, seeding the type's default style. */
28
+ declare function createDrawing(type: DrawingTypeKey, init: Partial<SerializedDrawing> & {
29
+ paneId: string;
30
+ }): Drawing | null;
31
+ /** Rehydrate a {@link Drawing} from a plain record, or null for an unknown type. */
32
+ declare function deserializeDrawing(doc: SerializedDrawing): Drawing | null;
33
+
34
+ /**
35
+ * The authoritative, user-controlled pan/zoom state of the time axis.
36
+ *
37
+ * - `barSpacing`: pixels between adjacent bar centers (the zoom level).
38
+ * - `rightOffset`: how many bar-widths the LAST bar sits from the right edge
39
+ * (the pan position). May be negative (last bar scrolled off the right).
40
+ *
41
+ * The chart width and bar count are NOT part of this state — they are owned by
42
+ * the renderer (resize / setBars) and combined with the viewport in the
43
+ * CoordinateSystem to produce pixel coordinates.
44
+ */
45
+ interface ViewportState {
46
+ barSpacing: number;
47
+ rightOffset: number;
48
+ }
49
+
50
+ /** A pane's price window (after autoscale + margins). `log` ⇒ logarithmic mapping;
51
+ * `invert` ⇒ the axis is flipped (high at the bottom), stamped per frame from the pane. */
52
+ interface PriceScale {
53
+ min: number;
54
+ max: number;
55
+ log?: boolean;
56
+ invert?: boolean;
57
+ }
58
+ /** A pane's vertical pixel extent within the chart's data area (media px). */
59
+ interface PaneBounds {
60
+ top: number;
61
+ height: number;
62
+ }
63
+ /**
64
+ * The ONE authoritative coordinate transform, shared by every layer (data
65
+ * backend, canvas2d chrome, DOM overlays). Two decoupled axes:
66
+ *
67
+ * - X: a fractional **logical bar index** mapped to pixels by the viewport
68
+ * (`barSpacing` + `rightOffset`); bar TIME ↔ logical is a separate mapping
69
+ * over the loaded bar times so time and spacing stay independent.
70
+ * - Y: a per-pane **linear/log/percent price** mapped within that pane's bounds.
71
+ *
72
+ * Everything is in media (CSS) pixels; `toBitmap` converts to device pixels for
73
+ * crisp drawing. Keeping a single instance is what keeps all layers aligned.
74
+ */
75
+ declare class CoordinateSystem {
76
+ private widthPx;
77
+ private dataHeightPx;
78
+ private devicePixelRatio;
79
+ private viewport;
80
+ private pitchScale;
81
+ private times;
82
+ private intervalMs;
83
+ setSize(width: number, dataHeight: number, dpr: number): void;
84
+ setBars(times: readonly number[]): void;
85
+ /**
86
+ * Append one new bar time in O(1). The bar cadence is stable, so the median
87
+ * interval is NOT re-derived (a full re-sort per live tick would be O(n log n)).
88
+ * It's only derived lazily — via the robust median over the bars seen so far —
89
+ * while it's still unknown (cold start at <2 bars); the warm path is a single
90
+ * push. `barCount` reads `times.length`, so the new bar is visible immediately.
91
+ */
92
+ appendBar(time: number): void;
93
+ setViewport(viewport: ViewportState): void;
94
+ getViewport(): ViewportState;
95
+ /**
96
+ * Spacing multiplier applied to the center-to-center pixel PITCH between adjacent
97
+ * bars (and hence the crosshair's snap step) — independent of the zoom (`barSpacing`).
98
+ * `1` = default; `>1` spreads bars apart with real gaps; `<1` tightens them. It changes
99
+ * only where bars SIT (`logicalToX`/`xToLogical`), never their raw zoom value, so candle
100
+ * bodies keep their width — the extra pitch becomes gap. Body width tracks
101
+ * {@link bodySpacing} so a `<1` multiplier shrinks bodies to fit instead of overlapping.
102
+ */
103
+ setPitchScale(scale: number): void;
104
+ get spacingScale(): number;
105
+ /** Effective center-to-center pixel pitch between adjacent bars (zoom × spacing multiplier). */
106
+ pxPerBar(): number;
107
+ /**
108
+ * Pixel basis for element (candle/bar/column) BODY width. Kept at the raw zoom pitch so
109
+ * bodies keep their width while the multiplier only adds gap; capped at the effective pitch
110
+ * so a `<1` multiplier tightens bodies to fit rather than overlapping the neighbours.
111
+ */
112
+ bodySpacing(): number;
113
+ get width(): number;
114
+ get height(): number;
115
+ get dpr(): number;
116
+ get barCount(): number;
117
+ get barInterval(): number;
118
+ /** The logical index that sits exactly at the right pixel edge of the chart. */
119
+ get rightEdgeLogical(): number;
120
+ logicalToX(logical: number): number;
121
+ xToLogical(x: number): number;
122
+ timeToLogical(ms: number): number;
123
+ logicalToTime(logical: number): number;
124
+ timeToX(ms: number): number;
125
+ priceToY(price: number, scale: PriceScale, bounds: PaneBounds): number;
126
+ yToPrice(y: number, scale: PriceScale, bounds: PaneBounds): number;
127
+ visibleLogicalRange(): {
128
+ from: number;
129
+ to: number;
130
+ };
131
+ visibleTimeRange(): {
132
+ from: number;
133
+ to: number;
134
+ };
135
+ toBitmap(mediaPx: number): number;
136
+ }
137
+
138
+ /** Things that need a stable id within an indicator instance. */
139
+ type IdentifiableKind = SeriesKind | 'fill' | 'background' | 'hline' | 'line' | 'box' | 'label' | 'polyline' | 'linefill' | 'table';
140
+ /**
141
+ * Content-addressed id for a plotted element, stable across re-runs of
142
+ * identical source.
143
+ *
144
+ * Deliberately NOT an engine's own callsite counter: those renumber whenever the
145
+ * source is edited (insert a plot near the top and every downstream callsite
146
+ * shifts), so keying persistent state on one would silently rebind to the wrong
147
+ * element. The ordinal disambiguates multiple plots that share a title within one
148
+ * indicator. Every engine MUST mint its series ids through this — it is the
149
+ * identity contract value patches are keyed by.
150
+ */
151
+ declare function stableSeriesId(parts: {
152
+ instanceId: string;
153
+ kind: IdentifiableKind;
154
+ title: string;
155
+ ordinal: number;
156
+ }): string;
157
+
158
+ /**
159
+ * A 1:1, TIME-PRESERVING per-bar transform a price style applies to the chart's bar
160
+ * stream (Heikin Ashi is the first). The orchestrator applies it at its single outbound
161
+ * bar seam, so the renderer, the scripting engines, and the native indicators all see
162
+ * one consistent VIEW while the raw series stays the untouched source of truth (the
163
+ * `'bar'` event and `chart.data` stay on the raw plane).
164
+ *
165
+ * Deliberately NOT a contract for styles that change the bar count or time axis
166
+ * (Renko, Kagi, Point & Figure) — those need a different seam.
167
+ */
168
+ interface BarTransform {
169
+ /** Derive the full view series from the raw series (front-to-back; may be recursive). */
170
+ full(raw: readonly OHLCV[]): OHLCV[];
171
+ /** Derive ONE view bar from a raw bar + the PREVIOUS view bar (live tick / append; O(1)). */
172
+ next(raw: OHLCV, prevView: OHLCV | undefined): OHLCV;
173
+ }
174
+
175
+ /** The environment a chart hands to a style's data engine when the style activates. */
176
+ interface SeriesDataEngineHost {
177
+ /** The chart's symbol (as configured, provider prefix stripped by the data layer). */
178
+ symbol: string;
179
+ /** The chart's timeframe (canonical string, e.g. `'60'`). */
180
+ timeframe: string;
181
+ /** Whether the chart runs live (streaming forming bar) or static history. */
182
+ live: boolean;
183
+ /** The chart's CURRENT view bars (post-transform) — read fresh, never cache. */
184
+ bars: () => readonly OHLCV[];
185
+ /** The chart's data control surface (`chart.data`) — providers, capabilities, resolution. */
186
+ data: DataControl;
187
+ /** Push the style's per-bar layer data to the renderer (the `<id>` native channel). */
188
+ pushData: (data: unknown) => void;
189
+ /** Push the ranges still loading (the `<id>-pending` channel — skeleton/reveal UIs). */
190
+ pushPending: (ranges: ReadonlyArray<readonly [number, number]>) => void;
191
+ }
192
+ /**
193
+ * A per-chart data engine behind a chart type: created on first entry into the style,
194
+ * suspended/resumed as the user switches styles, stopped when the chart is destroyed.
195
+ * All methods are fire-and-forget from the chart's point of view — the engine owns its
196
+ * own scheduling and pushes results through the host channels.
197
+ */
198
+ interface SeriesDataEngine {
199
+ start(host: SeriesDataEngineHost): void;
200
+ /** The style was left — stop fetching/pushing, keep state for a cheap resume. */
201
+ suspend(): void;
202
+ /** The style was re-entered. */
203
+ resume(): void;
204
+ /** The chart is going away — release everything. */
205
+ stop(): void;
206
+ /** The visible range changed (pan/zoom) while the style is active. */
207
+ onViewport?(range: {
208
+ from: number;
209
+ to: number;
210
+ }): void;
211
+ /** New settings values from the chart-settings dialog (the type's SDK section). */
212
+ onSettings?(values: Record<string, unknown>): void;
213
+ }
214
+ /** One registered chart type. */
215
+ interface ChartTypeDefinition {
216
+ /** The price-style id (`'heikinashi'`; a plugin might register `'footprint'`, `'renko'`…). */
217
+ id: string;
218
+ /** Human-readable label for style pickers. Defaults to the id. */
219
+ label?: string;
220
+ /** Raw `<svg>` markup for style pickers (surfaced as icon id `style-<id>`). */
221
+ icon?: string;
222
+ /** Optional SETTINGS SECTION rendered inside the chart-settings dialog — declarative
223
+ * rows (never DOM). Values persist in the renderer config under `chartTypes.<id>`
224
+ * and are pushed to the type's `<id>-settings` native-data channel on change. */
225
+ settings?: ChartTypeSettingsSection;
226
+ /** View-bar transform applied at the chart's outbound bar seam (1:1, time-preserving). */
227
+ barTransform?: BarTransform;
228
+ /**
229
+ * Whether the type participates in extended tickers (`"SYM;id"` — scripts request the
230
+ * transformed series via `ticker.*`). Defaults to `true` when `barTransform` is set:
231
+ * a transform-based type is exactly what the data plane can re-derive server-side.
232
+ */
233
+ tickerModifier?: boolean;
234
+ /** Factory for the style's per-chart data engine (created lazily on first activation). */
235
+ dataEngine?: () => SeriesDataEngine;
236
+ /**
237
+ * What the renderer paints for the PRICE SERIES while this style is active.
238
+ * `'candles'` (default) keeps the base candle painting under the type's layers;
239
+ * `'none'` suppresses it — for types whose renderer layer fully REPLACES the
240
+ * price representation (an order-flow grid, bricks, …). Axes, grid, volume,
241
+ * indicators and drawings are unaffected.
242
+ */
243
+ basePainting?: 'candles' | 'none';
244
+ }
245
+ /** One declarative settings row. To add a NEW kind, see docs/architecture/settings-rows.md. */
246
+ type SettingsRowDescriptor = {
247
+ kind: 'toggle';
248
+ key: string;
249
+ label: string;
250
+ defval: boolean;
251
+ } | {
252
+ kind: 'number';
253
+ key: string;
254
+ label: string;
255
+ defval: number;
256
+ min?: number;
257
+ max?: number;
258
+ step?: number;
259
+ } | {
260
+ kind: 'color';
261
+ key: string;
262
+ label: string;
263
+ defval: string;
264
+ } | {
265
+ kind: 'select';
266
+ key: string;
267
+ label: string;
268
+ options: readonly string[];
269
+ defval: string;
270
+ };
271
+ interface ChartTypeSettingsSection {
272
+ /** Section heading in the settings dialog. */
273
+ title: string;
274
+ rows: readonly SettingsRowDescriptor[];
275
+ /** `'active'` (default): shown only while this chart type is the active price style;
276
+ * `'always'`: shown whenever the type is registered. */
277
+ visibility?: 'always' | 'active';
278
+ }
279
+ /** Register (or replace) a chart type. */
280
+ declare function registerChartType(def: ChartTypeDefinition): void;
281
+ /** Remove a registered chart type (built-ins can be re-registered via their register fn). */
282
+ declare function unregisterChartType(id: string): void;
283
+ /** The definition behind a price-style id, or undefined for built-ins/unknown ids. */
284
+ declare function chartType(id: unknown): ChartTypeDefinition | undefined;
285
+ /** Every registered chart type (registration order). */
286
+ declare function chartTypes(): ChartTypeDefinition[];
287
+ /** Ids that act as extended-ticker modifiers (`"SYM;id"`). */
288
+ declare function tickerModifierIds(): string[];
289
+
290
+ /**
291
+ * Register default values for renderer features — every chart built afterwards applies
292
+ * them once its renderer is mounted, before the first paint. Keys are renderer feature
293
+ * names (`chart.renderer.features`); one the active renderer does not support is warned
294
+ * about and ignored, exactly as `renderer.set()` does.
295
+ *
296
+ * These are DEFAULTS, not locks: an explicit `chart.renderer.set(...)`, an applied config
297
+ * template, or the user's own in-chart settings still win afterwards. Charts already
298
+ * built are untouched. Returns a disposer that removes precisely the values it set
299
+ * (leaving any later re-registration of the same key in place).
300
+ */
301
+ declare function registerRendererDefaults(values: Record<string, unknown>): () => void;
302
+ /** Drop registered defaults by key — all of them when called with no arguments. */
303
+ declare function unregisterRendererDefaults(...keys: string[]): void;
304
+ /** The defaults a chart applies at construction (empty when no plugin registered any). */
305
+ declare function rendererDefaults(): Record<string, unknown>;
306
+
307
+ /** Everything a layer needs to paint one frame. */
308
+ interface RendererLayerArgs {
309
+ /** The chart's CURRENT view bars (post bar-transform). */
310
+ bars: readonly OHLCV[];
311
+ /** The layer's channel payload (last `setNativeData(id, …)` push; undefined before the first). */
312
+ data: unknown;
313
+ /** The type's SDK settings values (`<id>-settings` channel; {} before any edit). */
314
+ settings: Record<string, unknown>;
315
+ /** Time ranges still loading (`<id>-pending` channel) — skeleton/reveal UIs. */
316
+ pending: ReadonlyArray<readonly [number, number]>;
317
+ coords: CoordinateSystem;
318
+ /** The price pane's scale + bounds. */
319
+ scale: PriceScale;
320
+ bounds: PaneBounds;
321
+ theme: VelaTheme;
322
+ /** The active price style — layers tied to a chart type gate their visibility on it. */
323
+ priceStyle: string;
324
+ /** Frame clock (ms) for pulses/fades; monotonic within a session. */
325
+ nowMs: number;
326
+ }
327
+ /** One live layer instance (per mounted renderer). */
328
+ interface RendererLayerInstance {
329
+ /** The renderer created (and owns) this transparent canvas — keep the reference, paint into it. */
330
+ mount(canvas: HTMLCanvasElement): void;
331
+ /** Paint one frame. Always clear/redraw your own canvas — the renderer never clears it for you. */
332
+ render(args: RendererLayerArgs): void;
333
+ /** Return true while the layer needs CONTINUOUS frames (a pulse/fade) — keeps the animator alive. */
334
+ animating?(): boolean;
335
+ /** The renderer unmounted — release everything (the canvas itself is removed by the renderer). */
336
+ destroy?(): void;
337
+ }
338
+ /** One registered layer kind. */
339
+ interface RendererLayerDefinition {
340
+ /** The layer id — also its native-data channel (`setNativeData(id, …)` / `id + '-pending'`). */
341
+ id: string;
342
+ /** Stacking: `'below-data'` = behind the candles (reveal-under styles); `'above-data'` =
343
+ * over the candles, under the chrome/axes. Default `'above-data'`. */
344
+ placement?: 'below-data' | 'above-data';
345
+ /** Instance factory — called once per mounted renderer. */
346
+ create(): RendererLayerInstance;
347
+ }
348
+ /** Register (or replace) a renderer layer. Renderers mounted AFTER registration pick it up. */
349
+ declare function registerRendererLayer(def: RendererLayerDefinition): void;
350
+ declare function unregisterRendererLayer(id: string): void;
351
+ /** Every registered layer definition (registration order). */
352
+ declare function rendererLayers(): RendererLayerDefinition[];
353
+
354
+ /** Selection/menu accent — active entries, "native" badges, selected controls. */
355
+ declare const ACCENT = "#2962ff";
356
+ /** The lighter brand blue: "on" affordances and the default drawing color, brighter than
357
+ * {@link ACCENT} so a switch reads clearly enabled. */
358
+ declare const ACCENT_BRIGHT = "#38c0fd";
359
+ /** Bullish/bearish reference pair — the dark theme's candle colors, reused wherever a
360
+ * fixed directional color is needed outside a theme (volume profiles, baseline defaults). */
361
+ declare const BULLISH = "#089981";
362
+ declare const BEARISH = "#f23645";
363
+ /** Neutral gray for de-emphasized geometry (unstyled level lines, gann 1/1 diagonals). */
364
+ declare const NEUTRAL = "#787b86";
365
+ /** Attention amber — favorited items. */
366
+ declare const HIGHLIGHT = "#e0b400";
367
+ /** Warm accent used by the categorical palette and warning-ish marks. */
368
+ declare const WARNING = "#ff9800";
369
+ /** Soft informational blue — statistical overlays (regression, VWAP) and the blue rung of the
370
+ * drawing level palette, which should read as derived data rather than user-drawn geometry. */
371
+ declare const INFO = "#5b9cf6";
372
+ /** Highlighter ink — a saturated marker orange, always drawn translucent. */
373
+ declare const MARKER = "#ff5d00";
374
+ /** Validity tints — a pattern that satisfies its rules vs one that does not. Brighter and
375
+ * cooler than {@link BULLISH}/{@link BEARISH} so a validity wash never reads as direction. */
376
+ declare const VALID = "#0ecb81";
377
+ declare const INVALID = "#f6465d";
378
+ /** Market-session states beside the theme's up-colored "open": pre-market dawn amber,
379
+ * post-market dusk sky, and the shared closed/holiday gray (statusline badge). */
380
+ declare const SESSION_PRE = "#f97316";
381
+ declare const SESSION_POST = "#0ea5e9";
382
+ declare const SESSION_OFF = "#9ca3af";
383
+ /** Default color of a plain line/area series — a softer blue than {@link ACCENT}, which is
384
+ * reserved for interactive chrome. */
385
+ declare const SERIES_LINE = "#3b82f6";
386
+ /** Crosshair ink: a cool gray that stays legible over both candles and empty surface. */
387
+ declare const CROSSHAIR = "#9aa0ad";
388
+ /** Fixed slate plates for canvas chrome that floats over chart content of any color
389
+ * (crosshair value chips, info badges) — they cannot follow the theme surface and stay
390
+ * readable. `SLATE_DEEP` is the plate, `SLATE` its border. */
391
+ declare const SLATE_DEEP = "#1e293b";
392
+ declare const SLATE = "#475569";
393
+ /** Strategy trade markers — entry arrows per position side, and the exits' shared violet.
394
+ * The entry pair deliberately reuses the accent blue / bearish red (the reference palette
395
+ * of order-fill marks); the violet keeps exits apart from both directions. */
396
+ declare const TRADE_LONG = "#2962ff";
397
+ declare const TRADE_SHORT = "#f23645";
398
+ declare const TRADE_EXIT = "#d500f9";
399
+ /** Categorical hues for auto-assigned colors (symbol badges, multi-series defaults).
400
+ * Ordered for adjacent-hue contrast, not by hue family. */
401
+ declare const CATEGORICAL: readonly string[];
402
+ /** Pick a stable categorical color for a string key (same key ⇒ same color). */
403
+ declare function categoricalColor(key: string): string;
404
+
405
+ export { ACCENT as A, BEARISH as B, CATEGORICAL as C, type DrawingTypeMeta as D, getDrawingType as E, registerChartType as F, registerDrawingType as G, HIGHLIGHT as H, INFO as I, registerRendererDefaults as J, registerRendererLayer as K, rendererDefaults as L, MARKER as M, NEUTRAL as N, rendererLayers as O, stableSeriesId as P, tickerModifierIds as Q, type RendererLayerArgs as R, SERIES_LINE as S, TRADE_EXIT as T, unregisterChartType as U, VALID as V, WARNING as W, unregisterRendererDefaults as X, unregisterRendererLayer as Y, ACCENT_BRIGHT as a, BULLISH as b, type BarTransform as c, CROSSHAIR as d, type ChartTypeDefinition as e, type ChartTypeSettingsSection as f, INVALID as g, type IdentifiableKind as h, type RendererLayerDefinition as i, type RendererLayerInstance as j, SESSION_OFF as k, SESSION_POST as l, SESSION_PRE as m, SLATE as n, SLATE_DEEP as o, type SeriesDataEngine as p, type SeriesDataEngineHost as q, type SettingsRowDescriptor as r, TRADE_LONG as s, TRADE_SHORT as t, categoricalColor as u, chartType as v, chartTypes as w, createDrawing as x, deserializeDrawing as y, drawingTypes as z };