Перейти к содержимому

Брендирование проекта

Сделайте так, чтобы dwe выглядел как ваш проект. Настройте ASCII-шапку, которая встречает разработчиков при первом запуске, подберите палитру под фирменный стиль вашей команды и оформите дашборд dwe info так, чтобы каждый URL, hostname и доступ, нужные новичку, были на расстоянии одной команды.

Всю эту настройку покрывают два файла: workspace/styles.yml отвечает за визуальный стиль (шапка + цвета + сепаратор), а workspace/info.yml — за содержимое дашборда. Оба необязательны — DWE поставляет разумные значения по умолчанию — и оба загружаются независимо от слоёного проектного конфига.

workspace/styles.yml управляет фирменной шапкой, которую рендерят dwe (без аргументов) и dwe info. Строка с фирменным знаком ({▪} DWE · <project> · <version>) рендерится всегда; всё остальное накладывается поверх неё.

workspace/styles.yml
header:
lines:
- "Welcome to"
- "DWE Laravel"
font: doom
tagline: "Local dev, container-orchestrated."
  • header.lines рендерится как ASCII-арт через FIGlet. Две короткие строки обычно смотрятся лучше одной длинной — на узких ширинах баннерные шрифты переносятся криво.
  • header.font принимает стандартные имена FIGlet-шрифтов: doom, banner, big, block, slant и похожие. По умолчанию — standard.
  • header.tagline — одна приглушённая строка под фирменной строкой. Опустите её, если хотите более компактную шапку.

ASCII-блок всегда красится токеном accent — отдельного header.color нет. Поменяете accent — перекрасится и шапка.

Полную схему см. в styles.yml reference — header.

DWE использует семь семантических цветовых токенов. Любая часть интерфейса — таблицы, секции статуса, браузер команд, вывод --help — красится из этой палитры.

ТокенЧто красит
accentФирменную строку, ASCII-шапку, заголовки секций, рамки в фокусе, заголовки таблиц, активную пагинацию
successСостояния OK / running / enabled, успешные уведомления
warningДиагностику-предупреждения, состояния partial / degraded
dangerДиагностику-ошибки, уведомления о неудачах
mutedСчётчики, сепараторы, приглушённые строки, символы дерева, описания в справке
borderРамки панелей и таблиц по умолчанию (вне фокуса)
textОсновной текст — оставьте пустым, чтобы цвет переднего плана выбрал сам терминал

Переопределяйте любое подмножество. Токены, которые вы опустите (или оставите пустыми), возьмут встроенные значения по умолчанию, разные для светлого и тёмного фона:

colors:
accent: "#A78BFA" # пурпурный бренд
success: "#10B981" # зелёный с уклоном в teal
muted: "#94A3B8"

Пара вещей, которые стоит знать сразу:

  • Только hex-строки. Голые ANSI 256-коды или названия цветов не принимаются.
  • Одно переопределение применяется в обоих режимах. Отдельных под-веток light: / dark: нет — выбирайте hex, который читается на обоих фонах, или полагайтесь на встроенные значения для светлой и тёмной темы.
  • Фон терминала определяется один раз при старте. Поменять workspace/styles.yml и перезапустить dwe — это и есть поддерживаемый способ сменить тему; запущенный процесс не перечитывает её на лету.

Для монохромного вида задайте accent и success в одном тоновом ряду, а контраст пусть дают muted / border.

Полный справочник токенов и встроенных значений по умолчанию см. в styles.yml reference — colors и Light / dark resolution.

Ключ separator: контролирует символ между лейблом и значением в строках определений (Project — laravel):

separator: "·"

Распространённые альтернативы: "—" (длинное тире, по умолчанию), "·" (точка по центру), ":" (двоеточие — лаконично, но воспринимается как разрыв между заголовком и значением). Выбрали один раз — и забыли.

workspace/info.yml объявляет, что показывает dwe info: секции, элементы, условные строки, шаблонные выражения. Загружается отдельно от трёхслойного конфига и не мерджится между слоями — на проект приходится ровно один info.yml.

Минимальная форма:

workspace/info.yml
sections:
- id: <section-id>
title: "Optional Section Title"
items:
- type: <item-type>
# ... поля элемента
footer: true

