Корпоративное ПО · Новый ресурс

Дизайн-система Red Hat PatternFly.

Создайте рабочую среду для операционных задач на PatternFly: семантические ссылки на токены, карточки услуг с возможностью выбора, множественный выбор с тремя состояниями, проверка охвата и полный встроенный код React.

Руководство OpenDesign8 глав38 справочных записейАвторское руководство по приложению
01

Предварительный просмотр интерфейса дизайн-системы Red Hat PatternFly

Найдите нужное в каталоге сервисов, выберите отдельные сервисы или все видимые, проверьте общее число реплик, пересмотрите выбор и подтвердите локальный план.

Выберите сервисы и проверьте объём работ по обслуживаниюОткрыть полный пример
Нативная PatternFly React 6.6.1 с оригинальными Gallery/Card и состоянием массового выбора. Только примеры операционных данных. · Справочник по реализации
02

Справочник по дизайн-системе Red Hat PatternFly

PatternFly React 6.6.1 и @patternfly/react-tokens 6.6.1. Ниже показаны выбранные опубликованные значения токенов для светлой темы. Нативные компоненты и pf-v6-theme-dark обеспечивают стилизацию тёмной темы; данные примеров сервисов и компоновка определяются приложением.

Семантические роли поверхностей и текста

Источник
Название / правилоЗначение / конфигурацияПрименение
--pf-t--global--background--color--primary--defaultrgb(255, 255, 255, 0.6000)Используйте семантическую роль активной темы; красный акцент бренда не является универсальным цветом основного действия.
--pf-t--global--background--color--secondary--defaultrgb(199, 199, 199, 0.3000)Используйте семантическую роль активной темы; красный акцент бренда не является универсальным цветом основного действия.
--pf-t--global--text--color--regular#151515 Используйте семантическую роль активной темы; красный акцент бренда не является универсальным цветом основного действия.
--pf-t--global--text--color--subtle#383838 Используйте семантическую роль активной темы; красный акцент бренда не является универсальным цветом основного действия.
--pf-t--global--text--color--disabled#a3a3a3 Используйте семантическую роль активной темы; красный акцент бренда не является универсальным цветом основного действия.
--pf-t--global--color--brand--default#004d99 Используйте семантическую роль активной темы; красный акцент бренда не является универсальным цветом основного действия.
--pf-t--global--color--brand--hover#003366 Используйте семантическую роль активной темы; красный акцент бренда не является универсальным цветом основного действия.
--pf-t--global--color--brand--accent--default#ee0000 Используйте семантическую роль активной темы; красный акцент бренда не является универсальным цветом основного действия.
--pf-t--global--color--brand--subtle--default#e0f0ff Используйте семантическую роль активной темы; красный акцент бренда не является универсальным цветом основного действия.

Роли статусов

Источник
Название / правилоЗначение / конфигурацияПрименение
--pf-t--global--color--status--success--default#204d00 Сопровождайте значение статуса текстовой меткой. Эти значения для светлой темы не заменяют нативные варианты Label или Alert.
--pf-t--global--color--status--warning--default#73480b Сопровождайте значение статуса текстовой меткой. Эти значения для светлой темы не заменяют нативные варианты Label или Alert.
--pf-t--global--color--status--danger--default#731f00 Сопровождайте значение статуса текстовой меткой. Эти значения для светлой темы не заменяют нативные варианты Label или Alert.
--pf-t--global--color--status--info--default#3d2785 Сопровождайте значение статуса текстовой меткой. Эти значения для светлой темы не заменяют нативные варианты Label или Alert.
--pf-t--global--color--status--custom--default#004d4d Сопровождайте значение статуса текстовой меткой. Эти значения для светлой темы не заменяют нативные варианты Label или Alert.
--pf-t--global--color--status--unread--default#0066cc Сопровождайте значение статуса текстовой меткой. Эти значения для светлой темы не заменяют нативные варианты Label или Alert.

Шрифты основного текста и заголовков

