@windborne/grapher 1.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 (112) hide show
  1. package/.eslintrc.js +85 -0
  2. package/.idea/codeStyles/Project.xml +19 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/grapher.iml +12 -0
  5. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  6. package/.idea/misc.xml +6 -0
  7. package/.idea/modules.xml +8 -0
  8. package/.idea/vcs.xml +6 -0
  9. package/0.bundle.js +2 -0
  10. package/0.bundle.js.map +1 -0
  11. package/1767282193a714f63082.module.wasm +0 -0
  12. package/537.bundle.js +2 -0
  13. package/537.bundle.js.map +1 -0
  14. package/831.bundle.js +2 -0
  15. package/831.bundle.js.map +1 -0
  16. package/bundle.js +2 -0
  17. package/bundle.js.map +1 -0
  18. package/package.json +75 -0
  19. package/readme.md +129 -0
  20. package/src/components/annotations.js +62 -0
  21. package/src/components/context_menu.js +73 -0
  22. package/src/components/draggable_points.js +114 -0
  23. package/src/components/graph_body.js +292 -0
  24. package/src/components/graph_title.js +16 -0
  25. package/src/components/options.js +111 -0
  26. package/src/components/percentile_button.js +72 -0
  27. package/src/components/range_graph.js +352 -0
  28. package/src/components/range_selection.js +175 -0
  29. package/src/components/range_selection_button.js +26 -0
  30. package/src/components/range_selection_button_base.js +51 -0
  31. package/src/components/series_key.js +235 -0
  32. package/src/components/series_key_axis_container.js +70 -0
  33. package/src/components/series_key_item.js +52 -0
  34. package/src/components/sidebar.js +76 -0
  35. package/src/components/tooltip.js +244 -0
  36. package/src/components/vertical_lines.js +70 -0
  37. package/src/components/x_axis.js +124 -0
  38. package/src/components/y_axis.js +239 -0
  39. package/src/eventable.js +65 -0
  40. package/src/grapher.js +367 -0
  41. package/src/grapher.scss +914 -0
  42. package/src/helpers/axis_sizes.js +2 -0
  43. package/src/helpers/binary_search.js +67 -0
  44. package/src/helpers/color_to_vector.js +35 -0
  45. package/src/helpers/colors.js +27 -0
  46. package/src/helpers/custom_prop_types.js +159 -0
  47. package/src/helpers/flatten_simple_data.js +81 -0
  48. package/src/helpers/format.js +233 -0
  49. package/src/helpers/generator_params_equal.js +10 -0
  50. package/src/helpers/name_for_series.js +16 -0
  51. package/src/helpers/place_grid.js +257 -0
  52. package/src/helpers/pyodide_ready.js +13 -0
  53. package/src/multigrapher.js +105 -0
  54. package/src/renderer/background.frag +7 -0
  55. package/src/renderer/background.vert +7 -0
  56. package/src/renderer/background_program.js +48 -0
  57. package/src/renderer/circle.frag +26 -0
  58. package/src/renderer/circle.vert +12 -0
  59. package/src/renderer/create_gl_program.js +36 -0
  60. package/src/renderer/draw_area.js +159 -0
  61. package/src/renderer/draw_background.js +15 -0
  62. package/src/renderer/draw_bars.js +80 -0
  63. package/src/renderer/draw_line.js +69 -0
  64. package/src/renderer/draw_zero_line.js +24 -0
  65. package/src/renderer/extract_vertices.js +137 -0
  66. package/src/renderer/graph_body_renderer.js +293 -0
  67. package/src/renderer/line.frag +51 -0
  68. package/src/renderer/line.vert +32 -0
  69. package/src/renderer/line_program.js +125 -0
  70. package/src/renderer/paths_from.js +72 -0
  71. package/src/renderer/scale_bounds.js +28 -0
  72. package/src/renderer/size_canvas.js +59 -0
  73. package/src/rust/Cargo.lock +233 -0
  74. package/src/rust/Cargo.toml +35 -0
  75. package/src/rust/pkg/grapher_rs.d.ts +42 -0
  76. package/src/rust/pkg/grapher_rs.js +351 -0
  77. package/src/rust/pkg/grapher_rs_bg.d.ts +11 -0
  78. package/src/rust/pkg/grapher_rs_bg.wasm +0 -0
  79. package/src/rust/pkg/index.js +342 -0
  80. package/src/rust/pkg/index_bg.wasm +0 -0
  81. package/src/rust/pkg/package.json +14 -0
  82. package/src/rust/src/extract_vertices.rs +83 -0
  83. package/src/rust/src/get_point_number.rs +50 -0
  84. package/src/rust/src/lib.rs +15 -0
  85. package/src/rust/src/selected_space_to_render_space.rs +131 -0
  86. package/src/state/average_loop_times.js +15 -0
  87. package/src/state/bound_calculator_from_selection.js +36 -0
  88. package/src/state/bound_calculators.js +41 -0
  89. package/src/state/calculate_annotations_state.js +59 -0
  90. package/src/state/calculate_data_bounds.js +104 -0
  91. package/src/state/calculate_tooltip_state.js +241 -0
  92. package/src/state/data_types.js +13 -0
  93. package/src/state/expand_bounds.js +58 -0
  94. package/src/state/find_matching_axis.js +31 -0
  95. package/src/state/get_default_bounds_calculator.js +15 -0
  96. package/src/state/hooks.js +164 -0
  97. package/src/state/infer_type.js +74 -0
  98. package/src/state/merge_bounds.js +64 -0
  99. package/src/state/multigraph_state_controller.js +334 -0
  100. package/src/state/selection_from_global_bounds.js +25 -0
  101. package/src/state/space_conversions/condense_data_space.js +115 -0
  102. package/src/state/space_conversions/data_space_to_selected_space.js +328 -0
  103. package/src/state/space_conversions/selected_space_to_background_space.js +144 -0
  104. package/src/state/space_conversions/selected_space_to_render_space.js +161 -0
  105. package/src/state/space_conversions/simple_series_to_data_space.js +229 -0
  106. package/src/state/state_controller.js +1770 -0
  107. package/src/state/sync_pool.js +101 -0
  108. package/test/setup.js +15 -0
  109. package/test/space_conversions/data_space_to_selected_space.test.js +434 -0
  110. package/webpack.dev.config.js +109 -0
  111. package/webpack.prod.config.js +60 -0
  112. package/webpack.test.config.js +59 -0
