diff --git a/app/resources/js/views/SettingsView.vue b/app/resources/js/views/SettingsView.vue
index 98d557c2..f719b463 100644
--- a/app/resources/js/views/SettingsView.vue
+++ b/app/resources/js/views/SettingsView.vue
@@ -1,16 +1,20 @@
@@ -91,11 +65,6 @@ const placeholderProps = computed(() => {
-
diff --git a/app/resources/js/views/settings/PlaceholderTab.vue b/app/resources/js/views/settings/PlaceholderTab.vue
deleted file mode 100644
index e7ad6251..00000000
--- a/app/resources/js/views/settings/PlaceholderTab.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
{{ title }}
-
- В разработке. Этот раздел реализуется в следующих коммитах.
-
-
{{ description }}
-
-
-
-
diff --git a/app/tests/Frontend/SettingsView.spec.ts b/app/tests/Frontend/SettingsView.spec.ts
index 94450262..ebca153d 100644
--- a/app/tests/Frontend/SettingsView.spec.ts
+++ b/app/tests/Frontend/SettingsView.spec.ts
@@ -15,28 +15,26 @@ describe('SettingsView.vue', () => {
expect(wrapper.find('h1').text()).toBe('Настройки');
});
- it('содержит ровно 8 nav-tabs', () => {
+ it('содержит ровно 4 nav-tabs (placeholder-вкладки убраны, audit D6/D7)', () => {
const wrapper = factory();
const items = wrapper.findAll('.tabs-rail .v-list-item');
- expect(items.length).toBe(8);
+ expect(items.length).toBe(4);
});
- it('содержит все 8 названий вкладок', () => {
+ it('содержит все 4 названия рабочих вкладок', () => {
const wrapper = factory();
const text = wrapper.text();
- const labels = [
- 'Профиль',
- 'Безопасность',
- 'Проекты',
- 'Команда',
- 'API и Webhook',
- 'Интеграции',
- 'Тихие часы',
- 'Уведомления',
- ];
+ const labels = ['Профиль', 'Безопасность', 'API и Webhook', 'Уведомления'];
labels.forEach((l) => expect(text).toContain(l));
});
+ it('не содержит placeholder-вкладок и текста «В разработке»', () => {
+ const wrapper = factory();
+ const railText = wrapper.find('.tabs-rail').text();
+ ['Команда', 'Интеграции', 'Тихие часы'].forEach((l) => expect(railText).not.toContain(l));
+ expect(wrapper.text()).not.toContain('В разработке');
+ });
+
it('по умолчанию показывает вкладку «Профиль»', () => {
const wrapper = factory();
const text = wrapper.text();
@@ -46,17 +44,6 @@ describe('SettingsView.vue', () => {
expect(text).toContain('Тайм-зона');
});
- it('placeholder-вкладки показывают «В разработке»', async () => {
- const wrapper = factory();
- // Кликаем по «Проекты» — placeholder-вкладка.
- const items = wrapper.findAll('.tabs-rail .v-list-item');
- const projectsItem = items.find((i) => i.text().includes('Проекты'));
- expect(projectsItem).toBeDefined();
- await projectsItem!.trigger('click');
- await wrapper.vm.$nextTick();
- expect(wrapper.text()).toContain('В разработке');
- });
-
it('переключение на «Уведомления» показывает матрицу 8×3', async () => {
const wrapper = factory();
const items = wrapper.findAll('.tabs-rail .v-list-item');
diff --git a/docs/superpowers/plans/2026-05-16-sprint3e-settings-tabs.md b/docs/superpowers/plans/2026-05-16-sprint3e-settings-tabs.md
new file mode 100644
index 00000000..8e2bfdc4
--- /dev/null
+++ b/docs/superpowers/plans/2026-05-16-sprint3e-settings-tabs.md
@@ -0,0 +1,240 @@
+# Sprint 3E — Settings placeholder-tabs (D6/D7) Implementation Plan
+
+> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
+
+**Goal:** Убрать из `SettingsView` 4 placeholder-вкладки («Проекты», «Команда», «Интеграции», «Тихие часы»), которые показывают «В разработке» — UI не должен обещать нереализованный функционал.
+
+**Architecture:** Чистое удаление. `SettingsView` оставляет 4 рабочие вкладки (Профиль, Безопасность, API и Webhook, Уведомления). Компонент `PlaceholderTab.vue` удаляется целиком. Spec-тест приводится к 4-вкладочному состоянию + добавляется регрессионная проверка, что placeholder'ы пропали.
+
+**Tech Stack:** Vue 3 (`
+```
+
+В `` заменить блок `…` (строки 89–99) на:
+
+```vue
+
+
+
+
+
+
+```
+
+`