@trdrs/quickcharts 1.0.1 → 1.2.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.
@@ -4623,6 +4623,8 @@
4623
4623
  justify-content: flex-end;
4624
4624
  width: 100%;
4625
4625
  min-width: 0;
4626
+ min-height: 0;
4627
+ max-height: 49px;
4626
4628
  height: 49px;
4627
4629
  padding: 0;
4628
4630
  overflow-x: auto;
@@ -4633,6 +4635,33 @@
4633
4635
  border-top: 1px solid var(--qc-canvas-paneBorder);
4634
4636
  pointer-events: auto;
4635
4637
  scrollbar-width: none;
4638
+ transform-origin: bottom center;
4639
+ opacity: 1;
4640
+ transform: translateY(0);
4641
+ clip-path: inset(0);
4642
+ transition:
4643
+ flex-basis 220ms cubic-bezier(0.22, 1, 0.36, 1),
4644
+ max-height 220ms cubic-bezier(0.22, 1, 0.36, 1),
4645
+ opacity 140ms linear,
4646
+ transform 220ms cubic-bezier(0.22, 1, 0.36, 1),
4647
+ clip-path 220ms cubic-bezier(0.22, 1, 0.36, 1);
4648
+ }
4649
+
4650
+ /* The row itself animates from zero to 49px and back. max-height clamps the fixed-height band while
4651
+ * flex-basis gives the chart space up at the same pace, so the chart and controls move together.
4652
+ * The state is driven by CSS transitions because some embedded hosts omit Element.animate(). */
4653
+ [data-qc-theme] .qc-replay[data-state='opening'],
4654
+ [data-qc-theme] .qc-replay[data-state='closing'] {
4655
+ flex-basis: 0;
4656
+ max-height: 0;
4657
+ opacity: 0;
4658
+ transform: translateY(8px);
4659
+ clip-path: inset(100% 0 0);
4660
+ }
4661
+
4662
+ [data-qc-theme] .qc-replay[data-state='closing'] {
4663
+ transition-duration: 170ms, 170ms, 170ms, 170ms, 170ms;
4664
+ transition-timing-function: cubic-bezier(0.4, 0, 1, 1), cubic-bezier(0.4, 0, 1, 1), linear, cubic-bezier(0.4, 0, 1, 1), cubic-bezier(0.4, 0, 1, 1);
4636
4665
  }
4637
4666
 
4638
4667
  [data-qc-theme] .qc-replay::-webkit-scrollbar {
@@ -4918,6 +4947,7 @@
4918
4947
  * `scrollbar-width: none`, which more than one app ships) from erasing the chart's own. */
4919
4948
  [data-qc-theme] .qc-menu-body,
4920
4949
  [data-qc-theme] .qc-dialog-body,
4950
+ [data-qc-theme] .qc-chart-settings-panel,
4921
4951
  [data-qc-theme] .qc-picker-list,
4922
4952
  [data-qc-theme] .qc-layouts-list,
4923
4953
  [data-qc-theme] .qc-search-list,
@@ -4929,6 +4959,7 @@
4929
4959
 
4930
4960
  [data-qc-theme] .qc-menu-body::-webkit-scrollbar,
4931
4961
  [data-qc-theme] .qc-dialog-body::-webkit-scrollbar,
4962
+ [data-qc-theme] .qc-chart-settings-panel::-webkit-scrollbar,
4932
4963
  [data-qc-theme] .qc-picker-list::-webkit-scrollbar,
4933
4964
  [data-qc-theme] .qc-layouts-list::-webkit-scrollbar,
4934
4965
  [data-qc-theme] .qc-search-list::-webkit-scrollbar,
@@ -4942,6 +4973,7 @@
4942
4973
 
4943
4974
  [data-qc-theme] .qc-menu-body::-webkit-scrollbar-thumb,
4944
4975
  [data-qc-theme] .qc-dialog-body::-webkit-scrollbar-thumb,
