Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
dae4b28
feat: add @kaspersky/ui-normalization tooling
vostrik Mar 24, 2026
a1b462f
feat: add init norma spec
vostrik Mar 24, 2026
84eb090
fet: store selected dirs
vostrik Mar 24, 2026
4fa8219
feat: store opend form in url
vostrik Mar 24, 2026
a3a5117
feat: add norma roadmap
vostrik Mar 24, 2026
00e01c6
feat: add final target for plan
vostrik Mar 24, 2026
c245f76
feat: add plan for button
vostrik Mar 24, 2026
a9b23fa
feat: add configHook in js
vostrik Mar 24, 2026
294859d
chore: remove ControlType from configHook arguments
vostrik Mar 24, 2026
690136f
feat: add fully TypeScript support to configHook
vostrik Mar 24, 2026
14968e9
feat: actualize plan about config handlers and ts
vostrik Mar 24, 2026
d2cb115
feat: plan dynamic imports for configs
vostrik Mar 24, 2026
3790007
docs: move HLE to tooling.md and strip roadmap
vostrik Mar 24, 2026
b3578b0
feat: add text implementation
vostrik Mar 24, 2026
9d4ff45
chore: add 6 point to roadmap
vostrik Mar 24, 2026
939b7e5
feat: add grid implementation
vostrik Mar 24, 2026
3432d06
feat: add table implementation
vostrik Mar 24, 2026
b2ad7d4
docs: add more table configuration examples
vostrik Mar 24, 2026
de18de2
docs: mark roadmap p1 as done
vostrik Mar 24, 2026
1105582
feat: change tools layout to increase content vh
vostrik Mar 24, 2026
a22f798
docs: add p8 roadmap
vostrik Mar 24, 2026
5c35627
docs: update p3 roadmap — formRenderer dod
vostrik Mar 24, 2026
b0ef0f3
feat: use ts for form dsl
vostrik Mar 25, 2026
172ffb2
docs: split p2 roadmap into 2 points and make the first as done
vostrik Mar 25, 2026
64e6b08
docs: move hle from roadmap to tooling doc
vostrik Mar 25, 2026
f19cc62
feat: support dynamic imports
vostrik Mar 25, 2026
6c605d4
docs: add features layer
vostrik Mar 25, 2026
ffe0286
feat: 3.1 one render tool
vostrik Mar 25, 2026
4bcc884
feat: 3.2 manage cols from hook
vostrik Mar 25, 2026
86b1820
feat: 3.3.1 wysiwyg settings
vostrik Mar 25, 2026
b15dffc
feat: 3.3.3 add DnD
vostrik Mar 25, 2026
318d32d
feat: add 3.4 split-screen feature
vostrik Mar 26, 2026
5cf091c
feat: use one config hook per form
vostrik Apr 6, 2026
ea2358b
feat: use grid cols from hook
vostrik Apr 6, 2026
c29fbbe
feat: add e2e typings for schema and config-hook
vostrik Apr 6, 2026
7189d7c
feat: get all table setup from configHook
vostrik Apr 6, 2026
730e242
feat: setup input from hook only
vostrik Apr 6, 2026
399579f
feat: setup from also from Config hook
vostrik Apr 6, 2026
4f452f9
docs: describe base core concepts
vostrik Apr 6, 2026
fd4f556
fix: render tab le with multiple rows
vostrik Apr 6, 2026
129604d
docs: add 3.4.6 dataprovider and mocks
vostrik Apr 6, 2026
4e8abc0
docs: add 16.04 iteration to roadmap
vostrik Apr 7, 2026
c7d0e04
fix: 3.4.1 fix e2e types for elementId
vostrik Apr 14, 2026
fa1f811
feat: 3.4.2 move onInit and onSubmit to *.data.ts
vostrik Apr 14, 2026
c934bab
docs: numerate sub points for 3.4 roadmap item
vostrik Apr 14, 2026
9412d26
chore: use one type for controlIds
vostrik Apr 15, 2026
6aa2a72
feat: 3.4.3 named configHooks for every component
vostrik Apr 15, 2026
cd72de4
docs: describe feature — multiple configHook
vostrik Apr 15, 2026
f844a4d
feat: use direct imports instead of transform to lazy loads
vostrik Apr 15, 2026
842e8d2
feat: 3.4.4 bind element to data
vostrik Apr 15, 2026
562ae27
feat: 3.4.5 setup disabled and visible from ui
vostrik Apr 15, 2026
d44c664
chore: change dataBinding scheme
vostrik Apr 15, 2026
e7d0bcb
feat: 3.4.7 setup all handlers from UI Tool
vostrik Apr 16, 2026
ccc61f9
feat: 3.4.6 setup form validation
vostrik Apr 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions docs/normalization/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Документация: UI Normalization