Источник
Название / правилоЗначение / конфигурацияПрименение
--pf-t--global--font--size--body--default0.875remОсознанно выбирайте роль типографики и семантический уровень заголовка. Визуальный размер не определяет структуру документа.
--pf-t--global--font--size--body--lg1remОсознанно выбирайте роль типографики и семантический уровень заголовка. Визуальный размер не определяет структуру документа.
--pf-t--global--font--size--heading--h11.5remОсознанно выбирайте роль типографики и семантический уровень заголовка. Визуальный размер не определяет структуру документа.
--pf-t--global--font--size--heading--h21.25remОсознанно выбирайте роль типографики и семантический уровень заголовка. Визуальный размер не определяет структуру документа.
--pf-t--global--font--size--heading--h31.125remОсознанно выбирайте роль типографики и семантический уровень заголовка. Визуальный размер не определяет структуру документа.
--pf-t--global--font--size--heading--h41remОсознанно выбирайте роль типографики и семантический уровень заголовка. Визуальный размер не определяет структуру документа.
--pf-t--global--font--size--heading--h51remОсознанно выбирайте роль типографики и семантический уровень заголовка. Визуальный размер не определяет структуру документа.
--pf-t--global--font--size--heading--h61remОсознанно выбирайте роль типографики и семантический уровень заголовка. Визуальный размер не определяет структуру документа.

Шкала интервалов

Источник
Название / правилоЗначение / конфигурацияПрименение
--pf-t--global--spacer--xs0.25remДля групп и элементов управления используйте именованную шкалу интервалов; значения в rem зависят от размера корневого шрифта, заданного пользователем.
--pf-t--global--spacer--sm0.5remДля групп и элементов управления используйте именованную шкалу интервалов; значения в rem зависят от размера корневого шрифта, заданного пользователем.
--pf-t--global--spacer--md1remДля групп и элементов управления используйте именованную шкалу интервалов; значения в rem зависят от размера корневого шрифта, заданного пользователем.
--pf-t--global--spacer--lg1.5remДля групп и элементов управления используйте именованную шкалу интервалов; значения в rem зависят от размера корневого шрифта, заданного пользователем.
--pf-t--global--spacer--xl2remДля групп и элементов управления используйте именованную шкалу интервалов; значения в rem зависят от размера корневого шрифта, заданного пользователем.
--pf-t--global--spacer--2xl3remДля групп и элементов управления используйте именованную шкалу интервалов; значения в rem зависят от размера корневого шрифта, заданного пользователем.
--pf-t--global--spacer--3xl4remДля групп и элементов управления используйте именованную шкалу интервалов; значения в rem зависят от размера корневого шрифта, заданного пользователем.
--pf-t--global--spacer--4xl5remДля групп и элементов управления используйте именованную шкалу интервалов; значения в rem зависят от размера корневого шрифта, заданного пользователем.

Форма и фокус

Источник
Название / правилоЗначение / конфигурацияПрименение
--pf-t--global--border--radius--tiny4pxИспользуйте форму, предусмотренную для соответствующего компонента, а не применяйте скругление в виде капсулы ко всем поверхностям.
--pf-t--global--border--radius--small6pxИспользуйте форму, предусмотренную для соответствующего компонента, а не применяйте скругление в виде капсулы ко всем поверхностям.
--pf-t--global--border--radius--medium16pxИспользуйте форму, предусмотренную для соответствующего компонента, а не применяйте скругление в виде капсулы ко всем поверхностям.
--pf-t--global--border--radius--large24pxИспользуйте форму, предусмотренную для соответствующего компонента, а не применяйте скругление в виде капсулы ко всем поверхностям.
--pf-t--global--border--radius--pill999pxИспользуйте форму, предусмотренную для соответствующего компонента, а не применяйте скругление в виде капсулы ко всем поверхностям.
--pf-t--global--border--radius--control--form-element6pxИспользуйте форму, предусмотренную для соответствующего компонента, а не применяйте скругление в виде капсулы ко всем поверхностям.
--pf-t--global--border--radius--action--default999pxИспользуйте форму, предусмотренную для соответствующего компонента, а не применяйте скругление в виде капсулы ко всем поверхностям.
03

Полное руководство по дизайн-системе Red Hat PatternFly

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

DESIGN-red-hat-patternfly.md

Подробные рекомендации, отправная точка для реализации и ссылки на источники.

Скачать руководство

Компоновка операционного интерфейса дизайн-системы Red Hat PatternFly

Коллекция с постоянно видимым контекстом операций

