push web
This commit is contained in:
166
web/designer.py
166
web/designer.py
@@ -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,
|
||||
),
|
||||
]
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user