Spec-driven описание **config-driven** форм (редактор **normalization-tool**, просмотр **transpile-viewer**, общий DSL).

---

## Итоговый вид документации (три слоя)

```mermaid
flowchart TB
subgraph layer1 [1. Обзор решения]
T[tooling.md]
end
subgraph layer2 [2. Фичи]
F[features/README.md]
F1[feat-*.md]
end
subgraph layer3 [3. Требования по эпикам]
P[plans/plan-*.md]
end
subgraph meta [Мета]
R[roadmap.md]
end
R --> T
R --> F
R --> P
T --> F
F --> F1
P --> F1
```

| Слой | Документ | Назначение |
|------|----------|------------|
| **1** | **[tooling.md](./tooling.md)** | Краткое **описание решения** (что строим, зачем, как устроено в целом) и **таблица ссылок** на фичи. В конце файла — **прежние ссылки на разделы** (`#…`) для совместимости. |
| **2** | **[features/README.md](./features/README.md)** | **Дерево вложенных фич** и ссылки на файлы **`feat-*.md`**: контракты, ограничения, связь с кодом. |
| **3** | **[plans/](./plans/)** | **Требования** закрытых и текущих эпиков: таблица *`id` · фича · описание*; трассировка к роадмапу и к файлам из **`features/`**. |
| **Мета** | **[roadmap.md](./roadmap.md)** | Этапы **п.1–9**, статусы, указатели на слои 1–3. |

**Точка входа для чтения:** [tooling.md](./tooling.md) → при необходимости углубления — конкретный **`features/feat-…`** → для приёмки эпика — **`plans/plan-…`**.

**П.9 роадмапа** закрепляет поддержание этой структуры при эволюции кода.

---

## Быстрый указатель

| Тема | Куда |
|------|------|
| Два приложения, паритет, границы продукта | [feat-product-and-parity.md](./features/feat-product-and-parity.md) |
| `FormData`, дерево контролов | [feat-dsl-root-model.md](./features/feat-dsl-root-model.md) |
| `configHook` | [feat-config-hook.md](./features/feat-config-hook.md) |
| `handlers`, `useConfig`, хуки по узлам | [feat-schema-handlers.md](./features/feat-schema-handlers.md) |
| Sucrase, чанки, `loadFormDslBrowserRuntime` | [feat-lazy-dsl-runtime.md](./features/feat-lazy-dsl-runtime.md) |
| FSA, IndexedDB, `?form=` | [feat-workspace-browser.md](./features/feat-workspace-browser.md) |
| Button / Text / Grid / Table / DSL п.2 | [plans/](./plans/) |
51 changes: 51 additions & 0 deletions docs/normalization/features/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Каталог фич: UI Normalization

Иерархия **возможностей** (feature tree) туллинга. Каждая фича — отдельный файл: контракт, ограничения, связь с кодом. Сводный обзор решения и навигация — **[tooling.md](../tooling.md)**.

---

## Дерево (вложенность)

```
Решение: config-driven формы + Hexa UI
├── Продукт и поставка
│ └── [Продукт, паритет, два приложения](./feat-product-and-parity.md)
├── DSL и исполнение
│ ├── [Корневая модель FormData](./feat-dsl-root-model.md)
│ ├── [Принцип «одна настройка — один способ»](./feat-dsl-one-setting.md)
│ ├── [Контракт configHook](./feat-config-hook.md)
│ ├── [handlers формы и useConfig (отдельные хуки)](./feat-schema-handlers.md)
│ ├── [Привязка к модели (modelContract, dataBindPath)](./feat-form-model-binding.md)
│ ├── [Видимость и блокировка по модели](./feat-form-visible-disabled.md)
│ ├── [Ленивый рантайм: parseFormTs, Sucrase, чанки](./feat-lazy-dsl-runtime.md)
│ └── [Типизация автором и импорты потребителя](./feat-typing-and-imports.md)
├── Рабочее пространство (браузер)
│ └── [FSA, IndexedDB, URL form, сценарии, среда](./feat-workspace-browser.md)
├── Целевое состояние (роадмап)
│ ├── [Архитектурные решения и направления](./feat-architecture-directions.md)
│ ├── [Превью в редакторе — единый рендер-движок](./feat-editor-preview-target.md)
│ └── [Один configHook на форму](./feat-form-config-hook-unified.md)
└── Репозиторий
└── [Пакеты и shared-модули](./feat-repo-layout.md)
```

---

## Связь с другими документами

| Документ | Роль |
|----------|------|
| [tooling.md](../tooling.md) | Краткое **описание решения** + таблица ссылок на фичи |
| [roadmap.md](../roadmap.md) | Этапы п.1–9, статусы |
| [plans/](../plans/) | **Требования** по эпикам (фича → описание), трассировка к роадмапу |

