@trdrs/quickcharts 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/README.md +209 -200
  3. package/dist/adapters/rest.d.ts +3 -3
  4. package/dist/adapters/rest.js +2 -2
  5. package/dist/adapters/rest.js.map +1 -1
  6. package/dist/{ar-G7MVXRE4.js → ar-KSXQ2USS.js} +20 -20
  7. package/dist/ar-KSXQ2USS.js.map +1 -0
  8. package/dist/{assets-ySndlUS3.d.ts → assets-DOuBBsOp.d.ts} +50 -50
  9. package/dist/{ca_ES-EUSRU4VG.js → ca_ES-JG4FM55E.js} +20 -20
  10. package/dist/ca_ES-JG4FM55E.js.map +1 -0
  11. package/dist/{chunk-AA7XKXH4.js → chunk-6S6TO2N6.js} +33 -33
  12. package/dist/chunk-6S6TO2N6.js.map +1 -0
  13. package/dist/{chunk-KFBQSPNA.js → chunk-D3S26ARP.js} +2 -2
  14. package/dist/chunk-D3S26ARP.js.map +1 -0
  15. package/dist/{chunk-AKXIFHQN.js → chunk-KLPTCWA2.js} +1 -1
  16. package/dist/{chunk-AKXIFHQN.js.map → chunk-KLPTCWA2.js.map} +1 -1
  17. package/dist/{de-2SVTG25S.js → de-VSW2LHNF.js} +20 -20
  18. package/dist/de-VSW2LHNF.js.map +1 -0
  19. package/dist/drawings.d.ts +16 -16
  20. package/dist/drawings.js +12 -12
  21. package/dist/{es-UDHZM4W7.js → es-5ZXIPVOB.js} +20 -20
  22. package/dist/es-5ZXIPVOB.js.map +1 -0
  23. package/dist/feature-manifest.json +3 -3
  24. package/dist/{fr-35VN4G4S.js → fr-4F6DAWGD.js} +20 -20
  25. package/dist/fr-4F6DAWGD.js.map +1 -0
  26. package/dist/{he_IL-JPZMCURP.js → he_IL-B7PBQUEV.js} +20 -20
  27. package/dist/he_IL-B7PBQUEV.js.map +1 -0
  28. package/dist/{id_ID-XSTFHHJQ.js → id_ID-CYJRMXPC.js} +20 -20
  29. package/dist/id_ID-CYJRMXPC.js.map +1 -0
  30. package/dist/index.d.ts +167 -163
  31. package/dist/index.js +248 -237
  32. package/dist/index.js.map +1 -1
  33. package/dist/{it-EIY6JESQ.js → it-KTX4SG5P.js} +20 -20
  34. package/dist/it-KTX4SG5P.js.map +1 -0
  35. package/dist/{ja-42N4XRCW.js → ja-V7OURU5D.js} +20 -20
  36. package/dist/ja-V7OURU5D.js.map +1 -0
  37. package/dist/{ko-3VRPTIP3.js → ko-2RNEBYVE.js} +20 -20
  38. package/dist/ko-2RNEBYVE.js.map +1 -0
  39. package/dist/{ms_MY-SKN7O6M5.js → ms_MY-EY235E7Q.js} +20 -20
  40. package/dist/ms_MY-EY235E7Q.js.map +1 -0
  41. package/dist/{pl-TYARHCLT.js → pl-ADNVRP55.js} +20 -20
  42. package/dist/pl-ADNVRP55.js.map +1 -0
  43. package/dist/{pt-72IIFLL4.js → pt-OL2DR3DO.js} +20 -20
  44. package/dist/pt-OL2DR3DO.js.map +1 -0
  45. package/dist/quickcharts.css +97 -96
  46. package/dist/{resources-Ch8eA1Mw.d.ts → resources-Le6flcEn.d.ts} +3 -3
  47. package/dist/rest-openapi.json +11 -11
  48. package/dist/{ru-TPH4F7IB.js → ru-V6YFEPAF.js} +20 -20
  49. package/dist/ru-V6YFEPAF.js.map +1 -0
  50. package/dist/{sv-DC5RS67Z.js → sv-TORXQVE7.js} +20 -20
  51. package/dist/sv-TORXQVE7.js.map +1 -0
  52. package/dist/{th-I6H6AOZ3.js → th-K6SJSYSY.js} +20 -20
  53. package/dist/th-K6SJSYSY.js.map +1 -0
  54. package/dist/theme-manifest.json +10 -10
  55. package/dist/{tr-7FSUVCNW.js → tr-4AEM66KW.js} +20 -20
  56. package/dist/tr-4AEM66KW.js.map +1 -0
  57. package/dist/{vi-DLRPHLLH.js → vi-YU5XCEUU.js} +20 -20
  58. package/dist/vi-YU5XCEUU.js.map +1 -0
  59. package/dist/{zh-ZXIQBBEP.js → zh-QXKRYHU5.js} +20 -20
  60. package/dist/zh-QXKRYHU5.js.map +1 -0
  61. package/dist/{zh_TW-TYNUJU7U.js → zh_TW-AYPDKG4Q.js} +20 -20
  62. package/dist/zh_TW-AYPDKG4Q.js.map +1 -0
  63. package/package.json +1 -1
  64. package/dist/ar-G7MVXRE4.js.map +0 -1
  65. package/dist/ca_ES-EUSRU4VG.js.map +0 -1
  66. package/dist/chunk-AA7XKXH4.js.map +0 -1
  67. package/dist/chunk-KFBQSPNA.js.map +0 -1
  68. package/dist/de-2SVTG25S.js.map +0 -1
  69. package/dist/es-UDHZM4W7.js.map +0 -1
  70. package/dist/fr-35VN4G4S.js.map +0 -1
  71. package/dist/he_IL-JPZMCURP.js.map +0 -1
  72. package/dist/id_ID-XSTFHHJQ.js.map +0 -1
  73. package/dist/it-EIY6JESQ.js.map +0 -1
  74. package/dist/ja-42N4XRCW.js.map +0 -1
  75. package/dist/ko-3VRPTIP3.js.map +0 -1
  76. package/dist/ms_MY-SKN7O6M5.js.map +0 -1
  77. package/dist/pl-TYARHCLT.js.map +0 -1
  78. package/dist/pt-72IIFLL4.js.map +0 -1
  79. package/dist/ru-TPH4F7IB.js.map +0 -1
  80. package/dist/sv-DC5RS67Z.js.map +0 -1
  81. package/dist/th-I6H6AOZ3.js.map +0 -1
  82. package/dist/tr-7FSUVCNW.js.map +0 -1
  83. package/dist/vi-DLRPHLLH.js.map +0 -1
  84. package/dist/zh-ZXIQBBEP.js.map +0 -1
  85. package/dist/zh_TW-TYNUJU7U.js.map +0 -1