4976
+ [data-qc-theme] .qc-chart-settings-panel::-webkit-scrollbar-thumb,
4945
4977
  [data-qc-theme] .qc-picker-list::-webkit-scrollbar-thumb,
4946
4978
  [data-qc-theme] .qc-layouts-list::-webkit-scrollbar-thumb,
4947
4979
  [data-qc-theme] .qc-search-list::-webkit-scrollbar-thumb,
@@ -4956,6 +4988,7 @@
4956
4988
 
4957
4989
  [data-qc-theme] .qc-menu-body::-webkit-scrollbar-track,
4958
4990
  [data-qc-theme] .qc-dialog-body::-webkit-scrollbar-track,
4991
+ [data-qc-theme] .qc-chart-settings-panel::-webkit-scrollbar-track,
4959
4992
  [data-qc-theme] .qc-picker-list::-webkit-scrollbar-track,
4960
4993
  [data-qc-theme] .qc-layouts-list::-webkit-scrollbar-track,
4961
4994
  [data-qc-theme] .qc-search-list::-webkit-scrollbar-track,
@@ -4968,6 +5001,7 @@
4968
5001
 
4969
5002
  [data-qc-theme] .qc-menu-body::-webkit-scrollbar-corner,
4970
5003
  [data-qc-theme] .qc-dialog-body::-webkit-scrollbar-corner,
5004
+ [data-qc-theme] .qc-chart-settings-panel::-webkit-scrollbar-corner,
4971
5005
  [data-qc-theme] .qc-picker-list::-webkit-scrollbar-corner,
4972
5006
  [data-qc-theme] .qc-layouts-list::-webkit-scrollbar-corner,
4973
5007
  [data-qc-theme] .qc-search-list::-webkit-scrollbar-corner,
