Красные линии и соглашения об именовании
Шесть красных линий
Заголовок раздела «Шесть красных линий»1. Только каркасы, без реализаций
Заголовок раздела «1. Только каркасы, без реализаций»codegen генерирует только привязки токенов, перечисления и типы props, а также константы значений по умолчанию. Генерация любой реализации UI запрещена — не создаются тела Composable, тела SwiftUI View, тела компонентов ArkUI, тел компонентных функций C. Вся реализация UI остаётся ручной в каждом нативном репозитории.
Эта красная линия записана в комментарии-преамбуле файла codegen/src/index.ts — это самодекларация инструментария.
2. Единый источник токенов — tokens/*.json
Заголовок раздела «2. Единый источник токенов — tokens/*.json»Ни одна платформа, ни один компонент не могут задавать значения токенов в обход этого репозитория. Нативные репозитории могут только потреблять артефакты dist/ или уже опубликованные пакеты соответствующих платформ; запрещено задавать цвета, отступы и размеры шрифтов вручную.
3. Ноль JS во время выполнения
Заголовок раздела «3. Ноль JS во время выполнения»TS-код репозитория существует только в инструментарии сборки; в артефактах не должно быть ни одного JavaScript.
4. Запрет на зависимость от lh-ui-share
Заголовок раздела «4. Запрет на зависимость от lh-ui-share»Два направления полностью независимы и не могут импортировать ничего друг у друга. Начальные значения токенов были перенесены вручную как одноразовое семя, никакой автоматической зависимости не создаётся.
5. В JSON не должно быть платформо-специфичного синтаксиса
Заголовок раздела «5. В JSON не должно быть платформо-специфичного синтаксиса»Значения токенов допускают только нейтральное представление: шестнадцатеричные цвета / rgba() / чистые числа при типе number / строки с единицами для dimension / duration / shadow ("12px" / "50%" / "200ms", что контролируется assertTypedValue; подробности в Формат токенов). Запрещены var(), rem, sp, dp и любые другие платформо-специфичные единицы или ссылки. Преобразование платформенных единиц лежит на шаблонах target’ов (например, определение dp/sp для Android, преобразование в секунды для iOS).
6. dist/ запрещено изменять вручную
Заголовок раздела «6. dist/ запрещено изменять вручную»Любые изменения вносятся в tokens/ / specs/ / cases/ или в шаблоны, после чего pnpm codegen перезапускается. dist/ находится в .gitignore, каждый запуск codegen сначала удаляет, потом создаёт каталог заново.
Соглашения об именовании (генеральный план D20)
Заголовок раздела «Соглашения об именовании (генеральный план D20)»Имена пакетов / идентификаторы платформ
Заголовок раздела «Имена пакетов / идентификаторы платформ»Имя пакета платформы всегда строится как обратный домен top.lhgb.ui:
| Платформа | Имя пакета / идентификатор |
|---|---|
| Android | package top.lhgb.ui.tokens, каталог артефактов dist/android/top/lhgb/ui/tokens/ |
| iOS | Sources/LhUITokens/ (соглашение о каталогах SwiftPM) |
| HarmonyOS | tokens/ (внутри модуля ohpm) |
| C | include/lh_ui/ |
Префикс собственных констант / классов / перечислений
Заголовок раздела «Префикс собственных констант / классов / перечислений»Всегда префикс LH с регистром по соглашениям каждого языка:
| Язык | Соглашение | Пример |
|---|---|---|
| Kotlin | Lh* (PascalCase) |
object LhTokens, object LhDarkTokens |
| Swift | Lh* (PascalCase) |
public enum LhTokens, struct LhShadow |
| ArkTS | Lh* (PascalCase) |
export class LhTokens, interface LhShadow |
| C | LH_* (ВЕРХНИЙ_РЕГИСТР_SNAKE) |
LH_COLOR_PRIMARY_DEFAULT, LH_Z_INDEX_MODAL |
Scope @lh-ui/* в npm / ohpm этому правилу не подчиняется (npm не использует обратные домены).
Правила именования C-макросов
Заголовок раздела «Правила именования C-макросов»zIndex.modal → LH_Z_INDEX_MODAL: сначала каждая . заменяется на подчёркивание, затем перед каждой заглавной буквой добавляется подчёркивание, после чего всё переводится в верхний регистр. Подробности в Артефакты C.
Ограничения именования в JSON
Заголовок раздела «Ограничения именования в JSON»Схема каждого уровня строго ограничивает именование с помощью регулярных выражений:
| Уровень | Поле | Правило |
|---|---|---|
| spec | name |
kebab-case: ^[a-z][a-z0-9-]*$ |
| spec | component |
PascalCase с префиксом Lh: ^Lh[A-Z][a-zA-Z0-9]*$ |
| spec | имя prop | camelCase: ^[a-z][a-zA-Z0-9]*$ |
| spec | имя event | ^on[A-Z][a-zA-Z0-9]*$ |
| case | id |
kebab-case |
| case | component |
должен совпадать с name спецификации с тем же именем |
Язык комментариев и документации
Заголовок раздела «Язык комментариев и документации»Комментарии, документация и сообщения коммитов всегда пишутся на китайском (требование генерального плана семейства).
Copyright © 2024-2026 FengMo WenXue