mtornani Claude Sonnet 4.6 commited on
Commit
b0b0ea0
·
1 Parent(s): 5dfe753

Design: DM Serif Display + split cover + numbered section headers

Browse files

- All 3 docs: add DM Serif Display (Google Fonts) serif/sans contrast
- executive_report: cover redesigned to split layout (white left + primary color right panel)
- executive_report: KPI values DM Serif left-aligned, label above number
- executive_report: page-title emoji removed, numbered 01-06 with serif numeral
- export_html: section h2 DM Serif Display
- export_onepager: kpi-value + header-club + vision-quote DM Serif Display

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Files changed (3) hide show
  1. executive_report.py +122 -63
  2. export_html.py +2 -2
  3. export_onepager.py +10 -10
executive_report.py CHANGED
@@ -606,7 +606,7 @@ def generate_executive_report_html(
606
  <meta charset="UTF-8">
607
  <title>Report Esecutivo - {club_name}</title>
608
  <link rel="preconnect" href="https://fonts.googleapis.com">
609
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600&family=Montserrat:wght@700;800&display=swap" rel="stylesheet">
610
  <style>
611
  :root {{
612
  --primary: {primary_color};
@@ -644,61 +644,112 @@ def generate_executive_report_html(
644
  background: white;
645
  }}
646
 
647
- h1, h2, h3, .page-title {{
648
  font-family: 'Montserrat', sans-serif;
649
  text-transform: uppercase;
650
- letter-spacing: -0.5px;
 
 
 
 
 
 
 
 
 
 
 
651
  }}
652
 
653
- /* === COVER PAGE === */
654
  .cover {{
655
  height: 100vh;
 
 
 
 
 
 
 
 
656
  display: flex;
657
  flex-direction: column;
658
  justify-content: center;
659
- align-items: center;
660
- background: linear-gradient(135deg, var(--primary-dark) 0%, var(--primary) 100%);
661
- color: white;
662
- text-align: center;
663
- position: relative;
664
- overflow: hidden;
665
  }}
666
 
667
- .cover::before {{
668
- content: "";
669
- position: absolute;
670
- top: 0; left: 0; right: 0; bottom: 0;
671
- background-image: radial-gradient(circle, rgba(255,255,255,0.15) 1px, transparent 1px);
672
- background-size: 28px 28px;
673
- z-index: 0;
 
674
  }}
675
 
676
- .cover > * {{
677
- z-index: 1;
 
 
 
 
 
678
  }}
679
 
680
  .cover h1 {{
681
- font-size: 32pt;
682
- margin-bottom: 10px;
683
- letter-spacing: 2px;
 
 
 
 
 
684
  }}
685
 
686
- .cover .subtitle {{
687
- font-size: 16pt;
688
- opacity: 0.9;
689
- margin-bottom: 40px;
690
- font-weight: 300;
 
 
691
  }}
692
 
693
- .cover .period {{
694
- font-size: 18pt;
695
- font-weight: 700;
696
- background: rgba(255,255,255,0.15);
697
- backdrop-filter: blur(10px);
698
- padding: 12px 40px;
699
- border-radius: 50px;
700
- border: 1px solid rgba(255,255,255,0.3);
701
- margin-bottom: 40px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
702
  }}
703
 
704
  /* === PAGE SECTIONS === */
@@ -733,27 +784,30 @@ def generate_executive_report_html(
733
  }}
734
 
735
  .kpi-card {{
736
- background: var(--bg-light);
737
  border: 1px solid var(--border);
738
- padding: 20px 15px;
739
- border-radius: 12px;
740
- text-align: center;
741
- transition: transform 0.2s;
742
- }}
743
-
744
- .kpi-card .value {{
745
- font-family: 'Montserrat', sans-serif;
746
- font-size: 20pt;
747
- font-weight: 800;
748
- color: var(--primary);
749
  }}
750
 
751
  .kpi-card .label {{
752
- font-size: 8pt;
753
- font-weight: 600;
754
  text-transform: uppercase;
 
755
  color: var(--text-light);
756
- margin-top: 5px;
 
 
 
 
 
 
 
 
757
  }}
758
 
759
  /* === COMPARISON TABLE === */
@@ -1035,17 +1089,22 @@ def generate_executive_report_html(
1035
 
1036
  <!-- PAGINA 1: COVER -->
1037
  <div class="cover page-break">
1038
- <div style="font-size: 10pt; letter-spacing: 5px; text-transform: uppercase; margin-bottom: 20px; opacity: 0.8;">Rooting Future</div>
1039
- <h1>{club_name}</h1>
1040
- <div class="subtitle">Report Esecutivo</div>
1041
- <div class="period">PIANO TRIENNALE {current_year} - {current_year + 3}</div>
1042
- <div style="font-family: 'Montserrat'; font-size: 10pt; text-transform: uppercase; letter-spacing: 3px; opacity: 0.7;">Riservato al Board</div>
1043
- {_format_timing_badge(metadata)}
 
 
 
 
 
1044
  </div>
1045
 
1046
  <!-- PAGINA 2: I TUOI DATI -->
1047
  <div class="page page-break">
1048
- <div class="page-title"><span class="icon">📋</span> I Tuoi Dati: Trasparenza e Metodologia</div>
1049
 
1050
  <div class="data-source-page">
1051
  <h2 style="color: var(--primary); margin-bottom: 15px;">La Base del Tuo Piano</h2>
@@ -1079,7 +1138,7 @@ def generate_executive_report_html(
1079
  </div>
1080
  </div>
1081
 
1082
- <div class="page-title" style="margin-top: 30px;"><span class="icon">📋</span> Sintesi Strategica</div>
1083
  <div class="exec-box" style="background: #f9f7ff; border-left: 4px solid var(--primary); padding: 20px; border-radius: 0 12px 12px 0;">
1084
  <ul style="list-style: none; padding: 0;">
1085
  {exec_html}
@@ -1089,7 +1148,7 @@ def generate_executive_report_html(
1089
 
1090
  <!-- PAGINA 3: KPI + GRAFICI -->
1091
  <div class="page page-break">
1092
- <div class="page-title"><span class="icon">💰</span> Quadro Finanziario e Benchmark</div>
1093
 
1094
  <div class="kpi-grid">
1095
  <div class="kpi-card">
@@ -1139,18 +1198,18 @@ def generate_executive_report_html(
1139
 
1140
  <!-- PAGINA 4: AREE STRATEGICHE + ROADMAP -->
1141
  <div class="page page-break">
1142
- <div class="page-title"><span class="icon">🎯</span> Aree Strategiche di Intervento</div>
1143
  <div class="areas-grid">
1144
  {areas_html}
1145
  </div>
1146
 
1147
- <div class="page-title" style="margin-top:30px;"><span class="icon">📅</span> Roadmap Triennale</div>
1148
  {timeline_html}
1149
  </div>
1150
 
1151
  <!-- PAGINA 5: METODOLOGIA -->
1152
  <div class="page">
1153
- <div class="page-title"><span class="icon">📊</span> Metodologia e Fonti</div>
1154
 
1155
  <div class="method-grid">
1156
  <div class="method-box">
 
606
  <meta charset="UTF-8">
607
  <title>Report Esecutivo - {club_name}</title>
608
  <link rel="preconnect" href="https://fonts.googleapis.com">
609
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600&family=Montserrat:wght@700;800&family=DM+Serif+Display&display=swap" rel="stylesheet">
610
  <style>
611
  :root {{
612
  --primary: {primary_color};
 
644
  background: white;
645
  }}
646
 
647
+ h2, h3, .page-title {{
648
  font-family: 'Montserrat', sans-serif;
649
  text-transform: uppercase;
650
+ letter-spacing: -0.3px;
651
+ }}
652
+
653
+ .pt-num {{
654
+ font-family: 'DM Serif Display', Georgia, serif;
655
+ font-size: 11pt;
656
+ font-weight: 400;
657
+ color: var(--primary);
658
+ opacity: 0.5;
659
+ margin-right: 10px;
660
+ text-transform: none;
661
+ letter-spacing: 0;
662
  }}
663
 
664
+ /* === COVER PAGE — split layout === */
665
  .cover {{
666
  height: 100vh;
667
+ display: grid;
668
+ grid-template-columns: 3fr 2fr;
669
+ background: white;
670
+ overflow: hidden;
671
+ }}
672
+
673
+ .cover-left {{
674
+ padding: 50mm 20mm 50mm 18mm;
675
  display: flex;
676
  flex-direction: column;
677
  justify-content: center;
 
 
 
 
 
 
678
  }}
679
 
680
+ .cover-brand {{
681
+ font-family: 'Montserrat', sans-serif;
682
+ font-size: 7.5pt;
683
+ letter-spacing: 4px;
684
+ text-transform: uppercase;
685
+ color: var(--primary);
686
+ margin-bottom: 28mm;
687
+ font-weight: 700;
688
  }}
689
 
690
+ .cover-label {{
691
+ font-size: 8.5pt;
692
+ color: var(--text-light);
693
+ text-transform: uppercase;
694
+ letter-spacing: 1.5px;
695
+ margin-bottom: 10px;
696
+ font-family: 'Montserrat', sans-serif;
697
  }}
698
 
699
  .cover h1 {{
700
+ font-family: 'DM Serif Display', Georgia, serif;
701
+ font-size: 38pt;
702
+ font-weight: 400;
703
+ color: var(--text);
704
+ line-height: 1.05;
705
+ margin-bottom: 18px;
706
+ text-transform: none;
707
+ letter-spacing: -0.5px;
708
  }}
709
 
710
+ .cover-period {{
711
+ font-family: 'Montserrat', sans-serif;
712
+ font-size: 13pt;
713
+ font-weight: 800;
714
+ color: var(--primary);
715
+ margin-bottom: 22px;
716
+ letter-spacing: 1px;
717
  }}
718
 
719
+ .cover-tag {{
720
+ font-size: 8pt;
721
+ color: var(--text-light);
722
+ letter-spacing: 1px;
723
+ text-transform: uppercase;
724
+ }}
725
+
726
+ .cover-right {{
727
+ background: var(--primary);
728
+ position: relative;
729
+ overflow: hidden;
730
+ display: flex;
731
+ align-items: center;
732
+ justify-content: center;
733
+ }}
734
+
735
+ .cover-right::before {{
736
+ content: "";
737
+ position: absolute;
738
+ top: 0; left: 0; right: 0; bottom: 0;
739
+ background-image: radial-gradient(circle, rgba(255,255,255,0.12) 1px, transparent 1px);
740
+ background-size: 28px 28px;
741
+ }}
742
+
743
+ .cover-right-text {{
744
+ font-family: 'DM Serif Display', Georgia, serif;
745
+ font-size: 68pt;
746
+ font-weight: 400;
747
+ color: rgba(255,255,255,0.18);
748
+ position: relative;
749
+ z-index: 1;
750
+ line-height: 0.9;
751
+ text-align: center;
752
+ letter-spacing: -2px;
753
  }}
754
 
755
  /* === PAGE SECTIONS === */
 
784
  }}
785
 
786
  .kpi-card {{
787
+ background: white;
788
  border: 1px solid var(--border);
789
+ border-top: 3px solid var(--primary);
790
+ padding: 16px 14px;
791
+ border-radius: 6px;
792
+ text-align: left;
793
+ box-shadow: 0 2px 6px rgba(0,0,0,0.05);
 
 
 
 
 
 
794
  }}
795
 
796
  .kpi-card .label {{
797
+ font-size: 7pt;
798
+ font-weight: 700;
799
  text-transform: uppercase;
800
+ letter-spacing: 0.8px;
801
  color: var(--text-light);
802
+ margin-bottom: 6px;
803
+ }}
804
+
805
+ .kpi-card .value {{
806
+ font-family: 'DM Serif Display', Georgia, serif;
807
+ font-size: 22pt;
808
+ font-weight: 400;
809
+ color: var(--primary);
810
+ line-height: 1;
811
  }}
812
 
813
  /* === COMPARISON TABLE === */
 
1089
 
1090
  <!-- PAGINA 1: COVER -->
1091
  <div class="cover page-break">
1092
+ <div class="cover-left">
1093
+ <div class="cover-brand">Rooting Future</div>
1094
+ <div class="cover-label">Report Esecutivo · Piano Triennale</div>
1095
+ <h1>{club_name}</h1>
1096
+ <div class="cover-period">{current_year} {current_year + 3}</div>
1097
+ <div class="cover-tag">Riservato al Board di Gestione</div>
1098
+ {_format_timing_badge(metadata)}
1099
+ </div>
1100
+ <div class="cover-right">
1101
+ <div class="cover-right-text">{current_year}<br>—<br>{current_year + 3}</div>
1102
+ </div>
1103
  </div>
1104
 
1105
  <!-- PAGINA 2: I TUOI DATI -->
1106
  <div class="page page-break">
1107
+ <div class="page-title"><span class="pt-num">01</span> I Tuoi Dati: Trasparenza e Metodologia</div>
1108
 
1109
  <div class="data-source-page">
1110
  <h2 style="color: var(--primary); margin-bottom: 15px;">La Base del Tuo Piano</h2>
 
1138
  </div>
1139
  </div>
1140
 
1141
+ <div class="page-title" style="margin-top: 30px;"><span class="pt-num">02</span> Sintesi Strategica</div>
1142
  <div class="exec-box" style="background: #f9f7ff; border-left: 4px solid var(--primary); padding: 20px; border-radius: 0 12px 12px 0;">
1143
  <ul style="list-style: none; padding: 0;">
1144
  {exec_html}
 
1148
 
1149
  <!-- PAGINA 3: KPI + GRAFICI -->
1150
  <div class="page page-break">
1151
+ <div class="page-title"><span class="pt-num">03</span> Quadro Finanziario e Benchmark</div>
1152
 
1153
  <div class="kpi-grid">
1154
  <div class="kpi-card">
 
1198
 
1199
  <!-- PAGINA 4: AREE STRATEGICHE + ROADMAP -->
1200
  <div class="page page-break">
1201
+ <div class="page-title"><span class="pt-num">04</span> Aree Strategiche di Intervento</div>
1202
  <div class="areas-grid">
1203
  {areas_html}
1204
  </div>
1205
 
1206
+ <div class="page-title" style="margin-top:30px;"><span class="pt-num">05</span> Roadmap Triennale</div>
1207
  {timeline_html}
1208
  </div>
1209
 
1210
  <!-- PAGINA 5: METODOLOGIA -->
1211
  <div class="page">
1212
+ <div class="page-title"><span class="pt-num">06</span> Metodologia e Fonti</div>
1213
 
1214
  <div class="method-grid">
1215
  <div class="method-box">
export_html.py CHANGED
@@ -305,7 +305,7 @@ class ChunkedHTMLExporter(BaseExporter):
305
  <meta charset="UTF-8">
306
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
307
  <title>Piano Strategico {club_name} {current_year}-{current_year + 3}</title>
308
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&family=Montserrat:wght@700;800&display=swap" rel="stylesheet">
309
  <style>
310
  :root {{
311
  --primary: {primary_color};
@@ -351,7 +351,7 @@ class ChunkedHTMLExporter(BaseExporter):
351
 
352
  .section {{ background: white; border-radius: 10px; padding: 36px 40px; margin-bottom: 28px; border: 1px solid var(--border); box-shadow: 0 2px 12px rgba(0,0,0,0.05); }}
353
  .section-header {{ border-bottom: 3px solid var(--accent); padding-bottom: 16px; margin-bottom: 28px; }}
354
- .section-header h2 {{ color: var(--accent); font-family: 'Montserrat', sans-serif; font-size: 1.9rem; }}
355
  .section-body {{ min-width: 0; overflow-wrap: break-word; word-wrap: break-word; }}
356
 
357
  h3 {{ color: var(--accent); margin-top: 1.8rem; margin-bottom: 0.8rem; border-left: 4px solid var(--accent); padding-left: 12px; }}
 
305
  <meta charset="UTF-8">
306
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
307
  <title>Piano Strategico {club_name} {current_year}-{current_year + 3}</title>
308
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&family=Montserrat:wght@700;800&family=DM+Serif+Display&display=swap" rel="stylesheet">
309
  <style>
310
  :root {{
311
  --primary: {primary_color};
 
351
 
352
  .section {{ background: white; border-radius: 10px; padding: 36px 40px; margin-bottom: 28px; border: 1px solid var(--border); box-shadow: 0 2px 12px rgba(0,0,0,0.05); }}
353
  .section-header {{ border-bottom: 3px solid var(--accent); padding-bottom: 16px; margin-bottom: 28px; }}
354
+ .section-header h2 {{ color: var(--accent); font-family: 'DM Serif Display', Georgia, serif; font-size: 1.9rem; font-weight: 400; text-transform: none; letter-spacing: -0.3px; }}
355
  .section-body {{ min-width: 0; overflow-wrap: break-word; word-wrap: break-word; }}
356
 
357
  h3 {{ color: var(--accent); margin-top: 1.8rem; margin-bottom: 0.8rem; border-left: 4px solid var(--accent); padding-left: 12px; }}
export_onepager.py CHANGED
@@ -286,7 +286,7 @@ class OnePagerExporter(BaseExporter):
286
  <meta charset="UTF-8">
287
  <title>Piano Strategico - {club_name}</title>
288
  <link rel="preconnect" href="https://fonts.googleapis.com">
289
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=Montserrat:wght@700;800&display=swap" rel="stylesheet">
290
  <style>
291
  :root {{
292
  --club-primary: {metadata.get('primary_color', primary_color)};
@@ -329,12 +329,12 @@ class OnePagerExporter(BaseExporter):
329
  }}
330
 
331
 
332
- .header-club {{
333
- font-family: 'Montserrat', sans-serif;
334
  font-size: 24pt;
335
- font-weight: 800;
336
- text-transform: uppercase;
337
- letter-spacing: 1px;
338
  }}
339
 
340
  .main {{
@@ -362,10 +362,10 @@ class OnePagerExporter(BaseExporter):
362
  box-shadow: 0 2px 8px rgba(0,0,0,0.05);
363
  }}
364
 
365
- .kpi-value {{
366
- font-family: 'Montserrat', sans-serif;
367
  font-size: 22pt;
368
- font-weight: 800;
369
  color: var(--text-on-white);
370
  line-height: 1;
371
  }}
@@ -422,7 +422,7 @@ class OnePagerExporter(BaseExporter):
422
  }}
423
 
424
 
425
- .vision-quote {{ font-family: 'Inter', sans-serif; font-size: 13pt; font-style: italic; line-height: 1.5; position: relative; z-index: 1; }}
426
 
427
  .footer {{
428
  background: var(--club-primary);
 
286
  <meta charset="UTF-8">
287
  <title>Piano Strategico - {club_name}</title>
288
  <link rel="preconnect" href="https://fonts.googleapis.com">
289
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=Montserrat:wght@700;800&family=DM+Serif+Display&display=swap" rel="stylesheet">
290
  <style>
291
  :root {{
292
  --club-primary: {metadata.get('primary_color', primary_color)};
 
329
  }}
330
 
331
 
332
+ .header-club {{
333
+ font-family: 'DM Serif Display', Georgia, serif;
334
  font-size: 24pt;
335
+ font-weight: 400;
336
+ text-transform: none;
337
+ letter-spacing: -0.3px;
338
  }}
339
 
340
  .main {{
 
362
  box-shadow: 0 2px 8px rgba(0,0,0,0.05);
363
  }}
364
 
365
+ .kpi-value {{
366
+ font-family: 'DM Serif Display', Georgia, serif;
367
  font-size: 22pt;
368
+ font-weight: 400;
369
  color: var(--text-on-white);
370
  line-height: 1;
371
  }}
 
422
  }}
423
 
424
 
425
+ .vision-quote {{ font-family: 'DM Serif Display', Georgia, serif; font-size: 13pt; font-style: italic; line-height: 1.5; position: relative; z-index: 1; }}
426
 
427
  .footer {{
428
  background: var(--club-primary);