feat: Add skeleton loading UI components for various screens

- Implemented `Skeleton.kt` for loading placeholders in the app, including lesson cards, schedule, overview, and subjects.
- Introduced `Undo.kt` to manage undo actions with a snackbar interface.
- Created `WeekWidget.kt` for a widget displaying the week's schedule, including dynamic updates based on the current timetable.
- Added various splash animations in the `animator` directory for a smooth launch experience.
- Designed drawable resources for the widget and splash screen, including icons for city and room moves.
- Defined XML resources for widget configuration and photo paths.
This commit is contained in:
2026-10-23 21:56:07 +03:00
parent a3df53713f
commit b9c1f63301
59 changed files with 194390 additions and 178421 deletions

View File

@@ -31,6 +31,10 @@ function lessonOut(lesson, group, people, date, status, calendar, week = null) {
condition: lesson.condition,
variant: lesson.variant,
subgroup: lesson.subgroups.find((s) => s.group === group)?.label || null,
// "Немецкий язык" when part of the group studies German and part French (see `choices`).
option: lesson.option || null,
// "foreign": for foreign students only (Russian as a foreign language); "local": for the others.
audience: lesson.audience || null,
groups: lesson.groups,
uncertain: status === "maybe",
raw: lesson.raw,
@@ -159,6 +163,10 @@ export function timetable({ file, schedule, calendar, group, from, days, range,
...extra.map((e) => e.lesson.subgroups?.find((s) => s.group === group)?.label).filter(Boolean),
]),
].sort((a, b) => a.localeCompare(b, "ru", { numeric: true })),
// What parts of the group choose between: [["Немецкий язык", "Французский язык"]].
choices: (schedule.choices || []).filter((c) => c.groups.includes(group)).map((c) => c.options),
// Some lessons are for foreign students only, or for the others: worth asking which one you are.
audience: lessons.some((l) => l.audience),
bells: calendar?.bells || [],
from,
days: out,