@@ -1,14 +1,14 @@
1
1
  /* Quick Charts stylesheet.
2
2
  * Generated from the typed theme source. Do not edit by hand.
3
3
  * Every rule is scoped to [data-qc-theme], the widget root element, and sits in a cascade
4
- * layer: the built-in palettes in trdrs.tokens, every recipe in trdrs.chart.
4
+ * layer: the built-in palettes in quickcharts.tokens, every recipe in quickcharts.chart.
5
5
  * The custom-property names below are private implementation, not API. The supported class
6
6
  * names are listed in the theme manifest under hooks; every other class is private.
7
7
  */
8
8
 
9
- @layer trdrs.tokens, trdrs.chart;
9
+ @layer quickcharts.tokens, quickcharts.chart;
10
10
 
11
- @layer trdrs.tokens {
11
+ @layer quickcharts.tokens {
12
12
  [data-qc-theme="light"] {
13
13
  --qc-canvas-background: #ffffff;
14
14
  --qc-canvas-paneBorder: #ebebeb;
@@ -202,7 +202,7 @@
202
202
  }
203
203
  }
204
204
 
205
- @layer trdrs.chart {
205
+ @layer quickcharts.chart {
206
206
  /* Quick Charts component recipes.
207
207
  *
208
208
  * Every rule is scoped to the widget's own root element, which carries `data-qc-theme`. Nothing
@@ -286,8 +286,8 @@
286
286
  background: var(--qc-state-pressed);
287
287
  }
288
288
 
289
- /* A held button wears the neutral held fill in the primary ink, the held state the toolbars and the
290
- * rail show too. */
289
+ /* A held button wears the neutral held fill in the primary ink, the held state the top bar, the
290
+ * bottom bar and the drawing toolbar show too. */
291
291
  [data-qc-theme] .qc-button[aria-pressed='true'],
292
292
  [data-qc-theme] .qc-button[data-qc-active='true'] {
293
293
  color: var(--qc-text-primary);
@@ -456,8 +456,8 @@
456
456
  font-variant-numeric: tabular-nums;
457
457
  }
458
458
 
459
- /* A hidden study keeps its ink and stands the WHOLE row back, controls included, so the row reads
460
- * as switched off rather than as a different kind of row. */
459
+ /* A hidden indicator keeps its ink and stands the WHOLE row back, controls included, so the row
460
+ * reads as switched off rather than as a different kind of row. */
461
461
  [data-qc-theme] .qc-legend-row[data-qc-hidden='true'] {
462
462
  opacity: 0.5;
463
463
  }
@@ -570,8 +570,8 @@
570
570
  display: contents;
571
571
  }
572
572
 
573
- /* An external rail's flyout stands here, over anything the page stacks beside the widget and under
574
- * the widget's own dialogs. */
573
+ /* An external drawing toolbar's flyout stands here, over anything the page stacks beside the widget
574
+ * and under the widget's own dialogs. */
575
575
  [data-qc-theme].qc-layer > .qc-drawing-popover {
576
576
  position: fixed;
577
577
  z-index: 2147483001;
@@ -677,7 +677,7 @@
677
677
  }
678
678
 
679
679
  /* The market and its facts stand as one 24px band, in the legend's ink at a size up from the
680
- * chrome's: the mark, the name 4px past it, then the interval and the venue, each in a 12px cell
680
+ * chrome's: the mark, the name 4px past it, then the timeframe and the venue, each in a 12px cell
681
681
  * that carries its separating dot. The reading beside it wraps whole to its own line, so the two
682
682
  * are separate hover targets and only the band under the pointer takes the chip. */
683
683
  [data-qc-theme] .qc-legend-identity {
@@ -747,7 +747,8 @@
747
747
  background: var(--qc-state-pressed);
748
748
  }
749
749
 
750
- /* The interval and the venue, each behind its own separator dot, in the name's own ink and size. */
750
+ /* The timeframe and the venue, each behind its own separator dot, in the name's own ink and
751
+ * size. */
751
752
  [data-qc-theme] .qc-legend-fact {
752
753
  white-space: nowrap;
753
754
  }
@@ -810,8 +811,8 @@
810
811
 
811
812
  /* Step 3: a slim pane sheds the venue and its separator, in the header and in every market row
812
813
  * under it — one answer for the whole legend, because a row that kept its venue while the header
813
- * above it dropped one would read as two different markets. The interval stays, because one chart
814
- * of a layout has nowhere else to say what interval it is on. */
814
+ * above it dropped one would read as two different markets. The timeframe stays, because one chart
815
+ * of a layout has nowhere else to say what timeframe it is on. */
815
816
  [data-qc-theme] .qc-legend[data-qc-slim='true'] [data-role='legend-exchange'],
816
817
  [data-qc-theme] .qc-legend[data-qc-slim='true'] [data-role='legend-exchange-sep'],
817
818
  [data-qc-theme] .qc-legend[data-qc-slim='true'] .qc-legend-row-venue {
@@ -883,7 +884,7 @@
883
884
  opacity: 1;
884
885
  }
885
886
 
886
- /* A hidden study says so whether or not the pointer is on it, so its eye stands on its own. */
887
+ /* A hidden indicator says so whether or not the pointer is on it, so its eye stands on its own. */
887
888
  [data-qc-theme] .qc-legend-row[data-qc-hidden='true'] .qc-legend-eye {
888
889
  opacity: 1;
889
890
  }
@@ -902,8 +903,8 @@
902
903
  margin-inline: -4px;
903
904
  padding-inline: 4px;
904
905
  color: var(--qc-text-primary);
905
- /* The study rows are their own stack over the plot, not part of the header band, so they take the
906
- * ordinary weight rather than the header's. */
906
+ /* The indicator rows are their own stack over the plot, not part of the header band, so they take
907
+ * the ordinary weight rather than the header's. */
907
908
  font-weight: 400;
908
909
  border-radius: 4px;
909
910
  pointer-events: auto;
@@ -997,7 +998,7 @@
997
998
  height: 14px;
998
999
  }
999
1000
 
1000
- /* A compare's own name is a door to symbol search, so it is a button. It reads as text and takes
1001
+ /* A comparison's own name is a door to symbol search, so it is a button. It reads as text and takes
1001
1002
  * the same wash box the market's name does, never a rule under the words. */
1002
1003
  [data-qc-theme] .qc-legend-title {
1003
1004
  width: auto;
@@ -1017,7 +1018,7 @@
1017
1018
  height: 18px;
1018
1019
  }
1019
1020
 
1020
- /* The rows' own toggler, standing under the stack. It carries the study/compare rows away and
1021
+ /* The rows' own toggler, standing under the stack. It carries the indicator/compare rows away and
1021
1022
  * leaves the identity and the reading in place. Its box is set here, AFTER the shared action
1022
1023
  * recipe, because it is the one action that is not a row control and does not take that geometry. */
1023
1024
  [data-qc-theme] .qc-legend-collapse {
@@ -1064,7 +1065,7 @@
1064
1065
  /* The drawing toolbar, the selected drawing's surfaces and their fields are recipes of their own
1065
1066
  * under styles/components/drawings-*.css, which the build concatenates after this file. */
1066
1067
 
1067
- /* Level menu ----------------------------------------------------------------------------------- */
1068
+ /* Context menu --------------------------------------------------------------------------------- */
1068
1069
 
1069
1070
  [data-qc-theme] .qc-menu-backdrop {
1070
1071
  position: fixed;
@@ -1084,7 +1085,7 @@
1084
1085
  pointer-events: auto;
1085
1086
  }
1086
1087
 
1087
- /* The level menu's rows restate the row rhythm: 32px tall, square-cornered and running edge to
1088
+ /* The context menu's rows restate the row rhythm: 32px tall, square-cornered and running edge to
1088
1089
  * edge of the box (the surface's clip rounds them off), the glyph 6px from the label and 20px of
1089
1090
  * room at the end for a chord. */
1090
1091
  [data-qc-theme] .qc-menu .qc-menu-row {
@@ -1389,11 +1390,11 @@
1389
1390
  * ancestor with a transform, a filter or containment changes nothing: a panel is positioned in the
1390
1391
  * root's own coordinates.
1391
1392
  *
1392
- * The chrome's stacking ladder, all inside the root: legend and rail 3, navigation 4,
1393
+ * The chrome's stacking ladder, all inside the root: legend and drawing toolbar 3, navigation 4,
1393
1394
  * the chart chrome layer 5, notices 6, the overlay layer 20, a menu panel 21, a dialog scrim 22.
1394
1395
  * The replay transport takes no rung: it is an in-flow row of the root's column, not a float.
1395
1396
  * The chart chrome layer is a stacking context of its own, and the drawing surfaces inside it
1396
- * keep their own rungs: the toolbar on the rail's 3, the floating bars 7, the inline text
1397
+ * keep their own rungs: the drawing toolbar on 3, the floating bars 7, the inline text
1397
1398
  * editor 8, a flyout or palette 9, a drawing dialog's scrim 10.
1398
1399
  * A host that must stack something above the widget gives its own element a stacking context
1399
1400
  * above the root; nothing here reaches the top of the integer range. */
@@ -1482,8 +1483,8 @@
1482
1483
  background: var(--qc-state-hover);
1483
1484
  }
1484
1485
 
1485
- /* A chosen interval or a held toggle takes the pressed fill, a step past hover; a door whose menu is
1486
- * open fills its whole cell, square, in the hover fill. */
1486
+ /* A chosen timeframe or a held toggle takes the pressed fill, a step past hover; a door whose menu
1487
+ * is open fills its whole cell, square, in the hover fill. */
1487
1488
  [data-qc-theme] .qc-toolbar-button[aria-pressed='true'],
1488
1489
  [data-qc-theme] .qc-toolbar-button[aria-expanded='true'],
1489
1490
  [data-qc-theme] .qc-toolbar-button[data-qc-active='true'] {
@@ -1507,7 +1508,7 @@
1507
1508
  }
1508
1509
 
1509
1510
  /* A HELD MODE is not a chosen option. A chip chosen among its siblings takes the quiet pressed
1510
- * wash above; a mode the chart is IN until the trader leaves it says so the way this product says
1511
+ * wash above; a mode the chart is IN until the viewer leaves it says so the way this product says
1511
1512
  * "on" everywhere else, in the emphasis fill with the ink cut out of it. */
1512
1513
  [data-qc-theme] .qc-toolbar-button[data-qc-mode='held'][aria-pressed='true'] {
1513
1514
  color: var(--qc-text-inverse);
@@ -2002,7 +2003,7 @@
2002
2003
 
2003
2004
  /* The settings field primitives: rows, checkbox rows, selects, number fields with their steppers,
2004
2005
  * swatches and the palette, the custom color panel, the opacity slider, line-end pickers, the
2005
- * dialog tab strip and the interval-visibility rows. Every color a control paints with is either
2006
+ * dialog tab strip and the timeframe-visibility rows. Every color a control paints with is either
2006
2007
  * a generated custom property or the drawing's own value, carried in `--qcd-swatch`. */
2007
2008
 
2008
2009
  [data-qc-theme] .qc-drawing-row {
@@ -2445,7 +2446,7 @@
2445
2446
  }
2446
2447
 
2447
2448
  /* The readout is a FIELD beside the track: outlined rather than washed, because it is a number a
2448
- * trader types over and not a chip the panel is showing them. */
2449
+ * viewer types over and not a chip the panel is showing them. */
2449
2450
  [data-qc-theme] .qc-drawing-opacity-field {
2450
2451
  position: relative;
2451
2452
  flex: 0 0 auto;
@@ -2849,7 +2850,7 @@
2849
2850
  }
2850
2851
 
2851
2852
  /* The bar's menus: a 4px-padded column of 34px rows, sized by content, or 240px wide for the
2852
- * templates, More and interval lists, or 176px for the stacking moves. */
2853
+ * templates, More and timeframe lists, or 176px for the stacking moves. */
2853
2854
  [data-qc-theme] .qc-drawing-bar-menu {
2854
2855
  min-width: 0;
2855
2856
  width: max-content;
@@ -3028,12 +3029,12 @@
3028
3029
  white-space: nowrap;
3029
3030
  }
3030
3031
 
3031
- /* The drawing toolbar: the rail down the chart's inline-start edge, its split cells, its flyouts
3032
+ /* The drawing toolbar: the column down the chart's inline-start edge, its split cells, its flyouts
3032
3033
  * and menus, and the favorites bar. Every rule is scoped to the widget root like the rest of the
3033
3034
  * package stylesheet, every value comes from a generated custom property, and geometry is stated
3034
- * with logical properties so the rail flips with the reading direction.
3035
+ * with logical properties so the toolbar flips with the reading direction.
3035
3036
  *
3036
- * The chrome layer is inert. The rail is a surface the pointer must stop at, so it opts in as a
3037
+ * The chrome layer is inert. The toolbar is a surface the pointer must stop at, so it opts in as a
3037
3038
  * whole; the gaps between its buttons must not let a drag through to the canvas underneath. */
3038
3039
 
3039
3040
  [data-qc-theme].qc-drawing-toolbar-host {
@@ -3062,7 +3063,7 @@
3062
3063
  pointer-events: auto;
3063
3064
  }
3064
3065
 
3065
- /* The chart and its overlays share a reserved content box. Only the rail reaches back into the
3066
+ /* The chart and its overlays share a reserved content box. Only the toolbar reaches back into the
3066
3067
  * leading column, so axis labels and drawing coordinates never pass underneath its buttons. */
3067
3068
  [data-qc-theme] .qc-chrome[data-qc-drawing-toolbar='true'] .qc-drawing-toolbar {
3068
3069
  inset-inline-start: -52px;
@@ -3102,7 +3103,7 @@
3102
3103
  width: 100%;
3103
3104
  }
3104
3105
 
3105
- [data-qc-theme] .qc-drawing-rail-button {
3106
+ [data-qc-theme] .qc-drawing-toolbar-button {
3106
3107
  position: relative;
3107
3108
  z-index: 0;
3108
3109
  display: flex;
@@ -3117,8 +3118,8 @@
3117
3118
  border-radius: var(--qc-chrome-radius);
3118
3119
  }
3119
3120
 
3120
- /* Keep the full rail as the hit area; the inset square is only its visual feedback. */
3121
- [data-qc-theme] .qc-drawing-rail-button::before {
3121
+ /* Keep the full toolbar width as the hit area; the inset square is only its visual feedback. */
3122
+ [data-qc-theme] .qc-drawing-toolbar-button::before {
3122
3123
  position: absolute;
3123
3124
  z-index: -1;
3124
3125
  inset-block-start: 50%;
@@ -3132,64 +3133,64 @@
3132
3133
  transition: background-color var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
3133
3134
  }
3134
3135
 
3135
- [data-qc-theme] .qc-drawing-rail-button:hover,
3136
- [data-qc-theme] .qc-drawing-rail-button:active,
3137
- [data-qc-theme] .qc-drawing-rail-button:focus-visible {
3136
+ [data-qc-theme] .qc-drawing-toolbar-button:hover,
3137
+ [data-qc-theme] .qc-drawing-toolbar-button:active,
3138
+ [data-qc-theme] .qc-drawing-toolbar-button:focus-visible {
3138
3139
  color: var(--qc-text-primary);
3139
3140
  background: none;
3140
3141
  }
3141
3142
 
3142
3143
  /* The tool's inset square and the arrow's strip share the hover fill, so where they meet no seam
3143
3144
  * forms. */
3144
- [data-qc-theme] .qc-drawing-rail-button:hover::before,
3145
- [data-qc-theme] .qc-drawing-rail-button:focus-visible::before,
3146
- [data-qc-theme] .qc-drawing-rail-button:active::before {
3145
+ [data-qc-theme] .qc-drawing-toolbar-button:hover::before,
3146
+ [data-qc-theme] .qc-drawing-toolbar-button:focus-visible::before,
3147
+ [data-qc-theme] .qc-drawing-toolbar-button:active::before {
3147
3148
  background: var(--qc-state-hover);
3148
3149
  }
3149
3150
 
3150
- [data-qc-theme] .qc-drawing-rail-button[data-qc-active='true'] {
3151
+ [data-qc-theme] .qc-drawing-toolbar-button[data-qc-active='true'] {
3151
3152
  color: var(--qc-text-primary);
3152
3153
  background: none;
3153
3154
  }
3154
3155
 
3155
- /* The armed tool wears a NEUTRAL inset wash and the primary ink, the pinned rail recipe. The
3156
- * accent-tinted selected role belongs to a chosen row, not to a tool the rail is holding. */
3157
- [data-qc-theme] .qc-drawing-rail-button[data-qc-active='true']::before {
3156
+ /* The armed tool wears a NEUTRAL inset wash and the primary ink, the pinned toolbar recipe. The
3157
+ * accent-tinted selected role belongs to a chosen row, not to a tool the toolbar is holding. */
3158
+ [data-qc-theme] .qc-drawing-toolbar-button[data-qc-active='true']::before {
3158
3159
  background: var(--qc-state-pressed);
3159
3160
  }
3160
3161
 
3161
- [data-qc-theme] .qc-drawing-rail-button[data-qc-active='true']:hover::before {
3162
+ [data-qc-theme] .qc-drawing-toolbar-button[data-qc-active='true']:hover::before {
3162
3163
  background: var(--qc-state-pressedHover);
3163
3164
  }
3164
3165
 
3165
- /* A mode the rail holds, staying in drawing mode or showing the favorites bar, inverts: the on fill
3166
- * behind the inverse ink, a step apart under the pointer. */
3167
- [data-qc-theme] .qc-drawing-rail-mode[data-qc-active='true'] {
3166
+ /* A mode the toolbar holds, staying in drawing mode or showing the favorites bar, inverts: the on
3167
+ * fill behind the inverse ink, a step apart under the pointer. */
3168
+ [data-qc-theme] .qc-drawing-toolbar-mode[data-qc-active='true'] {
3168
3169
  color: var(--qc-text-inverse);
3169
3170
  }
3170
3171
 
3171
- [data-qc-theme] .qc-drawing-rail-mode[data-qc-active='true']::before {
3172
+ [data-qc-theme] .qc-drawing-toolbar-mode[data-qc-active='true']::before {
3172
3173
  background: var(--qc-control-on);
3173
3174
  }
3174
3175
 
3175
- [data-qc-theme] .qc-drawing-rail-mode[data-qc-active='true']:hover::before {
3176
+ [data-qc-theme] .qc-drawing-toolbar-mode[data-qc-active='true']:hover::before {
3176
3177
  background: var(--qc-control-onHover);
3177
3178
  }
3178
3179
 
3179
- [data-qc-theme] .qc-drawing-rail-button:focus-visible {
3180
+ [data-qc-theme] .qc-drawing-toolbar-button:focus-visible {
3180
3181
  outline-offset: -3px;
3181
3182
  }
3182
3183
 
3183
- [data-qc-theme] .qc-drawing-rail-button[disabled] {
3184
+ [data-qc-theme] .qc-drawing-toolbar-button[disabled] {
3184
3185
  color: var(--qc-text-disabled);
3185
3186
  background: none;
3186
3187
  }
3187
3188
 
3188
- [data-qc-theme] .qc-drawing-rail-button[disabled]::before {
3189
+ [data-qc-theme] .qc-drawing-toolbar-button[disabled]::before {
3189
3190
  background: none;
3190
3191
  }
3191
3192
 
3192
- [data-qc-theme] .qc-drawing-rail-arrow {
3193
+ [data-qc-theme] .qc-drawing-toolbar-arrow {
3193
3194
  position: absolute;
3194
3195
  inset-block: 2px;
3195
3196
  inset-inline-end: 0;
@@ -3202,7 +3203,7 @@
3202
3203
  color: var(--qc-chrome-caret);
3203
3204
  background: none;
3204
3205
  border: 0;
3205
- /* Rounded on the inboard side only. The strip ends flush against the rail's own edge, so a
3206
+ /* Rounded on the inboard side only. The strip ends flush against the toolbar's own edge, so a
3206
3207
  * radius there would round a corner that has nothing to round away from. */
3207
3208
  border-start-start-radius: 4px;
3208
3209
  border-end-start-radius: 4px;
@@ -3213,40 +3214,40 @@
3213
3214
  }
3214
3215
 
3215
3216
  /* The chevron turns to face the panel: pointing out at where the flyout will appear while closed,
3216
- * back at the rail once it is open. */
3217
- [data-qc-theme] .qc-drawing-rail-arrow svg {
3217
+ * back at the toolbar once it is open. */
3218
+ [data-qc-theme] .qc-drawing-toolbar-arrow svg {
3218
3219
  transition: transform var(--qc-motion-durationSlower) var(--qc-motion-easingSpring);
3219
3220
  }
3220
3221
 
3221
- [data-qc-theme] .qc-drawing-rail-arrow[aria-expanded='true'] svg {
3222
+ [data-qc-theme] .qc-drawing-toolbar-arrow[aria-expanded='true'] svg {
3222
3223
  transform: rotate(180deg);
3223
3224
  }
3224
3225
 
3225
- [data-qc-theme] [dir='rtl'] .qc-drawing-rail-arrow svg,
3226
- [data-qc-theme][dir='rtl'] .qc-drawing-rail-arrow svg {
3226
+ [data-qc-theme] [dir='rtl'] .qc-drawing-toolbar-arrow svg,
3227
+ [data-qc-theme][dir='rtl'] .qc-drawing-toolbar-arrow svg {
3227
3228
  transform: scaleX(-1);
3228
3229
  }
3229
3230
 
3230
- [data-qc-theme] [dir='rtl'] .qc-drawing-rail-arrow[aria-expanded='true'] svg,
3231
- [data-qc-theme][dir='rtl'] .qc-drawing-rail-arrow[aria-expanded='true'] svg {
3231
+ [data-qc-theme] [dir='rtl'] .qc-drawing-toolbar-arrow[aria-expanded='true'] svg,
3232
+ [data-qc-theme][dir='rtl'] .qc-drawing-toolbar-arrow[aria-expanded='true'] svg {
3232
3233
  transform: scaleX(-1) rotate(180deg);
3233
3234
  }
3234
3235
 
3235
- [data-qc-theme] .qc-drawing-cell:hover .qc-drawing-rail-arrow,
3236
- [data-qc-theme] .qc-drawing-rail-arrow:focus-visible,
3237
- [data-qc-theme] .qc-drawing-rail-arrow[aria-expanded='true'] {
3236
+ [data-qc-theme] .qc-drawing-cell:hover .qc-drawing-toolbar-arrow,
3237
+ [data-qc-theme] .qc-drawing-toolbar-arrow:focus-visible,
3238
+ [data-qc-theme] .qc-drawing-toolbar-arrow[aria-expanded='true'] {
3238
3239
  opacity: 1;
3239
3240
  }
3240
3241
 
3241
3242
  /* The arrow keeps its caret ink; its strip takes the hover fill under the pointer and while its
3242
3243
  * flyout is open. */
3243
- [data-qc-theme] .qc-drawing-rail-arrow:hover,
3244
- [data-qc-theme] .qc-drawing-rail-arrow[aria-expanded='true'] {
3244
+ [data-qc-theme] .qc-drawing-toolbar-arrow:hover,
3245
+ [data-qc-theme] .qc-drawing-toolbar-arrow[aria-expanded='true'] {
3245
3246
  background: var(--qc-state-hover);
3246
3247
  }
3247
3248
 
3248
- /* Three rules, three recipes. The RAIL's spans 36px of the rail with 6px above and below. A tool
3249
- * flyout's section rule and a menu's rule span the content area inside the panel's 6px side
3249
+ /* Three rules, three recipes. The TOOLBAR's spans 36px of the toolbar with 6px above and below. A
3250
+ * tool flyout's section rule and a menu's rule span the content area inside the panel's 6px side
3250
3251
  * padding, with 6px above and below. */
3251
3252
  [data-qc-theme] .qc-drawing-divider {
3252
3253
  flex: 0 0 auto;
@@ -3535,14 +3536,14 @@
3535
3536
  cursor: grabbing;
3536
3537
  }
3537
3538
 
3538
- /* Forced colors: a row or tab the trader has chosen reads as the system highlight, since the
3539
+ /* Forced colors: a row or tab the viewer has chosen reads as the system highlight, since the
3539
3540
  * accent fill it wears otherwise is discarded. */
3540
3541
  @media (forced-colors: active) {
3541
- [data-qc-theme] .qc-drawing-rail-button[data-qc-active='true'] {
3542
+ [data-qc-theme] .qc-drawing-toolbar-button[data-qc-active='true'] {
3542
3543
  color: HighlightText;
3543
3544
  }
3544
3545
 
3545
- [data-qc-theme] .qc-drawing-rail-button[data-qc-active='true']::before,
3546
+ [data-qc-theme] .qc-drawing-toolbar-button[data-qc-active='true']::before,
3546
3547
  [data-qc-theme] .qc-drawing-favorite[data-qc-active='true']::before {
3547
3548
  background: Highlight;
3548
3549
  forced-color-adjust: none;
@@ -3565,7 +3566,7 @@
3565
3566
  }
3566
3567
  }
3567
3568
 
3568
- /* The historical indicator browser, rendered by the product with product tokens. */
3569
+ /* The indicator picker, drawn with the chart's own tokens. */
3569
3570
  [data-qc-theme] .qc-picker-dialog {
3570
3571
  height: 638px;
3571
3572
  max-height: min(85vh, calc(100% - 32px));
@@ -3833,7 +3834,7 @@
3833
3834
  So the rail lies DOWN. It becomes a row of chips above the list, scrolling sideways the way every
3834
3835
  other run of choices on a phone does, and the table sheds the columns a phone has no room to
3835
3836
  spend: the author and the count go, the star and the actions stay, and the name takes what is
3836
- left. The GROUP headings go with the rail's column — "Personal" over "Community" reads as
3837
+ left. The GROUP headings go with the rail's column — "Saved" over "Shared" reads as
3837
3838
  structure in a list and as noise in a row, and the chips say what they are. */
3838
3839
  @media (max-width: 560px) {
3839
3840
  [data-qc-theme] .qc-picker-body {
@@ -4449,8 +4450,8 @@
4449
4450
  * scrim left every surface beside it live: a press on the page's own header landed on that header
4450
4451
  * instead of dismissing the dialog, so the one gesture every modal answers to did nothing over most
4451
4452
  * of the screen. Fixed, a press anywhere outside the box closes it, which is what `aria-modal` on
4452
- * the box already promises. The z-index is the level-menu's, for the same reason it is: nothing the
4453
- * host stacks above its own page may paint over a surface that has taken the keyboard. */
4453
+ * the box already promises. The z-index is the context menu's, for the same reason it is: nothing
4454
+ * the host stacks above its own page may paint over a surface that has taken the keyboard. */
4454
4455
  [data-qc-theme] .qc-dialog-scrim {
4455
4456
  position: fixed;
4456
4457
  inset: 0;
@@ -4470,7 +4471,7 @@
4470
4471
  font-size: var(--qc-text-fontSizeBase);
4471
4472
  }
4472
4473
 
4473
- /* The modal motion, for a dialog that opens and closes with it (the scrim carries `data-state`):
4474
+ /* The modal motion, which every modal dialog opens and closes with (its scrim carries `data-state`):
4474
4475
  * the backdrop fades in, and the box fades in and grows from the entrance scale, over one duration.
4475
4476
  * Closing runs the same motion in reverse. Under a reduced-motion preference the duration is zero,
4476
4477
  * so both are instant. */
@@ -4672,7 +4673,7 @@
4672
4673
  *
4673
4674
  * The row is in the root's own flow and positions nothing: it reserves 49px of the column between
4674
4675
  * the charts grid and the bottom range and timezone band (a 48px row under the pane's own hairline),
4675
- * so the plot and the time axis stay unobscured and the drawing rail keeps its column beside it.
4676
+ * so the plot and the time axis stay unobscured and the drawing toolbar keeps its column beside it.
4676
4677
  * Entry reserves that height and exit returns it. Everything inside is placed by the strip's logical
4677
4678
  * grid, so a right-to-left chart mirrors without a transform, and a long translation scrolls the
4678
4679
  * strip rather than overlapping a neighbour. */
@@ -4765,7 +4766,7 @@
4765
4766
  }
4766
4767
 
4767
4768
  [data-qc-theme] .qc-replay-speed,
4768
- [data-qc-theme] .qc-replay-interval {
4769
+ [data-qc-theme] .qc-replay-timeframe {
4769
4770
  justify-content: center;
4770
4771
  min-width: 38px;
4771
4772
  font-variant-numeric: tabular-nums;
@@ -4833,8 +4834,8 @@
4833
4834
  padding-inline: 12px 10px;
4834
4835
  }
4835
4836
 
4836
- /* The starting points carry the same 28-grid marks the rail does, so the gutter is the mark's own
4837
- * width; a list whose rows carry no mark keeps no gutter for one. */
4837
+ /* The starting points carry the same 28-grid marks the drawing toolbar does, so the gutter is the
4838
+ * mark's own width; a list whose rows carry no mark keeps no gutter for one. */
4838
4839
  [data-qc-theme] .qc-replay-menu .qc-menu-icon {
4839
4840
  flex: 0 0 28px;
4840
4841
  width: 28px;
@@ -5360,8 +5361,8 @@
5360
5361
  white-space: nowrap;
5361
5362
  }
5362
5363
 
5363
- /* The source cell: what kind of market a row is and where its data comes from, then the venue's
5364
- * mark, set against the row's end. */
5364
+ /* The source cell: what kind of market a row is and where its data comes from, then the mark of
5365
+ * the venue or the data source, set against the row's end. */
5365
5366
  [data-qc-theme] .qc-search-source {
5366
5367
  display: inline-flex;
5367
5368
  flex: 0 0 auto;
@@ -5370,7 +5371,7 @@
5370
5371
  padding-inline-end: 20px;
5371
5372
  }
5372
5373
 
5373
- [data-qc-theme] .qc-search-venue {
5374
+ [data-qc-theme] .qc-search-source-name {
5374
5375
  color: var(--qc-text-primary);
5375
5376
  font-size: var(--qc-text-fontSizeBase);
5376
5377
  line-height: 21px;
@@ -5384,8 +5385,8 @@
5384
5385
  }
5385
5386
 
5386
5387
  /* The source's mark: an 18px disc in a 20px cell. The package ships no brand artwork and fetches
5387
- * none: a host paints the venue's own mark, or a provider's, and without one the source is written
5388
- * in the one letter it is known by on the neutral fill. */
5388
+ * none: a host paints the venue's own mark, or a data source's, and without one the source is
5389
+ * written in the one letter it is known by on the neutral fill. */
5389
5390
  [data-qc-theme] .qc-search-mark {
5390
5391
  display: inline-flex;
5391
5392
  flex: 0 0 auto;
@@ -5402,8 +5403,8 @@
5402
5403
  border-radius: 50%;
5403
5404
  }
5404
5405
 
5405
- /* A host's venue or provider mark IS the disc: the package's ground stands down under it, and the
5406
- * artwork fills the round box. */
5406
+ /* A host's venue or data source mark IS the disc: the package's ground stands down under it, and
5407
+ * the artwork fills the round box. */
5407
5408
  [data-qc-theme] .qc-search-mark[data-qc-host='true'] {
5408
5409
  background: none;
5409
5410
  }
@@ -5461,11 +5462,11 @@
5461
5462
  line-height: 21px;
5462
5463
  }
5463
5464
 
5464
- [data-qc-theme] .qc-search-table .qc-search-venue {
5465
+ [data-qc-theme] .qc-search-table .qc-search-source-name {
5465
5466
  margin-inline-end: 8px;
5466
5467
  }
5467
5468
 
5468
- /* COMPARE stacks the ticker over its description and the venue over the kind, on 52px rows, and
5469
+ /* COMPARE stacks the ticker over its description and the source over the kind, on 52px rows, and
5469
5470
  * keeps 6px of air at the list's two ends. */
5470
5471
  [data-qc-theme] .qc-search-dialog--compare .qc-search-row {
5471
5472
  height: 52px;
@@ -5634,8 +5635,8 @@
5634
5635
  font-size: var(--qc-text-fontSizeSmall);
5635
5636
  }
5636
5637
 
5637
- /* Chart settings follows the same centered, two-column layout as TradingView: a fixed title and
5638
- * footer around a section rail and one roomy settings page. */
5638
+ /* Chart settings is a centered, two-column dialog: a fixed title and footer around a section rail
5639
+ * and one roomy settings page. */
5639
5640
  [data-qc-theme] .qc-chart-settings-dialog {
5640
5641
  box-sizing: border-box;
5641
5642
  height: min(612px, calc(100vh - 32px));
@@ -5763,8 +5764,8 @@
5763
5764
  border-radius: 4px;
5764
5765
  }
5765
5766
 
5766
- /* TradingView uses compact square checks in this dialog. Keep the existing accessible switch role
5767
- * while painting it as the same control and placing it before the label. */
5767
+ /* This dialog paints its switches as compact square checks before the label, and each keeps the
5768
+ * accessible switch role. */
5768
5769
  [data-qc-theme] .qc-settings-menu .qc-switch-row {
5769
5770
  display: flex;
5770
5771
  flex-direction: row-reverse;
@@ -53,7 +53,7 @@ interface DrawingGroup {
53
53
  members: readonly string[];
54
54
  }
55
55
  /** A deletion, kept. A document that listed only what survives lets a concurrent save, a reconnect
56
- * or a reload resurrect what the trader deleted: the other side still holds the row and a merge
56
+ * or a reload resurrect what the viewer deleted: the other side still holds the row and a merge
57
57
  * takes it back. A tombstone says the deletion happened, and at which document revision, so the
58
58
  * merge drops it instead. */
59
59
  interface DrawingTombstone {
@@ -188,9 +188,9 @@ interface LayoutBody {
188
188
  interface DrawingsMeta extends ResourceRef {
189
189
  updatedAt: number;
190
190
  }
191
- type TemplateKind = 'study' | 'drawing' | 'palette';
191
+ type TemplateKind = 'indicator' | 'drawing' | 'palette';
192
192
  /** A named template's listing row. `tool` scopes DRAWING templates to their tool (a trend-line
193
- * template is meaningless on a rectangle); study and palette templates carry no tool. */
193
+ * template is meaningless on a rectangle); indicator and palette templates carry no tool. */
194
194
  interface TemplateMeta extends ResourceRef {
195
195
  name: string;
196
196
  tool?: string;
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "Quick Charts saved resources",
5
- "version": "1",
5
+ "version": "2",
6
6
  "description": "The service contract behind `createRestSaveLoadAdapter` from `@trdrs/quickcharts/adapters/rest`. Every path is relative to the base URL the host configures. Authorization, cookies, CORS, retries and tenancy belong to the host request function, so no path, header or field here carries a credential. Saved charts, layouts, drawing documents and templates share one revisioned rule: a read answers the ref a row stands at, a write quotes that revision in `If-Match`, and a write against a revision the service has moved past answers 409 with the ref that stands."
7
7
  },
8
8
  "servers": [
@@ -852,12 +852,12 @@
852
852
  "schema": {
853
853
  "type": "string",
854
854
  "enum": [
855
- "study",
855
+ "indicator",
856
856
  "drawing",
857
857
  "palette"
858
858
  ]
859
859
  },
860
- "description": "Which template collection: appearance palettes, indicator studies, or drawings."
860
+ "description": "Which template collection: appearance palettes, indicator settings, or drawings."
861
861
  }
862
862
  ],
863
863
  "responses": {
@@ -886,12 +886,12 @@
886
886
  "schema": {
887
887
  "type": "string",
888
888
  "enum": [
889
- "study",
889
+ "indicator",
890
890
  "drawing",
891
891
  "palette"
892
892
  ]
893
893
  },
894
- "description": "Which template collection: appearance palettes, indicator studies, or drawings."
894
+ "description": "Which template collection: appearance palettes, indicator settings, or drawings."
895
895
  }
896
896
  ],
897
897
  "requestBody": {
@@ -952,12 +952,12 @@
952
952
  "schema": {
953
953
  "type": "string",
954
954
  "enum": [
955
- "study",
955
+ "indicator",
956
956
  "drawing",
957
957
  "palette"
958
958
  ]
959
959
  },
960
- "description": "Which template collection: appearance palettes, indicator studies, or drawings."
960
+ "description": "Which template collection: appearance palettes, indicator settings, or drawings."
961
961
  },
962
962
  {
963
963
  "name": "id",
@@ -1004,12 +1004,12 @@
1004
1004
  "schema": {
1005
1005
  "type": "string",
1006
1006
  "enum": [
1007
- "study",
1007
+ "indicator",
1008
1008
  "drawing",
1009
1009
  "palette"
1010
1010
  ]
1011
1011
  },
1012
- "description": "Which template collection: appearance palettes, indicator studies, or drawings."
1012
+ "description": "Which template collection: appearance palettes, indicator settings, or drawings."
1013
1013
  },
1014
1014
  {
1015
1015
  "name": "id",
@@ -1095,12 +1095,12 @@
1095
1095
  "schema": {
1096
1096
  "type": "string",
1097
1097
  "enum": [
1098
- "study",
1098
+ "indicator",
1099
1099
  "drawing",
1100
1100
  "palette"
1101
1101
  ]
1102
1102
  },
1103
- "description": "Which template collection: appearance palettes, indicator studies, or drawings."
1103
+ "description": "Which template collection: appearance palettes, indicator settings, or drawings."
1104
1104
  },
1105
1105
  {
1106
1106
  "name": "id",