Секции рендерятся в порядке объявления. Необязательный footer: true добавляет под последней секцией закрывающую строку в стиле заголовка таблицы.

Если workspace/info.yml отсутствует, DWE рендерит встроенный вариант по умолчанию с секцией URLs (генерируется автоматически из хостов и портов сервисов) и секцией Hosts (строки /etc/hosts, которые разработчику нужно добавить). Многим проектам этого достаточно, чтобы обходиться без правки info.yml.

Полную схему см. в info.yml reference.

Типы элементов, к которым вы будете обращаться

Заголовок раздела «Типы элементов, к которым вы будете обращаться»

Семь типов покрывают всё, что рендерит дашборд:

ТипРендерится какОбязательные поля
definitionстрока Label — Value с необязательной иконкойname, value
infoтекстовая строка в цвете infotext
warningтекстовая строка в цвете warningtext
auto-urlsURL-ы сервисов, генерируемые автоматически из service.yml
auto-hostshostname-ы, генерируемые автоматически из service.yml
subgroupконтейнер с необязательным заголовком и вложенными элементамиitems
separatorпустая строка-разделитель

Два типа auto-* — сердце живого, поддерживаемого info.yml: вместо того чтобы хардкодить каждый URL и host, нацельте их на ваши определения сервисов и дайте DWE пройтись по ним. Новый сервис → новая строка, автоматически.

Рабочий пример, объединяющий распространённые типы:

sections:
- id: project
items:
- type: subgroup
title: DWE
hide_on_empty: false
items:
- type: definition
name: Project
value: "{{ .Project.FullName }}"
- type: definition
name: State
value: "{{ .State }}"
when: "{{ .State }}"
- id: urls
title: URLs
items:
- type: auto-urls
include: [app, tool]
hide: [varnish]
port_via: nginx
- id: hosts
title: Hosts
items:
- type: warning
text: "Add these to your /etc/hosts:"
- type: auto-hosts
include: [app, tool, infra]
footer: true

Справочник полей по каждому элементу см. в info.yml — item types.

Каждый элемент принимает when: — выражение Go-шаблона. Элементы с ложным результатом отбрасываются из вывода; секции и subgroup-ы могут автоматически скрываться, когда пусты, через hide_on_empty:.

- type: definition
name: SPX
value: "{{ .Runtime.SPX.Path }}"
when: "{{ .Runtime.SPX.Path }}" # только когда SPX сконфигурирован
- type: definition
name: Adminer
value: '{{ appURL ((index .Services "adminer").Host "web") ((index .Services "main").Port "http") .Runtime.UseHTTPS }}'
when: '{{ (index .Services "adminer").Enabled }}' # только когда сервис включён

Три распространённых грабли:

  • Всегда заключайте шаблонные выражения в кавычки. Иначе YAML распарсит {{ ... }} как flow-маппинг.
  • Доступ к полю сервиса идёт через синтаксис Go text/template(index .Services "main").Host "web", со скобками вокруг index.
  • .Project, .Services, .Runtime и .State доступны на верхнем уровне. Собственные ключи лежат под .Raw (доступ через index .Raw "vars" "greeting"); для свободных значений предпочитайте блок vars:.

Полный набор доступных в шаблоне данных и сигнатуру хелпера appURL см. в info.yml — template expressions.

Элементы definition поддерживают поле icon:, которое добавляет глиф перед значением. Используйте его умеренно — щепотка иконок делает дашборд читаемее, а сплошная стена иконок превращается в шум.

Единственное техническое правило: предпочитайте кодпоинты с Emoji_Presentation=Yes (например, 📦, 🐳, 💾). Кодпоинты с текстовым представлением по умолчанию вроде 🛢 (U+1F6E2), 🗄 (U+1F5C4) и (U+2699) при рендеринге отбрасываются, чтобы колонки таблиц оставались выровненными, — измерения ширины в терминале расходятся между разными сочетаниями шрифта и терминала. dwe validate отметит такой кодпоинт, когда вы его добавите.

Полное пояснение с разбором по символам — в icon field — emoji caveat.