This commit is contained in:
2026-04-06 15:40:06 +05:00
parent 10fb240dcd
commit 7435992e15
21 changed files with 993 additions and 150 deletions

View File

@@ -1,7 +1,8 @@
import flet as ft
# Глобальный масштаб интерфейса. 1.0 = 100%, 1.7 = 170%.
# Меняйте только эту константу, чтобы масштабировать весь UI.
# Меняйте только эту переменную (или через theme_manager.apply_scale),
# чтобы масштабировать весь UI.
SCALE: float = 1.7
@@ -10,15 +11,44 @@ def s(v: int | float) -> int:
return round(v * SCALE)
class clolors:
background = "#C0DE9E"
laer1 = "#FFEAB7"
laer2 = "#D9F1F4"
laer3 = "#D2EA32"
ferst = "#85C446"
class colors:
# Основная палитра в стиле copp74.ru
primary = "#F85A40" # Основной оранжево-красный (логотип ЦОПП)
primary_dark = "#D94530" # Тёмный для hover/активных состояний
primary_light = "#FFEAB7" # Светлый персиковый (вторичный фон)
# Фоны
background = "#F4F6F8" # Светло-серый фон страницы
surface = "#FFFFFF" # Белый для карточек и форм
surface_alt = "#F0F2F5" # Альтернативные блоки
# Акцент — жёлтый
accent = "#FFC845" # Жёлтый акцент
accent_lime = "#FFC845" # Алиас для совместимости
secondary_light = "#FFEAB7" # Алиас для совместимости
secondary_yellow = "#FFC845" # Алиас
# Синий — информация, ссылки
info = "#007FBD" # Синий
info_light = "#D9F1F4" # Светлый голубой
tertiary_light = "#D9F1F4" # Алиас для совместимости
tertiary_blue = "#007FBD" # Алиас для совместимости
secondary_orange = "#F85A40" # Алиас для совместимости
# Зелёный — успех
success = "#85C446" # Зелёный
success_light = "#C0DE9E" # Светло-зелёный
# Текст
text_primary = "#1E2A3A" # Почти чёрный для заголовков
text_secondary = "#5A6779" # Серый для второстепенного текста
text_on_primary = "#FFFFFF" # Белый текст на оранжевом фоне
# Граница
border = "#DDE3EA" # Светло-серая граница
class CastomText(ft.Text):
def __init__(self, text, size=14, color=clolors.ferst, weight=ft.FontWeight.NORMAL):
def __init__(self, text, size=14, color=colors.text_primary, weight=ft.FontWeight.NORMAL):
super().__init__(
value=text,
color=color,
@@ -33,25 +63,26 @@ class CastomTextField_input(ft.TextField):
super().__init__(
label=label,
hint_text=hint_text,
filled=True, # заливка фона
bgcolor=clolors.ferst, # цвет заливки
border_color=clolors.laer2, # цвет границы
border_radius=s(12), # скругление углов
filled=True,
bgcolor=colors.surface,
border_color=colors.border,
focused_border_color=colors.primary,
border_radius=s(10),
label_style=ft.TextStyle(
color=clolors.laer3,
size=s(14),
weight=ft.FontWeight.BOLD,
color=colors.text_secondary,
size=s(13),
weight=ft.FontWeight.W_500,
),
hint_style=ft.TextStyle(
color=clolors.laer1,
color=colors.border,
size=s(14),
italic=True,
),
text_style=ft.TextStyle(
color=clolors.laer3,
size=s(16),
color=colors.text_primary,
size=s(15),
),
content_padding=ft.padding.symmetric(horizontal=s(12), vertical=s(14)),
content_padding=ft.padding.symmetric(horizontal=s(14), vertical=s(14)),
prefix_icon=prefix_icon,
suffix_icon=suffix_icon,
on_change=on_change,
@@ -62,14 +93,20 @@ class CastomTextField_input(ft.TextField):
class CastomButton(ft.Button):
def __init__(self, text, on_click):
super().__init__(
content=text,
content=ft.Text(
text,
color=colors.text_on_primary,
size=s(14),
weight=ft.FontWeight.W_600,
) if isinstance(text, str) else text,
style=ft.ButtonStyle(
color=clolors.ferst,
bgcolor=clolors.laer1,
text_style=ft.TextStyle(
size=s(14)
),
padding=ft.padding.symmetric(horizontal=s(16), vertical=s(10)),
color=colors.text_on_primary,
bgcolor={
ft.ControlState.DEFAULT: colors.primary,
ft.ControlState.HOVERED: colors.primary_dark,
},
shape=ft.RoundedRectangleBorder(radius=s(10)),
padding=ft.padding.symmetric(horizontal=s(20), vertical=s(12)),
),
on_click=on_click
)
@@ -83,15 +120,17 @@ class CastomIconButton(ft.Button):
spacing=s(8),
tight=True,
controls=[
ft.Icon(icon, color=clolors.ferst, size=s(18)),
ft.Text(text, color=clolors.ferst, size=s(14)),
ft.Icon(icon, color=colors.text_on_primary, size=s(18)),
ft.Text(text, color=colors.text_on_primary, size=s(14), weight=ft.FontWeight.W_600),
],
),
style=ft.ButtonStyle(
color=clolors.ferst,
bgcolor=clolors.laer2,
text_style=ft.TextStyle(size=s(14)),
padding=ft.padding.symmetric(horizontal=s(16), vertical=s(10)),
bgcolor={
ft.ControlState.DEFAULT: colors.info,
ft.ControlState.HOVERED: "#006AA3",
},
shape=ft.RoundedRectangleBorder(radius=s(10)),
padding=ft.padding.symmetric(horizontal=s(18), vertical=s(12)),
),
on_click=on_click,
)
@@ -103,27 +142,27 @@ class CastomDropdown(ft.Dropdown):
hint_text=hint_text,
options=options or [],
filled=True,
fill_color=clolors.laer3,
color=clolors.ferst,
border_color=clolors.laer2,
border_radius=s(12),
focused_border_color=clolors.laer1,
fill_color=colors.surface,
color=colors.text_primary,
border_color=colors.border,
border_radius=s(10),
focused_border_color=colors.primary,
label_style=ft.TextStyle(
color=clolors.ferst,
size=s(14),
weight=ft.FontWeight.BOLD,
color=colors.text_secondary,
size=s(13),
weight=ft.FontWeight.W_500,
),
hint_style=ft.TextStyle(
color=clolors.laer1,
color=colors.border,
size=s(14),
italic=True,
),
text_style=ft.TextStyle(
color=clolors.ferst,
size=s(16),
color=colors.text_primary,
size=s(15),
),
menu_style=ft.MenuStyle(
bgcolor=clolors.laer3,
bgcolor=colors.surface,
),
)
if on_change is not None:
@@ -134,11 +173,11 @@ class CastomSwitch(ft.Switch):
def __init__(self, label, on_change):
super().__init__(
label=label,
label_text_style=ft.TextStyle(size=s(12), color=clolors.ferst),
active_color=clolors.ferst,
active_track_color=clolors.laer1,
inactive_thumb_color=clolors.laer2,
inactive_track_color=clolors.laer3,
label_text_style=ft.TextStyle(size=s(13), color=colors.text_primary),
active_color=colors.primary,
active_track_color=colors.primary_light,
inactive_thumb_color=colors.border,
inactive_track_color=colors.surface_alt,
on_change=on_change
)
@@ -148,7 +187,7 @@ class AlterDiaalogApproval(ft.AlertDialog):
self._on_accept = on_accept
self.switch_approval = CastomSwitch(
label="Я согласен с условиями пользовательского соглашения",
label="",
on_change=self.switch_changed
)
@@ -159,15 +198,14 @@ class AlterDiaalogApproval(ft.AlertDialog):
self.button_approval.disabled = True
super().__init__(
bgcolor=clolors.laer3,
bgcolor=colors.surface,
title=ft.Text(
"Пользовательское соглашение",
color=clolors.ferst,
color=colors.primary,
size=s(16),
weight=ft.FontWeight.BOLD,
),
content=ft.Container(
width=s(350),
height=s(400),
content=ft.Column(
scroll=ft.ScrollMode.AUTO,
@@ -293,11 +331,11 @@ class AlterDiaalogApproval(ft.AlertDialog):
""",
expand=True,
md_style_sheet=ft.MarkdownStyleSheet(
p_text_style=ft.TextStyle(color=clolors.ferst, size=s(12)),
h1_text_style=ft.TextStyle(color=clolors.ferst, size=s(18), weight=ft.FontWeight.BOLD),
h2_text_style=ft.TextStyle(color=clolors.ferst, size=s(15), weight=ft.FontWeight.BOLD),
h3_text_style=ft.TextStyle(color=clolors.laer1, size=s(13), weight=ft.FontWeight.BOLD),
a_text_style=ft.TextStyle(color=clolors.laer1),
p_text_style=ft.TextStyle(color=colors.text_primary, size=s(12)),
h1_text_style=ft.TextStyle(color=colors.primary, size=s(18), weight=ft.FontWeight.BOLD),
h2_text_style=ft.TextStyle(color=colors.info, size=s(15), weight=ft.FontWeight.BOLD),
h3_text_style=ft.TextStyle(color=colors.text_secondary, size=s(13), weight=ft.FontWeight.BOLD),
a_text_style=ft.TextStyle(color=colors.primary),
),
)
]
@@ -305,16 +343,20 @@ class AlterDiaalogApproval(ft.AlertDialog):
),
actions=[
ft.Column(
width=s(350),
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
controls=[
ft.Row(
expand=True,
alignment=ft.MainAxisAlignment.START,
vertical_alignment=ft.CrossAxisAlignment.CENTER,
controls=[
ft.Container(
width=s(330),
content=self.switch_approval,
self.switch_approval,
ft.Text(
"Я согласен с условиями пользовательского соглашения",
size=s(13),
color=colors.text_primary,
expand=True,
no_wrap=False,
),
]
),