@trdrs/quickcharts 3.0.0 → 4.1.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 (76) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/README.md +270 -30
  3. package/dist/{ar-HLKX6L6O.js → ar-VILLYPAA.js} +208 -56
  4. package/dist/ar-VILLYPAA.js.map +1 -0
  5. package/dist/{assets-C1VjN7DP.d.ts → assets-BF-NDyHl.d.ts} +288 -60
  6. package/dist/{ca_ES-3ALUJ2FI.js → ca_ES-EJXLAXOA.js} +208 -56
  7. package/dist/ca_ES-EJXLAXOA.js.map +1 -0
  8. package/dist/chunk-TBOVLJAK.js +12091 -0
  9. package/dist/chunk-TBOVLJAK.js.map +1 -0
  10. package/dist/{de-GXKOZYHP.js → de-PHID4SVN.js} +208 -56
  11. package/dist/de-PHID4SVN.js.map +1 -0
  12. package/dist/drawings.d.ts +34 -12
  13. package/dist/drawings.js +11 -1
  14. package/dist/{es-R7WSUWO2.js → es-KD4FBLOP.js} +208 -56
  15. package/dist/es-KD4FBLOP.js.map +1 -0
  16. package/dist/feature-manifest.json +74 -11
  17. package/dist/{fr-EBUMQLPT.js → fr-KTTX3FF3.js} +208 -56
  18. package/dist/fr-KTTX3FF3.js.map +1 -0
  19. package/dist/{he_IL-GCAXKEWB.js → he_IL-Z3DXMAKZ.js} +208 -56
  20. package/dist/he_IL-Z3DXMAKZ.js.map +1 -0
  21. package/dist/{id_ID-6JYEEKEA.js → id_ID-FFX6X4C5.js} +208 -56
  22. package/dist/id_ID-FFX6X4C5.js.map +1 -0
  23. package/dist/index.d.ts +1852 -1720
  24. package/dist/index.js +4664 -1870
  25. package/dist/index.js.map +1 -1
  26. package/dist/{it-IMLHI5VO.js → it-X2GFCLGU.js} +208 -56
  27. package/dist/it-X2GFCLGU.js.map +1 -0
  28. package/dist/{ja-QDEQ2EYA.js → ja-TG3WO2KH.js} +208 -56
  29. package/dist/ja-TG3WO2KH.js.map +1 -0
  30. package/dist/{ko-MTA7BZI3.js → ko-4HHHO7KV.js} +208 -56
  31. package/dist/ko-4HHHO7KV.js.map +1 -0
  32. package/dist/{ms_MY-K4EAHE5J.js → ms_MY-HPVQKVPY.js} +208 -56
  33. package/dist/ms_MY-HPVQKVPY.js.map +1 -0
  34. package/dist/{pl-CIIDQ3SB.js → pl-2W2HP34O.js} +208 -56
  35. package/dist/pl-2W2HP34O.js.map +1 -0
  36. package/dist/{pt-3HA2PDUN.js → pt-XQUBSXO7.js} +208 -56
  37. package/dist/pt-XQUBSXO7.js.map +1 -0
  38. package/dist/quickcharts.css +1660 -424
  39. package/dist/{ru-2F2VGHMW.js → ru-XKFQPFDM.js} +208 -56
  40. package/dist/ru-XKFQPFDM.js.map +1 -0
  41. package/dist/{sv-HCBRKFRZ.js → sv-ZMEGAPCR.js} +208 -56
  42. package/dist/sv-ZMEGAPCR.js.map +1 -0
  43. package/dist/{th-WWPM2QKB.js → th-4735BUT4.js} +208 -56
  44. package/dist/th-4735BUT4.js.map +1 -0
  45. package/dist/theme-manifest.json +148 -14
  46. package/dist/{tr-M57AMCWK.js → tr-PG3CW2L3.js} +208 -56
  47. package/dist/tr-PG3CW2L3.js.map +1 -0
  48. package/dist/{vi-YJHN2OK7.js → vi-YPRIAJ33.js} +208 -56
  49. package/dist/vi-YPRIAJ33.js.map +1 -0
  50. package/dist/{zh-AIFC65OE.js → zh-RVHEWNSW.js} +208 -56
  51. package/dist/zh-RVHEWNSW.js.map +1 -0
  52. package/dist/{zh_TW-2LLLW4H6.js → zh_TW-ZFJMDA64.js} +208 -56
  53. package/dist/zh_TW-ZFJMDA64.js.map +1 -0
  54. package/package.json +1 -1
  55. package/dist/ar-HLKX6L6O.js.map +0 -1
  56. package/dist/ca_ES-3ALUJ2FI.js.map +0 -1
  57. package/dist/chunk-DBJQXHLQ.js +0 -7003
  58. package/dist/chunk-DBJQXHLQ.js.map +0 -1
  59. package/dist/de-GXKOZYHP.js.map +0 -1
  60. package/dist/es-R7WSUWO2.js.map +0 -1
  61. package/dist/fr-EBUMQLPT.js.map +0 -1
  62. package/dist/he_IL-GCAXKEWB.js.map +0 -1
  63. package/dist/id_ID-6JYEEKEA.js.map +0 -1
  64. package/dist/it-IMLHI5VO.js.map +0 -1
  65. package/dist/ja-QDEQ2EYA.js.map +0 -1
  66. package/dist/ko-MTA7BZI3.js.map +0 -1
  67. package/dist/ms_MY-K4EAHE5J.js.map +0 -1
  68. package/dist/pl-CIIDQ3SB.js.map +0 -1
  69. package/dist/pt-3HA2PDUN.js.map +0 -1
  70. package/dist/ru-2F2VGHMW.js.map +0 -1
  71. package/dist/sv-HCBRKFRZ.js.map +0 -1
  72. package/dist/th-WWPM2QKB.js.map +0 -1
  73. package/dist/tr-M57AMCWK.js.map +0 -1
  74. package/dist/vi-YJHN2OK7.js.map +0 -1
  75. package/dist/zh-AIFC65OE.js.map +0 -1
  76. 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;
@@ -230,12 +249,35 @@
230
249
  * each chrome surface keeps its own recipes beside it.
231
250
  */
232
251
 
252
+ /* The root states every inherited value the chart's measurements are built on: its box model, its
253
+ * font and size, and the line height, weight, spacing, alignment and wrapping its words are set in.
254
+ * The widget's root and its layer on the document body both carry it. The dialogs, menus and panels
255
+ * on that layer stand inside the page's body, which would hand them whatever the page sets there (a
256
+ * line height, a weight, letter spacing); stated here, none of it reaches anything the chart draws. */
233
257
  [data-qc-theme] {
234
258
  position: relative;
235
259
  box-sizing: border-box;
236
260
  color: var(--qc-text-primary);
237
261
  font-family: var(--qc-text-fontFamily);
238
262
  font-size: var(--qc-text-fontSizeBase);
263
+ font-style: normal;
264
+ font-weight: 400;
265
+ font-stretch: normal;
266
+ font-variant: normal;
267
+ font-feature-settings: normal;
268
+ font-variation-settings: normal;
269
+ font-kerning: auto;
270
+ line-height: normal;
271
+ letter-spacing: normal;
272
+ word-spacing: normal;
273
+ text-align: start;
274
+ text-indent: 0;
275
+ text-transform: none;
276
+ text-rendering: auto;
277
+ white-space: normal;
278
+ word-break: normal;
279
+ overflow-wrap: normal;
280
+ hyphens: manual;
239
281
  background: var(--qc-canvas-background);
240
282
  }
241
283
 
@@ -245,6 +287,16 @@
245
287
  box-sizing: inherit;
246
288
  }
247
289
 
290
+ /* Every control reads in the chart's font: a button, a field or a list takes the root's family rather
291
+ * than the browser's own control font, whatever words it shows or holds. A recipe that sets a size
292
+ * or a weight keeps it, and one that names a family of its own outranks this. */
293
+ [data-qc-theme] button,
294
+ [data-qc-theme] input,
295
+ [data-qc-theme] select,
296
+ [data-qc-theme] textarea {
297
+ font-family: inherit;
298
+ }
299
+
248
300
  /* Surfaces ------------------------------------------------------------------------------------ */
249
301
 
250
302
  [data-qc-theme] .qc-surface {
@@ -380,7 +432,7 @@
380
432
  }
381
433
 
382
434
  /* 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. */
435
+ * disabled one stands its words back too, in the disabled ink. */
384
436
  [data-qc-theme] .qc-field[readonly] {
385
437
  background: var(--qc-control-fieldFill);
386
438
  border-color: var(--qc-control-fieldEdge);
@@ -388,7 +440,7 @@
388
440
 
389
441
  [data-qc-theme] .qc-field:disabled,
390
442
  [data-qc-theme] .qc-field[aria-disabled='true'] {
391
- color: var(--qc-text-muted);
443
+ color: var(--qc-text-disabled);
392
444
  background: var(--qc-control-fieldFill);
393
445
  border-color: var(--qc-control-fieldEdge);
394
446
  cursor: default;
@@ -418,7 +470,7 @@
418
470
  box-shadow: inset 0 0 0 1px var(--qc-control-fieldInvalid);
419
471
  }
420
472
 
421
- /* A select draws its own chevron: the 18px mark in the muted ink, in a 20 by 28 slot 2px in from the
473
+ /* A select draws its own chevron: the 18px mark in the caret ink, in a 20 by 28 slot 2px in from the
422
474
  * end of the box. A native select gives up the slot's room and takes the press the slot lets
423
475
  * through; a list button lays the slot out after its face and turns the mark while its list is open,
424
476
  * keyed on its own state, so a list button inside some other open thing does not turn. */
@@ -442,7 +494,7 @@
442
494
  justify-content: center;
443
495
  width: 20px;
444
496
  height: 28px;
445
- color: var(--qc-text-muted);
497
+ color: var(--qc-chrome-caret);
446
498
  pointer-events: none;
447
499
  }
448
500
 
@@ -453,7 +505,7 @@
453
505
  }
454
506
 
455
507
  [data-qc-theme] .qc-select-chevron > svg {
456
- transition: rotate var(--qc-motion-durationSlow) var(--qc-motion-easingSpring);
508
+ transition: rotate var(--qc-motion-durationSlow) var(--qc-motion-easingStandard);
457
509
  }
458
510
 
459
511
  [data-qc-theme] [aria-expanded='true'] > .qc-select-chevron > svg {
@@ -1892,12 +1944,45 @@
1892
1944
 
1893
1945
  /* The inline text editor over the pane, the glyph picker and the image picker. */
1894
1946
 
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. */
1947
+ /* The text editor over the pane. Its place, size and type are written by the editor, because they
1948
+ * are the words' own. */
1898
1949
  [data-qc-theme] .qc-drawing-text-editor {
1899
1950
  position: absolute;
1900
1951
  z-index: 8;
1952
+ margin: 0;
1953
+ resize: none;
1954
+ pointer-events: auto;
1955
+ }
1956
+
1957
+ /* Over a drawing that types its words on the chart, the field is seen by nobody: the chart paints
1958
+ * the words, the caret, the selection and the placeholder, and the field only takes the keys. It
1959
+ * lies exactly over the painted words, 2px of padding around their block, in their own type with
1960
+ * nothing of its own (no spacing, features or decoration) that would part its caret from them. */
1961
+ [data-qc-theme] .qc-drawing-text-editor[data-qc-editor='inline'] {
1962
+ box-sizing: border-box;
1963
+ min-width: 0;
1964
+ max-width: none;
1965
+ padding: 2px;
1966
+ overflow: hidden;
1967
+ overflow-wrap: break-word;
1968
+ color: inherit;
1969
+ font-feature-settings: normal;
1970
+ font-kerning: auto;
1971
+ letter-spacing: normal;
1972
+ word-spacing: normal;
1973
+ text-indent: 0;
1974
+ text-transform: none;
1975
+ background: none;
1976
+ border: 0;
1977
+ outline: none;
1978
+ box-shadow: none;
1979
+ opacity: 0;
1980
+ }
1981
+
1982
+ /* Over any other drawing, the editor is a box at the drawing's own text position in the drawing's
1983
+ * own type, its size following the content. The ring is the focus role, so it reads as the field it
1984
+ * is without a fill hiding the chart. */
1985
+ [data-qc-theme] .qc-drawing-text-editor[data-qc-editor='box'] {
1901
1986
  padding: 3px 6px;
1902
1987
  overflow: hidden;
1903
1988
  text-align: center;
@@ -1907,11 +1992,9 @@
1907
1992
  border-radius: 2px;
1908
1993
  outline: none;
1909
1994
  box-shadow: 0 0 0 1px var(--qc-state-focusRing);
1910
- resize: none;
1911
- pointer-events: auto;
1912
1995
  }
1913
1996
 
1914
- [data-qc-theme] .qc-drawing-text-editor::placeholder {
1997
+ [data-qc-theme] .qc-drawing-text-editor[data-qc-editor='box']::placeholder {
1915
1998
  color: var(--qc-text-muted);
1916
1999
  }
1917
2000
 
@@ -2065,7 +2148,7 @@
2065
2148
  color: var(--qc-text-primary);
2066
2149
  background: var(--qc-chrome-surfaceRaised);
2067
2150
  border: 1px dashed var(--qc-chrome-borderStrong);
2068
- border-radius: var(--qc-chrome-radiusLarge);
2151
+ border-radius: 4px;
2069
2152
  cursor: pointer;
2070
2153
  }
2071
2154
 
@@ -2081,16 +2164,21 @@
2081
2164
  object-fit: contain;
2082
2165
  }
2083
2166
 
