@trdrs/quickcharts 1.1.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.
@@ -39,6 +39,14 @@
39
39
  --qc-illustration-ink: #1e222d;
40
40
  --qc-motion-durationBase: 150ms;
41
41
  --qc-motion-durationFast: 90ms;
42
+ --qc-motion-durationModerate: 250ms;
43
+ --qc-motion-durationSlow: 350ms;
44
+ --qc-motion-durationSlower: 500ms;
45
+ --qc-motion-easingLinear: linear;
46
+ --qc-motion-easingOut: ease-out;
47
+ --qc-motion-easingSpring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
48
+ --qc-motion-easingStandard: ease;
49
+ --qc-motion-scaleEnter: 0.97;
42
50
  --qc-overlay-scrim: rgba(0, 0, 0, 0.35);
43
51
  --qc-overlay-separator: #ebebeb;
44
52
  --qc-overlay-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
@@ -122,6 +130,14 @@
122
130
  --qc-illustration-ink: #d1d4dc;
123
131
  --qc-motion-durationBase: 150ms;
124
132
  --qc-motion-durationFast: 90ms;
133
+ --qc-motion-durationModerate: 250ms;
134
+ --qc-motion-durationSlow: 350ms;
135
+ --qc-motion-durationSlower: 500ms;
136
+ --qc-motion-easingLinear: linear;
137
+ --qc-motion-easingOut: ease-out;
138
+ --qc-motion-easingSpring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
139
+ --qc-motion-easingStandard: ease;
140
+ --qc-motion-scaleEnter: 0.97;
125
141
  --qc-overlay-scrim: rgba(0, 0, 0, 0.5);
126
142
  --qc-overlay-separator: #4a4a4a;
127
143
  --qc-overlay-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
@@ -174,6 +190,16 @@
174
190
  --qc-text-primary: #dbdbdb;
175
191
  --qc-text-secondary: #b8b8b8;
176
192
  }
193
+
194
+ @media (prefers-reduced-motion: reduce) {
195
+ [data-qc-theme] {
196
+ --qc-motion-durationBase: 0ms !important;
197
+ --qc-motion-durationFast: 0ms !important;
198
+ --qc-motion-durationModerate: 0ms !important;
199
+ --qc-motion-durationSlow: 0ms !important;
200
+ --qc-motion-durationSlower: 0ms !important;
201
+ }
202
+ }
177
203
  }
178
204
 
179
205
  @layer trdrs.chart {
@@ -249,7 +275,7 @@
249
275
  border: 1px solid var(--qc-chrome-border);
250
276
  border-radius: var(--qc-chrome-radius);
251
277
  cursor: pointer;
252
- transition: background-color var(--qc-motion-durationFast) linear, border-color var(--qc-motion-durationFast) linear;
278
+ transition: background-color var(--qc-motion-durationFast) var(--qc-motion-easingLinear), border-color var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
253
279
  }
254
280
 
255
281
  [data-qc-theme] .qc-button:hover {
@@ -375,7 +401,7 @@
375
401
  border: 0;
376
402
  border-radius: var(--qc-chrome-radius);
377
403
  cursor: pointer;
378
- transition: background-color var(--qc-motion-durationFast) linear;
404
+ transition: background-color var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
379
405
  }
380
406
 