@@ -4980,6 +5014,7 @@
4980
5014
  @supports (-moz-appearance: none) {
4981
5015
  [data-qc-theme] .qc-menu-body,
4982
5016
  [data-qc-theme] .qc-dialog-body,
5017
+ [data-qc-theme] .qc-chart-settings-panel,
4983
5018
  [data-qc-theme] .qc-picker-list,
4984
5019
  [data-qc-theme] .qc-layouts-list,
4985
5020
  [data-qc-theme] .qc-search-list,
@@ -4993,8 +5028,40 @@
4993
5028
 
4994
5029
  /* The symbol search dialog and its compare family: the heading, the field with its operators, the
4995
5030
  * class strip, and the result list. */
5031
+ [data-qc-theme] .qc-search-dialog-scrim {
5032
+ opacity: 1;
5033
+ transition: opacity 160ms linear;
5034
+ }
5035
+
4996
5036
  [data-qc-theme] .qc-search-dialog {
4997
5037
  height: min(85vh, 680px);
5038
+ opacity: 1;
5039
+ transform: translateY(0) scale(1);
5040
+ transform-origin: center 42%;
5041
+ transition:
5042
+ opacity 150ms ease-out,
5043
+ transform 190ms cubic-bezier(0.16, 1, 0.3, 1);
5044
+ }
5045
+
5046
+ [data-qc-theme] .qc-search-dialog-scrim[data-state='opening'] {
5047
+ opacity: 0;
5048
+ }
5049
+
5050
+ [data-qc-theme] .qc-search-dialog-scrim[data-state='opening'] .qc-search-dialog {
5051
+ opacity: 0;
5052
+ transform: translateY(8px) scale(0.985);
5053
+ }
5054
+
5055
+ [data-qc-theme] .qc-search-dialog-scrim[data-state='closing'] {
5056
+ opacity: 0;
5057
+ transition-duration: 140ms;
5058
+ }
5059
+
5060
+ [data-qc-theme] .qc-search-dialog-scrim[data-state='closing'] .qc-search-dialog {
5061
+ opacity: 0;
5062
+ transform: translateY(6px) scale(0.985);
5063
+ transition-duration: 110ms, 140ms;
5064
+ transition-timing-function: ease-in, cubic-bezier(0.4, 0, 1, 1);
4998
5065
  }
4999
5066
 
5000
5067
  [data-qc-theme] .qc-search-dialog--compare {
@@ -5138,6 +5205,32 @@
5138
5205
  display: none;
5139
5206
  }
5140
5207
 
5208
+ [data-qc-theme] .qc-search-scope {
5209
+ display: inline-flex;
5210
+ flex: 0 0 auto;
5211
+ align-items: center;
5212
+ gap: 7px;
5213
+ height: 28px;
5214
+ margin-inline-start: auto;
5215
+ padding: 0 10px 0 6px;
5216
+ color: var(--qc-text-primary);
5217
+ font-size: var(--qc-text-fontSizeBase);
5218
+ line-height: 18px;
5219
+ background: var(--qc-state-hover);
5220
+ border-radius: 14px;
5221
+ white-space: nowrap;
5222
+ }
5223
+
5224
+ [data-qc-theme] .qc-search-scope-mark {
5225
+ display: inline-flex;
5226
+ flex: 0 0 18px;
5227
+ align-items: center;
5228
+ justify-content: center;
5229
+ width: 18px;
5230
+ height: 18px;
5231
+ overflow: hidden;
5232
+ }
5233
+
5141
5234
  /* A class rests on the neutral fill, steps deeper under the pointer and deeper again while pressed. */
5142
5235
  [data-qc-theme] .qc-search-class {
5143
5236
  flex: 0 0 auto;
@@ -5511,14 +5604,350 @@
5511
5604
  font-size: var(--qc-text-fontSizeSmall);
5512
5605
  }
5513
5606
 
5514
- /* The chart settings menu. */
5515
- [data-qc-theme] .qc-settings-menu .qc-settings-row {
5516
- min-height: 28px;
5607
+ /* Chart settings follows the same centered, two-column layout as TradingView: a fixed title and
5608
+ * footer around a section rail and one roomy settings page. */
5609
+ [data-qc-theme] .qc-chart-settings-scrim {
5610
+ opacity: 1;
5611
+ transition: opacity 160ms linear;
5612
+ }
5613
+
5614
+ [data-qc-theme] .qc-chart-settings-dialog {
5615
+ box-sizing: border-box;
5616
+ height: min(612px, calc(100vh - 32px));
5617
+ max-height: min(612px, calc(100vh - 32px));
5618
+ color: var(--qc-text-primary);
5619
+ background: var(--qc-overlay-surface);
5620
+ border: 0;
5621
+ border-radius: 6px;
5622
+ box-shadow: var(--qc-overlay-shadow);
5623
+ opacity: 1;
5624
+ transform: translateY(0) scale(1);
5625
+ transform-origin: center 42%;
5626
+ transition:
5627
+ opacity 150ms ease-out,
5628
+ transform 190ms cubic-bezier(0.16, 1, 0.3, 1);
5629
+ }
5630
+
5631
+ [data-qc-theme] .qc-chart-settings-scrim[data-state='opening'],
5632
+ [data-qc-theme] .qc-chart-settings-scrim[data-state='closing'] {
5633
+ opacity: 0;
5634
+ }
5635
+
5636
+ [data-qc-theme] .qc-chart-settings-scrim[data-state='opening'] .qc-chart-settings-dialog,
5637
+ [data-qc-theme] .qc-chart-settings-scrim[data-state='closing'] .qc-chart-settings-dialog {
5638
+ opacity: 0;
5639
+ transform: translateY(8px) scale(0.985);
5640
+ }
5641
+
5642
+ [data-qc-theme] .qc-chart-settings-scrim[data-state='closing'] {
5643
+ transition-duration: 140ms;
5644
+ }
5645
+
5646
+ [data-qc-theme] .qc-chart-settings-scrim[data-state='closing'] .qc-chart-settings-dialog {
5647
+ transition-duration: 110ms, 140ms;
5648
+ transition-timing-function: ease-in, cubic-bezier(0.4, 0, 1, 1);
5649
+ }
5650
+
5651
+ [data-qc-theme] .qc-chart-settings-dialog .qc-dialog-title {
5652
+ box-sizing: border-box;
5653
+ min-height: 64px;
5654
+ padding: 0 14px 0 19px;
5655
+ }
5656
+
5657
+ [data-qc-theme] .qc-chart-settings-dialog .qc-dialog-title .qc-title {
5658
+ font-size: 20px;
5659
+ font-weight: 600;
5660
+ line-height: 28px;
5661
+ }
5662
+
5663
+ [data-qc-theme] .qc-chart-settings-dialog .qc-dialog-close {
5664
+ width: 40px;
5665
+ height: 40px;
5666
+ border: 0;
5667
+ }
5668
+
5669
+ [data-qc-theme] .qc-chart-settings-body {
5670
+ display: flex;
5671
+ flex: 1 1 auto;
5672
+ flex-direction: row;
5673
+ gap: 0;
5674
+ min-height: 0;
5675
+ padding: 0;
5676
+ overflow: hidden;
5677
+ }
5678
+
5679
+ [data-qc-theme] .qc-chart-settings-nav {
5680
+ display: flex;
5681
+ flex: 0 0 226px;
5682
+ flex-direction: column;
5683
+ gap: 2px;
5684
+ box-sizing: border-box;
5685
+ padding: 10px;
5686
+ border-inline-end: 1px solid var(--qc-overlay-separator);
5687
+ }
5688
+
5689
+ [data-qc-theme] .qc-chart-settings-nav-item {
5690
+ display: flex;
5691
+ gap: 10px;
5692
+ align-items: center;
5693
+ width: 100%;
5694
+ min-height: 40px;
5517
5695
  padding: 0 12px;
5696
+ color: var(--qc-text-secondary);
5697
+ font: inherit;
5698
+ font-size: 14px;
5699
+ text-align: start;
5700
+ background: transparent;
5701
+ border: 0;
5702
+ border-radius: 8px;
5703
+ cursor: pointer;
5704
+ }
5705
+
5706
+ [data-qc-theme] .qc-chart-settings-nav-item:hover {
5707
+ color: var(--qc-text-primary);
5708
+ background: var(--qc-state-hover);
5709
+ }
5710
+
5711
+ [data-qc-theme] .qc-chart-settings-nav-item[aria-selected='true'] {
5712
+ color: var(--qc-text-primary);
5713
+ font-weight: 600;
5714
+ background: var(--qc-state-selected);
5715
+ }
5716
+
5717
+ [data-qc-theme] .qc-chart-settings-panel {
5718
+ display: flex;
5719
+ flex: 1 1 auto;
5720
+ flex-direction: column;
5721
+ min-width: 0;
5722
+ padding: 13px 20px 26px;
5723
+ overflow-y: auto;
5724
+ outline: none;
5725
+ }
5726
+
5727
+ [data-qc-theme] .qc-chart-settings-panel > .qc-menu-heading {
5728
+ min-height: auto;
5729
+ margin: 0 0 8px;
5730
+ padding: 0;
5731
+ color: var(--qc-text-muted);
5732
+ font-size: 11px;
5733
+ font-weight: 400;
5734
+ line-height: 24px;
5735
+ letter-spacing: 0;
5736
+ }
5737
+
5738
+ [data-qc-theme] .qc-settings-menu .qc-settings-row {
5739
+ display: grid;
5740
+ grid-template-columns: minmax(150px, 1fr) auto;
5741
+ gap: 16px;
5742
+ min-height: 44px;
5743
+ padding: 0;
5744
+ }
5745
+
5746
+ [data-qc-theme] .qc-settings-menu .qc-settings-row .qc-field-label {
5747
+ color: var(--qc-text-secondary);
5748
+ font-size: 14px;
5518
5749
  }
5519
5750
 
5751
+ [data-qc-theme] .qc-settings-menu .qc-settings-row .qc-drawing-swatch-button {
5752
+ box-sizing: border-box;
5753
+ width: 38px;
5754
+ height: 34px;
5755
+ padding: 3px;
5756
+ background: var(--qc-chrome-surfaceRaised);
5757
+ border-color: var(--qc-chrome-fieldBorder);
5758
+ border-radius: 6px;
5759
+ }
5760
+
5761
+ [data-qc-theme] .qc-settings-menu .qc-settings-row .qc-drawing-well {
5762
+ width: 28px;
5763
+ height: 26px;
5764
+ border-radius: 4px;
5765
+ }
5766
+
5767
+ /* TradingView uses compact square checks in this dialog. Keep the existing accessible switch role
5768
+ * while painting it as the same control and placing it before the label. */
5520
5769
  [data-qc-theme] .qc-settings-menu .qc-switch-row {
5521
- min-height: 28px;
5770
+ display: flex;
5771
+ flex-direction: row-reverse;
5772
+ justify-content: flex-end;
5773
+ gap: 10px;
5774
+ min-height: 44px;
5775
+ padding: 0;
5776
+ color: var(--qc-text-secondary);
5777
+ cursor: pointer;
5778
+ }
5779
+
5780
+ [data-qc-theme] .qc-settings-menu .qc-switch {
5781
+ width: 18px;
5782
+ height: 18px;
5783
+ box-sizing: border-box;
5784
+ background: transparent;
5785
+ border: 1px solid var(--qc-control-on);
5786
+ border-radius: 3px;
5787
+ }
5788
+
5789
+ [data-qc-theme] .qc-settings-menu .qc-switch:hover:not([disabled]) {
5790
+ background: var(--qc-state-hover);
5791
+ }
5792
+
5793
+ [data-qc-theme] .qc-settings-menu .qc-switch[aria-checked='true'] {
5794
+ background: var(--qc-control-on);
5795
+ }
5796
+
5797
+ [data-qc-theme] .qc-settings-menu .qc-switch-knob {
5798
+ position: absolute;
5799
+ top: 3px;
5800
+ inset-inline-start: 6px;
5801
+ width: 5px;
5802
+ height: 9px;
5803
+ box-sizing: border-box;
5804
+ background: transparent;
5805
+ border: solid var(--qc-control-mark);
5806
+ border-width: 0 2px 2px 0;
5807
+ border-radius: 0;
5808
+ opacity: 0;
5809
+ transform: rotate(45deg);
5810
+ transition: opacity var(--qc-motion-durationFast) linear;
5811
+ }
5812
+
5813
+ [data-qc-theme] .qc-settings-menu .qc-switch[aria-checked='true'] .qc-switch-knob {
5814
+ inset-inline-start: 6px;
5815
+ opacity: 1;
5816
+ }
5817
+
5818
+ [data-qc-theme] .qc-chart-settings-choices {
5819
+ display: flex;
5820
+ flex-direction: column;
5821
+ gap: 2px;
5822
+ width: min(100%, 360px);
5823
+ }
5824
+
5825
+ [data-qc-theme] .qc-chart-settings-choice {
5826
+ display: flex;
5827
+ gap: 10px;
5828
+ align-items: center;
5829
+ min-height: 40px;
5830
+ padding: 0 8px;
5831
+ color: var(--qc-text-secondary);
5832
+ font: inherit;
5833
+ text-align: start;
5834
+ background: transparent;
5835
+ border: 0;
5836
+ border-radius: 6px;
5837
+ cursor: pointer;
5838
+ }
5839
+
5840
+ [data-qc-theme] .qc-chart-settings-choice:hover:not([disabled]) {
5841
+ color: var(--qc-text-primary);
5842
+ background: var(--qc-state-hover);
5843
+ }
5844
+
5845
+ [data-qc-theme] .qc-chart-settings-choice[disabled] {
5846
+ color: var(--qc-text-disabled);
5847
+ cursor: default;
5848
+ }
5849
+
5850
+ [data-qc-theme] .qc-chart-settings-radio {
5851
+ position: relative;
5852
+ flex: 0 0 auto;
5853
+ box-sizing: border-box;
5854
+ width: 18px;
5855
+ height: 18px;
5856
+ border: 1px solid var(--qc-control-on);
5857
+ border-radius: 50%;
5858
+ }
5859
+
5860
+ [data-qc-theme] .qc-chart-settings-choice[aria-checked='true'] .qc-chart-settings-radio::after {
5861
+ content: '';
5862
+ position: absolute;
5863
+ inset: 4px;
5864
+ background: var(--qc-control-on);
5865
+ border-radius: 50%;
5866
+ }
5867
+
5868
+ [data-qc-theme] .qc-chart-settings-footer {
5869
+ display: flex;
5870
+ flex: 0 0 64px;
5871
+ align-items: center;
5872
+ justify-content: space-between;
5873
+ box-sizing: border-box;
5874
+ padding: 0 18px;
5875
+ border-top: 1px solid var(--qc-overlay-separator);
5876
+ }
5877
+
5878
+ [data-qc-theme] .qc-chart-settings-actions {
5879
+ display: flex;
5880
+ gap: 10px;
5881
+ }
5882
+
5883
+ [data-qc-theme] .qc-chart-settings-footer .qc-button {
5884
+ min-width: 62px;
5885
+ height: 34px;
5886
+ padding: 0 11px;
5887
+ font-size: 14px;
5888
+ line-height: 22px;
5889
+ }
5890
+
5891
+ [data-qc-theme] .qc-chart-settings-footer .qc-chart-settings-reset {
5892
+ min-width: 0;
5893
+ }
5894
+
5895
+ [data-qc-theme] .qc-chart-settings-cancel,
5896
+ [data-qc-theme] .qc-chart-settings-ok {
5897
+ min-width: 62px;
5898
+ }
5899
+
5900
+ [data-qc-theme] .qc-chart-settings-nav {
5901
+ scrollbar-width: none;
5902
+ }
5903
+
5904
+ [data-qc-theme] .qc-chart-settings-nav::-webkit-scrollbar {
5905
+ display: none;
5906
+ }
5907
+
5908
+ @media (max-width: 680px) {
5909
+ [data-qc-theme] .qc-chart-settings-dialog {
5910
+ width: calc(100% - 20px) !important;
5911
+ height: calc(100vh - 20px);
5912
+ max-width: none;
5913
+ max-height: none;
5914
+ }
5915
+
5916
+ [data-qc-theme] .qc-chart-settings-body {
5917
+ flex-direction: column;
5918
+ }
5919
+
5920
+ [data-qc-theme] .qc-chart-settings-nav {
5921
+ flex: 0 0 auto;
5922
+ flex-direction: row;
5923
+ gap: 4px;
5924
+ padding: 6px 10px 8px;
5925
+ overflow-x: auto;
5926
+ border-inline-end: 0;
5927
+ border-bottom: 1px solid var(--qc-overlay-separator);
5928
+ }
5929
+
5930
+ [data-qc-theme] .qc-chart-settings-nav-item {
5931
+ width: auto;
5932
+ min-width: max-content;
5933
+ min-height: 36px;
5934
+ padding: 0 10px;
5935
+ }
5936
+
5937
+ [data-qc-theme] .qc-chart-settings-panel {
5938
+ padding: 13px 16px 20px;
5939
+ }
5940
+
5941
+ [data-qc-theme] .qc-chart-settings-footer {
5942
+ padding: 0 12px;
5943
+ }
5944
+ }
5945
+
5946
+ @media (prefers-reduced-motion: reduce) {
5947
+ [data-qc-theme] .qc-chart-settings-scrim,
5948
+ [data-qc-theme] .qc-chart-settings-dialog {
5949
+ transition-duration: 0ms;
5950
+ }
5522
5951
  }
5523
5952
 
5524
5953
  /* The market-status control on the legend and its popup. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trdrs/quickcharts",
3
- "version": "1.0.1",
3
+ "version": "1.2.0",
4
4
  "description": "Quick Charts: a datafeed-driven charting library with drawings, indicators, layouts and replay over host-supplied data and storage ports.",
5
5
  "keywords": [
6
6
  "charts",