---

## Именование фич в требованиях (plans)

В планах используются стабильные идентификаторы вида **`domain.short-name`** (например **`config-hook.button`**) для ссылок из обсуждений и PR.
29 changes: 29 additions & 0 deletions docs/normalization/features/feat-architecture-directions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Фича: архитектурные решения и долгосрочные направления

**Родитель:** целевое состояние (роадмап п.5–8 и часть п.7).

---

## Описание

Зафиксированные и целевые решения, которые задают рамку эволюции кода и продуктов, без пошаговой инструкции внедрения.

---

## Требования / направления

- **`arch.dsl.shared-module`:** один общий модуль DSL в дереве репозитория; **отдельный publishable npm-пакет** под DSL **не вводится**; **двух расходящихся копий** полного DSL **нет**.
- **`arch.forms.ts-only`:** артефакты форм в каталоге — **только `.ts`**.
- **`arch.code.genericity`:** контролы обрабатываются общими механизмами; частное — в дескрипторах и типах, не копипаста веток в рендерерах.
- **`arch.products.storybook`:** tool — целевой сценарий аддона **Storybook**; viewer — общий движок рендера для Storybook и прод.
- **`arch.shell.hexa`:** оболочки инструментов на **Hexa UI**; целевое **dogfooding** — UI инструментов из DSL + общего рендерера (оговорки для холста/DnD — при проектировании).
- **`arch.rename`:** целевые имена пакетов **`kant-editor`** / **`kant-renderer`**.
- **`arch.compat.json-ui-builder`:** обратная совместимость **`form-dsl`** и артефактов с **JSON UI Builder** (или явный мост версий).
- **`arch.viewer.adapters`:** viewer на адаптерах и **Auto UI** без монолитного маппинга всех типов; **Auto UI** — миграция на **React** end-to-end.

---

## Ссылки

- [roadmap.md](../roadmap.md) п.5–8, п.7
- Детализация превью в редакторе: [feat-editor-preview-target.md](./feat-editor-preview-target.md)
43 changes: 43 additions & 0 deletions docs/normalization/features/feat-config-hook.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Фича: контракт configHook

**Родитель:** DSL и исполнение. Зависит от [feat-dsl-one-setting](./feat-dsl-one-setting.md). Загрузка модулей — [feat-lazy-dsl-runtime](./feat-lazy-dsl-runtime.md).

---

## Описание

В динамическом режиме пропсы экземпляра компонента ДС задаёт логика **`configHook`**. Для **нормализованной** формы модуль **один на всю форму** — см. [feat-form-config-hook-unified](./feat-form-config-hook-unified.md): default export возвращает объект **`control.id` → хук контрола**. Колбэки (`onClick`, `onChange`, …) объявляются **внутри** объекта пропсов, который возвращает функция для конкретного контрола.

**Исполнение в tool / viewer:** вместо фабричного реестра **`configHook`** на корне формы используется **`handlers.useConfig`** на каждом узле; сигнатура хука на контрол **та же** (**`FormSlice` → пропсы ДС \| `null`**). Форма и загрузка модулей — [feat-schema-handlers](./feat-schema-handlers.md).

---

## Требования

- **`config-hook.api.input`:** единственный аргумент функции для контрола — **`FormSlice`** (`state` + `config.elements`, при необходимости **`mergeState`**, контекст таблицы, опционально **`dataBind`** при **`dataBindPath`** — [feat-form-model-binding](./feat-form-model-binding.md)); тип контрола задаётся телом этой функции в форменном модуле (по ключу **`control.id`** в реестре).
- **`config-hook.api.output`:** полный объект пропсов экземпляра компонента ДС **или `null`**; **`null`** — не монтировать компонент; отдельных полей `visible` в DSL для этого нет.
- **`config-hook.react`:** модуль исполняется как React-хук; пересчёт через React и стейт, без декларативного списка зависимостей в DSL.
- **`config-hook.context.layers`:** в колбэках автор разводит контекст **формы/инструмента** и контекст **Hexa** (события, пропсы экземпляра).
- **`config-hook.file.ts-only`:** путь в DSL и в пикере — только **`.ts`**; перед исполнением в браузере — транспиляция (см. ленивый рантайм).

### Примеры возврата (Hexa UI)

- Кнопка: **`ButtonProps | null`**
- Текст: **`TextProps | null`**
- Сетка / таблица: см. планы [plan-grid](../plans/plan-grid.md), [plan-table](../plans/plan-table.md)

### Артефакты формы