381
407
  [data-qc-theme] .qc-menu-row:hover {
@@ -1139,13 +1165,8 @@
1139
1165
 
1140
1166
  /* Accessibility --------------------------------------------------------------------------------- */
1141
1167
 
1142
- @media (prefers-reduced-motion: reduce) {
1143
- [data-qc-theme] * {
1144
- transition-duration: 1ms !important;
1145
- animation-duration: 1ms !important;
1146
- animation-iteration-count: 1 !important;
1147
- }
1148
- }
1168
+ /* Every transition reads a motion duration role, and the generated tokens resolve each of them to
1169
+ * zero under a reduced-motion preference, so no recipe here repeats that rule. */
1149
1170
 
1150
1171
  @media (forced-colors: active) {
1151
1172
  [data-qc-theme] .qc-surface,
@@ -1219,6 +1240,17 @@
1219
1240
  font-variant-numeric: tabular-nums lining-nums;
1220
1241
  }
1221
1242
 
1243
+ /* With one zone offered the clock stands alone, in the trigger's own cell and inset. */
1244
+ [data-qc-theme] .qc-bottombar .qc-tz-clock {
1245
+ display: inline-flex;
1246
+ align-items: center;
1247
+ gap: 4px;
1248
+ height: 38px;
1249
+ padding: 0 6px;
1250
+ white-space: nowrap;
1251
+ font-variant-numeric: tabular-nums lining-nums;
1252
+ }
1253
+
1222
1254
  [data-qc-theme] .qc-clock {
1223
1255
  font-variant-numeric: tabular-nums;
1224
1256
  }
@@ -1304,7 +1336,7 @@
1304
1336
  transform: translateX(-50%);
1305
1337
  opacity: 0;
1306
1338
  pointer-events: auto;
1307
- transition: opacity var(--qc-motion-durationBase) linear;
1339
+ transition: opacity var(--qc-motion-durationBase) var(--qc-motion-easingLinear);
1308
1340
  }
1309
1341
 
1310
1342
  [data-qc-theme] .qc-nav[data-qc-near],
@@ -1438,7 +1470,7 @@
1438
1470
  inset: 2px;
1439
1471
  z-index: -1;
1440
1472
  border-radius: var(--qc-chrome-radius);
1441
- transition: background-color var(--qc-motion-durationFast) linear;
1473
+ transition: background-color var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
1442
1474
  }
1443
1475
 
1444
1476
  [data-qc-theme] .qc-toolbar-button:hover {
@@ -1499,11 +1531,11 @@
1499
1531
  * and neither bends the other, and each answers to its OWN button: a caret nested inside some other
1500
1532
  * open thing is not the thing that opened. */
1501
1533
  [data-qc-theme] .qc-caret {
1502
- transition: translate 350ms ease;
1534
+ transition: translate var(--qc-motion-durationSlow) var(--qc-motion-easingStandard);
1503
1535
  }
1504
1536
 
1505
1537
  [data-qc-theme] .qc-caret > svg {
1506
- transition: rotate 350ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
1538
+ transition: rotate var(--qc-motion-durationSlow) var(--qc-motion-easingSpring);
1507
1539
  }
1508
1540
 
1509
1541
  [data-qc-theme] .qc-toolbar-button:not([aria-expanded='true']):hover > .qc-caret {
@@ -1626,7 +1658,7 @@
1626
1658
  height: 14px;
1627
1659
  background: var(--qc-control-mark);
1628
1660
  border-radius: 50%;
1629
- transition: inset-inline-start 250ms ease-out;
1661
+ transition: inset-inline-start var(--qc-motion-durationModerate) var(--qc-motion-easingOut);
1630
1662
  }
1631
1663
 
1632
1664
  [data-qc-theme] .qc-switch[aria-checked='true'] .qc-switch-knob,
@@ -1650,7 +1682,7 @@
1650
1682
  border: 1px solid var(--qc-control-on);
1651
1683
  border-radius: 3px;
1652
1684
  cursor: pointer;
1653
- transition: background-color 350ms, border-color 350ms;
1685
+ transition: background-color var(--qc-motion-durationSlow) var(--qc-motion-easingStandard), border-color var(--qc-motion-durationSlow) var(--qc-motion-easingStandard);
1654
1686
  }
1655
1687
 
1656
1688
  [data-qc-theme] .qc-checkbox:checked {
@@ -2755,7 +2787,7 @@
2755
2787
  border-radius: var(--qc-chrome-radius);
2756
2788
  content: '';
2757
2789
  pointer-events: none;
2758
- transition: background-color var(--qc-motion-durationFast) linear;
2790
+ transition: background-color var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
2759
2791
  }
2760
2792
 