2167
+ /* The words a drop box states: its call at 16 on 24 with 8px around it and 8px under it, then the
2168
+ * formats and the size at 14 on 21 in the secondary ink. */
2084
2169
  [data-qc-theme] .qc-drawing-drop-words {
2085
2170
  display: flex;
2086
2171
  flex-direction: column;
2087
- gap: 4px;
2088
2172
  align-items: center;
2089
- font-size: var(--qc-text-fontSizeSmall);
2173
+ font-size: var(--qc-text-fontSizeBase);
2174
+ line-height: 21px;
2090
2175
  }
2091
2176
 
2092
2177
  [data-qc-theme] .qc-drawing-drop-title {
2093
- font-size: var(--qc-text-fontSizeBase);
2178
+ margin-bottom: 8px;
2179
+ padding: 8px;
2180
+ font-size: 16px;
2181
+ line-height: 24px;
2094
2182
  }
2095
2183
 
2096
2184
  [data-qc-theme] .qc-drawing-file {
@@ -2151,33 +2239,167 @@
2151
2239
  cursor: default;
2152
2240
  }
2153
2241
 
2154
- /* The text fields, selects and number fields are the chart's 34px field box; these rules give them
2155
- * their widths alone. */
2242
+ /* On a settings page a row lays out nothing of its own: its label and its controls are the grid's
2243
+ * two cells, each 50px tall around a 34px control. A label stands 20px clear of the controls and
2244
+ * wraps rather than cutting a word short; the controls stand 8px apart. */
2245
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-row {
2246
+ display: contents;
2247
+ }
2248
+
2249
+ [data-qc-theme] .qc-drawing-page .qc-drawing-row-label {
2250
+ display: flex;
2251
+ align-items: center;
2252
+ min-width: 0;
2253
+ min-height: 50px;
2254
+ padding: 8px 20px 8px 0;
2255
+ overflow: visible;
2256
+ color: var(--qc-text-primary);
2257
+ white-space: normal;
2258
+ overflow-wrap: break-word;
2259
+ }
2260
+
2261
+ [data-qc-theme] .qc-drawing-page .qc-drawing-row-controls {
2262
+ flex-wrap: nowrap;
2263
+ gap: 8px;
2264
+ min-width: 0;
2265
+ min-height: 50px;
2266
+ padding: 8px 0;
2267
+ }
2268
+
2269
+ /* A checkbox row: the 18px box 8px before its words, across both columns in a 50px row. */
2270
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-toggle {
2271
+ min-height: 50px;
2272
+ }
2273
+
2274
+ [data-qc-theme] .qc-drawing-row-full {
2275
+ display: flex;
2276
+ align-items: center;
2277
+ gap: 8px;
2278
+ min-height: 50px;
2279
+ padding: 8px 0;
2280
+ }
2281
+
2282
+ /* A section title: 11px capitals in the muted ink, in a 32px row, or in a field row's 50px where it
2283
+ * heads a list of inputs. */
2284
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-section {
2285
+ display: flex;
2286
+ align-items: center;
2287
+ height: 32px;
2288
+ padding: 0;
2289
+ letter-spacing: normal;
2290
+ }
2291
+
2292
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-section--row {
2293
+ height: 50px;
2294
+ }
2295
+
2296
+ /* A checkbox row in a list of inputs stands 34px, 8px around its box. */
2297
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-toggle--compact {
2298
+ min-height: 34px;
2299
+ }
2300
+
2301
+ /* A row nested under the switch before it sets its label, or its labelling checkbox, 26px in. */
2302
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-row--nested > .qc-drawing-row-label {
2303
+ padding-inline-start: 26px;
2304
+ }
2305
+
2306
+ /* A band on one line: its switch 16px before its name, then its multiplier 8px after the name. */
2307
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-band-row > .qc-drawing-toggle {
2308
+ gap: 16px;
2309
+ }
2310
+
2311
+ [data-qc-theme] .qc-drawing-group-gap {
2312
+ height: 16px;
2313
+ }
2314
+
2315
+ /* The text fields, list buttons and number fields are the chart's 34px field box; these rules give
2316
+ * them their widths and lay a list button's face out: its words 8px in, cut short with an ellipsis,
2317
+ * then the chevron's slot 2px from the end. */
2156
2318
  [data-qc-theme] .qc-drawing-select {
2157
- min-width: 140px;
2319
+ display: inline-flex;
2320
+ flex: 0 0 auto;
2321
+ align-items: center;
2322
+ width: 100px;
2323
+ padding: 0 2px 0 7px;
2324
+ text-align: start;
2325
+ cursor: pointer;
2326
+ }
2327
+
2328
+ /* A list button's edge steps further under the pointer than another field's, below the states that
2329
+ * outrank the pointer: a field that cannot be used, a refused value and the keyboard's ring. */
2330
+ [data-qc-theme] .qc-drawing-select:hover:not(:disabled):not([aria-invalid='true']):not(:focus-visible) {
2331
+ border-color: var(--qc-control-selectEdgeHover);
2332
+ }
2333
+
2334
+ [data-qc-theme] .qc-drawing-select[data-width='medium'] {
2335
+ width: 150px;
2336
+ }
2337
+
2338
+ [data-qc-theme] .qc-drawing-select[data-width='wide'] {
2339
+ width: 180px;
2340
+ }
2341
+
2342
+ [data-qc-theme] .qc-drawing-select-value {
2343
+ flex: 1 1 auto;
2344
+ min-width: 0;
2345
+ padding-inline-end: 6px;
2346
+ overflow: hidden;
2347
+ text-overflow: ellipsis;
2348
+ white-space: nowrap;
2349
+ }
2350
+
2351
+ /* A list's rows: 32px, the words at 14 on 18 and 8px in; a row with a mark carries the 28px mark 4px
2352
+ * in and its name 6px after it; a row of a list of switches carries the settings rows' 18px checkbox
2353
+ * 8px in and its name 10px after it. The chosen row of a list of choices inverts; a ticked switch
2354
+ * keeps the list's ground, its box saying it is on. A list button's list is as wide as its
2355
+ * longest row, never narrower than the button that opened it (the button sets that floor, and a
2356
+ * list of switches is held to the button's own width). */
2357
+ [data-qc-theme] .qc-drawing-menu.qc-drawing-select-list {
2358
+ width: max-content;
2359
+ min-width: 0;
2360
+ }
2361
+
2362
+ [data-qc-theme] .qc-drawing-list-row {
2363
+ height: 32px;
2364
+ gap: 0;
2365
+ padding: 0 8px;
2366
+ line-height: 18px;
2367
+ border-radius: 6px;
2368
+ }
2369
+
2370
+ [data-qc-theme] .qc-drawing-list-row--mark {
2371
+ gap: 6px;
2372
+ padding: 0 14px 0 4px;
2373
+ }
2374
+
2375
+ [data-qc-theme] .qc-drawing-list-row--check {
2376
+ gap: 10px;
2377
+ padding: 0 8px;
2158
2378
  }
2159
2379
 
2160
2380
  [data-qc-theme] .qc-drawing-input[data-width='short'] {
2161
2381
  width: 96px;
2162
2382
  }
2163
2383
 
2164
- [data-qc-theme] .qc-drawing-input[data-width='wide'] {
2384
+ /* The text area is the field box 100px tall across the page, 172px for a tool that is its words (a
2385
+ * text, a note, a callout), its words 8px in from the sides and 5px from the top. */
2386
+ [data-qc-theme] .qc-drawing-textarea {
2165
2387
  width: 100%;
2388
+ height: 100px;
2389
+ margin: 0;
2390
+ padding: 4px 7px;
2391
+ resize: none;
2166
2392
  }
2167
2393
 
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;
2394
+ [data-qc-theme] .qc-drawing-textarea[data-size='tall'] {
2395
+ height: 172px;
2176
2396
  }
2177
2397
 
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. */
2398
+ /* The number field keeps the end of its box for its steppers whether they show or not: a 22 by 28
2399
+ * slot 2px in from the edge, the words stopping 2px short of it, the arrows revealed on hover or
2400
+ * focus. A field that cannot be used keeps no slot and shows no arrows, its words running to 4px
2401
+ * from its edge. The pointer on a stepper is on the field, so the edge steps up there too, at the
2402
+ * weight of the field's own pointer state. */
2181
2403
  [data-qc-theme] .qc-drawing-number-wrap {
2182
2404
  position: relative;
2183
2405
  display: inline-flex;
@@ -2195,13 +2417,17 @@
2195
2417
  width: 84px;
2196
2418
  }
2197
2419
 
2420
+ [data-qc-theme] .qc-drawing-number-wrap[data-width='field'] {
2421
+ width: 100px;
2422
+ }
2423
+
2198
2424
  [data-qc-theme] .qc-drawing-number-wrap[data-width='wide'] {
2199
2425
  width: 112px;
2200
2426
  }
2201
2427
 
2202
2428
  [data-qc-theme] .qc-drawing-number {
2203
2429
  width: 100%;
2204
- padding-inline-end: 26px;
2430
+ padding-inline-end: 28px;
2205
2431
  font-variant-numeric: tabular-nums;
2206
2432
  appearance: textfield;
2207
2433
  }
@@ -2225,6 +2451,14 @@
2225
2451
  display: flex;
2226
2452
  }
2227
2453
 
2454
+ [data-qc-theme] .qc-drawing-number:disabled {
2455
+ padding-inline-end: 4px;
2456
+ }
2457
+
2458
+ [data-qc-theme] .qc-drawing-number:disabled + .qc-drawing-steppers {
2459
+ display: none;
2460
+ }
2461
+
2228
2462
  [data-qc-theme] .qc-drawing-stepper {
2229
2463
  display: flex;
2230
2464
  align-items: center;
@@ -2232,11 +2466,12 @@
2232
2466
  width: 22px;
2233
2467
  height: 14px;
2234
2468
  padding: 0;
2235
- color: var(--qc-text-muted);
2469
+ color: var(--qc-chrome-caret);
2236
2470
  background: none;
2237
2471
  border: 0;
2238
- border-radius: var(--qc-chrome-radius);
2472
+ border-radius: 4px;
2239
2473
  cursor: pointer;
2474
+ transition: color var(--qc-motion-durationSlow) var(--qc-motion-easingStandard), background-color var(--qc-motion-durationSlow) var(--qc-motion-easingStandard);
2240
2475
  }
2241
2476
 
