openhands openhands commited on
Commit
928e4af
·
1 Parent(s): 63c73f3

Align color scheme with OpenHands brand

Browse files

- Update primary accent from mint green to yellow (#FFE165)
- Update secondary accent to green (#BCFF8C)
- Update dark mode background to grey scale (#18191C)
- Change font from Manrope to Outfit (OpenHands brand font)
- Update CSS variables to match openhands-ui/tokens.css
- Update chart colors (efficiency frontier, trend lines, hover labels)

Co-authored-by: openhands <openhands@all-hands.dev>

Files changed (4) hide show
  1. app.py +49 -35
  2. content.py +54 -32
  3. leaderboard_transformer.py +8 -8
  4. visualizations.py +8 -7
app.py CHANGED
@@ -121,55 +121,69 @@ const tooltipInterval = setInterval(() => {
121
  </script>
122
  """
123
  # --- Theme Definition ---
 
 
124
  theme = gr.themes.Base(
125
- primary_hue=gr.themes.Color(c100="#CFF5E8", c200="#B7EFDD", c300="#9FEAD1", c400="#87E5C5", c50="#E7FAF3", c500="#6FE0BA", c600="#57DBAF", c700="#3FD5A3", c800="#27D09C", c900="#0FCB8C", c950="#0fcb8c"),
126
- secondary_hue=gr.themes.Color(c100="#FCDCEB", c200="#FBCBE1", c300="#F9BAD7", c400="#F7A8CD", c50="#FDEEF5", c500="#F697C4", c600="#F586BA", c700="#F375B0", c800="#F263A6", c900="#F0529C", c950="#F0529C"),
127
- neutral_hue=gr.themes.Color(c100="#FDF9F4", c200="#C9C9C3", c300="#B0B5AF", c400="#97A09C", c50="#FAF2E9", c500="#7F8C89", c600="#667876", c700="#344F4F", c800="#1C3A3C", c900="#032629", c950="032629"),
128
- font=[gr.themes.GoogleFont('Manrope'), 'ui-sans-serif', 'sans-serif', 'sans-serif'],
129
- font_mono=[gr.themes.GoogleFont('Roboto Mono'), 'ui-monospace', 'monospace', 'monospace'],
 
 
 
 
 
 
 
 
 
 
 
 
130
  ).set(
131
  body_text_color='*neutral_950',
132
- body_text_color_subdued='*neutral_950',
133
- body_text_color_subdued_dark='*neutral_50',
134
  body_text_color_dark='*neutral_50',
135
  background_fill_primary='*neutral_50',
136
  background_fill_primary_dark='*neutral_900',
137
  background_fill_secondary='*neutral_100',
138
  background_fill_secondary_dark='*neutral_800',
139
- border_color_accent='*secondary_900',
140
- border_color_accent_subdued='*neutral_400',
141
- border_color_accent_subdued_dark='*neutral_400',
142
- color_accent='*primary_900',
143
  color_accent_soft='*neutral_200',
144
  color_accent_soft_dark='*neutral_800',
145
- link_text_color='#555555',
146
- link_text_color_dark='#cccccc',
147
- link_text_color_active_dark='#bbbbbb',
148
- link_text_color_hover_dark='#dddddd',
149
- link_text_color_visited_dark='#bbbbbb',
150
  table_even_background_fill='*neutral_100',
151
  table_even_background_fill_dark='*neutral_800',
152
- button_primary_background_fill='*secondary_900',
153
- button_primary_background_fill_dark='*primary_900',
154
- button_primary_background_fill_hover='*secondary_600',
155
- button_primary_background_fill_hover_dark='*primary_600',
156
- button_secondary_background_fill="#9FEAD1",
157
- button_secondary_background_fill_dark="#9FEAD1",
158
- button_secondary_text_color="*neutral_900",
159
- button_secondary_text_color_dark="*neutral_900",
160
- block_title_text_color="*neutral_900",
161
  button_primary_text_color='*neutral_900',
162
- block_title_text_color_dark="#ffffff",
163
  button_primary_text_color_dark='*neutral_900',
164
- block_border_color="#032629",
165
- block_border_color_dark="#9fead1",
166
- block_background_fill_dark="#032629",
167
- block_background_fill="#FAF2E9",
168
- checkbox_label_text_color="#032629",
169
- checkbox_label_background_fill="#D8D6CF",
170
- checkbox_label_background_fill_dark="#254243",
171
- checkbox_background_color_selected="#F0529C",
172
- checkbox_background_color_selected_dark="#0FCB8C",
173
  )
174
  try:
175
  with open(LOGO_PATH, "r") as f:
 
121
  </script>
122
  """
123
  # --- Theme Definition ---
124
+ # Color scheme aligned with OpenHands brand (from openhands-ui/tokens.css)
125
+ # Primary: Yellow (#FFE165), Neutral: Grey scale, Accents: Green (#BCFF8C), Red (#FF684E)
126
  theme = gr.themes.Base(
127
+ # Primary hue - Yellow (OpenHands brand color)
128
+ primary_hue=gr.themes.Color(
129
+ c50="#FFFCF0", c100="#FFF3C0", c200="#FFEEAA", c300="#FFEA92", c400="#FFE57B",
130
+ c500="#FFE165", c600="#DCC257", c700="#BBA54A", c800="#99873D", c900="#76682F", c950="#534921"
131
+ ),
132
+ # Secondary hue - Green accent (from OpenHands palette)
133
+ secondary_hue=gr.themes.Color(
134
+ c50="#F8FFF4", c100="#E4FFD0", c200="#DAFFBF", c300="#CFFFAD", c400="#C6FF9D",
135
+ c500="#BCFF8C", c600="#A2DC79", c700="#8ABB67", c800="#719954", c900="#577641", c950="#3D532E"
136
+ ),
137
+ # Neutral hue - Grey scale (OpenHands dark mode colors)
138
+ neutral_hue=gr.themes.Color(
139
+ c50="#F7F8FB", c100="#EBEDF3", c200="#D4D8E7", c300="#B1B9D3", c400="#82889B",
140
+ c500="#525662", c600="#3A3C45", c700="#2F3137", c800="#222328", c900="#18191C", c950="#0D0D0F"
141
+ ),
142
+ font=[gr.themes.GoogleFont('Outfit'), 'ui-sans-serif', 'sans-serif'],
143
+ font_mono=[gr.themes.GoogleFont('IBM Plex Mono'), 'ui-monospace', 'monospace'],
144
  ).set(
145
  body_text_color='*neutral_950',
146
+ body_text_color_subdued='*neutral_700',
147
+ body_text_color_subdued_dark='*neutral_300',
148
  body_text_color_dark='*neutral_50',
149
  background_fill_primary='*neutral_50',
150
  background_fill_primary_dark='*neutral_900',
151
  background_fill_secondary='*neutral_100',
152
  background_fill_secondary_dark='*neutral_800',
153
+ border_color_accent='*primary_500',
154
+ border_color_accent_subdued='*neutral_300',
155
+ border_color_accent_subdued_dark='*neutral_600',
156
+ color_accent='*primary_500',
157
  color_accent_soft='*neutral_200',
158
  color_accent_soft_dark='*neutral_800',
159
+ link_text_color='*neutral_700',
160
+ link_text_color_dark='*neutral_300',
161
+ link_text_color_active_dark='*primary_500',
162
+ link_text_color_hover_dark='*primary_400',
163
+ link_text_color_visited_dark='*neutral_400',
164
  table_even_background_fill='*neutral_100',
165
  table_even_background_fill_dark='*neutral_800',
166
+ button_primary_background_fill='*primary_500',
167
+ button_primary_background_fill_dark='*primary_500',
168
+ button_primary_background_fill_hover='*primary_400',
169
+ button_primary_background_fill_hover_dark='*primary_400',
170
+ button_secondary_background_fill='*secondary_500',
171
+ button_secondary_background_fill_dark='*secondary_600',
172
+ button_secondary_text_color='*neutral_900',
173
+ button_secondary_text_color_dark='*neutral_900',
174
+ block_title_text_color='*neutral_900',
175
  button_primary_text_color='*neutral_900',
176
+ block_title_text_color_dark='*neutral_50',
177
  button_primary_text_color_dark='*neutral_900',
178
+ block_border_color='*neutral_300',
179
+ block_border_color_dark='*neutral_700',
180
+ block_background_fill_dark='*neutral_900',
181
+ block_background_fill='*neutral_50',
182
+ checkbox_label_text_color='*neutral_900',
183
+ checkbox_label_background_fill='*neutral_200',
184
+ checkbox_label_background_fill_dark='*neutral_700',
185
+ checkbox_background_color_selected='*primary_500',
186
+ checkbox_background_color_selected_dark='*primary_500',
187
  )
188
  try:
189
  with open(LOGO_PATH, "r") as f:
content.py CHANGED
@@ -236,17 +236,38 @@ def hf_uri_to_web_url(uri: str) -> str:
236
 
237
 
238
  css = """
239
- /* CSS Color Variables using All-Hands-AI color scheme */
240
  :root {
241
- --color-primary-accent: #FFE165; /* Yellow accent from All-Hands-AI */
242
- --color-primary-link: #555555; /* Dark grey links for light mode */
243
- --color-primary-link-dark: #cccccc; /* Light grey links for dark mode */
244
- --color-neutral-light: #D4CABD; /* Tan placeholder */
245
- --color-background-light: #F1EAE0; /* Beige/cream background */
246
- --color-background-dark: #292A36; /* Dark gray */
247
- --color-text-dark: #292A36; /* Dark gray text */
248
- --color-text-light: #F1EAE0; /* Light text for dark backgrounds */
249
- --color-button-hover: #4B5563; /* Darker gray for hover states */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
  }
251
 
252
  /* This makes space for the huggingface header bar which must shown on HF spaces. */
@@ -847,15 +868,16 @@ span.wrap[tabindex="0"][role="button"][data-editable="false"] {
847
  justify-content: space-between;
848
  align-items: center;
849
  flex-grow: 1;
850
- background-color: #083c40;
851
  padding: 16px 20px;
852
  font-weight: 600;
853
  border-radius: 12px;
854
  text-decoration: none;
855
  transition: background-color 0.2s ease-in-out;
 
856
  }
857
  .link-button:hover {
858
- background-color: #0a4c52;
859
  }
860
  .external-link-icon {
861
  font-size: 20px;
@@ -883,8 +905,8 @@ html {
883
  display: flex;
884
  align-items: center;
885
  justify-content: center;
886
- background-color: #FAF2E9;
887
- color: #F0529C;
888
  border-radius: 8px;
889
  font-size: 14px;
890
  text-align: center;
@@ -900,13 +922,13 @@ html {
900
  min-height: 572px;
901
  background-color: #fff;
902
  padding: 24px 32px;
903
- border: 1px solid black;
904
  border-radius: 4px;
905
  }
906
 
907
  .dark .plot-legend-container {
908
- background: rgba(250, 242, 233, 0.1);
909
- border-color: rgb(159, 234, 209);
910
  }
911
 
912
  #plot-legend-logo {
@@ -975,22 +997,22 @@ h3 .header-link-icon {
975
  border-collapse: collapse;
976
  font-size: 13px;
977
  background: #fff;
978
- border: 1px solid #032629;
979
  border-radius: 12px;
980
  overflow: hidden;
981
  }
982
 
983
  .dark .winners-unified-table {
984
- background: rgba(250, 242, 233, 0.05);
985
- border-color: #9fead1;
986
  }
987
 
988
  .winners-unified-table thead tr {
989
- background: linear-gradient(to right, rgba(240, 82, 156, 0.1), rgba(15, 203, 140, 0.1));
990
  }
991
 
992
  .dark .winners-unified-table thead tr {
993
- background: linear-gradient(to right, rgba(240, 82, 156, 0.2), rgba(15, 203, 140, 0.2));
994
  }
995
 
996
  .winners-unified-table .category-header {
@@ -998,16 +1020,16 @@ h3 .header-link-icon {
998
  text-align: center;
999
  font-weight: 700;
1000
  font-size: 13px;
1001
- color: #032629;
1002
- border-bottom: 2px solid #F0529C;
1003
  border-right: 1px solid #eee;
1004
  white-space: nowrap;
1005
  }
1006
 
1007
  .dark .winners-unified-table .category-header {
1008
  color: #fff;
1009
- border-bottom-color: #0FCB8C;
1010
- border-right-color: #2a3a3a;
1011
  }
1012
 
1013
  .winners-unified-table .category-header:last-child {
@@ -1036,16 +1058,16 @@ h3 .header-link-icon {
1036
  }
1037
 
1038
  .winners-unified-table tbody tr:hover {
1039
- background: rgba(240, 82, 156, 0.05);
1040
  }
1041
 
1042
  .dark .winners-unified-table tbody tr:hover {
1043
- background: rgba(15, 203, 140, 0.1);
1044
  }
1045
 
1046
  .winners-unified-table .model-cell {
1047
  white-space: nowrap;
1048
- color: #032629;
1049
  font-weight: 500;
1050
  border-right: none;
1051
  }
@@ -1057,15 +1079,15 @@ h3 .header-link-icon {
1057
  .winners-unified-table .score-cell {
1058
  text-align: right;
1059
  font-weight: 700;
1060
- color: #F0529C;
1061
  padding-right: 12px;
1062
  border-right: 1px solid #eee;
1063
  min-width: 50px;
1064
  }
1065
 
1066
  .dark .winners-unified-table .score-cell {
1067
- color: #0FCB8C;
1068
- border-right-color: #2a3a3a;
1069
  }
1070
 
1071
  .winners-unified-table td:nth-last-child(1) {
 
236
 
237
 
238
  css = """
239
+ /* CSS Color Variables aligned with OpenHands brand (openhands-ui/tokens.css) */
240
  :root {
241
+ /* Primary - Yellow */
242
+ --color-primary-accent: #FFE165;
243
+ --color-primary-light: #FFF3C0;
244
+ --color-primary-dark: #BBA54A;
245
+
246
+ /* Secondary - Green */
247
+ --color-secondary-accent: #BCFF8C;
248
+ --color-secondary-dark: #577641;
249
+
250
+ /* Neutral - Grey scale */
251
+ --color-neutral-50: #F7F8FB;
252
+ --color-neutral-100: #EBEDF3;
253
+ --color-neutral-200: #D4D8E7;
254
+ --color-neutral-300: #B1B9D3;
255
+ --color-neutral-700: #2F3137;
256
+ --color-neutral-800: #222328;
257
+ --color-neutral-900: #18191C;
258
+ --color-neutral-950: #0D0D0F;
259
+
260
+ /* Semantic colors */
261
+ --color-primary-link: #2F3137;
262
+ --color-primary-link-dark: #B1B9D3;
263
+ --color-background-light: #F7F8FB;
264
+ --color-background-dark: #18191C;
265
+ --color-text-dark: #0D0D0F;
266
+ --color-text-light: #F7F8FB;
267
+ --color-button-hover: #222328;
268
+
269
+ /* Danger/Error - Red */
270
+ --color-danger: #FF684E;
271
  }
272
 
273
  /* This makes space for the huggingface header bar which must shown on HF spaces. */
 
868
  justify-content: space-between;
869
  align-items: center;
870
  flex-grow: 1;
871
+ background-color: var(--color-neutral-800);
872
  padding: 16px 20px;
873
  font-weight: 600;
874
  border-radius: 12px;
875
  text-decoration: none;
876
  transition: background-color 0.2s ease-in-out;
877
+ color: var(--color-text-light);
878
  }
879
  .link-button:hover {
880
+ background-color: var(--color-neutral-700);
881
  }
882
  .external-link-icon {
883
  font-size: 20px;
 
905
  display: flex;
906
  align-items: center;
907
  justify-content: center;
908
+ background-color: var(--color-neutral-100);
909
+ color: var(--color-primary-accent);
910
  border-radius: 8px;
911
  font-size: 14px;
912
  text-align: center;
 
922
  min-height: 572px;
923
  background-color: #fff;
924
  padding: 24px 32px;
925
+ border: 1px solid var(--color-neutral-300);
926
  border-radius: 4px;
927
  }
928
 
929
  .dark .plot-legend-container {
930
+ background: rgba(247, 248, 251, 0.1);
931
+ border-color: var(--color-neutral-700);
932
  }
933
 
934
  #plot-legend-logo {
 
997
  border-collapse: collapse;
998
  font-size: 13px;
999
  background: #fff;
1000
+ border: 1px solid var(--color-neutral-300);
1001
  border-radius: 12px;
1002
  overflow: hidden;
1003
  }
1004
 
1005
  .dark .winners-unified-table {
1006
+ background: rgba(247, 248, 251, 0.05);
1007
+ border-color: var(--color-neutral-700);
1008
  }
1009
 
1010
  .winners-unified-table thead tr {
1011
+ background: linear-gradient(to right, rgba(255, 225, 101, 0.15), rgba(188, 255, 140, 0.15));
1012
  }
1013
 
1014
  .dark .winners-unified-table thead tr {
1015
+ background: linear-gradient(to right, rgba(255, 225, 101, 0.2), rgba(188, 255, 140, 0.2));
1016
  }
1017
 
1018
  .winners-unified-table .category-header {
 
1020
  text-align: center;
1021
  font-weight: 700;
1022
  font-size: 13px;
1023
+ color: var(--color-text-dark);
1024
+ border-bottom: 2px solid var(--color-primary-accent);
1025
  border-right: 1px solid #eee;
1026
  white-space: nowrap;
1027
  }
1028
 
1029
  .dark .winners-unified-table .category-header {
1030
  color: #fff;
1031
+ border-bottom-color: var(--color-primary-accent);
1032
+ border-right-color: var(--color-neutral-700);
1033
  }
1034
 
1035
  .winners-unified-table .category-header:last-child {
 
1058
  }
1059
 
1060
  .winners-unified-table tbody tr:hover {
1061
+ background: rgba(255, 225, 101, 0.1);
1062
  }
1063
 
1064
  .dark .winners-unified-table tbody tr:hover {
1065
+ background: rgba(255, 225, 101, 0.15);
1066
  }
1067
 
1068
  .winners-unified-table .model-cell {
1069
  white-space: nowrap;
1070
+ color: var(--color-text-dark);
1071
  font-weight: 500;
1072
  border-right: none;
1073
  }
 
1079
  .winners-unified-table .score-cell {
1080
  text-align: right;
1081
  font-weight: 700;
1082
+ color: var(--color-primary-dark);
1083
  padding-right: 12px;
1084
  border-right: 1px solid #eee;
1085
  min-width: 50px;
1086
  }
1087
 
1088
  .dark .winners-unified-table .score-cell {
1089
+ color: var(--color-primary-accent);
1090
+ border-right-color: var(--color-neutral-700);
1091
  }
1092
 
1093
  .winners-unified-table td:nth-last-child(1) {
leaderboard_transformer.py CHANGED
@@ -504,7 +504,7 @@ def _plot_scatter_plotly(
504
  mode='lines',
505
  name='Efficiency Frontier',
506
  showlegend=False,
507
- line=dict(color='#0FCB8C', width=2, dash='dash'),
508
  hoverinfo='skip'
509
  ))
510
 
@@ -696,8 +696,8 @@ def _plot_scatter_plotly(
696
  yshift=25, # Move label higher above the icon
697
  font=dict(
698
  size=10,
699
- color='#032629',
700
- family='Manrope'
701
  ),
702
  xanchor='center',
703
  yanchor='bottom'
@@ -717,21 +717,21 @@ def _plot_scatter_plotly(
717
  else:
718
  plot_title = f"OpenHands Index {name} Cost/Performance"
719
 
720
- # Build layout configuration
721
  layout_config = dict(
722
  template="plotly_white",
723
  title=plot_title,
724
  xaxis=xaxis_config,
725
  yaxis=dict(title="Average score", range=[y_min, y_max]), # Match domain calculation
726
  legend=dict(
727
- bgcolor='#FAF2E9',
728
  ),
729
  height=572,
730
  hoverlabel=dict(
731
- bgcolor="#105257",
732
  font_size=12,
733
- font_family="Manrope",
734
- font_color="#d3dedc",
735
  ),
736
  )
737
 
 
504
  mode='lines',
505
  name='Efficiency Frontier',
506
  showlegend=False,
507
+ line=dict(color='#FFE165', width=2, dash='dash'), # primary yellow
508
  hoverinfo='skip'
509
  ))
510
 
 
696
  yshift=25, # Move label higher above the icon
697
  font=dict(
698
  size=10,
699
+ color='#0D0D0F', # neutral-950
700
+ family='Outfit'
701
  ),
702
  xanchor='center',
703
  yanchor='bottom'
 
717
  else:
718
  plot_title = f"OpenHands Index {name} Cost/Performance"
719
 
720
+ # Build layout configuration - colors aligned with OpenHands brand
721
  layout_config = dict(
722
  template="plotly_white",
723
  title=plot_title,
724
  xaxis=xaxis_config,
725
  yaxis=dict(title="Average score", range=[y_min, y_max]), # Match domain calculation
726
  legend=dict(
727
+ bgcolor='#F7F8FB', # neutral-50
728
  ),
729
  height=572,
730
  hoverlabel=dict(
731
+ bgcolor="#222328", # neutral-800
732
  font_size=12,
733
+ font_family="Outfit",
734
+ font_color="#F7F8FB", # neutral-50
735
  ),
736
  )
737
 
visualizations.py CHANGED
@@ -13,25 +13,26 @@ import aliases
13
  from ui_components import get_company_from_model, get_svg_as_data_uri
14
 
15
  # Standard layout configuration matching existing charts
 
16
  STANDARD_LAYOUT = dict(
17
  template="plotly_white",
18
  height=572,
19
  hoverlabel=dict(
20
- bgcolor="#105257",
21
  font_size=12,
22
- font_family="Manrope",
23
- font_color="#d3dedc",
24
  ),
25
  legend=dict(
26
- bgcolor='#FAF2E9',
27
  ),
28
  )
29
 
30
  # Standard font for annotations
31
  STANDARD_FONT = dict(
32
  size=10,
33
- color='#032629',
34
- family='Manrope'
35
  )
36
 
37
 
@@ -125,7 +126,7 @@ def create_evolution_over_time_chart(df: pd.DataFrame) -> go.Figure:
125
  x=plot_df['release_date'],
126
  y=plot_df[score_col],
127
  mode='lines',
128
- line=dict(color='#0FCB8C', width=2, dash='dash'),
129
  name='Trend',
130
  hoverinfo='skip',
131
  showlegend=False
 
13
  from ui_components import get_company_from_model, get_svg_as_data_uri
14
 
15
  # Standard layout configuration matching existing charts
16
+ # Colors aligned with OpenHands brand
17
  STANDARD_LAYOUT = dict(
18
  template="plotly_white",
19
  height=572,
20
  hoverlabel=dict(
21
+ bgcolor="#222328", # neutral-800
22
  font_size=12,
23
+ font_family="Outfit",
24
+ font_color="#F7F8FB", # neutral-50
25
  ),
26
  legend=dict(
27
+ bgcolor='#F7F8FB', # neutral-50
28
  ),
29
  )
30
 
31
  # Standard font for annotations
32
  STANDARD_FONT = dict(
33
  size=10,
34
+ color='#0D0D0F', # neutral-950
35
+ family='Outfit'
36
  )
37
 
38
 
 
126
  x=plot_df['release_date'],
127
  y=plot_df[score_col],
128
  mode='lines',
129
+ line=dict(color='#FFE165', width=2, dash='dash'), # primary yellow
130
  name='Trend',
131
  hoverinfo='skip',
132
  showlegend=False