@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/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. Absent = unspecified. */
237
- classes?: readonly string[];
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
- search(q: string, opts?: {
248
- cls?: string;
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'` and
1712
- * `duration` is `'150ms'`; the kind says which tokens are valid, and validation enforces it. */
1713
- type ThemeRoleKind = 'color' | 'length' | 'font' | 'duration' | 'shadow';
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, such as a menu opening.";
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" | "hidden" | "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[]>>;
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
- search(query: string, cls?: string): void;
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?: string): void;
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: 'division' | 'subtraction' | 'addition' | 'multiplication' | 'exponentiation' | 'reciprocal';
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. Returns the unsubscribe. */
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 a restore. A definition that
4551
- * declares no id is not gated. */
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). Unknown codes throw. */
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, and what its feed's asset classes are called. Absent, recents last the page and a
4770
- * class's filter chip wears the class token as written. */
4771
- search?: {
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. Absent, there is no strip. */
5485
- classes?: readonly string[] | null;
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
- 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 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 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 SearchController, type SearchControllerOptions, 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 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 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, nextSessionChange, olderPageVerdict, openInputsEditor, openSymbolSearch, 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 };
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 };