@trdrs/quickcharts 3.0.0 → 4.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 (78) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/README.md +234 -23
  3. package/dist/adapters/rest.d.ts +1 -1
  4. package/dist/{ar-HLKX6L6O.js → ar-FXZ5QJUR.js} +205 -56
  5. package/dist/ar-FXZ5QJUR.js.map +1 -0
  6. package/dist/{assets-C1VjN7DP.d.ts → assets-Gg-UquDA.d.ts} +284 -61
  7. package/dist/{ca_ES-3ALUJ2FI.js → ca_ES-3WVKFBIF.js} +205 -56
  8. package/dist/ca_ES-3WVKFBIF.js.map +1 -0
  9. package/dist/chunk-C4MEVUNK.js +11449 -0
  10. package/dist/chunk-C4MEVUNK.js.map +1 -0
  11. package/dist/{de-GXKOZYHP.js → de-V72Q3OI7.js} +205 -56
  12. package/dist/de-V72Q3OI7.js.map +1 -0
  13. package/dist/drawings.d.ts +24 -13
  14. package/dist/drawings.js +5 -1
  15. package/dist/{es-R7WSUWO2.js → es-CNQ3OJ6E.js} +205 -56
  16. package/dist/es-CNQ3OJ6E.js.map +1 -0
  17. package/dist/feature-manifest.json +74 -11
  18. package/dist/{fr-EBUMQLPT.js → fr-5WQBCGR4.js} +205 -56
  19. package/dist/fr-5WQBCGR4.js.map +1 -0
  20. package/dist/{he_IL-GCAXKEWB.js → he_IL-WXKA77UE.js} +205 -56
  21. package/dist/he_IL-WXKA77UE.js.map +1 -0
  22. package/dist/{id_ID-6JYEEKEA.js → id_ID-XPBAYSWK.js} +205 -56
  23. package/dist/id_ID-XPBAYSWK.js.map +1 -0
  24. package/dist/index.d.ts +1775 -1660
  25. package/dist/index.js +4513 -1815
  26. package/dist/index.js.map +1 -1
  27. package/dist/{it-IMLHI5VO.js → it-DR2EBNWX.js} +205 -56
  28. package/dist/it-DR2EBNWX.js.map +1 -0
  29. package/dist/{ja-QDEQ2EYA.js → ja-URB2CPXO.js} +205 -56
  30. package/dist/ja-URB2CPXO.js.map +1 -0
  31. package/dist/{ko-MTA7BZI3.js → ko-OE47NYVP.js} +205 -56
  32. package/dist/ko-OE47NYVP.js.map +1 -0
  33. package/dist/{ms_MY-K4EAHE5J.js → ms_MY-BKCFRK2K.js} +205 -56
  34. package/dist/ms_MY-BKCFRK2K.js.map +1 -0
  35. package/dist/{pl-CIIDQ3SB.js → pl-3IKQRG3Y.js} +205 -56
  36. package/dist/pl-3IKQRG3Y.js.map +1 -0
  37. package/dist/{pt-3HA2PDUN.js → pt-PZHV5EZE.js} +205 -56
  38. package/dist/pt-PZHV5EZE.js.map +1 -0
  39. package/dist/quickcharts.css +1627 -422
  40. package/dist/{resources-C0cYryO9.d.ts → resources-Le6flcEn.d.ts} +1 -1
  41. package/dist/{ru-2F2VGHMW.js → ru-BAL6RQUV.js} +205 -56
  42. package/dist/ru-BAL6RQUV.js.map +1 -0
  43. package/dist/{sv-HCBRKFRZ.js → sv-Y6GBGDHM.js} +205 -56
  44. package/dist/sv-Y6GBGDHM.js.map +1 -0
  45. package/dist/{th-WWPM2QKB.js → th-MAMLMZKU.js} +205 -56
  46. package/dist/th-MAMLMZKU.js.map +1 -0
  47. package/dist/theme-manifest.json +148 -14
  48. package/dist/{tr-M57AMCWK.js → tr-3LQHINUZ.js} +205 -56
  49. package/dist/tr-3LQHINUZ.js.map +1 -0
  50. package/dist/{vi-YJHN2OK7.js → vi-GR4PSDKP.js} +205 -56
  51. package/dist/vi-GR4PSDKP.js.map +1 -0
  52. package/dist/{zh-AIFC65OE.js → zh-2RJ5VNAI.js} +205 -56
  53. package/dist/zh-2RJ5VNAI.js.map +1 -0
  54. package/dist/{zh_TW-2LLLW4H6.js → zh_TW-XEBSACHU.js} +205 -56
  55. package/dist/zh_TW-XEBSACHU.js.map +1 -0
  56. package/package.json +1 -1
  57. package/dist/ar-HLKX6L6O.js.map +0 -1
  58. package/dist/ca_ES-3ALUJ2FI.js.map +0 -1
  59. package/dist/chunk-DBJQXHLQ.js +0 -7003
  60. package/dist/chunk-DBJQXHLQ.js.map +0 -1
  61. package/dist/de-GXKOZYHP.js.map +0 -1
  62. package/dist/es-R7WSUWO2.js.map +0 -1
  63. package/dist/fr-EBUMQLPT.js.map +0 -1
  64. package/dist/he_IL-GCAXKEWB.js.map +0 -1
  65. package/dist/id_ID-6JYEEKEA.js.map +0 -1
  66. package/dist/it-IMLHI5VO.js.map +0 -1
  67. package/dist/ja-QDEQ2EYA.js.map +0 -1
  68. package/dist/ko-MTA7BZI3.js.map +0 -1
  69. package/dist/ms_MY-K4EAHE5J.js.map +0 -1
  70. package/dist/pl-CIIDQ3SB.js.map +0 -1
  71. package/dist/pt-3HA2PDUN.js.map +0 -1
  72. package/dist/ru-2F2VGHMW.js.map +0 -1
  73. package/dist/sv-HCBRKFRZ.js.map +0 -1
  74. package/dist/th-WWPM2QKB.js.map +0 -1
  75. package/dist/tr-M57AMCWK.js.map +0 -1
  76. package/dist/vi-YJHN2OK7.js.map +0 -1
  77. package/dist/zh-AIFC65OE.js.map +0 -1
  78. package/dist/zh_TW-2LLLW4H6.js.map +0 -1
@@ -14,7 +14,7 @@
14
14
  --qc-canvas-paneBorder: #ebebeb;
15
15
  --qc-chrome-border: #ebebeb;
16
16
  --qc-chrome-borderStrong: #8c8c8c;
17
- --qc-chrome-caret: #0f0f0f;
17
+ --qc-chrome-caret: #707070;
18
18
  --qc-chrome-fieldBorder: #dbdbdb;
19
19
  --qc-chrome-grip: #b8b8b8;
20
20
  --qc-chrome-radius: 6px;
@@ -27,12 +27,19 @@
27
27
  --qc-control-fieldFill: #f2f2f2;
28
28
  --qc-control-fieldInvalid: #f23645;
29
29
  --qc-control-mark: #ffffff;
30
+ --qc-control-neutral: #f2f2f2;
31
+ --qc-control-neutralHover: #ebebeb;
32
+ --qc-control-neutralInk: #000000;
33
+ --qc-control-neutralPressed: #dbdbdb;
30
34
  --qc-control-off: #9c9c9c;
31
35
  --qc-control-offHover: #8c8c8c;
32
36
  --qc-control-offPressed: #b8b8b8;
33
37
  --qc-control-on: #2e2e2e;
34
38
  --qc-control-onHover: #4a4a4a;
39
+ --qc-control-onInk: #ffffff;
35
40
  --qc-control-onPressed: #707070;
41
+ --qc-control-outline: #2e2e2e;
42
+ --qc-control-selectEdgeHover: #a8a8a8;
36
43
  --qc-drawing-fill: rgba(41, 98, 255, 0.15);
37
44
  --qc-drawing-handle: #ffffff;
38
45
  --qc-drawing-line: #2962ff;
@@ -43,15 +50,17 @@
43
50
  --qc-illustration-ink: #1e222d;
44
51
  --qc-motion-durationBase: 150ms;
45
52
  --qc-motion-durationFast: 90ms;
53
+ --qc-motion-durationGlide: 100ms;
46
54
  --qc-motion-durationModerate: 250ms;
47
55
  --qc-motion-durationSlow: 350ms;
48
56
  --qc-motion-durationSlower: 500ms;
57
+ --qc-motion-easingInOut: ease-in-out;
49
58
  --qc-motion-easingLinear: linear;
50
59
  --qc-motion-easingOut: ease-out;
51
60
  --qc-motion-easingSpring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
52
61
  --qc-motion-easingStandard: ease;
53
62
  --qc-motion-scaleEnter: 0.97;
54
- --qc-overlay-scrim: rgba(0, 0, 0, 0.35);
63
+ --qc-overlay-scrim: rgba(156, 156, 156, 0.5);
55
64
  --qc-overlay-separator: #ebebeb;
56
65
  --qc-overlay-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
57
66
  --qc-overlay-surface: #ffffff;
@@ -80,14 +89,14 @@
80
89
  --qc-state-selection: rgba(31, 86, 238, 0.18);
81
90
  --qc-status-info: #1160c4;
82
91
  --qc-status-loading: #787b86;
83
- --qc-status-negative: #cc2f3c;
84
- --qc-status-positive: #067a67;
92
+ --qc-status-negative: #df323f;
93
+ --qc-status-positive: #078671;
85
94
  --qc-status-sessionAfterHours: #f5a623;
86
95
  --qc-status-sessionClosed: rgba(0, 0, 0, 0.35);
87
96
  --qc-status-sessionExtended: #4c98fb;
88
97
  --qc-status-sessionOpen: #22c55e;
89
98
  --qc-status-sessionPreMarket: #4c98fb;
90
- --qc-status-warning: #8a5a00;
99
+ --qc-status-warning: #ac6600;
91
100
  --qc-text-disabled: #b8b8b8;
92
101
  --qc-text-fontFamily: -apple-system, BlinkMacSystemFont, "Trebuchet MS", Roboto, Ubuntu, sans-serif;
93
102
  --qc-text-fontSizeAxis: 13px;
@@ -98,7 +107,7 @@
98
107
  --qc-text-highlight: #2962ff;
99
108
  --qc-text-inverse: #ffffff;
100
109
  --qc-text-link: #2962ff;
101
- --qc-text-muted: #636363;
110
+ --qc-text-muted: #6a6a6a;
102
111
  --qc-text-onCanvas: #0f0f0f;
103
112
  --qc-text-primary: #0f0f0f;
104
113
  --qc-text-secondary: #4a4a4a;
@@ -122,25 +131,34 @@
122
131
  --qc-control-fieldFill: #2e2e2e;
123
132
  --qc-control-fieldInvalid: #f23645;
124
133
  --qc-control-mark: #2e2e2e;
134
+ --qc-control-neutral: #2e2e2e;
135
+ --qc-control-neutralHover: #3d3d3d;
136
+ --qc-control-neutralInk: #ffffff;
137
+ --qc-control-neutralPressed: #4a4a4a;
125
138
  --qc-control-off: #636363;
126
139
  --qc-control-offHover: #707070;
127
140
  --qc-control-offPressed: #636363;
128
141
  --qc-control-on: #f2f2f2;
129
142
  --qc-control-onHover: #dbdbdb;
143
+ --qc-control-onInk: #000000;
130
144
  --qc-control-onPressed: #8c8c8c;
131
- --qc-drawing-fill: rgba(76, 152, 251, 0.15);
145
+ --qc-control-outline: #ffffff;
146
+ --qc-control-selectEdgeHover: #808080;
147
+ --qc-drawing-fill: rgba(41, 98, 255, 0.15);
132
148
  --qc-drawing-handle: #0f0f0f;
133
- --qc-drawing-line: #4c98fb;
134
- --qc-drawing-selected: #4c98fb;
149
+ --qc-drawing-line: #2962ff;
150
+ --qc-drawing-selected: #1e53e5;
135
151
  --qc-drawing-text: #dbdbdb;
136
152
  --qc-illustration-accent: #1976d2;
137
153
  --qc-illustration-accentInk: #d1d4dc;
138
154
  --qc-illustration-ink: #d1d4dc;
139
155
  --qc-motion-durationBase: 150ms;
140
156
  --qc-motion-durationFast: 90ms;
157
+ --qc-motion-durationGlide: 100ms;
141
158
  --qc-motion-durationModerate: 250ms;
142
159
  --qc-motion-durationSlow: 350ms;
143
160
  --qc-motion-durationSlower: 500ms;
161
+ --qc-motion-easingInOut: ease-in-out;
144
162
  --qc-motion-easingLinear: linear;
145
163
  --qc-motion-easingOut: ease-out;
146
164
  --qc-motion-easingSpring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
@@ -175,14 +193,14 @@
175
193
  --qc-state-selection: rgba(82, 160, 252, 0.22);
176
194
  --qc-status-info: #68a5ff;
177
195
  --qc-status-loading: #787b86;
178
- --qc-status-negative: #f7525f;
196
+ --qc-status-negative: #f34452;
179
197
  --qc-status-positive: #089981;
180
198
  --qc-status-sessionAfterHours: #f5a623;
181
199
  --qc-status-sessionClosed: rgba(255, 255, 255, 0.35);
182
200
  --qc-status-sessionExtended: #4c98fb;
183
201
  --qc-status-sessionOpen: #22c55e;
184
202
  --qc-status-sessionPreMarket: #4c98fb;
185
- --qc-status-warning: #f5a623;
203
+ --qc-status-warning: #ff9800;
186
204
  --qc-text-disabled: #575757;
187
205
  --qc-text-fontFamily: -apple-system, BlinkMacSystemFont, "Trebuchet MS", Roboto, Ubuntu, sans-serif;
188
206
  --qc-text-fontSizeAxis: 13px;
@@ -193,7 +211,7 @@
193
211
  --qc-text-highlight: #5280ff;
194
212
  --qc-text-inverse: #0f0f0f;
195
213
  --qc-text-link: #5b9cf6;
196
- --qc-text-muted: #9c9c9c;
214
+ --qc-text-muted: #9b9b9b;
197
215
  --qc-text-onCanvas: #dbdbdb;
198
216
  --qc-text-primary: #dbdbdb;
199
217
  --qc-text-secondary: #b8b8b8;
@@ -203,6 +221,7 @@
203
221
  [data-qc-theme] {
204
222
  --qc-motion-durationBase: 0ms !important;
205
223
  --qc-motion-durationFast: 0ms !important;
224
+ --qc-motion-durationGlide: 0ms !important;
206
225
  --qc-motion-durationModerate: 0ms !important;
207
226
  --qc-motion-durationSlow: 0ms !important;
208
227
  --qc-motion-durationSlower: 0ms !important;
@@ -245,6 +264,16 @@
245
264
  box-sizing: inherit;
246
265
  }
247
266
 
267
+ /* Every control reads in the chart's font: a button, a field or a list takes the root's family rather
268
+ * than the browser's own control font, whatever words it shows or holds. A recipe that sets a size
269
+ * or a weight keeps it, and one that names a family of its own outranks this. */
270
+ [data-qc-theme] button,
271
+ [data-qc-theme] input,
272
+ [data-qc-theme] select,
273
+ [data-qc-theme] textarea {
274
+ font-family: inherit;
275
+ }
276
+
248
277
  /* Surfaces ------------------------------------------------------------------------------------ */
249
278
 
250
279
  [data-qc-theme] .qc-surface {
@@ -380,7 +409,7 @@
380
409
  }
381
410
 