| Артефакт | Расширение | Загрузка |
|----------|------------|----------|
| **`configHook`** | **`.ts`** | [feat-lazy-dsl-runtime](./feat-lazy-dsl-runtime.md) → транспиляция → blob → `import()` |
| В **`.ts`** формы | — | путь к хуку сериализуется как **`() => import('./…')`** |

Пути **`handlers`** на форме/контроле в UI могут указывать **`.js`** или **`.ts`**; для новых артефактов приоритет **TS** ([tooling — обзор](../tooling.md)).

---

## Ссылки

- Пример стиля: `packages/kaspersky-ui-normalization-tool/dsl/demo/demo.config-hook.ts`
- Код: `loadConfigHookDefaultExport` в tool и viewer (legacy); резолв **`useConfig`** — **`lifecycle-resolve.ts`**, см. [feat-schema-handlers](./feat-schema-handlers.md)
24 changes: 24 additions & 0 deletions docs/normalization/features/feat-dsl-one-setting.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Фича: одна настройка — один способ

**Родитель:** DSL и исполнение.

---

## Описание

У каждого **пропа** экземпляра компонента ДС в форме ровно **один** источник значения: либо статическое поле в DSL (инспектор), либо динамика целиком через **`handlers.useConfig`** (хук для узла). Смешивание для одного пропа запрещено. Контракт хука совпадает с [feat-config-hook](./feat-config-hook.md); размещение в форме — [feat-schema-handlers](./feat-schema-handlers.md).

---

## Требования

- **`dsl.setting.single-source`:** параметр либо **статический** (хранится в DSL и задаётся в панели свойств), либо **динамический** (только из **`handlers.useConfig`** для данного **`control.id`**; отдельного поля DSL для этого пропа нет).
- **`dsl.setting.no-merge`:** нет объединения статики и динамики и нет «динамика перекрывает статику» для одного и того же пропа.

---

## Ссылки

- Контракт динамики (вход/выход хука): [feat-config-hook.md](./feat-config-hook.md)
- **`handlers`** и **`useConfig`:** [feat-schema-handlers.md](./feat-schema-handlers.md)
- Исторически — один **`configHook`** на форму: [feat-form-config-hook-unified.md](./feat-form-config-hook-unified.md)
32 changes: 32 additions & 0 deletions docs/normalization/features/feat-dsl-root-model.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Фича: корневая модель DSL (FormData)

**Родитель:** DSL и исполнение.

---

## Описание

Форма в рантайме — объект **`FormData`**: идентификаторы, опционально схема полей и обработчики уровня формы, дерево контролов. Источник в репозитории — **`shared/types/form.ts`** и нормализация в **`shared/normalization-form-dsl/form-dsl-core.ts`**.

---

## Требования

- **`dsl.root.fields`:** корень содержит **`id`** формы.
- **`dsl.root.schema`:** опционально — описание полей данных формы в модуле/JSON; **в normalization-tool не редактируется** (нет смысла в UI: превью и **`FormRenderer`** на это поле не опираются).
- **`dsl.root.handlers`:** опционально — жизненный цикл формы (**`onFormInit`**, **`onFormSubmit`**) и др.; значения — путь к **`.ts`**, ленивый **`import()`**, либо функция после нормализации. Семантика и резолв — [feat-schema-handlers](./feat-schema-handlers.md). Редактор вызывает lifecycle при загрузке хуков (**`FormEditorConfigHookProvider`**).
- **`dsl.root.modelContract`:** опционально — модуль **контракта модели** (тип
для **`data.ts`**, плюс **`MODEL_INITIAL`** → списки путей в **tool**);
формат ссылки как у **`handlers`**. Детали и **`FormSlice.dataBind`** —
[feat-form-model-binding](./feat-form-model-binding.md).
- **`dsl.root.elements`:** дерево контролов: семантический **`type`**, **`id`**, привязки к данным, валидация, **`visibleWhen`** / **`disabledWhen`** по **`modelPath`** в **`state`**, обработчики на контроле; опционально **`dataBindPath`** (путь из контракта для **`useConfig`**) — [feat-form-model-binding](./feat-form-model-binding.md), [feat-form-visible-disabled](./feat-form-visible-disabled.md).
- **`dsl.mapping.semantics-to-hexa`:** маппинг «семантика контрола → компонент ДС» живёт в **реестрах / рендерерах** приложений, не как отдельный дублирующий метатип в DSL.

---

## Ссылки

- Типы: `shared/types/form.ts`
- Логика контролов: `shared/normalization-form-dsl/form-dsl-core.ts`, entry `form-dsl.ts`
- **`handlers` / `useConfig`:** [feat-schema-handlers](./feat-schema-handlers.md)
- **Привязка к модели:** [feat-form-model-binding](./feat-form-model-binding.md)
Loading