2761
2793
  [data-qc-theme] .qc-drawing-bar-wide {
@@ -2973,7 +3005,7 @@
2973
3005
 
2974
3006
  [data-qc-theme] .qc-drawing-caret {
2975
3007
  display: flex;
2976
- transition: transform var(--qc-motion-durationFast) linear;
3008
+ transition: transform var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
2977
3009
  }
2978
3010
 
2979
3011
  [data-qc-theme] .qc-drawing-template-button[aria-expanded='true'] .qc-drawing-caret {
@@ -3097,7 +3129,7 @@
3097
3129
  content: '';
3098
3130
  pointer-events: none;
3099
3131
  transform: translate(-50%, -50%);
3100
- transition: background-color var(--qc-motion-durationFast) linear;
3132
+ transition: background-color var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
3101
3133
  }
3102
3134
 
3103
3135
  [data-qc-theme] .qc-drawing-rail-button:hover,
@@ -3177,13 +3209,13 @@
3177
3209
  border-start-end-radius: 0;
3178
3210
  border-end-end-radius: 0;
3179
3211
  opacity: 0;
3180
- transition: opacity var(--qc-motion-durationFast) linear;
3212
+ transition: opacity var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
3181
3213
  }
3182
3214
 
3183
3215
  /* The chevron turns to face the panel: pointing out at where the flyout will appear while closed,
3184
3216
  * back at the rail once it is open. */
3185
3217
  [data-qc-theme] .qc-drawing-rail-arrow svg {
3186
- transition: transform 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
3218
+ transition: transform var(--qc-motion-durationSlower) var(--qc-motion-easingSpring);
3187
3219
  }
3188
3220
 
3189
3221
  [data-qc-theme] .qc-drawing-rail-arrow[aria-expanded='true'] svg {
@@ -3294,10 +3326,6 @@
3294
3326
  cursor: default;
3295
3327
  }
3296
3328
 
3297
- [data-qc-theme] .qc-drawing-menu-note {
3298
- padding: 8px 12px;
3299
- }
3300
-
3301
3329
  [data-qc-theme] .qc-drawing-menu .qc-separator {
3302
3330
  margin: 6px 0;
3303
3331
  }
@@ -3360,7 +3388,7 @@
3360
3388
  border-radius: 4px;
3361
3389
  cursor: pointer;
3362
3390
  opacity: 0;
3363
- transition: opacity var(--qc-motion-durationFast) linear;
3391
+ transition: opacity var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
3364
3392
  }
3365
3393
 
3366
3394
  [data-qc-theme] .qc-drawing-flyout-row:hover .qc-drawing-star,
@@ -3457,7 +3485,7 @@
3457
3485
  border-radius: 2px;
3458
3486
  content: '';
3459
3487
  pointer-events: none;
3460
- transition: background-color var(--qc-motion-durationFast) linear;
3488
+ transition: background-color var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
3461
3489
  }
3462
3490
 
3463
3491
  [data-qc-theme] .qc-drawing-favorite:hover,
@@ -4403,8 +4431,12 @@
4403
4431
  text-transform: uppercase;
4404
4432
  }
4405
4433
 
4434
+ /* The line a list shows in place of rows (empty, loading, failed): the rows' own size in the muted
4435
+ * ink, on a row's height, its words 8px in where a row's label starts. */
4406
4436
  [data-qc-theme] .qc-menu-note {
4407
- padding: 6px 12px;
4437
+ padding: 6px 8px;
4438
+ color: var(--qc-text-muted);
4439
+ line-height: 20px;
4408
4440
  }
4409
4441
 
4410
4442
  [data-qc-theme] .qc-menu-panel .qc-separator {
@@ -4438,6 +4470,34 @@
4438
4470
  font-size: var(--qc-text-fontSizeBase);
4439
4471
  }
4440
4472
 
4473
+ /* The modal motion, for a dialog that opens and closes with it (the scrim carries `data-state`):
4474
+ * the backdrop fades in, and the box fades in and grows from the entrance scale, over one duration.
4475
+ * Closing runs the same motion in reverse. Under a reduced-motion preference the duration is zero,
4476
+ * so both are instant. */
4477
+ [data-qc-theme] .qc-dialog-scrim[data-state] {
4478
+ opacity: 1;
4479
+ transition: opacity var(--qc-motion-durationBase) var(--qc-motion-easingOut);
4480
+ }
4481
+
4482
+ [data-qc-theme] .qc-dialog-scrim[data-state] > .qc-dialog {
4483
+ opacity: 1;
4484
+ scale: none;
4485
+ transition:
4486
+ opacity var(--qc-motion-durationBase) var(--qc-motion-easingStandard),
4487
+ scale var(--qc-motion-durationBase) var(--qc-motion-easingStandard);
4488
+ }
4489
+
4490
+ [data-qc-theme] .qc-dialog-scrim[data-state='opening'],
4491
+ [data-qc-theme] .qc-dialog-scrim[data-state='closing'] {
4492
+ opacity: 0;
4493
+ }
4494
+
4495
+ [data-qc-theme] .qc-dialog-scrim[data-state='opening'] > .qc-dialog,
4496
+ [data-qc-theme] .qc-dialog-scrim[data-state='closing'] > .qc-dialog {
4497
+ opacity: 0;
4498
+ scale: var(--qc-motion-scaleEnter);
4499
+ }
4500
+
4441
4501
  /* In place of rows: the drawing over the line that says nothing matched, centred where the rows
4442
4502
  * would have stood. */