2242
2477
  [data-qc-theme] .qc-drawing-stepper[data-up='true'] svg {
@@ -2245,29 +2480,63 @@
2245
2480
 
2246
2481
  [data-qc-theme] .qc-drawing-stepper:hover {
2247
2482
  color: var(--qc-text-primary);
2248
- background: var(--qc-state-hover);
2483
+ background: var(--qc-state-pressed);
2484
+ }
2485
+
2486
+ /* The color popover and the shared color control inside it.
2487
+ *
2488
+ * The popover hangs under the swatch button that opened it, as wide as what it holds wherever it
2489
+ * opens, a 6px corner on the overlay ground, its column 6px clear of its top and bottom: the
2490
+ * palette, then for a stroke the Thickness and Line style rows. It never narrows to the room it
2491
+ * finds: the placement moves it to stay inside the box instead. A color button holding its popover
2492
+ * open rings itself as a field with the keyboard does. */
2493
+ [data-qc-theme] .qc-drawing-popover--color {
2494
+ width: max-content;
2495
+ max-width: none;
2249
2496
  }
2250
2497
 
2251
- /* Swatches: a ten-wide grid of squares, the plus cell, and the custom panel it opens in place. */
2498
+ [data-qc-theme] .qc-drawing-color-popover {
2499
+ padding: 6px 0;
2500
+ }
2501
+
2502
+ [data-qc-theme] .qc-drawing-swatch-button[aria-expanded='true'] {
2503
+ border-color: var(--qc-state-focusRing);
2504
+ box-shadow: inset 0 0 0 1px var(--qc-state-focusRing);
2505
+ }
2506
+
2507
+ /* The palette is 224px wide, 6px clear of what stands above and below it and 12px clear of either
2508
+ * side: a ten-wide grid of 17px cells, each carrying its own 3px gutter, in blocks that keep 6px
2509
+ * under them (the greys and the ten hues; the six ramps; the colors this viewer mixed with the plus
2510
+ * after them), a 1px rule 12px clear of the blocks either side, and the opacity under a 12px muted
2511
+ * title. The blocks pull their outer gutters back past the palette's sides, and the rule and the
2512
+ * title stand clear by their own margins, which take a block's in.
2513
+ *
2514
+ * The room either side is margin rather than padding, so the 224px is the palette's own box under
2515
+ * either box model. A page's unlayered rule outranks any box-sizing this layered sheet could state,
2516
+ * and a page that sizes every element by its border box would take padding out of the grid's 224px;
2517
+ * margin it leaves alone, so the palette, and every surface sized to what it holds around it, keeps
2518
+ * the whole grid. */
2252
2519
  [data-qc-theme] .qc-drawing-palette {
2253
- display: flex;
2254
- flex-direction: column;
2255
- padding: 12px;
2520
+ width: 224px;
2521
+ margin-inline: 12px;
2522
+ padding-block: 6px;
2256
2523
  }
2257
2524
 
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 {
2260
- padding: 6px;
2525
+ /* A palette that is a popover's whole content keeps the popover column's 6px inside its own, and
2526
+ * inside a panel that pads already, the palette stands the rest of the way in rather than again. */
2527
+ [data-qc-theme] .qc-drawing-popover > .qc-drawing-palette {
2528
+ padding-block: 12px;
2529
+ }
2530
+
2531
+ [data-qc-theme] .qc-inline-panel .qc-drawing-palette {
2532
+ margin-inline: 6px;
2533
+ padding-block: 6px;
2261
2534
  }
2262
2535
 
2263
2536
  [data-qc-theme] .qc-drawing-swatches {
2264
- display: flex;
2265
- flex-direction: column;
2537
+ display: block;
2266
2538
  }
2267
2539
 
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
2540
  [data-qc-theme] .qc-drawing-swatch-block {
2272
2541
  margin: 0 -3px 6px;
2273
2542
  }
@@ -2276,10 +2545,9 @@
2276
2545
  display: flex;
2277
2546
  }
2278
2547
 
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
2548
  [data-qc-theme] .qc-drawing-swatch {
2282
2549
  position: relative;
2550
+ flex: 0 0 17px;
2283
2551
  width: 17px;
2284
2552
  height: 17px;
2285
2553
  margin: 3px;
@@ -2287,132 +2555,270 @@
2287
2555
  background: var(--qcd-swatch);
2288
2556
  border: 0;
2289
2557
  border-radius: 2px;
2558
+ outline: none;
2290
2559
  cursor: pointer;
2291
2560
  }
2292
2561
 
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 {
2562
+ /* A cell's ring stands 2px outside it, 2px wide on a 6px corner, and fades in and out: the field's
2563
+ * edge under the pointer, the primary ink around the chosen color (over its neighbours), and the
2564
+ * focus color where the keyboard stands. */
2565
+ [data-qc-theme] .qc-drawing-swatch::after {
2301
2566
  position: absolute;
2302
2567
  inset: -4px;
2303
- border: 2px solid var(--qc-text-primary);
2304
- border-radius: var(--qc-chrome-radius);
2568
+ border: 2px solid transparent;
2569
+ border-radius: 6px;
2305
2570
  content: '';
2571
+ pointer-events: none;
2572
+ transition: border-color var(--qc-motion-durationSlow) var(--qc-motion-easingStandard);
2573
+ }
2574
+
2575
+ [data-qc-theme] .qc-drawing-swatch:hover::after {
2576
+ border-color: var(--qc-control-fieldEdge);
2577
+ }
2578
+
2579
+ [data-qc-theme] .qc-drawing-swatch[data-qc-active='true']::after {
2580
+ z-index: 1;
2581
+ border-color: var(--qc-text-primary);
2582
+ }
2583
+
2584
+ [data-qc-theme] .qc-drawing-swatch:focus-visible::after {
2585
+ border-color: var(--qc-state-focusRing);
2306
2586
  }
2307
2587
 
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. */
2588
+ /* On a light panel the palest cell takes the panel's own edge, where it would otherwise vanish. */
2589
+ [data-qc-theme='light'] .qc-drawing-swatch[data-qc-pale='true'] {
2590
+ box-shadow: inset 0 0 0 1px var(--qc-chrome-border);
2591
+ }
2592
+
2593
+ /* The plus: a cell with no fill of its own, crossed at its middle by two 13px hairlines in the
2594
+ * primary ink, washed in the hover fill under the pointer and ringed inside its own edge where the
2595
+ * keyboard stands. */
2310
2596
  [data-qc-theme] .qc-drawing-swatch-plus {
2597
+ position: relative;
2598
+ flex: 0 0 17px;
2599
+ width: 17px;
2600
+ height: 17px;
2601
+ margin: 3px;
2602
+ padding: 0;
2311
2603
  background: none;
2312
- box-shadow: none;
2604
+ border: 0;
2605
+ border-radius: 2px;
2606
+ outline: none;
2607
+ cursor: pointer;
2608
+ transition: background-color var(--qc-motion-durationSlow) var(--qc-motion-easingStandard);
2609
+ }
2610
+
2611
+ [data-qc-theme] .qc-drawing-swatch-plus:hover {
2612
+ background: var(--qc-state-hover);
2313
2613
  }
2314
2614
 
2315
2615
  [data-qc-theme] .qc-drawing-swatch-plus::before,
2316
2616
  [data-qc-theme] .qc-drawing-swatch-plus::after {
2317
2617
  position: absolute;
2318
- inset: 8px 2px;
2319
2618
  background: var(--qc-text-primary);
2320
2619
  content: '';
2321
2620
  }
2322
2621
 
2323
2622
  [data-qc-theme] .qc-drawing-swatch-plus::before {
2324
- inset: 2px 8px;
2623
+ top: calc(50% - 6.5px);
2624
+ left: calc(50% - 0.5px);
2625
+ width: 1px;
2626
+ height: 13px;
2627
+ }
2628
+
2629
+ [data-qc-theme] .qc-drawing-swatch-plus::after {
2630
+ top: calc(50% - 0.5px);
2631
+ left: calc(50% - 6.5px);
2632
+ width: 13px;
2633
+ height: 1px;
2634
+ }
2635
+
2636
+ [data-qc-theme] .qc-drawing-swatch-plus:focus-visible {
2637
+ border: 2px solid var(--qc-state-focusRing);
2638
+ border-radius: 4px;
2325
2639
  }
2326
2640
 
2327
- /* The rule between the offered colours and the ones this viewer mixed. */
2328
2641
  [data-qc-theme] .qc-drawing-separator {
2329
2642
  height: 1px;
2330
- margin: 6px 0 12px;
2643
+ margin: 12px 0;
2331
2644
  background: var(--qc-overlay-separator);
2332
2645
  }
2333
2646
 
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
2647
  [data-qc-theme] .qc-drawing-section-title {
2337
2648
  margin: 12px 0 4px;
2338
2649
  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;
2650
+ font-size: 12px;
2651
+ line-height: 14px;
2345
2652
  }
2346
2653
 
2347
- [data-qc-theme] .qc-drawing-custom {
2654
+ /* The opacity: a 10px track filling the row beside the percent field. The track fades from nothing
2655
+ * into the color over the checked ground, inside a 1px edge of the color on a 4px corner; the 12px
2656
+ * knob travels it less its own width, a pixel proud of it above and below, and glides to a value
2657
+ * the keyboard or a press gives it but follows a drag at once. The keyboard's ring stands 4px
2658
+ * around the track. */
2659
+ [data-qc-theme] .qc-drawing-opacity-row {
2348
2660
  display: flex;
2349
- flex-direction: column;
2350
- gap: 12px;
2351
- width: 224px;
2661
+ align-items: center;
2352
2662
  }
2353
2663
 
2354
- [data-qc-theme] .qc-drawing-custom-row {
2355
- display: flex;
2356
- gap: 8px;
2357
- align-items: center;
2358
- height: 26px;
2664
+ [data-qc-theme] .qc-drawing-opacity {
2665
+ position: relative;
2666
+ flex: 1 0 auto;
2667
+ height: 10px;
2668
+ background: repeating-conic-gradient(from 270deg, var(--qcd-check) 0% 25%, transparent 0% 50%) 1px 50% / 8px 8px, var(--qcd-ground);
2669
+ border-radius: 5px;
2670
+ outline: none;
2671
+ touch-action: none;
2359
2672
  }
2360
2673
 
2361
- [data-qc-theme] .qc-drawing-custom-swatch {
2362
- flex: 0 0 auto;
2363
- width: 26px;
2364
- height: 26px;
2365
- background: var(--qcd-swatch);
2674
+ [data-qc-theme] .qc-drawing-opacity-fade {
2675
+ position: absolute;
2676
+ inset: 0;
2677
+ background: linear-gradient(to right, transparent, var(--qcd-swatch));
2678
+ border: 1px solid var(--qcd-swatch);
2366
2679
  border-radius: 4px;
2367
2680
  }
2368
2681
 
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);
2682
+ [data-qc-theme][dir='rtl'] .qc-drawing-opacity,
2683
+ [data-qc-theme] [dir='rtl'] .qc-drawing-opacity {
2684
+ background-position: right 1px top 50%;
2383
2685
  }
2384
2686
 
2385
- [data-qc-theme] .qc-drawing-hex-wrap > .qc-muted {
2386
- flex: 0 0 7px;
2687
+ [data-qc-theme][dir='rtl'] .qc-drawing-opacity-fade,
2688
+ [data-qc-theme] [dir='rtl'] .qc-drawing-opacity-fade {
2689
+ background: linear-gradient(to left, transparent, var(--qcd-swatch));
2387
2690
  }
2388
2691
 
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);
2692
+ [data-qc-theme] .qc-drawing-opacity-travel {
2693
+ position: absolute;
2694
+ top: 0;
2695
+ inset-inline-start: 0;
2696
+ width: calc(100% - 12px);
2392
2697
  }
2393
2698
 
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);
2699
+ [data-qc-theme] .qc-drawing-opacity-knob {
2700
+ position: absolute;
2701
+ top: 0;
2702
+ width: 12px;
2703
+ height: 12px;
2704
+ margin-top: -1px;
2705
+ background: var(--qcd-black);
2706
+ border: 2px solid var(--qcd-white);
2707
+ border-radius: 50%;
2708
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
2709
+ pointer-events: none;
2710
+ }
2711
+
2712
+ [data-qc-theme] .qc-drawing-opacity:not([data-qc-dragging='true']) .qc-drawing-opacity-knob {
2713
+ transition: inset-inline-start var(--qc-motion-durationGlide) var(--qc-motion-easingStandard);
2714
+ }
2715
+
2716
+ [data-qc-theme] .qc-drawing-opacity:focus-visible::after {
2717
+ position: absolute;
2718
+ inset: -4px;
2719
+ border: 2px solid var(--qc-state-focusRing);
2720
+ border-radius: 6px;
2721
+ content: '';
2722
+ pointer-events: none;
2400
2723
  }
2401
2724
 
2725
+ /* The popover's two fields are 26px boxes on a 4px corner, 1px edged in the field's own edge, which
2726
+ * turns the focus color while the field has the keyboard and the invalid color for a value the
2727
+ * field refuses. The percent field is 47px, 8px after the track, its figure set to the end and the
2728
+ * unit standing in the room it keeps there. */
2729
+ [data-qc-theme] .qc-drawing-opacity-field {
2730
+ position: relative;
2731
+ display: flex;
2732
+ flex: 0 0 auto;
2733
+ align-items: center;
2734
+ }
2735
+
2736
+ [data-qc-theme] .qc-drawing-opacity-readout,
2402
2737
  [data-qc-theme] .qc-drawing-hex {
2403
- width: 100%;
2404
- min-width: 0;
2405
- padding: 0;
2738
+ box-sizing: border-box;
2739
+ height: 26px;
2740
+ margin: 0;
2741
+ margin-inline-start: 8px;
2406
2742
  color: var(--qc-text-primary);
2407
2743
  font: inherit;
2408
- font-variant-numeric: tabular-nums;
2744
+ font-size: 14px;
2745
+ line-height: 24px;
2409
2746
  background: none;
2410
- border: 0;
2747
+ border: 1px solid var(--qc-control-fieldEdge);
2748
+ border-radius: 4px;
2411
2749
  outline: none;
2412
2750
  }
2413
2751
 
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. */
2752
+ [data-qc-theme] .qc-drawing-opacity-readout {
2753
+ width: 47px;
2754
+ padding: 0;
2755
+ padding-inline-start: 5px;
2756
+ padding-inline-end: 14px;
2757
+ text-align: end;
2758
+ }
2759
+
2760
+ [data-qc-theme] .qc-drawing-opacity-readout:focus,
2761
+ [data-qc-theme] .qc-drawing-hex:focus {
2762
+ border-color: var(--qc-state-focusRing);
2763
+ }
2764
+
2765
+ [data-qc-theme] .qc-drawing-hex[aria-invalid='true'] {
2766
+ border-color: var(--qc-control-fieldInvalid);
2767
+ }
2768
+
2769
+ [data-qc-theme] .qc-drawing-opacity-unit,
2770
+ [data-qc-theme] .qc-drawing-hex-mark {
2771
+ position: absolute;
2772
+ top: 5px;
2773
+ color: var(--qc-text-primary);
2774
+ line-height: 16px;
2775
+ pointer-events: none;
2776
+ }
2777
+
2778
+ [data-qc-theme] .qc-drawing-opacity-unit {
2779
+ inset-inline-start: 40px;
2780
+ }
2781
+
2782
+ /* The custom editor, standing alone in the popover in the palette's place: a 26px row of the held
2783
+ * color's 26px well, its hex and Add, 12px over a 184px area of saturation and brightness that
2784
+ * stands 7px before a 17px hue strip. The hash stands in the room the hex field keeps before its
2785
+ * digits; Add is the primary action at the row's end, a 28px button on an 8px corner. */
2786
+ [data-qc-theme] .qc-drawing-custom-row {
2787
+ display: flex;
2788
+ align-items: flex-start;
2789
+ height: 26px;
2790
+ margin-bottom: 12px;
2791
+ }
2792
+
2793
+ [data-qc-theme] .qc-drawing-custom-swatch {
2794
+ flex: 0 0 26px;
2795
+ width: 26px;
2796
+ height: 26px;
2797
+ background: var(--qcd-swatch);
2798
+ border-radius: 4px;
2799
+ }
2800
+
2801
+ [data-qc-theme] .qc-drawing-hex-wrap {
2802
+ position: relative;
2803
+ display: flex;
2804
+ flex: 0 0 auto;
2805
+ align-items: center;
2806
+ height: 26px;
2807
+ }
2808
+
2809
+ [data-qc-theme] .qc-drawing-hex-mark {
2810
+ inset-inline-start: 0;
2811
+ width: 21px;
2812
+ text-align: end;
2813
+ }
2814
+
2815
+ [data-qc-theme] .qc-drawing-hex {
2816
+ width: 68px;
2817
+ padding: 0;
2818
+ padding-inline-start: 12px;
2819
+ padding-inline-end: 5px;
2820
+ }
2821
+
2416
2822
  [data-qc-theme] .qc-drawing-add {
2417
2823
  display: inline-flex;
2418
2824
  flex: 0 0 auto;
@@ -2421,6 +2827,9 @@
2421
2827
  height: 28px;
2422
2828
  margin-inline-start: auto;
2423
2829
  padding: 0 7px;
2830
+ font-size: 14px;
2831
+ line-height: 18px;
2832
+ border-radius: 8px;
2424
2833
  }
2425
2834
 
2426
2835
  [data-qc-theme] .qc-drawing-custom-tracks {
@@ -2428,28 +2837,43 @@
2428
2837
  gap: 7px;
2429
2838
  }
2430
2839
 
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. */
2840
+ /* The area is the hue under a fade to white across it and a fade to black down it, on a 2px corner
2841
+ * that clips its knob: a 14px ring standing a pixel past the point it marks. The strip runs the hue
2842
+ * wheel from top to bottom; its knob is a 9px bar 2px proud of either side, travelling the strip
2843
+ * less 3px at either end. Both knobs glide to a value the keyboard gives them and follow a drag at
2844
+ * once. */
2434
2845
  [data-qc-theme] .qc-drawing-sv {
2435
2846
  position: relative;
2436
2847
  flex: 1 1 auto;
2437
2848
  height: 184px;
2438
- background: linear-gradient(to top, var(--qcd-black), transparent), linear-gradient(to right, var(--qcd-white), var(--qcd-hue));
2849
+ overflow: hidden;
2850
+ background: linear-gradient(to top, var(--qcd-black), transparent), linear-gradient(to right, var(--qcd-white), transparent), var(--qcd-hue);
2851
+ border-radius: 2px;
2439
2852
  cursor: crosshair;
2853
+ touch-action: none;
2854
+ }
2855
+
2856
+ [data-qc-theme][dir='rtl'] .qc-drawing-sv,
2857
+ [data-qc-theme] [dir='rtl'] .qc-drawing-sv {
2858
+ background: linear-gradient(to top, var(--qcd-black), transparent), linear-gradient(to left, var(--qcd-white), transparent), var(--qcd-hue);
2440
2859
  }
2441
2860
 
2442
2861
  [data-qc-theme] .qc-drawing-sv-dot {
2443
2862
  position: absolute;
2444
- width: 12px;
2445
- height: 12px;
2863
+ width: 14px;
2864
+ height: 14px;
2865
+ margin-top: -6px;
2866
+ margin-inline-start: -6px;
2446
2867
  border: 2px solid var(--qcd-white);
2447
2868
  border-radius: 50%;
2448
- box-shadow: var(--qc-overlay-shadow);
2449
- transform: translate(-50%, -50%);
2869
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
2450
2870
  pointer-events: none;
2451
2871
  }
2452
2872
 
2873
+ [data-qc-theme] .qc-drawing-sv:not([data-qc-dragging='true']) .qc-drawing-sv-dot {
2874
+ transition: inset-inline-start var(--qc-motion-durationFast) var(--qc-motion-easingStandard), top var(--qc-motion-durationFast) var(--qc-motion-easingStandard);
2875
+ }
2876
+
2453
2877
  [data-qc-theme] .qc-drawing-hue {
2454
2878
  position: relative;
2455
2879
  flex: 0 0 17px;
@@ -2466,38 +2890,70 @@
2466
2890
  );
2467
2891
  border-radius: 2px;
2468
2892
  cursor: pointer;
2893
+ touch-action: none;
2894
+ }
2895
+
2896
+ [data-qc-theme] .qc-drawing-hue-travel {
2897
+ position: absolute;
2898
+ inset: 3px 0;
2469
2899
  }
2470
2900
 
2471
2901
  [data-qc-theme] .qc-drawing-hue-dot {
2472
2902
  position: absolute;
2473
2903
  inset-inline: -2px;
2474
- height: 6px;
2904
+ height: 9px;
2905
+ margin-top: -4px;
2475
2906
  border: 2px solid var(--qcd-white);
2476
2907
  border-radius: 2px;
2477
- box-shadow: var(--qc-overlay-shadow);
2478
- transform: translateY(-50%);
2908
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
2479
2909
  pointer-events: none;
2480
2910
  }
2481
2911
 
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. */
2912
+ [data-qc-theme] .qc-drawing-hue:not([data-qc-dragging='true']) .qc-drawing-hue-dot {
2913
+ transition: top var(--qc-motion-durationFast) var(--qc-motion-easingStandard);
2914
+ }
2915
+
2916
+ /* The well a color button holds its color in: 24px on a 3px corner, the color at its opacity over
2917
+ * the checked ground the opacity track fades over, in 6px squares. */
2918
+ [data-qc-theme] .qc-drawing-well {
2919
+ display: block;
2920
+ width: 24px;
2921
+ height: 24px;
2922
+ overflow: hidden;
2923
+ background: repeating-conic-gradient(from 270deg, var(--qcd-check) 0% 25%, transparent 0% 50%) 0 0 / 12px 12px, var(--qcd-ground);
2924
+ border-radius: 3px;
2925
+ }
2926
+
2927
+ [data-qc-theme] .qc-drawing-well-fill {
2928
+ display: block;
2929
+ width: 100%;
2930
+ height: 100%;
2931
+ background: var(--qcd-swatch);
2932
+ }
2933
+
2934
+ /* Black and white are the poles of the value axis the area fades between, and the two the knobs
2935
+ * are drawn from. They are color arithmetic, not theme roles: every mode has them. */
2484
2936
  [data-qc-theme] .qc-drawing-custom,
2485
- [data-qc-theme] .qc-drawing-opacity-row {
2937
+ [data-qc-theme] .qc-drawing-opacity-row,
2938
+ [data-qc-theme] .qc-drawing-well,
2939
+ [data-qc-theme] .qc-drawing-dual {
2486
2940
  --qcd-angle-0: 0deg;
2487
2941
  --qcd-black: hsl(var(--qcd-angle-0) 0% 0%);
2488
2942
  --qcd-white: hsl(var(--qcd-angle-0) 0% 100%);
2489
2943
  }
2490
2944
 
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 {
2945
+ /* What "see-through" is drawn as under a fade: a slate check at two fifths, the same in every mode,
2946
+ * on the mode's own pole. It is the checker every image editor uses for nothing-here, so a low
2947
+ * opacity reads as the color thinning out rather than as the track running out of paint. */
2948
+ [data-qc-theme] .qc-drawing-opacity-row,
2949
+ [data-qc-theme] .qc-drawing-well {
2495
2950
  --qcd-check-hue: 224deg;
2496
2951
  --qcd-check: hsl(var(--qcd-check-hue) 15% 19% / 0.4);
2497
2952
  --qcd-ground: var(--qcd-black);
2498
2953
  }
2499
2954
 
2500
- [data-qc-theme='light'] .qc-drawing-opacity-row {
2955
+ [data-qc-theme='light'] .qc-drawing-opacity-row,
2956
+ [data-qc-theme='light'] .qc-drawing-well {
2501
2957
  --qcd-ground: var(--qcd-white);
2502
2958
  }
2503
2959
 
@@ -2516,239 +2972,248 @@
2516
2972
  --qcd-hue-300: hsl(var(--qcd-angle-300) 100% 50%);
2517
2973
  }
2518
2974
 
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;
2975
+ /* The Thickness and Line style rows, 12px in: a muted title, then a row of joined 32px segments,
2976
+ * each a radio wearing its mark in the on fill. The one chosen takes that fill, its mark cut from
2977
+ * it in the inverse ink; a segment under the pointer washes in the hover fill, and the keyboard's
2978
+ * ring stands 4px around the segment it is on. A thickness mark is a line across its segment as
2979
+ * heavy as the width it stands for; a line style's is drawn on a 30 by 24 cell, a 30px line, four
2980
+ * 5px dashes or six 2px dots 3px apart. */
2981
+ [data-qc-theme] .qc-drawing-stroke-section {
2982
+ padding: 0 12px;
2524
2983
  }
2525
2984
 
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);
2985
+ [data-qc-theme] .qc-drawing-stroke-section > .qc-drawing-section-title {
2986
+ margin: 6px 0 4px;
2542
2987
  }
2543
2988
 
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;
2989
+ [data-qc-theme] .qc-drawing-stroke-section--style {
2990
+ margin-top: 12px;
2555
2991
  }
2556
2992
 
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;
2993
+ [data-qc-theme] .qc-drawing-stroke-section--style > .qc-drawing-section-title {
2994
+ margin-top: 0;
2565
2995
  }
2566
2996
 
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;
2997
+ [data-qc-theme] .qc-drawing-segments {
2998
+ display: flex;
2572
2999
  }
2573
3000
 
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;
3001
+ [data-qc-theme] .qc-drawing-segment {
3002
+ position: relative;
3003
+ display: inline-flex;
3004
+ flex: 1 1 0;
3005
+ align-items: center;
3006
+ justify-content: center;
3007
+ box-sizing: border-box;
3008
+ height: 32px;
3009
+ margin: 0;
3010
+ padding: 0 12px;
3011
+ color: var(--qc-control-on);
2581
3012
  background: none;
2582
3013
  border: 1px solid var(--qc-control-fieldEdge);
2583
- border-radius: 6px;
3014
+ border-radius: 0;
2584
3015
  outline: none;
2585
- transition: border-color var(--qc-motion-durationFast) var(--qc-motion-easingLinear), box-shadow var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
3016
+ cursor: pointer;
2586
3017
  }
2587
3018
 
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;
3019
+ [data-qc-theme] .qc-drawing-segment--wide {
3020
+ padding: 0 22px;
2597
3021
  }
2598
3022
 
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;
3023
+ [data-qc-theme] .qc-drawing-segment + .qc-drawing-segment {
3024
+ margin-inline-start: -1px;
2608
3025
  }
2609
3026
 
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;
3027
+ [data-qc-theme] .qc-drawing-segment:first-child {
3028
+ border-start-start-radius: 3px;
3029
+ border-end-start-radius: 3px;
2617
3030
  }
2618
3031
 
2619
- [data-qc-theme] .qc-drawing-well-fill {
2620
- display: block;
2621
- width: 100%;
2622
- height: 100%;
2623
- background: var(--qcd-swatch);
3032
+ [data-qc-theme] .qc-drawing-segment:last-child {
3033
+ border-start-end-radius: 3px;
3034
+ border-end-end-radius: 3px;
2624
3035
  }
2625
3036
 
2626
- [data-qc-theme] .qc-drawing-swatch-panel {
2627
- display: flex;
2628
- flex-direction: column;
2629
- gap: 6px;
2630
- padding-bottom: 8px;
3037
+ [data-qc-theme] .qc-drawing-segment:hover {
3038
+ background: var(--qc-state-hover);
2631
3039
  }
2632
3040
 
2633
- [data-qc-theme] .qc-drawing-swatch-panel > .qc-muted {
2634
- padding: 0 12px;
3041
+ [data-qc-theme] .qc-drawing-segment[aria-checked='true'] {
3042
+ z-index: 1;
3043
+ color: var(--qc-control-onInk);
3044
+ background: var(--qc-control-on);
3045
+ border-color: var(--qc-control-on);
2635
3046
  }
2636
3047
 
2637
- [data-qc-theme] .qc-drawing-option-row {
2638
- display: flex;
2639
- gap: 4px;
2640
- padding: 0 12px;
3048
+ [data-qc-theme] .qc-drawing-segment:focus-visible::after {
3049
+ position: absolute;
3050
+ inset: -4px;
3051
+ z-index: 1;
3052
+ border: 2px solid var(--qc-state-focusRing);
3053
+ border-radius: 4px;
3054
+ content: '';
3055
+ pointer-events: none;
2641
3056
  }
2642
3057
 
2643
- [data-qc-theme] .qc-drawing-option {
2644
- display: flex;
3058
+ [data-qc-theme] .qc-drawing-thickness-mark {
3059
+ display: block;
2645
3060
  flex: 1 1 auto;
2646
- align-items: center;
2647
- justify-content: center;
2648
- height: 30px;
2649
- padding: 0;
3061
+ background: currentColor;
2650
3062
  }
2651
3063
 
2652
- /* The stroke preview: segments at the thickness, in currentColor or the drawing's own color. */
2653
- [data-qc-theme] .qc-drawing-stroke {
3064
+ [data-qc-theme] .qc-drawing-style-mark {
2654
3065
  display: flex;
2655
- flex: 0 0 auto;
3066
+ flex: 0 0 30px;
2656
3067
  gap: 3px;
2657
3068
  align-items: center;
3069
+ justify-content: center;
2658
3070
  width: 30px;
3071
+ height: 24px;
3072
+ overflow: hidden;
2659
3073
  }
2660
3074
 
2661
- [data-qc-theme] .qc-drawing-stroke[data-dotted='tight'] {
2662
- gap: 2px;
3075
+ [data-qc-theme] .qc-drawing-style-seg {
3076
+ flex: 0 0 auto;
3077
+ width: 5px;
3078
+ height: 1px;
3079
+ background: currentColor;
2663
3080
  }
2664
3081
 
2665
- [data-qc-theme] .qc-drawing-stroke-seg {
2666
- flex: 0 0 auto;
2667
- background: var(--qcd-swatch, currentColor);
3082
+ [data-qc-theme] .qc-drawing-style-mark[data-style='solid'] > .qc-drawing-style-seg {
3083
+ width: 30px;
2668
3084
  }
2669
3085
 
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;
3086
+ [data-qc-theme] .qc-drawing-style-mark[data-style='dotted'] > .qc-drawing-style-seg {
3087
+ width: 2px;
3088
+ height: 2px;
2676
3089
  }
2677
3090
 
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);
3091
+ /* The line-end list is as wide as its rows. A row it does not hold dims its ink under the pointer. */
3092
+ [data-qc-theme] .qc-drawing-menu.qc-drawing-line-ends {
3093
+ width: max-content;
3094
+ min-width: 0;
2682
3095
  }
2683
3096
 
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;
3097
+ /* The keyboard rings a list's row inside the row's own edge, where the list's rounded corners cannot
3098
+ * cut it. A row of a list of choices or of switches rings its edge on a 6px corner, with 2px of the
3099
+ * list's ground inside the ring, so the ring stands clear of a chosen row's fill; a row of a list of
3100
+ * marks (a line end, a thickness, a line style) rings 2px inside its edge on a 9px corner. */
3101
+ [data-qc-theme] .qc-drawing-list .qc-drawing-list-row {
3102
+ position: relative;
3103
+ outline: none;
2689
3104
  }
2690
3105
 
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;
3106
+ [data-qc-theme] .qc-drawing-select-list:not(.qc-drawing-mark-list) .qc-drawing-list-row:focus-visible::before,
3107
+ [data-qc-theme] .qc-drawing-select-list:not(.qc-drawing-mark-list) .qc-drawing-list-row:focus-visible::after {
3108
+ position: absolute;
3109
+ z-index: 1;
3110
+ box-sizing: border-box;
3111
+ border-style: solid;
3112
+ border-width: 2px;
3113
+ content: '';
3114
+ pointer-events: none;
2703
3115
  }
2704
3116
 
2705
- [data-qc-theme] .qc-drawing-tab:hover {
2706
- color: var(--qc-text-secondary);
3117
+ [data-qc-theme] .qc-drawing-select-list:not(.qc-drawing-mark-list) .qc-drawing-list-row:focus-visible::after {
3118
+ inset: 0;
3119
+ border-color: var(--qc-state-focusRing);
3120
+ border-radius: 6px;
2707
3121
  }
2708
3122
 
2709
- [data-qc-theme] .qc-drawing-tab[aria-selected='true'] {
2710
- color: var(--qc-text-primary);
3123
+ [data-qc-theme] .qc-drawing-select-list:not(.qc-drawing-mark-list) .qc-drawing-list-row:focus-visible::before {
3124
+ inset: 2px;
3125
+ border-color: var(--qc-overlay-surface);
3126
+ border-radius: 4px;
2711
3127
  }
2712
3128
 
2713
- [data-qc-theme] .qc-drawing-tab-rail {
2714
- height: 2px;
2715
- background: var(--qc-chrome-border);
3129
+ [data-qc-theme] .qc-drawing-line-ends .qc-drawing-list-row[aria-selected='true'] {
3130
+ color: var(--qc-control-onInk);
2716
3131
  }
2717
3132
 
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;
3133
+ [data-qc-theme] .qc-drawing-line-ends .qc-drawing-list-row:not([aria-selected='true']):hover {
3134
+ color: var(--qc-state-hoverInk);
2721
3135
  }
2722
3136
 
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;
3137
+ [data-qc-theme] .qc-drawing-line-ends .qc-drawing-list-row:focus-visible::after,
3138
+ [data-qc-theme] .qc-drawing-mark-list .qc-drawing-list-row:focus-visible::after {
3139
+ position: absolute;
3140
+ inset: 2px;
3141
+ z-index: 1;
3142
+ border: 2px solid var(--qc-state-focusRing);
3143
+ border-radius: 9px;
3144
+ content: '';
3145
+ pointer-events: none;
2726
3146
  }
2727
3147
 
2728
- [data-qc-theme] .qc-drawing-tab[aria-selected='true'] .qc-drawing-tab-rail {
2729
- background: var(--qc-text-primary);
3148
+ /* The swatch button: a well holding the color, and for a stroke, the stroke at its thickness. */
3149
+ [data-qc-theme] .qc-drawing-swatch-button {
3150
+ display: flex;
3151
+ gap: 6px;
3152
+ align-items: center;
3153
+ justify-content: center;
3154
+ height: 34px;
3155
+ padding: 0 8px;
3156
+ cursor: pointer;
2730
3157
  }
2731
3158
 
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;
3159
+ /* On a settings page the swatch button is the 34px field with a 6px corner around its 24px well, 4px
3160
+ * in; with a stroke the preview stands 8px after the well and 3px clear of the end, 75px in all. */
3161
+ [data-qc-theme] .qc-drawing-page .qc-drawing-swatch-button {
3162
+ flex: 0 0 auto;
3163
+ gap: 8px;
3164
+ min-width: 34px;
3165
+ padding: 0 4px;
3166
+ border-radius: 6px;
3167
+ }
3168
+
3169
+ [data-qc-theme] .qc-drawing-page .qc-drawing-swatch-button > .qc-drawing-stroke {
3170
+ margin-inline-end: 3px;
3171
+ }
3172
+
3173
+ /* The stroke preview: segments at the thickness, in currentColor or the drawing's own color. */
3174
+ [data-qc-theme] .qc-drawing-stroke {
3175
+ display: flex;
3176
+ flex: 0 0 auto;
3177
+ gap: 3px;
2737
3178
  align-items: center;
2738
- min-height: 50px;
3179
+ width: 30px;
3180
+ }
3181
+
3182
+ [data-qc-theme] .qc-drawing-stroke[data-dotted='tight'] {
3183
+ gap: 2px;
3184
+ }
3185
+
3186
+ [data-qc-theme] .qc-drawing-stroke-seg {
3187
+ flex: 0 0 auto;
3188
+ background: var(--qcd-swatch, currentColor);
2739
3189
  }
2740
3190
 
2741
- [data-qc-theme] .qc-drawing-visibility-controls {
3191
+ /* A line-end picker is a 34px field whose face is the end's own 28px mark. */
3192
+ [data-qc-theme] .qc-drawing-line-end {
2742
3193
  display: flex;
2743
- gap: 8px;
3194
+ flex: 0 0 34px;
2744
3195
  align-items: center;
3196
+ justify-content: center;
3197
+ width: 34px;
3198
+ padding: 0;
3199
+ cursor: pointer;
2745
3200
  }
2746
3201
 
3202
+ /* A line end's glyph is drawn for the left end; the right end's picker wears it mirrored. */
3203
+ [data-qc-theme] .qc-drawing-line-end[data-qc-end='right'] > svg,
3204
+ [data-qc-theme] .qc-drawing-menu[data-qc-end='right'] .qc-menu-row > svg {
3205
+ transform: scaleX(-1);
3206
+ }
3207
+
3208
+ /* One visibility bucket: the checkbox and the name as the label, then from, the two-thumb range and
3209
+ * to. The range is a 10px track 100px wide, 9px after from and 8px before to, its span between the
3210
+ * two thumbs filled. */
2747
3211
  [data-qc-theme] .qc-drawing-dual {
2748
3212
  position: relative;
2749
- flex: 1 1 auto;
2750
- min-width: 96px;
2751
- height: 16px;
3213
+ flex: 0 0 100px;
3214
+ width: 100px;
3215
+ height: 12px;
3216
+ margin-inline-start: 1px;
2752
3217
  }
2753
3218
 
2754
3219
  [data-qc-theme] .qc-drawing-dual-track {
@@ -2756,18 +3221,22 @@
2756
3221
  inset-inline: 0;
2757
3222
  top: 50%;
2758
3223
  height: 10px;
2759
- background: var(--qc-chrome-border);
3224
+ background: var(--qc-state-pressed);
2760
3225
  border-radius: 5px;
2761
3226
  transform: translateY(-50%);
2762
3227
  }
2763
3228
 
3229
+ /* The span the thumbs travel: the track less half a thumb at either end. */
3230
+ [data-qc-theme] .qc-drawing-dual-span {
3231
+ position: absolute;
3232
+ inset: 0 6px;
3233
+ }
3234
+
2764
3235
  [data-qc-theme] .qc-drawing-dual-fill {
2765
3236
  position: absolute;
2766
- top: 50%;
2767
- height: 10px;
2768
- background: var(--qc-text-secondary);
2769
- border-radius: 5px;
2770
- transform: translateY(-50%);
3237
+ top: 0;
3238
+ bottom: 0;
3239
+ background: var(--qc-text-primary);
2771
3240
  }
2772
3241
 
2773
3242
  [data-qc-theme] .qc-drawing-dual-input {
@@ -2781,22 +3250,29 @@
2781
3250
  pointer-events: none;
2782
3251
  }
2783
3252
 
3253
+ /* The two-thumb range's thumbs are the opacity knob: a dark disc with a 2px light rim, drawn from
3254
+ * the two poles so they read at both ends of the track in either mode. */
2784
3255
  [data-qc-theme] .qc-drawing-dual-input::-webkit-slider-thumb {
2785
3256
  width: 12px;
2786
3257
  height: 12px;
2787
- background: var(--qc-text-primary);
2788
- border: 2px solid var(--qc-chrome-surface);
3258
+ background: var(--qcd-black);
3259
+ border: 2px solid var(--qcd-white);
2789
3260
  border-radius: 50%;
3261
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
3262
+ cursor: pointer;
2790
3263
  appearance: none;
2791
3264
  pointer-events: auto;
2792
3265
  }
2793
3266
 
2794
3267
  [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);
3268
+ box-sizing: border-box;
3269
+ width: 12px;
3270
+ height: 12px;
3271
+ background: var(--qcd-black);
3272
+ border: 2px solid var(--qcd-white);
2799
3273
  border-radius: 50%;
3274
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
3275
+ cursor: pointer;
2800
3276
  pointer-events: auto;
2801
3277
  }
2802
3278
 
@@ -2812,45 +3288,27 @@
2812
3288
  align-items: center;
2813
3289
  }
2814
3290
 
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 {
2836
- display: flex;
2837
- gap: 4px;
2838
- }
2839
-
2840
- [data-qc-theme] .qc-drawing-table-actions {
3291
+ /* The weight and slant toggles: a 34px field with a 6px corner around the 28px mark, filled while
3292
+ * held, the mark cut from the fill in the inverse ink. */
3293
+ [data-qc-theme] .qc-drawing-font-toggle {
2841
3294
  display: flex;
2842
- flex-wrap: wrap;
2843
- gap: 6px;
2844
- padding-top: 4px;
3295
+ flex: 0 0 34px;
3296
+ align-items: center;
3297
+ justify-content: center;
3298
+ width: 34px;
3299
+ padding: 0;
3300
+ border-radius: 6px;
3301
+ cursor: pointer;
2845
3302
  }
2846
3303
 
2847
- [data-qc-theme] .qc-drawing-table-actions .qc-button {
2848
- padding: 4px 8px;
2849
- font-size: var(--qc-text-fontSizeSmall);
3304
+ [data-qc-theme] .qc-drawing-font-toggle[aria-pressed='true'] {
3305
+ color: var(--qc-text-inverse);
3306
+ background: var(--qc-control-onPressed);
3307
+ border-color: var(--qc-control-onPressed);
2850
3308
  }
2851
3309
 
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. */
3310
+ /* Forced colors: a swatch IS its color, so it keeps it, with a system border to stand on. The color
3311
+ * popover's compact fields edge their focus in the system highlight. */
2854
3312
  @media (forced-colors: active) {
2855
3313
  [data-qc-theme] .qc-drawing-swatch,
2856
3314
  [data-qc-theme] .qc-drawing-color-strip {
@@ -2858,11 +3316,10 @@
2858
3316
  border: 1px solid ButtonText;
2859
3317
  }
2860
3318
 
2861
- [data-qc-theme] .qc-drawing-hex-wrap:focus-within,
3319
+ [data-qc-theme] .qc-drawing-hex:focus,
2862
3320
  [data-qc-theme] .qc-drawing-opacity-readout:focus {
2863
3321
  forced-color-adjust: none;
2864
3322
  border-color: Highlight;
2865
- box-shadow: inset 0 0 0 1px Highlight;
2866
3323
  }
2867
3324
  }
2868
3325
 
@@ -3061,42 +3518,82 @@
3061
3518
  max-height: calc(100% - 16px);
3062
3519
  }
3063
3520
 
3064
- [data-qc-theme] .qc-drawing-dialog-header {
3521
+ /* The header: the name at 20 on 28 in a 68px band 20px in, then what the dialog adds after it (the
3522
+ * settings dialog's pencil), and the close 34px at the far end, 3px past the padding so its mark
3523
+ * lines up with the page's edge. The header is the handle the dialog is carried by. */
3524
+ [data-qc-theme] .qc-drawing-dialog .qc-drawing-dialog-header {
3065
3525
  display: flex;
3526
+ flex: 0 0 auto;
3066
3527
  align-items: center;
3067
- justify-content: space-between;
3068
- gap: 8px;
3069
- padding: 12px 14px 8px;
3070
- cursor: move;
3528
+ justify-content: flex-start;
3529
+ gap: 0;
3530
+ height: 68px;
3531
+ padding: 0 20px;
3532
+ cursor: grab;
3071
3533
  user-select: none;
3072
3534
  }
3073
3535
 
3074
3536
  [data-qc-theme] .qc-drawing-dialog-title {
3537
+ min-width: 0;
3075
3538
  overflow: hidden;
3539
+ font-size: 20px;
3540
+ font-weight: 600;
3541
+ line-height: 28px;
3076
3542
  text-overflow: ellipsis;
3077
3543
  white-space: nowrap;
3078
3544
  }
3079
3545
 
3546
+ [data-qc-theme] .qc-drawing-dialog .qc-dialog-close {
3547
+ flex: 0 0 34px;
3548
+ margin-inline-start: auto;
3549
+ margin-inline-end: -3px;
3550
+ border-radius: 8px;
3551
+ }
3552
+
3553
+ /* The body 20px in from the sides; a drop box stands 8px under the header. */
3080
3554
  [data-qc-theme] .qc-drawing-dialog-body {
3081
3555
  display: flex;
3082
3556
  flex: 1 1 auto;
3083
3557
  flex-direction: column;
3084
- gap: 4px;
3085
3558
  min-height: 0;
3086
- padding: 0 14px 8px;
3559
+ padding: 0 20px;
3087
3560
  overflow-y: auto;
3088
3561
  }
3089
3562
 
3090
- [data-qc-theme] .qc-drawing-dialog-footer {
3563
+ [data-qc-theme] .qc-drawing-dialog-body > .qc-drawing-drop {
3564
+ margin-top: 8px;
3565
+ }
3566
+
3567
+ /* The image picker's transparency: its name at the start and its 180px track at the end of a 46px
3568
+ * line, each 10px down the line's 26px middle, 24px above the footer. */
3569
+ [data-qc-theme] .qc-drawing-picker-opacity {
3091
3570
  display: flex;
3092
3571
  align-items: center;
3093
- gap: 8px;
3094
- padding: 10px 14px;
3095
- border-top: 1px solid var(--qc-overlay-separator);
3572
+ justify-content: space-between;
3573
+ margin-bottom: 24px;
3574
+ padding: 10px 0;
3575
+ }
3576
+
3577
+ [data-qc-theme] .qc-drawing-picker-opacity > * {
3578
+ margin-top: 10px;
3096
3579
  }
3097
3580
 
3098
- [data-qc-theme] .qc-drawing-dialog-footer .qc-button {
3099
- padding: 5px 12px;
3581
+ [data-qc-theme] .qc-drawing-picker-opacity > .qc-drawing-band-opacity {
3582
+ flex: 0 0 180px;
3583
+ width: 180px;
3584
+ margin-top: 10px;
3585
+ }
3586
+
3587
+ /* A drawing dialog's footer: what it leads with at the start (the settings dialog's Template list
3588
+ * button), then Cancel and the primary action 12px apart at the end, all 34px with an 8px corner,
3589
+ * over a 1px rule. Cancel is outlined in the outline role and takes the emphasis fill under the
3590
+ * pointer; the primary action wears the fill. */
3591
+ [data-qc-theme] .qc-drawing-dialog-footer {
3592
+ display: flex;
3593
+ align-items: center;
3594
+ justify-content: flex-end;
3595
+ padding: 16px 20px;
3596
+ border-top: 1px solid var(--qc-overlay-separator);
3100
3597
  }
3101
3598
 
3102
3599
  [data-qc-theme] .qc-drawing-footer-gap {
@@ -3112,31 +3609,225 @@
3112
3609
  margin: 6px 0 4px;
3113
3610
  }
3114
3611
 
3612
+ /* The settings dialog: a card at least 380px wide that grows to the widest page it shows, its
3613
+ * header, the page strip, the page and the footer stacked. */
3115
3614
  [data-qc-theme] .qc-drawing-settings-dialog {
3116
- width: min(380px, calc(100% - 16px));
3117
- max-height: min(560px, calc(100% - 16px));
3615
+ width: max-content;
3616
+ min-width: min(380px, calc(100% - 16px));
3617
+ max-width: calc(100% - 16px);
3118
3618
  }
3119
3619
 
3120
- [data-qc-theme] .qc-drawing-page {
3620
+ /* The settings dialog's pencil stands 5px after the name in a 34px cell. */
3621
+ [data-qc-theme] .qc-drawing-rename {
3121
3622
  display: flex;
3122
- flex-direction: column;
3123
- gap: 2px;
3124
- padding-top: 2px;
3623
+ flex: 0 0 34px;
3624
+ align-items: center;
3625
+ justify-content: center;
3626
+ width: 34px;
3627
+ height: 34px;
3628
+ margin-inline-start: 5px;
3629
+ padding: 0;
3630
+ color: var(--qc-text-primary);
3631
+ background: none;
3632
+ border: 0;
3633
+ border-radius: 2px;
3634
+ cursor: pointer;
3635
+ }
3636
+
3637
+ [data-qc-theme] .qc-drawing-rename:hover {
3638
+ background: var(--qc-state-hover);
3639
+ }
3640
+
3641
+ /* Renaming, the header is the name's field alone, as wide as the header and in the name's own type. */
3642
+ [data-qc-theme] .qc-drawing-dialog-header[data-qc-renaming='true'] > :not(.qc-drawing-rename-field) {
3643
+ display: none;
3644
+ }
3645
+
3646
+ [data-qc-theme] .qc-drawing-rename-field {
3647
+ flex: 1 1 auto;
3648
+ min-width: 0;
3649
+ font-size: 20px;
3650
+ font-weight: 600;
3651
+ line-height: 28px;
3652
+ }
3653
+
3654
+ /* The page strip: the tabs at 16 on 24, 12px apart, over a 4px track as wide as the page; the bar
3655
+ * standing on the track under the shown page glides to the next one. A tab under the pointer that
3656
+ * is not shown dims to the muted ink. */
3657
+ [data-qc-theme] .qc-drawing-tabs-slot {
3658
+ position: relative;
3659
+ flex: 0 0 auto;
3660
+ padding: 0 20px;
3661
+ }
3662
+
3663
+ [data-qc-theme] .qc-drawing-tabs-track {
3664
+ position: absolute;
3665
+ inset-inline: 20px;
3666
+ bottom: 0;
3667
+ height: 4px;
3668
+ background: var(--qc-overlay-separator);
3669
+ border-radius: 2px;
3670
+ }
3671
+
3672
+ [data-qc-theme] .qc-drawing-tabs {
3673
+ position: relative;
3674
+ display: inline-flex;
3675
+ vertical-align: top;
3676
+ white-space: nowrap;
3677
+ }
3678
+
3679
+ [data-qc-theme] .qc-drawing-tab {
3680
+ position: relative;
3681
+ margin: 0 12px;
3682
+ padding: 0 0 8px;
3683
+ color: var(--qc-text-primary);
3684
+ font: inherit;
3685
+ font-size: 16px;
3686
+ font-weight: 600;
3687
+ line-height: 24px;
3688
+ background: none;
3689
+ border: 0;
3690
+ border-radius: 4px;
3691
+ outline: none;
3692
+ cursor: pointer;
3693
+ }
3694
+
3695
+ [data-qc-theme] .qc-drawing-tab:first-of-type {
3696
+ margin-inline-start: 0;
3697
+ }
3698
+
3699
+ [data-qc-theme] .qc-drawing-tab:last-of-type {
3700
+ margin-inline-end: 0;
3701
+ }
3702
+
3703
+ [data-qc-theme] .qc-drawing-tab:not([aria-selected='true']):hover {
3704
+ color: var(--qc-text-muted);
3705
+ }
3706
+
3707
+ /* The keyboard's ring stands 10px out to either side of the label and over the bar's height. */
3708
+ [data-qc-theme] .qc-drawing-tab:focus-visible::after {
3709
+ position: absolute;
3710
+ inset: -2px -10px 0;
3711
+ border: 2px solid var(--qc-state-focusRing);
3712
+ border-radius: 8px;
3713
+ content: '';
3714
+ pointer-events: none;
3715
+ }
3716
+
3717
+ [data-qc-theme] .qc-drawing-tab-bar {
3718
+ position: absolute;
3719
+ bottom: 0;
3720
+ left: 0;
3721
+ height: 4px;
3722
+ background: var(--qc-control-on);
3723
+ border-radius: 2px;
3724
+ pointer-events: none;
3725
+ }
3726
+
3727
+ [data-qc-theme] .qc-drawing-tabs[data-qc-placed='true'] > .qc-drawing-tab-bar {
3728
+ transition: transform var(--qc-motion-durationGlide) var(--qc-motion-easingInOut), width var(--qc-motion-durationGlide) var(--qc-motion-easingInOut);
3729
+ }
3730
+
3731
+ /* The body scrolls the page alone, and keeps room for a short one. */
3732
+ [data-qc-theme] .qc-drawing-settings-dialog .qc-drawing-dialog-body {
3733
+ display: block;
3734
+ min-height: 145px;
3735
+ padding: 0;
3736
+ }
3737
+
3738
+ /* The page: a two-column grid inside 16px by 20px, the labels' column as wide as the widest label
3739
+ * and its 20px gap, the controls' column the rest. Everything on the page that is not a labelled
3740
+ * row stands across both columns. */
3741
+ [data-qc-theme] .qc-drawing-page {
3742
+ display: grid;
3743
+ grid-template-columns: auto minmax(0, 1fr);
3744
+ padding: 16px 20px;
3745
+ }
3746
+
3747
+ [data-qc-theme] .qc-drawing-page > :not(.qc-drawing-row) {
3748
+ grid-column: 1 / -1;
3749
+ }
3750
+
3751
+ [data-qc-theme] .qc-drawing-page > .qc-button {
3752
+ justify-self: start;
3125
3753
  }
3126
3754
 
3127
3755
  [data-qc-theme] .qc-drawing-template-button {
3128
- display: flex;
3756
+ display: inline-flex;
3757
+ flex: 0 0 auto;
3129
3758
  align-items: center;
3130
- gap: 4px;
3759
+ width: 100px;
3760
+ padding: 0 2px 0 8px;
3761
+ cursor: pointer;
3131
3762
  }
3132
3763
 
3133
- [data-qc-theme] .qc-drawing-caret {
3134
- display: flex;
3135
- transition: transform var(--qc-motion-durationFast) var(--qc-motion-easingLinear);
3764
+ /* While its menu is open the Template button keeps the focus ring, and its chevron points up. */
3765
+ [data-qc-theme] .qc-drawing-template-button[aria-expanded='true'] {
3766
+ border-color: var(--qc-state-focusRing);
3767
+ box-shadow: inset 0 0 0 1px var(--qc-state-focusRing);
3136
3768
  }
3137
3769
 
3138
- [data-qc-theme] .qc-drawing-template-button[aria-expanded='true'] .qc-drawing-caret {
3139
- transform: rotate(180deg);
3770
+ [data-qc-theme] .qc-drawing-footer-button {
3771
+ display: inline-flex;
3772
+ align-items: center;
3773
+ justify-content: center;
3774
+ height: 34px;
3775
+ padding: 0 11px;
3776
+ font-size: 16px;
3777
+ line-height: 24px;
3778
+ border-radius: 8px;
3779
+ }
3780
+
3781
+ [data-qc-theme] .qc-drawing-footer-button + .qc-drawing-footer-button {
3782
+ margin-inline-start: 12px;
3783
+ }
3784
+
3785
+ [data-qc-theme] .qc-drawing-cancel {
3786
+ color: var(--qc-control-outline);
3787
+ border-color: var(--qc-control-outline);
3788
+ }
3789
+
3790
+ [data-qc-theme] .qc-drawing-cancel:hover:not([disabled]) {
3791
+ color: var(--qc-text-inverse);
3792
+ background: var(--qc-control-on);
3793
+ border-color: var(--qc-control-on);
3794
+ }
3795
+
3796
+ [data-qc-theme] .qc-drawing-cancel:active:not([disabled]) {
3797
+ color: var(--qc-text-inverse);
3798
+ background: var(--qc-control-onPressed);
3799
+ border-color: var(--qc-control-onPressed);
3800
+ }
3801
+
3802
+ /* The lists the dialog opens stand on a 10px corner; the Template menu is as wide as its words. */
3803
+ [data-qc-theme] .qc-drawing-popover--list {
3804
+ border-radius: 10px;
3805
+ }
3806
+
3807
+ [data-qc-theme] .qc-drawing-menu.qc-drawing-template-menu {
3808
+ width: max-content;
3809
+ min-width: 0;
3810
+ }
3811
+
3812
+ /* A saved template's row: its name, then the 26px slot at the end where its remove control
3813
+ * stands. The whole row lifts under the pointer. */
3814
+ [data-qc-theme] .qc-drawing-template-menu .qc-drawing-flyout-row {
3815
+ height: 32px;
3816
+ border-radius: 6px;
3817
+ }
3818
+
3819
+ [data-qc-theme] .qc-drawing-template-menu .qc-drawing-flyout-row > .qc-drawing-list-row {
3820
+ flex: 1 1 auto;
3821
+ width: auto;
3822
+ min-width: 0;
3823
+ }
3824
+
3825
+ [data-qc-theme] .qc-drawing-template-menu .qc-drawing-star {
3826
+ position: static;
3827
+ flex: 0 0 22px;
3828
+ width: 22px;
3829
+ height: 22px;
3830
+ margin-inline-end: 4px;
3140
3831
  }
3141
3832
 
3142
3833
  [data-qc-theme] .qc-drawing-note {
@@ -3144,15 +3835,216 @@
3144
3835
  font-size: var(--qc-text-fontSizeSmall);
3145
3836
  }
3146
3837
 
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;
3838
+ /* The plane's live region: read by assistive technology, never seen. Clipped rather than hidden,
3839
+ * because a hidden node is not announced. */
3840
+ [data-qc-theme] .qc-drawing-status {
3841
+ position: absolute;
3842
+ width: 1px;
3843
+ height: 1px;
3844
+ overflow: hidden;
3845
+ clip-path: inset(50%);
3846
+ white-space: nowrap;
3847
+ }
3848
+
3849
+ /* A leveled tool's level grid: two levels to a 34px line, 8px between lines and 8px above the
3850
+ * first, each level its 18px switch, its 100px value and its 34px well 8px apart, the second level
3851
+ * 48px after the first's well, the line 412px across whatever its levels hold. A level switched off
3852
+ * keeps its well, and its stroke where it shows one, on the read-only fill, dimmed. */
3853
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-level-row {
3854
+ min-width: 412px;
3855
+ min-height: 34px;
3856
+ margin-bottom: 8px;
3857
+ padding: 0;
3858
+ }
3859
+
3860
+ [data-qc-theme] .qc-drawing-page > :not(.qc-drawing-level-row) + .qc-drawing-level-row {
3861
+ margin-top: 8px;
3862
+ }
3863
+
3864
+ [data-qc-theme] .qc-drawing-level-row > :nth-child(4) {
3865
+ margin-inline-start: 40px;
3866
+ }
3867
+
3868
+ /* A gann grid: two lines to a 34px line, 8px between lines and 8px above the first, each line its
3869
+ * switch with its place or its ratio, 78px across so every well stands in line, then its well 8px
3870
+ * after; the second line 48px after the first's well, the line 412px across. A fan's rays stand one
3871
+ * to a 50px line. */
3872
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-ratio-row {
3873
+ min-width: 412px;
3874
+ min-height: 34px;
3875
+ margin-bottom: 8px;
3876
+ padding: 0;
3877
+ }
3878
+
3879
+ [data-qc-theme] .qc-drawing-page > :not(.qc-drawing-ratio-row) + .qc-drawing-ratio-row {
3880
+ margin-top: 8px;
3881
+ }
3882
+
3883
+ [data-qc-theme] .qc-drawing-ratio-row > :nth-child(3) {
3884
+ margin-inline-start: 40px;
3885
+ }
3886
+
3887
+ [data-qc-theme] .qc-drawing-ratio-switch {
3888
+ flex: 0 0 78px;
3889
+ min-width: 0;
3890
+ min-height: 34px;
3891
+ }
3892
+
3893
+ /* An image's page: its caption across the page over the box that chooses the picture, 8px above it. */
3894
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-row--caption > .qc-drawing-row-label {
3895
+ grid-column: 1 / -1;
3896
+ min-height: 0;
3897
+ padding: 0;
3898
+ }
3899
+
3900
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-row--caption > .qc-drawing-row-controls {
3901
+ display: none;
3902
+ }
3903
+
3904
+ [data-qc-theme] .qc-drawing-page > .qc-drawing-drop {
3905
+ margin-top: 8px;
3906
+ }
3907
+
3908
+ /* A signpost's emoji: a field-sized button wearing the glyph's artwork, or the glyph itself where
3909
+ * the artwork has not come. */
3910
+ [data-qc-theme] .qc-drawing-emoji-button {
3911
+ display: inline-flex;
3912
+ align-items: center;
3913
+ justify-content: center;
3914
+ width: 36px;
3915
+ height: 34px;
3916
+ padding: 0;
3917
+ border-radius: 6px;
3918
+ }
3919
+
3920
+ [data-qc-theme] .qc-drawing-emoji-button .qc-drawing-glyph-art {
3921
+ width: 24px;
3922
+ height: 24px;
3923
+ }
3924
+
3925
+ /* An emoji well beside a switch that is off stands dimmed on the field's fill, as a color well does. */
3926
+ [data-qc-theme] .qc-drawing-emoji-button[data-qc-dim='true'] {
3927
+ background: var(--qc-control-fieldFill);
3928
+ }
3929
+
3930
+ [data-qc-theme] .qc-drawing-emoji-button[data-qc-dim='true'] > * {
3931
+ opacity: 0.5;
3932
+ }
3933
+
3934
+ [data-qc-theme] .qc-drawing-emoji-face {
3935
+ font-size: 20px;
3936
+ line-height: 1;
3937
+ }
3938
+
3939
+ [data-qc-theme] .qc-drawing-swatch-button[data-qc-dim='true'] {
3940
+ background: var(--qc-control-fieldFill);
3941
+ }
3942
+
3943
+ [data-qc-theme] .qc-drawing-swatch-button[data-qc-dim='true'] > .qc-drawing-well,
3944
+ [data-qc-theme] .qc-drawing-swatch-button[data-qc-dim='true'] > .qc-drawing-stroke {
3945
+ opacity: 0.5;
3946
+ }
3947
+
3948
+ /* The one color while the levels differ: the well split corner to corner between the color it
3949
+ * offers and a second hue, so it reads as several colors rather than one. */
3950
+ [data-qc-theme] .qc-drawing-swatch-button[data-qc-mixed='true'] .qc-drawing-well-fill {
3951
+ background: linear-gradient(to top right, var(--qcd-swatch) 50%, var(--qcd-paired) 50%);
3952
+ }
3953
+
3954
+ /* A list button whose face is a mark: 76px around a 50px bar of the chosen thickness, or 34px
3955
+ * around the chosen style's 28px mark. A thickness list stands 12px wider than its button, each
3956
+ * choice its bar alone; a style list is as wide as its words. */
3957
+ [data-qc-theme] .qc-drawing-select--mark {
3958
+ justify-content: center;
3959
+ padding: 0;
3960
+ }
3961
+
3962
+ [data-qc-theme] .qc-drawing-select--mark[data-mark='thickness'] {
3963
+ width: 76px;
3964
+ }
3965
+
3966
+ [data-qc-theme] .qc-drawing-select--mark[data-mark='style'] {
3967
+ width: 34px;
3968
+ }
3969
+
3970
+ [data-qc-theme] .qc-drawing-thickness-bar {
3971
+ display: block;
3972
+ flex: 0 0 auto;
3973
+ width: 50px;
3974
+ background: currentColor;
3975
+ }
3976
+
3977
+ [data-qc-theme] .qc-drawing-mark-list[data-mark='thickness'] {
3978
+ width: 88px;
3979
+ }
3980
+
3981
+ [data-qc-theme] .qc-drawing-mark-list[data-mark='style'] {
3982
+ width: max-content;
3983
+ }
3984
+
3985
+ [data-qc-theme] .qc-drawing-list-row--bar {
3986
+ justify-content: center;
3987
+ }
3988
+
3989
+ /* The chosen thickness or style is cut from the emphasis fill in the ink of a mark. */
3990
+ [data-qc-theme] .qc-drawing-mark-list .qc-drawing-list-row[aria-selected='true'] {
3991
+ color: var(--qc-control-onInk);
3992
+ }
3993
+
3994
+ /* The bands' opacity: a 148px track 10px tall on a 5px corner that fades from nothing into the
3995
+ * drawings' line color over the checked ground the color popover's track stands on, inside a 1px
3996
+ * edge of that color; its 12px knob is the popover's, a dark disc with a light rim, a pixel proud
3997
+ * of the track above and below. */
3998
+ [data-qc-theme] .qc-drawing-band-opacity {
3999
+ --qcd-angle-0: 0deg;
4000
+ --qcd-black: hsl(var(--qcd-angle-0) 0% 0%);
4001
+ --qcd-white: hsl(var(--qcd-angle-0) 0% 100%);
4002
+ --qcd-check-hue: 224deg;
4003
+ --qcd-check: hsl(var(--qcd-check-hue) 15% 19% / 0.4);
4004
+ --qcd-ground: var(--qcd-black);
4005
+ flex: 0 0 148px;
4006
+ width: 148px;
4007
+ height: 10px;
4008
+ margin: 0;
4009
+ background:
4010
+ linear-gradient(to right, transparent, var(--qc-drawing-line)),
4011
+ repeating-conic-gradient(from 270deg, var(--qcd-check) 0% 25%, transparent 0% 50%) 1px 50% / 8px 8px,
4012
+ var(--qcd-ground);
4013
+ border: 1px solid var(--qc-drawing-line);
4014
+ border-radius: 5px;
4015
+ outline: none;
4016
+ cursor: pointer;
4017
+ appearance: none;
4018
+ }
4019
+
4020
+ [data-qc-theme='light'] .qc-drawing-band-opacity {
4021
+ --qcd-ground: var(--qcd-white);
4022
+ }
4023
+
4024
+ [data-qc-theme] .qc-drawing-band-opacity:focus-visible {
4025
+ box-shadow: 0 0 0 2px var(--qc-state-focusRing);
4026
+ }
4027
+
4028
+ [data-qc-theme] .qc-drawing-band-opacity::-webkit-slider-thumb {
4029
+ width: 12px;
4030
+ height: 12px;
4031
+ background: var(--qcd-black);
4032
+ border: 2px solid var(--qcd-white);
4033
+ border-radius: 50%;
4034
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
4035
+ cursor: pointer;
4036
+ appearance: none;
4037
+ }
4038
+
4039
+ [data-qc-theme] .qc-drawing-band-opacity::-moz-range-thumb {
4040
+ box-sizing: border-box;
4041
+ width: 12px;
4042
+ height: 12px;
4043
+ background: var(--qcd-black);
4044
+ border: 2px solid var(--qcd-white);
4045
+ border-radius: 50%;
4046
+ box-shadow: 0 1px 2px hsl(var(--qcd-angle-0) 0% 0% / 0.5);
4047
+ cursor: pointer;
3156
4048
  }
3157
4049
 
3158
4050
  /* The drawing toolbar: the column down the chart's inline-start edge, its split cells, its flyouts
@@ -4491,8 +5383,9 @@
4491
5383
 
4492
5384
  /* A chosen row inverts, the emphasis fill behind the inverse ink, and carries nothing else: no
4493
5385
  * 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']) {
5386
+ * IS a switch or a checkbox is not a choice among rows: its track or its box says it is on, and the
5387
+ * row stays as it is. */
5388
+ [data-qc-theme] .qc-menu-row[aria-checked='true']:not([role='switch']):not([role='menuitemcheckbox']) {
4496
5389
  color: var(--qc-text-inverse);
4497
5390
  background: var(--qc-control-on);
4498
5391
  }
@@ -4586,6 +5479,12 @@
4586
5479
  pointer-events: auto;
4587
5480
  }
4588
5481
 
5482
+ /* A dialog that edits what it stands over leaves it undimmed: the backdrop still takes the press
5483
+ * that closes the dialog, and paints nothing. */
5484
+ [data-qc-theme] .qc-dialog-scrim[data-qc-veil='none'] {
5485
+ background: transparent;
5486
+ }
5487
+
4589
5488
  [data-qc-theme] .qc-dialog {
4590
5489
  display: flex;
4591
5490
  flex-direction: column;
@@ -4928,6 +5827,12 @@
4928
5827
  color: var(--qc-text-inverse);
4929
5828
  }
4930
5829
 
5830
+ /* The current starting point wears its mark and its words in the ink cut from the emphasis fill. */
5831
+ [data-qc-theme] .qc-replay-start-menu .qc-menu-row[aria-checked='true'],
5832
+ [data-qc-theme] .qc-replay-start-menu .qc-menu-row[aria-checked='true']:hover {
5833
+ color: var(--qc-control-onInk);
5834
+ }
5835
+
4931
5836
  [data-qc-theme] .qc-replay-menu .qc-menu-row--marked {
4932
5837
  height: 34px;
4933
5838
  padding-inline-start: 8px;
@@ -5043,73 +5948,404 @@
5043
5948
  }
5044
5949
 
5045
5950
  /* The date picker. */
5951
+
5952
+ /* The card stands 302px wide over the undimmed chart: a 68px header, the fields, the calendar and the
5953
+ * chip, and a 67px footer. The header carries the title at 20 on 28, which is the handle the card is
5954
+ * carried by, and the close in a 34px cell whose mark stands 3px past the header's padding. */
5955
+ [data-qc-theme] .qc-date-header {
5956
+ display: flex;
5957
+ flex: 0 0 auto;
5958
+ align-items: center;
5959
+ height: 68px;
5960
+ padding: 0 20px;
5961
+ }
5962
+
5963
+ [data-qc-theme] .qc-date-title {
5964
+ flex: 1 1 auto;
5965
+ min-width: 0;
5966
+ padding: 17px 0;
5967
+ cursor: grab;
5968
+ user-select: none;
5969
+ }
5970
+
5971
+ [data-qc-theme] .qc-date-title-text {
5972
+ display: block;
5973
+ overflow: hidden;
5974
+ color: var(--qc-text-primary);
5975
+ font-size: 20px;
5976
+ font-weight: 600;
5977
+ line-height: 28px;
5978
+ text-overflow: ellipsis;
5979
+ white-space: nowrap;
5980
+ }
5981
+
5982
+ [data-qc-theme] .qc-date-dialog .qc-dialog-close {
5983
+ flex: 0 0 34px;
5984
+ margin-inline-end: -3px;
5985
+ border-radius: 8px;
5986
+ }
5987
+
5988
+ /* The body is a dialog body that sits 17px under the header, edge to edge, and scrolls only in a
5989
+ * viewport shorter than the card. */
5990
+ [data-qc-theme] .qc-date-content {
5991
+ gap: 0;
5992
+ padding: 17px 0 0;
5993
+ }
5994
+
5995
+ /* The fields stand side by side, 150px and 100px with 12px between, 16px over the calendar. Each is
5996
+ * the chart's 34px field box with a 28px mark 3px in from its end, in the caret's ink and the field's
5997
+ * own ink under the pointer: the date's page of days, and the clock that opens the time list. */
5046
5998
  [data-qc-theme] .qc-date-fields {
5999
+ display: grid;
6000
+ grid-template-columns: 150px 100px;
6001
+ grid-template-rows: 34px;
6002
+ gap: 12px;
6003
+ margin-bottom: 16px;
6004
+ padding: 0 20px;
6005
+ }
6006
+
6007
+ [data-qc-theme] .qc-date-box {
6008
+ position: relative;
5047
6009
  display: flex;
5048
- gap: 8px;
5049
6010
  }
5050
6011
 
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 {
6012
+ [data-qc-theme] .qc-date-box > .qc-field {
5053
6013
  flex: 1 1 auto;
6014
+ width: 100%;
5054
6015
  min-width: 0;
6016
+ padding-inline-end: 33px;
5055
6017
  font-variant-numeric: tabular-nums;
5056
6018
  }
5057
6019
 
5058
- [data-qc-theme] .qc-date-time {
5059
- flex: 0 0 74px;
5060
- font-variant-numeric: tabular-nums;
6020
+ [data-qc-theme] .qc-date-box-mark {
6021
+ position: absolute;
6022
+ inset-block-start: 3px;
6023
+ inset-inline-end: 3px;
6024
+ display: flex;
6025
+ align-items: center;
6026
+ justify-content: center;
6027
+ width: 28px;
6028
+ height: 28px;
6029
+ padding: 0;
6030
+ color: var(--qc-chrome-caret);
6031
+ background: none;
6032
+ border: 0;
6033
+ pointer-events: none;
6034
+ }
6035
+
6036
+ [data-qc-theme] .qc-date-box:hover > .qc-date-box-mark {
6037
+ color: var(--qc-text-primary);
6038
+ }
6039
+
6040
+ [data-qc-theme] .qc-date-clock {
6041
+ cursor: pointer;
6042
+ pointer-events: auto;
6043
+ }
6044
+
6045
+ /* The calendar: 286px on 8px margins, its 262px of content inside 12px, a 34px row of the arrows
6046
+ * around the heading, a 22px band 12px either side, and a 226px view, the whole at least 332px tall.
6047
+ * It reads left to right in every language, as a calendar's columns do. */
6048
+ [data-qc-theme] .qc-date-calendar {
6049
+ display: flex;
6050
+ flex-direction: column;
6051
+ min-height: 332px;
6052
+ margin: 0 8px;
6053
+ padding: 1px 12px 15px;
6054
+ direction: ltr;
6055
+ user-select: none;
5061
6056
  }
5062
6057
 
5063
6058
  [data-qc-theme] .qc-date-nav {
5064
6059
  display: flex;
6060
+ flex: 0 0 34px;
5065
6061
  align-items: center;
5066
6062
  justify-content: space-between;
5067
- padding: 6px 0 2px;
6063
+ padding: 0 3px;
5068
6064
  }
5069
6065
 
5070
- [data-qc-theme] .qc-date-nav .qc-button {
5071
- display: inline-flex;
6066
+ /* Every press in the calendar is a 34px cell on an 8px corner with its words at 16 on 24. Under the
6067
+ * pointer it takes the hover fill and its words and mark brighten to the quiet ink; a day or a cell
6068
+ * that cannot be chosen keeps the disabled ink and takes no fill. */
6069
+ [data-qc-theme] .qc-date-step,
6070
+ [data-qc-theme] .qc-date-heading,
6071
+ [data-qc-theme] .qc-date-day,
6072
+ [data-qc-theme] .qc-date-cell {
6073
+ display: flex;
5072
6074
  align-items: center;
5073
6075
  justify-content: center;
5074
- width: 28px;
5075
- height: 28px;
5076
- padding: 0;
6076
+ height: 34px;
6077
+ font-size: 16px;
6078
+ line-height: 24px;
6079
+ white-space: nowrap;
5077
6080
  border-color: transparent;
6081
+ border-radius: 8px;
6082
+ }
6083
+
6084
+ [data-qc-theme] .qc-date-step {
6085
+ flex: 0 0 34px;
6086
+ width: 34px;
6087
+ padding: 0;
6088
+ }
6089
+
6090
+ [data-qc-theme] .qc-date-heading {
6091
+ padding: 0 11px;
5078
6092
  }
5079
6093
 
5080
- [data-qc-theme] .qc-date-grid {
6094
+ [data-qc-theme] .qc-date-dialog .qc-dialog-close:hover,
6095
+ [data-qc-theme] .qc-date-step:hover:not([disabled]),
6096
+ [data-qc-theme] .qc-date-heading:hover,
6097
+ [data-qc-theme] .qc-date-day:hover:not([disabled]):not([aria-selected='true']),
6098
+ [data-qc-theme] .qc-date-cell:hover:not([disabled]):not([aria-selected='true']) {
6099
+ color: var(--qc-control-neutralInk);
6100
+ }
6101
+
6102
+ /* The band over the grid, on the quiet fill: the weekdays spread across it in the muted ink, or the
6103
+ * word for the months or the years. */
6104
+ [data-qc-theme] .qc-date-band {
6105
+ display: flex;
6106
+ flex: 0 0 22px;
6107
+ align-items: center;
6108
+ justify-content: space-around;
6109
+ margin: 12px 0;
6110
+ padding: 2px 0;
6111
+ color: var(--qc-text-muted);
6112
+ font-size: 14px;
6113
+ line-height: 18px;
6114
+ background: var(--qc-control-neutral);
6115
+ border-radius: 6px;
6116
+ }
6117
+
6118
+ [data-qc-theme] .qc-date-view {
6119
+ flex: 0 0 226px;
6120
+ }
6121
+
6122
+ /* The days: weeks of seven 34px cells 4px apart, the first week against the end and the last against
6123
+ * the start, so each column is one weekday and no day of another month stands in a gap. The chosen day
6124
+ * is on the emphasis fill in the ink cut from it, and today wears a 2px bar under its number in the
6125
+ * number's own ink. */
6126
+ [data-qc-theme] .qc-date-weeks {
5081
6127
  display: flex;
5082
6128
  flex-direction: column;
5083
- gap: 2px;
6129
+ gap: 4px;
5084
6130
  }
5085
6131
 
5086
- [data-qc-theme] .qc-date-row {
6132
+ [data-qc-theme] .qc-date-week {
6133
+ display: flex;
6134
+ justify-content: space-between;
6135
+ }
6136
+
6137
+ [data-qc-theme] .qc-date-week:first-child {
6138
+ justify-content: flex-end;
6139
+ }
6140
+
6141
+ [data-qc-theme] .qc-date-week:last-child {
6142
+ justify-content: flex-start;
6143
+ }
6144
+
6145
+ [data-qc-theme] .qc-date-week:first-child > .qc-date-day + .qc-date-day,
6146
+ [data-qc-theme] .qc-date-week:last-child > .qc-date-day + .qc-date-day {
6147
+ margin-inline-start: 4px;
6148
+ }
6149
+
6150
+ [data-qc-theme] .qc-date-day {
6151
+ position: relative;
6152
+ flex: 0 0 34px;
6153
+ width: 34px;
6154
+ padding: 0;
6155
+ }
6156
+
6157
+ [data-qc-theme] .qc-date-day[aria-selected='true']:not([disabled]) {
6158
+ color: var(--qc-control-onInk);
6159
+ background: var(--qc-control-on);
6160
+ border-color: var(--qc-control-on);
6161
+ }
6162
+
6163
+ [data-qc-theme] .qc-date-day[aria-current='date']::before {
6164
+ position: absolute;
6165
+ inset-inline: 6px;
6166
+ top: 100%;
6167
+ height: 2px;
6168
+ margin-top: -6px;
6169
+ background: currentColor;
6170
+ border-radius: 1px;
6171
+ content: '';
6172
+ }
6173
+
6174
+ /* The months, three to a row 30px apart, and the years, four to a row 14px apart, 3px between
6175
+ * columns. The chosen month or year stands on the quiet fill, a step up under the pointer. */
6176
+ [data-qc-theme] .qc-date-months,
6177
+ [data-qc-theme] .qc-date-years {
5087
6178
  display: grid;
5088
- grid-template-columns: repeat(7, 1fr);
5089
- gap: 2px;
6179
+ grid-auto-rows: 34px;
6180
+ column-gap: 3px;
6181
+ }
6182
+
6183
+ [data-qc-theme] .qc-date-months {
6184
+ grid-template-columns: repeat(3, minmax(0, 1fr));
6185
+ row-gap: 30px;
6186
+ }
6187
+
6188
+ [data-qc-theme] .qc-date-years {
6189
+ grid-template-columns: repeat(4, minmax(0, 1fr));
6190
+ row-gap: 14px;
6191
+ }
6192
+
6193
+ [data-qc-theme] .qc-date-row {
6194
+ display: contents;
6195
+ }
6196
+
6197
+ [data-qc-theme] .qc-date-cell {
6198
+ min-width: 0;
6199
+ padding: 0 11px;
6200
+ }
6201
+
6202
+ [data-qc-theme] .qc-date-years .qc-date-cell {
6203
+ padding: 0 4px;
6204
+ }
6205
+
6206
+ [data-qc-theme] .qc-date-cell[aria-selected='true']:not([disabled]) {
6207
+ color: var(--qc-control-neutralInk);
6208
+ background: var(--qc-control-neutral);
6209
+ border-color: var(--qc-control-neutral);
6210
+ }
6211
+
6212
+ [data-qc-theme] .qc-date-cell[aria-selected='true']:not([disabled]):hover {
6213
+ background: var(--qc-control-neutralHover);
6214
+ border-color: var(--qc-control-neutralHover);
5090
6215
  }
5091
6216
 
5092
- [data-qc-theme] .qc-date-head {
6217
+ /* The chip under the calendar: 40px tall, its words at 16 on 24 and 15px in, centred and 10px over
6218
+ * the footer, on the quiet fill a step up under the pointer and another while pressed. */
6219
+ [data-qc-theme] .qc-date-first-row {
5093
6220
  display: flex;
6221
+ justify-content: center;
6222
+ }
6223
+
6224
+ [data-qc-theme] .qc-date-first {
6225
+ display: inline-flex;
5094
6226
  align-items: center;
5095
6227
  justify-content: center;
5096
- height: 24px;
6228
+ height: 40px;
6229
+ margin-bottom: 10px;
6230
+ padding: 0 15px;
6231
+ color: var(--qc-control-neutralInk);
6232
+ font-size: 16px;
6233
+ line-height: 24px;
6234
+ white-space: nowrap;
6235
+ background: var(--qc-control-neutral);
6236
+ border-color: var(--qc-control-neutral);
6237
+ border-radius: 8px;
5097
6238
  }
5098
6239
 
5099
- [data-qc-theme] .qc-date-day {
6240
+ [data-qc-theme] .qc-date-first:hover {
6241
+ background: var(--qc-control-neutralHover);
6242
+ border-color: var(--qc-control-neutralHover);
6243
+ }
6244
+
6245
+ [data-qc-theme] .qc-date-first:active {
6246
+ background: var(--qc-control-neutralPressed);
6247
+ border-color: var(--qc-control-neutralPressed);
6248
+ }
6249
+
6250
+ /* The footer under a 1px rule: Cancel and Select at its end, 34px tall and 12px apart, their words at
6251
+ * 16 on 24 and 11px in. Cancel is outlined in the outline role and takes the emphasis fill under the
6252
+ * pointer; Select wears the fill. */
6253
+ [data-qc-theme] .qc-date-footer {
5100
6254
  display: flex;
6255
+ flex: 0 0 auto;
6256
+ justify-content: flex-end;
6257
+ padding: 16px 20px;
6258
+ border-top: 1px solid var(--qc-overlay-separator);
6259
+ }
6260
+
6261
+ [data-qc-theme] .qc-date-footer .qc-button {
6262
+ display: inline-flex;
5101
6263
  align-items: center;
5102
6264
  justify-content: center;
5103
- height: 28px;
5104
- padding: 0;
6265
+ height: 34px;
6266
+ padding: 0 11px;
6267
+ font-size: 16px;
6268
+ line-height: 24px;
6269
+ white-space: nowrap;
6270
+ border-radius: 8px;
6271
+ }
6272
+
6273
+ [data-qc-theme] .qc-date-footer .qc-button + .qc-button {
6274
+ margin-inline-start: 12px;
6275
+ }
6276
+
6277
+ [data-qc-theme] .qc-date-cancel {
6278
+ color: var(--qc-control-outline);
6279
+ border-color: var(--qc-control-outline);
6280
+ }
6281
+
6282
+ [data-qc-theme] .qc-date-cancel:hover:not([disabled]) {
6283
+ color: var(--qc-text-inverse);
6284
+ background: var(--qc-control-on);
6285
+ border-color: var(--qc-control-on);
6286
+ }
6287
+
6288
+ [data-qc-theme] .qc-date-cancel:active:not([disabled]) {
6289
+ color: var(--qc-text-inverse);
6290
+ background: var(--qc-control-onPressed);
6291
+ border-color: var(--qc-control-onPressed);
6292
+ }
6293
+
6294
+ /* The time list stands on the dialog's backdrop directly under the time field and as wide as it, at
6295
+ * most 231px tall over a scroll of its own: the day in quarter hours on 32px rows with their words
6296
+ * 12px in. The time the field holds is on the emphasis fill; the row under the pointer, or the one
6297
+ * the keyboard walked to, takes the hover fill and dims its words. */
6298
+ [data-qc-theme] .qc-date-times {
6299
+ position: absolute;
6300
+ z-index: 1;
6301
+ display: flex;
6302
+ flex-direction: column;
6303
+ max-height: 231px;
6304
+ overflow: hidden;
6305
+ }
6306
+
6307
+ [data-qc-theme] .qc-date-times-body {
6308
+ position: relative;
6309
+ }
6310
+
6311
+ [data-qc-theme] .qc-date-times-rows {
6312
+ padding: 6px 0;
6313
+ }
6314
+
6315
+ [data-qc-theme] .qc-date-time-option {
6316
+ display: flex;
6317
+ align-items: center;
6318
+ height: 32px;
6319
+ padding-block: 0;
6320
+ padding-inline: 12px 10px;
6321
+ color: var(--qc-text-primary);
6322
+ font-size: 14px;
6323
+ line-height: 16px;
5105
6324
  font-variant-numeric: tabular-nums;
5106
- border-color: transparent;
6325
+ cursor: default;
6326
+ user-select: none;
5107
6327
  }
5108
6328
 
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);
6329
+ [data-qc-theme] .qc-date-time-option:hover,
6330
+ [data-qc-theme] .qc-date-time-option[data-qc-active='true'] {
6331
+ color: var(--qc-state-hoverInk);
6332
+ background: var(--qc-state-hover);
6333
+ }
6334
+
6335
+ [data-qc-theme] .qc-date-time-option[aria-selected='true'] {
6336
+ color: var(--qc-control-onInk);
6337
+ background: var(--qc-control-on);
6338
+ }
6339
+
6340
+ /* Forced colors: what is chosen in the calendar and the time list stands in the system highlight. */
6341
+ @media (forced-colors: active) {
6342
+ [data-qc-theme] .qc-date-day[aria-selected='true'],
6343
+ [data-qc-theme] .qc-date-cell[aria-selected='true'],
6344
+ [data-qc-theme] .qc-date-time-option[aria-selected='true'] {
6345
+ forced-color-adjust: none;
6346
+ color: HighlightText;
6347
+ background: Highlight;
6348
+ }
5113
6349
  }
5114
6350
 
5115
6351
  /* The thin bar beside a list the viewer scrolls to find something: the search results, the