Update app.py
Browse files
app.py
CHANGED
|
@@ -16,7 +16,7 @@ import plotly.io as pio
|
|
| 16 |
VB_CSS = r"""
|
| 17 |
@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;600;700;800&display=swap');
|
| 18 |
|
| 19 |
-
/*
|
| 20 |
:root{
|
| 21 |
--body-background-fill:#F8FAFC;
|
| 22 |
--panel-background-fill:#FFFFFF;
|
|
@@ -29,25 +29,22 @@ VB_CSS = r"""
|
|
| 29 |
--radius-lg:14px;
|
| 30 |
--shadow-drop: 0 10px 26px rgba(2,6,23,.08);
|
| 31 |
|
| 32 |
-
/* Accent (pas d’orange) */
|
| 33 |
--color-accent:#7C3AED;
|
| 34 |
--color-accent-soft:#EDE9FE;
|
| 35 |
--button-primary-background-fill:#7C3AED;
|
| 36 |
--button-primary-text-color:#ffffff;
|
| 37 |
|
| 38 |
-
/* Inputs */
|
| 39 |
--input-background-fill:#FFFFFF;
|
| 40 |
--input-border-color:#E2E8F0;
|
| 41 |
--input-text-color:#0F172A;
|
| 42 |
--input-placeholder-color:#6B7280;
|
| 43 |
|
| 44 |
-
/* Tables */
|
| 45 |
--table-row-background-fill:#FFFFFF;
|
| 46 |
--table-row-text-color:#0F172A;
|
| 47 |
--table-border-color:#E2E8F0;
|
| 48 |
}
|
| 49 |
|
| 50 |
-
/* Palette
|
| 51 |
:root{
|
| 52 |
--vb-bg:#F8FAFC;
|
| 53 |
--vb-card:#FFFFFF;
|
|
@@ -63,7 +60,7 @@ VB_CSS = r"""
|
|
| 63 |
--vb-shadow:0 10px 26px rgba(2,6,23,.08);
|
| 64 |
}
|
| 65 |
|
| 66 |
-
/*
|
| 67 |
* { color-scheme: light !important; }
|
| 68 |
html,body,.gradio-container{
|
| 69 |
background:var(--vb-bg) !important;
|
|
@@ -116,8 +113,7 @@ html,body,.gradio-container{
|
|
| 116 |
border:none !important;
|
| 117 |
padding:0 !important;
|
| 118 |
}
|
| 119 |
-
|
| 120 |
-
/* Ribbons collés en haut à gauche (bg-* neutral/gray…) */
|
| 121 |
.gradio-container .wrap > div[class*="absolute"][class*="top-0"][class*="left-0"],
|
| 122 |
.gradio-container [class*="absolute"][class*="top-0"][class*="left-0"][class*="rounded-b"],
|
| 123 |
.gradio-container [class*="absolute"][class*="top-0"][class*="left-0"][class*="rounded-br"]{
|
|
@@ -127,7 +123,7 @@ html,body,.gradio-container{
|
|
| 127 |
border:none !important;
|
| 128 |
}
|
| 129 |
|
| 130 |
-
/* ---------- Onglets /
|
| 131 |
.gradio-container [role="tablist"],
|
| 132 |
.gradio-container [role="tab"]{
|
| 133 |
background:#fff !important;
|
|
@@ -199,20 +195,31 @@ html,body,.gradio-container{
|
|
| 199 |
}
|
| 200 |
.gradio-container .vb-cta:hover{transform:translateY(-2px);filter:brightness(1.05)}
|
| 201 |
|
| 202 |
-
/* ---------- DataFrames / Tables ---------- */
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
.gradio-container
|
| 207 |
-
|
|
|
|
|
|
|
|
|
|
| 208 |
}
|
| 209 |
-
|
|
|
|
|
|
|
|
|
|
| 210 |
background:linear-gradient(90deg, rgba(124,58,237,.12), rgba(6,182,212,.12)) !important;
|
| 211 |
-
color:#
|
| 212 |
}
|
| 213 |
-
.gradio-container
|
| 214 |
-
|
|
|
|
|
|
|
|
|
|
| 215 |
}
|
|
|
|
|
|
|
| 216 |
|
| 217 |
/* ---------- Fichiers (gr.Files) ---------- */
|
| 218 |
.gradio-container [class*="file"]{
|
|
@@ -577,7 +584,7 @@ def analyze_text(pasted_txt, has_sc, sep_chr,
|
|
| 577 |
nps_label = "NPS global (inféré)" if any_inferred else "NPS global"
|
| 578 |
lines=[ "# Synthèse NPS & ressentis clients",
|
| 579 |
f"- **Méthode** : {method}",
|
| 580 |
-
f"- **{nps_label}** : {nps:.1f}" if nps is not None else f"- **{
|
| 581 |
if dist:
|
| 582 |
tot=sum(dist.values()); pos=dist.get("positive",0); neg=dist.get("negatif",0); neu=dist.get("neutre",0)
|
| 583 |
lines.append(f"- **Répartition émotions** : positive {pos}/{tot}, neutre {neu}/{tot}, négative {neg}/{tot}")
|
|
@@ -641,7 +648,10 @@ def analyze_text(pasted_txt, has_sc, sep_chr,
|
|
| 641 |
|
| 642 |
# ====================== UI ======================
|
| 643 |
|
| 644 |
-
|
|
|
|
|
|
|
|
|
|
| 645 |
|
| 646 |
with gr.Blocks(title="Verbatify — Analyse NPS", css=VB_CSS) as demo:
|
| 647 |
gr.HTML(
|
|
|
|
| 16 |
VB_CSS = r"""
|
| 17 |
@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;600;700;800&display=swap');
|
| 18 |
|
| 19 |
+
/* Variables Gradio (on impose le thème clair + accents violet/cyan) */
|
| 20 |
:root{
|
| 21 |
--body-background-fill:#F8FAFC;
|
| 22 |
--panel-background-fill:#FFFFFF;
|
|
|
|
| 29 |
--radius-lg:14px;
|
| 30 |
--shadow-drop: 0 10px 26px rgba(2,6,23,.08);
|
| 31 |
|
|
|
|
| 32 |
--color-accent:#7C3AED;
|
| 33 |
--color-accent-soft:#EDE9FE;
|
| 34 |
--button-primary-background-fill:#7C3AED;
|
| 35 |
--button-primary-text-color:#ffffff;
|
| 36 |
|
|
|
|
| 37 |
--input-background-fill:#FFFFFF;
|
| 38 |
--input-border-color:#E2E8F0;
|
| 39 |
--input-text-color:#0F172A;
|
| 40 |
--input-placeholder-color:#6B7280;
|
| 41 |
|
|
|
|
| 42 |
--table-row-background-fill:#FFFFFF;
|
| 43 |
--table-row-text-color:#0F172A;
|
| 44 |
--table-border-color:#E2E8F0;
|
| 45 |
}
|
| 46 |
|
| 47 |
+
/* Palette maison */
|
| 48 |
:root{
|
| 49 |
--vb-bg:#F8FAFC;
|
| 50 |
--vb-card:#FFFFFF;
|
|
|
|
| 60 |
--vb-shadow:0 10px 26px rgba(2,6,23,.08);
|
| 61 |
}
|
| 62 |
|
| 63 |
+
/* Toujours en clair */
|
| 64 |
* { color-scheme: light !important; }
|
| 65 |
html,body,.gradio-container{
|
| 66 |
background:var(--vb-bg) !important;
|
|
|
|
| 113 |
border:none !important;
|
| 114 |
padding:0 !important;
|
| 115 |
}
|
| 116 |
+
/* Ribbons absolus en haut à gauche */
|
|
|
|
| 117 |
.gradio-container .wrap > div[class*="absolute"][class*="top-0"][class*="left-0"],
|
| 118 |
.gradio-container [class*="absolute"][class*="top-0"][class*="left-0"][class*="rounded-b"],
|
| 119 |
.gradio-container [class*="absolute"][class*="top-0"][class*="left-0"][class*="rounded-br"]{
|
|
|
|
| 123 |
border:none !important;
|
| 124 |
}
|
| 125 |
|
| 126 |
+
/* ---------- Onglets / tablists internes ---------- */
|
| 127 |
.gradio-container [role="tablist"],
|
| 128 |
.gradio-container [role="tab"]{
|
| 129 |
background:#fff !important;
|
|
|
|
| 195 |
}
|
| 196 |
.gradio-container .vb-cta:hover{transform:translateY(-2px);filter:brightness(1.05)}
|
| 197 |
|
| 198 |
+
/* ---------- DataFrames / Tables (anti-bandes noires) ---------- */
|
| 199 |
+
/* 1) Wrappers Svelte du tableau */
|
| 200 |
+
.gradio-container .table,
|
| 201 |
+
.gradio-container .table * ,
|
| 202 |
+
.gradio-container .svelte-virtual-table-viewport,
|
| 203 |
+
.gradio-container .table-wrap{
|
| 204 |
+
background:#fff !important;
|
| 205 |
+
color:#0F172A !important;
|
| 206 |
+
border-color:#E2E8F0 !important;
|
| 207 |
}
|
| 208 |
+
/* 2) Ligne d’en-tête + boutons d’en-tête */
|
| 209 |
+
.gradio-container .table thead,
|
| 210 |
+
.gradio-container .table thead tr,
|
| 211 |
+
.gradio-container .table thead th{
|
| 212 |
background:linear-gradient(90deg, rgba(124,58,237,.12), rgba(6,182,212,.12)) !important;
|
| 213 |
+
color:#0F172A !important; border-bottom:1px solid #E2E8F0 !important;
|
| 214 |
}
|
| 215 |
+
.gradio-container .table thead th .header-button,
|
| 216 |
+
.gradio-container .table thead th [class*="header-button"],
|
| 217 |
+
.gradio-container .header-button{
|
| 218 |
+
background:transparent !important; color:#0F172A !important;
|
| 219 |
+
box-shadow:none !important; border:none !important;
|
| 220 |
}
|
| 221 |
+
/* 3) Captions / titres internes */
|
| 222 |
+
.gradio-container .table caption{color:#0F172A !important}
|
| 223 |
|
| 224 |
/* ---------- Fichiers (gr.Files) ---------- */
|
| 225 |
.gradio-container [class*="file"]{
|
|
|
|
| 584 |
nps_label = "NPS global (inféré)" if any_inferred else "NPS global"
|
| 585 |
lines=[ "# Synthèse NPS & ressentis clients",
|
| 586 |
f"- **Méthode** : {method}",
|
| 587 |
+
f"- **{nps_label}** : {nps:.1f}" if nps is not None else f"- **{nps_label}** : n/a" ]
|
| 588 |
if dist:
|
| 589 |
tot=sum(dist.values()); pos=dist.get("positive",0); neg=dist.get("negatif",0); neu=dist.get("neutre",0)
|
| 590 |
lines.append(f"- **Répartition émotions** : positive {pos}/{tot}, neutre {neu}/{tot}, négative {neg}/{tot}")
|
|
|
|
| 648 |
|
| 649 |
# ====================== UI ======================
|
| 650 |
|
| 651 |
+
def apply_plotly_theme_wrapper():
|
| 652 |
+
apply_plotly_theme()
|
| 653 |
+
|
| 654 |
+
apply_plotly_theme_wrapper()
|
| 655 |
|
| 656 |
with gr.Blocks(title="Verbatify — Analyse NPS", css=VB_CSS) as demo:
|
| 657 |
gr.HTML(
|