@trdrs/quickcharts 4.0.0 → 5.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 (105) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/README.md +325 -79
  3. package/dist/adapters/rest.d.ts +4 -4
  4. package/dist/adapters/rest.js +1 -1
  5. package/dist/adapters/rest.js.map +1 -1
  6. package/dist/ar-TG26ZCCE.js +1322 -0
  7. package/dist/ar-TG26ZCCE.js.map +1 -0
  8. package/dist/{assets-Gg-UquDA.d.ts → assets-DF3nozNV.d.ts} +167 -18
  9. package/dist/ca_ES-WJWH5BXU.js +1322 -0
  10. package/dist/ca_ES-WJWH5BXU.js.map +1 -0
  11. package/dist/{chunk-D3S26ARP.js → chunk-EXJAJZTN.js} +1 -1
  12. package/dist/chunk-EXJAJZTN.js.map +1 -0
  13. package/dist/{chunk-C4MEVUNK.js → chunk-Q3DCXQDW.js} +992 -284
  14. package/dist/chunk-Q3DCXQDW.js.map +1 -0
  15. package/dist/de-SUDTTPQ3.js +1322 -0
  16. package/dist/de-SUDTTPQ3.js.map +1 -0
  17. package/dist/drawings.d.ts +18 -7
  18. package/dist/drawings.js +7 -1
  19. package/dist/es-FOBXUK2X.js +1322 -0
  20. package/dist/es-FOBXUK2X.js.map +1 -0
  21. package/dist/feature-manifest.json +105 -9
  22. package/dist/fr-7KQC4IJH.js +1322 -0
  23. package/dist/fr-7KQC4IJH.js.map +1 -0
  24. package/dist/he_IL-2T6XBA6D.js +1322 -0
  25. package/dist/he_IL-2T6XBA6D.js.map +1 -0
  26. package/dist/id_ID-SI25N57C.js +1322 -0
  27. package/dist/id_ID-SI25N57C.js.map +1 -0
  28. package/dist/index.d.ts +952 -176
  29. package/dist/index.js +11905 -7472
  30. package/dist/index.js.map +1 -1
  31. package/dist/it-PMSTWZDL.js +1322 -0
  32. package/dist/it-PMSTWZDL.js.map +1 -0
  33. package/dist/ja-PABDRAXV.js +1322 -0
  34. package/dist/ja-PABDRAXV.js.map +1 -0
  35. package/dist/ko-JHRYYFCV.js +1322 -0
  36. package/dist/ko-JHRYYFCV.js.map +1 -0
  37. package/dist/ms_MY-U4EE5Q4V.js +1322 -0
  38. package/dist/ms_MY-U4EE5Q4V.js.map +1 -0
  39. package/dist/pl-4HCG3T3J.js +1322 -0
  40. package/dist/pl-4HCG3T3J.js.map +1 -0
  41. package/dist/pt-6LTNN653.js +1322 -0
  42. package/dist/pt-6LTNN653.js.map +1 -0
  43. package/dist/quickcharts.css +627 -208
  44. package/dist/{resources-Le6flcEn.d.ts → resources-XglhzzW0.d.ts} +5 -3
  45. package/dist/rest-openapi.json +16 -11
  46. package/dist/ru-LFHCSDBV.js +1322 -0
  47. package/dist/ru-LFHCSDBV.js.map +1 -0
  48. package/dist/sv-4XVUXYK6.js +1322 -0
  49. package/dist/sv-4XVUXYK6.js.map +1 -0
  50. package/dist/{symbols-6V22WaRX.d.ts → symbols-DdHLHQFC.d.ts} +77 -8
  51. package/dist/symbols.d.ts +1 -1
  52. package/dist/th-WM2PVA24.js +1322 -0
  53. package/dist/th-WM2PVA24.js.map +1 -0
  54. package/dist/theme-manifest.json +105 -21
  55. package/dist/tr-HMAZXSJM.js +1322 -0
  56. package/dist/tr-HMAZXSJM.js.map +1 -0
  57. package/dist/vi-ITFBV5B7.js +1322 -0
  58. package/dist/vi-ITFBV5B7.js.map +1 -0
  59. package/dist/zh-ZGU2RI7K.js +1322 -0
  60. package/dist/zh-ZGU2RI7K.js.map +1 -0
  61. package/dist/zh_TW-PNINSQ6F.js +1322 -0
  62. package/dist/zh_TW-PNINSQ6F.js.map +1 -0
  63. package/package.json +1 -1
  64. package/dist/ar-FXZ5QJUR.js +0 -1178
  65. package/dist/ar-FXZ5QJUR.js.map +0 -1
  66. package/dist/ca_ES-3WVKFBIF.js +0 -1178
  67. package/dist/ca_ES-3WVKFBIF.js.map +0 -1
  68. package/dist/chunk-C4MEVUNK.js.map +0 -1
  69. package/dist/chunk-D3S26ARP.js.map +0 -1
  70. package/dist/de-V72Q3OI7.js +0 -1178
  71. package/dist/de-V72Q3OI7.js.map +0 -1
  72. package/dist/es-CNQ3OJ6E.js +0 -1178
  73. package/dist/es-CNQ3OJ6E.js.map +0 -1
  74. package/dist/fr-5WQBCGR4.js +0 -1178
  75. package/dist/fr-5WQBCGR4.js.map +0 -1
  76. package/dist/he_IL-WXKA77UE.js +0 -1178
  77. package/dist/he_IL-WXKA77UE.js.map +0 -1
  78. package/dist/id_ID-XPBAYSWK.js +0 -1178
  79. package/dist/id_ID-XPBAYSWK.js.map +0 -1
  80. package/dist/it-DR2EBNWX.js +0 -1178
  81. package/dist/it-DR2EBNWX.js.map +0 -1
  82. package/dist/ja-URB2CPXO.js +0 -1178
  83. package/dist/ja-URB2CPXO.js.map +0 -1
  84. package/dist/ko-OE47NYVP.js +0 -1178
  85. package/dist/ko-OE47NYVP.js.map +0 -1
  86. package/dist/ms_MY-BKCFRK2K.js +0 -1178
  87. package/dist/ms_MY-BKCFRK2K.js.map +0 -1
  88. package/dist/pl-3IKQRG3Y.js +0 -1178
  89. package/dist/pl-3IKQRG3Y.js.map +0 -1
  90. package/dist/pt-PZHV5EZE.js +0 -1178
  91. package/dist/pt-PZHV5EZE.js.map +0 -1
  92. package/dist/ru-BAL6RQUV.js +0 -1178
  93. package/dist/ru-BAL6RQUV.js.map +0 -1
  94. package/dist/sv-Y6GBGDHM.js +0 -1178
  95. package/dist/sv-Y6GBGDHM.js.map +0 -1
  96. package/dist/th-MAMLMZKU.js +0 -1178
  97. package/dist/th-MAMLMZKU.js.map +0 -1
  98. package/dist/tr-3LQHINUZ.js +0 -1178
  99. package/dist/tr-3LQHINUZ.js.map +0 -1
  100. package/dist/vi-GR4PSDKP.js +0 -1178
  101. package/dist/vi-GR4PSDKP.js.map +0 -1
  102. package/dist/zh-2RJ5VNAI.js +0 -1178
  103. package/dist/zh-2RJ5VNAI.js.map +0 -1
  104. package/dist/zh_TW-XEBSACHU.js +0 -1178
  105. package/dist/zh_TW-XEBSACHU.js.map +0 -1