4443
4503
  [data-qc-theme] .qc-empty {
@@ -4623,6 +4683,8 @@
4623
4683
  justify-content: flex-end;
4624
4684
  width: 100%;
4625
4685
  min-width: 0;
4686
+ min-height: 0;
4687
+ max-height: 49px;
4626
4688
  height: 49px;
4627
4689
  padding: 0;
4628
4690
  overflow-x: auto;
@@ -4633,6 +4695,29 @@
4633
4695
  border-top: 1px solid var(--qc-canvas-paneBorder);
4634
4696
  pointer-events: auto;
4635
4697
  scrollbar-width: none;
4698
+ transform-origin: bottom center;
4699
+ opacity: 1;
4700
+ transform: translateY(0);
4701
+ clip-path: inset(0);
4702
+ transition:
4703
+ flex-basis var(--qc-motion-durationBase) var(--qc-motion-easingStandard),
4704
+ max-height var(--qc-motion-durationBase) var(--qc-motion-easingStandard),
4705
+ opacity var(--qc-motion-durationBase) var(--qc-motion-easingStandard),
4706
+ transform var(--qc-motion-durationBase) var(--qc-motion-easingStandard),
4707
+ clip-path var(--qc-motion-durationBase) var(--qc-motion-easingStandard);
4708
+ }
4709
+
4710
+ /* The row itself animates from zero to 49px and back, on the modal motion's duration and timing,
4711
+ * and closing runs the opening in reverse. max-height clamps the fixed-height band while
4712
+ * flex-basis gives the chart space up at the same pace, so the chart and controls move together.
4713
+ * The state is driven by CSS transitions because some embedded hosts omit Element.animate(). */
4714
+ [data-qc-theme] .qc-replay[data-state='opening'],
4715
+ [data-qc-theme] .qc-replay[data-state='closing'] {
4716
+ flex-basis: 0;
4717
+ max-height: 0;
4718
+ opacity: 0;
4719
+ transform: translateY(8px);
4720
+ clip-path: inset(100% 0 0);
4636
4721
  }
4637
4722
 
4638
4723
  [data-qc-theme] .qc-replay::-webkit-scrollbar {
@@ -4918,6 +5003,7 @@
4918
5003
  * `scrollbar-width: none`, which more than one app ships) from erasing the chart's own. */
4919
5004
  [data-qc-theme] .qc-menu-body,
4920
5005
  [data-qc-theme] .qc-dialog-body,
5006
+ [data-qc-theme] .qc-chart-settings-panel,
4921
5007
  [data-qc-theme] .qc-picker-list,
4922
5008
  [data-qc-theme] .qc-layouts-list,
4923
5009
  [data-qc-theme] .qc-search-list,
@@ -4929,6 +5015,7 @@
4929
5015
 
4930
5016
  [data-qc-theme] .qc-menu-body::-webkit-scrollbar,
4931
5017
  [data-qc-theme] .qc-dialog-body::-webkit-scrollbar,
5018
+ [data-qc-theme] .qc-chart-settings-panel::-webkit-scrollbar,
4932
5019
  [data-qc-theme] .qc-picker-list::-webkit-scrollbar,
4933
5020
  [data-qc-theme] .qc-layouts-list::-webkit-scrollbar,
4934
5021
  [data-qc-theme] .qc-search-list::-webkit-scrollbar,
@@ -4942,6 +5029,7 @@
4942
5029
 
4943
5030
  [data-qc-theme] .qc-menu-body::-webkit-scrollbar-thumb,
