Нет данных
) : ( @@ -236,18 +207,9 @@ export function OverviewTab({ data, onIsochronesResult }: Props) { background: "#f9fafb", }} > -
diff --git a/frontend/src/components/ui/EmptyState.tsx b/frontend/src/components/ui/EmptyState.tsx
new file mode 100644
index 00000000..30eb4549
--- /dev/null
+++ b/frontend/src/components/ui/EmptyState.tsx
@@ -0,0 +1,22 @@
+import type { CSSProperties } from "react";
+
+interface EmptyStateProps {
+ message: string;
+ style?: CSSProperties;
+}
+
+export function EmptyState({ message, style }: EmptyStateProps) {
+ return (
+
+ {message}
+
+ );
+}
diff --git a/frontend/src/components/ui/SectionLabel.tsx b/frontend/src/components/ui/SectionLabel.tsx
new file mode 100644
index 00000000..881fafa9
--- /dev/null
+++ b/frontend/src/components/ui/SectionLabel.tsx
@@ -0,0 +1,23 @@
+import type { CSSProperties, ReactNode } from "react";
+
+interface SectionLabelProps {
+ children: ReactNode;
+ style?: CSSProperties;
+}
+
+export function SectionLabel({ children, style }: SectionLabelProps) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/frontend/src/lib/adminStyles.ts b/frontend/src/lib/adminStyles.ts
new file mode 100644
index 00000000..da0852c4
--- /dev/null
+++ b/frontend/src/lib/adminStyles.ts
@@ -0,0 +1,49 @@
+/**
+ * Shared inline styles для admin pages.
+ *
+ * **Divergent local overrides — НЕ унифицировать:**
+ * - `frontend/src/app/admin/leads/page.tsx` — local `th` (padding "10px 12px",
+ * color "#374151"), local `td` (verticalAlign "top"), local `inputStyle`
+ * (fontSize 13, minWidth 160). Cause: разная плотность UI на leads dashboard.
+ * - `frontend/src/components/admin/BulkGeoPanel.tsx` — local `labelStyle` без
+ * `display: block` и `marginBottom`. Cause: labels на внутри строки,
+ * block-display и margin сломали бы inline layout.
+ *
+ * При добавлении новой admin page — сначала проверь что shared values fit
+ * перед introducing local override.
+ */
+import type { CSSProperties } from "react";
+
+export const cardStyle: CSSProperties = {
+ background: "#fff",
+ border: "1px solid #e6e8ec",
+ borderRadius: 12,
+ padding: 20,
+};
+
+export const labelStyle: CSSProperties = {
+ display: "block",
+ fontSize: 12,
+ color: "#5b6066",
+ marginBottom: 4,
+ textTransform: "uppercase",
+ letterSpacing: 0.4,
+};
+
+export const inputStyle: CSSProperties = {
+ padding: "8px 10px",
+ border: "1px solid #d1d5db",
+ borderRadius: 6,
+ fontSize: 14,
+ width: "100%",
+ boxSizing: "border-box",
+};
+
+export const th: CSSProperties = {
+ padding: "8px 10px",
+ textAlign: "left",
+ fontWeight: 600,
+ borderBottom: "1px solid #e6e8ec",
+};
+
+export const td: CSSProperties = { padding: "8px 10px" };