Каталог сервисов позволяет оператору сравнивать состояние, местоположение и загрузку, а отдельная панель объёма работ фиксирует выбранный набор. Выбранные сервисы — это не то же самое, что текущие результаты поиска. Отфильтрованный сервис остаётся выбранным, пока его не удалят явно. Это различие особенно важно для массовых операций, последствия которых затрагивают не только содержимое видимой области экрана.

Из этого руководства OpenDesign

Используйте иерархию нативных компонентов

Gallery отвечает за адаптивное расположение карточек в столбцы, Card отделяет один сервис от другого, Label обозначает статус, а Progress показывает примерное процентное значение с заголовком. Страница не имитирует инфраструктурную консоль с помощью произвольных цветных прямоугольников. Модель данных, элементы управления и состояние проверки реализованы в полном примере на React.

Семантические роли цветов и темы в дизайн-системе Red Hat PatternFly

Основной цвет бренда и красный акцент — разные роли

PatternFly v6 предоставляет отдельные роли для бренда, акцента, текста, фона и статусов. В выбранном наборе значений для светлой темы используются синий brand-default и красный brand-accent-default. Если считать красный Red Hat цветом любого заметного действия, эти роли смешиваются. Нативные компоненты Button и Label используют системные роли, предусмотренные для соответствующего варианта.

Применяйте тёмную тему на уровне документа

В примере на элемент документа переключается pf-v6-theme-dark. Поверхности и текст приложения используют семантические переменные --pf-t--global, поэтому тема также определяет их цвета. Не фиксируйте светлые значения в собственных карточках, рассчитывая, что класс темы на элементе документа исправит их.

Типографика и метаданные сервисов в дизайн-системе Red Hat PatternFly

Отделяйте визуальный размер от семантики заголовков

Заголовок с headingLevel h1 задаёт заголовок страницы, а его размер определяет визуальный акцент. В этом снимке пакета Body-default равен 0.875rem. Подписи карточек, статусы и числовые показатели использования остаются читаемыми, но не превращаются при этом в заголовки. Список определений метаданных явно указывает количество реплик и идентификаторы сервисов.

Избегайте неоднозначных операционных подписей

Использование ресурсов обозначено как примерные данные и в компоненте, и в нижнем колонтитуле. Полосу выполнения без пояснений можно принять за задачу развёртывания или процесс загрузки. Подпись поясняет, что означает процент, а отдельная метка статуса сообщает о нормальной загрузке или необходимости проверки.

Red Hat PatternFly: галерея дизайн-системы и массовый выбор

Используйте три состояния флажка

Элемент Select visible имеет значение true, если выбраны все видимые сервисы, false, если не выбран ни один, и null, если выбрана только часть. Компонент PatternFly Checkbox поддерживает значение null для неопределённого состояния. Приложение вычисляет это состояние по отфильтрованной коллекции, а не использует отдельное логическое значение, которое может рассинхронизироваться с выбором строк.

  1. Выберите один сервис и проверьте состояние частичного выбора.
  2. Выберите все сервисы, видимые в данный момент.
  3. Найдите один сервис по названию и убедитесь, что скрытые выбранные элементы сохраняются в области действия.
  4. Проверьте точный набор и общее количество реплик.
  5. Подтвердите локальный план и ознакомьтесь с результатом.

Используйте набор выбранных элементов как источник истины

Red Hat PatternFly: интервалы дизайн-системы и адаптивные карточки

Используйте семантические токены для оболочки страницы

В примере для фона, основного текста и второстепенных метаданных используются семантические свойства CSS из опубликованного пакета токенов. Встроенная шкала интервалов охватывает значения от xs до 4xl, а приложение задаёт расстояние 24px между коллекцией и панелью области действия. Это явное значение композиции не является ссылкой на токен.

Перестраивайте галерею, прежде чем уменьшать её содержимое

Для Gallery задана минимальная ширина элемента 230px и интервал между элементами. На заданной в приложении точке адаптации 850px панель области действия перемещается под коллекцию. При ширине 500px внутренние отступы страницы уменьшаются до 16px, а поиск занимает всю ширину панели инструментов. Это решения по компоновке для данного примера, а не утверждение, что все продукты PatternFly используют такие точки адаптации.

Red Hat PatternFly: проверка и состояния выбора в дизайн-системе

