diff --git a/altair/vegalite/v5/schema/vega-themes.json b/altair/vegalite/v5/schema/vega-themes.json index 10ad14d5d..188a86f8b 100644 --- a/altair/vegalite/v5/schema/vega-themes.json +++ b/altair/vegalite/v5/schema/vega-themes.json @@ -1,1159 +1,1187 @@ { "carbong10": { - "arc": { - "fill": "#6929c4" - }, - "area": { - "fill": "#6929c4" - }, - "axis": { - "grid": true, - "gridColor": "#e0e0e0", - "labelAngle": 0, - "labelColor": "#525252", - "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif", - "labelFontSize": 12, - "labelFontWeight": 400, - "titleColor": "#161616", - "titleFontSize": 12, - "titleFontWeight": 600 - }, - "axisX": { - "titlePadding": 10 - }, - "axisY": { - "titlePadding": 2.5 - }, - "background": "#f4f4f4", - "circle": { - "fill": "#6929c4" - }, - "range": { - "category": [ - "#6929c4", - "#1192e8", - "#005d5d", - "#9f1853", - "#fa4d56", - "#570408", - "#198038", - "#002d9c", - "#ee538b", - "#b28600", - "#009d9a", - "#012749", - "#8a3800", - "#a56eff" - ], - "diverging": [ - "#750e13", - "#a2191f", - "#da1e28", - "#fa4d56", - "#ff8389", - "#ffb3b8", - "#ffd7d9", - "#fff1f1", - "#e5f6ff", - "#bae6ff", - "#82cfff", - "#33b1ff", - "#1192e8", - "#0072c3", - "#00539a", - "#003a6d" - ], - "heatmap": [ - "#f6f2ff", - "#e8daff", - "#d4bbff", - "#be95ff", - "#a56eff", - "#8a3ffc", - "#6929c4", - "#491d8b", - "#31135e", - "#1c0f30" - ] - }, - "rect": { - "fill": "#6929c4" - }, - "style": { - "guide-label": { - "fill": "#525252", - "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontWeight": 400 + "config": { + "arc": { + "fill": "#6929c4" + }, + "area": { + "fill": "#6929c4" + }, + "axis": { + "grid": true, + "gridColor": "#e0e0e0", + "labelAngle": 0, + "labelColor": "#525252", + "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif", + "labelFontSize": 12, + "labelFontWeight": 400, + "titleColor": "#161616", + "titleFontSize": 12, + "titleFontWeight": 600 + }, + "axisX": { + "titlePadding": 10 + }, + "axisY": { + "titlePadding": 2.5 }, - "guide-title": { - "fill": "#525252", + "background": "#f4f4f4", + "circle": { + "fill": "#6929c4" + }, + "range": { + "category": [ + "#6929c4", + "#1192e8", + "#005d5d", + "#9f1853", + "#fa4d56", + "#570408", + "#198038", + "#002d9c", + "#ee538b", + "#b28600", + "#009d9a", + "#012749", + "#8a3800", + "#a56eff" + ], + "diverging": [ + "#750e13", + "#a2191f", + "#da1e28", + "#fa4d56", + "#ff8389", + "#ffb3b8", + "#ffd7d9", + "#fff1f1", + "#e5f6ff", + "#bae6ff", + "#82cfff", + "#33b1ff", + "#1192e8", + "#0072c3", + "#00539a", + "#003a6d" + ], + "heatmap": [ + "#f6f2ff", + "#e8daff", + "#d4bbff", + "#be95ff", + "#a56eff", + "#8a3ffc", + "#6929c4", + "#491d8b", + "#31135e", + "#1c0f30" + ] + }, + "rect": { + "fill": "#6929c4" + }, + "style": { + "guide-label": { + "fill": "#525252", + "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", + "fontWeight": 400 + }, + "guide-title": { + "fill": "#525252", + "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", + "fontWeight": 400 + } + }, + "title": { + "anchor": "start", + "color": "#161616", + "dy": -15, "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontWeight": 400 + "fontSize": 16, + "fontWeight": 600 + }, + "view": { + "fill": "#ffffff", + "stroke": "#ffffff" } - }, - "title": { - "anchor": "start", - "color": "#161616", - "dy": -15, - "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontSize": 16, - "fontWeight": 600 - }, - "view": { - "fill": "#ffffff", - "stroke": "#ffffff" } }, "carbong100": { - "arc": { - "fill": "#d4bbff" - }, - "area": { - "fill": "#d4bbff" - }, - "axis": { - "grid": true, - "gridColor": "#393939", - "labelAngle": 0, - "labelColor": "#c6c6c6", - "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif", - "labelFontSize": 12, - "labelFontWeight": 400, - "titleColor": "#f4f4f4", - "titleFontSize": 12, - "titleFontWeight": 600 - }, - "axisX": { - "titlePadding": 10 - }, - "axisY": { - "titlePadding": 2.5 - }, - "background": "#161616", - "circle": { - "fill": "#d4bbff" - }, - "range": { - "category": [ - "#8a3ffc", - "#33b1ff", - "#007d79", - "#ff7eb6", - "#fa4d56", - "#fff1f1", - "#6fdc8c", - "#4589ff", - "#d12771", - "#d2a106", - "#08bdba", - "#bae6ff", - "#ba4e00", - "#d4bbff" - ], - "diverging": [ - "#750e13", - "#a2191f", - "#da1e28", - "#fa4d56", - "#ff8389", - "#ffb3b8", - "#ffd7d9", - "#fff1f1", - "#e5f6ff", - "#bae6ff", - "#82cfff", - "#33b1ff", - "#1192e8", - "#0072c3", - "#00539a", - "#003a6d" - ], - "heatmap": [ - "#f6f2ff", - "#e8daff", - "#d4bbff", - "#be95ff", - "#a56eff", - "#8a3ffc", - "#6929c4", - "#491d8b", - "#31135e", - "#1c0f30" - ] - }, - "rect": { - "fill": "#d4bbff" - }, - "style": { - "guide-label": { - "fill": "#c6c6c6", - "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontWeight": 400 + "config": { + "arc": { + "fill": "#d4bbff" + }, + "area": { + "fill": "#d4bbff" + }, + "axis": { + "grid": true, + "gridColor": "#393939", + "labelAngle": 0, + "labelColor": "#c6c6c6", + "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif", + "labelFontSize": 12, + "labelFontWeight": 400, + "titleColor": "#f4f4f4", + "titleFontSize": 12, + "titleFontWeight": 600 + }, + "axisX": { + "titlePadding": 10 + }, + "axisY": { + "titlePadding": 2.5 + }, + "background": "#161616", + "circle": { + "fill": "#d4bbff" + }, + "range": { + "category": [ + "#8a3ffc", + "#33b1ff", + "#007d79", + "#ff7eb6", + "#fa4d56", + "#fff1f1", + "#6fdc8c", + "#4589ff", + "#d12771", + "#d2a106", + "#08bdba", + "#bae6ff", + "#ba4e00", + "#d4bbff" + ], + "diverging": [ + "#750e13", + "#a2191f", + "#da1e28", + "#fa4d56", + "#ff8389", + "#ffb3b8", + "#ffd7d9", + "#fff1f1", + "#e5f6ff", + "#bae6ff", + "#82cfff", + "#33b1ff", + "#1192e8", + "#0072c3", + "#00539a", + "#003a6d" + ], + "heatmap": [ + "#f6f2ff", + "#e8daff", + "#d4bbff", + "#be95ff", + "#a56eff", + "#8a3ffc", + "#6929c4", + "#491d8b", + "#31135e", + "#1c0f30" + ] + }, + "rect": { + "fill": "#d4bbff" + }, + "style": { + "guide-label": { + "fill": "#c6c6c6", + "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", + "fontWeight": 400 + }, + "guide-title": { + "fill": "#c6c6c6", + "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", + "fontWeight": 400 + } }, - "guide-title": { - "fill": "#c6c6c6", + "title": { + "anchor": "start", + "color": "#f4f4f4", + "dy": -15, "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontWeight": 400 + "fontSize": 16, + "fontWeight": 600 + }, + "view": { + "fill": "#161616", + "stroke": "#161616" } - }, - "title": { - "anchor": "start", - "color": "#f4f4f4", - "dy": -15, - "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontSize": 16, - "fontWeight": 600 - }, - "view": { - "fill": "#161616", - "stroke": "#161616" } }, "carbong90": { - "arc": { - "fill": "#d4bbff" - }, - "area": { - "fill": "#d4bbff" - }, - "axis": { - "grid": true, - "gridColor": "#525252", - "labelAngle": 0, - "labelColor": "#c6c6c6", - "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif", - "labelFontSize": 12, - "labelFontWeight": 400, - "titleColor": "#f4f4f4", - "titleFontSize": 12, - "titleFontWeight": 600 - }, - "axisX": { - "titlePadding": 10 - }, - "axisY": { - "titlePadding": 2.5 - }, - "background": "#262626", - "circle": { - "fill": "#d4bbff" - }, - "range": { - "category": [ - "#8a3ffc", - "#33b1ff", - "#007d79", - "#ff7eb6", - "#fa4d56", - "#fff1f1", - "#6fdc8c", - "#4589ff", - "#d12771", - "#d2a106", - "#08bdba", - "#bae6ff", - "#ba4e00", - "#d4bbff" - ], - "diverging": [ - "#750e13", - "#a2191f", - "#da1e28", - "#fa4d56", - "#ff8389", - "#ffb3b8", - "#ffd7d9", - "#fff1f1", - "#e5f6ff", - "#bae6ff", - "#82cfff", - "#33b1ff", - "#1192e8", - "#0072c3", - "#00539a", - "#003a6d" - ], - "heatmap": [ - "#f6f2ff", - "#e8daff", - "#d4bbff", - "#be95ff", - "#a56eff", - "#8a3ffc", - "#6929c4", - "#491d8b", - "#31135e", - "#1c0f30" - ] - }, - "rect": { - "fill": "#d4bbff" - }, - "style": { - "guide-label": { - "fill": "#c6c6c6", - "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontWeight": 400 + "config": { + "arc": { + "fill": "#d4bbff" + }, + "area": { + "fill": "#d4bbff" + }, + "axis": { + "grid": true, + "gridColor": "#525252", + "labelAngle": 0, + "labelColor": "#c6c6c6", + "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif", + "labelFontSize": 12, + "labelFontWeight": 400, + "titleColor": "#f4f4f4", + "titleFontSize": 12, + "titleFontWeight": 600 + }, + "axisX": { + "titlePadding": 10 + }, + "axisY": { + "titlePadding": 2.5 + }, + "background": "#262626", + "circle": { + "fill": "#d4bbff" + }, + "range": { + "category": [ + "#8a3ffc", + "#33b1ff", + "#007d79", + "#ff7eb6", + "#fa4d56", + "#fff1f1", + "#6fdc8c", + "#4589ff", + "#d12771", + "#d2a106", + "#08bdba", + "#bae6ff", + "#ba4e00", + "#d4bbff" + ], + "diverging": [ + "#750e13", + "#a2191f", + "#da1e28", + "#fa4d56", + "#ff8389", + "#ffb3b8", + "#ffd7d9", + "#fff1f1", + "#e5f6ff", + "#bae6ff", + "#82cfff", + "#33b1ff", + "#1192e8", + "#0072c3", + "#00539a", + "#003a6d" + ], + "heatmap": [ + "#f6f2ff", + "#e8daff", + "#d4bbff", + "#be95ff", + "#a56eff", + "#8a3ffc", + "#6929c4", + "#491d8b", + "#31135e", + "#1c0f30" + ] + }, + "rect": { + "fill": "#d4bbff" }, - "guide-title": { - "fill": "#c6c6c6", + "style": { + "guide-label": { + "fill": "#c6c6c6", + "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", + "fontWeight": 400 + }, + "guide-title": { + "fill": "#c6c6c6", + "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", + "fontWeight": 400 + } + }, + "title": { + "anchor": "start", + "color": "#f4f4f4", + "dy": -15, "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontWeight": 400 + "fontSize": 16, + "fontWeight": 600 + }, + "view": { + "fill": "#161616", + "stroke": "#161616" } - }, - "title": { - "anchor": "start", - "color": "#f4f4f4", - "dy": -15, - "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontSize": 16, - "fontWeight": 600 - }, - "view": { - "fill": "#161616", - "stroke": "#161616" } }, "carbonwhite": { - "arc": { - "fill": "#6929c4" - }, - "area": { - "fill": "#6929c4" - }, - "axis": { - "grid": true, - "gridColor": "#e0e0e0", - "labelAngle": 0, - "labelColor": "#525252", - "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif", - "labelFontSize": 12, - "labelFontWeight": 400, - "titleColor": "#161616", - "titleFontSize": 12, - "titleFontWeight": 600 - }, - "axisX": { - "titlePadding": 10 - }, - "axisY": { - "titlePadding": 2.5 - }, - "background": "#ffffff", - "circle": { - "fill": "#6929c4" - }, - "range": { - "category": [ - "#6929c4", - "#1192e8", - "#005d5d", - "#9f1853", - "#fa4d56", - "#570408", - "#198038", - "#002d9c", - "#ee538b", - "#b28600", - "#009d9a", - "#012749", - "#8a3800", - "#a56eff" - ], - "diverging": [ - "#750e13", - "#a2191f", - "#da1e28", - "#fa4d56", - "#ff8389", - "#ffb3b8", - "#ffd7d9", - "#fff1f1", - "#e5f6ff", - "#bae6ff", - "#82cfff", - "#33b1ff", - "#1192e8", - "#0072c3", - "#00539a", - "#003a6d" - ], - "heatmap": [ - "#f6f2ff", - "#e8daff", - "#d4bbff", - "#be95ff", - "#a56eff", - "#8a3ffc", - "#6929c4", - "#491d8b", - "#31135e", - "#1c0f30" - ] - }, - "rect": { - "fill": "#6929c4" - }, - "style": { - "guide-label": { - "fill": "#525252", - "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontWeight": 400 + "config": { + "arc": { + "fill": "#6929c4" + }, + "area": { + "fill": "#6929c4" + }, + "axis": { + "grid": true, + "gridColor": "#e0e0e0", + "labelAngle": 0, + "labelColor": "#525252", + "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif", + "labelFontSize": 12, + "labelFontWeight": 400, + "titleColor": "#161616", + "titleFontSize": 12, + "titleFontWeight": 600 + }, + "axisX": { + "titlePadding": 10 + }, + "axisY": { + "titlePadding": 2.5 + }, + "background": "#ffffff", + "circle": { + "fill": "#6929c4" + }, + "range": { + "category": [ + "#6929c4", + "#1192e8", + "#005d5d", + "#9f1853", + "#fa4d56", + "#570408", + "#198038", + "#002d9c", + "#ee538b", + "#b28600", + "#009d9a", + "#012749", + "#8a3800", + "#a56eff" + ], + "diverging": [ + "#750e13", + "#a2191f", + "#da1e28", + "#fa4d56", + "#ff8389", + "#ffb3b8", + "#ffd7d9", + "#fff1f1", + "#e5f6ff", + "#bae6ff", + "#82cfff", + "#33b1ff", + "#1192e8", + "#0072c3", + "#00539a", + "#003a6d" + ], + "heatmap": [ + "#f6f2ff", + "#e8daff", + "#d4bbff", + "#be95ff", + "#a56eff", + "#8a3ffc", + "#6929c4", + "#491d8b", + "#31135e", + "#1c0f30" + ] }, - "guide-title": { - "fill": "#525252", + "rect": { + "fill": "#6929c4" + }, + "style": { + "guide-label": { + "fill": "#525252", + "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", + "fontWeight": 400 + }, + "guide-title": { + "fill": "#525252", + "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", + "fontWeight": 400 + } + }, + "title": { + "anchor": "start", + "color": "#161616", + "dy": -15, "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontWeight": 400 + "fontSize": 16, + "fontWeight": 600 + }, + "view": { + "fill": "#ffffff", + "stroke": "#ffffff" } - }, - "title": { - "anchor": "start", - "color": "#161616", - "dy": -15, - "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif", - "fontSize": 16, - "fontWeight": 600 - }, - "view": { - "fill": "#ffffff", - "stroke": "#ffffff" } }, "dark": { - "axis": { - "domainColor": "#fff", - "gridColor": "#888", - "tickColor": "#fff" - }, - "background": "#333", - "style": { - "guide-label": { - "fill": "#fff" - }, - "guide-title": { - "fill": "#fff" + "config": { + "axis": { + "domainColor": "#fff", + "gridColor": "#888", + "tickColor": "#fff" + }, + "background": "#333", + "style": { + "guide-label": { + "fill": "#fff" + }, + "guide-title": { + "fill": "#fff" + } + }, + "title": { + "color": "#fff", + "subtitleColor": "#fff" + }, + "view": { + "stroke": "#888" } - }, - "title": { - "color": "#fff", - "subtitleColor": "#fff" - }, - "view": { - "stroke": "#888" } }, "excel": { - "arc": { - "fill": "#4572a7" - }, - "area": { - "fill": "#4572a7" - }, - "axis": { - "bandPosition": 0.5, - "grid": true, - "gridColor": "#000000", - "gridOpacity": 1, - "gridWidth": 0.5, - "labelPadding": 10, - "tickSize": 5, - "tickWidth": 0.5 - }, - "axisBand": { - "grid": false, - "tickExtra": true - }, - "background": "#fff", - "legend": { - "labelBaseline": "middle", - "labelFontSize": 11, - "symbolSize": 50, - "symbolType": "square" - }, - "line": { - "stroke": "#4572a7", - "strokeWidth": 2 - }, - "range": { - "category": [ - "#4572a7", - "#aa4643", - "#8aa453", - "#71598e", - "#4598ae", - "#d98445", - "#94aace", - "#d09393", - "#b9cc98", - "#a99cbc" - ] - }, - "rect": { - "fill": "#4572a7" + "config": { + "arc": { + "fill": "#4572a7" + }, + "area": { + "fill": "#4572a7" + }, + "axis": { + "bandPosition": 0.5, + "grid": true, + "gridColor": "#000000", + "gridOpacity": 1, + "gridWidth": 0.5, + "labelPadding": 10, + "tickSize": 5, + "tickWidth": 0.5 + }, + "axisBand": { + "grid": false, + "tickExtra": true + }, + "background": "#fff", + "legend": { + "labelBaseline": "middle", + "labelFontSize": 11, + "symbolSize": 50, + "symbolType": "square" + }, + "line": { + "stroke": "#4572a7", + "strokeWidth": 2 + }, + "range": { + "category": [ + "#4572a7", + "#aa4643", + "#8aa453", + "#71598e", + "#4598ae", + "#d98445", + "#94aace", + "#d09393", + "#b9cc98", + "#a99cbc" + ] + }, + "rect": { + "fill": "#4572a7" + } } }, "fivethirtyeight": { - "arc": { - "fill": "#30a2da" - }, - "area": { - "fill": "#30a2da" - }, - "axis": { - "domainColor": "#cbcbcb", - "grid": true, - "gridColor": "#cbcbcb", - "gridWidth": 1, - "labelColor": "#999", - "labelFontSize": 10, - "labelPadding": 4, - "tickColor": "#cbcbcb", - "tickSize": 10, - "titleColor": "#333", - "titleFontSize": 14, - "titlePadding": 10 - }, - "axisBand": { - "grid": false - }, - "background": "#f0f0f0", - "bar": { - "binSpacing": 2, - "fill": "#30a2da", - "stroke": null - }, - "legend": { - "labelColor": "#333", - "labelFontSize": 11, - "padding": 1, - "symbolSize": 30, - "symbolType": "square", - "titleColor": "#333", - "titleFontSize": 14, - "titlePadding": 10 - }, - "line": { - "stroke": "#30a2da", - "strokeWidth": 2 - }, - "point": { - "filled": true, - "shape": "circle" - }, - "range": { - "category": [ - "#30a2da", - "#fc4f30", - "#e5ae38", - "#6d904f", - "#8b8b8b", - "#b96db8", - "#ff9e27", - "#56cc60", - "#52d2ca", - "#52689e", - "#545454", - "#9fe4f8" - ], - "diverging": [ - "#cc0020", - "#e77866", - "#f6e7e1", - "#d6e8ed", - "#91bfd9", - "#1d78b5" - ], - "heatmap": [ - "#d6e8ed", - "#cee0e5", - "#91bfd9", - "#549cc6", - "#1d78b5" - ] - }, - "rect": { - "fill": "#30a2da" - }, - "title": { - "anchor": "start", - "fontSize": 24, - "fontWeight": 600, - "offset": 20 + "config": { + "arc": { + "fill": "#30a2da" + }, + "area": { + "fill": "#30a2da" + }, + "axis": { + "domainColor": "#cbcbcb", + "grid": true, + "gridColor": "#cbcbcb", + "gridWidth": 1, + "labelColor": "#999", + "labelFontSize": 10, + "labelPadding": 4, + "tickColor": "#cbcbcb", + "tickSize": 10, + "titleColor": "#333", + "titleFontSize": 14, + "titlePadding": 10 + }, + "axisBand": { + "grid": false + }, + "background": "#f0f0f0", + "bar": { + "binSpacing": 2, + "fill": "#30a2da", + "stroke": null + }, + "legend": { + "labelColor": "#333", + "labelFontSize": 11, + "padding": 1, + "symbolSize": 30, + "symbolType": "square", + "titleColor": "#333", + "titleFontSize": 14, + "titlePadding": 10 + }, + "line": { + "stroke": "#30a2da", + "strokeWidth": 2 + }, + "point": { + "filled": true, + "shape": "circle" + }, + "range": { + "category": [ + "#30a2da", + "#fc4f30", + "#e5ae38", + "#6d904f", + "#8b8b8b", + "#b96db8", + "#ff9e27", + "#56cc60", + "#52d2ca", + "#52689e", + "#545454", + "#9fe4f8" + ], + "diverging": [ + "#cc0020", + "#e77866", + "#f6e7e1", + "#d6e8ed", + "#91bfd9", + "#1d78b5" + ], + "heatmap": [ + "#d6e8ed", + "#cee0e5", + "#91bfd9", + "#549cc6", + "#1d78b5" + ] + }, + "rect": { + "fill": "#30a2da" + }, + "title": { + "anchor": "start", + "fontSize": 24, + "fontWeight": 600, + "offset": 20 + } } }, "ggplot2": { - "arc": { - "fill": "#000" - }, - "area": { - "fill": "#000" - }, - "axis": { - "domain": false, - "grid": true, - "gridColor": "#FFFFFF", - "gridOpacity": 1, - "labelColor": "#7F7F7F", - "labelPadding": 4, - "tickColor": "#7F7F7F", - "tickSize": 5.67, - "titleFontSize": 16, - "titleFontWeight": "normal" - }, - "legend": { - "labelBaseline": "middle", - "labelFontSize": 11, - "symbolSize": 40 - }, - "line": { - "stroke": "#000" - }, - "range": { - "category": [ - "#000000", - "#7F7F7F", - "#1A1A1A", - "#999999", - "#333333", - "#B0B0B0", - "#4D4D4D", - "#C9C9C9", - "#666666", - "#DCDCDC" - ] - }, - "rect": { - "fill": "#000" + "config": { + "arc": { + "fill": "#000" + }, + "area": { + "fill": "#000" + }, + "axis": { + "domain": false, + "grid": true, + "gridColor": "#FFFFFF", + "gridOpacity": 1, + "labelColor": "#7F7F7F", + "labelPadding": 4, + "tickColor": "#7F7F7F", + "tickSize": 5.67, + "titleFontSize": 16, + "titleFontWeight": "normal" + }, + "legend": { + "labelBaseline": "middle", + "labelFontSize": 11, + "symbolSize": 40 + }, + "line": { + "stroke": "#000" + }, + "range": { + "category": [ + "#000000", + "#7F7F7F", + "#1A1A1A", + "#999999", + "#333333", + "#B0B0B0", + "#4D4D4D", + "#C9C9C9", + "#666666", + "#DCDCDC" + ] + }, + "rect": { + "fill": "#000" + } } }, "googlecharts": { - "arc": { - "fill": "#3366CC" - }, - "area": { - "fill": "#3366CC" - }, - "axis": { - "domain": false, - "grid": true, - "gridColor": "#ccc", - "tickColor": "#ccc" - }, - "background": "#fff", - "circle": { - "fill": "#3366CC" - }, - "padding": { - "bottom": 10, - "left": 10, - "right": 10, - "top": 10 - }, - "range": { - "category": [ - "#4285F4", - "#DB4437", - "#F4B400", - "#0F9D58", - "#AB47BC", - "#00ACC1", - "#FF7043", - "#9E9D24", - "#5C6BC0", - "#F06292", - "#00796B", - "#C2185B" - ], - "heatmap": [ - "#c6dafc", - "#5e97f6", - "#2a56c6" - ] - }, - "rect": { - "fill": "#3366CC" - }, - "style": { - "group-title": { - "font": "Arial, sans-serif", - "fontSize": 12 + "config": { + "arc": { + "fill": "#3366CC" }, - "guide-label": { - "font": "Arial, sans-serif", - "fontSize": 12 + "area": { + "fill": "#3366CC" + }, + "axis": { + "domain": false, + "grid": true, + "gridColor": "#ccc", + "tickColor": "#ccc" + }, + "background": "#fff", + "circle": { + "fill": "#3366CC" + }, + "padding": { + "bottom": 10, + "left": 10, + "right": 10, + "top": 10 }, - "guide-title": { + "range": { + "category": [ + "#4285F4", + "#DB4437", + "#F4B400", + "#0F9D58", + "#AB47BC", + "#00ACC1", + "#FF7043", + "#9E9D24", + "#5C6BC0", + "#F06292", + "#00796B", + "#C2185B" + ], + "heatmap": [ + "#c6dafc", + "#5e97f6", + "#2a56c6" + ] + }, + "rect": { + "fill": "#3366CC" + }, + "style": { + "group-title": { + "font": "Arial, sans-serif", + "fontSize": 12 + }, + "guide-label": { + "font": "Arial, sans-serif", + "fontSize": 12 + }, + "guide-title": { + "font": "Arial, sans-serif", + "fontSize": 12 + } + }, + "title": { + "anchor": "start", + "dy": -3, "font": "Arial, sans-serif", - "fontSize": 12 + "fontSize": 14, + "fontWeight": "bold" } - }, - "title": { - "anchor": "start", - "dy": -3, - "font": "Arial, sans-serif", - "fontSize": 14, - "fontWeight": "bold" } }, "latimes": { - "arc": { - "fill": "#82c6df" - }, - "area": { - "fill": "#82c6df" - }, - "axis": { - "labelFont": "Benton Gothic, sans-serif", - "labelFontSize": 11.5, - "labelFontWeight": "normal", - "titleFont": "Benton Gothic Bold, sans-serif", - "titleFontSize": 13, - "titleFontWeight": "normal" - }, - "axisX": { - "labelAngle": 0, - "labelPadding": 4, - "tickSize": 3 - }, - "axisY": { - "labelBaseline": "middle", - "maxExtent": 45, - "minExtent": 45, - "tickSize": 2, - "titleAlign": "left", - "titleAngle": 0, - "titleX": -45, - "titleY": -11 - }, - "background": "#ffffff", - "legend": { - "labelFont": "Benton Gothic, sans-serif", - "labelFontSize": 11.5, - "symbolType": "square", - "titleFont": "Benton Gothic Bold, sans-serif", - "titleFontSize": 13, - "titleFontWeight": "normal" - }, - "line": { - "stroke": "#82c6df", - "strokeWidth": 2 - }, - "range": { - "category": [ - "#ec8431", - "#829eb1", - "#c89d29", - "#3580b1", - "#adc839", - "#ab7fb4" - ], - "diverging": [ - "#e68a4f", - "#f4bb6a", - "#f9e39c", - "#dadfe2", - "#a6b7c6", - "#849eae" - ], - "heatmap": [ - "#fbf2c7", - "#f9e39c", - "#f8d36e", - "#f4bb6a", - "#e68a4f", - "#d15a40", - "#ab4232" - ], - "ordinal": [ - "#fbf2c7", - "#f9e39c", - "#f8d36e", - "#f4bb6a", - "#e68a4f", - "#d15a40", - "#ab4232" - ], - "ramp": [ - "#fbf2c7", - "#f9e39c", - "#f8d36e", - "#f4bb6a", - "#e68a4f", - "#d15a40", - "#ab4232" - ] - }, - "rect": { - "fill": "#82c6df" - }, - "title": { - "anchor": "start", - "color": "#000000", - "font": "Benton Gothic Bold, sans-serif", - "fontSize": 22, - "fontWeight": "normal" + "config": { + "arc": { + "fill": "#82c6df" + }, + "area": { + "fill": "#82c6df" + }, + "axis": { + "labelFont": "Benton Gothic, sans-serif", + "labelFontSize": 11.5, + "labelFontWeight": "normal", + "titleFont": "Benton Gothic Bold, sans-serif", + "titleFontSize": 13, + "titleFontWeight": "normal" + }, + "axisX": { + "labelAngle": 0, + "labelPadding": 4, + "tickSize": 3 + }, + "axisY": { + "labelBaseline": "middle", + "maxExtent": 45, + "minExtent": 45, + "tickSize": 2, + "titleAlign": "left", + "titleAngle": 0, + "titleX": -45, + "titleY": -11 + }, + "background": "#ffffff", + "legend": { + "labelFont": "Benton Gothic, sans-serif", + "labelFontSize": 11.5, + "symbolType": "square", + "titleFont": "Benton Gothic Bold, sans-serif", + "titleFontSize": 13, + "titleFontWeight": "normal" + }, + "line": { + "stroke": "#82c6df", + "strokeWidth": 2 + }, + "range": { + "category": [ + "#ec8431", + "#829eb1", + "#c89d29", + "#3580b1", + "#adc839", + "#ab7fb4" + ], + "diverging": [ + "#e68a4f", + "#f4bb6a", + "#f9e39c", + "#dadfe2", + "#a6b7c6", + "#849eae" + ], + "heatmap": [ + "#fbf2c7", + "#f9e39c", + "#f8d36e", + "#f4bb6a", + "#e68a4f", + "#d15a40", + "#ab4232" + ], + "ordinal": [ + "#fbf2c7", + "#f9e39c", + "#f8d36e", + "#f4bb6a", + "#e68a4f", + "#d15a40", + "#ab4232" + ], + "ramp": [ + "#fbf2c7", + "#f9e39c", + "#f8d36e", + "#f4bb6a", + "#e68a4f", + "#d15a40", + "#ab4232" + ] + }, + "rect": { + "fill": "#82c6df" + }, + "title": { + "anchor": "start", + "color": "#000000", + "font": "Benton Gothic Bold, sans-serif", + "fontSize": 22, + "fontWeight": "normal" + } } }, "powerbi": { - "arc": { - "fill": "#118DFF" - }, - "area": { - "fill": "#118DFF", - "line": true, - "opacity": 0.6 - }, - "axis": { - "domain": false, - "grid": false, - "labelColor": "#605E5C", - "labelFontSize": 12, - "ticks": false, - "titleColor": "#252423", - "titleFont": "wf_standard-font, helvetica, arial, sans-serif", - "titleFontSize": 16, - "titleFontWeight": "normal" - }, - "axisBand": { - "tickExtra": true - }, - "axisQuantitative": { - "grid": true, - "gridColor": "#C8C6C4", - "gridDash": [ - 1, - 5 - ], - "labelFlush": false, - "tickCount": 3 - }, - "axisX": { - "labelPadding": 5 - }, - "axisY": { - "labelPadding": 10 - }, - "background": "transparent", - "bar": { - "fill": "#118DFF" - }, - "font": "Segoe UI", - "header": { - "labelColor": "#605E5C", - "labelFont": "Segoe UI", - "labelFontSize": 13.333333333333332, - "titleColor": "#252423", - "titleFont": "wf_standard-font, helvetica, arial, sans-serif", - "titleFontSize": 16 - }, - "legend": { - "labelColor": "#605E5C", - "labelFont": "Segoe UI", - "labelFontSize": 13.333333333333332, - "symbolSize": 75, - "symbolType": "circle", - "titleColor": "#605E5C", - "titleFont": "Segoe UI", - "titleFontWeight": "bold" - }, - "line": { - "stroke": "#118DFF", - "strokeCap": "round", - "strokeJoin": "round", - "strokeWidth": 3 - }, - "point": { - "fill": "#118DFF", - "filled": true, - "size": 75 - }, - "range": { - "category": [ - "#118DFF", - "#12239E", - "#E66C37", - "#6B007B", - "#E044A7", - "#744EC2", - "#D9B300", - "#D64550" - ], - "diverging": [ - "#DEEFFF", - "#118DFF" - ], - "heatmap": [ - "#DEEFFF", - "#118DFF" - ], - "ordinal": [ - "#DEEFFF", - "#c7e4ff", - "#b0d9ff", - "#9aceff", - "#83c3ff", - "#6cb9ff", - "#55aeff", - "#3fa3ff", - "#2898ff", - "#118DFF" - ] - }, - "rect": { - "fill": "#118DFF" - }, - "text": { - "fill": "#605E5C", + "config": { + "arc": { + "fill": "#118DFF" + }, + "area": { + "fill": "#118DFF", + "line": true, + "opacity": 0.6 + }, + "axis": { + "domain": false, + "grid": false, + "labelColor": "#605E5C", + "labelFontSize": 12, + "ticks": false, + "titleColor": "#252423", + "titleFont": "wf_standard-font, helvetica, arial, sans-serif", + "titleFontSize": 16, + "titleFontWeight": "normal" + }, + "axisBand": { + "tickExtra": true + }, + "axisQuantitative": { + "grid": true, + "gridColor": "#C8C6C4", + "gridDash": [ + 1, + 5 + ], + "labelFlush": false, + "tickCount": 3 + }, + "axisX": { + "labelPadding": 5 + }, + "axisY": { + "labelPadding": 10 + }, + "background": "transparent", + "bar": { + "fill": "#118DFF" + }, "font": "Segoe UI", - "fontSize": 12 - }, - "view": { - "stroke": "transparent" + "header": { + "labelColor": "#605E5C", + "labelFont": "Segoe UI", + "labelFontSize": 13.333333333333332, + "titleColor": "#252423", + "titleFont": "wf_standard-font, helvetica, arial, sans-serif", + "titleFontSize": 16 + }, + "legend": { + "labelColor": "#605E5C", + "labelFont": "Segoe UI", + "labelFontSize": 13.333333333333332, + "symbolSize": 75, + "symbolType": "circle", + "titleColor": "#605E5C", + "titleFont": "Segoe UI", + "titleFontWeight": "bold" + }, + "line": { + "stroke": "#118DFF", + "strokeCap": "round", + "strokeJoin": "round", + "strokeWidth": 3 + }, + "point": { + "fill": "#118DFF", + "filled": true, + "size": 75 + }, + "range": { + "category": [ + "#118DFF", + "#12239E", + "#E66C37", + "#6B007B", + "#E044A7", + "#744EC2", + "#D9B300", + "#D64550" + ], + "diverging": [ + "#DEEFFF", + "#118DFF" + ], + "heatmap": [ + "#DEEFFF", + "#118DFF" + ], + "ordinal": [ + "#DEEFFF", + "#c7e4ff", + "#b0d9ff", + "#9aceff", + "#83c3ff", + "#6cb9ff", + "#55aeff", + "#3fa3ff", + "#2898ff", + "#118DFF" + ] + }, + "rect": { + "fill": "#118DFF" + }, + "text": { + "fill": "#605E5C", + "font": "Segoe UI", + "fontSize": 12 + }, + "view": { + "stroke": "transparent" + } } }, "quartz": { - "arc": { - "fill": "#ab5787" - }, - "area": { - "fill": "#ab5787" - }, - "axis": { - "domainColor": "#979797", - "domainWidth": 0.5, - "gridWidth": 0.2, - "labelColor": "#979797", - "tickColor": "#979797", - "tickWidth": 0.2, - "titleColor": "#979797" - }, - "axisBand": { - "grid": false - }, - "axisX": { - "grid": true, - "tickSize": 10 - }, - "axisY": { - "domain": false, - "grid": true, - "tickSize": 0 - }, - "background": "#f9f9f9", - "legend": { - "labelFontSize": 11, - "padding": 1, - "symbolSize": 30, - "symbolType": "square" - }, - "line": { - "stroke": "#ab5787" - }, - "range": { - "category": [ - "#ab5787", - "#51b2e5", - "#703c5c", - "#168dd9", - "#d190b6", - "#00609f", - "#d365ba", - "#154866", - "#666666", - "#c4c4c4" - ] - }, - "rect": { - "fill": "#ab5787" + "config": { + "arc": { + "fill": "#ab5787" + }, + "area": { + "fill": "#ab5787" + }, + "axis": { + "domainColor": "#979797", + "domainWidth": 0.5, + "gridWidth": 0.2, + "labelColor": "#979797", + "tickColor": "#979797", + "tickWidth": 0.2, + "titleColor": "#979797" + }, + "axisBand": { + "grid": false + }, + "axisX": { + "grid": true, + "tickSize": 10 + }, + "axisY": { + "domain": false, + "grid": true, + "tickSize": 0 + }, + "background": "#f9f9f9", + "legend": { + "labelFontSize": 11, + "padding": 1, + "symbolSize": 30, + "symbolType": "square" + }, + "line": { + "stroke": "#ab5787" + }, + "range": { + "category": [ + "#ab5787", + "#51b2e5", + "#703c5c", + "#168dd9", + "#d190b6", + "#00609f", + "#d365ba", + "#154866", + "#666666", + "#c4c4c4" + ] + }, + "rect": { + "fill": "#ab5787" + } } }, "urbaninstitute": { - "arc": { - "fill": "#1696d2" - }, - "area": { - "fill": "#1696d2" - }, - "axisX": { - "domain": true, - "domainColor": "#000000", - "domainWidth": 1, - "grid": false, - "labelAngle": 0, - "labelFont": "Lato", - "labelFontSize": 12, - "tickColor": "#000000", - "tickSize": 5, - "titleFont": "Lato", - "titleFontSize": 12, - "titlePadding": 10 - }, - "axisY": { - "domain": false, - "domainWidth": 1, - "grid": true, - "gridColor": "#DEDDDD", - "gridWidth": 1, - "labelFont": "Lato", - "labelFontSize": 12, - "labelPadding": 8, - "ticks": false, - "titleAngle": 0, - "titleFont": "Lato", - "titleFontSize": 12, - "titlePadding": 10, - "titleX": 18, - "titleY": -10 - }, - "background": "#FFFFFF", - "legend": { - "labelFont": "Lato", - "labelFontSize": 12, - "offset": 10, - "orient": "right", - "symbolSize": 100, - "titleFont": "Lato", - "titleFontSize": 12, - "titlePadding": 10 - }, - "line": { - "color": "#1696d2", - "stroke": "#1696d2", - "strokeWidth": 5 - }, - "point": { - "filled": true - }, - "range": { - "category": [ - "#1696d2", - "#ec008b", - "#fdbf11", - "#000000", - "#d2d2d2", - "#55b748" - ], - "diverging": [ - "#ca5800", - "#fdbf11", - "#fdd870", - "#fff2cf", - "#cfe8f3", - "#73bfe2", - "#1696d2", - "#0a4c6a" - ], - "heatmap": [ - "#ca5800", - "#fdbf11", - "#fdd870", - "#fff2cf", - "#cfe8f3", - "#73bfe2", - "#1696d2", - "#0a4c6a" - ], - "ordinal": [ - "#cfe8f3", - "#a2d4ec", - "#73bfe2", - "#46abdb", - "#1696d2", - "#12719e" - ], - "ramp": [ - "#CFE8F3", - "#A2D4EC", - "#73BFE2", - "#46ABDB", - "#1696D2", - "#12719E", - "#0A4C6A", - "#062635" - ] - }, - "rect": { - "fill": "#1696d2" - }, - "style": { - "bar": { - "fill": "#1696d2", - "stroke": null + "config": { + "arc": { + "fill": "#1696d2" + }, + "area": { + "fill": "#1696d2" + }, + "axisX": { + "domain": true, + "domainColor": "#000000", + "domainWidth": 1, + "grid": false, + "labelAngle": 0, + "labelFont": "Lato", + "labelFontSize": 12, + "tickColor": "#000000", + "tickSize": 5, + "titleFont": "Lato", + "titleFontSize": 12, + "titlePadding": 10 + }, + "axisY": { + "domain": false, + "domainWidth": 1, + "grid": true, + "gridColor": "#DEDDDD", + "gridWidth": 1, + "labelFont": "Lato", + "labelFontSize": 12, + "labelPadding": 8, + "ticks": false, + "titleAngle": 0, + "titleFont": "Lato", + "titleFontSize": 12, + "titlePadding": 10, + "titleX": 18, + "titleY": -10 + }, + "background": "#FFFFFF", + "legend": { + "labelFont": "Lato", + "labelFontSize": 12, + "offset": 10, + "orient": "right", + "symbolSize": 100, + "titleFont": "Lato", + "titleFontSize": 12, + "titlePadding": 10 + }, + "line": { + "color": "#1696d2", + "stroke": "#1696d2", + "strokeWidth": 5 + }, + "point": { + "filled": true + }, + "range": { + "category": [ + "#1696d2", + "#ec008b", + "#fdbf11", + "#000000", + "#d2d2d2", + "#55b748" + ], + "diverging": [ + "#ca5800", + "#fdbf11", + "#fdd870", + "#fff2cf", + "#cfe8f3", + "#73bfe2", + "#1696d2", + "#0a4c6a" + ], + "heatmap": [ + "#ca5800", + "#fdbf11", + "#fdd870", + "#fff2cf", + "#cfe8f3", + "#73bfe2", + "#1696d2", + "#0a4c6a" + ], + "ordinal": [ + "#cfe8f3", + "#a2d4ec", + "#73bfe2", + "#46abdb", + "#1696d2", + "#12719e" + ], + "ramp": [ + "#CFE8F3", + "#A2D4EC", + "#73BFE2", + "#46ABDB", + "#1696D2", + "#12719E", + "#0A4C6A", + "#062635" + ] + }, + "rect": { + "fill": "#1696d2" + }, + "style": { + "bar": { + "fill": "#1696d2", + "stroke": null + } + }, + "text": { + "align": "center", + "color": "#1696d2", + "font": "Lato", + "fontSize": 11, + "fontWeight": 400, + "size": 11 + }, + "title": { + "anchor": "start", + "font": "Lato", + "fontSize": 18 + }, + "trail": { + "color": "#1696d2", + "size": 1, + "stroke": "#1696d2", + "strokeWidth": 0 + }, + "view": { + "stroke": "transparent" } - }, - "text": { - "align": "center", - "color": "#1696d2", - "font": "Lato", - "fontSize": 11, - "fontWeight": 400, - "size": 11 - }, - "title": { - "anchor": "start", - "font": "Lato", - "fontSize": 18 - }, - "trail": { - "color": "#1696d2", - "size": 1, - "stroke": "#1696d2", - "strokeWidth": 0 - }, - "view": { - "stroke": "transparent" } }, "vox": { - "arc": { - "fill": "#3e5c69" - }, - "area": { - "fill": "#3e5c69" - }, - "axis": { - "domainWidth": 0.5, - "grid": true, - "labelPadding": 2, - "tickSize": 5, - "tickWidth": 0.5, - "titleFontWeight": "normal" - }, - "axisBand": { - "grid": false - }, - "axisX": { - "gridWidth": 0.2 - }, - "axisY": { - "gridDash": [ - 3 - ], - "gridWidth": 0.4 - }, - "background": "#fff", - "legend": { - "labelFontSize": 11, - "padding": 1, - "symbolType": "square" - }, - "line": { - "stroke": "#3e5c69" - }, - "range": { - "category": [ - "#3e5c69", - "#6793a6", - "#182429", - "#0570b0", - "#3690c0", - "#74a9cf", - "#a6bddb", - "#e2ddf2" - ] - }, - "rect": { - "fill": "#3e5c69" + "config": { + "arc": { + "fill": "#3e5c69" + }, + "area": { + "fill": "#3e5c69" + }, + "axis": { + "domainWidth": 0.5, + "grid": true, + "labelPadding": 2, + "tickSize": 5, + "tickWidth": 0.5, + "titleFontWeight": "normal" + }, + "axisBand": { + "grid": false + }, + "axisX": { + "gridWidth": 0.2 + }, + "axisY": { + "gridDash": [ + 3 + ], + "gridWidth": 0.4 + }, + "background": "#fff", + "legend": { + "labelFontSize": 11, + "padding": 1, + "symbolType": "square" + }, + "line": { + "stroke": "#3e5c69" + }, + "range": { + "category": [ + "#3e5c69", + "#6793a6", + "#182429", + "#0570b0", + "#3690c0", + "#74a9cf", + "#a6bddb", + "#e2ddf2" + ] + }, + "rect": { + "fill": "#3e5c69" + } } } } \ No newline at end of file diff --git a/tests/vegalite/v5/test_theme.py b/tests/vegalite/v5/test_theme.py index da7c134ba..45eda9637 100644 --- a/tests/vegalite/v5/test_theme.py +++ b/tests/vegalite/v5/test_theme.py @@ -1,23 +1,41 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Callable, cast +import json +from collections.abc import Mapping, Set +from pathlib import Path +from typing import TYPE_CHECKING, Any, Callable, Literal, TypeVar, cast, get_args import pytest import altair.vegalite.v5 as alt from altair import theme from altair.theme import ConfigKwds, ThemeConfig -from altair.vegalite.v5.schema._typing import is_color_hex +from altair.vegalite.v5 import schema +from altair.vegalite.v5.schema._typing import VegaThemes, is_color_hex from altair.vegalite.v5.theme import VEGA_THEMES from tests import slow if TYPE_CHECKING: import sys + if sys.version_info >= (3, 13): + from typing import TypeIs + else: + from typing_extensions import TypeIs if sys.version_info >= (3, 11): from typing import LiteralString else: from typing_extensions import LiteralString + if sys.version_info >= (3, 10): + from typing import TypeAlias + else: + from typing_extensions import TypeAlias + +T = TypeVar("T") + +_Config: TypeAlias = Literal["config"] +_PartialThemeConfig: TypeAlias = Mapping[_Config, ConfigKwds] +"""Represents ``ThemeConfig``, but **only** using the ``"config"`` key.""" @pytest.fixture @@ -1043,3 +1061,67 @@ def test_theme_config(theme_func: Callable[[], ThemeConfig], chart) -> None: theme.register(name, enable=True)(theme_func) assert chart.to_dict(validate=True) assert theme.get() == theme_func + + +# NOTE: There are roughly 70 keys +# - not really reasonable to create a literal that long for testing only +# - therefore, using `frozenset[str]` +@pytest.fixture(scope="session") +def config_keys() -> frozenset[str]: + return ConfigKwds.__required_keys__.union( + ConfigKwds.__optional_keys__, + ConfigKwds.__readonly_keys__, # type: ignore[attr-defined] + ConfigKwds.__mutable_keys__, # type: ignore[attr-defined] + ) + + +@pytest.fixture(scope="session") +def theme_name_keys() -> frozenset[VegaThemes]: + return frozenset(get_args(VegaThemes)) + + +@pytest.fixture(scope="session") +def themes_path() -> Path: + return Path(schema.__file__).parent / "vega-themes.json" + + +def is_keyed_exact(obj: Any, other: Set[T]) -> TypeIs[Mapping[T, Any]]: + return isinstance(obj, Mapping) and obj.keys() == other + + +def is_config_kwds(obj: Any, other: Any) -> TypeIs[ConfigKwds]: + return isinstance(obj, Mapping) and obj.keys() <= other + + +def is_vega_theme(obj: Any, config_keys: Any) -> TypeIs[_PartialThemeConfig]: + if is_keyed_exact(obj, frozenset[_Config]({"config"})): + inner = obj["config"] + return is_config_kwds(inner, config_keys) + else: + return False + + +def is_vega_theme_all( + obj: Any, theme_name_keys: frozenset[VegaThemes], config_keys: frozenset[str] +) -> TypeIs[Mapping[VegaThemes, _PartialThemeConfig]]: + return is_keyed_exact(obj, theme_name_keys) and all( + is_vega_theme(definition, config_keys) for definition in obj.values() + ) + + +def test_vendored_vega_themes_json( + themes_path: Path, + theme_name_keys: frozenset[VegaThemes], + config_keys: frozenset[str], +) -> None: + """ + Ensure every vendored theme can be represented as a ``ThemeConfig`` type. + + Related + ------- + - https://github.com/vega/altair/issues/3666#issuecomment-2450057530 + """ + with themes_path.open(encoding="utf-8") as f: + content = json.load(f) + + assert is_vega_theme_all(content, theme_name_keys, config_keys) diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py index e0e7a4d54..f68771e52 100644 --- a/tools/generate_schema_wrapper.py +++ b/tools/generate_schema_wrapper.py @@ -564,10 +564,14 @@ def download_schemafile( def _vega_lite_props_only( themes: dict[VegaThemes, dict[str, Any]], props: SchemaProperties, / ) -> Iterator[tuple[VegaThemes, dict[str, Any]]]: - """Removes properties that are allowed in `Vega` but not `Vega-Lite` from theme definitions.""" + """ + Removes properties that are allowed in `Vega` but not `Vega-Lite` from theme definitions. + + Each theme is then nested as ``ThemeConfig["config"] = ...`` + """ keep = props.keys() for name, theme_spec in themes.items(): - yield name, {k: v for k, v in theme_spec.items() if k in keep} + yield name, {"config": {k: v for k, v in theme_spec.items() if k in keep}} def update_vega_themes(fp: Path, /, indent: str | int | None = 2) -> None: