"""Built-in themes using the modern token system."""
from __future__ import annotations
from qtframework.themes.theme import Theme
from qtframework.themes.tokens import (
BorderRadius,
ComponentColors,
DesignTokens,
PrimitiveColors,
SemanticColors,
Shadows,
Spacing,
SyntaxColors,
Transitions,
Typography,
)
[docs]
def create_light_theme() -> Theme:
"""Create the built-in light theme."""
tokens = DesignTokens()
# Use default primitive colors (already set for light theme)
# Configure semantic colors for light theme
tokens.semantic = SemanticColors(
# Background
bg_primary=tokens.primitive.white,
bg_secondary=tokens.primitive.gray_50,
bg_tertiary=tokens.primitive.gray_100,
bg_elevated=tokens.primitive.white,
bg_overlay="rgba(0, 0, 0, 0.5)",
# Foreground/Text
fg_primary=tokens.primitive.gray_900,
fg_secondary=tokens.primitive.gray_600,
fg_tertiary=tokens.primitive.gray_400,
fg_on_accent=tokens.primitive.white,
fg_on_dark=tokens.primitive.white,
fg_on_light=tokens.primitive.gray_900,
# Interactive states
action_primary=tokens.primitive.primary_500,
action_primary_hover=tokens.primitive.primary_600,
action_primary_active=tokens.primitive.primary_700,
action_secondary=tokens.primitive.secondary_500,
action_secondary_hover=tokens.primitive.secondary_600,
action_secondary_active=tokens.primitive.secondary_700,
# Feedback
feedback_success=tokens.primitive.success_500,
feedback_warning=tokens.primitive.warning_500,
feedback_error=tokens.primitive.error_500,
feedback_info=tokens.primitive.info_500,
# Borders
border_default=tokens.primitive.gray_300,
border_subtle=tokens.primitive.gray_200,
border_strong=tokens.primitive.gray_400,
border_focus=tokens.primitive.primary_500,
# Special states
state_hover=tokens.primitive.gray_100,
state_selected=tokens.primitive.primary_100,
state_disabled=tokens.primitive.gray_100,
state_focus=tokens.primitive.primary_100,
)
# Configure component colors for light theme
tokens.components = ComponentColors(
# Button
button_primary_bg=tokens.primitive.primary_500,
button_primary_fg=tokens.primitive.white,
button_primary_border=tokens.primitive.primary_500,
button_secondary_bg=tokens.primitive.gray_100,
button_secondary_fg=tokens.primitive.gray_900,
button_secondary_border=tokens.primitive.gray_300,
# Input
input_bg=tokens.primitive.white,
input_fg=tokens.primitive.gray_900,
input_border=tokens.primitive.gray_300,
input_placeholder=tokens.primitive.gray_500,
# Table
table_header_bg=tokens.primitive.gray_100,
table_header_fg=tokens.primitive.gray_900,
table_row_bg=tokens.primitive.white,
table_row_bg_alt=tokens.primitive.gray_50,
table_row_hover=tokens.primitive.gray_100,
table_row_selected=tokens.primitive.primary_100,
table_border=tokens.primitive.gray_200,
# Menu
menu_bg=tokens.primitive.white,
menu_fg=tokens.primitive.gray_900,
menu_hover_bg=tokens.primitive.gray_100,
menu_hover_fg=tokens.primitive.gray_900,
menu_selected_bg=tokens.primitive.primary_100,
menu_selected_fg=tokens.primitive.primary_700,
# Scrollbar
scrollbar_bg=tokens.primitive.gray_100,
scrollbar_thumb=tokens.primitive.gray_400,
scrollbar_thumb_hover=tokens.primitive.gray_500,
# Tab
tab_bg=tokens.primitive.gray_100,
tab_fg=tokens.primitive.gray_600,
tab_active_bg=tokens.primitive.white,
tab_active_fg=tokens.primitive.primary_500,
tab_hover_bg=tokens.primitive.gray_50,
tab_hover_fg=tokens.primitive.gray_900,
# Chart/Graph colors
chart_1=tokens.primitive.primary_500,
chart_2=tokens.primitive.success_500,
chart_3=tokens.primitive.warning_500,
chart_4=tokens.primitive.error_500,
chart_5="#9C27B0", # Purple
chart_6="#00BCD4", # Cyan
chart_grid=tokens.primitive.gray_200,
chart_axis=tokens.primitive.gray_600,
# Badge colors
badge_default_bg=tokens.primitive.gray_200,
badge_default_fg=tokens.primitive.gray_900,
badge_default_border=tokens.primitive.gray_300,
badge_primary_bg=tokens.primitive.primary_500,
badge_primary_fg=tokens.primitive.white,
badge_primary_border=tokens.primitive.primary_500,
badge_secondary_bg=tokens.primitive.secondary_500,
badge_secondary_fg=tokens.primitive.white,
badge_secondary_border=tokens.primitive.secondary_500,
badge_success_bg=tokens.primitive.success_500,
badge_success_fg=tokens.primitive.white,
badge_success_border=tokens.primitive.success_500,
badge_warning_bg=tokens.primitive.warning_500,
badge_warning_fg=tokens.primitive.white,
badge_warning_border=tokens.primitive.warning_500,
badge_danger_bg=tokens.primitive.error_500,
badge_danger_fg=tokens.primitive.white,
badge_danger_border=tokens.primitive.error_500,
badge_info_bg=tokens.primitive.info_500,
badge_info_fg=tokens.primitive.white,
badge_info_border=tokens.primitive.info_500,
badge_light_bg=tokens.primitive.gray_100,
badge_light_fg=tokens.primitive.gray_900,
badge_light_border=tokens.primitive.gray_200,
badge_dark_bg=tokens.primitive.gray_900,
badge_dark_fg=tokens.primitive.white,
badge_dark_border=tokens.primitive.gray_900,
)
# Configure typography for light theme
tokens.typography = Typography(
font_family_default="'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica', sans-serif",
font_family_mono="'Cascadia Code', 'Consolas', 'Monaco', 'Courier New', monospace",
font_family_code="Consolas", # Windows default monospace
# Font sizes (using defaults)
font_size_xs=11,
font_size_sm=12,
font_size_md=14,
font_size_lg=16,
font_size_xl=18,
font_size_2xl=20,
font_size_3xl=24,
font_size_4xl=28,
font_size_5xl=32,
# Font weights (using defaults)
font_weight_thin=100,
font_weight_light=300,
font_weight_normal=400,
font_weight_medium=500,
font_weight_semibold=600,
font_weight_bold=700,
font_weight_black=900,
# Line heights (using defaults)
line_height_tight=1.2,
line_height_normal=1.5,
line_height_relaxed=1.75,
line_height_loose=2.0,
)
# Configure syntax highlighting colors for light theme
tokens.syntax = SyntaxColors(
keyword="#0000FF", # Blue
class_name="#267F99", # Teal
function="#795E26", # Brown
string="#A31515", # Red
comment="#008000", # Green
number="#098658", # Dark green
operator="#000000", # Black
decorator="#AA0000", # Dark red
constant="#0000FF", # Blue
variable="#001080", # Dark blue
parameter="#001080", # Dark blue
type="#267F99", # Teal
namespace="#267F99", # Teal
error="#FF0000", # Red
warning="#FFA500", # Orange
info="#0000FF", # Blue
)
# Configure spacing
tokens.spacing = Spacing(
space_0=0,
space_1=2,
space_2=4,
space_3=6,
space_4=8,
space_5=10,
space_6=12,
space_8=16,
space_10=20,
space_12=24,
space_16=32,
space_20=40,
space_24=48,
space_32=64,
)
# Configure border radius
tokens.borders = BorderRadius(
radius_none=0,
radius_sm=2,
radius_md=4,
radius_lg=6,
radius_xl=8,
radius_2xl=12,
radius_3xl=16,
radius_full=9999,
)
# Configure shadows
tokens.shadows = Shadows(
shadow_none="none",
shadow_sm="0 1px 2px 0 rgba(0, 0, 0, 0.05)",
shadow_md="0 4px 6px -1px rgba(0, 0, 0, 0.1)",
shadow_lg="0 10px 15px -3px rgba(0, 0, 0, 0.1)",
shadow_xl="0 20px 25px -5px rgba(0, 0, 0, 0.1)",
shadow_2xl="0 25px 50px -12px rgba(0, 0, 0, 0.25)",
shadow_inner="inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)",
)
# Configure transitions
tokens.transitions = Transitions(
transition_fast="150ms ease-in-out",
transition_normal="250ms ease-in-out",
transition_slow="350ms ease-in-out",
)
custom_styles = {
'QGroupBox[search-match="true"]': "border: 2px solid #2196F3; border-radius: 4px;",
'QLabel[search-match="true"]': "background-color: rgba(33, 150, 243, 0.15); border-radius: 2px; padding: 2px;",
'QPushButton[search-match="true"]': "border: 2px solid #2196F3;",
}
return Theme(
name="light",
display_name="Light",
description="Clean and modern light theme",
author="Qt Framework",
version="2.0.0",
tokens=tokens,
custom_styles=custom_styles,
)
[docs]
def create_dark_theme() -> Theme:
"""Create the built-in dark theme."""
tokens = DesignTokens()
# Override primitive colors for dark theme
tokens.primitive = PrimitiveColors(
# Grayscale - inverted for dark theme
gray_50="#121212",
gray_100="#1E1E1E",
gray_200="#2D2D2D",
gray_300="#404040",
gray_400="#525252",
gray_500="#666666",
gray_600="#808080",
gray_700="#9E9E9E",
gray_800="#B0B0B0",
gray_900="#E0E0E0",
gray_950="#F5F5F5",
# Primary colors - slightly adjusted for dark theme
primary_50="#0A1929",
primary_100="#0F2942",
primary_200="#173A5E",
primary_300="#1E4976",
primary_400="#2196F3",
primary_500="#42A5F5",
primary_600="#64B5F6",
primary_700="#90CAF9",
primary_800="#BBDEFB",
primary_900="#E3F2FD",
primary_950="#F0F7FF",
# Keep other color scales similar
secondary_50="#1A0E00",
secondary_100="#2E1A00",
secondary_200="#422500",
secondary_300="#573300",
secondary_400="#6B3E00",
secondary_500="#FFA726",
secondary_600="#FFB74D",
secondary_700="#FFCC80",
secondary_800="#FFE0B2",
secondary_900="#FFF3E0",
secondary_950="#FFF8E1",
# Success
success_50="#0D2818",
success_100="#1B5E20",
success_200="#2E7D32",
success_300="#388E3C",
success_400="#43A047",
success_500="#4CAF50",
success_600="#66BB6A",
success_700="#81C784",
success_800="#A5D6A7",
success_900="#C8E6C9",
success_950="#E8F5E9",
# Warning
warning_50="#331400",
warning_100="#4D1F00",
warning_200="#662900",
warning_300="#803300",
warning_400="#993D00",
warning_500="#FF9800",
warning_600="#FFA726",
warning_700="#FFB74D",
warning_800="#FFCC80",
warning_900="#FFE0B2",
warning_950="#FFF3E0",
# Error
error_50="#4A0E0E",
error_100="#7F1D1D",
error_200="#991B1B",
error_300="#B91C1C",
error_400="#DC2626",
error_500="#EF4444",
error_600="#F87171",
error_700="#FCA5A5",
error_800="#FECACA",
error_900="#FEE2E2",
error_950="#FEF2F2",
# Info
info_50="#002838",
info_100="#003D4D",
info_200="#005566",
info_300="#006B80",
info_400="#008299",
info_500="#00ACC1",
info_600="#26C6DA",
info_700="#4DD0E1",
info_800="#80DEEA",
info_900="#B2EBF2",
info_950="#E0F7FA",
# Pure colors
white="#FFFFFF",
black="#000000",
transparent="transparent",
)
# Configure semantic colors for dark theme
tokens.semantic = SemanticColors(
# Background
bg_primary=tokens.primitive.gray_100,
bg_secondary=tokens.primitive.gray_200,
bg_tertiary=tokens.primitive.gray_300,
bg_elevated=tokens.primitive.gray_200,
bg_overlay="rgba(0, 0, 0, 0.7)",
# Foreground/Text
fg_primary=tokens.primitive.gray_900,
fg_secondary=tokens.primitive.gray_700,
fg_tertiary=tokens.primitive.gray_500,
fg_on_accent=tokens.primitive.white,
fg_on_dark=tokens.primitive.white,
fg_on_light=tokens.primitive.gray_50,
# Interactive states
action_primary=tokens.primitive.primary_500,
action_primary_hover=tokens.primitive.primary_600,
action_primary_active=tokens.primitive.primary_700,
action_secondary=tokens.primitive.secondary_500,
action_secondary_hover=tokens.primitive.secondary_600,
action_secondary_active=tokens.primitive.secondary_700,
# Feedback
feedback_success=tokens.primitive.success_500,
feedback_warning=tokens.primitive.warning_500,
feedback_error=tokens.primitive.error_500,
feedback_info=tokens.primitive.info_500,
# Borders
border_default=tokens.primitive.gray_400,
border_subtle=tokens.primitive.gray_300,
border_strong=tokens.primitive.gray_500,
border_focus=tokens.primitive.primary_500,
# Special states
state_hover=tokens.primitive.gray_300,
state_selected=tokens.primitive.primary_300,
state_disabled=tokens.primitive.gray_200,
state_focus=tokens.primitive.primary_300,
)
# Configure component colors for dark theme
tokens.components = ComponentColors(
# Button
button_primary_bg=tokens.primitive.primary_500,
button_primary_fg=tokens.primitive.white,
button_primary_border=tokens.primitive.primary_500,
button_secondary_bg=tokens.primitive.gray_300,
button_secondary_fg=tokens.primitive.gray_900,
button_secondary_border=tokens.primitive.gray_400,
# Input
input_bg=tokens.primitive.gray_200,
input_fg=tokens.primitive.gray_900,
input_border=tokens.primitive.gray_400,
input_placeholder=tokens.primitive.gray_600,
# Table
table_header_bg=tokens.primitive.gray_300,
table_header_fg=tokens.primitive.gray_900,
table_row_bg=tokens.primitive.gray_100,
table_row_bg_alt=tokens.primitive.gray_200,
table_row_hover=tokens.primitive.gray_300,
table_row_selected=tokens.primitive.primary_300,
table_border=tokens.primitive.gray_400,
# Menu
menu_bg=tokens.primitive.gray_200,
menu_fg=tokens.primitive.gray_900,
menu_hover_bg=tokens.primitive.gray_300,
menu_hover_fg=tokens.primitive.gray_900,
menu_selected_bg=tokens.primitive.primary_300,
menu_selected_fg=tokens.primitive.white,
# Scrollbar
scrollbar_bg=tokens.primitive.gray_200,
scrollbar_thumb=tokens.primitive.gray_500,
scrollbar_thumb_hover=tokens.primitive.gray_600,
# Tab
tab_bg=tokens.primitive.gray_300,
tab_fg=tokens.primitive.gray_700,
tab_active_bg=tokens.primitive.gray_100,
tab_active_fg=tokens.primitive.primary_500,
tab_hover_bg=tokens.primitive.gray_200,
tab_hover_fg=tokens.primitive.gray_900,
# Chart/Graph colors
chart_1=tokens.primitive.primary_500,
chart_2=tokens.primitive.success_500,
chart_3=tokens.primitive.warning_500,
chart_4=tokens.primitive.error_500,
chart_5="#AB47BC", # Purple
chart_6="#26C6DA", # Cyan
chart_grid=tokens.primitive.gray_400,
chart_axis=tokens.primitive.gray_600,
# Badge colors
badge_default_bg=tokens.primitive.gray_400,
badge_default_fg=tokens.primitive.gray_900,
badge_default_border=tokens.primitive.gray_500,
badge_primary_bg=tokens.primitive.primary_500,
badge_primary_fg=tokens.primitive.white,
badge_primary_border=tokens.primitive.primary_500,
badge_secondary_bg=tokens.primitive.secondary_500,
badge_secondary_fg=tokens.primitive.white,
badge_secondary_border=tokens.primitive.secondary_500,
badge_success_bg=tokens.primitive.success_500,
badge_success_fg=tokens.primitive.white,
badge_success_border=tokens.primitive.success_500,
badge_warning_bg=tokens.primitive.warning_500,
badge_warning_fg=tokens.primitive.white,
badge_warning_border=tokens.primitive.warning_500,
badge_danger_bg=tokens.primitive.error_500,
badge_danger_fg=tokens.primitive.white,
badge_danger_border=tokens.primitive.error_500,
badge_info_bg=tokens.primitive.info_500,
badge_info_fg=tokens.primitive.white,
badge_info_border=tokens.primitive.info_500,
badge_light_bg=tokens.primitive.gray_800,
badge_light_fg=tokens.primitive.gray_100,
badge_light_border=tokens.primitive.gray_700,
badge_dark_bg=tokens.primitive.gray_100,
badge_dark_fg=tokens.primitive.gray_900,
badge_dark_border=tokens.primitive.gray_100,
)
# Configure typography for dark theme
tokens.typography = Typography(
font_family_default="'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica', sans-serif",
font_family_mono="'Cascadia Code', 'Consolas', 'Monaco', 'Courier New', monospace",
font_family_code="Cascadia Code", # Modern monospace font
# Font sizes (using defaults)
font_size_xs=11,
font_size_sm=12,
font_size_md=14,
font_size_lg=16,
font_size_xl=18,
font_size_2xl=20,
font_size_3xl=24,
font_size_4xl=28,
font_size_5xl=32,
# Font weights (using defaults)
font_weight_thin=100,
font_weight_light=300,
font_weight_normal=400,
font_weight_medium=500,
font_weight_semibold=600,
font_weight_bold=700,
font_weight_black=900,
# Line heights (using defaults)
line_height_tight=1.2,
line_height_normal=1.5,
line_height_relaxed=1.75,
line_height_loose=2.0,
)
# Configure syntax highlighting colors for dark theme (VS Code Dark style)
tokens.syntax = SyntaxColors(
keyword="#569CD6", # Light blue
class_name="#4EC9B0", # Cyan
function="#DCDCAA", # Yellow
string="#CE9178", # Orange
comment="#6A9955", # Green
number="#B5CEA8", # Light green
operator="#D4D4D4", # Light gray
decorator="#DCDCAA", # Yellow
constant="#569CD6", # Light blue
variable="#9CDCFE", # Light blue
parameter="#9CDCFE", # Light blue
type="#4EC9B0", # Cyan
namespace="#4EC9B0", # Cyan
error="#F44747", # Red
warning="#FFCC00", # Yellow
info="#569CD6", # Light blue
)
# Configure spacing
tokens.spacing = Spacing(
space_0=0,
space_1=2,
space_2=4,
space_3=6,
space_4=8,
space_5=10,
space_6=12,
space_8=16,
space_10=20,
space_12=24,
space_16=32,
space_20=40,
space_24=48,
space_32=64,
)
# Configure border radius
tokens.borders = BorderRadius(
radius_none=0,
radius_sm=2,
radius_md=4,
radius_lg=6,
radius_xl=8,
radius_2xl=12,
radius_3xl=16,
radius_full=9999,
)
# Configure shadows
tokens.shadows = Shadows(
shadow_none="none",
shadow_sm="0 1px 2px 0 rgba(0, 0, 0, 0.05)",
shadow_md="0 4px 6px -1px rgba(0, 0, 0, 0.1)",
shadow_lg="0 10px 15px -3px rgba(0, 0, 0, 0.1)",
shadow_xl="0 20px 25px -5px rgba(0, 0, 0, 0.1)",
shadow_2xl="0 25px 50px -12px rgba(0, 0, 0, 0.25)",
shadow_inner="inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)",
)
# Configure transitions
tokens.transitions = Transitions(
transition_fast="150ms ease-in-out",
transition_normal="250ms ease-in-out",
transition_slow="350ms ease-in-out",
)
custom_styles = {
'QGroupBox[search-match="true"]': "border: 2px solid #42A5F5; border-radius: 4px;",
'QLabel[search-match="true"]': "background-color: rgba(66, 165, 245, 0.2); border-radius: 2px; padding: 2px;",
'QPushButton[search-match="true"]': "border: 2px solid #42A5F5;",
}
return Theme(
name="dark",
display_name="Dark",
description="Modern dark theme for reduced eye strain",
author="Qt Framework",
version="2.0.0",
tokens=tokens,
custom_styles=custom_styles,
)
[docs]
def create_high_contrast_theme() -> Theme:
"""Create a high contrast theme for accessibility."""
tokens = DesignTokens()
# Override primitive colors for high contrast
tokens.primitive = PrimitiveColors(
# Pure black and white for maximum contrast
gray_50="#FFFFFF",
gray_100="#FFFFFF",
gray_200="#E0E0E0",
gray_300="#C0C0C0",
gray_400="#808080",
gray_500="#606060",
gray_600="#404040",
gray_700="#202020",
gray_800="#101010",
gray_900="#000000",
gray_950="#000000",
# High contrast primary colors
primary_50="#E6F3FF",
primary_100="#CCE7FF",
primary_200="#99CFFF",
primary_300="#66B7FF",
primary_400="#339FFF",
primary_500="#0080FF",
primary_600="#0066CC",
primary_700="#004D99",
primary_800="#003366",
primary_900="#001A33",
primary_950="#000D1A",
# Keep other colors vibrant for visibility
white="#FFFFFF",
black="#000000",
transparent="transparent",
)
# Configure semantic colors for high contrast
tokens.semantic = SemanticColors(
# Background
bg_primary=tokens.primitive.white,
bg_secondary=tokens.primitive.gray_50,
bg_tertiary=tokens.primitive.gray_100,
bg_elevated=tokens.primitive.white,
bg_overlay="rgba(0, 0, 0, 0.8)",
# Foreground/Text - maximum contrast
fg_primary=tokens.primitive.black,
fg_secondary=tokens.primitive.gray_700,
fg_tertiary=tokens.primitive.gray_600,
fg_on_accent=tokens.primitive.white,
fg_on_dark=tokens.primitive.white,
fg_on_light=tokens.primitive.black,
# Interactive states
action_primary=tokens.primitive.primary_500,
action_primary_hover=tokens.primitive.primary_600,
action_primary_active=tokens.primitive.primary_700,
action_secondary=tokens.primitive.gray_700,
action_secondary_hover=tokens.primitive.gray_800,
action_secondary_active=tokens.primitive.gray_900,
# Feedback - high contrast colors
feedback_success="#008000",
feedback_warning="#FF8C00",
feedback_error="#DC143C",
feedback_info="#1E90FF",
# Borders - strong for visibility
border_default=tokens.primitive.black,
border_subtle=tokens.primitive.gray_400,
border_strong=tokens.primitive.black,
border_focus=tokens.primitive.primary_500,
# Special states
state_hover=tokens.primitive.gray_200,
state_selected=tokens.primitive.primary_100,
state_disabled=tokens.primitive.gray_300,
state_focus=tokens.primitive.primary_100,
)
# Component colors with high contrast
tokens.components = ComponentColors(
# Button
button_primary_bg=tokens.primitive.primary_500,
button_primary_fg=tokens.primitive.white,
button_primary_border=tokens.primitive.black,
button_secondary_bg=tokens.primitive.white,
button_secondary_fg=tokens.primitive.black,
button_secondary_border=tokens.primitive.black,
# Input
input_bg=tokens.primitive.white,
input_fg=tokens.primitive.black,
input_border=tokens.primitive.black,
input_placeholder=tokens.primitive.gray_600,
# Table
table_header_bg=tokens.primitive.gray_200,
table_header_fg=tokens.primitive.black,
table_row_bg=tokens.primitive.white,
table_row_bg_alt=tokens.primitive.gray_100,
table_row_hover=tokens.primitive.gray_200,
table_row_selected=tokens.primitive.primary_100,
table_border=tokens.primitive.black,
# Menu
menu_bg=tokens.primitive.white,
menu_fg=tokens.primitive.black,
menu_hover_bg=tokens.primitive.gray_200,
menu_hover_fg=tokens.primitive.black,
menu_selected_bg=tokens.primitive.primary_100,
menu_selected_fg=tokens.primitive.black,
# Scrollbar
scrollbar_bg=tokens.primitive.gray_200,
scrollbar_thumb=tokens.primitive.black,
scrollbar_thumb_hover=tokens.primitive.gray_900,
# Tab
tab_bg=tokens.primitive.gray_100,
tab_fg=tokens.primitive.black,
tab_active_bg=tokens.primitive.white,
tab_active_fg=tokens.primitive.primary_500,
tab_hover_bg=tokens.primitive.gray_200,
tab_hover_fg=tokens.primitive.black,
# Chart/Graph colors
chart_1=tokens.primitive.primary_500,
chart_2="#008000", # Green
chart_3="#FF8C00", # Orange
chart_4="#DC143C", # Red
chart_5="#9370DB", # Purple
chart_6="#1E90FF", # Dodger blue
chart_grid=tokens.primitive.gray_400,
chart_axis=tokens.primitive.black,
# Badge colors
badge_default_bg=tokens.primitive.gray_200,
badge_default_fg=tokens.primitive.black,
badge_default_border=tokens.primitive.black,
badge_primary_bg=tokens.primitive.primary_500,
badge_primary_fg=tokens.primitive.white,
badge_primary_border=tokens.primitive.black,
badge_secondary_bg=tokens.primitive.gray_700,
badge_secondary_fg=tokens.primitive.white,
badge_secondary_border=tokens.primitive.black,
badge_success_bg="#008000",
badge_success_fg=tokens.primitive.white,
badge_success_border=tokens.primitive.black,
badge_warning_bg="#FF8C00",
badge_warning_fg=tokens.primitive.black,
badge_warning_border=tokens.primitive.black,
badge_danger_bg="#DC143C",
badge_danger_fg=tokens.primitive.white,
badge_danger_border=tokens.primitive.black,
badge_info_bg="#1E90FF",
badge_info_fg=tokens.primitive.white,
badge_info_border=tokens.primitive.black,
badge_light_bg=tokens.primitive.white,
badge_light_fg=tokens.primitive.black,
badge_light_border=tokens.primitive.black,
badge_dark_bg=tokens.primitive.black,
badge_dark_fg=tokens.primitive.white,
badge_dark_border=tokens.primitive.black,
)
# Configure typography for high contrast theme
tokens.typography = Typography(
font_family_default="'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica', sans-serif",
font_family_mono="'Consolas', 'Cascadia Code', 'Monaco', 'Courier New', monospace",
font_family_code="Consolas", # Clear monospace font
# Font sizes (using defaults)
font_size_xs=11,
font_size_sm=12,
font_size_md=14,
font_size_lg=16,
font_size_xl=18,
font_size_2xl=20,
font_size_3xl=24,
font_size_4xl=28,
font_size_5xl=32,
# Font weights (using defaults)
font_weight_thin=100,
font_weight_light=300,
font_weight_normal=400,
font_weight_medium=500,
font_weight_semibold=600,
font_weight_bold=700,
font_weight_black=900,
# Line heights (using defaults)
line_height_tight=1.2,
line_height_normal=1.5,
line_height_relaxed=1.75,
line_height_loose=2.0,
)
# Configure syntax highlighting colors for high contrast
tokens.syntax = SyntaxColors(
keyword="#0000FF", # Blue
class_name="#267F99", # Teal
function="#795E26", # Brown
string="#A31515", # Red
comment="#008000", # Green
number="#098658", # Dark green
operator="#000000", # Black
decorator="#AA0000", # Dark red
constant="#0000FF", # Blue
variable="#001080", # Dark blue
parameter="#001080", # Dark blue
type="#267F99", # Teal
namespace="#267F99", # Teal
error="#FF0000", # Red
warning="#FFA500", # Orange
info="#0000FF", # Blue
)
# Configure spacing
tokens.spacing = Spacing(
space_0=0,
space_1=2,
space_2=4,
space_3=6,
space_4=8,
space_5=10,
space_6=12,
space_8=16,
space_10=20,
space_12=24,
space_16=32,
space_20=40,
space_24=48,
space_32=64,
)
# Configure border radius
tokens.borders = BorderRadius(
radius_none=0,
radius_sm=2,
radius_md=4,
radius_lg=6,
radius_xl=8,
radius_2xl=12,
radius_3xl=16,
radius_full=9999,
)
# Configure shadows
tokens.shadows = Shadows(
shadow_none="none",
shadow_sm="0 1px 2px 0 rgba(0, 0, 0, 0.05)",
shadow_md="0 4px 6px -1px rgba(0, 0, 0, 0.1)",
shadow_lg="0 10px 15px -3px rgba(0, 0, 0, 0.1)",
shadow_xl="0 20px 25px -5px rgba(0, 0, 0, 0.1)",
shadow_2xl="0 25px 50px -12px rgba(0, 0, 0, 0.25)",
shadow_inner="inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)",
)
# Configure transitions
tokens.transitions = Transitions(
transition_fast="150ms ease-in-out",
transition_normal="250ms ease-in-out",
transition_slow="350ms ease-in-out",
)
custom_styles = {
'QGroupBox[search-match="true"]': "border: 3px solid #0080FF; border-radius: 4px;",
'QLabel[search-match="true"]': "background-color: rgba(0, 128, 255, 0.2); border: 1px solid #0080FF; border-radius: 2px; padding: 2px;",
'QPushButton[search-match="true"]': "border: 3px solid #0080FF;",
}
return Theme(
name="high_contrast",
display_name="High Contrast",
description="High contrast theme for improved accessibility",
author="Qt Framework",
version="2.0.0",
tokens=tokens,
custom_styles=custom_styles,
)
# Export built-in themes
BUILTIN_THEMES = {
"light": create_light_theme,
"dark": create_dark_theme,
"high_contrast": create_high_contrast_theme,
}