Выбор не должен запускать операцию

Установка флажка только добавляет сервис в область действия. Действие Review selection показывает информационный Alert и кнопку подтверждения. Confirm local plan выводит общее количество выбранных сервисов и реплик, не запуская задачу обслуживания. При изменении выбора состояние проверки закрывается, чтобы устаревший набор нельзя было подтвердить незаметно.

Не смешивайте восстановление поиска с выбором

Несовпадающий запрос отображает встроенное информационное Alert с действием Clear search. Оно очищает только запрос, сохраняя выбранные сервисы. Поэтому счётчик выбранных элементов на панели инструментов и панель области действия по-прежнему согласованы. Сброс выбранных элементов при отсутствии результатов поиска стал бы скрытым деструктивным поведением.

Red Hat PatternFly: доступные элементы управления и статусы в дизайн-системе

Подписывайте элементы выбора и используйте стандартные элементы управления

У каждого Checkbox есть стабильный id и видимая подпись с названием сервиса. У SearchInput есть доступное имя, Switch обозначает настройку оформления, а Review selection недоступен, пока набор пуст. Стандартный Progress передаёт своё значение и заголовок. Страница не зависит от действий, доступных только при наведении курсора и скрытых внутри карточки.

Передавайте состояние словами

Счётчик выбранных элементов использует вежливую live region, статус сервиса отображается в Label, а итоговый Alert описывает произошедшее. Не используйте цвет как единственный индикатор области выбранных элементов или состояния сервиса. При проверке с клавиатуры следует протестировать частичный выбор, фильтрацию выбранного сервиса и возврат к полной коллекции.

  • Установленный флажок означает включение в набор, а не статус успешного выполнения.
  • Метка статуса описывает сервис, а не то, выбран ли он.
  • Progress отображает примерный уровень использования ресурсов, а не завершение операции.

Интеграция Red Hat PatternFly дизайн-системы React

Подключите сброс стилей и стили компонентов один раз

В примере @patternfly/react-core/dist/styles/base.css импортируется в точке входа. Встроенные компоненты React получают стили компонентов из пакета. Область действия стилей приложения CSS ограничена pf-example и использует текущее пространство имён --pf-t--global; внутренние стили компонентов не переопределяются.

Добавляйте реальное планирование только при наличии сервисного контракта

Red Hat PatternFly: примеры компонентов дизайн-системы

main.jsx — галерея сервисов и массовая проверка

Полная композиция встроенных Gallery/Card/Checkbox/Progress с областью действия, вычисляемой по выбранным элементам, и локальным подтверждением.

