Compare commits
2 Commits
47840901c5
...
a27089bc0c
| Author | SHA1 | Date | |
|---|---|---|---|
| a27089bc0c | |||
| c94a8dafa9 |
@@ -0,0 +1,34 @@
|
|||||||
|
# Дизайн-система — LMS
|
||||||
|
|
||||||
|
Этот проект использует дизайн-систему **ДС-2 «Second Brain LMS & Press»** — терминальный язык «Aubade».
|
||||||
|
|
||||||
|
## Канон
|
||||||
|
|
||||||
|
Полная спецификация (9 секций, формат `DESIGN.md`):
|
||||||
|
|
||||||
|
- **Source of truth:** `SecondBrainTech/02-Стандарты/Дизайн-LMS/DESIGN.md`
|
||||||
|
- Копия для Open Design: `~/Documents/Claude/open-design/design-systems/second-brain-lms/`
|
||||||
|
- Превью со всеми примерами: `preview.html` в тех же каталогах
|
||||||
|
|
||||||
|
> Канон правится только там. Этот файл — практический указатель для разработки внутри репозитория.
|
||||||
|
|
||||||
|
## Язык в двух словах
|
||||||
|
|
||||||
|
Терминальный, моноширинный, «реестровый». Серо-зелёная палитра, острые углы 2px, выраженные рамки 2px, жёсткие тени-подложки с физикой hover/active. Тёмный админ-сайдбар. Без кремовых тонов и серифа — это язык ДС-1 (сайт и PDF), отдельной парной системы.
|
||||||
|
|
||||||
|
## Где токены в этом репозитории
|
||||||
|
|
||||||
|
Реализация — `src/app/globals.css`:
|
||||||
|
|
||||||
|
- **Палитра** — CSS-переменные в `:root`: `--background #F5F5F0`, `--foreground #323232`, `--accent #E8F0D8`, `--border #AAAAAA`, тёмный сайдбар `--sidebar-*`.
|
||||||
|
- **Типографическая шкала** — переопределённые токены Tailwind `--text-*` в блоке `@theme` (канон ДС-2, +2px к дефолту Tailwind).
|
||||||
|
- **Шрифт** — Fira Mono, подключение в `src/app/layout.tsx` через `next/font/google`.
|
||||||
|
- **Компонентные классы** — `.card-aubade`, `.btn-aubade`, `.btn-aubade-accent`, `.tag-aubade`, `.admin-sidebar*`.
|
||||||
|
|
||||||
|
## Письма Press
|
||||||
|
|
||||||
|
Рассылка Second Brain Press — поверхность Email той же ДС-2. Шаблон — Listmonk template id=1 (табличная вёрстка, Arial, карта 620px с рамкой 2px `#AAAAAA`). Подробности — секция 5 канонического `DESIGN.md`.
|
||||||
|
|
||||||
|
## История
|
||||||
|
|
||||||
|
Предыдущая версия этого файла ссылалась на легаси-дизайн-систему v1 (кремовая палитра + лаванда, `~/Documents/Claude/design-system/`). Она заменена: v1 — легаси, актуальна ДС-2.
|
||||||
@@ -10,7 +10,7 @@ export default async function ForgotPasswordPage() {
|
|||||||
<h1 className="text-2xl font-bold tracking-wide" style={{ color: "var(--foreground)" }}>
|
<h1 className="text-2xl font-bold tracking-wide" style={{ color: "var(--foreground)" }}>
|
||||||
{schoolName}
|
{schoolName}
|
||||||
</h1>
|
</h1>
|
||||||
<p className="mt-1 text-sm uppercase tracking-widest" style={{ color: "var(--muted-foreground)", fontSize: "0.65rem" }}>
|
<p className="mt-1 text-sm uppercase tracking-widest" style={{ color: "var(--muted-foreground)", fontSize: "13px" }}>
|
||||||
Образовательная платформа
|
Образовательная платформа
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export default async function LoginPage({
|
|||||||
<h1 className="text-2xl font-bold tracking-wide" style={{ color: "var(--foreground)" }}>
|
<h1 className="text-2xl font-bold tracking-wide" style={{ color: "var(--foreground)" }}>
|
||||||
{schoolName}
|
{schoolName}
|
||||||
</h1>
|
</h1>
|
||||||
<p className="mt-1 text-sm uppercase tracking-widest" style={{ color: "var(--muted-foreground)", fontSize: "0.65rem" }}>
|
<p className="mt-1 text-sm uppercase tracking-widest" style={{ color: "var(--muted-foreground)", fontSize: "13px" }}>
|
||||||
Образовательная платформа
|
Образовательная платформа
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export default async function RegisterPage() {
|
|||||||
<h1 className="text-2xl font-bold tracking-wide" style={{ color: "var(--foreground)" }}>
|
<h1 className="text-2xl font-bold tracking-wide" style={{ color: "var(--foreground)" }}>
|
||||||
{settings.schoolName}
|
{settings.schoolName}
|
||||||
</h1>
|
</h1>
|
||||||
<p className="mt-1 text-sm uppercase tracking-widest" style={{ color: "var(--muted-foreground)", fontSize: "0.65rem" }}>
|
<p className="mt-1 text-sm uppercase tracking-widest" style={{ color: "var(--muted-foreground)", fontSize: "13px" }}>
|
||||||
Образовательная платформа
|
Образовательная платформа
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ export function RegisterForm({ showTermsCheckbox, privacyPolicyUrl, termsUrl, of
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.5rem 0.75rem",
|
padding: "0.5rem 0.75rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
} as React.CSSProperties;
|
} as React.CSSProperties;
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ export default async function ResetPasswordPage() {
|
|||||||
<h1 className="text-2xl font-bold tracking-wide" style={{ color: "var(--foreground)" }}>
|
<h1 className="text-2xl font-bold tracking-wide" style={{ color: "var(--foreground)" }}>
|
||||||
{schoolName}
|
{schoolName}
|
||||||
</h1>
|
</h1>
|
||||||
<p className="mt-1 text-sm uppercase tracking-widest" style={{ color: "var(--muted-foreground)", fontSize: "0.65rem" }}>
|
<p className="mt-1 text-sm uppercase tracking-widest" style={{ color: "var(--muted-foreground)", fontSize: "13px" }}>
|
||||||
Образовательная платформа
|
Образовательная платформа
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ export function FeedbackForm({
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.5rem 0.75rem",
|
padding: "0.5rem 0.75rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
resize: "vertical",
|
resize: "vertical",
|
||||||
minHeight: "120px",
|
minHeight: "120px",
|
||||||
|
|||||||
+15
-3
@@ -31,6 +31,17 @@
|
|||||||
--radius-lg: var(--radius);
|
--radius-lg: var(--radius);
|
||||||
--radius-xl: calc(var(--radius) * 1.4);
|
--radius-xl: calc(var(--radius) * 1.4);
|
||||||
--radius-2xl: calc(var(--radius) * 1.8);
|
--radius-2xl: calc(var(--radius) * 1.8);
|
||||||
|
|
||||||
|
/* Типографическая шкала — канон ДС-2, +2px к дефолту Tailwind */
|
||||||
|
--text-xs: 14px;
|
||||||
|
--text-sm: 16px;
|
||||||
|
--text-base: 18px;
|
||||||
|
--text-lg: 20px;
|
||||||
|
--text-xl: 22px;
|
||||||
|
--text-2xl: 26px;
|
||||||
|
--text-3xl: 32px;
|
||||||
|
--text-4xl: 38px;
|
||||||
|
--text-5xl: 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── Light mode: Second Brain palette ──────────────────────────────── */
|
/* ── Light mode: Second Brain palette ──────────────────────────────── */
|
||||||
@@ -84,6 +95,7 @@
|
|||||||
body {
|
body {
|
||||||
background-color: var(--background);
|
background-color: var(--background);
|
||||||
color: var(--foreground);
|
color: var(--foreground);
|
||||||
|
font-size: 18px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,7 +117,7 @@
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 6px 16px;
|
padding: 6px 16px;
|
||||||
font-family: var(--font-sans);
|
font-family: var(--font-sans);
|
||||||
font-size: 0.875rem;
|
font-size: 16px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
border: var(--aubade-thickness) solid var(--foreground);
|
border: var(--aubade-thickness) solid var(--foreground);
|
||||||
box-shadow: var(--aubade-shadow-offset) var(--aubade-shadow-offset) 0 0 var(--foreground);
|
box-shadow: var(--aubade-shadow-offset) var(--aubade-shadow-offset) 0 0 var(--foreground);
|
||||||
@@ -134,7 +146,7 @@
|
|||||||
background-color: var(--color-surface);
|
background-color: var(--color-surface);
|
||||||
border: var(--aubade-thickness) solid transparent;
|
border: var(--aubade-thickness) solid transparent;
|
||||||
padding: 2px 8px;
|
padding: 2px 8px;
|
||||||
font-size: 0.65rem;
|
font-size: 13px;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.1em;
|
letter-spacing: 0.1em;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
@@ -167,7 +179,7 @@
|
|||||||
.admin-sidebar-nav-link {
|
.admin-sidebar-nav-link {
|
||||||
display: block;
|
display: block;
|
||||||
padding: 8px 12px;
|
padding: 8px 12px;
|
||||||
font-size: 0.875rem;
|
font-size: 16px;
|
||||||
color: var(--sidebar-text);
|
color: var(--sidebar-text);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
border-left: 2px solid transparent;
|
border-left: 2px solid transparent;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ const inputStyle: React.CSSProperties = {
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.5rem 0.75rem",
|
padding: "0.5rem 0.75rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ const inputStyle: React.CSSProperties = {
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.5rem 0.75rem",
|
padding: "0.5rem 0.75rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
};
|
};
|
||||||
const focusHandlers = {
|
const focusHandlers = {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ const inputStyle: React.CSSProperties = {
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.5rem 0.75rem",
|
padding: "0.5rem 0.75rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
};
|
};
|
||||||
const focusHandlers = {
|
const focusHandlers = {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export function HomeworkEditor({ lessonId, initial }: Props) {
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.5rem 0.75rem",
|
padding: "0.5rem 0.75rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
resize: "vertical" as const,
|
resize: "vertical" as const,
|
||||||
minHeight: "120px",
|
minHeight: "120px",
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ export function LessonEditor({
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.5rem 0.75rem",
|
padding: "0.5rem 0.75rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
} as React.CSSProperties;
|
} as React.CSSProperties;
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ export function QuizEditor({ lessonId, initial }: Props) {
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.5rem 0.75rem",
|
padding: "0.5rem 0.75rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ const inputStyle = {
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.5rem 0.75rem",
|
padding: "0.5rem 0.75rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
} as React.CSSProperties;
|
} as React.CSSProperties;
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const inputStyle = {
|
|||||||
background: "var(--background)",
|
background: "var(--background)",
|
||||||
outline: "none",
|
outline: "none",
|
||||||
padding: "0.4rem 0.6rem",
|
padding: "0.4rem 0.6rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
} as React.CSSProperties;
|
} as React.CSSProperties;
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ const inputStyle = {
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.4rem 0.6rem",
|
padding: "0.4rem 0.6rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
} as React.CSSProperties;
|
} as React.CSSProperties;
|
||||||
|
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ export function UserEnrollmentManager({ userId, allCourses, enrollments }: Props
|
|||||||
background: "var(--background)",
|
background: "var(--background)",
|
||||||
outline: "none",
|
outline: "none",
|
||||||
padding: "0.4rem 0.6rem",
|
padding: "0.4rem 0.6rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
width: "6rem",
|
width: "6rem",
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ export function HomeworkSection({ homework, submission, slug, lessonId, allowAud
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.5rem 0.75rem",
|
padding: "0.5rem 0.75rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
resize: "vertical" as const,
|
resize: "vertical" as const,
|
||||||
minHeight: "140px",
|
minHeight: "140px",
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ const inputStyle = {
|
|||||||
outline: "none",
|
outline: "none",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
padding: "0.5rem 0.75rem",
|
padding: "0.5rem 0.75rem",
|
||||||
fontSize: "0.875rem",
|
fontSize: "16px",
|
||||||
fontFamily: "inherit",
|
fontFamily: "inherit",
|
||||||
resize: "vertical" as const,
|
resize: "vertical" as const,
|
||||||
minHeight: "80px",
|
minHeight: "80px",
|
||||||
|
|||||||
Reference in New Issue
Block a user