<jupyter_start><jupyter_text>`ipydatagrid` allows for an incredible level of style customisation!Styling can be applied on three layers:1. Default renderers: header (columns), corner (top left corner) and default (body)2. Overall grid style: a set of attributes that can be applied directly to the grid *without* the need for a specific renderer3. Column-specific renderersThe default renderers which you can apply to the DataGrid are `default_renderer`, `header_renderer` and `corner_renderer`.The grid style property can be defined via `grid_style`. **Overall grid styles take medium priority and will override default renderer styles!** The available properties are listed below:1. `void_color`: color of the area where the grid is not painted on the canvas2. `background_color`: background color for all body cells3. `row_background_color`: row-wise background color (takes a Vega Expression)4. `column_background_color`: column-wise background color (takes a Vega Expression)5. `grid_line_color`: color of both vertical and horizontal grid lines6. `vertical_grid_line_color`: vertical grid line color7. `horizontal_grid_line_color`: horizontal grid line color8. `header_background_color`: background color for all non-body cells (index and columns)9. `header_grid_line_color`: grid line color for all non-body cells (index and columns)10. `header_vertical_grid_line_color`: vertical grid line color for all non-body cells11. `header_horizontal_grid_line_color`: horizontal grid line color for all non-body cells12. `selection_fill_color`: fill color of selected area selection_border_color : border color of selected area13. `header_selection_fill_color`: fill color of headers intersecting with selected area at column or row14. `header_selection_border_color`: border color of headers intersecting with selected area at column or row15. `cursor_fill_color`: fill color of cursor16. `cursor_border_color`: border color of cursor17. `scroll_shadow` : Dict of color parameters for scroll shadow (vertical and horizontal). Takes three paramaters:    * `size` : size of shadow in pixels    * `color1` : gradient color 1    * `color2` : gradient color 2    * `color3` : gradient color 3Column specific renderers can be specified via the `renderers` property which takes a key corresponding to the column name, and `TextRenderer` or `BarRenderer` as value. **Column-specific renderers take the highest priority and will override `grid_style` properties.**<jupyter_code>import pandas as pd
import numpy as np
import ipydatagrid as grid

np.random.seed(104)
rang = 10
df = pd.DataFrame(
    data=[np.random.randint(0, 11, rang) for i in range(rang)],
    index=[f"Row {i}" for i in range(rang)],
    columns=[f"Col {i}" for i in range(rang)],
)

g = grid.DataGrid(
    df, layout={"height": "300px", "width": "800px"}, selection_mode="cell"
)
g<jupyter_output><empty_output><jupyter_text>Monokai-based theme for dark backgroundsUsing only top-level grid styling without custom renderers<jupyter_code>monokai = {
    "background_color": "#2c292d",
    "grid_line_color": "#a698eb7a",
    "header_background_color": "#2c292d9a",
    "header_grid_line_color": "#fc98675a",
    "selection_fill_color": "#78dce81a",
    "selection_border_color": "#ffd866",
    "header_selection_fill_color": "#ab9df24a",
    "header_selection_border_color": "lawngreen",
    "cursor_fill_color": "#78dce87a",
    "cursor_border_color": "#ff6188",
}

g.grid_style = monokai<jupyter_output><empty_output><jupyter_text>Cotton candy theme for light backgrounds<jupyter_code>cotton_candy = {
    "background_color": "rgb(255, 245, 251)",
    "header_background_color": "rgb(207, 212, 252, 1)",
    "header_grid_line_color": "rgb(0, 247, 181, 0.9)",
    "vertical_grid_line_color": "rgb(0, 247, 181, 0.3)",
    "horizontal_grid_line_color": "rgb(0, 247, 181, 0.3)",
    "selection_fill_color": "rgb(212, 245, 255, 0.3)",
    "selection_border_color": "rgb(78, 174, 212)",
    "header_selection_fill_color": "rgb(212, 255, 239, 0.3)",
    "header_selection_border_color": "rgb(252, 3, 115)",
    "cursor_fill_color": "rgb(186, 32, 186, 0.2)",
    "cursor_border_color": "rgb(191, 191, 78)",
}

g.grid_style = cotton_candy<jupyter_output><empty_output><jupyter_text>Watermelon themed gridCombining custom renderers and top level grid styling<jupyter_code>watermelon = {
    "column_background_color": grid.VegaExpr(
        "cell % 2 === 0 ? 'rgb(255, 130, 145, 0.5)' : 'rgb(255, 130, 145, 0.2)'"
    ),
    "header_vertical_grid_line_color": "rgb(0, 140, 86, 0.8)",
    "header_horizontal_grid_line_color": "rgb(0, 140, 86, 0.4)",
    "vertical_grid_line_color": "rgb(176, 176, 176)",
    "horizontal_grid_line_color": "rgb(0, 247, 181, 0)",
    "selection_fill_color": "rgb(235, 223, 7, 0.3)",
    "selection_border_color": "rgb(201, 219, 7)",
    "header_selection_fill_color": "rgb(235, 223, 7, 0.4)",
    "header_selection_border_color": "rgb(252, 3, 115)",
    "cursor_fill_color": "rgb(235, 7, 113, 0.4)",
    "cursor_border_color": "rgb(6, 191, 58, 0.9)",
}


g.grid_style = watermelon
g.corner_renderer = grid.TextRenderer(
    background_color="rgb(250, 242, 130)", text_color="black"
)
g.header_renderer = grid.TextRenderer(
    background_color=grid.VegaExpr(
        "cell.column % 2 === 0 ? 'rgb(34, 110, 29)': 'rgb(24, 150, 19)'"
    ),
    text_color="white",
)
g.renderers = {
    "index": grid.TextRenderer(
        background_color=grid.VegaExpr(
            "cell.row % 2 === 0 ? 'rgb(21, 116, 163)': 'rgb(21, 116, 163)'"
        ),
        text_color="white",
    )
}<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12475389296581349, 'fraction_numerical': 0.05978163594057634, 'mean_word_length': 5.22271714922049, 'pattern_counts': {'":': 35, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '216564', 'license': 'BSD-3-Clause', 'n_tokens_mistral': 2072, 'n_tokens_neox': 1798, 'n_words': 540, 'path': 'examples/Themes.ipynb', 'repo_name': 'jdhalimi/ipydatagrid', 'size': '5587'}