jsx
import React, { useState } from "react";
import { createRoot } from "react-dom/client";
import {
  Alert,
  Button,
  Card,
  CardBody,
  CardTitle,
  Checkbox,
  Gallery,
  GalleryItem,
  Label,
  Progress,
  SearchInput,
  Switch,
  Title,
} from "@patternfly/react-core";
import "@patternfly/react-core/dist/styles/base.css";
import "./patternfly.css";
const services = [
  {
    id: "api",
    name: "Public API",
    region: "eu-west",
    replicas: 6,
    load: 62,
    status: "Healthy",
  },
  {
    id: "jobs",
    name: "Background jobs",
    region: "eu-west",
    replicas: 3,
    load: 81,
    status: "Review capacity",
  },
  {
    id: "search",
    name: "Search index",
    region: "us-east",
    replicas: 4,
    load: 44,
    status: "Healthy",
  },
  {
    id: "events",
    name: "Event stream",
    region: "us-east",
    replicas: 8,
    load: 72,
    status: "Healthy",
  },
];
function App() {
  const [query, setQuery] = useState(""),
    [selected, setSelected] = useState([]),
    [review, setReview] = useState(false),
    [notice, setNotice] = useState(""),
    [dark, setDark] = useState(false);
  const visible = services.filter((x) =>
    x.name.toLowerCase().includes(query.toLowerCase()),
  );
  const picked = services.filter((x) => selected.includes(x.id));
  const allVisible =
    visible.length > 0 && visible.every((x) => selected.includes(x.id));
  const someVisible = visible.some((x) => selected.includes(x.id));
  function choose(id, checked) {
    setSelected((v) =>
      checked ? [...new Set([...v, id])] : v.filter((x) => x !== id),
    );
    setReview(false);
  }
  function selectVisible(checked) {
    setSelected((v) =>
      checked
        ? [...new Set([...v, ...visible.map((x) => x.id)])]
        : v.filter((id) => !visible.some((x) => x.id === id)),
    );
    setReview(false);
  }
  return (
    <main className="pf-example">
      <header>
        <div>
          <span className="overline">PATTERNFLY · SERVICE OPERATIONS</span>
          <Title headingLevel="h1" size="2xl">
            Plan a maintenance review
          </Title>
          <p>
            Select services and inspect the combined scope before creating a
            local plan.
          </p>
        </div>
        <Switch
          id="dark-theme"
          label="Dark theme"
          isChecked={dark}
          onChange={(_, checked) => {
            setDark(checked);
            document.documentElement.classList.toggle(
              "pf-v6-theme-dark",
              checked,
            );
          }}
        />
      </header>
      <div className="service-toolbar">
        <SearchInput
          aria-label="Find a service"
          placeholder="Find a service"
          value={query}
          onChange={(_, value) => setQuery(value)}
          onClear={() => setQuery("")}
        />
        <Checkbox
          id="select-visible"
          label="Select visible"
          isChecked={allVisible ? true : someVisible ? null : false}
          isDisabled={!visible.length}
          onChange={(_, checked) => selectVisible(checked)}
        />
        <span aria-live="polite">{selected.length} selected</span>
        <Button isDisabled={!selected.length} onClick={() => setReview(true)}>
          Review selection
        </Button>
      </div>
      <div className="service-layout">
        <Gallery hasGutter minWidths={{ default: "230px" }}>
          {visible.map((s) => (
            <GalleryItem key={s.id}>
              <Card>
                <CardTitle>
                  <Checkbox
                    id={"select-" + s.id}
                    label={s.name}
                    isChecked={selected.includes(s.id)}
                    onChange={(_, checked) => choose(s.id, checked)}
                  />
                </CardTitle>
                <CardBody>
                  <div className="service-meta">
                    <Label color={s.status === "Healthy" ? "green" : "orange"}>
                      {s.status}
                    </Label>
                    <span>{s.region}</span>
                  </div>
                  <Progress
                    value={s.load}
                    title="Sample utilization"
                    measureLocation="outside"
                  />
                  <dl>
                    <dt>Replicas</dt>
                    <dd>{s.replicas}</dd>
                    <dt>Service ID</dt>
                    <dd>
                      <code>{s.id}</code>
                    </dd>
                  </dl>
                </CardBody>
              </Card>
            </GalleryItem>
          ))}
        </Gallery>
        <aside>
          <Card>
            <CardTitle>Maintenance scope</CardTitle>
            <CardBody>
              <p>
                {picked.length} services ·{" "}
                {picked.reduce((n, s) => n + s.replicas, 0)} replicas
              </p>
              {picked.length ? (
                <ul>
                  {picked.map((s) => (
                    <li key={s.id}>
                      {s.name}
                      <span>{s.region}</span>
                    </li>
                  ))}
                </ul>
              ) : (
                <p className="muted">Select a service to inspect its scope.</p>
              )}
              {review && (
                <div className="review">
                  <Alert
                    isInline
                    variant="info"
                    title="Review the selected services"
                  >
                    This is a fictional plan. No workload will be restarted.
                  </Alert>
                  <Button
                    onClick={() => {
                      setNotice(
                        `Local plan includes ${picked.length} services and ${picked.reduce((n, s) => n + s.replicas, 0)} replicas. No operation was scheduled.`,
                      );
                      setReview(false);
                    }}
                  >
                    Confirm local plan
                  </Button>
                </div>
              )}
            </CardBody>
          </Card>
        </aside>
      </div>
      {!visible.length && (
        <Alert isInline variant="info" title="No services match">
          <Button variant="link" onClick={() => setQuery("")}>
            Clear search
          </Button>
        </Alert>
      )}
      {notice && (
        <Alert isInline variant="success" title="Local plan recorded">
          {notice}
        </Alert>
      )}
      <footer>
        Native PatternFly 6.6.1 · service data and capacity figures are
        fictional, memory-only examples.
      </footer>
    </main>
  );
}
createRoot(document.getElementById("root")).render(<App />);