4944
5031
  [data-qc-theme] .qc-dialog-body::-webkit-scrollbar-thumb,
5032
+ [data-qc-theme] .qc-chart-settings-panel::-webkit-scrollbar-thumb,
4945
5033
  [data-qc-theme] .qc-picker-list::-webkit-scrollbar-thumb,
4946
5034
  [data-qc-theme] .qc-layouts-list::-webkit-scrollbar-thumb,
4947
5035
  [data-qc-theme] .qc-search-list::-webkit-scrollbar-thumb,
@@ -4956,6 +5044,7 @@
4956
5044
 
4957
5045
  [data-qc-theme] .qc-menu-body::-webkit-scrollbar-track,
4958
5046
  [data-qc-theme] .qc-dialog-body::-webkit-scrollbar-track,
5047
+ [data-qc-theme] .qc-chart-settings-panel::-webkit-scrollbar-track,
4959
5048
  [data-qc-theme] .qc-picker-list::-webkit-scrollbar-track,
4960
5049
  [data-qc-theme] .qc-layouts-list::-webkit-scrollbar-track,
4961
5050
  [data-qc-theme] .qc-search-list::-webkit-scrollbar-track,
@@ -4968,6 +5057,7 @@
4968
5057
 
4969
5058
  [data-qc-theme] .qc-menu-body::-webkit-scrollbar-corner,
4970
5059
  [data-qc-theme] .qc-dialog-body::-webkit-scrollbar-corner,
5060
+ [data-qc-theme] .qc-chart-settings-panel::-webkit-scrollbar-corner,
4971
5061
  [data-qc-theme] .qc-picker-list::-webkit-scrollbar-corner,
4972
5062
  [data-qc-theme] .qc-layouts-list::-webkit-scrollbar-corner,
4973
5063
  [data-qc-theme] .qc-search-list::-webkit-scrollbar-corner,
@@ -4980,6 +5070,7 @@
4980
5070
  @supports (-moz-appearance: none) {
4981
5071
  [data-qc-theme] .qc-menu-body,
4982
5072
  [data-qc-theme] .qc-dialog-body,
5073
+ [data-qc-theme] .qc-chart-settings-panel,
4983
5074
  [data-qc-theme] .qc-picker-list,
4984
5075
  [data-qc-theme] .qc-layouts-list,
4985
5076
  [data-qc-theme] .qc-search-list,
@@ -5138,6 +5229,12 @@
5138
5229
  display: none;
5139
5230
  }
5140
5231
 
5232
+ /* A selected class's narrower classes: a second strip of the same tabs, standing directly under the
5233
+ * strip above so the two rows read as one filter. */
5234
+ [data-qc-theme] .qc-search-classes + .qc-search-subclasses {
5235
+ padding-top: 0;
5236
+ }
5237
+
5141
5238
  [data-qc-theme] .qc-search-scope {
5142
5239
  display: inline-flex;
5143
5240
  flex: 0 0 auto;
@@ -5537,14 +5634,312 @@
5537
5634
  font-size: var(--qc-text-fontSizeSmall);
5538
5635
  }
5539
5636
 
