diff --git a/README.md b/README.md
new file mode 100644
index 0000000..9f82eb8
--- /dev/null
+++ b/README.md
@@ -0,0 +1,66 @@
+# hr-appeals
+
+Форма обращений сотрудников в HR департамент.
+
+Заменяет встроенную Microsoft Forms: даёт собственный интерфейс в фирменном стиле
+(общие токены и компоненты, что и `request-portal`) без чужого брендинга и служебных
+плашек в подвале.
+
+## Стек
+
+- React 17 + TypeScript (строгий режим)
+- Vite 6
+- SCSS Modules
+- [`@tnsu/ui-kit`](http://git.tnsu.kz/timur.gorodetskiy/tnsu-ui-kit) — общие UI-компоненты
+
+React именно 17-й: `@tnsu/ui-kit` объявляет его в `peerDependencies`.
+
+## Запуск
+
+Пакеты `@tnsu/*` лежат в приватном реестре — он прописан в `.npmrc`, отдельная
+настройка не нужна, но нужен доступ к `git.tnsu.kz`.
+
+```bash
+npm install
+npm run dev
+```
+
+Прочие команды:
+
+```bash
+npm run build # проверка типов + production-сборка в dist/
+npm run typecheck # только проверка типов
+npm run preview # просмотр собранной версии
+```
+
+## Структура
+
+```
+src/
+ components/ переиспользуемые UI-обёртки
+ Field/ FormField из ui-kit + текст ошибки валидации
+ PageShell/ шапка страницы и центрированный контент
+ features/feedback/ собственно форма обращения
+ model.ts типы данных, справочники, пустое состояние
+ texts.ts все пользовательские строки (задел под локализацию)
+ validateFeedback.ts правила заполнения — чистая функция
+ useFeedbackForm.ts состояние формы, валидация, отправка
+ FeedbackForm.tsx сборка формы из секций
+ ThankYouScreen.tsx экран после отправки
+ sections/ секции формы
+ styles/
+ _design-tokens.scss фирменные токены (копия из request-portal)
+ global.scss
+```
+
+Состояние формы целиком живёт в `useFeedbackForm`; секции получают срез данных и
+колбэк `set`, но своим состоянием не владеют.
+
+## Что не сделано
+
+**Отправка данных.** Бэкенда пока нет: `useFeedbackForm.submit` валидирует форму и
+пишет результат в консоль (см. `TODO` в файле). Реальную интеграцию нужно подключить
+отдельно — только там, без правок в компонентах.
+
+**Список компаний.** В `model.ts` заполнено одно значение — «ТОО АСТЕЛ-К», единственное
+видимое в исходной форме. Полный список нужно уточнить у владельца формы.
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 0000000..cd79d54
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,9 @@
+import { PageShell } from './components/PageShell/PageShell';
+import { FeedbackForm } from './features/feedback/FeedbackForm';
+import { TEXTS } from './features/feedback/texts';
+
+export const App: React.FC = () => (
+
+
+
+);
diff --git a/src/components/Field/Field.module.scss b/src/components/Field/Field.module.scss
new file mode 100644
index 0000000..2bed1ff
--- /dev/null
+++ b/src/components/Field/Field.module.scss
@@ -0,0 +1,30 @@
+@use '../../styles/design-tokens' as *;
+
+.error {
+ margin: $sp-1 0 0;
+ color: $red-500;
+ font-family: $font-sans;
+ font-size: $fs-caption;
+}
+
+.hint {
+ margin: $sp-1 0 0;
+ color: $gray-500;
+ font-family: $font-sans;
+ font-size: $fs-caption;
+}
+
+// Красная рамка у контрола внутри — ui-kit не знает о состоянии ошибки,
+// поэтому подсвечиваем его снаружи через вложенные селекторы.
+.invalid {
+ :global(input),
+ :global(textarea),
+ :global(select) {
+ border-color: $red-500;
+
+ &:focus {
+ border-color: $red-500;
+ box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.12);
+ }
+ }
+}
diff --git a/src/components/Field/Field.tsx b/src/components/Field/Field.tsx
new file mode 100644
index 0000000..885d04b
--- /dev/null
+++ b/src/components/Field/Field.tsx
@@ -0,0 +1,40 @@
+import { FormField } from '@tnsu/ui-kit';
+import type { ReactNode } from 'react';
+import styles from './Field.module.scss';
+
+interface Props {
+ label: string;
+ htmlFor?: string;
+ required?: boolean;
+ full?: boolean;
+ /** Текст ошибки валидации. Пусто — поле считается корректным. */
+ error?: string;
+ /** Поясняющая подпись под полем (показывается, когда нет ошибки). */
+ hint?: string;
+ children: ReactNode;
+}
+
+/**
+ * Поле формы с сообщением об ошибке.
+ * FormField из @tnsu/ui-kit не умеет показывать ошибку, поэтому оборачиваем его
+ * здесь, а не правим общий пакет — правило валидации специфично для этой формы.
+ */
+export const Field: React.FC = ({
+ label,
+ htmlFor,
+ required,
+ full,
+ error,
+ hint,
+ children
+}) => (
+
+