Справочник по коду

  • Сохраните как src/main.jsx. Checkbox onChange получает событие и значение checked; isChecked может быть равен null для смешанного набора.

patternfly.css — адаптивная оболочка для операционных задач

Пользовательская компоновка страницы использует семантические токены версии 6 и сохраняет встроенные стили компонентов.

css
body {
  margin: 0;
}
.pf-example {
  padding: 24px;
  background: var(--pf-t--global--background--color--secondary--default);
  color: var(--pf-t--global--text--color--regular);
  font-family: var(--pf-t--global--font--family--body);
}
.pf-example header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 24px;
  margin-bottom: 24px;
}
.overline {
  font-size: 11px;
  letter-spacing: 0.07em;
  color: var(--pf-t--global--text--color--subtle);
}
.pf-example header h1 {
  margin: 8px 0;
}
.service-toolbar {
  display: flex;
  align-items: center;
  gap: 20px;
  flex-wrap: wrap;
  margin-bottom: 24px;
}
.service-toolbar > .pf-v6-c-search-input {
  width: 280px;
}
.service-toolbar > span {
  margin-left: auto;
}
.service-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 280px;
  gap: 24px;
  align-items: start;
}
.service-meta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  font-size: 12px;
  margin-bottom: 24px;
}
.service-layout dl {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 24px;
  font-size: 12px;
}
.service-layout dd {
  margin: 0;
}
.service-layout ul {
  padding: 0;
  list-style: none;
  margin: 16px 0;
}
.service-layout li {
  padding: 12px 0;
  border-bottom: 1px solid var(--pf-t--global--border--color--default);
}
.service-layout li span {
  display: block;
  font-size: 12px;
  color: var(--pf-t--global--text--color--subtle);
}
.muted {
  color: var(--pf-t--global--text--color--subtle);
  margin-top: 16px;
}
.review > .pf-v6-c-button {
  margin-top: 16px;
}
.pf-example > .pf-v6-c-alert {
  margin-top: 24px;
}
.pf-example footer {
  font-size: 12px;
  color: var(--pf-t--global--text--color--subtle);
  margin-top: 24px;
}
@media (max-width: 850px) {
  .service-layout {
    grid-template-columns: 1fr;
  }
  .pf-example header {
    align-items: start;
  }
  .service-toolbar > span {
    margin-left: 0;
  }
}
@media (max-width: 500px) {
  .pf-example {
    padding: 16px;
  }
  .pf-example header {
    flex-direction: column;
  }
  .service-toolbar {
    gap: 16px;
  }
  .service-toolbar > .pf-v6-c-search-input {
    width: 100%;
  }
}

Справочник по коду

  • Сохраните как src/patternfly.css. В этом примере точки адаптации приложения заданы явно.
04

Red Hat PatternFly: настройка агента дизайн-системы

Отправная точка для реализации

Композиция встроенных React 18.3.1 / PatternFly 6.6.1. Для Vite требуется поддерживаемая версия Node.js. Фактические данные сервисов и операции API остаются ответственностью приложения.

sh
npm create vite@latest patternfly-services -- --template react
cd patternfly-services
npm install
npm install [email protected] [email protected] @patternfly/[email protected]
# Replace src/main.jsx and add src/patternfly.css using the complete examples.
npm run dev

Запрос для вашего проекта

Промпт для AI-агента
Создайте операционную коллекцию на основе встроенных Gallery, Card, Checkbox, Progress, Label и Alert из PatternFly 6.6.1. Используйте предоставленные семантические токены и полный пример. Разделяйте видимость после фильтрации и выбранные идентификаторы, вычисляйте частичный массовый выбор и требуйте проверки точного набора затрагиваемых элементов. При добавлении реального API предусмотрите достоверные ответы о состоянии ожидания, ошибке или успехе. Сохраните адаптивную перестройку для мобильных экранов и доступность с клавиатуры.
05

Red Hat PatternFly: источники и область действия дизайн-системы

Руководство по разработке приложения, подготовленное OpenDesign, и вымышленный пример планирования обслуживания на встроенном PatternFly React 6.6.1. Уровень использования ресурсов, регион и количество реплик — примерные данные. Подтверждение меняет только локальное состояние; никакой сервис не перезапускается и не добавляется в расписание.