5540
- /* The chart settings menu. */
5541
- [data-qc-theme] .qc-settings-menu .qc-settings-row {
5542
- min-height: 28px;
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. */
5639
+ [data-qc-theme] .qc-chart-settings-dialog {
5640
+ box-sizing: border-box;
5641
+ height: min(612px, calc(100vh - 32px));
5642
+ max-height: min(612px, calc(100vh - 32px));
5643
+ color: var(--qc-text-primary);
5644
+ background: var(--qc-overlay-surface);
5645
+ border: 0;
5646
+ border-radius: 6px;
5647
+ box-shadow: var(--qc-overlay-shadow);
5648
+ }
5649
+
5650
+ [data-qc-theme] .qc-chart-settings-dialog .qc-dialog-title {
5651
+ box-sizing: border-box;
5652
+ min-height: 64px;
5653
+ padding: 0 14px 0 19px;
5654
+ }
5655
+
5656
+ [data-qc-theme] .qc-chart-settings-dialog .qc-dialog-title .qc-title {
5657
+ font-size: 20px;
5658
+ font-weight: 600;
5659
+ line-height: 28px;
5660
+ }
5661
+
5662
+ [data-qc-theme] .qc-chart-settings-dialog .qc-dialog-close {
5663
+ width: 40px;
5664
+ height: 40px;
5665
+ border: 0;
5666
+ }
5667
+
5668
+ [data-qc-theme] .qc-chart-settings-body {
5669
+ display: flex;
5670
+ flex: 1 1 auto;
5671
+ flex-direction: row;
5672
+ gap: 0;
5673
+ min-height: 0;
5674
+ padding: 0;
5675
+ overflow: hidden;
5676
+ }
5677
+
5678
+ [data-qc-theme] .qc-chart-settings-nav {
5679
+ display: flex;
5680
+ flex: 0 0 226px;
5681
+ flex-direction: column;
5682
+ gap: 2px;
5683
+ box-sizing: border-box;
5684
+ padding: 10px;
5685
+ border-inline-end: 1px solid var(--qc-overlay-separator);
5686
+ }
5687
+
5688
+ [data-qc-theme] .qc-chart-settings-nav-item {
5689
+ display: flex;
5690
+ gap: 10px;
5691
+ align-items: center;
5692
+ width: 100%;
5693
+ min-height: 40px;
5543
5694
  padding: 0 12px;
5695
+ color: var(--qc-text-secondary);
5696
+ font: inherit;
5697
+ font-size: 14px;
5698
+ text-align: start;
5699
+ background: transparent;
5700
+ border: 0;
5701
+ border-radius: 8px;
5702
+ cursor: pointer;
5703
+ }
5704
+
5705
+ [data-qc-theme] .qc-chart-settings-nav-item:hover {
5706
+ color: var(--qc-text-primary);
5707
+ background: var(--qc-state-hover);
5708
+ }
5709
+
5710
+ [data-qc-theme] .qc-chart-settings-nav-item[aria-selected='true'] {
5711
+ color: var(--qc-text-primary);
5712
+ font-weight: 600;
5713
+ background: var(--qc-state-selected);
5714
+ }
5715
+
5716
+ [data-qc-theme] .qc-chart-settings-panel {
5717
+ display: flex;
5718
+ flex: 1 1 auto;
5719
+ flex-direction: column;
5720
+ min-width: 0;
5721
+ padding: 13px 20px 26px;
5722
+ overflow-y: auto;
5723
+ outline: none;
5724
+ }
5725
+
5726
+ [data-qc-theme] .qc-chart-settings-panel > .qc-menu-heading {
5727
+ min-height: auto;
5728
+ margin: 0 0 8px;
5729
+ padding: 0;
5730
+ color: var(--qc-text-muted);
5731
+ font-size: 11px;
5732
+ font-weight: 400;
5733
+ line-height: 24px;
5734
+ letter-spacing: 0;
5735
+ }
5736
+
5737
+ [data-qc-theme] .qc-settings-menu .qc-settings-row {
5738
+ display: grid;
5739
+ grid-template-columns: minmax(150px, 1fr) auto;
5740
+ gap: 16px;
5741
+ min-height: 44px;
5742
+ padding: 0;
5743
+ }
5744
+
5745
+ [data-qc-theme] .qc-settings-menu .qc-settings-row .qc-field-label {
5746
+ color: var(--qc-text-secondary);
5747
+ font-size: 14px;
5748
+ }
5749
+
5750
+ [data-qc-theme] .qc-settings-menu .qc-settings-row .qc-drawing-swatch-button {
5751
+ box-sizing: border-box;
5752
+ width: 38px;
5753
+ height: 34px;
5754
+ padding: 3px;
5755
+ background: var(--qc-chrome-surfaceRaised);
5756
+ border-color: var(--qc-chrome-fieldBorder);
5757
+ border-radius: 6px;
5758
+ }
5759
+
5760
+ [data-qc-theme] .qc-settings-menu .qc-settings-row .qc-drawing-well {
5761
+ width: 28px;
5762
+ height: 26px;
5763
+ border-radius: 4px;
5544
5764
  }
5545
5765
 
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. */
5546
5768
  [data-qc-theme] .qc-settings-menu .qc-switch-row {
5547
- min-height: 28px;
5769
+ display: flex;
5770
+ flex-direction: row-reverse;
5771
+ justify-content: flex-end;
5772
+ gap: 10px;
5773
+ min-height: 44px;
5774
+ padding: 0;
5775
+ color: var(--qc-text-secondary);
5776
+ cursor: pointer;
5777
+ }
5778
+
5779
+ [data-qc-theme] .qc-settings-menu .qc-switch {
5780
+ width: 18px;
5781
+ height: 18px;
5782
+ box-sizing: border-box;
5783
+ background: transparent;
5784
+ border: 1px solid var(--qc-control-on);
5785
+ border-radius: 3px;
5786
+ }
5787
+
5788
+ [data-qc-theme] .qc-settings-menu .qc-switch:hover:not([disabled]) {
5789
+ background: var(--qc-state-hover);
5790
+ }
5791
+
5792
+ [data-qc-theme] .qc-settings-menu .qc-switch[aria-checked='true'] {
5793
+ background: var(--qc-control-on);
5794
+ }
5795
+
5796
+ [data-qc-theme] .qc-settings-menu .qc-switch-knob {
5797
+ position: absolute;
5798
+ top: 3px;
5799
+ inset-inline-start: 6px;
5800
+ width: 5px;
5801
+ height: 9px;
5802
+ box-sizing: border-box;
5803
+ background: transparent;
5804
+ border: solid var(--qc-control-mark);
5805
+ border-width: 0 2px 2px 0;
5806
+ border-radius: 0;
5807
+ opacity: 0;
5808
+ transform: rotate(45deg);
5809
+ transition: opacity var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
5810
+ }
5811
+
5812
+ [data-qc-theme] .qc-settings-menu .qc-switch[aria-checked='true'] .qc-switch-knob {
5813
+ inset-inline-start: 6px;
5814
+ opacity: 1;
5815
+ }
5816
+
5817
+ [data-qc-theme] .qc-chart-settings-choices {
5818
+ display: flex;
5819
+ flex-direction: column;
5820
+ gap: 2px;
5821
+ width: min(100%, 360px);
5822
+ }
5823
+
5824
+ [data-qc-theme] .qc-chart-settings-choice {
5825
+ display: flex;
5826
+ gap: 10px;
5827
+ align-items: center;
5828
+ min-height: 40px;
5829
+ padding: 0 8px;
5830
+ color: var(--qc-text-secondary);
5831
+ font: inherit;
5832
+ text-align: start;
5833
+ background: transparent;
5834
+ border: 0;
5835
+ border-radius: 6px;
5836
+ cursor: pointer;
5837
+ }
5838
+
5839
+ [data-qc-theme] .qc-chart-settings-choice:hover:not([disabled]) {
5840
+ color: var(--qc-text-primary);
5841
+ background: var(--qc-state-hover);
5842
+ }
5843
+
5844
+ [data-qc-theme] .qc-chart-settings-choice[disabled] {
5845
+ color: var(--qc-text-disabled);
5846
+ cursor: default;
5847
+ }
5848
+
5849
+ [data-qc-theme] .qc-chart-settings-radio {
5850
+ position: relative;
5851
+ flex: 0 0 auto;
5852
+ box-sizing: border-box;
5853
+ width: 18px;
5854
+ height: 18px;
5855
+ border: 1px solid var(--qc-control-on);
5856
+ border-radius: 50%;
5857
+ }
5858
+
5859
+ [data-qc-theme] .qc-chart-settings-choice[aria-checked='true'] .qc-chart-settings-radio::after {
5860
+ content: '';
5861
+ position: absolute;
5862
+ inset: 4px;
5863
+ background: var(--qc-control-on);
5864
+ border-radius: 50%;
5865
+ }
5866
+
5867
+ [data-qc-theme] .qc-chart-settings-footer {
5868
+ display: flex;
5869
+ flex: 0 0 64px;
5870
+ align-items: center;
5871
+ justify-content: space-between;
5872
+ box-sizing: border-box;
5873
+ padding: 0 18px;
5874
+ border-top: 1px solid var(--qc-overlay-separator);
5875
+ }
5876
+
5877
+ [data-qc-theme] .qc-chart-settings-actions {
5878
+ display: flex;
5879
+ gap: 10px;
5880
+ }
5881
+
5882
+ [data-qc-theme] .qc-chart-settings-footer .qc-button {
5883
+ min-width: 62px;
5884
+ height: 34px;
5885
+ padding: 0 11px;
5886
+ font-size: 14px;
5887
+ line-height: 22px;
5888
+ }
5889
+
5890
+ [data-qc-theme] .qc-chart-settings-footer .qc-chart-settings-reset {
5891
+ min-width: 0;
5892
+ }
5893
+
5894
+ [data-qc-theme] .qc-chart-settings-cancel,
5895
+ [data-qc-theme] .qc-chart-settings-ok {
5896
+ min-width: 62px;
5897
+ }
5898
+
5899
+ [data-qc-theme] .qc-chart-settings-nav {
5900
+ scrollbar-width: none;
5901
+ }
5902
+
5903
+ [data-qc-theme] .qc-chart-settings-nav::-webkit-scrollbar {
5904
+ display: none;
5905
+ }
5906
+
5907
+ @media (max-width: 680px) {
5908
+ [data-qc-theme] .qc-chart-settings-dialog {
5909
+ width: calc(100% - 20px) !important;
5910
+ height: calc(100vh - 20px);
5911
+ max-width: none;
5912
+ max-height: none;
5913
+ }
5914
+
5915
+ [data-qc-theme] .qc-chart-settings-body {
5916
+ flex-direction: column;
5917
+ }
5918
+
5919
+ [data-qc-theme] .qc-chart-settings-nav {
5920
+ flex: 0 0 auto;
5921
+ flex-direction: row;
5922
+ gap: 4px;
5923
+ padding: 6px 10px 8px;
5924
+ overflow-x: auto;
5925
+ border-inline-end: 0;
5926
+ border-bottom: 1px solid var(--qc-overlay-separator);
5927
+ }
5928
+
5929
+ [data-qc-theme] .qc-chart-settings-nav-item {
5930
+ width: auto;
5931
+ min-width: max-content;
5932
+ min-height: 36px;
5933
+ padding: 0 10px;
5934
+ }
5935
+
5936
+ [data-qc-theme] .qc-chart-settings-panel {
5937
+ padding: 13px 16px 20px;
5938
+ }
5939
+
5940
+ [data-qc-theme] .qc-chart-settings-footer {
5941
+ padding: 0 12px;
5942
+ }
5548
5943
  }
5549
5944
 
5550
5945
  /* The market-status control on the legend and its popup. */
@@ -5944,7 +6339,7 @@
5944
6339
  [data-qc-theme] .qc-tf-unit-caret {
5945
6340
  flex: 0 0 auto;
5946
6341
  color: var(--qc-text-muted);
5947
- transition: transform var(--qc-motion-durationFast) linear;
6342
+ transition: transform var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
5948
6343
  transform: rotate(180deg);
5949
6344
  }
5950
6345
 
@@ -5998,6 +6393,26 @@
5998
6393
  cursor: not-allowed;
5999
6394
  }
6000
6395
 
6396
+ /* The same list with no drop-down around it, for a page that holds the picker in a box of its own:
6397
+ * a phone's card, where the card IS the picker. It fills that box, the rows scroll inside it, and the
6398
+ * composer stays pinned below them. The box is the page's, so the card paints no surface of its own. */
6399
+ [data-qc-theme].qc-tf-card {
6400
+ display: flex;
6401
+ min-height: 0;
6402
+ height: 100%;
6403
+ flex-direction: column;
6404
+ color: var(--qc-text-primary);
6405
+ font-family: var(--qc-text-fontFamily);
6406
+ font-size: var(--qc-text-fontSizeBase);
6407
+ }
6408
+
6409
+ [data-qc-theme].qc-tf-card > .qc-tf-menu {
6410
+ display: flex;
6411
+ flex: 1 1 auto;
6412
+ min-height: 0;
6413
+ flex-direction: column;
6414
+ }
6415
+
6001
6416
  /* The chart's notices, stacked at the bottom of the charts, newest last. The region is the charts
6002
6417
  * grid's next sibling in the root's column and takes no height of its own; the stack inside it is
6003
6418
  * anchored to its top edge and grows upward, over the charts, never over the bottom bar. */