Lisa Dunlap commited on
Commit
ed08878
β€’
1 Parent(s): bf3bf20

added buttons, changed theme, buttons on dataframe and plot seperate

Browse files
Files changed (2) hide show
  1. app.py +154 -44
  2. theme.json +1 -0
app.py CHANGED
@@ -31,18 +31,45 @@ We've collected over **500,000** human preference votes to rank LLMs with the El
31
  return leaderboard_md
32
 
33
 
34
- def make_arena_leaderboard_md(arena_df):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  total_votes = sum(arena_df["num_battles"]) // 2
36
- total_models = len(arena_df)
 
 
37
 
 
38
  leaderboard_md = f"""
39
- Total #models: **{total_models}**. Total #votes: **{total_votes}**. Last updated: March 29, 2024.
 
 
 
 
40
 
41
  Contribute your vote πŸ—³οΈ at [chat.lmsys.org](https://chat.lmsys.org)! Find more analysis in the [notebook]({notebook_url}).
42
  """
 
43
  return leaderboard_md
44
 
45
 
 
46
  def make_full_leaderboard_md(elo_results):
47
  leaderboard_md = f"""
48
  Three benchmarks are displayed: **Arena Elo**, **MT-Bench** and **MMLU**.
@@ -202,51 +229,76 @@ def get_full_table(arena_df, model_table_df):
202
  values.sort(key=lambda x: -x[1] if not np.isnan(x[1]) else 1e9)
203
  return values
204
 
205
-
206
- def get_arena_table(arena_df, model_table_df):
 
 
 
 
 
 
 
 
207
  # sort by rating
208
- arena_df = arena_df.sort_values(by=["rating"], ascending=False)
 
 
 
 
 
 
209
  values = []
210
  for i in range(len(arena_df)):
211
  row = []
212
  model_key = arena_df.index[i]
213
- model_name = model_table_df[model_table_df["key"] == model_key]["Model"].values[
214
- 0
215
- ]
216
-
217
- # rank
218
- ranking = arena_df.iloc[i].get("final_ranking") or i+1
219
- row.append(ranking)
220
- # model display name
221
- row.append(model_name)
222
- # elo rating
223
- row.append(round(arena_df.iloc[i]["rating"]))
224
- upper_diff = round(
225
- arena_df.iloc[i]["rating_q975"] - arena_df.iloc[i]["rating"]
226
- )
227
- lower_diff = round(
228
- arena_df.iloc[i]["rating"] - arena_df.iloc[i]["rating_q025"]
229
- )
230
- row.append(f"+{upper_diff}/-{lower_diff}")
231
- # num battles
232
- row.append(round(arena_df.iloc[i]["num_battles"]))
233
- # Organization
234
- row.append(
235
- model_table_df[model_table_df["key"] == model_key]["Organization"].values[0]
236
- )
237
- # license
238
- row.append(
239
- model_table_df[model_table_df["key"] == model_key]["License"].values[0]
240
- )
 
241
 
242
- cutoff_date = model_table_df[model_table_df["key"] == model_key]["Knowledge cutoff date"].values[0]
243
- if cutoff_date == "-":
244
- row.append("Unknown")
245
- else:
246
- row.append(cutoff_date)
247
- values.append(row)
 
 
248
  return values
249
 
 
 
 
 
 
 
 
 
250
  def build_leaderboard_tab(elo_results_file, leaderboard_table_file, show_plot=False):
251
  if elo_results_file is None: # Do live update
252
  default_md = "Loading ..."
@@ -255,6 +307,9 @@ def build_leaderboard_tab(elo_results_file, leaderboard_table_file, show_plot=Fa
255
  with open(elo_results_file, "rb") as fin:
256
  elo_results = pickle.load(fin)
257
  if "full" in elo_results:
 
 
 
258
  elo_results = elo_results["full"]
259
 
260
  p1 = elo_results["win_fraction_heatmap"]
@@ -262,6 +317,9 @@ def build_leaderboard_tab(elo_results_file, leaderboard_table_file, show_plot=Fa
262
  p3 = elo_results["bootstrap_elo_rating"]
263
  p4 = elo_results["average_win_rate_bar"]
264
  arena_df = elo_results["leaderboard_table_df"]
 
 
 
265
  default_md = make_default_md(arena_df, elo_results)
266
 
267
  md_1 = gr.Markdown(default_md, elem_id="leaderboard_markdown")
@@ -273,9 +331,18 @@ def build_leaderboard_tab(elo_results_file, leaderboard_table_file, show_plot=Fa
273
  # arena table
274
  arena_table_vals = get_arena_table(arena_df, model_table_df)
275
  with gr.Tab("Arena Elo", id=0):
276
- md = make_arena_leaderboard_md(arena_df)
277
  gr.Markdown(md, elem_id="leaderboard_markdown")
278
- gr.Dataframe(
 
 
 
 
 
 
 
 
 
279
  headers=[
280
  "Rank",
281
  "πŸ€– Model",
@@ -299,9 +366,15 @@ def build_leaderboard_tab(elo_results_file, leaderboard_table_file, show_plot=Fa
299
  value=arena_table_vals,
300
  elem_id="arena_leaderboard_dataframe",
301
  height=700,
302
- column_widths=[50, 200, 120, 100, 100, 150, 150, 100],
303
  wrap=True,
304
  )
 
 
 
 
 
 
305
  with gr.Tab("Full Leaderboard", id=1):
306
  md = make_full_leaderboard_md(elo_results)
307
  gr.Markdown(md, elem_id="leaderboard_markdown")
@@ -350,6 +423,15 @@ You can find more discussions in this blog [post](https://lmsys.org/blog/2023-12
350
  """,