382
411
  /* A field that cannot be edited stands on the read-only fill, its edge at rest under the pointer. A
383
- * disabled one stands its words back too. */
412
+ * disabled one stands its words back too, in the disabled ink. */
384
413
  [data-qc-theme] .qc-field[readonly] {
385
414
  background: var(--qc-control-fieldFill);
386
415
  border-color: var(--qc-control-fieldEdge);
@@ -388,7 +417,7 @@
388
417
 
389
418
  [data-qc-theme] .qc-field:disabled,
390
419
  [data-qc-theme] .qc-field[aria-disabled='true'] {
391
- color: var(--qc-text-muted);
420
+ color: var(--qc-text-disabled);
392
421
  background: var(--qc-control-fieldFill);
393
422
  border-color: var(--qc-control-fieldEdge);
394
423
  cursor: default;
@@ -418,7 +447,7 @@
418
447
  box-shadow: inset 0 0 0 1px var(--qc-control-fieldInvalid);
419
448
  }
420
449
 
421
- /* A select draws its own chevron: the 18px mark in the muted ink, in a 20 by 28 slot 2px in from the
450
+ /* A select draws its own chevron: the 18px mark in the caret ink, in a 20 by 28 slot 2px in from the
422
451
  * end of the box. A native select gives up the slot's room and takes the press the slot lets
423
452
  * through; a list button lays the slot out after its face and turns the mark while its list is open,
424
453
  * keyed on its own state, so a list button inside some other open thing does not turn. */
@@ -442,7 +471,7 @@
442
471
  justify-content: center;
443
472
  width: 20px;
444
473
  height: 28px;
445
- color: var(--qc-text-muted);
474
+ color: var(--qc-chrome-caret);
446
475
  pointer-events: none;
447
476
  }
448
477
 
@@ -453,7 +482,7 @@
453
482
  }
454
483
 
455
484
  [data-qc-theme] .qc-select-chevron > svg {
456
- transition: rotate var(--qc-motion-durationSlow) var(--qc-motion-easingSpring);
485
+ transition: rotate var(--qc-motion-durationSlow) var(--qc-motion-easingStandard);
457
486
  }
458
487
 
459
488
  [data-qc-theme] [aria-expanded='true'] > .qc-select-chevron > svg {
@@ -1892,12 +1921,45 @@
1892
1921
 
1893
1922
  /* The inline text editor over the pane, the glyph picker and the image picker. */
1894
1923
 
1895
- /* The editor sits at the drawing's own text position in the drawing's own type; its size follows
1896
- * the content and is written by the editor, because it is measured text. The ring is the focus
1897
- * role, so it reads as the field it is without a fill hiding the chart. */
1924
+ /* The text editor over the pane. Its place, size and type are written by the editor, because they
1925
+ * are the words' own. */
1898
1926
  [data-qc-theme] .qc-drawing-text-editor {
1899
1927
  position: absolute;
1900
1928
  z-index: 8;
1929
+ margin: 0;
1930
+ resize: none;
1931
+ pointer-events: auto;
1932
+ }
1933
+
1934
+ /* Over a drawing that types its words on the chart, the field is seen by nobody: the chart paints
1935
+ * the words, the caret, the selection and the placeholder, and the field only takes the keys. It
1936
+ * lies exactly over the painted words, 2px of padding around their block, in their own type with
1937
+ * nothing of its own (no spacing, features or decoration) that would part its caret from them. */
1938
+ [data-qc-theme] .qc-drawing-text-editor[data-qc-editor='inline'] {
1939
+ box-sizing: border-box;
1940
+ min-width: 0;
1941
+ max-width: none;
1942
+ padding: 2px;
1943
+ overflow: hidden;
1944
+ overflow-wrap: break-word;
1945
+ color: inherit;
1946
+ font-feature-settings: normal;
1947
+ font-kerning: auto;
1948
+ letter-spacing: normal;
1949
+ word-spacing: normal;
1950
+ text-indent: 0;
1951
+ text-transform: none;
1952
+ background: none;
1953
+ border: 0;
1954
+ outline: none;
1955
+ box-shadow: none;
1956
+ opacity: 0;
1957
+ }
1958
+
1959
+ /* Over any other drawing, the editor is a box at the drawing's own text position in the drawing's
1960
+ * own type, its size following the content. The ring is the focus role, so it reads as the field it
1961
+ * is without a fill hiding the chart. */
1962
+ [data-qc-theme] .qc-drawing-text-editor[data-qc-editor='box'] {
1901
1963
  padding: 3px 6px;
1902
1964
  overflow: hidden;
1903
1965
  text-align: center;
@@ -1907,11 +1969,9 @@
1907
1969
  border-radius: 2px;
1908
1970
  outline: none;
1909
1971
  box-shadow: 0 0 0 1px var(--qc-state-focusRing);
1910
- resize: none;
1911
- pointer-events: auto;
1912
1972
  }
1913
1973
 
1914
- [data-qc-theme] .qc-drawing-text-editor::placeholder {
1974
+ [data-qc-theme] .qc-drawing-text-editor[data-qc-editor='box']::placeholder {
1915
1975
  color: var(--qc-text-muted);
1916
1976
  }
1917
1977
 
@@ -2065,7 +2125,7 @@
2065
2125
  color: var(--qc-text-primary);
2066
2126
  background: var(--qc-chrome-surfaceRaised);
2067
2127
  border: 1px dashed var(--qc-chrome-borderStrong);
2068
- border-radius: var(--qc-chrome-radiusLarge);
2128
+ border-radius: 4px;
2069
2129
  cursor: pointer;
2070
2130
  }
2071
2131
 
@@ -2081,16 +2141,21 @@
2081
2141
  object-fit: contain;
2082
2142
  }
2083
2143
 
2144
+ /* The words a drop box states: its call at 16 on 24 with 8px around it and 8px under it, then the
2145
+ * formats and the size at 14 on 21 in the secondary ink. */
2084
2146
  [data-qc-theme] .qc-drawing-drop-words {
2085
2147
  display: flex;
2086
2148
  flex-direction: column;
2087
- gap: 4px;
2088
2149
  align-items: center;
2089
- font-size: var(--qc-text-fontSizeSmall);
2150
+ font-size: var(--qc-text-fontSizeBase);
2151
+ line-height: 21px;
2090
2152
  }
2091
2153
 
2092
2154
  [data-qc-theme] .qc-drawing-drop-title {
2093
- font-size: var(--qc-text-fontSizeBase);
2155
+ margin-bottom: 8px;
2156
+ padding: 8px;
2157
+ font-size: 16px;
2158
+ line-height: 24px;
2094
2159
  }
2095
2160
 
2096
2161
  [data-qc-theme] .qc-drawing-file {
@@ -2151,33 +2216,167 @@
2151
2216
  cursor: default;
2152
2217
  }
2153
2218
 
2154
- /* The text fields, selects and number fields are the chart's 34px field box; these rules give them
2155
- * their widths alone. */
2219
+ /* On a settings page a row lays out nothing of its own: its label and its controls are the grid's
2220
+ * two cells, each 50px tall around a 34px control. A label stands 20px clear of the controls and
2221
+ * wraps rather than cutting a word short; the controls stand 8px apart. */
2222
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-row {
2223
+ display: contents;
2224
+ }
2225
+
2226
+ [data-qc-theme] .qc-drawing-page .qc-drawing-row-label {
2227
+ display: flex;
2228
+ align-items: center;
2229
+ min-width: 0;
2230
+ min-height: 50px;
2231
+ padding: 8px 20px 8px 0;
2232
+ overflow: visible;
2233
+ color: var(--qc-text-primary);
2234
+ white-space: normal;
2235
+ overflow-wrap: break-word;
2236
+ }
2237
+
2238
+ [data-qc-theme] .qc-drawing-page .qc-drawing-row-controls {
2239
+ flex-wrap: nowrap;
2240
+ gap: 8px;
2241
+ min-width: 0;
2242
+ min-height: 50px;
2243
+ padding: 8px 0;
2244
+ }
2245
+
2246
+ /* A checkbox row: the 18px box 8px before its words, across both columns in a 50px row. */
2247
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-toggle {
2248
+ min-height: 50px;
2249
+ }
2250
+
2251
+ [data-qc-theme] .qc-drawing-row-full {
2252
+ display: flex;
2253
+ align-items: center;
2254
+ gap: 8px;
2255
+ min-height: 50px;
2256
+ padding: 8px 0;
2257
+ }
2258
+
2259
+ /* A section title: 11px capitals in the muted ink, in a 32px row, or in a field row's 50px where it
2260
+ * heads a list of inputs. */
2261
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-section {
2262
+ display: flex;
2263
+ align-items: center;
2264
+ height: 32px;
2265
+ padding: 0;
2266
+ letter-spacing: normal;
2267
+ }
2268
+
2269
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-section--row {
2270
+ height: 50px;
2271
+ }
2272
+
2273
+ /* A checkbox row in a list of inputs stands 34px, 8px around its box. */
2274
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-toggle--compact {
2275
+ min-height: 34px;
2276
+ }
2277
+
2278
+ /* A row nested under the switch before it sets its label, or its labelling checkbox, 26px in. */
2279
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-row--nested > .qc-drawing-row-label {
2280
+ padding-inline-start: 26px;
2281
+ }
2282
+
2283
+ /* A band on one line: its switch 16px before its name, then its multiplier 8px after the name. */
2284
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-band-row > .qc-drawing-toggle {
2285
+ gap: 16px;
2286
+ }
2287
+
2288
+ [data-qc-theme] .qc-drawing-group-gap {
2289
+ height: 16px;
2290
+ }
2291
+
2292
+ /* The text fields, list buttons and number fields are the chart's 34px field box; these rules give
2293
+ * them their widths and lay a list button's face out: its words 8px in, cut short with an ellipsis,
2294
+ * then the chevron's slot 2px from the end. */
2156
2295
  [data-qc-theme] .qc-drawing-select {
2157
- min-width: 140px;
2296
+ display: inline-flex;
2297
+ flex: 0 0 auto;
2298
+ align-items: center;
2299
+ width: 100px;
2300
+ padding: 0 2px 0 7px;
2301
+ text-align: start;
2302
+ cursor: pointer;
2303
+ }
2304
+
2305
+ /* A list button's edge steps further under the pointer than another field's, below the states that
2306
+ * outrank the pointer: a field that cannot be used, a refused value and the keyboard's ring. */
2307
+ [data-qc-theme] .qc-drawing-select:hover:not(:disabled):not([aria-invalid='true']):not(:focus-visible) {
2308
+ border-color: var(--qc-control-selectEdgeHover);
2309
+ }
2310
+
2311
+ [data-qc-theme] .qc-drawing-select[data-width='medium'] {
2312
+ width: 150px;
2313
+ }
2314
+
2315
+ [data-qc-theme] .qc-drawing-select[data-width='wide'] {
2316
+ width: 180px;
2317
+ }
2318
+
2319
+ [data-qc-theme] .qc-drawing-select-value {
2320
+ flex: 1 1 auto;
2321
+ min-width: 0;
2322
+ padding-inline-end: 6px;
2323
+ overflow: hidden;
2324
+ text-overflow: ellipsis;
2325
+ white-space: nowrap;
2326
+ }
2327
+
2328
+ /* A list's rows: 32px, the words at 14 on 18 and 8px in; a row with a mark carries the 28px mark 4px
2329
+ * in and its name 6px after it; a row of a list of switches carries the settings rows' 18px checkbox
2330
+ * 8px in and its name 10px after it. The chosen row of a list of choices inverts; a ticked switch
2331
+ * keeps the list's ground, its box saying it is on. A list button's list is as wide as its
2332
+ * longest row, never narrower than the button that opened it (the button sets that floor, and a
2333
+ * list of switches is held to the button's own width). */
2334
+ [data-qc-theme] .qc-drawing-menu.qc-drawing-select-list {
2335
+ width: max-content;
2336
+ min-width: 0;
2337
+ }
2338
+
2339
+ [data-qc-theme] .qc-drawing-list-row {
2340
+ height: 32px;
2341
+ gap: 0;
2342
+ padding: 0 8px;
2343
+ line-height: 18px;
2344
+ border-radius: 6px;
2345
+ }
2346
+
2347
+ [data-qc-theme] .qc-drawing-list-row--mark {
2348
+ gap: 6px;
2349
+ padding: 0 14px 0 4px;
2350
+ }
2351
+
2352
+ [data-qc-theme] .qc-drawing-list-row--check {
2353
+ gap: 10px;
2354
+ padding: 0 8px;
2158
2355
  }
2159
2356
 
2160
2357
  [data-qc-theme] .qc-drawing-input[data-width='short'] {
2161
2358
  width: 96px;
2162
2359
  }
2163
2360
 
