File size: 3,668 Bytes
db4f9a3
ca2a055
db4f9a3
79682b6
 
db4f9a3
 
ca2a055
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79682b6
ca2a055
79682b6
ca2a055
79682b6
ca2a055
79682b6
ca2a055
79682b6
 
db4f9a3
 
 
 
79682b6
 
db4f9a3
 
 
 
79682b6
 
db4f9a3
 
d5b9159
 
 
 
 
db4f9a3
 
d5b9159
db4f9a3
d5b9159
db4f9a3
 
 
d5b9159
db4f9a3
d1d5d00
db4f9a3
d1d5d00
db4f9a3
 
 
d5b9159
db4f9a3
d1d5d00
db4f9a3
d1d5d00
79682b6
 
db4f9a3
79682b6
e887ed9
db4f9a3
e887ed9
db4f9a3
 
 
 
e887ed9
79682b6
 
db4f9a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79682b6
db4f9a3
79682b6
db4f9a3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import re
from typing import NamedTuple

import streamlit as st

import fragments

class ThemeColor(NamedTuple):
    primaryColor: str
    backgroundColor: str
    secondaryBackgroundColor: str
    textColor: str


default_color = ThemeColor(
    primaryColor="#ff4b4b",
    backgroundColor="#ffffff",
    secondaryBackgroundColor="#f0f2f6",
    textColor="#31333F",
)


if 'primaryColor' not in st.session_state:
    st.session_state['primaryColor'] = st._config.get_option(f'theme.primaryColor') or default_color.primaryColor
if 'backgroundColor' not in st.session_state:
    st.session_state['backgroundColor'] = st._config.get_option(f'theme.backgroundColor') or default_color.backgroundColor
if 'secondaryBackgroundColor' not in st.session_state:
    st.session_state['secondaryBackgroundColor'] = st._config.get_option(f'theme.secondaryBackgroundColor') or default_color.secondaryBackgroundColor
if 'textColor' not in st.session_state:
    st.session_state['textColor'] = st._config.get_option(f'theme.textColor') or default_color.textColor


primary_color = st.color_picker('Primary color', key="primaryColor")
text_color = st.color_picker('Text color', key="textColor")
background_color = st.color_picker('Background color', key="backgroundColor")
secondary_background_color = st.color_picker('Secondary background color', key="secondaryBackgroundColor")


def parse_hex(rgb_hex_str: str) -> tuple[float, float, float]:
    if not re.match(r"^#[0-9a-fA-F]{6}$", rgb_hex_str):
        raise ValueError("Invalid hex color")
    return tuple(int(rgb_hex_str[i:i+2], 16) / 255 for i in (1, 3, 5))


st.header("WCAG contrast ratio")

def synced_color_picker(label: str, value: str, key: str):
    def on_change():
        st.session_state[key] = st.session_state[key + "2"]
    st.color_picker(label, value=value, key=key + "2", on_change=on_change)

col1, col2, col3 = st.columns(3)
with col2:
    synced_color_picker("Background color", value=background_color, key="backgroundColor")
with col3:
    synced_color_picker("Secondary background color", value=secondary_background_color, key="secondaryBackgroundColor")

col1, col2, col3 = st.columns(3)
with col1:
    synced_color_picker("Primary color", value=primary_color, key="primaryColor")
with col2:
    fragments.contrast_summary("Primary/Background", primary_color, background_color)
with col3:
    fragments.contrast_summary("Primary/Secondary background", primary_color, secondary_background_color)

col1, col2, col3 = st.columns(3)
with col1:
    synced_color_picker("Text color", value=text_color, key="textColor")
with col2:
    fragments.contrast_summary("Text/Background", text_color, background_color)
with col3:
    fragments.contrast_summary("Text/Secondary background", text_color, secondary_background_color)


st.header("Config")

st.markdown("`.streamlit/config.toml`")
st.code(f"""
[theme]
primaryColor="{primary_color}"
backgroundColor="{background_color}"
secondaryBackgroundColor="{secondary_background_color}"
textColor="{text_color}"
""", language="toml")


apply_theme = st.checkbox("Apply theme to this page")

if apply_theme:
    def reconcile_theme_config():
        keys = ['primaryColor', 'backgroundColor', 'secondaryBackgroundColor', 'textColor']
        has_changed = False
        for key in keys:
            if st._config.get_option(f'theme.{key}') != st.session_state[key]:
                st._config.set_option(f'theme.{key}', st.session_state[key])
                has_changed = True
        if has_changed:
            st.experimental_rerun()

    reconcile_theme_config()



fragments.sample_components("body")
with st.sidebar:
    fragments.sample_components("sidebar")