351
  elem_id="leaderboard_markdown"
352
  )
 
 
 
 
 
 
 
 
 
353
  with gr.Row():
354
  with gr.Column():
355
  gr.Markdown(
@@ -372,6 +454,11 @@ You can find more discussions in this blog [post](https://lmsys.org/blog/2023-12
372
  "#### Figure 4: Average Win Rate Against All Other Models (Assuming Uniform Sampling and No Ties)"
373
  )
374
  plot_4 = gr.Plot(p4, show_label=False)
 
 
 
 
 
375
 
376
  gr.Markdown(acknowledgment_md)
377
 
@@ -379,6 +466,7 @@ You can find more discussions in this blog [post](https://lmsys.org/blog/2023-12
379
  return [md_1, plot_1, plot_2, plot_3, plot_4]
380
  return [md_1]
381
 
 
382
  block_css = """
383
  #notice_markdown {
384
  font-size: 104%
@@ -397,9 +485,28 @@ block_css = """
397
  padding-top: 6px;
398
  padding-bottom: 6px;
399
  }
 
400
  #leaderboard_dataframe td {
401
  line-height: 0.1em;
402
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
403
  footer {
404
  display:none !important
405
  }
@@ -429,10 +536,13 @@ We thank [Kaggle](https://www.kaggle.com/), [MBZUAI](https://mbzuai.ac.ae/), [a1
429
 
430
  def build_demo(elo_results_file, leaderboard_table_file):
431
  text_size = gr.themes.sizes.text_lg
 
432
 
433
  with gr.Blocks(
434
  title="Chatbot Arena Leaderboard",
435
- theme=gr.themes.Base(text_size=text_size),
 
 
436
  css=block_css,
437
  ) as demo:
438
  leader_components = build_leaderboard_tab(
 
31
  return leaderboard_md
32
 
33
 
34
+ # def make_arena_leaderboard_md(arena_df, arena_chinese_df, arena_long_df, arena_english_df):
35
+ # total_votes = sum(arena_df["num_battles"]) // 2
36
+ # total_models = len(arena_df)
37
+ # total_code_votes = sum(arena_chinese_df["num_battles"]) // 2
38
+ # total_code_models = len(arena_chinese_df)
39
+ # total_long_votes = sum(arena_long_df["num_battles"]) // 2
40
+ # total_long_models = len(arena_long_df)
41
+ # total_english_votes = sum(arena_english_df["num_battles"]) // 2
42
+ # total_english_models = len(arena_english_df)
43
+
44
+ # leaderboard_md = f"""
45
+ # Total #models: **{total_models}**. Total #votes: **{total_votes}**. Total code #votes: **{total_code_votes}**. Last updated: March 29, 2024.
46
+
47
+ # Contribute your vote πŸ—³οΈ at [chat.lmsys.org](https://chat.lmsys.org)! Find more analysis in the [notebook]({notebook_url}).
48
+ # """
49
+ # return leaderboard_md
50
+
51
+ def make_arena_leaderboard_md(arena_df, arena_chinese_df, arena_long_df, arena_english_df):
52
+ # Calculate totals for each arena
53
  total_votes = sum(arena_df["num_battles"]) // 2
54
+ total_chinese_votes = sum(arena_chinese_df["num_battles"]) // 2
55
+ total_long_votes = sum(arena_long_df["num_battles"]) // 2
56
+ total_english_votes = sum(arena_english_df["num_battles"]) // 2
57
 
58
+ # Constructing the markdown table
59
  leaderboard_md = f"""
60
+ Last updated: March 29, 2024.
61
+ | | **Total** | English | Chinese | Long Context |
62
+ | :-------------- | :-----------------------: | :-----------------------: | :-----------------------: | :-----------------------: |
63
+ | # Votes | **{"{:,}".format(total_votes)}** | {"{:,}".format(total_english_votes)} | {"{:,}".format(total_chinese_votes)} | {"{:,}".format(total_long_votes)} |
64
+ | # Models | **{len(arena_df)}** | {len(arena_english_df)}| {len(arena_chinese_df)} | {len(arena_long_df)} |
65
 
66
  Contribute your vote πŸ—³οΈ at [chat.lmsys.org](https://chat.lmsys.org)! Find more analysis in the [notebook]({notebook_url}).
67
  """
68
+
69
  return leaderboard_md
70
 
71
 
72
+
73
  def make_full_leaderboard_md(elo_results):
74
  leaderboard_md = f"""
75
  Three benchmarks are displayed: **Arena Elo**, **MT-Bench** and **MMLU**.
 
229
  values.sort(key=lambda x: -x[1] if not np.isnan(x[1]) else 1e9)
230
  return values
231
 
232
+ def create_ranking_str(ranking, ranking_difference):
233
+ if ranking_difference > 0:
234
+ return f"{int(ranking)} (\u2191 {int(ranking_difference)})"
235
+ elif ranking_difference < 0:
236
+ return f"{int(ranking)} (\u2193 {int(-ranking_difference)})"
237
+ else:
238
+ return f"{int(ranking)}"
239
+
240
+ def get_arena_table(arena_df, model_table_df, arena_subset_df=None):
241
+ arena_df = arena_df.sort_values(by=["final_ranking"], ascending=True)
242
  # sort by rating
243
+ if arena_subset_df is not None:
244
+ arena_subset_df = arena_subset_df.sort_values(by=["final_ranking"], ascending=True)
245
+ # join arena_df and arena_subset_df on index
246
+ arena_df = arena_subset_df.join(arena_df["final_ranking"], rsuffix="_global", how="inner")
247
+ arena_df['ranking_difference'] = arena_df['final_ranking_global'] - arena_df['final_ranking']
248
+ arena_df["final_ranking"] = arena_df.apply(lambda x: create_ranking_str(x["final_ranking"], x["ranking_difference"]), axis=1)
249
+
250
  values = []
251
  for i in range(len(arena_df)):
252
  row = []
253
  model_key = arena_df.index[i]
254
+ try:
255
+ model_name = model_table_df[model_table_df["key"] == model_key]["Model"].values[
256
+ 0
257
+ ]
258
+
259
+ # rank
260
+ ranking = arena_df.iloc[i].get("final_ranking") or i+1
261
+ row.append(ranking)
262
+ # model display name
263
+ row.append(model_name)
264
+ # elo rating
265
+ row.append(round(arena_df.iloc[i]["rating"]))
266
+ upper_diff = round(
267
+ arena_df.iloc[i]["rating_q975"] - arena_df.iloc[i]["rating"]
268
+ )
269
+ lower_diff = round(
270
+ arena_df.iloc[i]["rating"] - arena_df.iloc[i]["rating_q025"]
271
+ )
272
+ row.append(f"+{upper_diff}/-{lower_diff}")
273
+ # num battles
274
+ row.append(round(arena_df.iloc[i]["num_battles"]))
275
+ # Organization
276
+ row.append(
277
+ model_table_df[model_table_df["key"] == model_key]["Organization"].values[0]
278
+ )
279
+ # license
280
+ row.append(
281
+ model_table_df[model_table_df["key"] == model_key]["License"].values[0]
282
+ )
283
 
284
+ cutoff_date = model_table_df[model_table_df["key"] == model_key]["Knowledge cutoff date"].values[0]
285
+ if cutoff_date == "-":
286
+ row.append("Unknown")
287
+ else:
288
+ row.append(cutoff_date)
289
+ values.append(row)
290
+ except Exception as e:
291
+ print(f"{model_key} - {e}")
292
  return values
293
 
294
+ def get_plots(elo_subset_results):
295
+ p1 = elo_subset_results["win_fraction_heatmap"]
296
+ p2 = elo_subset_results["battle_count_heatmap"]
297
+ p3 = elo_subset_results["bootstrap_elo_rating"]
298
+ p4 = elo_subset_results["average_win_rate_bar"]
299
+ return p1, p2, p3, p4
300
+
301
+
302
  def build_leaderboard_tab(elo_results_file, leaderboard_table_file, show_plot=False):
303
  if elo_results_file is None: # Do live update
304
  default_md = "Loading ..."
 
307
  with open(elo_results_file, "rb") as fin:
308
  elo_results = pickle.load(fin)
309
  if "full" in elo_results:
310
+ elo_chinese_results = elo_results["chinese"]
311
+ elo_long_results = elo_results["long"]
312
+ elo_english_results = elo_results["english"]
313
  elo_results = elo_results["full"]
314
 
315
  p1 = elo_results["win_fraction_heatmap"]
 
317
  p3 = elo_results["bootstrap_elo_rating"]
318
  p4 = elo_results["average_win_rate_bar"]
319
  arena_df = elo_results["leaderboard_table_df"]
320
+ arena_chinese_df = elo_chinese_results["leaderboard_table_df"]
321
+ arena_long_df = elo_long_results["leaderboard_table_df"]
322
+ arena_english_df = elo_english_results["leaderboard_table_df"]
323
  default_md = make_default_md(arena_df, elo_results)
324
 
325
  md_1 = gr.Markdown(default_md, elem_id="leaderboard_markdown")
 
331
  # arena table
332
  arena_table_vals = get_arena_table(arena_df, model_table_df)
333
  with gr.Tab("Arena Elo", id=0):
334
+ md = make_arena_leaderboard_md(arena_df, arena_chinese_df, arena_long_df, arena_english_df)
335
  gr.Markdown(md, elem_id="leaderboard_markdown")
336
+ with gr.Row():
337
+ overall_rating = gr.Button("Overall")
338
+ update_overall_rating_df = lambda _: get_arena_table(arena_df, model_table_df)
339
+ english_rating = gr.Button("English")
340
+ update_english_rating_df = lambda _: get_arena_table(arena_df, model_table_df, arena_english_df)
341
+ chinese_rating = gr.Button("Chinese")
342
+ update_chinese_rating_df = lambda _: get_arena_table(arena_df, model_table_df, arena_chinese_df)
343
+ long_context_rating = gr.Button("Long Context")
344
+ update_long_context_rating_df = lambda _: get_arena_table(arena_df, model_table_df, arena_long_df)
345
+ elo_display_df = gr.Dataframe(
346
  headers=[
347
  "Rank",
348
  "πŸ€– Model",
 
366
  value=arena_table_vals,
367
  elem_id="arena_leaderboard_dataframe",
368
  height=700,
369
+ column_widths=[70, 190, 120, 100, 90, 140, 150, 140],
370
  wrap=True,
371
  )
372
+ # Setup the button click action
373
+ overall_rating.click(fn=update_overall_rating_df, inputs=overall_rating, outputs=elo_display_df)
374
+ english_rating.click(fn=update_english_rating_df, inputs=english_rating, outputs=elo_display_df)
375
+ chinese_rating.click(fn=update_chinese_rating_df, inputs=chinese_rating ,outputs=elo_display_df)
376
+ long_context_rating.click(fn=update_long_context_rating_df, inputs=long_context_rating, outputs=elo_display_df)
377
+
378
  with gr.Tab("Full Leaderboard", id=1):
379
  md = make_full_leaderboard_md(elo_results)
380
  gr.Markdown(md, elem_id="leaderboard_markdown")
 
423
  """,
424
  elem_id="leaderboard_markdown"
425
  )
426
+ with gr.Row():
427
+ overall_plots = gr.Button("Overall")
428
+ update_overall_plots = lambda _: get_plots(elo_results)
429
+ english_plots = gr.Button("English")
430
+ update_english_plot = lambda _: get_plots(elo_english_results)
431
+ chinese_plots = gr.Button("Chinese")
432
+ update_chinese_plot = lambda _: get_plots(elo_chinese_results)
433
+ long_context_plots = gr.Button("Long Context")
434
+ update_long_context_plot = lambda _: get_plots(elo_long_results)
435
  with gr.Row():
436
  with gr.Column():
437
  gr.Markdown(
 
454
  "#### Figure 4: Average Win Rate Against All Other Models (Assuming Uniform Sampling and No Ties)"
455
  )
456
  plot_4 = gr.Plot(p4, show_label=False)
457
+
458
+ overall_plots.click(fn=update_overall_plots, inputs=overall_plots, outputs=[plot_1, plot_2, plot_3, plot_4])
459
+ english_plots.click(fn=update_english_plot, inputs=english_plots, outputs=[plot_1, plot_2, plot_3, plot_4])
460
+ chinese_plots.click(fn=update_chinese_plot, inputs=chinese_plots, outputs=[plot_1, plot_2, plot_3, plot_4])
461
+ long_context_plots.click(fn=update_long_context_plot, inputs=long_context_plots, outputs=[plot_1, plot_2, plot_3, plot_4])
462
 
463
  gr.Markdown(acknowledgment_md)
464
 
 
466
  return [md_1, plot_1, plot_2, plot_3, plot_4]
467
  return [md_1]
468
 
469
+
470
  block_css = """
471
  #notice_markdown {
472
  font-size: 104%
 
485
  padding-top: 6px;
486
  padding-bottom: 6px;
487
  }
488
+
489
  #leaderboard_dataframe td {
490
  line-height: 0.1em;
491
  }
492
+
493
+ #arena_leaderboard_dataframe td {
494
+ line-height: 0.15em;
495
+ font-size: 20px;
496
+ }
497
+ #arena_leaderboard_dataframe th {
498
+ font-size: 20px;
499
+ }
500
+
501
+
502
+ #full_leaderboard_dataframe td {
503
+ line-height: 0.15em;
504
+ font-size: 20px;
505
+ }
506
+ #full_leaderboard_dataframe th {
507
+ font-size: 20px;
508
+ }
509
+
510
  footer {
511
  display:none !important
512
  }
 
536
 
537
  def build_demo(elo_results_file, leaderboard_table_file):
538
  text_size = gr.themes.sizes.text_lg
539
+ print("text_size", text_size)
540
 
541
  with gr.Blocks(
542
  title="Chatbot Arena Leaderboard",
543
+ # theme=gr.themes.Soft(text_size=text_size),
544
+ # theme='reilnuud/polite',
545
+ theme = gr.themes.Base.load("theme.json"),
546
  css=block_css,
547
  ) as demo:
548
  leader_components = build_leaderboard_tab(
theme.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"theme": {"_font": [{"__gradio_font__": true, "name": "Rubik", "class": "google"}, {"__gradio_font__": true, "name": "ui-sans-serif", "class": "font"}, {"__gradio_font__": true, "name": "system-ui", "class": "font"}, {"__gradio_font__": true, "name": "sans-serif", "class": "font"}], "_font_mono": [{"__gradio_font__": true, "name": "Inconsolata", "class": "google"}, {"__gradio_font__": true, "name": "ui-monospace", "class": "font"}, {"__gradio_font__": true, "name": "Consolas", "class": "font"}, {"__gradio_font__": true, "name": "monospace", "class": "font"}], "_stylesheets": ["https://fonts.googleapis.com/css2?family=Rubik:wght@400;500&display=swap", "https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;500&display=swap"], "text_size": "20px", "background_fill_primary": "white", "background_fill_primary_dark": "*neutral_950", "background_fill_secondary": "*neutral_50", "background_fill_secondary_dark": "*neutral_900", "block_background_fill": "*background_fill_primary", "block_background_fill_dark": "*neutral_800", "block_border_color": "*border_color_primary", "block_border_color_dark": "*border_color_primary", "block_border_width": "1px", "block_border_width_dark": "1px", "block_info_text_color": "*body_text_color_subdued", "block_info_text_color_dark": "*body_text_color_subdued", "block_info_text_size": "*text_sm", "block_info_text_weight": "400", "block_label_background_fill": "*background_fill_primary", "block_label_background_fill_dark": "*background_fill_secondary", "block_label_border_color": "*border_color_primary", "block_label_border_color_dark": "*border_color_primary", "block_label_border_width": "1px", "block_label_border_width_dark": "1px", "block_label_margin": "0", "block_label_padding": "*spacing_sm *spacing_lg", "block_label_radius": "calc(*radius_lg - 1px) 0 calc(*radius_lg - 1px) 0", "block_label_right_radius": "0 calc(*radius_lg - 1px) 0 calc(*radius_lg - 1px)", "block_label_shadow": "*block_shadow", "block_label_text_color": "*neutral_500", "block_label_text_color_dark": "*neutral_200", "block_label_text_size": "*text_sm", "block_label_text_weight": "400", "block_padding": "*spacing_xl calc(*spacing_xl + 2px)", "block_radius": "*radius_lg", "block_shadow": "none", "block_shadow_dark": "none", "block_title_background_fill": "none", "block_title_background_fill_dark": "none", "block_title_border_color": "none", "block_title_border_color_dark": "none", "block_title_border_width": "0px", "block_title_border_width_dark": "0px", "block_title_padding": "0", "block_title_radius": "none", "block_title_text_color": "*neutral_500", "block_title_text_color_dark": "*neutral_200", "block_title_text_size": "*text_md", "block_title_text_weight": "400", "body_background_fill": "*background_fill_primary", "body_background_fill_dark": "*background_fill_primary", "body_text_color": "*neutral_700", "body_text_color_dark": "*neutral_200", "body_text_color_subdued": "*neutral_400", "body_text_color_subdued_dark": "*neutral_500", "body_text_size": "*text_md", "body_text_weight": "400", "border_color_accent": "*primary_300", "border_color_accent_dark": "*neutral_600", "border_color_primary": "*neutral_200", "border_color_primary_dark": "*neutral_700", "button_border_width": "*input_border_width", "button_border_width_dark": "*input_border_width", "button_cancel_background_fill": "*button_secondary_background_fill", "button_cancel_background_fill_dark": "*button_secondary_background_fill", "button_cancel_background_fill_hover": "*button_cancel_background_fill", "button_cancel_background_fill_hover_dark": "*button_cancel_background_fill", "button_cancel_border_color": "*button_secondary_border_color", "button_cancel_border_color_dark": "*button_secondary_border_color", "button_cancel_border_color_hover": "*button_cancel_border_color", "button_cancel_border_color_hover_dark": "*button_cancel_border_color", "button_cancel_text_color": "*button_secondary_text_color", "button_cancel_text_color_dark": "*button_secondary_text_color", "button_cancel_text_color_hover": "*button_cancel_text_color", "button_cancel_text_color_hover_dark": "*button_cancel_text_color", "button_large_padding": "*spacing_lg calc(2 * *spacing_lg)", "button_large_radius": "*radius_lg", "button_large_text_size": "*text_lg", "button_large_text_weight": "500", "button_primary_background_fill": "*primary_200", "button_primary_background_fill_dark": "*primary_700", "button_primary_background_fill_hover": "*button_primary_background_fill", "button_primary_background_fill_hover_dark": "*button_primary_background_fill", "button_primary_border_color": "*primary_200", "button_primary_border_color_dark": "*primary_600", "button_primary_border_color_hover": "*button_primary_border_color", "button_primary_border_color_hover_dark": "*button_primary_border_color", "button_primary_text_color": "*primary_600", "button_primary_text_color_dark": "white", "button_primary_text_color_hover": "*button_primary_text_color", "button_primary_text_color_hover_dark": "*button_primary_text_color", "button_secondary_background_fill": "*neutral_200", "button_secondary_background_fill_dark": "*neutral_600", "button_secondary_background_fill_hover": "*neutral_300", "button_secondary_background_fill_hover_dark": "*neutral_500", "button_secondary_border_color": "*neutral_200", "button_secondary_border_color_dark": "*neutral_600", "button_secondary_border_color_hover": "*button_secondary_border_color", "button_secondary_border_color_hover_dark": "*button_secondary_border_color", "button_secondary_text_color": "*neutral_700", "button_secondary_text_color_dark": "white", "button_secondary_text_color_hover": "*button_secondary_text_color", "button_secondary_text_color_hover_dark": "*button_secondary_text_color", "button_shadow": "none", "button_shadow_active": "none", "button_shadow_hover": "none", "button_small_padding": "*spacing_sm calc(2 * *spacing_sm)", "button_small_radius": "*radius_lg", "button_small_text_size": "*text_md", "button_small_text_weight": "400", "button_transition": "background-color 0.2s ease", "checkbox_background_color": "*background_fill_primary", "checkbox_background_color_dark": "*neutral_800", "checkbox_background_color_focus": "*checkbox_background_color", "checkbox_background_color_focus_dark": "*checkbox_background_color", "checkbox_background_color_hover": "*checkbox_background_color", "checkbox_background_color_hover_dark": "*checkbox_background_color", "checkbox_background_color_selected": "*secondary_600", "checkbox_background_color_selected_dark": "*secondary_600", "checkbox_border_color": "*neutral_300", "checkbox_border_color_dark": "*neutral_700", "checkbox_border_color_focus": "*secondary_500", "checkbox_border_color_focus_dark": "*secondary_500", "checkbox_border_color_hover": "*neutral_300", "checkbox_border_color_hover_dark": "*neutral_600", "checkbox_border_color_selected": "*secondary_600", "checkbox_border_color_selected_dark": "*secondary_600", "checkbox_border_radius": "*radius_sm", "checkbox_border_width": "*input_border_width", "checkbox_border_width_dark": "*input_border_width", "checkbox_check": "url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\")", "checkbox_label_background_fill": "*button_secondary_background_fill", "checkbox_label_background_fill_dark": "*button_secondary_background_fill", "checkbox_label_background_fill_hover": "*button_secondary_background_fill_hover", "checkbox_label_background_fill_hover_dark": "*button_secondary_background_fill_hover", "checkbox_label_background_fill_selected": "*checkbox_label_background_fill", "checkbox_label_background_fill_selected_dark": "*checkbox_label_background_fill", "checkbox_label_border_color": "*border_color_primary", "checkbox_label_border_color_dark": "*border_color_primary", "checkbox_label_border_color_hover": "*checkbox_label_border_color", "checkbox_label_border_color_hover_dark": "*checkbox_label_border_color", "checkbox_label_border_width": "*input_border_width", "checkbox_label_border_width_dark": "*input_border_width", "checkbox_label_gap": "*spacing_lg", "checkbox_label_padding": "*spacing_md calc(2 * *spacing_md)", "checkbox_label_shadow": "none", "checkbox_label_text_color": "*body_text_color", "checkbox_label_text_color_dark": "*body_text_color", "checkbox_label_text_color_selected": "*checkbox_label_text_color", "checkbox_label_text_color_selected_dark": "*checkbox_label_text_color", "checkbox_label_text_size": "*text_md", "checkbox_label_text_weight": "400", "checkbox_shadow": "*input_shadow", "color_accent": "*primary_500", "color_accent_soft": "*primary_50", "color_accent_soft_dark": "*neutral_700", "container_radius": "*radius_lg", "embed_radius": "*radius_md", "error_background_fill": "#fee2e2", "error_background_fill_dark": "*background_fill_primary", "error_border_color": "#fecaca", "error_border_color_dark": "*border_color_primary", "error_border_width": "1px", "error_border_width_dark": "1px", "error_text_color": "#ef4444", "error_text_color_dark": "#ef4444", "font": "'Rubik', 'ui-sans-serif', 'system-ui', sans-serif", "font_mono": "'Inconsolata', 'ui-monospace', 'Consolas', monospace", "form_gap_width": "0px", "input_background_fill": "*neutral_100", "input_background_fill_dark": "*neutral_700", "input_background_fill_focus": "*secondary_500", "input_background_fill_focus_dark": "*secondary_600", "input_background_fill_hover": "*input_background_fill", "input_background_fill_hover_dark": "*input_background_fill", "input_border_color": "*border_color_primary", "input_border_color_dark": "*border_color_primary", "input_border_color_focus": "*secondary_300", "input_border_color_focus_dark": "*neutral_700", "input_border_color_hover": "*input_border_color", "input_border_color_hover_dark": "*input_border_color", "input_border_width": "0px", "input_border_width_dark": "0px", "input_padding": "*spacing_xl", "input_placeholder_color": "*neutral_400", "input_placeholder_color_dark": "*neutral_500", "input_radius": "*radius_lg", "input_shadow": "none", "input_shadow_dark": "none", "input_shadow_focus": "*input_shadow", "input_shadow_focus_dark": "*input_shadow", "input_text_size": "*text_md", "input_text_weight": "400", "layout_gap": "*spacing_xxl", "link_text_color": "*secondary_600", "link_text_color_active": "*secondary_600", "link_text_color_active_dark": "*secondary_500", "link_text_color_dark": "*secondary_500", "link_text_color_hover": "*secondary_700", "link_text_color_hover_dark": "*secondary_400", "link_text_color_visited": "*secondary_500", "link_text_color_visited_dark": "*secondary_600", "loader_color": "*color_accent", "loader_color_dark": "*color_accent", "name": "base", "neutral_100": "#f5f5f4", "neutral_200": "#e7e5e4", "neutral_300": "#d6d3d1", "neutral_400": "#a8a29e", "neutral_50": "#fafaf9", "neutral_500": "#78716c", "neutral_600": "#57534e", "neutral_700": "#44403c", "neutral_800": "#292524", "neutral_900": "#1c1917", "neutral_950": "#0f0e0d", "panel_background_fill": "*background_fill_secondary", "panel_background_fill_dark": "*background_fill_secondary", "panel_border_color": "*border_color_primary", "panel_border_color_dark": "*border_color_primary", "panel_border_width": "0", "panel_border_width_dark": "0", "primary_100": "#e0f2fe", "primary_200": "#bae6fd", "primary_300": "#7dd3fc", "primary_400": "#38bdf8", "primary_50": "#f0f9ff", "primary_500": "#0ea5e9", "primary_600": "#0284c7", "primary_700": "#0369a1", "primary_800": "#075985", "primary_900": "#0c4a6e", "primary_950": "#0b4165", "prose_header_text_weight": "500", "prose_text_size": "*text_md", "prose_text_weight": "400", "radio_circle": "url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\")", "radius_lg": "3px", "radius_md": "3px", "radius_sm": "3px", "radius_xl": "3px", "radius_xs": "3px", "radius_xxl": "3px", "radius_xxs": "3px", "secondary_100": "#e0f2fe", "secondary_200": "#bae6fd", "secondary_300": "#7dd3fc", "secondary_400": "#38bdf8", "secondary_50": "#f0f9ff", "secondary_500": "#0ea5e9", "secondary_600": "#0284c7", "secondary_700": "#0369a1", "secondary_800": "#075985", "secondary_900": "#0c4a6e", "secondary_950": "#0b4165", "section_header_text_size": "*text_md", "section_header_text_weight": "400", "shadow_drop": "rgba(0,0,0,0.05) 0px 1px 2px 0px", "shadow_drop_lg": "0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)", "shadow_inset": "rgba(0,0,0,0.05) 0px 2px 4px 0px inset", "shadow_spread": "3px", "shadow_spread_dark": "1px", "slider_color": "*primary_600", "slider_color_dark": "*primary_600", "spacing_lg": "8px", "spacing_md": "6px", "spacing_sm": "4px", "spacing_xl": "10px", "spacing_xs": "2px", "spacing_xxl": "16px", "spacing_xxs": "1px", "stat_background_fill": "*primary_300", "stat_background_fill_dark": "*primary_500", "table_border_color": "*neutral_300", "table_border_color_dark": "*neutral_700", "table_even_background_fill": "white", "table_even_background_fill_dark": "*neutral_950", "table_odd_background_fill": "*neutral_50", "table_odd_background_fill_dark": "*neutral_900", "table_radius": "*radius_lg", "table_row_focus": "*color_accent_soft", "table_row_focus_dark": "*color_accent_soft", "text_lg": "20px", "text_md": "16px", "text_sm": "14px", "text_xl": "24px", "text_xs": "12px", "text_xxl": "28px", "text_xxs": "10px"}, "version": "0.0.1"}