2164
- [data-qc-theme] .qc-drawing-input[data-width='wide'] {
2361
+ /* The text area is the field box 100px tall across the page, 172px for a tool that is its words (a
2362
+ * text, a note, a callout), its words 8px in from the sides and 5px from the top. */
2363
+ [data-qc-theme] .qc-drawing-textarea {
2165
2364
  width: 100%;
2365
+ height: 100px;
2366
+ margin: 0;
2367
+ padding: 4px 7px;
2368
+ resize: none;
2166
2369
  }
2167
2370
 
2168
- /* The text area grows from four lines, its words 8px in from every side of its box. */
2169
- [data-qc-theme] .qc-drawing-textarea {
2170
- width: 100%;
2171
- height: auto;
2172
- min-height: 80px;
2173
- margin-top: 4px;
2174
- padding: 7px;
2175
- resize: vertical;
2371
+ [data-qc-theme] .qc-drawing-textarea[data-size='tall'] {
2372
+ height: 172px;
2176
2373
  }
2177
2374
 
2178
- /* The number field gives the end of its box to the steppers: a 22 by 28 column 2px in from the edge,
2179
- * revealed on hover or focus. The pointer on a stepper is on the field, so the edge steps up there
2180
- * too, at the weight of the field's own pointer state. */
2375
+ /* The number field keeps the end of its box for its steppers whether they show or not: a 22 by 28
2376
+ * slot 2px in from the edge, the words stopping 2px short of it, the arrows revealed on hover or
2377
+ * focus. A field that cannot be used keeps no slot and shows no arrows, its words running to 4px
2378
+ * from its edge. The pointer on a stepper is on the field, so the edge steps up there too, at the
2379
+ * weight of the field's own pointer state. */
2181
2380
  [data-qc-theme] .qc-drawing-number-wrap {
2182
2381
  position: relative;
2183
2382
  display: inline-flex;
@@ -2195,13 +2394,17 @@
2195
2394
  width: 84px;
2196
2395
  }
2197
2396
 
2397
+ [data-qc-theme] .qc-drawing-number-wrap[data-width='field'] {
2398
+ width: 100px;
2399
+ }
2400
+
2198
2401
  [data-qc-theme] .qc-drawing-number-wrap[data-width='wide'] {
2199
2402
  width: 112px;
2200
2403
  }
2201
2404
 
2202
2405
  [data-qc-theme] .qc-drawing-number {
2203
2406
  width: 100%;
2204
- padding-inline-end: 26px;
2407
+ padding-inline-end: 28px;
2205
2408
  font-variant-numeric: tabular-nums;
2206
2409
  appearance: textfield;
2207
2410
  }
@@ -2225,6 +2428,14 @@
2225
2428
  display: flex;
2226
2429
  }
2227
2430
 
2431
+ [data-qc-theme] .qc-drawing-number:disabled {
2432
+ padding-inline-end: 4px;
2433
+ }
2434
+
2435
+ [data-qc-theme] .qc-drawing-number:disabled + .qc-drawing-steppers {
2436
+ display: none;
2437
+ }
2438
+
2228
2439
  [data-qc-theme] .qc-drawing-stepper {
2229
2440
  display: flex;
2230
2441
  align-items: center;
@@ -2232,11 +2443,12 @@
2232
2443
  width: 22px;
2233
2444
  height: 14px;
2234
2445
  padding: 0;
2235
- color: var(--qc-text-muted);
2446
+ color: var(--qc-chrome-caret);
2236
2447
  background: none;
2237
2448
  border: 0;
2238
- border-radius: var(--qc-chrome-radius);
2449
+ border-radius: 4px;
2239
2450
  cursor: pointer;
2451
+ transition: color var(--qc-motion-durationSlow) var(--qc-motion-easingStandard), background-color var(--qc-motion-durationSlow) var(--qc-motion-easingStandard);
2240
2452
  }
2241
2453
 
2242
2454
  [data-qc-theme] .qc-drawing-stepper[data-up='true'] svg {
@@ -2245,29 +2457,55 @@
2245
2457
 
2246
2458
  [data-qc-theme] .qc-drawing-stepper:hover {
2247
2459
  color: var(--qc-text-primary);
2248
- background: var(--qc-state-hover);
2460
+ background: var(--qc-state-pressed);
2461
+ }
2462
+
2463
+ /* The color popover and the shared color control inside it.
2464
+ *
2465
+ * The popover hangs under the swatch button that opened it, as wide as what it holds wherever it
2466
+ * opens, a 6px corner on the overlay ground, its column 6px clear of its top and bottom: the
2467
+ * palette, then for a stroke the Thickness and Line style rows. It never narrows to the room it
2468
+ * finds: the placement moves it to stay inside the box instead. A color button holding its popover
2469
+ * open rings itself as a field with the keyboard does. */
2470
+ [data-qc-theme] .qc-drawing-popover--color {
2471
+ width: max-content;
2472
+ max-width: none;
2473
+ }
2474
+
2475
+ [data-qc-theme] .qc-drawing-color-popover {
2476
+ padding: 6px 0;
2477
+ }
2478
+
2479
+ [data-qc-theme] .qc-drawing-swatch-button[aria-expanded='true'] {
2480
+ border-color: var(--qc-state-focusRing);
2481
+ box-shadow: inset 0 0 0 1px var(--qc-state-focusRing);
2249
2482
  }
2250
2483
 
2251
- /* Swatches: a ten-wide grid of squares, the plus cell, and the custom panel it opens in place. */
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. */
2252
2489
  [data-qc-theme] .qc-drawing-palette {
2253
- display: flex;
2254
- flex-direction: column;
2490
+ box-sizing: content-box;
2491
+ width: 224px;
2492
+ padding: 6px 12px;
2493
+ }
2494
+
2495
+ /* 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. */
2497
+ [data-qc-theme] .qc-drawing-popover > .qc-drawing-palette {
2255
2498
  padding: 12px;
2256
2499
  }
2257
2500
 
2258
- /* Inside a panel that pads already, the palette pads the rest of the way rather than again. */
2259
- [data-qc-theme] .qc-inline-panel > .qc-drawing-palette {
2501
+ [data-qc-theme] .qc-inline-panel .qc-drawing-palette {
2260
2502
  padding: 6px;
2261
2503
  }
2262
2504
 
2263
2505
  [data-qc-theme] .qc-drawing-swatches {
2264
- display: flex;
2265
- flex-direction: column;
2506
+ display: block;
2266
2507
  }
2267
2508
 
2268
- /* A block is a group of rows that stand together; the gap falls between blocks, never between the
2269
- * rows inside one, so the ten hues read as one field of colour rather than ten loose lines. The
2270
- * negative inline margin pulls the outer cells' own gutters back off the panel's padding. */
2271
2509
  [data-qc-theme] .qc-drawing-swatch-block {
2272
2510
  margin: 0 -3px 6px;
2273
2511
  }
@@ -2276,10 +2514,9 @@
2276
2514
  display: flex;
2277
2515
  }
2278
2516
 
2279
- /* Each cell carries its own 3px gutter rather than the row spacing them, which leaves room inside
2280
- * the cell for the ring a chosen colour wears without moving its neighbours. */
2281
2517
  [data-qc-theme] .qc-drawing-swatch {
2282
2518
  position: relative;
2519
+ flex: 0 0 17px;
2283
2520
  width: 17px;
2284
2521
  height: 17px;
2285
2522
  margin: 3px;
@@ -2287,132 +2524,270 @@
2287
2524
  background: var(--qcd-swatch);
2288
2525
  border: 0;
2289
2526
  border-radius: 2px;
2527
+ outline: none;
2290
2528
  cursor: pointer;
2291
2529
  }
2292
2530
 
2293
- /* A cell pale enough to vanish into the panel behind it says so, and takes the panel's own edge. */
2294
- [data-qc-theme] .qc-drawing-swatch[data-qc-pale='true'] {
2295
- box-shadow: inset 0 0 0 1px var(--qc-chrome-border);
2296
- }
2297
-
2298
- /* The chosen colour is ringed from OUTSIDE, so the swatch keeps its whole face: a ring drawn
2299
- * inside would eat the colour it is pointing at, which is the one thing the reader is judging. */
2300
- [data-qc-theme] .qc-drawing-swatch[data-qc-active='true']::after {
2531
+ /* A cell's ring stands 2px outside it, 2px wide on a 6px corner, and fades in and out: the field's
2532
+ * edge under the pointer, the primary ink around the chosen color (over its neighbours), and the
2533
+ * focus color where the keyboard stands. */
2534
+ [data-qc-theme] .qc-drawing-swatch::after {
2301
2535
  position: absolute;
2302
2536
  inset: -4px;
2303
- border: 2px solid var(--qc-text-primary);
2304
- border-radius: var(--qc-chrome-radius);
2537
+ border: 2px solid transparent;
2538
+ border-radius: 6px;
2305
2539
  content: '';
2540
+ pointer-events: none;
2541
+ transition: border-color var(--qc-motion-durationSlow) var(--qc-motion-easingStandard);
2542
+ }
2543
+
2544
+ [data-qc-theme] .qc-drawing-swatch:hover::after {
2545
+ border-color: var(--qc-control-fieldEdge);
2546
+ }
2547
+
2548
+ [data-qc-theme] .qc-drawing-swatch[data-qc-active='true']::after {
2549
+ z-index: 1;
2550
+ border-color: var(--qc-text-primary);
2551
+ }
2552
+
2553
+ [data-qc-theme] .qc-drawing-swatch:focus-visible::after {
2554
+ border-color: var(--qc-state-focusRing);
2555
+ }
2556
+
2557
+ /* On a light panel the palest cell takes the panel's own edge, where it would otherwise vanish. */
2558
+ [data-qc-theme='light'] .qc-drawing-swatch[data-qc-pale='true'] {
2559
+ box-shadow: inset 0 0 0 1px var(--qc-chrome-border);
2306
2560
  }
2307
2561
 
2308
- /* The plus is two hairlines on the cell's own grid: a drawn cross lands dead centre where a glyph
2309
- * would ride high and left of it. The cell carries no fill and no outline of its own. */
2562
+ /* The plus: a cell with no fill of its own, crossed at its middle by two 13px hairlines in the
2563
+ * primary ink, washed in the hover fill under the pointer and ringed inside its own edge where the
2564
+ * keyboard stands. */
2310
2565
  [data-qc-theme] .qc-drawing-swatch-plus {
2566
+ position: relative;
2567
+ flex: 0 0 17px;
2568
+ width: 17px;
2569
+ height: 17px;
2570
+ margin: 3px;
2571
+ padding: 0;
2311
2572
  background: none;
2312
- box-shadow: none;
2573
+ border: 0;
2574
+ border-radius: 2px;
2575
+ outline: none;
2576
+ cursor: pointer;
2577
+ transition: background-color var(--qc-motion-durationSlow) var(--qc-motion-easingStandard);
2578
+ }
2579
+
2580
+ [data-qc-theme] .qc-drawing-swatch-plus:hover {
2581
+ background: var(--qc-state-hover);
2313
2582
  }
2314
2583
 
2315
2584
  [data-qc-theme] .qc-drawing-swatch-plus::before,
2316
2585
  [data-qc-theme] .qc-drawing-swatch-plus::after {
2317
2586
  position: absolute;
2318
- inset: 8px 2px;
2319
2587
  background: var(--qc-text-primary);
2320
2588
  content: '';
2321
2589
  }
2322
2590
 
2323
2591
  [data-qc-theme] .qc-drawing-swatch-plus::before {
2324
- inset: 2px 8px;
2592
+ top: calc(50% - 6.5px);
2593
+ left: calc(50% - 0.5px);
2594
+ width: 1px;
2595
+ height: 13px;
2596
+ }
2597
+
2598
+ [data-qc-theme] .qc-drawing-swatch-plus::after {
2599
+ top: calc(50% - 0.5px);
2600
+ left: calc(50% - 6.5px);
2601
+ width: 13px;
2602
+ height: 1px;
2603
+ }
2604
+
2605
+ [data-qc-theme] .qc-drawing-swatch-plus:focus-visible {
2606
+ border: 2px solid var(--qc-state-focusRing);
2607
+ border-radius: 4px;
2325
2608
  }
2326
2609
 
2327
- /* The rule between the offered colours and the ones this viewer mixed. */
2328
2610
  [data-qc-theme] .qc-drawing-separator {
2329
2611
  height: 1px;
2330
- margin: 6px 0 12px;
2612
+ margin: 12px 0;
2331
2613
  background: var(--qc-overlay-separator);
2332
2614
  }
2333
2615
 
2334
- /* A quiet label over a section of the panel: the room above it is its own, so the panel holding
2335
- * it keeps no gap of its own to add to this. */
2336
2616
  [data-qc-theme] .qc-drawing-section-title {
2337
2617
  margin: 12px 0 4px;
2338
2618
  color: var(--qc-text-muted);
2339
- font-size: calc(var(--qc-text-fontSizeBase) - 2px);
2340
- }
2341
-
2342
- [data-qc-theme] .qc-drawing-palette-opacity {
2343
- display: flex;
2344
- flex-direction: column;
2619
+ font-size: 12px;
2620
+ line-height: 14px;
2345
2621
  }
2346
2622
 
2347
- [data-qc-theme] .qc-drawing-custom {
2623
+ /* The opacity: a 10px track filling the row beside the percent field. The track fades from nothing
2624
+ * into the color over the checked ground, inside a 1px edge of the color on a 4px corner; the 12px
2625
+ * knob travels it less its own width, a pixel proud of it above and below, and glides to a value
2626
+ * the keyboard or a press gives it but follows a drag at once. The keyboard's ring stands 4px
2627
+ * around the track. */
2628
+ [data-qc-theme] .qc-drawing-opacity-row {
2348
2629
  display: flex;
2349
- flex-direction: column;
2350
- gap: 12px;
2351
- width: 224px;
2630
+ align-items: center;
2352
2631
  }
2353
2632
 
2354
- [data-qc-theme] .qc-drawing-custom-row {
2355
- display: flex;
2356
- gap: 8px;
2357
- align-items: center;
2358
- height: 26px;
2633
+ [data-qc-theme] .qc-drawing-opacity {
2634
+ position: relative;
2635
+ flex: 1 0 auto;
2636
+ height: 10px;
2637
+ background: repeating-conic-gradient(from 270deg, var(--qcd-check) 0% 25%, transparent 0% 50%) 1px 50% / 8px 8px, var(--qcd-ground);
2638
+ border-radius: 5px;
2639
+ outline: none;
2640
+ touch-action: none;
2359
2641
  }
2360
2642
 
2361
- [data-qc-theme] .qc-drawing-custom-swatch {
2362
- flex: 0 0 auto;
2363
- width: 26px;
2364
- height: 26px;
2365
- background: var(--qcd-swatch);
2643
+ [data-qc-theme] .qc-drawing-opacity-fade {
2644
+ position: absolute;
2645
+ inset: 0;
2646
+ background: linear-gradient(to right, transparent, var(--qcd-swatch));
2647
+ border: 1px solid var(--qcd-swatch);
2366
2648
  border-radius: 4px;
2367
2649
  }
2368
2650
 
2369
- /* The hex field and the opacity readout are the field box at the mixer's compact 26px: the same edge
2370
- * and pointer step and the same ring, with the corner and the inset scaled to their height. The hex
2371
- * field's box is the wrap around its mark and its input. */
2372
- [data-qc-theme] .qc-drawing-hex-wrap {
2373
- display: flex;
2374
- flex: 0 0 auto;
2375
- align-items: center;
2376
- width: 68px;
2377
- min-width: 0;
2378
- height: 26px;
2379
- padding: 0 5px;
2380
- border: 1px solid var(--qc-control-fieldEdge);
2381
- border-radius: 6px;
2382
- transition: border-color var(--qc-motion-durationFast) var(--qc-motion-easingLinear), box-shadow var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
2651
+ [data-qc-theme][dir='rtl'] .qc-drawing-opacity,
2652
+ [data-qc-theme] [dir='rtl'] .qc-drawing-opacity {
2653
+ background-position: right 1px top 50%;
2383
2654
  }
2384
2655
 
2385
- [data-qc-theme] .qc-drawing-hex-wrap > .qc-muted {
2386
- flex: 0 0 7px;
2656
+ [data-qc-theme][dir='rtl'] .qc-drawing-opacity-fade,
2657
+ [data-qc-theme] [dir='rtl'] .qc-drawing-opacity-fade {
2658
+ background: linear-gradient(to left, transparent, var(--qcd-swatch));
2387
2659
  }
2388
2660
 
2389
- [data-qc-theme] .qc-drawing-hex-wrap:hover,
2390
- [data-qc-theme] .qc-drawing-opacity-readout:hover {
2391
- border-color: var(--qc-control-fieldEdgeHover);
2661
+ [data-qc-theme] .qc-drawing-opacity-travel {
2662
+ position: absolute;
2663
+ top: 0;
2664
+ inset-inline-start: 0;
2665
+ width: calc(100% - 12px);
2392
2666
  }
2393
2667
 
2394
- /* A field says it has the keyboard on its own box: a 2px ring over the edge, the edge itself and the
2395
- * pixel inside it, following the corner. The wrap rings while the caret is anywhere inside it. */
2396
- [data-qc-theme] .qc-drawing-hex-wrap:focus-within,
2397
- [data-qc-theme] .qc-drawing-opacity-readout:focus {
2398
- border-color: var(--qc-state-focusRing);
2399
- box-shadow: inset 0 0 0 1px var(--qc-state-focusRing);
2668
+ [data-qc-theme] .qc-drawing-opacity-knob {
2669
+ position: absolute;
2670
+ top: 0;
2671
+ width: 12px;
2672
+ height: 12px;
2673
+ margin-top: -1px;
2674
+ background: var(--qcd-black);
2675
+ border: 2px solid var(--qcd-white);
2676
+ border-radius: 50%;
2677
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
2678
+ pointer-events: none;
2679
+ }
2680
+
2681
+ [data-qc-theme] .qc-drawing-opacity:not([data-qc-dragging='true']) .qc-drawing-opacity-knob {
2682
+ transition: inset-inline-start var(--qc-motion-durationGlide) var(--qc-motion-easingStandard);
2683
+ }
2684
+
2685
+ [data-qc-theme] .qc-drawing-opacity:focus-visible::after {
2686
+ position: absolute;
2687
+ inset: -4px;
2688
+ border: 2px solid var(--qc-state-focusRing);
2689
+ border-radius: 6px;
2690
+ content: '';
2691
+ pointer-events: none;
2692
+ }
2693
+
2694
+ /* The popover's two fields are 26px boxes on a 4px corner, 1px edged in the field's own edge, which
2695
+ * turns the focus color while the field has the keyboard and the invalid color for a value the
2696
+ * field refuses. The percent field is 47px, 8px after the track, its figure set to the end and the
2697
+ * unit standing in the room it keeps there. */
2698
+ [data-qc-theme] .qc-drawing-opacity-field {
2699
+ position: relative;
2700
+ display: flex;
2701
+ flex: 0 0 auto;
2702
+ align-items: center;
2400
2703
  }
2401
2704
 
2705
+ [data-qc-theme] .qc-drawing-opacity-readout,
2402
2706
  [data-qc-theme] .qc-drawing-hex {
2403
- width: 100%;
2404
- min-width: 0;
2405
- padding: 0;
2707
+ box-sizing: border-box;
2708
+ height: 26px;
2709
+ margin: 0;
2710
+ margin-inline-start: 8px;
2406
2711
  color: var(--qc-text-primary);
2407
2712
  font: inherit;
2408
- font-variant-numeric: tabular-nums;
2713
+ font-size: 14px;
2714
+ line-height: 24px;
2409
2715
  background: none;
2410
- border: 0;
2716
+ border: 1px solid var(--qc-control-fieldEdge);
2717
+ border-radius: 4px;
2411
2718
  outline: none;
2412
2719
  }
2413
2720
 
2414
- /* The Add button takes the colour the mixer is holding. It is sized to its own word and pushed to
2415
- * the end of the row; its fill and ink are the primary recipe's. */
2721
+ [data-qc-theme] .qc-drawing-opacity-readout {
2722
+ width: 47px;
2723
+ padding: 0;
2724
+ padding-inline-start: 5px;
2725
+ padding-inline-end: 14px;
2726
+ text-align: end;
2727
+ }
2728
+
2729
+ [data-qc-theme] .qc-drawing-opacity-readout:focus,
2730
+ [data-qc-theme] .qc-drawing-hex:focus {
2731
+ border-color: var(--qc-state-focusRing);
2732
+ }
2733
+
2734
+ [data-qc-theme] .qc-drawing-hex[aria-invalid='true'] {
2735
+ border-color: var(--qc-control-fieldInvalid);
2736
+ }
2737
+
2738
+ [data-qc-theme] .qc-drawing-opacity-unit,
2739
+ [data-qc-theme] .qc-drawing-hex-mark {
2740
+ position: absolute;
2741
+ top: 5px;
2742
+ color: var(--qc-text-primary);
2743
+ line-height: 16px;
2744
+ pointer-events: none;
2745
+ }
2746
+
2747
+ [data-qc-theme] .qc-drawing-opacity-unit {
2748
+ inset-inline-start: 40px;
2749
+ }
2750
+
2751
+ /* The custom editor, standing alone in the popover in the palette's place: a 26px row of the held
2752
+ * color's 26px well, its hex and Add, 12px over a 184px area of saturation and brightness that
2753
+ * stands 7px before a 17px hue strip. The hash stands in the room the hex field keeps before its
2754
+ * digits; Add is the primary action at the row's end, a 28px button on an 8px corner. */
2755
+ [data-qc-theme] .qc-drawing-custom-row {
2756
+ display: flex;
2757
+ align-items: flex-start;
2758
+ height: 26px;
2759
+ margin-bottom: 12px;
2760
+ }
2761
+
2762
+ [data-qc-theme] .qc-drawing-custom-swatch {
2763
+ flex: 0 0 26px;
2764
+ width: 26px;
2765
+ height: 26px;
2766
+ background: var(--qcd-swatch);
2767
+ border-radius: 4px;
2768
+ }
2769
+
2770
+ [data-qc-theme] .qc-drawing-hex-wrap {
2771
+ position: relative;
2772
+ display: flex;
2773
+ flex: 0 0 auto;
2774
+ align-items: center;
2775
+ height: 26px;
2776
+ }
2777
+
2778
+ [data-qc-theme] .qc-drawing-hex-mark {
2779
+ inset-inline-start: 0;
2780
+ width: 21px;
2781
+ text-align: end;
2782
+ }
2783
+
2784
+ [data-qc-theme] .qc-drawing-hex {
2785
+ width: 68px;
2786
+ padding: 0;
2787
+ padding-inline-start: 12px;
2788
+ padding-inline-end: 5px;
2789
+ }
2790
+
2416
2791
  [data-qc-theme] .qc-drawing-add {
2417
2792
  display: inline-flex;
2418
2793
  flex: 0 0 auto;
@@ -2421,6 +2796,9 @@
2421
2796
  height: 28px;
2422
2797
  margin-inline-start: auto;
2423
2798
  padding: 0 7px;
2799
+ font-size: 14px;
2800
+ line-height: 18px;
2801
+ border-radius: 8px;
2424
2802
  }
2425
2803
 
2426
2804
  [data-qc-theme] .qc-drawing-custom-tracks {
@@ -2428,28 +2806,43 @@
2428
2806
  gap: 7px;
2429
2807
  }
2430
2808
 
2431
- /* The saturation and value square over the current hue, and the hue strip beside it. The square
2432
- * keeps square corners: the black it fades into is a second layer over its whole face, and a
2433
- * rounded corner would show the hue beneath it. */
2809
+ /* The area is the hue under a fade to white across it and a fade to black down it, on a 2px corner
2810
+ * that clips its knob: a 14px ring standing a pixel past the point it marks. The strip runs the hue
2811
+ * wheel from top to bottom; its knob is a 9px bar 2px proud of either side, travelling the strip
2812
+ * less 3px at either end. Both knobs glide to a value the keyboard gives them and follow a drag at
2813
+ * once. */
2434
2814
  [data-qc-theme] .qc-drawing-sv {
2435
2815
  position: relative;
2436
2816
  flex: 1 1 auto;
2437
2817
  height: 184px;
2438
- background: linear-gradient(to top, var(--qcd-black), transparent), linear-gradient(to right, var(--qcd-white), var(--qcd-hue));
2818
+ overflow: hidden;
2819
+ background: linear-gradient(to top, var(--qcd-black), transparent), linear-gradient(to right, var(--qcd-white), transparent), var(--qcd-hue);
2820
+ border-radius: 2px;
2439
2821
  cursor: crosshair;
2822
+ touch-action: none;
2823
+ }
2824
+
2825
+ [data-qc-theme][dir='rtl'] .qc-drawing-sv,
2826
+ [data-qc-theme] [dir='rtl'] .qc-drawing-sv {
2827
+ background: linear-gradient(to top, var(--qcd-black), transparent), linear-gradient(to left, var(--qcd-white), transparent), var(--qcd-hue);
2440
2828
  }
2441
2829
 
2442
2830
  [data-qc-theme] .qc-drawing-sv-dot {
2443
2831
  position: absolute;
2444
- width: 12px;
2445
- height: 12px;
2832
+ width: 14px;
2833
+ height: 14px;
2834
+ margin-top: -6px;
2835
+ margin-inline-start: -6px;
2446
2836
  border: 2px solid var(--qcd-white);
2447
2837
  border-radius: 50%;
2448
- box-shadow: var(--qc-overlay-shadow);
2449
- transform: translate(-50%, -50%);
2838
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
2450
2839
  pointer-events: none;
2451
2840
  }
2452
2841
 
2842
+ [data-qc-theme] .qc-drawing-sv:not([data-qc-dragging='true']) .qc-drawing-sv-dot {
2843
+ transition: inset-inline-start var(--qc-motion-durationFast) var(--qc-motion-easingStandard), top var(--qc-motion-durationFast) var(--qc-motion-easingStandard);
2844
+ }
2845
+
2453
2846
  [data-qc-theme] .qc-drawing-hue {
2454
2847
  position: relative;
2455
2848
  flex: 0 0 17px;
@@ -2466,38 +2859,70 @@
2466
2859
  );
2467
2860
  border-radius: 2px;
2468
2861
  cursor: pointer;
2862
+ touch-action: none;
2863
+ }
2864
+
2865
+ [data-qc-theme] .qc-drawing-hue-travel {
2866
+ position: absolute;
2867
+ inset: 3px 0;
2469
2868
  }
2470
2869
 
2471
2870
  [data-qc-theme] .qc-drawing-hue-dot {
2472
2871
  position: absolute;
2473
2872
  inset-inline: -2px;
2474
- height: 6px;
2873
+ height: 9px;
2874
+ margin-top: -4px;
2475
2875
  border: 2px solid var(--qcd-white);
2476
2876
  border-radius: 2px;
2477
- box-shadow: var(--qc-overlay-shadow);
2478
- transform: translateY(-50%);
2877
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
2479
2878
  pointer-events: none;
2480
2879
  }
2481
2880
 
2482
- /* Black and white are the poles of the value axis the square fades between, and the two the
2483
- * opacity knob is drawn from. They are color arithmetic, not theme roles: every mode has them. */
2881
+ [data-qc-theme] .qc-drawing-hue:not([data-qc-dragging='true']) .qc-drawing-hue-dot {
2882
+ transition: top var(--qc-motion-durationFast) var(--qc-motion-easingStandard);
2883
+ }
2884
+
2885
+ /* The well a color button holds its color in: 24px on a 3px corner, the color at its opacity over
2886
+ * the checked ground the opacity track fades over, in 6px squares. */
2887
+ [data-qc-theme] .qc-drawing-well {
2888
+ display: block;
2889
+ width: 24px;
2890
+ height: 24px;
2891
+ overflow: hidden;
2892
+ background: repeating-conic-gradient(from 270deg, var(--qcd-check) 0% 25%, transparent 0% 50%) 0 0 / 12px 12px, var(--qcd-ground);
2893
+ border-radius: 3px;
2894
+ }
2895
+
2896
+ [data-qc-theme] .qc-drawing-well-fill {
2897
+ display: block;
2898
+ width: 100%;
2899
+ height: 100%;
2900
+ background: var(--qcd-swatch);
2901
+ }
2902
+
2903
+ /* Black and white are the poles of the value axis the area fades between, and the two the knobs
2904
+ * are drawn from. They are color arithmetic, not theme roles: every mode has them. */
2484
2905
  [data-qc-theme] .qc-drawing-custom,
2485
- [data-qc-theme] .qc-drawing-opacity-row {
2906
+ [data-qc-theme] .qc-drawing-opacity-row,
2907
+ [data-qc-theme] .qc-drawing-well,
2908
+ [data-qc-theme] .qc-drawing-dual {
2486
2909
  --qcd-angle-0: 0deg;
2487
2910
  --qcd-black: hsl(var(--qcd-angle-0) 0% 0%);
2488
2911
  --qcd-white: hsl(var(--qcd-angle-0) 0% 100%);
2489
2912
  }
2490
2913
 
2491
- /* What "see-through" is drawn as under the fade: a slate check at two fifths, the same in every
2492
- * mode, on the mode's own pole. It is the checker every image editor uses for nothing-here, so a
2493
- * low opacity reads as the drawing thinning out rather than as the track running out of paint. */
2494
- [data-qc-theme] .qc-drawing-opacity-row {
2914
+ /* What "see-through" is drawn as under a fade: a slate check at two fifths, the same in every mode,
2915
+ * on the mode's own pole. It is the checker every image editor uses for nothing-here, so a low
2916
+ * opacity reads as the color thinning out rather than as the track running out of paint. */
2917
+ [data-qc-theme] .qc-drawing-opacity-row,
2918
+ [data-qc-theme] .qc-drawing-well {
2495
2919
  --qcd-check-hue: 224deg;
2496
2920
  --qcd-check: hsl(var(--qcd-check-hue) 15% 19% / 0.4);
2497
2921
  --qcd-ground: var(--qcd-black);
2498
2922
  }
2499
2923
 
2500
- [data-qc-theme='light'] .qc-drawing-opacity-row {
2924
+ [data-qc-theme='light'] .qc-drawing-opacity-row,
2925
+ [data-qc-theme='light'] .qc-drawing-well {
2501
2926
  --qcd-ground: var(--qcd-white);
2502
2927
  }
2503
2928
 
@@ -2516,239 +2941,248 @@
2516
2941
  --qcd-hue-300: hsl(var(--qcd-angle-300) 100% 50%);
2517
2942
  }
2518
2943
 
2519
- /* The opacity slider fades a checked ground into the color being set. */
2520
- [data-qc-theme] .qc-drawing-opacity-row {
2521
- display: flex;
2522
- gap: 8px;
2523
- align-items: center;
2944
+ /* The Thickness and Line style rows, 12px in: a muted title, then a row of joined 32px segments,
2945
+ * each a radio wearing its mark in the on fill. The one chosen takes that fill, its mark cut from
2946
+ * it in the inverse ink; a segment under the pointer washes in the hover fill, and the keyboard's
2947
+ * ring stands 4px around the segment it is on. A thickness mark is a line across its segment as
2948
+ * heavy as the width it stands for; a line style's is drawn on a 30 by 24 cell, a 30px line, four
2949
+ * 5px dashes or six 2px dots 3px apart. */
2950
+ [data-qc-theme] .qc-drawing-stroke-section {
2951
+ padding: 0 12px;
2524
2952
  }
2525
2953
 
2526
- [data-qc-theme] .qc-drawing-opacity {
2527
- flex: 1 1 auto;
2528
- width: auto;
2529
- height: 10px;
2530
- margin: 0;
2531
- /* Three layers, top down: the fade into the color, the 8px check it fades over (two 4px squares
2532
- * to a tile, top left and bottom right), and the ground the check stands on. */
2533
- background:
2534
- linear-gradient(to right, transparent, var(--qcd-swatch)),
2535
- repeating-conic-gradient(from 270deg, var(--qcd-check) 0% 25%, transparent 0% 50%) 1px 50% / 8px 8px,
2536
- var(--qcd-ground);
2537
- border: 1px solid var(--qcd-swatch);
2538
- border-radius: 5px;
2539
- outline: none;
2540
- appearance: none;
2541
- accent-color: var(--qc-state-accent);
2954
+ [data-qc-theme] .qc-drawing-stroke-section > .qc-drawing-section-title {
2955
+ margin: 6px 0 4px;
2542
2956
  }
2543
2957
 
2544
- /* The thumb is a disc a hand can take: it says so with the pointer cursor, and it is drawn from
2545
- * the two poles rather than from the theme, so it reads at both ends of the fade in either mode. */
2546
- [data-qc-theme] .qc-drawing-opacity::-webkit-slider-thumb {
2547
- width: 12px;
2548
- height: 12px;
2549
- background: var(--qcd-black);
2550
- border: 2px solid var(--qcd-white);
2551
- border-radius: 50%;
2552
- box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
2553
- cursor: pointer;
2554
- appearance: none;
2958
+ [data-qc-theme] .qc-drawing-stroke-section--style {
2959
+ margin-top: 12px;
2555
2960
  }
2556
2961
 
2557
- [data-qc-theme] .qc-drawing-opacity::-moz-range-thumb {
2558
- width: 12px;
2559
- height: 12px;
2560
- background: var(--qcd-black);
2561
- border: 2px solid var(--qcd-white);
2562
- border-radius: 50%;
2563
- box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
2564
- cursor: pointer;
2962
+ [data-qc-theme] .qc-drawing-stroke-section--style > .qc-drawing-section-title {
2963
+ margin-top: 0;
2565
2964
  }
2566
2965
 
2567
- /* The readout is a FIELD beside the track: edged rather than washed, because it is a number a viewer
2568
- * types over and not a chip the panel is showing them. */
2569
- [data-qc-theme] .qc-drawing-opacity-field {
2570
- position: relative;
2571
- flex: 0 0 auto;
2966
+ [data-qc-theme] .qc-drawing-segments {
2967
+ display: flex;
2572
2968
  }
2573
2969
 
2574
- [data-qc-theme] .qc-drawing-opacity-readout {
2575
- width: 47px;
2576
- height: 26px;
2577
- padding: 0 14px 0 5px;
2578
- color: var(--qc-text-primary);
2579
- font: inherit;
2580
- font-variant-numeric: tabular-nums;
2970
+ [data-qc-theme] .qc-drawing-segment {
2971
+ position: relative;
2972
+ display: inline-flex;
2973
+ flex: 1 1 0;
2974
+ align-items: center;
2975
+ justify-content: center;
2976
+ box-sizing: border-box;
2977
+ height: 32px;
2978
+ margin: 0;
2979
+ padding: 0 12px;
2980
+ color: var(--qc-control-on);
2581
2981
  background: none;
2582
2982
  border: 1px solid var(--qc-control-fieldEdge);
2583
- border-radius: 6px;
2983
+ border-radius: 0;
2584
2984
  outline: none;
2585
- transition: border-color var(--qc-motion-durationFast) var(--qc-motion-easingLinear), box-shadow var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
2985
+ cursor: pointer;
2586
2986
  }
2587
2987
 
2588
- /* The unit sits in the room the field keeps at its end, so a typed number never runs under it. */
2589
- [data-qc-theme] .qc-drawing-opacity-unit {
2590
- position: absolute;
2591
- inset-block: 0;
2592
- inset-inline-end: 5px;
2593
- display: flex;
2594
- align-items: center;
2595
- color: var(--qc-text-primary);
2596
- pointer-events: none;
2988
+ [data-qc-theme] .qc-drawing-segment--wide {
2989
+ padding: 0 22px;
2597
2990
  }
2598
2991
 
2599
- /* The swatch button: a well holding the color, and for a stroke, the stroke at its thickness. */
2600
- [data-qc-theme] .qc-drawing-swatch-button {
2601
- display: flex;
2602
- gap: 6px;
2603
- align-items: center;
2604
- justify-content: center;
2605
- height: 34px;
2606
- padding: 0 8px;
2607
- cursor: pointer;
2992
+ [data-qc-theme] .qc-drawing-segment + .qc-drawing-segment {
2993
+ margin-inline-start: -1px;
2608
2994
  }
2609
2995
 
2610
- [data-qc-theme] .qc-drawing-well {
2611
- display: block;
2612
- width: 24px;
2613
- height: 24px;
2614
- overflow: hidden;
2615
- background: repeating-conic-gradient(var(--qc-chrome-border) 0% 25%, var(--qc-chrome-surfaceRaised) 0% 50%) 0 0 / 8px 8px;
2616
- border-radius: 3px;
2996
+ [data-qc-theme] .qc-drawing-segment:first-child {
2997
+ border-start-start-radius: 3px;
2998
+ border-end-start-radius: 3px;
2617
2999
  }
2618
3000
 
2619
- [data-qc-theme] .qc-drawing-well-fill {
2620
- display: block;
2621
- width: 100%;
2622
- height: 100%;
2623
- background: var(--qcd-swatch);
3001
+ [data-qc-theme] .qc-drawing-segment:last-child {
3002
+ border-start-end-radius: 3px;
3003
+ border-end-end-radius: 3px;
2624
3004
  }
2625
3005
 
2626
- [data-qc-theme] .qc-drawing-swatch-panel {
2627
- display: flex;
2628
- flex-direction: column;
2629
- gap: 6px;
2630
- padding-bottom: 8px;
3006
+ [data-qc-theme] .qc-drawing-segment:hover {
3007
+ background: var(--qc-state-hover);
2631
3008
  }
2632
3009
 
2633
- [data-qc-theme] .qc-drawing-swatch-panel > .qc-muted {
2634
- padding: 0 12px;
3010
+ [data-qc-theme] .qc-drawing-segment[aria-checked='true'] {
3011
+ z-index: 1;
3012
+ color: var(--qc-control-onInk);
3013
+ background: var(--qc-control-on);
3014
+ border-color: var(--qc-control-on);
2635
3015
  }
2636
3016
 
2637
- [data-qc-theme] .qc-drawing-option-row {
2638
- display: flex;
2639
- gap: 4px;
2640
- padding: 0 12px;
3017
+ [data-qc-theme] .qc-drawing-segment:focus-visible::after {
3018
+ position: absolute;
3019
+ inset: -4px;
3020
+ z-index: 1;
3021
+ border: 2px solid var(--qc-state-focusRing);
3022
+ border-radius: 4px;
3023
+ content: '';
3024
+ pointer-events: none;
2641
3025
  }
2642
3026
 
2643
- [data-qc-theme] .qc-drawing-option {
2644
- display: flex;
3027
+ [data-qc-theme] .qc-drawing-thickness-mark {
3028
+ display: block;
2645
3029
  flex: 1 1 auto;
2646
- align-items: center;
2647
- justify-content: center;
2648
- height: 30px;
2649
- padding: 0;
3030
+ background: currentColor;
2650
3031
  }
2651
3032
 
2652
- /* The stroke preview: segments at the thickness, in currentColor or the drawing's own color. */
2653
- [data-qc-theme] .qc-drawing-stroke {
3033
+ [data-qc-theme] .qc-drawing-style-mark {
2654
3034
  display: flex;
2655
- flex: 0 0 auto;
3035
+ flex: 0 0 30px;
2656
3036
  gap: 3px;
2657
3037
  align-items: center;
3038
+ justify-content: center;
2658
3039
  width: 30px;
3040
+ height: 24px;
3041
+ overflow: hidden;
2659
3042
  }
2660
3043
 
2661
- [data-qc-theme] .qc-drawing-stroke[data-dotted='tight'] {
2662
- gap: 2px;
3044
+ [data-qc-theme] .qc-drawing-style-seg {
3045
+ flex: 0 0 auto;
3046
+ width: 5px;
3047
+ height: 1px;
3048
+ background: currentColor;
2663
3049
  }
2664
3050
 
2665
- [data-qc-theme] .qc-drawing-stroke-seg {
2666
- flex: 0 0 auto;
2667
- background: var(--qcd-swatch, currentColor);
3051
+ [data-qc-theme] .qc-drawing-style-mark[data-style='solid'] > .qc-drawing-style-seg {
3052
+ width: 30px;
2668
3053
  }
2669
3054
 
2670
- /* A line-end picker is a list button: the end's glyph, then the chevron's slot, 2px in from the edge. */
2671
- [data-qc-theme] .qc-drawing-line-end {
2672
- display: flex;
2673
- align-items: center;
2674
- padding: 0 2px;
2675
- cursor: pointer;
3055
+ [data-qc-theme] .qc-drawing-style-mark[data-style='dotted'] > .qc-drawing-style-seg {
3056
+ width: 2px;
3057
+ height: 2px;
2676
3058
  }
2677
3059
 
2678
- /* A line end's glyph is drawn for the left end; the right end's picker wears it mirrored. */
2679
- [data-qc-theme] .qc-drawing-line-end[data-qc-end='right'] > svg,
2680
- [data-qc-theme] .qc-drawing-menu[data-qc-end='right'] .qc-menu-row > svg {
2681
- transform: scaleX(-1);
3060
+ /* The line-end list is as wide as its rows. A row it does not hold dims its ink under the pointer. */
3061
+ [data-qc-theme] .qc-drawing-menu.qc-drawing-line-ends {
3062
+ width: max-content;
3063
+ min-width: 0;
2682
3064
  }
2683
3065
 
2684
- /* The dialog's page strip: equal tabs, each with its own rail segment, the active one bright. */
2685
- [data-qc-theme] .qc-drawing-tabs {
2686
- display: flex;
2687
- align-items: stretch;
2688
- padding-bottom: 8px;
3066
+ /* The keyboard rings a list's row inside the row's own edge, where the list's rounded corners cannot
3067
+ * cut it. A row of a list of choices or of switches rings its edge on a 6px corner, with 2px of the
3068
+ * list's ground inside the ring, so the ring stands clear of a chosen row's fill; a row of a list of
3069
+ * marks (a line end, a thickness, a line style) rings 2px inside its edge on a 9px corner. */
3070
+ [data-qc-theme] .qc-drawing-list .qc-drawing-list-row {
3071
+ position: relative;
3072
+ outline: none;
2689
3073
  }
2690
3074
 
2691
- [data-qc-theme] .qc-drawing-tab {
2692
- display: flex;
2693
- flex: 1 1 0;
2694
- flex-direction: column;
2695
- gap: 6px;
2696
- padding: 2px 0 0;
2697
- color: var(--qc-text-muted);
2698
- font: inherit;
2699
- font-weight: 500;
2700
- background: none;
2701
- border: 0;
2702
- cursor: pointer;
3075
+ [data-qc-theme] .qc-drawing-select-list:not(.qc-drawing-mark-list) .qc-drawing-list-row:focus-visible::before,
3076
+ [data-qc-theme] .qc-drawing-select-list:not(.qc-drawing-mark-list) .qc-drawing-list-row:focus-visible::after {
3077
+ position: absolute;
3078
+ z-index: 1;
3079
+ box-sizing: border-box;
3080
+ border-style: solid;
3081
+ border-width: 2px;
3082
+ content: '';
3083
+ pointer-events: none;
2703
3084
  }
2704
3085
 
2705
- [data-qc-theme] .qc-drawing-tab:hover {
2706
- color: var(--qc-text-secondary);
3086
+ [data-qc-theme] .qc-drawing-select-list:not(.qc-drawing-mark-list) .qc-drawing-list-row:focus-visible::after {
3087
+ inset: 0;
3088
+ border-color: var(--qc-state-focusRing);
3089
+ border-radius: 6px;
2707
3090
  }
2708
3091
 
2709
- [data-qc-theme] .qc-drawing-tab[aria-selected='true'] {
2710
- color: var(--qc-text-primary);
3092
+ [data-qc-theme] .qc-drawing-select-list:not(.qc-drawing-mark-list) .qc-drawing-list-row:focus-visible::before {
3093
+ inset: 2px;
3094
+ border-color: var(--qc-overlay-surface);
3095
+ border-radius: 4px;
2711
3096
  }
2712
3097
 
2713
- [data-qc-theme] .qc-drawing-tab-rail {
2714
- height: 2px;
2715
- background: var(--qc-chrome-border);
3098
+ [data-qc-theme] .qc-drawing-line-ends .qc-drawing-list-row[aria-selected='true'] {
3099
+ color: var(--qc-control-onInk);
2716
3100
  }
2717
3101
 
2718
- [data-qc-theme] .qc-drawing-tab:first-child .qc-drawing-tab-rail {
2719
- border-start-start-radius: 2px;
2720
- border-end-start-radius: 2px;
3102
+ [data-qc-theme] .qc-drawing-line-ends .qc-drawing-list-row:not([aria-selected='true']):hover {
3103
+ color: var(--qc-state-hoverInk);
2721
3104
  }
2722
3105
 
2723
- [data-qc-theme] .qc-drawing-tab:last-child .qc-drawing-tab-rail {
2724
- border-start-end-radius: 2px;
2725
- border-end-end-radius: 2px;
3106
+ [data-qc-theme] .qc-drawing-line-ends .qc-drawing-list-row:focus-visible::after,
3107
+ [data-qc-theme] .qc-drawing-mark-list .qc-drawing-list-row:focus-visible::after {
3108
+ position: absolute;
3109
+ inset: 2px;
3110
+ z-index: 1;
3111
+ border: 2px solid var(--qc-state-focusRing);
3112
+ border-radius: 9px;
3113
+ content: '';
3114
+ pointer-events: none;
2726
3115
  }
2727
3116
 
2728
- [data-qc-theme] .qc-drawing-tab[aria-selected='true'] .qc-drawing-tab-rail {
2729
- background: var(--qc-text-primary);
3117
+ /* The swatch button: a well holding the color, and for a stroke, the stroke at its thickness. */
3118
+ [data-qc-theme] .qc-drawing-swatch-button {
3119
+ display: flex;
3120
+ gap: 6px;
3121
+ align-items: center;
3122
+ justify-content: center;
3123
+ height: 34px;
3124
+ padding: 0 8px;
3125
+ cursor: pointer;
2730
3126
  }
2731
3127
 
2732
- /* One visibility bucket: the checkbox beside the word, then from, the two-thumb range, and to. */
2733
- [data-qc-theme] .qc-drawing-visibility-row {
2734
- display: grid;
2735
- grid-template-columns: 96px 1fr;
2736
- gap: 12px;
3128
+ /* On a settings page the swatch button is the 34px field with a 6px corner around its 24px well, 4px
3129
+ * in; with a stroke the preview stands 8px after the well and 3px clear of the end, 75px in all. */
3130
+ [data-qc-theme] .qc-drawing-page .qc-drawing-swatch-button {
3131
+ flex: 0 0 auto;
3132
+ gap: 8px;
3133
+ min-width: 34px;
3134
+ padding: 0 4px;
3135
+ border-radius: 6px;
3136
+ }
3137
+
3138
+ [data-qc-theme] .qc-drawing-page .qc-drawing-swatch-button > .qc-drawing-stroke {
3139
+ margin-inline-end: 3px;
3140
+ }
3141
+
3142
+ /* The stroke preview: segments at the thickness, in currentColor or the drawing's own color. */
3143
+ [data-qc-theme] .qc-drawing-stroke {
3144
+ display: flex;
3145
+ flex: 0 0 auto;
3146
+ gap: 3px;
2737
3147
  align-items: center;
2738
- min-height: 50px;
3148
+ width: 30px;
3149
+ }
3150
+
3151
+ [data-qc-theme] .qc-drawing-stroke[data-dotted='tight'] {
3152
+ gap: 2px;
3153
+ }
3154
+
3155
+ [data-qc-theme] .qc-drawing-stroke-seg {
3156
+ flex: 0 0 auto;
3157
+ background: var(--qcd-swatch, currentColor);
2739
3158
  }
2740
3159
 
2741
- [data-qc-theme] .qc-drawing-visibility-controls {
3160
+ /* A line-end picker is a 34px field whose face is the end's own 28px mark. */
3161
+ [data-qc-theme] .qc-drawing-line-end {
2742
3162
  display: flex;
2743
- gap: 8px;
3163
+ flex: 0 0 34px;
2744
3164
  align-items: center;
3165
+ justify-content: center;
3166
+ width: 34px;
3167
+ padding: 0;
3168
+ cursor: pointer;
3169
+ }
3170
+
3171
+ /* A line end's glyph is drawn for the left end; the right end's picker wears it mirrored. */
3172
+ [data-qc-theme] .qc-drawing-line-end[data-qc-end='right'] > svg,
3173
+ [data-qc-theme] .qc-drawing-menu[data-qc-end='right'] .qc-menu-row > svg {
3174
+ transform: scaleX(-1);
2745
3175
  }
2746
3176
 
3177
+ /* One visibility bucket: the checkbox and the name as the label, then from, the two-thumb range and
3178
+ * to. The range is a 10px track 100px wide, 9px after from and 8px before to, its span between the
3179
+ * two thumbs filled. */
2747
3180
  [data-qc-theme] .qc-drawing-dual {
2748
3181
  position: relative;
2749
- flex: 1 1 auto;
2750
- min-width: 96px;
2751
- height: 16px;
3182
+ flex: 0 0 100px;
3183
+ width: 100px;
3184
+ height: 12px;
3185
+ margin-inline-start: 1px;
2752
3186
  }
2753
3187
 
2754
3188
  [data-qc-theme] .qc-drawing-dual-track {
@@ -2756,18 +3190,22 @@
2756
3190
  inset-inline: 0;
2757
3191
  top: 50%;
2758
3192
  height: 10px;
2759
- background: var(--qc-chrome-border);
3193
+ background: var(--qc-state-pressed);
2760
3194
  border-radius: 5px;
2761
3195
  transform: translateY(-50%);
2762
3196
  }
2763
3197
 
3198
+ /* The span the thumbs travel: the track less half a thumb at either end. */
3199
+ [data-qc-theme] .qc-drawing-dual-span {
3200
+ position: absolute;
3201
+ inset: 0 6px;
3202
+ }
3203
+
2764
3204
  [data-qc-theme] .qc-drawing-dual-fill {
2765
3205
  position: absolute;
2766
- top: 50%;
2767
- height: 10px;
2768
- background: var(--qc-text-secondary);
2769
- border-radius: 5px;
2770
- transform: translateY(-50%);
3206
+ top: 0;
3207
+ bottom: 0;
3208
+ background: var(--qc-text-primary);
2771
3209
  }
2772
3210
 
2773
3211
  [data-qc-theme] .qc-drawing-dual-input {
@@ -2781,22 +3219,29 @@
2781
3219
  pointer-events: none;
2782
3220
  }
2783
3221
 
3222
+ /* The two-thumb range's thumbs are the opacity knob: a dark disc with a 2px light rim, drawn from
3223
+ * the two poles so they read at both ends of the track in either mode. */
2784
3224
  [data-qc-theme] .qc-drawing-dual-input::-webkit-slider-thumb {
2785
3225
  width: 12px;
2786
3226
  height: 12px;
2787
- background: var(--qc-text-primary);
2788
- border: 2px solid var(--qc-chrome-surface);
3227
+ background: var(--qcd-black);
3228
+ border: 2px solid var(--qcd-white);
2789
3229
  border-radius: 50%;
3230
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
3231
+ cursor: pointer;
2790
3232
  appearance: none;
2791
3233
  pointer-events: auto;
2792
3234
  }
2793
3235
 
2794
3236
  [data-qc-theme] .qc-drawing-dual-input::-moz-range-thumb {
2795
- width: 10px;
2796
- height: 10px;
2797
- background: var(--qc-text-primary);
2798
- border: 2px solid var(--qc-chrome-surface);
3237
+ box-sizing: border-box;
3238
+ width: 12px;
3239
+ height: 12px;
3240
+ background: var(--qcd-black);
3241
+ border: 2px solid var(--qcd-white);
2799
3242
  border-radius: 50%;
3243
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
3244
+ cursor: pointer;
2800
3245
  pointer-events: auto;
2801
3246
  }
2802
3247
 
@@ -2812,45 +3257,27 @@
2812
3257
  align-items: center;
2813
3258
  }
2814
3259
 
2815
- [data-qc-theme] .qc-drawing-weight {
2816
- width: 28px;
2817
- height: 28px;
2818
- padding: 0;
2819
- }
2820
-
2821
- /* A row of cells wider than the dialog slides sideways under the pointer already on it; a bar
2822
- * beneath it would be chrome the table does not own. */
2823
- [data-qc-theme] .qc-drawing-table {
2824
- display: flex;
2825
- flex-direction: column;
2826
- gap: 4px;
2827
- overflow-x: auto;
2828
- scrollbar-width: none;
2829
- }
2830
-
2831
- [data-qc-theme] .qc-drawing-table::-webkit-scrollbar {
2832
- display: none;
2833
- }
2834
-
2835
- [data-qc-theme] .qc-drawing-table-row {
3260
+ /* The weight and slant toggles: a 34px field with a 6px corner around the 28px mark, filled while
3261
+ * held, the mark cut from the fill in the inverse ink. */
3262
+ [data-qc-theme] .qc-drawing-font-toggle {
2836
3263
  display: flex;
2837
- gap: 4px;
2838
- }
2839
-
2840
- [data-qc-theme] .qc-drawing-table-actions {
2841
- display: flex;
2842
- flex-wrap: wrap;
2843
- gap: 6px;
2844
- padding-top: 4px;
3264
+ flex: 0 0 34px;
3265
+ align-items: center;
3266
+ justify-content: center;
3267
+ width: 34px;
3268
+ padding: 0;
3269
+ border-radius: 6px;
3270
+ cursor: pointer;
2845
3271
  }
2846
3272
 
2847
- [data-qc-theme] .qc-drawing-table-actions .qc-button {
2848
- padding: 4px 8px;
2849
- font-size: var(--qc-text-fontSizeSmall);
3273
+ [data-qc-theme] .qc-drawing-font-toggle[aria-pressed='true'] {
3274
+ color: var(--qc-text-inverse);
3275
+ background: var(--qc-control-onPressed);
3276
+ border-color: var(--qc-control-onPressed);
2850
3277
  }
2851
3278
 
2852
- /* Forced colors: a swatch IS its color, so it keeps it, with a system border to stand on. The mixer's
2853
- * compact fields ring their focus in the system highlight, as every field does. */
3279
+ /* Forced colors: a swatch IS its color, so it keeps it, with a system border to stand on. The color
3280
+ * popover's compact fields edge their focus in the system highlight. */
2854
3281
  @media (forced-colors: active) {
2855
3282
  [data-qc-theme] .qc-drawing-swatch,
2856
3283
  [data-qc-theme] .qc-drawing-color-strip {
@@ -2858,11 +3285,10 @@
2858
3285
  border: 1px solid ButtonText;
2859
3286
  }
2860
3287
 
2861
- [data-qc-theme] .qc-drawing-hex-wrap:focus-within,
3288
+ [data-qc-theme] .qc-drawing-hex:focus,
2862
3289
  [data-qc-theme] .qc-drawing-opacity-readout:focus {
2863
3290
  forced-color-adjust: none;
2864
3291
  border-color: Highlight;
2865
- box-shadow: inset 0 0 0 1px Highlight;
2866
3292
  }
2867
3293
  }
2868
3294
 
@@ -3061,42 +3487,82 @@
3061
3487
  max-height: calc(100% - 16px);
3062
3488
  }
3063
3489
 
3064
- [data-qc-theme] .qc-drawing-dialog-header {
3490
+ /* The header: the name at 20 on 28 in a 68px band 20px in, then what the dialog adds after it (the
3491
+ * settings dialog's pencil), and the close 34px at the far end, 3px past the padding so its mark
3492
+ * lines up with the page's edge. The header is the handle the dialog is carried by. */
3493
+ [data-qc-theme] .qc-drawing-dialog .qc-drawing-dialog-header {
3065
3494
  display: flex;
3495
+ flex: 0 0 auto;
3066
3496
  align-items: center;
3067
- justify-content: space-between;
3068
- gap: 8px;
3069
- padding: 12px 14px 8px;
3070
- cursor: move;
3497
+ justify-content: flex-start;
3498
+ gap: 0;
3499
+ height: 68px;
3500
+ padding: 0 20px;
3501
+ cursor: grab;
3071
3502
  user-select: none;
3072
3503
  }
3073
3504
 
3074
3505
  [data-qc-theme] .qc-drawing-dialog-title {
3506
+ min-width: 0;
3075
3507
  overflow: hidden;
3508
+ font-size: 20px;
3509
+ font-weight: 600;
3510
+ line-height: 28px;
3076
3511
  text-overflow: ellipsis;
3077
3512
  white-space: nowrap;
3078
3513
  }
3079
3514
 
3515
+ [data-qc-theme] .qc-drawing-dialog .qc-dialog-close {
3516
+ flex: 0 0 34px;
3517
+ margin-inline-start: auto;
3518
+ margin-inline-end: -3px;
3519
+ border-radius: 8px;
3520
+ }
3521
+
3522
+ /* The body 20px in from the sides; a drop box stands 8px under the header. */
3080
3523
  [data-qc-theme] .qc-drawing-dialog-body {
3081
3524
  display: flex;
3082
3525
  flex: 1 1 auto;
3083
3526
  flex-direction: column;
3084
- gap: 4px;
3085
3527
  min-height: 0;
3086
- padding: 0 14px 8px;
3528
+ padding: 0 20px;
3087
3529
  overflow-y: auto;
3088
3530
  }
3089
3531
 
3090
- [data-qc-theme] .qc-drawing-dialog-footer {
3532
+ [data-qc-theme] .qc-drawing-dialog-body > .qc-drawing-drop {
3533
+ margin-top: 8px;
3534
+ }
3535
+
3536
+ /* The image picker's transparency: its name at the start and its 180px track at the end of a 46px
3537
+ * line, each 10px down the line's 26px middle, 24px above the footer. */
3538
+ [data-qc-theme] .qc-drawing-picker-opacity {
3091
3539
  display: flex;
3092
3540
  align-items: center;
3093
- gap: 8px;
3094
- padding: 10px 14px;
3095
- border-top: 1px solid var(--qc-overlay-separator);
3541
+ justify-content: space-between;
3542
+ margin-bottom: 24px;
3543
+ padding: 10px 0;
3544
+ }
3545
+
3546
+ [data-qc-theme] .qc-drawing-picker-opacity > * {
3547
+ margin-top: 10px;
3096
3548
  }
3097
3549
 
3098
- [data-qc-theme] .qc-drawing-dialog-footer .qc-button {
3099
- padding: 5px 12px;
3550
+ [data-qc-theme] .qc-drawing-picker-opacity > .qc-drawing-band-opacity {
3551
+ flex: 0 0 180px;
3552
+ width: 180px;
3553
+ margin-top: 10px;
3554
+ }
3555
+
3556
+ /* A drawing dialog's footer: what it leads with at the start (the settings dialog's Template list
3557
+ * button), then Cancel and the primary action 12px apart at the end, all 34px with an 8px corner,
3558
+ * over a 1px rule. Cancel is outlined in the outline role and takes the emphasis fill under the
3559
+ * pointer; the primary action wears the fill. */
3560
+ [data-qc-theme] .qc-drawing-dialog-footer {
3561
+ display: flex;
3562
+ align-items: center;
3563
+ justify-content: flex-end;
3564
+ padding: 16px 20px;
3565
+ border-top: 1px solid var(--qc-overlay-separator);
3100
3566
  }
3101
3567
 
3102
3568
  [data-qc-theme] .qc-drawing-footer-gap {
@@ -3112,31 +3578,225 @@
3112
3578
  margin: 6px 0 4px;
3113
3579
  }
3114
3580
 
3581
+ /* The settings dialog: a card at least 380px wide that grows to the widest page it shows, its
3582
+ * header, the page strip, the page and the footer stacked. */
3115
3583
  [data-qc-theme] .qc-drawing-settings-dialog {
3116
- width: min(380px, calc(100% - 16px));
3117
- max-height: min(560px, calc(100% - 16px));
3584
+ width: max-content;
3585
+ min-width: min(380px, calc(100% - 16px));
3586
+ max-width: calc(100% - 16px);
3118
3587
  }
3119
3588
 
3120
- [data-qc-theme] .qc-drawing-page {
3589
+ /* The settings dialog's pencil stands 5px after the name in a 34px cell. */
3590
+ [data-qc-theme] .qc-drawing-rename {
3121
3591
  display: flex;
3122
- flex-direction: column;
3123
- gap: 2px;
3124
- padding-top: 2px;
3592
+ flex: 0 0 34px;
3593
+ align-items: center;
3594
+ justify-content: center;
3595
+ width: 34px;
3596
+ height: 34px;
3597
+ margin-inline-start: 5px;
3598
+ padding: 0;
3599
+ color: var(--qc-text-primary);
3600
+ background: none;
3601
+ border: 0;
3602
+ border-radius: 2px;
3603
+ cursor: pointer;
3604
+ }
3605
+
3606
+ [data-qc-theme] .qc-drawing-rename:hover {
3607
+ background: var(--qc-state-hover);
3608
+ }
3609
+
3610
+ /* Renaming, the header is the name's field alone, as wide as the header and in the name's own type. */
3611
+ [data-qc-theme] .qc-drawing-dialog-header[data-qc-renaming='true'] > :not(.qc-drawing-rename-field) {
3612
+ display: none;
3613
+ }
3614
+
3615
+ [data-qc-theme] .qc-drawing-rename-field {
3616
+ flex: 1 1 auto;
3617
+ min-width: 0;
3618
+ font-size: 20px;
3619
+ font-weight: 600;
3620
+ line-height: 28px;
3621
+ }
3622
+
3623
+ /* The page strip: the tabs at 16 on 24, 12px apart, over a 4px track as wide as the page; the bar
3624
+ * standing on the track under the shown page glides to the next one. A tab under the pointer that
3625
+ * is not shown dims to the muted ink. */
3626
+ [data-qc-theme] .qc-drawing-tabs-slot {
3627
+ position: relative;
3628
+ flex: 0 0 auto;
3629
+ padding: 0 20px;
3630
+ }
3631
+
3632
+ [data-qc-theme] .qc-drawing-tabs-track {
3633
+ position: absolute;
3634
+ inset-inline: 20px;
3635
+ bottom: 0;
3636
+ height: 4px;
3637
+ background: var(--qc-overlay-separator);
3638
+ border-radius: 2px;
3639
+ }
3640
+
3641
+ [data-qc-theme] .qc-drawing-tabs {
3642
+ position: relative;
3643
+ display: inline-flex;
3644
+ vertical-align: top;
3645
+ white-space: nowrap;
3646
+ }
3647
+
3648
+ [data-qc-theme] .qc-drawing-tab {
3649
+ position: relative;
3650
+ margin: 0 12px;
3651
+ padding: 0 0 8px;
3652
+ color: var(--qc-text-primary);
3653
+ font: inherit;
3654
+ font-size: 16px;
3655
+ font-weight: 600;
3656
+ line-height: 24px;
3657
+ background: none;
3658
+ border: 0;
3659
+ border-radius: 4px;
3660
+ outline: none;
3661
+ cursor: pointer;
3662
+ }
3663
+
3664
+ [data-qc-theme] .qc-drawing-tab:first-of-type {
3665
+ margin-inline-start: 0;
3666
+ }
3667
+
3668
+ [data-qc-theme] .qc-drawing-tab:last-of-type {
3669
+ margin-inline-end: 0;
3670
+ }
3671
+
3672
+ [data-qc-theme] .qc-drawing-tab:not([aria-selected='true']):hover {
3673
+ color: var(--qc-text-muted);
3674
+ }
3675
+
3676
+ /* The keyboard's ring stands 10px out to either side of the label and over the bar's height. */
3677
+ [data-qc-theme] .qc-drawing-tab:focus-visible::after {
3678
+ position: absolute;
3679
+ inset: -2px -10px 0;
3680
+ border: 2px solid var(--qc-state-focusRing);
3681
+ border-radius: 8px;
3682
+ content: '';
3683
+ pointer-events: none;
3684
+ }
3685
+
3686
+ [data-qc-theme] .qc-drawing-tab-bar {
3687
+ position: absolute;
3688
+ bottom: 0;
3689
+ left: 0;
3690
+ height: 4px;
3691
+ background: var(--qc-control-on);
3692
+ border-radius: 2px;
3693
+ pointer-events: none;
3694
+ }
3695
+
3696
+ [data-qc-theme] .qc-drawing-tabs[data-qc-placed='true'] > .qc-drawing-tab-bar {
3697
+ transition: transform var(--qc-motion-durationGlide) var(--qc-motion-easingInOut), width var(--qc-motion-durationGlide) var(--qc-motion-easingInOut);
3698
+ }
3699
+
3700
+ /* The body scrolls the page alone, and keeps room for a short one. */
3701
+ [data-qc-theme] .qc-drawing-settings-dialog .qc-drawing-dialog-body {
3702
+ display: block;
3703
+ min-height: 145px;
3704
+ padding: 0;
3705
+ }
3706
+
3707
+ /* The page: a two-column grid inside 16px by 20px, the labels' column as wide as the widest label
3708
+ * and its 20px gap, the controls' column the rest. Everything on the page that is not a labelled
3709
+ * row stands across both columns. */
3710
+ [data-qc-theme] .qc-drawing-page {
3711
+ display: grid;
3712
+ grid-template-columns: auto minmax(0, 1fr);
3713
+ padding: 16px 20px;
3714
+ }
3715
+
3716
+ [data-qc-theme] .qc-drawing-page > :not(.qc-drawing-row) {
3717
+ grid-column: 1 / -1;
3718
+ }
3719
+
3720
+ [data-qc-theme] .qc-drawing-page > .qc-button {
3721
+ justify-self: start;
3125
3722
  }
3126
3723
 
3127
3724
  [data-qc-theme] .qc-drawing-template-button {
3128
- display: flex;
3725
+ display: inline-flex;
3726
+ flex: 0 0 auto;
3129
3727
  align-items: center;
3130
- gap: 4px;
3728
+ width: 100px;
3729
+ padding: 0 2px 0 8px;
3730
+ cursor: pointer;
3131
3731
  }
3132
3732
 
3133
- [data-qc-theme] .qc-drawing-caret {
3134
- display: flex;
3135
- transition: transform var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
3733
+ /* While its menu is open the Template button keeps the focus ring, and its chevron points up. */
3734
+ [data-qc-theme] .qc-drawing-template-button[aria-expanded='true'] {
3735
+ border-color: var(--qc-state-focusRing);
3736
+ box-shadow: inset 0 0 0 1px var(--qc-state-focusRing);
3136
3737
  }
3137
3738
 
3138
- [data-qc-theme] .qc-drawing-template-button[aria-expanded='true'] .qc-drawing-caret {
3139
- transform: rotate(180deg);
3739
+ [data-qc-theme] .qc-drawing-footer-button {
3740
+ display: inline-flex;
3741
+ align-items: center;
3742
+ justify-content: center;
3743
+ height: 34px;
3744
+ padding: 0 11px;
3745
+ font-size: 16px;
3746
+ line-height: 24px;
3747
+ border-radius: 8px;
3748
+ }
3749
+
3750
+ [data-qc-theme] .qc-drawing-footer-button + .qc-drawing-footer-button {
3751
+ margin-inline-start: 12px;
3752
+ }
3753
+
3754
+ [data-qc-theme] .qc-drawing-cancel {
3755
+ color: var(--qc-control-outline);
3756
+ border-color: var(--qc-control-outline);
3757
+ }
3758
+
3759
+ [data-qc-theme] .qc-drawing-cancel:hover:not([disabled]) {
3760
+ color: var(--qc-text-inverse);
3761
+ background: var(--qc-control-on);
3762
+ border-color: var(--qc-control-on);
3763
+ }
3764
+
3765
+ [data-qc-theme] .qc-drawing-cancel:active:not([disabled]) {
3766
+ color: var(--qc-text-inverse);
3767
+ background: var(--qc-control-onPressed);
3768
+ border-color: var(--qc-control-onPressed);
3769
+ }
3770
+
3771
+ /* The lists the dialog opens stand on a 10px corner; the Template menu is as wide as its words. */
3772
+ [data-qc-theme] .qc-drawing-popover--list {
3773
+ border-radius: 10px;
3774
+ }
3775
+
3776
+ [data-qc-theme] .qc-drawing-menu.qc-drawing-template-menu {
3777
+ width: max-content;
3778
+ min-width: 0;
3779
+ }
3780
+
3781
+ /* A saved template's row: its name, then the 26px slot at the end where its remove control
3782
+ * stands. The whole row lifts under the pointer. */
3783
+ [data-qc-theme] .qc-drawing-template-menu .qc-drawing-flyout-row {
3784
+ height: 32px;
3785
+ border-radius: 6px;
3786
+ }
3787
+
3788
+ [data-qc-theme] .qc-drawing-template-menu .qc-drawing-flyout-row > .qc-drawing-list-row {
3789
+ flex: 1 1 auto;
3790
+ width: auto;
3791
+ min-width: 0;
3792
+ }
3793
+
3794
+ [data-qc-theme] .qc-drawing-template-menu .qc-drawing-star {
3795
+ position: static;
3796
+ flex: 0 0 22px;
3797
+ width: 22px;
3798
+ height: 22px;
3799
+ margin-inline-end: 4px;
3140
3800
  }
3141
3801
 
3142
3802
  [data-qc-theme] .qc-drawing-note {
@@ -3144,15 +3804,216 @@
3144
3804
  font-size: var(--qc-text-fontSizeSmall);
3145
3805
  }
3146
3806
 
3147
- /* The plane's live region: read by assistive technology, never seen. Clipped rather than hidden,
3148
- * because a hidden node is not announced. */
3149
- [data-qc-theme] .qc-drawing-status {
3150
- position: absolute;
3151
- width: 1px;
3152
- height: 1px;
3153
- overflow: hidden;
3154
- clip-path: inset(50%);
3155
- white-space: nowrap;
3807
+ /* The plane's live region: read by assistive technology, never seen. Clipped rather than hidden,
3808
+ * because a hidden node is not announced. */
3809
+ [data-qc-theme] .qc-drawing-status {
3810
+ position: absolute;
3811
+ width: 1px;
3812
+ height: 1px;
3813
+ overflow: hidden;
3814
+ clip-path: inset(50%);
3815
+ white-space: nowrap;
3816
+ }
3817
+
3818
+ /* A leveled tool's level grid: two levels to a 34px line, 8px between lines and 8px above the
3819
+ * first, each level its 18px switch, its 100px value and its 34px well 8px apart, the second level
3820
+ * 48px after the first's well, the line 412px across whatever its levels hold. A level switched off
3821
+ * keeps its well, and its stroke where it shows one, on the read-only fill, dimmed. */
3822
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-level-row {
3823
+ min-width: 412px;
3824
+ min-height: 34px;
3825
+ margin-bottom: 8px;
3826
+ padding: 0;
3827
+ }
3828
+
3829
+ [data-qc-theme] .qc-drawing-page > :not(.qc-drawing-level-row) + .qc-drawing-level-row {
3830
+ margin-top: 8px;
3831
+ }
3832
+
3833
+ [data-qc-theme] .qc-drawing-level-row > :nth-child(4) {
3834
+ margin-inline-start: 40px;
3835
+ }
3836
+
3837
+ /* A gann grid: two lines to a 34px line, 8px between lines and 8px above the first, each line its
3838
+ * switch with its place or its ratio, 78px across so every well stands in line, then its well 8px
3839
+ * after; the second line 48px after the first's well, the line 412px across. A fan's rays stand one
3840
+ * to a 50px line. */
3841
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-ratio-row {
3842
+ min-width: 412px;
3843
+ min-height: 34px;
3844
+ margin-bottom: 8px;
3845
+ padding: 0;
3846
+ }
3847
+
3848
+ [data-qc-theme] .qc-drawing-page > :not(.qc-drawing-ratio-row) + .qc-drawing-ratio-row {
3849
+ margin-top: 8px;
3850
+ }
3851
+
3852
+ [data-qc-theme] .qc-drawing-ratio-row > :nth-child(3) {
3853
+ margin-inline-start: 40px;
3854
+ }
3855
+
3856
+ [data-qc-theme] .qc-drawing-ratio-switch {
3857
+ flex: 0 0 78px;
3858
+ min-width: 0;
3859
+ min-height: 34px;
3860
+ }
3861
+
3862
+ /* An image's page: its caption across the page over the box that chooses the picture, 8px above it. */
3863
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-row--caption > .qc-drawing-row-label {
3864
+ grid-column: 1 / -1;
3865
+ min-height: 0;
3866
+ padding: 0;
3867
+ }
3868
+
3869
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-row--caption > .qc-drawing-row-controls {
3870
+ display: none;
3871
+ }
3872
+
3873
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-drop {
3874
+ margin-top: 8px;
3875
+ }
3876
+
3877
+ /* A signpost's emoji: a field-sized button wearing the glyph's artwork, or the glyph itself where
3878
+ * the artwork has not come. */
3879
+ [data-qc-theme] .qc-drawing-emoji-button {
3880
+ display: inline-flex;
3881
+ align-items: center;
3882
+ justify-content: center;
3883
+ width: 36px;
3884
+ height: 34px;
3885
+ padding: 0;
3886
+ border-radius: 6px;
3887
+ }
3888
+
3889
+ [data-qc-theme] .qc-drawing-emoji-button .qc-drawing-glyph-art {
3890
+ width: 24px;
3891
+ height: 24px;
3892
+ }
3893
+
3894
+ /* An emoji well beside a switch that is off stands dimmed on the field's fill, as a color well does. */
3895
+ [data-qc-theme] .qc-drawing-emoji-button[data-qc-dim='true'] {
3896
+ background: var(--qc-control-fieldFill);
3897
+ }
3898
+
3899
+ [data-qc-theme] .qc-drawing-emoji-button[data-qc-dim='true'] > * {
3900
+ opacity: 0.5;
3901
+ }
3902
+
3903
+ [data-qc-theme] .qc-drawing-emoji-face {
3904
+ font-size: 20px;
3905
+ line-height: 1;
3906
+ }
3907
+
3908
+ [data-qc-theme] .qc-drawing-swatch-button[data-qc-dim='true'] {
3909
+ background: var(--qc-control-fieldFill);
3910
+ }
3911
+
3912
+ [data-qc-theme] .qc-drawing-swatch-button[data-qc-dim='true'] > .qc-drawing-well,
3913
+ [data-qc-theme] .qc-drawing-swatch-button[data-qc-dim='true'] > .qc-drawing-stroke {
3914
+ opacity: 0.5;
3915
+ }
3916
+
3917
+ /* The one color while the levels differ: the well split corner to corner between the color it
3918
+ * offers and a second hue, so it reads as several colors rather than one. */
3919
+ [data-qc-theme] .qc-drawing-swatch-button[data-qc-mixed='true'] .qc-drawing-well-fill {
3920
+ background: linear-gradient(to top right, var(--qcd-swatch) 50%, var(--qcd-paired) 50%);
3921
+ }
3922
+
3923
+ /* A list button whose face is a mark: 76px around a 50px bar of the chosen thickness, or 34px
3924
+ * around the chosen style's 28px mark. A thickness list stands 12px wider than its button, each
3925
+ * choice its bar alone; a style list is as wide as its words. */
3926
+ [data-qc-theme] .qc-drawing-select--mark {
3927
+ justify-content: center;
3928
+ padding: 0;
3929
+ }
3930
+
3931
+ [data-qc-theme] .qc-drawing-select--mark[data-mark='thickness'] {
3932
+ width: 76px;
3933
+ }
3934
+
3935
+ [data-qc-theme] .qc-drawing-select--mark[data-mark='style'] {
3936
+ width: 34px;
3937
+ }
3938
+
3939
+ [data-qc-theme] .qc-drawing-thickness-bar {
3940
+ display: block;
3941
+ flex: 0 0 auto;
3942
+ width: 50px;
3943
+ background: currentColor;
3944
+ }
3945
+
3946
+ [data-qc-theme] .qc-drawing-mark-list[data-mark='thickness'] {
3947
+ width: 88px;
3948
+ }
3949
+
3950
+ [data-qc-theme] .qc-drawing-mark-list[data-mark='style'] {
3951
+ width: max-content;
3952
+ }
3953
+
3954
+ [data-qc-theme] .qc-drawing-list-row--bar {
3955
+ justify-content: center;
3956
+ }
3957
+
3958
+ /* The chosen thickness or style is cut from the emphasis fill in the ink of a mark. */
3959
+ [data-qc-theme] .qc-drawing-mark-list .qc-drawing-list-row[aria-selected='true'] {
3960
+ color: var(--qc-control-onInk);
3961
+ }
3962
+
3963
+ /* The bands' opacity: a 148px track 10px tall on a 5px corner that fades from nothing into the
3964
+ * drawings' line color over the checked ground the color popover's track stands on, inside a 1px
3965
+ * edge of that color; its 12px knob is the popover's, a dark disc with a light rim, a pixel proud
3966
+ * of the track above and below. */
3967
+ [data-qc-theme] .qc-drawing-band-opacity {
3968
+ --qcd-angle-0: 0deg;
3969
+ --qcd-black: hsl(var(--qcd-angle-0) 0% 0%);
3970
+ --qcd-white: hsl(var(--qcd-angle-0) 0% 100%);
3971
+ --qcd-check-hue: 224deg;
3972
+ --qcd-check: hsl(var(--qcd-check-hue) 15% 19% / 0.4);
3973
+ --qcd-ground: var(--qcd-black);
3974
+ flex: 0 0 148px;
3975
+ width: 148px;
3976
+ height: 10px;
3977
+ margin: 0;
3978
+ background:
3979
+ linear-gradient(to right, transparent, var(--qc-drawing-line)),
3980
+ repeating-conic-gradient(from 270deg, var(--qcd-check) 0% 25%, transparent 0% 50%) 1px 50% / 8px 8px,
3981
+ var(--qcd-ground);
3982
+ border: 1px solid var(--qc-drawing-line);
3983
+ border-radius: 5px;
3984
+ outline: none;
3985
+ cursor: pointer;
3986
+ appearance: none;
3987
+ }
3988
+
3989
+ [data-qc-theme='light'] .qc-drawing-band-opacity {
3990
+ --qcd-ground: var(--qcd-white);
3991
+ }
3992
+
3993
+ [data-qc-theme] .qc-drawing-band-opacity:focus-visible {
3994
+ box-shadow: 0 0 0 2px var(--qc-state-focusRing);
3995
+ }
3996
+
3997
+ [data-qc-theme] .qc-drawing-band-opacity::-webkit-slider-thumb {
3998
+ width: 12px;
3999
+ height: 12px;
4000
+ background: var(--qcd-black);
4001
+ border: 2px solid var(--qcd-white);
4002
+ border-radius: 50%;
4003
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
4004
+ cursor: pointer;
4005
+ appearance: none;
4006
+ }
4007
+
4008
+ [data-qc-theme] .qc-drawing-band-opacity::-moz-range-thumb {
4009
+ box-sizing: border-box;
4010
+ width: 12px;
4011
+ height: 12px;
4012
+ background: var(--qcd-black);
4013
+ border: 2px solid var(--qcd-white);
4014
+ border-radius: 50%;
4015
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
4016
+ cursor: pointer;
3156
4017
  }
3157
4018
 
3158
4019
  /* The drawing toolbar: the column down the chart's inline-start edge, its split cells, its flyouts
@@ -4491,8 +5352,9 @@
4491
5352
 
4492
5353
  /* A chosen row inverts, the emphasis fill behind the inverse ink, and carries nothing else: no
4493
5354
  * accent tint, no decorative dot. The row's own `aria-checked` is what a reader is told. A row that
4494
- * IS a switch is not a choice among rows: its track says it is on, and the row stays as it is. */
4495
- [data-qc-theme] .qc-menu-row[aria-checked='true']:not([role='switch']) {
5355
+ * IS a switch or a checkbox is not a choice among rows: its track or its box says it is on, and the
5356
+ * row stays as it is. */
5357
+ [data-qc-theme] .qc-menu-row[aria-checked='true']:not([role='switch']):not([role='menuitemcheckbox']) {
4496
5358
  color: var(--qc-text-inverse);
4497
5359
  background: var(--qc-control-on);
4498
5360
  }
@@ -4586,6 +5448,12 @@
4586
5448
  pointer-events: auto;
4587
5449
  }
4588
5450
 
5451
+ /* A dialog that edits what it stands over leaves it undimmed: the backdrop still takes the press
5452
+ * that closes the dialog, and paints nothing. */
5453
+ [data-qc-theme] .qc-dialog-scrim[data-qc-veil='none'] {
5454
+ background: transparent;
5455
+ }
5456
+
4589
5457
  [data-qc-theme] .qc-dialog {
4590
5458
  display: flex;
4591
5459
  flex-direction: column;
@@ -4928,6 +5796,12 @@
4928
5796
  color: var(--qc-text-inverse);
4929
5797
  }
4930
5798
 
5799
+ /* The current starting point wears its mark and its words in the ink cut from the emphasis fill. */
5800
+ [data-qc-theme] .qc-replay-start-menu .qc-menu-row[aria-checked='true'],
5801
+ [data-qc-theme] .qc-replay-start-menu .qc-menu-row[aria-checked='true']:hover {
5802
+ color: var(--qc-control-onInk);
5803
+ }
5804
+
4931
5805
  [data-qc-theme] .qc-replay-menu .qc-menu-row--marked {
4932
5806
  height: 34px;
4933
5807
  padding-inline-start: 8px;
@@ -5043,73 +5917,404 @@
5043
5917
  }
5044
5918
 
5045
5919
  /* The date picker. */
5920
+
5921
+ /* The card stands 302px wide over the undimmed chart: a 68px header, the fields, the calendar and the
5922
+ * chip, and a 67px footer. The header carries the title at 20 on 28, which is the handle the card is
5923
+ * carried by, and the close in a 34px cell whose mark stands 3px past the header's padding. */
5924
+ [data-qc-theme] .qc-date-header {
5925
+ display: flex;
5926
+ flex: 0 0 auto;
5927
+ align-items: center;
5928
+ height: 68px;
5929
+ padding: 0 20px;
5930
+ }
5931
+
5932
+ [data-qc-theme] .qc-date-title {
5933
+ flex: 1 1 auto;
5934
+ min-width: 0;
5935
+ padding: 17px 0;
5936
+ cursor: grab;
5937
+ user-select: none;
5938
+ }
5939
+
5940
+ [data-qc-theme] .qc-date-title-text {
5941
+ display: block;
5942
+ overflow: hidden;
5943
+ color: var(--qc-text-primary);
5944
+ font-size: 20px;
5945
+ font-weight: 600;
5946
+ line-height: 28px;
5947
+ text-overflow: ellipsis;
5948
+ white-space: nowrap;
5949
+ }
5950
+
5951
+ [data-qc-theme] .qc-date-dialog .qc-dialog-close {
5952
+ flex: 0 0 34px;
5953
+ margin-inline-end: -3px;
5954
+ border-radius: 8px;
5955
+ }
5956
+
5957
+ /* The body is a dialog body that sits 17px under the header, edge to edge, and scrolls only in a
5958
+ * viewport shorter than the card. */
5959
+ [data-qc-theme] .qc-date-content {
5960
+ gap: 0;
5961
+ padding: 17px 0 0;
5962
+ }
5963
+
5964
+ /* The fields stand side by side, 150px and 100px with 12px between, 16px over the calendar. Each is
5965
+ * the chart's 34px field box with a 28px mark 3px in from its end, in the caret's ink and the field's
5966
+ * own ink under the pointer: the date's page of days, and the clock that opens the time list. */
5046
5967
  [data-qc-theme] .qc-date-fields {
5968
+ display: grid;
5969
+ grid-template-columns: 150px 100px;
5970
+ grid-template-rows: 34px;
5971
+ gap: 12px;
5972
+ margin-bottom: 16px;
5973
+ padding: 0 20px;
5974
+ }
5975
+
5976
+ [data-qc-theme] .qc-date-box {
5977
+ position: relative;
5047
5978
  display: flex;
5048
- gap: 8px;
5049
5979
  }
5050
5980
 
5051
- /* The date and the time are the chart's 34px field boxes, the date taking the room the time leaves. */
5052
- [data-qc-theme] .qc-date-field {
5981
+ [data-qc-theme] .qc-date-box > .qc-field {
5053
5982
  flex: 1 1 auto;
5983
+ width: 100%;
5054
5984
  min-width: 0;
5985
+ padding-inline-end: 33px;
5055
5986
  font-variant-numeric: tabular-nums;
5056
5987
  }
5057
5988
 
5058
- [data-qc-theme] .qc-date-time {
5059
- flex: 0 0 74px;
5060
- font-variant-numeric: tabular-nums;
5989
+ [data-qc-theme] .qc-date-box-mark {
5990
+ position: absolute;
5991
+ inset-block-start: 3px;
5992
+ inset-inline-end: 3px;
5993
+ display: flex;
5994
+ align-items: center;
5995
+ justify-content: center;
5996
+ width: 28px;
5997
+ height: 28px;
5998
+ padding: 0;
5999
+ color: var(--qc-chrome-caret);
6000
+ background: none;
6001
+ border: 0;
6002
+ pointer-events: none;
6003
+ }
6004
+
6005
+ [data-qc-theme] .qc-date-box:hover > .qc-date-box-mark {
6006
+ color: var(--qc-text-primary);
6007
+ }
6008
+
6009
+ [data-qc-theme] .qc-date-clock {
6010
+ cursor: pointer;
6011
+ pointer-events: auto;
6012
+ }
6013
+
6014
+ /* The calendar: 286px on 8px margins, its 262px of content inside 12px, a 34px row of the arrows
6015
+ * around the heading, a 22px band 12px either side, and a 226px view, the whole at least 332px tall.
6016
+ * It reads left to right in every language, as a calendar's columns do. */
6017
+ [data-qc-theme] .qc-date-calendar {
6018
+ display: flex;
6019
+ flex-direction: column;
6020
+ min-height: 332px;
6021
+ margin: 0 8px;
6022
+ padding: 1px 12px 15px;
6023
+ direction: ltr;
6024
+ user-select: none;
5061
6025
  }
5062
6026
 
5063
6027
  [data-qc-theme] .qc-date-nav {
5064
6028
  display: flex;
6029
+ flex: 0 0 34px;
5065
6030
  align-items: center;
5066
6031
  justify-content: space-between;
5067
- padding: 6px 0 2px;
6032
+ padding: 0 3px;
5068
6033
  }
5069
6034
 
5070
- [data-qc-theme] .qc-date-nav .qc-button {
5071
- display: inline-flex;
6035
+ /* Every press in the calendar is a 34px cell on an 8px corner with its words at 16 on 24. Under the
6036
+ * pointer it takes the hover fill and its words and mark brighten to the quiet ink; a day or a cell
6037
+ * that cannot be chosen keeps the disabled ink and takes no fill. */
6038
+ [data-qc-theme] .qc-date-step,
6039
+ [data-qc-theme] .qc-date-heading,
6040
+ [data-qc-theme] .qc-date-day,
6041
+ [data-qc-theme] .qc-date-cell {
6042
+ display: flex;
5072
6043
  align-items: center;
5073
6044
  justify-content: center;
5074
- width: 28px;
5075
- height: 28px;
5076
- padding: 0;
6045
+ height: 34px;
6046
+ font-size: 16px;
6047
+ line-height: 24px;
6048
+ white-space: nowrap;
5077
6049
  border-color: transparent;
6050
+ border-radius: 8px;
6051
+ }
6052
+
6053
+ [data-qc-theme] .qc-date-step {
6054
+ flex: 0 0 34px;
6055
+ width: 34px;
6056
+ padding: 0;
6057
+ }
6058
+
6059
+ [data-qc-theme] .qc-date-heading {
6060
+ padding: 0 11px;
5078
6061
  }
5079
6062
 
5080
- [data-qc-theme] .qc-date-grid {
6063
+ [data-qc-theme] .qc-date-dialog .qc-dialog-close:hover,
6064
+ [data-qc-theme] .qc-date-step:hover:not([disabled]),
6065
+ [data-qc-theme] .qc-date-heading:hover,
6066
+ [data-qc-theme] .qc-date-day:hover:not([disabled]):not([aria-selected='true']),
6067
+ [data-qc-theme] .qc-date-cell:hover:not([disabled]):not([aria-selected='true']) {
6068
+ color: var(--qc-control-neutralInk);
6069
+ }
6070
+
6071
+ /* The band over the grid, on the quiet fill: the weekdays spread across it in the muted ink, or the
6072
+ * word for the months or the years. */
6073
+ [data-qc-theme] .qc-date-band {
6074
+ display: flex;
6075
+ flex: 0 0 22px;
6076
+ align-items: center;
6077
+ justify-content: space-around;
6078
+ margin: 12px 0;
6079
+ padding: 2px 0;
6080
+ color: var(--qc-text-muted);
6081
+ font-size: 14px;
6082
+ line-height: 18px;
6083
+ background: var(--qc-control-neutral);
6084
+ border-radius: 6px;
6085
+ }
6086
+
6087
+ [data-qc-theme] .qc-date-view {
6088
+ flex: 0 0 226px;
6089
+ }
6090
+
6091
+ /* The days: weeks of seven 34px cells 4px apart, the first week against the end and the last against
6092
+ * the start, so each column is one weekday and no day of another month stands in a gap. The chosen day
6093
+ * is on the emphasis fill in the ink cut from it, and today wears a 2px bar under its number in the
6094
+ * number's own ink. */
6095
+ [data-qc-theme] .qc-date-weeks {
5081
6096
  display: flex;
5082
6097
  flex-direction: column;
5083
- gap: 2px;
6098
+ gap: 4px;
5084
6099
  }
5085
6100
 
5086
- [data-qc-theme] .qc-date-row {
6101
+ [data-qc-theme] .qc-date-week {
6102
+ display: flex;
6103
+ justify-content: space-between;
6104
+ }
6105
+
6106
+ [data-qc-theme] .qc-date-week:first-child {
6107
+ justify-content: flex-end;
6108
+ }
6109
+
6110
+ [data-qc-theme] .qc-date-week:last-child {
6111
+ justify-content: flex-start;
6112
+ }
6113
+
6114
+ [data-qc-theme] .qc-date-week:first-child > .qc-date-day + .qc-date-day,
6115
+ [data-qc-theme] .qc-date-week:last-child > .qc-date-day + .qc-date-day {
6116
+ margin-inline-start: 4px;
6117
+ }
6118
+
6119
+ [data-qc-theme] .qc-date-day {
6120
+ position: relative;
6121
+ flex: 0 0 34px;
6122
+ width: 34px;
6123
+ padding: 0;
6124
+ }
6125
+
6126
+ [data-qc-theme] .qc-date-day[aria-selected='true']:not([disabled]) {
6127
+ color: var(--qc-control-onInk);
6128
+ background: var(--qc-control-on);
6129
+ border-color: var(--qc-control-on);
6130
+ }
6131
+
6132
+ [data-qc-theme] .qc-date-day[aria-current='date']::before {
6133
+ position: absolute;
6134
+ inset-inline: 6px;
6135
+ top: 100%;
6136
+ height: 2px;
6137
+ margin-top: -6px;
6138
+ background: currentColor;
6139
+ border-radius: 1px;
6140
+ content: '';
6141
+ }
6142
+
6143
+ /* The months, three to a row 30px apart, and the years, four to a row 14px apart, 3px between
6144
+ * columns. The chosen month or year stands on the quiet fill, a step up under the pointer. */
6145
+ [data-qc-theme] .qc-date-months,
6146
+ [data-qc-theme] .qc-date-years {
5087
6147
  display: grid;
5088
- grid-template-columns: repeat(7, 1fr);
5089
- gap: 2px;
6148
+ grid-auto-rows: 34px;
6149
+ column-gap: 3px;
6150
+ }
6151
+
6152
+ [data-qc-theme] .qc-date-months {
6153
+ grid-template-columns: repeat(3, minmax(0, 1fr));
6154
+ row-gap: 30px;
6155
+ }
6156
+
6157
+ [data-qc-theme] .qc-date-years {
6158
+ grid-template-columns: repeat(4, minmax(0, 1fr));
6159
+ row-gap: 14px;
6160
+ }
6161
+
6162
+ [data-qc-theme] .qc-date-row {
6163
+ display: contents;
6164
+ }
6165
+
6166
+ [data-qc-theme] .qc-date-cell {
6167
+ min-width: 0;
6168
+ padding: 0 11px;
6169
+ }
6170
+
6171
+ [data-qc-theme] .qc-date-years .qc-date-cell {
6172
+ padding: 0 4px;
6173
+ }
6174
+
6175
+ [data-qc-theme] .qc-date-cell[aria-selected='true']:not([disabled]) {
6176
+ color: var(--qc-control-neutralInk);
6177
+ background: var(--qc-control-neutral);
6178
+ border-color: var(--qc-control-neutral);
6179
+ }
6180
+
6181
+ [data-qc-theme] .qc-date-cell[aria-selected='true']:not([disabled]):hover {
6182
+ background: var(--qc-control-neutralHover);
6183
+ border-color: var(--qc-control-neutralHover);
5090
6184
  }
5091
6185
 
5092
- [data-qc-theme] .qc-date-head {
6186
+ /* The chip under the calendar: 40px tall, its words at 16 on 24 and 15px in, centred and 10px over
6187
+ * the footer, on the quiet fill a step up under the pointer and another while pressed. */
6188
+ [data-qc-theme] .qc-date-first-row {
5093
6189
  display: flex;
6190
+ justify-content: center;
6191
+ }
6192
+
6193
+ [data-qc-theme] .qc-date-first {
6194
+ display: inline-flex;
5094
6195
  align-items: center;
5095
6196
  justify-content: center;
5096
- height: 24px;
6197
+ height: 40px;
6198
+ margin-bottom: 10px;
6199
+ padding: 0 15px;
6200
+ color: var(--qc-control-neutralInk);
6201
+ font-size: 16px;
6202
+ line-height: 24px;
6203
+ white-space: nowrap;
6204
+ background: var(--qc-control-neutral);
6205
+ border-color: var(--qc-control-neutral);
6206
+ border-radius: 8px;
5097
6207
  }
5098
6208
 
5099
- [data-qc-theme] .qc-date-day {
6209
+ [data-qc-theme] .qc-date-first:hover {
6210
+ background: var(--qc-control-neutralHover);
6211
+ border-color: var(--qc-control-neutralHover);
6212
+ }
6213
+
6214
+ [data-qc-theme] .qc-date-first:active {
6215
+ background: var(--qc-control-neutralPressed);
6216
+ border-color: var(--qc-control-neutralPressed);
6217
+ }
6218
+
6219
+ /* The footer under a 1px rule: Cancel and Select at its end, 34px tall and 12px apart, their words at
6220
+ * 16 on 24 and 11px in. Cancel is outlined in the outline role and takes the emphasis fill under the
6221
+ * pointer; Select wears the fill. */
6222
+ [data-qc-theme] .qc-date-footer {
5100
6223
  display: flex;
6224
+ flex: 0 0 auto;
6225
+ justify-content: flex-end;
6226
+ padding: 16px 20px;
6227
+ border-top: 1px solid var(--qc-overlay-separator);
6228
+ }
6229
+
6230
+ [data-qc-theme] .qc-date-footer .qc-button {
6231
+ display: inline-flex;
5101
6232
  align-items: center;
5102
6233
  justify-content: center;
5103
- height: 28px;
5104
- padding: 0;
6234
+ height: 34px;
6235
+ padding: 0 11px;
6236
+ font-size: 16px;
6237
+ line-height: 24px;
6238
+ white-space: nowrap;
6239
+ border-radius: 8px;
6240
+ }
6241
+
6242
+ [data-qc-theme] .qc-date-footer .qc-button + .qc-button {
6243
+ margin-inline-start: 12px;
6244
+ }
6245
+
6246
+ [data-qc-theme] .qc-date-cancel {
6247
+ color: var(--qc-control-outline);
6248
+ border-color: var(--qc-control-outline);
6249
+ }
6250
+
6251
+ [data-qc-theme] .qc-date-cancel:hover:not([disabled]) {
6252
+ color: var(--qc-text-inverse);
6253
+ background: var(--qc-control-on);
6254
+ border-color: var(--qc-control-on);
6255
+ }
6256
+
6257
+ [data-qc-theme] .qc-date-cancel:active:not([disabled]) {
6258
+ color: var(--qc-text-inverse);
6259
+ background: var(--qc-control-onPressed);
6260
+ border-color: var(--qc-control-onPressed);
6261
+ }
6262
+
6263
+ /* The time list stands on the dialog's backdrop directly under the time field and as wide as it, at
6264
+ * most 231px tall over a scroll of its own: the day in quarter hours on 32px rows with their words
6265
+ * 12px in. The time the field holds is on the emphasis fill; the row under the pointer, or the one
6266
+ * the keyboard walked to, takes the hover fill and dims its words. */
6267
+ [data-qc-theme] .qc-date-times {
6268
+ position: absolute;
6269
+ z-index: 1;
6270
+ display: flex;
6271
+ flex-direction: column;
6272
+ max-height: 231px;
6273
+ overflow: hidden;
6274
+ }
6275
+
6276
+ [data-qc-theme] .qc-date-times-body {
6277
+ position: relative;
6278
+ }
6279
+
6280
+ [data-qc-theme] .qc-date-times-rows {
6281
+ padding: 6px 0;
6282
+ }
6283
+
6284
+ [data-qc-theme] .qc-date-time-option {
6285
+ display: flex;
6286
+ align-items: center;
6287
+ height: 32px;
6288
+ padding-block: 0;
6289
+ padding-inline: 12px 10px;
6290
+ color: var(--qc-text-primary);
6291
+ font-size: 14px;
6292
+ line-height: 16px;
5105
6293
  font-variant-numeric: tabular-nums;
5106
- border-color: transparent;
6294
+ cursor: default;
6295
+ user-select: none;
5107
6296
  }
5108
6297
 
5109
- [data-qc-theme] .qc-date-day[aria-selected='true'] {
5110
- color: var(--qc-state-markInk);
5111
- background: var(--qc-state-accent);
5112
- border-color: var(--qc-state-accent);
6298
+ [data-qc-theme] .qc-date-time-option:hover,
6299
+ [data-qc-theme] .qc-date-time-option[data-qc-active='true'] {
6300
+ color: var(--qc-state-hoverInk);
6301
+ background: var(--qc-state-hover);
6302
+ }
6303
+
6304
+ [data-qc-theme] .qc-date-time-option[aria-selected='true'] {
6305
+ color: var(--qc-control-onInk);
6306
+ background: var(--qc-control-on);
6307
+ }
6308
+
6309
+ /* Forced colors: what is chosen in the calendar and the time list stands in the system highlight. */
6310
+ @media (forced-colors: active) {
6311
+ [data-qc-theme] .qc-date-day[aria-selected='true'],
6312
+ [data-qc-theme] .qc-date-cell[aria-selected='true'],
6313
+ [data-qc-theme] .qc-date-time-option[aria-selected='true'] {
6314
+ forced-color-adjust: none;
6315
+ color: HighlightText;
6316
+ background: Highlight;
6317
+ }
5113
6318
  }
5114
6319
 
5115
6320
  /* The thin bar beside a list the viewer scrolls to find something: the search results, the