@@ -12,6 +12,7 @@
12
12
  [data-qc-theme="light"] {
13
13
  --qc-canvas-background: #ffffff;
14
14
  --qc-canvas-paneBorder: #ebebeb;
15
+ --qc-canvas-watermark: rgba(80, 83, 94, 0.2);
15
16
  --qc-chrome-border: #ebebeb;
16
17
  --qc-chrome-borderStrong: #8c8c8c;
17
18
  --qc-chrome-caret: #707070;
@@ -40,6 +41,8 @@
40
41
  --qc-control-onPressed: #707070;
41
42
  --qc-control-outline: #2e2e2e;
42
43
  --qc-control-selectEdgeHover: #a8a8a8;
44
+ --qc-control-tipMark: #a8a8a8;
45
+ --qc-control-tipMarkHover: #707070;
43
46
  --qc-drawing-fill: rgba(41, 98, 255, 0.15);
44
47
  --qc-drawing-handle: #ffffff;
45
48
  --qc-drawing-line: #2962ff;
@@ -64,17 +67,19 @@
64
67
  --qc-overlay-separator: #ebebeb;
65
68
  --qc-overlay-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
66
69
  --qc-overlay-surface: #ffffff;
70
+ --qc-overlay-tooltip: #3d3d3d;
71
+ --qc-overlay-tooltipInk: #f2f2f2;
67
72
  --qc-scale-background: #ffffff;
68
- --qc-scale-border: #e0e3eb;
69
- --qc-scale-crosshair: #9598a1;
70
- --qc-scale-crosshairLabelBackground: #131722;
73
+ --qc-scale-border: rgba(46, 46, 46, 0);
74
+ --qc-scale-crosshair: #9c9c9c;
75
+ --qc-scale-crosshairLabelBackground: #0f0f0f;
71
76
  --qc-scale-crosshairLabelText: #ffffff;
72
- --qc-scale-grid: rgba(0, 0, 0, 0.06);
73
- --qc-scale-sessionAfterHours: rgba(245, 166, 35, 0.06);
77
+ --qc-scale-grid: rgba(46, 46, 46, 0.2);
78
+ --qc-scale-sessionAfterHours: rgba(41, 98, 255, 0.08);
74
79
  --qc-scale-sessionClosed: rgba(0, 0, 0, 0.05);
75
- --qc-scale-sessionExtended: rgba(76, 152, 251, 0.06);
76
- --qc-scale-sessionPreMarket: rgba(76, 152, 251, 0.06);
77
- --qc-scale-text: #5b616e;
80
+ --qc-scale-sessionExtended: rgba(213, 0, 249, 0.08);
81
+ --qc-scale-sessionPreMarket: rgba(255, 152, 0, 0.08);
82
+ --qc-scale-text: #0f0f0f;
78
83
  --qc-series-down: #f23645;
79
84
  --qc-series-neutral: #787b86;
80
85
  --qc-series-up: #089981;
@@ -97,6 +102,7 @@
97
102
  --qc-status-sessionOpen: #22c55e;
98
103
  --qc-status-sessionPreMarket: #4c98fb;
99
104
  --qc-status-warning: #ac6600;
105
+ --qc-text-caption: #707070;
100
106
  --qc-text-disabled: #b8b8b8;
101
107
  --qc-text-fontFamily: -apple-system, BlinkMacSystemFont, "Trebuchet MS", Roboto, Ubuntu, sans-serif;
102
108
  --qc-text-fontSizeAxis: 13px;
@@ -116,6 +122,7 @@
116
122
  [data-qc-theme="dark"] {
117
123
  --qc-canvas-background: #0f0f0f;
118
124
  --qc-canvas-paneBorder: #2e2e2e;
125
+ --qc-canvas-watermark: rgba(80, 83, 94, 0.3);
119
126
  --qc-chrome-border: #2e2e2e;
120
127
  --qc-chrome-borderStrong: #707070;
121
128
  --qc-chrome-caret: #8c8c8c;
@@ -144,6 +151,8 @@
144
151
  --qc-control-onPressed: #8c8c8c;
145
152
  --qc-control-outline: #ffffff;
146
153
  --qc-control-selectEdgeHover: #808080;
154
+ --qc-control-tipMark: #575757;
155
+ --qc-control-tipMarkHover: #8c8c8c;
147
156
  --qc-drawing-fill: rgba(41, 98, 255, 0.15);
148
157
  --qc-drawing-handle: #0f0f0f;
149
158
  --qc-drawing-line: #2962ff;
@@ -168,17 +177,19 @@
168
177
  --qc-overlay-separator: #4a4a4a;
169
178
  --qc-overlay-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
170
179
  --qc-overlay-surface: #1f1f1f;
180
+ --qc-overlay-tooltip: #3d3d3d;
181
+ --qc-overlay-tooltipInk: #f2f2f2;
171
182
  --qc-scale-background: #0f0f0f;
172
- --qc-scale-border: #2a2e39;
173
- --qc-scale-crosshair: #758696;
174
- --qc-scale-crosshairLabelBackground: #dbdbdb;
175
- --qc-scale-crosshairLabelText: #0f0f0f;
176
- --qc-scale-grid: rgba(255, 255, 255, 0.035);
177
- --qc-scale-sessionAfterHours: rgba(245, 166, 35, 0.045);
183
+ --qc-scale-border: rgba(242, 242, 242, 0);
184
+ --qc-scale-crosshair: #9c9c9c;
185
+ --qc-scale-crosshairLabelBackground: #3d3d3d;
186
+ --qc-scale-crosshairLabelText: #ffffff;
187
+ --qc-scale-grid: rgba(242, 242, 242, 0.2);
188
+ --qc-scale-sessionAfterHours: rgba(41, 98, 255, 0.08);
178
189
  --qc-scale-sessionClosed: rgba(0, 0, 0, 0.22);
179
- --qc-scale-sessionExtended: rgba(76, 152, 251, 0.05);
180
- --qc-scale-sessionPreMarket: rgba(76, 152, 251, 0.05);
181
- --qc-scale-text: #9aa0aa;
190
+ --qc-scale-sessionExtended: rgba(213, 0, 249, 0.08);
191
+ --qc-scale-sessionPreMarket: rgba(255, 152, 0, 0.08);
192
+ --qc-scale-text: #b8b8b8;
182
193
  --qc-series-down: #f23645;
183
194
  --qc-series-neutral: #787b86;
184
195
  --qc-series-up: #089981;
@@ -201,6 +212,7 @@
201
212
  --qc-status-sessionOpen: #22c55e;
202
213
  --qc-status-sessionPreMarket: #4c98fb;
203
214
  --qc-status-warning: #ff9800;
215
+ --qc-text-caption: #8c8c8c;
204
216
  --qc-text-disabled: #575757;
205
217
  --qc-text-fontFamily: -apple-system, BlinkMacSystemFont, "Trebuchet MS", Roboto, Ubuntu, sans-serif;
206
218
  --qc-text-fontSizeAxis: 13px;
@@ -249,12 +261,35 @@
249
261
  * each chrome surface keeps its own recipes beside it.
250
262
  */
251
263
 
264
+ /* The root states every inherited value the chart's measurements are built on: its box model, its
265
+ * font and size, and the line height, weight, spacing, alignment and wrapping its words are set in.
266
+ * The widget's root and its layer on the document body both carry it. The dialogs, menus and panels
267
+ * on that layer stand inside the page's body, which would hand them whatever the page sets there (a
268
+ * line height, a weight, letter spacing); stated here, none of it reaches anything the chart draws. */
252
269
  [data-qc-theme] {
253
270
  position: relative;
254
271
  box-sizing: border-box;
255
272
  color: var(--qc-text-primary);
256
273
  font-family: var(--qc-text-fontFamily);
257
274
  font-size: var(--qc-text-fontSizeBase);
275
+ font-style: normal;
276
+ font-weight: 400;
277
+ font-stretch: normal;
278
+ font-variant: normal;
279
+ font-feature-settings: normal;
280
+ font-variation-settings: normal;
281
+ font-kerning: auto;
282
+ line-height: normal;
283
+ letter-spacing: normal;
284
+ word-spacing: normal;
285
+ text-align: start;
286
+ text-indent: 0;
287
+ text-transform: none;
288
+ text-rendering: auto;
289
+ white-space: normal;
290
+ word-break: normal;
291
+ overflow-wrap: normal;
292
+ hyphens: manual;
258
293
  background: var(--qc-canvas-background);
259
294
  }
260
295
 
@@ -796,9 +831,11 @@
796
831
 
797
832
  /* Legend --------------------------------------------------------------------------------------- */
798
833
 
834
+ /* The legend stands 4px into the main pane, which the chart writes the top of as
835
+ * `--qcd-legend-top` once a viewer has moved it below another pane. */
799
836
  [data-qc-theme] .qc-legend {
800
837
  position: absolute;
801
- top: 4px;
838
+ top: calc(4px + var(--qcd-legend-top, 0px));
802
839
  inset-inline-end: 64px;
803
840
  z-index: 3;
804
841
  display: flex;
@@ -835,6 +872,10 @@
835
872
  padding-inline: 4px;
836
873
  border-radius: 4px;
837
874
  pointer-events: auto;
875
+ /* The status line's backdrop: a plain fill of the chart's background at the setting's opacity,
876
+ * which the chart writes on the legend, so the bars under each part stand back. Unwritten, the
877
+ * legend stands on the bars. The reading and the indicator rows take the same fill. */
878
+ background-color: var(--qcd-legend-backdrop);
838
879
  }
839
880
 
840
881
  /* A band under the pointer reads as one solid chip over the candles: the canvas' own fill, so the
@@ -922,6 +963,7 @@
922
963
  font-size: var(--qc-text-fontSizeAxis);
923
964
  font-weight: 400;
924
965
  font-variant-numeric: tabular-nums;
966
+ background-color: var(--qcd-legend-backdrop);
925
967
  }
926
968
 
927
969
  [data-qc-theme] .qc-legend-ohlc {
@@ -970,6 +1012,55 @@
970
1012
  color: var(--qc-text-primary);
971
1013
  }
972
1014
 
1015
+ /* The bar's volume after its change: the quiet mark, then the number in the direction's ink. */
1016
+ [data-qc-theme] .qc-legend-volume {
1017
+ display: inline-flex;
1018
+ align-items: center;
1019
+ }
1020
+
1021
+ [data-qc-theme] .qc-legend-volume > .qc-legend-mark {
1022
+ color: var(--qc-text-muted);
1023
+ margin-inline-end: 4px;
1024
+ }
1025
+
1026
+ [data-qc-theme] .qc-legend-quote[data-qc-direction='up'] .qc-legend-volume > :last-child {
1027
+ color: var(--qc-status-positive);
1028
+ }
1029
+
1030
+ [data-qc-theme] .qc-legend-quote[data-qc-direction='down'] .qc-legend-volume > :last-child {
1031
+ color: var(--qc-status-negative);
1032
+ }
1033
+
1034
+ /* The rows extensions place in the legend, under the reading and above the indicator rows, at the
1035
+ * header's own inset. The element in each is the extension's and takes the pointer; the slot
1036
+ * wears the status line's backdrop, as the legend's own parts do. */
1037
+ [data-qc-theme] .qc-legend-slots {
1038
+ display: flex;
1039
+ flex-direction: column;
1040
+ align-items: flex-start;
1041
+ padding-inline-start: 9px;
1042
+ pointer-events: none;
1043
+ }
1044
+
1045
+ [data-qc-theme] .qc-legend-slot {
1046
+ pointer-events: auto;
1047
+ background-color: var(--qcd-legend-backdrop);
1048
+ }
1049
+
1050
+ /* The change since the previous session's close, last in the reading, in its own direction's ink
1051
+ * rather than the read bar's. */
1052
+ [data-qc-theme] .qc-legend-day-change {
1053
+ color: var(--qc-text-primary);
1054
+ }
1055
+
1056
+ [data-qc-theme] .qc-legend-day-change[data-qc-tone='up'] {
1057
+ color: var(--qc-status-positive);
1058
+ }
1059
+
1060
+ [data-qc-theme] .qc-legend-day-change[data-qc-tone='down'] {
1061
+ color: var(--qc-status-negative);
1062
+ }
1063
+
973
1064
  [data-qc-theme] .qc-legend-rows {
974
1065
  /* Rows hug their own content: the chip a hovered row takes must be the width of the row, not
975
1066
  * of the chart. They start at the same 9px inset the header does. */
@@ -1051,6 +1142,7 @@
1051
1142
  font-weight: 400;
1052
1143
  border-radius: 4px;
1053
1144
  pointer-events: auto;
1145
+ background-color: var(--qcd-legend-backdrop);
1054
1146
  }
1055
1147
 
1056
1148
  /* The same chip the identity band takes, on the same terms. */
@@ -1263,6 +1355,19 @@
1263
1355
  margin: 6px 0;
1264
1356
  }
1265
1357
 
1358
+ /* The price menu the scale's plus opens: the context menu's box as wide as its widest row, so a
1359
+ * label shows whole and ellipsizes only where the viewport cannot hold its row. A shortcut stands
1360
+ * 10px after its label, in 12px. */
1361
+ [data-qc-theme] .qc-menu.qc-price-menu {
1362
+ width: max-content;
1363
+ max-width: calc(100vw - 16px);
1364
+ }
1365
+
1366
+ [data-qc-theme] .qc-menu.qc-price-menu .qc-menu-hint {
1367
+ padding-inline: 4px 0;
1368
+ font-size: 12px;
1369
+ }
1370
+
1266
1371
  /* Indicator inputs ----------------------------------------------------------------------------- */
1267
1372
 
1268
1373
  [data-qc-theme] .qc-inputs {
@@ -1491,6 +1596,7 @@
1491
1596
  }
1492
1597
 
1493
1598
  [data-qc-theme] .qc-nav[data-qc-near],
1599
+ [data-qc-theme] .qc-nav[data-qc-visibility='always'],
1494
1600
  [data-qc-theme] .qc-nav:hover,
1495
1601
  [data-qc-theme] .qc-nav:focus-within {
1496
1602
  opacity: 1;
@@ -1544,8 +1650,8 @@
1544
1650
  * the chart chrome layer 5, notices 6, the overlay layer 20, a menu panel 21, a dialog scrim 22.
1545
1651
  * The replay transport takes no rung: it is an in-flow row of the root's column, not a float.
1546
1652
  * The chart chrome layer is a stacking context of its own, and the drawing surfaces inside it
1547
- * keep their own rungs: the drawing toolbar on 3, the floating bars 7, the inline text
1548
- * editor 8, a flyout or palette 9, a drawing dialog's scrim 10.
1653
+ * keep their own rungs: the drawing toolbar on 3, a time-scale mark's tooltip 6, the floating
1654
+ * bars 7, the inline text editor 8, a flyout or palette 9, a drawing dialog's scrim 10.
1549
1655
  * A host that must stack something above the widget gives its own element a stacking context
1550
1656
  * above the root; nothing here reaches the top of the integer range. */
1551
1657
  [data-qc-theme] .qc-overlays {
@@ -1919,6 +2025,24 @@
1919
2025
  padding: 0 6px 6px;
1920
2026
  }
1921
2027
 
2028
+ /* A hovered time-scale mark's words: 13 on 18 on the tooltip fill, its foot 4px above the mark,
2029
+ * never taking the pointer, on the chart chrome layer's rung 6. */
2030
+ [data-qc-theme] .qc-chrome > .qc-mark-tooltip {
2031
+ position: absolute;
2032
+ z-index: 6;
2033
+ box-sizing: border-box;
2034
+ max-width: 310px;
2035
+ padding: 3px 8px;
2036
+ color: var(--qc-overlay-tooltipInk);
2037
+ font-size: 13px;
2038
+ line-height: 18px;
2039
+ white-space: pre-line;
2040
+ background: var(--qc-overlay-tooltip);
2041
+ border-radius: 2px;
2042
+ transform: translateY(-100%);
2043
+ pointer-events: none;
2044
+ }
2045
+
1922
2046
  /* The inline text editor over the pane, the glyph picker and the image picker. */
1923
2047
 
1924
2048
  /* The text editor over the pane. Its place, size and type are written by the editor, because they
@@ -2481,25 +2605,33 @@
2481
2605
  box-shadow: inset 0 0 0 1px var(--qc-state-focusRing);
2482
2606
  }
2483
2607
 
2484
- /* The palette is 224px wide inside 6px by 12px: a ten-wide grid of 17px cells, each carrying its own
2485
- * 3px gutter, in blocks that keep 6px under them (the greys and the ten hues; the six ramps; the
2486
- * colors this viewer mixed with the plus after them), a 1px rule 12px clear of the blocks either
2487
- * side, and the opacity under a 12px muted title. The blocks pull their outer gutters back off the
2488
- * padding, and the rule and the title stand clear by their own margins, which take a block's in. */
2608
+ /* The palette is 224px wide, 6px clear of what stands above and below it and 12px clear of either
2609
+ * side: a ten-wide grid of 17px cells, each carrying its own 3px gutter, in blocks that keep 6px
2610
+ * under them (the greys and the ten hues; the six ramps; the colors this viewer mixed with the plus
2611
+ * after them), a 1px rule 12px clear of the blocks either side, and the opacity under a 12px muted
2612
+ * title. The blocks pull their outer gutters back past the palette's sides, and the rule and the
2613
+ * title stand clear by their own margins, which take a block's in.
2614
+ *
2615
+ * The room either side is margin rather than padding, so the 224px is the palette's own box under
2616
+ * either box model. A page's unlayered rule outranks any box-sizing this layered sheet could state,
2617
+ * and a page that sizes every element by its border box would take padding out of the grid's 224px;
2618
+ * margin it leaves alone, so the palette, and every surface sized to what it holds around it, keeps
2619
+ * the whole grid. */
2489
2620
  [data-qc-theme] .qc-drawing-palette {
2490
- box-sizing: content-box;
2491
2621
  width: 224px;
2492
- padding: 6px 12px;
2622
+ margin-inline: 12px;
2623
+ padding-block: 6px;
2493
2624
  }
2494
2625
 
2495
2626
  /* A palette that is a popover's whole content keeps the popover column's 6px inside its own, and
2496
- * inside a panel that pads already, the palette pads the rest of the way rather than again. */
2627
+ * inside a panel that pads already, the palette stands the rest of the way in rather than again. */
2497
2628
  [data-qc-theme] .qc-drawing-popover > .qc-drawing-palette {
2498
- padding: 12px;
2629
+ padding-block: 12px;
2499
2630
  }
2500
2631
 
2501
2632
  [data-qc-theme] .qc-inline-panel .qc-drawing-palette {
2502
- padding: 6px;
2633
+ margin-inline: 6px;
2634
+ padding-block: 6px;
2503
2635
  }
2504
2636
 
2505
2637
  [data-qc-theme] .qc-drawing-swatches {
@@ -5454,6 +5586,16 @@
5454
5586
  background: transparent;
5455
5587
  }
5456
5588
 
5589
+ /* A dialog the chart stays live behind lets the pointer through its backdrop: only the box and what
5590
+ * it raises over the backdrop (its lists, popovers and tips) take the pointer. */
5591
+ [data-qc-theme] .qc-dialog-scrim[data-qc-pass='true'] {
5592
+ pointer-events: none;
5593
+ }
5594
+
5595
+ [data-qc-theme] .qc-dialog-scrim[data-qc-pass='true'] > * {
5596
+ pointer-events: auto;
5597
+ }
5598
+
5457
5599
  [data-qc-theme] .qc-dialog {
5458
5600
  display: flex;
5459
5601
  flex-direction: column;
@@ -6317,6 +6459,124 @@
6317
6459
  }
6318
6460
  }
6319
6461
 
6462
+ /* The controls that stand on the main price scale, over the renderer's own drawing of it. The chart
6463
+ * places each over the scale's box as it measures it and writes `--qcd-chart-background`, the
6464
+ * chart's own background, which each control stands on. */
6465
+
6466
+ /* The auto-scale and logarithmic buttons at the foot of the scale: two 20x22 buttons 4px apart, a
6467
+ * letter each. Off, a button is a 1px outline on the chart's background; on, it is a held mode,
6468
+ * filled in the emphasis fill a checked box wears with its letter in the inverse ink. */
6469
+ [data-qc-theme] .qc-scale-modes {
6470
+ position: absolute;
6471
+ z-index: 4;
6472
+ display: flex;
6473
+ gap: 4px;
6474
+ pointer-events: auto;
6475
+ }
6476
+
6477
+ [data-qc-theme] .qc-scale-mode {
6478
+ box-sizing: border-box;
6479
+ display: inline-flex;
6480
+ width: 20px;
6481
+ height: 22px;
6482
+ align-items: center;
6483
+ justify-content: center;
6484
+ padding: 0;
6485
+ font: inherit;
6486
+ font-size: 12px;
6487
+ line-height: 1;
6488
+ color: var(--qc-text-primary);
6489
+ background: var(--qcd-chart-background, var(--qc-canvas-background));
6490
+ border: 1px solid var(--qc-overlay-separator);
6491
+ border-radius: 4px;
6492
+ cursor: pointer;
6493
+ }
6494
+
6495
+ [data-qc-theme] .qc-scale-mode:hover {
6496
+ background: var(--qc-state-hover);
6497
+ }
6498
+
6499
+ [data-qc-theme] .qc-scale-mode[aria-pressed='true'] {
6500
+ color: var(--qc-text-inverse);
6501
+ background: var(--qc-control-on);
6502
+ border-color: var(--qc-control-on);
6503
+ }
6504
+
6505
+ /* The box at the top of the scale naming what its prices are in: at least 64x26, four pixels in from
6506
+ * the scale's top and its side away from the plot, on the chart's background inside a 1px border
6507
+ * with a radius of 4, in 12px text. It takes no pointer, so the scale under it still drags. */
6508
+ [data-qc-theme] .qc-scale-unit {
6509
+ position: absolute;
6510
+ z-index: 4;
6511
+ box-sizing: border-box;
6512
+ display: flex;
6513
+ min-width: 64px;
6514
+ height: 26px;
6515
+ align-items: center;
6516
+ justify-content: center;
6517
+ padding: 0 6px;
6518
+ font-size: 12px;
6519
+ font-weight: 400;
6520
+ line-height: 12px;
6521
+ white-space: nowrap;
6522
+ color: var(--qc-text-primary);
6523
+ background: var(--qcd-chart-background, var(--qc-canvas-background));
6524
+ border: 1px solid var(--qc-overlay-separator);
6525
+ border-radius: 4px;
6526
+ pointer-events: none;
6527
+ }
6528
+
6529
+ /* The plus beside the crosshair's price label is painted by the renderer with the label. Its button
6530
+ * stands over the painted box, at the size the chart writes: transparent, and taking no pointer, so
6531
+ * a pointer resting on the plus stays on the plot and keeps the crosshair. It carries the plus's
6532
+ * name and takes the keyboard. The chrome gives every button its pointer back, so this rule names
6533
+ * the chrome as well and outranks that one: a button that took the pointer here would take it off
6534
+ * the plot, the crosshair and the plus with it, and give it back once the plus was gone. */
6535
+ [data-qc-theme] .qc-chrome .qc-scale-plus {
6536
+ position: absolute;
6537
+ z-index: 4;
6538
+ box-sizing: border-box;
6539
+ padding: 0;
6540
+ background: none;
6541
+ border: 0;
6542
+ border-radius: 2px;
6543
+ pointer-events: none;
6544
+ }
6545
+
6546
+ /* The buttons at the top right of each pane, 4px below its top and 4px in from the plot's edge: 24px
6547
+ * rounded squares 4px apart, a 1px border on the chart's background, a 15px line glyph in the text
6548
+ * ink, the raised hover fill under the pointer. */
6549
+ [data-qc-theme] .qc-pane-buttons {
6550
+ position: absolute;
6551
+ z-index: 4;
6552
+ display: flex;
6553
+ gap: 4px;
6554
+ pointer-events: auto;
6555
+ }
6556
+
6557
+ [data-qc-theme] .qc-pane-button {
6558
+ box-sizing: border-box;
6559
+ display: inline-flex;
6560
+ width: 24px;
6561
+ height: 24px;
6562
+ align-items: center;
6563
+ justify-content: center;
6564
+ padding: 0;
6565
+ color: var(--qc-text-primary);
6566
+ background: var(--qcd-chart-background, var(--qc-canvas-background));
6567
+ border: 1px solid var(--qc-overlay-separator);
6568
+ border-radius: 4px;
6569
+ cursor: pointer;
6570
+ }
6571
+
6572
+ [data-qc-theme] .qc-pane-button:hover {
6573
+ background: var(--qc-state-hover);
6574
+ }
6575
+
6576
+ [data-qc-theme] .qc-pane-button[aria-pressed='true'] {
6577
+ background: var(--qc-state-pressed);
6578
+ }
6579
+
6320
6580
  /* The thin bar beside a list the viewer scrolls to find something: the search results, the
6321
6581
  * indicator list, the saved layouts, a menu's rows, a dialog's body. Five pixels wide with a 3px
6322
6582
  * thumb inside a transparent border, so it reads as a position marker rather than a control.
@@ -6974,12 +7234,16 @@
6974
7234
  font-size: var(--qc-text-fontSizeSmall);
6975
7235
  }
6976
7236
 
6977
- /* Chart settings is a centered, two-column dialog: a fixed title and footer around a section rail
6978
- * and one roomy settings page. */
6979
- [data-qc-theme] .qc-chart-settings-dialog {
7237
+ /* The chart settings dialog: a 750px card, as tall as the page it shows up to the viewport less
7238
+ * 40px, with the drawing dialogs' header and footer around a body of two columns: the rail of pages,
7239
+ * 226px with a 206px list 20px in, and the page beside it, which scrolls on its own. The page is the
7240
+ * drawing dialogs' settings grid; these rules add what the chart's settings rows carry beyond it:
7241
+ * checkbox rows with a hint or a tip, sub-rows, second lines of controls, the sliders and the tips. */
7242
+ [data-qc-theme] .qc-dialog.qc-chart-settings-dialog {
6980
7243
  box-sizing: border-box;
6981
- height: min(612px, calc(100vh - 32px));
6982
- max-height: min(612px, calc(100vh - 32px));
7244
+ min-width: min(610px, calc(100% - 16px));
7245
+ max-width: min(750px, calc(100% - 16px));
7246
+ max-height: calc(100% - 40px);
6983
7247
  color: var(--qc-text-primary);
6984
7248
  background: var(--qc-overlay-surface);
6985
7249
  border: 0;
@@ -6987,302 +7251,457 @@
6987
7251
  box-shadow: var(--qc-overlay-shadow);
6988
7252
  }
6989
7253
 
6990
- [data-qc-theme] .qc-chart-settings-dialog .qc-dialog-title {
6991
- box-sizing: border-box;
6992
- min-height: 64px;
6993
- padding: 0 14px 0 19px;
6994
- }
6995
-
6996
- [data-qc-theme] .qc-chart-settings-dialog .qc-dialog-title .qc-title {
6997
- font-size: 20px;
6998
- font-weight: 600;
6999
- line-height: 28px;
7254
+ /* The close: a 34px cell whose hover fill rounds 8px at the corners. */
7255
+ [data-qc-theme] .qc-chart-settings-dialog .qc-dialog-close {
7256
+ border-radius: 8px;
7000
7257
  }
7001
7258
 
7002
- [data-qc-theme] .qc-chart-settings-dialog .qc-dialog-close {
7003
- width: 40px;
7004
- height: 40px;
7005
- border: 0;
7259
+ [data-qc-theme] .qc-chart-settings-dialog .qc-dialog-close:hover {
7260
+ background: var(--qc-state-hover);
7006
7261
  }
7007
7262
 
7008
- [data-qc-theme] .qc-chart-settings-body {
7263
+ [data-qc-theme] .qc-chart-settings-dialog .qc-chart-settings-body {
7009
7264
  display: flex;
7010
7265
  flex: 1 1 auto;
7011
7266
  flex-direction: row;
7012
- gap: 0;
7013
7267
  min-height: 0;
7014
7268
  padding: 0;
7015
7269
  overflow: hidden;
7016
7270
  }
7017
7271
 
7272
+ /* The rail stands as tall as the page beside it and adds nothing to the body's height of its own, so
7273
+ * a page shorter than the rail's tabs leaves the rail to scroll. */
7018
7274
  [data-qc-theme] .qc-chart-settings-nav {
7019
7275
  display: flex;
7020
7276
  flex: 0 0 226px;
7021
7277
  flex-direction: column;
7022
- gap: 2px;
7023
7278
  box-sizing: border-box;
7024
- padding: 10px;
7025
- border-inline-end: 1px solid var(--qc-overlay-separator);
7279
+ width: 226px;
7280
+ padding: 8px 0 8px 20px;
7281
+ overflow-x: hidden;
7282
+ overflow-y: auto;
7283
+ contain: size;
7284
+ scrollbar-width: auto;
7285
+ }
7286
+
7287
+ [data-qc-theme] .qc-chart-settings-nav::-webkit-scrollbar {
7288
+ display: block;
7289
+ width: 5px;
7290
+ }
7291
+
7292
+ [data-qc-theme] .qc-chart-settings-nav::-webkit-scrollbar-thumb {
7293
+ border: 1px solid transparent;
7294
+ border-radius: 3px;
7295
+ background-color: var(--qc-chrome-scrollThumb);
7296
+ background-clip: content-box;
7297
+ }
7298
+
7299
+ [data-qc-theme] .qc-chart-settings-nav::-webkit-scrollbar-track {
7300
+ background-color: transparent;
7301
+ }
7302
+
7303
+ @supports (-moz-appearance: none) {
7304
+ [data-qc-theme] .qc-chart-settings-nav {
7305
+ scrollbar-width: thin;
7306
+ scrollbar-color: var(--qc-chrome-scrollThumb) transparent;
7307
+ }
7026
7308
  }
7027
7309
 
7310
+ /* A page's tab: 206 by 40 on an 8px corner, its 28px icon 12px in and its name 4px after it at 14 on
7311
+ * 18. The page shown and the tab under the pointer take the quiet fill and the strong ink; the page
7312
+ * shown is named in bold. */
7028
7313
  [data-qc-theme] .qc-chart-settings-nav-item {
7029
7314
  display: flex;
7030
- gap: 10px;
7315
+ flex: 0 0 40px;
7316
+ gap: 4px;
7031
7317
  align-items: center;
7032
- width: 100%;
7033
- min-height: 40px;
7034
- padding: 0 12px;
7035
- color: var(--qc-text-secondary);
7318
+ box-sizing: border-box;
7319
+ width: 206px;
7320
+ height: 40px;
7321
+ padding: 0 16px 0 12px;
7322
+ color: var(--qc-text-primary);
7036
7323
  font: inherit;
7037
7324
  font-size: 14px;
7325
+ font-weight: 400;
7326
+ line-height: 18px;
7038
7327
  text-align: start;
7039
7328
  background: transparent;
7040
7329
  border: 0;
7041
7330
  border-radius: 8px;
7331
+ outline-offset: -2px;
7042
7332
  cursor: pointer;
7043
7333
  }
7044
7334
 
7045
7335
  [data-qc-theme] .qc-chart-settings-nav-item:hover {
7046
- color: var(--qc-text-primary);
7336
+ color: var(--qc-control-neutralInk);
7047
7337
  background: var(--qc-state-hover);
7048
7338
  }
7049
7339
 
7050
7340
  [data-qc-theme] .qc-chart-settings-nav-item[aria-selected='true'] {
7051
- color: var(--qc-text-primary);
7341
+ color: var(--qc-control-neutralInk);
7052
7342
  font-weight: 600;
7053
- background: var(--qc-state-selected);
7343
+ background: var(--qc-control-neutral);
7054
7344
  }
7055
7345
 
7056
- [data-qc-theme] .qc-chart-settings-panel {
7346
+ [data-qc-theme] .qc-chart-settings-nav-icon {
7057
7347
  display: flex;
7348
+ flex: 0 0 28px;
7349
+ align-items: center;
7350
+ justify-content: center;
7351
+ width: 28px;
7352
+ height: 28px;
7353
+ }
7354
+
7355
+ [data-qc-theme] .qc-chart-settings-nav-label {
7356
+ min-width: 0;
7357
+ overflow: hidden;
7358
+ text-overflow: ellipsis;
7359
+ white-space: nowrap;
7360
+ }
7361
+
7362
+ /* The page: the settings grid 16px by 20px in, with 16px more under its last section. */
7363
+ [data-qc-theme] .qc-chart-settings-panel {
7058
7364
  flex: 1 1 auto;
7059
- flex-direction: column;
7365
+ align-content: start;
7060
7366
  min-width: 0;
7061
- padding: 13px 20px 26px;
7367
+ box-sizing: border-box;
7368
+ padding: 16px 20px 32px;
7369
+ overflow-x: hidden;
7062
7370
  overflow-y: auto;
7063
7371
  outline: none;
7064
7372
  }
7065
7373
 
7066
- [data-qc-theme] .qc-chart-settings-panel > .qc-menu-heading {
7067
- min-height: auto;
7068
- margin: 0 0 8px;
7069
- padding: 0;
7070
- color: var(--qc-text-muted);
7071
- font-size: 11px;
7374
+ /* A section heading: 11px capitals in the caption ink in a 32px row, 16px clear of the section before. */
7375
+ [data-qc-theme] .qc-chart-settings-panel > .qc-settings-heading {
7376
+ color: var(--qc-text-caption);
7072
7377
  font-weight: 400;
7073
- line-height: 24px;
7074
- letter-spacing: 0;
7075
7378
  }
7076
7379
 
7077
- [data-qc-theme] .qc-settings-menu .qc-settings-row {
7078
- display: grid;
7079
- grid-template-columns: minmax(150px, 1fr) auto;
7080
- gap: 16px;
7081
- min-height: 44px;
7082
- padding: 0;
7380
+ [data-qc-theme] .qc-chart-settings-panel > .qc-settings-heading:not(:first-child) {
7381
+ margin-top: 16px;
7083
7382
  }
7084
7383
 
7085
- [data-qc-theme] .qc-settings-menu .qc-settings-row .qc-field-label {
7086
- color: var(--qc-text-secondary);
7087
- font-size: 14px;
7384
+ /* A checkbox row across both columns: the box, its words 8px after it, a tip 8px after the words,
7385
+ * and a hint at 13 on 18 in the muted ink under the line, after which the next row stands 16px off. */
7386
+ [data-qc-theme] .qc-settings-check {
7387
+ box-sizing: border-box;
7388
+ min-height: 50px;
7389
+ padding: 8px 0;
7088
7390
  }
7089
7391
 
7090
- /* A color here keeps its swatch: a 38 by 34 box on the raised fill, its well 3px in from the edge on
7091
- * a corner that follows the box's. The edge, its step under the pointer and the focus ring are the
7092
- * field's own, and a well that cannot be used stands on the read-only fill as every field does. */
7093
- [data-qc-theme] .qc-settings-menu .qc-settings-row .qc-drawing-swatch-button {
7094
- box-sizing: border-box;
7095
- width: 38px;
7096
- height: 34px;
7097
- padding: 3px;
7392
+ [data-qc-theme] .qc-settings-check-line {
7393
+ display: flex;
7394
+ gap: 8px;
7395
+ align-items: center;
7396
+ min-height: 34px;
7098
7397
  }
7099
7398
 
7100
- [data-qc-theme] .qc-settings-menu .qc-settings-row .qc-drawing-swatch-button:enabled {
7101
- background: var(--qc-chrome-surfaceRaised);
7399
+ [data-qc-theme] .qc-settings-hint {
7400
+ color: var(--qc-text-caption);
7401
+ font-size: 13px;
7402
+ line-height: 18px;
7102
7403
  }
7103
7404
 
7104
- [data-qc-theme] .qc-settings-menu .qc-settings-row .qc-drawing-well {
7105
- width: 28px;
7106
- height: 26px;
7107
- border-radius: 4px;
7405
+ [data-qc-theme] .qc-settings-check[data-hint='true'],
7406
+ [data-qc-theme] .qc-settings-hint-row {
7407
+ margin-bottom: 16px;
7108
7408
  }
7109
7409
 
7110
- /* This dialog paints its switches as compact square checks before the label, and each keeps the
7111
- * accessible switch role. */
7112
- [data-qc-theme] .qc-settings-menu .qc-switch-row {
7410
+ [data-qc-theme] .qc-settings-hint-row {
7411
+ margin-top: -8px;
7412
+ }
7413
+
7414
+ /* A labelled row: its label cell stands its words, or its checkbox, level with the first line of
7415
+ * controls, and the controls' cell stacks its lines 8px apart. */
7416
+ [data-qc-theme] .qc-chart-settings-panel .qc-settings-label {
7417
+ gap: 8px;
7418
+ align-items: flex-start;
7419
+ }
7420
+
7421
+ [data-qc-theme] .qc-settings-label-text {
7113
7422
  display: flex;
7114
- flex-direction: row-reverse;
7115
- justify-content: flex-end;
7116
- gap: 10px;
7117
- min-height: 44px;
7118
- padding: 0;
7119
- color: var(--qc-text-secondary);
7120
- cursor: pointer;
7423
+ align-items: center;
7424
+ min-height: 34px;
7121
7425
  }
7122
7426
 
7123
- [data-qc-theme] .qc-settings-menu .qc-switch {
7124
- width: 18px;
7125
- height: 18px;
7126
- box-sizing: border-box;
7127
- background: transparent;
7128
- border: 1px solid var(--qc-control-on);
7129
- border-radius: 3px;
7427
+ [data-qc-theme] .qc-chart-settings-panel .qc-settings-controls {
7428
+ flex-direction: column;
7429
+ gap: 8px;
7430
+ align-items: flex-start;
7130
7431
  }
7131
7432
 
7132
- [data-qc-theme] .qc-settings-menu .qc-switch:hover:not([disabled]) {
7133
- background: var(--qc-state-hover);
7433
+ [data-qc-theme] .qc-settings-line {
7434
+ display: flex;
7435
+ gap: 8px;
7436
+ align-items: center;
7437
+ min-height: 34px;
7134
7438
  }
7135
7439
 
7136
- [data-qc-theme] .qc-settings-menu .qc-switch[aria-checked='true'] {
7137
- background: var(--qc-control-on);
7440
+ /* A sub-row stands its box 26px in, level with the words of the row above, and 8px closer to it. */
7441
+ [data-qc-theme] .qc-settings-check[data-indent='true'] {
7442
+ margin-top: -8px;
7443
+ padding-inline-start: 26px;
7138
7444
  }
7139
7445
 
7140
- [data-qc-theme] .qc-settings-menu .qc-switch-knob {
7141
- position: absolute;
7142
- top: 3px;
7143
- inset-inline-start: 6px;
7144
- width: 5px;
7145
- height: 9px;
7146
- box-sizing: border-box;
7147
- background: transparent;
7148
- border: solid var(--qc-control-mark);
7149
- border-width: 0 2px 2px 0;
7150
- border-radius: 0;
7151
- opacity: 0;
7152
- transform: rotate(45deg);
7153
- transition: opacity var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
7446
+ [data-qc-theme] .qc-settings-row[data-indent='true'] > * {
7447
+ margin-top: -8px;
7154
7448
  }
7155
7449
 
7156
- [data-qc-theme] .qc-settings-menu .qc-switch[aria-checked='true'] .qc-switch-knob {
7157
- inset-inline-start: 6px;
7158
- opacity: 1;
7450
+ [data-qc-theme] .qc-chart-settings-panel .qc-settings-row[data-indent='true'] > .qc-settings-label {
7451
+ padding-inline-start: 26px;
7159
7452
  }
7160
7453
 
7161
- [data-qc-theme] .qc-chart-settings-choices {
7162
- display: flex;
7163
- flex-direction: column;
7164
- gap: 2px;
7165
- width: min(100%, 360px);
7454
+ /* A row that cannot be used stands its words back with its box. */
7455
+ [data-qc-theme] [data-disabled='true'] > * > .qc-drawing-toggle > span,
7456
+ [data-qc-theme] [data-disabled='true'] > * > .qc-settings-label-text {
7457
+ opacity: 0.5;
7166
7458
  }
7167
7459
 
7168
- [data-qc-theme] .qc-chart-settings-choice {
7169
- display: flex;
7170
- gap: 10px;
7460
+ [data-qc-theme] [data-disabled='true'] > * > .qc-drawing-toggle {
7461
+ cursor: default;
7462
+ }
7463
+
7464
+ /* A tip's mark: 18px in the tip ink, which steps up under the pointer. */
7465
+ [data-qc-theme] .qc-settings-tip {
7466
+ display: inline-flex;
7467
+ flex: 0 0 18px;
7171
7468
  align-items: center;
7172
- min-height: 40px;
7173
- padding: 0 8px;
7174
- color: var(--qc-text-secondary);
7175
- font: inherit;
7176
- text-align: start;
7177
- background: transparent;
7469
+ justify-content: center;
7470
+ width: 18px;
7471
+ height: 18px;
7472
+ margin-block: 8px;
7473
+ padding: 0;
7474
+ color: var(--qc-control-tipMark);
7475
+ background: none;
7178
7476
  border: 0;
7179
- border-radius: 6px;
7477
+ border-radius: 50%;
7180
7478
  cursor: pointer;
7479
+ transition: color var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
7181
7480
  }
7182
7481
 
7183
- [data-qc-theme] .qc-chart-settings-choice:hover:not([disabled]) {
7184
- color: var(--qc-text-primary);
7185
- background: var(--qc-state-hover);
7482
+ [data-qc-theme] .qc-settings-tip:hover,
7483
+ [data-qc-theme] .qc-settings-tip[aria-expanded='true'] {
7484
+ color: var(--qc-control-tipMarkHover);
7186
7485
  }
7187
7486
 
7188
- [data-qc-theme] .qc-chart-settings-choice[disabled] {
7189
- color: var(--qc-text-disabled);
7190
- cursor: default;
7487
+ /* A tip's line: 13 on 18 on the tooltip fill, 4px above its mark, never taking the pointer. */
7488
+ [data-qc-theme] .qc-dialog-scrim > .qc-settings-tooltip {
7489
+ position: fixed;
7490
+ z-index: 10;
7491
+ box-sizing: border-box;
7492
+ max-width: 310px;
7493
+ padding: 3px 8px;
7494
+ color: var(--qc-overlay-tooltipInk);
7495
+ font-size: 13px;
7496
+ line-height: 18px;
7497
+ background: var(--qc-overlay-tooltip);
7498
+ border-radius: 2px;
7499
+ pointer-events: none;
7191
7500
  }
7192
7501
 
7193
- [data-qc-theme] .qc-chart-settings-radio {
7194
- position: relative;
7195
- flex: 0 0 auto;
7502
+ /* A tip's card: 352px on a 16px corner, 16px in, its title and its words at 16 on 24 and the link at
7503
+ * 14 on 18. */
7504
+ [data-qc-theme] .qc-drawing-popover.qc-settings-card-popover {
7196
7505
  box-sizing: border-box;
7197
- width: 18px;
7198
- height: 18px;
7199
- border: 1px solid var(--qc-control-on);
7200
- border-radius: 50%;
7506
+ width: 352px;
7507
+ padding: 16px;
7508
+ border-radius: 16px;
7201
7509
  }
7202
7510
 
7203
- [data-qc-theme] .qc-chart-settings-choice[aria-checked='true'] .qc-chart-settings-radio::after {
7204
- content: '';
7205
- position: absolute;
7206
- inset: 4px;
7207
- background: var(--qc-control-on);
7208
- border-radius: 50%;
7511
+ [data-qc-theme] .qc-settings-card-title {
7512
+ color: var(--qc-text-primary);
7513
+ font-size: 16px;
7514
+ font-weight: 600;
7515
+ line-height: 24px;
7209
7516
  }
7210
7517
 
7211
- [data-qc-theme] .qc-chart-settings-footer {
7212
- display: flex;
7213
- flex: 0 0 64px;
7518
+ [data-qc-theme] .qc-settings-card-body {
7519
+ color: var(--qc-text-primary);
7520
+ font-size: 16px;
7521
+ line-height: 24px;
7522
+ }
7523
+
7524
+ [data-qc-theme] .qc-settings-card-link {
7525
+ display: inline-block;
7526
+ margin-top: 8px;
7527
+ color: var(--qc-text-link);
7528
+ font-size: 14px;
7529
+ line-height: 18px;
7530
+ text-decoration: none;
7531
+ }
7532
+
7533
+ /* A color that follows the bars shows the bars' two colors, the up color in the top corner. */
7534
+ [data-qc-theme] .qc-drawing-swatch-button[data-qc-follows='true'] .qc-drawing-well-fill {
7535
+ background: linear-gradient(to bottom left, var(--qc-series-up) 50%, var(--qc-series-down) 50%);
7536
+ }
7537
+
7538
+ /* A line's thickness on its own: a 34px field wearing a 14px bar of the width. */
7539
+ [data-qc-theme] .qc-drawing-select--mark.qc-settings-width {
7540
+ width: 34px;
7541
+ }
7542
+
7543
+ [data-qc-theme] .qc-settings-width > .qc-drawing-thickness-bar {
7544
+ width: 14px;
7545
+ }
7546
+
7547
+ /* A number field and its unit, 9px after it. */
7548
+ [data-qc-theme] .qc-settings-number {
7549
+ display: inline-flex;
7550
+ gap: 9px;
7214
7551
  align-items: center;
7215
- justify-content: space-between;
7552
+ }
7553
+
7554
+ [data-qc-theme] .qc-settings-suffix {
7555
+ color: var(--qc-text-primary);
7556
+ font-size: 14px;
7557
+ line-height: 18px;
7558
+ }
7559
+
7560
+ /* The sliders. The opacity is a 148 by 10 track on a 5px corner that fades from nothing into its color
7561
+ * over the checked ground, inside a 1px edge of the color; the volume is a 136 by 6 track after its
7562
+ * 18px speaker, 8px apart, filled in the on ink up to its knob. Both knobs are the color popover's, a
7563
+ * 12px dark disc with a 2px light rim. Black and white are the poles of the value axis, not theme
7564
+ * roles. */
7565
+ [data-qc-theme] .qc-settings-slider {
7566
+ --qcd-angle-0: 0deg;
7567
+ --qcd-black: hsl(var(--qcd-angle-0) 0% 0%);
7568
+ --qcd-white: hsl(var(--qcd-angle-0) 0% 100%);
7569
+ --qcd-check-hue: 224deg;
7570
+ --qcd-check: hsl(var(--qcd-check-hue) 15% 19% / 0.4);
7571
+ --qcd-ground: var(--qcd-black);
7572
+ display: inline-flex;
7573
+ gap: 8px;
7574
+ align-items: center;
7575
+ min-height: 34px;
7576
+ }
7577
+
7578
+ [data-qc-theme='light'] .qc-settings-slider {
7579
+ --qcd-ground: var(--qcd-white);
7580
+ }
7581
+
7582
+ [data-qc-theme] .qc-settings-speaker {
7583
+ flex: 0 0 18px;
7584
+ color: var(--qc-text-primary);
7585
+ }
7586
+
7587
+ [data-qc-theme] .qc-settings-opacity,
7588
+ [data-qc-theme] .qc-settings-volume {
7216
7589
  box-sizing: border-box;
7217
- padding: 0 18px;
7218
- border-top: 1px solid var(--qc-overlay-separator);
7590
+ margin: 0;
7591
+ outline: none;
7592
+ cursor: pointer;
7593
+ appearance: none;
7219
7594
  }
7220
7595
 
7221
- [data-qc-theme] .qc-chart-settings-actions {
7222
- display: flex;
7223
- gap: 10px;
7596
+ [data-qc-theme] .qc-settings-opacity {
7597
+ flex: 0 0 148px;
7598
+ width: 148px;
7599
+ height: 10px;
7600
+ background:
7601
+ linear-gradient(to right, transparent, var(--qcd-swatch)),
7602
+ repeating-conic-gradient(from 270deg, var(--qcd-check) 0% 25%, transparent 0% 50%) 1px 50% / 8px 8px,
7603
+ var(--qcd-ground);
7604
+ border: 1px solid var(--qcd-swatch);
7605
+ border-radius: 5px;
7224
7606
  }
7225
7607
 
7226
- [data-qc-theme] .qc-chart-settings-footer .qc-button {
7227
- min-width: 62px;
7228
- height: 34px;
7229
- padding: 0 11px;
7230
- font-size: 14px;
7231
- line-height: 22px;
7608
+ [data-qc-theme] .qc-settings-volume {
7609
+ flex: 0 0 136px;
7610
+ width: 136px;
7611
+ height: 6px;
7612
+ background: linear-gradient(to right, var(--qc-control-on) var(--qcd-level), var(--qc-state-pressed) var(--qcd-level));
7613
+ border-radius: 5px;
7232
7614
  }
7233
7615
 
7234
- [data-qc-theme] .qc-chart-settings-footer .qc-chart-settings-reset {
7235
- min-width: 0;
7616
+ [data-qc-theme][dir='rtl'] .qc-settings-opacity,
7617
+ [data-qc-theme] [dir='rtl'] .qc-settings-opacity {
7618
+ background:
7619
+ linear-gradient(to left, transparent, var(--qcd-swatch)),
7620
+ repeating-conic-gradient(from 270deg, var(--qcd-check) 0% 25%, transparent 0% 50%) right 1px top 50% / 8px 8px,
7621
+ var(--qcd-ground);
7236
7622
  }
7237
7623
 
7238
- [data-qc-theme] .qc-chart-settings-cancel,
7239
- [data-qc-theme] .qc-chart-settings-ok {
7240
- min-width: 62px;
7624
+ [data-qc-theme][dir='rtl'] .qc-settings-volume,
7625
+ [data-qc-theme] [dir='rtl'] .qc-settings-volume {
7626
+ background: linear-gradient(to left, var(--qc-control-on) var(--qcd-level), var(--qc-state-pressed) var(--qcd-level));
7241
7627
  }
7242
7628
 
7243
- [data-qc-theme] .qc-chart-settings-nav {
7244
- scrollbar-width: none;
7629
+ [data-qc-theme] .qc-settings-opacity::-webkit-slider-thumb,
7630
+ [data-qc-theme] .qc-settings-volume::-webkit-slider-thumb {
7631
+ width: 12px;
7632
+ height: 12px;
7633
+ background: var(--qcd-black);
7634
+ border: 2px solid var(--qcd-white);
7635
+ border-radius: 50%;
7636
+ box-shadow: var(--qc-overlay-shadow);
7637
+ cursor: pointer;
7638
+ appearance: none;
7245
7639
  }
7246
7640
 
7247
- [data-qc-theme] .qc-chart-settings-nav::-webkit-scrollbar {
7248
- display: none;
7641
+ [data-qc-theme] .qc-settings-opacity::-moz-range-thumb,
7642
+ [data-qc-theme] .qc-settings-volume::-moz-range-thumb {
7643
+ box-sizing: border-box;
7644
+ width: 12px;
7645
+ height: 12px;
7646
+ background: var(--qcd-black);
7647
+ border: 2px solid var(--qcd-white);
7648
+ border-radius: 50%;
7649
+ box-shadow: var(--qc-overlay-shadow);
7650
+ cursor: pointer;
7651
+ }
7652
+
7653
+ [data-qc-theme] .qc-settings-opacity:focus-visible,
7654
+ [data-qc-theme] .qc-settings-volume:focus-visible {
7655
+ box-shadow: 0 0 0 2px var(--qc-state-focusRing);
7656
+ }
7657
+
7658
+ [data-qc-theme] .qc-settings-slider[data-disabled='true'] > * {
7659
+ opacity: 0.5;
7249
7660
  }
7250
7661
 
7662
+ [data-qc-theme] .qc-settings-slider[data-disabled='true'] > input {
7663
+ cursor: default;
7664
+ }
7665
+
7666
+ /* The footer keeps its height whatever the page above it holds. */
7667
+ [data-qc-theme] .qc-chart-settings-dialog > .qc-chart-settings-footer {
7668
+ flex: 0 0 auto;
7669
+ }
7670
+
7671
+ /* The footer's Template menu opens over its button, as wide as its words. */
7672
+ [data-qc-theme] .qc-chart-settings-template-menu {
7673
+ min-width: 0;
7674
+ }
7675
+
7676
+ /* A narrow layer stacks the rail over the page as a strip of tabs. */
7251
7677
  @media (max-width: 680px) {
7252
- [data-qc-theme] .qc-chart-settings-dialog {
7678
+ [data-qc-theme] .qc-dialog.qc-chart-settings-dialog {
7253
7679
  width: calc(100% - 20px) !important;
7254
- height: calc(100vh - 20px);
7680
+ min-width: 0;
7255
7681
  max-width: none;
7256
- max-height: none;
7257
7682
  }
7258
7683
 
7259
- [data-qc-theme] .qc-chart-settings-body {
7684
+ [data-qc-theme] .qc-chart-settings-dialog .qc-chart-settings-body {
7260
7685
  flex-direction: column;
7261
7686
  }
7262
7687
 
7263
7688
  [data-qc-theme] .qc-chart-settings-nav {
7264
7689
  flex: 0 0 auto;
7265
7690
  flex-direction: row;
7266
- gap: 4px;
7267
- padding: 6px 10px 8px;
7691
+ width: auto;
7692
+ padding: 0 10px 8px;
7268
7693
  overflow-x: auto;
7269
- border-inline-end: 0;
7270
- border-bottom: 1px solid var(--qc-overlay-separator);
7694
+ overflow-y: hidden;
7695
+ contain: none;
7271
7696
  }
7272
7697
 
7273
7698
  [data-qc-theme] .qc-chart-settings-nav-item {
7699
+ flex: 0 0 auto;
7274
7700
  width: auto;
7275
- min-width: max-content;
7276
- min-height: 36px;
7277
- padding: 0 10px;
7278
7701
  }
7279
7702
 
7280
7703
  [data-qc-theme] .qc-chart-settings-panel {
7281
- padding: 13px 16px 20px;
7282
- }
7283
-
7284
- [data-qc-theme] .qc-chart-settings-footer {
7285
- padding: 0 12px;
7704
+ padding: 16px;
7286
7705
  }
7287
7706
  }
7288
7707