From cb119b7399f9d987d52387c329c07fe66abe274a Mon Sep 17 00:00:00 2001 From: lgaliana Date: Sat, 23 Aug 2025 19:33:42 +0000 Subject: [PATCH 1/4] strip notebooks --- .github/workflows/prod.yml | 2 +- .../01_matplotlib/_exo4_solution.qmd | 6 +- .../visualisation/01_matplotlib/_plotnine.qmd | 3 +- content/visualisation/matplotlib.qmd | 121 +++++++----------- pyproject.toml | 5 + uv.lock | 20 +++ 6 files changed, 75 insertions(+), 82 deletions(-) diff --git a/.github/workflows/prod.yml b/.github/workflows/prod.yml index cde27c295..fd3cc35ee 100644 --- a/.github/workflows/prod.yml +++ b/.github/workflows/prod.yml @@ -4,7 +4,7 @@ on: push: branches: - main - - fix-nb + - issue-632 jobs: pages: diff --git a/content/visualisation/01_matplotlib/_exo4_solution.qmd b/content/visualisation/01_matplotlib/_exo4_solution.qmd index c995ca819..44fa90b09 100644 --- a/content/visualisation/01_matplotlib/_exo4_solution.qmd +++ b/content/visualisation/01_matplotlib/_exo4_solution.qmd @@ -193,19 +193,20 @@ Here, there are few parameters to modify since our scales already suit us well ( ::: -::: {.content-visible when-profile="en"} +::: {.content-visible when-profile="fr"} ## Les labels et les thèmes La fin de la déclaration de notre figure se fait à travers les éléments de forme que sont les labels (axes, titres, notes de lecture...) et le thème (préconfiguré à travers la famille `theme_` ou personnalisé avec les paramètres de la fonction `theme`). Avant cela, réduisons la taille de nos labels de $y$ ::: -::: {.content-visible when-profile="fr"} +::: {.content-visible when-profile="en"} ## Labels and themes The final declaration of our figure is done using the formal elements that are labels (axes, titles, reading notes, etc.) and the theme (preconfigured through the `theme_` family or customised with the parameters of the `theme` function). Before that, let's reduce the size of our labels by $y$ ::: ```{python} +#| echo: true import textwrap def wrap_label(s, width=30): @@ -226,6 +227,7 @@ We can now customise our figure: #| label: fig-gg5-fr-showed #| output: false #| echo: true + p = ( ggplot(df1, aes(x="nom_compteur", y="sum_counts")) + geom_bar(stat="identity", fill="red") + diff --git a/content/visualisation/01_matplotlib/_plotnine.qmd b/content/visualisation/01_matplotlib/_plotnine.qmd index a18fbbcde..f36934c5f 100644 --- a/content/visualisation/01_matplotlib/_plotnine.qmd +++ b/content/visualisation/01_matplotlib/_plotnine.qmd @@ -43,7 +43,8 @@ We will need hierarchical data to have bars ordered in a consistent manner: #| echo: true df1["nom_compteur"] = pd.Categorical( df1["nom_compteur"], - categories = df1["nom_compteur"][::-1] + categories = df1["nom_compteur"][::-1], + ordered=True ) ``` diff --git a/content/visualisation/matplotlib.qmd b/content/visualisation/matplotlib.qmd index cf5d3bc6d..230184c39 100644 --- a/content/visualisation/matplotlib.qmd +++ b/content/visualisation/matplotlib.qmd @@ -447,18 +447,18 @@ gt_dark ```{python} #| echo: false -#| renderings: [light, dark] #| label: tbl-gt #| tbl-cap: Visualisation alternative sous forme de table +#| renderings: [light, dark] -gt_light.show() -gt_dark.show() +gt_light +gt_dark ``` ::: {.content-visible when-profile="fr"} -# Des graphiques réactifs grâce aux librairies `Javascript` +# Des graphiques réactifs grâce aux interfaces avec `Javascript` ::: {.callout-important} On appelle _tooltip_ le texte qui s'affiche en surbrillance lorsqu'on passe la souris sur un élément de la figure (ordinateur) ou lorsqu'on clique sur la figure (smartphone). Il s'agit donc d'un niveau d'information supplémentaire permis par l'interactivité, qui peut être pratique pour alléger le message principal d'une figure. @@ -477,7 +477,7 @@ Bref, vous qui entrez dans le monde de la visualisation, laissez toute espéranc ## L'écosystème disponible depuis `Python` -Les figures figées construites avec `matplotlib` ou `plotnine` sont figées et présentent ainsi l'inconvénient de ne pas permettre d'interaction avec le lecteur. Toute l'information doit donc être contenue dans la figure, ce qui peut la rendre difficile à lire. Si la figure est bien faite, avec différents niveaux d'information, cela peut bien fonctionner. +Les figures construites avec `matplotlib` ou `plotnine` sont figées et présentent ainsi l'inconvénient de ne pas permettre d'interaction avec le lecteur. Toute l'information doit donc être contenue dans la figure, ce qui peut la rendre difficile à lire. Si la figure est bien faite, avec différents niveaux d'information, cela peut bien fonctionner. Il est néanmoins plus simple, grâce aux technologies _web_, de proposer des visualisations à plusieurs niveaux. Un premier niveau d'information, celui du coup d'œil, peut suffire à assimiler les principaux messages de la visualisation. Ensuite, un comportement plus volontaire de recherche d'information secondaire peut permettre d'en savoir plus. Les visualisations réactives, qui sont maintenant la norme dans le monde de la _dataviz_, permettent ce type d'approche : le lecteur d'une visualisation peut passer sa souris à la recherche d'informations complémentaires (par exemple, les valeurs exactes) ou cliquer pour faire apparaître des informations complémentaires sur la visualisation ou autour. @@ -492,10 +492,10 @@ L'interactivité ne doit pas juste être un gadget n'apportant pas de lisibilit ::: {.content-visible when-profile="en"} -# Reactive Charts with `Javascript` Libraries +# Reactive charts with `Javascript` wrappers ::: {.callout-important} -A *tooltip* is the text that appears when hovering over an element in a chart on a computer, or when tapping on it on a smartphone. It adds an extra layer of information through interactivity and can be a useful way to declutter the main message of a visualization. +A *tooltip* is a text that appears when hovering over an element in a chart on a computer, or when tapping on it on a smartphone. It adds an extra layer of information through interactivity and can be a useful way to declutter the main message of a visualization. That said, like any element of a chart, a tooltip requires thoughtful design to be effective. The default tooltips provided by visualization libraries are rarely sufficient. You need to consider what message the tooltip should convey as a textual complement to the visual data shown in the chart. @@ -563,7 +563,7 @@ import plotly.express as px ::: ::: {.content-visible when-profile="en"} -## The `Plotly` Library +## The `Plotly` library The `Plotly` package is a wrapper for the `Javascript` library `Plotly.js`, allowing for the creation and manipulation of graphical objects very flexibly to produce interactive objects without the need for Javascript. @@ -611,9 +611,10 @@ L'objectif est de reconstruire le premier diagramme en barre rouge avec `Plotly` * Ne pas prendre le thème par défaut mais un à fond blanc, pour avoir un résultat ressemblant à celui proposé sur le site de l'*open-data*. * Pour la couleur rouge, vous pouvez utiliser l'argument `color_discrete_sequence`. * Ne pas oublier de nommer les axes. - * Pensez à la couleur du texte de l'axe inférieur. -2. Tester un autre thème, à fond sombre. Pour les couleurs, faire un groupe stockant les trois plus fortes valeurs puis les autres. +2. Modifier le texte apparaissant en surbrillance (_hover text_). + +3. Choisir un fond blanc ou noir pour avoir une couleur de fond uniforme. ::: @@ -631,111 +632,75 @@ The goal is to recreate the first red bar chart using `Plotly`. * Do not use the default theme but one with a white background to achieve a result similar to that on the *open-data* site. * Use the `color_discrete_sequence` argument for the red color. * Remember to label the axes. - * Consider the text color for the lower axis. -2. Try another theme with a dark background. For colors, group the three highest values together and separate the others. +2. Modify the hover text. + +3. Choose a white or a dark theme and use appropriate options. ::: :::: -::: {.content-visible when-profile="fr"} ```{python} #| output: false +#| label: plotly-base # 1. Graphique avec fond blanc fig = px.bar( df1.sort_values('sum_counts', ascending=True), orientation='h', x='sum_counts', - y='nom_compteur', color_discrete_sequence=["red"], template="plotly_white" + y='nom_compteur', + color_discrete_sequence=["red"], + template="plotly_white", ) fig.update_layout( - title='Les 10 compteurs avec la moyenne horaire la plus élevée', - xaxis_title='Moyenne du comptage par heure sur la période sélectionnée') -fig.update_xaxes(title_font=dict(color='red')) + title=title, + xaxis_title=xaxis, + yaxis_title=yaxis + ) + +fig.update_layout(barmode='stack', yaxis={'categoryorder':'total ascending'}) ``` ```{python} #| output: false -# 2. Graphique avec thème sombre -df1['top'] = df1['sum_counts'] > df1.sort_values('sum_counts', ascending=False)['sum_counts'][3] -fig2 = px.bar( - df1.sort_values('sum_counts', ascending=True), orientation='h', x='sum_counts', - y='nom_compteur', color='top', # attention, l'argument color ne semble pas toujours fonctionner - template="plotly_dark", - color_discrete_sequence=['red','green'] -) -fig2.update_layout( - title='Les 10 compteurs avec la moyenne horaire la plus élevée', - xaxis_title='Moyenne du comptage par heure sur la période sélectionnée' +fig.update_traces( + hovertemplate="%{y}
Moyenne horaire: %{x:.1f}" ) ``` -::: -::: {.content-visible when-profile="en"} ```{python} +#| label: plotly-dark #| output: false -# 1. Chart with white background -fig = px.bar( +fig_dark = px.bar( df1.sort_values('sum_counts', ascending=True), orientation='h', x='sum_counts', - y='nom_compteur', color_discrete_sequence=["red"], template="plotly_white" + y='nom_compteur', + color_discrete_sequence=["red"], + template="plotly_dark", ) -fig.update_layout( - title='The 10 counters with the highest hourly average', - xaxis_title='Average count per hour over the selected period') -fig.update_xaxes(title_font=dict(color='red')) -``` +fig_dark.update_layout( + title=title, + xaxis_title=xaxis, + yaxis_title=yaxis + ) -```{python} -#| output: false +fig_dark.update_layout(barmode='stack', yaxis={'categoryorder':'total ascending'}) -# 2. Chart with dark theme -df1['top'] = df1['sum_counts'] > df1.sort_values('sum_counts', ascending=False)['sum_counts'][3] -fig2 = px.bar( - df1.sort_values('sum_counts', ascending=True), orientation='h', x='sum_counts', - y='nom_compteur', color='top', # note: the color argument might not always work - template="plotly_dark", - color_discrete_sequence=['red','green'] -) -fig2.update_layout( - title='The 10 counters with the highest hourly average', - xaxis_title='Average count per hour over the selected period' +fig_dark.update_traces( + hovertemplate="%{y}
Moyenne horaire: %{x:.1f}" ) ``` -::: - - -::: {.content-visible when-format="html"} - -::: {.content-visible when-profile="fr"} -La première question permet de construire le graphique suivant : -::: - -::: {.content-visible when-profile="en"} -The first question allows the creation of the following chart: -::: ```{python} +#| label: fig-plotly-double +#| layout-ncol: 1 fig.show() +fig_dark.show() ``` -::: {.content-visible when-profile="fr"} -Alors qu’avec le thème sombre (question 2), on obtient : -::: - -::: {.content-visible when-profile="en"} -Whereas with the dark theme (question 2), we get: -::: - -```{python} -fig2.show() -``` - -::: - ::: {.content-visible when-profile="fr"} ## La librairie `altair` @@ -744,7 +709,7 @@ Pour cet exemple, nous allons reconstruire notre figure précédente. ::: ::: {.content-visible when-profile="en"} -## The `altair` Library +## The `altair` library For this example, we will recreate our previous figure. ::: diff --git a/pyproject.toml b/pyproject.toml index 92251744e..52eef559e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,3 +44,8 @@ dependencies = [ [tool.uv.sources] cartiflette = { git = "https://github.com/inseefrlab/cartiflette" } + +[dependency-groups] +dev = [ + "nb-clean>=4.0.1", +] diff --git a/uv.lock b/uv.lock index 1165a2bda..e0141e674 100644 --- a/uv.lock +++ b/uv.lock @@ -1957,6 +1957,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/e6/4d16dfa26f40230593c216bf695da01682fdbdf6af4e79abef572ab26bce/narwhals-1.40.0-py3-none-any.whl", hash = "sha256:1e6c731811d01c61147c52433b4d4edfb6511aaf2c859aa01c2e8ca6ff4d27e5", size = 357340, upload-time = "2025-05-19T07:44:10.11Z" }, ] +[[package]] +name = "nb-clean" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nbformat" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/81/2ef0aaf3df03ec4146a92d62ce9b9533d368431791c7e5cb8e027068794a/nb_clean-4.0.1.tar.gz", hash = "sha256:f4af1bec3f25e7b18eb09024947bcc809efc97fd68bec482d219c304d850809f", size = 24170, upload-time = "2024-10-19T14:38:43.548Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/be/dd0d1c964fa8e2c645bb9298290c761c34b292ef4b2c113018f1b3c4cd90/nb_clean-4.0.1-py3-none-any.whl", hash = "sha256:6a673775523ad5ae18566bb0880012c169944a9357760dfcf993cdb14e2e5f82", size = 21355, upload-time = "2024-10-19T14:38:41.777Z" }, +] + [[package]] name = "nbclient" version = "0.10.0" @@ -2699,6 +2711,11 @@ dependencies = [ { name = "yellowbrick" }, ] +[package.dev-dependencies] +dev = [ + { name = "nb-clean" }, +] + [package.metadata] requires-dist = [ { name = "altair", specifier = "==5.4.1" }, @@ -2738,6 +2755,9 @@ requires-dist = [ { name = "yellowbrick", specifier = "==1.5" }, ] +[package.metadata.requires-dev] +dev = [{ name = "nb-clean", specifier = ">=4.0.1" }] + [[package]] name = "python-dateutil" version = "2.9.0.post0" From a4147f02ceedd37befc90b445cee2c72075df565 Mon Sep 17 00:00:00 2001 From: lgaliana Date: Sun, 24 Aug 2025 10:27:15 +0000 Subject: [PATCH 2/4] update --- content/visualisation/01_matplotlib/_exo2_solution.qmd | 1 - content/visualisation/01_matplotlib/_intro.qmd | 4 ++-- content/visualisation/matplotlib.qmd | 3 ++- styles/styles.css | 5 +++++ 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/content/visualisation/01_matplotlib/_exo2_solution.qmd b/content/visualisation/01_matplotlib/_exo2_solution.qmd index 9ff6f9fda..d58d05939 100644 --- a/content/visualisation/01_matplotlib/_exo2_solution.qmd +++ b/content/visualisation/01_matplotlib/_exo2_solution.qmd @@ -73,7 +73,6 @@ g = sns.catplot(x='sum_counts', y='nom_compteur', data=df1, kind = "bar", height g.set_axis_labels(xaxis, yaxis) plt.title(title) ``` -::: ::: {.content-visible when-profile="fr"} ```{python} diff --git a/content/visualisation/01_matplotlib/_intro.qmd b/content/visualisation/01_matplotlib/_intro.qmd index 16b92afe6..f1cb10b21 100644 --- a/content/visualisation/01_matplotlib/_intro.qmd +++ b/content/visualisation/01_matplotlib/_intro.qmd @@ -78,7 +78,7 @@ The subsequent step is to advance the work of communication and synthesis throug ::: {.callout-important} ## Utiliser une interface interactive pour visualiser les graphiques -Pour les chapitres de visualisation, il est vivement recommandé d’utiliser `Python` par le biais d'une interface interactive comme un _notebook Jupyter_ (via `VSCode` ou `Jupyter` par exemple, cf. [le chapitre de présentation des notebooks {{< fa arrow-up-right-from-square >}}](/content/getting-started/01_environment.qmd)){target="_blank"}. +Pour les chapitres de visualisation, il est vivement recommandé d’utiliser `Python` par le biais d'une interface interactive comme un _notebook Jupyter_ (via `VSCode` ou `Jupyter` par exemple, cf. [le chapitre de présentation des notebooks {{< fa arrow-up-right-from-square >}}](/content/getting-started/01_environment.qmd){target="_blank"}). Cela permet de visualiser les graphiques immédiatement sous chaque cellule de code, de les ajuster facilement, et de tester des modifications en temps réel. @@ -94,7 +94,7 @@ Cela permet de visualiser les graphiques immédiatement sous chaque cellule de c ## Use an interactive interface to visualize graphics -For visualization chapters, it is highly recommended to use `Python` via an interactive interface such as a _notebook Jupyter_ (via `VSCode` or `Jupyter` for example, see [the notebook presentation chapter {{< fa arrow-up-right-from-square >}}](/content/getting-started/01_environment.qmd)){target="_blank"}. +For visualization chapters, it is highly recommended to use `Python` via an interactive interface such as a _notebook Jupyter_ (via `VSCode` or `Jupyter` for example, see [the notebook presentation chapter {{< fa arrow-up-right-from-square >}}](/content/getting-started/01_environment.qmd){target="_blank"}). This makes it possible to view the graphics immediately below each code cell, to adjust them easily, and to test modifications in real time. Conversely, if scripts are run from a conventional console (e.g., by writing to a `.py` file and executing line by line with MAJ+,ENTREE in `VSCode`), the graphics will not be displayed in a popup window_ requiring additional commands to save them, before opening the exports manually and being able to correct the code if necessary. This makes for a more laborious learning experience. diff --git a/content/visualisation/matplotlib.qmd b/content/visualisation/matplotlib.qmd index 230184c39..949df6f38 100644 --- a/content/visualisation/matplotlib.qmd +++ b/content/visualisation/matplotlib.qmd @@ -820,4 +820,5 @@ fig2.interactive() ::: {#refs} -::: \ No newline at end of file +::: + diff --git a/styles/styles.css b/styles/styles.css index 03ae5f3ed..24a4956b7 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -5,6 +5,11 @@ p { */ +/* forcing image to be 100% */ +img.figure-img { + max-width: 100%; + height: auto; +} /* css styles */ From 70d6bef9d3f5cdb63207b8f70e5113337b98298b Mon Sep 17 00:00:00 2001 From: lgaliana Date: Sun, 24 Aug 2025 19:05:27 +0000 Subject: [PATCH 3/4] =?UTF-8?q?Figures=20de=20taille=20r=C3=A9duite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/visualisation/matplotlib.qmd | 68 +++++++++++++--------------- styles/styles.css | 7 --- 2 files changed, 31 insertions(+), 44 deletions(-) diff --git a/content/visualisation/matplotlib.qmd b/content/visualisation/matplotlib.qmd index 949df6f38..9f8a1055c 100644 --- a/content/visualisation/matplotlib.qmd +++ b/content/visualisation/matplotlib.qmd @@ -746,32 +746,25 @@ Originally, `Vega` was based on a JSON syntax, hence its strong connection to `J #| echo: true import altair as alt -fig2 = ( - alt.Chart(df1.reset_index()) # <1> +fig_altair = ( + alt.Chart(df1.reset_index()) .mark_bar(color='steelblue') - .encode( # <2> - x=alt.X('sum_counts:Q', title='Moyenne du comptage par heure sur la période sélectionnée'), # <3> - y=alt.Y('nom_compteur:N', sort='-x', title=''), - tooltip=[ # <4> - alt.Tooltip('nom_compteur:N', title='Nom du compteur'), - alt.Tooltip('sum_counts:Q', title='Moyenne horaire') + .encode( + x=alt.X('sum_counts:Q', title=xaxis), + y=alt.Y('nom_compteur:N', sort='-x', title=yaxis), + tooltip=[ + alt.Tooltip('nom_compteur:N', title=xaxis), + alt.Tooltip('sum_counts:Q', title=yaxis) ] - ).properties( # <5> - title='Les 10 compteurs avec la moyenne horaire la plus élevée' + ).properties( + title=title ).configure_view( strokeOpacity=0 ) ) -fig2.interactive() +fig_altair.interactive() ``` - -1. On déclare d'abord le _dataframe_ qui sera utilisé, comme nous le faisions avec `ggplot(df)` avec `plotnine`. Puis le type de figure désirée (ici un diagramme en barre, `mark_bar` dans la grammaire d'`altair`). -2. On définit notre couche principale avec `encode`. Celle-ci peut accepter simplement des noms de colonnes ou des constructeurs plus complexes, comme ici. -3. On définit un constructeur pour notre axe des _x_, à la fois pour gérer l'échelle des valeurs mais aussi les paramètres de celle-ci (labels, etc.). Ici, on définit l'axe des _x_ comme une valeur continue (`:Q`), moyenne de `sum_counts` pour chaque valeur de $y$. Cette moyenne n'est pas indispensable, on aurait pu se contenter d'écrire `sum_counts:Q` voire même `sum_counts` mais c'est pour illustrer la gestion des transformations de données dans `altair`. -4. Le _tooltip_ nous permet de gérer l'interactivité de notre figure. -5. Les propriétés viennent à la fin de notre déclaration pour finaliser la figure. - ::: ::: {.content-visible when-profile="en"} @@ -780,36 +773,37 @@ fig2.interactive() #| code-fold: true #| code-summary: "View the architecture of an Altair figure" #| echo: true +#| output: false import altair as alt -fig2 = ( - alt.Chart(df1.reset_index()) # <1> - .mark_bar(color='steelblue') - .encode( # <2> - x=alt.X('sum_counts:Q', title='Average count per hour over the selected period'), # <3> - y=alt.Y('nom_compteur:N', sort='-x', title=''), - tooltip=[ # <4> - alt.Tooltip('nom_compteur:N', title='Counter name'), - alt.Tooltip('sum_counts:Q', title='Hourly average') +fig_altair = ( + alt.Chart(df1.reset_index()) + .mark_bar(color='steelblue') + .encode( + x=alt.X('sum_counts:Q', title=xaxis), + y=alt.Y('nom_compteur:N', sort='-x', title=yaxis), + tooltip=[ + alt.Tooltip('nom_compteur:N', title=xaxis), + alt.Tooltip('sum_counts:Q', title=yaxis) ] - ).properties( # <5> - title='Top 10 counters by hourly average count' + ).properties( + title=title ).configure_view( strokeOpacity=0 ) ) -fig2.interactive() +fig_altair.interactive() ``` - -1. First, the _dataframe_ to be used is declared, similar to `ggplot(df)` in `plotnine`. Then, the desired chart type is specified (in this case, a bar chart, `mark_bar` in Altair's grammar). -2. The main layer is defined using `encode`. This can accept either simple column names or more complex constructors, as shown here. -3. A constructor is defined for the x-axis, both to manage value scaling and its parameters (e.g., labels). Here, the x-axis is defined as a continuous value (`:Q`), the average of `sum_counts` for each $y$ value. This average is not strictly necessary; we could have used `sum_counts:Q` or even `sum_counts`, but this illustrates data transformations in `altair`. -4. The _tooltip_ adds interactivity to the chart. -5. Properties are specified at the end of the declaration to finalize the chart. - ::: +```{python} +#| echo: false +if os.getenv("QUARTO_PROFILE") == "fr": + alt.themes.enable('dark') +fig_altair.interactive() +``` + ::: {.content-visible when-profile="fr"} # Références {-} ::: diff --git a/styles/styles.css b/styles/styles.css index 24a4956b7..7623a1ffe 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -1,10 +1,3 @@ -/* -p { - text-align: justify; -} - -*/ - /* forcing image to be 100% */ img.figure-img { max-width: 100%; From 481de682593c5ef0ba195c7bbe7280ae0944d1e0 Mon Sep 17 00:00:00 2001 From: lgaliana Date: Sun, 24 Aug 2025 19:20:38 +0000 Subject: [PATCH 4/4] fond blanc de la navbar --- styles/custom-dark.scss | 1 - styles/custom.scss | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/styles/custom-dark.scss b/styles/custom-dark.scss index b85826e5a..cd1d204fa 100644 --- a/styles/custom-dark.scss +++ b/styles/custom-dark.scss @@ -66,7 +66,6 @@ $text-muted: lighten(#6a737b, 20%); } } - //-------------------------------- // TITLE BANNER //-------------------------------- diff --git a/styles/custom.scss b/styles/custom.scss index cde7af1f3..412a94dfd 100644 --- a/styles/custom.scss +++ b/styles/custom.scss @@ -7,6 +7,11 @@ $green-dark: #00bc8c ; /*-- scss:rules --*/ +.dropdown-item:hover { + color: white !important; + background-color: #333333 !important; +} + .badge-container { margin-top: 20px; margin-bottom: 20px;