rgrid-python 4.5.3__py3-none-any.whl

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.
grid_py/_colour.py ADDED
@@ -0,0 +1,815 @@
1
+ """Shared colour parsing for grid_py — complete R named-colour table.
2
+
3
+ Provides a single source of truth for converting R-style colour
4
+ specifications (hex strings, named colours, ``"transparent"``,
5
+ ``"NA"``, ``greyN``) into normalised ``(r, g, b, a)`` tuples with
6
+ components in [0, 1].
7
+
8
+ The 657 named colours are taken verbatim from R's ``grDevices``
9
+ package (``src/library/grDevices/src/colors.c``).
10
+
11
+ Two public helpers are exposed:
12
+
13
+ * :func:`parse_r_colour` — returns ``(r, g, b, a)`` floats in [0, 1].
14
+ * :func:`colour_to_css` — returns a CSS-compatible colour string.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import re as _re
20
+ from typing import Any, Dict, Optional, Tuple
21
+
22
+ __all__ = ["parse_r_colour", "colour_to_css"]
23
+
24
+ # ---------------------------------------------------------------------------
25
+ # Complete R named-colour table (657 entries)
26
+ # Source: R 4.x grDevices/src/colors.c ColorDataBase[]
27
+ # Keys are lowercase. Values are "#RRGGBB" hex strings.
28
+ # ---------------------------------------------------------------------------
29
+
30
+ _R_COLOURS: Dict[str, str] = {
31
+ "white": "#FFFFFF",
32
+ "aliceblue": "#F0F8FF",
33
+ "antiquewhite": "#FAEBD7",
34
+ "antiquewhite1": "#FFEFDB",
35
+ "antiquewhite2": "#EEDFCC",
36
+ "antiquewhite3": "#CDC0B0",
37
+ "antiquewhite4": "#8B8378",
38
+ "aquamarine": "#7FFFD4",
39
+ "aquamarine1": "#7FFFD4",
40
+ "aquamarine2": "#76EEC6",
41
+ "aquamarine3": "#66CDAA",
42
+ "aquamarine4": "#458B74",
43
+ "azure": "#F0FFFF",
44
+ "azure1": "#F0FFFF",
45
+ "azure2": "#E0EEEE",
46
+ "azure3": "#C1CDCD",
47
+ "azure4": "#838B8B",
48
+ "beige": "#F5F5DC",
49
+ "bisque": "#FFE4C4",
50
+ "bisque1": "#FFE4C4",
51
+ "bisque2": "#EED5B7",
52
+ "bisque3": "#CDB79E",
53
+ "bisque4": "#8B7D6B",
54
+ "black": "#000000",
55
+ "blanchedalmond": "#FFEBCD",
56
+ "blue": "#0000FF",
57
+ "blue1": "#0000FF",
58
+ "blue2": "#0000EE",
59
+ "blue3": "#0000CD",
60
+ "blue4": "#00008B",
61
+ "blueviolet": "#8A2BE2",
62
+ "brown": "#A52A2A",
63
+ "brown1": "#FF4040",
64
+ "brown2": "#EE3B3B",
65
+ "brown3": "#CD3333",
66
+ "brown4": "#8B2323",
67
+ "burlywood": "#DEB887",
68
+ "burlywood1": "#FFD39B",
69
+ "burlywood2": "#EEC591",
70
+ "burlywood3": "#CDAA7D",
71
+ "burlywood4": "#8B7355",
72
+ "cadetblue": "#5F9EA0",
73
+ "cadetblue1": "#98F5FF",
74
+ "cadetblue2": "#8EE5EE",
75
+ "cadetblue3": "#7AC5CD",
76
+ "cadetblue4": "#53868B",
77
+ "chartreuse": "#7FFF00",
78
+ "chartreuse1": "#7FFF00",
79
+ "chartreuse2": "#76EE00",
80
+ "chartreuse3": "#66CD00",
81
+ "chartreuse4": "#458B00",
82
+ "chocolate": "#D2691E",
83
+ "chocolate1": "#FF7F24",
84
+ "chocolate2": "#EE7621",
85
+ "chocolate3": "#CD661D",
86
+ "chocolate4": "#8B4513",
87
+ "coral": "#FF7F50",
88
+ "coral1": "#FF7256",
89
+ "coral2": "#EE6A50",
90
+ "coral3": "#CD5B45",
91
+ "coral4": "#8B3E2F",
92
+ "cornflowerblue": "#6495ED",
93
+ "cornsilk": "#FFF8DC",
94
+ "cornsilk1": "#FFF8DC",
95
+ "cornsilk2": "#EEE8CD",
96
+ "cornsilk3": "#CDC8B1",
97
+ "cornsilk4": "#8B8878",
98
+ "cyan": "#00FFFF",
99
+ "cyan1": "#00FFFF",
100
+ "cyan2": "#00EEEE",
101
+ "cyan3": "#00CDCD",
102
+ "cyan4": "#008B8B",
103
+ "darkblue": "#00008B",
104
+ "darkcyan": "#008B8B",
105
+ "darkgoldenrod": "#B8860B",
106
+ "darkgoldenrod1": "#FFB90F",
107
+ "darkgoldenrod2": "#EEAD0E",
108
+ "darkgoldenrod3": "#CD950C",
109
+ "darkgoldenrod4": "#8B6508",
110
+ "darkgray": "#A9A9A9",
111
+ "darkgreen": "#006400",
112
+ "darkgrey": "#A9A9A9",
113
+ "darkkhaki": "#BDB76B",
114
+ "darkmagenta": "#8B008B",
115
+ "darkolivegreen": "#556B2F",
116
+ "darkolivegreen1": "#CAFF70",
117
+ "darkolivegreen2": "#BCEE68",
118
+ "darkolivegreen3": "#A2CD5A",
119
+ "darkolivegreen4": "#6E8B3D",
120
+ "darkorange": "#FF8C00",
121
+ "darkorange1": "#FF7F00",
122
+ "darkorange2": "#EE7600",
123
+ "darkorange3": "#CD6600",
124
+ "darkorange4": "#8B4500",
125
+ "darkorchid": "#9932CC",
126
+ "darkorchid1": "#BF3EFF",
127
+ "darkorchid2": "#B23AEE",
128
+ "darkorchid3": "#9A32CD",
129
+ "darkorchid4": "#68228B",
130
+ "darkred": "#8B0000",
131
+ "darksalmon": "#E9967A",
132
+ "darkseagreen": "#8FBC8F",
133
+ "darkseagreen1": "#C1FFC1",
134
+ "darkseagreen2": "#B4EEB4",
135
+ "darkseagreen3": "#9BCD9B",
136
+ "darkseagreen4": "#698B69",
137
+ "darkslateblue": "#483D8B",
138
+ "darkslategray": "#2F4F4F",
139
+ "darkslategray1": "#97FFFF",
140
+ "darkslategray2": "#8DEEEE",
141
+ "darkslategray3": "#79CDCD",
142
+ "darkslategray4": "#528B8B",
143
+ "darkslategrey": "#2F4F4F",
144
+ "darkturquoise": "#00CED1",
145
+ "darkviolet": "#9400D3",
146
+ "deeppink": "#FF1493",
147
+ "deeppink1": "#FF1493",
148
+ "deeppink2": "#EE1289",
149
+ "deeppink3": "#CD1076",
150
+ "deeppink4": "#8B0A50",
151
+ "deepskyblue": "#00BFFF",
152
+ "deepskyblue1": "#00BFFF",
153
+ "deepskyblue2": "#00B2EE",
154
+ "deepskyblue3": "#009ACD",
155
+ "deepskyblue4": "#00688B",
156
+ "dimgray": "#696969",
157
+ "dimgrey": "#696969",
158
+ "dodgerblue": "#1E90FF",
159
+ "dodgerblue1": "#1E90FF",
160
+ "dodgerblue2": "#1C86EE",
161
+ "dodgerblue3": "#1874CD",
162
+ "dodgerblue4": "#104E8B",
163
+ "firebrick": "#B22222",
164
+ "firebrick1": "#FF3030",
165
+ "firebrick2": "#EE2C2C",
166
+ "firebrick3": "#CD2626",
167
+ "firebrick4": "#8B1A1A",
168
+ "floralwhite": "#FFFAF0",
169
+ "forestgreen": "#228B22",
170
+ "gainsboro": "#DCDCDC",
171
+ "ghostwhite": "#F8F8FF",
172
+ "gold": "#FFD700",
173
+ "gold1": "#FFD700",
174
+ "gold2": "#EEC900",
175
+ "gold3": "#CDAD00",
176
+ "gold4": "#8B7500",
177
+ "goldenrod": "#DAA520",
178
+ "goldenrod1": "#FFC125",
179
+ "goldenrod2": "#EEB422",
180
+ "goldenrod3": "#CD9B1D",
181
+ "goldenrod4": "#8B6914",
182
+ "gray": "#BEBEBE",
183
+ "gray0": "#000000",
184
+ "gray1": "#030303",
185
+ "gray2": "#050505",
186
+ "gray3": "#080808",
187
+ "gray4": "#0A0A0A",
188
+ "gray5": "#0D0D0D",
189
+ "gray6": "#0F0F0F",
190
+ "gray7": "#121212",
191
+ "gray8": "#141414",
192
+ "gray9": "#171717",
193
+ "gray10": "#1A1A1A",
194
+ "gray11": "#1C1C1C",
195
+ "gray12": "#1F1F1F",
196
+ "gray13": "#212121",
197
+ "gray14": "#242424",
198
+ "gray15": "#262626",
199
+ "gray16": "#292929",
200
+ "gray17": "#2B2B2B",
201
+ "gray18": "#2E2E2E",
202
+ "gray19": "#303030",
203
+ "gray20": "#333333",
204
+ "gray21": "#363636",
205
+ "gray22": "#383838",
206
+ "gray23": "#3B3B3B",
207
+ "gray24": "#3D3D3D",
208
+ "gray25": "#404040",
209
+ "gray26": "#424242",
210
+ "gray27": "#454545",
211
+ "gray28": "#474747",
212
+ "gray29": "#4A4A4A",
213
+ "gray30": "#4D4D4D",
214
+ "gray31": "#4F4F4F",
215
+ "gray32": "#525252",
216
+ "gray33": "#545454",
217
+ "gray34": "#575757",
218
+ "gray35": "#595959",
219
+ "gray36": "#5C5C5C",
220
+ "gray37": "#5E5E5E",
221
+ "gray38": "#616161",
222
+ "gray39": "#636363",
223
+ "gray40": "#666666",
224
+ "gray41": "#696969",
225
+ "gray42": "#6B6B6B",
226
+ "gray43": "#6E6E6E",
227
+ "gray44": "#707070",
228
+ "gray45": "#737373",
229
+ "gray46": "#757575",
230
+ "gray47": "#787878",
231
+ "gray48": "#7A7A7A",
232
+ "gray49": "#7D7D7D",
233
+ "gray50": "#7F7F7F",
234
+ "gray51": "#828282",
235
+ "gray52": "#858585",
236
+ "gray53": "#878787",
237
+ "gray54": "#8A8A8A",
238
+ "gray55": "#8C8C8C",
239
+ "gray56": "#8F8F8F",
240
+ "gray57": "#919191",
241
+ "gray58": "#949494",
242
+ "gray59": "#969696",
243
+ "gray60": "#999999",
244
+ "gray61": "#9C9C9C",
245
+ "gray62": "#9E9E9E",
246
+ "gray63": "#A1A1A1",
247
+ "gray64": "#A3A3A3",
248
+ "gray65": "#A6A6A6",
249
+ "gray66": "#A8A8A8",
250
+ "gray67": "#ABABAB",
251
+ "gray68": "#ADADAD",
252
+ "gray69": "#B0B0B0",
253
+ "gray70": "#B3B3B3",
254
+ "gray71": "#B5B5B5",
255
+ "gray72": "#B8B8B8",
256
+ "gray73": "#BABABA",
257
+ "gray74": "#BDBDBD",
258
+ "gray75": "#BFBFBF",
259
+ "gray76": "#C2C2C2",
260
+ "gray77": "#C4C4C4",
261
+ "gray78": "#C7C7C7",
262
+ "gray79": "#C9C9C9",
263
+ "gray80": "#CCCCCC",
264
+ "gray81": "#CFCFCF",
265
+ "gray82": "#D1D1D1",
266
+ "gray83": "#D4D4D4",
267
+ "gray84": "#D6D6D6",
268
+ "gray85": "#D9D9D9",
269
+ "gray86": "#DBDBDB",
270
+ "gray87": "#DEDEDE",
271
+ "gray88": "#E0E0E0",
272
+ "gray89": "#E3E3E3",
273
+ "gray90": "#E5E5E5",
274
+ "gray91": "#E8E8E8",
275
+ "gray92": "#EBEBEB",
276
+ "gray93": "#EDEDED",
277
+ "gray94": "#F0F0F0",
278
+ "gray95": "#F2F2F2",
279
+ "gray96": "#F5F5F5",
280
+ "gray97": "#F7F7F7",
281
+ "gray98": "#FAFAFA",
282
+ "gray99": "#FCFCFC",
283
+ "gray100": "#FFFFFF",
284
+ "green": "#00FF00",
285
+ "green1": "#00FF00",
286
+ "green2": "#00EE00",
287
+ "green3": "#00CD00",
288
+ "green4": "#008B00",
289
+ "greenyellow": "#ADFF2F",
290
+ "grey": "#BEBEBE",
291
+ "grey0": "#000000",
292
+ "grey1": "#030303",
293
+ "grey2": "#050505",
294
+ "grey3": "#080808",
295
+ "grey4": "#0A0A0A",
296
+ "grey5": "#0D0D0D",
297
+ "grey6": "#0F0F0F",
298
+ "grey7": "#121212",
299
+ "grey8": "#141414",
300
+ "grey9": "#171717",
301
+ "grey10": "#1A1A1A",
302
+ "grey11": "#1C1C1C",
303
+ "grey12": "#1F1F1F",
304
+ "grey13": "#212121",
305
+ "grey14": "#242424",
306
+ "grey15": "#262626",
307
+ "grey16": "#292929",
308
+ "grey17": "#2B2B2B",
309
+ "grey18": "#2E2E2E",
310
+ "grey19": "#303030",
311
+ "grey20": "#333333",
312
+ "grey21": "#363636",
313
+ "grey22": "#383838",
314
+ "grey23": "#3B3B3B",
315
+ "grey24": "#3D3D3D",
316
+ "grey25": "#404040",
317
+ "grey26": "#424242",
318
+ "grey27": "#454545",
319
+ "grey28": "#474747",
320
+ "grey29": "#4A4A4A",
321
+ "grey30": "#4D4D4D",
322
+ "grey31": "#4F4F4F",
323
+ "grey32": "#525252",
324
+ "grey33": "#545454",
325
+ "grey34": "#575757",
326
+ "grey35": "#595959",
327
+ "grey36": "#5C5C5C",
328
+ "grey37": "#5E5E5E",
329
+ "grey38": "#616161",
330
+ "grey39": "#636363",
331
+ "grey40": "#666666",
332
+ "grey41": "#696969",
333
+ "grey42": "#6B6B6B",
334
+ "grey43": "#6E6E6E",
335
+ "grey44": "#707070",
336
+ "grey45": "#737373",
337
+ "grey46": "#757575",
338
+ "grey47": "#787878",
339
+ "grey48": "#7A7A7A",
340
+ "grey49": "#7D7D7D",
341
+ "grey50": "#7F7F7F",
342
+ "grey51": "#828282",
343
+ "grey52": "#858585",
344
+ "grey53": "#878787",
345
+ "grey54": "#8A8A8A",
346
+ "grey55": "#8C8C8C",
347
+ "grey56": "#8F8F8F",
348
+ "grey57": "#919191",
349
+ "grey58": "#949494",
350
+ "grey59": "#969696",
351
+ "grey60": "#999999",
352
+ "grey61": "#9C9C9C",
353
+ "grey62": "#9E9E9E",
354
+ "grey63": "#A1A1A1",
355
+ "grey64": "#A3A3A3",
356
+ "grey65": "#A6A6A6",
357
+ "grey66": "#A8A8A8",
358
+ "grey67": "#ABABAB",
359
+ "grey68": "#ADADAD",
360
+ "grey69": "#B0B0B0",
361
+ "grey70": "#B3B3B3",
362
+ "grey71": "#B5B5B5",
363
+ "grey72": "#B8B8B8",
364
+ "grey73": "#BABABA",
365
+ "grey74": "#BDBDBD",
366
+ "grey75": "#BFBFBF",
367
+ "grey76": "#C2C2C2",
368
+ "grey77": "#C4C4C4",
369
+ "grey78": "#C7C7C7",
370
+ "grey79": "#C9C9C9",
371
+ "grey80": "#CCCCCC",
372
+ "grey81": "#CFCFCF",
373
+ "grey82": "#D1D1D1",
374
+ "grey83": "#D4D4D4",
375
+ "grey84": "#D6D6D6",
376
+ "grey85": "#D9D9D9",
377
+ "grey86": "#DBDBDB",
378
+ "grey87": "#DEDEDE",
379
+ "grey88": "#E0E0E0",
380
+ "grey89": "#E3E3E3",
381
+ "grey90": "#E5E5E5",
382
+ "grey91": "#E8E8E8",
383
+ "grey92": "#EBEBEB",
384
+ "grey93": "#EDEDED",
385
+ "grey94": "#F0F0F0",
386
+ "grey95": "#F2F2F2",
387
+ "grey96": "#F5F5F5",
388
+ "grey97": "#F7F7F7",
389
+ "grey98": "#FAFAFA",
390
+ "grey99": "#FCFCFC",
391
+ "grey100": "#FFFFFF",
392
+ "honeydew": "#F0FFF0",
393
+ "honeydew1": "#F0FFF0",
394
+ "honeydew2": "#E0EEE0",
395
+ "honeydew3": "#C1CDC1",
396
+ "honeydew4": "#838B83",
397
+ "hotpink": "#FF69B4",
398
+ "hotpink1": "#FF6EB4",
399
+ "hotpink2": "#EE6AA7",
400
+ "hotpink3": "#CD6090",
401
+ "hotpink4": "#8B3A62",
402
+ "indianred": "#CD5C5C",
403
+ "indianred1": "#FF6A6A",
404
+ "indianred2": "#EE6363",
405
+ "indianred3": "#CD5555",
406
+ "indianred4": "#8B3A3A",
407
+ "ivory": "#FFFFF0",
408
+ "ivory1": "#FFFFF0",
409
+ "ivory2": "#EEEEE0",
410
+ "ivory3": "#CDCDC1",
411
+ "ivory4": "#8B8B83",
412
+ "khaki": "#F0E68C",
413
+ "khaki1": "#FFF68F",
414
+ "khaki2": "#EEE685",
415
+ "khaki3": "#CDC673",
416
+ "khaki4": "#8B864E",
417
+ "lavender": "#E6E6FA",
418
+ "lavenderblush": "#FFF0F5",
419
+ "lavenderblush1": "#FFF0F5",
420
+ "lavenderblush2": "#EEE0E5",
421
+ "lavenderblush3": "#CDC1C5",
422
+ "lavenderblush4": "#8B8386",
423
+ "lawngreen": "#7CFC00",
424
+ "lemonchiffon": "#FFFACD",
425
+ "lemonchiffon1": "#FFFACD",
426
+ "lemonchiffon2": "#EEE9BF",
427
+ "lemonchiffon3": "#CDC9A5",
428
+ "lemonchiffon4": "#8B8970",
429
+ "lightblue": "#ADD8E6",
430
+ "lightblue1": "#BFEFFF",
431
+ "lightblue2": "#B2DFEE",
432
+ "lightblue3": "#9AC0CD",
433
+ "lightblue4": "#68838B",
434
+ "lightcoral": "#F08080",
435
+ "lightcyan": "#E0FFFF",
436
+ "lightcyan1": "#E0FFFF",
437
+ "lightcyan2": "#D1EEEE",
438
+ "lightcyan3": "#B4CDCD",
439
+ "lightcyan4": "#7A8B8B",
440
+ "lightgoldenrod": "#EEDD82",
441
+ "lightgoldenrod1": "#FFEC8B",
442
+ "lightgoldenrod2": "#EEDC82",
443
+ "lightgoldenrod3": "#CDBE70",
444
+ "lightgoldenrod4": "#8B814C",
445
+ "lightgoldenrodyellow": "#FAFAD2",
446
+ "lightgray": "#D3D3D3",
447
+ "lightgreen": "#90EE90",
448
+ "lightgrey": "#D3D3D3",
449
+ "lightpink": "#FFB6C1",
450
+ "lightpink1": "#FFAEB9",
451
+ "lightpink2": "#EEA2AD",
452
+ "lightpink3": "#CD8C95",
453
+ "lightpink4": "#8B5F65",
454
+ "lightsalmon": "#FFA07A",
455
+ "lightsalmon1": "#FFA07A",
456
+ "lightsalmon2": "#EE9572",
457
+ "lightsalmon3": "#CD8162",
458
+ "lightsalmon4": "#8B5742",
459
+ "lightseagreen": "#20B2AA",
460
+ "lightskyblue": "#87CEFA",
461
+ "lightskyblue1": "#B0E2FF",
462
+ "lightskyblue2": "#A4D3EE",
463
+ "lightskyblue3": "#8DB6CD",
464
+ "lightskyblue4": "#607B8B",
465
+ "lightslateblue": "#8470FF",
466
+ "lightslategray": "#778899",
467
+ "lightslategrey": "#778899",
468
+ "lightsteelblue": "#B0C4DE",
469
+ "lightsteelblue1": "#CAE1FF",
470
+ "lightsteelblue2": "#BCD2EE",
471
+ "lightsteelblue3": "#A2B5CD",
472
+ "lightsteelblue4": "#6E7B8B",
473
+ "lightyellow": "#FFFFE0",
474
+ "lightyellow1": "#FFFFE0",
475
+ "lightyellow2": "#EEEED1",
476
+ "lightyellow3": "#CDCDB4",
477
+ "lightyellow4": "#8B8B7A",
478
+ "limegreen": "#32CD32",
479
+ "linen": "#FAF0E6",
480
+ "magenta": "#FF00FF",
481
+ "magenta1": "#FF00FF",
482
+ "magenta2": "#EE00EE",
483
+ "magenta3": "#CD00CD",
484
+ "magenta4": "#8B008B",
485
+ "maroon": "#B03060",
486
+ "maroon1": "#FF34B3",
487
+ "maroon2": "#EE30A7",
488
+ "maroon3": "#CD2990",
489
+ "maroon4": "#8B1C62",
490
+ "mediumaquamarine": "#66CDAA",
491
+ "mediumblue": "#0000CD",
492
+ "mediumorchid": "#BA55D3",
493
+ "mediumorchid1": "#E066FF",
494
+ "mediumorchid2": "#D15FEE",
495
+ "mediumorchid3": "#B452CD",
496
+ "mediumorchid4": "#7A378B",
497
+ "mediumpurple": "#9370DB",
498
+ "mediumpurple1": "#AB82FF",
499
+ "mediumpurple2": "#9F79EE",
500
+ "mediumpurple3": "#8968CD",
501
+ "mediumpurple4": "#5D478B",
502
+ "mediumseagreen": "#3CB371",
503
+ "mediumslateblue": "#7B68EE",
504
+ "mediumspringgreen": "#00FA9A",
505
+ "mediumturquoise": "#48D1CC",
506
+ "mediumvioletred": "#C71585",
507
+ "midnightblue": "#191970",
508
+ "mintcream": "#F5FFFA",
509
+ "mistyrose": "#FFE4E1",
510
+ "mistyrose1": "#FFE4E1",
511
+ "mistyrose2": "#EED5D2",
512
+ "mistyrose3": "#CDB7B5",
513
+ "mistyrose4": "#8B7D7B",
514
+ "moccasin": "#FFE4B5",
515
+ "navajowhite": "#FFDEAD",
516
+ "navajowhite1": "#FFDEAD",
517
+ "navajowhite2": "#EECFA1",
518
+ "navajowhite3": "#CDB38B",
519
+ "navajowhite4": "#8B795E",
520
+ "navy": "#000080",
521
+ "navyblue": "#000080",
522
+ "oldlace": "#FDF5E6",
523
+ "olivedrab": "#6B8E23",
524
+ "olivedrab1": "#C0FF3E",
525
+ "olivedrab2": "#B3EE3A",
526
+ "olivedrab3": "#9ACD32",
527
+ "olivedrab4": "#698B22",
528
+ "orange": "#FFA500",
529
+ "orange1": "#FFA500",
530
+ "orange2": "#EE9A00",
531
+ "orange3": "#CD8500",
532
+ "orange4": "#8B5A00",
533
+ "orangered": "#FF4500",
534
+ "orangered1": "#FF4500",
535
+ "orangered2": "#EE4000",
536
+ "orangered3": "#CD3700",
537
+ "orangered4": "#8B2500",
538
+ "orchid": "#DA70D6",
539
+ "orchid1": "#FF83FA",
540
+ "orchid2": "#EE7AE9",
541
+ "orchid3": "#CD69C9",
542
+ "orchid4": "#8B4789",
543
+ "palegoldenrod": "#EEE8AA",
544
+ "palegreen": "#98FB98",
545
+ "palegreen1": "#9AFF9A",
546
+ "palegreen2": "#90EE90",
547
+ "palegreen3": "#7CCD7C",
548
+ "palegreen4": "#548B54",
549
+ "paleturquoise": "#AFEEEE",
550
+ "paleturquoise1": "#BBFFFF",
551
+ "paleturquoise2": "#AEEEEE",
552
+ "paleturquoise3": "#96CDCD",
553
+ "paleturquoise4": "#668B8B",
554
+ "palevioletred": "#DB7093",
555
+ "palevioletred1": "#FF82AB",
556
+ "palevioletred2": "#EE799F",
557
+ "palevioletred3": "#CD6889",
558
+ "palevioletred4": "#8B475D",
559
+ "papayawhip": "#FFEFD5",
560
+ "peachpuff": "#FFDAB9",
561
+ "peachpuff1": "#FFDAB9",
562
+ "peachpuff2": "#EECBAD",
563
+ "peachpuff3": "#CDAF95",
564
+ "peachpuff4": "#8B7765",
565
+ "peru": "#CD853F",
566
+ "pink": "#FFC0CB",
567
+ "pink1": "#FFB5C5",
568
+ "pink2": "#EEA9B8",
569
+ "pink3": "#CD919E",
570
+ "pink4": "#8B636C",
571
+ "plum": "#DDA0DD",
572
+ "plum1": "#FFBBFF",
573
+ "plum2": "#EEAEEE",
574
+ "plum3": "#CD96CD",
575
+ "plum4": "#8B668B",
576
+ "powderblue": "#B0E0E6",
577
+ "purple": "#A020F0",
578
+ "purple1": "#9B30FF",
579
+ "purple2": "#912CEE",
580
+ "purple3": "#7D26CD",
581
+ "purple4": "#551A8B",
582
+ "red": "#FF0000",
583
+ "red1": "#FF0000",
584
+ "red2": "#EE0000",
585
+ "red3": "#CD0000",
586
+ "red4": "#8B0000",
587
+ "rosybrown": "#BC8F8F",
588
+ "rosybrown1": "#FFC1C1",
589
+ "rosybrown2": "#EEB4B4",
590
+ "rosybrown3": "#CD9B9B",
591
+ "rosybrown4": "#8B6969",
592
+ "royalblue": "#4169E1",
593
+ "royalblue1": "#4876FF",
594
+ "royalblue2": "#436EEE",
595
+ "royalblue3": "#3A5FCD",
596
+ "royalblue4": "#27408B",
597
+ "saddlebrown": "#8B4513",
598
+ "salmon": "#FA8072",
599
+ "salmon1": "#FF8C69",
600
+ "salmon2": "#EE8262",
601
+ "salmon3": "#CD7054",
602
+ "salmon4": "#8B4C39",
603
+ "sandybrown": "#F4A460",
604
+ "seagreen": "#2E8B57",
605
+ "seagreen1": "#54FF9F",
606
+ "seagreen2": "#4EEE94",
607
+ "seagreen3": "#43CD80",
608
+ "seagreen4": "#2E8B57",
609
+ "seashell": "#FFF5EE",
610
+ "seashell1": "#FFF5EE",
611
+ "seashell2": "#EEE5DE",
612
+ "seashell3": "#CDC5BF",
613
+ "seashell4": "#8B8682",
614
+ "sienna": "#A0522D",
615
+ "sienna1": "#FF8247",
616
+ "sienna2": "#EE7942",
617
+ "sienna3": "#CD6839",
618
+ "sienna4": "#8B4726",
619
+ "skyblue": "#87CEEB",
620
+ "skyblue1": "#87CEFF",
621
+ "skyblue2": "#7EC0EE",
622
+ "skyblue3": "#6CA6CD",
623
+ "skyblue4": "#4A708B",
624
+ "slateblue": "#6A5ACD",
625
+ "slateblue1": "#836FFF",
626
+ "slateblue2": "#7A67EE",
627
+ "slateblue3": "#6959CD",
628
+ "slateblue4": "#473C8B",
629
+ "slategray": "#708090",
630
+ "slategray1": "#C6E2FF",
631
+ "slategray2": "#B9D3EE",
632
+ "slategray3": "#9FB6CD",
633
+ "slategray4": "#6C7B8B",
634
+ "slategrey": "#708090",
635
+ "snow": "#FFFAFA",
636
+ "snow1": "#FFFAFA",
637
+ "snow2": "#EEE9E9",
638
+ "snow3": "#CDC9C9",
639
+ "snow4": "#8B8989",
640
+ "springgreen": "#00FF7F",
641
+ "springgreen1": "#00FF7F",
642
+ "springgreen2": "#00EE76",
643
+ "springgreen3": "#00CD66",
644
+ "springgreen4": "#008B45",
645
+ "steelblue": "#4682B4",
646
+ "steelblue1": "#63B8FF",
647
+ "steelblue2": "#5CACEE",
648
+ "steelblue3": "#4F94CD",
649
+ "steelblue4": "#36648B",
650
+ "tan": "#D2B48C",
651
+ "tan1": "#FFA54F",
652
+ "tan2": "#EE9A49",
653
+ "tan3": "#CD853F",
654
+ "tan4": "#8B5A2B",
655
+ "thistle": "#D8BFD8",
656
+ "thistle1": "#FFE1FF",
657
+ "thistle2": "#EED2EE",
658
+ "thistle3": "#CDB5CD",
659
+ "thistle4": "#8B7B8B",
660
+ "tomato": "#FF6347",
661
+ "tomato1": "#FF6347",
662
+ "tomato2": "#EE5C42",
663
+ "tomato3": "#CD4F39",
664
+ "tomato4": "#8B3626",
665
+ "turquoise": "#40E0D0",
666
+ "turquoise1": "#00F5FF",
667
+ "turquoise2": "#00E5EE",
668
+ "turquoise3": "#00C5CD",
669
+ "turquoise4": "#00868B",
670
+ "violet": "#EE82EE",
671
+ "violetred": "#D02090",
672
+ "violetred1": "#FF3E96",
673
+ "violetred2": "#EE3A8C",
674
+ "violetred3": "#CD3278",
675
+ "violetred4": "#8B2252",
676
+ "wheat": "#F5DEB3",
677
+ "wheat1": "#FFE7BA",
678
+ "wheat2": "#EED8AE",
679
+ "wheat3": "#CDBA96",
680
+ "wheat4": "#8B7E66",
681
+ "whitesmoke": "#F5F5F5",
682
+ "yellow": "#FFFF00",
683
+ "yellow1": "#FFFF00",
684
+ "yellow2": "#EEEE00",
685
+ "yellow3": "#CDCD00",
686
+ "yellow4": "#8B8B00",
687
+ "yellowgreen": "#9ACD32",
688
+ }
689
+
690
+
691
+ # ---------------------------------------------------------------------------
692
+ # Internal helpers
693
+ # ---------------------------------------------------------------------------
694
+
695
+ def _hex_to_rgba(h: str) -> Tuple[float, float, float, float]:
696
+ """Convert ``#RRGGBB`` or ``#RRGGBBAA`` to an (r, g, b, a) tuple."""
697
+ h = h.lstrip("#")
698
+ if len(h) == 6:
699
+ return (
700
+ int(h[0:2], 16) / 255.0,
701
+ int(h[2:4], 16) / 255.0,
702
+ int(h[4:6], 16) / 255.0,
703
+ 1.0,
704
+ )
705
+ if len(h) == 8:
706
+ return (
707
+ int(h[0:2], 16) / 255.0,
708
+ int(h[2:4], 16) / 255.0,
709
+ int(h[4:6], 16) / 255.0,
710
+ int(h[6:8], 16) / 255.0,
711
+ )
712
+ # Malformed — fall through to caller's fallback
713
+ return (0.0, 0.0, 0.0, 1.0)
714
+
715
+
716
+ # ---------------------------------------------------------------------------
717
+ # Public API
718
+ # ---------------------------------------------------------------------------
719
+
720
+ def parse_r_colour(c: Any) -> Tuple[float, float, float, float]:
721
+ """Parse an R-style colour specification to ``(r, g, b, a)`` in [0, 1].
722
+
723
+ Supported inputs (matching R's ``col2rgb``):
724
+
725
+ * Named colour — any of the 657 names in ``colors()``
726
+ (case-insensitive).
727
+ * Hex string — ``"#RRGGBB"`` or ``"#RRGGBBAA"``.
728
+ * Special strings — ``"transparent"``, ``"NA"``, ``"none"``, ``""``
729
+ → fully transparent ``(0, 0, 0, 0)``.
730
+ * ``None`` → opaque black ``(0, 0, 0, 1)`` (unset defaults to
731
+ device foreground, which is black).
732
+ * Numeric scalar — interpreted as a grey level in [0, 1].
733
+ * 3- or 4-element list/tuple of floats already in [0, 1].
734
+
735
+ Parameters
736
+ ----------
737
+ c : str, None, float, int, list, or tuple
738
+ The colour specification.
739
+
740
+ Returns
741
+ -------
742
+ tuple of float
743
+ ``(r, g, b, a)`` with each component in [0, 1].
744
+ """
745
+ if c is None:
746
+ return (0.0, 0.0, 0.0, 1.0)
747
+
748
+ # Already a numeric tuple / list
749
+ if isinstance(c, (list, tuple)):
750
+ if len(c) >= 4:
751
+ return (float(c[0]), float(c[1]), float(c[2]), float(c[3]))
752
+ if len(c) == 3:
753
+ return (float(c[0]), float(c[1]), float(c[2]), 1.0)
754
+ if len(c) == 1:
755
+ c = c[0] # unwrap, fall through
756
+ else:
757
+ return (0.0, 0.0, 0.0, 1.0)
758
+
759
+ # String-based specifications
760
+ if isinstance(c, str):
761
+ s = c.strip()
762
+ low = s.lower()
763
+
764
+ # Transparent / NA
765
+ if low in ("transparent", "na", "none", ""):
766
+ return (0.0, 0.0, 0.0, 0.0)
767
+
768
+ # Hex colour
769
+ if s.startswith("#"):
770
+ return _hex_to_rgba(s)
771
+
772
+ # R named colour (case-insensitive)
773
+ hex_val = _R_COLOURS.get(low)
774
+ if hex_val is not None:
775
+ return _hex_to_rgba(hex_val)
776
+
777
+ # Fallback: black
778
+ return (0.0, 0.0, 0.0, 1.0)
779
+
780
+ # Numeric grey level
781
+ if isinstance(c, (int, float)):
782
+ v = float(c)
783
+ return (v, v, v, 1.0)
784
+
785
+ # Unknown type — black
786
+ return (0.0, 0.0, 0.0, 1.0)
787
+
788
+
789
+ def colour_to_css(c: Any) -> Optional[str]:
790
+ """Convert an R-style colour specification to a CSS-compatible string.
791
+
792
+ Returns ``None`` for ``None`` input (meaning "unset").
793
+ Returns ``"transparent"`` for transparent colours.
794
+ All other colours are normalised via :func:`parse_r_colour` and
795
+ returned as ``"rgba(R,G,B,A)"`` to guarantee consistency with the
796
+ Cairo backend.
797
+
798
+ Parameters
799
+ ----------
800
+ c : str, None, float, int, list, or tuple
801
+ The colour specification.
802
+
803
+ Returns
804
+ -------
805
+ str or None
806
+ """
807
+ if c is None:
808
+ return None
809
+
810
+ r, g, b, a = parse_r_colour(c)
811
+ if a == 0.0:
812
+ return "transparent"
813
+ if a == 1.0:
814
+ return f"rgb({int(r * 255)},{int(g * 255)},{int(b * 255)})"
815
+ return f"rgba({int(r * 255)},{int(g * 255)},{int(b * 255)},{a:.3f})"