@trdrs/quickcharts 1.2.0 → 1.3.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.
- package/CHANGELOG.md +36 -0
- package/README.md +582 -29
- package/dist/{chunk-RDAK5MUM.js → chunk-AA7XKXH4.js} +9 -5
- package/dist/{chunk-RDAK5MUM.js.map → chunk-AA7XKXH4.js.map} +1 -1
- package/dist/drawings.js +1 -1
- package/dist/feature-manifest.json +49 -1
- package/dist/index.d.ts +461 -91
- package/dist/index.js +9956 -8963
- package/dist/index.js.map +1 -1
- package/dist/quickcharts.css +122 -110
- package/dist/theme-manifest.json +90 -2
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -225,6 +225,27 @@ declare class FeedUnavailableError extends Error {
|
|
|
225
225
|
* when it sent one — lets the host name the actual cause instead of a generic "unavailable". */
|
|
226
226
|
code?: string | null);
|
|
227
227
|
}
|
|
228
|
+
/** One class in a feed's catalog that holds narrower classes: a `spot` class over its `usdc` and
|
|
229
|
+
* `usdt` quotes, say. `id` is the token the feed is searched with, as a plain string entry is, and
|
|
230
|
+
* `children` are the narrower classes, as tokens or nodes of their own. The search renders two
|
|
231
|
+
* levels, a top-level class and its children: a child's own `children` are not offered, and the
|
|
232
|
+
* child narrows by its `id` alone. */
|
|
233
|
+
interface SearchClassNode {
|
|
234
|
+
readonly id: string;
|
|
235
|
+
readonly children?: readonly (string | SearchClassNode)[];
|
|
236
|
+
}
|
|
237
|
+
/** What a feed's `search` is asked with. `cls` and `classes` say which classes to narrow to; both
|
|
238
|
+
* absent is every class. */
|
|
239
|
+
interface DatafeedSearchOptions {
|
|
240
|
+
/** One class to narrow to. When the viewer may select several classes it is set only while
|
|
241
|
+
* exactly one is selected, so a feed that reads `cls` alone still narrows a single chip. */
|
|
242
|
+
cls?: string;
|
|
243
|
+
/** Every class to narrow to, sent only when the search lets the viewer select several classes at
|
|
244
|
+
* once: a row matches when it is in any of them. A feed may ignore it and read `cls` alone. */
|
|
245
|
+
classes?: readonly string[];
|
|
246
|
+
limit?: number;
|
|
247
|
+
offset?: number;
|
|
248
|
+
}
|
|
228
249
|
/** A feed's coarse, feed-LEVEL capability declaration. Everything optional and the method itself
|
|
229
250
|
* optional: an ABSENT declaration means unconstrained (today's behavior), and a feed must only
|
|
230
251
|
* declare what is true — a finite `resolutions` list from a feed that serves any interval would
|
|
@@ -233,8 +254,10 @@ declare class FeedUnavailableError extends Error {
|
|
|
233
254
|
interface DatafeedConfig {
|
|
234
255
|
/** The wire timeframe tokens this feed can serve ('1m', '4h', '1d', …). Absent = any. */
|
|
235
256
|
resolutions?: readonly string[];
|
|
236
|
-
/** Asset-class tokens the catalog carries
|
|
237
|
-
|
|
257
|
+
/** Asset-class tokens the catalog carries, in the order the search offers them. An entry is a
|
|
258
|
+
* token, or a {@link SearchClassNode} whose children the search offers beneath it once it is
|
|
259
|
+
* selected. Absent = unspecified. */
|
|
260
|
+
classes?: readonly (string | SearchClassNode)[];
|
|
238
261
|
}
|
|
239
262
|
/** The datafeed a chart consumes. Implementations must follow the bar rules on {@link FeedBar} and
|
|
240
263
|
* {@link BarsEvent}; everything else (transport, caching, auth) is the implementation's business. */
|
|
@@ -243,12 +266,9 @@ interface ChartDatafeed {
|
|
|
243
266
|
* feed declares (e.g. its initial timeframe must be servable). Omit it entirely when the feed
|
|
244
267
|
* has no fixed capability set. */
|
|
245
268
|
config?(): Promise<DatafeedConfig>;
|
|
246
|
-
/** Server-side symbol search, paged. `cls` narrows to one asset class ('' / absent = all)
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
limit?: number;
|
|
250
|
-
offset?: number;
|
|
251
|
-
}): Promise<SearchPage>;
|
|
269
|
+
/** Server-side symbol search, paged. `cls` narrows to one asset class ('' / absent = all), and
|
|
270
|
+
* `classes`, when present, to any of several (see {@link DatafeedSearchOptions}). */
|
|
271
|
+
search(q: string, opts?: DatafeedSearchOptions): Promise<SearchPage>;
|
|
252
272
|
/** Resolve one symbol's metadata; null when the symbol is unknown to the feed's catalogs. */
|
|
253
273
|
resolve(symbol: string): Promise<SymbolInfo | null>;
|
|
254
274
|
/** Historical sealed bars: a [from,to] window (epoch seconds, INCLUSIVE of both ends — the chart
|
|
@@ -1708,9 +1728,11 @@ interface ThemeDeclaration {
|
|
|
1708
1728
|
* add a third. A host that keeps named brand presets resolves each preset to a custom light or
|
|
1709
1729
|
* dark palette before passing it in. */
|
|
1710
1730
|
type ThemeMode = 'light' | 'dark';
|
|
1711
|
-
/** What a role's value is written as. Every value is a CSS token string, so `length` is `'4px'
|
|
1712
|
-
* `duration` is `'150ms'
|
|
1713
|
-
|
|
1731
|
+
/** What a role's value is written as. Every value is a CSS token string, so `length` is `'4px'`,
|
|
1732
|
+
* `duration` is `'150ms'`, `easing` is a timing function such as `'ease-out'`, and `scale` is a
|
|
1733
|
+
* unitless factor such as `'0.97'`; the kind says which tokens are valid, and validation enforces
|
|
1734
|
+
* it. */
|
|
1735
|
+
type ThemeRoleKind = 'color' | 'length' | 'font' | 'duration' | 'easing' | 'scale' | 'shadow';
|
|
1714
1736
|
/** The grouping a role belongs to. Families organize the manual and the manifest; they are not part
|
|
1715
1737
|
* of a role's identity. */
|
|
1716
1738
|
type ThemeRoleFamily = 'canvas' | 'series' | 'scale' | 'text' | 'chrome' | 'overlay' | 'state' | 'control' | 'status' | 'illustration' | 'drawing' | 'motion';
|
|
@@ -2275,7 +2297,47 @@ declare const THEME_ROLES: readonly [{
|
|
|
2275
2297
|
readonly id: "motion.durationBase";
|
|
2276
2298
|
readonly family: "motion";
|
|
2277
2299
|
readonly kind: "duration";
|
|
2278
|
-
readonly description: "An ordinary transition,
|
|
2300
|
+
readonly description: "An ordinary transition: a modal dialog and its backdrop opening and closing, and the replay row entering and leaving.";
|
|
2301
|
+
}, {
|
|
2302
|
+
readonly id: "motion.durationModerate";
|
|
2303
|
+
readonly family: "motion";
|
|
2304
|
+
readonly kind: "duration";
|
|
2305
|
+
readonly description: "A control moving to its new state, such as a switch knob sliding.";
|
|
2306
|
+
}, {
|
|
2307
|
+
readonly id: "motion.durationSlow";
|
|
2308
|
+
readonly family: "motion";
|
|
2309
|
+
readonly kind: "duration";
|
|
2310
|
+
readonly description: "A small mark settling, such as a disclosure caret turning or a checkbox filling.";
|
|
2311
|
+
}, {
|
|
2312
|
+
readonly id: "motion.durationSlower";
|
|
2313
|
+
readonly family: "motion";
|
|
2314
|
+
readonly kind: "duration";
|
|
2315
|
+
readonly description: "A larger mark turning, such as the drawing rail's chevron.";
|
|
2316
|
+
}, {
|
|
2317
|
+
readonly id: "motion.easingStandard";
|
|
2318
|
+
readonly family: "motion";
|
|
2319
|
+
readonly kind: "easing";
|
|
2320
|
+
readonly description: "The timing of an ordinary transition: a modal dialog box, the replay row, a caret dip, a checkbox fill.";
|
|
2321
|
+
}, {
|
|
2322
|
+
readonly id: "motion.easingOut";
|
|
2323
|
+
readonly family: "motion";
|
|
2324
|
+
readonly kind: "easing";
|
|
2325
|
+
readonly description: "The timing of a motion that settles as it ends: a modal backdrop fading, a switch knob sliding.";
|
|
2326
|
+
}, {
|
|
2327
|
+
readonly id: "motion.easingLinear";
|
|
2328
|
+
readonly family: "motion";
|
|
2329
|
+
readonly kind: "easing";
|
|
2330
|
+
readonly description: "The timing of a color or opacity change under the pointer.";
|
|
2331
|
+
}, {
|
|
2332
|
+
readonly id: "motion.easingSpring";
|
|
2333
|
+
readonly family: "motion";
|
|
2334
|
+
readonly kind: "easing";
|
|
2335
|
+
readonly description: "The timing of a mark that turns with a slight overshoot, such as a caret or chevron.";
|
|
2336
|
+
}, {
|
|
2337
|
+
readonly id: "motion.scaleEnter";
|
|
2338
|
+
readonly family: "motion";
|
|
2339
|
+
readonly kind: "scale";
|
|
2340
|
+
readonly description: "The scale a modal dialog box grows from as it opens and returns to as it closes.";
|
|
2279
2341
|
}];
|
|
2280
2342
|
/** Every role id in the inventory. */
|
|
2281
2343
|
type ThemeRoleId = (typeof THEME_ROLES)[number]['id'];
|
|
@@ -2694,7 +2756,7 @@ interface ChartIconDiagnostic {
|
|
|
2694
2756
|
}
|
|
2695
2757
|
|
|
2696
2758
|
/** The glyphs of the chart's own controls, by meaning, each with every drawing that carries it. */
|
|
2697
|
-
declare const CONTROL_ICONS: Readonly<Record<"info" | "search" | "indicators" | "visible" | "textColor" | "lineColor" | "open" | "close" | "template" | "fillColor" | "locked" | "sync" | "measure" | "image" | "eraser" | "delete" | "remove" | "copy" | "pause" | "play" | "reset" | "scroll" | "
|
|
2759
|
+
declare const CONTROL_ICONS: Readonly<Record<"info" | "search" | "indicators" | "visible" | "textColor" | "lineColor" | "open" | "close" | "template" | "fillColor" | "locked" | "sync" | "measure" | "image" | "eraser" | "delete" | "remove" | "hidden" | "copy" | "pause" | "play" | "reset" | "scroll" | "add" | "magnet" | "compare" | "replay" | "settings" | "fullscreen" | "marketStatus" | "paneCollapse" | "paneRestore" | "paneMaximize" | "replayStatus" | "replayMark" | "replayCut" | "undo" | "redo" | "tileMaximize" | "tileRestore" | "download" | "chevronDown" | "chevronUp" | "chevronLeft" | "chevronRight" | "check" | "clear" | "goLive" | "stepForward" | "stepBack" | "selectBar" | "firstAvailable" | "randomBar" | "cursorCross" | "cursorDot" | "cursorArrow" | "magnetStrong" | "drawingsShown" | "drawingsHidden" | "indicatorsShown" | "indicatorsHidden" | "allShown" | "allHidden" | "zoomIn" | "grip" | "favoritesBar" | "lineSolid" | "lineDashed" | "lineDotted" | "lineThickness1" | "lineThickness2" | "lineThickness3" | "lineThickness4" | "lineEndNormal" | "lineEndArrow" | "fullscreenExit" | "caret" | "collapse" | "zoomOut" | "rename" | "duplicate" | "favorite" | "favorited" | "sortAscending" | "sortDescending" | "flyout" | "submenu" | "more" | "emptySearch" | "emptyCompare" | "operatorsShow" | "operatorsHide" | "operatorAdd" | "operatorSubtract" | "operatorMultiply" | "operatorDivide" | "operatorPower" | "operatorReciprocal" | "selectDate" | "zoomTool" | "stayInMode" | "stayInModeOn" | "unlocked" | "hide" | "glyphTools" | "visualOrder", readonly Glyph[]>>;
|
|
2698
2760
|
/** An icon of one of the chart's own controls. */
|
|
2699
2761
|
type ControlIconId = keyof typeof CONTROL_ICONS;
|
|
2700
2762
|
/** Every icon a host may draw: a control's glyph by its meaning, a chart style by its id, a drawing
|
|
@@ -3215,7 +3277,9 @@ interface IndicatorPickerBuiltInState {
|
|
|
3215
3277
|
}
|
|
3216
3278
|
interface IndicatorPickerSource {
|
|
3217
3279
|
collections: readonly IndicatorPickerCollection[];
|
|
3218
|
-
/** The host supplies localized text. A new query or collection aborts the previous read.
|
|
3280
|
+
/** The host supplies localized text. A new query or collection aborts the previous read.
|
|
3281
|
+
* `builtInIds` are the built-ins the browser lists: every one, or those `builtInIndicators`
|
|
3282
|
+
* offers. */
|
|
3219
3283
|
list(request: {
|
|
3220
3284
|
collection: string;
|
|
3221
3285
|
query: string;
|
|
@@ -3424,8 +3488,11 @@ interface SearchControllerOptions {
|
|
|
3424
3488
|
}
|
|
3425
3489
|
interface SearchState {
|
|
3426
3490
|
readonly query: string;
|
|
3427
|
-
/** The asset-class filter the feed narrowed to; '' is every class.
|
|
3491
|
+
/** The asset-class filter the feed narrowed to; '' is every class. With a list filter it is the
|
|
3492
|
+
* one class the list holds, or '' when it holds several. */
|
|
3428
3493
|
readonly cls: string;
|
|
3494
|
+
/** The list filter the feed narrowed to, when the search was asked with one. */
|
|
3495
|
+
readonly classes?: readonly string[];
|
|
3429
3496
|
/** Every row loaded so far for the query, in the feed's order. */
|
|
3430
3497
|
readonly hits: readonly SymbolRow[];
|
|
3431
3498
|
/** A page for THIS query is in flight and nothing cached answers it yet. Rows of the previous
|
|
@@ -3442,17 +3509,21 @@ interface SearchController {
|
|
|
3442
3509
|
subscribe(listener: (state: SearchState) => void): () => void;
|
|
3443
3510
|
/** Ask for a query. A cached answer shows at once and a single-page entry revalidates in the
|
|
3444
3511
|
* background; a miss keeps the previous rows, marks loading, and fetches after the debounce.
|
|
3445
|
-
* A newer query cancels an older one's result.
|
|
3446
|
-
|
|
3512
|
+
* A newer query cancels an older one's result. `cls` is one class ('' is every class), or a
|
|
3513
|
+
* list of classes: the feed hears a list as `classes`, and as `cls` too when it holds exactly
|
|
3514
|
+
* one. An empty list is every class. */
|
|
3515
|
+
search(query: string, cls?: SearchClassFilter): void;
|
|
3447
3516
|
/** Append the next page of the current query while `hasMore` holds. One page in flight at a
|
|
3448
3517
|
* time; rows already shown are never repeated even when a revalidation shifted a page edge. */
|
|
3449
3518
|
loadMore(): void;
|
|
3450
3519
|
/** Warm the cache for a query without changing the current one, so its first open is instant.
|
|
3451
3520
|
* A failure is dropped; the query fetches on open as it would have. */
|
|
3452
|
-
prefetch(query?: string, cls?:
|
|
3521
|
+
prefetch(query?: string, cls?: SearchClassFilter): void;
|
|
3453
3522
|
/** Stop timers; later results are ignored. */
|
|
3454
3523
|
dispose(): void;
|
|
3455
3524
|
}
|
|
3525
|
+
/** Which classes a search narrows to: one class token ('' is every class), or a list of them. */
|
|
3526
|
+
type SearchClassFilter = string | readonly string[];
|
|
3456
3527
|
declare function createSearchController(datafeed: Pick<ChartDatafeed, 'search'>, options?: SearchControllerOptions): SearchController;
|
|
3457
3528
|
/** How many recent picks a search surface lists. */
|
|
3458
3529
|
declare const RECENT_SYMBOLS_CAP = 10;
|
|
@@ -3478,8 +3549,10 @@ interface MatchSegment {
|
|
|
3478
3549
|
declare function matchSegments(text: string, query: string): MatchSegment[];
|
|
3479
3550
|
/** One spread operator a search input offers. It TYPES into the query; the feed parses and
|
|
3480
3551
|
* evaluates the expression, because the whole expression is the instrument. */
|
|
3552
|
+
/** The name of one spread operator, as a host lists the operators a search offers. */
|
|
3553
|
+
type SpreadOperatorId = 'division' | 'subtraction' | 'addition' | 'multiplication' | 'exponentiation' | 'reciprocal';
|
|
3481
3554
|
interface SpreadOperator {
|
|
3482
|
-
readonly id:
|
|
3555
|
+
readonly id: SpreadOperatorId;
|
|
3483
3556
|
/** What it inserts. */
|
|
3484
3557
|
readonly insert: string;
|
|
3485
3558
|
/** Inserted before the query rather than after it (the reciprocal form). */
|
|
@@ -3752,7 +3825,9 @@ interface CommandRegistry {
|
|
|
3752
3825
|
execute(id: string, arg?: unknown): CommandResult;
|
|
3753
3826
|
/** Remap a shortcut, or clear it with null. */
|
|
3754
3827
|
setShortcut(id: string, shortcut: string | null): void;
|
|
3755
|
-
/** Fires when the registered set or a shortcut changes
|
|
3828
|
+
/** Fires when the registered set or a shortcut changes, and when the host says its access policy
|
|
3829
|
+
* may answer differently (`widget.refreshAccess()`), since what `available` answers may have
|
|
3830
|
+
* moved with it. Returns the unsubscribe. */
|
|
3756
3831
|
onChange(cb: () => void): () => void;
|
|
3757
3832
|
}
|
|
3758
3833
|
|
|
@@ -3996,6 +4071,12 @@ interface AttachDrawingsOptions {
|
|
|
3996
4071
|
* a cursor beside it would be a second claim about the same point. This layer writes the plot's
|
|
3997
4072
|
* cursor as an inline style, so it is the only place that can stand it down. */
|
|
3998
4073
|
pointerSuppressed?: () => boolean;
|
|
4074
|
+
/** Whether a new drawing may be made as a copy of a drawing of this type. Clone, paste and a
|
|
4075
|
+
* modifier-drag duplicate each make a new drawing, so a host that does not offer a tool refuses
|
|
4076
|
+
* them for its drawings: clone and paste make nothing, `canPaste` answers false, and the drag
|
|
4077
|
+
* moves the drawing itself. Copying to the clipboard is never refused. Absent, every copy is
|
|
4078
|
+
* made. */
|
|
4079
|
+
copies?: (type: string) => boolean;
|
|
3999
4080
|
events?: DrawingsEvents;
|
|
4000
4081
|
}
|
|
4001
4082
|
/** The running drawing layer a host holds. */
|
|
@@ -4144,6 +4225,58 @@ type ReplayPhase = 'off' | 'arming' | 'on';
|
|
|
4144
4225
|
* presets). The public surface grows on demand, not by exposure. */
|
|
4145
4226
|
type ChartDrawingsApi = Omit<DrawingsHandle, 'setSymbol' | 'setTimeframe' | 'setTick' | 'setPriceFormatter' | 'destroy' | 'selectedDrawing' | 'commitEdit' | 'beginPreview' | 'endPreview' | 'textEdit' | 'commitText' | 'cancelText' | 'presets'>;
|
|
4146
4227
|
|
|
4228
|
+
/** What a preset frames: seconds of history, the year to date, or everything loaded. */
|
|
4229
|
+
type RangeSpan = number | 'ytd' | 'all';
|
|
4230
|
+
interface RangePreset {
|
|
4231
|
+
/** The preset's identity and the text its chip wears ('1D', 'YTD', 'All'). It stays as written
|
|
4232
|
+
* in every language; a host names the preset by it. */
|
|
4233
|
+
readonly key: string;
|
|
4234
|
+
readonly span: RangeSpan;
|
|
4235
|
+
/** The timeframe token the preset switches the chart to. */
|
|
4236
|
+
readonly tf: string;
|
|
4237
|
+
/** The catalog key of the preset's full name, for its tooltip. */
|
|
4238
|
+
readonly label: ChartMessageKey;
|
|
4239
|
+
}
|
|
4240
|
+
/** The nine presets, in bar order. */
|
|
4241
|
+
declare const RANGE_PRESETS: readonly RangePreset[];
|
|
4242
|
+
/** The seconds a span covers back from `nowSecs`; null for 'all', which has no span. */
|
|
4243
|
+
declare function rangeSpanSeconds(span: RangeSpan, nowSecs: number): number | null;
|
|
4244
|
+
/** Whether a preset is offered for a symbol whose earliest bar is at `earliestBarSecs`: a preset
|
|
4245
|
+
* deeper than the history that exists is withheld (a listing from last year has no 5Y), 'All'
|
|
4246
|
+
* always stays, and an unknown depth (null) withholds nothing. The depth itself is the host's to
|
|
4247
|
+
* learn from its feed; the chart does not probe. */
|
|
4248
|
+
declare function rangeAvailable(preset: RangePreset, earliestBarSecs: number | null | undefined, nowSecs?: number): boolean;
|
|
4249
|
+
/** A preset's tooltip: what it frames, and the bars it frames it in. */
|
|
4250
|
+
declare function rangePresetTip(t: ChartTranslate, preset: RangePreset): string;
|
|
4251
|
+
/** The part of a chart the framing needs: a time scale that takes a logical range. */
|
|
4252
|
+
interface RangeFrameTarget {
|
|
4253
|
+
timeScale(): {
|
|
4254
|
+
setVisibleLogicalRange(range: {
|
|
4255
|
+
from: number;
|
|
4256
|
+
to: number;
|
|
4257
|
+
}): void;
|
|
4258
|
+
};
|
|
4259
|
+
}
|
|
4260
|
+
/** Frame a pane on a span, anchored on its LAST REAL bar: a series also carries a future
|
|
4261
|
+
* whitespace horizon for right-margin drawing, so fitting to content would frame a screen of
|
|
4262
|
+
* empty space. The bar count comes from the pane's own interval, because the same span is a
|
|
4263
|
+
* different number of bars on a one-minute pane than on a daily one. An empty series, or a token
|
|
4264
|
+
* the grammar cannot read, frames nothing rather than a bogus window. */
|
|
4265
|
+
declare function frameRange(chart: RangeFrameTarget, series: {
|
|
4266
|
+
data(): readonly unknown[];
|
|
4267
|
+
}, span: RangeSpan, tf: string, nowSecs?: number): void;
|
|
4268
|
+
/** One zoom step multiplies or divides the bar spacing by this. */
|
|
4269
|
+
declare const ZOOM_FACTOR = 1.25;
|
|
4270
|
+
/** The bar spacing a zoom-out never goes below. */
|
|
4271
|
+
declare const MIN_BAR_SPACING = 0.5;
|
|
4272
|
+
/** How far one scroll step moves, in bars. */
|
|
4273
|
+
declare const SCROLL_STEP_BARS = 10;
|
|
4274
|
+
/** The bar spacing after one zoom step from `spacing`. */
|
|
4275
|
+
declare function zoomedBarSpacing(spacing: number, direction: 'in' | 'out'): number;
|
|
4276
|
+
/** The time-scale scroll position after one scroll step from `position` (positive is right, as
|
|
4277
|
+
* lightweight-charts counts it). */
|
|
4278
|
+
declare function scrolledPosition(position: number, direction: 'left' | 'right'): number;
|
|
4279
|
+
|
|
4147
4280
|
/** The compare surface a host drives. */
|
|
4148
4281
|
interface ChartCompareApi {
|
|
4149
4282
|
add(symbol: string, opts: {
|
|
@@ -4203,10 +4336,12 @@ interface ChartHandle {
|
|
|
4203
4336
|
* that guessed from the string would be inventing a quote the feed never stated. */
|
|
4204
4337
|
symbolInfo(): SymbolInfo | null;
|
|
4205
4338
|
timeframe(): string;
|
|
4339
|
+
/** Switch the timeframe. A timeframe the widget does not offer is ignored. */
|
|
4206
4340
|
setTimeframe(timeframe: string): void;
|
|
4207
4341
|
style(): ChartStyleId;
|
|
4208
4342
|
/** Switch the main-series style. Presentation only: nothing refetches, and the indicators,
|
|
4209
|
-
* drawings, comparisons and visible range all survive.
|
|
4343
|
+
* drawings, comparisons and visible range all survive. A style the widget does not offer is
|
|
4344
|
+
* ignored. */
|
|
4210
4345
|
setStyle(id: ChartStyleId): void;
|
|
4211
4346
|
visibleRange(): TimeRange | null;
|
|
4212
4347
|
/** The range preset currently framing this chart, or null after other navigation. */
|
|
@@ -4228,7 +4363,7 @@ interface ChartHandle {
|
|
|
4228
4363
|
* follow whatever venue the symbol resolves to. */
|
|
4229
4364
|
timezone(): string;
|
|
4230
4365
|
/** Set the choice. A value the chart's registry does not carry is refused, because the axis
|
|
4231
|
-
* formatters could not label a tick with it. */
|
|
4366
|
+
* formatters could not label a tick with it, and so is one the widget does not offer. */
|
|
4232
4367
|
setTimezone(choice: string): void;
|
|
4233
4368
|
/** The zone the choice resolves to for the symbol on screen: the chosen IANA id, or the exchange
|
|
4234
4369
|
* zone the resolved symbol declared. Null while `exchange` is chosen and no symbol has resolved. */
|
|
@@ -4406,12 +4541,13 @@ interface LayoutSaveLoadApi {
|
|
|
4406
4541
|
interface LayoutApi {
|
|
4407
4542
|
arrangement(): string;
|
|
4408
4543
|
/** Re-tile. Surviving charts keep their state; new charts clone pane 0's safe presentation;
|
|
4409
|
-
* excess charts are torn down. */
|
|
4544
|
+
* excess charts are torn down. An arrangement the widget does not offer is ignored. */
|
|
4410
4545
|
setArrangement(code: string): void;
|
|
4411
4546
|
/** The index of the active chart. */
|
|
4412
4547
|
active(): number;
|
|
4413
4548
|
setActive(index: number): void;
|
|
4414
4549
|
sync(): LayoutSyncFlags;
|
|
4550
|
+
/** Set sync switches. A switch the widget does not offer keeps its value. */
|
|
4415
4551
|
setSync(partial: Partial<LayoutSyncFlags>): void;
|
|
4416
4552
|
/** The chart standing alone, or null while every chart is tiled. Presentation, not content: a
|
|
4417
4553
|
* maximize is a way of LOOKING at a layout, so it rides no blob and a re-tile clears it. */
|
|
@@ -4512,8 +4648,16 @@ interface TopBarUi {
|
|
|
4512
4648
|
replay?: boolean;
|
|
4513
4649
|
/** Undo and redo. */
|
|
4514
4650
|
history?: boolean;
|
|
4515
|
-
/** The layout setup menu and the saved-layouts menu.
|
|
4651
|
+
/** The layout setup menu and the saved-layouts menu. `false` hides both, whatever `layoutSetup`
|
|
4652
|
+
* and `savedLayouts` say. */
|
|
4516
4653
|
layouts?: boolean;
|
|
4654
|
+
/** The layout setup menu: the arrangement grid and the sync switches. Not shown when the widget
|
|
4655
|
+
* offers nothing to choose there (see `ChartWidgetOptions.layouts`). */
|
|
4656
|
+
layoutSetup?: boolean;
|
|
4657
|
+
/** The saved-layouts menu: the layout's name with Save, and the menu that saves, copies, renames,
|
|
4658
|
+
* creates and opens layouts. Not shown without a layouts store (`saveLoad.layouts`), since every
|
|
4659
|
+
* row saves or reads one; Download chart data then sits in the image menu. */
|
|
4660
|
+
savedLayouts?: boolean;
|
|
4517
4661
|
/** The chart settings menu. `false` removes it; an object hides part of it. */
|
|
4518
4662
|
settings?: boolean | SettingsMenuUi;
|
|
4519
4663
|
/** The fullscreen button. */
|
|
@@ -4543,13 +4687,37 @@ interface LegendUi {
|
|
|
4543
4687
|
interface AccessPolicy {
|
|
4544
4688
|
/** Whether a command id may run. A refused command answers `denied` from every surface. */
|
|
4545
4689
|
command?(id: string): boolean;
|
|
4546
|
-
/** Whether a drawing tool id may be armed.
|
|
4690
|
+
/** Whether a drawing tool id may be armed. Placing an image (`placeImage`, the picker, a paste)
|
|
4691
|
+
* asks it for `image`. A copy is a new drawing, so a drawing of a refused tool is not cloned,
|
|
4692
|
+
* pasted or duplicated by a modifier-drag. A restore (a saved chart, a layout load, an undo, a
|
|
4693
|
+
* drawings document) puts drawings of a refused tool back like any other, and on the chart they
|
|
4694
|
+
* stay whole: they select, restyle, lock, hide and delete as any drawing does. */
|
|
4547
4695
|
drawingTool?(id: string): boolean;
|
|
4548
4696
|
/** Whether an indicator definition may be added, asked by its DEFINITION id (`manifest.id`; a
|
|
4549
4697
|
* built-in's is the catalog id the picker lists, such as `sma`), never by an instance id. Every
|
|
4550
|
-
* door asks the same id: the picker row, `indicators.add`, and
|
|
4551
|
-
*
|
|
4698
|
+
* door that adds asks the same id: the picker row, `indicators.add`, and `indicators.set` for an
|
|
4699
|
+
* instance the chart does not hold. The policy refuses adding, never restoring: a saved chart, a
|
|
4700
|
+
* layout load, an undo or a redo puts an instance of a refused definition back like any other.
|
|
4701
|
+
* An instance of a refused definition the chart holds stays whole: `indicators.set` and
|
|
4702
|
+
* `chart.indicators.update` edit it, an edit that would move it onto a refused definition leaves
|
|
4703
|
+
* it as it stands, and every remove door removes it. A definition that declares no id is not
|
|
4704
|
+
* gated. */
|
|
4552
4705
|
indicator?(id: string): boolean;
|
|
4706
|
+
/** How the chart's own controls present what the predicates refuse. `'disable'` (the default)
|
|
4707
|
+
* draws a refused control disabled, which suits an offer the viewer can unlock. `'hide'` leaves
|
|
4708
|
+
* it out: a refused drawing tool is not in the rail's flyouts, on the favorites bar or in the
|
|
4709
|
+
* glyph picker, and a section or group it empties goes with it; a refused indicator is not in
|
|
4710
|
+
* the indicator browser; and a control or menu row whose command is refused is not drawn.
|
|
4711
|
+
*
|
|
4712
|
+
* Only a refusal hides. A permitted command that cannot run now (nothing to undo, no bars
|
|
4713
|
+
* loaded, nothing selected) is still drawn disabled. Like the predicates it is read whenever a
|
|
4714
|
+
* control is drawn or synced, and again on `widget.refreshAccess()`, so the controls follow a
|
|
4715
|
+
* policy that changes. Nothing stored is
|
|
4716
|
+
* rewritten: a viewer's favorite keeps its star and returns when the policy permits it again,
|
|
4717
|
+
* and drawings and indicators already on the chart render as they do under either value. Every
|
|
4718
|
+
* other door (the keyboard, `widget.commands`, the chart handles) refuses exactly as it does
|
|
4719
|
+
* under `'disable'`. Any other value is a setup error thrown from `createChart`. */
|
|
4720
|
+
refused?: 'disable' | 'hide';
|
|
4553
4721
|
}
|
|
4554
4722
|
/** ── PREFERENCES ─────────────────────────────────────────────────────────────────────────────
|
|
4555
4723
|
* The viewer's own values: what the storage port persists and restores. A host supplies initial
|
|
@@ -4561,7 +4729,7 @@ interface ChartPreferences {
|
|
|
4561
4729
|
style: ChartStyleId;
|
|
4562
4730
|
scaleMode: ScaleMode;
|
|
4563
4731
|
/** The display timezone: an IANA id from the chart's registry, or `exchange` to follow whatever
|
|
4564
|
-
* venue the symbol resolves to. */
|
|
4732
|
+
* venue the symbol resolves to. One that `timezones` leaves out opens on the first listed. */
|
|
4565
4733
|
timezone: string;
|
|
4566
4734
|
/** Which subsession intraday bars are shown for. A symbol with no extended hours has one, so a
|
|
4567
4735
|
* stored `extended` on such a symbol falls back rather than filtering to nothing. */
|
|
@@ -4658,9 +4826,12 @@ interface DrawingPersistenceOptions {
|
|
|
4658
4826
|
}
|
|
4659
4827
|
/** The multi-chart arrangement the widget opens with. */
|
|
4660
4828
|
interface LayoutOptions {
|
|
4661
|
-
/** An arrangement code from the catalog (default `s`, one chart
|
|
4829
|
+
/** An arrangement code from the catalog (default `s`, one chart, or the first of
|
|
4830
|
+
* `ChartWidgetOptions.layouts` when the host lists them). Unknown codes throw, and with `layouts`
|
|
4831
|
+
* the code must be one of them. */
|
|
4662
4832
|
arrangement?: string;
|
|
4663
|
-
/** Per-chart starting symbol and timeframe, index-aligned to the arrangement's panes.
|
|
4833
|
+
/** Per-chart starting symbol and timeframe, index-aligned to the arrangement's panes. A timeframe
|
|
4834
|
+
* must be one the widget offers. */
|
|
4664
4835
|
charts?: {
|
|
4665
4836
|
symbol?: string;
|
|
4666
4837
|
timeframe?: string;
|
|
@@ -4700,6 +4871,31 @@ interface SearchScope {
|
|
|
4700
4871
|
size: number;
|
|
4701
4872
|
}) => (() => void) | void;
|
|
4702
4873
|
}
|
|
4874
|
+
/** How the symbol search offers its class filter and its spread operators. Every field is optional,
|
|
4875
|
+
* and a host that sets none gets the default search: all six operators, an All chip, and one class
|
|
4876
|
+
* selected at a time. */
|
|
4877
|
+
interface SearchDisplayOptions {
|
|
4878
|
+
/** The spread operators and the expression rows. `true` (the default) offers every operator.
|
|
4879
|
+
* `false` offers no operator toggle, no operator and no expression row, and searches your feed
|
|
4880
|
+
* with the query exactly as typed. `{ operators }` keeps spreads on and offers only the listed
|
|
4881
|
+
* operators, in the listed order; an empty list offers no operator toggle while a typed
|
|
4882
|
+
* expression still reads as one. The compare dialog offers no operator buttons either way. */
|
|
4883
|
+
spreads?: boolean | {
|
|
4884
|
+
readonly operators: readonly SpreadOperatorId[];
|
|
4885
|
+
};
|
|
4886
|
+
/** The class strip's All chip. `false` offers none: with one class selected at a time the first
|
|
4887
|
+
* declared class starts selected, and with several, no selection means every class. `{ label }`
|
|
4888
|
+
* writes the chip with your label. Absent, the chip wears the catalog's own label. A class's own
|
|
4889
|
+
* row of narrower classes always opens with its all chip, written the same way. */
|
|
4890
|
+
allClasses?: false | {
|
|
4891
|
+
readonly label: string;
|
|
4892
|
+
};
|
|
4893
|
+
/** How many classes the viewer selects at once. `single` (the default) makes the chips a choice
|
|
4894
|
+
* of one, and your feed hears it as `cls`. `multiple` makes each chip a toggle, the All chip
|
|
4895
|
+
* clears the selection, and your feed hears `classes` with every selected class, and `cls` too
|
|
4896
|
+
* while exactly one is selected. */
|
|
4897
|
+
classSelection?: 'single' | 'multiple';
|
|
4898
|
+
}
|
|
4703
4899
|
/** Everything needed to construct a widget. `container` and `datafeed` are the two hard
|
|
4704
4900
|
* requirements; every other field has a working default. */
|
|
4705
4901
|
interface ChartWidgetOptions extends MarkPainterHooks {
|
|
@@ -4723,12 +4919,147 @@ interface ChartWidgetOptions extends MarkPainterHooks {
|
|
|
4723
4919
|
storage?: ChartStorage;
|
|
4724
4920
|
/** The symbol to open on. */
|
|
4725
4921
|
symbol?: string;
|
|
4726
|
-
/** The timeframe token to open on.
|
|
4922
|
+
/** The timeframe token to open on. With `timeframes` or `customTimeframes: false` it must be one
|
|
4923
|
+
* the chart offers. */
|
|
4727
4924
|
timeframe?: string;
|
|
4728
|
-
/** The main-series style to open on. */
|
|
4925
|
+
/** The main-series style to open on. It must be one of `styles`. */
|
|
4729
4926
|
style?: ChartStyleId;
|
|
4927
|
+
/** The main-series styles the chart offers, in this order. Absent, every style in `CHART_STYLES`
|
|
4928
|
+
* is offered and the picker groups them by family.
|
|
4929
|
+
*
|
|
4930
|
+
* A style left out is not a style of this chart: it has no `chart.style.<id>` command, so no
|
|
4931
|
+
* menu, shortcut or host control reaches it, and `setStyle` ignores it. The picker lists the
|
|
4932
|
+
* offered styles in the order given, and is not shown when one style is offered, since there is
|
|
4933
|
+
* nothing to choose. `ui.topBar.styles: false` hides the picker on its own terms.
|
|
4934
|
+
*
|
|
4935
|
+
* A saved layout, saved chart or stored preference that names a style outside the list opens on
|
|
4936
|
+
* the FIRST offered style, and the rest of it restores. An empty list, an id outside
|
|
4937
|
+
* `CHART_STYLES`, a repeated id, and a `style` outside the list are setup errors thrown from
|
|
4938
|
+
* `createChart`. */
|
|
4939
|
+
styles?: readonly ChartStyleId[];
|
|
4940
|
+
/** The timeframe tokens the chart offers. Absent, every preset in `TIMEFRAME_PRESETS` is offered
|
|
4941
|
+
* and the viewer may compose custom timeframes. Any token the grammar reads may be listed,
|
|
4942
|
+
* preset or not (`2m`). The order given does not matter: the picker lists each unit's group
|
|
4943
|
+
* smallest first.
|
|
4944
|
+
*
|
|
4945
|
+
* A token left out is not a timeframe of this chart. A preset left out has no
|
|
4946
|
+
* `chart.timeframe.<token>` command, `chart.timeframe.set` and `setTimeframe` ignore a token
|
|
4947
|
+
* left out, and the picker shows no chip and no row for it. A group with no listed token is not
|
|
4948
|
+
* shown, a listed token beyond the presets sits in its unit's group, and there is no
|
|
4949
|
+
* custom-timeframe composer. The viewer's saved chips show where they are listed. When the list
|
|
4950
|
+
* leaves none of them, the chips are the first five listed tokens, and the viewer's stored chips
|
|
4951
|
+
* are kept unchanged for a chart that offers them. The picker is not shown when one timeframe is
|
|
4952
|
+
* offered, since there is nothing to choose. `ui.topBar.timeframes: false` hides the picker on
|
|
4953
|
+
* its own terms. A range preset whose interval is left out reads its span at the smallest listed
|
|
4954
|
+
* timeframe at or above that interval, else at the largest listed.
|
|
4955
|
+
*
|
|
4956
|
+
* A saved layout, saved chart or stored preference that names a token outside the list opens on
|
|
4957
|
+
* the SMALLEST listed timeframe, and the rest of it restores. An empty list, a token the grammar
|
|
4958
|
+
* cannot read, a repeated token, a `timeframe` or `layout.charts[].timeframe` outside the list,
|
|
4959
|
+
* and `customTimeframes: true` beside a list are setup errors thrown from `createChart`. */
|
|
4960
|
+
timeframes?: readonly string[];
|
|
4961
|
+
/** Whether the viewer may compose custom timeframes beyond the presets (default true). `false`
|
|
4962
|
+
* offers the 26 presets alone: the picker has no composer and lists none of the viewer's custom
|
|
4963
|
+
* timeframes, and `chart.timeframe.set` and `setTimeframe` ignore a token that is not a preset.
|
|
4964
|
+
* A stored token beyond the presets opens on `1m`, and a `timeframe` beyond them is a setup
|
|
4965
|
+
* error. A `timeframes` list offers nothing beyond itself, so `false` beside one changes nothing
|
|
4966
|
+
* and `true` beside one is a setup error.
|
|
4967
|
+
*
|
|
4968
|
+
* This switch is not `preferences.customTimeframes`, which is the list of custom tokens a
|
|
4969
|
+
* first-run viewer starts with. */
|
|
4970
|
+
customTimeframes?: boolean;
|
|
4971
|
+
/** The range presets the chart's bottom bar offers, by the key `RANGE_PRESETS` gives each
|
|
4972
|
+
* (`1D`, `5D`, `1M`, `3M`, `6M`, `YTD`, `1Y`, `5Y`, `All`), in this order. Absent, all nine
|
|
4973
|
+
* are offered in their own order.
|
|
4974
|
+
*
|
|
4975
|
+
* A preset left out is not a range of this chart: it has no `chart.range.<key>` command, so no
|
|
4976
|
+
* menu, shortcut or host control reaches it, `chart.range.set` ignores its key, and the bottom
|
|
4977
|
+
* bar draws no button for it. An empty list offers no preset: the bottom bar keeps its clock,
|
|
4978
|
+
* timezone picker and session view, and `chart.range.set` still takes an explicit window.
|
|
4979
|
+
* `ui.bottomBar: false` removes the whole bar. A preset whose interval `timeframes` leaves out
|
|
4980
|
+
* reads its span at the nearest coarser timeframe the chart offers. A non-list, a key that names
|
|
4981
|
+
* no preset and a repeated key are setup errors thrown from `createChart`. */
|
|
4982
|
+
ranges?: readonly string[];
|
|
4983
|
+
/** The display timezones the chart offers: zone ids `TIMEZONES` lists, and `exchange` for the
|
|
4984
|
+
* charted symbol's own zone. Absent, every zone and the exchange choice are offered. The
|
|
4985
|
+
* timezone picker keeps its own order (UTC, the exchange choice, then every zone by its current
|
|
4986
|
+
* offset); the order given decides only which choice is first.
|
|
4987
|
+
*
|
|
4988
|
+
* A choice left out is not a timezone of this chart: it has no `chart.timezone.<id>` command (or
|
|
4989
|
+
* `chart.timezone.exchange`), `chart.timezone.set` and `setTimezone` ignore it, and the picker
|
|
4990
|
+
* lists no row for it. With one choice offered the picker is not shown, since there is nothing to
|
|
4991
|
+
* choose, and the bottom bar's clock still reads the time in that zone.
|
|
4992
|
+
*
|
|
4993
|
+
* A chart opens on the viewer's stored choice, else `preferences.timezone`, when the list offers
|
|
4994
|
+
* it, and otherwise on the FIRST choice listed. A stored choice outside the list is not
|
|
4995
|
+
* rewritten until the viewer chooses, so a chart that offers it again opens on it. The exported
|
|
4996
|
+
* registry (`TIMEZONES`, `isTimezoneChoice`, `timezoneListing`) is never filtered. A non-list,
|
|
4997
|
+
* an empty list, an id that names no zone and a repeated id are setup errors thrown from
|
|
4998
|
+
* `createChart`. */
|
|
4999
|
+
timezones?: readonly string[];
|
|
4730
5000
|
/** The multi-chart arrangement. One chart when omitted. */
|
|
4731
5001
|
layout?: LayoutOptions;
|
|
5002
|
+
/** The arrangement codes the chart offers (`ARRANGEMENTS`). Absent, all 55 are offered. The
|
|
5003
|
+
* layout opens on `layout.arrangement`, else on the first code listed. The layout setup menu
|
|
5004
|
+
* keeps its own rows by chart count and shows only the listed arrangements, and the order given
|
|
5005
|
+
* breaks ties when a saved layout falls back (below).
|
|
5006
|
+
*
|
|
5007
|
+
* An arrangement left out is not an arrangement of this chart: no tile shows it, and
|
|
5008
|
+
* `widget.layout.setArrangement` and the `widget.layout.setArrangement` command ignore it. With
|
|
5009
|
+
* one arrangement offered the layout setup menu is not shown, since there is nothing to choose,
|
|
5010
|
+
* unless that arrangement holds several charts and a sync switch is offered (`layoutSync`): the
|
|
5011
|
+
* menu then holds the switches alone. `['s']` is a single chart with no layout setup menu.
|
|
5012
|
+
* `ui.topBar.layoutSetup: false` hides the menu on its own terms.
|
|
5013
|
+
*
|
|
5014
|
+
* A saved layout whose arrangement is left out opens on the offered arrangement with the most
|
|
5015
|
+
* charts not above the saved layout's count, the first listed winning a tie. When every offered
|
|
5016
|
+
* arrangement holds more charts, it opens on the one with the fewest, and the panes past the
|
|
5017
|
+
* saved charts are filled as a re-tile fills new panes, from the first chart. Saved charts past
|
|
5018
|
+
* the ones shown are not dropped: the layout carries them, with the saved arrangement and its
|
|
5019
|
+
* divider positions, and a save of it writes them back unchanged beside the shown charts as they
|
|
5020
|
+
* are now, so a chart that offers the saved arrangement again opens all of them. A re-tile the
|
|
5021
|
+
* viewer or the host makes is a new arrangement, and what was carried goes with the charts it
|
|
5022
|
+
* tears down. A saved active chart among the hidden ones leaves the first chart active. Sync
|
|
5023
|
+
* switches restore as saved, apart from those `layoutSync` leaves out.
|
|
5024
|
+
*
|
|
5025
|
+
* An empty list, an unknown code, a repeated code and a `layout.arrangement` outside the list
|
|
5026
|
+
* are setup errors thrown from `createChart`. */
|
|
5027
|
+
layouts?: readonly string[];
|
|
5028
|
+
/** The sync switches the viewer may change (`symbol`, `interval`, `crosshair`, `time`,
|
|
5029
|
+
* `dateRange`). Absent, every one. A switch left out holds the value `layout.sync` gives it, or
|
|
5030
|
+
* off: the layout setup menu does not show it, `widget.layout.setSync` and its command leave it
|
|
5031
|
+
* as it is, and a saved layout cannot change it. An empty list fixes every switch and leaves the
|
|
5032
|
+
* layout setup menu the arrangements alone. An unknown or repeated switch is a setup error thrown
|
|
5033
|
+
* from `createChart`. */
|
|
5034
|
+
layoutSync?: readonly (keyof LayoutSyncFlags)[];
|
|
5035
|
+
/** The drawing tools the chart offers, by the type `access.drawingTool` and the `tool.<type>`
|
|
5036
|
+
* icon ids use: any type `drawingTools.all()` lists, `zoom` or `eraser`. Absent, every tool is
|
|
5037
|
+
* offered. The order given does not matter: the rail keeps its own groups and sections.
|
|
5038
|
+
*
|
|
5039
|
+
* A tool left out is not a tool of this chart for creating drawings. It is not drawn anywhere a
|
|
5040
|
+
* tool is chosen: not in its group's flyout, not as a group's face (which wears the first tool
|
|
5041
|
+
* the group offers), not on the favorites bar and not on the rail (`measure`, `zoom`). A section
|
|
5042
|
+
* or group it empties goes with it. The glyph picker's kinds are the `emoji`, `sticker` and
|
|
5043
|
+
* `icon` tools, and a kind left out has no tab. `chart.drawings.arm`, `armTool`, `placeImage` and
|
|
5044
|
+
* an image pasted over the chart refuse it. A copy of a drawing of it is refused too, since a
|
|
5045
|
+
* copy is a new drawing: `chart.drawings.clone` and `chart.drawings.paste` are unavailable for
|
|
5046
|
+
* one, `clone` and `paste` make nothing, and a modifier-drag moves the drawing instead of
|
|
5047
|
+
* duplicating it. Copying one to the clipboard, to paste on a chart that offers it, is not
|
|
5048
|
+
* refused.
|
|
5049
|
+
*
|
|
5050
|
+
* Drawings of a tool left out that are already on the chart (from a saved chart or layout, a
|
|
5051
|
+
* drawings document or another host) render and stay fully editable: they select, restyle
|
|
5052
|
+
* through the selection's bar and the settings dialog, lock, hide and delete as any drawing
|
|
5053
|
+
* does. The eraser is always offered, listed or not, because it removes rather than creates, so
|
|
5054
|
+
* `['eraser']` is a chart whose viewers keep and remove what is on it and make nothing new.
|
|
5055
|
+
*
|
|
5056
|
+
* It composes with `access`: a tool is offered when it is listed AND the policy permits it, and a
|
|
5057
|
+
* listed tool the policy refuses is drawn as `access.refused` says. Nothing stored is rewritten:
|
|
5058
|
+
* a starred tool left out keeps its star, and a group's remembered face is kept, for a chart that
|
|
5059
|
+
* offers them. `features.drawings: false` removes drawing altogether whatever the list says. An
|
|
5060
|
+
* empty list, a type that names no tool and a repeated type are setup errors thrown from
|
|
5061
|
+
* `createChart`. */
|
|
5062
|
+
drawingTools?: readonly string[];
|
|
4732
5063
|
/** Where the drawings are stored: with the chart's own saved content (the default) or in their
|
|
4733
5064
|
* own documents through the adapter's drawings family. */
|
|
4734
5065
|
drawingPersistence?: DrawingPersistenceOptions;
|
|
@@ -4753,6 +5084,31 @@ interface ChartWidgetOptions extends MarkPainterHooks {
|
|
|
4753
5084
|
indicatorPicker?: IndicatorPickerSource;
|
|
4754
5085
|
/** Indicator instances on the chart at mount. */
|
|
4755
5086
|
indicators?: IndicatorInstance[];
|
|
5087
|
+
/** The built-in indicators the chart offers, by the definition id `access.indicator` receives:
|
|
5088
|
+
* any id `BUILT_IN_INDICATORS` lists, such as `sma`. Absent, every built-in is offered. The order
|
|
5089
|
+
* given does not matter: the indicator browser keeps its own.
|
|
5090
|
+
*
|
|
5091
|
+
* A built-in left out is not one this chart adds. The indicator browser does not list it: not
|
|
5092
|
+
* among the built-ins, not among the favorites (a starred one keeps its star in storage), not in
|
|
5093
|
+
* search results, and the host's `indicatorPicker` listing is handed only the offered ids. Every
|
|
5094
|
+
* door that would add one refuses: `chart.indicators.add` answers `denied`, `indicators.add`
|
|
5095
|
+
* adds nothing, `indicators.set` leaves out an instance of it the chart does not already hold,
|
|
5096
|
+
* and a new pane a re-tile adds copies the first chart's studies without it. There is no
|
|
5097
|
+
* duplicate verb for an indicator; adding a second instance is adding.
|
|
5098
|
+
*
|
|
5099
|
+
* Instances of a built-in left out that are already on the chart (from a saved chart or layout,
|
|
5100
|
+
* an undo step or another host sharing the store) render and stay fully editable and removable:
|
|
5101
|
+
* the settings dialog, `chart.indicators.update`, the legend's eye and remove, remove all and
|
|
5102
|
+
* `indicators.remove` all work on them, and an edit that would move one onto another left-out
|
|
5103
|
+
* built-in keeps it as it stands. Nothing saved is rewritten because of the list.
|
|
5104
|
+
*
|
|
5105
|
+
* A definition whose `manifest.id` names no built-in is the host's own and is never filtered, nor
|
|
5106
|
+
* is what an `indicatorPicker` source lists. It composes with `access`: a built-in is offered
|
|
5107
|
+
* when it is listed AND the policy permits it, and a listed one the policy refuses is drawn as
|
|
5108
|
+
* `access.refused` says. A non-list, an empty list, an id that names no built-in, a repeated id
|
|
5109
|
+
* and an `indicators` instance whose built-in is not listed are setup errors thrown from
|
|
5110
|
+
* `createChart`. */
|
|
5111
|
+
builtInIndicators?: readonly string[];
|
|
4756
5112
|
/** A built-in interface language for the chart's chrome and its date formatting. */
|
|
4757
5113
|
locale?: ChartLocaleCode;
|
|
4758
5114
|
/** A host-owned localization adapter. When supplied it replaces `locale`, and the host owns its
|
|
@@ -4766,9 +5122,10 @@ interface ChartWidgetOptions extends MarkPainterHooks {
|
|
|
4766
5122
|
image?: ImageOptions;
|
|
4767
5123
|
/** The symbol picker's host inputs. The chart owns the search controller (its debounce, cache and
|
|
4768
5124
|
* cancellation); a host supplies only what it alone knows: where the viewer's recent symbols
|
|
4769
|
-
* live,
|
|
4770
|
-
* class's filter chip wears the class token as
|
|
4771
|
-
|
|
5125
|
+
* live, what its feed's asset classes are called, and how the classes and the spread operators
|
|
5126
|
+
* are offered. Absent, recents last the page, a class's filter chip wears the class token as
|
|
5127
|
+
* written, and the search offers its default class strip and operators. */
|
|
5128
|
+
search?: SearchDisplayOptions & {
|
|
4772
5129
|
recents?: RecentsPort;
|
|
4773
5130
|
/** Display names for the asset-class tokens the feed's `config()` declares in `classes`. */
|
|
4774
5131
|
classNames?: Readonly<Record<string, string>>;
|
|
@@ -4960,6 +5317,15 @@ interface ChartWidget {
|
|
|
4960
5317
|
/** The chrome's host slots. A host that composes its own doors puts them here rather than beside
|
|
4961
5318
|
* the chart, so a service the chart does not own still reads as part of the same toolbar. */
|
|
4962
5319
|
chrome: ChartChrome;
|
|
5320
|
+
/** Ask the access policy again, now. The chart's own controls read `access` whenever they sync
|
|
5321
|
+
* and whenever a menu opens; call this when the policy's answers changed with nothing on the
|
|
5322
|
+
* chart changing (a viewer's plan changed mid-session). Every control, menu row, rail tool and
|
|
5323
|
+
* group, the favorites bar, the glyph picker, the legend's row controls and every menu, flyout
|
|
5324
|
+
* and dialog that is open (the indicator browser among them) read the policy again: shown or
|
|
5325
|
+
* left out under `access.refused`, enabled or disabled. Listeners of `commands.onChange` hear
|
|
5326
|
+
* it too, so a host's own controls can read `commands.available` again. Nothing stored and
|
|
5327
|
+
* nothing on the chart changes. Inert after `dispose`. */
|
|
5328
|
+
refreshAccess(): void;
|
|
4963
5329
|
on<K extends keyof WidgetEvents>(name: K, callback: WidgetEvents[K]): () => void;
|
|
4964
5330
|
/** Tear down every chart, subscription, timer and DOM resource. Idempotent, and every handle and
|
|
4965
5331
|
* subscription is inert afterwards. */
|
|
@@ -5393,58 +5759,6 @@ declare function timezoneListing(t: ChartTranslate, options?: {
|
|
|
5393
5759
|
at?: Date;
|
|
5394
5760
|
}): TimezoneRow[];
|
|
5395
5761
|
|
|
5396
|
-
/** What a preset frames: seconds of history, the year to date, or everything loaded. */
|
|
5397
|
-
type RangeSpan = number | 'ytd' | 'all';
|
|
5398
|
-
interface RangePreset {
|
|
5399
|
-
/** The preset's identity and the text its chip wears ('1D', 'YTD', 'All'). It stays as written
|
|
5400
|
-
* in every language; a host names the preset by it. */
|
|
5401
|
-
readonly key: string;
|
|
5402
|
-
readonly span: RangeSpan;
|
|
5403
|
-
/** The timeframe token the preset switches the chart to. */
|
|
5404
|
-
readonly tf: string;
|
|
5405
|
-
/** The catalog key of the preset's full name, for its tooltip. */
|
|
5406
|
-
readonly label: ChartMessageKey;
|
|
5407
|
-
}
|
|
5408
|
-
/** The nine presets, in bar order. */
|
|
5409
|
-
declare const RANGE_PRESETS: readonly RangePreset[];
|
|
5410
|
-
/** The seconds a span covers back from `nowSecs`; null for 'all', which has no span. */
|
|
5411
|
-
declare function rangeSpanSeconds(span: RangeSpan, nowSecs: number): number | null;
|
|
5412
|
-
/** Whether a preset is offered for a symbol whose earliest bar is at `earliestBarSecs`: a preset
|
|
5413
|
-
* deeper than the history that exists is withheld (a listing from last year has no 5Y), 'All'
|
|
5414
|
-
* always stays, and an unknown depth (null) withholds nothing. The depth itself is the host's to
|
|
5415
|
-
* learn from its feed; the chart does not probe. */
|
|
5416
|
-
declare function rangeAvailable(preset: RangePreset, earliestBarSecs: number | null | undefined, nowSecs?: number): boolean;
|
|
5417
|
-
/** A preset's tooltip: what it frames, and the bars it frames it in. */
|
|
5418
|
-
declare function rangePresetTip(t: ChartTranslate, preset: RangePreset): string;
|
|
5419
|
-
/** The part of a chart the framing needs: a time scale that takes a logical range. */
|
|
5420
|
-
interface RangeFrameTarget {
|
|
5421
|
-
timeScale(): {
|
|
5422
|
-
setVisibleLogicalRange(range: {
|
|
5423
|
-
from: number;
|
|
5424
|
-
to: number;
|
|
5425
|
-
}): void;
|
|
5426
|
-
};
|
|
5427
|
-
}
|
|
5428
|
-
/** Frame a pane on a span, anchored on its LAST REAL bar: a series also carries a future
|
|
5429
|
-
* whitespace horizon for right-margin drawing, so fitting to content would frame a screen of
|
|
5430
|
-
* empty space. The bar count comes from the pane's own interval, because the same span is a
|
|
5431
|
-
* different number of bars on a one-minute pane than on a daily one. An empty series, or a token
|
|
5432
|
-
* the grammar cannot read, frames nothing rather than a bogus window. */
|
|
5433
|
-
declare function frameRange(chart: RangeFrameTarget, series: {
|
|
5434
|
-
data(): readonly unknown[];
|
|
5435
|
-
}, span: RangeSpan, tf: string, nowSecs?: number): void;
|
|
5436
|
-
/** One zoom step multiplies or divides the bar spacing by this. */
|
|
5437
|
-
declare const ZOOM_FACTOR = 1.25;
|
|
5438
|
-
/** The bar spacing a zoom-out never goes below. */
|
|
5439
|
-
declare const MIN_BAR_SPACING = 0.5;
|
|
5440
|
-
/** How far one scroll step moves, in bars. */
|
|
5441
|
-
declare const SCROLL_STEP_BARS = 10;
|
|
5442
|
-
/** The bar spacing after one zoom step from `spacing`. */
|
|
5443
|
-
declare function zoomedBarSpacing(spacing: number, direction: 'in' | 'out'): number;
|
|
5444
|
-
/** The time-scale scroll position after one scroll step from `position` (positive is right, as
|
|
5445
|
-
* lightweight-charts counts it). */
|
|
5446
|
-
declare function scrolledPosition(position: number, direction: 'left' | 'right'): number;
|
|
5447
|
-
|
|
5448
5762
|
/** A catalog kept warm between opens, from `createSymbolSearchCache`. Completed pages outlive a
|
|
5449
5763
|
* dialog, so the second open of a picker, and the first one on a page that warmed it, stands on
|
|
5450
5764
|
* what the viewer already saw instead of a loading line. Query state and in-flight work never pass
|
|
@@ -5460,7 +5774,7 @@ declare function createSymbolSearchCache(options: {
|
|
|
5460
5774
|
datafeed: Pick<ChartDatafeed, 'search'>;
|
|
5461
5775
|
pageSize?: number;
|
|
5462
5776
|
}): SymbolSearchCache;
|
|
5463
|
-
interface SymbolSearchOptions extends MarkPainterHooks {
|
|
5777
|
+
interface SymbolSearchOptions extends MarkPainterHooks, SearchDisplayOptions {
|
|
5464
5778
|
/** The feed the search runs against: the one a chart takes, or anything that answers `search`. */
|
|
5465
5779
|
datafeed: Pick<ChartDatafeed, 'search'>;
|
|
5466
5780
|
/** A catalog warmed over that same feed. Absent, this picker searches from cold and its pages go
|
|
@@ -5481,8 +5795,9 @@ interface SymbolSearchOptions extends MarkPainterHooks {
|
|
|
5481
5795
|
icons?: ChartIcons;
|
|
5482
5796
|
/** Where recent picks are read and written. Default: a list that lives as long as the dialog. */
|
|
5483
5797
|
recents?: RecentsPort;
|
|
5484
|
-
/** The asset classes the feed declares, for the filter strip
|
|
5485
|
-
|
|
5798
|
+
/** The asset classes the feed declares, for the filter strip, as a feed's `config()` declares
|
|
5799
|
+
* them. Absent, there is no strip. */
|
|
5800
|
+
classes?: readonly (string | SearchClassNode)[] | null;
|
|
5486
5801
|
/** Display names for those classes. A class without one wears its token. */
|
|
5487
5802
|
classNames?: Readonly<Record<string, string>>;
|
|
5488
5803
|
/** The query the field opens holding, selected so that typing replaces it. */
|
|
@@ -5511,4 +5826,59 @@ declare function mountSymbolSearch(options: SymbolSearchOptions & {
|
|
|
5511
5826
|
container: HTMLElement;
|
|
5512
5827
|
}): MountedSymbolSearch;
|
|
5513
5828
|
|
|
5514
|
-
|
|
5829
|
+
interface TimeframePickerOptions {
|
|
5830
|
+
/** Where the picked timeframe goes. The drop-down closes on the pick. */
|
|
5831
|
+
onPick(timeframe: string): void;
|
|
5832
|
+
/** The timeframe the list opens on, checked: the page's current value. Absent, no row is checked.
|
|
5833
|
+
* It must be one the list offers. */
|
|
5834
|
+
timeframe?: string;
|
|
5835
|
+
/** The timeframes the list offers, as a chart's `timeframes` names them: any tokens the grammar
|
|
5836
|
+
* reads, in any order, drawn smallest first in their units' groups, with no composer. */
|
|
5837
|
+
timeframes?: readonly string[];
|
|
5838
|
+
/** Whether the list offers composing a custom timeframe, as a chart's `customTimeframes` says.
|
|
5839
|
+
* Default true; `false` offers the presets alone. */
|
|
5840
|
+
customTimeframes?: boolean;
|
|
5841
|
+
/** The resolutions the feed serves, as a feed's `config()` declares them. A timeframe outside
|
|
5842
|
+
* them is left out of the list, as the chart's list leaves it out, and is never composed. */
|
|
5843
|
+
resolutions?: readonly string[] | null;
|
|
5844
|
+
/** The resolutions the symbol serves, as its `supportedResolutions` declares them, with the same
|
|
5845
|
+
* effect. */
|
|
5846
|
+
supportedResolutions?: readonly string[] | null;
|
|
5847
|
+
/** The element the drop-down's layer mounts in. Default: the document body, where the list stands
|
|
5848
|
+
* over the page rather than inside whatever box opened it. */
|
|
5849
|
+
container?: HTMLElement;
|
|
5850
|
+
/** Mode and palettes, as a chart takes them. Default: dark. */
|
|
5851
|
+
theme?: ThemeControllerOptions;
|
|
5852
|
+
/** The language, as a chart takes it. */
|
|
5853
|
+
locale?: string;
|
|
5854
|
+
/** A prepared runtime, when the page already has the chart's. It wins over `locale`. */
|
|
5855
|
+
i18n?: ChartI18n;
|
|
5856
|
+
/** The host's drawings for the list's glyphs, as a chart takes them. */
|
|
5857
|
+
icons?: ChartIcons;
|
|
5858
|
+
/** Called once the list is gone, however it went. */
|
|
5859
|
+
onClose?(): void;
|
|
5860
|
+
}
|
|
5861
|
+
interface TimeframePickerHandle {
|
|
5862
|
+
/** Close it from the outside. Closing twice is safe, and the list's own close is the same door. */
|
|
5863
|
+
close(): void;
|
|
5864
|
+
}
|
|
5865
|
+
/** Drop the chart's timeframe list from a control the page owns, with no chart behind it. */
|
|
5866
|
+
declare function openTimeframePicker(options: TimeframePickerOptions & {
|
|
5867
|
+
anchor: HTMLElement;
|
|
5868
|
+
}): TimeframePickerHandle;
|
|
5869
|
+
interface MountedTimeframePicker {
|
|
5870
|
+
/** The element the list was built into, for a page that measures or animates its own box. */
|
|
5871
|
+
element: HTMLElement;
|
|
5872
|
+
/** Put focus on the checked row, or the first, for a page whose box has just opened. */
|
|
5873
|
+
focus(): void;
|
|
5874
|
+
/** Take it down: the element goes. */
|
|
5875
|
+
dispose(): void;
|
|
5876
|
+
}
|
|
5877
|
+
/** The same list with no drop-down around it, built into a box the page owns and positions: a
|
|
5878
|
+
* phone's card, a panel in a page's own chrome. The page decides where it stands and when it goes;
|
|
5879
|
+
* picking hands the timeframe back, then calls `onClose`, which is the page's cue to close its box. */
|
|
5880
|
+
declare function mountTimeframePicker(options: TimeframePickerOptions & {
|
|
5881
|
+
container: HTMLElement;
|
|
5882
|
+
}): MountedTimeframePicker;
|
|
5883
|
+
|
|
5884
|
+
export { ARRANGEMENTS, type AccessPolicy, type ActiveSubsession, type Arrangement, type AttachDrawingsOptions, BRAND_DOWN, BRAND_UP, BUILT_IN_INDICATORS, BUILT_IN_LOCALES, type BarMark, type BarsEvent, type BuiltInIndicator, CHART_ICON_IDS, CHART_STYLES, COLLAPSED_H, COMPARE_COLORS, type CanvasTheme, type Capabilities, ChartBody, type ChartChrome, type ChartCompareApi, type ChartCustomLocale, type ChartDatafeed, type ChartDictionary, type ChartDrawingsApi, type ChartEvents, type ChartExtension, type ChartExtensionChart, type ChartExtensionCommand, type ChartExtensionContext, type ChartExtensionHandle, type ChartExtensionIcon, type ChartExtensionIconPath, type ChartExtensionMenuContext, type ChartExtensionMenuItem, type ChartExtensionMenuProvider, type ChartExtensionPane, type ChartExtensionPriceLine, type ChartExtensionReplayState, type ChartExtensionScope, type ChartExtensionSeries, type ChartHandle, type ChartHistoryApi, type ChartI18n, type ChartI18nOptions, type ChartIconContext, type ChartIconDiagnostic, type ChartIconFactory, type ChartIconFailure, type ChartIconId, type ChartIcons, type ChartLegendRow, type ChartLocale, type ChartLocaleCode, type ChartMenuAction, type ChartMenuContext, type ChartMenuIcon, type ChartMenuRow, ChartMessageKey, ChartMeta, type ChartOverrides, type ChartPaneSyncApi, type ChartPreferences, type ChartPriceFormatter, type ChartReplayApi, ChartSaveLoadAdapter, type ChartSaveLoadApi, type ChartStorage, type ChartStyleId, type ChartTimezone, type ChartTranslate, type ChartWidget, type ChartWidgetOptions, type CommandRegistry, type CommandResult, type CommandScope, type CommandSpec, type CompareDeps, type CompareEntry, type CompareHandle, type ComparePlacement, type CompareSnapshot, type CompareSymbol, type ContextMenuHandle, type CustomThemes, DEFAULT_OVERRIDES, DEFAULT_SUBSESSION, DEFAULT_TIMEZONE, type DataStatus, type DatafeedConfig, type DatafeedSearchOptions, type DrawingApplyOutcome, DrawingAssetPort, DrawingContextKind, type DrawingDocumentApi, type DrawingDocumentPort, type DrawingDocumentRefusal, type DrawingEvent, type DrawingOwner, DrawingPreferences, type DrawingPresets, type DrawingReadOutcome, type DrawingRejection, type DrawingRejectionReason, DrawingResourceContext, DrawingsBody, type DrawingsEvents, type DrawingsHandle, DrawingsMeta, type DrawingsWorkflow, EXCHANGE_TIMEZONE, type FeatureConfig, type FeedBar, FeedUnavailableError, type FetchLike, FillBetweenPrimitive, type FullscreenApi, type FullscreenOptions, type HistoryChange, type HistoryEventState, type HistoryPage, IMAGE_HEADER_H, type ImageApi, type ImageEvent, type ImageHeader, type ImageOptions, type ImageTextRun, type ImageTile, type IndicatorCategory, type IndicatorDefinition, type IndicatorEvent, type IndicatorFill, type IndicatorInstance, type IndicatorLevel, type IndicatorManifest, type IndicatorOverrides, type IndicatorPickerAction, type IndicatorPickerBuiltInState, type IndicatorPickerCollection, type IndicatorPickerItem, type IndicatorPickerSource, type IndicatorPlot, type IndicatorPlots, type IndicatorsApi, type IndicatorsRenderer, LAYOUT_MENU_ROWS, type LayoutApi, LayoutBody, type LayoutEvent, LayoutMeta, type LayoutOptions, type LayoutSaveLoadApi, type LayoutSyncFlags, type LegendUi, type LogicalRange, MAIN_MIN_H, MIN_BAR_SPACING, MIRRORED_ICONS, type ManifestFill, type ManifestInput, type ManifestLevel, type ManifestPlot, type ManifestRun, type MarkColorRole, type MarkPainters, type MarkPlacement, type MarkShape, type MarketStatus, type MatchSegment, type MountedSymbolSearch, type MountedTimeframePicker, type NumericPunctuation, type OlderPageVerdict, type OpenResource, PRICE_SCALE_MODE, type PaneOp, type PanePlan, type PaneRect, type PaneState, type PartialOverrides, type PlacedImage, type PlotPoint, type PriceFormat, type PriceFormatter, type PriceFormatterOptions, type ProviderMarkPainter, RANGE_PRESETS, RECENT_SYMBOLS_CAP, REPLAY_SPEEDS, type RangeFrameTarget, type RangePreset, type RangeSpan, type RecentsPort, type ReplayEventState, type ReplaySpeed, type ResourceLoadOutcome, ResourceRef, type ResourceRemoveOutcome, type ResourceSaveOutcome, ResourceStore, SCALE_MODES, SCALE_MODE_OPTIONS, SCROLL_STEP_BARS, SESSION_DOT, SESSION_LABEL, SESSION_STATE_TITLE, SPREAD_OPERATORS, type SaveConflictInfo, type ScaleMode, type SearchClassFilter, type SearchClassNode, type SearchController, type SearchControllerOptions, type SearchDisplayOptions, type SearchPage, type SearchScope, type SearchState, type SelectedDrawing, type SemanticTheme, type SessionBandsPrimitive, type SessionModel, type SessionSchedule, type SessionSegment, type SessionSource, type SessionState, type SessionTimeline, type SettingsMenuUi, ShadePrimitive, type SpreadOperator, type SpreadOperatorId, type SubscribeHandlers, type Subsession, type SubsessionId, type SubsessionSource, type SymbolInfo, type SymbolMarkPainter, type SymbolNames, type SymbolPriceFormat, type SymbolRow, type SymbolSearchCache, type SymbolSearchHandle, type SymbolSearchOptions, THEME_ROLES, TIMEFRAME_MAX, TIMEFRAME_PRESETS, TIMEFRAME_PRESET_TOKENS, TIMEFRAME_UNITS, TIMEFRAME_UNIT_NAME, TIMEFRAME_UNIT_SECONDS, TIMEZONES, TOP_BAR_SLOTS, TemplateBody, TemplateMeta, type TextEditSession, type ThemeChangeListener, type ThemeController, type ThemeControllerOptions, type ThemeDeclaration, type ThemeDiagnostic, type ThemeDiagnosticCode, type ThemeMode, type ThemeOptions, type ThemeRole, type ThemeRoleFamily, type ThemeRoleId, type ThemeRoleKind, type ThemeRootStyle, type TickBand, type TimeRange, type Timeframe, type TimeframeGroup, type TimeframePickerHandle, type TimeframePickerOptions, type TimeframeRestrictions, type TimeframeUnit, type TimescaleMark, type TimezoneRow, type ToolbarButton, type ToolbarButtonOptions, type ToolbarButtonState, type TopBarSlot, type TopBarUi, type UdfDatafeedOptions, type UdfSymbolResponse, type UiConfig, type VenueMarkPainter, type WidgetEvents, ZOOM_FACTOR, type ZoneClock, allowedTimeframes, applyBar, applyPlotOverrides, arrangementName, arrangementOf, attachCompare, attachDrawings, attachIndicators, autoIntervalFor, buildManifestPlots, canvasTheme, canvasToBlob, chartContextMenu, chartDictionaries, clipToWindow, coerceChartStyle, coerceScaleMode, compareTimeframes, composeFormingBar, composeImage, createChart, createChartI18n, createPriceFormatter, createSearchController, createSessionBands, createSymbolSearchCache, createThemeController, createUdfDatafeed, effectivePlotColor, exchangeTimezoneText, formatClock, formatDuration, formatTimeframe, frameRange, hasExtendedHours, imageFileName, imageHeaderRuns, imageLayoutHeaderRuns, imageTileRuns, indicatorHidden, isChartStyle, isCollapsed, isIntradayTimeframe, isSymbolPair, isTimezoneChoice, latestPlotValue, layerOverrides, looksLikeSpread, makeCrosshairTimeFormatter, makeTickMarkFormatter, manifestInputDefaults, marketStatus, marketStatusFor, marketStatusText, marketStatusTitle, matchSegments, memoryChartStorage, memoryRecents, mergeOverrides, mountContextMenu, mountSymbolSearch, mountTimeframePicker, nextSessionChange, olderPageVerdict, openInputsEditor, openSymbolSearch, openTimeframePicker, overriddenManifest, parseSessionModel, parseTickBands, parseTimeframe, pickCompareColor, placeableByWidget, planPaneOp, promoteRecent, rangeAvailable, rangePresetTip, rangeSpanSeconds, resolveDisplayTimezone, resolveInitialTf, scrolledPosition, seriesTargetOf, sessionStateAt, sessionTimeline, spreadExpression, spreadSearchQuery, subIntervalsFor, subsessionBarFilter, symbolNames, tfSeconds, tfToUdfResolution, tickBandFor, timeframeAllowed, timeframeGroupUnit, timeframeLabel, timeframeOrder, timeframeSeconds, timezoneCity, timezoneLabel, timezoneListing, toolName, tzOffsetLabel, tzOffsetMinutes, udfPriceFormat, udfResolutionToTf, udfSymbolInfo, valueShaped, withFoldedHistory, zoneClock, zoomedBarSpacing };
|