@@ -0,0 +1,914 @@
1
+ @mixin grapher(
2
+ $primary-graph-body-height: 400px,
3
+ $secondary-graph-body-height: 50px,
4
+
5
+ $background-color-1: #2a2a2b,
6
+ $background-color-2: #3e3e40,
7
+
8
+ $tooltip-line-color: #CCC,
9
+ $tooltip-background-color: rgba(0, 0, 0, 0.6),
10
+ $tooltip-text-color: #F0F0F0,
11
+ $vertical-line-color: #CCC,
12
+
13
+ $axis-line-color: silver,
14
+ $axis-line-width: 2px,
15
+ $axis-tick-color: #505053,
16
+ $axis-text-color: #E0E0E3,
17
+
18
+ $range-selection-text-color: silver,
19
+ $range-selection-button-color: #505053,
20
+ $range-selection-button-selected-color: black,
21
+ $range-selection-text-selected-color: silver,
22
+ $range-selection-text-color-faded: #AAA,
23
+ $range-selection-button-color-faded: #7A7A7A,
24
+ $range-selection-button-border: null,
25
+ $range-selection-selected-button-border: null,
26
+
27
+ $range-graph-selection-bar-size: 14px,
28
+ $range-graph-selection-range-color: rgba(255, 255, 255, 0.1),
29
+ $range-graph-selection-outline-color: #AAA,
30
+ $range-graph-selection-bar-color: #808083,
31
+ $range-graph-selection-bar-track-color: #303033,
32
+ $range-graph-selection-bar-rifles-color: #FFF,
33
+ $range-graph-handle-color: #AAA,
34
+ $range-graph-handle-fill-color: #666,
35
+ $range-graph-axis-text-color: #9f9f9f,
36
+
37
+ $annotation-background-color: rgba(255, 255, 255, 0.3),
38
+
39
+ $series-key-axis-container-color: #111,
40
+ $series-key-input-border-color: #505053,
41
+ $series-key-input-selected-border-color: #E0E0E3,
42
+ $series-key-input-text-color: #E0E0E3,
43
+ $series-key-background: transparent,
44
+ $scale-label-color: silver,
45
+ $series-key-shadow-color: silver,
46
+
47
+ $title-color: white,
48
+
49
+ $sidebar-background-color: #111,
50
+ $sidebar-text-color: #EEE,
51
+
52
+ $new-grapher-color: #DDD
53
+ ) {
54
+ $x-axis-height: 20px;
55
+ $padding: 10px;
56
+
57
+ $axis-z-index: 0;
58
+ $graph-body-z-index: 1;
59
+
60
+ position: relative;
61
+ background: linear-gradient(to bottom right, $background-color-1, $background-color-2);
62
+ padding: $padding;
63
+
64
+ font-family: sans-serif;
65
+ font-size: 12px;
66
+ line-height: normal;
67
+
68
+ *, :after, :before {
69
+ box-sizing: content-box;
70
+ }
71
+
72
+ .grapher-title {
73
+ text-align: center;
74
+ color: $title-color;
75
+ font-size: 18px;
76
+ margin-bottom: 8px;
77
+ }
78
+
79
+ .grapher-primary-container-outer {
80
+ display: flex;
81
+
82
+ .grapher-sidebar {
83
+ background: linear-gradient($sidebar-background-color, transparent 75%, transparent 100%);
84
+ color: $sidebar-text-color;
85
+ padding: 50px 6px 5px 10px;
86
+ margin-left: -$padding;
87
+ margin-top: -$padding;
88
+ margin-bottom: -$padding;
89
+ overflow-y: auto;
90
+ flex-shrink: 0;
91
+
92
+ .series-toggle {
93
+ white-space: nowrap;
94
+
95
+ & + .series-toggle {
96
+ margin-top: 3px;
97
+ }
98
+
99
+ label {
100
+ display: inline-block;
101
+ position: relative;
102
+ user-select: none;
103
+ }
104
+
105
+ input[type='checkbox'] {
106
+ opacity: 0;
107
+ cursor: pointer;
108
+ height: 0;
109
+ width: 0;
110
+ margin-right: 11px;
111
+ }
112
+
113
+ input:not(:checked) ~ .checkmark {
114
+ background-color: transparent !important;
115
+ }
116
+
117
+ input:checked ~ .checkmark:after {
118
+ display: block;
119
+ }
120
+
121
+ .checkmark {
122
+ position: absolute;
123
+ top: 1px;
124
+ left: 0;
125
+ height: 7px;
126
+ width: 7px;
127
+ background-color: #eee;
128
+ border: 2px solid;
129
+ border-radius: 1px;
130
+ }
131
+
132
+ .checkmark:after {
133
+ content: "";
134
+ position: absolute;
135
+ display: none;
136
+
137
+ left: 0.5px;
138
+ top: -1.5px;
139
+ width: 3px;
140
+ height: 6px;
141
+ border: solid white;
142
+ border-width: 0 2px 2px 0;
143
+ -webkit-transform: rotate(45deg);
144
+ -ms-transform: rotate(45deg);
145
+ transform: rotate(45deg);
146
+ }
147
+ }
148
+ }
149
+
150
+ .grapher-primary-container-body {
151
+ width: 100%;
152
+ padding-left: 2px;
153
+ }
154
+ }
155
+
156
+ .series-key {
157
+ text-align: center;
158
+ margin-bottom: -14px;
159
+ position: relative;
160
+
161
+ .scale-label {
162
+ display: inline-block;
163
+ background: $series-key-axis-container-color;
164
+ color: $scale-label-color;
165
+ transform: rotate(-90deg);
166
+ width: 24px;
167
+ margin-left: -5px;
168
+ vertical-align: top;
169
+ margin-top: 4px;
170
+ padding-bottom: 2px;
171
+ cursor: pointer;
172
+ user-select: none;
173
+ }
174
+
175
+ .series-key-axis-container {
176
+ display: inline-block;
177
+ border: 1px solid $series-key-axis-container-color;
178
+
179
+ min-width: 18px;
180
+ min-height: 24px;
181
+ vertical-align: top;
182
+
183
+ white-space: nowrap;
184
+
185
+ & + .series-key-axis-container {
186
+ margin-left: 4px;
187
+ }
188
+
189
+ &.series-key-axis-container-showing-label {
190
+ .scale-label {
191
+ width: 46px;
192
+ margin-top: 15px;
193
+ margin-left: -15px;
194
+ margin-right: -12px;
195
+ }
196
+
197
+ .series-key-axis-label-container {
198
+ display: block;
199
+ }
200
+
201
+ .label-input-toggler {
202
+ path {
203
+ fill: $series-key-input-selected-border-color;
204
+ }
205
+ }
206
+ }
207
+
208
+ .series-key-axis-container-body {
209
+ display: inline-block;
210
+
211
+ & > div {
212
+ white-space: initial;
213
+ }
214
+ }
215
+
216
+ .series-key-axis-label-container {
217
+ display: none;
218
+ }
219
+
220
+ .label-input-toggler {
221
+ width: 16px;
222
+ cursor: pointer;
223
+ display: inline-block;
224
+ vertical-align: top;
225
+ margin: 4px 2px;
226
+
227
+ path {
228
+ fill: $series-key-axis-container-color;
229
+ }
230
+
231
+ &:hover {
232
+ path {
233
+ fill: $series-key-input-selected-border-color;
234
+ }
235
+ }
236
+ }
237
+ }
238
+
239
+ .series-key-item {
240
+ border: 1px solid currentColor;
241
+ padding: 2px;
242
+ margin: 2px;
243
+ display: inline-block;
244
+ cursor: pointer;
245
+ user-select: none;
246
+ background: $series-key-background;
247
+
248
+ & + .series-key-item {
249
+ margin-left: 4px;
250
+ }
251
+
252
+ &.series-key-item-highlighted {
253
+ box-shadow: 0 0 4px $series-key-shadow-color;
254
+ }
255
+ }
256
+ }
257
+
258
+ .range-selection {
259
+ color: $range-selection-text-color;
260
+ user-select: none;
261
+
262
+ &.range-not-dates {
263
+ color: $range-selection-text-color-faded;
264
+ }
265
+
266
+ .range-buttons {
267
+ text-align: right;
268
+
269
+ .options-bar {
270
+ display: inline-block;
271
+ }
272
+
273
+ .option-tooltip {
274
+ position: relative;
275
+ display: inline-block;
276
+ border-bottom: 1px dotted black;
277
+
278
+ .option-tooltip-text {
279
+ visibility: hidden;
280
+ color: $range-selection-text-selected-color;
281
+ background: $range-selection-button-selected-color;
282
+ text-align: center;
283
+ padding: 5px 5px;
284
+ border-radius: 6px;
285
+ position: absolute;
286
+ z-index: 1;
287
+ border: 1px solid black;
288
+
289
+ width: 120px;
290
+ margin-left: -65px;
291
+ top: calc(100% + 7px);
292
+ left: 50%;
293
+ }
294
+
295
+ &:hover .option-tooltip-text {
296
+ visibility: visible;
297
+ }
298
+
299
+ .option-tooltip-text::after {
300
+ content: " ";
301
+ position: absolute;
302
+ bottom: 100%;
303
+ left: 50%;
304
+ margin-left: -5px;
305
+ border-width: 5px;
306
+ border-style: solid;
307
+ border-color: transparent transparent black transparent;
308
+ }
309
+ }
310
+
311
+ .range-button {
312
+ display: inline-block;
313
+ cursor: pointer;
314
+ padding: 4px 8px;
315
+ @if ($range-selection-button-border == null) {
316
+ margin-left: 6px;
317
+ } @else {
318
+ margin-left: 4px;
319
+ }
320
+
321
+ border-radius: 2px;
322
+ background: $range-selection-button-color;
323
+ border: $range-selection-button-border;
324
+
325
+ &.range-button-selected {
326
+ color: $range-selection-text-selected-color;
327
+ background: $range-selection-button-selected-color;
328
+ border: $range-selection-selected-button-border;
329
+ }
330
+
331
+ &.range-button-disabled, &.range-button-selected.range-button-disabled {
332
+ cursor: not-allowed;
333
+ color: $range-selection-text-color-faded;
334
+ background: $range-selection-button-color-faded;
335
+ }
336
+
337
+ .icon-container {
338
+ position: relative;
339
+ width: 0;
340
+
341
+ &.icon-container-narrow {
342
+ svg {
343
+ left: -3px;
344
+ }
345
+ }
346
+
347
+ &.icon-container-square {
348
+ width: 5px;
349
+
350
+ svg {
351
+ left: -5px;
352
+ }
353
+ }
354
+
355
+ &.icon-container-448 {
356
+ width: 3px;
357
+
358
+ svg {
359
+ left: -5px;
360
+ }
361
+ }
362
+
363
+ &:before {
364
+ content: 'A';
365
+ opacity: 0;
366
+ }
367
+
368
+ svg {
369
+ height: 15px;
370
+ position: absolute;
371
+ top: -1px;
372
+ left: -4px;
373
+ }
374
+ }
375
+ }
376
+
377
+ .range-selection-history + .range-selection-history {
378
+ margin-right: 8px;
379
+ margin-left: 4px;
380
+ }
381
+
382
+ .percentile-button {
383
+ & > div {
384
+ display: inline-block;
385
+ }
386
+
387
+ input {
388
+ background: transparent;
389
+ border: 1px solid $series-key-input-border-color;
390
+ margin: 2px 8px 2px 0;
391
+ color: $series-key-input-text-color;
392
+ padding: 1px 2px;
393
+ width: 20px;
394
+ font-size: 11px;
395
+ -moz-appearance: textfield;
396
+
397
+ &:focus {
398
+ outline: none;
399
+ border-color: $series-key-input-selected-border-color;
400
+ }
401
+
402
+ &::-webkit-outer-spin-button,
403
+ &::-webkit-inner-spin-button {
404
+ -webkit-appearance: none;
405
+ margin: 0;
406
+ }
407
+ }
408
+
409
+ .icon-container.icon-container-narrow {
410
+ svg {
411
+ height: 12px;
412
+ top: 1px;
413
+ left: -5px;
414
+ }
415
+ }
416
+ }
417
+
418
+ .showing-options-button {
419
+ margin-right: 8px;
420
+ }
421
+ }
422
+ }
423
+
424
+ .grapher-main-row {
425
+ display: flex;
426
+
427
+ .central-container {
428
+ width: 100%;
429
+ }
430
+ }
431
+
432
+ .range-graph-container {
433
+ display: flex;
434
+ }
435
+
436
+ .graph-body {
437
+ width: 100%;
438
+ height: $primary-graph-body-height;
439
+ position: relative;
440
+
441
+ canvas {
442
+ width: 100%;
443
+ height: 100%;
444
+ }
445
+
446
+ .grapher-tooltip, .grapher-draggable-points, .grapher-vertical-lines {
447
+ position: absolute;
448
+ top: 0;
449
+
450
+ svg {
451
+ position: absolute;
452
+ overflow: visible;
453
+ }
454
+ }
455
+
456
+ .grapher-vertical-lines {
457
+ pointer-events: none;
458
+ user-select: none;
459
+ }
460
+
461
+ .grapher-tooltip {
462
+ .tooltip-item {
463
+ path {
464
+ fill: $tooltip-background-color;
465
+ }
466
+
467
+ text {
468
+ fill: $tooltip-text-color;
469
+ dominant-baseline: hanging;
470
+ text-anchor: start;
471
+ }
472
+
473
+ &.tooltip-item-fixed {
474
+ path {
475
+ fill: rgba($tooltip-background-color, 1);
476
+ }
477
+ }
478
+ }
479
+
480
+ .line {
481
+ position: absolute;
482
+ height: 400px;
483
+ border-left: 1px solid $tooltip-line-color;
484
+ }
485
+ }
486
+
487
+ .grapher-context-menu {
488
+ position: absolute;
489
+ top: 0;
490
+ left: 0;
491
+ .menu-item {
492
+
493
+ .menu-text {
494
+ user-select: all;
495
+ position: absolute;
496
+ top: 0;
497
+ background: $tooltip-background-color;
498
+ border: 1px solid $annotation-background-color;
499
+ color: $tooltip-text-color;
500
+ padding: 2px 4px;
501
+ max-width: max-content;
502
+ width: 200px;
503
+ }
504
+ }
505
+ }
506
+
507
+ .grapher-draggable-points {
508
+ circle {
509
+ cursor: pointer;
510
+ }
511
+ }
512
+
513
+ .grapher-vertical-lines {
514
+ line {
515
+ stroke: $vertical-line-color;
516
+ }
517
+
518
+ polygon {
519
+ fill: $vertical-line-color;
520
+ }
521
+ }
522
+
523
+ .grapher-annotations {
524
+ position: absolute;
525
+ top: 0;
526
+ pointer-events: none;
527
+ user-select: none;
528
+
529
+ .grapher-annotation {
530
+ position: absolute;
531
+
532
+ .annotation-marker {
533
+ display: inline-block;
534
+ height: $primary-graph-body-height;
535
+ background: $annotation-background-color;
536
+ }
537
+
538
+ .annotation-text {
539
+ position: absolute;
540
+ top: 0;
541
+ background: $tooltip-background-color;
542
+ border: 1px solid $annotation-background-color;
543
+ color: $tooltip-text-color;
544
+ padding: 2px 4px;
545
+ max-width: max-content;
546
+ width: 200px;
547
+ }
548
+ }
549
+ }
550
+
551
+ .bounds-selection {
552
+ position: absolute;
553
+ background: $range-graph-selection-range-color;
554
+ }
555
+ }
556
+
557
+ .axis {
558
+ overflow: visible;
559
+ user-select: none;
560
+
561
+ &.x-axis {
562
+ width: 1px;
563
+ height: $x-axis-height;
564
+ display: block;
565
+
566
+ .axis-item {
567
+ text {
568
+ text-anchor: middle;
569
+ }
570
+
571
+ &.axis-item-first {
572
+ text {
573
+ text-anchor: start;
574
+ }
575
+ }
576
+
577
+ &.axis-item-last {
578
+ text {
579
+ text-anchor: end;
580
+ }
581
+ }
582
+ }
583
+ }
584
+
585
+ &.y-axis {
586
+ height: $primary-graph-body-height;
587
+
588
+ .axis-item text {
589
+ text-anchor: end;
590
+ alignment-baseline: middle;
591
+ }
592
+
593
+ .y-axis-label {
594
+ text-anchor: middle;
595
+ fill: $axis-text-color;
596
+
597
+ &.y-axis-big-label {
598
+ font-size: 18px;
599
+ }
600
+ }
601
+
602
+ .series-color-box {
603
+ cursor: pointer;
604
+ }
605
+
606
+ &.y-axis-right {
607
+ .axis-item text {
608
+ text-anchor: start;
609
+ }
610
+ }
611
+ }
612
+
613
+ .axis-line {
614
+ stroke: $axis-line-color;
615
+ stroke-width: $axis-line-width;
616
+ }
617
+
618
+ .axis-line-shadow {
619
+ stroke: $axis-tick-color;
620
+ stroke-width: 1px;
621
+ }
622
+
623
+ .axis-item {
624
+ path {
625
+ stroke: $axis-tick-color;
626
+ stroke-width: 1px;
627
+ }
628
+
629
+ text {
630
+ fill: $axis-text-color;
631
+ font-size: 8px;
632
+ }
633
+
634
+ &.axis-item-major {
635
+ .axis-tick {
636
+ stroke-width: 2px;
637
+ }
638
+ }
639
+
640
+ &.axis-item-big-labels {
641
+ text {
642
+ font-size: 16px;
643
+ }
644
+ }
645
+ }
646
+ }
647
+
648
+ .range-selection-graph {
649
+ width: 100%;
650
+ padding-bottom: $range-graph-selection-bar-size;
651
+
652
+ .graph-body-secondary {
653
+ height: $secondary-graph-body-height;
654
+
655
+ svg {
656
+ position: absolute;
657
+ left: 0;
658
+ height: $secondary-graph-body-height;
659
+ width: 100%;
660
+ overflow: visible;
661
+
662
+ .target-selection {
663
+ fill: $range-graph-selection-range-color;
664
+ cursor: ew-resize;
665
+ }
666
+
667
+ .selection-bar {
668
+ fill: $range-graph-selection-bar-color;
669
+ cursor: ew-resize;
670
+ }
671
+
672
+ .selection-bar-track {
673
+ fill: $range-graph-selection-bar-track-color;
674
+ }
675
+
676
+ .selection-bar-rifles {
677
+ fill: none;
678
+ stroke-width: 1;
679
+ stroke: $range-graph-selection-bar-rifles-color;
680
+ }
681
+
682
+ .selection-bar-handle {
683
+ stroke: $range-graph-handle-color;
684
+ stroke-width: 1;
685
+ fill: $range-graph-handle-fill-color;
686
+ cursor: ew-resize;
687
+ }
688
+
689
+ .target-selection-outline {
690
+ stroke: $range-graph-selection-outline-color;
691
+ fill: none;
692
+ }
693
+
694
+ .axis-item {
695
+ text {
696
+ fill: $range-graph-axis-text-color;
697
+ text-anchor: start;
698
+ font-size: 8px;
699
+ user-select: none;
700
+ dominant-baseline: text-after-edge;
701
+ }
702
+
703
+ path {
704
+ stroke: $axis-tick-color;
705
+ stroke-width: 1px;
706
+ }
707
+ }
708
+ }
709
+ }
710
+ }
711
+
712
+ input, textarea {
713
+ background: transparent;
714
+ border: 1px solid $series-key-input-border-color;
715
+ margin: 2px 0;
716
+ color: $series-key-input-text-color;
717
+ padding: 1px 2px;
718
+ text-align: center;
719
+
720
+ &:focus {
721
+ outline: none;
722
+ border-color: $series-key-input-selected-border-color;
723
+ }
724
+ }
725
+
726
+ &.grapher-dragging-y {
727
+ .y-axis {
728
+ border: 2px dashed silver;
729
+ margin: -2px;
730
+ flex-shrink: 0;
731
+
732
+ & + .y-axis {
733
+ border-left: none;
734
+ }
735
+ }
736
+ }
737
+
738
+ &.grapher-fullscreen {
739
+ height: calc(100vh - 2*#{$padding});
740
+ }
741
+
742
+ &.grapher-fixed-height {
743
+ .grapher-primary-container-outer {
744
+ height: 100%;
745
+
746
+ .grapher-primary-container-body {
747
+ height: 100%;
748
+ display: flex;
749
+ flex-direction: column;
750
+
751
+ .grapher-main-row {
752
+ flex-grow: 1;
753
+
754
+ .central-container {
755
+ display: flex;
756
+ flex-direction: column;
757
+ height: 100%;
758
+
759
+ > .graph-body {
760
+ flex-grow: 1;
761
+ height: unset;
762
+ }
763
+ }
764
+
765
+ .axis.y-axis {
766
+ height: calc(100% - #{2*$x-axis-height});
767
+ }
768
+ }
769
+ }
770
+ }
771
+ }
772
+
773
+ &.new-grapher {
774
+ height: auto;
775
+ border: 2px dashed silver;
776
+ text-align: center;
777
+ color: $new-grapher-color;
778
+ }
779
+ }
780
+
781
+ @mixin grapher-theme-night (
782
+ $primary-graph-body-height: 400px,
783
+ $secondary-graph-body-height: 50px,
784
+ ) {
785
+ @include grapher(
786
+ $primary-graph-body-height,
787
+ $secondary-graph-body-height
788
+ );
789
+ }
790
+
791
+ @mixin grapher-theme-day (
792
+ $primary-graph-body-height: 400px,
793
+ $secondary-graph-body-height: 50px,
794
+ ) {
795
+ @include grapher(
796
+ $primary-graph-body-height,
797
+ $secondary-graph-body-height,
798
+
799
+ $background-color-1: #FFF,
800
+ $background-color-2: #FFF,
801
+
802
+ $tooltip-line-color: invert(#CCC),
803
+ $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),
804
+ $tooltip-text-color: invert(#F0F0F0),
805
+ $vertical-line-color: invert(#CCC),
806
+
807
+ $axis-line-color: #656565,
808
+ $axis-tick-color: #BFBFBF,
809
+ $axis-text-color: invert(#E0E0E3),
810
+
811
+ $range-selection-text-color: #444,
812
+ $range-selection-button-color: white,
813
+ $range-selection-button-selected-color: white,
814
+ $range-selection-text-selected-color: black,
815
+ $range-selection-text-color-faded: #888,
816
+ $range-selection-button-color-faded: #EEE,
817
+ $range-selection-button-border: 1px dotted silver,
818
+ $range-selection-selected-button-border: 1px solid black,
819
+
820
+ $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),
821
+ $range-graph-selection-outline-color: #333,
822
+ $range-graph-selection-bar-color: #B0B0B7,
823
+ $range-graph-selection-bar-track-color: #EEE,
824
+ $range-graph-selection-bar-rifles-color: #333,
825
+ $range-graph-handle-color: #333,
826
+ $range-graph-handle-fill-color: #B0B0B7,
827
+
828
+ $annotation-background-color: rgba(0, 0, 0, 0.3),
829
+
830
+ $series-key-axis-container-color: #B0B0B7,
831
+ $series-key-input-border-color: #E0E0E3,
832
+ $series-key-input-selected-border-color: #505053,
833
+ $series-key-input-text-color: #222,
834
+ $series-key-background: null,
835
+ $series-key-shadow-color: black,
836
+ $scale-label-color: black,
837
+
838
+ $title-color: black,
839
+
840
+ $sidebar-background-color: #EEE,
841
+ $sidebar-text-color: #111,
842
+
843
+ $new-grapher-color: #222
844
+ );
845
+ }
846
+
847
+ @mixin grapher-theme-export (
848
+ $primary-graph-body-height: 400px,
849
+ $secondary-graph-body-height: 50px,
850
+ ) {
851
+ @include grapher(
852
+ $primary-graph-body-height,
853
+ $secondary-graph-body-height,
854
+
855
+ $background-color-1: #FFF,
856
+ $background-color-2: #FFF,
857
+
858
+ $tooltip-line-color: invert(#CCC),
859
+ $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),
860
+ $tooltip-text-color: invert(#F0F0F0),
861
+ $vertical-line-color: invert(#CCC),
862
+
863
+ $axis-line-color: black,
864
+ $axis-line-width: 1px,
865
+ $axis-tick-color: #BFBFBF,
866
+ $axis-text-color: black,
867
+
868
+ $range-selection-text-color: #444,
869
+ $range-selection-button-color: white,
870
+ $range-selection-button-selected-color: white,
871
+ $range-selection-text-selected-color: black,
872
+ $range-selection-text-color-faded: #888,
873
+ $range-selection-button-color-faded: #EEE,
874
+ $range-selection-button-border: 1px dotted silver,
875
+ $range-selection-selected-button-border: 1px solid black,
876
+
877
+ $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),
878
+ $range-graph-selection-outline-color: #333,
879
+ $range-graph-selection-bar-color: #B0B0B7,
880
+ $range-graph-selection-bar-track-color: #EEE,
881
+ $range-graph-selection-bar-rifles-color: #333,
882
+ $range-graph-handle-color: #333,
883
+ $range-graph-handle-fill-color: #B0B0B7,
884
+
885
+ $annotation-background-color: rgba(0, 0, 0, 0.3),
886
+
887
+ $series-key-axis-container-color: #B0B0B7,
888
+ $series-key-input-border-color: #E0E0E3,
889
+ $series-key-input-selected-border-color: #505053,
890
+ $series-key-input-text-color: #222,
891
+ $series-key-background: null,
892
+ $series-key-shadow-color: black,
893
+ $scale-label-color: black,
894
+
895
+ $title-color: black,
896
+
897
+ $sidebar-background-color: #EEE,
898
+ $sidebar-text-color: #111,
899
+
900
+ $new-grapher-color: #222
901
+ );
902
+ }
903
+
904
+ .grapher-night {
905
+ @include grapher-theme-night();
906
+ }
907
+
908
+ .grapher-day {
909
+ @include grapher-theme-day();
910
+ }
911
+
912
+ .grapher-export {
913
+ @include grapher-theme-export();
914
+ }